Sui basics
Is Sui EVM compatible?
October 28, 2026
No. Sui is not EVM compatible. It doesn't run Ethereum bytecode, Solidity contracts or the Ethereum JSON-RPC interface. Smart contracts on Sui are Move packages that run on the Move VM, and state lives in objects rather than in contract storage. To get assets from Ethereum onto Sui you use a bridge. To bring an existing Solidity app over, you rewrite it in Move.
What "not EVM compatible" means in practice
- Language and VM. Sui's docs list Solidity/Vyper on the EVM for Ethereum and Move on the MoveVM for Sui. A Solidity contract can't be deployed as-is. You port the logic to Move.
- Data model. On Ethereum, a contract holds its own data, usually in mappings. On Sui, data lives in Move objects that have owners, and the chain itself enforces ownership. A port is often a redesign more than a line-by-line translation. See what a Sui object is.
- Addresses. Sui addresses are 32 bytes: a BLAKE2b-256 hash of a signature-scheme flag byte plus the public key. Ethereum addresses are 20 bytes and derived differently, so the same key gives a different address on each chain.
- Tooling. Hardhat, Foundry, ethers.js and viem don't target Sui. You use the Sui CLI, the Move VS Code extension, and SDKs such as
@mysten/sui. - Transactions. Sui has no nonces and no ABI-encoded calldata. A transaction is a programmable transaction block that can chain up to 1,024 commands atomically.
What does carry over
- secp256k1 keys. Sui supports Ed25519, secp256k1 and secp256r1 signatures, so the curve Ethereum uses works on Sui. The address and transaction format are still Sui's own, which is why an Ethereum wallet doesn't work on Sui out of the box (see Sui and MetaMask).
- Assets, through bridges. Sui Bridge, the native bridge, connects Sui and Ethereum mainnet. Sui validators operate and govern it. The docs list WBTC, LBTC, ETH, WETH and USDT as supported mainnet assets. Third-party bridges such as Wormhole and ZetaChain also connect Sui to EVM chains. See Sui Bridge.
Porting from Solidity: a quick map
| Ethereum | Sui |
|---|---|
| Contract storage and mappings | Owned or shared objects, dynamic fields |
Ownable, AccessControl |
Capability objects the caller must own |
| ERC-20 / ERC-721 | Currency standard (Coin<T>), NFTs as objects |
| Proxy upgrades | Native package upgrades through an UpgradeCap |
| One call per transaction | PTBs: many calls, atomic, composed client-side |
Move
module example::vault;
// An owned object replaces a mapping entry like balances[msg.sender]
public struct Vault has key, store {
id: UID,
amount: u64,
}
public fun new(ctx: &mut TxContext): Vault {
Vault { id: object::new(ctx), amount: 0 }
}Gotchas
- Calling something "EVM-style" on Sui doesn't make it work with EVM tools. Check whether a project means bridged assets or an actual execution environment.
- Move has generics, but no interfaces, inheritance or dynamic dispatch. Patterns that rely on those need a different design.
Sources
- Ethereum to Sui, Sui documentation
- Bridging to Sui, Sui documentation
- Keys and addresses, Sui documentation