Skip to Content
EVMSolo

Solo Precompile

Address: 0x000000000000000000000000000000000000100C

The Solo precompile enables migration of balances and certain assets from legacy Sei addresses to an EVM address. It is the canonical path for user migration and is designed to be safe and auditable.

Compatibility: Works today and remains valid under the proposed EVM‑only direction (SIP‑3). Solo cannot be called via CosmWasm, and Sei does not support EVM→CW→EVM call patterns.

Functions

FunctionDescription
claim
function claim(bytes payload) returns (bool)
Migrates all eligible assets for the signer; payload must include signatures and claim descriptors.
claimSpecific
function claimSpecific(bytes payload) returns (bool)
Targets a single asset type (native, CW20, CW721) using a typed payload; prevents partial replay.

Full Solidity Interface

interface ISoloPrecompile { function claim(bytes calldata payload) external returns (bool); function claimSpecific(bytes calldata payload) external returns (bool); }

Generating claim payloads

The payload is a binary-encoded message that proves control over the legacy Sei address and specifies what to claim. The exact schema is versioned; use the official helpers where available.

⚠️
Always construct and sign payloads client‑side and verify the target recipient (msg.sender) is your intended EVM account before broadcasting.

Example

import { ethers } from 'ethers'; import { SOLO_PRECOMPILE_ABI, SOLO_PRECOMPILE_ADDRESS } from '@sei-js/precompiles'; const provider = new ethers.BrowserProvider(window.ethereum); await provider.send('eth_requestAccounts', []); const signer = await provider.getSigner(); const solo = new ethers.Contract(SOLO_PRECOMPILE_ADDRESS, SOLO_PRECOMPILE_ABI, signer); // Migrate all supported assets const payload = ethers.getBytes('0x...'); // use official helper output await solo.claim(payload, { gasLimit: 200_000 }); // Target a specific CW20 asset const cw20Payload = ethers.getBytes('0x...'); await solo.claimSpecific(cw20Payload, { gasLimit: 300_000 });

Notes

  • Solo rejects CosmWasm entrypoints; invoke only from EVM context
  • Payloads are signature-bound; reuse of the same claim reverts with already claimed
  • Review transaction receipts for synthetic logs tagged synthetic=true
  • For asset inventories, pair Solo with Pointer/PointerView before generating payloads

Troubleshooting

ErrorCauseFix
invalid payloadMalformed or unsupported encodingUse official Solo payload helpers; verify signer matches legacy key.
already claimedAsset previously migrated for this addressQuery migration status before retrying; Solo prevents double claims.
unauthorizedSignature does not match legacy accountRebuild payload with correct bech32 source and matching signer.
Last updated on