Host bridge
Your Mini App runs in a sandboxed iframe. EIP-1193 calls never reach a browser extension or external wallet; they travel through a Comlink RPC channel overpostMessage to the Startale App host, which routes them through the user’s smart account.
personal_sign, eth_signTypedData_v4, eth_sendTransaction, wallet_sendCalls) the host opens the Startale approval modal and waits for the user to approve or reject before returning the result. The iframe never touches the private key.
The host also emits provider events back to the iframe (accountsChanged, chainChanged, connect) so wagmi state stays in sync automatically.
Supported methods
Any other method throws
4200 Unsupported method.
Errors
Rejected requests carry an EIP-1193 errorcode. Check the code, not the message. Messages can change, and some are translated into the user’s app language.
A fee estimate that takes longer than 45 seconds counts as failed. A request that is still pending after 5 minutes times out. If the user has already confirmed a transaction and it is still being sent, the host waits one more 5 minutes before timing out.
For other error codes, see Errors.
The signer is always the smart account
If you submit a transaction with afrom field set to a linked EOA, the host overrides it. There is no path for a Mini App to sign or send from an EOA, even if that EOA is in sdk.context.startale.eoaWallets.
Gas
Gas for Mini App transactions is paid by the Startale App. Botheth_sendTransaction and wallet_sendCalls are sponsored, and there is nothing to configure. Signing methods cost no gas at all.
Do not set paymasterOptions in a Mini App. The host sponsors with its own paymaster and ignores any paymaster your Mini App supplies. paymasterOptions exists for applications that run on their own origin, outside the Startale App. See Gas in a standalone application.
Two limits apply. Neither produces a distinct error: when sponsorship does not apply, the user pays, and a user without ETH sees the transaction fail.
- Ethereum Mainnet is capped per user. If your Mini App is enabled for Ethereum Mainnet, the first three Ethereum Mainnet transactions per user are sponsored. The count is per user across the Startale App, not per Mini App, so a user may have used it up before opening yours. After that the user pays gas from their smart account’s ETH balance, and a user without ETH cannot complete the transaction. Soneium transactions are not capped, and Mini Apps run on Soneium only unless enabled for another chain.
- Sponsorship can be withdrawn for an app. It is an operated service rather than a guarantee. Startale can withdraw sponsorship for a specific app, for example when its transactions generate abnormal gas cost, after which its users pay.
Capability matrix
Recommended flow for legacy EOA assets
If a user holds assets in a linked EOA that they want to use inside your Mini App:- Detect the balance with
sdk.context.startale.eoaWalletsand a read-only contract call. - Show the user a message explaining they need to transfer the asset to their smart account.
- The transfer happens outside the Mini App, on your project’s standalone website where MetaMask connects directly.
- Once the asset is in the smart account, all standard Mini App flows (
eth_sendTransaction,wallet_sendCalls) work normally.
Chains
A Mini App can only use the chains it is enabled for. By default that is Soneium Mainnet (1868) only. The Startale team can enable another chain for a specific Mini App, and Ethereum Mainnet (1) is the only other chain enabled today. In the developer preview, every Mini App is also enabled for Ethereum Mainnet, Soneium Minato (1946), and Ethereum Sepolia (11155111), so you can test on them before launch. Your Mini App starts on its default chain. Read it witheth_chainId rather than assuming Soneium, and track changes with the chainChanged event.
To change chain, call wallet_switchEthereumChain with an enabled chain. The host switches, emits chainChanged, and returns null, and later requests use the new chain. wallet_addEthereumChain does the same and cannot add a chain. A request for any chain your Mini App is not enabled for throws 4200.
A wallet_sendCalls request whose chainId differs from the active chain is rejected with -32602. eth_sendTransaction takes no chain and always uses the active chain.