Skip to main content
Your Spark wallet’s identity key controls a Spark address and an Execution-side EVM address. There is no separate signup, no separate funding, and no key-management surface beyond the seed you already use for Spark.

Get the addresses

const execClient = new ExecutionClient(sparkWallet);
await execClient.authenticate();

const evmAddress = await execClient.getEvmAddress();
const sparkAddress = await sparkWallet.getSparkAddress();
getEvmAccount() returns the underlying viem LocalAccount if you need to sign arbitrary EVM transactions outside the SDK helpers.

Under the hood

The identity key is a single secp256k1 private key derived from your Spark seed. Spark uses its own BIP32 path for the derivation, not Ethereum’s m/44'/60'/0'/0/0. Spark uses that private key directly to sign transfers; Flashnet Execution uses it to sign EVM transactions and intents. To produce the EVM address from the same private key, the SDK applies the standard Ethereum derivation: take the uncompressed public key, drop the leading 0x04 prefix, keccak256-hash the remaining 64 bytes, then take the last 20 bytes.
evm_address = keccak256(uncompressed_pubkey[1:65])[12:32]
Any Ethereum wallet computes the same address from this private key. One seed, two addresses, always tied together.

Funding

There is no faucet step. The Execution side carries no native gas balance separately from your sats. Flashnet runs the EVM with baseFeePerGas = 0 and maxPriorityFeePerGas = 0, so there is no base fee to charge. To get assets onto the Execution side, deposit them: see Deposits.

What gets shared

Belongs to the identity keySpark sideExecution side
AddressBech32m (sp1...)EVM (0x...)
CustodySpark MPC + L1 fallbackSparkGateway + native sats balance
AuthFROST / wallet signingChallenge-response on the gateway
Settlementsend_sats / send_tokenEIP-1559 transactions
Both sides authenticate the same identity public key. The gateway recognizes any intent signed by the key that produced your Spark address; there is no separate “Execution password” or “Execution session” beyond the short-lived bearer token authenticate() returns.

Multiple accounts

If you need isolated balances for different products or users, derive a fresh SparkWallet per account. Each gets its own identity key and therefore its own pair of Spark + EVM addresses. The gateway treats them as unrelated.