Skip to content

Ethereum to Aptos Migration Guide

Aptos is built to allow you to quickly prototype and scale secure production applications. It combines a fast, cost-efficient, and stable blockchain layer with Move’s compile-time safety that catches exploits before deployment, comprehensive tooling for rapid development, and a strong ecosystem of exchanges and bridges for seamless integration.

FeatureEthereumAptos
Account Addresses160-bit256-bit
Storage MindsetContract-based storageAccount centric mindset for code and data
Caller IDmsg.sender&signer reference
Smart ContractsSolidity, EVMMove, MoveVM
BenefitsMature, wide adoptionScalability, low latency, predictable fees
Transaction FeesVariable, can be highLower and more predictable
Sponsored TransactionsRequires third-party services or EIP-7702 wallet support (2025+)Natively supported via fee payer field. Geomi Gas Stations provides production infrastructure
Account StructureBalance in a single field, uses nonceModules and resources, uses sequence number
Data StoragePatricia Merkle TreesGlobal storage with resources and modules
UpgradeabilityProxy patternsDirect module upgrades
Safety & SecurityVulnerable to attacks like reentrancyMitigates common vulnerabilities
Dispatch TypeDynamic dispatchStatic dispatch
Frontend SDKEthers.js libraryAptos Typescript SDK
NFT StandardsERC-721, ERC-1155Digital Asset
FT StandardERC-20, factory patternSee Fungible Asset, copy paste in your module: use aptos_framework::fungible_asset...
Example CodeERC-20 (new contract per deploy)Fungible Asset (single reusable module)

Legacy Coin documentation still covers the original standard; most new deployments should prefer the Fungible Asset module referenced above.


SolidityMove (Aptos)
Token StructureEach token is its own contract.Every token is a typed FungibleAsset instantiation that reuses the same published module.
Token StandardMust conform to standards like ERC-20; implementations can vary per deploy.Uniform interface and implementation enforced by the shared module; new tokens simply register a new type rather than redeploying code.
Balance StorageBalances stored in contract using a mapping structure.Resource-Oriented Balance: balances live in an extensible object owned by the user’s account.
Transfer MechanismTokens can be transferred without receiver’s explicit permission.Transfers can skip receiver permission, but only when the FA explicitly enables primary-store auto creation (visible in the token’s creation code).

  • EVM: Known for its flexibility and dynamic dispatch, which allows a wide range of smart contract behaviors. This flexibility, however, can lead to complexities in parallel execution and network operations.
  • Move VM: Focuses on safety and efficiency with a more integrated approach between the VM and the programming language. Its data storage model allows for better parallelization, and its static dispatch method enhances security and predictability.

EVM (Ethereum Virtual Machine)Move VM (Move Virtual Machine)
Data StorageData is stored in the smart contract’s storage space.Data is stored across smart contracts, user accounts, and objects.
ParallelizationParallel execution is limited due to shared storage space.More parallel execution enabled due to flexible split storage design.
VM and Language IntegrationSeparate layers for EVM and smart contract languages (e.g., Solidity).Seamless integration between VM layer and Move language, with native functions written in Rust executable in Move.
Critical Network OperationsImplementation of network operations can be complex and less direct.Critical operations like validator set management natively implemented in Move, allowing for direct execution.
Function CallingDynamic dispatch allows for arbitrary smart contract calls.Static dispatch aligns with a focus on security and predictable behavior.
Type SafetyContract types provide a level of type safety.Module structs and generics in Move offer robust type safety.
Transaction SafetyUses nonces for transaction ordering and safety.Uses sequence numbers for transaction ordering and safety.
Authenticated StorageYes, with smart contract storage.Yes, leveraging Move’s resource model.
Object AccessibilityObjects are not globally accessible; bound to smart contract scope.Guaranteed global accessibility of objects.

Ethereum stores all data in contract storage using mappings. Aptos uses an account-centric model where each account stores their own resources. Instead of a contract maintaining a mapping(address => T), each user stores their own T resource at their address.

module my_hackathon_account::prototype {
use std::string;
use std::signer;
// Unlike Solidity's mapping(address => string), each account stores their own resource
struct MessageHolder has key, store, drop {
message: string::String,
}
entry fun set_message(account: &signer, message: string::String) acquires MessageHolder {
let addr = signer::address_of(account);
// Check if resource exists at this account (like checking mapping[addr])
if (exists<MessageHolder>(addr)) {
move_from<MessageHolder>(addr); // Remove old resource
};
// Store resource at the user's address (in their account, not in contract storage!)
move_to(account, MessageHolder { message });
}
#[view]
public fun get_message(addr: address): string::String acquires MessageHolder {
assert!(exists<MessageHolder>(addr), 0);
// Read message stored at the user's address
borrow_global<MessageHolder>(addr).message
}
}

By default, modules deploy to your account address. For production apps, consider deploying to Objects, which creates a unique address per deployment and enables transferable code ownership. See Using Objects for implementation details.

Learn more: global storage operators, structs and resources