relayGrantDelegation
Grant an Instant Layer delegation through the gasless relayer — session-key onboarding with no native gas.
import { GASLESS_SESSION_KEY_SELECTORS, relayGrantDelegation } from "@symmio/trading-core";
const receipt = await relayGrantDelegation(config, {
account: subAccount,
delegatedSigner: sessionKeyAddress,
selectors: GASLESS_SESSION_KEY_SELECTORS,
expiryTimestamp: BigInt(Math.floor(Date.now() / 1000) + 30 * 24 * 3600),
});A delegation grant is an ordinary owner-signed operation: the SDK encodes InstantLayer.grantDelegation(DelegationInfo), targets the InstantLayer, signs under the InstantLayer EIP-712 domain with a fresh sequential nonce, and submits it through relay-instant with operationType: "grantDelegation" and walletIds: ["0"] — a grant is an ordinary InstantLayer operation, so it never relays from a GaslessWallet. The account owner’s wallet signs — a grant is always owner-signed.
The service’s old standalone delegation-relay endpoint and its SignedDelegation payload no longer exist — their
signature digest differs and cannot be converted. Do not port code built on them. The wallet-paid alternative is the
plain grantDelegation write.
Pair it with GASLESS_SESSION_KEY_SELECTORS to onboard a session key that can then sign gasless account management without further wallet prompts.
This action is a submit: it resolves with the 202 acceptance. React consumers do not need to follow it by hand —
the matching hook in @symmio/trading-react confirms the request before it resolves and invalidates the reads this
action changes. See the React gasless guide.
Prefer grantDelegation with gasless: true. A grant is a relayable
write like any other, so the ordinary action relays it and returns a transaction hash — no separate code path, and the
receipt wait and cache invalidation work unchanged. This action stays as the low-level escape hatch, for when you want
the requestId and the fee figures from the acceptance receipt, exactly as
relayInstantOperations sits beside the transparent path.
Parameters
accountAddressrequiredThe sub-account granting the delegation. The connected wallet must be its owner.
delegatedSignerAddressrequiredThe signer being delegated to (e.g. a session key address).
selectorsreadonly Hex[]requiredFunction selectors the delegate may sign for.
expiryTimestampbigintrequiredUnix timestamp (seconds) when the delegation expires.
chainIdnumberoptionalTarget chain id. Defaults to the config’s defaultChainId.
fromAddressoptionalSigner override for the wallet-client resolver.
Returns
Promise<GaslessSubmitReceipt>The acceptance receipt — persist requestId and poll it with getGaslessRequest
to a terminal status.
The idempotency key is minted per call, not a parameter. Every call signs a fresh operation, so one key can only
ever describe one signature. It comes back on the receipt; replay a lost response with
resubmitGaslessRequest rather than signing a new grant. See idempotency
keys.
Throws
SymmError("config", "GASLESS_NOT_CONFIGURED")/("config", "GASLESS_UNSUPPORTED_CONTRACTS_VERSION").SymmApiErrorwith codeGASLESS_RELAY_SUBMIT_FAILEDon HTTP failure.SymmApiErrorwith codeGASLESS_SUBMIT_UNCONFIRMED— the outcome could not be established; replay it withresubmitGaslessRequest.- Everything the wallet-client resolver throws (
NO_WALLET_CLIENT, a user’s signature rejection).