{"version":3,"sources":["../src/internal/erc20.ts","../src/internal/contract.ts","../src/internal/builder-fee.ts","../src/internal/decimal.ts","../src/internal/precision.ts","../src/internal/validation.ts","../src/internal/open-builder.ts","../src/internal/contracts.ts","../src/internal/attribution.ts","../src/data/config.ts","../src/types.ts","../src/config.ts","../src/errors.ts","../src/signer/self.ts","../src/encoder.ts","../src/signer/delegated.ts","../src/signer/index.ts","../src/submitter/self.ts","../src/submitter/gasless.ts","../src/submitter/index.ts","../src/data/errors.ts","../src/internal/version.ts","../src/internal/http.ts","../src/data/queries.ts","../src/data/internal/pagination.ts","../src/data/internal/orders.ts","../src/data/internal/precision.ts","../src/data/internal/decimal.ts","../src/data/internal/calculations.ts","../src/data/internal/pending-orders.ts","../src/data/internal/pair-names.ts","../src/data/internal/pricing.ts","../src/data/internal/aggregations.ts","../src/data/internal/formatters.ts","../src/data/internal/position-updates.ts","../src/data/internal/account-updates.ts","../src/data/internal/sim-slippage.ts","../src/data/internal/preview.ts","../src/data/client.ts","../src/client.ts","../src/math.ts"],"names":["OrderType","CancelOrderType","OstiumErrorCode","encodeFunctionData","getAddress","arbitrumSepolia","arbitrum","privateKeyToAccount","createWalletClient","http","decodeErrorResult","createPublicClient","toLightSmartAccount","entryPoint07Address","createPimlicoClient","createSmartAccountClient","WaitForUserOperationReceiptTimeoutError","OstiumSubgraphErrorCode","formatUnits","parseUsdc","parseUnits","parseLeverage","GetCurrentRolloverFee","GetTradeRolloverFee","GetEffectiveMaxLeverage","GetTradeLiquidationPrice","CalculateDynamicPriceImpact","liquidationPrice","CurrentTradeProfitRaw","CurrentTotalProfitRaw","CurrentTotalProfitP","WS","pnl","parseAbiItem","keccak256","toBytes","ZERO_ADDRESS","webSocket","decodeFunctionData","tx","PRECISION_18","TimeUntilZeroDynamicSpread","GetOpeningFee","pairMaxLeverage","WithinExposureLimit","GraphQLClient","data","wrapped","maxUint256"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Minimal ERC20 ABI for allowance/approve\n */\n\nexport const ERC20_ABI = [\n  {\n    inputs: [\n      { internalType: 'address', name: 'owner', type: 'address' as const },\n      { internalType: 'address', name: 'spender', type: 'address' as const },\n    ],\n    name: 'allowance',\n    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' as const }],\n    stateMutability: 'view' as const,\n    type: 'function' as const,\n  },\n  {\n    inputs: [\n      { internalType: 'address', name: 'spender', type: 'address' as const },\n      { internalType: 'uint256', name: 'amount', type: 'uint256' as const },\n    ],\n    name: 'approve',\n    outputs: [{ internalType: 'bool', name: '', type: 'bool' as const }],\n    stateMutability: 'nonpayable' as const,\n    type: 'function' as const,\n  },\n  {\n    inputs: [\n      { internalType: 'address', name: 'account', type: 'address' as const },\n    ],\n    name: 'balanceOf',\n    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' as const }],\n    stateMutability: 'view' as const,\n    type: 'function' as const,\n  },\n  {\n    inputs: [\n      { internalType: 'address', name: 'to',     type: 'address' as const },\n      { internalType: 'uint256', name: 'amount', type: 'uint256' as const },\n    ],\n    name: 'transfer',\n    outputs: [{ internalType: 'bool', name: '', type: 'bool' as const }],\n    stateMutability: 'nonpayable' as const,\n    type: 'function' as const,\n  },\n] as const;\n","/**\n * Trading contract ABI\n */\n\nimport { type Abi } from 'viem';\n\n/**\n * Trading contract ABI - used by the SDK encoder\n */\nexport const TRADING_ABI = [\n  {\n      \"inputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"constructor\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"AboveMaxAllowedCollateral\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          }\n      ],\n      \"name\": \"AlreadyMarketClosed\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"BelowFees\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"BelowMinLevPos\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"DelegateForbidden\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"DelegateReentrant\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"DelegatedActionFailed\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"ExposureLimits\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"InvalidCallData\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"InvalidInitialization\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"InvalidNonce\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"InvalidSignature\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"a\",\n              \"type\": \"address\"\n          }\n      ],\n      \"name\": \"IsContract\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"IsDone\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"IsPaused\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          }\n      ],\n      \"name\": \"MaxPendingMarketOrdersReached\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          }\n      ],\n      \"name\": \"MaxTradesPerPairReached\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"a\",\n              \"type\": \"address\"\n          }\n      ],\n      \"name\": \"NoDelegate\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          }\n      ],\n      \"name\": \"NoLimitFound\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          }\n      ],\n      \"name\": \"NoTradeFound\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"orderId\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"NoTradeToTimeoutFound\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"orderId\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"NotCloseMarketTimeoutOrder\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"internalType\": \"address\",\n              \"name\": \"caller\",\n              \"type\": \"address\"\n          }\n      ],\n      \"name\": \"NotDelegate\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"a\",\n              \"type\": \"address\"\n          }\n      ],\n      \"name\": \"NotGov\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"NotInitializing\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"a\",\n              \"type\": \"address\"\n          }\n      ],\n      \"name\": \"NotManager\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"orderId\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"NotOpenMarketTimeoutOrder\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"a\",\n              \"type\": \"address\"\n          }\n      ],\n      \"name\": \"NotTradesUpKeep\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"orderId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          }\n      ],\n      \"name\": \"NotYourOrder\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"NullAddr\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"index\",\n              \"type\": \"uint16\"\n          }\n      ],\n      \"name\": \"PairNotListed\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint8\",\n              \"name\": \"bits\",\n              \"type\": \"uint8\"\n          },\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"value\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"SafeCastOverflowedUintDowncast\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"SignatureExpired\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"sender\",\n              \"type\": \"address\"\n          },\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          }\n      ],\n      \"name\": \"TriggerPending\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"orderId\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"WaitTimeout\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint32\",\n              \"name\": \"leverage\",\n              \"type\": \"uint32\"\n          }\n      ],\n      \"name\": \"WrongLeverage\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"WrongParams\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"WrongSL\",\n      \"type\": \"error\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"WrongTP\",\n      \"type\": \"error\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"orderId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"tradeId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"enum IOstiumTradingStorage.LimitOrder\",\n              \"name\": \"\",\n              \"type\": \"uint8\"\n          }\n      ],\n      \"name\": \"AutomationCloseOrderInitiated\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"orderId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          }\n      ],\n      \"name\": \"AutomationOpenOrderInitiated\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"delegator\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"delegate\",\n              \"type\": \"address\"\n          }\n      ],\n      \"name\": \"DelegateAdded\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"delegator\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"delegate\",\n              \"type\": \"address\"\n          }\n      ],\n      \"name\": \"DelegateRemoved\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": false,\n              \"internalType\": \"bool\",\n              \"name\": \"done\",\n              \"type\": \"bool\"\n          }\n      ],\n      \"name\": \"Done\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint64\",\n              \"name\": \"version\",\n              \"type\": \"uint64\"\n          }\n      ],\n      \"name\": \"Initialized\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"tradeId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          }\n      ],\n      \"name\": \"MarketCloseFailed\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"orderId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"tradeId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          }\n      ],\n      \"name\": \"MarketCloseOrderInitiated\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"orderId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"tradeId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint16\",\n              \"name\": \"closePercentage\",\n              \"type\": \"uint16\"\n          }\n      ],\n      \"name\": \"MarketCloseOrderInitiatedV2\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"orderId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"tradeId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"components\": [\n                  {\n                      \"internalType\": \"uint256\",\n                      \"name\": \"block\",\n                      \"type\": \"uint256\"\n                  },\n                  {\n                      \"internalType\": \"uint192\",\n                      \"name\": \"wantedPrice\",\n                      \"type\": \"uint192\"\n                  },\n                  {\n                      \"internalType\": \"uint32\",\n                      \"name\": \"slippageP\",\n                      \"type\": \"uint32\"\n                  },\n                  {\n                      \"components\": [\n                          {\n                              \"internalType\": \"uint256\",\n                              \"name\": \"collateral\",\n                              \"type\": \"uint256\"\n                          },\n                          {\n                              \"internalType\": \"uint192\",\n                              \"name\": \"openPrice\",\n                              \"type\": \"uint192\"\n                          },\n                          {\n                              \"internalType\": \"uint192\",\n                              \"name\": \"tp\",\n                              \"type\": \"uint192\"\n                          },\n                          {\n                              \"internalType\": \"uint192\",\n                              \"name\": \"sl\",\n                              \"type\": \"uint192\"\n                          },\n                          {\n                              \"internalType\": \"address\",\n                              \"name\": \"trader\",\n                              \"type\": \"address\"\n                          },\n                          {\n                              \"internalType\": \"uint32\",\n                              \"name\": \"leverage\",\n                              \"type\": \"uint32\"\n                          },\n                          {\n                              \"internalType\": \"uint16\",\n                              \"name\": \"pairIndex\",\n                              \"type\": \"uint16\"\n                          },\n                          {\n                              \"internalType\": \"uint8\",\n                              \"name\": \"index\",\n                              \"type\": \"uint8\"\n                          },\n                          {\n                              \"internalType\": \"bool\",\n                              \"name\": \"buy\",\n                              \"type\": \"bool\"\n                          },\n                          {\n                              \"internalType\": \"bool\",\n                              \"name\": \"isDayTrade\",\n                              \"type\": \"bool\"\n                          }\n                      ],\n                      \"internalType\": \"struct IOstiumTradingStorage.Trade\",\n                      \"name\": \"trade\",\n                      \"type\": \"tuple\"\n                  }\n              ],\n              \"indexed\": false,\n              \"internalType\": \"struct IOstiumTradingStorage.PendingMarketOrder\",\n              \"name\": \"order\",\n              \"type\": \"tuple\"\n          }\n      ],\n      \"name\": \"MarketCloseTimeoutExecuted\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"orderId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"tradeId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"components\": [\n                  {\n                      \"internalType\": \"uint256\",\n                      \"name\": \"block\",\n                      \"type\": \"uint256\"\n                  },\n                  {\n                      \"internalType\": \"uint192\",\n                      \"name\": \"wantedPrice\",\n                      \"type\": \"uint192\"\n                  },\n                  {\n                      \"internalType\": \"uint32\",\n                      \"name\": \"slippageP\",\n                      \"type\": \"uint32\"\n                  },\n                  {\n                      \"components\": [\n                          {\n                              \"internalType\": \"uint256\",\n                              \"name\": \"collateral\",\n                              \"type\": \"uint256\"\n                          },\n                          {\n                              \"internalType\": \"uint192\",\n                              \"name\": \"openPrice\",\n                              \"type\": \"uint192\"\n                          },\n                          {\n                              \"internalType\": \"uint192\",\n                              \"name\": \"tp\",\n                              \"type\": \"uint192\"\n                          },\n                          {\n                              \"internalType\": \"uint192\",\n                              \"name\": \"sl\",\n                              \"type\": \"uint192\"\n                          },\n                          {\n                              \"internalType\": \"address\",\n                              \"name\": \"trader\",\n                              \"type\": \"address\"\n                          },\n                          {\n                              \"internalType\": \"uint32\",\n                              \"name\": \"leverage\",\n                              \"type\": \"uint32\"\n                          },\n                          {\n                              \"internalType\": \"uint16\",\n                              \"name\": \"pairIndex\",\n                              \"type\": \"uint16\"\n                          },\n                          {\n                              \"internalType\": \"uint8\",\n                              \"name\": \"index\",\n                              \"type\": \"uint8\"\n                          },\n                          {\n                              \"internalType\": \"bool\",\n                              \"name\": \"buy\",\n                              \"type\": \"bool\"\n                          },\n                          {\n                              \"internalType\": \"bool\",\n                              \"name\": \"isDayTrade\",\n                              \"type\": \"bool\"\n                          }\n                      ],\n                      \"internalType\": \"struct IOstiumTradingStorage.Trade\",\n                      \"name\": \"trade\",\n                      \"type\": \"tuple\"\n                  },\n                  {\n                      \"internalType\": \"uint16\",\n                      \"name\": \"percentage\",\n                      \"type\": \"uint16\"\n                  }\n              ],\n              \"indexed\": false,\n              \"internalType\": \"struct IOstiumTradingStorage.PendingMarketOrderV2\",\n              \"name\": \"order\",\n              \"type\": \"tuple\"\n          }\n      ],\n      \"name\": \"MarketCloseTimeoutExecutedV2\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"orderId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          }\n      ],\n      \"name\": \"MarketOpenOrderInitiated\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"orderId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"components\": [\n                  {\n                      \"internalType\": \"uint256\",\n                      \"name\": \"block\",\n                      \"type\": \"uint256\"\n                  },\n                  {\n                      \"internalType\": \"uint192\",\n                      \"name\": \"wantedPrice\",\n                      \"type\": \"uint192\"\n                  },\n                  {\n                      \"internalType\": \"uint32\",\n                      \"name\": \"slippageP\",\n                      \"type\": \"uint32\"\n                  },\n                  {\n                      \"components\": [\n                          {\n                              \"internalType\": \"uint256\",\n                              \"name\": \"collateral\",\n                              \"type\": \"uint256\"\n                          },\n                          {\n                              \"internalType\": \"uint192\",\n                              \"name\": \"openPrice\",\n                              \"type\": \"uint192\"\n                          },\n                          {\n                              \"internalType\": \"uint192\",\n                              \"name\": \"tp\",\n                              \"type\": \"uint192\"\n                          },\n                          {\n                              \"internalType\": \"uint192\",\n                              \"name\": \"sl\",\n                              \"type\": \"uint192\"\n                          },\n                          {\n                              \"internalType\": \"address\",\n                              \"name\": \"trader\",\n                              \"type\": \"address\"\n                          },\n                          {\n                              \"internalType\": \"uint32\",\n                              \"name\": \"leverage\",\n                              \"type\": \"uint32\"\n                          },\n                          {\n                              \"internalType\": \"uint16\",\n                              \"name\": \"pairIndex\",\n                              \"type\": \"uint16\"\n                          },\n                          {\n                              \"internalType\": \"uint8\",\n                              \"name\": \"index\",\n                              \"type\": \"uint8\"\n                          },\n                          {\n                              \"internalType\": \"bool\",\n                              \"name\": \"buy\",\n                              \"type\": \"bool\"\n                          },\n                          {\n                              \"internalType\": \"bool\",\n                              \"name\": \"isDayTrade\",\n                              \"type\": \"bool\"\n                          }\n                      ],\n                      \"internalType\": \"struct IOstiumTradingStorage.Trade\",\n                      \"name\": \"trade\",\n                      \"type\": \"tuple\"\n                  }\n              ],\n              \"indexed\": false,\n              \"internalType\": \"struct IOstiumTradingStorage.PendingMarketOrder\",\n              \"name\": \"order\",\n              \"type\": \"tuple\"\n          }\n      ],\n      \"name\": \"MarketOpenTimeoutExecuted\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"orderId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"components\": [\n                  {\n                      \"internalType\": \"uint256\",\n                      \"name\": \"block\",\n                      \"type\": \"uint256\"\n                  },\n                  {\n                      \"internalType\": \"uint192\",\n                      \"name\": \"wantedPrice\",\n                      \"type\": \"uint192\"\n                  },\n                  {\n                      \"internalType\": \"uint32\",\n                      \"name\": \"slippageP\",\n                      \"type\": \"uint32\"\n                  },\n                  {\n                      \"components\": [\n                          {\n                              \"internalType\": \"uint256\",\n                              \"name\": \"collateral\",\n                              \"type\": \"uint256\"\n                          },\n                          {\n                              \"internalType\": \"uint192\",\n                              \"name\": \"openPrice\",\n                              \"type\": \"uint192\"\n                          },\n                          {\n                              \"internalType\": \"uint192\",\n                              \"name\": \"tp\",\n                              \"type\": \"uint192\"\n                          },\n                          {\n                              \"internalType\": \"uint192\",\n                              \"name\": \"sl\",\n                              \"type\": \"uint192\"\n                          },\n                          {\n                              \"internalType\": \"address\",\n                              \"name\": \"trader\",\n                              \"type\": \"address\"\n                          },\n                          {\n                              \"internalType\": \"uint32\",\n                              \"name\": \"leverage\",\n                              \"type\": \"uint32\"\n                          },\n                          {\n                              \"internalType\": \"uint16\",\n                              \"name\": \"pairIndex\",\n                              \"type\": \"uint16\"\n                          },\n                          {\n                              \"internalType\": \"uint8\",\n                              \"name\": \"index\",\n                              \"type\": \"uint8\"\n                          },\n                          {\n                              \"internalType\": \"bool\",\n                              \"name\": \"buy\",\n                              \"type\": \"bool\"\n                          },\n                          {\n                              \"internalType\": \"bool\",\n                              \"name\": \"isDayTrade\",\n                              \"type\": \"bool\"\n                          }\n                      ],\n                      \"internalType\": \"struct IOstiumTradingStorage.Trade\",\n                      \"name\": \"trade\",\n                      \"type\": \"tuple\"\n                  },\n                  {\n                      \"internalType\": \"uint16\",\n                      \"name\": \"percentage\",\n                      \"type\": \"uint16\"\n                  }\n              ],\n              \"indexed\": false,\n              \"internalType\": \"struct IOstiumTradingStorage.PendingMarketOrderV2\",\n              \"name\": \"order\",\n              \"type\": \"tuple\"\n          }\n      ],\n      \"name\": \"MarketOpenTimeoutExecutedV2\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint16\",\n              \"name\": \"value\",\n              \"type\": \"uint16\"\n          }\n      ],\n      \"name\": \"MarketOrdersTimeoutUpdated\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint256\",\n              \"name\": \"value\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"MaxAllowedCollateralUpdated\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          }\n      ],\n      \"name\": \"OpenLimitCanceled\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          }\n      ],\n      \"name\": \"OpenLimitPlaced\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          },\n          {\n              \"components\": [\n                  {\n                      \"internalType\": \"uint256\",\n                      \"name\": \"collateral\",\n                      \"type\": \"uint256\"\n                  },\n                  {\n                      \"internalType\": \"uint192\",\n                      \"name\": \"openPrice\",\n                      \"type\": \"uint192\"\n                  },\n                  {\n                      \"internalType\": \"uint192\",\n                      \"name\": \"tp\",\n                      \"type\": \"uint192\"\n                  },\n                  {\n                      \"internalType\": \"uint192\",\n                      \"name\": \"sl\",\n                      \"type\": \"uint192\"\n                  },\n                  {\n                      \"internalType\": \"address\",\n                      \"name\": \"trader\",\n                      \"type\": \"address\"\n                  },\n                  {\n                      \"internalType\": \"uint32\",\n                      \"name\": \"leverage\",\n                      \"type\": \"uint32\"\n                  },\n                  {\n                      \"internalType\": \"uint16\",\n                      \"name\": \"pairIndex\",\n                      \"type\": \"uint16\"\n                  },\n                  {\n                      \"internalType\": \"uint8\",\n                      \"name\": \"index\",\n                      \"type\": \"uint8\"\n                  },\n                  {\n                      \"internalType\": \"bool\",\n                      \"name\": \"buy\",\n                      \"type\": \"bool\"\n                  },\n                  {\n                      \"internalType\": \"bool\",\n                      \"name\": \"isDayTrade\",\n                      \"type\": \"bool\"\n                  }\n              ],\n              \"indexed\": false,\n              \"internalType\": \"struct IOstiumTradingStorage.Trade\",\n              \"name\": \"trade\",\n              \"type\": \"tuple\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"enum IOstiumTradingStorage.OpenOrderType\",\n              \"name\": \"orderType\",\n              \"type\": \"uint8\"\n          },\n          {\n              \"components\": [\n                  {\n                      \"internalType\": \"address\",\n                      \"name\": \"builder\",\n                      \"type\": \"address\"\n                  },\n                  {\n                      \"internalType\": \"uint32\",\n                      \"name\": \"builderFee\",\n                      \"type\": \"uint32\"\n                  }\n              ],\n              \"indexed\": false,\n              \"internalType\": \"struct IOstiumTradingStorage.BuilderFee\",\n              \"name\": \"builderFee\",\n              \"type\": \"tuple\"\n          }\n      ],\n      \"name\": \"OpenLimitPlacedV2\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint192\",\n              \"name\": \"newPrice\",\n              \"type\": \"uint192\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint192\",\n              \"name\": \"newTp\",\n              \"type\": \"uint192\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint192\",\n              \"name\": \"newSl\",\n              \"type\": \"uint192\"\n          }\n      ],\n      \"name\": \"OpenLimitUpdated\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"tradeId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint256\",\n              \"name\": \"amount\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"OracleFeeCharged\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint256\",\n              \"name\": \"amount\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"OracleFeeChargedLimitCancelled\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"tradeId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint256\",\n              \"name\": \"amount\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"OracleFeeRefunded\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": false,\n              \"internalType\": \"bool\",\n              \"name\": \"paused\",\n              \"type\": \"bool\"\n          }\n      ],\n      \"name\": \"Paused\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"tradeId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"orderId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint256\",\n              \"name\": \"removeAmount\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"RemoveCollateralInitiated\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"tradeId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"orderId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint256\",\n              \"name\": \"removeAmount\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"string\",\n              \"name\": \"reason\",\n              \"type\": \"string\"\n          }\n      ],\n      \"name\": \"RemoveCollateralRejected\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"tradeId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint192\",\n              \"name\": \"newSl\",\n              \"type\": \"uint192\"\n          }\n      ],\n      \"name\": \"SlUpdated\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"tradeId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint256\",\n              \"name\": \"topUpAmount\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint32\",\n              \"name\": \"newLeverage\",\n              \"type\": \"uint32\"\n          }\n      ],\n      \"name\": \"TopUpCollateralExecuted\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint256\",\n              \"name\": \"tradeId\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"indexed\": true,\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          },\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint192\",\n              \"name\": \"newTp\",\n              \"type\": \"uint192\"\n          }\n      ],\n      \"name\": \"TpUpdated\",\n      \"type\": \"event\"\n  },\n  {\n      \"anonymous\": false,\n      \"inputs\": [\n          {\n              \"indexed\": false,\n              \"internalType\": \"uint16\",\n              \"name\": \"value\",\n              \"type\": \"uint16\"\n          }\n      ],\n      \"name\": \"TriggerTimeoutUpdated\",\n      \"type\": \"event\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"DELEGATION_TYPEHASH\",\n      \"outputs\": [\n          {\n              \"internalType\": \"bytes32\",\n              \"name\": \"\",\n              \"type\": \"bytes32\"\n          }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"DOMAIN_SEPARATOR\",\n      \"outputs\": [\n          {\n              \"internalType\": \"bytes32\",\n              \"name\": \"\",\n              \"type\": \"bytes32\"\n          }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"_msgSender\",\n      \"outputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"\",\n              \"type\": \"address\"\n          }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          }\n      ],\n      \"name\": \"cancelOpenLimitOrder\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          },\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"closePercentage\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"internalType\": \"uint192\",\n              \"name\": \"marketPrice\",\n              \"type\": \"uint192\"\n          },\n          {\n              \"internalType\": \"uint32\",\n              \"name\": \"slippageP\",\n              \"type\": \"uint32\"\n          }\n      ],\n      \"name\": \"closeTradeMarket\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"_order\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"internalType\": \"bool\",\n              \"name\": \"retry\",\n              \"type\": \"bool\"\n          }\n      ],\n      \"name\": \"closeTradeMarketTimeout\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"\",\n              \"type\": \"address\"\n          }\n      ],\n      \"name\": \"delegatableNonces\",\n      \"outputs\": [\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"internalType\": \"bytes\",\n              \"name\": \"call_data\",\n              \"type\": \"bytes\"\n          }\n      ],\n      \"name\": \"delegatedAction\",\n      \"outputs\": [\n          {\n              \"internalType\": \"bytes\",\n              \"name\": \"\",\n              \"type\": \"bytes\"\n          }\n      ],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"delegator\",\n              \"type\": \"address\"\n          }\n      ],\n      \"name\": \"delegations\",\n      \"outputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"\",\n              \"type\": \"address\"\n          }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"done\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"enum IOstiumTradingStorage.LimitOrder\",\n              \"name\": \"orderType\",\n              \"type\": \"uint8\"\n          },\n          {\n              \"internalType\": \"address\",\n              \"name\": \"trader\",\n              \"type\": \"address\"\n          },\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          },\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"priceTimestamp\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"executeAutomationOrder\",\n      \"outputs\": [\n          {\n              \"internalType\": \"enum IOstiumTrading.AutomationOrderStatus\",\n              \"name\": \"\",\n              \"type\": \"uint8\"\n          }\n      ],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"contract IOstiumRegistry\",\n              \"name\": \"_registry\",\n              \"type\": \"address\"\n          },\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"_maxAllowedCollateral\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"_marketOrdersTimeout\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"_triggerTimeout\",\n              \"type\": \"uint16\"\n          }\n      ],\n      \"name\": \"initialize\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"isDone\",\n      \"outputs\": [\n          {\n              \"internalType\": \"bool\",\n              \"name\": \"\",\n              \"type\": \"bool\"\n          }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"isPaused\",\n      \"outputs\": [\n          {\n              \"internalType\": \"bool\",\n              \"name\": \"\",\n              \"type\": \"bool\"\n          }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"marketOrdersTimeout\",\n      \"outputs\": [\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"\",\n              \"type\": \"uint16\"\n          }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"maxAllowedCollateral\",\n      \"outputs\": [\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"components\": [\n                  {\n                      \"internalType\": \"uint256\",\n                      \"name\": \"collateral\",\n                      \"type\": \"uint256\"\n                  },\n                  {\n                      \"internalType\": \"uint192\",\n                      \"name\": \"openPrice\",\n                      \"type\": \"uint192\"\n                  },\n                  {\n                      \"internalType\": \"uint192\",\n                      \"name\": \"tp\",\n                      \"type\": \"uint192\"\n                  },\n                  {\n                      \"internalType\": \"uint192\",\n                      \"name\": \"sl\",\n                      \"type\": \"uint192\"\n                  },\n                  {\n                      \"internalType\": \"address\",\n                      \"name\": \"trader\",\n                      \"type\": \"address\"\n                  },\n                  {\n                      \"internalType\": \"uint32\",\n                      \"name\": \"leverage\",\n                      \"type\": \"uint32\"\n                  },\n                  {\n                      \"internalType\": \"uint16\",\n                      \"name\": \"pairIndex\",\n                      \"type\": \"uint16\"\n                  },\n                  {\n                      \"internalType\": \"uint8\",\n                      \"name\": \"index\",\n                      \"type\": \"uint8\"\n                  },\n                  {\n                      \"internalType\": \"bool\",\n                      \"name\": \"buy\",\n                      \"type\": \"bool\"\n                  },\n                  {\n                      \"internalType\": \"bool\",\n                      \"name\": \"isDayTrade\",\n                      \"type\": \"bool\"\n                  }\n              ],\n              \"internalType\": \"struct IOstiumTradingStorage.Trade\",\n              \"name\": \"t\",\n              \"type\": \"tuple\"\n          },\n          {\n              \"components\": [\n                  {\n                      \"internalType\": \"address\",\n                      \"name\": \"builder\",\n                      \"type\": \"address\"\n                  },\n                  {\n                      \"internalType\": \"uint32\",\n                      \"name\": \"builderFee\",\n                      \"type\": \"uint32\"\n                  }\n              ],\n              \"internalType\": \"struct IOstiumTradingStorage.BuilderFee\",\n              \"name\": \"bf\",\n              \"type\": \"tuple\"\n          },\n          {\n              \"internalType\": \"enum IOstiumTradingStorage.OpenOrderType\",\n              \"name\": \"orderType\",\n              \"type\": \"uint8\"\n          },\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"slippageP\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"openTrade\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"_order\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"openTradeMarketTimeout\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"pause\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"registry\",\n      \"outputs\": [\n          {\n              \"internalType\": \"contract IOstiumRegistry\",\n              \"name\": \"\",\n              \"type\": \"address\"\n          }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          },\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"removeAmount\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"removeCollateral\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"removeDelegate\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"delegate\",\n              \"type\": \"address\"\n          }\n      ],\n      \"name\": \"setDelegate\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"address\",\n              \"name\": \"delegator\",\n              \"type\": \"address\"\n          },\n          {\n              \"internalType\": \"address\",\n              \"name\": \"delegate\",\n              \"type\": \"address\"\n          },\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"nonce\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"expiry\",\n              \"type\": \"uint256\"\n          },\n          {\n              \"internalType\": \"uint8\",\n              \"name\": \"v\",\n              \"type\": \"uint8\"\n          },\n          {\n              \"internalType\": \"bytes32\",\n              \"name\": \"r\",\n              \"type\": \"bytes32\"\n          },\n          {\n              \"internalType\": \"bytes32\",\n              \"name\": \"s\",\n              \"type\": \"bytes32\"\n          }\n      ],\n      \"name\": \"setDelegateWithSignature\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"value\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"setMarketOrdersTimeout\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"value\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"setMaxAllowedCollateral\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"value\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"setTriggerTimeout\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          },\n          {\n              \"internalType\": \"uint256\",\n              \"name\": \"topUpAmount\",\n              \"type\": \"uint256\"\n          }\n      ],\n      \"name\": \"topUpCollateral\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [],\n      \"name\": \"triggerTimeout\",\n      \"outputs\": [\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"\",\n              \"type\": \"uint16\"\n          }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          },\n          {\n              \"internalType\": \"uint192\",\n              \"name\": \"price\",\n              \"type\": \"uint192\"\n          },\n          {\n              \"internalType\": \"uint192\",\n              \"name\": \"tp\",\n              \"type\": \"uint192\"\n          },\n          {\n              \"internalType\": \"uint192\",\n              \"name\": \"sl\",\n              \"type\": \"uint192\"\n          }\n      ],\n      \"name\": \"updateOpenLimitOrder\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          },\n          {\n              \"internalType\": \"uint192\",\n              \"name\": \"newSl\",\n              \"type\": \"uint192\"\n          }\n      ],\n      \"name\": \"updateSl\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  },\n  {\n      \"inputs\": [\n          {\n              \"internalType\": \"uint16\",\n              \"name\": \"pairIndex\",\n              \"type\": \"uint16\"\n          },\n          {\n              \"internalType\": \"uint8\",\n              \"name\": \"index\",\n              \"type\": \"uint8\"\n          },\n          {\n              \"internalType\": \"uint192\",\n              \"name\": \"newTp\",\n              \"type\": \"uint192\"\n          }\n      ],\n      \"name\": \"updateTp\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n  }\n] as const satisfies Abi;\n\n","/**\n * Builder fee encoding for OstiumTradingStorage.BuilderFee.\n *\n * Builders pass human-readable basis points (`feeBps`): e.g. `10` = 10 bps (0.1%),\n * `2.55` = 2.55 bps (0.0255%). The contract stores `feeBps × 10_000` (PRECISION_6\n * percent scale; max 500_000 = 50 bps = 0.5%).\n */\n\n/** Maximum builder fee in basis points (50 bps = 0.5%). */\nexport const MAX_BUILDER_FEE_BPS = 50;\n\n/** Smallest allowed `feeBps` step (0.01 bps). */\nexport const MIN_BUILDER_FEE_BPS_STEP = 0.01;\n\n/** On-chain maximum (`MAX_BUILDER_FEE_PERCENT` with PRECISION_6). */\nexport const MAX_BUILDER_FEE_CONTRACT = 500_000;\n\nconst BPS_TO_CONTRACT = 10_000;\n\n/** Convert builder-facing bps to the uint32 contract field. */\nexport function bpsToContractBuilderFee(feeBps: number): bigint {\n  if (feeBps === 0) return 0n;\n  return BigInt(Math.round(feeBps * BPS_TO_CONTRACT));\n}\n\n/** Returns an error message when invalid, otherwise `null`. */\nexport function validateBuilderFeeBps(feeBps: number): string | null {\n  if (!Number.isFinite(feeBps)) {\n    return 'builder.feeBps must be a finite number';\n  }\n  if (feeBps < 0 || feeBps > MAX_BUILDER_FEE_BPS) {\n    return `builder.feeBps must be between 0 and ${MAX_BUILDER_FEE_BPS} (0%–0.5%)`;\n  }\n  const centiBps = Math.round(feeBps * 100);\n  if (Math.abs(feeBps * 100 - centiBps) > 1e-6) {\n    return `builder.feeBps must be a multiple of ${MIN_BUILDER_FEE_BPS_STEP} (0.01 bps)`;\n  }\n  if (bpsToContractBuilderFee(feeBps) > MAX_BUILDER_FEE_CONTRACT) {\n    return 'builder.feeBps exceeds on-chain maximum (0.5%)';\n  }\n  return null;\n}\n","/**\n * Decimal conversion utilities for trading precision\n * Critical: All values must be scaled correctly for smart contract calls\n */\n\n/**\n * Parse a USDC amount string to bigint with 6 decimals\n * @param amount - Amount in USDC (e.g., \"100.50\" = 100.50 USDC)\n * @returns Bigint representation with 6 decimal precision\n */\nexport function parseUsdc(amount: string | number): bigint {\n  const amountStr = typeof amount === 'number' ? amount.toString() : amount;\n  if (!amountStr || amountStr === '0') return 0n;\n\n  if (!/^\\d+(\\.\\d+)?$/.test(amountStr)) {\n    throw new Error(`Invalid USDC amount: ${amountStr}`);\n  }\n\n  const [intPart, decPart = ''] = amountStr.split('.');\n  const paddedDec = decPart.padEnd(6, '0').slice(0, 6);\n  return BigInt(intPart + paddedDec);\n}\n\n/**\n * Parse a price string to bigint with 18 decimals.\n * Uses string manipulation to avoid floating-point precision loss.\n * @param price - Price as string (e.g., \"1900.50\")\n * @returns Bigint representation with 18 decimal precision\n */\nexport function parsePrice(price: string | number): bigint {\n  const priceStr = typeof price === 'number' ? price.toString() : price;\n  if (!priceStr || priceStr === '0') return 0n;\n\n  if (!/^-?\\d+(\\.\\d+)?$/.test(priceStr)) {\n    throw new Error(`Invalid price: ${priceStr}`);\n  }\n\n  const isNegative = priceStr.startsWith('-');\n  const absStr = isNegative ? priceStr.slice(1) : priceStr;\n  const [intPart, decPart = ''] = absStr.split('.');\n  const paddedDec = decPart.padEnd(18, '0').slice(0, 18);\n  const result = BigInt(intPart + paddedDec);\n\n  return isNegative ? -result : result;\n}\n\n/**\n * Parse leverage to contract format (leverage × 100).\n * @param leverage - Leverage as number (e.g., 20 for 20x)\n * @returns Bigint (e.g., 2000 for 20x)\n */\nexport function parseLeverage(leverage: number): bigint {\n  if (leverage <= 0 || !Number.isFinite(leverage)) {\n    throw new Error(`Invalid leverage: ${leverage}`);\n  }\n  return BigInt(Math.round(leverage * 100));\n}\n","/**\n * Precision constants for decimal conversions\n * Critical for trading calculations - all values must be scaled correctly\n */\n\nexport const PRECISION_6 = 1000000n; // USDC (6 decimals)\nexport const PRECISION_18 = 1000000000000000000n; // Prices (18 decimals)\n\nexport const DEFAULT_SLIPPAGE_PERCENTAGE = 0.25;\n\nexport const MIN_OPEN_SIZE_USD = 5;\nexport const MIN_COLLATERAL_USD = MIN_OPEN_SIZE_USD;\nexport const MAX_COLLATERAL_USD = 2_000_000;\n\nexport const ORDER_TYPE_MAP: Record<string, number> = {\n  'market': 0, // OpenOrderType.MARKET\n  'limit': 1,  // OpenOrderType.LIMIT\n  'stop': 2,   // OpenOrderType.STOP\n};\n","/**\n * Validation helpers for API requests\n */\n\nimport { ORDER_TYPE_MAP } from './precision.js';\nimport type { ApiOpen, ApiCloseAction, ApiCancelAction } from './api-schema.js';\nimport type { OpenOrderType } from './ostium-schema.js';\nimport type { ModifyInput } from './builder-types.js';\n\nconst DECIMAL_RE = /^-?\\d+(\\.\\d+)?$/;\n\nfunction assertDecimal(value: string, label: string): void {\n  if (!DECIMAL_RE.test(value)) {\n    throw new Error(`Invalid ${label}: \"${value}\" is not a valid decimal number`);\n  }\n  if (parseFloat(value) <= 0) {\n    throw new Error(`Invalid ${label}: must be greater than zero, got \"${value}\"`);\n  }\n}\n\nfunction assertNonNegativeDecimal(value: string, label: string): void {\n  if (!DECIMAL_RE.test(value)) {\n    throw new Error(`Invalid ${label}: \"${value}\" is not a valid decimal number`);\n  }\n  if (parseFloat(value) < 0) {\n    throw new Error(`Invalid ${label}: must be non-negative, got \"${value}\"`);\n  }\n}\n\n/**\n * Extract the contract OpenOrderType from an ApiOpen request.\n */\nexport function extractOpenType(open: ApiOpen): OpenOrderType {\n  return ORDER_TYPE_MAP[open.t];\n}\n\n/**\n * Validate TP/SL direction relative to the open price.\n */\nexport function validateTpSlDirection(\n  open: ApiOpen,\n  tp: bigint,\n  sl: bigint,\n  openPrice: bigint,\n): void {\n  if (open.b) {\n    if (tp > 0n && tp <= openPrice) {\n      throw new Error(`Take profit (${open.tp}) must be above open price (${open.p}) for long positions`);\n    }\n    if (sl > 0n && sl >= openPrice) {\n      throw new Error(`Stop loss (${open.sl}) must be below open price (${open.p}) for long positions`);\n    }\n  } else {\n    if (tp > 0n && tp >= openPrice) {\n      throw new Error(`Take profit (${open.tp}) must be below open price (${open.p}) for short positions`);\n    }\n    if (sl > 0n && sl <= openPrice) {\n      throw new Error(`Stop loss (${open.sl}) must be above open price (${open.p}) for short positions`);\n    }\n  }\n}\n\n/**\n * Validate close parameters.\n */\nexport function validateCloseParams(close: ApiCloseAction): void {\n  if (close.r < 1 || close.r > 100) {\n    throw new Error(`Close percentage must be 1–100, got ${close.r}`);\n  }\n  assertDecimal(close.p, 'close price');\n}\n\n/**\n * Validate cancel parameters.\n */\nexport function validateCancelParams(cancel: ApiCancelAction): void {\n  if (cancel.t === 'limit') {\n    if (cancel.a === undefined || cancel.a < 0) {\n      throw new Error(`Invalid pair index for limit cancel: ${cancel.a}`);\n    }\n    if (cancel.i === undefined || cancel.i < 0) {\n      throw new Error(`Invalid order index for limit cancel: ${cancel.i}`);\n    }\n  } else {\n    if (cancel.o === undefined || cancel.o < 0) {\n      throw new Error(`Invalid order ID for ${cancel.t} cancel: ${cancel.o}`);\n    }\n  }\n}\n\n/**\n * Validate modify parameters.\n */\nexport function validateModifyParams(input: ModifyInput): void {\n  if (input.a < 0) {\n    throw new Error(`Invalid pair index: ${input.a}`);\n  }\n  if (input.i < 0) {\n    throw new Error(`Invalid trade/order index: ${input.i}`);\n  }\n  if (!input.p && !input.tp && !input.sl) {\n    throw new Error('At least one of price, takeProfit, or stopLoss must be provided');\n  }\n  if (input.p) {\n    assertDecimal(input.p, 'price');\n  }\n  if (input.tp) {\n    assertNonNegativeDecimal(input.tp, 'take profit');\n  }\n  if (input.sl) {\n    assertNonNegativeDecimal(input.sl, 'stop loss');\n  }\n}\n","/**\n * Trade-building helpers — converts public API params into contract-ready structs.\n */\n\nimport type { ApiOpen, ApiBuilder } from './api-schema.js';\nimport type { OstiumTrade, BuilderFee, OpenOrderType } from './ostium-schema.js';\nimport { parseUsdc, parsePrice, parseLeverage } from './decimal.js';\nimport { extractOpenType, validateTpSlDirection } from './validation.js';\nimport { bpsToContractBuilderFee } from './builder-fee.js';\nimport { MIN_OPEN_SIZE_USD } from './precision.js';\n\nexport function buildTrade(\n  open: ApiOpen,\n  traderAddress: string\n): { trade: OstiumTrade; orderType: OpenOrderType } {\n  const collateralUsd = parseFloat(open.s);\n  if (collateralUsd < MIN_OPEN_SIZE_USD) {\n    throw new Error(`Collateral ${open.s} below minimum ${MIN_OPEN_SIZE_USD}`);\n  }\n\n  const leverageNum = parseFloat(open.l);\n  const collateral = parseUsdc(open.s);\n  const openPrice = parsePrice(open.p);\n  const leverage = parseLeverage(leverageNum);\n  const tp = open.tp ? parsePrice(open.tp) : 0n;\n  const sl = open.sl ? parsePrice(open.sl) : 0n;\n\n  if (tp > 0n || sl > 0n) {\n    validateTpSlDirection(open, tp, sl, openPrice);\n  }\n\n  const trade: OstiumTrade = {\n    collateral,\n    openPrice,\n    tp,\n    sl,\n    trader: traderAddress as `0x${string}`,\n    leverage,\n    pairIndex: BigInt(open.a),\n    index: 0n,\n    buy: open.b,\n    isDayTrade: open.d ?? false,\n  };\n\n  return { trade, orderType: extractOpenType(open) };\n}\n\nexport function buildBuilderFee(builder?: ApiBuilder): BuilderFee {\n  if (!builder) {\n    return {\n      builder: '0x0000000000000000000000000000000000000000',\n      builderFee: 0n,\n    };\n  }\n  // builder.f is human bps (e.g. 10 = 10 bps / 0.1%, 2.55 = 2.55 bps).\n  return {\n    builder: builder.b as `0x${string}`,\n    builderFee: bpsToContractBuilderFee(builder.f),\n  };\n}\n","/**\n * Contract addresses for Ostium on Arbitrum\n */\n\nimport { type Address } from 'viem';\n\nexport const ARBITRUM_MAINNET = {\n  chainId: 42161,\n  contracts: {\n    usdc: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831' as Address,\n    trading: '0x6D0bA1f9996DBD8885827e1b2e8f6593e7702411' as Address,\n    tradingStorage: '0xcCd5891083A8acD2074690F65d3024E7D13d66E7' as Address,\n    tradingCallbacks: '0x7720fC8c8680bF4a1Af99d44c6c265a74e9742a9' as Address,\n  },\n};\n\nexport const ARBITRUM_TESTNET = {\n  chainId: 421614,\n  contracts: {\n    usdc: '0xe73B11Fb1e3eeEe8AF2a23079A4410Fe1B370548' as Address,\n    trading: '0x2A9B9c988393f46a2537B0ff11E98c2C15a95afe' as Address,\n    tradingStorage: '0x0b9F5243B29938668c9Cfbd7557A389EC7Ef88b8' as Address,\n    tradingCallbacks: '0x83DC7c5dDeAD58f47230b70e6EF6bc44064BD814' as Address,\n  },\n};\n\nexport function getNetworkConfig(isTestnet: boolean = false) {\n  return isTestnet ? ARBITRUM_TESTNET : ARBITRUM_MAINNET;\n}\n","/**\n * Fire-and-forget SDK trade attribution.\n *\n * Reports the initiated transaction hash of every submission that targets the\n * Trading contract to `{builderApiUrl}/v1/trade`. Runs entirely in the\n * background: the request is never awaited and every failure is swallowed, so\n * it can never affect trading latency or behavior.\n */\nexport function reportTradeSubmission(builderApiUrl: string, hash: string): void {\n  try {\n    void fetch(`${builderApiUrl}/v1/trade`, {\n      method: 'POST',\n      headers: { 'content-type': 'application/json' },\n      body: JSON.stringify({ hash }),\n      signal: typeof AbortSignal.timeout === 'function' ? AbortSignal.timeout(10_000) : undefined,\n    }).catch(() => undefined);\n  } catch {\n    // Attribution must never throw into the trading path.\n  }\n}\n","/** Mainnet (Arbitrum One) Ostium subgraph endpoint. */\nexport const DEFAULT_SUBGRAPH_ENDPOINT =\n  'https://builder.prod.bedrock.ostium.io/v1/subgraph/gn';\n\n/** Testnet (Arbitrum Sepolia) Ostium subgraph endpoint. */\nexport const DEFAULT_SUBGRAPH_ENDPOINT_TESTNET =\n  'https://api.subgraph.ormilabs.com/api/public/67a599d5-c8d2-4cc4-9c4d-2975a97bc5d8/subgraphs/ost-sep/live/gn';\n\n/** Default Ostium builder API base URL (prices, OHLC, WebSocket stream). */\nexport const DEFAULT_BUILDER_API_URL = 'https://builder.prod.bedrock.ostium.io';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Client config\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Configuration for {@link OstiumSubgraphClient}.\n *\n * All fields are optional — calling `OstiumSubgraphClient.create()` with no\n * arguments connects to the mainnet subgraph.\n *\n * ```ts\n * // Mainnet (default)\n * const client = OstiumSubgraphClient.create();\n *\n * // Testnet (Arbitrum Sepolia)\n * const client = OstiumSubgraphClient.create({ testnet: true });\n *\n * // Custom endpoints\n * const client = OstiumSubgraphClient.create({\n *   endpoint:      'https://my-subgraph.example.com/graphql',\n *   builderApiUrl: 'https://my-builder-api.example.com',\n * });\n * ```\n */\nexport interface OstiumSubgraphClientConfig {\n  /**\n   * Subgraph GraphQL endpoint.\n   * When omitted, defaults to the mainnet or testnet subgraph based on `testnet`.\n   */\n  endpoint?: string;\n  /**\n   * Use the Arbitrum Sepolia testnet subgraph.\n   * Ignored when `endpoint` is set explicitly. Defaults to false (mainnet).\n   */\n  testnet?: boolean;\n  /**\n   * Override the builder API base URL used for live prices, OHLC candles, and the\n   * WebSocket stream. Defaults to `https://builder.prod.bedrock.ostium.io`.\n   */\n  builderApiUrl?: string;\n  /**\n   * Alchemy API key used by `streamAccountUpdates()` for contract-log overlays.\n   * Can be overridden per stream call.\n   */\n  alchemyApiKey?: string;\n}\n","import type { Hex, Address } from 'viem';\n\nexport enum OrderType {\n  Market = 'market',\n  Limit  = 'limit',\n  Stop   = 'stop',\n}\n\nexport enum CancelOrderType {\n  Limit        = 'limit',\n  PendingOpen  = 'pendingOpen',\n  PendingClose = 'pendingClose',\n}\n\nexport interface OpenTradeParams {\n  /**\n   * Trading pair id — same value as `Pair.pairId` returned by `getPairs()`.\n   * Accepts both the numeric string (e.g. `\"0\"`) and a plain `number`.\n   */\n  pairId: string | number;\n  /** true = long, false = short. */\n  buy: boolean;\n  /** Entry price as a decimal string (e.g. \"65000.50\"). */\n  price: string;\n  /** Collateral in USD as a decimal string (e.g. \"100.00\"). Fixed minimum is `MIN_OPEN_SIZE_USD` ($5). */\n  collateral: string;\n  /** Leverage as a decimal string (e.g. \"10\" for 10×). Contract-side limits apply. */\n  leverage: string;\n  /** Order type. */\n  type: OrderType;\n  /** Take profit price as a decimal string. Optional. */\n  takeProfit?: string;\n  /** Stop loss price as a decimal string. Optional. */\n  stopLoss?: string;\n  /** Per-trade slippage override in basis points. Overrides client default. */\n  slippage?: number;\n  /**\n   * Mark the trade as a day trade. Must be `true` when the desired leverage\n   * exceeds `pair.overnightMaxLeverage` (and `overnightMaxLeverage > 0`).\n   * Day trades are automatically closed before market close if not manually\n   * closed beforehand. Defaults to `false`.\n   */\n  isDayTrade?: boolean;\n  /**\n   * Per-trade builder fee override. Each field falls back to the client-level\n   * `builder` config when omitted. Pass `feeBps: 0` to open without a builder fee.\n   */\n  builder?: {\n    address?: Address;\n    feeBps?: number;\n  };\n}\n\nexport interface CloseTradeParams {\n  /**\n   * Trading pair id — same value as `Position.pairId` returned by `getOpenPositions`.\n   * Accepts both the numeric string (e.g. `\"0\"`) and a plain `number` for ergonomics.\n   */\n  pairId: string | number;\n  /**\n   * Position index within the pair — same value as `Position.idx` returned by\n   * `getOpenPositions`. Identifies which of the trader's open positions to close.\n   */\n  idx: number;\n  /** Current market price as a decimal string. */\n  price: string;\n  /** Percentage to close (1–100). */\n  closePercent: number;\n  /** Per-trade slippage override in basis points. */\n  slippage?: number;\n  /**\n   * When true, verifies USDC allowance covers the oracle fee before submitting.\n   * Skip by default if you know allowance is sufficient.\n   */\n  checkAllowance?: boolean;\n}\n\n/**\n * Cancel a pending limit order.\n */\nexport interface CancelLimitOrderParams {\n  type: CancelOrderType.Limit;\n  /**\n   * Trading pair id — same value as `OpenOrder.pairId` returned by `getOpenOrders`.\n   * Accepts both the numeric string (e.g. `\"0\"`) and a plain `number`.\n   */\n  pairId: string | number;\n  /**\n   * Limit order index within the pair — same value as `OpenOrder.idx` returned\n   * by `getOpenOrders`. Identifies which limit order to cancel.\n   */\n  idx: number;\n}\n\n/**\n * Cancel a timed-out market open order.\n */\nexport interface CancelPendingOpenParams {\n  type: CancelOrderType.PendingOpen;\n  /** Market order ID from the original openTrade submission. */\n  orderId: number;\n}\n\n/**\n * Cancel a timed-out market close order.\n */\nexport interface CancelPendingCloseParams {\n  type: CancelOrderType.PendingClose;\n  /** Market order ID from the original closeTrade submission. */\n  orderId: number;\n  /**\n   * If true, re-submits the close order after cancelling the timed-out one.\n   * Defaults to false (cancel only, trade remains open).\n   */\n  retry?: boolean;\n}\n\nexport type CancelOrderParams =\n  | CancelLimitOrderParams\n  | CancelPendingOpenParams\n  | CancelPendingCloseParams;\n\nexport interface ModifyOrderParams {\n  /**\n   * Trading pair id.\n   * - Updating TP/SL on an open position → use `Position.pairId` from `getOpenPositions`.\n   * - Updating a limit order's trigger price → use `OpenOrder.pairId` from `getOpenOrders`.\n   * Accepts both the numeric string (e.g. `\"0\"`) and a plain `number`.\n   */\n  pairId: string | number;\n  /**\n   * Slot index within the pair.\n   * - Updating TP/SL on an open position → use `Position.idx`.\n   * - Updating a limit order → use `OpenOrder.idx`.\n   */\n  idx: number;\n  /** New limit-order trigger price. Required when modifying a limit order's price. */\n  price?: string;\n  /** New take profit price. */\n  takeProfit?: string;\n  /** New stop loss price. */\n  stopLoss?: string;\n}\n\nexport interface UpdateCollateralParams {\n  /**\n   * Trading pair id — same value as `Position.pairId` returned by `getOpenPositions`.\n   * Accepts both the numeric string (e.g. `\"0\"`) and a plain `number`.\n   */\n  pairId: string | number;\n  /**\n   * Position index within the pair — same value as `Position.idx` returned by\n   * `getOpenPositions`. Identifies which position to top up or partially withdraw from.\n   */\n  idx: number;\n  /**\n   * Amount in USD as a decimal string.\n   * Positive → add collateral (topUpCollateral).\n   * Negative → remove collateral (removeCollateral).\n   */\n  amount: string;\n}\n\nexport interface Balances {\n  /** USDC balance as a decimal string (e.g. `\"1234.567890\"`). */\n  usdc: string;\n  /** ETH balance as a decimal string (e.g. `\"0.001234567890123456789\"`). */\n  eth: string;\n  /** USDC allowance granted to the TradingStorage contract as a decimal string. Max approval is preserved exactly. */\n  allowance: string;\n}\n\nexport interface AllowanceStatus {\n  /** Current USDC allowance (6 decimals, raw bigint). */\n  current: bigint;\n  /** Required USDC allowance (6 decimals, raw bigint). */\n  required: bigint;\n  /** true if current >= required. */\n  sufficient: boolean;\n}\n\nexport interface SubmissionResult {\n  txHash: Hex;\n  /** Set for gasless submissions — the Safe smart account address that sent the UserOp. */\n  smartAccountAddress?: Address;\n}\n\nexport interface BuiltSafeTxCall {\n  to: Address;\n  data: Hex;\n  value: bigint;\n}\n\nexport interface BuiltEoaTxRequest {\n  kind: 'eoa';\n  to: Address;\n  data: Hex;\n  value: bigint;\n  from: Address;\n  traderAddress: Address;\n}\n\nexport interface BuiltSafeTxRequest {\n  kind: 'safe';\n  safeAddress: Address;\n  traderAddress: Address;\n  calls: [BuiltSafeTxCall];\n}\n\nexport type BuiltTxRequest = BuiltEoaTxRequest | BuiltSafeTxRequest;\n\n/** Internal encoded transaction before signer.prepare(). */\nexport interface EncodedTx {\n  to: Address;\n  data: Hex;\n  value: bigint;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Onboarding\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** A single outstanding onboarding step, with the transaction that clears it. */\nexport interface OnboardingStep {\n  kind: 'approveUsdc' | 'setDelegate' | 'setupGaslessDelegation';\n  /** Human-readable description of what this step does. */\n  description: string;\n  /**\n   * The transaction to submit. Always sent from the trader's own account —\n   * a delegate cannot approve USDC or register itself on the trader's behalf.\n   */\n  tx: BuiltTxRequest;\n}\n\n/**\n * What still stands between a trader and their first trade.\n *\n * ```ts\n * const status = await client.getOnboardingStatus();\n * if (!status.ready) {\n *   for (const step of status.steps) {\n *     console.log(step.description);   // render a checklist\n *     await wallet.sendTransaction(step.tx);\n *   }\n * }\n * ```\n */\nexport interface OnboardingStatus {\n  /** `true` when nothing is outstanding and the trader can actually open a position. */\n  ready: boolean;\n  /** USDC allowance to TradingStorage is below `requiredUsd`. */\n  needsApproval: boolean;\n  /**\n   * USDC balance is below `requiredUsd`. No transaction can fix this — the\n   * trader has to fund the account — so it produces no step, but it does keep\n   * `ready` false.\n   */\n  needsFunding: boolean;\n  /** No delegate registered, or a different one than this client expects. */\n  needsDelegate: boolean;\n  /** Self + Gasless only — the smart account has not been authorised yet. */\n  needsGaslessSetup: boolean;\n  /** Outstanding steps, in the order they should be submitted. */\n  steps: OnboardingStep[];\n  /** Current USDC allowance to TradingStorage, as a decimal string. */\n  allowance: string;\n  /** Trader's USDC balance, as a decimal string. */\n  usdcBalance: string;\n  /** Trader's ETH balance, as a decimal string. Needed for gas in self-submit modes. */\n  ethBalance: string;\n  /** Delegate currently registered on-chain, or `undefined` when none is set. */\n  currentDelegate?: Address;\n}\n","import type { Hex, Address } from 'viem';\n\n// Boost sponsorship endpoint. A JSON-RPC passthrough that geo-routes between\n// sponsorship upstreams; it serves the bundler, ERC-7677 paymaster and\n// `pimlico_getUserOperationGasPrice` methods the gasless submitter uses.\n// Replaces `/v1/pimlico/sponsor`, the legacy single-provider alias.\nexport const DEFAULT_SPONSOR_URL = 'https://builder.prod.bedrock.ostium.io/v1/sponsor?chainId=42161';\nexport const DEFAULT_SPONSOR_URL_TESTNET = 'https://builder.prod.bedrock.ostium.io/v1/sponsor?chainId=421614';\n\n/** @deprecated Use `DEFAULT_SPONSOR_URL`. Kept so existing imports keep resolving. */\nexport const DEFAULT_PIMLICO_URL = DEFAULT_SPONSOR_URL;\n/** @deprecated Use `DEFAULT_SPONSOR_URL_TESTNET`. */\nexport const DEFAULT_PIMLICO_URL_TESTNET = DEFAULT_SPONSOR_URL_TESTNET;\n\nexport type ClientMode =\n  | 'self-self'\n  | 'self-gasless'\n  | 'delegated-self'\n  | 'delegated-gasless';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Named factory param types (preferred API)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Shared optional settings available in every mode. */\ninterface CommonParams {\n  /** Use Arbitrum Sepolia testnet. Defaults to false (mainnet). */\n  testnet?: boolean;\n  /** Default slippage tolerance in basis points (e.g. 25 = 0.25%). Defaults to 25. */\n  slippageBps?: number;\n  /**\n   * Optional builder fee sharing.\n   * `feeBps` in basis points (e.g. 10 = 10 bps / 0.1%, 2.55 = 2.55 bps). Max 50 (0.5%), step 0.01 bps.\n   */\n  builder?: {\n    address: Address;\n    feeBps: number;\n  };\n  /**\n   * Override the Ostium subgraph endpoint used by built-in read methods\n   * (`getPairs`, `getOpenPositions`, etc.). Defaults to the mainnet or testnet\n   * subgraph based on `testnet`.\n   */\n  subgraphUrl?: string;\n  /**\n   * Override the builder API base URL used for live prices, OHLC candles, and\n   * the WebSocket stream. Defaults to `https://builder.prod.bedrock.ostium.io`.\n   */\n  builderApiUrl?: string;\n  /**\n   * Alchemy API key used by account confirmation streams for Arbitrum contract\n   * log overlays. Can be overridden per `streamAccountUpdates()` call.\n   */\n  alchemyApiKey?: string;\n}\n\nexport interface SelfSelfSubmitParams extends CommonParams {\n  /** Private key of the trader's EOA. This account holds USDC, owns all positions, and pays gas. */\n  traderPrivateKey: Hex;\n  /** Arbitrum One (or Sepolia) RPC URL. */\n  rpcUrl: string;\n}\n\nexport interface SelfSelfBuildParams extends CommonParams {\n  /** Trader EOA address. Used to build unsigned transactions without SDK submission. */\n  traderAddress: Address;\n  /** Optional Arbitrum RPC URL for reads/simulation. Defaults to the chain public RPC. */\n  rpcUrl?: string;\n}\n\n/**\n * **Self + Self** — simplest mode.\n *\n * Your EOA is the trader: it holds USDC, owns all positions, and pays gas\n * for every transaction directly.\n */\nexport type SelfSelfParams = SelfSelfSubmitParams | SelfSelfBuildParams;\n\nexport interface SelfGaslessSubmitParams extends CommonParams {\n  /** Private key of the trader's EOA. This account holds USDC and owns all positions. A Safe is derived from this key to relay trades gaslessly. */\n  traderPrivateKey: Hex;\n  /**\n   * Known smart-account address for this key (from a previous client's\n   * `getSmartAccountAddress()`). Skips the on-chain derivation call, making\n   * construction network-free. The address is deterministic per key + chain.\n   */\n  safeAddress?: Address;\n  /**\n   * ERC-4337 bundler/paymaster RPC URL. Defaults to Ostium's boost sponsorship\n   * endpoint, `https://builder.prod.bedrock.ostium.io/v1/sponsor?chainId=42161`,\n   * which sponsors the operation upstream.\n   *\n   * Point it at your own Pimlico project to sponsor through your own account\n   * instead: the submitter then attaches a Pimlico paymaster, applies\n   * `sponsorshipPolicyId`, and uses Pimlico's fee quote and gas estimation.\n   * The flow is selected from the URL, so no extra flag is needed.\n   */\n  pimlicoUrl?: string;\n  /** Arbitrum RPC URL for reads/simulation. Defaults to public Arbitrum RPC when omitted. */\n  rpcUrl?: string;\n  /**\n   * Pimlico gas-sponsorship policy id. Applies only when `pimlicoUrl` points at\n   * your own Pimlico project — Ostium's endpoint enforces policy upstream, so\n   * setting both throws `INVALID_CONFIG` rather than dropping the value.\n   */\n  sponsorshipPolicyId?: string;\n}\n\nexport interface SelfGaslessBuildParams extends CommonParams {\n  /** Trader EOA address that owns USDC and positions. */\n  traderAddress: Address;\n  /** Safe smart-account address that will submit delegated calls. */\n  safeAddress: Address;\n  /** Optional Arbitrum RPC URL for reads/simulation. Defaults to the chain public RPC. */\n  rpcUrl?: string;\n}\n\n/**\n * **Self + Gasless** — your EOA owns everything; a Safe acts as a transparent gasless relay.\n *\n * Submit-capable clients derive the Safe from `traderPrivateKey`. Build-only\n * clients provide both `traderAddress` and `safeAddress`.\n */\nexport type SelfGaslessParams = SelfGaslessSubmitParams | SelfGaslessBuildParams;\n\nexport interface DelegatedSelfSubmitParams extends CommonParams {\n  /** Private key of the delegate EOA. This account signs and pays gas for all transactions. */\n  delegatePrivateKey: Hex;\n  /**\n   * Address of the trader this delegate acts for.\n   * The trader must have called `setDelegate(delegateAddress)` on the trading contract.\n   */\n  traderAddress: Address;\n  /** Arbitrum One (or Sepolia) RPC URL. */\n  rpcUrl: string;\n}\n\nexport interface DelegatedSelfBuildParams extends CommonParams {\n  /** Address of the trader this delegate acts for. */\n  traderAddress: Address;\n  /** Delegate EOA address that will submit the transaction. */\n  delegateAddress: Address;\n  /** Optional Arbitrum RPC URL for reads/simulation. Defaults to the chain public RPC. */\n  rpcUrl?: string;\n}\n\n/**\n * **Delegated + Self** — a dedicated delegate EOA signs and pays gas on behalf of a separate trader address.\n */\nexport type DelegatedSelfParams = DelegatedSelfSubmitParams | DelegatedSelfBuildParams;\n\nexport interface DelegatedGaslessSubmitParams extends CommonParams {\n  /** Private key of the delegate EOA. A Safe smart account is derived from this key and submits UserOperations via Pimlico. */\n  delegatePrivateKey: Hex;\n  /**\n   * Known smart-account address for the delegate key (from a previous client's\n   * `getSmartAccountAddress()`). Skips the on-chain derivation call, making\n   * construction network-free. The address is deterministic per key + chain.\n   */\n  safeAddress?: Address;\n  /**\n   * Address of the trader this delegate acts for.\n   * The trader must have called `setDelegate(safeAddress)` on the trading contract,\n   * where `safeAddress` is the Safe derived from `delegatePrivateKey`.\n   */\n  traderAddress: Address;\n  /**\n   * ERC-4337 bundler/paymaster RPC URL. Defaults to Ostium's boost sponsorship\n   * endpoint, `https://builder.prod.bedrock.ostium.io/v1/sponsor?chainId=42161`,\n   * which sponsors the operation upstream.\n   *\n   * Point it at your own Pimlico project to sponsor through your own account\n   * instead: the submitter then attaches a Pimlico paymaster, applies\n   * `sponsorshipPolicyId`, and uses Pimlico's fee quote and gas estimation.\n   * The flow is selected from the URL, so no extra flag is needed.\n   */\n  pimlicoUrl?: string;\n  /** Arbitrum RPC URL for reads/simulation. Defaults to public Arbitrum RPC when omitted. */\n  rpcUrl?: string;\n  /**\n   * Pimlico gas-sponsorship policy id. Applies only when `pimlicoUrl` points at\n   * your own Pimlico project — Ostium's endpoint enforces policy upstream, so\n   * setting both throws `INVALID_CONFIG` rather than dropping the value.\n   */\n  sponsorshipPolicyId?: string;\n}\n\nexport interface DelegatedGaslessBuildParams extends CommonParams {\n  /** Address of the trader this delegate acts for. */\n  traderAddress: Address;\n  /** Delegate EOA address that owns the Safe. */\n  delegateAddress: Address;\n  /** Safe smart-account address that will submit delegated calls. */\n  safeAddress: Address;\n  /** Optional Arbitrum RPC URL for reads/simulation. Defaults to the chain public RPC. */\n  rpcUrl?: string;\n}\n\n/**\n * **Delegated + Gasless** — a Safe derived from the delegate key submits sponsored UserOperations on behalf of the trader.\n */\nexport type DelegatedGaslessParams = DelegatedGaslessSubmitParams | DelegatedGaslessBuildParams;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal generic config\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface OstiumClientConfig extends CommonParams {\n  mode?: ClientMode;\n  privateKey?: Hex;\n  traderAddress?: Address;\n  delegateAddress?: Address;\n  safeAddress?: Address;\n  rpcUrl?: string;\n  pimlicoUrl?: string;\n  /**\n   * Pimlico gas-sponsorship policy id. Applies only when `pimlicoUrl` points at\n   * your own Pimlico project — Ostium's endpoint enforces policy upstream, so\n   * setting both throws `INVALID_CONFIG` rather than dropping the value.\n   */\n  sponsorshipPolicyId?: string;\n}\n\nexport function hasPrivateKey(config: OstiumClientConfig): config is OstiumClientConfig & { privateKey: Hex } {\n  return typeof config.privateKey === 'string' && config.privateKey.length > 0;\n}\n\nexport function resolveMode(config: OstiumClientConfig): ClientMode {\n  if (config.mode) return config.mode;\n  if (config.privateKey) {\n    if (config.pimlicoUrl) return config.traderAddress ? 'delegated-gasless' : 'self-gasless';\n    return config.traderAddress ? 'delegated-self' : 'self-self';\n  }\n  if (config.safeAddress && config.delegateAddress && config.traderAddress) return 'delegated-gasless';\n  if (config.safeAddress && config.traderAddress) return 'self-gasless';\n  if (config.delegateAddress && config.traderAddress) return 'delegated-self';\n  if (config.traderAddress) return 'self-self';\n  throw new Error('Unable to infer client mode from config');\n}\n\nexport function isGasless(config: OstiumClientConfig): boolean {\n  const mode = resolveMode(config);\n  return mode === 'self-gasless' || mode === 'delegated-gasless';\n}\n\nexport function isDelegated(config: OstiumClientConfig): boolean {\n  const mode = resolveMode(config);\n  return mode === 'delegated-self' || mode === 'delegated-gasless';\n}\n","export enum OstiumErrorCode {\n  INVALID_CONFIG = 'INVALID_CONFIG',\n  VALIDATION_FAILED = 'VALIDATION_FAILED',\n  ALLOWANCE_INSUFFICIENT = 'ALLOWANCE_INSUFFICIENT',\n  SUBMISSION_FAILED = 'SUBMISSION_FAILED',\n  DELEGATION_FAILED = 'DELEGATION_FAILED',\n  CONTRACT_ERROR = 'CONTRACT_ERROR',\n  NETWORK_ERROR = 'NETWORK_ERROR',\n  /**\n   * The operation was submitted but its outcome is unknown — do NOT resubmit.\n   * See {@link OstiumSubmissionPendingError}.\n   */\n  SUBMISSION_PENDING = 'SUBMISSION_PENDING',\n}\n\nexport class OstiumError extends Error {\n  constructor(\n    message: string,\n    public readonly code: OstiumErrorCode,\n    public readonly cause?: unknown,\n  ) {\n    super(message);\n    this.name = 'OstiumError';\n  }\n}\n\n/**\n * Submitted, outcome unknown.\n *\n * A UserOperation that has been accepted by the bundler is not cancelled when\n * we stop waiting for its receipt — it can still land. Reporting that as a\n * plain failure invites the caller to retry and open the position twice, so it\n * gets its own type carrying the hash needed to reconcile.\n *\n * ```ts\n * catch (e) {\n *   if (e instanceof OstiumSubmissionPendingError) {\n *     // Poll the bundler for e.userOpHash, or reconcile against\n *     // getOpenPositions() / getOrders(). Never resubmit blindly.\n *   }\n * }\n * ```\n */\nexport class OstiumSubmissionPendingError extends OstiumError {\n  constructor(\n    message: string,\n    /** Hash of the in-flight UserOperation. */\n    public readonly userOpHash: `0x${string}`,\n    cause?: unknown,\n  ) {\n    super(message, OstiumErrorCode.SUBMISSION_PENDING, cause);\n    this.name = 'OstiumSubmissionPendingError';\n  }\n}\n","import type { Address } from 'viem';\nimport type { EncodedTx } from '../types.js';\nimport type { SignerStrategy } from './index.js';\n\n/**\n * Self signer — the private key belongs to the trader directly.\n * Transactions are submitted as-is without any delegation wrapping.\n *\n * In Self + Self mode:  traderAddress = EOA derived from privateKey.\n * In Self + Gasless mode: NOT used — that mode uses DelegatedSignerStrategy\n *                         because the EOA is the trader and the Safe is the delegate.\n */\nexport class SelfSignerStrategy implements SignerStrategy {\n  readonly traderAddress: Address;\n\n  constructor(traderAddress: Address) {\n    this.traderAddress = traderAddress;\n  }\n\n  prepare(encoded: EncodedTx): EncodedTx {\n    return encoded;\n  }\n}\n","/**\n * ABI encoders for all Ostium trading contract function calls.\n */\n\nimport { type Address, type Hex, encodeFunctionData, getAddress } from 'viem';\nimport { TRADING_ABI } from './internal/contract.js';\nimport { ERC20_ABI } from './internal/erc20.js';\nimport type { OstiumTrade, BuilderFee } from './internal/ostium-schema.js';\nimport { OpenOrderType } from './internal/ostium-schema.js';\nimport type { EncodedTx } from './types.js';\n\nfunction tx(to: Address, data: Hex): EncodedTx {\n  return { to, data, value: 0n };\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Trading contract encoders\n// ────────────────────────────────────────────────────────────────────────────\n\nexport function encodeOpenTrade(\n  trade: OstiumTrade,\n  builderFee: BuilderFee,\n  orderType: OpenOrderType,\n  slippageP: bigint,\n  tradingAddress: Address,\n): EncodedTx {\n  const data = encodeFunctionData({\n    abi: TRADING_ABI,\n    functionName: 'openTrade',\n    args: [\n      {\n        collateral: trade.collateral,\n        openPrice: trade.openPrice,\n        tp: trade.tp,\n        sl: trade.sl,\n        trader: trade.trader,\n        leverage: Number(trade.leverage),\n        pairIndex: Number(trade.pairIndex),\n        index: Number(trade.index),\n        buy: trade.buy,\n        isDayTrade: trade.isDayTrade ?? false\n      },\n      {\n        builder: builderFee.builder,\n        builderFee: Number(builderFee.builderFee),\n      },\n      orderType,\n      slippageP,\n    ],\n  });\n  return tx(tradingAddress, data);\n}\n\nexport function encodeCloseTradeMarket(\n  pairIndex: bigint,\n  index: bigint,\n  closePercentage: bigint,\n  marketPrice: bigint,\n  slippageP: bigint,\n  tradingAddress: Address,\n): EncodedTx {\n  const data = encodeFunctionData({\n    abi: TRADING_ABI,\n    functionName: 'closeTradeMarket',\n    args: [Number(pairIndex), Number(index), Number(closePercentage), marketPrice, Number(slippageP)],\n  });\n  return tx(tradingAddress, data);\n}\n\nexport function encodeCancelLimitOrder(\n  pairIndex: bigint,\n  orderIndex: bigint,\n  tradingAddress: Address,\n): EncodedTx {\n  const data = encodeFunctionData({\n    abi: TRADING_ABI,\n    functionName: 'cancelOpenLimitOrder',\n    args: [Number(pairIndex), Number(orderIndex)],\n  });\n  return tx(tradingAddress, data);\n}\n\nexport function encodeCloseTradeMarketTimeout(\n  orderId: bigint,\n  retry: boolean,\n  tradingAddress: Address,\n): EncodedTx {\n  const data = encodeFunctionData({\n    abi: TRADING_ABI,\n    functionName: 'closeTradeMarketTimeout',\n    args: [orderId, retry],\n  });\n  return tx(tradingAddress, data);\n}\n\nexport function encodeOpenTradeMarketTimeout(\n  orderId: bigint,\n  tradingAddress: Address,\n): EncodedTx {\n  const data = encodeFunctionData({\n    abi: TRADING_ABI,\n    functionName: 'openTradeMarketTimeout',\n    args: [orderId],\n  });\n  return tx(tradingAddress, data);\n}\n\nexport function encodeUpdateOpenLimitOrder(\n  pairIndex: bigint,\n  orderIndex: bigint,\n  price: bigint,\n  tp: bigint,\n  sl: bigint,\n  tradingAddress: Address,\n): EncodedTx {\n  const data = encodeFunctionData({\n    abi: TRADING_ABI,\n    functionName: 'updateOpenLimitOrder',\n    args: [Number(pairIndex), Number(orderIndex), price, tp, sl],\n  });\n  return tx(tradingAddress, data);\n}\n\nexport function encodeUpdateTp(\n  pairIndex: bigint,\n  index: bigint,\n  newTp: bigint,\n  tradingAddress: Address,\n): EncodedTx {\n  const data = encodeFunctionData({\n    abi: TRADING_ABI,\n    functionName: 'updateTp',\n    args: [Number(pairIndex), Number(index), newTp],\n  });\n  return tx(tradingAddress, data);\n}\n\nexport function encodeUpdateSl(\n  pairIndex: bigint,\n  index: bigint,\n  newSl: bigint,\n  tradingAddress: Address,\n): EncodedTx {\n  const data = encodeFunctionData({\n    abi: TRADING_ABI,\n    functionName: 'updateSl',\n    args: [Number(pairIndex), Number(index), newSl],\n  });\n  return tx(tradingAddress, data);\n}\n\nexport function encodeTopUpCollateral(\n  pairIndex: bigint,\n  index: bigint,\n  amount: bigint,\n  tradingAddress: Address,\n): EncodedTx {\n  const data = encodeFunctionData({\n    abi: TRADING_ABI,\n    functionName: 'topUpCollateral',\n    args: [Number(pairIndex), Number(index), amount],\n  });\n  return tx(tradingAddress, data);\n}\n\nexport function encodeRemoveCollateral(\n  pairIndex: bigint,\n  index: bigint,\n  amount: bigint,\n  tradingAddress: Address,\n): EncodedTx {\n  const data = encodeFunctionData({\n    abi: TRADING_ABI,\n    functionName: 'removeCollateral',\n    args: [Number(pairIndex), Number(index), amount],\n  });\n  return tx(tradingAddress, data);\n}\n\nexport function encodeSetDelegate(\n  delegateAddress: Address,\n  tradingAddress: Address,\n): EncodedTx {\n  const data = encodeFunctionData({\n    abi: TRADING_ABI,\n    functionName: 'setDelegate',\n    args: [getAddress(delegateAddress)],\n  });\n  return tx(tradingAddress, data);\n}\n\nexport function encodeRemoveDelegate(tradingAddress: Address): EncodedTx {\n  const data = encodeFunctionData({\n    abi: TRADING_ABI,\n    functionName: 'removeDelegate',\n    args: [],\n  });\n  return tx(tradingAddress, data);\n}\n\n/**\n * Wraps inner calldata in delegatedAction(trader, callData).\n * Used internally by the DelegatedSignerStrategy.\n */\nexport function encodeDelegatedAction(\n  traderAddress: Address,\n  callData: Hex,\n  tradingAddress: Address,\n): EncodedTx {\n  const data = encodeFunctionData({\n    abi: TRADING_ABI,\n    functionName: 'delegatedAction',\n    args: [getAddress(traderAddress), callData],\n  });\n  return tx(tradingAddress, data);\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// ERC-20 encoders\n// ────────────────────────────────────────────────────────────────────────────\n\nexport function encodeUsdcApprove(\n  spender: Address,\n  amount: bigint,\n  usdcAddress: Address,\n): EncodedTx {\n  const data = encodeFunctionData({\n    abi: ERC20_ABI,\n    functionName: 'approve',\n    args: [getAddress(spender), amount],\n  });\n  return tx(usdcAddress, data);\n}\n\nexport function encodeErc20Transfer(\n  to: Address,\n  amount: bigint,\n  tokenAddress: Address,\n): EncodedTx {\n  const data = encodeFunctionData({\n    abi: ERC20_ABI,\n    functionName: 'transfer',\n    args: [getAddress(to), amount],\n  });\n  return tx(tokenAddress, data);\n}\n","import type { Address } from 'viem';\nimport type { EncodedTx } from '../types.js';\nimport type { SignerStrategy } from './index.js';\nimport { encodeDelegatedAction } from '../encoder.js';\n\n/**\n * Delegated signer — the private key belongs to a delegate account that has\n * been granted access via trading.setDelegate() by the actual trader.\n *\n * prepare() wraps every transaction in delegatedAction(traderAddress, callData)\n * so the delegate can execute the trade on the trader's behalf.\n */\nexport class DelegatedSignerStrategy implements SignerStrategy {\n  readonly traderAddress: Address;\n\n  constructor(traderAddress: Address) {\n    this.traderAddress = traderAddress;\n  }\n\n  prepare(encoded: EncodedTx): EncodedTx {\n    return encodeDelegatedAction(this.traderAddress, encoded.data, encoded.to);\n  }\n}\n","import type { Address } from 'viem';\nimport type { EncodedTx } from '../types.js';\nimport type { ClientMode } from '../config.js';\nimport { SelfSignerStrategy } from './self.js';\nimport { DelegatedSignerStrategy } from './delegated.js';\n\nexport interface SignerStrategy {\n  /**\n   * The on-chain trading account. Used as trade.trader in all contract calls\n   * and as the owner of USDC allowances.\n   */\n  readonly traderAddress: Address;\n\n  /**\n   * Prepare a transaction for submission.\n   * - Self mode: returns tx unchanged.\n   * - Delegated mode: wraps data in delegatedAction(traderAddress, data).\n   */\n  prepare(encoded: EncodedTx): EncodedTx;\n}\n\n/**\n * @param selfGasless - true when in Self + Gasless mode (EOA = trader, Safe = delegate).\n *   In this mode we use DelegatedSignerStrategy even though `traderAddress` is not set\n *   in the config — the Safe submits delegatedAction(eoaAddress, callData) on behalf of\n *   the EOA, so all contract calls must be wrapped.\n */\nexport function createSigner(\n  mode: ClientMode,\n  traderAddress: Address,\n): SignerStrategy {\n  if (mode !== 'self-self') {\n    return new DelegatedSignerStrategy(traderAddress);\n  }\n  return new SelfSignerStrategy(traderAddress);\n}\n","import { createWalletClient, http, type Address } from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { arbitrum, arbitrumSepolia } from 'viem/chains';\nimport type { EncodedTx, SubmissionResult } from '../types.js';\nimport type { OstiumClientConfig } from '../config.js';\nimport type { SubmissionStrategy } from './index.js';\nimport { OstiumError, OstiumErrorCode } from '../errors.js';\n\nfunction classifySubmitError(err: unknown): OstiumError {\n  const msg = err instanceof Error ? err.message : String(err);\n  const lower = msg.toLowerCase();\n\n  if (\n    lower.includes('execution reverted') ||\n    lower.includes('reverted with reason') ||\n    lower.includes('contract function') ||\n    lower.includes('revert')\n  ) {\n    return new OstiumError(`Contract reverted: ${msg}`, OstiumErrorCode.CONTRACT_ERROR, err);\n  }\n\n  if (\n    lower.includes('fetch') ||\n    lower.includes('etimedout') ||\n    lower.includes('econnrefused') ||\n    lower.includes('enotfound') ||\n    lower.includes('network') ||\n    lower.includes('timeout') ||\n    lower.includes('connection')\n  ) {\n    return new OstiumError(`Network error: ${msg}`, OstiumErrorCode.NETWORK_ERROR, err);\n  }\n\n  return new OstiumError(\n    `Transaction submission failed: ${msg}`,\n    OstiumErrorCode.SUBMISSION_FAILED,\n    err,\n  );\n}\n\n/**\n * Self-submission strategy — the signer's EOA pays gas.\n * Requires rpcUrl in the config.\n */\nexport class SelfSubmissionStrategy implements SubmissionStrategy {\n  readonly effectiveSender: Address;\n  private readonly send: (encoded: EncodedTx) => Promise<`0x${string}`>;\n\n  constructor(config: OstiumClientConfig, testnet: boolean) {\n    if (!config.privateKey) {\n      throw new OstiumError(\n        'privateKey is required for self-submission mode',\n        OstiumErrorCode.INVALID_CONFIG,\n      );\n    }\n    if (!config.rpcUrl) {\n      throw new OstiumError(\n        'rpcUrl is required for self-submission mode',\n        OstiumErrorCode.INVALID_CONFIG,\n      );\n    }\n    const chain = testnet ? arbitrumSepolia : arbitrum;\n    const account = privateKeyToAccount(config.privateKey);\n    const walletClient = createWalletClient({ account, chain, transport: http(config.rpcUrl) });\n    this.effectiveSender = account.address;\n    this.send = (encoded) =>\n      walletClient.sendTransaction({ account, to: encoded.to, data: encoded.data, value: encoded.value });\n  }\n\n  async submit(encoded: EncodedTx): Promise<SubmissionResult> {\n    try {\n      const txHash = await this.send(encoded);\n      return { txHash };\n    } catch (err) {\n      throw classifySubmitError(err);\n    }\n  }\n}\n","import { createPublicClient, decodeErrorResult, http, type Address, type Hex } from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { arbitrum, arbitrumSepolia } from 'viem/chains';\nimport {\n  entryPoint07Address,\n  WaitForUserOperationReceiptTimeoutError,\n} from 'viem/account-abstraction';\nimport { createSmartAccountClient } from 'permissionless';\nimport { createPimlicoClient } from 'permissionless/clients/pimlico';\nimport { toSafeSmartAccount as toLightSmartAccount } from 'permissionless/accounts';\nimport type { EncodedTx, SubmissionResult } from '../types.js';\nimport type { OstiumClientConfig } from '../config.js';\nimport type { SubmissionStrategy } from './index.js';\nimport { OstiumError, OstiumErrorCode, OstiumSubmissionPendingError } from '../errors.js';\nimport { TRADING_ABI } from '../internal/contract.js';\n\n/**\n * Is this URL one of Ostium's sponsorship endpoints?\n *\n * Decides which of the two submission flows runs. It is a property of the\n * endpoint, not of how the caller configured the client: someone who passes\n * the Ostium URL explicitly should get the sponsored flow, and someone who\n * points `pimlicoUrl` at their own Pimlico project should get the classic one.\n *\n * Matched on host + path rather than compared to the default constants so a\n * staging or self-hosted deployment of the same service still resolves to the\n * sponsored flow.\n */\nexport function isOstiumSponsorshipEndpoint(url: string): boolean {\n  try {\n    const { hostname, pathname } = new URL(url);\n    return (\n      (hostname === 'ostium.io' || hostname.endsWith('.ostium.io')) &&\n      pathname.includes('/sponsor')\n    );\n  } catch {\n    // Not a URL we can parse — treat it as third-party and take the classic\n    // flow, which pays real fees rather than assuming someone sponsors them.\n    return false;\n  }\n}\n\n/**\n * UserOperation gas limits for sponsored submission.\n *\n * The sponsorship endpoint applies the paymaster upstream, so operations are\n * submitted at a zero fee — and bundlers refuse to run\n * `eth_estimateUserOperationGas` at a zero `maxFeePerGas`. Limits are therefore\n * supplied rather than estimated, matching the Ostium frontend. Unused gas is\n * refunded, so headroom costs nothing.\n *\n * `preVerificationGas: 0n` is the exception, and the constant that makes this\n * submitter Ostium-relay-only rather than merely Ostium-relay-tuned. On\n * Arbitrum it covers the L1 calldata cost of posting the batch, so zero is not\n * headroom — it asks the bundler to absorb that cost outright. Confirmed\n * on-chain: userOps through this path settle with `actualGasCost = 0` and a\n * zero-address paymaster. Point this at a bundler that does not sponsor and\n * this is the first constant to change.\n *\n * ponytail: fixed limits; make them configurable if a call ever exceeds them.\n */\nconst SPONSORED_CALL_GAS_LIMIT = 750_000n;\nconst SPONSORED_VERIFICATION_GAS_LIMIT = 350_000n;\nconst SPONSORED_PRE_VERIFICATION_GAS = 0n;\n\n/**\n * Poll the bundler this often while waiting for the receipt.\n *\n * The frontend polls at 100-200ms, which suits one user watching one trade in\n * a browser. This SDK can have many submissions in flight against a shared,\n * rate-limited sponsorship endpoint, so it polls more gently. A market order\n * takes seconds to fill; 500ms costs nothing visible and avoids being the\n * client that trips the limit for everyone.\n */\nconst RECEIPT_POLL_INTERVAL_MS = 500;\n\n/**\n * Give up waiting for a receipt after this long.\n *\n * Without it a dropped or never-bundled operation leaves the caller awaiting\n * forever, indistinguishable from a slow fill.\n */\nconst RECEIPT_TIMEOUT_MS = 120_000;\n\n/**\n * Turn a failed UserOperation receipt into a typed error.\n *\n * A UserOperation that reverts still lands on-chain as a successful\n * transaction — the EntryPoint catches the inner revert and emits\n * `UserOperationRevertReason`. Only `receipt.success` distinguishes the two, so\n * a submitter that stops at the transaction hash reports a reverted trade as a\n * success. `reason` carries the raw revert data, which decodes against the\n * trading ABI into the actual contract error.\n */\nfunction userOperationRevertError(receipt: { reason?: unknown; receipt?: { transactionHash?: Hex } }): OstiumError {\n  const txHash = receipt.receipt?.transactionHash;\n  const suffix = txHash ? ` (tx ${txHash})` : '';\n\n  const reason = receipt.reason;\n  if (typeof reason === 'string' && reason.startsWith('0x') && reason.length > 2) {\n    try {\n      const decoded = decodeErrorResult({ abi: TRADING_ABI, data: reason as Hex });\n      return new OstiumError(\n        `Contract reverted: ${decoded.errorName}${suffix}`,\n        OstiumErrorCode.CONTRACT_ERROR,\n      );\n    } catch {\n      // Not a trading-contract error — surface the raw data rather than nothing.\n      return new OstiumError(\n        `UserOperation reverted with data ${reason}${suffix}`,\n        OstiumErrorCode.CONTRACT_ERROR,\n      );\n    }\n  }\n\n  return new OstiumError(\n    `UserOperation reverted on-chain${suffix}`,\n    OstiumErrorCode.CONTRACT_ERROR,\n  );\n}\n\n/**\n * ERC-4337 failure codes (`AA23 reverted`, `AA41 too little verificationGas`…).\n *\n * Matched as a whole token, never as a substring: `a` is a hex digit, so any\n * error carrying revert data or an address contains `aa` somewhere and a naive\n * `includes('aa')` labels every one of them a contract revert.\n */\nconst AA_ERROR_CODE_RE = /\\bAA\\d{2}\\b/i;\n\n/** @internal Exported for tests; not part of the public API. */\nexport function classifyGaslessError(err: unknown): OstiumError {\n  const msg = err instanceof Error ? err.message : String(err);\n  const lower = msg.toLowerCase();\n\n  if (\n    lower.includes('execution reverted') ||\n    lower.includes('reverted with reason') ||\n    lower.includes('revert') ||\n    lower.includes('userop reverted') ||\n    AA_ERROR_CODE_RE.test(msg)\n  ) {\n    return new OstiumError(`Contract reverted: ${msg}`, OstiumErrorCode.CONTRACT_ERROR, err);\n  }\n\n  if (lower.includes('429') || lower.includes('rate limit') || lower.includes('too many requests')) {\n    return new OstiumError(\n      `Pimlico rate limit exceeded — retry after 60 seconds. ${msg}`,\n      OstiumErrorCode.NETWORK_ERROR,\n      err,\n    );\n  }\n\n  if (lower.includes('sponsorship') || lower.includes('policy')) {\n    return new OstiumError(\n      `Pimlico sponsorship policy error — check sponsorshipPolicyId config. ${msg}`,\n      OstiumErrorCode.INVALID_CONFIG,\n      err,\n    );\n  }\n\n  if (\n    lower.includes('fetch') ||\n    lower.includes('etimedout') ||\n    lower.includes('econnrefused') ||\n    lower.includes('network') ||\n    lower.includes('timeout') ||\n    lower.includes('bundle') ||\n    lower.includes('connection')\n  ) {\n    return new OstiumError(`Network error: ${msg}`, OstiumErrorCode.NETWORK_ERROR, err);\n  }\n\n  return new OstiumError(\n    `Gasless submission failed: ${msg}`,\n    OstiumErrorCode.SUBMISSION_FAILED,\n    err,\n  );\n}\n\n/**\n * Gasless submission strategy — submits transactions via Pimlico as ERC-4337\n * UserOperations signed by a Safe 1.4.1 smart account.\n *\n * The Safe address is the submitter's effectiveSender. In Self + Gasless mode\n * the Safe address also becomes the trader's on-chain identity (trade.trader).\n *\n * Use the static GaslessSubmissionStrategy.create() factory to initialise —\n * it resolves the Safe address before returning, so effectiveSender is always\n * available synchronously after construction.\n */\nexport class GaslessSubmissionStrategy implements SubmissionStrategy {\n  readonly effectiveSender: Address;\n  private readonly testnet: boolean;\n  private readonly pimlicoUrl: string;\n  private readonly sponsorshipPolicyId?: string;\n  /** True when `pimlicoUrl` is an Ostium sponsorship endpoint. See `submit`. */\n  private readonly sponsoredEndpoint: boolean;\n  // Cached Safe account — derived once in create(), reused on every submit().\n  private readonly safeAccount: Awaited<ReturnType<typeof toLightSmartAccount>>;\n\n  private constructor(\n    testnet: boolean,\n    pimlicoUrl: string,\n    sponsorshipPolicyId: string | undefined,\n    safeAccount: Awaited<ReturnType<typeof toLightSmartAccount>>,\n  ) {\n    this.testnet = testnet;\n    this.pimlicoUrl = pimlicoUrl;\n    this.sponsorshipPolicyId = sponsorshipPolicyId;\n    // Sponsored flow only when nothing else has to be carried in a\n    // paymasterContext. A caller with a policy id keeps the paymaster-attached\n    // flow: it is what they were already running, and it is the only way their\n    // policy reaches the paymaster at all.\n    this.sponsoredEndpoint =\n      isOstiumSponsorshipEndpoint(pimlicoUrl) && !sponsorshipPolicyId;\n    this.safeAccount = safeAccount;\n    this.effectiveSender = safeAccount.address;\n  }\n\n  static async create(\n    config: OstiumClientConfig,\n    testnet: boolean,\n  ): Promise<GaslessSubmissionStrategy> {\n    if (!config.privateKey) {\n      throw new OstiumError(\n        'privateKey is required for gasless submission mode',\n        OstiumErrorCode.INVALID_CONFIG,\n      );\n    }\n    if (!config.pimlicoUrl) {\n      throw new OstiumError(\n        'pimlicoUrl is required for gasless mode',\n        OstiumErrorCode.INVALID_CONFIG,\n      );\n    }\n\n    const chain = testnet ? arbitrumSepolia : arbitrum;\n    const pimlicoUrl = config.pimlicoUrl;\n\n    const chainRpc =\n      config.rpcUrl ??\n      (testnet ? 'https://sepolia-rollup.arbitrum.io/rpc' : 'https://arb1.arbitrum.io/rpc');\n    const rpcTransport = http(chainRpc);\n    const publicClient = createPublicClient({ chain, transport: rpcTransport });\n    const owner = privateKeyToAccount(config.privateKey);\n\n    try {\n      const safeAccount = await toLightSmartAccount({\n        client: publicClient,\n        owners: [owner],\n        entryPoint: {\n          address: entryPoint07Address,\n          version: '0.7',\n        },\n        version: '1.4.1',\n        // A caller-supplied address skips permissionless's on-chain\n        // counterfactual-address derivation (one eth_call per construction).\n        address: config.safeAddress,\n      });\n\n      return new GaslessSubmissionStrategy(testnet, pimlicoUrl, config.sponsorshipPolicyId, safeAccount);\n    } catch (err) {\n      throw new OstiumError(\n        `Failed to derive Safe smart account address: ${err instanceof Error ? err.message : String(err)}`,\n        OstiumErrorCode.INVALID_CONFIG,\n        err,\n      );\n    }\n  }\n\n  /**\n   * Submit as an ERC-4337 UserOperation.\n   *\n   * Two flows, chosen by the endpoint:\n   *\n   * - **Ostium sponsorship endpoint** (the default). It applies the paymaster\n   *   upstream, so no paymaster client is attached, fees are zero, and gas\n   *   limits are supplied rather than estimated — a bundler will not estimate\n   *   at a zero `maxFeePerGas`.\n   * - **Your own Pimlico** (`pimlicoUrl` set to a non-Ostium URL). The classic\n   *   flow: a Pimlico paymaster client carrying your `sponsorshipPolicyId`,\n   *   Pimlico's own fee quote, and bundler-estimated gas limits. Nothing\n   *   sponsors these operations for free, so the zero-fee shortcut above would\n   *   simply be rejected.\n   */\n  /**\n   * Classic Pimlico flow — a paymaster client with the caller's policy and\n   * Pimlico's fee quote. Used when `pimlicoUrl` is not an Ostium endpoint.\n   */\n  private createSelfSponsoredClient(chain: typeof arbitrum | typeof arbitrumSepolia) {\n    const pimlicoClient = createPimlicoClient({\n      transport: http(this.pimlicoUrl),\n      entryPoint: { address: entryPoint07Address, version: '0.7' },\n    });\n\n    return createSmartAccountClient({\n      account: this.safeAccount,\n      chain,\n      bundlerTransport: http(this.pimlicoUrl),\n      paymaster: pimlicoClient,\n      userOperation: {\n        estimateFeesPerGas: async () => (await pimlicoClient.getUserOperationGasPrice()).fast,\n      },\n      pollingInterval: RECEIPT_POLL_INTERVAL_MS,\n      ...(this.sponsorshipPolicyId && {\n        paymasterContext: { sponsorshipPolicyId: this.sponsorshipPolicyId },\n      }),\n    });\n  }\n\n  async submit(encoded: EncodedTx): Promise<SubmissionResult> {\n    const chain = this.testnet ? arbitrumSepolia : arbitrum;\n    const call = { to: encoded.to, data: encoded.data, value: encoded.value ?? 0n };\n\n    try {\n      const smartAccountClient = this.sponsoredEndpoint\n        ? createSmartAccountClient({\n            account: this.safeAccount,\n            chain,\n            bundlerTransport: http(this.pimlicoUrl),\n            userOperation: {\n              estimateFeesPerGas: async () => ({\n                maxFeePerGas: 0n,\n                maxPriorityFeePerGas: 0n,\n              }),\n            },\n            pollingInterval: RECEIPT_POLL_INTERVAL_MS,\n          })\n        : this.createSelfSponsoredClient(chain);\n\n      // Send and await the UserOperation rather than using `sendTransaction`.\n      // `sendTransaction` resolves on the transaction receipt, which is\n      // successful even when the inner call reverted — the EntryPoint catches\n      // the revert. Only the UserOperation receipt carries `success`.\n      const hash = await smartAccountClient.sendUserOperation({\n        calls: [call],\n        // Fixed limits only where the relay absorbs the cost. On a\n        // caller-owned bundler the operation is paid for, so let it estimate.\n        ...(this.sponsoredEndpoint\n          ? {\n              callGasLimit: SPONSORED_CALL_GAS_LIMIT,\n              verificationGasLimit: SPONSORED_VERIFICATION_GAS_LIMIT,\n              preVerificationGas: SPONSORED_PRE_VERIFICATION_GAS,\n            }\n          : {}),\n      });\n\n      let receipt;\n      try {\n        receipt = await smartAccountClient.waitForUserOperationReceipt({\n          hash,\n          pollingInterval: RECEIPT_POLL_INTERVAL_MS,\n          timeout: RECEIPT_TIMEOUT_MS,\n        });\n      } catch (err) {\n        // The bundler already accepted this operation; giving up on the\n        // receipt does not cancel it, and it can still land. Surfacing a\n        // generic failure here would invite a retry and open the position\n        // twice, so hand back the hash and say so explicitly.\n        if (err instanceof WaitForUserOperationReceiptTimeoutError) {\n          throw new OstiumSubmissionPendingError(\n            `UserOperation ${hash} was accepted by the bundler but produced no receipt within ` +\n              `${RECEIPT_TIMEOUT_MS / 1000}s. It may still execute — reconcile against ` +\n              `getOpenPositions() or getOrders() before resubmitting.`,\n            hash,\n            err,\n          );\n        }\n        throw err;\n      }\n\n      if (!receipt.success) {\n        throw userOperationRevertError(receipt);\n      }\n\n      return {\n        txHash: receipt.receipt.transactionHash,\n        smartAccountAddress: this.safeAccount.address,\n      };\n    } catch (err) {\n      // Already typed — a revert classified from the receipt must not be\n      // reclassified by the generic string matcher.\n      if (err instanceof OstiumError) throw err;\n      throw classifyGaslessError(err);\n    }\n  }\n}\n","import type { Address } from 'viem';\nimport type { EncodedTx, SubmissionResult } from '../types.js';\nimport type { ClientMode, OstiumClientConfig } from '../config.js';\nimport { SelfSubmissionStrategy } from './self.js';\nimport { GaslessSubmissionStrategy } from './gasless.js';\n\nexport interface SubmissionStrategy {\n  /**\n   * The address that will appear as msg.sender on-chain.\n   * - Self mode:    EOA address derived from privateKey.\n   * - Gasless mode: Safe smart-account address derived from privateKey.\n   */\n  readonly effectiveSender: Address;\n\n  submit(encoded: EncodedTx): Promise<SubmissionResult>;\n}\n\n/**\n * Factory — synchronous for Self mode, but for Gasless mode the returned\n * strategy's effectiveSender is pre-resolved via GaslessSubmissionStrategy.create().\n * Call createSubmitter() which handles both cases uniformly.\n */\nexport async function createSubmitter(\n  config: OstiumClientConfig,\n  testnet: boolean,\n  mode: ClientMode,\n): Promise<SubmissionStrategy> {\n  if (mode === 'self-gasless' || mode === 'delegated-gasless') {\n    return GaslessSubmissionStrategy.create(config, testnet);\n  }\n  if (!config.rpcUrl) {\n    throw new Error('rpcUrl is required for self-submission mode');\n  }\n  return new SelfSubmissionStrategy(config, testnet);\n}\n","export enum OstiumSubgraphErrorCode {\n  INVALID_CONFIG  = 'INVALID_CONFIG',\n  INVALID_PARAMS  = 'INVALID_PARAMS',\n  FETCH_FAILED    = 'FETCH_FAILED',\n  NOT_FOUND       = 'NOT_FOUND',\n  PARSE_ERROR     = 'PARSE_ERROR',\n}\n\nexport class OstiumSubgraphError extends Error {\n  constructor(\n    message: string,\n    public readonly code: OstiumSubgraphErrorCode,\n    public readonly cause?: unknown,\n  ) {\n    super(message);\n    this.name = 'OstiumSubgraphError';\n  }\n}\n","export const SDK_VERSION = '0.8.0';\nexport const SDK_USER_AGENT = `ostium-builder-sdk/${SDK_VERSION}`;\n","export interface RetryAfterError extends Error {\n  retryAfterMs?: number;\n}\n\nexport function retryAfterMsFromHeader(value: unknown): number | undefined {\n  if (value === undefined || value === null) return undefined;\n  const raw = Array.isArray(value) ? value[0] : value;\n  if (typeof raw !== 'string' || raw.length === 0) return undefined;\n\n  const seconds = Number(raw);\n  if (Number.isFinite(seconds) && seconds >= 0) return seconds * 1000;\n\n  const dateMs = Date.parse(raw);\n  if (!Number.isFinite(dateMs)) return undefined;\n  return Math.max(0, dateMs - Date.now());\n}\n\nexport function headerValue(headers: unknown, name: string): unknown {\n  if (!headers) return undefined;\n  if (typeof (headers as { get?: unknown }).get === 'function') {\n    return (headers as { get(name: string): unknown }).get(name);\n  }\n\n  const normalizedName = name.toLowerCase();\n  if (Array.isArray(headers)) {\n    for (const entry of headers) {\n      if (!Array.isArray(entry) || entry.length < 2) continue;\n      if (String(entry[0]).toLowerCase() === normalizedName) return entry[1];\n    }\n    return undefined;\n  }\n\n  if (typeof headers === 'object') {\n    for (const [key, value] of Object.entries(headers as Record<string, unknown>)) {\n      if (key.toLowerCase() === normalizedName) return value;\n    }\n  }\n  return undefined;\n}\n\n/**\n * Find a retry delay on an error, walking `cause` outward until one is found.\n *\n * Iterative with a seen-set rather than recursive: `err.cause === err` is legal\n * (as is any longer cycle), and recursion would run until the stack overflowed.\n * Callers invoke this from inside their error handlers — `recordPollFailure()` in\n * the account-updates poll `catch`, `OstiumSubgraphClient` on a failed read — so a\n * `RangeError` there escapes as an unhandled rejection rather than as a normal\n * request failure. The loop also keeps a legitimately deep chain off the stack.\n */\nexport function retryAfterMsFromError(error: unknown): number | undefined {\n  const seen = new WeakSet<object>();\n  let current: unknown = error;\n\n  while (current && typeof current === 'object') {\n    if (seen.has(current)) return undefined;\n    seen.add(current);\n\n    const withRetry = current as { retryAfterMs?: unknown; response?: unknown; cause?: unknown };\n    if (typeof withRetry.retryAfterMs === 'number' && Number.isFinite(withRetry.retryAfterMs)) {\n      return Math.max(0, withRetry.retryAfterMs);\n    }\n\n    const response = withRetry.response as { headers?: unknown } | undefined;\n    const retryAfterMs = retryAfterMsFromHeader(headerValue(response?.headers, 'retry-after'));\n    if (retryAfterMs !== undefined) return retryAfterMs;\n\n    current = withRetry.cause;\n  }\n\n  return undefined;\n}\n","// Internal GQL query strings. Not exported from the SDK — the client formats\n// raw responses before returning.\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Pairs (sorted by id)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst PAIR_FIELDS = `\n    id\n    from\n    to\n    maxLeverage\n    overnightMaxLeverage\n    takerFeeP\n    makerFeeP\n    makerMaxLeverage\n    maxOI\n    longOI\n    shortOI\n    fee { oracleFee minLevPos }\n    group { id name maxLeverage minLeverage longCollateral shortCollateral maxCollateralP }\n    lastUpdateTimestamp\n    buyVolume\n    sellVolume\n    decayRate\n    netVolThreshold\n    priceImpactK\n    accRolloverLong\n    accRolloverShort\n    lastRolloverBlock\n    lastRolloverLongPure\n    brokerPremium\n    isNegativeRolloverAllowed\n    lastTradePrice\n    spreadP`;\n\nexport const GetPairsAndGroupsQuery = `\nquery GetPairsAndGroups {\n  pairs(orderBy: id, orderDirection: asc, subgraphError: allow) {\n    ${PAIR_FIELDS}\n  }\n  groups { id name maxLeverage minLeverage longCollateral shortCollateral maxCollateralP }\n}`;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Open trades — full pair sub-fields needed for live PnL calculations\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst PAIR_FULL = `\n    pair {\n      id from to\n      maxLeverage overnightMaxLeverage\n      takerFeeP makerFeeP makerMaxLeverage\n      maxOI longOI shortOI\n      fee { oracleFee minLevPos }\n      group { id name maxLeverage minLeverage longCollateral shortCollateral maxCollateralP }\n      lastUpdateTimestamp\n      buyVolume sellVolume decayRate netVolThreshold priceImpactK\n      accRolloverLong accRolloverShort lastRolloverBlock lastRolloverLongPure\n      brokerPremium isNegativeRolloverAllowed lastTradePrice\n    }`;\n\nconst TRADE_CORE = `\n    id tradeID trader\n    isOpen isBuy isDayTrade\n    index tradeType\n    collateral notional tradeNotional leverage highestLeverage\n    openPrice stopLossPrice takeProfitPrice\n    rollover timestamp`;\n\nexport const GetTraderOpenTradesQuery = `\nquery GetTraderOpenTrades($trader: String!, $skip: Int!, $first: Int!) {\n  trades(\n    where: { isOpen: true, trader: $trader }\n    skip: $skip first: $first\n    orderBy: timestamp orderDirection: desc\n  ) {\n    ${TRADE_CORE}\n    ${PAIR_FULL}\n  }\n}`;\n\nexport const GetAllOpenTradesQuery = `\nquery GetAllOpenTrades($skip: Int!, $first: Int!) {\n  trades(\n    where: { isOpen: true }\n    skip: $skip first: $first\n    orderBy: timestamp orderDirection: desc\n  ) {\n    ${TRADE_CORE}\n    ${PAIR_FULL}\n  }\n}`;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Executed orders — fills\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst ORDER_FIELDS = `\n    id tradeID limitID trader\n    pair { id from to group { id name } }\n    orderAction orderType isBuy\n    isPending isCancelled cancelReason\n    collateral notional tradeNotional leverage\n    price priceAfterImpact priceImpactP\n    vaultFee devFee oracleFee rolloverFee liquidationFee\n    builder builderFee\n    profitPercent totalProfitPercent amountSentToTrader\n    closePercent\n    initiatedTx initiatedBlock initiatedAt\n    executedTx executedBlock executedAt`;\n\n/**\n * Build an executed-fills query with optional filters. Pass `false` for any\n * filter to omit it from both the query signature and the `where` clause.\n */\nexport function buildExecutedFillsQuery(opts: {\n  hasTrader: boolean;\n  hasPairId: boolean;\n  hasTimeRange: boolean;\n}): string {\n  const args: string[]      = ['$skip: Int!', '$first: Int!'];\n  const conditions: string[] = ['isPending: false', 'isCancelled: false'];\n\n  if (opts.hasTrader) {\n    args.push('$trader: String!');\n    conditions.push('trader: $trader');\n  }\n  if (opts.hasPairId) {\n    args.push('$pairId: String!');\n    conditions.push('pair: $pairId');\n  }\n  if (opts.hasTimeRange) {\n    args.push('$startSec: BigInt!', '$endSec: BigInt!');\n    conditions.push('executedAt_gte: $startSec', 'executedAt_lte: $endSec');\n  }\n\n  return `\nquery GetExecutedFills(${args.join(', ')}) {\n  orders(\n    where: { ${conditions.join(', ')} }\n    skip: $skip first: $first\n    orderBy: executedAt orderDirection: desc\n  ) { ${ORDER_FIELDS} }\n}`;\n}\n\n/**\n * Build a query for orders at any status (pending, executed, cancelled).\n * - `hasOrderIds`: filter by `id_in` (on-chain order ids).\n * - `hasInitiatedTxHashes`: filter by `initiatedTx_in` (submission tx hashes).\n * - `hasTrader`: filter by trader address.\n * Other filters compose with those lookup modes.\n */\nexport function buildGetOrdersQuery(opts: {\n  hasOrderIds: boolean;\n  hasInitiatedTxHashes: boolean;\n  hasTrader: boolean;\n  hasBuilder: boolean;\n  hasIsPending: boolean;\n  hasIsCancelled: boolean;\n  hasPairIds: boolean;\n  hasTradeIds: boolean;\n  hasExcludeIds: boolean;\n  hasExecutedStart: boolean;\n  hasExecutedEnd: boolean;\n}): string {\n  const args: string[] = ['$skip: Int!', '$first: Int!'];\n  const conditions: string[] = [];\n\n  if (opts.hasOrderIds) {\n    args.push('$ids: [String!]!');\n    conditions.push('id_in: $ids');\n  }\n  if (opts.hasInitiatedTxHashes) {\n    args.push('$txHashes: [String!]!');\n    conditions.push('initiatedTx_in: $txHashes');\n  }\n  if (opts.hasTrader) {\n    args.push('$trader: String!');\n    conditions.push('trader: $trader');\n  }\n  if (opts.hasBuilder) {\n    args.push('$builder: String!');\n    conditions.push('builder: $builder');\n  }\n  if (opts.hasIsPending) {\n    args.push('$isPending: Boolean!');\n    conditions.push('isPending: $isPending');\n  }\n  if (opts.hasIsCancelled) {\n    args.push('$isCancelled: Boolean!');\n    conditions.push('isCancelled: $isCancelled');\n  }\n  if (opts.hasPairIds) {\n    args.push('$pairIds: [String!]!');\n    conditions.push('pair_in: $pairIds');\n  }\n  if (opts.hasTradeIds) {\n    args.push('$tradeIds: [String!]!');\n    conditions.push('tradeID_in: $tradeIds');\n  }\n  if (opts.hasExcludeIds) {\n    args.push('$excludeIds: [String!]!');\n    conditions.push('id_not_in: $excludeIds');\n  }\n  if (opts.hasExecutedStart) {\n    args.push('$executedStartSec: BigInt!');\n    conditions.push('executedAt_gte: $executedStartSec');\n  }\n  if (opts.hasExecutedEnd) {\n    args.push('$executedEndSec: BigInt!');\n    conditions.push('executedAt_lte: $executedEndSec');\n  }\n\n  const where = conditions.length > 0 ? `where: { ${conditions.join(', ')} }` : '';\n\n  return `\nquery GetOrders(${args.join(', ')}) {\n  orders(\n    ${where}\n    skip: $skip first: $first\n    orderBy: initiatedAt orderDirection: desc\n  ) { ${ORDER_FIELDS} }\n}`;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Active limit orders (sorted by updatedAt desc)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst LIMIT_FIELDS = `\n    id uniqueId orderId trader\n    pair { id from to group { id name } }\n    isBuy limitType isActive executionStarted\n    collateral notional tradeNotional leverage\n    openPrice takeProfitPrice stopLossPrice\n    block initiatedAt updatedAt`;\n\nexport const GetTraderActiveLimitsQuery = `\nquery GetTraderActiveLimits($trader: String!, $skip: Int!, $first: Int!) {\n  limits(\n    where: { isActive: true, trader: $trader }\n    skip: $skip first: $first\n    orderBy: updatedAt orderDirection: desc\n  ) { ${LIMIT_FIELDS} }\n}`;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Account updates snapshot — pending orders, active limits, open trades\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const GetAccountUpdatesSnapshotQuery = `\nquery GetAccountUpdatesSnapshot($traders: [String!]!, $first: Int!, $closedSince: BigInt!) {\n  orders(\n    where: { trader_in: $traders, isPending: true, isCancelled: false, orderType: \"Market\" }\n    first: $first\n    orderBy: initiatedAt orderDirection: desc\n  ) { ${ORDER_FIELDS} }\n  limits(\n    where: { trader_in: $traders, isActive: true }\n    first: $first\n    orderBy: updatedAt orderDirection: desc\n  ) { ${LIMIT_FIELDS} }\n  trades(\n    where: { trader_in: $traders, isOpen: true }\n    first: $first\n    orderBy: timestamp orderDirection: desc\n  ) {\n    ${TRADE_CORE}\n    ${PAIR_FULL}\n  }\n  closedOrders: orders(\n    where: { trader_in: $traders, isPending: false, isCancelled: false, orderAction_not: \"Open\", executedAt_gte: $closedSince }\n    first: $first\n    orderBy: executedAt orderDirection: desc\n  ) { ${ORDER_FIELDS} }\n}`;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Vault — protocol balance, required by `WithinExposureLimit`\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const GetVaultQuery = `\nquery GetVault {\n  vault(id: \"usdc-vault\", subgraphError: allow) {\n    accPnlPerTokenUsed\n    shares\n    rewardsPerToken\n  }\n}`;\n","/**\n * Paginate a subgraph query, optionally capped at `max` total results.\n * Calls `fetcher(skip, first)` in a loop until either the page is short\n * (no more results) or the cap is reached. Pass `max = Infinity` to fetch\n * exhaustively.\n */\nexport async function paginateAll<T>(\n  fetcher: (skip: number, first: number) => Promise<T[]>,\n  batchSize = 1000,\n  max = Infinity,\n  initialSkip = 0,\n): Promise<T[]> {\n  const results: T[] = [];\n  let skip = initialSkip;\n\n  while (results.length < max) {\n    const remaining = max - results.length;\n    const fetchSize = Math.min(batchSize, remaining);\n    const page = await fetcher(skip, fetchSize);\n    results.push(...page);\n    if (page.length < fetchSize) break;\n    skip += fetchSize;\n  }\n\n  return results;\n}\n","import { OstiumSubgraphError, OstiumSubgraphErrorCode } from '../errors.js';\nimport type { GetOrdersParams, Order } from '../types.js';\n\nexport const TRADE_ID_BATCH_SIZE = 500;\n\nexport interface OrderQueryFlags {\n  hasOrderIds: boolean;\n  hasInitiatedTxHashes: boolean;\n  hasTrader: boolean;\n  hasBuilder: boolean;\n  hasIsPending: boolean;\n  hasIsCancelled: boolean;\n  hasPairIds: boolean;\n  hasTradeIds: boolean;\n  hasExcludeIds: boolean;\n  hasExecutedStart: boolean;\n  hasExecutedEnd: boolean;\n  isCancelled: boolean | undefined;\n}\n\nexport function validateOrderFilterParams(params: GetOrdersParams): void {\n  const hasOrderIds = !!(params.orderIds && params.orderIds.length > 0);\n  const hasInitiatedTxHashes = !!(params.initiatedTxHashes && params.initiatedTxHashes.length > 0);\n  if (hasOrderIds && hasInitiatedTxHashes) {\n    throw new OstiumSubgraphError(\n      'getOrders: pass either orderIds or initiatedTxHashes, not both',\n      OstiumSubgraphErrorCode.INVALID_PARAMS,\n    );\n  }\n\n  if (\n    params.isCanceled !== undefined &&\n    params.isCancelled !== undefined &&\n    params.isCanceled !== params.isCancelled\n  ) {\n    throw new OstiumSubgraphError(\n      'getOrders: pass either isCanceled or isCancelled, not conflicting values for both',\n      OstiumSubgraphErrorCode.INVALID_PARAMS,\n    );\n  }\n\n  if (params.start !== undefined && params.end !== undefined && params.start >= params.end) {\n    throw new OstiumSubgraphError(\n      'getOrders: start must be less than end',\n      OstiumSubgraphErrorCode.INVALID_PARAMS,\n    );\n  }\n}\n\nexport function resolveOrderQueryFlags(\n  params: GetOrdersParams,\n  extra?: { tradeIds?: string[]; excludeIds?: string[] },\n): OrderQueryFlags {\n  const isCancelled = params.isCanceled ?? params.isCancelled;\n  return {\n    hasOrderIds: !!(params.orderIds && params.orderIds.length > 0),\n    hasInitiatedTxHashes: !!(params.initiatedTxHashes && params.initiatedTxHashes.length > 0),\n    hasTrader: params.user !== undefined && params.user !== 'ALL',\n    hasBuilder: !!params.builder,\n    hasIsPending: params.isPending !== undefined,\n    hasIsCancelled: isCancelled !== undefined,\n    hasPairIds: !!(params.pairIds && params.pairIds.length > 0),\n    hasTradeIds: !!(extra?.tradeIds && extra.tradeIds.length > 0),\n    hasExcludeIds: !!(extra?.excludeIds && extra.excludeIds.length > 0),\n    hasExecutedStart: params.start !== undefined,\n    hasExecutedEnd: params.end !== undefined,\n    isCancelled,\n  };\n}\n\nexport function mergeOrders(...groups: Order[][]): Order[] {\n  const byOid = new Map<string, Order>();\n  for (const group of groups) {\n    for (const order of group) {\n      byOid.set(order.oid, order);\n    }\n  }\n  return [...byOid.values()].sort((a, b) => b.initiatedTime - a.initiatedTime);\n}\n\nexport function chunkArray<T>(items: T[], size: number): T[][] {\n  const chunks: T[][] = [];\n  for (let i = 0; i < items.length; i += size) {\n    chunks.push(items.slice(i, i + size));\n  }\n  return chunks;\n}\n","/** USDC — collateral, fees, notional (6 decimal places). */\nexport const USDC_DECIMALS = 6;\n\n/** Prices, OI token amounts, funding / rollover accumulators (18 decimal places). */\nexport const TOKEN_DECIMALS = 18;\n\n/** Leverage stored on-chain as leverage × 100 (2 decimal places). */\nexport const LEVERAGE_DECIMALS = 2;\n\nexport const PRECISION_6  = 1_000_000n;\nexport const PRECISION_18 = 1_000_000_000_000_000_000n;\n","import { formatUnits, parseUnits } from 'viem';\nimport { USDC_DECIMALS, TOKEN_DECIMALS, LEVERAGE_DECIMALS } from './precision.js';\nimport type { RawTrade } from './raw.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Formatters  (raw on-chain bigint string → human-readable number)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Format a USDC value (6 decimals) to a JS number.\n * Safe for undefined / null / pre-formatted floats.\n */\nexport function formatUsdc(value?: bigint | string | number | null): number {\n  if (value === undefined || value === null) return 0;\n  if (typeof value === 'number') return value;\n  if (typeof value === 'string' && value.includes('.')) return parseFloat(value);\n  return Number(formatUnits(BigInt(value), USDC_DECIMALS));\n}\n\n/**\n * Format a token value (18 decimals) to a JS number.\n * Used for prices, OI amounts, and funding / rollover accumulators.\n */\nexport function formatTokens(value?: bigint | string | number | null): number {\n  if (value === undefined || value === null) return 0;\n  if (typeof value === 'number') return value;\n  if (typeof value === 'string' && value.includes('.')) return parseFloat(value);\n  return Number(formatUnits(BigInt(value), TOKEN_DECIMALS));\n}\n\n/**\n * Format a leverage value (2 decimals) to a JS number.\n * e.g. \"1000\" → 10 (10×).\n */\nexport function formatLeverage(value?: bigint | string | number | null): number {\n  if (value === undefined || value === null) return 0;\n  if (typeof value === 'number') return value;\n  if (typeof value === 'string' && value.includes('.')) return parseFloat(value);\n  return Number(formatUnits(BigInt(value), LEVERAGE_DECIMALS));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Parsers  (human-readable number → raw on-chain bigint)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Parse a USDC amount to bigint with 6 decimals (e.g. \"100.50\" → 100_500_000n). */\nexport function parseUsdc(value: number | string): bigint {\n  return parseUnits(value.toString(), USDC_DECIMALS);\n}\n\n/** Parse a price / token amount to bigint with 18 decimals. */\nexport function parseTokens(value: number | string): bigint {\n  return parseUnits(value.toString(), TOKEN_DECIMALS);\n}\n\n/** Parse leverage to bigint with 2 decimals (e.g. 10 → 1000n). */\nexport function parseLeverage(value: number | string): bigint {\n  return parseUnits(value.toString(), LEVERAGE_DECIMALS);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Returns the effective max leverage string for a trade.\n * Prefers pair.maxLeverage → group.maxLeverage → \"1\".\n */\nexport function getMaxLeverage(trade: RawTrade): string {\n  return trade.pair.maxLeverage && trade.pair.maxLeverage !== '0'\n    ? trade.pair.maxLeverage\n    : trade.pair.group?.maxLeverage ?? '1';\n}\n\n/**\n * Seconds elapsed since the pair's last price / funding snapshot.\n * Used in dynamic spread calculations.\n */\nexport function timeElapsedSince(pair: { lastUpdateTimestamp?: string; lastFundingTime?: string }): string {\n  const now = Math.floor(Date.now() / 1000);\n  const last =\n    parseInt(pair.lastUpdateTimestamp ?? '0') ||\n    parseInt(pair.lastFundingTime ?? '0');\n  return (now - last).toString();\n}\n","// Internal PnL helpers — used by the subgraph client to enrich open trades.\n// Not exported from the SDK.\n\nimport {\n  GetCurrentRolloverFee,\n  GetTradeRolloverFee,\n  GetTradeLiquidationPrice,\n  GetEffectiveMaxLeverage,\n  CalculateDynamicPriceImpact,\n  CurrentTradeProfitRaw,\n  CurrentTotalProfitRaw,\n  CurrentTotalProfitP,\n} from '@ostium/formulae';\nimport {\n  formatUsdc,\n  formatTokens,\n  formatLeverage,\n  parseUsdc,\n  parseTokens,\n  parseLeverage,\n  getMaxLeverage,\n  timeElapsedSince,\n} from './decimal.js';\nimport type { RawPair, RawTrade } from './raw.js';\nimport type { PriceData } from '../types.js';\n\n/** Internal PnL snapshot returned by `getTradePnL`. */\nexport interface TradePnL {\n  /** Raw price PnL in USD before rollover. */\n  pnl: number;\n  /** PnL % after rollover, relative to collateral. */\n  pnlPercent: number;\n  /** Accrued rollover fee in USD. */\n  rollover: number;\n  /** Net PnL in USD after rollover. */\n  netPnl: number;\n  /** collateral + netPnl. */\n  netValue: number;\n  /** Estimated liquidation price. */\n  liquidationPrice: number;\n  /** Mid price after dynamic spread is applied. */\n  priceAfterImpact: number;\n}\n\nexport const EMPTY_PNL: TradePnL = {\n  pnl: 0,\n  pnlPercent: 0,\n  rollover: 0,\n  netPnl: 0,\n  netValue: 0,\n  liquidationPrice: 0,\n  priceAfterImpact: 0,\n};\n\nexport function getRolloverAccumulator(\n  pair: RawPair,\n  isBuy: boolean,\n  blockNumber: bigint | string,\n): string {\n  const accRollover = isBuy\n    ? (pair.accRolloverLong ?? '0')\n    : (pair.accRolloverShort ?? '0');\n\n  return GetCurrentRolloverFee(\n    accRollover,\n    pair.lastRolloverBlock     ?? '0',\n    pair.brokerPremium         ?? '0',\n    pair.lastRolloverLongPure  ?? '0',\n    isBuy,\n    pair.isNegativeRolloverAllowed ?? false,\n    blockNumber.toString(),\n  );\n}\n\nfunction getTradeRolloverFeeRaw(trade: RawTrade, currentRolloverAccumulator: string): bigint {\n  return BigInt(\n    GetTradeRolloverFee(\n      trade.rollover,\n      currentRolloverAccumulator,\n      trade.collateral,\n      trade.leverage,\n    ),\n  );\n}\n\nfunction getLiquidationPrice(trade: RawTrade, rolloverRaw: bigint): number {\n  if (!trade.leverage   || trade.leverage   === '0') return 0;\n  if (!trade.openPrice  || trade.openPrice  === '0') return 0;\n  if (!trade.collateral || trade.collateral === '0') return 0;\n\n  try {\n    const maxLeverage = GetEffectiveMaxLeverage(\n      getMaxLeverage(trade),\n      trade.pair.overnightMaxLeverage ?? '0',\n      trade.isDayTrade ?? false,\n    );\n\n    return formatTokens(\n      GetTradeLiquidationPrice(\n        trade.openPrice,\n        trade.isBuy,\n        trade.collateral,\n        trade.leverage,\n        rolloverRaw.toString(),\n        '0', // funding excluded\n        maxLeverage,\n      ),\n    );\n  } catch {\n    return 0;\n  }\n}\n\nfunction getPriceImpact(\n  marketPrice: PriceData,\n  isBuy: boolean,\n  isOpen: boolean,\n  pair: RawPair,\n  collateral: number,\n  leverage: number,\n): { priceImpactP: string; priceAfterImpact: string } {\n  if (!marketPrice.mid) return { priceImpactP: '0', priceAfterImpact: '0' };\n\n  return CalculateDynamicPriceImpact(\n    parseTokens(marketPrice.mid).toString(),\n    parseTokens(marketPrice.ask).toString(),\n    parseTokens(marketPrice.bid).toString(),\n    isOpen,\n    isBuy,\n    parseUsdc(collateral).toString(),\n    parseLeverage(leverage).toString(),\n    pair.buyVolume       ?? '0',\n    pair.sellVolume      ?? '0',\n    pair.decayRate       ?? '0',\n    timeElapsedSince(pair),\n    pair.netVolThreshold ?? '0',\n    pair.priceImpactK    ?? '0',\n  );\n}\n\n/**\n * Full PnL snapshot for an open trade at the current block.\n * Rollover is the only ongoing fee included (funding excluded by design).\n */\nexport function getTradePnL(\n  trade: RawTrade,\n  marketPrice: PriceData,\n  blockNumber: bigint,\n): TradePnL {\n  if (!trade?.pair || !marketPrice?.mid || !blockNumber) return EMPTY_PNL;\n\n  const rolloverAcc = getRolloverAccumulator(trade.pair, trade.isBuy, blockNumber);\n  const rolloverRaw = getTradeRolloverFeeRaw(trade, rolloverAcc);\n\n  const liquidationPrice = getLiquidationPrice(trade, rolloverRaw);\n\n  // Price impact (display only — PnL uses mid to avoid scary spread PnL).\n  const impactResult = getPriceImpact(\n    marketPrice,\n    trade.isBuy,\n    false,\n    trade.pair,\n    formatUsdc(trade.collateral),\n    formatLeverage(trade.leverage),\n  );\n\n  const priceForPnL = parseTokens(marketPrice.mid).toString();\n\n  const pnlRaw = BigInt(\n    CurrentTradeProfitRaw(\n      trade.openPrice,\n      priceForPnL,\n      trade.isBuy,\n      trade.leverage,\n      trade.highestLeverage,\n      trade.collateral,\n    ),\n  );\n\n  const totalProfitRaw = BigInt(\n    CurrentTotalProfitRaw(\n      trade.openPrice,\n      priceForPnL,\n      trade.isBuy,\n      trade.leverage,\n      trade.highestLeverage,\n      trade.collateral,\n      rolloverRaw.toString(),\n      '0', // funding excluded\n    ),\n  );\n\n  const pnlPercentRaw = BigInt(\n    CurrentTotalProfitP(totalProfitRaw.toString(), trade.collateral),\n  );\n\n  return {\n    pnl:              formatUsdc(pnlRaw),\n    pnlPercent:       formatUsdc(pnlPercentRaw),\n    rollover:         formatUsdc(rolloverRaw),\n    netPnl:           formatUsdc(totalProfitRaw),\n    netValue:         formatUsdc(totalProfitRaw) + formatUsdc(trade.collateral),\n    liquidationPrice,\n    priceAfterImpact: formatTokens(impactResult.priceAfterImpact),\n  };\n}\n","// Ghost pending market orders: the subgraph occasionally misses a market\n// order's terminal event, leaving it `isPending` forever while on-chain it was\n// executed or cancelled and fully unregistered. Cancelling such an order\n// reverts (`NoTradeToTimeoutFound`), so it must not be surfaced. The opposite\n// case — an order still registered on-chain past the timeout window — consumes\n// the trader's pending-order slots (`MaxPendingMarketOrdersReached`) and MUST\n// stay visible so the user cancels it via the market-timeout call.\n\nimport type { Address } from 'viem';\nimport type { RawOrder } from './raw.js';\n\n/**\n * Age past which a subgraph-pending market order cannot still be in flight:\n * on-chain `marketOrdersTimeout` is 50 blocks (~13s on Arbitrum). The margin\n * absorbs clock skew and subgraph indexing lag. Anything older is either\n * cancellable (still registered on-chain) or a ghost (unregistered).\n */\nexport const STALE_PENDING_MARKET_ORDER_AGE_S = 120;\n\n/**\n * Resolves whether a pending market order is still registered on-chain.\n * `true` = registered (cancellable), `false` = ghost, `undefined` = unknown\n * (RPC failure — callers fail open and keep the order visible).\n */\nexport type PendingOrderRegisteredReader = (orderId: string) => Promise<boolean | undefined>;\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\n/** `IOstiumTradingStorage.reqID_pendingMarketOrder` public-mapping getter. */\nconst REQ_ID_PENDING_MARKET_ORDER_ABI = [\n  {\n    type: 'function',\n    name: 'reqID_pendingMarketOrder',\n    stateMutability: 'view',\n    inputs: [{ name: '', type: 'uint256' }],\n    outputs: [\n      { name: 'block', type: 'uint256' },\n      { name: 'wantedPrice', type: 'uint192' },\n      { name: 'slippageP', type: 'uint32' },\n      {\n        name: 'trade',\n        type: 'tuple',\n        components: [\n          { name: 'collateral', type: 'uint256' },\n          { name: 'openPrice', type: 'uint192' },\n          { name: 'tp', type: 'uint192' },\n          { name: 'sl', type: 'uint192' },\n          { name: 'trader', type: 'address' },\n          { name: 'leverage', type: 'uint32' },\n          { name: 'pairIndex', type: 'uint16' },\n          { name: 'index', type: 'uint8' },\n          { name: 'buy', type: 'bool' },\n          { name: 'isDayTrade', type: 'bool' },\n        ],\n      },\n      { name: 'percentage', type: 'uint16' },\n    ],\n  },\n] as const;\n\ninterface ContractReader {\n  readContract(args: {\n    address: Address;\n    abi: typeof REQ_ID_PENDING_MARKET_ORDER_ABI;\n    functionName: 'reqID_pendingMarketOrder';\n    args: [bigint];\n  }): Promise<unknown>;\n}\n\n/**\n * Build a registered-reader backed by `reqID_pendingMarketOrder` on\n * TradingStorage. Ghost verdicts are memoized for the reader's lifetime — an\n * unregistered order can never come back.\n */\nexport function makePendingOrderRegisteredReader(\n  client: ContractReader,\n  tradingStorage: Address,\n): PendingOrderRegisteredReader {\n  const knownGhosts = new Set<string>();\n\n  return async orderId => {\n    if (knownGhosts.has(orderId)) return false;\n    try {\n      const result = (await client.readContract({\n        address: tradingStorage,\n        abi: REQ_ID_PENDING_MARKET_ORDER_ABI,\n        functionName: 'reqID_pendingMarketOrder',\n        args: [BigInt(orderId)],\n      })) as [bigint, bigint, number, { trader: Address }, number];\n\n      const registered = result[3].trader.toLowerCase() !== ZERO_ADDRESS;\n      if (!registered) knownGhosts.add(orderId);\n      return registered;\n    } catch {\n      return undefined;\n    }\n  };\n}\n\nfunction isStalePendingMarketOrder(order: RawOrder, nowS: number): boolean {\n  if (order.orderType !== 'Market') return false;\n  if (order.isPending === false || order.isCancelled === true) return false;\n  const initiatedAt = parseInt(order.initiatedAt || '0', 10);\n  if (!Number.isFinite(initiatedAt) || initiatedAt <= 0) return false;\n  return nowS - initiatedAt > STALE_PENDING_MARKET_ORDER_AGE_S;\n}\n\n/**\n * Drop pending market orders that no longer exist on-chain. Orders within the\n * in-flight window and non-market orders pass through without any RPC cost;\n * verification failures fail open (the order stays visible).\n */\nexport async function dropGhostPendingMarketOrders(\n  orders: RawOrder[],\n  readRegistered: PendingOrderRegisteredReader,\n): Promise<RawOrder[]> {\n  const nowS = Math.floor(Date.now() / 1000);\n  const stale = orders.filter(order => isStalePendingMarketOrder(order, nowS));\n  if (stale.length === 0) return orders;\n\n  const ghosts = new Set<string>();\n  await Promise.all(stale.map(async order => {\n    if ((await readRegistered(order.id)) === false) ghosts.add(order.id);\n  }));\n\n  if (ghosts.size === 0) return orders;\n  return orders.filter(order => !ghosts.has(order.id));\n}\n","/** Subgraph symbol → display name overrides. */\nconst PAIR_NAME_MAP: Record<string, string> = {\n  CL:   'WTI',\n  HG:   'XCU',\n  SPX:  'US500',\n  NDX:  'US100',\n  DJI:  'US30',\n  DAX:  'GER40',\n  FTSE: 'UK100',\n  HSI:  'HK50',\n  NIK:  'JP225',\n};\n\n/** Map a raw subgraph symbol to its canonical display name. */\nexport function normalizePairName(symbol: string): string {\n  return PAIR_NAME_MAP[symbol] ?? symbol;\n}\n","import WS from 'ws';\nimport { SDK_USER_AGENT } from '../../internal/version.js';\nimport { normalizePairName } from './pair-names.js';\nimport type { PairSchedule, PriceData, PriceTick, Candle, CandleResolution } from '../types.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// REST — all prices\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface PricesApiResponse {\n  prices: RawPriceTick[];\n  stale: boolean;\n  generatedAt: number;\n}\n\ninterface RawPriceTick {\n  feed_id: string;\n  pair: string;\n  from: string;\n  to: string;\n  bid: number;\n  mid: number;\n  ask: number;\n  isMarketOpen: boolean;\n  isDayTradingClosed: boolean;\n  secondsToToggleIsDayTradingClosed: number;\n  timestampSeconds: number;\n  schedule?: PairSchedule;\n}\n\n/**\n * Fetch the live price feed from `{builderApiUrl}/v1/prices`.\n * Returns a record keyed by raw `${from}/${to}` (e.g. `\"BTC/USD\"`, `\"CL/USD\"`).\n * Returns `{}` on 503 (upstream feed not connected).\n */\nexport async function fetchLivePrices(builderApiUrl: string): Promise<Record<string, PriceData>> {\n  const res = await fetch(`${builderApiUrl}/v1/prices`, {\n    headers: { 'User-Agent': SDK_USER_AGENT },\n  });\n\n  if (res.status === 503) return {};\n\n  if (!res.ok) {\n    throw new Error(`Live prices endpoint returned ${res.status} ${res.statusText}`);\n  }\n\n  const json = (await res.json()) as PricesApiResponse;\n  if (!Array.isArray(json.prices)) {\n    throw new Error('Live prices endpoint returned an unexpected payload');\n  }\n\n  // Keyed by raw subgraph name (no normalization) so internal pair lookups\n  // using rawPair.from / rawPair.to continue to work correctly.\n  const result: Record<string, PriceData> = {};\n  for (const item of json.prices) {\n    if (!item.from || !item.to) continue;\n    result[`${item.from}/${item.to}`] = {\n      mid: item.mid,\n      bid: item.bid,\n      ask: item.ask,\n      isMarketOpen:                      item.isMarketOpen                      ?? true,\n      isDayTradingClosed:                item.isDayTradingClosed                ?? false,\n      secondsToToggleIsDayTradingClosed: item.secondsToToggleIsDayTradingClosed ?? -1,\n      schedule:                          item.schedule,\n    };\n  }\n  return result;\n}\n\nfunction rawTickToPublic(item: RawPriceTick, pairId?: string): PriceTick {\n  const from = normalizePairName(item.from);\n  const to   = normalizePairName(item.to);\n  return {\n    pairId,\n    feedId:                            item.feed_id,\n    pair:                              `${from}-${to}`,\n    from,\n    to,\n    bid:                               item.bid,\n    mid:                               item.mid,\n    ask:                               item.ask,\n    isMarketOpen:                      item.isMarketOpen                      ?? true,\n    isDayTradingClosed:                item.isDayTradingClosed                ?? false,\n    secondsToToggleIsDayTradingClosed: item.secondsToToggleIsDayTradingClosed ?? -1,\n    timestampSeconds:                  item.timestampSeconds,\n    schedule:                          item.schedule,\n  };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// REST — OHLC candles\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface RawOhlcCandle {\n  from:  string;\n  to:    string;\n  time:  number;  // Unix milliseconds\n  open:  number;\n  high:  number;\n  low:   number;\n  close: number;\n}\n\ninterface OhlcApiResponse {\n  data:                 RawOhlcCandle[];\n  lastRequestTimestamp: number | null;\n}\n\nfunction rawCandleToPublic(c: RawOhlcCandle): Candle {\n  return {\n    pairFrom: normalizePairName(c.from),\n    pairTo:   normalizePairName(c.to),\n    time:     c.time,\n    open:     c.open,\n    high:     c.high,\n    low:      c.low,\n    close:    c.close,\n  };\n}\n\n/**\n * Fetch OHLC candles from `{builderApiUrl}/v1/ohlc`.\n *\n * @param rawPair  - Pair in raw subgraph `\"FROM-TO\"` format (e.g. `\"BTC-USD\"`, `\"CL-USD\"`).\n * @param fromMs   - Start time in Unix milliseconds.\n * @param toMs     - End time in Unix milliseconds.\n * @param resolution - Candle resolution string.\n * @param sets     - Number of candle pages to fetch. Defaults to one page.\n */\nexport async function fetchCandles(\n  builderApiUrl: string,\n  rawPair: string,\n  fromMs: number,\n  toMs: number,\n  resolution: CandleResolution,\n  sets = 1,\n): Promise<Candle[]> {\n  const candles: Candle[] = [];\n  const seenTimes = new Set<number>();\n  let cursorFromMs = fromMs;\n\n  for (let page = 0; page < sets; page++) {\n    const pageCandles = await fetchCandlePage(\n      builderApiUrl,\n      rawPair,\n      cursorFromMs,\n      toMs,\n      resolution,\n    );\n\n    if (pageCandles.length === 0) break;\n\n    for (const candle of pageCandles) {\n      if (seenTimes.has(candle.time)) continue;\n      seenTimes.add(candle.time);\n      candles.push(candle);\n    }\n\n    if (page === sets - 1) break;\n\n    const nextCursorFromMs = pageCandles[pageCandles.length - 1]?.time;\n    if (\n      nextCursorFromMs === undefined ||\n      !Number.isFinite(nextCursorFromMs) ||\n      nextCursorFromMs <= cursorFromMs ||\n      nextCursorFromMs >= toMs\n    ) {\n      break;\n    }\n    cursorFromMs = nextCursorFromMs;\n  }\n\n  return candles;\n}\n\nasync function fetchCandlePage(\n  builderApiUrl: string,\n  rawPair: string,\n  fromMs: number,\n  toMs: number,\n  resolution: CandleResolution,\n): Promise<Candle[]> {\n  const res = await fetch(`${builderApiUrl}/v1/ohlc`, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n      'User-Agent': SDK_USER_AGENT,\n    },\n    body: JSON.stringify({\n      pair:                 rawPair,\n      fromTimestampSeconds: Math.floor(fromMs / 1000),\n      toTimestampSeconds:   Math.floor(toMs   / 1000),\n      resolution,\n    }),\n  });\n\n  if (!res.ok) {\n    throw new Error(`OHLC endpoint returned ${res.status} ${res.statusText}`);\n  }\n\n  const json = (await res.json()) as OhlcApiResponse;\n  return json.data.map(rawCandleToPublic);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// WebSocket — live price stream\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype TickHandler     = (tick: PriceTick) => void;\ntype SnapshotHandler = (ticks: PriceTick[]) => void;\n\n/**\n * WebSocket client for the Ostium live price stream.\n *\n * ```ts\n * // Via OstiumClient / OstiumSubgraphClient (recommended — pairIds resolved automatically):\n * const stream = client.streamPrices([0, 1]);  // BTC and ETH by pairId\n *\n * stream.onSnapshot(ticks => console.log('snapshot:', ticks.length));\n * stream.onTick(tick => console.log(tick.pair, tick.mid));\n *\n * stream.subscribe([2]);      // add pair 2\n * stream.unsubscribe([0]);    // remove pair 0\n * stream.close();\n * ```\n *\n * The socket connects to `{builderApiUrl}/v1/prices/stream` — `https://` is\n * automatically rewritten to `wss://` (and `http://` to `ws://`). When\n * `streamPrices(pairIds)` is called with ids, the SDK sends\n * `{ type: \"subscribe\", pairs: [\"FROM-TO\", ...] }` on `open` (same wire format\n * as {@link OstiumPriceStream.subscribe}).\n *\n * `subscribe` / `unsubscribe` accept the same `pairId` values used everywhere\n * else in the SDK. `PriceTick.pair` / `.from` / `.to` use normalized display\n * names (e.g. `\"UK100\"` not `\"FTSE\"`).\n */\nexport class OstiumPriceStream {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private readonly ws: any; // ws.WebSocket — typed as any to stay compatible with both Node and Bun\n  private readonly tickHandlers:     Set<TickHandler>     = new Set();\n  private readonly snapshotHandlers: Set<SnapshotHandler> = new Set();\n  /** pairId (string) → raw \"FROM-TO\" name for the WS API. */\n  private readonly pairRawNameCache: Map<string, string>;\n  /** raw \"FROM-TO\" name → pairId (string) for mapping incoming ticks back to SDK ids. */\n  private readonly rawNamePairIdCache: Map<string, string>;\n\n  private constructor(\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    ws: any,\n    pairRawNameCache: Map<string, string>,\n    rawNamePairIdCache: Map<string, string>,\n    initialSubscribeRawPairs?: string[],\n  ) {\n    this.ws = ws;\n    this.pairRawNameCache = pairRawNameCache;\n    this.rawNamePairIdCache = rawNamePairIdCache;\n    if (initialSubscribeRawPairs?.length) {\n      ws.once('open', () => {\n        ws.send(JSON.stringify({ type: 'subscribe', pairs: initialSubscribeRawPairs }));\n      });\n    }\n    ws.on('message', (data: Buffer | string) => {\n      let msg: { type: string; data: unknown };\n      try {\n        msg = JSON.parse(typeof data === 'string' ? data : data.toString());\n      } catch {\n        return;\n      }\n      if (msg.type === 'snapshot' && Array.isArray(msg.data)) {\n        const ticks = (msg.data as RawPriceTick[]).map(item =>\n          rawTickToPublic(item, this.getPairIdForRawName(`${item.from}-${item.to}`)),\n        );\n        for (const h of this.snapshotHandlers) h(ticks);\n      } else if (msg.type === 'tick' && msg.data) {\n        const item = msg.data as RawPriceTick;\n        const tick = rawTickToPublic(item, this.getPairIdForRawName(`${item.from}-${item.to}`));\n        for (const h of this.tickHandlers) h(tick);\n      }\n    });\n  }\n\n  /**\n   * Open a WebSocket connection to the live price stream.\n   *\n   * Uses the `ws` package which correctly handles case-insensitive `Connection`\n   * header values (required for Cloudflare-proxied endpoints).\n   *\n   * @param builderApiUrl    - Base URL (e.g. `\"https://builder.prod.bedrock.ostium.io\"`). The `http`/`https`\n   *                           scheme is automatically converted to `ws`/`wss`.\n   * @param rawPairs         - Optional raw `\"FROM-TO\"` names (from\n   *                           `OstiumSubgraphClient.streamPrices` pairIds). Sent as\n   *                           `{ type: \"subscribe\", pairs }` after the socket opens.\n   * @param pairRawNameCache - pairId → raw name map; passed in by the subgraph client so\n   *                           `subscribe` / `unsubscribe` can accept pairIds.\n   */\n  static connect(\n    builderApiUrl: string,\n    rawPairs?: string[],\n    pairRawNameCache: Map<string, string> = new Map(),\n  ): OstiumPriceStream {\n    const base = builderApiUrl\n      .replace(/\\/$/, '')\n      .replace(/^https?:\\/\\//, match => match === 'https://' ? 'wss://' : 'ws://');\n    const url = `${base}/v1/prices/stream`;\n    const initial = rawPairs && rawPairs.length > 0 ? rawPairs : undefined;\n    const ws = new WS(url, {\n      headers: { 'User-Agent': SDK_USER_AGENT, 'Accept': '*/*' },\n    });\n    const rawNamePairIdCache = new Map<string, string>();\n    for (const [pairId, rawName] of pairRawNameCache.entries()) {\n      rawNamePairIdCache.set(rawName, pairId);\n    }\n    return new OstiumPriceStream(ws, pairRawNameCache, rawNamePairIdCache, initial);\n  }\n\n  /**\n   * Register a callback that fires on every incoming price tick.\n   * Returns an unsubscribe function.\n   */\n  onTick(handler: TickHandler): () => void {\n    this.tickHandlers.add(handler);\n    return () => { this.tickHandlers.delete(handler); };\n  }\n\n  /**\n   * Register a callback that fires once with the full snapshot sent on connect.\n   * Returns an unsubscribe function.\n   */\n  onSnapshot(handler: SnapshotHandler): () => void {\n    this.snapshotHandlers.add(handler);\n    return () => { this.snapshotHandlers.delete(handler); };\n  }\n\n  /** Register a one-time callback that fires when the connection is established. */\n  onOpen(handler: () => void): this {\n    this.ws.once('open', handler);\n    return this;\n  }\n\n  /** Register an error callback. */\n  onError(handler: (event: Error) => void): this {\n    this.ws.on('error', handler);\n    return this;\n  }\n\n  /** Register a callback that fires when the connection closes. */\n  onClose(handler: (code: number, reason: string) => void): this {\n    this.ws.on('close', handler);\n    return this;\n  }\n\n  /**\n   * Add pairs to the active filter. Accepts the same `pairId` values used\n   * throughout the SDK (numeric string or number).\n   * Sends `{ type: \"subscribe\", pairs: [...rawNames] }` to the server.\n   */\n  subscribe(pairIds: Array<string | number>): this {\n    this.send({ type: 'subscribe', pairs: this.resolveRawNames(pairIds) });\n    return this;\n  }\n\n  /**\n   * Remove pairs from the active filter. Accepts the same `pairId` values used\n   * throughout the SDK.\n   * Sends `{ type: \"unsubscribe\", pairs: [...rawNames] }` to the server.\n   */\n  unsubscribe(pairIds: Array<string | number>): this {\n    this.send({ type: 'unsubscribe', pairs: this.resolveRawNames(pairIds) });\n    return this;\n  }\n\n  /** Close the WebSocket connection. */\n  close(): void {\n    this.ws.close();\n  }\n\n  /** Underlying WebSocket ready state (`0=CONNECTING`, `1=OPEN`, `2=CLOSING`, `3=CLOSED`). */\n  get readyState(): number {\n    return this.ws.readyState as number;\n  }\n\n  private resolveRawNames(pairIds: Array<string | number>): string[] {\n    return pairIds.map(id => {\n      const cached = this.pairRawNameCache.get(String(id));\n      // Fallback: treat unrecognised strings as raw names (e.g. direct \"BTC-USD\")\n      return cached ?? String(id);\n    });\n  }\n\n  private getPairIdForRawName(rawName: string): string | undefined {\n    const cached = this.rawNamePairIdCache.get(rawName);\n    if (cached) return cached;\n\n    for (const [pairId, pairRawName] of this.pairRawNameCache.entries()) {\n      if (!this.rawNamePairIdCache.has(pairRawName)) {\n        this.rawNamePairIdCache.set(pairRawName, pairId);\n      }\n    }\n    return this.rawNamePairIdCache.get(rawName);\n  }\n\n  private send(msg: unknown): void {\n    if (this.ws.readyState === WS.OPEN) {\n      this.ws.send(JSON.stringify(msg));\n      return;\n    }\n    // A filter change issued before the socket finishes connecting would\n    // otherwise be dropped silently — which is exactly what the cold\n    // pair-cache path in streamPrices() does (it subscribes as soon as the\n    // pair list resolves, which can beat the WS handshake).\n    if (this.ws.readyState === WS.CONNECTING) {\n      this.ws.once('open', () => { this.ws.send(JSON.stringify(msg)); });\n    }\n  }\n}\n","import type { MarginSummary, PairPosition } from '../types.js';\n\nexport function aggregateMarginSummary(pairPositions: PairPosition[]): MarginSummary {\n  let accountValue = 0;\n  let totalCollateralUsed = 0;\n  let totalNtlPos = 0;\n  let totalRawPnlUsd = 0;\n  let totalCumRollover = 0;\n  let totalWithdrawable = 0;\n\n  for (const { position } of pairPositions) {\n    const collateral   = parseFloat(position.collateralUsed) || 0;\n    const ntl          = parseFloat(position.ntl) || 0;\n    const pnl          = parseFloat(position.unrealizedPnl) || 0;\n    const rollover     = parseFloat(position.cumRollover) || 0;\n    const withdrawable = parseFloat(position.maxWithdrawable) || 0;\n    accountValue        += collateral + pnl;\n    totalCollateralUsed += collateral;\n    totalNtlPos         += ntl;\n    totalRawPnlUsd      += pnl;\n    totalCumRollover    += rollover;\n    totalWithdrawable   += withdrawable;\n  }\n\n  return {\n    accountValue:        accountValue.toString(),\n    totalCollateralUsed: totalCollateralUsed.toString(),\n    totalNtlPos:         totalNtlPos.toString(),\n    totalRawPnlUsd:      totalRawPnlUsd.toString(),\n    totalCumRollover:    totalCumRollover.toString(),\n    totalWithdrawable:   totalWithdrawable.toString(),\n  };\n}\n","import { formatUsdc, formatTokens, formatLeverage } from './decimal.js';\nimport { normalizePairName } from './pair-names.js';\nimport type {\n  RawPair,\n  RawTrade,\n  RawOrder,\n  RawLimit,\n} from './raw.js';\nimport type {\n  Pair,\n  PairPosition,\n  Fill,\n  Order,\n  OpenOrder,\n  PriceData,\n} from '../types.js';\nimport type { TradePnL } from './calculations.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst MIN_NOTIONAL = '5.0';\nconst MIN_NOTIONAL_NUM = 5;\n/** Arbitrum L2 block production rate. */\nconst BLOCKS_PER_SECOND_ARBITRUM = 4;\n/** Default period for rollover rate display in `PairCtx`. */\nconst ROLLOVER_RATE_HOURS = 8;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction lowerHex(value: string | null | undefined): string | null {\n  if (!value) return null;\n  const lower = value.toLowerCase();\n  return lower.startsWith('0x') ? lower : `0x${lower}`;\n}\n\nexport function pairMaxLeverage(pair: RawPair): number {\n  const maxLevString =\n    (!pair.maxLeverage || pair.maxLeverage === '0')\n      ? (pair.group.maxLeverage ?? '0')\n      : pair.maxLeverage;\n  return formatLeverage(maxLevString);\n}\n\n/**\n * Max collateral that can be removed from a single position before crossing\n * its effective max leverage: `collateral × (1 − currentLeverage / maxLeverage)`.\n */\nexport function maxWithdrawForPosition(\n  collateral: number,\n  currentLeverage: number,\n  maxLeverage: number,\n): number {\n  if (collateral <= 0) return 0;\n  if (currentLeverage <= 0) return 0;\n  if (maxLeverage <= 0) return 0;\n  if (currentLeverage >= maxLeverage) return 0;\n\n  const max = collateral * (1 - currentLeverage / maxLeverage);\n  if (max < 0) return 0;\n  if (max > collateral) return collateral;\n  return max;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Pair\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Build a `Pair` from a raw subgraph pair, merging in live price/market context.\n * Falls back to `lastTradePrice` when no live price is given.\n */\nexport function formatPair(\n  raw: RawPair,\n  price?: PriceData,\n  builderFeeBps = 0,\n): Pair {\n  const lastPrice = formatTokens(raw.lastTradePrice);\n  const mid = price?.mid;\n  const refPrice = mid && mid > 0 ? mid : lastPrice;\n\n  const buyOI_usd = formatTokens(raw.longOI) * lastPrice;\n  const sellOI_usd = formatTokens(raw.shortOI) * lastPrice;\n  const maxOI_usd = formatUsdc(raw.maxOI);\n\n  const minSz = refPrice > 0 ? MIN_NOTIONAL_NUM / refPrice : 0;\n  const maxBSz = refPrice > 0 ? Math.max(0, (maxOI_usd - buyOI_usd) / refPrice) : 0;\n  const maxSSz = refPrice > 0 ? Math.max(0, (maxOI_usd - sellOI_usd) / refPrice) : 0;\n\n  const rolloverRate = getRolloverRateDisplay(raw);\n  const takerFeeBps = Number(raw.takerFeeP) / 1e4;\n\n  return {\n    pairId: String(raw.id),\n    pairTo: normalizePairName(raw.to),\n    pairFrom: normalizePairName(raw.from),\n    minSz: minSz.toString(),\n    maxBSz: maxBSz.toString(),\n    maxSSz: maxSSz.toString(),\n    minNtl: MIN_NOTIONAL,\n    maxLeverage: pairMaxLeverage(raw),\n    overnightMaxLeverage: raw.overnightMaxLeverage ? formatLeverage(raw.overnightMaxLeverage) : 0,\n    rolloverFeePerBlock: formatTokens(raw.lastRolloverLongPure ?? '0').toString(),\n    openInterest: (buyOI_usd + sellOI_usd).toString(),\n    buyOpenInterest: buyOI_usd.toString(),\n    sellOpenInterest: sellOI_usd.toString(),\n    maxOpenInterest: maxOI_usd.toString(),\n    category: raw.group.name,\n    rolloverRate,\n    midPx: price ? price.mid.toString() : '0',\n    askPx: price ? price.ask.toString() : '0',\n    bidPx: price ? price.bid.toString() : '0',\n    isMarketOpen: price?.isMarketOpen ?? true,\n    isDayTradingClosed: price?.isDayTradingClosed ?? false,\n    secondsToToggleIsDayTradingClosed: price?.secondsToToggleIsDayTradingClosed ?? -1,\n    schedule: price?.schedule,\n    openFee: takerFeeBps + builderFeeBps,\n    closeFee: 0,\n  };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Rollover rate (8hr percent, long & short)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * UI-display rollover rate using Ostium's contract sign convention:\n * positive contract fee = trader pays => display as negative.\n */\nfunction getRolloverRateDisplay(raw: RawPair): { long: string; short: string } {\n  const longPure = formatTokens(raw.lastRolloverLongPure ?? '0');\n  const premium = formatTokens(raw.brokerPremium ?? '0');\n\n  let contractLong = longPure + premium;\n  let contractShort = -longPure + premium;\n\n  if (!raw.isNegativeRolloverAllowed) {\n    contractLong = Math.max(contractLong, 0);\n    contractShort = Math.max(contractShort, 0);\n  }\n\n  const displayPerBlockLong = -contractLong;\n  const displayPerBlockShort = -contractShort;\n\n  const blocksInPeriod = ROLLOVER_RATE_HOURS * 60 * 60 * BLOCKS_PER_SECOND_ARBITRUM;\n  const periodMultiplier = blocksInPeriod * 100;\n\n  return {\n    long: (displayPerBlockLong * periodMultiplier).toString(),\n    short: (displayPerBlockShort * periodMultiplier).toString(),\n  };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Open positions\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function formatPosition(\n  raw: RawTrade,\n  price: PriceData | undefined,\n  pnl: TradePnL,\n  maxLeverage: number\n): PairPosition {\n  const collateral = formatUsdc(raw.collateral);\n  const tradeNotional = formatTokens(raw.tradeNotional);\n  const leverage = formatLeverage(raw.leverage);\n  const mid = price?.mid ?? formatTokens(raw.pair.lastTradePrice);\n  const ntl = tradeNotional * mid;\n  const roe = collateral > 0 ? pnl.netPnl / collateral : 0;\n\n  return {\n    position: {\n      pairTo: normalizePairName(raw.pair.to),\n      pairFrom: normalizePairName(raw.pair.from),\n      pairId: String(raw.pair.id),\n      pid: raw.tradeID,\n      trader: lowerHex(raw.trader) ?? '',\n      idx: parseInt(raw.index || '0') || 0,\n      side: raw.isBuy ? 'B' : 'S',\n      szi: tradeNotional.toString(),\n      entryPx: formatTokens(raw.openPrice).toString(),\n      leverage: leverage.toString(),\n      ntl: ntl.toString(),\n      unrealizedPnl: pnl.netPnl.toString(),\n      returnOnEquity: roe.toString(),\n      liquidationPx: pnl.liquidationPrice.toString(),\n      collateralUsed: collateral.toString(),\n      cumRollover: (pnl.rollover * -1).toString(),\n      ...(raw.takeProfitPrice && raw.takeProfitPrice !== '0' ? { tpPx: formatTokens(raw.takeProfitPrice).toString() } : {}),\n      ...(raw.stopLossPrice && raw.stopLossPrice !== '0' ? { slPx: formatTokens(raw.stopLossPrice).toString() } : {}),\n      openTimestamp: parseInt(raw.timestamp || '0') * 1000,\n      isDayTrade: raw.isDayTrade ?? false,\n      maxLeverage: maxLeverage.toString(),\n      maxWithdrawable: maxWithdrawForPosition(collateral, leverage, maxLeverage).toString(),\n    },\n  };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Fills\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Order ids are the Trading contract's uint256 counter. The subgraph and the\n * fast overlay both carry it as a base-10 string today; canonicalize so `oid`\n * stays one comparable id space even if a data source hex-encodes it.\n */\nfunction normalizeOrderId(id: string): string {\n  try {\n    return BigInt(id).toString();\n  } catch {\n    return id;\n  }\n}\n\nexport function formatFill(raw: RawOrder): Fill {\n  const collateral = formatUsdc(raw.collateral);\n  const notional = formatUsdc(raw.notional);\n  const tradeNotional = formatTokens(raw.tradeNotional);\n  const priceImpactP = formatTokens(raw.priceImpactP);\n  const devFee = formatUsdc(raw.devFee);\n  const vaultFee = formatUsdc(raw.vaultFee);\n  const oracleFee = formatUsdc(raw.oracleFee);\n  const rolloverFee = formatUsdc(raw.rolloverFee);\n  const liquidation = formatUsdc(raw.liquidationFee);\n  const builderFee = formatUsdc(raw.builderFee);\n  const totalProfitPercent = formatUsdc(raw.totalProfitPercent);\n\n  // Pass the subgraph's orderAction / orderType through verbatim so non-trade\n  // actions like `RemoveCollateral` / `TopUpCollateral` aren't misreported as `Open`.\n  const action = raw.orderAction;\n  const type = raw.orderType;\n\n  const isClose = action === 'Close' || action === 'StopLoss' || action === 'TakeProfit' || action === 'CloseDayTrade';\n\n  const opening = action === 'Open' ? (devFee + vaultFee).toString() : '0';\n  const rollover = isClose ? rolloverFee.toString() : '0';\n  const liquidationFee = action === 'Liquidation' ? liquidation.toString() : '0';\n  const closedPnl = isClose || action === 'Liquidation'\n    ? (collateral * totalProfitPercent / 100 - devFee - vaultFee - oracleFee).toString()\n    : '0';\n  const px = formatTokens(raw.priceAfterImpact)\n  const szi = tradeNotional\n  const pxBeforeImpact = raw.isBuy\n    ? px / (1 + priceImpactP / 100)\n    : px / (1 - priceImpactP / 100);\n  const priceImpactFee = Math.abs((px - pxBeforeImpact) * szi);\n  const executedAtSec = parseInt(raw.executedAt || '0', 10);\n\n  return {\n    pairTo: normalizePairName(raw.pair.to),\n    pairFrom: normalizePairName(raw.pair.from),\n    pairId: String(raw.pair.id),\n    oid: normalizeOrderId(raw.id),\n    pid: raw.tradeID,\n    trader: lowerHex(raw.trader) ?? '',\n    side: raw.isBuy ? 'B' : 'S',\n    action,\n    type,\n    px: px.toString(),\n    szi: szi.toString(),\n    ntl: notional.toString(),\n    collateralUsed: collateral.toString(),\n    builder: lowerHex(raw.builder) ?? '',\n    fees: {\n      opening,\n      rollover,\n      liquidation: liquidationFee,\n      builder: builderFee.toString(),\n      priceImpact: priceImpactFee.toString(),\n    },\n    closedPnl,\n    hash: lowerHex(raw.executedTx) ?? '',\n    time: executedAtSec,\n    timestamp: executedAtSec,\n  };\n}\n\nexport function formatOrder(raw: RawOrder): Order {\n  return {\n    ...formatFill(raw),\n    initiatedTx: lowerHex(raw.initiatedTx) ?? '',\n    initiatedTime: parseInt(raw.initiatedAt || '0') * 1000,\n    isPending: raw.isPending,\n    isCancelled: raw.isCancelled,\n    ...(raw.initiatedBlock ? { initiatedBlock: raw.initiatedBlock } : {}),\n    ...(raw.cancelReason ? { cancelReason: raw.cancelReason } : {}),\n  };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Open limit orders\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function formatOpenOrder(raw: RawLimit): OpenOrder {\n  const tp = raw.takeProfitPrice && raw.takeProfitPrice !== '0' ? formatTokens(raw.takeProfitPrice) : null;\n  const sl = raw.stopLossPrice && raw.stopLossPrice !== '0' ? formatTokens(raw.stopLossPrice) : null;\n\n  const orderType = raw.limitType === 'STOP' ? 'Stop' : 'Limit';\n  const collateral = formatUsdc(raw.collateral);\n  const leverage = formatLeverage(raw.leverage);\n  const rawNotional = formatUsdc(raw.notional);\n  const notional = rawNotional > 0 ? rawNotional : collateral * leverage;\n  const limitPx = formatTokens(raw.openPrice);\n  const tradeNotional = formatTokens(raw.tradeNotional);\n\n  // check if pair.from is USD\n  const isUsd = raw.pair.from === \"USD\";\n  let size = 0.0;\n  if (isUsd) {\n    size = tradeNotional > 0\n      ? tradeNotional\n      : (limitPx > 0 ? notional * limitPx : 0);\n  } else {\n    size = tradeNotional > 0\n      ? tradeNotional\n      : (limitPx > 0 ? notional / limitPx : 0);\n  }\n\n  return {\n    pairTo: normalizePairName(raw.pair.to),\n    pairFrom: normalizePairName(raw.pair.from),\n    pairId: String(raw.pair.id),\n    trader: lowerHex(raw.trader) ?? '',\n    // On-chain limit slot index — the trailing segment of the subgraph id\n    // (`<trader>_<pairIndex>_<index>`). `orderId` is the global order counter,\n    // which overflows the contract's uint8 `index` arg for cancel/modify.\n    idx: parseInt(raw.id.split('_').pop() || '0', 10) || 0,\n    side: raw.isBuy ? 'B' : 'S',\n    limitPx: limitPx.toString(),\n    szi: size.toString(),\n    ntl: notional.toString(),\n    collateralUsed: collateral.toString(),\n    leverage: leverage.toString(),\n    ...(tp !== null ? { tpPx: tp.toString() } : {}),\n    ...(sl !== null ? { slPx: sl.toString() } : {}),\n    orderType,\n    timestamp: parseInt(raw.initiatedAt || '0') * 1000,\n  };\n}\n","import type {\n  OpenPositionsResponse,\n  Position,\n  PriceTick,\n} from '../types.js';\nimport { OstiumPriceStream } from './pricing.js';\nimport { aggregateMarginSummary } from './aggregations.js';\nimport { maxWithdrawForPosition } from './formatters.js';\n\ntype UpdateHandler = (positions: OpenPositionsResponse) => void;\ntype TickSource = Pick<OstiumPriceStream, 'onTick' | 'onSnapshot' | 'onOpen' | 'onError' | 'onClose' | 'close'>;\n\nfunction cloneResponse(response: OpenPositionsResponse): OpenPositionsResponse {\n  return {\n    pairPositions: response.pairPositions.map(pairPos => ({\n      position: { ...pairPos.position },\n    })),\n    marginSummary: { ...response.marginSummary },\n    time: response.time,\n  };\n}\n\nfunction applyTickToPosition(position: Position, tick: PriceTick): Position {\n  const size       = parseFloat(position.szi) || 0;\n  const entry      = parseFloat(position.entryPx) || 0;\n  const collateral = parseFloat(position.collateralUsed) || 0;\n  const maxLeverage = parseFloat(position.maxLeverage) || 0;\n  // cumRollover is stored negated (cost convention): add it back to get raw fee impact on PnL.\n  const rollover   = parseFloat(position.cumRollover) || 0;\n  const isLong     = position.side === 'B';\n\n  const ntl           = size * tick.mid;\n  const rawPnl        = isLong ? (tick.mid - entry) * size : (entry - tick.mid) * size;\n  const netPnl        = rawPnl + rollover;\n  const roe           = collateral > 0 ? netPnl / collateral : 0;\n  const currentLeverage = collateral > 0 ? ntl / collateral : 0;\n  // liquidationPx is rollover-dependent, not price-dependent — remains valid until the next getOpenPositions() call.\n  const maxWithdrawable = maxWithdrawForPosition(collateral, currentLeverage, maxLeverage);\n\n  return {\n    ...position,\n    ntl:             ntl.toString(),\n    unrealizedPnl:   netPnl.toString(),\n    returnOnEquity:  roe.toString(),\n    maxWithdrawable: maxWithdrawable.toString(),\n  };\n}\n\nfunction updateResponseWithTick(\n  current: OpenPositionsResponse,\n  tick: PriceTick,\n  timestampMs: number,\n): OpenPositionsResponse {\n  if (!tick.pairId) return current;\n\n  let changed = false;\n  const pairPositions = current.pairPositions.map(pairPos => {\n    if (String(pairPos.position.pairId) !== String(tick.pairId)) {\n      return pairPos;\n    }\n    changed = true;\n    return {\n      ...pairPos,\n      position: applyTickToPosition(pairPos.position, tick),\n    };\n  });\n\n  if (!changed) return current;\n\n  return {\n    pairPositions,\n    marginSummary: aggregateMarginSummary(pairPositions),\n    time: timestampMs,\n  };\n}\n\nexport class OstiumPositionUpdatesStream {\n  private readonly priceStream?: TickSource;\n  private readonly updateHandlers: Set<UpdateHandler> = new Set();\n  private current: OpenPositionsResponse;\n  private readonly trackedPairIds: Set<string>;\n\n  constructor(\n    initial: OpenPositionsResponse,\n    trackedPairIds: string[],\n    priceStream?: TickSource,\n  ) {\n    this.current = cloneResponse(initial);\n    this.priceStream = priceStream;\n    this.trackedPairIds = new Set(trackedPairIds);\n\n    if (!priceStream) return;\n\n    priceStream.onSnapshot(ticks => {\n      this.ingestSnapshot(ticks);\n    });\n\n    priceStream.onTick(tick => {\n      this.ingestTick(tick);\n    });\n  }\n\n  onUpdate(handler: UpdateHandler): () => void {\n    this.updateHandlers.add(handler);\n    return () => { this.updateHandlers.delete(handler); };\n  }\n\n  onOpen(handler: () => void): this {\n    this.priceStream?.onOpen(handler);\n    return this;\n  }\n\n  onError(handler: (event: Error) => void): this {\n    this.priceStream?.onError(handler);\n    return this;\n  }\n\n  onClose(handler: (code: number, reason: string) => void): this {\n    this.priceStream?.onClose(handler);\n    return this;\n  }\n\n  getCurrent(): OpenPositionsResponse {\n    return cloneResponse(this.current);\n  }\n\n  /**\n   * Apply a single externally sourced price tick to the tracked positions.\n   *\n   * Use this when your app already has its own websocket connection and you want\n   * the SDK to handle only the position recalculation logic.\n   */\n  ingestTick(tick: PriceTick): void {\n    if (!tick.pairId || !this.trackedPairIds.has(String(tick.pairId))) return;\n    const next = updateResponseWithTick(this.current, tick, tick.timestampSeconds * 1000);\n    if (next !== this.current) {\n      this.current = next;\n      this.emit(next);\n    }\n  }\n\n  /**\n   * Apply a batch of externally sourced ticks, such as a websocket snapshot.\n   */\n  ingestSnapshot(ticks: PriceTick[]): void {\n    let next = this.current;\n    for (const tick of ticks) {\n      if (!tick.pairId || !this.trackedPairIds.has(String(tick.pairId))) continue;\n      next = updateResponseWithTick(next, tick, tick.timestampSeconds * 1000);\n    }\n    if (next !== this.current) {\n      this.current = next;\n      this.emit(next);\n    }\n  }\n\n  close(): void {\n    this.priceStream?.close();\n  }\n\n  private emit(positions: OpenPositionsResponse): void {\n    for (const handler of this.updateHandlers) handler(cloneResponse(positions));\n  }\n}\n","import {\n  createPublicClient,\n  decodeFunctionData,\n  http,\n  keccak256,\n  parseAbiItem,\n  toBytes,\n  webSocket,\n  type Address,\n  type Hex,\n} from 'viem';\nimport { arbitrum, arbitrumSepolia } from 'viem/chains';\nimport { TRADING_ABI } from '../../internal/contract.js';\nimport { getNetworkConfig } from '../../internal/contracts.js';\nimport { retryAfterMsFromError } from '../../internal/http.js';\nimport { buildTrade } from '../../internal/open-builder.js';\nimport { PRECISION_6, PRECISION_18 } from '../../internal/precision.js';\nimport { OrderType as TradeOrderType, type OpenTradeParams, type SubmissionResult } from '../../types.js';\nimport { OstiumSubgraphError, OstiumSubgraphErrorCode } from '../errors.js';\nimport { EMPTY_PNL, getRolloverAccumulator, getTradePnL } from './calculations.js';\nimport {\n  dropGhostPendingMarketOrders,\n  makePendingOrderRegisteredReader,\n  type PendingOrderRegisteredReader,\n} from './pending-orders.js';\nimport { formatLeverage, formatTokens, formatUsdc } from './decimal.js';\nimport {\n  formatOpenOrder,\n  formatOrder,\n  formatPosition,\n  pairMaxLeverage,\n} from './formatters.js';\nimport type { OstiumPriceStream } from './pricing.js';\nimport { normalizePairName } from './pair-names.js';\nimport type { RawLimit, RawOrder, RawPair, RawTrade } from './raw.js';\nimport type {\n  AccountUpdatesSnapshot,\n  AccountUpdatesForTrader,\n  CloseExecution,\n  OpenOrder,\n  Order,\n  OrderAction,\n  PairPosition,\n  PriceData,\n  PriceTick,\n} from '../types.js';\n\n/**\n * Default subgraph reconciliation cadence. Sub-second confirmations come from\n * the Alchemy event watchers (which also trigger an immediate poll), so the\n * timer poll only needs to catch changes with no watcher — limit fills,\n * partial closes, TP/SL edits, liquidations. Pass `pollIntervalMs` to override.\n */\nexport const DEFAULT_POLL_INTERVAL_MS = 3000;\nconst OVERLAY_TTL_MS = 10 * 60 * 1000;\n\nconst MARKET_OPEN_ORDER_INITIATED = parseAbiItem(\n  'event MarketOpenOrderInitiated(uint256 indexed orderId, address indexed trader, uint16 indexed pairIndex)',\n);\n\nconst MARKET_OPEN_EXECUTED = parseAbiItem(\n  'event MarketOpenExecuted(uint256 indexed orderId, (uint256 collateral, uint192 openPrice, uint192 tp, uint192 sl, address trader, uint32 leverage, uint16 pairIndex, uint8 index, bool buy, bool isDayTrade) t, uint256 priceImpactP, uint256 tradeNotional)',\n);\n\nconst MARKET_CLOSE_EXECUTED_V2 = parseAbiItem(\n  'event MarketCloseExecutedV2(uint256 indexed orderId, uint256 indexed tradeId, uint256 price, uint256 priceImpactP, int256 percentProfit, uint256 usdcSentToTrader, uint256 percentageClosed)',\n);\n\nconst MARKET_OPEN_ORDER_INITIATED_TOPIC = keccak256(\n  toBytes('MarketOpenOrderInitiated(uint256,address,uint16)'),\n);\nconst MARKET_CLOSE_ORDER_INITIATED_TOPIC = keccak256(\n  toBytes('MarketCloseOrderInitiated(uint256,uint256,address,uint16)'),\n);\nconst MARKET_CLOSE_ORDER_INITIATED_V2_TOPIC = keccak256(\n  toBytes('MarketCloseOrderInitiatedV2(uint256,uint256,address,uint16,uint16)'),\n);\nconst PRICE_REQUESTED_TOPIC = keccak256(\n  toBytes('PriceRequested(uint256,bytes32,uint256)'),\n);\n\n/**\n * Receipt log topics whose `topic1` is the keeper order id. All are emitted by\n * the Trading contract: the `Market*Initiated` events by current deployments,\n * `PriceRequested` by pre-V2 ones (kept for old receipts, and the only topic\n * here with no indexed trader — see `logMatchesTrader`).\n */\nconst ORDER_ID_TOPICS = new Set<string>([\n  MARKET_OPEN_ORDER_INITIATED_TOPIC,\n  MARKET_CLOSE_ORDER_INITIATED_TOPIC,\n  MARKET_CLOSE_ORDER_INITIATED_V2_TOPIC,\n  PRICE_REQUESTED_TOPIC,\n]);\nconst OPEN_ORDER_ID_TOPICS = new Set<string>([\n  MARKET_OPEN_ORDER_INITIATED_TOPIC,\n]);\nconst CLOSE_ORDER_ID_TOPICS = new Set<string>([\n  MARKET_CLOSE_ORDER_INITIATED_TOPIC,\n  MARKET_CLOSE_ORDER_INITIATED_V2_TOPIC,\n]);\nconst ORDER_ID_TRADER_TOPIC_INDEX = new Map<string, number>([\n  [MARKET_OPEN_ORDER_INITIATED_TOPIC, 2],\n  [MARKET_CLOSE_ORDER_INITIATED_TOPIC, 3],\n  [MARKET_CLOSE_ORDER_INITIATED_V2_TOPIC, 3],\n]);\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nexport interface RawAccountUpdatesSnapshot {\n  orders: RawOrder[];\n  limits: RawLimit[];\n  trades: RawTrade[];\n  /**\n   * Recently executed close/liquidation orders. Used to tombstone fast overlay\n   * entries whose on-chain close event was missed (e.g. during a WebSocket\n   * reconnect) so a closed trade can never linger as a ghost position.\n   */\n  closedOrders?: RawOrder[];\n}\n\nexport interface ReceiptLogLike {\n  topics?: readonly unknown[];\n}\n\nexport interface TransactionReceiptLike {\n  logs?: readonly ReceiptLogLike[];\n  receipt?: {\n    logs?: readonly ReceiptLogLike[];\n  };\n}\n\nexport type ReceiptOrderAction = 'any' | 'open' | 'close';\n\ninterface Keyed<T> {\n  keys: string[];\n  value: T;\n}\n\ninterface KeyedAccountUpdatesSnapshot {\n  orders: Array<Keyed<Order>>;\n  limits: Array<Keyed<OpenOrder>>;\n  trades: AccountTradeItem[];\n  closeExecutions: Array<Keyed<CloseExecution>>;\n}\n\ninterface FastOrderItem extends Keyed<Order> {\n  createdAt: number;\n}\n\ninterface AccountTradeItem extends Keyed<PairPosition> {\n  raw: RawTrade;\n  confirmation?: AccountTradeConfirmation;\n}\n\ninterface AccountTradeConfirmation {\n  localId?: string;\n  status: 'optimistic' | 'initiated' | 'executed' | 'indexed';\n  orderId?: string;\n  initiatedTx?: string;\n  initiatedBlock?: string;\n  createdAt?: number;\n}\n\ninterface FastCloseExecutionItem extends Keyed<CloseExecution> {\n  createdAt: number;\n}\n\ninterface OstiumAccountUpdatesStreamOptions {\n  /** One or more trader addresses to stream on this connection. Must be non-empty. */\n  users: Address[];\n  testnet: boolean;\n  alchemyApiKey: string;\n  pollIntervalMs?: number;\n  fetchRawSnapshot: () => Promise<RawAccountUpdatesSnapshot>;\n  fetchRawPairs: () => Promise<RawPair[]>;\n  fetchLivePrices: () => Promise<Record<string, PriceData>>;\n  openPriceStream: () => PriceStreamSource;\n  getRawPairName: (pairId: string) => string | undefined;\n  getRawPair: (pairId: string) => RawPair | undefined;\n  initialRawPairs?: RawPair[];\n  /**\n   * Override for the on-chain pending-order lookup used to drop ghost pending\n   * market orders. Defaults to `reqID_pendingMarketOrder` on TradingStorage.\n   */\n  isPendingMarketOrderRegistered?: PendingOrderRegisteredReader;\n}\n\ntype UpdateHandler = (snapshot: AccountUpdatesSnapshot) => void;\ntype ErrorHandler = (error: Error) => void;\ntype PriceStreamSource = Pick<OstiumPriceStream, 'onTick' | 'onSnapshot' | 'onError' | 'close'>;\n\ninterface MarketOpenExecutedTrade {\n  collateral: bigint;\n  openPrice: bigint;\n  tp: bigint;\n  sl: bigint;\n  trader: Address;\n  leverage: bigint | number;\n  pairIndex: bigint | number;\n  index: bigint | number;\n  buy: boolean;\n  isDayTrade: boolean;\n}\n\ninterface MarketOpenExecutedLog {\n  args: {\n    orderId?: bigint;\n    t?: MarketOpenExecutedTrade;\n    tradeNotional: bigint;\n  };\n  blockNumber?: bigint;\n}\n\ninterface MarketOpenInitiatedLog {\n  args: {\n    orderId?: bigint;\n    trader?: Address;\n    pairIndex?: bigint | number;\n  };\n  transactionHash?: Hex;\n  blockNumber?: bigint;\n}\n\ninterface MarketCloseExecutedLog {\n  args: {\n    orderId?: bigint;\n    tradeId?: bigint;\n    price?: bigint;\n    percentProfit?: bigint;\n    usdcSentToTrader?: bigint;\n    percentageClosed?: bigint;\n  };\n  blockNumber?: bigint;\n}\n\ninterface InitiatedMetadata {\n  orderId: string;\n  pairId?: string;\n  trader?: Address;\n  initiatedTx?: string;\n  initiatedBlock?: string;\n}\n\nfunction alchemyWsUrl(testnet: boolean, apiKey: string): string {\n  const network = testnet ? 'arb-sepolia' : 'arb-mainnet';\n  return `wss://${network}.g.alchemy.com/v2/${apiKey}`;\n}\n\nfunction alchemyHttpUrl(testnet: boolean, apiKey: string): string {\n  const network = testnet ? 'arb-sepolia' : 'arb-mainnet';\n  return `https://${network}.g.alchemy.com/v2/${apiKey}`;\n}\n\nfunction createAlchemyLogClient(testnet: boolean, apiKey: string) {\n  const chain = testnet ? arbitrumSepolia : arbitrum;\n  return createPublicClient({\n    chain,\n    pollingInterval: 250,\n    transport: webSocket(alchemyWsUrl(testnet, apiKey), {\n      // viem defaults reconnect attempts to 5, after which the socket dies\n      // permanently and the stream goes silently stale. This stream is\n      // long-lived by design — keep retrying forever; missed events during\n      // gaps are replayed by sweepMissedEvents over HTTP.\n      reconnect: { delay: 2000, attempts: Number.MAX_SAFE_INTEGER },\n    }),\n  });\n}\n\nfunction createAlchemyBlockClient(testnet: boolean, apiKey: string) {\n  const chain = testnet ? arbitrumSepolia : arbitrum;\n  return createPublicClient({\n    chain,\n    // The block number only feeds rollover projection in PnL, which drifts\n    // negligibly over seconds — serve the per-poll getBlockNumber from viem's\n    // cache instead of hitting Alchemy on every tick.\n    cacheTime: 30_000,\n    transport: http(alchemyHttpUrl(testnet, apiKey)),\n  });\n}\n\ntype AlchemyLogClient = ReturnType<typeof createAlchemyLogClient>;\ntype AlchemyBlockClient = ReturnType<typeof createAlchemyBlockClient>;\n\nfunction currentUnixSeconds(): string {\n  return Math.floor(Date.now() / 1000).toString();\n}\n\nfunction topicToOrderId(topic: unknown): string | undefined {\n  if (topic === undefined || topic === null) return undefined;\n  if (typeof topic === 'bigint') return topic.toString();\n  if (typeof topic === 'number' && Number.isFinite(topic)) return Math.trunc(topic).toString();\n  if (typeof topic !== 'string' || topic.length === 0) return undefined;\n\n  try {\n    return BigInt(topic).toString();\n  } catch {\n    return topic;\n  }\n}\n\nfunction normalizeAddress(value: unknown): string | undefined {\n  if (typeof value !== 'string') return undefined;\n  const lower = value.toLowerCase();\n  if (!/^0x[0-9a-f]{40}$/.test(lower)) return undefined;\n  return lower;\n}\n\nfunction addressFromTopic(topic: unknown): string | undefined {\n  if (typeof topic !== 'string') return undefined;\n  const lower = topic.toLowerCase();\n  if (/^0x[0-9a-f]{40}$/.test(lower)) return lower;\n  if (!/^0x[0-9a-f]{64}$/.test(lower)) return undefined;\n  return `0x${lower.slice(-40)}`;\n}\n\nfunction logMatchesTrader(topics: readonly unknown[], topic0: string, trader: string | undefined): boolean {\n  if (!trader) return true;\n  const traderTopicIndex = ORDER_ID_TRADER_TOPIC_INDEX.get(topic0);\n  // Fails closed by design. Both PriceRequested variants carry no address at\n  // all, so a log using one cannot be attributed to a trader. Passing it through\n  // would let a bundled 4337 handleOps receipt return another trader's order id\n  // — the exact misattribution the trader filter exists to prevent, and worse\n  // than undefined: a wrong id is promoted onto the caller's optimistic overlay,\n  // never matches the executed open, and lingers until the overlay TTL. Callers\n  // parsing pre-V2 receipts should omit the trader argument instead.\n  if (traderTopicIndex === undefined) return false;\n  return addressFromTopic(topics[traderTopicIndex]) === trader;\n}\n\n/**\n * Extract the keeper order id from a transaction receipt, reading the first\n * matching initiated-event log.\n *\n * @param receipt - A viem receipt, or any object with `logs` / `receipt.logs`.\n * @param trader - Restrict matching to logs whose indexed trader topic equals\n *   this address. Supply it whenever the receipt may bundle more than one\n *   trader's operations (an ERC-4337 `handleOps` receipt), otherwise the\n *   first-match scan can return someone else's order id.\n *\n *   **Only logs that carry an indexed trader topic can match.** The current\n *   contracts' `MarketOpenOrderInitiated`, `MarketCloseOrderInitiated`, and\n *   `MarketCloseOrderInitiatedV2` all qualify. The pre-V2 `PriceRequested`\n *   carries no address, so it is skipped rather than assumed to match — parsing\n *   an old `PriceRequested`-only receipt requires omitting this argument.\n * @param action - Scope the match to an open or a close order id, for receipts\n *   that bundle both (e.g. a close and an open in one `handleOps`), where the\n *   default first-match scan would return whichever the bundler ordered first.\n *   Defaults to `'any'`, which preserves that first-match behavior.\n *\n *   Scoping keys off `topic0` alone. `PriceRequested` carries no action, so it\n *   matches only under `'any'`.\n * @returns The order id as a base-10 string, or `undefined` when no log\n *   satisfies every supplied constraint.\n */\nexport function extractOrderIdFromReceipt(\n  receipt: TransactionReceiptLike | null | undefined,\n  trader?: Address | string,\n  action: ReceiptOrderAction = 'any',\n): string | undefined {\n  const logs = receipt?.logs ?? receipt?.receipt?.logs ?? [];\n  const normalizedTrader = normalizeAddress(trader);\n  if (trader !== undefined && !normalizedTrader) return undefined;\n  // Action scoping only targets the split open/close events where topic0 alone\n  // is unambiguous. Consolidated/legacy topics remain available via \"any\".\n  const scopedTopics =\n    action === 'open'\n      ? OPEN_ORDER_ID_TOPICS\n      : action === 'close'\n        ? CLOSE_ORDER_ID_TOPICS\n        : ORDER_ID_TOPICS;\n  for (const log of logs) {\n    const [topic0, topic1] = log.topics ?? [];\n    if (typeof topic0 !== 'string') continue;\n    const normalizedTopic0 = topic0.toLowerCase();\n    if (!scopedTopics.has(normalizedTopic0)) continue;\n    if (!logMatchesTrader(log.topics ?? [], normalizedTopic0, normalizedTrader)) continue;\n    const orderId = topicToOrderId(topic1);\n    if (orderId === undefined) continue;\n    return orderId;\n  }\n  return undefined;\n}\n\n/**\n * Pair rollover accumulator at the trade's open block. `RawTrade.rollover`\n * holds the at-open accumulator snapshot (subgraph convention), so PnL charges\n * only rollover accrued after open — a `'0'` baseline would charge the pair's\n * whole rollover history against a brand-new position.\n */\nfunction rolloverBaselineAtOpen(\n  pair: RawPair,\n  isBuy: boolean,\n  blockNumber: bigint | undefined,\n): string {\n  if (blockNumber === undefined) return '0';\n  try {\n    return getRolloverAccumulator(pair, isBuy, blockNumber);\n  } catch {\n    return '0';\n  }\n}\n\nfunction rawPairNameToPriceKey(rawName: string): string | undefined {\n  const [from, to] = rawName.split('-');\n  if (!from || !to) return undefined;\n  return `${from}/${to}`;\n}\n\nfunction rawPairNameToParts(rawName?: string): { from: string; to: string } | undefined {\n  if (!rawName) return undefined;\n  const [from, to] = rawName.split('-');\n  if (!from || !to) return undefined;\n  return { from, to };\n}\n\nfunction optimisticRawPair(pairId: string, openPrice: string, rawName?: string): RawPair {\n  const parts = rawPairNameToParts(rawName);\n  return {\n    id: pairId,\n    from: parts?.from ?? `PAIR-${pairId}`,\n    to: parts?.to ?? 'USD',\n    maxLeverage: '0',\n    overnightMaxLeverage: '0',\n    takerFeeP: '0',\n    maxOI: '0',\n    longOI: '0',\n    shortOI: '0',\n    group: {\n      id: '0',\n      name: '',\n      maxLeverage: '0',\n    },\n    lastUpdateTimestamp: currentUnixSeconds(),\n    lastTradePrice: openPrice,\n    accRolloverLong: '0',\n    accRolloverShort: '0',\n    lastRolloverBlock: '0',\n    lastRolloverLongPure: '0',\n    brokerPremium: '0',\n    isNegativeRolloverAllowed: false,\n    buyVolume: '0',\n    sellVolume: '0',\n    decayRate: '0',\n    netVolThreshold: '0',\n    priceImpactK: '0',\n    spreadP: '0',\n  };\n}\n\nfunction priceDataFromTick(tick: PriceTick): PriceData {\n  return {\n    mid: tick.mid,\n    bid: tick.bid,\n    ask: tick.ask,\n    isMarketOpen: tick.isMarketOpen,\n    isDayTradingClosed: tick.isDayTradingClosed,\n    secondsToToggleIsDayTradingClosed: tick.secondsToToggleIsDayTradingClosed,\n  };\n}\n\nfunction normalizeComparableId(value: unknown): string | undefined {\n  if (value === undefined || value === null) return undefined;\n  const normalized = value.toString();\n  return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction idsMatch(left: unknown, right: unknown): boolean {\n  const normalizedLeft = normalizeComparableId(left);\n  const normalizedRight = normalizeComparableId(right);\n  if (!normalizedLeft || !normalizedRight) return false;\n  if (normalizedLeft === normalizedRight) return true;\n\n  try {\n    return BigInt(normalizedLeft) === BigInt(normalizedRight);\n  } catch {\n    return false;\n  }\n}\n\nfunction uniqueIds(ids: unknown[]): string[] {\n  const unique: string[] = [];\n  for (const id of ids) {\n    const normalized = normalizeComparableId(id);\n    if (!normalized) continue;\n    if (unique.some(existing => idsMatch(existing, normalized))) continue;\n    unique.push(normalized);\n  }\n  return unique;\n}\n\nfunction traderPairIndexKey(trader: unknown, pairId: unknown, index: unknown): string | undefined {\n  const normalizedTrader = normalizeComparableId(trader)?.toLowerCase();\n  const normalizedPairId = normalizeComparableId(pairId);\n  const normalizedIndex = normalizeComparableId(index);\n  if (!normalizedTrader || !normalizedPairId || !normalizedIndex) return undefined;\n  return `trader:${normalizedTrader}:pair:${normalizedPairId}:index:${normalizedIndex}`;\n}\n\nfunction getOrderKeys(order: RawOrder | Order): string[] {\n  if ('oid' in order) return uniqueIds([order.oid, order.pid, order.initiatedTx]);\n  return uniqueIds([order.id, order.tradeID, order.initiatedTx]);\n}\n\nfunction getLimitKeys(limit: RawLimit | OpenOrder): string[] {\n  if ('idx' in limit) return uniqueIds([\n    traderPairIndexKey(limit.trader, limit.pairId, limit.idx),\n  ]);\n  return uniqueIds([\n    limit.id,\n    limit.uniqueId,\n    traderPairIndexKey(limit.trader, limit.pair.id, limit.orderId),\n  ]);\n}\n\nfunction getTradeKeys(trade: RawTrade | PairPosition): string[] {\n  if ('position' in trade) {\n    return uniqueIds([\n      trade.position.pid,\n      traderPairIndexKey(trade.position.trader, trade.position.pairId, trade.position.idx),\n    ]);\n  }\n  return uniqueIds([\n    trade.id,\n    trade.tradeID,\n    traderPairIndexKey(trade.trader, trade.pair.id, trade.index),\n  ]);\n}\n\n// Deliberately excludes the bare tradeId: every close of a trade carries the\n// opening order's id, so keying on it would make dedupeKeyedItems() collapse\n// separate partial closes of the same trade into one execution. orderId is\n// unique per execution, and the composite key dedupes the same close arriving\n// from both the contract-log overlay and the subgraph.\nfunction getCloseExecutionKeys(execution: CloseExecution): string[] {\n  return uniqueIds([\n    execution.orderId,\n    `${execution.source}:${execution.orderId}:${execution.tradeId}`,\n  ]);\n}\n\nfunction tradersMatch(left: unknown, right: unknown): boolean {\n  const normalizedLeft = normalizeComparableId(left)?.toLowerCase();\n  const normalizedRight = normalizeComparableId(right)?.toLowerCase();\n  return !!normalizedLeft && !!normalizedRight && normalizedLeft === normalizedRight;\n}\n\nfunction itemMatchesId<T>(item: Keyed<T>, id: string): boolean {\n  return item.keys.some(key => idsMatch(key, id));\n}\n\nfunction dedupeKeyedItems<T extends Keyed<unknown>>(items: T[]): T[] {\n  const seenKeys: string[] = [];\n  const deduped: T[] = [];\n\n  for (const item of items) {\n    const alreadySeen = item.keys.some(key =>\n      seenKeys.some(seen => idsMatch(seen, key)),\n    );\n    if (alreadySeen) continue;\n    deduped.push(item);\n    seenKeys.push(...item.keys);\n  }\n\n  return deduped;\n}\n\nfunction stableFingerprint(value: unknown): string {\n  if (value === null || typeof value !== 'object') return JSON.stringify(value);\n  if (Array.isArray(value)) {\n    return `[${value.map(item => stableFingerprint(item)).join(',')}]`;\n  }\n\n  const entries = Object.entries(value as Record<string, unknown>)\n    .sort(([a], [b]) => a.localeCompare(b));\n  return `{${entries\n    .map(([key, item]) => `${JSON.stringify(key)}:${stableFingerprint(item)}`)\n    .join(',')}}`;\n}\n\nfunction normalizedTraderKey(value: unknown): string | undefined {\n  return normalizeComparableId(value)?.toLowerCase();\n}\n\nfunction emptyAccountUpdatesForTrader(): AccountUpdatesForTrader {\n  return {\n    positions: [],\n    orders: [],\n    limits: [],\n    closeExecutions: [],\n  };\n}\n\nfunction cloneAccountUpdatesForTrader(group: AccountUpdatesForTrader): AccountUpdatesForTrader {\n  return {\n    positions: group.positions.map(trade => ({\n      position: { ...trade.position },\n    })),\n    orders: group.orders.map(order => ({\n      ...order,\n      fees: { ...order.fees },\n    })),\n    limits: group.limits.map(limit => ({ ...limit })),\n    closeExecutions: (group.closeExecutions ?? []).map(execution => ({ ...execution })),\n  };\n}\n\nfunction cloneSnapshot(snapshot: AccountUpdatesSnapshot): AccountUpdatesSnapshot {\n  return Object.fromEntries(\n    Object.entries(snapshot).map(([trader, group]) => [\n      trader,\n      cloneAccountUpdatesForTrader(group),\n    ]),\n  );\n}\n\nfunction ensureTraderGroup(\n  snapshot: AccountUpdatesSnapshot,\n  trader: unknown,\n): AccountUpdatesForTrader | undefined {\n  const key = normalizedTraderKey(trader);\n  if (!key) return undefined;\n  snapshot[key] ??= emptyAccountUpdatesForTrader();\n  return snapshot[key];\n}\n\nfunction toPublicSnapshot(\n  snapshot: KeyedAccountUpdatesSnapshot,\n  users: readonly Address[] = [],\n): AccountUpdatesSnapshot {\n  const grouped: AccountUpdatesSnapshot = {};\n\n  for (const user of users) {\n    const key = normalizedTraderKey(user);\n    if (key) grouped[key] = emptyAccountUpdatesForTrader();\n  }\n\n  for (const item of snapshot.trades) {\n    ensureTraderGroup(grouped, item.value.position.trader)?.positions.push(item.value);\n  }\n  for (const item of snapshot.orders) {\n    ensureTraderGroup(grouped, item.value.trader)?.orders.push(item.value);\n  }\n  for (const item of snapshot.limits) {\n    ensureTraderGroup(grouped, item.value.trader)?.limits.push(item.value);\n  }\n  for (const item of snapshot.closeExecutions) {\n    ensureTraderGroup(grouped, item.value.trader)?.closeExecutions?.push(item.value);\n  }\n\n  return grouped;\n}\n\nfunction formatTrade(\n  raw: RawTrade,\n  prices: Record<string, PriceData>,\n  blockNumber?: bigint,\n): PairPosition {\n  const price = prices[`${raw.pair.from}/${raw.pair.to}`];\n  const pnl = price && blockNumber ? getTradePnL(raw, price, blockNumber) : EMPTY_PNL;\n  const maxLev = raw.isDayTrade\n    ? formatLeverage(raw.pair.overnightMaxLeverage)\n    : pairMaxLeverage(raw.pair);\n  return formatPosition(raw, price, pnl, maxLev);\n}\n\nfunction applyConfirmationMetadata(\n  position: PairPosition,\n  confirmation?: AccountTradeConfirmation,\n): PairPosition {\n  if (!confirmation) return position;\n\n  return {\n    position: {\n      ...position.position,\n      confirmationStatus: confirmation.status,\n      ...(confirmation.orderId ? { orderId: confirmation.orderId } : {}),\n      ...(confirmation.initiatedTx ? { initiatedTx: confirmation.initiatedTx } : {}),\n      ...(confirmation.initiatedBlock ? { initiatedBlock: confirmation.initiatedBlock } : {}),\n    },\n  };\n}\n\nfunction formatConfirmedTrade(\n  raw: RawTrade,\n  prices: Record<string, PriceData>,\n  blockNumber: bigint | undefined,\n  confirmation?: AccountTradeConfirmation,\n): PairPosition {\n  return applyConfirmationMetadata(formatTrade(raw, prices, blockNumber), confirmation);\n}\n\nfunction tradeNotionalFromOpen(pair: Pick<RawPair, 'from'>, collateral: bigint, leverage: bigint, openPrice: bigint): string {\n  if (openPrice <= 0n) return '0';\n\n  const notionalUsd = collateral * leverage / 100n;\n  if (pair.from === 'USD') {\n    return (notionalUsd * openPrice / PRECISION_6).toString();\n  }\n\n  return (notionalUsd * PRECISION_18 * PRECISION_18 / (PRECISION_6 * openPrice)).toString();\n}\n\ninterface DecodedOpenTradeInput {\n  buy: boolean;\n  collateral: bigint;\n  leverage: bigint;\n  openPrice: bigint;\n}\n\n/**\n * Decode the trade fields from an `openTrade` transaction's calldata.\n * Unwraps one level of `delegatedAction`. Returns undefined for calldata the\n * Trading ABI can't decode (e.g. Safe-batched gasless submissions).\n */\nfunction decodeOpenTradeInput(data: Hex, depth = 0): DecodedOpenTradeInput | undefined {\n  try {\n    const decoded = decodeFunctionData({ abi: TRADING_ABI, data });\n    if (decoded.functionName === 'delegatedAction' && depth === 0) {\n      return decodeOpenTradeInput(decoded.args[1] as Hex, depth + 1);\n    }\n    if (decoded.functionName !== 'openTrade') return undefined;\n\n    const trade = decoded.args[0] as {\n      buy: boolean;\n      collateral: bigint;\n      leverage: number | bigint;\n      openPrice: bigint;\n    };\n    return {\n      buy: trade.buy,\n      collateral: BigInt(trade.collateral),\n      leverage: BigInt(trade.leverage),\n      openPrice: BigInt(trade.openPrice),\n    };\n  } catch {\n    return undefined;\n  }\n}\n\nfunction rawPendingOrderFromInitiated({\n  orderId,\n  trader,\n  pair,\n  initiatedTx,\n  initiatedBlock,\n}: {\n  orderId: string;\n  trader: Address;\n  pair: RawPair;\n  initiatedTx?: string;\n  initiatedBlock?: string;\n}): RawOrder {\n  const initiatedAt = currentUnixSeconds();\n  return {\n    id: orderId,\n    tradeID: orderId,\n    trader,\n    pair,\n    orderAction: 'Open',\n    orderType: 'Market',\n    // The initiated event carries no direction/size — placeholders below are\n    // corrected asynchronously from the transaction calldata when decodable.\n    isBuy: true,\n    isPending: true,\n    isCancelled: false,\n    collateral: '0',\n    notional: '0',\n    tradeNotional: '0',\n    leverage: '0',\n    price: '0',\n    priceAfterImpact: '0',\n    priceImpactP: '0',\n    vaultFee: '0',\n    devFee: '0',\n    oracleFee: '0',\n    rolloverFee: '0',\n    liquidationFee: '0',\n    builder: ZERO_ADDRESS,\n    builderFee: '0',\n    profitPercent: '0',\n    totalProfitPercent: '0',\n    amountSentToTrader: '0',\n    closePercent: '0',\n    initiatedTx: initiatedTx ?? '',\n    initiatedBlock: initiatedBlock ?? '',\n    initiatedAt,\n  };\n}\n\nfunction isPendingOrder(order: RawOrder): boolean {\n  return order.isPending !== false && order.isCancelled !== true;\n}\n\nfunction isActiveLimit(limit: RawLimit): boolean {\n  return limit.isActive !== false;\n}\n\nfunction isOpenTrade(trade: RawTrade): boolean {\n  return trade.isOpen !== false;\n}\n\n/**\n * Close percentages are 2-decimal fixed point everywhere they enter the SDK:\n * the subgraph mirrors the contract's `closePercentage` arg (see `closeTrade`,\n * which sends `closePercent * 100`) and `MarketCloseExecutedV2.percentageClosed`\n * uses the same scale. A full close is always `10000`, never `100`.\n */\nfunction normalizeClosePercentage(value: unknown): number {\n  if (value === undefined || value === null) return 0;\n  const raw = Number(value);\n  if (!Number.isFinite(raw)) return 0;\n  return raw / 100;\n}\n\nfunction isFullClose(order: Pick<RawOrder, 'orderAction' | 'closePercent'>): boolean {\n  if (order.orderAction === 'Liquidation') return true;\n  return normalizeClosePercentage(order.closePercent) >= 100;\n}\n\nfunction isCloseExecutionOrder(order: RawOrder): boolean {\n  return order.orderAction === 'Close' ||\n    order.orderAction === 'Liquidation' ||\n    order.orderAction === 'StopLoss' ||\n    order.orderAction === 'TakeProfit' ||\n    order.orderAction === 'CloseDayTrade';\n}\n\nfunction keyedCloseExecution(execution: CloseExecution): Keyed<CloseExecution> {\n  return {\n    keys: getCloseExecutionKeys(execution),\n    value: execution,\n  };\n}\n\ninterface BuildCloseExecutionInput {\n  orderId: string;\n  tradeId: string;\n  trader: string;\n  pairId?: string;\n  pairTo?: string;\n  pairFrom?: string;\n  action?: OrderAction;\n  pxRaw: string | number | bigint | null | undefined;\n  percentProfitRaw: string | number | bigint | null | undefined;\n  usdcSentToTraderRaw: string | number | bigint | null | undefined;\n  percentageClosedRaw: string | number | bigint | null | undefined;\n  isFullClose?: boolean;\n  source: 'event' | 'subgraph';\n  blockNumber?: unknown;\n}\n\nfunction optionalBlockNumber(value: unknown): string | undefined {\n  if (value === undefined || value === null || value === '') return undefined;\n  return typeof value === 'string' ? value : value.toString();\n}\n\nfunction buildCloseExecution(input: BuildCloseExecutionInput): CloseExecution {\n  const percentageClosed = normalizeClosePercentage(input.percentageClosedRaw);\n  const execution: CloseExecution = {\n    orderId: input.orderId,\n    tradeId: input.tradeId,\n    trader: input.trader,\n    pairId: input.pairId,\n    pairTo: input.pairTo,\n    pairFrom: input.pairFrom,\n    action: input.action,\n    px: formatTokens(input.pxRaw).toString(),\n    percentProfit: formatUsdc(input.percentProfitRaw).toString(),\n    usdcSentToTrader: formatUsdc(input.usdcSentToTraderRaw).toString(),\n    percentageClosed: percentageClosed.toString(),\n    isFullClose: input.isFullClose ?? percentageClosed >= 100,\n    source: input.source,\n  };\n  const blockNumber = optionalBlockNumber(input.blockNumber);\n  if (blockNumber !== undefined) execution.blockNumber = blockNumber;\n  return execution;\n}\n\nfunction closeExecutionFromOrder(order: RawOrder): CloseExecution {\n  const pxRaw = order.priceAfterImpact && order.priceAfterImpact !== '0'\n    ? order.priceAfterImpact\n    : order.price;\n  return buildCloseExecution({\n    orderId: topicToOrderId(order.id) ?? '',\n    tradeId: topicToOrderId(order.tradeID) ?? topicToOrderId(order.id) ?? '',\n    trader: order.trader.toLowerCase(),\n    pairId: String(order.pair.id),\n    pairTo: normalizePairName(order.pair.to),\n    pairFrom: normalizePairName(order.pair.from),\n    action: order.orderAction as OrderAction,\n    pxRaw,\n    percentProfitRaw: order.profitPercent,\n    usdcSentToTraderRaw: order.amountSentToTrader,\n    percentageClosedRaw: order.closePercent,\n    isFullClose: isFullClose(order),\n    source: 'subgraph',\n    blockNumber: order.executedBlock,\n  });\n}\n\nfunction formatKeyedAccountUpdatesSnapshot(\n  raw: RawAccountUpdatesSnapshot,\n  prices: Record<string, PriceData>,\n  blockNumber?: bigint,\n): KeyedAccountUpdatesSnapshot {\n  return {\n    orders: raw.orders\n      .filter(isPendingOrder)\n      .map(order => ({ keys: getOrderKeys(order), value: formatOrder(order) })),\n    limits: raw.limits\n      .filter(isActiveLimit)\n      .map(limit => ({ keys: getLimitKeys(limit), value: formatOpenOrder(limit) })),\n    trades: raw.trades\n      .filter(isOpenTrade)\n      .map(trade => ({\n        keys: getTradeKeys(trade),\n        raw: trade,\n        value: formatTrade(trade, prices, blockNumber),\n      })),\n    closeExecutions: (raw.closedOrders ?? [])\n      .filter(isCloseExecutionOrder)\n      .map(order => keyedCloseExecution(closeExecutionFromOrder(order))),\n  };\n}\n\nexport function formatAccountUpdatesSnapshot(\n  raw: RawAccountUpdatesSnapshot,\n  prices: Record<string, PriceData>,\n  blockNumber?: bigint,\n): AccountUpdatesSnapshot {\n  return toPublicSnapshot(formatKeyedAccountUpdatesSnapshot(raw, prices, blockNumber));\n}\n\nclass AccountUpdatesState {\n  private fingerprint = '';\n  /** No emissions until the first subgraph snapshot lands — prevents a misleading empty first emit. */\n  private ready = false;\n  private subgraphSnapshot: KeyedAccountUpdatesSnapshot = {\n    orders: [],\n    limits: [],\n    trades: [],\n    closeExecutions: [],\n  };\n  private fastOrders = new Map<string, FastOrderItem>();\n  private fastTrades = new Map<string, AccountTradeItem>();\n  private fastCloseExecutions = new Map<string, FastCloseExecutionItem>();\n  private hiddenOrderIds = new Map<string, number>();\n  private closedTradeIds = new Map<string, number>();\n\n  constructor(\n    private readonly onChange: (snapshot: AccountUpdatesSnapshot) => void,\n    private readonly users: readonly Address[],\n  ) {}\n\n  ingest(snapshot: KeyedAccountUpdatesSnapshot): void {\n    this.subgraphSnapshot = snapshot;\n    for (const close of snapshot.closeExecutions) {\n      if (close.value.isFullClose) this.recordTradeClosed(close.value.tradeId);\n    }\n    this.ready = true;\n    this.reconcileFastState();\n    this.emitIfChanged();\n  }\n\n  upsertFastTrade(trade: AccountTradeItem, orderId?: string): void {\n    const key = trade.keys[0];\n    if (!key) return;\n\n    if (orderId) {\n      this.hideOrder(orderId);\n      this.deleteFastOrder(orderId);\n      this.deleteFastTrades(orderId);\n    }\n    for (const tradeKey of trade.keys) this.closedTradeIds.delete(tradeKey);\n    this.fastTrades.set(key, trade);\n    this.emitIfChanged();\n  }\n\n  attachOrderId(localId: string, metadata: InitiatedMetadata): boolean {\n    for (const [key, trade] of this.fastTrades) {\n      if (key !== localId && !itemMatchesId(trade, localId)) continue;\n\n      const promoted = this.promotedTrade(trade, metadata);\n      this.fastTrades.delete(key);\n      this.fastTrades.set(promoted.keys[0], promoted);\n      this.hideOrder(metadata.orderId);\n      this.deleteFastOrder(metadata.orderId);\n      this.emitIfChanged();\n      return true;\n    }\n\n    return false;\n  }\n\n  promoteOptimisticTradeByPair(pairId: string, metadata: InitiatedMetadata): boolean {\n    for (const [key, trade] of this.fastTrades) {\n      if (trade.confirmation?.status !== 'optimistic') continue;\n      if (String(trade.raw.pair.id) !== String(pairId)) continue;\n      if (metadata.trader && !tradersMatch(trade.raw.trader, metadata.trader)) continue;\n\n      const promoted = this.promotedTrade(trade, metadata);\n      this.fastTrades.delete(key);\n      this.fastTrades.set(promoted.keys[0], promoted);\n      this.hideOrder(metadata.orderId);\n      this.deleteFastOrder(metadata.orderId);\n      this.emitIfChanged();\n      return true;\n    }\n\n    return false;\n  }\n\n  upsertFastOrder(order: FastOrderItem): void {\n    const key = order.keys[0];\n    if (!key || this.hasHiddenOrder(order)) return;\n\n    this.fastOrders.set(key, order);\n    this.emitIfChanged();\n  }\n\n  hasFastOrder(orderId: string): boolean {\n    for (const [key, order] of this.fastOrders) {\n      if (idsMatch(key, orderId) || itemMatchesId(order, orderId)) return true;\n    }\n    return false;\n  }\n\n  /** Whether a close tombstone exists for this trade id. */\n  isTradeClosed(tradeId: string): boolean {\n    const normalized = normalizeComparableId(tradeId);\n    if (!normalized) return false;\n    return [...this.closedTradeIds.keys()].some(id => idsMatch(id, normalized));\n  }\n\n  findTradeContext(tradeId: string): {\n    tradeId: string;\n    trader: string;\n    pairId: string;\n    idx: number;\n    pairTo: string;\n    pairFrom: string;\n  } | undefined {\n    const normalizedTradeId = normalizeComparableId(tradeId);\n    if (!normalizedTradeId) return undefined;\n\n    for (const trade of [...this.fastTrades.values(), ...this.subgraphSnapshot.trades]) {\n      if (!itemMatchesId(trade, normalizedTradeId)) continue;\n      return {\n        tradeId: trade.value.position.pid,\n        trader: trade.value.position.trader,\n        pairId: trade.value.position.pairId,\n        idx: trade.value.position.idx,\n        pairTo: trade.value.position.pairTo,\n        pairFrom: trade.value.position.pairFrom,\n      };\n    }\n\n    return undefined;\n  }\n\n  upsertCloseExecution(execution: CloseExecution): void {\n    const item: FastCloseExecutionItem = {\n      ...keyedCloseExecution(execution),\n      createdAt: Date.now(),\n    };\n    const key = item.keys[0];\n    if (!key) return;\n\n    this.fastCloseExecutions.set(key, item);\n    if (execution.isFullClose) this.recordTradeClosed(execution.tradeId);\n    this.emitIfChanged();\n  }\n\n  markTradeClosed(tradeId: string): void {\n    this.recordTradeClosed(tradeId);\n    this.emitIfChanged();\n  }\n\n  private recordTradeClosed(tradeId: string): void {\n    const normalizedTradeId = normalizeComparableId(tradeId);\n    if (!normalizedTradeId) return;\n\n    this.closedTradeIds.set(normalizedTradeId, Date.now());\n    for (const [key, trade] of this.fastTrades) {\n      if (idsMatch(key, normalizedTradeId) || itemMatchesId(trade, normalizedTradeId)) {\n        this.fastTrades.delete(key);\n      }\n    }\n  }\n\n  getCurrent(): AccountUpdatesSnapshot {\n    return cloneSnapshot(toPublicSnapshot(this.getMergedSnapshot(), this.users));\n  }\n\n  hasTradeForPair(pairId: string): boolean {\n    return this.getMergedSnapshot().trades.some(\n      trade => String(trade.raw.pair.id) === String(pairId),\n    );\n  }\n\n  repriceTrades(\n    prices: Record<string, PriceData>,\n    blockNumber?: bigint,\n    pairIds?: Set<string>,\n  ): void {\n    const reprice = (trade: AccountTradeItem): AccountTradeItem => {\n      if (pairIds && !pairIds.has(String(trade.raw.pair.id))) {\n        return trade;\n      }\n      return {\n        ...trade,\n        value: formatConfirmedTrade(trade.raw, prices, blockNumber, trade.confirmation),\n      };\n    };\n\n    this.subgraphSnapshot = {\n      ...this.subgraphSnapshot,\n      trades: this.subgraphSnapshot.trades.map(reprice),\n    };\n    this.fastTrades = new Map(\n      [...this.fastTrades.entries()].map(([key, trade]) => [key, reprice(trade)]),\n    );\n    this.emitIfChanged();\n  }\n\n  private getMergedSnapshot(): KeyedAccountUpdatesSnapshot {\n    const activeFastOrders = [...this.fastOrders.values()]\n      .filter(order => !this.hasHiddenOrder(order));\n    const activeOrders = this.subgraphSnapshot.orders\n      .filter(order => !this.hasHiddenOrder(order));\n    const activeTrades = this.subgraphSnapshot.trades\n      .filter(trade => !this.hasFastClose(trade));\n    const activeFastCloseExecutions = [...this.fastCloseExecutions.values()];\n\n    return {\n      orders: dedupeKeyedItems([...activeFastOrders, ...activeOrders]),\n      limits: dedupeKeyedItems(this.subgraphSnapshot.limits),\n      trades: dedupeKeyedItems([...this.fastTrades.values(), ...activeTrades]),\n      closeExecutions: dedupeKeyedItems([\n        ...activeFastCloseExecutions,\n        ...this.subgraphSnapshot.closeExecutions,\n      ]),\n    };\n  }\n\n  private reconcileFastState(): void {\n    this.pruneTimedIds();\n    const indexedOrderKeys = this.subgraphSnapshot.orders.flatMap(order => order.keys);\n    const indexedTradeKeys = this.subgraphSnapshot.trades.flatMap(trade => trade.keys);\n\n    for (const [key, order] of this.fastOrders) {\n      const isIndexedOrder = order.keys.some(orderKey =>\n        indexedOrderKeys.some(indexedKey => idsMatch(indexedKey, orderKey)),\n      );\n      const isIndexedTrade = order.keys.some(orderKey =>\n        indexedTradeKeys.some(indexedKey => idsMatch(indexedKey, orderKey)),\n      );\n      if (\n        isIndexedOrder ||\n        isIndexedTrade ||\n        indexedOrderKeys.some(indexedKey => idsMatch(indexedKey, key)) ||\n        indexedTradeKeys.some(indexedKey => idsMatch(indexedKey, key))\n      ) {\n        this.fastOrders.delete(key);\n      }\n    }\n\n    for (const [key, trade] of this.fastTrades) {\n      const isIndexed = trade.keys.some(tradeKey =>\n        indexedTradeKeys.some(indexedKey => idsMatch(indexedKey, tradeKey)),\n      );\n      if (isIndexed || indexedTradeKeys.some(indexedKey => idsMatch(indexedKey, key))) {\n        this.fastTrades.delete(key);\n      }\n    }\n  }\n\n  private hideOrder(orderId: string): void {\n    this.hiddenOrderIds.set(orderId, Date.now());\n    this.deleteFastOrder(orderId);\n  }\n\n  private hasHiddenOrder(order: Keyed<Order>): boolean {\n    return [...this.hiddenOrderIds.keys()].some(orderId => itemMatchesId(order, orderId));\n  }\n\n  private hasFastClose(trade: Keyed<PairPosition>): boolean {\n    return [...this.closedTradeIds.keys()].some(tradeId => itemMatchesId(trade, tradeId));\n  }\n\n  private pruneTimedIds(): void {\n    const expireBefore = Date.now() - OVERLAY_TTL_MS;\n    for (const [id, timestamp] of this.hiddenOrderIds) {\n      if (timestamp < expireBefore) this.hiddenOrderIds.delete(id);\n    }\n    for (const [id, timestamp] of this.closedTradeIds) {\n      if (timestamp < expireBefore) this.closedTradeIds.delete(id);\n    }\n    for (const [key, order] of this.fastOrders) {\n      if (order.createdAt < expireBefore) this.fastOrders.delete(key);\n    }\n    for (const [key, execution] of this.fastCloseExecutions) {\n      if (execution.createdAt < expireBefore) this.fastCloseExecutions.delete(key);\n    }\n    for (const [key, trade] of this.fastTrades) {\n      const createdAt = trade.confirmation?.createdAt;\n      // 'executed' entries expire too: an executed trade the subgraph never\n      // confirms within the TTL is a ghost (its close was likely missed while\n      // it was still unindexed), and keeping it forever shows the builder a\n      // position that no longer exists.\n      if (createdAt !== undefined && createdAt < expireBefore) {\n        this.fastTrades.delete(key);\n      }\n    }\n  }\n\n  private promotedTrade(trade: AccountTradeItem, metadata: InitiatedMetadata): AccountTradeItem {\n    const confirmation: AccountTradeConfirmation = {\n      ...trade.confirmation,\n      status: 'initiated',\n      orderId: metadata.orderId,\n      initiatedTx: metadata.initiatedTx ?? trade.confirmation?.initiatedTx,\n      initiatedBlock: metadata.initiatedBlock ?? trade.confirmation?.initiatedBlock,\n      createdAt: trade.confirmation?.createdAt ?? Date.now(),\n    };\n    const raw: RawTrade = {\n      ...trade.raw,\n      id: metadata.orderId,\n      tradeID: metadata.orderId,\n      index: '-1',\n    };\n    const value = applyConfirmationMetadata(\n      {\n        position: {\n          ...trade.value.position,\n          pid: metadata.orderId,\n          idx: -1,\n        },\n      },\n      confirmation,\n    );\n\n    return {\n      keys: uniqueIds([\n        trade.confirmation?.localId,\n        metadata.orderId,\n      ]),\n      raw,\n      value,\n      confirmation,\n    };\n  }\n\n  private deleteFastOrder(orderId: string): void {\n    for (const [key, order] of this.fastOrders) {\n      if (idsMatch(key, orderId) || itemMatchesId(order, orderId)) {\n        this.fastOrders.delete(key);\n      }\n    }\n  }\n\n  private deleteFastTrades(orderId: string): void {\n    for (const [key, trade] of this.fastTrades) {\n      if (idsMatch(key, orderId) || itemMatchesId(trade, orderId)) {\n        this.fastTrades.delete(key);\n      }\n    }\n  }\n\n  private emitIfChanged(): void {\n    if (!this.ready) return;\n\n    const snapshot = toPublicSnapshot(this.getMergedSnapshot(), this.users);\n    const nextFingerprint = stableFingerprint(snapshot);\n    if (nextFingerprint === this.fingerprint) return;\n\n    this.fingerprint = nextFingerprint;\n    this.onChange(cloneSnapshot(snapshot));\n  }\n}\n\nexport class OstiumAccountUpdatesStream {\n  private readonly updateHandlers: Set<UpdateHandler> = new Set();\n  private readonly errorHandlers: Set<ErrorHandler> = new Set();\n  private readonly logClient: AlchemyLogClient;\n  private readonly blockClient: AlchemyBlockClient;\n  private readonly isPendingMarketOrderRegistered: PendingOrderRegisteredReader;\n  private readonly priceStream: PriceStreamSource;\n  private readonly state: AccountUpdatesState;\n  private readonly unwatchers: Array<() => void> = [];\n  private readonly timer: NodeJS.Timeout;\n  /** Lower-cased set of subscribed trader addresses, for membership checks. */\n  private readonly normalizedUsers: Set<string>;\n  /** First subscribed address — used as the attribution fallback when an event omits the trader. */\n  private readonly defaultUser: Address;\n  private readonly priceCache: Record<string, PriceData> = {};\n  private rawPairById: Map<string, RawPair> | null = null;\n  private rawPairsPromise: Promise<void> | null = null;\n  private latestBlockNumber: bigint | undefined;\n  /** Chain head up to which missed-event backfill has run. */\n  private lastSweptBlock: bigint | null = null;\n  private sweepInFlight = false;\n  private optimisticOpenCounter = 0;\n  private inFlight = false;\n  private consecutivePollFailures = 0;\n  private pollBackoffTicksRemaining = 0;\n  private pollBackoffUntilMs = 0;\n  private closed = false;\n\n  constructor(private readonly options: OstiumAccountUpdatesStreamOptions) {\n    this.logClient = createAlchemyLogClient(options.testnet, options.alchemyApiKey);\n    this.blockClient = createAlchemyBlockClient(options.testnet, options.alchemyApiKey);\n    this.isPendingMarketOrderRegistered = options.isPendingMarketOrderRegistered\n      ?? makePendingOrderRegisteredReader(\n        this.blockClient,\n        getNetworkConfig(options.testnet).contracts.tradingStorage,\n      );\n    if (options.users.length === 0) {\n      throw new OstiumSubgraphError(\n        'OstiumAccountUpdatesStream requires at least one trader address.',\n        OstiumSubgraphErrorCode.INVALID_PARAMS,\n      );\n    }\n    this.normalizedUsers = new Set(options.users.map(user => user.toLowerCase()));\n    this.defaultUser = options.users[0];\n    this.state = new AccountUpdatesState(snapshot => this.emit(snapshot), options.users);\n    if (options.initialRawPairs?.length) {\n      this.rawPairById = new Map(options.initialRawPairs.map(pair => [String(pair.id), pair]));\n    }\n\n    this.startWatchers();\n    void this.loadRawPairs();\n    this.priceStream = options.openPriceStream();\n    this.startPriceStream();\n    void this.seedPrices();\n    void this.poll();\n    this.timer = setInterval(\n      () => { void this.poll(); },\n      options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS,\n    );\n  }\n\n  onUpdate(handler: UpdateHandler): () => void {\n    this.updateHandlers.add(handler);\n    return () => { this.updateHandlers.delete(handler); };\n  }\n\n  onError(handler: ErrorHandler): this {\n    this.errorHandlers.add(handler);\n    return this;\n  }\n\n  getCurrent(): AccountUpdatesSnapshot {\n    return this.state.getCurrent();\n  }\n\n  /** Trader addresses this stream is subscribed to, in the order supplied. */\n  get users(): Address[] {\n    return [...this.options.users];\n  }\n\n  addOptimisticOpen(params: OpenTradeParams, submission?: SubmissionResult, user?: Address): string {\n    if (params.type !== TradeOrderType.Market) {\n      throw new OstiumSubgraphError(\n        'addOptimisticOpen only supports market open orders.',\n        OstiumSubgraphErrorCode.INVALID_PARAMS,\n      );\n    }\n\n    const trader = this.resolveOptimisticUser(user);\n    const localId = `optimistic:${Date.now()}:${++this.optimisticOpenCounter}`;\n    try {\n      this.state.upsertFastTrade(this.optimisticTradeFromOpenParams(localId, params, submission, trader));\n    } catch (error) {\n      if (error instanceof OstiumSubgraphError) throw error;\n      throw new OstiumSubgraphError(\n        `Failed to add optimistic open: ${error instanceof Error ? error.message : String(error)}`,\n        OstiumSubgraphErrorCode.INVALID_PARAMS,\n        error,\n      );\n    }\n    return localId;\n  }\n\n  attachOrderId(\n    localId: string,\n    orderId: string,\n    metadata?: { initiatedTx?: string; initiatedBlock?: string },\n  ): void {\n    const normalizedOrderId = normalizeComparableId(orderId);\n    if (!localId || !normalizedOrderId) {\n      throw new OstiumSubgraphError(\n        'attachOrderId requires both localId and orderId.',\n        OstiumSubgraphErrorCode.INVALID_PARAMS,\n      );\n    }\n\n    this.state.attachOrderId(localId, {\n      orderId: normalizedOrderId,\n      initiatedTx: metadata?.initiatedTx,\n      initiatedBlock: metadata?.initiatedBlock,\n    });\n  }\n\n  close(): void {\n    if (this.closed) return;\n    this.closed = true;\n    clearInterval(this.timer);\n    for (const unwatch of this.unwatchers.splice(0)) unwatch();\n    this.priceStream.close();\n  }\n\n  private startPriceStream(): void {\n    this.priceStream.onSnapshot(ticks => {\n      this.ingestPriceTicks(ticks);\n    });\n    this.priceStream.onTick(tick => {\n      this.ingestPriceTicks([tick]);\n    });\n    this.priceStream.onError(error => this.emitError(error));\n  }\n\n  private async seedPrices(): Promise<void> {\n    try {\n      const prices = await this.options.fetchLivePrices();\n      if (this.closed) return;\n      this.mergePrices(prices);\n      this.state.repriceTrades(this.priceCache, this.latestBlockNumber);\n    } catch (error) {\n      this.emitError(error);\n    }\n  }\n\n  private startWatchers(): void {\n    const network = getNetworkConfig(this.options.testnet);\n    const trading = network.contracts.trading;\n    const tradingCallbacks = network.contracts.tradingCallbacks;\n\n    this.unwatchers.push(\n      this.logClient.watchEvent({\n        address: trading,\n        event: MARKET_OPEN_ORDER_INITIATED,\n        // viem treats an array on an indexed arg as an OR filter — one watcher\n        // covers every subscribed trader.\n        args: { trader: this.options.users },\n        poll: false,\n        onLogs: logs => {\n          for (const log of logs) {\n            try {\n              this.handleMarketOpenInitiated(log as MarketOpenInitiatedLog);\n            } catch (error) {\n              this.emitError(error);\n            }\n          }\n          void this.poll();\n        },\n        onError: error => this.emitError(error),\n      }),\n    );\n\n    this.unwatchers.push(\n      this.logClient.watchEvent({\n        address: tradingCallbacks,\n        event: MARKET_OPEN_EXECUTED,\n        poll: false,\n        onLogs: logs => {\n          for (const log of logs) {\n            try {\n              this.handleMarketOpenExecuted(log as MarketOpenExecutedLog);\n            } catch (error) {\n              this.emitError(error);\n            }\n          }\n        },\n        onError: error => this.emitError(error),\n      }),\n    );\n\n    this.unwatchers.push(\n      this.logClient.watchEvent({\n        address: tradingCallbacks,\n        event: MARKET_CLOSE_EXECUTED_V2,\n        poll: false,\n        onLogs: logs => {\n          for (const log of logs) {\n            try {\n              this.handleMarketCloseExecuted(log as MarketCloseExecutedLog);\n            } catch (error) {\n              this.emitError(error);\n            }\n          }\n        },\n        onError: error => this.emitError(error),\n      }),\n    );\n  }\n\n  private async poll(): Promise<void> {\n    if (this.closed || this.inFlight) return;\n    // Backoff throttles the subgraph snapshot only. The chain-log sweep talks to\n    // a different upstream and is the fallback while the subgraph is degraded, so\n    // it still runs on skipped ticks.\n    if (this.shouldSkipPollForBackoff()) {\n      await this.trackChainTip();\n      if (this.closed) return;\n      void this.sweepMissedEvents();\n      return;\n    }\n    this.inFlight = true;\n\n    // Started before the snapshot fetch so the two run concurrently, but kept off\n    // its promise chain: the sweep below is the safety net for exactly the case\n    // where the subgraph is failing, and it no-ops without a tip. Sharing a\n    // Promise.all with fetchRawSnapshot() meant a snapshot rejection discarded an\n    // already-fetched block number too.\n    const tipTracked = this.trackChainTip();\n\n    try {\n      const raw = await this.options.fetchRawSnapshot();\n      if (this.closed) return;\n      // Ghost pending market orders (subgraph missed the terminal event, chain\n      // has nothing to cancel) are dropped; stale-but-registered ones stay\n      // visible so the user cancels them and frees their pending-order slots.\n      const orders = await dropGhostPendingMarketOrders(raw.orders, this.isPendingMarketOrderRegistered);\n      if (this.closed) return;\n      await tipTracked;\n      if (this.closed) return;\n      this.state.ingest(\n        formatKeyedAccountUpdatesSnapshot({ ...raw, orders }, this.priceCache, this.latestBlockNumber),\n      );\n      this.resetPollBackoff();\n    } catch (error) {\n      this.recordPollFailure(error);\n      this.emitError(error);\n    } finally {\n      this.inFlight = false;\n    }\n\n    // Unconditional. The sweep reads logs straight from the chain RPC and needs\n    // nothing from the subgraph, so it is the only backfill path when the poll\n    // fails and a WebSocket gap dropped a MarketCloseExecutedV2. Gating it on\n    // poll success left closed trades as ghost open positions for the whole\n    // outage. Its own RPC cost stays bounded by the poll interval, the\n    // sweepInFlight guard, and the 5000-block range cap.\n    await tipTracked;\n    if (this.closed) return;\n    void this.sweepMissedEvents();\n  }\n\n  /**\n   * Refresh the cached chain tip, which feeds rollover projection in PnL and is\n   * the starting point for `sweepMissedEvents()`. A failure keeps the previous\n   * tip rather than clearing it — the tip is already served from a 30s cache, and\n   * both consumers prefer a slightly stale tip to none at all.\n   */\n  private async trackChainTip(): Promise<void> {\n    try {\n      const tip = await this.blockClient.getBlockNumber();\n      if (!this.closed) this.latestBlockNumber = tip;\n    } catch {\n      // Best effort — the next tick retries.\n    }\n  }\n\n  private shouldSkipPollForBackoff(): boolean {\n    if (this.pollBackoffUntilMs > Date.now()) return true;\n    if (this.pollBackoffTicksRemaining <= 0) return false;\n    this.pollBackoffTicksRemaining -= 1;\n    return true;\n  }\n\n  private resetPollBackoff(): void {\n    this.consecutivePollFailures = 0;\n    this.pollBackoffTicksRemaining = 0;\n    this.pollBackoffUntilMs = 0;\n  }\n\n  private recordPollFailure(error: unknown): void {\n    this.consecutivePollFailures += 1;\n    const ticks = Math.min(10, 2 ** Math.max(0, this.consecutivePollFailures - 1));\n    this.pollBackoffTicksRemaining = Math.max(this.pollBackoffTicksRemaining, ticks);\n\n    const retryAfterMs = retryAfterMsFromError(error);\n    if (retryAfterMs !== undefined) {\n      this.pollBackoffUntilMs = Math.max(this.pollBackoffUntilMs, Date.now() + retryAfterMs);\n    }\n  }\n\n  /**\n   * Replay contract events the WebSocket may have dropped. viem reconnects a\n   * failed socket and re-subscribes, but logs emitted during the gap are lost;\n   * this sweep fetches the gap range over HTTP each poll so a flap degrades\n   * confirmation latency to roughly one poll interval instead of losing the\n   * event entirely.\n   */\n  private async sweepMissedEvents(): Promise<void> {\n    if (this.closed || this.sweepInFlight) return;\n    const tip = this.latestBlockNumber;\n    if (tip === undefined) return;\n    if (this.lastSweptBlock === null) {\n      // First sighting of the chain head — sweep only from here onward.\n      this.lastSweptBlock = tip;\n      return;\n    }\n    // Cap the range so a long stall (laptop sleep, extended outage) does not\n    // trigger an unbounded scan; older misses are covered by the subgraph\n    // poll plus the closedOrders tombstones.\n    const maxRange = 5000n;\n    const fromBlock = tip - this.lastSweptBlock > maxRange ? tip - maxRange : this.lastSweptBlock + 1n;\n\n    this.sweepInFlight = true;\n    try {\n      const network = getNetworkConfig(this.options.testnet);\n      // `toBlock: 'latest'` rather than the (up to 30s stale) cached tip, so a\n      // dropped event surfaces within roughly one poll interval.\n      const logs = await this.blockClient.getLogs({\n        address: network.contracts.tradingCallbacks,\n        events: [MARKET_OPEN_EXECUTED, MARKET_CLOSE_EXECUTED_V2],\n        fromBlock,\n        toBlock: 'latest',\n      });\n      if (this.closed) return;\n\n      let sweptTo = tip > this.lastSweptBlock ? tip : this.lastSweptBlock;\n      for (const log of logs) {\n        if (log.blockNumber !== null && log.blockNumber > sweptTo) sweptTo = log.blockNumber;\n        if (log.eventName === 'MarketCloseExecutedV2') {\n          this.handleMarketCloseExecuted(log as unknown as MarketCloseExecutedLog);\n        } else if (log.eventName === 'MarketOpenExecuted') {\n          const trade = log.args.t;\n          if (!trade || !this.normalizedUsers.has(trade.trader.toLowerCase())) continue;\n          // Ranges overlap across sweeps — never resurrect a tombstoned trade.\n          if (this.state.isTradeClosed(log.args.orderId?.toString() ?? '')) continue;\n          this.handleMarketOpenExecuted(log as unknown as MarketOpenExecutedLog);\n        }\n      }\n      this.lastSweptBlock = sweptTo;\n    } catch {\n      // Best effort — the next poll retries the same range.\n    } finally {\n      this.sweepInFlight = false;\n    }\n  }\n\n  private ingestPriceTicks(ticks: PriceTick[]): void {\n    if (this.closed || ticks.length === 0) return;\n\n    const relevantPairIds = new Set<string>();\n    let repriceAll = false;\n    for (const tick of ticks) {\n      const priceKey = this.priceKeyFromTick(tick);\n      if (!priceKey) continue;\n      this.priceCache[priceKey] = priceDataFromTick(tick);\n\n      if (tick.pairId && this.state.hasTradeForPair(String(tick.pairId))) {\n        relevantPairIds.add(String(tick.pairId));\n      } else if (!tick.pairId) {\n        repriceAll = true;\n      }\n    }\n\n    if (repriceAll) {\n      this.state.repriceTrades(this.priceCache, this.latestBlockNumber);\n    } else if (relevantPairIds.size > 0) {\n      this.state.repriceTrades(this.priceCache, this.latestBlockNumber, relevantPairIds);\n    }\n  }\n\n  private mergePrices(prices: Record<string, PriceData>): void {\n    for (const [key, price] of Object.entries(prices)) {\n      this.priceCache[key] = price;\n    }\n  }\n\n  private priceKeyFromTick(tick: PriceTick): string | undefined {\n    if (tick.pairId) {\n      const priceKey = this.priceKeyFromPairId(String(tick.pairId));\n      if (priceKey) return priceKey;\n    }\n\n    return `${tick.from}/${tick.to}`;\n  }\n\n  private priceKeyFromPairId(pairId: string): string | undefined {\n    const rawName = this.options.getRawPairName(pairId);\n    if (rawName) return rawPairNameToPriceKey(rawName);\n\n    const rawPair = this.rawPairById?.get(pairId);\n    return rawPair ? `${rawPair.from}/${rawPair.to}` : undefined;\n  }\n\n  private handleMarketOpenInitiated(log: MarketOpenInitiatedLog): void {\n    const eventTrader = log.args.trader;\n    if (eventTrader && !this.normalizedUsers.has(eventTrader.toLowerCase())) return;\n\n    const orderId = log.args.orderId?.toString();\n    const pairId = log.args.pairIndex?.toString();\n    if (!orderId || !pairId) return;\n\n    this.latestBlockNumber = log.blockNumber ?? this.latestBlockNumber;\n    const metadata: InitiatedMetadata = {\n      orderId,\n      pairId,\n      trader: eventTrader,\n      initiatedTx: log.transactionHash,\n      initiatedBlock: log.blockNumber?.toString(),\n    };\n\n    if (this.state.promoteOptimisticTradeByPair(pairId, metadata)) return;\n\n    const pair = this.getRawPair(pairId) ?? optimisticRawPair(pairId, '0', this.options.getRawPairName(pairId));\n    const rawOrder = rawPendingOrderFromInitiated({\n      orderId,\n      trader: eventTrader ?? this.defaultUser,\n      pair,\n      initiatedTx: log.transactionHash,\n      initiatedBlock: log.blockNumber?.toString(),\n    });\n    this.state.upsertFastOrder({\n      keys: getOrderKeys(rawOrder),\n      value: {\n        ...formatOrder(rawOrder),\n        initiatedBlock: log.blockNumber?.toString(),\n      },\n      createdAt: Date.now(),\n    });\n    void this.enrichPendingOrderFromTx(orderId, log.transactionHash, rawOrder);\n\n    if (!this.getRawPair(pairId)) {\n      void this.loadRawPairs().then(() => {\n        if (!this.closed) void this.poll();\n      });\n    }\n  }\n\n  /**\n   * Replace the placeholder direction/size of a fast pending order with the\n   * real values decoded from the initiating transaction's calldata. Best\n   * effort — undecodable calldata keeps the placeholder until the subgraph\n   * indexes the order.\n   */\n  private async enrichPendingOrderFromTx(\n    orderId: string,\n    txHash: Hex | undefined,\n    placeholder: RawOrder,\n  ): Promise<void> {\n    if (!txHash) return;\n\n    try {\n      const tx = await this.blockClient.getTransaction({ hash: txHash });\n      const open = decodeOpenTradeInput(tx.input);\n      if (!open || this.closed || !this.state.hasFastOrder(orderId)) return;\n\n      const enriched: RawOrder = {\n        ...placeholder,\n        isBuy: open.buy,\n        collateral: open.collateral.toString(),\n        notional: (open.collateral * open.leverage / 100n).toString(),\n        tradeNotional: tradeNotionalFromOpen(\n          placeholder.pair,\n          open.collateral,\n          open.leverage,\n          open.openPrice,\n        ),\n        leverage: open.leverage.toString(),\n        price: open.openPrice.toString(),\n      };\n      this.state.upsertFastOrder({\n        keys: getOrderKeys(enriched),\n        value: {\n          ...formatOrder(enriched),\n          initiatedBlock: placeholder.initiatedBlock || undefined,\n        },\n        createdAt: Date.now(),\n      });\n    } catch {\n      // Best effort — the subgraph snapshot corrects the order once indexed.\n    }\n  }\n\n  private handleMarketCloseExecuted(log: MarketCloseExecutedLog): void {\n    const tradeId = log.args.tradeId?.toString() ?? '';\n    if (!tradeId) return;\n\n    const execution = this.closeExecutionFromMarketCloseExecuted(log);\n    if (execution) {\n      this.state.upsertCloseExecution(execution);\n      return;\n    }\n\n    if (normalizeClosePercentage(log.args.percentageClosed) >= 100) {\n      this.state.markTradeClosed(tradeId);\n    }\n  }\n\n  private closeExecutionFromMarketCloseExecuted(log: MarketCloseExecutedLog): CloseExecution | undefined {\n    const orderId = log.args.orderId?.toString();\n    const tradeId = log.args.tradeId?.toString();\n    if (!orderId || !tradeId) return undefined;\n\n    const context = this.state.findTradeContext(tradeId);\n    if (!context) return undefined;\n\n    return buildCloseExecution({\n      orderId,\n      tradeId,\n      trader: context.trader,\n      pairId: context.pairId,\n      pairTo: context.pairTo,\n      pairFrom: context.pairFrom,\n      pxRaw: log.args.price ?? 0n,\n      percentProfitRaw: log.args.percentProfit ?? 0n,\n      usdcSentToTraderRaw: log.args.usdcSentToTrader ?? 0n,\n      percentageClosedRaw: log.args.percentageClosed,\n      source: 'event',\n      blockNumber: log.blockNumber,\n    });\n  }\n\n  /**\n   * Resolve which subscribed trader an optimistic open belongs to. When a single\n   * address is streamed the choice is unambiguous; with multiple addresses the\n   * caller must pass an explicit `user` that is part of the subscription.\n   */\n  private resolveOptimisticUser(user?: Address): Address {\n    if (user) {\n      if (!this.normalizedUsers.has(user.toLowerCase())) {\n        throw new OstiumSubgraphError(\n          `addOptimisticOpen user ${user} is not subscribed to this stream.`,\n          OstiumSubgraphErrorCode.INVALID_PARAMS,\n        );\n      }\n      return user;\n    }\n    if (this.normalizedUsers.size > 1) {\n      throw new OstiumSubgraphError(\n        'addOptimisticOpen requires an explicit user when streaming multiple addresses.',\n        OstiumSubgraphErrorCode.INVALID_PARAMS,\n      );\n    }\n    return this.defaultUser;\n  }\n\n  private optimisticTradeFromOpenParams(\n    localId: string,\n    params: OpenTradeParams,\n    submission: SubmissionResult | undefined,\n    trader: Address,\n  ): AccountTradeItem {\n    const pairId = String(params.pairId);\n    const { trade } = buildTrade(\n      {\n        a: Number(params.pairId),\n        b: params.buy,\n        p: params.price,\n        s: params.collateral,\n        l: params.leverage,\n        t: params.type,\n        tp: params.takeProfit,\n        sl: params.stopLoss,\n        d: params.isDayTrade,\n      },\n      trader,\n    );\n    const pair = this.getRawPair(pairId) ??\n      optimisticRawPair(pairId, trade.openPrice.toString(), this.options.getRawPairName(pairId));\n    const leverage = BigInt(trade.leverage);\n    const notional = (trade.collateral * leverage / 100n).toString();\n    const rawTrade: RawTrade = {\n      id: localId,\n      tradeID: localId,\n      trader,\n      pair,\n      isBuy: trade.buy,\n      isDayTrade: trade.isDayTrade,\n      isOpen: true,\n      index: '-1',\n      tradeType: 'Market',\n      collateral: trade.collateral.toString(),\n      notional,\n      tradeNotional: tradeNotionalFromOpen(pair, trade.collateral, leverage, trade.openPrice),\n      leverage: trade.leverage.toString(),\n      highestLeverage: trade.leverage.toString(),\n      openPrice: trade.openPrice.toString(),\n      stopLossPrice: trade.sl.toString(),\n      takeProfitPrice: trade.tp.toString(),\n      rollover: rolloverBaselineAtOpen(pair, trade.buy, this.latestBlockNumber),\n      timestamp: currentUnixSeconds(),\n    };\n    const confirmation: AccountTradeConfirmation = {\n      localId,\n      status: 'optimistic',\n      initiatedTx: submission?.txHash,\n      createdAt: Date.now(),\n    };\n\n    if (!this.getRawPair(pairId)) {\n      void this.loadRawPairs().then(() => {\n        if (!this.closed) void this.poll();\n      });\n    }\n\n    return {\n      keys: [localId],\n      raw: rawTrade,\n      value: formatConfirmedTrade(rawTrade, this.priceCache, this.latestBlockNumber, confirmation),\n      confirmation,\n    };\n  }\n\n  private handleMarketOpenExecuted(\n    log: MarketOpenExecutedLog,\n    retriedAfterPairLoad = false,\n  ): void {\n    const trade = log.args.t;\n    if (!trade || !this.normalizedUsers.has(trade.trader.toLowerCase())) return;\n\n    const pairId = trade.pairIndex.toString();\n    const executedOrderId = log.args.orderId?.toString();\n    if (executedOrderId && this.state.isTradeClosed(executedOrderId)) return;\n    // Absorb any optimistic overlay entry for this trader+pair. Normally the\n    // initiated event promotes it, but when that event is missed (WebSocket\n    // reconnect gap) the optimistic entry would otherwise coexist with the\n    // executed entry as a duplicate ghost that no trade-id tombstone can\n    // reach. Promotion keys it by orderId, so the upsert below replaces it.\n    if (executedOrderId) {\n      this.state.promoteOptimisticTradeByPair(pairId, {\n        orderId: executedOrderId,\n        pairId,\n        trader: trade.trader,\n      });\n    }\n    const cachedPair = this.getRawPair(pairId);\n    const pair = cachedPair ?? optimisticRawPair(\n      pairId,\n      trade.openPrice.toString(),\n      this.options.getRawPairName(pairId),\n    );\n\n    if (!cachedPair && !retriedAfterPairLoad) {\n      void this.loadRawPairs().then(() => {\n        if (this.closed) return;\n        this.handleMarketOpenExecuted(log, true);\n      });\n    }\n\n    this.latestBlockNumber = log.blockNumber ?? this.latestBlockNumber;\n    const rawTrade = this.rawTradeFromMarketOpenExecuted({\n      orderId: log.args.orderId?.toString() ?? '',\n      trade,\n      tradeNotional: log.args.tradeNotional.toString(),\n      pair,\n      blockNumber: this.latestBlockNumber,\n    });\n    const orderId = log.args.orderId?.toString();\n    const confirmation: AccountTradeConfirmation = {\n      status: 'executed',\n      orderId,\n      createdAt: Date.now(),\n    };\n    const formatted = formatConfirmedTrade(\n      rawTrade,\n      this.priceCache,\n      this.latestBlockNumber,\n      confirmation,\n    );\n\n    this.state.upsertFastTrade(\n      { keys: getTradeKeys(rawTrade), raw: rawTrade, value: formatted, confirmation },\n      orderId,\n    );\n\n    if (!cachedPair && retriedAfterPairLoad) {\n      void this.poll();\n    }\n  }\n\n  private rawTradeFromMarketOpenExecuted({\n    orderId,\n    trade,\n    tradeNotional,\n    pair,\n    blockNumber,\n  }: {\n    orderId: string;\n    trade: MarketOpenExecutedTrade;\n    tradeNotional: string;\n    pair: RawPair;\n    blockNumber: bigint | undefined;\n  }): RawTrade {\n    const leverage = BigInt(trade.leverage);\n    const notional = (trade.collateral * leverage / 100n).toString();\n\n    return {\n      id: orderId,\n      tradeID: orderId,\n      trader: trade.trader,\n      pair,\n      isBuy: trade.buy,\n      isDayTrade: trade.isDayTrade,\n      isOpen: true,\n      index: trade.index.toString(),\n      tradeType: 'Market',\n      collateral: trade.collateral.toString(),\n      notional,\n      tradeNotional,\n      leverage: trade.leverage.toString(),\n      highestLeverage: trade.leverage.toString(),\n      openPrice: trade.openPrice.toString(),\n      stopLossPrice: trade.sl.toString(),\n      takeProfitPrice: trade.tp.toString(),\n      rollover: rolloverBaselineAtOpen(pair, trade.buy, blockNumber),\n      timestamp: currentUnixSeconds(),\n    };\n  }\n\n  private getRawPair(pairId: string): RawPair | undefined {\n    const cached = this.options.getRawPair(pairId);\n    if (cached) return cached;\n\n    return this.rawPairById?.get(pairId);\n  }\n\n  private async loadRawPairs(): Promise<void> {\n    if (this.rawPairById) return;\n    if (!this.rawPairsPromise) {\n      this.rawPairsPromise = (async () => {\n        try {\n          const pairs = await this.options.fetchRawPairs();\n          if (this.closed) return;\n          this.rawPairById = new Map(pairs.map(pair => [String(pair.id), pair]));\n        } catch (error) {\n          this.emitError(error);\n        } finally {\n          this.rawPairsPromise = null;\n        }\n      })();\n    }\n    await this.rawPairsPromise;\n  }\n\n  private emit(snapshot: AccountUpdatesSnapshot): void {\n    for (const handler of this.updateHandlers) handler(cloneSnapshot(snapshot));\n  }\n\n  private emitError(error: unknown): void {\n    const normalized = error instanceof Error ? error : new Error(String(error));\n    for (const handler of this.errorHandlers) handler(normalized);\n  }\n}\n","import { CalculateDynamicPriceImpact } from '@ostium/formulae';\nimport {\n  formatUsdc,\n  formatTokens,\n  parseUsdc,\n  parseTokens,\n  parseLeverage,\n  timeElapsedSince,\n} from './decimal.js';\nimport type { RawPair } from './raw.js';\nimport { normalizePairName } from './pair-names.js';\nimport type {\n  PriceData,\n  SimSlippageForPair,\n  SimSlippageRow,\n  SimOrderbookLevel,\n  SimOrderbookResponse,\n} from '../types.js';\n\nconst EMPTY_RESULT: SimSlippageForPair = { long: [], short: [] };\n\n/** Max levels-per-side cap exposed by `getSimOrderbook`. */\nconst ORDERBOOK_MAX_LEVELS = 20;\n\n/**\n * Build log-spaced notional levels from ~capacity/3300 up to capacity.\n * The last level snaps to exactly `capacity` so the orderbook always shows the\n * full remaining open-interest as its deepest level.\n *\n * Example with 8 levels and $3.3M capacity → ≈ $1k, $10k, $50k, $100k, $250k, $1M, $2.5M, $3.3M\n */\nfunction generateLogSpacedNotionals(levels: number, capacity: number): number[] {\n  const n = Math.min(ORDERBOOK_MAX_LEVELS, Math.max(1, Math.floor(levels)));\n  if (capacity <= 0) return [];\n  if (n === 1) return [capacity];\n\n  const minNtl = Math.max(1, capacity / 3300);\n  if (minNtl >= capacity) return [capacity];\n\n  const logMin = Math.log(minNtl);\n  const logMax = Math.log(capacity);\n\n  return Array.from({ length: n }, (_, i) => {\n    if (i === n - 1) return capacity;\n    const t = i / (n - 1);\n    return Math.exp(logMin + t * (logMax - logMin));\n  });\n}\n\n/** Side capacities + bid/mid/ask BigNumber strings + cached time-elapsed for one pair. */\ninterface PairContext {\n  remLong: number;\n  remShort: number;\n  midBN: string;\n  askBN: string;\n  bidBN: string;\n  timeElapsed: string;\n}\n\nfunction buildPairContext(raw: RawPair, price: PriceData): PairContext {\n  const maxOIUsd   = formatUsdc(raw.maxOI);\n  const longOIUsd  = formatTokens(raw.longOI)  * price.mid;\n  const shortOIUsd = formatTokens(raw.shortOI) * price.mid;\n  return {\n    remLong:     Math.max(0, maxOIUsd - longOIUsd),\n    remShort:    Math.max(0, maxOIUsd - shortOIUsd),\n    midBN:       parseTokens(price.mid).toString(),\n    askBN:       parseTokens(price.ask).toString(),\n    bidBN:       parseTokens(price.bid).toString(),\n    timeElapsed: timeElapsedSince(raw),\n  };\n}\n\n/** Run `CalculateDynamicPriceImpact` for one (pair, side, ntl) tuple. */\nfunction priceImpactForLevel(\n  raw: RawPair,\n  ctx: PairContext,\n  ntl: number,\n  isBuy: boolean,\n): { priceImpactP: string; priceAfterImpact: string } {\n  return CalculateDynamicPriceImpact(\n    ctx.midBN,\n    ctx.askBN,\n    ctx.bidBN,\n    true,    // isOpen\n    isBuy,\n    parseUsdc(ntl).toString(),\n    parseLeverage(1).toString(),\n    raw.buyVolume       ?? '0',\n    raw.sellVolume      ?? '0',\n    raw.decayRate       ?? '0',\n    ctx.timeElapsed,\n    raw.netVolThreshold ?? '0',\n    raw.priceImpactK    ?? '0',\n  );\n}\n\n/**\n * Simulate the dynamic-spread slippage a long and a short trade of each\n * notional would experience on the given pair. Notionals exceeding the side's\n * remaining open-interest capacity (`maxOI − sideOI`) are dropped.\n *\n * Slippage is the per-side `priceImpactP` returned by `CalculateDynamicPriceImpact`\n * — the same formula the contract and frontend use — formatted as a percentage\n * (e.g. `\"0.5\"` = 0.5 %).\n *\n * @param liveMid  Optional override for `price.mid`. Falls back to `price.mid`.\n */\nexport function simulateSlippageForPair(\n  raw: RawPair,\n  ntls: string[],\n  price: PriceData | undefined,\n): SimSlippageForPair {\n  if (!price || !price.mid) return EMPTY_RESULT;\n  const ctx = buildPairContext(raw, price);\n\n  const compute = (isBuy: boolean, capacity: number): SimSlippageRow[] =>\n    ntls\n      .filter(ntl => {\n        const n = Number(ntl);\n        return Number.isFinite(n) && n > 0 && n <= capacity;\n      })\n      .map(ntl => {\n        const result = priceImpactForLevel(raw, ctx, Number(ntl), isBuy);\n        return { ntl, slippage: formatTokens(result.priceImpactP).toString() };\n      });\n\n  return {\n    long:  compute(true,  ctx.remLong),\n    short: compute(false, ctx.remShort),\n  };\n}\n\n/**\n * Build a simulated bid/ask orderbook for one pair using log-spaced notionals\n * from ~capacity/3300 up to the side's full remaining open-interest capacity.\n * `levels` is clamped to `[1, 20]`.\n *\n * - `asks` model long entries — `priceAfterImpact` is the price you'd buy at.\n * - `bids` model short entries — `priceAfterImpact` is the price you'd sell at.\n */\nexport function simulateOrderbookForPair(\n  raw: RawPair,\n  price: PriceData,\n  levels: number,\n): SimOrderbookResponse {\n  const safeLevels = Math.min(ORDERBOOK_MAX_LEVELS, Math.max(1, Math.floor(levels)));\n  const ctx        = buildPairContext(raw, price);\n\n  const askNtls = generateLogSpacedNotionals(safeLevels, ctx.remLong);\n  const bidNtls = generateLogSpacedNotionals(safeLevels, ctx.remShort);\n\n  const toLevel = (ntl: number, isBuy: boolean): SimOrderbookLevel => {\n    const result = priceImpactForLevel(raw, ctx, ntl, isBuy);\n    const px = formatTokens(result.priceAfterImpact);\n    return {\n      px: px.toString(),\n      sz: (px > 0 ? ntl / px : 0).toString(),\n      n:  1,\n    };\n  };\n\n  return {\n    pairId:   String(raw.id),\n    pairFrom: normalizePairName(raw.from),\n    pairTo:   normalizePairName(raw.to),\n    levels: [\n      bidNtls.map(n => toLevel(n, false)),  // bids: short entries, best (closest to mid) first\n      askNtls.map(n => toLevel(n, true)),   // asks: long entries, best (closest to mid) first\n    ],\n    time: Date.now(),\n  };\n}\n","// Pre-trade preview math.\n//\n// Every number here comes out of `@ostium/formulae` — the same package the\n// contracts and the Ostium frontend use. This module only marshals raw\n// subgraph strings into the shapes those functions expect and formats the\n// results back to human-readable numbers. Do not add trading math here; add\n// it to `@ostium/formulae` and call it from here.\n//\n// Ported from the frontend's `stores/tradeForm.tsx` + `utils/calculations.ts`,\n// so a builder's order ticket agrees with what ostium.io shows.\n\nimport {\n  CalculateDynamicPriceImpact,\n  GetEffectiveMaxLeverage,\n  GetOpeningFee,\n  GetTradeLiquidationPrice,\n  TimeUntilZeroDynamicSpread,\n  WithinExposureLimit,\n} from '@ostium/formulae';\nimport {\n  formatLeverage,\n  formatTokens,\n  formatUsdc,\n  parseLeverage,\n  parseTokens,\n  parseUsdc,\n  timeElapsedSince,\n} from './decimal.js';\nimport { normalizePairName } from './pair-names.js';\nimport { MAX_COLLATERAL_USD, MIN_OPEN_SIZE_USD } from '../../internal/precision.js';\nimport type { RawPair, RawVault } from './raw.js';\nimport type {\n  PriceData,\n  PreviewOpenTradeResult,\n  PreviewWarning,\n} from '../types.js';\n\n/** 1e12 — scales an 18-decimal token notional down to 6-decimal USDC. */\nconst PRECISION_12 = 10n ** 12n;\nconst PRECISION_18 = 10n ** 18n;\n/** Leverage carries 2 decimals on-chain. */\nconst PRECISION_2 = 100n;\n\nexport interface PreviewInput {\n  raw: RawPair;\n  price: PriceData;\n  isLong: boolean;\n  /** Gross collateral in USDC the trader is putting up. */\n  collateral: number;\n  leverage: number;\n  /** Limit/stop price. When set, it is the reference price instead of bid/ask. */\n  limitPrice?: number;\n  isDayTrade?: boolean;\n  /** Vault balance in USDC. Omitted → the exposure-limit check is skipped. */\n  vaultBalance?: number;\n  /**\n   * Builder fee in basis points, as configured on the client. Charged on\n   * notional at open, so a builder-integrated ticket that omits it understates\n   * fees and overstates everything derived from collateral.\n   */\n  builderFeeBps?: number;\n}\n\n/** Side open-interest valued in USDC (6 decimals), as `WithinExposureLimit` expects. */\nfunction oiUsdc(oiTokens: string, price: number): bigint {\n  return (BigInt(oiTokens) * parseTokens(price)) / PRECISION_18 / PRECISION_12;\n}\n\n/**\n * Blended open-fee percentage. When the order straddles the maker/taker\n * boundary the two legs are weighted by their notionals; with no size yet we\n * fall back to whichever side the trade would land on.\n */\nfunction blendedOpenFeePercent(\n  takerAbs: number,\n  makerAbs: number,\n  takerPercent: number,\n  makerPercent: number,\n  oiLong: bigint,\n  oiShort: bigint,\n  isLong: boolean,\n): number {\n  if (takerAbs + makerAbs > 0) {\n    return (makerPercent * makerAbs + takerPercent * takerAbs) / (makerAbs + takerAbs);\n  }\n\n  const delta = formatUsdc(oiLong.toString()) - formatUsdc(oiShort.toString());\n  if (delta === 0) return takerPercent;\n\n  // Trading against the imbalance makes you the maker.\n  const isMaker = (delta > 0 && !isLong) || (delta < 0 && isLong);\n  return isMaker ? makerPercent : takerPercent;\n}\n\n/** Vault balance in USDC from the raw vault entity. */\nexport function vaultBalanceUsdc(vault: RawVault): number {\n  const maxAccPnlPerToken = PRECISION_18 + BigInt(vault.rewardsPerToken);\n  const balance =\n    ((maxAccPnlPerToken - BigInt(vault.accPnlPerTokenUsed)) * BigInt(vault.shares)) / PRECISION_18;\n  return formatUsdc(balance.toString());\n}\n\n/**\n * Price the order would execute at, plus the dynamic spread it pays.\n *\n * Market orders start from the side's bid/ask and pay the imbalance spread\n * returned by `CalculateDynamicPriceImpact`. Limit orders execute at their\n * trigger price, so they show no impact.\n */\nfunction previewExecution(\n  raw: RawPair,\n  price: PriceData,\n  isLong: boolean,\n  collateral: number,\n  leverage: number,\n  limitPrice?: number,\n): { refPx: number; entryPx: number; priceImpactP: number; spreadDecaySeconds: number } {\n  const refPx = limitPrice ?? (isLong ? price.ask : price.bid);\n\n  if (limitPrice !== undefined || !collateral || !leverage) {\n    return { refPx, entryPx: refPx, priceImpactP: 0, spreadDecaySeconds: 0 };\n  }\n\n  const nowSeconds = Math.floor(Date.now() / 1000);\n  const lastUpdate = parseInt(raw.lastUpdateTimestamp ?? '0') || 0;\n  const buyVolume = raw.buyVolume ?? '0';\n  const sellVolume = raw.sellVolume ?? '0';\n  const decayRate = raw.decayRate ?? '0';\n  const netVolThreshold = raw.netVolThreshold ?? '0';\n\n  const impact = CalculateDynamicPriceImpact(\n    parseTokens(price.mid).toString(),\n    parseTokens(price.ask).toString(),\n    parseTokens(price.bid).toString(),\n    true, // isOpen\n    isLong,\n    parseUsdc(collateral).toString(),\n    parseLeverage(leverage).toString(),\n    buyVolume,\n    sellVolume,\n    decayRate,\n    timeElapsedSince(raw),\n    netVolThreshold,\n    raw.priceImpactK ?? '0',\n  );\n\n  const decay = TimeUntilZeroDynamicSpread(\n    buyVolume,\n    sellVolume,\n    lastUpdate.toString(),\n    netVolThreshold,\n    decayRate,\n    nowSeconds.toString(),\n    isLong,\n    true, // isOpen\n  );\n\n  return {\n    refPx,\n    entryPx: formatTokens(impact.priceAfterImpact) || refPx,\n    priceImpactP: formatTokens(impact.priceImpactP),\n    spreadDecaySeconds: parseInt(decay) || 0,\n  };\n}\n\n/**\n * Everything an order ticket needs to render before a trade is signed:\n * execution price, fees, resulting liquidation price, and the validity checks\n * that would otherwise revert on-chain.\n */\nexport function previewOpenTrade(input: PreviewInput): PreviewOpenTradeResult {\n  const { raw, price, isLong, collateral, leverage, limitPrice, isDayTrade = false } = input;\n\n  const { refPx, entryPx, priceImpactP, spreadDecaySeconds } = previewExecution(\n    raw,\n    price,\n    isLong,\n    collateral,\n    leverage,\n    limitPrice,\n  );\n\n  // ── Fees ───────────────────────────────────────────────────────────────\n  const safeCollateral = Number.isFinite(collateral) ? Number((collateral || 0).toFixed(6)) : 0;\n  const notionalUsdc = (parseUsdc(safeCollateral) * parseLeverage(leverage)) / PRECISION_2;\n\n  const oiLong = oiUsdc(raw.longOI, refPx);\n  const oiShort = oiUsdc(raw.shortOI, refPx);\n\n  const opening = GetOpeningFee(\n    oiLong.toString(),\n    oiShort.toString(),\n    raw.makerFeeP ?? '0',\n    raw.takerFeeP ?? '0',\n    raw.makerMaxLeverage ?? '0',\n    (isLong ? notionalUsdc : -notionalUsdc).toString(),\n    parseLeverage(leverage).toString(),\n  );\n\n  const takerFeePercent = raw.takerFeeP ? formatUsdc(raw.takerFeeP) : 0;\n  const makerFeePercent = raw.makerFeeP ? formatUsdc(raw.makerFeeP) : 0;\n  const takerNotional = formatUsdc(opening?.takerAmount ?? '0');\n  const makerNotional = formatUsdc(opening?.makerAmount ?? '0');\n\n  const openFee = formatUsdc(opening?.baseFee ?? '0');\n  const oracleFee = raw.fee?.oracleFee ? formatUsdc(raw.fee.oracleFee) : 0;\n  // Builder fee is bps of notional, charged alongside the protocol open fee.\n  const builderFeeBps = input.builderFeeBps ?? 0;\n  const notionalUsd = formatUsdc(notionalUsdc.toString());\n  const builderFee = builderFeeBps > 0 ? (notionalUsd * builderFeeBps) / 10_000 : 0;\n  const totalFees = openFee + oracleFee + builderFee;\n\n  // ── Sizing ─────────────────────────────────────────────────────────────\n  const collateralAtOpen = safeCollateral - totalFees;\n  const exposure = collateralAtOpen * leverage;\n  const positionSize = entryPx > 0 ? exposure / entryPx : 0;\n\n  // ── Leverage + liquidation ─────────────────────────────────────────────\n  // `'100'` is 1x: leverage carries 2 decimals on-chain, so a `'1'` fallback\n  // would mean 0.01x and reject every trade with \"exceeds the max 0.01x\".\n  const pairMaxLeverage =\n    raw.maxLeverage && raw.maxLeverage !== '0' ? raw.maxLeverage : raw.group?.maxLeverage ?? '100';\n  const effectiveMaxLeverageRaw = GetEffectiveMaxLeverage(\n    pairMaxLeverage,\n    raw.overnightMaxLeverage ?? '0',\n    isDayTrade,\n  );\n  const effectiveMaxLeverage = formatLeverage(effectiveMaxLeverageRaw);\n  const minLeverage = raw.group?.minLeverage ? formatLeverage(raw.group.minLeverage) : 1;\n\n  // Liquidation is quoted off the execution price, which is what the contract\n  // records as the trade's open price — rollover and funding start at zero.\n  //\n  // Collateral here is the GROSS amount, not `collateralAtOpen`. That looks\n  // inconsistent with the sizing above, and it is what the frontend does\n  // (`tradeForm.tsx` passes the same gross `collateral`), so the two agree.\n  // Do not \"fix\" this to `collateralAtOpen` without changing the frontend too.\n  let liquidationPx = 0;\n  if (entryPx > 0 && safeCollateral > 0 && leverage > 0) {\n    const liq = formatTokens(\n      GetTradeLiquidationPrice(\n        parseTokens(entryPx).toString(),\n        isLong,\n        parseUsdc(safeCollateral).toString(),\n        parseLeverage(leverage).toString(),\n        '0', // rollover — a new trade has accrued none\n        '0', // funding\n        effectiveMaxLeverageRaw,\n      ),\n    );\n    liquidationPx = liq > 0 ? liq : 0;\n  }\n\n  // ── Validity ───────────────────────────────────────────────────────────\n  const minPositionSize = raw.fee?.minLevPos ? formatUsdc(raw.fee.minLevPos) : 0;\n\n  let withinExposureLimit: boolean | undefined;\n  if (input.vaultBalance !== undefined && raw.group?.maxCollateralP) {\n    withinExposureLimit = WithinExposureLimit(\n      (isLong ? oiLong : oiShort).toString(),\n      raw.maxOI,\n      (isLong ? raw.group.longCollateral : raw.group.shortCollateral) ?? '0',\n      raw.group.maxCollateralP,\n      parseUsdc(input.vaultBalance).toString(),\n      parseUsdc(safeCollateral.toFixed(6)).toString(),\n      parseLeverage(leverage).toString(),\n    );\n  }\n\n  const warnings: PreviewWarning[] = [];\n\n  // Checked first, and not gated on a positive collateral — the guards below\n  // are (`FEES_EXCEED_COLLATERAL` needs `> 0`, `BELOW_MIN_POSITION_SIZE` needs\n  // a positive exposure), so without this a zero-collateral preview — an empty\n  // order-ticket field — came back `isValid: true` with a negative exposure.\n  if (safeCollateral < MIN_OPEN_SIZE_USD) {\n    warnings.push({\n      code: 'BELOW_MIN_COLLATERAL',\n      message: `Collateral $${safeCollateral} is below the $${MIN_OPEN_SIZE_USD} minimum to open a trade.`,\n    });\n  }\n  if (safeCollateral > MAX_COLLATERAL_USD) {\n    warnings.push({\n      code: 'ABOVE_MAX_COLLATERAL',\n      message: `Collateral $${safeCollateral} exceeds the $${MAX_COLLATERAL_USD} maximum for a single trade.`,\n    });\n  }\n\n  if (leverage > effectiveMaxLeverage) {\n    warnings.push({\n      code: 'LEVERAGE_ABOVE_MAX',\n      message: `Leverage ${leverage}x exceeds the max ${effectiveMaxLeverage}x for this pair${\n        isDayTrade ? '' : ' (open a day trade for a higher cap)'\n      }.`,\n    });\n  }\n  if (leverage > 0 && leverage < minLeverage) {\n    warnings.push({\n      code: 'LEVERAGE_BELOW_MIN',\n      message: `Leverage ${leverage}x is below the minimum ${minLeverage}x for this pair.`,\n    });\n  }\n  if (minPositionSize > 0 && exposure > 0 && exposure < minPositionSize) {\n    warnings.push({\n      code: 'BELOW_MIN_POSITION_SIZE',\n      message: `Position size $${exposure.toFixed(2)} is below the $${minPositionSize} minimum for this pair.`,\n    });\n  }\n  if (collateralAtOpen <= 0 && safeCollateral > 0) {\n    warnings.push({\n      code: 'FEES_EXCEED_COLLATERAL',\n      message: `Fees ($${totalFees.toFixed(2)}) meet or exceed the collateral provided.`,\n    });\n  }\n  if (withinExposureLimit === false) {\n    warnings.push({\n      code: 'ABOVE_EXPOSURE_LIMIT',\n      message: 'Trade exceeds the open-interest or group-collateral limit for this pair.',\n    });\n  }\n  if (price.isMarketOpen === false) {\n    warnings.push({ code: 'MARKET_CLOSED', message: 'This market is currently closed.' });\n  }\n  if (isDayTrade && price.isDayTradingClosed === true) {\n    warnings.push({\n      code: 'DAY_TRADING_CLOSED',\n      message: 'Day trading is currently closed for this pair, so a day trade cannot be opened.',\n    });\n  }\n\n  return {\n    pairId: String(raw.id),\n    pairFrom: normalizePairName(raw.from),\n    pairTo: normalizePairName(raw.to),\n    isLong,\n    midPx: String(price.mid),\n    refPx: String(refPx),\n    entryPx: String(entryPx),\n    priceImpactP: String(priceImpactP),\n    spreadDecaySeconds,\n    fees: {\n      openFee: String(openFee),\n      oracleFee: String(oracleFee),\n      builderFee: String(builderFee),\n      builderFeeBps: String(builderFeeBps),\n      total: String(totalFees),\n      openFeePercent: String(\n        blendedOpenFeePercent(\n          takerNotional,\n          makerNotional,\n          takerFeePercent,\n          makerFeePercent,\n          oiLong,\n          oiShort,\n          isLong,\n        ),\n      ),\n      takerFeePercent: String(takerFeePercent),\n      makerFeePercent: String(makerFeePercent),\n      takerNotional: String(takerNotional),\n      makerNotional: String(makerNotional),\n    },\n    collateral: String(safeCollateral),\n    collateralAtOpen: String(collateralAtOpen),\n    exposure: String(exposure),\n    positionSize: String(positionSize),\n    leverage: String(leverage),\n    liquidationPx: String(liquidationPx),\n    effectiveMaxLeverage: String(effectiveMaxLeverage),\n    minLeverage: String(minLeverage),\n    minPositionSize: String(minPositionSize),\n    isDayTrade,\n    withinExposureLimit,\n    isValid: warnings.length === 0,\n    warnings,\n  };\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { DEFAULT_SUBGRAPH_ENDPOINT, DEFAULT_SUBGRAPH_ENDPOINT_TESTNET, DEFAULT_BUILDER_API_URL } from './config.js';\nimport type { OstiumSubgraphClientConfig } from './config.js';\nimport { OstiumSubgraphError, OstiumSubgraphErrorCode } from './errors.js';\nimport { SDK_USER_AGENT } from '../internal/version.js';\nimport { retryAfterMsFromError, type RetryAfterError } from '../internal/http.js';\nimport {\n  GetPairsAndGroupsQuery,\n  GetTraderOpenTradesQuery,\n  GetAllOpenTradesQuery,\n  GetTraderActiveLimitsQuery,\n  GetAccountUpdatesSnapshotQuery,\n  buildExecutedFillsQuery,\n  buildGetOrdersQuery,\n  GetVaultQuery,\n} from './queries.js';\nimport { paginateAll } from './internal/pagination.js';\nimport {\n  chunkArray,\n  mergeOrders,\n  resolveOrderQueryFlags,\n  TRADE_ID_BATCH_SIZE,\n  validateOrderFilterParams,\n} from './internal/orders.js';\nimport { getTradePnL, EMPTY_PNL } from './internal/calculations.js';\nimport {\n  dropGhostPendingMarketOrders,\n  makePendingOrderRegisteredReader,\n  type PendingOrderRegisteredReader,\n} from './internal/pending-orders.js';\nimport { getNetworkConfig } from '../internal/contracts.js';\nimport { createPublicClient, http } from 'viem';\nimport { arbitrum, arbitrumSepolia } from 'viem/chains';\nimport { fetchLivePrices, fetchCandles, OstiumPriceStream } from './internal/pricing.js';\nimport { OstiumPositionUpdatesStream } from './internal/position-updates.js';\nimport {\n  DEFAULT_POLL_INTERVAL_MS,\n  OstiumAccountUpdatesStream,\n  extractOrderIdFromReceipt,\n  type RawAccountUpdatesSnapshot,\n  type TransactionReceiptLike,\n} from './internal/account-updates.js';\nimport { aggregateMarginSummary } from './internal/aggregations.js';\nimport {\n  formatPair,\n  formatPosition,\n  formatFill,\n  formatOrder,\n  formatOpenOrder,\n  pairMaxLeverage,\n} from './internal/formatters.js';\nimport { formatLeverage } from './internal/decimal.js';\nimport { simulateSlippageForPair, simulateOrderbookForPair } from './internal/sim-slippage.js';\nimport { previewOpenTrade as computePreviewOpenTrade, vaultBalanceUsdc } from './internal/preview.js';\nimport type { RawPair, RawTrade, RawOrder, RawLimit, RawVault } from './internal/raw.js';\nimport type { Address } from 'viem';\nimport type {\n  Pair,\n  PairsResponse,\n  AllPricesResponse,\n  Position,\n  PairPosition,\n  OpenPositionsResponse,\n  Fill,\n  Order,\n  OpenOrder,\n  PriceData,\n  GetPairsParams,\n  GetOrdersParams,\n  GetBuilderOrdersParams,\n  GetUserParams,\n  GetOpenPositionsParams,\n  GetFillsParams,\n  GetFillsByTimeParams,\n  GetSimSlippageParams,\n  SimSlippageByPairId,\n  GetSimOrderbookParams,\n  SimOrderbookResponse,\n  PreviewOpenTradeParams,\n  PreviewOpenTradeResult,\n  Candle,\n  GetCandlesParams,\n  AccountUpdatesForTrader,\n  AccountUpdatesSnapshot,\n  StreamAccountUpdatesParams,\n} from './types.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Normalize an address array into a de-duplicated `Address[]`, preserving the\n * first occurrence of each address (case-insensitive) and dropping empty entries.\n */\nfunction dedupeAddresses(input: Address[]): Address[] {\n  const seen = new Set<string>();\n  const result: Address[] = [];\n  for (const address of input) {\n    if (!address) continue;\n    const key = address.toLowerCase();\n    if (seen.has(key)) continue;\n    seen.add(key);\n    result.push(address);\n  }\n  return result;\n}\n\n/**\n * How far back the account snapshot fetches executed close/liquidation orders.\n * Must cover the fast-overlay TTL so any ghost entry can still be tombstoned.\n */\nconst CLOSED_ORDER_LOOKBACK_MS = 15 * 60 * 1000;\nconst SHORT_CACHE_TTL_MS = 5_000;\n/** Vault balance moves slowly and only gates a limit check — cache it longer. */\nconst VAULT_CACHE_TTL_MS = 60_000;\n\ninterface TimedPromiseCache<T> {\n  expiresAt: number;\n  promise: Promise<T>;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Client\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class OstiumSubgraphClient {\n  private readonly gql: GraphQLClient;\n  private readonly builderApiUrl: string;\n  private readonly testnet: boolean;\n  private readonly alchemyApiKey?: string;\n\n  /** Cached pair-name (`${from}/${to}`) → `pairId` map. Refreshed lazily. */\n  private pairIdCache: Map<string, string> | null = null;\n  private pendingOrderReader: PendingOrderRegisteredReader | null = null;\n  /** Cached `pairId` → `\"FROM-TO\"` in raw subgraph dash format (used for OHLC API). */\n  private pairRawNameCache: Map<string, string> | null = null;\n  /** Cached `pairId` → full raw pair metadata for event overlays. */\n  private rawPairCache: Map<string, RawPair> | null = null;\n  private rawPairsMemo: TimedPromiseCache<RawPair[]> | null = null;\n  private livePricesMemo: TimedPromiseCache<Record<string, PriceData>> | null = null;\n  private vaultBalanceMemo: TimedPromiseCache<number> | null = null;\n\n  private constructor(\n    gql: GraphQLClient,\n    builderApiUrl: string,\n    opts: { testnet: boolean; alchemyApiKey?: string },\n  ) {\n    this.gql = gql;\n    this.builderApiUrl = builderApiUrl;\n    this.testnet = opts.testnet;\n    this.alchemyApiKey = opts.alchemyApiKey;\n  }\n\n  /**\n   * Create a client connected to the Ostium subgraph.\n   *\n   * Construction is network-free: the pair-id cache used by `streamPrices`,\n   * `getCandles`, and `getAllPrices` is fetched lazily on first use, so\n   * build-only consumers (synchronous `get*Tx` encoders) never pay a subgraph\n   * round-trip.\n   *\n   * ```ts\n   * // Mainnet (default)\n   * const client = await OstiumSubgraphClient.create();\n   *\n   * // Testnet (Arbitrum Sepolia)\n   * const client = await OstiumSubgraphClient.create({ testnet: true });\n   * ```\n   */\n  static async create(config: OstiumSubgraphClientConfig = {}): Promise<OstiumSubgraphClient> {\n    const endpoint = config.endpoint\n      ?? (config.testnet ? DEFAULT_SUBGRAPH_ENDPOINT_TESTNET : DEFAULT_SUBGRAPH_ENDPOINT);\n\n    if (!endpoint.startsWith('http')) {\n      throw new OstiumSubgraphError(\n        `Invalid subgraph endpoint: ${endpoint}`,\n        OstiumSubgraphErrorCode.INVALID_CONFIG,\n      );\n    }\n\n    const client = new OstiumSubgraphClient(\n      new GraphQLClient(endpoint, {\n        headers: { 'User-Agent': SDK_USER_AGENT },\n      }),\n      config.builderApiUrl ?? DEFAULT_BUILDER_API_URL,\n      {\n        testnet: config.testnet ?? false,\n        alchemyApiKey: config.alchemyApiKey,\n      },\n    );\n    return client;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Pairs\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * All trading pairs with computed `minSz`/`maxBSz`/`maxSSz`, live prices, and\n   * market-status flags. Pass `pairIds` to restrict to a subset.\n   */\n  async getPairs(params?: GetPairsParams): Promise<PairsResponse> {\n    const [rawPairs, prices] = await Promise.all([\n      this.fetchRawPairs(),\n      this.fetchLivePricesSafe(),\n    ]);\n    this.refreshPairIdCache(rawPairs);\n\n    let filtered = rawPairs;\n    if (params?.pairIds && params.pairIds.length > 0) {\n      const requested = new Set(params.pairIds.map(String));\n      filtered = rawPairs.filter(p => requested.has(String(p.id)));\n    }\n\n    return {\n      pairs: filtered.map(p =>\n        formatPair(p, prices[`${p.from}/${p.to}`], params?.builderFeeBps ?? 0),\n      ),\n    };\n  }\n\n  /** Live mid/bid/ask prices keyed by `pairId`. */\n  async getAllPrices(): Promise<AllPricesResponse> {\n    const [pairIdMap, prices] = await Promise.all([\n      this.ensurePairIdCache(),\n      this.fetchLivePricesSafe(),\n    ]);\n\n    const out: AllPricesResponse['prices'] = {};\n    for (const [name, price] of Object.entries(prices)) {\n      const id = pairIdMap.get(name);\n      if (!id) continue;\n      out[id] = {\n        ask: price.ask.toString(),\n        bid: price.bid.toString(),\n        mid: price.mid.toString(),\n      };\n    }\n    return { prices: out };\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Open positions\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Open positions for a trader, sorted newest first, with margin summary.\n   *\n   * - Fetches live prices automatically.\n   * - `blockNumber` is required for live PnL (rollover projection). When omitted,\n   *   PnL fields are zeroed.\n   */\n  async getOpenPositions(params: GetOpenPositionsParams): Promise<OpenPositionsResponse> {\n    const { user, blockNumber, limit = Infinity, skip: initialSkip = 0 } = params;\n    const isGlobal = user === 'ALL';\n\n    const [trades, prices] = await Promise.all([\n      paginateAll<RawTrade>(\n        async (skip, first) => {\n          if (isGlobal) {\n            const data = await this.query<{ trades: RawTrade[] }>(\n              GetAllOpenTradesQuery,\n              { skip, first },\n            );\n            return data.trades;\n          }\n          const data = await this.query<{ trades: RawTrade[] }>(\n            GetTraderOpenTradesQuery,\n            { trader: user.toLowerCase(), skip, first },\n          );\n          return data.trades;\n        },\n        1000,\n        limit,\n        initialSkip,\n      ),\n      this.fetchLivePricesSafe(),\n    ]);\n\n    const pairPositions: PairPosition[] = trades.map(trade => {\n      const price = prices[`${trade.pair.from}/${trade.pair.to}`];\n      const pnl   = price && blockNumber ? getTradePnL(trade, price, blockNumber) : EMPTY_PNL;\n\n      const maxLev = trade.isDayTrade ? formatLeverage(trade.pair.overnightMaxLeverage) : pairMaxLeverage(trade.pair);\n      return formatPosition(trade, price, pnl, maxLev);\n    });\n\n    const marginSummary = aggregateMarginSummary(pairPositions);\n\n    return {\n      pairPositions,\n      marginSummary,\n      time: Date.now(),\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Fills\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Executed fills, sorted by `executedAt desc`.\n   *\n   * - `user`: pass an address to scope to a single trader, or `'ALL'` to fetch\n   *   fills across every trader (no trader filter).\n   * - `pairId`: optional pair filter — when set, only fills on this pair are returned.\n   */\n  async getFills(params: GetFillsParams): Promise<Fill[]> {\n    return this.fetchFills(params, undefined);\n  }\n\n  /** Executed fills within an inclusive time range (Unix ms). Same filters as `getFills`. */\n  async getFillsByTime(params: GetFillsByTimeParams): Promise<Fill[]> {\n    const endTime = params.endTime ?? Date.now();\n    return this.fetchFills(params, {\n      startSec: Math.floor(params.startTime / 1000).toString(),\n      endSec:   Math.floor(endTime           / 1000).toString(),\n    });\n  }\n\n  private async fetchFills(\n    filters: GetFillsParams,\n    timeRange: { startSec: string; endSec: string } | undefined,\n  ): Promise<Fill[]> {\n    const hasTrader = filters.user !== 'ALL';\n    const hasPairId = filters.pairId !== undefined;\n    const limit     = filters.limit ?? 1000;\n    const document  = buildExecutedFillsQuery({\n      hasTrader,\n      hasPairId,\n      hasTimeRange: timeRange !== undefined,\n    });\n\n    const orders = await paginateAll<RawOrder>(\n      async (skip, first) => {\n        const variables: Record<string, unknown> = { skip, first };\n        if (hasTrader) variables.trader = (filters.user as string).toLowerCase();\n        if (hasPairId) variables.pairId = String(filters.pairId);\n        if (timeRange) {\n          variables.startSec = timeRange.startSec;\n          variables.endSec   = timeRange.endSec;\n        }\n        const data = await this.query<{ orders: RawOrder[] }>(document, variables);\n        return data.orders;\n      },\n      1000,\n      limit,\n    );\n    return orders.map(formatFill);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Open limit orders\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /** Active limit orders for a trader, sorted by `updatedAt desc`. */\n  async getOpenOrders({ user }: GetUserParams): Promise<OpenOrder[]> {\n    const limits = await paginateAll<RawLimit>(async (skip, first) => {\n      const data = await this.query<{ limits: RawLimit[] }>(\n        GetTraderActiveLimitsQuery,\n        { trader: user.toLowerCase(), skip, first },\n      );\n      return data.limits;\n    });\n    return limits.map(formatOpenOrder);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Orders (any status)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Fetch orders at any status — pending, executed, or cancelled.\n   *\n   * - Pass `initiatedTxHashes` (e.g. `[result.txHash]` from `openTrade` / `closeTrade`)\n   *   to poll by the subgraph `initiatedTx` field.\n   * - Pass `orderIds` to look up by on-chain order id (mutually exclusive with\n   *   `initiatedTxHashes`).\n   * - Pass `user: 'ALL'` to fetch global orders without a trader filter.\n   * - Pass `builder`, `isPending`, `isCanceled`, `pairIds`, or `start` / `end` to filter the result set.\n   */\n  async getOrders(params: GetOrdersParams = {}): Promise<Order[]> {\n    validateOrderFilterParams(params);\n    return this.fetchOrders(params, { max: params.limit ?? 100 });\n  }\n\n  /**\n   * Fetch orders routed through a builder, including sibling close orders on the\n   * same positions. The subgraph only stores `builder` on open orders; this method\n   * supplements phase-1 builder-tagged orders with phase-2 orders matched by `pid`.\n   *\n   * `limit` caps phase-1 builder-tagged orders only. Phase-2 sibling orders are\n   * appended without a cap, so the merged result may exceed `limit`. Pass `start`\n   * and/or `end` to filter both phases by execution time.\n   */\n  async getBuilderOrders(builder: Address, params: GetBuilderOrdersParams = {}): Promise<Order[]> {\n    validateOrderFilterParams(params);\n    const normalizedBuilder = builder.toLowerCase();\n    const limit = params.limit ?? 100;\n\n    const builderOrders = await this.fetchOrders(\n      { ...params, builder: normalizedBuilder },\n      { max: limit },\n    );\n    if (builderOrders.length === 0) return [];\n\n    const pids = [...new Set(builderOrders.map(o => o.pid).filter(Boolean))];\n    const oids = builderOrders.map(o => o.oid);\n\n    const siblingOrders = await this.fetchOrdersByTradeIds({\n      tradeIds: pids,\n      excludeIds: oids,\n      filters: params,\n    });\n\n    const stampedSiblings = siblingOrders.map(o => ({ ...o, builder: normalizedBuilder }));\n    return mergeOrders(builderOrders, stampedSiblings);\n  }\n\n  private async fetchOrders(\n    params: GetOrdersParams,\n    pagination: { max: number },\n    extra?: { tradeIds: string[]; excludeIds: string[] },\n  ): Promise<Order[]> {\n    const flags = resolveOrderQueryFlags(params, extra);\n    const document = buildGetOrdersQuery({\n      hasOrderIds: flags.hasOrderIds,\n      hasInitiatedTxHashes: flags.hasInitiatedTxHashes,\n      hasTrader: flags.hasTrader,\n      hasBuilder: flags.hasBuilder,\n      hasIsPending: flags.hasIsPending,\n      hasIsCancelled: flags.hasIsCancelled,\n      hasPairIds: flags.hasPairIds,\n      hasTradeIds: flags.hasTradeIds,\n      hasExcludeIds: flags.hasExcludeIds,\n      hasExecutedStart: flags.hasExecutedStart,\n      hasExecutedEnd: flags.hasExecutedEnd,\n    });\n\n    const orders = await paginateAll<RawOrder>(\n      async (skip, first) => {\n        const variables = this.buildOrderQueryVariables(params, flags, extra);\n        variables.skip = skip;\n        variables.first = first;\n        const data = await this.query<{ orders: RawOrder[] }>(document, variables);\n        return data.orders;\n      },\n      100,\n      pagination.max,\n    );\n\n    // Ghost pending market orders (subgraph missed the terminal event, chain\n    // has nothing to cancel) are dropped; stale-but-registered ones stay\n    // visible so the user cancels them and frees their pending-order slots.\n    const live = await dropGhostPendingMarketOrders(orders, this.pendingOrderRegisteredReader());\n    return live.map(formatOrder);\n  }\n\n  private pendingOrderRegisteredReader(): PendingOrderRegisteredReader {\n    if (!this.pendingOrderReader) {\n      const chain = this.testnet ? arbitrumSepolia : arbitrum;\n      const rpcUrl = this.testnet\n        ? 'https://sepolia-rollup.arbitrum.io/rpc'\n        : 'https://arb1.arbitrum.io/rpc';\n      this.pendingOrderReader = makePendingOrderRegisteredReader(\n        createPublicClient({ chain, transport: http(rpcUrl) }),\n        getNetworkConfig(this.testnet).contracts.tradingStorage,\n      );\n    }\n    return this.pendingOrderReader;\n  }\n\n  private async fetchOrdersByTradeIds(opts: {\n    tradeIds: string[];\n    excludeIds: string[];\n    filters: GetBuilderOrdersParams;\n  }): Promise<Order[]> {\n    const batches = chunkArray(opts.tradeIds, TRADE_ID_BATCH_SIZE);\n    const batchResults: Order[][] = [];\n\n    for (const tradeIds of batches) {\n      const batchOrders = await this.fetchOrders(\n        { ...opts.filters, limit: undefined },\n        { max: Infinity },\n        { tradeIds, excludeIds: opts.excludeIds },\n      );\n      batchResults.push(batchOrders);\n    }\n\n    return mergeOrders(...batchResults);\n  }\n\n  private buildOrderQueryVariables(\n    params: GetOrdersParams,\n    flags: ReturnType<typeof resolveOrderQueryFlags>,\n    extra?: { tradeIds?: string[]; excludeIds?: string[] },\n  ): Record<string, unknown> {\n    const variables: Record<string, unknown> = {};\n    if (flags.hasOrderIds) variables.ids = params.orderIds!.map(String);\n    if (flags.hasInitiatedTxHashes) {\n      variables.txHashes = params.initiatedTxHashes!.map(h =>\n        typeof h === 'string' ? h.toLowerCase() : h,\n      );\n    }\n    if (flags.hasTrader) variables.trader = (params.user as string).toLowerCase();\n    if (flags.hasBuilder) variables.builder = params.builder!.toLowerCase();\n    if (flags.hasIsPending) variables.isPending = params.isPending;\n    if (flags.hasIsCancelled) variables.isCancelled = flags.isCancelled;\n    if (flags.hasPairIds) variables.pairIds = params.pairIds!.map(String);\n    if (flags.hasTradeIds) variables.tradeIds = extra!.tradeIds!;\n    if (flags.hasExcludeIds) variables.excludeIds = extra!.excludeIds!;\n    if (flags.hasExecutedStart) {\n      variables.executedStartSec = String(params.start!);\n    }\n    if (flags.hasExecutedEnd) {\n      variables.executedEndSec = String(params.end!);\n    }\n    return variables;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Simulated slippage\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Simulate the dynamic-spread slippage a long and a short entry of each\n   * notional would experience on the given pairs. Notionals exceeding the\n   * side's remaining open-interest capacity (`maxOI − sideOI`) are dropped.\n   *\n   * Computed via `CalculateDynamicPriceImpact` from `@ostium/formulae` using\n   * the pair's live OI / decay / threshold params + the current bid/mid/ask\n   * from the live-prices feed (collateral = `ntl`, leverage = 1).\n   *\n   * ```ts\n   * const sim = await client.getSimSlippage({\n   *   pairIds: ['0', '1'],\n   *   ntls:    ['10000', '100000', '1000000'],\n   * });\n   * // → { '0': { long: [{ ntl, slippage }...], short: [...] }, '1': ... }\n   * ```\n   */\n  async getSimSlippage(params: GetSimSlippageParams): Promise<SimSlippageByPairId> {\n    const [rawPairs, prices] = await Promise.all([\n      this.fetchRawPairs(),\n      this.fetchLivePricesSafe(),\n    ]);\n    this.refreshPairIdCache(rawPairs);\n\n    const requested = new Set(params.pairIds.map(String));\n    const out: SimSlippageByPairId = {};\n    for (const pair of rawPairs) {\n      const id = String(pair.id);\n      if (!requested.has(id)) continue;\n      const price = prices[`${pair.from}/${pair.to}`];\n      out[id] = simulateSlippageForPair(pair, params.ntls, price);\n    }\n    return out;\n  }\n\n  /**\n   * Build a synthetic bid/ask orderbook for a single pair using the on-chain\n   * dynamic-spread params. Each side gets up to `levels` (capped at 20)\n   * exponentially-spaced notional levels (`[1, 2, 3, 5] × 10ⁿ`), stopping at\n   * the side's remaining open-interest capacity.\n   *\n   * ```ts\n   * const ob = await client.getSimOrderbook({ pairId: '0', levels: 20 });\n   * // ob.asks: long-entry levels (you'd buy at `px`)\n   * // ob.bids: short-entry levels (you'd sell at `px`)\n   * ```\n   */\n  async getSimOrderbook(params: GetSimOrderbookParams): Promise<SimOrderbookResponse> {\n    const targetId = String(params.pairId);\n    const levels   = params.levels ?? 20;\n\n    const [rawPairs, prices] = await Promise.all([\n      this.fetchRawPairs(),\n      this.fetchLivePricesSafe(),\n    ]);\n    this.refreshPairIdCache(rawPairs);\n\n    const pair = rawPairs.find(p => String(p.id) === targetId);\n    if (!pair) {\n      throw new OstiumSubgraphError(\n        `Pair ${targetId} not found in subgraph response`,\n        OstiumSubgraphErrorCode.NOT_FOUND,\n      );\n    }\n\n    const price = prices[`${pair.from}/${pair.to}`];\n    if (!price || !price.mid) {\n      throw new OstiumSubgraphError(\n        `No live price available for ${pair.from}/${pair.to}`,\n        OstiumSubgraphErrorCode.NOT_FOUND,\n      );\n    }\n\n    return simulateOrderbookForPair(pair, price, levels);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Pre-trade preview\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Preview a trade before signing it: execution price after dynamic spread,\n   * the fee breakdown, collateral left backing the position, resulting\n   * liquidation price, and the validity checks that would otherwise revert\n   * on-chain.\n   *\n   * Every number comes from `@ostium/formulae` — the same math the contracts\n   * and ostium.io run — so an order ticket built on this agrees with what the\n   * trader sees on the official frontend.\n   *\n   * ```ts\n   * const preview = await client.previewOpenTrade({\n   *   pairId: 0, isLong: true, collateral: 100, leverage: 10,\n   * });\n   *\n   * preview.entryPx;          // '95234.12'  — after spread\n   * preview.fees.total;       // '0.32'      — deducted from collateral\n   * preview.liquidationPx;    // '86104.55'\n   * preview.isValid;          // false if `warnings` is non-empty\n   * ```\n   *\n   * Pass `limitPrice` to price a limit/stop order instead of a market order;\n   * limit orders execute at their trigger, so they show no dynamic spread.\n   */\n  async previewOpenTrade(params: PreviewOpenTradeParams): Promise<PreviewOpenTradeResult> {\n    const targetId = String(params.pairId);\n\n    // Reject nonsense before three network round-trips. Negative values would\n    // otherwise reach the formulas and return a confident, wrong preview with\n    // `isValid: true`; non-finite ones throw inside `parseUnits`.\n    for (const [name, value] of [\n      ['collateral', params.collateral],\n      ['leverage', params.leverage],\n    ] as const) {\n      if (!Number.isFinite(value) || value < 0) {\n        throw new OstiumSubgraphError(\n          `previewOpenTrade: ${name} must be a non-negative finite number (received ${value})`,\n          OstiumSubgraphErrorCode.INVALID_PARAMS,\n        );\n      }\n    }\n    if (\n      params.limitPrice !== undefined &&\n      (!Number.isFinite(params.limitPrice) || params.limitPrice <= 0)\n    ) {\n      throw new OstiumSubgraphError(\n        `previewOpenTrade: limitPrice must be a positive finite number (received ${params.limitPrice})`,\n        OstiumSubgraphErrorCode.INVALID_PARAMS,\n      );\n    }\n\n    const [rawPairs, prices, vaultBalance] = await Promise.all([\n      this.fetchRawPairs(),\n      this.fetchLivePricesSafe(),\n      this.fetchVaultBalanceSafe(),\n    ]);\n    this.refreshPairIdCache(rawPairs);\n\n    const raw = rawPairs.find(p => String(p.id) === targetId);\n    if (!raw) {\n      throw new OstiumSubgraphError(\n        `Pair ${targetId} not found in subgraph response`,\n        OstiumSubgraphErrorCode.NOT_FOUND,\n      );\n    }\n\n    const price = prices[`${raw.from}/${raw.to}`];\n    if (!price || !price.mid) {\n      throw new OstiumSubgraphError(\n        `No live price available for ${raw.from}/${raw.to}`,\n        OstiumSubgraphErrorCode.NOT_FOUND,\n      );\n    }\n\n    return computePreviewOpenTrade({\n      raw,\n      price,\n      isLong: params.isLong,\n      collateral: params.collateral,\n      leverage: params.leverage,\n      limitPrice: params.limitPrice,\n      isDayTrade: params.isDayTrade,\n      vaultBalance,\n      builderFeeBps: params.builderFeeBps,\n    });\n  }\n\n  /**\n   * Protocol vault balance in USDC. This is the liquidity backing trader PnL,\n   * and it caps how much open interest and group collateral a pair can take.\n   */\n  async getVaultBalance(): Promise<number> {\n    const now = Date.now();\n    if (this.vaultBalanceMemo && now < this.vaultBalanceMemo.expiresAt) {\n      return this.vaultBalanceMemo.promise;\n    }\n\n    const promise = this.query<{ vault: RawVault | null }>(GetVaultQuery)\n      .then(data => {\n        // A missing vault is an unknown balance, not a zero one. Returning 0\n        // would make `WithinExposureLimit` reject every non-zero trade; the\n        // safe wrapper turns this throw into `withinExposureLimit: undefined`.\n        if (!data.vault) {\n          throw new OstiumSubgraphError(\n            'Vault not found in subgraph response',\n            OstiumSubgraphErrorCode.NOT_FOUND,\n          );\n        }\n        return vaultBalanceUsdc(data.vault);\n      })\n      .catch(error => {\n        if (this.vaultBalanceMemo?.promise === promise) this.vaultBalanceMemo = null;\n        throw error;\n      });\n\n    this.vaultBalanceMemo = { expiresAt: now + VAULT_CACHE_TTL_MS, promise };\n    return promise;\n  }\n\n  /**\n   * `getVaultBalance` that swallows failures — the preview degrades to\n   * skipping the exposure-limit check rather than failing outright.\n   */\n  private async fetchVaultBalanceSafe(): Promise<number | undefined> {\n    try {\n      return await this.getVaultBalance();\n    } catch {\n      return undefined;\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // OHLC candles\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Fetch OHLC candles for a pair.\n   *\n   * `pairId` maps to the raw subgraph pair name internally (e.g. pair `0` →\n   * `\"BTC-USD\"`). `from` / `to` are Unix milliseconds; `resolution` is one of\n   * `\"1\"`, `\"5\"`, `\"15\"`, `\"60\"`, `\"240\"`, `\"1D\"`. Pass `sets` to fetch\n   * multiple candle pages and return them as one flattened array.\n   *\n   * ```ts\n   * const candles = await client.getCandles({\n   *   pairId: 0,\n   *   from: Date.now() - 7 * 86_400_000,\n   *   resolution: '1D',\n   *   sets: 3,\n   * });\n   * ```\n   */\n  async getCandles(params: GetCandlesParams): Promise<Candle[]> {\n    const sets = params.sets ?? 1;\n    if (!Number.isInteger(sets) || sets < 1) {\n      throw new OstiumSubgraphError(\n        'getCandles: sets must be a positive integer',\n        OstiumSubgraphErrorCode.INVALID_PARAMS,\n      );\n    }\n\n    const rawPair = await this.ensurePairRawName(params.pairId);\n    return fetchCandles(\n      this.builderApiUrl,\n      rawPair,\n      params.from,\n      params.to ?? Date.now(),\n      params.resolution,\n      sets,\n    );\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Live price stream (WebSocket)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Open a WebSocket connection to the live price stream.\n   *\n   * Optionally filter to a subset of pairs by `pairId` — same values as returned by\n   * `getPairs()`. When provided, the client sends `{ type: \"subscribe\", pairs }` on\n   * `open` (no `?pairs=` query on the URL). Omit `pairIds` to receive the full feed.\n   *\n   * The returned `OstiumPriceStream` fires an initial `snapshot` event with all\n   * cached ticks, then a `tick` event on every update. `PriceTick.from` / `.to`\n   * are normalized display names (e.g. `\"WTI\"` not `\"CL\"`).\n   *\n   * ```ts\n   * const stream = client.streamPrices([0, 1]);  // BTC and ETH by pairId\n   *\n   * stream.onOpen(() => console.log('connected'));\n   * stream.onSnapshot(ticks => console.log('snapshot', ticks.length));\n   * stream.onTick(tick => console.log(tick.pair, tick.mid));\n   *\n   * // Dynamically add / remove by pairId:\n   * stream.subscribe([2]);\n   * stream.unsubscribe([0]);\n   * stream.close();\n   * ```\n   *\n   * Requires a runtime with native `WebSocket` (Node.js 18+, Bun, browsers). Bun’s\n   * `WebSocket` may fail some `https://` upgrades (e.g. CloudFront); use Node if so.\n  */\n  streamPrices(pairIds?: Array<string | number>): OstiumPriceStream {\n    const cache = this.pairRawNameCache ?? new Map<string, string>();\n    this.pairRawNameCache = cache;\n\n    // Construction no longer prefetches the pair list, so the cache may be\n    // cold here. The stream server pushes every pair until a filter is set;\n    // connect immediately, warm the cache in the background, and apply the\n    // requested filter once ids can resolve to raw names.\n    if (pairIds && !this.pairIdCache) {\n      const stream = OstiumPriceStream.connect(this.builderApiUrl, undefined, cache);\n      void this.ensurePairIdCache()\n        .then(() => { stream.subscribe(pairIds); })\n        .catch(() => {});\n      return stream;\n    }\n\n    const rawNames = pairIds?.map(id => {\n      const name = cache.get(String(id));\n      if (!name) throw new OstiumSubgraphError(`Pair ${id} not found`, OstiumSubgraphErrorCode.NOT_FOUND);\n      return name;\n    });\n    return OstiumPriceStream.connect(this.builderApiUrl, rawNames, cache);\n  }\n\n  /**\n   * Stream price-driven updates for an existing `getOpenPositions()` response.\n   *\n   * The SDK subscribes only to the unique pairs present in `initial.pairPositions`,\n   * recalculates price-sensitive fields for affected positions on each tick, and\n   * emits the full updated response.\n   *\n   * Pass an existing `priceStream` to reuse a websocket connection your app has\n   * already opened. Omit it to let the SDK open and manage a dedicated\n   * connection for the tracked pair ids.\n   */\n  streamPositionUpdates(\n    initial: OpenPositionsResponse,\n    priceStream?: OstiumPriceStream,\n  ): OstiumPositionUpdatesStream {\n    const pairIds = [...new Set(initial.pairPositions.map(({ position }) => String(position.pairId)))];\n    if (pairIds.length === 0) {\n      return new OstiumPositionUpdatesStream(initial, []);\n    }\n    return new OstiumPositionUpdatesStream(initial, pairIds, priceStream ?? this.streamPrices(pairIds));\n  }\n\n  /**\n   * Stream low-latency account confirmations.\n   *\n   * The stream polls the account-level subgraph snapshot for pending market\n   * orders, active limit/stop orders, and open trades, then overlays Alchemy\n   * contract logs so opens/closes appear before the subgraph catches up.\n   */\n  streamAccountUpdates(\n    params: StreamAccountUpdatesParams & { user: Address[] },\n  ): OstiumAccountUpdatesStream {\n    const alchemyApiKey = params.alchemyApiKey ?? this.alchemyApiKey;\n    if (!alchemyApiKey) {\n      throw new OstiumSubgraphError(\n        'streamAccountUpdates requires alchemyApiKey in client config or params.',\n        OstiumSubgraphErrorCode.INVALID_CONFIG,\n      );\n    }\n\n    const pollIntervalMs = params.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n    if (!Number.isInteger(pollIntervalMs) || pollIntervalMs <= 0) {\n      throw new OstiumSubgraphError(\n        'streamAccountUpdates pollIntervalMs must be a positive integer.',\n        OstiumSubgraphErrorCode.INVALID_CONFIG,\n      );\n    }\n\n    if (!Array.isArray(params.user)) {\n      throw new OstiumSubgraphError(\n        'streamAccountUpdates user must be an array of trader addresses.',\n        OstiumSubgraphErrorCode.INVALID_PARAMS,\n      );\n    }\n\n    const users = dedupeAddresses(params.user);\n    if (users.length === 0) {\n      throw new OstiumSubgraphError(\n        'streamAccountUpdates requires at least one trader address.',\n        OstiumSubgraphErrorCode.INVALID_PARAMS,\n      );\n    }\n\n    return new OstiumAccountUpdatesStream({\n      users,\n      testnet: this.testnet,\n      alchemyApiKey,\n      pollIntervalMs,\n      fetchRawSnapshot: () => this.fetchRawAccountUpdatesSnapshot(users),\n      fetchRawPairs: async () => {\n        const pairs = await this.fetchRawPairs();\n        this.refreshPairIdCache(pairs);\n        return pairs;\n      },\n      fetchLivePrices: () => this.fetchLivePricesSafe({ throwOnError: true }),\n      openPriceStream: () => this.streamPrices(),\n      getRawPairName: pairId => this.pairRawNameCache?.get(String(pairId)),\n      getRawPair: pairId => this.rawPairCache?.get(String(pairId)),\n      initialRawPairs: this.rawPairCache ? [...this.rawPairCache.values()] : undefined,\n    });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Internal — fetchers, cache, query wrapper\n  // ─────────────────────────────────────────────────────────────────────────\n\n  private async fetchRawPairs(options: { force?: boolean } = {}): Promise<RawPair[]> {\n    const now = Date.now();\n    if (!options.force && this.rawPairsMemo && now < this.rawPairsMemo.expiresAt) {\n      return this.rawPairsMemo.promise;\n    }\n\n    const promise = this.query<{ pairs: RawPair[] }>(GetPairsAndGroupsQuery)\n      .then(data => {\n        this.refreshPairIdCache(data.pairs);\n        return data.pairs;\n      })\n      .catch(error => {\n        if (this.rawPairsMemo?.promise === promise) this.rawPairsMemo = null;\n        throw error;\n      });\n\n    this.rawPairsMemo = {\n      expiresAt: now + SHORT_CACHE_TTL_MS,\n      promise,\n    };\n    return promise;\n  }\n\n  private async fetchRawAccountUpdatesSnapshot(users: Address[]): Promise<RawAccountUpdatesSnapshot> {\n    const first = 1000;\n    const traders = users.map(user => user.toLowerCase());\n    // Recently executed close/liquidation orders double as tombstones for fast\n    // overlay entries whose close event was missed (ghost-position fix).\n    const closedSince = Math.floor((Date.now() - CLOSED_ORDER_LOOKBACK_MS) / 1000).toString();\n\n    // One batched query for all traders — `trader_in` filters server-side, so a\n    // multi-user stream normally costs a single subgraph request per poll.\n    const batched = await this.query<RawAccountUpdatesSnapshot>(\n      GetAccountUpdatesSnapshotQuery,\n      { traders, first, closedSince },\n    );\n\n    // A full page means the shared 1000-row window may have truncated one\n    // trader's rows — only then fall back to per-user queries so a busy\n    // account cannot starve the others (the pre-0.5 behavior).\n    const saturated =\n      batched.orders.length >= first ||\n      batched.limits.length >= first ||\n      batched.trades.length >= first ||\n      (batched.closedOrders?.length ?? 0) >= first;\n    if (users.length === 1 || !saturated) return batched;\n\n    const snapshots = await Promise.all(\n      traders.map(trader =>\n        this.query<RawAccountUpdatesSnapshot>(\n          GetAccountUpdatesSnapshotQuery,\n          { traders: [trader], first, closedSince },\n        ),\n      ),\n    );\n    return {\n      orders: snapshots.flatMap(snapshot => snapshot.orders),\n      limits: snapshots.flatMap(snapshot => snapshot.limits),\n      trades: snapshots.flatMap(snapshot => snapshot.trades),\n      closedOrders: snapshots.flatMap(snapshot => snapshot.closedOrders ?? []),\n    };\n  }\n\n  private refreshPairIdCache(rawPairs: RawPair[]): void {\n    const pairIdCache = this.pairIdCache ?? new Map<string, string>();\n    pairIdCache.clear();\n    for (const pair of rawPairs) {\n      pairIdCache.set(`${pair.from}/${pair.to}`, String(pair.id));\n    }\n    this.pairIdCache = pairIdCache;\n\n    const pairRawNameCache = this.pairRawNameCache ?? new Map<string, string>();\n    pairRawNameCache.clear();\n    for (const pair of rawPairs) {\n      pairRawNameCache.set(String(pair.id), `${pair.from}-${pair.to}`);\n    }\n    this.pairRawNameCache = pairRawNameCache;\n\n    const rawPairCache = this.rawPairCache ?? new Map<string, RawPair>();\n    rawPairCache.clear();\n    for (const pair of rawPairs) {\n      rawPairCache.set(String(pair.id), pair);\n    }\n    this.rawPairCache = rawPairCache;\n  }\n\n  private async ensurePairIdCache(): Promise<Map<string, string>> {\n    if (this.pairIdCache) return this.pairIdCache;\n    this.refreshPairIdCache(await this.fetchRawPairs());\n    return this.pairIdCache!;\n  }\n\n  private async ensurePairRawName(pairId: string | number): Promise<string> {\n    if (!this.pairRawNameCache) {\n      this.refreshPairIdCache(await this.fetchRawPairs());\n    }\n    const name = this.pairRawNameCache!.get(String(pairId));\n    if (!name) {\n      throw new OstiumSubgraphError(\n        `Pair ${pairId} not found`,\n        OstiumSubgraphErrorCode.NOT_FOUND,\n      );\n    }\n    return name;\n  }\n\n  private async fetchLivePricesCached(options: { force?: boolean } = {}): Promise<Record<string, PriceData>> {\n    const now = Date.now();\n    if (!options.force && this.livePricesMemo && now < this.livePricesMemo.expiresAt) {\n      return this.livePricesMemo.promise;\n    }\n\n    const promise = fetchLivePrices(this.builderApiUrl).catch(error => {\n      if (this.livePricesMemo?.promise === promise) this.livePricesMemo = null;\n      throw error;\n    });\n\n    this.livePricesMemo = {\n      expiresAt: now + SHORT_CACHE_TTL_MS,\n      promise,\n    };\n    return promise;\n  }\n\n  /** Wrapped `fetchLivePrices` that swallows network errors and returns `{}` by default. */\n  private async fetchLivePricesSafe(\n    options: { force?: boolean; throwOnError?: boolean } = {},\n  ): Promise<Record<string, PriceData>> {\n    try {\n      return await this.fetchLivePricesCached({ force: options.force });\n    } catch (error) {\n      if (options.throwOnError) throw error;\n      return {};\n    }\n  }\n\n  private async query<T>(document: string, variables?: Record<string, unknown>): Promise<T> {\n    try {\n      return await this.gql.request<T>(document, variables);\n    } catch (err) {\n      const msg = err instanceof Error ? err.message : String(err);\n      const lower = msg.toLowerCase();\n\n      const retryAfterMs = retryAfterMsFromError(err);\n\n      if (lower.includes('network') || lower.includes('timeout') || lower.includes('fetch')) {\n        const wrapped = new OstiumSubgraphError(\n          `Subgraph network error: ${msg}`,\n          OstiumSubgraphErrorCode.FETCH_FAILED,\n          err,\n        );\n        if (retryAfterMs !== undefined) (wrapped as RetryAfterError).retryAfterMs = retryAfterMs;\n        throw wrapped;\n      }\n\n      const wrapped = new OstiumSubgraphError(\n        `Subgraph query failed: ${msg}`,\n        OstiumSubgraphErrorCode.FETCH_FAILED,\n        err,\n      );\n      if (retryAfterMs !== undefined) (wrapped as RetryAfterError).retryAfterMs = retryAfterMs;\n      throw wrapped;\n    }\n  }\n}\n\n// Silence unused-import warning when consumers re-export.\nexport { OstiumPositionUpdatesStream, OstiumAccountUpdatesStream, extractOrderIdFromReceipt };\nexport type {\n  Position,\n  AccountUpdatesForTrader,\n  AccountUpdatesSnapshot,\n  StreamAccountUpdatesParams,\n  TransactionReceiptLike,\n};\n","import {\n  createPublicClient,\n  createWalletClient,\n  formatUnits,\n  http,\n  maxUint256,\n  type Address,\n  type PublicClient,\n} from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { arbitrum, arbitrumSepolia } from 'viem/chains';\nimport { ERC20_ABI } from './internal/erc20.js';\nimport { TRADING_ABI } from './internal/contract.js';\n\n/** `delegations()` returns this when no delegate is registered. */\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\nimport { validateBuilderFeeBps } from './internal/builder-fee.js';\nimport { buildTrade, buildBuilderFee } from './internal/open-builder.js';\nimport { parseUsdc, parsePrice } from './internal/decimal.js';\nimport {\n  validateCloseParams,\n  validateModifyParams,\n} from './internal/validation.js';\nimport { getNetworkConfig } from './internal/contracts.js';\nimport { reportTradeSubmission } from './internal/attribution.js';\nimport { DEFAULT_SLIPPAGE_PERCENTAGE, MAX_COLLATERAL_USD } from './internal/precision.js';\nimport { DEFAULT_BUILDER_API_URL } from './data/config.js';\nimport { OrderType, CancelOrderType } from './types.js';\nimport type {\n  OnboardingStatus,\n  OnboardingStep,\n  OpenTradeParams,\n  CloseTradeParams,\n  CancelOrderParams,\n  ModifyOrderParams,\n  UpdateCollateralParams,\n  AllowanceStatus,\n  Balances,\n  SubmissionResult,\n  BuiltTxRequest,\n  EncodedTx,\n} from './types.js';\nimport type {\n  ClientMode,\n  OstiumClientConfig,\n  SelfSelfParams,\n  SelfGaslessParams,\n  DelegatedSelfParams,\n  DelegatedGaslessParams,\n} from './config.js';\nimport {\n  DEFAULT_PIMLICO_URL,\n  DEFAULT_PIMLICO_URL_TESTNET,\n  hasPrivateKey,\n  resolveMode,\n} from './config.js';\nimport { OstiumError, OstiumErrorCode } from './errors.js';\nimport { createSigner, type SignerStrategy } from './signer/index.js';\nimport { createSubmitter, type SubmissionStrategy } from './submitter/index.js';\nimport { OstiumSubgraphClient } from './data/client.js';\nimport { OstiumAccountUpdatesStream, OstiumPositionUpdatesStream } from './data/client.js';\nimport type {\n  PairsResponse,\n  AllPricesResponse,\n  OpenPositionsResponse,\n  Fill,\n  Order,\n  OpenOrder,\n  GetPairsParams,\n  GetOrdersParams,\n  GetBuilderOrdersParams,\n  GetUserParams,\n  GetOpenPositionsParams,\n  GetFillsParams,\n  GetFillsByTimeParams,\n  GetSimSlippageParams,\n  SimSlippageByPairId,\n  GetSimOrderbookParams,\n  PreviewOpenTradeParams,\n  PreviewOpenTradeResult,\n  SimOrderbookResponse,\n  Candle,\n  GetCandlesParams,\n  StreamAccountUpdatesParams,\n} from './data/types.js';\nimport { OstiumPriceStream } from './data/internal/pricing.js';\nimport {\n  encodeOpenTrade,\n  encodeCloseTradeMarket,\n  encodeCancelLimitOrder,\n  encodeCloseTradeMarketTimeout,\n  encodeOpenTradeMarketTimeout,\n  encodeUpdateOpenLimitOrder,\n  encodeUpdateTp,\n  encodeUpdateSl,\n  encodeTopUpCollateral,\n  encodeRemoveCollateral,\n  encodeSetDelegate,\n  encodeRemoveDelegate,\n  encodeUsdcApprove,\n} from './encoder.js';\n\nconst HEX64_RE = /^0x[0-9a-fA-F]{64}$/;\nconst ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;\n\nfunction validateConfig(config: OstiumClientConfig): void {\n  if (config.privateKey && !HEX64_RE.test(config.privateKey)) {\n    throw new OstiumError(\n      'privateKey must be a 64-character hex string prefixed with 0x',\n      OstiumErrorCode.INVALID_CONFIG,\n    );\n  }\n  for (const [label, value] of [\n    ['traderAddress', config.traderAddress],\n    ['delegateAddress', config.delegateAddress],\n    ['safeAddress', config.safeAddress],\n  ] as const) {\n    if (value && !ADDRESS_RE.test(value)) {\n      throw new OstiumError(\n        `${label} must be a valid 42-character Ethereum address (0x + 40 hex chars)`,\n        OstiumErrorCode.INVALID_CONFIG,\n      );\n    }\n  }\n  if (config.slippageBps !== undefined && (config.slippageBps < 0 || config.slippageBps > 500)) {\n    throw new OstiumError(\n      'slippageBps must be between 0 and 500 (0%–5%)',\n      OstiumErrorCode.INVALID_CONFIG,\n    );\n  }\n  if (config.builder !== undefined) {\n    const feeError = validateBuilderFeeBps(config.builder.feeBps);\n    if (feeError) {\n      throw new OstiumError(feeError, OstiumErrorCode.INVALID_CONFIG);\n    }\n  }\n\n  let mode: ClientMode;\n  try {\n    mode = resolveMode(config);\n  } catch {\n    throw new OstiumError(\n      'Could not infer client mode from config. Provide the required addresses for the selected factory.',\n      OstiumErrorCode.INVALID_CONFIG,\n    );\n  }\n\n  if (mode === 'self-self' && !config.privateKey && !config.traderAddress) {\n    throw new OstiumError(\n      'Self + Self mode requires traderPrivateKey for submission or traderAddress for build-only usage.',\n      OstiumErrorCode.INVALID_CONFIG,\n    );\n  }\n  if (mode === 'self-gasless' && !config.privateKey && (!config.traderAddress || !config.safeAddress)) {\n    throw new OstiumError(\n      'Self + Gasless build-only mode requires traderAddress and safeAddress.',\n      OstiumErrorCode.INVALID_CONFIG,\n    );\n  }\n  if (mode === 'delegated-self' && (!config.traderAddress || (!config.privateKey && !config.delegateAddress))) {\n    throw new OstiumError(\n      'Delegated + Self mode requires traderAddress and either delegatePrivateKey or delegateAddress.',\n      OstiumErrorCode.INVALID_CONFIG,\n    );\n  }\n  if (\n    mode === 'delegated-gasless' &&\n    (!config.traderAddress || (!config.privateKey && (!config.delegateAddress || !config.safeAddress)))\n  ) {\n    throw new OstiumError(\n      'Delegated + Gasless mode requires traderAddress and either delegatePrivateKey or both delegateAddress and safeAddress.',\n      OstiumErrorCode.INVALID_CONFIG,\n    );\n  }\n}\n\ninterface ContractAddresses {\n  trading: Address;\n  tradingStorage: Address;\n  usdc: Address;\n  tradingCallbacks: Address;\n}\n\ninterface ClientInternals {\n  /** Builder API base URL — used for fire-and-forget trade attribution. */\n  builderApiUrl: string;\n  /** Undefined in read-only mode. */\n  signer?: SignerStrategy;\n  /** Undefined in read-only mode. */\n  submitter?: SubmissionStrategy;\n  traderAddress?: Address;\n  effectiveSender?: Address;\n  contracts: ContractAddresses;\n  publicClient: PublicClient;\n  defaultSlippageBps: number;\n  delegated: boolean;\n  gasless: boolean;\n  /** True when in Self + Gasless mode: EOA is trader, Safe is delegate/submitter. */\n  selfGasless: boolean;\n  /**\n   * Direct EOA submitter for Self + Gasless mode.\n   * Used by setupGaslessDelegation() and approveUsdc() — both must be signed\n   * by the EOA (not via the Safe delegate).\n   */\n  eoaSubmit?: (encoded: EncodedTx) => Promise<SubmissionResult>;\n  builderAddress?: Address;\n  builderFeeBps?: number;\n  subgraph: OstiumSubgraphClient;\n}\n\nexport class OstiumClient {\n  private readonly builderApiUrl: string;\n  private readonly signer?: SignerStrategy;\n  private readonly submitter?: SubmissionStrategy;\n  private readonly traderAddress?: Address;\n  private readonly effectiveSender?: Address;\n  private readonly contracts: ContractAddresses;\n  private readonly publicClient: PublicClient;\n  private readonly defaultSlippageBps: number;\n  private readonly delegated: boolean;\n  private readonly gasless: boolean;\n  private readonly selfGasless: boolean;\n  private readonly eoaSubmit?: (encoded: EncodedTx) => Promise<SubmissionResult>;\n  private readonly builderAddress?: Address;\n  private readonly builderFeeBps?: number;\n  /** Internal subgraph client backing all read methods (`getPairs`, `getOpenPositions`, …). */\n  readonly subgraph: OstiumSubgraphClient;\n\n  private constructor(internals: ClientInternals) {\n    this.builderApiUrl = internals.builderApiUrl;\n    this.signer = internals.signer;\n    this.submitter = internals.submitter;\n    this.traderAddress = internals.traderAddress;\n    this.effectiveSender = internals.effectiveSender;\n    this.contracts = internals.contracts;\n    this.publicClient = internals.publicClient;\n    this.defaultSlippageBps = internals.defaultSlippageBps;\n    this.delegated = internals.delegated;\n    this.gasless = internals.gasless;\n    this.selfGasless = internals.selfGasless;\n    this.eoaSubmit = internals.eoaSubmit;\n    this.builderAddress = internals.builderAddress;\n    this.builderFeeBps = internals.builderFeeBps;\n    this.subgraph = internals.subgraph;\n  }\n\n  /**\n   * **Self + Self** — your EOA signs every transaction and pays gas directly.\n   *\n   * Use this when you want the simplest possible setup: one key, no smart accounts,\n   * no delegation. Your EOA holds USDC and owns all positions.\n   *\n   * ```ts\n   * const client = await OstiumClient.createSelfAndSelf({\n   *   traderPrivateKey: '0x...',\n   *   rpcUrl: 'https://arb-mainnet.g.alchemy.com/v2/...',\n   * });\n   * await client.openTrade({ ... });\n   * ```\n  */\n  static async createSelfAndSelf(params: SelfSelfParams): Promise<OstiumClient> {\n    const base = {\n      mode: 'self-self' as const,\n      testnet: params.testnet,\n      slippageBps: params.slippageBps,\n      builder: params.builder,\n      subgraphUrl: params.subgraphUrl,\n      builderApiUrl: params.builderApiUrl,\n      alchemyApiKey: params.alchemyApiKey,\n      rpcUrl: params.rpcUrl,\n    };\n    return OstiumClient._fromConfig(\n      'traderPrivateKey' in params\n        ? { ...base, privateKey: params.traderPrivateKey }\n        : { ...base, traderAddress: params.traderAddress },\n    );\n  }\n\n  /**\n   * **Self + Gasless** — your EOA owns everything; a Safe relays trades for free.\n   *\n   * Your EOA holds USDC and owns all positions. A Safe smart account is derived\n   * deterministically from your private key and registered as your on-chain delegate.\n   * After a one-time setup (approve USDC + `setupGaslessDelegation()`), all trades\n   * are submitted as sponsored UserOperations — no ETH required.\n   *\n   * ```ts\n   * const client = await OstiumClient.createSelfAndGasless({\n   *   traderPrivateKey: '0x...',\n   *   pimlicoUrl: 'https://builder.prod.bedrock.ostium.io/v1/sponsor?chainId=42161',\n   * });\n   * // One-time setup — EOA pays gas once for each:\n   * await client.approveUsdc('max');\n   * await client.setupGaslessDelegation();\n   * // All subsequent trading is gasless:\n   * await client.openTrade({ ... });\n   * ```\n   */\n  static async createSelfAndGasless(params: SelfGaslessParams): Promise<OstiumClient> {\n    const defaultUrl = params.testnet ? DEFAULT_PIMLICO_URL_TESTNET : DEFAULT_PIMLICO_URL;\n    const base = {\n      mode: 'self-gasless' as const,\n      rpcUrl: params.rpcUrl,\n      testnet: params.testnet,\n      slippageBps: params.slippageBps,\n      builder: params.builder,\n      subgraphUrl: params.subgraphUrl,\n      builderApiUrl: params.builderApiUrl,\n      alchemyApiKey: params.alchemyApiKey,\n    };\n    return OstiumClient._fromConfig(\n      'traderPrivateKey' in params\n        ? {\n            ...base,\n            privateKey: params.traderPrivateKey,\n            safeAddress: params.safeAddress,\n            pimlicoUrl: params.pimlicoUrl ?? defaultUrl,\n            sponsorshipPolicyId: params.sponsorshipPolicyId,\n          }\n        : {\n            ...base,\n            traderAddress: params.traderAddress,\n            safeAddress: params.safeAddress,\n          },\n    );\n  }\n\n  /**\n   * **Delegated + Self** — a delegate EOA signs and pays gas on behalf of a trader address.\n   *\n   * The trader retains custody of USDC and positions. The delegate only needs ETH\n   * for gas. Every trade is wrapped in `delegatedAction(traderAddress, callData)`.\n   * The trader must call `setDelegate(delegateAddress)` once before this client\n   * can submit trades.\n   *\n   * ```ts\n   * const client = await OstiumClient.createDelegatedAndSelf({\n   *   delegatePrivateKey: '0xDelegateKey',\n   *   traderAddress: '0xTraderAddress',\n   *   rpcUrl: 'https://arb-mainnet.g.alchemy.com/v2/...',\n   * });\n   * await client.openTrade({ ... });\n   * ```\n   */\n  static async createDelegatedAndSelf(params: DelegatedSelfParams): Promise<OstiumClient> {\n    const base = {\n      mode: 'delegated-self' as const,\n      traderAddress: params.traderAddress,\n      rpcUrl: params.rpcUrl,\n      testnet: params.testnet,\n      slippageBps: params.slippageBps,\n      builder: params.builder,\n      subgraphUrl: params.subgraphUrl,\n      builderApiUrl: params.builderApiUrl,\n      alchemyApiKey: params.alchemyApiKey,\n    };\n    return OstiumClient._fromConfig(\n      'delegatePrivateKey' in params\n        ? { ...base, privateKey: params.delegatePrivateKey }\n        : { ...base, delegateAddress: params.delegateAddress },\n    );\n  }\n\n  /**\n   * **Delegated + Gasless** — a Safe derived from the delegate key submits sponsored\n   * UserOperations on behalf of the trader. No ETH needed after setup.\n   *\n   * The trader retains custody of USDC and positions. The delegate's Safe submits\n   * trades as UserOperations via Pimlico. The trader must call `setDelegate(safeAddress)`\n   * once — use `client.getSmartAccountAddress()` to retrieve the Safe address.\n   *\n   * ```ts\n   * const client = await OstiumClient.createDelegatedAndGasless({\n   *   delegatePrivateKey: '0xDelegateKey',\n   *   traderAddress: '0xTraderAddress',\n   *   pimlicoUrl: 'https://builder.prod.bedrock.ostium.io/v1/sponsor?chainId=42161',\n   * });\n   * await client.openTrade({ ... }); // gasless delegatedAction UserOp\n   * ```\n   */\n  static async createDelegatedAndGasless(params: DelegatedGaslessParams): Promise<OstiumClient> {\n    const defaultUrl = params.testnet ? DEFAULT_PIMLICO_URL_TESTNET : DEFAULT_PIMLICO_URL;\n    const base = {\n      mode: 'delegated-gasless' as const,\n      traderAddress: params.traderAddress,\n      rpcUrl: params.rpcUrl,\n      testnet: params.testnet,\n      slippageBps: params.slippageBps,\n      builder: params.builder,\n      subgraphUrl: params.subgraphUrl,\n      builderApiUrl: params.builderApiUrl,\n      alchemyApiKey: params.alchemyApiKey,\n    };\n    return OstiumClient._fromConfig(\n      'delegatePrivateKey' in params\n        ? {\n            ...base,\n            privateKey: params.delegatePrivateKey,\n            safeAddress: params.safeAddress,\n            pimlicoUrl: params.pimlicoUrl ?? defaultUrl,\n            sponsorshipPolicyId: params.sponsorshipPolicyId,\n          }\n        : {\n            ...base,\n            delegateAddress: params.delegateAddress,\n            safeAddress: params.safeAddress,\n          },\n    );\n  }\n\n  /**\n   * **Read-only client** — no signer, no submitter, no privateKey required.\n   *\n   * All read methods (`getPairs`, `getOpenPositions`, `getFills`, `getBalances`, …)\n   * are available. Methods that take an optional `user` argument require it to be\n   * passed explicitly. Calling any write method throws `INVALID_CONFIG`.\n   *\n   * ```ts\n   * const reader = await OstiumClient.createReadOnly();\n   * const { pairs } = await reader.getPairs();\n   * const balances = await reader.getBalances('0xTrader...');\n   * const positions = await reader.getOpenPositions({ user: '0xTrader...' });\n   * ```\n   */\n  static async createReadOnly(params: {\n    /** Arbitrum RPC URL. Defaults to the chain's public RPC. */\n    rpcUrl?: string;\n    /** Use Arbitrum Sepolia testnet. Defaults to false (mainnet). */\n    testnet?: boolean;\n    /** Override the subgraph endpoint. */\n    subgraphUrl?: string;\n    /** Override the builder API base URL (prices, OHLC, WebSocket stream). */\n    builderApiUrl?: string;\n    /** Alchemy API key used by `streamAccountUpdates()`. */\n    alchemyApiKey?: string;\n  } = {}): Promise<OstiumClient> {\n    const testnet = params.testnet ?? false;\n    const networkConfig = getNetworkConfig(testnet);\n    const chain = testnet ? arbitrumSepolia : arbitrum;\n    const rpcUrl = params.rpcUrl ?? chain.rpcUrls.default.http[0];\n\n    const contracts: ContractAddresses = {\n      trading:        networkConfig.contracts.trading,\n      tradingStorage: networkConfig.contracts.tradingStorage,\n      usdc:           networkConfig.contracts.usdc,\n      tradingCallbacks: networkConfig.contracts.tradingCallbacks,\n    };\n\n    const publicClient = createPublicClient({ chain, transport: http(rpcUrl) });\n\n    const subgraph = await OstiumSubgraphClient.create({\n      testnet,\n      endpoint:      params.subgraphUrl,\n      builderApiUrl: params.builderApiUrl,\n      alchemyApiKey: params.alchemyApiKey,\n    });\n\n    return new OstiumClient({\n      builderApiUrl: params.builderApiUrl ?? DEFAULT_BUILDER_API_URL,\n      contracts,\n      publicClient,\n      defaultSlippageBps: Math.round(DEFAULT_SLIPPAGE_PERCENTAGE * 100),\n      delegated:   false,\n      gasless:     false,\n      selfGasless: false,\n      subgraph,\n    });\n  }\n\n  /** Internal factory shared by all public constructors. */\n  private static async _fromConfig(config: OstiumClientConfig): Promise<OstiumClient> {\n    validateConfig(config);\n\n    const mode = resolveMode(config);\n    const testnet = config.testnet ?? false;\n    const networkConfig = getNetworkConfig(testnet);\n    const chain = testnet ? arbitrumSepolia : arbitrum;\n    const defaultSlippageBps =\n      config.slippageBps ?? Math.round(DEFAULT_SLIPPAGE_PERCENTAGE * 100);\n\n    const contracts: ContractAddresses = {\n      trading:        networkConfig.contracts.trading,\n      tradingStorage: networkConfig.contracts.tradingStorage,\n      usdc:           networkConfig.contracts.usdc,\n      tradingCallbacks: networkConfig.contracts.tradingCallbacks,\n    };\n\n    const selfGasless = mode === 'self-gasless';\n\n    let traderAddress: Address;\n    if (mode === 'self-self' || mode === 'self-gasless') {\n      traderAddress = config.traderAddress ?? privateKeyToAccount(config.privateKey!).address;\n    } else {\n      traderAddress = config.traderAddress!;\n    }\n\n    const signer = createSigner(mode, traderAddress);\n\n    let submitter: SubmissionStrategy | undefined;\n    let effectiveSender: Address;\n    if (hasPrivateKey(config)) {\n      submitter = await createSubmitter(config, testnet, mode);\n      effectiveSender = submitter.effectiveSender;\n    } else if (mode === 'self-self') {\n      effectiveSender = traderAddress;\n    } else if (mode === 'delegated-self') {\n      effectiveSender = config.delegateAddress!;\n    } else {\n      effectiveSender = config.safeAddress!;\n    }\n\n    const publicRpc = testnet\n      ? 'https://sepolia-rollup.arbitrum.io/rpc'\n      : 'https://arb1.arbitrum.io/rpc';\n    // Chain RPC for reads/simulation. Gasless Pimlico URL is bundler-only\n    const rpcUrl = config.rpcUrl ?? publicRpc;\n\n    if (hasPrivateKey(config) && mode !== 'self-gasless' && mode !== 'delegated-gasless' && !config.rpcUrl) {\n      throw new OstiumError(\n        'rpcUrl is required for self-submission mode',\n        OstiumErrorCode.INVALID_CONFIG,\n      );\n    }\n\n    const publicClient = createPublicClient({ chain, transport: http(rpcUrl) });\n\n    // Self + Gasless: approveUsdc() and setupGaslessDelegation() must be signed\n    // by the EOA directly (not via the Safe). Captured in a closure so the\n    // private key is not stored on the instance.\n    // Pimlico's bundler URL rejects eth_sendRawTransaction, so use a standard RPC here.\n    let eoaSubmit: ((encoded: EncodedTx) => Promise<SubmissionResult>) | undefined;\n    if (selfGasless && hasPrivateKey(config)) {\n      const eoaAccount = privateKeyToAccount(config.privateKey);\n      const eoaRpcUrl = config.rpcUrl ?? publicRpc;\n      const eoaWalletClient = createWalletClient({ account: eoaAccount, chain, transport: http(eoaRpcUrl) });\n      eoaSubmit = async (encoded: EncodedTx) => {\n        const txHash = await eoaWalletClient.sendTransaction({\n          account: eoaAccount,\n          to:      encoded.to,\n          data:    encoded.data,\n          value:   encoded.value,\n        });\n        return { txHash };\n      };\n    }\n\n    const subgraph = await OstiumSubgraphClient.create({\n      testnet,\n      endpoint:      config.subgraphUrl,\n      builderApiUrl: config.builderApiUrl,\n      alchemyApiKey: config.alchemyApiKey,\n    });\n\n    return new OstiumClient({\n      builderApiUrl: config.builderApiUrl ?? DEFAULT_BUILDER_API_URL,\n      signer,\n      submitter,\n      traderAddress,\n      effectiveSender,\n      contracts,\n      publicClient,\n      defaultSlippageBps,\n      delegated:      mode === 'delegated-self' || mode === 'delegated-gasless',\n      gasless:        mode === 'self-gasless' || mode === 'delegated-gasless',\n      selfGasless,\n      eoaSubmit,\n      builderAddress: config.builder?.address,\n      builderFeeBps:  config.builder?.feeBps,\n      subgraph,\n    });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Getters\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * The on-chain address that owns trades and USDC allowances.\n   *\n   * - Self + Self / Delegated modes: trader's EOA or configured traderAddress.\n   * - Self + Gasless: EOA derived from privateKey (NOT the Safe — USDC lives here).\n   */\n  getTraderAddress(): Address {\n    if (!this.traderAddress) {\n      throw new OstiumError(\n        'No connected trader — pass `user` explicitly or use one of the createSelfAnd*/createDelegatedAnd* factories.',\n        OstiumErrorCode.INVALID_CONFIG,\n      );\n    }\n    return this.traderAddress;\n  }\n\n  /** True when the client cannot submit transactions directly. */\n  isReadOnly(): boolean {\n    return !this.submitter;\n  }\n\n  /** True when the client can build mode-correct unsigned transaction requests. */\n  canBuildTransactions(): boolean {\n    return !!this.signer && !!this.effectiveSender;\n  }\n\n  /** True when the client has the credentials needed for SDK-managed submission. */\n  canSubmitTransactions(): boolean {\n    return !!this.submitter;\n  }\n\n  /**\n   * Returns the Safe smart-account address used for gasless submission.\n   * Returns undefined when not in gasless mode.\n   *\n   * - Self + Gasless:      Safe that submits on behalf of the EOA (the delegate).\n   *                        Pass this address to setupGaslessDelegation().\n   * - Delegated + Gasless: delegate's Safe address.\n   * - Self + Self / Delegated + Self: returns undefined.\n   */\n  getSmartAccountAddress(): Address | undefined {\n    return this.gasless ? this.effectiveSender : undefined;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Self + Gasless setup\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * One-time setup for Self + Gasless mode.\n   *\n   * Registers the Safe smart account as a delegate on the trading contract so\n   * the Safe can submit gasless trades on behalf of your EOA. The EOA pays gas\n   * for this single transaction; all subsequent trading is gasless.\n   *\n   * Only callable in Self + Gasless mode. Throws INVALID_CONFIG otherwise.\n   *\n   * @example\n   * ```ts\n   * const client = await OstiumClient.create({ privateKey: '0x...', pimlicoUrl: 'https://builder.prod.bedrock.ostium.io/v1/sponsor?chainId=42161' });\n   * await client.approveUsdc('max');         // EOA approves USDC (gas, one-time)\n   * await client.setupGaslessDelegation();   // EOA sets Safe as delegate (gas, one-time)\n   * // From here: all trading is gasless\n   * await client.openTrade({ ... });\n   * ```\n   */\n  async setupGaslessDelegation(): Promise<SubmissionResult> {\n    return this.submitDirectEoa(this.getSetupGaslessDelegationEncoded());\n  }\n\n  getSetupGaslessDelegationTx(): BuiltTxRequest {\n    return this.buildDirectEoaTx(this.getSetupGaslessDelegationEncoded());\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // USDC helpers\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Check whether the trader's USDC allowance covers the required amount.\n   * The allowance is always checked against signer.traderAddress (the EOA in\n   * Self + Gasless mode, the Safe in Delegated + Gasless).\n   */\n  async checkUsdcAllowance(requiredUsd: string): Promise<AllowanceStatus> {\n    const required = parseUsdc(requiredUsd);\n    const current = await this.publicClient.readContract({\n      address: this.contracts.usdc,\n      abi: ERC20_ABI,\n      functionName: 'allowance',\n      args: [this.getTraderAddress(), this.contracts.tradingStorage],\n    });\n    return { current, required, sufficient: current >= required };\n  }\n\n  /**\n   * USDC and ETH balances plus the USDC allowance to TradingStorage.\n   * All three values are decimal strings so large values (e.g. max USDC approval)\n   * are preserved exactly. Parse with `parseFloat` / `Number` only for display.\n   *\n   * In read-only mode, pass `user` explicitly. With a connected trader, omit it\n   * to read the connected address.\n   */\n  async getBalances(user?: Address): Promise<Balances> {\n    const trader = user ?? this.getTraderAddress();\n    const [usdcRaw, ethRaw, allowanceRaw] = await Promise.all([\n      this.publicClient.readContract({\n        address: this.contracts.usdc,\n        abi: ERC20_ABI,\n        functionName: 'balanceOf',\n        args: [trader],\n      }),\n      this.publicClient.getBalance({ address: trader }),\n      this.publicClient.readContract({\n        address: this.contracts.usdc,\n        abi: ERC20_ABI,\n        functionName: 'allowance',\n        args: [trader, this.contracts.tradingStorage],\n      }),\n    ]);\n\n    return {\n      usdc:      formatUnits(usdcRaw as bigint, 6),\n      eth:       formatUnits(ethRaw, 18),\n      allowance: formatUnits(allowanceRaw as bigint, 6),\n    };\n  }\n\n  /**\n   * Approve USDC spending by the TradingStorage contract.\n   *\n   * - Self + Self: submitted gaslessly from EOA.\n   * - Self + Gasless: submitted directly from EOA (the delegate cannot approve\n   *   on behalf of the trader). The EOA pays gas for this one-time operation.\n   * - Delegated modes: throws — the trader must approve from their own account.\n   *\n   * @param amount USD amount as decimal string (e.g. \"1000\"), or \"max\" for MaxUint256.\n   */\n  async approveUsdc(amount: string): Promise<SubmissionResult> {\n    const encoded = this.getApproveUsdcEncoded(amount);\n    if (this.selfGasless) {\n      return this.submitDirectEoa(encoded);\n    }\n    return this.submitPrepared(encoded);\n  }\n\n  getApproveUsdcTx(amount: string): BuiltTxRequest {\n    return this.buildDirectEoaTx(this.getApproveUsdcEncoded(amount));\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Onboarding\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * What still stands between this trader and their first trade — USDC\n   * approval, delegate registration, gasless setup — with the transaction\n   * that clears each one.\n   *\n   * Onboarding is otherwise spread across three separate tx-builders and\n   * three sections of BUILDER.md, with no way to ask \"what is left?\". This\n   * answers that in one call, so a UI can render a checklist:\n   *\n   * ```ts\n   * const status = await client.getOnboardingStatus({ requiredUsd: '1000' });\n   * for (const step of status.steps) {\n   *   console.log(step.description);\n   *   await wallet.sendTransaction(step.tx);   // trader signs from their own account\n   * }\n   * ```\n   *\n   * Every step is a transaction the **trader** must send themselves: a\n   * delegate can neither approve USDC nor register itself.\n   *\n   * @param params.requiredUsd Collateral the trader intends to trade with.\n   *                           Defaults to `\"1\"` — enough to prove an approval\n   *                           exists at all.\n   */\n  async getOnboardingStatus(params: { requiredUsd?: string } = {}): Promise<OnboardingStatus> {\n    const requiredUsd = params.requiredUsd ?? '1';\n    // Parsed up front so a malformed amount fails loudly here rather than\n    // silently becoming NaN and reporting the trader as ready.\n    let requiredRaw: bigint;\n    try {\n      requiredRaw = parseUsdc(requiredUsd);\n    } catch {\n      throw new OstiumError(\n        `getOnboardingStatus: requiredUsd must be a decimal USD string (received \"${requiredUsd}\")`,\n        OstiumErrorCode.VALIDATION_FAILED,\n      );\n    }\n    if (requiredRaw < 0n) {\n      throw new OstiumError(\n        `getOnboardingStatus: requiredUsd must not be negative (received \"${requiredUsd}\")`,\n        OstiumErrorCode.VALIDATION_FAILED,\n      );\n    }\n\n    const trader = this.getTraderAddress();\n\n    const [balances, currentDelegateRaw] = await Promise.all([\n      this.getBalances(trader),\n      this.publicClient.readContract({\n        address: this.contracts.trading,\n        abi: TRADING_ABI,\n        functionName: 'delegations',\n        args: [trader],\n      }) as Promise<Address>,\n    ]);\n\n    const currentDelegate =\n      currentDelegateRaw && currentDelegateRaw !== ZERO_ADDRESS ? currentDelegateRaw : undefined;\n\n    // Compared as 6-decimal integers: a max approval is far beyond the range\n    // where Number() is exact.\n    const needsApproval = parseUsdc(balances.allowance) < requiredRaw;\n    // Sufficient allowance with no USDC is not \"ready\" — the open still fails.\n    const needsFunding = parseUsdc(balances.usdc) < requiredRaw;\n\n    // The address that must be registered as the trader's delegate, if any:\n    // the smart account in Self + Gasless, the delegate EOA in delegated modes.\n    const expectedDelegate = this.delegated || this.selfGasless ? this.effectiveSender : undefined;\n    const delegateMismatch =\n      expectedDelegate !== undefined &&\n      currentDelegate?.toLowerCase() !== expectedDelegate.toLowerCase();\n\n    const needsGaslessSetup = this.selfGasless && delegateMismatch;\n    const needsDelegate = !this.selfGasless && delegateMismatch;\n\n    const steps: OnboardingStep[] = [];\n    if (needsApproval) {\n      steps.push({\n        kind: 'approveUsdc',\n        description: `Approve USDC spending (current allowance ${balances.allowance}, need ${requiredUsd}).`,\n        // Encoded directly rather than through getApproveUsdcTx(), which\n        // refuses delegated clients — yet a delegated integration is exactly\n        // where a UI needs this transaction to hand to the trader.\n        tx: this.buildDirectEoaTx(\n          encodeUsdcApprove(this.contracts.tradingStorage, requiredRaw, this.contracts.usdc),\n        ),\n      });\n    }\n    if (needsGaslessSetup) {\n      steps.push({\n        kind: 'setupGaslessDelegation',\n        description: `Authorise the gasless smart account ${expectedDelegate} to trade on your behalf.`,\n        tx: this.getSetupGaslessDelegationTx(),\n      });\n    }\n    if (needsDelegate && expectedDelegate) {\n      steps.push({\n        kind: 'setDelegate',\n        description: `Register ${expectedDelegate} as your delegate.`,\n        // Direct, not getSetDelegateTx(): that wraps the call in delegatedAction\n        // so the *existing* delegate signs it. There is no delegate yet — that\n        // is the point of the step — so it must come from the trader.\n        tx: this.buildDirectEoaTx(encodeSetDelegate(expectedDelegate, this.contracts.trading)),\n      });\n    }\n\n    return {\n      ready: steps.length === 0 && !needsFunding,\n      needsApproval,\n      needsFunding,\n      needsDelegate,\n      needsGaslessSetup,\n      steps,\n      allowance: balances.allowance,\n      usdcBalance: balances.usdc,\n      ethBalance: balances.eth,\n      currentDelegate,\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Delegation helpers\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Set a delegate on the trading contract.\n   *\n   * - Self + Self: EOA directly registers a delegate.\n   * - Self + Gasless: NOT recommended — use setupGaslessDelegation() instead.\n   * - Delegated modes: wrapped in delegatedAction so the existing delegate can\n   *   update the trader's delegation on their behalf.\n   */\n  async setDelegate(delegateAddress: Address): Promise<SubmissionResult> {\n    return this.submitPrepared(this.getSetDelegateEncoded(delegateAddress));\n  }\n\n  getSetDelegateTx(delegateAddress: Address): BuiltTxRequest {\n    return this.buildPreparedTx(this.getSetDelegateEncoded(delegateAddress));\n  }\n\n  /**\n   * Remove the current delegate on the trading contract.\n   * Follows the same delegation-wrapping rules as setDelegate().\n   */\n  async removeDelegate(): Promise<SubmissionResult> {\n    return this.submitPrepared(this.getRemoveDelegateEncoded());\n  }\n\n  getRemoveDelegateTx(): BuiltTxRequest {\n    return this.buildPreparedTx(this.getRemoveDelegateEncoded());\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Core trading methods\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Open a new trade position.\n   *\n   * Call `approveUsdc()` (once) before the first trade — the contract will revert\n   * on-chain if the USDC allowance is insufficient. Use `getBalances()` to check\n   * the current allowance.\n   */\n  async openTrade(params: OpenTradeParams): Promise<SubmissionResult> {\n    return this.submitPrepared(this.getOpenTradeEncoded(params));\n  }\n\n  getOpenTradeTx(params: OpenTradeParams): BuiltTxRequest {\n    return this.buildPreparedTx(this.getOpenTradeEncoded(params));\n  }\n\n  private resolveOpenTradeBuilder(\n    params: OpenTradeParams,\n  ): { b: Address; f: number } | undefined {\n    const override = params.builder;\n    const address = override?.address ?? this.builderAddress;\n    const feeBps = override?.feeBps ?? this.builderFeeBps;\n\n    if (override?.feeBps !== undefined) {\n      const feeError = validateBuilderFeeBps(override.feeBps);\n      if (feeError) {\n        throw new OstiumError(feeError, OstiumErrorCode.VALIDATION_FAILED);\n      }\n    }\n\n    if (address === undefined || feeBps === undefined) {\n      // feeBps: 0 with no resolvable address means \"open without a builder fee\".\n      if (feeBps === 0) return undefined;\n      if (override?.address !== undefined || override?.feeBps !== undefined) {\n        throw new OstiumError(\n          'openTrade builder override is missing address or feeBps — provide it on the trade or in client config.',\n          OstiumErrorCode.VALIDATION_FAILED,\n        );\n      }\n      return undefined;\n    }\n\n    return { b: address, f: feeBps };\n  }\n\n  private getOpenTradeEncoded(params: OpenTradeParams): EncodedTx {\n    const collateralNum = parseFloat(params.collateral);\n    if (collateralNum > MAX_COLLATERAL_USD) {\n      throw new OstiumError(\n        `Collateral ${params.collateral} exceeds maximum ${MAX_COLLATERAL_USD}`,\n        OstiumErrorCode.VALIDATION_FAILED,\n      );\n    }\n\n    const apiOpen = {\n      a: Number(params.pairId),\n      b: params.buy,\n      p: params.price,\n      s: params.collateral,\n      l: params.leverage,\n      t: params.type,\n      tp: params.takeProfit,\n      sl: params.stopLoss,\n      d: params.isDayTrade,\n    };\n\n    const apiBuilder = this.resolveOpenTradeBuilder(params);\n\n    let trade, orderType;\n    try {\n      ({ trade, orderType } = buildTrade(apiOpen, this.getTraderAddress()));\n    } catch (err) {\n      throw new OstiumError(\n        `Trade validation failed: ${err instanceof Error ? err.message : String(err)}`,\n        OstiumErrorCode.VALIDATION_FAILED,\n        err,\n      );\n    }\n\n    const builderFee = buildBuilderFee(apiBuilder);\n\n    // Slippage only applies to market orders. Limit and stop orders must use 0.\n    const slippageP = params.type === OrderType.Market\n      ? BigInt(this.resolveSlippage(params.slippage))\n      : 0n;\n\n    return encodeOpenTrade(trade, builderFee, orderType, slippageP, this.contracts.trading);\n  }\n\n  /**\n   * Close an open position (full or partial).\n   *\n   * `pairId` and `idx` come straight from a `Position` returned by\n   * `getOpenPositions` — pass them through directly:\n   *\n   * ```ts\n   * const { pairPositions } = await client.getOpenPositions();\n   * const { pairId, idx } = pairPositions[0].position;\n   * await client.closeTrade({ pairId, idx, price: '...', closePercent: 100 });\n   * ```\n   */\n  async closeTrade(params: CloseTradeParams): Promise<SubmissionResult> {\n    return this.submitPrepared(this.getCloseTradeEncoded(params));\n  }\n\n  getCloseTradeTx(params: CloseTradeParams): BuiltTxRequest {\n    return this.buildPreparedTx(this.getCloseTradeEncoded(params));\n  }\n\n  private getCloseTradeEncoded(params: CloseTradeParams): EncodedTx {\n    try {\n      validateCloseParams({\n        a: Number(params.pairId),\n        t: params.idx,\n        p: params.price,\n        r: params.closePercent,\n      });\n    } catch (err) {\n      throw new OstiumError(\n        `Close validation failed: ${err instanceof Error ? err.message : String(err)}`,\n        OstiumErrorCode.VALIDATION_FAILED,\n        err,\n      );\n    }\n\n    const pairIndex = BigInt(params.pairId);\n    const index = BigInt(params.idx);\n    // Contract expects close percentage × 100 (e.g. 100% → 10000)\n    const closePercentage = BigInt(Math.round(params.closePercent * 100));\n    const marketPrice = parsePrice(params.price);\n    const slippageP = BigInt(this.resolveSlippage(params.slippage));\n\n    return encodeCloseTradeMarket(\n      pairIndex,\n      index,\n      closePercentage,\n      marketPrice,\n      slippageP,\n      this.contracts.trading,\n    );\n  }\n\n  /**\n   * Cancel a pending order.\n   *\n   * TypeScript discriminates the params shape by `type` — required fields are\n   * enforced at compile time.\n   *\n   * @example Cancel a pending limit order\n   * ```ts\n   * const [order] = await client.getOpenOrders();\n   * await client.cancelOrder({ type: CancelOrderType.Limit, pairId: order.pairId, idx: order.idx });\n   * ```\n   * @example Cancel a timed-out market open\n   * ```ts\n   * await client.cancelOrder({ type: CancelOrderType.PendingOpen, orderId: 123 });\n   * ```\n   * @example Cancel a timed-out market close (retry: true re-submits the close)\n   * ```ts\n   * await client.cancelOrder({ type: CancelOrderType.PendingClose, orderId: 456, retry: true });\n   * ```\n   */\n  async cancelOrder(params: CancelOrderParams): Promise<SubmissionResult> {\n    return this.submitPrepared(this.getCancelOrderEncoded(params));\n  }\n\n  getCancelOrderTx(params: CancelOrderParams): BuiltTxRequest {\n    return this.buildPreparedTx(this.getCancelOrderEncoded(params));\n  }\n\n  private getCancelOrderEncoded(params: CancelOrderParams): EncodedTx {\n    let encoded: EncodedTx;\n\n    if (params.type === CancelOrderType.Limit) {\n      const pairIdNum = Number(params.pairId);\n      const idxNum    = Number(params.idx);\n      if (\n        !Number.isFinite(pairIdNum) || !Number.isInteger(pairIdNum) || pairIdNum < 0 ||\n        !Number.isFinite(idxNum)    || !Number.isInteger(idxNum)    || idxNum    < 0\n      ) {\n        throw new OstiumError(\n          `Invalid pairId (${params.pairId}) or idx (${params.idx}) for limit cancel`,\n          OstiumErrorCode.VALIDATION_FAILED,\n        );\n      }\n      encoded = encodeCancelLimitOrder(\n        BigInt(pairIdNum),\n        BigInt(idxNum),\n        this.contracts.trading,\n      );\n    } else if (params.type === CancelOrderType.PendingClose) {\n      if (params.orderId < 0) {\n        throw new OstiumError(\n          `Invalid orderId (${params.orderId}) for pending close cancel`,\n          OstiumErrorCode.VALIDATION_FAILED,\n        );\n      }\n      encoded = encodeCloseTradeMarketTimeout(\n        BigInt(params.orderId),\n        params.retry ?? false,\n        this.contracts.trading,\n      );\n    } else {\n      if (params.orderId < 0) {\n        throw new OstiumError(\n          `Invalid orderId (${params.orderId}) for pending open cancel`,\n          OstiumErrorCode.VALIDATION_FAILED,\n        );\n      }\n      encoded = encodeOpenTradeMarketTimeout(BigInt(params.orderId), this.contracts.trading);\n    }\n\n    return encoded;\n  }\n\n  /**\n   * Modify an open trade or a pending limit order.\n   *\n   * `pairId` and `idx` come straight from `getOpenPositions` (for TP/SL on open\n   * positions) or `getOpenOrders` (for limit-order edits):\n   *\n   * ```ts\n   * // Update TP/SL on an open position\n   * const { pairPositions } = await client.getOpenPositions();\n   * const { pairId, idx } = pairPositions[0].position;\n   * await client.modifyOrder({ pairId, idx, takeProfit: '...', stopLoss: '...' });\n   *\n   * // Re-price a pending limit order\n   * const [order] = await client.getOpenOrders();\n   * await client.modifyOrder({ pairId: order.pairId, idx: order.idx, price: '...' });\n   * ```\n   *\n   * - `price` provided → updates limit-order trigger price (with optional TP/SL).\n   * - `takeProfit` only → calls updateTp on an open trade.\n   * - `stopLoss` only → calls updateSl on an open trade.\n   * - Both `takeProfit` and `stopLoss` without `price` → throws (send two calls).\n   */\n  async modifyOrder(params: ModifyOrderParams): Promise<SubmissionResult> {\n    return this.submitPrepared(this.getModifyOrderEncoded(params));\n  }\n\n  getModifyOrderTx(params: ModifyOrderParams): BuiltTxRequest {\n    return this.buildPreparedTx(this.getModifyOrderEncoded(params));\n  }\n\n  private getModifyOrderEncoded(params: ModifyOrderParams): EncodedTx {\n    try {\n      validateModifyParams({\n        a: Number(params.pairId),\n        i: params.idx,\n        p: params.price,\n        tp: params.takeProfit,\n        sl: params.stopLoss,\n      });\n    } catch (err) {\n      throw new OstiumError(\n        `Modify validation failed: ${err instanceof Error ? err.message : String(err)}`,\n        OstiumErrorCode.VALIDATION_FAILED,\n        err,\n      );\n    }\n\n    if (params.takeProfit && params.stopLoss && !params.price) {\n      throw new OstiumError(\n        'Cannot update both takeProfit and stopLoss simultaneously without a price. Send two separate modifyOrder calls.',\n        OstiumErrorCode.VALIDATION_FAILED,\n      );\n    }\n\n    const pairIndex = BigInt(params.pairId);\n    const index = BigInt(params.idx);\n\n    let encoded: EncodedTx;\n    if (params.price) {\n      const price = parsePrice(params.price);\n      const tp = params.takeProfit ? parsePrice(params.takeProfit) : 0n;\n      const sl = params.stopLoss ? parsePrice(params.stopLoss) : 0n;\n      encoded = encodeUpdateOpenLimitOrder(pairIndex, index, price, tp, sl, this.contracts.trading);\n    } else if (params.takeProfit) {\n      encoded = encodeUpdateTp(pairIndex, index, parsePrice(params.takeProfit), this.contracts.trading);\n    } else if (params.stopLoss) {\n      encoded = encodeUpdateSl(pairIndex, index, parsePrice(params.stopLoss), this.contracts.trading);\n    } else {\n      throw new OstiumError(\n        'Either takeProfit or stopLoss must be provided when price is not specified',\n        OstiumErrorCode.VALIDATION_FAILED,\n      );\n    }\n\n    return encoded;\n  }\n\n  /**\n   * Update collateral on an open position (isolated margin).\n   *\n   * `pairId` and `idx` come straight from a `Position` returned by `getOpenPositions`:\n   *\n   * ```ts\n   * const { pairPositions } = await client.getOpenPositions();\n   * const { pairId, idx } = pairPositions[0].position;\n   * await client.updateCollateral({ pairId, idx, amount: '50' });   // top up\n   * await client.updateCollateral({ pairId, idx, amount: '-25' });  // remove\n   * ```\n   *\n   * Positive amount → topUpCollateral (adds margin, reduces effective leverage).\n   * Negative amount → removeCollateral (removes margin, increases effective leverage).\n   *\n   * Checks USDC allowance before top-up operations.\n   */\n  async updateCollateral(params: UpdateCollateralParams): Promise<SubmissionResult> {\n    return this.submitPrepared(await this.getUpdateCollateralEncoded(params));\n  }\n\n  async getUpdateCollateralTx(params: UpdateCollateralParams): Promise<BuiltTxRequest> {\n    return this.buildPreparedTx(await this.getUpdateCollateralEncoded(params));\n  }\n\n  private async getUpdateCollateralEncoded(params: UpdateCollateralParams): Promise<EncodedTx> {\n    const amount = parseFloat(params.amount);\n    if (Number.isNaN(amount) || amount === 0) {\n      throw new OstiumError(\n        `Invalid collateral amount: ${params.amount}`,\n        OstiumErrorCode.VALIDATION_FAILED,\n      );\n    }\n\n    const pairIndex = BigInt(params.pairId);\n    const index = BigInt(params.idx);\n    const absAmount = parseUsdc(Math.abs(amount).toString());\n\n    let encoded: EncodedTx;\n    if (amount > 0) {\n      const allowance = await this.checkUsdcAllowance(Math.abs(amount).toString());\n      if (!allowance.sufficient) {\n        throw new OstiumError(\n          `Insufficient USDC allowance for collateral top-up. Current: ${allowance.current}, Required: ${allowance.required}. Call approveUsdc() first.`,\n          OstiumErrorCode.ALLOWANCE_INSUFFICIENT,\n        );\n      }\n      encoded = encodeTopUpCollateral(pairIndex, index, absAmount, this.contracts.trading);\n    } else {\n      encoded = encodeRemoveCollateral(pairIndex, index, absAmount, this.contracts.trading);\n    }\n\n    return encoded;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Subgraph reads (Hyperliquid-style API)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * All trading pairs with computed `minSz`/`maxBSz`/`maxSSz`, live prices, and\n   * market-status flags. Pass `pairIds` to restrict to a subset.\n   */\n  getPairs(params?: GetPairsParams): Promise<PairsResponse> {\n    return this.subgraph.getPairs({\n      ...params,\n      builderFeeBps: params?.builderFeeBps ?? this.builderFeeBps ?? 0,\n    });\n  }\n\n  /** Live mid/bid/ask prices keyed by `pairId`. */\n  getAllPrices(): Promise<AllPricesResponse> {\n    return this.subgraph.getAllPrices();\n  }\n\n  /**\n   * Open positions + margin summary for a user. Defaults to the connected\n   * trader. Live prices and the current block number are fetched automatically.\n   *\n   * - `user`: pass an address to scope to a single trader, or `'ALL'` to fetch\n   *   positions across every trader (no trader filter).\n   * - `limit`: cap the number of positions returned (default: all).\n   * - `skip`: offset into the result set for pagination (default: `0`).\n   */\n  async getOpenPositions(params?: Partial<GetOpenPositionsParams>): Promise<OpenPositionsResponse> {\n    return this.subgraph.getOpenPositions({\n      user:        params?.user        ?? this.getTraderAddress(),\n      blockNumber: params?.blockNumber ?? (await this.publicClient.getBlockNumber()),\n      limit:       params?.limit,\n      skip:        params?.skip,\n    });\n  }\n\n  /**\n   * Executed fills, newest first.\n   *\n   * - `user` defaults to the connected trader. Pass `'ALL'` to fetch fills\n   *   across every trader (no trader filter).\n   * - `pairId` (optional) — restricts to a single pair.\n   * - `limit` (optional, default `1000`) — caps the result. Pass `Infinity` to\n   *   fetch every matching fill.\n   */\n  getFills(params?: Partial<GetFillsParams>): Promise<Fill[]> {\n    return this.subgraph.getFills({\n      user:   params?.user   ?? this.getTraderAddress(),\n      pairId: params?.pairId,\n      limit:  params?.limit,\n    });\n  }\n\n  /**\n   * Executed fills within a time range (Unix ms). Same filters as `getFills`,\n   * including the default `limit: 1000`.\n   */\n  getFillsByTime(params: Partial<GetFillsByTimeParams> & { startTime: number }): Promise<Fill[]> {\n    return this.subgraph.getFillsByTime({\n      user:      params.user ?? this.getTraderAddress(),\n      pairId:    params.pairId,\n      limit:     params.limit,\n      startTime: params.startTime,\n      endTime:   params.endTime,\n    });\n  }\n\n  /** Active limit orders for a user. Defaults to the connected trader. */\n  getOpenOrders(params?: Partial<GetUserParams>): Promise<OpenOrder[]> {\n    return this.subgraph.getOpenOrders({ user: params?.user ?? this.getTraderAddress() });\n  }\n\n  /**\n   * Fetch orders at any status — pending, executed, or cancelled.\n   *\n   * Pass `initiatedTxHashes: [result.txHash]` to poll by the submission hash, or\n   * `orderIds` by on-chain id. Without either, returns recent orders for the\n   * connected trader unless `user: 'ALL'` or `builder` is provided.\n   */\n  getOrders(params?: GetOrdersParams): Promise<Order[]> {\n    const byId = params?.orderIds?.length;\n    const byTx = params?.initiatedTxHashes?.length;\n    const hasBuilder = !!params?.builder;\n    const shouldDefaultUser = !byId && !byTx && !hasBuilder;\n    return this.subgraph.getOrders({\n      ...params,\n      user: params?.user ?? (shouldDefaultUser ? this.getTraderAddress() : undefined),\n    });\n  }\n\n  /**\n   * Fetch orders routed through a builder, including sibling close orders on the\n   * same positions. See {@link OstiumSubgraphClient.getBuilderOrders}.\n   */\n  getBuilderOrders(builder: Address, params?: GetBuilderOrdersParams): Promise<Order[]> {\n    return this.subgraph.getBuilderOrders(builder, params);\n  }\n\n  /**\n   * Simulate per-side slippage for a list of pairs and notionals.\n   * See {@link OstiumSubgraphClient.getSimSlippage} for full semantics.\n   */\n  getSimSlippage(params: GetSimSlippageParams): Promise<SimSlippageByPairId> {\n    return this.subgraph.getSimSlippage(params);\n  }\n\n  /**\n   * Build a synthetic bid/ask orderbook for one pair using exponentially-spaced\n   * notional levels capped at each side's remaining OI capacity.\n   * See {@link OstiumSubgraphClient.getSimOrderbook} for full semantics.\n   */\n  getSimOrderbook(params: GetSimOrderbookParams): Promise<SimOrderbookResponse> {\n    return this.subgraph.getSimOrderbook(params);\n  }\n\n  /**\n   * Preview a trade before signing it — execution price after spread, fees,\n   * resulting liquidation price, and the checks that would revert on-chain.\n   * See {@link OstiumSubgraphClient.previewOpenTrade} for full semantics.\n   *\n   * ```ts\n   * const preview = await client.previewOpenTrade({\n   *   pairId: 0, isLong: true, collateral: 100, leverage: 10,\n   * });\n   * if (!preview.isValid) console.warn(preview.warnings);\n   * ```\n   */\n  previewOpenTrade(params: PreviewOpenTradeParams): Promise<PreviewOpenTradeResult> {\n    // Default to the client's configured builder fee so a builder-integrated\n    // ticket quotes the fee the trade will actually pay. Pass `builderFeeBps`\n    // explicitly to override, including `0` to preview without one.\n    return this.subgraph.previewOpenTrade({\n      builderFeeBps: this.builderFeeBps,\n      ...params,\n    });\n  }\n\n  /**\n   * Protocol vault balance in USDC — the liquidity backing trader PnL.\n   * See {@link OstiumSubgraphClient.getVaultBalance}.\n   */\n  getVaultBalance(): Promise<number> {\n    return this.subgraph.getVaultBalance();\n  }\n\n  /**\n   * Fetch OHLC candles for a pair from the builder API.\n   *\n   * `from` / `to` are Unix milliseconds; `resolution` is one of\n   * `\"1\"`, `\"5\"`, `\"15\"`, `\"60\"`, `\"240\"`, `\"1D\"`. Pass `sets` to fetch\n   * multiple candle pages and return them as one flattened array.\n   *\n   * ```ts\n   * const candles = await client.getCandles({\n   *   pairId: 0,\n   *   from: Date.now() - 30 * 86_400_000,\n   *   resolution: '1D',\n   *   sets: 3,\n   * });\n   * ```\n   */\n  getCandles(params: GetCandlesParams): Promise<Candle[]> {\n    return this.subgraph.getCandles(params);\n  }\n\n  /**\n   * Open a WebSocket connection to the live price stream.\n   *\n   * Optionally filter to a subset of pairs by `pairId` — same values as returned by\n   * `getPairs()`. When provided, the client sends `{ type: \"subscribe\", pairs }` on\n   * `open` (no `?pairs=` query on the URL). Omit `pairIds` to receive the full feed.\n   *\n   * ```ts\n   * const stream = client.streamPrices([0, 1]);  // BTC and ETH by pairId\n   * stream.onSnapshot(ticks => console.log(ticks));\n   * stream.onTick(tick => console.log(tick.pair, tick.mid));\n   * stream.subscribe([2]);    // add pair\n   * stream.unsubscribe([0]);  // remove pair\n   * stream.close();\n   * ```\n   *\n   * Requires Node.js 18+, Bun, or a browser environment. Bun’s `WebSocket` may fail\n   * some `https://` upgrades; use Node if the connection never reaches `open`.\n   */\n  streamPrices(pairIds?: Array<string | number>): OstiumPriceStream {\n    return this.subgraph.streamPrices(pairIds);\n  }\n\n  /**\n   * Stream price-driven updates for an existing `getOpenPositions()` response.\n   *\n   * Subscribes only to the unique pairs referenced by the response and emits the\n   * full updated positions payload on each relevant price update. Pass an\n   * existing `priceStream` to reuse a websocket your app already owns, or omit\n   * it to let the SDK create a dedicated connection.\n   */\n  streamPositionUpdates(\n    initial: OpenPositionsResponse,\n    priceStream?: OstiumPriceStream,\n  ): OstiumPositionUpdatesStream {\n    return this.subgraph.streamPositionUpdates(initial, priceStream);\n  }\n\n  /**\n   * Stream account confirmation snapshots for one or more traders.\n   *\n   * Emits full snapshots containing pending market orders, active limit/stop\n   * orders, and open trades. Uses subgraph polling plus Alchemy contract logs so\n   * market opens and full closes show up before subgraph indexing completes.\n   *\n   * Pass one or more addresses in `user` to subscribe to multiple accounts on a single\n   * stream; defaults to the connected trader. Emitted snapshots are keyed by\n   * normalized trader address, with `{ positions, orders, limits }` per trader.\n   */\n  streamAccountUpdates(params: StreamAccountUpdatesParams = {}): OstiumAccountUpdatesStream {\n    return this.subgraph.streamAccountUpdates({\n      ...params,\n      user: params.user ?? [this.getTraderAddress()],\n    });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Internal helpers\n  // ─────────────────────────────────────────────────────────────────────────\n\n  private getSetupGaslessDelegationEncoded(): EncodedTx {\n    if (!this.selfGasless || !this.effectiveSender) {\n      throw new OstiumError(\n        'setupGaslessDelegation() is only available in Self + Gasless mode.',\n        OstiumErrorCode.INVALID_CONFIG,\n      );\n    }\n    return encodeSetDelegate(this.effectiveSender, this.contracts.trading);\n  }\n\n  private getApproveUsdcEncoded(amount: string): EncodedTx {\n    if (this.delegated) {\n      throw new OstiumError(\n        'approveUsdc is not available in delegated mode. The trader must approve USDC directly from their own account.',\n        OstiumErrorCode.DELEGATION_FAILED,\n      );\n    }\n    const rawAmount = amount === 'max' ? maxUint256 : parseUsdc(amount);\n    return encodeUsdcApprove(this.contracts.tradingStorage, rawAmount, this.contracts.usdc);\n  }\n\n  private getSetDelegateEncoded(delegateAddress: Address): EncodedTx {\n    return encodeSetDelegate(delegateAddress, this.contracts.trading);\n  }\n\n  private getRemoveDelegateEncoded(): EncodedTx {\n    return encodeRemoveDelegate(this.contracts.trading);\n  }\n\n  private prepareEncoded(encoded: EncodedTx): EncodedTx {\n    const signer = this.requireBuildCapability();\n    return signer.prepare(encoded);\n  }\n\n  private buildPreparedTx(encoded: EncodedTx): BuiltTxRequest {\n    return this.toBuiltTxRequest(this.prepareEncoded(encoded));\n  }\n\n  private buildDirectEoaTx(encoded: EncodedTx): BuiltTxRequest {\n    if (!this.canBuildTransactions() || !this.traderAddress) {\n      throw new OstiumError(\n        'This client cannot build transactions. Use one of the createSelfAnd*/createDelegatedAnd* factories.',\n        OstiumErrorCode.INVALID_CONFIG,\n      );\n    }\n    return {\n      kind: 'eoa',\n      to: encoded.to,\n      data: encoded.data,\n      value: encoded.value,\n      from: this.traderAddress,\n      traderAddress: this.traderAddress,\n    };\n  }\n\n  private toBuiltTxRequest(encoded: EncodedTx): BuiltTxRequest {\n    if (!this.canBuildTransactions() || !this.traderAddress || !this.effectiveSender) {\n      throw new OstiumError(\n        'This client cannot build transactions. Use one of the createSelfAnd*/createDelegatedAnd* factories.',\n        OstiumErrorCode.INVALID_CONFIG,\n      );\n    }\n\n    if (this.gasless) {\n      return {\n        kind: 'safe',\n        safeAddress: this.effectiveSender,\n        traderAddress: this.traderAddress,\n        calls: [encoded],\n      };\n    }\n\n    return {\n      kind: 'eoa',\n      to: encoded.to,\n      data: encoded.data,\n      value: encoded.value,\n      from: this.effectiveSender,\n      traderAddress: this.traderAddress,\n    };\n  }\n\n  private async submitPrepared(encoded: EncodedTx): Promise<SubmissionResult> {\n    const submitter = this.requireSubmitCapability();\n    const isTradingAction = encoded.to.toLowerCase() === this.contracts.trading.toLowerCase();\n    const result = await submitter.submit(this.prepareEncoded(encoded));\n    if (isTradingAction) reportTradeSubmission(this.builderApiUrl, result.txHash);\n    return result;\n  }\n\n  /** Direct EOA submission — used only in Self + Gasless for approveUsdc and setupGaslessDelegation. */\n  private async submitDirectEoa(encoded: EncodedTx): Promise<SubmissionResult> {\n    if (!this.eoaSubmit) {\n      throw new OstiumError(\n        'This client cannot submit direct EOA transactions.',\n        OstiumErrorCode.INVALID_CONFIG,\n      );\n    }\n    try {\n      return await this.eoaSubmit(encoded);\n    } catch (err) {\n      if (err instanceof OstiumError) throw err;\n      const msg = err instanceof Error ? err.message : String(err);\n      const lower = msg.toLowerCase();\n      if (lower.includes('revert')) {\n        throw new OstiumError(`Contract reverted: ${msg}`, OstiumErrorCode.CONTRACT_ERROR, err);\n      }\n      if (lower.includes('network') || lower.includes('timeout') || lower.includes('fetch')) {\n        throw new OstiumError(`Network error: ${msg}`, OstiumErrorCode.NETWORK_ERROR, err);\n      }\n      throw new OstiumError(`Transaction failed: ${msg}`, OstiumErrorCode.SUBMISSION_FAILED, err);\n    }\n  }\n\n  private requireBuildCapability(): SignerStrategy {\n    if (!this.signer) {\n      throw new OstiumError(\n        'This client cannot build transactions. Use one of the createSelfAnd*/createDelegatedAnd* factories.',\n        OstiumErrorCode.INVALID_CONFIG,\n      );\n    }\n    return this.signer;\n  }\n\n  private requireSubmitCapability(): SubmissionStrategy {\n    if (!this.submitter) {\n      throw new OstiumError(\n        'This client does not have submission credentials. Use the corresponding get*Tx() method or initialize with a private key.',\n        OstiumErrorCode.INVALID_CONFIG,\n      );\n    }\n    return this.submitter;\n  }\n\n  private resolveSlippage(override?: number): number {\n    return override ?? this.defaultSlippageBps;\n  }\n}\n","// Standalone trading math — no client, no network, no subgraph shapes.\n//\n// Bots, backtesters and risk dashboards need these numbers without\n// constructing a client. Every function is a thin marshalling layer over\n// `@ostium/formulae`, the same package the contracts use; the inputs and\n// outputs are plain JS numbers so nothing here needs on-chain decimal scales.\n\nimport {\n  CurrentTotalProfitP,\n  CurrentTotalProfitRaw,\n  GetTradeLiquidationPrice,\n} from '@ostium/formulae';\nimport { formatUsdc, formatTokens, parseUsdc, parseTokens, parseLeverage } from './data/internal/decimal.js';\n\nexport interface LiquidationPriceParams {\n  /** Price the position opened at. */\n  entryPx: number;\n  isLong: boolean;\n  /** Collateral backing the position, in USDC. */\n  collateral: number;\n  leverage: number;\n  /** Max leverage allowed for the pair — sets the maintenance margin. */\n  maxLeverage: number;\n  /** Rollover fee accrued so far, in USDC. Defaults to 0 (a fresh position). */\n  rollover?: number;\n  /** Funding fee accrued so far, in USDC. Defaults to 0. */\n  funding?: number;\n}\n\n/**\n * Price at which a position is liquidated.\n *\n * Accrued fees push the liquidation price toward the entry price, so a\n * position held for a long time liquidates sooner than it did at open.\n *\n * ```ts\n * liquidationPrice({\n *   entryPx: 100_000, isLong: true, collateral: 1000, leverage: 10, maxLeverage: 100,\n * });  // → 90_500\n * ```\n */\nexport function liquidationPrice(params: LiquidationPriceParams): number {\n  const { entryPx, isLong, collateral, leverage, maxLeverage, rollover = 0, funding = 0 } = params;\n  if (!entryPx || !collateral || !leverage) return 0;\n\n  const px = formatTokens(\n    GetTradeLiquidationPrice(\n      parseTokens(entryPx).toString(),\n      isLong,\n      parseUsdc(collateral).toString(),\n      parseLeverage(leverage).toString(),\n      parseUsdc(rollover).toString(),\n      parseUsdc(funding).toString(),\n      parseLeverage(maxLeverage).toString(),\n    ),\n  );\n  return px > 0 ? px : 0;\n}\n\nexport interface PnLParams {\n  entryPx: number;\n  /** Current mark price. */\n  markPx: number;\n  isLong: boolean;\n  collateral: number;\n  leverage: number;\n  /**\n   * Highest leverage the position has ever run at. Defaults to `leverage`.\n   * Only differs after collateral has been added or removed.\n   */\n  highestLeverage?: number;\n  rollover?: number;\n  funding?: number;\n}\n\nexport interface PnLResult {\n  /** Net PnL in USDC, after rollover and funding. */\n  netPnl: number;\n  /** Net PnL as a percentage of collateral. */\n  netPnlPercent: number;\n  /** `collateral + netPnl` — what the position is worth if closed now. */\n  netValue: number;\n}\n\n/**\n * PnL for an open position at a given mark price.\n *\n * ```ts\n * pnl({ entryPx: 100_000, markPx: 105_000, isLong: true, collateral: 1000, leverage: 10 });\n * // → { netPnl: 500, netPnlPercent: 50, netValue: 1500 }\n * ```\n */\nexport function pnl(params: PnLParams): PnLResult {\n  const {\n    entryPx, markPx, isLong, collateral, leverage,\n    highestLeverage = params.leverage, rollover = 0, funding = 0,\n  } = params;\n  if (!entryPx || !markPx || !collateral || !leverage) {\n    return { netPnl: 0, netPnlPercent: 0, netValue: collateral || 0 };\n  }\n\n  const collateralRaw = parseUsdc(collateral).toString();\n  const netPnlRaw = CurrentTotalProfitRaw(\n    parseTokens(entryPx).toString(),\n    parseTokens(markPx).toString(),\n    isLong,\n    parseLeverage(leverage).toString(),\n    parseLeverage(highestLeverage).toString(),\n    collateralRaw,\n    parseUsdc(rollover).toString(),\n    parseUsdc(funding).toString(),\n  );\n\n  const netPnl = formatUsdc(netPnlRaw);\n  return {\n    netPnl,\n    // CurrentTotalProfitP already returns a percentage — do not rescale.\n    netPnlPercent: formatUsdc(CurrentTotalProfitP(netPnlRaw, collateralRaw)),\n    netValue: collateral + netPnl,\n  };\n}\n"]}