Gas Heuristics
This doc contains suggested gasWanted
values for specific Exchange messages. Values were obtained heuristically
by observing gas consumption during MsgServer execution for a transaction containing a single Msg type. Conceptually,
for any transaction the following formula applies:
tx_gas = ante_gas + msg_gas (+ msg2_gas ...)
where ante_gas
is the gas consumed during AnteHandler
and the subsequent sum of msg_gas
is gas consumed
by MsgServer of each particular msg (highest observed ante_gas
is 120_000).
With fixed_gas_enabled
set to true
in Exchange params, the following values can be used as gasWanted
in order to
ensure a transaction does not run out of gas:
Note: It is assumed that the transaction contains a single message`.
MsgCreateDerivativeLimitOrder
240,000 (post-only: 260,000)
MsgCreateDerivativeMarketOrder
235,000
MsgCancelDerivativeOrder
190,000
MsgCreateSpotLimitOrder
220,000 (post-only: 240,000)
MsgCreateSpotMarketOrder
170,000
MsgCancelSpotOrder
185,000
MsgCreateBinaryOptionsLimitOrder
240,000 (post-only: 260,000)
MsgCreateBinaryOptionsMarketOrder
225,000
MsgCancelBinaryOptionsOrder
190,000
MsgDeposit
158,000
MsgWithdrawGas
155,000
MsgSubaccountTransferGas
135,000
MsgExternalTransferGas
160,000
MsgIncreasePositionMarginGas
171,000
MsgDecreasePositionMarginGas
180,000
If the order in question is also a GTB (Good-Till-Block) order, an amount of gas equal to 10% of the above values should be added on top.
Batch Msg types
Gas for batch message types varies based on the content of the message itself. Additionally, ante_gas
scales with the
number of orders (noticeably around 3000 added gas, included in this formula).:
N
- is the number of orders
MsgBatchCreateSpotLimitOrders
:tx_gas = 120_000 + N x 103_000
(e.g. for 3 orders you get329_000
)MsgBatchCancelSpotOrders
:tx_gas = 120_000 + N x 68_000
MsgBatchCreateDerivativeLimitOrders
:tx_gas = 120_000 + N x 123_000
MsgBatchCancelDerivativeOrders
:tx_gas = 120_000 + N x 73_000
MsgBatchCancelBinaryOptionsOrders
:tx_gas = 120_000 + N x 123_000
MsgBatchUpdateOrders
type MsgBatchUpdateOrders struct {
Sender string
SubaccountId string // used only with cancel-all ((M - number of markets, N number of orders in a market)
SpotMarketIdsToCancelAll []string // M x N x 65_000
DerivativeMarketIdsToCancelAll []string // M x N x 70_000
BinaryOptionsMarketIdsToCancelAll []string // M x N x 70_000
SpotOrdersToCancel []*OrderData // N x 65_000 + N x 3000
DerivativeOrdersToCancel []*OrderData // N x 70_000 + N x 3000
BinaryOptionsOrdersToCancel []*OrderData // N x 70_000 + N x 3000
SpotOrdersToCreate []*SpotOrder // N x 100_000 (120_000 if post-only) + N x 3000
DerivativeOrdersToCreate []*DerivativeOrder // N x 120_000 (140_000 if post-only) + N x 3000
BinaryOptionsOrdersToCreate []*DerivativeOrder // N x 120_000 (140_000 if post-only) + N x 3000
}
For example, let's suppose you want to:
cancel 3 spot orders in market A
create 2 derivative orders in market B
create 1 binary-options post-only order in market C
cancel all orders in spot markets X and Y (2 orders in X and 2 orders in Y)
The resulting gas would be computed as such:
total_gas = 3 x 100_000 + 3 x 3000 // cancel 3x spot
+ 2 x 120_000 + 2 x 3000 // create 2x derv
+ 140_000 // create 1x post-only bo
+ 4 x 65_000 // cancel-all 4x spot orders
which ends up being 955_000
gas.
Last updated