Skip to main content

Trading

Trading uses a queued RequestTrade DTO through the swap backend's chain-gateway route. The SDK resolves the input tokens, chooses the canonical symbols, creates a uniqueKey, signs the DTO, and submits the request. The HTTP 201 acknowledgement means the chain accepted the request; it does not mean the swap has executed.

Exact input​

Sell exactly 100 GALA and protect the minimum output with amountOutMinimum:

const quote = await gSwap.quoting.quoteExactInput('GALA', 'GUSDC', '100');
const tx = await gSwap.swaps.swap('GALA', 'GUSDC', quote.feeTier, {
exactIn: '100',
amountOutMinimum: quote.amountOut,
});
console.log(tx.mode, tx.uniqueKey, tx.transactionId, tx.result);
const applied = await tx.confirm();
console.log(applied.result);

Exact output​

Buy exactly 50 GUSDC and cap the amount of GALA spent:

const quote = await gSwap.quoting.quoteExactOutput('GALA', 'GUSDC', '50');
const tx = await gSwap.swaps.swap('GALA', 'GUSDC', quote.feeTier, {
exactOut: '50',
amountInMaximum: quote.amountIn,
});
const applied = await tx.confirm();
console.log(applied.result);

exactIn and exactOut are mutually exclusive. Their corresponding slippage fields are also directional: amountOutMinimum protects an exact-input trade, while amountInMaximum protects an exact-output trade. The SDK rejects a trade that supplies both sides.

An optional positive priceLimit (a sqrt-price limit) can be added to either form and is sent to the chain as the DTO's priceLimit.

Unique keys​

Every write carries a fresh uniqueKey of the form <prefix><uuid>. The default prefix is galaswap-operation-, what the Gala Wallet and the gSwap web app send. Set uniqueKeyPrefix on new GSwap({ uniqueKeyPrefix }) to change it; it must be at most 92 characters of A-Z a-z 0-9 . _ : - so the key remains readable by the apply-results endpoint.

What happens after submit​

The returned SubmittedTransaction has mode === 'queued', result === undefined, and a stable uniqueKey. Its transactionId is the request transaction when the gateway provides one. await tx.confirm() resolves an AppliedTrade with uniqueKey, the apply transactionId and blockNumber, the requestTransactionId, and a result containing token0, token1, fee, and applicable decimal-string quantities and fee fields.

For example, the applied fixture contains token0: 'GALA', token1: 'GUSDC', fee: 3000, sell0Qty: '0.99999996', and buy1Qty: '0.1202'. A Status: 0 apply result throws CHAIN_REJECTED, with the chain's ErrorKey as params.errorKey and its text as params.serverMessage; the rejected fixture has errorKey VALIDATION_FAILED and serverMessage Slippage limit: trade would return 0.120199 GUSDC, below the required minimum 999999999. Map params.errorKey to your own text; the server's English is data to relay or ignore. classifyFailure(error) tells you whether Retry is safe (see Error Handling).

There is no synchronous swap and no fallback to one. See Transaction Status.

The current backend route is method-specific and the body is the signed DTO itself.