@symmio/trading-core 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/balance-history/get-balance-history/types.d.ts +1 -1
- package/dist/balance-history/get-balance-history/types.js.map +1 -1
- package/dist/core/chains/actions/get-chain-config.d.ts +1 -1
- package/dist/core/chains/actions/get-chain-config.js.map +1 -1
- package/dist/core/chains/actions/get-default-solver.d.ts +1 -1
- package/dist/core/chains/actions/get-default-solver.js.map +1 -1
- package/dist/core/chains/actions/list-supported-chains.js.map +1 -1
- package/dist/core/chains/registry.d.ts.map +1 -1
- package/dist/core/chains/registry.js +52 -50
- package/dist/core/chains/registry.js.map +1 -1
- package/dist/core/chains/supported-chains.d.ts +3 -3
- package/dist/core/chains/supported-chains.d.ts.map +1 -1
- package/dist/core/chains/supported-chains.js +1 -1
- package/dist/core/chains/supported-chains.js.map +1 -1
- package/dist/core/chains/types.d.ts +18 -4
- package/dist/core/chains/types.d.ts.map +1 -1
- package/dist/core/chains/types.js.map +1 -1
- package/dist/core/config/create-config.d.ts +7 -7
- package/dist/core/config/create-config.d.ts.map +1 -1
- package/dist/core/config/create-config.js +39 -38
- package/dist/core/config/create-config.js.map +1 -1
- package/dist/core/config/merge-chain-config.js +1 -0
- package/dist/core/config/merge-chain-config.js.map +1 -1
- package/dist/index.d.ts +18 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +318 -316
- package/dist/margin/calculate-margin-risk.d.ts +1 -1
- package/dist/margin/calculate-margin-risk.js.map +1 -1
- package/dist/notifications/types.d.ts +1 -1
- package/dist/notifications/types.d.ts.map +1 -1
- package/dist/quotes/close-planning/min-remaining-quantity.d.ts +1 -1
- package/dist/quotes/close-planning/min-remaining-quantity.js.map +1 -1
- package/dist/quotes/get-quote-history/query-document.d.ts +1 -1
- package/dist/quotes/get-quote-history/query-document.js.map +1 -1
- package/dist/quotes/get-quote-history/types.d.ts +2 -2
- package/dist/quotes/get-quote-history/types.js.map +1 -1
- package/dist/quotes/grouping/aggregate-metrics.d.ts +1 -1
- package/dist/quotes/grouping/aggregate-metrics.js.map +1 -1
- package/dist/quotes/open-price.d.ts +10 -10
- package/dist/quotes/open-price.d.ts.map +1 -1
- package/dist/quotes/open-price.js +1 -1
- package/dist/quotes/open-price.js.map +1 -1
- package/dist/quotes/upnl/calculate-quote-leverage.d.ts +8 -6
- package/dist/quotes/upnl/calculate-quote-leverage.d.ts.map +1 -1
- package/dist/quotes/upnl/calculate-quote-leverage.js.map +1 -1
- package/dist/shared/utils/query.d.ts +2 -2
- package/dist/shared/utils/query.js.map +1 -1
- package/dist/solvers/force-close/force-close-position.js +1 -1
- package/dist/solvers/force-close/force-close-position.js.map +1 -1
- package/dist/solvers/force-close/get-force-close-params.js +1 -1
- package/dist/solvers/force-close/get-force-close-params.js.map +1 -1
- package/dist/solvers/instant-close/shared/calldata.js +1 -1
- package/dist/solvers/instant-close/shared/calldata.js.map +1 -1
- package/dist/solvers/instant-open/get-instant-open-fees/get-instant-open-fees.d.ts +129 -0
- package/dist/solvers/instant-open/get-instant-open-fees/get-instant-open-fees.d.ts.map +1 -0
- package/dist/solvers/instant-open/get-instant-open-fees/get-instant-open-fees.js +115 -0
- package/dist/solvers/instant-open/get-instant-open-fees/get-instant-open-fees.js.map +1 -0
- package/dist/solvers/instant-open/get-instant-open-fees/index.d.ts +3 -0
- package/dist/solvers/instant-open/get-instant-open-fees/index.d.ts.map +1 -0
- package/dist/solvers/instant-open/get-instant-open-fees/query.d.ts +34 -0
- package/dist/solvers/instant-open/get-instant-open-fees/query.d.ts.map +1 -0
- package/dist/solvers/instant-open/get-instant-open-fees/query.js +33 -0
- package/dist/solvers/instant-open/get-instant-open-fees/query.js.map +1 -0
- package/dist/solvers/instant-open/index.d.ts +1 -0
- package/dist/solvers/instant-open/index.d.ts.map +1 -1
- package/dist/solvers/instant-open/instant-open/adapters/enigma-instant-open.d.ts.map +1 -1
- package/dist/solvers/instant-open/instant-open/adapters/enigma-instant-open.js +58 -55
- package/dist/solvers/instant-open/instant-open/adapters/enigma-instant-open.js.map +1 -1
- package/dist/solvers/instant-open/instant-open/types.d.ts +14 -4
- package/dist/solvers/instant-open/instant-open/types.d.ts.map +1 -1
- package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.d.ts +45 -10
- package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.d.ts.map +1 -1
- package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.js +157 -72
- package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.js.map +1 -1
- package/dist/solvers/instant-open/shared/calldata.d.ts +35 -7
- package/dist/solvers/instant-open/shared/calldata.d.ts.map +1 -1
- package/dist/solvers/instant-open/shared/calldata.js +56 -14
- package/dist/solvers/instant-open/shared/calldata.js.map +1 -1
- package/dist/solvers/instant-open/shared/index.d.ts +1 -0
- package/dist/solvers/instant-open/shared/index.d.ts.map +1 -1
- package/dist/solvers/instant-open/shared/open-estimate-guard.d.ts +89 -0
- package/dist/solvers/instant-open/shared/open-estimate-guard.d.ts.map +1 -0
- package/dist/solvers/instant-open/shared/open-estimate-guard.js +52 -0
- package/dist/solvers/instant-open/shared/open-estimate-guard.js.map +1 -0
- package/dist/solvers/instant-open/shared/selectors.d.ts +46 -7
- package/dist/solvers/instant-open/shared/selectors.d.ts.map +1 -1
- package/dist/solvers/instant-open/shared/selectors.js +12 -5
- package/dist/solvers/instant-open/shared/selectors.js.map +1 -1
- package/dist/solvers/instant-open/shared/trade-math.d.ts +112 -8
- package/dist/solvers/instant-open/shared/trade-math.d.ts.map +1 -1
- package/dist/solvers/instant-open/shared/trade-math.js +59 -25
- package/dist/solvers/instant-open/shared/trade-math.js.map +1 -1
- package/dist/solvers/instant-open/shared/types.d.ts +32 -0
- package/dist/solvers/instant-open/shared/types.d.ts.map +1 -1
- package/dist/solvers/instant-open/shared/types.js.map +1 -1
- package/dist/solvers/markets/adapters/enigma-markets.d.ts.map +1 -1
- package/dist/solvers/markets/adapters/enigma-markets.js +38 -32
- package/dist/solvers/markets/adapters/enigma-markets.js.map +1 -1
- package/dist/solvers/markets/types.d.ts +15 -0
- package/dist/solvers/markets/types.d.ts.map +1 -1
- package/dist/solvers/revenue/get-solver-revenue.d.ts +11 -11
- package/dist/solvers/revenue/get-solver-revenue.d.ts.map +1 -1
- package/dist/solvers/revenue/get-solver-revenue.js +12 -12
- package/dist/solvers/revenue/get-solver-revenue.js.map +1 -1
- package/dist/solvers/revenue/query.d.ts +2 -2
- package/dist/solvers/revenue/query.d.ts.map +1 -1
- package/dist/solvers/revenue/query.js +1 -1
- package/dist/solvers/revenue/query.js.map +1 -1
- package/dist/solvers/revenue/to-solver-revenue.d.ts +3 -2
- package/dist/solvers/revenue/to-solver-revenue.d.ts.map +1 -1
- package/dist/solvers/revenue/to-solver-revenue.js.map +1 -1
- package/dist/solvers/shared/index.d.ts +1 -0
- package/dist/solvers/shared/index.d.ts.map +1 -1
- package/dist/solvers/shared/resolvers/resolve-market.d.ts +36 -5
- package/dist/solvers/shared/resolvers/resolve-market.d.ts.map +1 -1
- package/dist/solvers/shared/resolvers/resolve-market.js +30 -8
- package/dist/solvers/shared/resolvers/resolve-market.js.map +1 -1
- package/dist/solvers/shared/resolvers/types.d.ts +14 -0
- package/dist/solvers/shared/resolvers/types.d.ts.map +1 -1
- package/dist/solvers/shared/solver-close-fee.d.ts +76 -0
- package/dist/solvers/shared/solver-close-fee.d.ts.map +1 -0
- package/dist/solvers/shared/solver-close-fee.js +26 -0
- package/dist/solvers/shared/solver-close-fee.js.map +1 -0
- package/dist/solvers/symbols/to-solver-symbol.d.ts.map +1 -1
- package/dist/solvers/symbols/to-solver-symbol.js +36 -30
- package/dist/solvers/symbols/to-solver-symbol.js.map +1 -1
- package/dist/solvers/symbols/types.d.ts +22 -1
- package/dist/solvers/symbols/types.d.ts.map +1 -1
- package/dist/solvers/types/generated/enigma-solver.d.ts +8 -99
- package/dist/solvers/types/generated/enigma-solver.d.ts.map +1 -1
- package/dist/solvers/types/generated/enigma-solver.js +5 -11
- package/dist/solvers/types/generated/enigma-solver.js.map +1 -1
- package/dist/solvers/types/generated/rasa-solver.js +2 -2
- package/dist/solvers/types/generated/rasa-solver.js.map +1 -1
- package/dist/symmio-contracts/abi/index.d.ts +4 -4
- package/dist/symmio-contracts/abi/{v0.8.5 → v0.8.6}/account-layer.d.ts +499 -132
- package/dist/symmio-contracts/abi/{v0.8.5 → v0.8.6}/account-layer.d.ts.map +1 -1
- package/dist/symmio-contracts/abi/{v0.8.5 → v0.8.6}/account-layer.js +591 -149
- package/dist/symmio-contracts/abi/v0.8.6/account-layer.js.map +1 -0
- package/dist/symmio-contracts/abi/{v0.8.5 → v0.8.6}/index.d.ts.map +1 -1
- package/dist/symmio-contracts/abi/{v0.8.5 → v0.8.6}/instant-layer.d.ts +24 -24
- package/dist/symmio-contracts/abi/{v0.8.5 → v0.8.6}/instant-layer.d.ts.map +1 -1
- package/dist/symmio-contracts/abi/{v0.8.5 → v0.8.6}/instant-layer.js +28 -28
- package/dist/symmio-contracts/abi/v0.8.6/instant-layer.js.map +1 -0
- package/dist/symmio-contracts/abi/{v0.8.5 → v0.8.6}/symmio.d.ts +4724 -1019
- package/dist/symmio-contracts/abi/{v0.8.5 → v0.8.6}/symmio.d.ts.map +1 -1
- package/dist/symmio-contracts/abi/{v0.8.5 → v0.8.6}/symmio.js +12750 -8308
- package/dist/symmio-contracts/abi/v0.8.6/symmio.js.map +1 -0
- package/dist/symmio-contracts/account-layer/actions/add-margin.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/add-margin.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/cancel-registration.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/cancel-registration.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/create-sub-accounts.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/create-sub-accounts.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/delete-sub-account.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/delete-sub-account.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/deposit-and-allocate-for-account.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/deposit-and-allocate-for-account.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/deposit-for-account.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/deposit-for-account.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/edit-account-name.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/edit-account-name.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/generate-account-manager-address.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/generate-account-manager-address.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-account-balance-info.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-account-balance-info.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-account-balance-of.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-account-balance-of.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-affiliate-state.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-affiliate-state.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-sub-account-virtual-nonce.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-sub-account-virtual-nonce.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-sub-account.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-sub-account.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-sub-accounts-count-of-user.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-sub-accounts-count-of-user.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-user-sub-accounts-addresses.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-user-sub-accounts-addresses.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-user-sub-accounts.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-user-sub-accounts.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-virtual-account.d.ts +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-virtual-account.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-virtual-account.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-virtual-accounts-addresses-of-sub-account.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/get-virtual-accounts-addresses-of-sub-account.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/predict-next-virtual-account.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/predict-next-virtual-account.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/remove-margin.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/remove-margin.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/request-to-register-affiliate.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/request-to-register-affiliate.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-add-margin.d.ts +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-add-margin.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-add-margin.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-cancel-registration.d.ts +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-cancel-registration.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-cancel-registration.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-create-sub-accounts.d.ts +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-create-sub-accounts.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-create-sub-accounts.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-delete-sub-account.d.ts +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-delete-sub-account.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-delete-sub-account.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-deposit-and-allocate-for-account.d.ts +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-deposit-and-allocate-for-account.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-deposit-and-allocate-for-account.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-deposit-for-account.d.ts +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-deposit-for-account.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-deposit-for-account.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-edit-account-name.d.ts +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-edit-account-name.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-edit-account-name.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-remove-margin.d.ts +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-remove-margin.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-remove-margin.js.map +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-request-to-register-affiliate.d.ts +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-request-to-register-affiliate.js +1 -1
- package/dist/symmio-contracts/account-layer/actions/simulate-request-to-register-affiliate.js.map +1 -1
- package/dist/symmio-contracts/account-layer/types.d.ts +10 -10
- package/dist/symmio-contracts/account-layer/types.js.map +1 -1
- package/dist/symmio-contracts/instant-layer/actions/get-delegation-expiry.js +1 -1
- package/dist/symmio-contracts/instant-layer/actions/get-delegation-expiry.js.map +1 -1
- package/dist/symmio-contracts/instant-layer/actions/get-is-delegation-active.js +1 -1
- package/dist/symmio-contracts/instant-layer/actions/get-is-delegation-active.js.map +1 -1
- package/dist/symmio-contracts/instant-layer/actions/grant-delegation.js +1 -1
- package/dist/symmio-contracts/instant-layer/actions/grant-delegation.js.map +1 -1
- package/dist/symmio-contracts/instant-layer/actions/simulate-grant-delegation.d.ts +1 -1
- package/dist/symmio-contracts/instant-layer/actions/simulate-grant-delegation.js +1 -1
- package/dist/symmio-contracts/instant-layer/actions/simulate-grant-delegation.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/allocate.js +1 -1
- package/dist/symmio-contracts/symmio/actions/allocate.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/deallocate-and-initiate-withdraw.d.ts +1 -1
- package/dist/symmio-contracts/symmio/actions/deallocate-and-initiate-withdraw.js +1 -1
- package/dist/symmio-contracts/symmio/actions/deallocate-and-initiate-withdraw.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/deallocate.js +1 -1
- package/dist/symmio-contracts/symmio/actions/deallocate.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/finalize-withdraw-request.js +1 -1
- package/dist/symmio-contracts/symmio/actions/finalize-withdraw-request.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/force-cancel-close-request.js +1 -1
- package/dist/symmio-contracts/symmio/actions/force-cancel-close-request.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/force-cancel-quote.js +1 -1
- package/dist/symmio-contracts/symmio/actions/force-cancel-quote.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/get-cool-downs-of-ma.js +1 -1
- package/dist/symmio-contracts/symmio/actions/get-cool-downs-of-ma.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/get-fee-for-user.js +1 -1
- package/dist/symmio-contracts/symmio/actions/get-fee-for-user.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/get-last-withdraw-request-id.js +1 -1
- package/dist/symmio-contracts/symmio/actions/get-last-withdraw-request-id.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/get-onchain-contract-markets.js +1 -1
- package/dist/symmio-contracts/symmio/actions/get-onchain-contract-markets.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/get-party-a-open-positions.js +1 -1
- package/dist/symmio-contracts/symmio/actions/get-party-a-open-positions.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/get-party-a-pending-quotes.js +1 -1
- package/dist/symmio-contracts/symmio/actions/get-party-a-pending-quotes.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/get-pending-quotes.js +1 -1
- package/dist/symmio-contracts/symmio/actions/get-pending-quotes.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/get-pending-withdraw-requests.d.ts.map +1 -1
- package/dist/symmio-contracts/symmio/actions/get-pending-withdraw-requests.js +10 -9
- package/dist/symmio-contracts/symmio/actions/get-pending-withdraw-requests.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/get-quote.js +1 -1
- package/dist/symmio-contracts/symmio/actions/get-quote.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/get-withdraw-requests.d.ts.map +1 -1
- package/dist/symmio-contracts/symmio/actions/get-withdraw-requests.js +9 -8
- package/dist/symmio-contracts/symmio/actions/get-withdraw-requests.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/get-withdrawable-time.js +1 -1
- package/dist/symmio-contracts/symmio/actions/get-withdrawable-time.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/initiate-withdraw.d.ts +1 -1
- package/dist/symmio-contracts/symmio/actions/initiate-withdraw.js +1 -1
- package/dist/symmio-contracts/symmio/actions/initiate-withdraw.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/request-cancel-withdraw.js +1 -1
- package/dist/symmio-contracts/symmio/actions/request-cancel-withdraw.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/request-to-cancel-close-request.js +1 -1
- package/dist/symmio-contracts/symmio/actions/request-to-cancel-close-request.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/request-to-cancel-quote.js +1 -1
- package/dist/symmio-contracts/symmio/actions/request-to-cancel-quote.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/simulate-allocate.js +1 -1
- package/dist/symmio-contracts/symmio/actions/simulate-allocate.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/simulate-deallocate-and-initiate-withdraw.js +1 -1
- package/dist/symmio-contracts/symmio/actions/simulate-deallocate-and-initiate-withdraw.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/simulate-deallocate.js +1 -1
- package/dist/symmio-contracts/symmio/actions/simulate-deallocate.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/simulate-finalize-withdraw-request.d.ts +1 -1
- package/dist/symmio-contracts/symmio/actions/simulate-finalize-withdraw-request.js +1 -1
- package/dist/symmio-contracts/symmio/actions/simulate-finalize-withdraw-request.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/simulate-initiate-withdraw.js +1 -1
- package/dist/symmio-contracts/symmio/actions/simulate-initiate-withdraw.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/simulate-request-cancel-withdraw.js +1 -1
- package/dist/symmio-contracts/symmio/actions/simulate-request-cancel-withdraw.js.map +1 -1
- package/dist/symmio-contracts/symmio/actions/withdraw.d.ts +1 -1
- package/dist/symmio-contracts/symmio/actions/withdraw.js.map +1 -1
- package/dist/symmio-contracts/symmio/internal/call-as-sub-account.js +1 -1
- package/dist/symmio-contracts/symmio/internal/call-as-sub-account.js.map +1 -1
- package/dist/symmio-contracts/symmio/internal/simulate-call-as-sub-account.d.ts +1 -1
- package/dist/symmio-contracts/symmio/internal/simulate-call-as-sub-account.js +1 -1
- package/dist/symmio-contracts/symmio/internal/simulate-call-as-sub-account.js.map +1 -1
- package/dist/symmio-contracts/symmio/internal/withdraw-requests-v0-8-5.d.ts +214 -0
- package/dist/symmio-contracts/symmio/internal/withdraw-requests-v0-8-5.d.ts.map +1 -0
- package/dist/symmio-contracts/symmio/internal/withdraw-requests-v0-8-5.js +248 -0
- package/dist/symmio-contracts/symmio/internal/withdraw-requests-v0-8-5.js.map +1 -0
- package/dist/symmio-contracts/symmio/parts.d.ts +1 -1
- package/dist/symmio-contracts/symmio/parts.js.map +1 -1
- package/dist/symmio-contracts/symmio/types.d.ts +29 -19
- package/dist/symmio-contracts/symmio/types.d.ts.map +1 -1
- package/dist/symmio-contracts/symmio/types.js.map +1 -1
- package/dist/tpsl/grouping/notional.js +6 -6
- package/dist/websocket/tpsl/parse-tpsl-frame.d.ts +1 -1
- package/dist/websocket/tpsl/parse-tpsl-frame.js.map +1 -1
- package/dist/websocket/tpsl/watch-tpsl-notifications.d.ts +1 -1
- package/dist/websocket/tpsl/watch-tpsl-notifications.js.map +1 -1
- package/package.json +1 -1
- package/dist/solvers/add-solver-whitelist/add-solver-whitelist.d.ts +0 -27
- package/dist/solvers/add-solver-whitelist/add-solver-whitelist.d.ts.map +0 -1
- package/dist/solvers/add-solver-whitelist/add-solver-whitelist.js +0 -25
- package/dist/solvers/add-solver-whitelist/add-solver-whitelist.js.map +0 -1
- package/dist/solvers/add-solver-whitelist/index.d.ts +0 -3
- package/dist/solvers/add-solver-whitelist/index.d.ts.map +0 -1
- package/dist/solvers/add-solver-whitelist/query.d.ts +0 -19
- package/dist/solvers/add-solver-whitelist/query.d.ts.map +0 -1
- package/dist/solvers/add-solver-whitelist/query.js +0 -12
- package/dist/solvers/add-solver-whitelist/query.js.map +0 -1
- package/dist/symmio-contracts/abi/v0.8.5/account-layer.js.map +0 -1
- package/dist/symmio-contracts/abi/v0.8.5/instant-layer.js.map +0 -1
- package/dist/symmio-contracts/abi/v0.8.5/symmio.js.map +0 -1
- /package/dist/symmio-contracts/abi/{v0.8.5 → v0.8.6}/index.d.ts +0 -0
package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.js
CHANGED
|
@@ -1,90 +1,175 @@
|
|
|
1
1
|
import { SymmError as e } from "../../../shared/errors/symm-error.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
2
|
+
import { calculateExpectedSettlementLoss as t, calculateMargin as n, calculateSolverFees as r, calculateTradeParams as i, computePlatformFee as a, toWeiBigInt as o } from "../shared/trade-math.js";
|
|
3
|
+
import { decimalPriceToWei as s } from "../../../shared/utils/price.js";
|
|
4
|
+
import { assertOpenEstimateWithinSlippage as c, assertValidSlippage as l, deriveAutoSlippage as u, fetchOpenEstimatePrice as d } from "../shared/open-estimate-guard.js";
|
|
5
|
+
import { resolveMarkPrice as f } from "../../shared/resolvers/resolve-mark-price.js";
|
|
6
|
+
import { resolveMarket as p } from "../../shared/resolvers/resolve-market.js";
|
|
7
|
+
import { resolveFeeRates as m } from "./resolvers/resolve-fee-rates.js";
|
|
8
|
+
import { resolveLockedParams as h } from "./resolvers/resolve-locked-params.js";
|
|
7
9
|
//#region src/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.ts
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
10
|
+
var g = "0.01";
|
|
11
|
+
function _(t, n) {
|
|
12
|
+
let r = s(n ?? g);
|
|
13
|
+
if (r === void 0) throw new e("validation", "INVALID_SOLVER_FEE_CAP", `prepareInstantOpenParams: market ${t} "${n}" is not a valid decimal ratio.`);
|
|
14
|
+
return r;
|
|
15
|
+
}
|
|
16
|
+
async function v(s, g) {
|
|
17
|
+
g.slippage !== void 0 && l(g.slippage);
|
|
18
|
+
let v = s.getSolver({
|
|
19
|
+
chainId: g.chainId,
|
|
20
|
+
solverId: g.solverId
|
|
21
|
+
}).id === "enigma";
|
|
22
|
+
if (g.slippage === void 0 && !v) throw new e("validation", "SLIPPAGE_REQUIRED", "prepareInstantOpenParams: slippage is required on this solver — auto-derived slippage is lowcap-only.");
|
|
23
|
+
let y = s.getChainConfig(g.chainId).contractsVersion === "0.8.6", b = await p(s, {
|
|
24
|
+
chainId: g.chainId,
|
|
25
|
+
solverId: g.solverId,
|
|
26
|
+
marketId: g.market.id,
|
|
27
|
+
marketName: g.market.name,
|
|
28
|
+
pricePrecision: g.market.pricePrecision,
|
|
29
|
+
quantityPrecision: g.market.quantityPrecision,
|
|
30
|
+
minOpenSolverFeeCap: g.market.minOpenSolverFeeCap,
|
|
31
|
+
minCloseSolverFeeCap: g.market.minCloseSolverFeeCap,
|
|
32
|
+
includeSolverFeeCaps: y,
|
|
33
|
+
hedgerFeeOpen: g.market.hedgerFeeOpen,
|
|
34
|
+
hedgerFeeClose: g.market.hedgerFeeClose,
|
|
35
|
+
hedgerFeeCloseEarlyRate: g.market.hedgerFeeCloseEarlyRate,
|
|
36
|
+
hedgerFeeCloseEarlyThreshold: g.market.hedgerFeeCloseEarlyThreshold,
|
|
37
|
+
hedgerFeeCloseStandardThreshold: g.market.hedgerFeeCloseStandardThreshold,
|
|
38
|
+
includeHedgerFees: v
|
|
39
|
+
}), [x, S, C] = await Promise.all([
|
|
40
|
+
f(s, {
|
|
41
|
+
chainId: g.chainId,
|
|
42
|
+
solverId: g.solverId,
|
|
43
|
+
marketName: b.name,
|
|
44
|
+
markPrice: g.markPrice
|
|
22
45
|
}),
|
|
23
|
-
|
|
24
|
-
chainId:
|
|
25
|
-
solverId:
|
|
26
|
-
marketName:
|
|
27
|
-
leverage:
|
|
28
|
-
lockedParamPercent:
|
|
46
|
+
h(s, {
|
|
47
|
+
chainId: g.chainId,
|
|
48
|
+
solverId: g.solverId,
|
|
49
|
+
marketName: b.name,
|
|
50
|
+
leverage: g.leverage,
|
|
51
|
+
lockedParamPercent: g.lockedParamPercent
|
|
29
52
|
}),
|
|
30
|
-
s
|
|
31
|
-
chainId:
|
|
32
|
-
subAccountAddress:
|
|
33
|
-
marketId:
|
|
34
|
-
feeRates:
|
|
53
|
+
m(s, {
|
|
54
|
+
chainId: g.chainId,
|
|
55
|
+
subAccountAddress: g.subAccountAddress,
|
|
56
|
+
marketId: g.market.id,
|
|
57
|
+
feeRates: g.feeRates
|
|
35
58
|
})
|
|
36
|
-
]),
|
|
37
|
-
markPrice:
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
userInput: u.initialMargin,
|
|
59
|
+
]), w = {
|
|
60
|
+
markPrice: x,
|
|
61
|
+
positionType: g.positionType,
|
|
62
|
+
userInput: g.initialMargin,
|
|
41
63
|
inputField: "PRICE",
|
|
42
|
-
leverage:
|
|
43
|
-
pricePrecision:
|
|
44
|
-
quantityPrecision:
|
|
45
|
-
cvaPercent:
|
|
46
|
-
lfPercent:
|
|
47
|
-
partyAmmPercent:
|
|
48
|
-
partyBmmPercent:
|
|
64
|
+
leverage: g.leverage,
|
|
65
|
+
pricePrecision: b.pricePrecision,
|
|
66
|
+
quantityPrecision: b.quantityPrecision,
|
|
67
|
+
cvaPercent: S.cva,
|
|
68
|
+
lfPercent: S.lf,
|
|
69
|
+
partyAmmPercent: S.partyAmm,
|
|
70
|
+
partyBmmPercent: S.partyBmm
|
|
71
|
+
}, T = g.slippage, E = v ? g.estimatedOpenPrice : void 0;
|
|
72
|
+
if (T === void 0) {
|
|
73
|
+
let t = i({
|
|
74
|
+
...w,
|
|
75
|
+
slippage: 0
|
|
76
|
+
});
|
|
77
|
+
if (!t) throw new e("validation", "INVALID_TRADE_PARAMETERS", "Invalid trade parameters: markPrice or initialMargin is zero/NaN.");
|
|
78
|
+
v && E === void 0 && (E = await d(s, {
|
|
79
|
+
chainId: g.chainId,
|
|
80
|
+
solverId: g.solverId,
|
|
81
|
+
symbolId: g.market.id,
|
|
82
|
+
positionType: g.positionType,
|
|
83
|
+
quantity: t.quantity,
|
|
84
|
+
markPrice: x
|
|
85
|
+
})), T = u({
|
|
86
|
+
markPrice: x,
|
|
87
|
+
expectedFillPrice: E,
|
|
88
|
+
positionType: g.positionType
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
let D = i({
|
|
92
|
+
...w,
|
|
93
|
+
slippage: T
|
|
94
|
+
});
|
|
95
|
+
if (!D) throw new e("validation", "INVALID_TRADE_PARAMETERS", "Invalid trade parameters: markPrice or initialMargin is zero/NaN.");
|
|
96
|
+
v && E === void 0 && (E = await d(s, {
|
|
97
|
+
chainId: g.chainId,
|
|
98
|
+
solverId: g.solverId,
|
|
99
|
+
symbolId: g.market.id,
|
|
100
|
+
positionType: g.positionType,
|
|
101
|
+
quantity: D.quantity,
|
|
102
|
+
markPrice: x
|
|
103
|
+
})), E !== void 0 && await c(s, {
|
|
104
|
+
chainId: g.chainId,
|
|
105
|
+
solverId: g.solverId,
|
|
106
|
+
symbolId: g.market.id,
|
|
107
|
+
positionType: g.positionType,
|
|
108
|
+
quantity: D.quantity,
|
|
109
|
+
markPrice: x,
|
|
110
|
+
slippage: T,
|
|
111
|
+
expectedFillPrice: E
|
|
49
112
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
113
|
+
let O = a(C, D.notional, D.notional), { openSolverFee: k, closeSolverFee: A } = v ? r({
|
|
114
|
+
notional: D.notional,
|
|
115
|
+
hedgerFeeOpen: b.hedgerFeeOpen,
|
|
116
|
+
hedgerFeeClose: b.hedgerFeeClose,
|
|
117
|
+
hedgerFeeCloseEarlyRate: b.hedgerFeeCloseEarlyRate,
|
|
118
|
+
hedgerFeeCloseEarlyThreshold: b.hedgerFeeCloseEarlyThreshold,
|
|
119
|
+
hedgerFeeCloseStandardThreshold: b.hedgerFeeCloseStandardThreshold
|
|
120
|
+
}) : {
|
|
121
|
+
openSolverFee: "0",
|
|
122
|
+
closeSolverFee: "0"
|
|
123
|
+
}, j = t({
|
|
124
|
+
positionType: g.positionType,
|
|
125
|
+
markPrice: x,
|
|
126
|
+
expectedFillPrice: E,
|
|
127
|
+
quantity: D.quantity
|
|
128
|
+
}), M = n({
|
|
129
|
+
positionType: g.positionType,
|
|
130
|
+
markPrice: x,
|
|
131
|
+
quantityBasic: D.quantityBasic,
|
|
132
|
+
cva: D.cva,
|
|
133
|
+
lf: D.lf,
|
|
134
|
+
partyAmm: D.partyAmm,
|
|
135
|
+
openSolverFee: k,
|
|
136
|
+
closeSolverFee: A,
|
|
137
|
+
expectedSettlementLoss: j,
|
|
138
|
+
shortFundingBufferPercent: +!!v,
|
|
139
|
+
cvaPercent: S.cva,
|
|
140
|
+
lfPercent: S.lf,
|
|
141
|
+
partyAmmPercent: S.partyAmm,
|
|
142
|
+
platformFee: O
|
|
62
143
|
});
|
|
63
144
|
return {
|
|
64
|
-
chainId:
|
|
65
|
-
solverId:
|
|
66
|
-
from:
|
|
67
|
-
subAccountAddress:
|
|
68
|
-
marketId:
|
|
69
|
-
positionType:
|
|
145
|
+
chainId: g.chainId,
|
|
146
|
+
solverId: g.solverId,
|
|
147
|
+
from: g.from,
|
|
148
|
+
subAccountAddress: g.subAccountAddress,
|
|
149
|
+
marketId: g.market.id,
|
|
150
|
+
positionType: g.positionType,
|
|
70
151
|
order: {
|
|
71
|
-
price:
|
|
72
|
-
quantity:
|
|
152
|
+
price: o(D.requestedOpenPrice),
|
|
153
|
+
quantity: o(D.quantity)
|
|
73
154
|
},
|
|
74
155
|
lockedParam: {
|
|
75
|
-
cva:
|
|
76
|
-
lf:
|
|
77
|
-
partyAmm:
|
|
78
|
-
partyBmm:
|
|
156
|
+
cva: o(D.cva),
|
|
157
|
+
lf: o(D.lf),
|
|
158
|
+
partyAmm: o(D.partyAmm),
|
|
159
|
+
partyBmm: o(D.partyBmm)
|
|
79
160
|
},
|
|
80
|
-
margin: { amount:
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
161
|
+
margin: { amount: o(M) },
|
|
162
|
+
...y ? { solverFeeCaps: {
|
|
163
|
+
openRateCap: _("minOpenSolverFeeCap", b.minOpenSolverFeeCap),
|
|
164
|
+
closeRateCap: _("minCloseSolverFeeCap", b.minCloseSolverFeeCap)
|
|
165
|
+
} } : {},
|
|
166
|
+
uuid: g.uuid,
|
|
167
|
+
addMarginSalt: g.addMarginSalt,
|
|
168
|
+
sendQuoteSalt: g.sendQuoteSalt,
|
|
169
|
+
deadline: g.deadline
|
|
85
170
|
};
|
|
86
171
|
}
|
|
87
172
|
//#endregion
|
|
88
|
-
export {
|
|
173
|
+
export { v as prepareInstantOpenParams };
|
|
89
174
|
|
|
90
175
|
//# sourceMappingURL=prepare-instant-open-params.js.map
|
package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare-instant-open-params.js","names":[],"sources":["../../../../src/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.ts"],"sourcesContent":["import type { Address, Hex } from \"viem\";\nimport type { Config } from \"../../../core/config\";\nimport { SymmError } from \"../../../shared/errors/symm-error\";\nimport type { Compute, WriteSolverParameter } from \"../../../shared/types/properties\";\nimport type { FeeForUser } from \"../../../symmio-contracts/symmio/actions/get-fee-for-user\";\nimport type { ApiLockedParamsBySymbolIdResponse } from \"../../types/generated/enigma-solver\";\nimport type { InstantOpenParameters } from \"../instant-open/types\";\nimport { calculateMargin, calculateTradeParams, computePlatformFee, toWeiBigInt } from \"../shared/trade-math\";\nimport { type InstantOpenMarketData, type PositionType } from \"../shared/types\";\nimport { resolveFeeRates, resolveLockedParams, resolveMarket, resolveMarkPrice } from \"./resolvers\";\n\n/**\n * Parameters for {@link prepareInstantOpenParams} and `instantOpenAuto`.\n *\n * Required = inputs only the caller can know (wallet, session key, trade\n * intent). Optional = anything derivable from solver / price-service / on-chain\n * reads. Pre-fill an optional field to skip its fetch.\n */\nexport type PrepareInstantOpenParameters = Compute<\n WriteSolverParameter & {\n /** Sub-account / partyA address. */\n subAccountAddress: Address;\n /** Market identification + optional pre-fetched precision metadata. */\n market: InstantOpenMarketData;\n /** Trade side. */\n positionType: PositionType;\n /** Collateral (USD) the user enters as initial margin. Decimal string. */\n initialMargin: string;\n /** Position leverage (integer ≥ 1). */\n leverage: number;\n /** Slippage tolerance percent (e.g. `5` for 5%). */\n slippage: number;\n /** Pre-fetched mark price as decimal string. When omitted, fetched via Enigma price service. */\n markPrice?: string;\n /**\n * Pre-fetched solver locked params (matches `getLockedParams` return —\n * `ApiLockedParamsBySymbolIdResponse`). When supplied with all four\n * percent fields, the fetch is skipped.\n */\n lockedParamPercent?: ApiLockedParamsBySymbolIdResponse;\n /**\n * Pre-fetched on-chain fee rates (matches `getFeeForUser` return —\n * `FeeForUser`). When omitted, fetched via `getFeeForUser`.\n */\n feeRates?: FeeForUser;\n /** Forwarded to {@link InstantOpenParameters}. */\n uuid?: string;\n /** Forwarded to {@link InstantOpenParameters}. */\n addMarginSalt?: Hex;\n /** Forwarded to {@link InstantOpenParameters}. */\n sendQuoteSalt?: Hex;\n /** Forwarded to {@link InstantOpenParameters}. */\n deadline?: bigint;\n }\n>;\n\n/**\n * Resolve every input the {@link InstantOpenParameters} primitive needs from a\n * minimal parameter set.\n *\n * Steps:\n * 1. Resolve market metadata, mark price, locked params, and fee rates —\n * concurrent fetches with caller-supplied fields short-circuiting.\n * 2. Run {@link calculateTradeParams} to derive `requestedOpenPrice`,\n * `quantity`, `cva`, `lf`, `partyAmm`, `partyBmm`, `notional`.\n * 3. Run {@link computePlatformFee} + {@link calculateMargin} to derive the\n * `addMargin` amount.\n * 4. Convert all final values to 18-decimal-wei `bigint`.\n *\n * @throws {SymmError} `RESOLVE_MARKET_NOT_FOUND` /\n * `RESOLVE_MARKET_METADATA_INCOMPLETE` /\n * `RESOLVE_MARK_PRICE_NOT_FOUND` / `INVALID_TRADE_PARAMETERS` for\n * missing / invalid resolved inputs.\n */\nexport async function prepareInstantOpenParams(\n config: Config,\n parameters: PrepareInstantOpenParameters,\n): Promise<InstantOpenParameters> {\n const market = await resolveMarket(config, {\n chainId: parameters.chainId,\n solverId: parameters.solverId,\n marketId: parameters.market.id,\n marketName: parameters.market.name,\n pricePrecision: parameters.market.pricePrecision,\n quantityPrecision: parameters.market.quantityPrecision,\n });\n const [markPrice, lockedParams, feeRates] = await Promise.all([\n resolveMarkPrice(config, {\n chainId: parameters.chainId,\n solverId: parameters.solverId,\n marketName: market.name,\n markPrice: parameters.markPrice,\n }),\n resolveLockedParams(config, {\n chainId: parameters.chainId,\n solverId: parameters.solverId,\n marketName: market.name,\n leverage: parameters.leverage,\n lockedParamPercent: parameters.lockedParamPercent,\n }),\n resolveFeeRates(config, {\n chainId: parameters.chainId,\n subAccountAddress: parameters.subAccountAddress,\n marketId: parameters.market.id,\n feeRates: parameters.feeRates,\n }),\n ]);\n\n const tradeCalc = calculateTradeParams({\n markPrice,\n slippage: parameters.slippage,\n positionType: parameters.positionType,\n userInput: parameters.initialMargin,\n inputField: \"PRICE\",\n leverage: parameters.leverage,\n pricePrecision: market.pricePrecision,\n quantityPrecision: market.quantityPrecision,\n cvaPercent: lockedParams.cva,\n lfPercent: lockedParams.lf,\n partyAmmPercent: lockedParams.partyAmm,\n partyBmmPercent: lockedParams.partyBmm,\n });\n if (!tradeCalc) {\n throw new SymmError(\n \"validation\",\n \"INVALID_TRADE_PARAMETERS\",\n \"Invalid trade parameters: markPrice or initialMargin is zero/NaN.\",\n );\n }\n\n const platformFee = computePlatformFee(feeRates, tradeCalc.notional, tradeCalc.notional);\n const marginAmount = calculateMargin({\n positionType: parameters.positionType,\n markPrice,\n quantityBasic: tradeCalc.quantityBasic,\n cva: tradeCalc.cva,\n lf: tradeCalc.lf,\n partyAmm: tradeCalc.partyAmm,\n cvaPercent: lockedParams.cva,\n lfPercent: lockedParams.lf,\n partyAmmPercent: lockedParams.partyAmm,\n platformFee,\n });\n\n return {\n chainId: parameters.chainId,\n /**\n * Carried through deliberately: `instantOpen` resolves the solver from it to\n * fill `partyBsWhiteList` — which is signed into the EIP-712 payload — and to\n * pick the submit URL. Dropping it here would sign against the default\n * solver's address while the quote was priced and sized for another.\n */\n solverId: parameters.solverId,\n from: parameters.from,\n subAccountAddress: parameters.subAccountAddress,\n marketId: parameters.market.id,\n positionType: parameters.positionType,\n order: {\n price: toWeiBigInt(tradeCalc.requestedOpenPrice),\n quantity: toWeiBigInt(tradeCalc.quantity),\n },\n lockedParam: {\n cva: toWeiBigInt(tradeCalc.cva),\n lf: toWeiBigInt(tradeCalc.lf),\n partyAmm: toWeiBigInt(tradeCalc.partyAmm),\n partyBmm: toWeiBigInt(tradeCalc.partyBmm),\n },\n margin: {\n amount: toWeiBigInt(marginAmount),\n },\n uuid: parameters.uuid,\n addMarginSalt: parameters.addMarginSalt,\n sendQuoteSalt: parameters.sendQuoteSalt,\n deadline: parameters.deadline,\n };\n}\n"],"mappings":";;;;;;;AA0EA,eAAsB,EACpB,GACA,GACgC;CAChC,IAAM,IAAS,MAAM,EAAc,GAAQ;EACzC,SAAS,EAAW;EACpB,UAAU,EAAW;EACrB,UAAU,EAAW,OAAO;EAC5B,YAAY,EAAW,OAAO;EAC9B,gBAAgB,EAAW,OAAO;EAClC,mBAAmB,EAAW,OAAO;CACvC,CAAC,GACK,CAAC,GAAW,GAAc,KAAY,MAAM,QAAQ,IAAI;EAC5D,EAAiB,GAAQ;GACvB,SAAS,EAAW;GACpB,UAAU,EAAW;GACrB,YAAY,EAAO;GACnB,WAAW,EAAW;EACxB,CAAC;EACD,EAAoB,GAAQ;GAC1B,SAAS,EAAW;GACpB,UAAU,EAAW;GACrB,YAAY,EAAO;GACnB,UAAU,EAAW;GACrB,oBAAoB,EAAW;EACjC,CAAC;EACD,EAAgB,GAAQ;GACtB,SAAS,EAAW;GACpB,mBAAmB,EAAW;GAC9B,UAAU,EAAW,OAAO;GAC5B,UAAU,EAAW;EACvB,CAAC;CACH,CAAC,GAEK,IAAY,EAAqB;EACrC;EACA,UAAU,EAAW;EACrB,cAAc,EAAW;EACzB,WAAW,EAAW;EACtB,YAAY;EACZ,UAAU,EAAW;EACrB,gBAAgB,EAAO;EACvB,mBAAmB,EAAO;EAC1B,YAAY,EAAa;EACzB,WAAW,EAAa;EACxB,iBAAiB,EAAa;EAC9B,iBAAiB,EAAa;CAChC,CAAC;CACD,IAAI,CAAC,GACH,MAAM,IAAI,EACR,cACA,4BACA,mEACF;CAGF,IAAM,IAAc,EAAmB,GAAU,EAAU,UAAU,EAAU,QAAQ,GACjF,IAAe,EAAgB;EACnC,cAAc,EAAW;EACzB;EACA,eAAe,EAAU;EACzB,KAAK,EAAU;EACf,IAAI,EAAU;EACd,UAAU,EAAU;EACpB,YAAY,EAAa;EACzB,WAAW,EAAa;EACxB,iBAAiB,EAAa;EAC9B;CACF,CAAC;CAED,OAAO;EACL,SAAS,EAAW;EAOpB,UAAU,EAAW;EACrB,MAAM,EAAW;EACjB,mBAAmB,EAAW;EAC9B,UAAU,EAAW,OAAO;EAC5B,cAAc,EAAW;EACzB,OAAO;GACL,OAAO,EAAY,EAAU,kBAAkB;GAC/C,UAAU,EAAY,EAAU,QAAQ;EAC1C;EACA,aAAa;GACX,KAAK,EAAY,EAAU,GAAG;GAC9B,IAAI,EAAY,EAAU,EAAE;GAC5B,UAAU,EAAY,EAAU,QAAQ;GACxC,UAAU,EAAY,EAAU,QAAQ;EAC1C;EACA,QAAQ,EACN,QAAQ,EAAY,CAAY,EAClC;EACA,MAAM,EAAW;EACjB,eAAe,EAAW;EAC1B,eAAe,EAAW;EAC1B,UAAU,EAAW;CACvB;AACF"}
|
|
1
|
+
{"version":3,"file":"prepare-instant-open-params.js","names":[],"sources":["../../../../src/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.ts"],"sourcesContent":["import type { Address, Hex } from \"viem\";\nimport type { Config } from \"../../../core/config\";\nimport { SymmError } from \"../../../shared/errors/symm-error\";\nimport type { Compute, WriteSolverParameter } from \"../../../shared/types/properties\";\nimport { decimalPriceToWei } from \"../../../shared/utils/price\";\nimport type { FeeForUser } from \"../../../symmio-contracts/symmio/actions/get-fee-for-user\";\nimport type { ApiLockedParamsBySymbolIdResponse } from \"../../types/generated/enigma-solver\";\nimport type { InstantOpenParameters } from \"../instant-open/types\";\nimport {\n assertOpenEstimateWithinSlippage,\n assertValidSlippage,\n deriveAutoSlippage,\n fetchOpenEstimatePrice,\n} from \"../shared/open-estimate-guard\";\nimport {\n calculateExpectedSettlementLoss,\n calculateMargin,\n calculateSolverFees,\n calculateTradeParams,\n computePlatformFee,\n SHORT_FUNDING_BUFFER_PERCENT,\n toWeiBigInt,\n} from \"../shared/trade-math\";\nimport { type InstantOpenMarketData, type PositionType } from \"../shared/types\";\nimport { resolveFeeRates, resolveLockedParams, resolveMarket, resolveMarkPrice } from \"./resolvers\";\n\n/**\n * Default solver-fee rate cap when the market publishes none: `\"0.01\"` — 1% of\n * notional, as a decimal ratio. Applied per side before wei conversion.\n */\nconst DEFAULT_SOLVER_FEE_CAP = \"0.01\";\n\n/**\n * Convert a market's solver-fee cap ratio string to its 18-decimal wei value.\n *\n * An absent cap falls back to {@link DEFAULT_SOLVER_FEE_CAP}; a present but\n * malformed string **throws** rather than silently signing zero caps — the caps\n * are immutable once `sendQuote` lands, so a bad vendor string must surface\n * before the signature, not after.\n *\n * @throws {SymmError} `INVALID_SOLVER_FEE_CAP` when the string does not parse.\n */\nfunction solverFeeCapToWei(field: \"minOpenSolverFeeCap\" | \"minCloseSolverFeeCap\", value: string | undefined): bigint {\n const cap = decimalPriceToWei(value ?? DEFAULT_SOLVER_FEE_CAP);\n if (cap === undefined) {\n throw new SymmError(\n \"validation\",\n \"INVALID_SOLVER_FEE_CAP\",\n `prepareInstantOpenParams: market ${field} \"${value}\" is not a valid decimal ratio.`,\n );\n }\n return cap;\n}\n\n/**\n * Parameters for {@link prepareInstantOpenParams} and `instantOpenAuto`.\n *\n * Required = inputs only the caller can know (wallet, session key, trade\n * intent). Optional = anything derivable from solver / price-service / on-chain\n * reads. Pre-fill an optional field to skip its fetch.\n */\nexport type PrepareInstantOpenParameters = Compute<\n WriteSolverParameter & {\n /** Sub-account / partyA address. */\n subAccountAddress: Address;\n /** Market identification + optional pre-fetched precision metadata. */\n market: InstantOpenMarketData;\n /** Trade side. */\n positionType: PositionType;\n /** Collateral (USD) the user enters as initial margin. Decimal string. */\n initialMargin: string;\n /** Position leverage (integer ≥ 1). */\n leverage: number;\n /**\n * Slippage tolerance percent (e.g. `5` for 5%). **Required on majors\n * (non-lowcap) solvers.** On a lowcap solver it may be omitted to\n * auto-derive: the SDK dry-runs the sized order and sets the price bound\n * to the estimated fill price plus 4% headroom (falling back to a flat 4%\n * off mark when the estimate is unavailable).\n */\n slippage?: number;\n /** Pre-fetched mark price as decimal string. When omitted, fetched via Enigma price service. */\n markPrice?: string;\n /**\n * Pre-fetched solver estimated open (fill) price as decimal string —\n * **lowcap/Enigma only**; ignored on any other solver kind. When omitted\n * on a lowcap solver, fetched via `GET /estimated-price`. Feeds the\n * settlement-loss provision, the slippage gate, and (when `slippage` is\n * omitted) the auto-slippage derivation.\n */\n estimatedOpenPrice?: string;\n /**\n * Pre-fetched solver locked params (matches `getLockedParams` return —\n * `ApiLockedParamsBySymbolIdResponse`). When supplied with all four\n * percent fields, the fetch is skipped.\n */\n lockedParamPercent?: ApiLockedParamsBySymbolIdResponse;\n /**\n * Pre-fetched on-chain fee rates (matches `getFeeForUser` return —\n * `FeeForUser`). When omitted, fetched via `getFeeForUser`.\n */\n feeRates?: FeeForUser;\n /** Forwarded to {@link InstantOpenParameters}. */\n uuid?: string;\n /** Forwarded to {@link InstantOpenParameters}. */\n addMarginSalt?: Hex;\n /** Forwarded to {@link InstantOpenParameters}. */\n sendQuoteSalt?: Hex;\n /** Forwarded to {@link InstantOpenParameters}. */\n deadline?: bigint;\n }\n>;\n\n/**\n * Resolve every input the {@link InstantOpenParameters} primitive needs from a\n * minimal parameter set.\n *\n * The estimate-driven steps (auto slippage, dry-run gate, solver fees,\n * settlement provision) are **lowcap-only** — a majors (non-lowcap) prepare is\n * unchanged: `slippage` required, no estimate fetch, margin = locks +\n * platform fee.\n *\n * Steps:\n * 1. Validate the user's `slippage` ({@link assertValidSlippage}). On a\n * lowcap solver it may be omitted and is auto-derived: dry-run the\n * mark-sized order and set the price bound to the estimated fill plus 4%\n * headroom ({@link deriveAutoSlippage}). On majors an omitted slippage\n * throws `SLIPPAGE_REQUIRED`.\n * 2. Resolve market metadata, mark price, locked params, and fee rates —\n * concurrent fetches with caller-supplied fields short-circuiting.\n * 3. Run {@link calculateTradeParams} to derive `requestedOpenPrice`,\n * `quantity`, `cva`, `lf`, `partyAmm`, `partyBmm`, `notional`.\n * 4. Dry-run the sized order and reject when the expected fill deviates from\n * mark beyond the slippage tolerance\n * ({@link assertOpenEstimateWithinSlippage}; skipped when the estimate is\n * unavailable, reusing the caller-supplied `estimatedOpenPrice` or the\n * auto-slippage estimate when one exists).\n * 5. Run {@link computePlatformFee}, {@link calculateSolverFees}, and\n * {@link calculateExpectedSettlementLoss}, then {@link calculateMargin} to\n * derive the `addMargin` amount — the solver charges its fees and the\n * open-price settlement from the VA, so the transfer funds\n * `locks + platformFee + openSolverFee + closeSolverFee +\n * expectedSettlementLoss`.\n * 6. Convert all final values to 18-decimal-wei `bigint`.\n *\n * @throws {SymmError} `INVALID_SLIPPAGE` / `SLIPPAGE_REQUIRED` /\n * `SLIPPAGE_EXCEEDED` /\n * `RESOLVE_MARKET_NOT_FOUND` /\n * `RESOLVE_MARKET_METADATA_INCOMPLETE` /\n * `RESOLVE_MARK_PRICE_NOT_FOUND` / `INVALID_TRADE_PARAMETERS` /\n * `INVALID_SOLVER_FEE_CAP` for invalid inputs or an out-of-tolerance fill.\n */\nexport async function prepareInstantOpenParams(\n config: Config,\n parameters: PrepareInstantOpenParameters,\n): Promise<InstantOpenParameters> {\n // Reject a malformed user slippage before any network work. An omitted\n // slippage is auto-derived from the dry-run estimate after sizing.\n if (parameters.slippage !== undefined) assertValidSlippage(parameters.slippage);\n\n /**\n * The estimate-driven behaviors — auto slippage, the dry-run gate, solver\n * fees, and the settlement provision — exist only on lowcap (Enigma)\n * solvers. On majors the flow is unchanged: slippage is required, no\n * estimate is fetched, and the margin carries locks + platform fee only.\n */\n const isLowcap = config.getSolver({ chainId: parameters.chainId, solverId: parameters.solverId }).id === \"enigma\";\n if (parameters.slippage === undefined && !isLowcap) {\n throw new SymmError(\n \"validation\",\n \"SLIPPAGE_REQUIRED\",\n \"prepareInstantOpenParams: slippage is required on this solver — auto-derived slippage is lowcap-only.\",\n );\n }\n\n /** Fee caps only exist on the v0.8.6 quote API — don't force a market fetch for them on a legacy chain. */\n const needsSolverFeeCaps = config.getChainConfig(parameters.chainId).contractsVersion === \"0.8.6\";\n\n const market = await resolveMarket(config, {\n chainId: parameters.chainId,\n solverId: parameters.solverId,\n marketId: parameters.market.id,\n marketName: parameters.market.name,\n pricePrecision: parameters.market.pricePrecision,\n quantityPrecision: parameters.market.quantityPrecision,\n minOpenSolverFeeCap: parameters.market.minOpenSolverFeeCap,\n minCloseSolverFeeCap: parameters.market.minCloseSolverFeeCap,\n includeSolverFeeCaps: needsSolverFeeCaps,\n hedgerFeeOpen: parameters.market.hedgerFeeOpen,\n hedgerFeeClose: parameters.market.hedgerFeeClose,\n hedgerFeeCloseEarlyRate: parameters.market.hedgerFeeCloseEarlyRate,\n hedgerFeeCloseEarlyThreshold: parameters.market.hedgerFeeCloseEarlyThreshold,\n hedgerFeeCloseStandardThreshold: parameters.market.hedgerFeeCloseStandardThreshold,\n /** Lowcap only: the solver charges its fees from the VA, so `addMargin` must fund them. */\n includeHedgerFees: isLowcap,\n });\n const [markPrice, lockedParams, feeRates] = await Promise.all([\n resolveMarkPrice(config, {\n chainId: parameters.chainId,\n solverId: parameters.solverId,\n marketName: market.name,\n markPrice: parameters.markPrice,\n }),\n resolveLockedParams(config, {\n chainId: parameters.chainId,\n solverId: parameters.solverId,\n marketName: market.name,\n leverage: parameters.leverage,\n lockedParamPercent: parameters.lockedParamPercent,\n }),\n resolveFeeRates(config, {\n chainId: parameters.chainId,\n subAccountAddress: parameters.subAccountAddress,\n marketId: parameters.market.id,\n feeRates: parameters.feeRates,\n }),\n ]);\n\n const calculationInput = {\n markPrice,\n positionType: parameters.positionType,\n userInput: parameters.initialMargin,\n inputField: \"PRICE\" as const,\n leverage: parameters.leverage,\n pricePrecision: market.pricePrecision,\n quantityPrecision: market.quantityPrecision,\n cvaPercent: lockedParams.cva,\n lfPercent: lockedParams.lf,\n partyAmmPercent: lockedParams.partyAmm,\n partyBmmPercent: lockedParams.partyBmm,\n };\n\n // Auto slippage: dry-run the mark-sized order (quantity is slippage-\n // independent) and set the price bound to the estimated fill plus 4%\n // headroom, re-expressed as a percent off mark. A caller-supplied\n // `estimatedOpenPrice` short-circuits the fetch; either way the estimate is\n // reused by the gate and the settlement provision so the solver is asked at\n // most once.\n let slippage = parameters.slippage;\n let expectedFillPrice = isLowcap ? parameters.estimatedOpenPrice : undefined;\n if (slippage === undefined) {\n const sized = calculateTradeParams({ ...calculationInput, slippage: 0 });\n if (!sized) {\n throw new SymmError(\n \"validation\",\n \"INVALID_TRADE_PARAMETERS\",\n \"Invalid trade parameters: markPrice or initialMargin is zero/NaN.\",\n );\n }\n if (isLowcap && expectedFillPrice === undefined) {\n expectedFillPrice = await fetchOpenEstimatePrice(config, {\n chainId: parameters.chainId,\n solverId: parameters.solverId,\n symbolId: parameters.market.id,\n positionType: parameters.positionType,\n quantity: sized.quantity,\n markPrice,\n });\n }\n slippage = deriveAutoSlippage({ markPrice, expectedFillPrice, positionType: parameters.positionType });\n }\n\n const tradeCalc = calculateTradeParams({ ...calculationInput, slippage });\n if (!tradeCalc) {\n throw new SymmError(\n \"validation\",\n \"INVALID_TRADE_PARAMETERS\",\n \"Invalid trade parameters: markPrice or initialMargin is zero/NaN.\",\n );\n }\n\n // The expected fill price funds the settlement-loss provision and feeds the\n // slippage gate. Fetch it once here when neither the caller nor the\n // auto-slippage path supplied it — pass `estimatedOpenPrice` to skip the\n // round-trip on latency-sensitive submits.\n if (isLowcap && expectedFillPrice === undefined) {\n expectedFillPrice = await fetchOpenEstimatePrice(config, {\n chainId: parameters.chainId,\n solverId: parameters.solverId,\n symbolId: parameters.market.id,\n positionType: parameters.positionType,\n quantity: tradeCalc.quantity,\n markPrice,\n });\n }\n\n // Dry-run gate: reject early when the expected fill deviates from mark\n // beyond the user's slippage — the solver would reject the quote anyway.\n // Best-effort: an unavailable estimate skips the gate, never blocks the open.\n if (expectedFillPrice !== undefined) {\n await assertOpenEstimateWithinSlippage(config, {\n chainId: parameters.chainId,\n solverId: parameters.solverId,\n symbolId: parameters.market.id,\n positionType: parameters.positionType,\n quantity: tradeCalc.quantity,\n markPrice,\n slippage,\n expectedFillPrice,\n });\n }\n\n const platformFee = computePlatformFee(feeRates, tradeCalc.notional, tradeCalc.notional);\n // Lowcap: the solver charges its fees and the open-price settlement from the\n // VA balance — the addMargin transfer moves those funds from the SubAccount.\n // Majors carry neither leg; their margin stays locks + platform fee.\n const { openSolverFee, closeSolverFee } = isLowcap\n ? calculateSolverFees({\n notional: tradeCalc.notional,\n hedgerFeeOpen: market.hedgerFeeOpen,\n hedgerFeeClose: market.hedgerFeeClose,\n hedgerFeeCloseEarlyRate: market.hedgerFeeCloseEarlyRate,\n hedgerFeeCloseEarlyThreshold: market.hedgerFeeCloseEarlyThreshold,\n hedgerFeeCloseStandardThreshold: market.hedgerFeeCloseStandardThreshold,\n })\n : { openSolverFee: \"0\", closeSolverFee: \"0\" };\n const expectedSettlementLoss = calculateExpectedSettlementLoss({\n positionType: parameters.positionType,\n markPrice,\n expectedFillPrice,\n quantity: tradeCalc.quantity,\n });\n const marginAmount = calculateMargin({\n positionType: parameters.positionType,\n markPrice,\n quantityBasic: tradeCalc.quantityBasic,\n cva: tradeCalc.cva,\n lf: tradeCalc.lf,\n partyAmm: tradeCalc.partyAmm,\n openSolverFee,\n closeSolverFee,\n expectedSettlementLoss,\n /** Lowcap SHORT: fund lock growth above the floor. Majors keep the classic basis. */\n shortFundingBufferPercent: isLowcap ? SHORT_FUNDING_BUFFER_PERCENT : 0,\n cvaPercent: lockedParams.cva,\n lfPercent: lockedParams.lf,\n partyAmmPercent: lockedParams.partyAmm,\n platformFee,\n });\n\n return {\n chainId: parameters.chainId,\n /**\n * Carried through deliberately: `instantOpen` resolves the solver from it to\n * fill `partyBsWhiteList` — which is signed into the EIP-712 payload — and to\n * pick the submit URL. Dropping it here would sign against the default\n * solver's address while the quote was priced and sized for another.\n */\n solverId: parameters.solverId,\n from: parameters.from,\n subAccountAddress: parameters.subAccountAddress,\n marketId: parameters.market.id,\n positionType: parameters.positionType,\n order: {\n price: toWeiBigInt(tradeCalc.requestedOpenPrice),\n quantity: toWeiBigInt(tradeCalc.quantity),\n },\n lockedParam: {\n cva: toWeiBigInt(tradeCalc.cva),\n lf: toWeiBigInt(tradeCalc.lf),\n partyAmm: toWeiBigInt(tradeCalc.partyAmm),\n partyBmm: toWeiBigInt(tradeCalc.partyBmm),\n },\n margin: {\n amount: toWeiBigInt(marginAmount),\n },\n /** Only meaningful on a v0.8.6 chain — absent on v0.8.5, whose flow signs the legacy call. */\n ...(needsSolverFeeCaps\n ? {\n solverFeeCaps: {\n openRateCap: solverFeeCapToWei(\"minOpenSolverFeeCap\", market.minOpenSolverFeeCap),\n closeRateCap: solverFeeCapToWei(\"minCloseSolverFeeCap\", market.minCloseSolverFeeCap),\n },\n }\n : {}),\n uuid: parameters.uuid,\n addMarginSalt: parameters.addMarginSalt,\n sendQuoteSalt: parameters.sendQuoteSalt,\n deadline: parameters.deadline,\n };\n}\n"],"mappings":";;;;;;;;;AA8BA,IAAM,IAAyB;AAY/B,SAAS,EAAkB,GAAuD,GAAmC;CACnH,IAAM,IAAM,EAAkB,KAAS,CAAsB;CAC7D,IAAI,MAAQ,KAAA,GACV,MAAM,IAAI,EACR,cACA,0BACA,oCAAoC,EAAM,IAAI,EAAM,gCACtD;CAEF,OAAO;AACT;AAoGA,eAAsB,EACpB,GACA,GACgC;CAGhC,AAAI,EAAW,aAAa,KAAA,KAAW,EAAoB,EAAW,QAAQ;CAQ9E,IAAM,IAAW,EAAO,UAAU;EAAE,SAAS,EAAW;EAAS,UAAU,EAAW;CAAS,CAAC,EAAE,OAAO;CACzG,IAAI,EAAW,aAAa,KAAA,KAAa,CAAC,GACxC,MAAM,IAAI,EACR,cACA,qBACA,uGACF;CAIF,IAAM,IAAqB,EAAO,eAAe,EAAW,OAAO,EAAE,qBAAqB,SAEpF,IAAS,MAAM,EAAc,GAAQ;EACzC,SAAS,EAAW;EACpB,UAAU,EAAW;EACrB,UAAU,EAAW,OAAO;EAC5B,YAAY,EAAW,OAAO;EAC9B,gBAAgB,EAAW,OAAO;EAClC,mBAAmB,EAAW,OAAO;EACrC,qBAAqB,EAAW,OAAO;EACvC,sBAAsB,EAAW,OAAO;EACxC,sBAAsB;EACtB,eAAe,EAAW,OAAO;EACjC,gBAAgB,EAAW,OAAO;EAClC,yBAAyB,EAAW,OAAO;EAC3C,8BAA8B,EAAW,OAAO;EAChD,iCAAiC,EAAW,OAAO;EAEnD,mBAAmB;CACrB,CAAC,GACK,CAAC,GAAW,GAAc,KAAY,MAAM,QAAQ,IAAI;EAC5D,EAAiB,GAAQ;GACvB,SAAS,EAAW;GACpB,UAAU,EAAW;GACrB,YAAY,EAAO;GACnB,WAAW,EAAW;EACxB,CAAC;EACD,EAAoB,GAAQ;GAC1B,SAAS,EAAW;GACpB,UAAU,EAAW;GACrB,YAAY,EAAO;GACnB,UAAU,EAAW;GACrB,oBAAoB,EAAW;EACjC,CAAC;EACD,EAAgB,GAAQ;GACtB,SAAS,EAAW;GACpB,mBAAmB,EAAW;GAC9B,UAAU,EAAW,OAAO;GAC5B,UAAU,EAAW;EACvB,CAAC;CACH,CAAC,GAEK,IAAmB;EACvB;EACA,cAAc,EAAW;EACzB,WAAW,EAAW;EACtB,YAAY;EACZ,UAAU,EAAW;EACrB,gBAAgB,EAAO;EACvB,mBAAmB,EAAO;EAC1B,YAAY,EAAa;EACzB,WAAW,EAAa;EACxB,iBAAiB,EAAa;EAC9B,iBAAiB,EAAa;CAChC,GAQI,IAAW,EAAW,UACtB,IAAoB,IAAW,EAAW,qBAAqB,KAAA;CACnE,IAAI,MAAa,KAAA,GAAW;EAC1B,IAAM,IAAQ,EAAqB;GAAE,GAAG;GAAkB,UAAU;EAAE,CAAC;EACvE,IAAI,CAAC,GACH,MAAM,IAAI,EACR,cACA,4BACA,mEACF;EAYF,AAVI,KAAY,MAAsB,KAAA,MACpC,IAAoB,MAAM,EAAuB,GAAQ;GACvD,SAAS,EAAW;GACpB,UAAU,EAAW;GACrB,UAAU,EAAW,OAAO;GAC5B,cAAc,EAAW;GACzB,UAAU,EAAM;GAChB;EACF,CAAC,IAEH,IAAW,EAAmB;GAAE;GAAW;GAAmB,cAAc,EAAW;EAAa,CAAC;CACvG;CAEA,IAAM,IAAY,EAAqB;EAAE,GAAG;EAAkB;CAAS,CAAC;CACxE,IAAI,CAAC,GACH,MAAM,IAAI,EACR,cACA,4BACA,mEACF;CAqBF,AAdI,KAAY,MAAsB,KAAA,MACpC,IAAoB,MAAM,EAAuB,GAAQ;EACvD,SAAS,EAAW;EACpB,UAAU,EAAW;EACrB,UAAU,EAAW,OAAO;EAC5B,cAAc,EAAW;EACzB,UAAU,EAAU;EACpB;CACF,CAAC,IAMC,MAAsB,KAAA,KACxB,MAAM,EAAiC,GAAQ;EAC7C,SAAS,EAAW;EACpB,UAAU,EAAW;EACrB,UAAU,EAAW,OAAO;EAC5B,cAAc,EAAW;EACzB,UAAU,EAAU;EACpB;EACA;EACA;CACF,CAAC;CAGH,IAAM,IAAc,EAAmB,GAAU,EAAU,UAAU,EAAU,QAAQ,GAIjF,EAAE,kBAAe,sBAAmB,IACtC,EAAoB;EAClB,UAAU,EAAU;EACpB,eAAe,EAAO;EACtB,gBAAgB,EAAO;EACvB,yBAAyB,EAAO;EAChC,8BAA8B,EAAO;EACrC,iCAAiC,EAAO;CAC1C,CAAC,IACD;EAAE,eAAe;EAAK,gBAAgB;CAAI,GACxC,IAAyB,EAAgC;EAC7D,cAAc,EAAW;EACzB;EACA;EACA,UAAU,EAAU;CACtB,CAAC,GACK,IAAe,EAAgB;EACnC,cAAc,EAAW;EACzB;EACA,eAAe,EAAU;EACzB,KAAK,EAAU;EACf,IAAI,EAAU;EACd,UAAU,EAAU;EACpB;EACA;EACA;EAEA,2BAA2B;EAC3B,YAAY,EAAa;EACzB,WAAW,EAAa;EACxB,iBAAiB,EAAa;EAC9B;CACF,CAAC;CAED,OAAO;EACL,SAAS,EAAW;EAOpB,UAAU,EAAW;EACrB,MAAM,EAAW;EACjB,mBAAmB,EAAW;EAC9B,UAAU,EAAW,OAAO;EAC5B,cAAc,EAAW;EACzB,OAAO;GACL,OAAO,EAAY,EAAU,kBAAkB;GAC/C,UAAU,EAAY,EAAU,QAAQ;EAC1C;EACA,aAAa;GACX,KAAK,EAAY,EAAU,GAAG;GAC9B,IAAI,EAAY,EAAU,EAAE;GAC5B,UAAU,EAAY,EAAU,QAAQ;GACxC,UAAU,EAAY,EAAU,QAAQ;EAC1C;EACA,QAAQ,EACN,QAAQ,EAAY,CAAY,EAClC;EAEA,GAAI,IACA,EACE,eAAe;GACb,aAAa,EAAkB,uBAAuB,EAAO,mBAAmB;GAChF,cAAc,EAAkB,wBAAwB,EAAO,oBAAoB;EACrF,EACF,IACA,CAAC;EACL,MAAM,EAAW;EACjB,eAAe,EAAW;EAC1B,eAAe,EAAW;EAC1B,UAAU,EAAW;CACvB;AACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Address, Hex } from 'viem';
|
|
2
|
-
import { UpnlSig, VirtualAccountIsolationType } from './types.js';
|
|
2
|
+
import { SolverFeeCaps, UpnlSig, VirtualAccountIsolationType } from './types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Zeroed Muon oracle signature used by lowcap flows that bypass Muon verification.
|
|
5
5
|
*/
|
|
@@ -73,14 +73,42 @@ export interface EncodeSendQuoteWithAffiliateAndDataParameters {
|
|
|
73
73
|
upnlSig?: UpnlSig;
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
76
|
-
* Encode calldata for `Symmio.sendQuoteWithAffiliateAndData(...)`.
|
|
76
|
+
* Encode calldata for the legacy `Symmio.sendQuoteWithAffiliateAndData(...)`.
|
|
77
|
+
*
|
|
78
|
+
* Kept for the **Rasa** flow. On perps-core v0.8.6 this method remains
|
|
79
|
+
* available with its original selector but stores **zero solver-fee caps** —
|
|
80
|
+
* a solver that requires fee caps will not accept quotes sent through it; use
|
|
81
|
+
* {@link encodeSendQuote} for those (the Enigma flow does).
|
|
77
82
|
*
|
|
78
83
|
* Pass a real `upnlSig` for solvers requiring Muon verification, or omit to
|
|
79
84
|
* default to {@link ZERO_UPNL_SIG} (lowcap).
|
|
80
85
|
*/
|
|
81
86
|
export declare function encodeSendQuoteWithAffiliateAndData(parameters: EncodeSendQuoteWithAffiliateAndDataParameters): Hex;
|
|
82
87
|
/**
|
|
83
|
-
*
|
|
88
|
+
* Parameters for {@link encodeSendQuote}: the legacy parameter set plus the
|
|
89
|
+
* v0.8.6 solver-fee caps.
|
|
90
|
+
*/
|
|
91
|
+
export interface EncodeSendQuoteParameters extends EncodeSendQuoteWithAffiliateAndDataParameters {
|
|
92
|
+
/**
|
|
93
|
+
* Solver-fee rate caps authorized on the quote (18-decimal ratios). Defaults
|
|
94
|
+
* to zero caps — semantically identical to the legacy method, which a
|
|
95
|
+
* fee-charging solver may reject; fill from the market's
|
|
96
|
+
* `minOpenSolverFeeCap` / `minCloseSolverFeeCap`.
|
|
97
|
+
*/
|
|
98
|
+
solverFeeCaps?: SolverFeeCaps;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Encode calldata for `Symmio.sendQuote(...)` — the perps-core v0.8.6 overload
|
|
102
|
+
* that carries `SolverFeeCaps` as its trailing argument. Identical to
|
|
103
|
+
* {@link encodeSendQuoteWithAffiliateAndData} otherwise.
|
|
104
|
+
*
|
|
105
|
+
* Pass a real `upnlSig` for solvers requiring Muon verification, or omit to
|
|
106
|
+
* default to {@link ZERO_UPNL_SIG} (lowcap).
|
|
107
|
+
*/
|
|
108
|
+
export declare function encodeSendQuote(parameters: EncodeSendQuoteParameters): Hex;
|
|
109
|
+
/**
|
|
110
|
+
* Build the metadata blob attached to a quote-send call (`sendQuote`, or the
|
|
111
|
+
* legacy `sendQuoteWithAffiliateAndData`).
|
|
84
112
|
*
|
|
85
113
|
* Encodes a single-field tuple `{ uuid: string }` to ABI bytes — used by the
|
|
86
114
|
* solver to track quote provenance.
|
|
@@ -102,8 +130,8 @@ export interface SendQuoteUpnlSigFlexRange {
|
|
|
102
130
|
length: bigint;
|
|
103
131
|
}
|
|
104
132
|
/**
|
|
105
|
-
* Locate the encoded `upnlSig` region inside `
|
|
106
|
-
*
|
|
133
|
+
* Locate the encoded `upnlSig` region inside `sendQuote` calldata, so it can be
|
|
134
|
+
* delegated to a solver via a `FlexField`.
|
|
107
135
|
*
|
|
108
136
|
* Lowcap solvers sign the quote with a placeholder signature
|
|
109
137
|
* ({@link getFakeSendQuoteMuonSignature}) and authorize the solver to overwrite
|
|
@@ -115,14 +143,14 @@ export interface SendQuoteUpnlSigFlexRange {
|
|
|
115
143
|
* of the signature's tail. The offset therefore varies with earlier dynamic
|
|
116
144
|
* arguments (notably `partyBsWhiteList` length) and must never be hardcoded.
|
|
117
145
|
*
|
|
118
|
-
* @param callData - Encoded `
|
|
146
|
+
* @param callData - Encoded `sendQuote` calldata.
|
|
119
147
|
* @returns The `upnlSig` region as an args-relative offset and byte length.
|
|
120
148
|
* @throws {SymmError} when `callData` is too short to contain both head words,
|
|
121
149
|
* or the pointers are not ordered as the encoding guarantees.
|
|
122
150
|
*
|
|
123
151
|
* @example
|
|
124
152
|
* ```ts
|
|
125
|
-
* const callData =
|
|
153
|
+
* const callData = encodeSendQuote({ …, upnlSig: fakeSig });
|
|
126
154
|
* const range = sendQuoteUpnlSigFlexRange(callData);
|
|
127
155
|
* buildSignedOperation({ …, callData, flexFields: [{ ...range, authorizedFlexFiller: solver.address }] });
|
|
128
156
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calldata.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-open/shared/calldata.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,OAAO,EACZ,KAAK,GAAG,EACT,MAAM,MAAM,CAAC;AAId,OAAO,KAAK,EAAE,OAAO,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"calldata.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-open/shared/calldata.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,OAAO,EACZ,KAAK,GAAG,EACT,MAAM,MAAM,CAAC;AAId,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAEnF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,OAO3B,CAAC;AAYF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CASvE;AAED;;GAEG;AACH,MAAM,WAAW,iCAAiC;IAChD,yDAAyD;IACzD,UAAU,EAAE,OAAO,CAAC;IACpB,sCAAsC;IACtC,aAAa,EAAE,2BAA2B,CAAC;IAC3C,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,iCAAiC,GAAG,GAAG,CAM1F;AAED;;GAEG;AACH,MAAM,WAAW,6CAA6C;IAC5D,gCAAgC;IAChC,gBAAgB,EAAE,SAAS,OAAO,EAAE,CAAC;IACrC,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,6CAA6C;IAC7C,IAAI,EAAE,GAAG,CAAC;IACV,oEAAoE;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mCAAmC,CAAC,UAAU,EAAE,6CAA6C,GAAG,GAAG,CAiClH;AAKD;;;GAGG;AACH,MAAM,WAAW,yBAA0B,SAAQ,6CAA6C;IAC9F;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,yBAAyB,GAAG,GAAG,CAmC1E;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAEpD;AAyCD;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,GAAG,GAAG,yBAAyB,CA6BlF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { accountLayerAbi as e } from "../../../symmio-contracts/abi/v0.8.
|
|
2
|
-
import { symmioAbi as t } from "../../../symmio-contracts/abi/v0.8.
|
|
1
|
+
import { accountLayerAbi as e } from "../../../symmio-contracts/abi/v0.8.6/account-layer.js";
|
|
2
|
+
import { symmioAbi as t } from "../../../symmio-contracts/abi/v0.8.6/symmio.js";
|
|
3
3
|
import { SymmError as n } from "../../../shared/errors/symm-error.js";
|
|
4
4
|
import { encodeAbiParameters as r, encodeFunctionData as i, hexToBigInt as a, sliceHex as o, zeroAddress as s } from "viem";
|
|
5
5
|
//#region src/solvers/instant-open/shared/calldata.ts
|
|
@@ -75,7 +75,49 @@ function f(e) {
|
|
|
75
75
|
]
|
|
76
76
|
});
|
|
77
77
|
}
|
|
78
|
-
|
|
78
|
+
var p = {
|
|
79
|
+
openRateCap: 0n,
|
|
80
|
+
closeRateCap: 0n
|
|
81
|
+
};
|
|
82
|
+
function m(e) {
|
|
83
|
+
let n = e.upnlSig ?? c, r = e.solverFeeCaps ?? p;
|
|
84
|
+
return i({
|
|
85
|
+
abi: t,
|
|
86
|
+
functionName: "sendQuote",
|
|
87
|
+
args: [
|
|
88
|
+
[...e.partyBsWhiteList],
|
|
89
|
+
e.symbolId,
|
|
90
|
+
e.positionType,
|
|
91
|
+
e.orderType,
|
|
92
|
+
e.price,
|
|
93
|
+
e.quantity,
|
|
94
|
+
e.cva,
|
|
95
|
+
e.lf,
|
|
96
|
+
e.partyAmm,
|
|
97
|
+
e.partyBmm,
|
|
98
|
+
e.deadline,
|
|
99
|
+
e.affiliate,
|
|
100
|
+
{
|
|
101
|
+
reqId: n.reqId,
|
|
102
|
+
timestamp: n.timestamp,
|
|
103
|
+
upnl: n.upnl,
|
|
104
|
+
price: n.price,
|
|
105
|
+
gatewaySignature: n.gatewaySignature,
|
|
106
|
+
sigs: {
|
|
107
|
+
signature: n.sigs.signature,
|
|
108
|
+
owner: n.sigs.owner,
|
|
109
|
+
nonce: n.sigs.nonce
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
e.data,
|
|
113
|
+
{
|
|
114
|
+
openRateCap: r.openRateCap,
|
|
115
|
+
closeRateCap: r.closeRateCap
|
|
116
|
+
}
|
|
117
|
+
]
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function h(e) {
|
|
79
121
|
return r([{
|
|
80
122
|
type: "tuple",
|
|
81
123
|
components: [{
|
|
@@ -84,22 +126,22 @@ function p(e) {
|
|
|
84
126
|
}]
|
|
85
127
|
}], [{ uuid: e }]);
|
|
86
128
|
}
|
|
87
|
-
var
|
|
88
|
-
let e = t.find((e) => e.type === "function" && e.name === "
|
|
89
|
-
if (!e) throw new n("config", "SEND_QUOTE_ABI_MISSING", "The shipped SYMMIO ABI has no `
|
|
129
|
+
var g = (() => {
|
|
130
|
+
let e = t.find((e) => e.type === "function" && e.name === "sendQuote");
|
|
131
|
+
if (!e) throw new n("config", "SEND_QUOTE_ABI_MISSING", "The shipped SYMMIO ABI has no `sendQuote` function.");
|
|
90
132
|
let r = e.inputs, i = r.findIndex((e) => e.name === "upnlSig"), a = r.findIndex((e) => e.name === "data");
|
|
91
|
-
if (i === -1 || a === -1) throw new n("config", "SEND_QUOTE_ABI_MISSING", "`
|
|
133
|
+
if (i === -1 || a === -1) throw new n("config", "SEND_QUOTE_ABI_MISSING", "`sendQuote` is missing its `upnlSig` or `data` argument in the shipped ABI.");
|
|
92
134
|
return {
|
|
93
135
|
upnlSig: i,
|
|
94
136
|
data: a
|
|
95
137
|
};
|
|
96
|
-
})(),
|
|
97
|
-
function
|
|
138
|
+
})(), _ = 32;
|
|
139
|
+
function v(e) {
|
|
98
140
|
let t = `0x${e.slice(10)}`, r = (t.length - 2) / 2, i = (e) => {
|
|
99
|
-
let i = e *
|
|
100
|
-
if (i +
|
|
101
|
-
return a(o(t, i, i +
|
|
102
|
-
}, s = i(
|
|
141
|
+
let i = e * _;
|
|
142
|
+
if (i + _ > r) throw new n("validation", "SEND_QUOTE_FLEX_RANGE_INVALID", `sendQuote calldata is too short to hold argument head word ${e}.`);
|
|
143
|
+
return a(o(t, i, i + _));
|
|
144
|
+
}, s = i(g.upnlSig), c = i(g.data);
|
|
103
145
|
if (c <= s || c > BigInt(r)) throw new n("validation", "SEND_QUOTE_FLEX_RANGE_INVALID", `sendQuote calldata has an out-of-order or out-of-bounds upnlSig region (offset ${s}, end ${c}).`);
|
|
104
146
|
return {
|
|
105
147
|
offset: s,
|
|
@@ -107,6 +149,6 @@ function g(e) {
|
|
|
107
149
|
};
|
|
108
150
|
}
|
|
109
151
|
//#endregion
|
|
110
|
-
export { c as ZERO_UPNL_SIG,
|
|
152
|
+
export { c as ZERO_UPNL_SIG, h as buildQuoteMetadata, d as encodeAddMarginToNextVA, m as encodeSendQuote, f as encodeSendQuoteWithAffiliateAndData, u as getFakeSendQuoteMuonSignature, v as sendQuoteUpnlSigFlexRange };
|
|
111
153
|
|
|
112
154
|
//# sourceMappingURL=calldata.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calldata.js","names":[],"sources":["../../../../src/solvers/instant-open/shared/calldata.ts"],"sourcesContent":["import {\n encodeAbiParameters,\n encodeFunctionData,\n hexToBigInt,\n sliceHex,\n zeroAddress,\n type Address,\n type Hex,\n} from \"viem\";\nimport { SymmError } from \"../../../shared/errors/symm-error\";\nimport { accountLayerAbi } from \"../../../symmio-contracts/abi/v0.8.5/account-layer\";\nimport { symmioAbi } from \"../../../symmio-contracts/abi/v0.8.5/symmio\";\nimport type { UpnlSig, VirtualAccountIsolationType } from \"./types\";\n\n/**\n * Zeroed Muon oracle signature used by lowcap flows that bypass Muon verification.\n */\nexport const ZERO_UPNL_SIG: UpnlSig = {\n reqId: \"0x\",\n timestamp: 0n,\n upnl: 0n,\n price: 0n,\n gatewaySignature: \"0x\",\n sigs: { signature: 0n, owner: zeroAddress, nonce: zeroAddress },\n};\n\n/**\n * A `bytes32`-shaped zero value: 32 zero bytes.\n *\n * The placeholder `reqId` must be **byte-shaped like a real one**, because the\n * solver's flex fill replaces an exact byte range (see\n * {@link sendQuoteUpnlSigFlexRange}) — a `0x` empty `bytes` encodes 32 bytes\n * shorter than a real request id and would shift every downstream offset.\n */\nconst PLACEHOLDER_REQ_ID: Hex = `0x${\"00\".repeat(32)}`;\n\n/**\n * Build a placeholder Muon signature carrying only the trade price.\n *\n * Used in lowcap flows where the InstantLayer accepts a zero/fake signature\n * but the contract still reads `upnlSig.price` for accounting. The single\n * canonical price for the trade (the slippage-adjusted open price in wei)\n * is what callers pass here.\n *\n * @remarks\n * `reqId` is 32 zero bytes rather than `0x` so the encoded `upnlSig` region is\n * the same size the solver expects when it fills a live signature into the\n * delegated flex range.\n *\n * @param priceWei - Trade price as 18-decimal fixed point (`bigint`).\n */\nexport function getFakeSendQuoteMuonSignature(priceWei: bigint): UpnlSig {\n return {\n reqId: PLACEHOLDER_REQ_ID,\n timestamp: BigInt(Math.floor(Date.now() / 1000)),\n upnl: 0n,\n price: priceWei,\n gatewaySignature: \"0x\",\n sigs: { signature: 0n, owner: zeroAddress, nonce: zeroAddress },\n };\n}\n\n/**\n * Parameters for {@link encodeAddMarginToNextVA}.\n */\nexport interface EncodeAddMarginToNextVAParameters {\n /** Sub-account address (typically the user's wallet). */\n subAccount: Address;\n /** Virtual-account isolation type. */\n isolationType: VirtualAccountIsolationType;\n /** Market symbol id. */\n symbolId: bigint;\n /** Margin amount as 18-decimal fixed point. */\n amount: bigint;\n}\n\n/**\n * Encode calldata for `AccountLayer.addMarginToNextVA(subAccount, isolationType, symbolId, amount)`.\n *\n * The contract picks the next VA address internally — no client-side prediction needed.\n */\nexport function encodeAddMarginToNextVA(parameters: EncodeAddMarginToNextVAParameters): Hex {\n return encodeFunctionData({\n abi: accountLayerAbi,\n functionName: \"addMarginToNextVA\",\n args: [parameters.subAccount, parameters.isolationType, parameters.symbolId, parameters.amount],\n });\n}\n\n/**\n * Parameters for {@link encodeSendQuoteWithAffiliateAndData}.\n */\nexport interface EncodeSendQuoteWithAffiliateAndDataParameters {\n /** Allowed partyB addresses. */\n partyBsWhiteList: readonly Address[];\n /** Market symbol id. */\n symbolId: bigint;\n /** Position type contract value (0 LONG, 1 SHORT). */\n positionType: number;\n /** Order type contract value (0 LIMIT, 1 MARKET). */\n orderType: number;\n /** Requested open price as 18-decimal fixed point. */\n price: bigint;\n /** Order quantity as 18-decimal fixed point. */\n quantity: bigint;\n /** CVA locked margin as 18-decimal fixed point. */\n cva: bigint;\n /** LF locked margin as 18-decimal fixed point. */\n lf: bigint;\n /** PartyA maintenance margin as 18-decimal fixed point. */\n partyAmm: bigint;\n /** PartyB maintenance margin as 18-decimal fixed point. */\n partyBmm: bigint;\n /** Unix-seconds deadline. */\n deadline: bigint;\n /** Affiliate registry address. */\n affiliate: Address;\n /** ABI-encoded metadata blob (e.g. UUID). */\n data: Hex;\n /** Muon signature. Defaults to {@link ZERO_UPNL_SIG} for lowcap. */\n upnlSig?: UpnlSig;\n}\n\n/**\n * Encode calldata for `Symmio.sendQuoteWithAffiliateAndData(...)`.\n *\n * Pass a real `upnlSig` for solvers requiring Muon verification, or omit to\n * default to {@link ZERO_UPNL_SIG} (lowcap).\n */\nexport function encodeSendQuoteWithAffiliateAndData(parameters: EncodeSendQuoteWithAffiliateAndDataParameters): Hex {\n const sig = parameters.upnlSig ?? ZERO_UPNL_SIG;\n return encodeFunctionData({\n abi: symmioAbi,\n functionName: \"sendQuoteWithAffiliateAndData\",\n args: [\n [...parameters.partyBsWhiteList],\n parameters.symbolId,\n parameters.positionType,\n parameters.orderType,\n parameters.price,\n parameters.quantity,\n parameters.cva,\n parameters.lf,\n parameters.partyAmm,\n parameters.partyBmm,\n parameters.deadline,\n parameters.affiliate,\n {\n reqId: sig.reqId,\n timestamp: sig.timestamp,\n upnl: sig.upnl,\n price: sig.price,\n gatewaySignature: sig.gatewaySignature,\n sigs: {\n signature: sig.sigs.signature,\n owner: sig.sigs.owner,\n nonce: sig.sigs.nonce,\n },\n },\n parameters.data,\n ],\n });\n}\n\n/**\n * Build the metadata blob attached to a `sendQuoteWithAffiliateAndData` call.\n *\n * Encodes a single-field tuple `{ uuid: string }` to ABI bytes — used by the\n * solver to track quote provenance.\n *\n * @param uuid - Opaque identifier (caller-controlled; usually `crypto.randomUUID()`).\n */\nexport function buildQuoteMetadata(uuid: string): Hex {\n return encodeAbiParameters([{ type: \"tuple\", components: [{ type: \"string\", name: \"uuid\" }] }], [{ uuid }]);\n}\n\n/**\n * Argument indices of `upnlSig` and `data` in `sendQuoteWithAffiliateAndData`,\n * derived from the shipped ABI rather than hardcoded.\n *\n * Both arguments are dynamic (the signature tuple contains two `bytes` members;\n * `data` is `bytes`), so their head words hold tail pointers, and the ABI writes\n * tails in argument order — which is what makes {@link sendQuoteUpnlSigFlexRange}\n * able to derive the region size from the difference. Reading the indices from\n * the ABI means a contract upgrade that reorders the arguments surfaces here at\n * module load instead of silently producing a wrong byte range.\n *\n * @internal\n */\nconst SEND_QUOTE_ARG_INDICES = (() => {\n const fragment = symmioAbi.find(\n (entry): entry is Extract<(typeof symmioAbi)[number], { name: \"sendQuoteWithAffiliateAndData\" }> =>\n entry.type === \"function\" && entry.name === \"sendQuoteWithAffiliateAndData\",\n );\n if (!fragment) {\n throw new SymmError(\n \"config\",\n \"SEND_QUOTE_ABI_MISSING\",\n \"The shipped SYMMIO ABI has no `sendQuoteWithAffiliateAndData` function.\",\n );\n }\n const inputs = fragment.inputs as readonly { name?: string }[];\n const upnlSig = inputs.findIndex((input) => input.name === \"upnlSig\");\n const data = inputs.findIndex((input) => input.name === \"data\");\n if (upnlSig === -1 || data === -1) {\n throw new SymmError(\n \"config\",\n \"SEND_QUOTE_ABI_MISSING\",\n \"`sendQuoteWithAffiliateAndData` is missing its `upnlSig` or `data` argument in the shipped ABI.\",\n );\n }\n return { upnlSig, data };\n})();\n\n/** Byte offset of an argument's head word, relative to the start of the arguments. */\nconst WORD_BYTES = 32;\n\n/**\n * A contiguous calldata region, described the way the InstantLayer's `FlexField`\n * expects it.\n */\nexport interface SendQuoteUpnlSigFlexRange {\n /**\n * Args-relative byte offset where the region starts — measured **after** the\n * 4-byte function selector, matching the on-chain `FlexField.offset` contract.\n */\n offset: bigint;\n /** Region size in bytes. */\n length: bigint;\n}\n\n/**\n * Locate the encoded `upnlSig` region inside `sendQuoteWithAffiliateAndData`\n * calldata, so it can be delegated to a solver via a `FlexField`.\n *\n * Lowcap solvers sign the quote with a placeholder signature\n * ({@link getFakeSendQuoteMuonSignature}) and authorize the solver to overwrite\n * this exact range with a live Muon attestation at execution time. Solvers that\n * require the caller to supply a real signature (majors) do not need this.\n *\n * The region is `[head[upnlSig], head[data])` — `upnlSig` and `data` are both\n * dynamic and adjacent in argument order, so `data`'s tail pointer marks the end\n * of the signature's tail. The offset therefore varies with earlier dynamic\n * arguments (notably `partyBsWhiteList` length) and must never be hardcoded.\n *\n * @param callData - Encoded `sendQuoteWithAffiliateAndData` calldata.\n * @returns The `upnlSig` region as an args-relative offset and byte length.\n * @throws {SymmError} when `callData` is too short to contain both head words,\n * or the pointers are not ordered as the encoding guarantees.\n *\n * @example\n * ```ts\n * const callData = encodeSendQuoteWithAffiliateAndData({ …, upnlSig: fakeSig });\n * const range = sendQuoteUpnlSigFlexRange(callData);\n * buildSignedOperation({ …, callData, flexFields: [{ ...range, authorizedFlexFiller: solver.address }] });\n * ```\n */\nexport function sendQuoteUpnlSigFlexRange(callData: Hex): SendQuoteUpnlSigFlexRange {\n /** Strip the 4-byte selector: every offset below is args-relative. */\n const args = `0x${callData.slice(2 + 8)}` as Hex;\n const argsBytes = (args.length - 2) / 2;\n\n const readHeadWord = (index: number): bigint => {\n const start = index * WORD_BYTES;\n if (start + WORD_BYTES > argsBytes) {\n throw new SymmError(\n \"validation\",\n \"SEND_QUOTE_FLEX_RANGE_INVALID\",\n `sendQuote calldata is too short to hold argument head word ${index}.`,\n );\n }\n return hexToBigInt(sliceHex(args, start, start + WORD_BYTES));\n };\n\n const offset = readHeadWord(SEND_QUOTE_ARG_INDICES.upnlSig);\n const end = readHeadWord(SEND_QUOTE_ARG_INDICES.data);\n\n if (end <= offset || end > BigInt(argsBytes)) {\n throw new SymmError(\n \"validation\",\n \"SEND_QUOTE_FLEX_RANGE_INVALID\",\n `sendQuote calldata has an out-of-order or out-of-bounds upnlSig region (offset ${offset}, end ${end}).`,\n );\n }\n\n return { offset, length: end - offset };\n}\n"],"mappings":";;;;;AAiBA,IAAa,IAAyB;CACpC,OAAO;CACP,WAAW;CACX,MAAM;CACN,OAAO;CACP,kBAAkB;CAClB,MAAM;EAAE,WAAW;EAAI,OAAO;EAAa,OAAO;CAAY;AAChE,GAUM,IAA0B,KAAK,KAAK,OAAO,EAAE;AAiBnD,SAAgB,EAA8B,GAA2B;CACvE,OAAO;EACL,OAAO;EACP,WAAW,OAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,CAAC;EAC/C,MAAM;EACN,OAAO;EACP,kBAAkB;EAClB,MAAM;GAAE,WAAW;GAAI,OAAO;GAAa,OAAO;EAAY;CAChE;AACF;AAqBA,SAAgB,EAAwB,GAAoD;CAC1F,OAAO,EAAmB;EACxB,KAAK;EACL,cAAc;EACd,MAAM;GAAC,EAAW;GAAY,EAAW;GAAe,EAAW;GAAU,EAAW;EAAM;CAChG,CAAC;AACH;AA0CA,SAAgB,EAAoC,GAAgE;CAClH,IAAM,IAAM,EAAW,WAAW;CAClC,OAAO,EAAmB;EACxB,KAAK;EACL,cAAc;EACd,MAAM;GACJ,CAAC,GAAG,EAAW,gBAAgB;GAC/B,EAAW;GACX,EAAW;GACX,EAAW;GACX,EAAW;GACX,EAAW;GACX,EAAW;GACX,EAAW;GACX,EAAW;GACX,EAAW;GACX,EAAW;GACX,EAAW;GACX;IACE,OAAO,EAAI;IACX,WAAW,EAAI;IACf,MAAM,EAAI;IACV,OAAO,EAAI;IACX,kBAAkB,EAAI;IACtB,MAAM;KACJ,WAAW,EAAI,KAAK;KACpB,OAAO,EAAI,KAAK;KAChB,OAAO,EAAI,KAAK;IAClB;GACF;GACA,EAAW;EACb;CACF,CAAC;AACH;AAUA,SAAgB,EAAmB,GAAmB;CACpD,OAAO,EAAoB,CAAC;EAAE,MAAM;EAAS,YAAY,CAAC;GAAE,MAAM;GAAU,MAAM;EAAO,CAAC;CAAE,CAAC,GAAG,CAAC,EAAE,QAAK,CAAC,CAAC;AAC5G;AAeA,IAAM,WAAgC;CACpC,IAAM,IAAW,EAAU,MACxB,MACC,EAAM,SAAS,cAAc,EAAM,SAAS,+BAChD;CACA,IAAI,CAAC,GACH,MAAM,IAAI,EACR,UACA,0BACA,yEACF;CAEF,IAAM,IAAS,EAAS,QAClB,IAAU,EAAO,WAAW,MAAU,EAAM,SAAS,SAAS,GAC9D,IAAO,EAAO,WAAW,MAAU,EAAM,SAAS,MAAM;CAC9D,IAAI,MAAY,MAAM,MAAS,IAC7B,MAAM,IAAI,EACR,UACA,0BACA,iGACF;CAEF,OAAO;EAAE;EAAS;CAAK;AACzB,GAAG,GAGG,IAAa;AA0CnB,SAAgB,EAA0B,GAA0C;CAElF,IAAM,IAAO,KAAK,EAAS,MAAM,EAAK,KAChC,KAAa,EAAK,SAAS,KAAK,GAEhC,KAAgB,MAA0B;EAC9C,IAAM,IAAQ,IAAQ;EACtB,IAAI,IAAQ,IAAa,GACvB,MAAM,IAAI,EACR,cACA,iCACA,8DAA8D,EAAM,EACtE;EAEF,OAAO,EAAY,EAAS,GAAM,GAAO,IAAQ,CAAU,CAAC;CAC9D,GAEM,IAAS,EAAa,EAAuB,OAAO,GACpD,IAAM,EAAa,EAAuB,IAAI;CAEpD,IAAI,KAAO,KAAU,IAAM,OAAO,CAAS,GACzC,MAAM,IAAI,EACR,cACA,iCACA,kFAAkF,EAAO,QAAQ,EAAI,GACvG;CAGF,OAAO;EAAE;EAAQ,QAAQ,IAAM;CAAO;AACxC"}
|
|
1
|
+
{"version":3,"file":"calldata.js","names":[],"sources":["../../../../src/solvers/instant-open/shared/calldata.ts"],"sourcesContent":["import {\n encodeAbiParameters,\n encodeFunctionData,\n hexToBigInt,\n sliceHex,\n zeroAddress,\n type Address,\n type Hex,\n} from \"viem\";\nimport { SymmError } from \"../../../shared/errors/symm-error\";\nimport { accountLayerAbi } from \"../../../symmio-contracts/abi/v0.8.6/account-layer\";\nimport { symmioAbi } from \"../../../symmio-contracts/abi/v0.8.6/symmio\";\nimport type { SolverFeeCaps, UpnlSig, VirtualAccountIsolationType } from \"./types\";\n\n/**\n * Zeroed Muon oracle signature used by lowcap flows that bypass Muon verification.\n */\nexport const ZERO_UPNL_SIG: UpnlSig = {\n reqId: \"0x\",\n timestamp: 0n,\n upnl: 0n,\n price: 0n,\n gatewaySignature: \"0x\",\n sigs: { signature: 0n, owner: zeroAddress, nonce: zeroAddress },\n};\n\n/**\n * A `bytes32`-shaped zero value: 32 zero bytes.\n *\n * The placeholder `reqId` must be **byte-shaped like a real one**, because the\n * solver's flex fill replaces an exact byte range (see\n * {@link sendQuoteUpnlSigFlexRange}) — a `0x` empty `bytes` encodes 32 bytes\n * shorter than a real request id and would shift every downstream offset.\n */\nconst PLACEHOLDER_REQ_ID: Hex = `0x${\"00\".repeat(32)}`;\n\n/**\n * Build a placeholder Muon signature carrying only the trade price.\n *\n * Used in lowcap flows where the InstantLayer accepts a zero/fake signature\n * but the contract still reads `upnlSig.price` for accounting. The single\n * canonical price for the trade (the slippage-adjusted open price in wei)\n * is what callers pass here.\n *\n * @remarks\n * `reqId` is 32 zero bytes rather than `0x` so the encoded `upnlSig` region is\n * the same size the solver expects when it fills a live signature into the\n * delegated flex range.\n *\n * @param priceWei - Trade price as 18-decimal fixed point (`bigint`).\n */\nexport function getFakeSendQuoteMuonSignature(priceWei: bigint): UpnlSig {\n return {\n reqId: PLACEHOLDER_REQ_ID,\n timestamp: BigInt(Math.floor(Date.now() / 1000)),\n upnl: 0n,\n price: priceWei,\n gatewaySignature: \"0x\",\n sigs: { signature: 0n, owner: zeroAddress, nonce: zeroAddress },\n };\n}\n\n/**\n * Parameters for {@link encodeAddMarginToNextVA}.\n */\nexport interface EncodeAddMarginToNextVAParameters {\n /** Sub-account address (typically the user's wallet). */\n subAccount: Address;\n /** Virtual-account isolation type. */\n isolationType: VirtualAccountIsolationType;\n /** Market symbol id. */\n symbolId: bigint;\n /** Margin amount as 18-decimal fixed point. */\n amount: bigint;\n}\n\n/**\n * Encode calldata for `AccountLayer.addMarginToNextVA(subAccount, isolationType, symbolId, amount)`.\n *\n * The contract picks the next VA address internally — no client-side prediction needed.\n */\nexport function encodeAddMarginToNextVA(parameters: EncodeAddMarginToNextVAParameters): Hex {\n return encodeFunctionData({\n abi: accountLayerAbi,\n functionName: \"addMarginToNextVA\",\n args: [parameters.subAccount, parameters.isolationType, parameters.symbolId, parameters.amount],\n });\n}\n\n/**\n * Parameters for {@link encodeSendQuoteWithAffiliateAndData}.\n */\nexport interface EncodeSendQuoteWithAffiliateAndDataParameters {\n /** Allowed partyB addresses. */\n partyBsWhiteList: readonly Address[];\n /** Market symbol id. */\n symbolId: bigint;\n /** Position type contract value (0 LONG, 1 SHORT). */\n positionType: number;\n /** Order type contract value (0 LIMIT, 1 MARKET). */\n orderType: number;\n /** Requested open price as 18-decimal fixed point. */\n price: bigint;\n /** Order quantity as 18-decimal fixed point. */\n quantity: bigint;\n /** CVA locked margin as 18-decimal fixed point. */\n cva: bigint;\n /** LF locked margin as 18-decimal fixed point. */\n lf: bigint;\n /** PartyA maintenance margin as 18-decimal fixed point. */\n partyAmm: bigint;\n /** PartyB maintenance margin as 18-decimal fixed point. */\n partyBmm: bigint;\n /** Unix-seconds deadline. */\n deadline: bigint;\n /** Affiliate registry address. */\n affiliate: Address;\n /** ABI-encoded metadata blob (e.g. UUID). */\n data: Hex;\n /** Muon signature. Defaults to {@link ZERO_UPNL_SIG} for lowcap. */\n upnlSig?: UpnlSig;\n}\n\n/**\n * Encode calldata for the legacy `Symmio.sendQuoteWithAffiliateAndData(...)`.\n *\n * Kept for the **Rasa** flow. On perps-core v0.8.6 this method remains\n * available with its original selector but stores **zero solver-fee caps** —\n * a solver that requires fee caps will not accept quotes sent through it; use\n * {@link encodeSendQuote} for those (the Enigma flow does).\n *\n * Pass a real `upnlSig` for solvers requiring Muon verification, or omit to\n * default to {@link ZERO_UPNL_SIG} (lowcap).\n */\nexport function encodeSendQuoteWithAffiliateAndData(parameters: EncodeSendQuoteWithAffiliateAndDataParameters): Hex {\n const sig = parameters.upnlSig ?? ZERO_UPNL_SIG;\n return encodeFunctionData({\n abi: symmioAbi,\n functionName: \"sendQuoteWithAffiliateAndData\",\n args: [\n [...parameters.partyBsWhiteList],\n parameters.symbolId,\n parameters.positionType,\n parameters.orderType,\n parameters.price,\n parameters.quantity,\n parameters.cva,\n parameters.lf,\n parameters.partyAmm,\n parameters.partyBmm,\n parameters.deadline,\n parameters.affiliate,\n {\n reqId: sig.reqId,\n timestamp: sig.timestamp,\n upnl: sig.upnl,\n price: sig.price,\n gatewaySignature: sig.gatewaySignature,\n sigs: {\n signature: sig.sigs.signature,\n owner: sig.sigs.owner,\n nonce: sig.sigs.nonce,\n },\n },\n parameters.data,\n ],\n });\n}\n\n/** Zeroed solver-fee caps: the quote authorizes no solver fee on either side. */\nconst ZERO_SOLVER_FEE_CAPS: SolverFeeCaps = { openRateCap: 0n, closeRateCap: 0n };\n\n/**\n * Parameters for {@link encodeSendQuote}: the legacy parameter set plus the\n * v0.8.6 solver-fee caps.\n */\nexport interface EncodeSendQuoteParameters extends EncodeSendQuoteWithAffiliateAndDataParameters {\n /**\n * Solver-fee rate caps authorized on the quote (18-decimal ratios). Defaults\n * to zero caps — semantically identical to the legacy method, which a\n * fee-charging solver may reject; fill from the market's\n * `minOpenSolverFeeCap` / `minCloseSolverFeeCap`.\n */\n solverFeeCaps?: SolverFeeCaps;\n}\n\n/**\n * Encode calldata for `Symmio.sendQuote(...)` — the perps-core v0.8.6 overload\n * that carries `SolverFeeCaps` as its trailing argument. Identical to\n * {@link encodeSendQuoteWithAffiliateAndData} otherwise.\n *\n * Pass a real `upnlSig` for solvers requiring Muon verification, or omit to\n * default to {@link ZERO_UPNL_SIG} (lowcap).\n */\nexport function encodeSendQuote(parameters: EncodeSendQuoteParameters): Hex {\n const sig = parameters.upnlSig ?? ZERO_UPNL_SIG;\n const caps = parameters.solverFeeCaps ?? ZERO_SOLVER_FEE_CAPS;\n return encodeFunctionData({\n abi: symmioAbi,\n functionName: \"sendQuote\",\n args: [\n [...parameters.partyBsWhiteList],\n parameters.symbolId,\n parameters.positionType,\n parameters.orderType,\n parameters.price,\n parameters.quantity,\n parameters.cva,\n parameters.lf,\n parameters.partyAmm,\n parameters.partyBmm,\n parameters.deadline,\n parameters.affiliate,\n {\n reqId: sig.reqId,\n timestamp: sig.timestamp,\n upnl: sig.upnl,\n price: sig.price,\n gatewaySignature: sig.gatewaySignature,\n sigs: {\n signature: sig.sigs.signature,\n owner: sig.sigs.owner,\n nonce: sig.sigs.nonce,\n },\n },\n parameters.data,\n { openRateCap: caps.openRateCap, closeRateCap: caps.closeRateCap },\n ],\n });\n}\n\n/**\n * Build the metadata blob attached to a quote-send call (`sendQuote`, or the\n * legacy `sendQuoteWithAffiliateAndData`).\n *\n * Encodes a single-field tuple `{ uuid: string }` to ABI bytes — used by the\n * solver to track quote provenance.\n *\n * @param uuid - Opaque identifier (caller-controlled; usually `crypto.randomUUID()`).\n */\nexport function buildQuoteMetadata(uuid: string): Hex {\n return encodeAbiParameters([{ type: \"tuple\", components: [{ type: \"string\", name: \"uuid\" }] }], [{ uuid }]);\n}\n\n/**\n * Argument indices of `upnlSig` and `data` in `sendQuote`, derived from the\n * shipped ABI rather than hardcoded.\n *\n * Both arguments are dynamic (the signature tuple contains two `bytes` members;\n * `data` is `bytes`), so their head words hold tail pointers, and the ABI writes\n * tails in argument order — which is what makes {@link sendQuoteUpnlSigFlexRange}\n * able to derive the region size from the difference. The trailing\n * `solverFeeCaps` tuple is static (two `uint256`s inlined after `data`'s head),\n * so it has no tail and never shifts these words. Reading the indices from the\n * ABI means a contract upgrade that reorders the arguments surfaces here at\n * module load instead of silently producing a wrong byte range.\n *\n * @internal\n */\nconst SEND_QUOTE_ARG_INDICES = (() => {\n const fragment = symmioAbi.find(\n (entry): entry is Extract<(typeof symmioAbi)[number], { name: \"sendQuote\" }> =>\n entry.type === \"function\" && entry.name === \"sendQuote\",\n );\n if (!fragment) {\n throw new SymmError(\"config\", \"SEND_QUOTE_ABI_MISSING\", \"The shipped SYMMIO ABI has no `sendQuote` function.\");\n }\n const inputs = fragment.inputs as readonly { name?: string }[];\n const upnlSig = inputs.findIndex((input) => input.name === \"upnlSig\");\n const data = inputs.findIndex((input) => input.name === \"data\");\n if (upnlSig === -1 || data === -1) {\n throw new SymmError(\n \"config\",\n \"SEND_QUOTE_ABI_MISSING\",\n \"`sendQuote` is missing its `upnlSig` or `data` argument in the shipped ABI.\",\n );\n }\n return { upnlSig, data };\n})();\n\n/** Byte offset of an argument's head word, relative to the start of the arguments. */\nconst WORD_BYTES = 32;\n\n/**\n * A contiguous calldata region, described the way the InstantLayer's `FlexField`\n * expects it.\n */\nexport interface SendQuoteUpnlSigFlexRange {\n /**\n * Args-relative byte offset where the region starts — measured **after** the\n * 4-byte function selector, matching the on-chain `FlexField.offset` contract.\n */\n offset: bigint;\n /** Region size in bytes. */\n length: bigint;\n}\n\n/**\n * Locate the encoded `upnlSig` region inside `sendQuote` calldata, so it can be\n * delegated to a solver via a `FlexField`.\n *\n * Lowcap solvers sign the quote with a placeholder signature\n * ({@link getFakeSendQuoteMuonSignature}) and authorize the solver to overwrite\n * this exact range with a live Muon attestation at execution time. Solvers that\n * require the caller to supply a real signature (majors) do not need this.\n *\n * The region is `[head[upnlSig], head[data])` — `upnlSig` and `data` are both\n * dynamic and adjacent in argument order, so `data`'s tail pointer marks the end\n * of the signature's tail. The offset therefore varies with earlier dynamic\n * arguments (notably `partyBsWhiteList` length) and must never be hardcoded.\n *\n * @param callData - Encoded `sendQuote` calldata.\n * @returns The `upnlSig` region as an args-relative offset and byte length.\n * @throws {SymmError} when `callData` is too short to contain both head words,\n * or the pointers are not ordered as the encoding guarantees.\n *\n * @example\n * ```ts\n * const callData = encodeSendQuote({ …, upnlSig: fakeSig });\n * const range = sendQuoteUpnlSigFlexRange(callData);\n * buildSignedOperation({ …, callData, flexFields: [{ ...range, authorizedFlexFiller: solver.address }] });\n * ```\n */\nexport function sendQuoteUpnlSigFlexRange(callData: Hex): SendQuoteUpnlSigFlexRange {\n /** Strip the 4-byte selector: every offset below is args-relative. */\n const args = `0x${callData.slice(2 + 8)}` as Hex;\n const argsBytes = (args.length - 2) / 2;\n\n const readHeadWord = (index: number): bigint => {\n const start = index * WORD_BYTES;\n if (start + WORD_BYTES > argsBytes) {\n throw new SymmError(\n \"validation\",\n \"SEND_QUOTE_FLEX_RANGE_INVALID\",\n `sendQuote calldata is too short to hold argument head word ${index}.`,\n );\n }\n return hexToBigInt(sliceHex(args, start, start + WORD_BYTES));\n };\n\n const offset = readHeadWord(SEND_QUOTE_ARG_INDICES.upnlSig);\n const end = readHeadWord(SEND_QUOTE_ARG_INDICES.data);\n\n if (end <= offset || end > BigInt(argsBytes)) {\n throw new SymmError(\n \"validation\",\n \"SEND_QUOTE_FLEX_RANGE_INVALID\",\n `sendQuote calldata has an out-of-order or out-of-bounds upnlSig region (offset ${offset}, end ${end}).`,\n );\n }\n\n return { offset, length: end - offset };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-open/shared/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-open/shared/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC"}
|