Move Ecosystem Developer Guide: Aptos vs Sui Comparison
⚠️ API call failed (attempt 1/3): RateLimitError [HTTP 429] 🔌 Provider: copilot Model: claude-sonnet-4.6 🌐 Endpoint: https://api.githubcopilot.com 📝 Error: HTTP 429: Sorry, you've exhausted this model's rate limit. Please try a different model. Please review our Terms of Service. 📋 Details: Sorry, you've exhausted this model's rate limit. Please try a different model. Please review our Terms of Service. ⚠️ Rate limited — switching to fallback provider... 🔄 Primary model failed — switching to fallback: anthropic/claude-sonnet-4-6 via custom:commonstack
Move Ecosystem Developer Guide: Aptos vs Sui
Core Features of the Move Language
Move was created by Meta (the Diem project) and is designed specifically for secure asset management:
- Resource types: Cannot be copied or dropped, only moved → naturally prevents double-spending
- Linear type system: Compiler-level guarantees for asset safety
- Module system: Code is organized into modules; resources can only be created/destroyed by the module that defines them
- Formal verification: Move Prover enables mathematical proofs of contract correctness
Key Differences: Aptos vs Sui
| Dimension | Aptos | Sui |
|---|---|---|
| Data model | Account-based (resources live under accounts) | Object-based (each object stored independently) |
| Concurrency | Sequential execution (Block-STM optimistic concurrency) | Object-level parallelism (true high concurrency) |
| Move version | Move (original Meta version, lightly modified) | Move (heavily reworked — Sui Move) |
| Storage fees | Per-byte storage deposit | Per-object storage fee |
| TPS | ~160,000 (theoretical) | ~297,000 (theoretical) |
| NFT model | Token V2 (extensible) | Sui Object (native objects) |
| DeFi ecosystem | Thala / Pancake / Aries | Cetus / Turbos / Navi |
| Dev tooling | Aptos CLI + TS SDK | Sui CLI + TS/Rust SDK |
Aptos Move Contract
module my_addr::coin_example {
use std::signer;
use aptos_framework::coin::{Self, Coin};
// Resource: can only be moved, not copied or dropped
struct MyCoin has key, store {
value: u64,
}
// Initializer (called automatically on deploy)
fun init_module(deployer: &signer) {
// Register as CoinType
}
public entry fun mint(account: &signer, amount: u64) {
let addr = signer::address_of(account);
if (!exists<MyCoin>(addr)) {
move_to(account, MyCoin { value: 0 });
};
let coin = borrow_global_mut<MyCoin>(addr);
coin.value = coin.value + amount;
}
public entry fun transfer(from: &signer, to: address, amount: u64) {
let from_addr = signer::address_of(from);
let from_coin = borrow_global_mut<MyCoin>(from_addr);
assert!(from_coin.value >= amount, 1); // E_INSUFFICIENT
from_coin.value = from_coin.value - amount;
if (!exists<MyCoin>(to)) {
// The recipient account must register first (Aptos-specific requirement)
};
let to_coin = borrow_global_mut<MyCoin>(to);
to_coin.value = to_coin.value + amount;
}
}
Sui Move Contract (Object Model)
module my_package::nft {
use sui::object::{Self, UID};
use sui::transfer;
use sui::tx_context::{Self, TxContext};
use std::string::{Self, String};
// In Sui, every resource is an Object (has a UID)
public struct NFT has key, store {
id: UID,
name: String,
image_url: String,
}
// Mint an NFT and send it to the caller
public entry fun mint(name: vector<u8>, image_url: vector<u8>, ctx: &mut TxContext) {
let nft = NFT {
id: object::new(ctx),
name: string::utf8(name),
image_url: string::utf8(image_url),
};
transfer::public_transfer(nft, tx_context::sender(ctx));
}
// Transfer
public entry fun transfer_nft(nft: NFT, recipient: address) {
transfer::public_transfer(nft, recipient);
}
}
Aptos TypeScript SDK
npm install @aptos-labs/ts-sdk
import { Aptos, AptosConfig, Network, Account } from "@aptos-labs/ts-sdk"
const config = new AptosConfig({ network: Network.MAINNET })
const aptos = new Aptos(config)
// Query balance
const balance = await aptos.getAccountAPTAmount({ accountAddress: address })
// Submit a transaction
const account = Account.fromPrivateKey({ privateKey })
const tx = await aptos.transaction.build.simple({
sender: account.accountAddress,
data: {
function: "0x1::aptos_account::transfer",
functionArguments: [recipientAddress, 100000000n], // 1 APT = 1e8
},
})
const { hash } = await aptos.signAndSubmitTransaction({ signer: account, transaction: tx })
await aptos.waitForTransaction({ transactionHash: hash })
Sui TypeScript SDK
npm install @mysten/sui
import { SuiClient, getFullnodeUrl } from "@mysten/sui/client"
import { Transaction } from "@mysten/sui/transactions"
import { Ed25519Keypair } from "@mysten/sui/keypairs/ed25519"
const client = new SuiClient({ url: getFullnodeUrl("mainnet") })
// Build a transaction
const tx = new Transaction()
const [coin] = tx.splitCoins(tx.gas, [1000000000n]) // 1 SUI
tx.transferObjects([coin], recipientAddress)
// Sign and submit
const keypair = Ed25519Keypair.fromSecretKey(privateKey)
const result = await client.signAndExecuteTransaction({
transaction: tx,
signer: keypair,
})
Chain Selection Guide
What is your use case?
│
├─ Gaming / high-frequency on-chain operations (need high concurrency)
│ → Sui (object-level parallelism, naturally suited for game assets)
│
├─ DeFi protocol (need existing liquidity)
│ → Aptos (Thala/Aries ecosystem is more mature)
│
├─ NFT / digital collectibles
│ → Sui (Object model natively supports complex NFT attributes)
│
├─ Enterprise / compliance requirements
│ → Aptos (partnerships with Google Cloud / Microsoft)
│
└─ Learning Move
→ Start with Aptos (more complete docs, original Move)
Resources
- Aptos Docs: aptos.dev
- Sui Docs: docs.sui.io
- Move Book: move-book.com
Move Ecosystem Developer Guide: Aptos vs Sui
Core Features of the Move Language
Move was created by Meta (the Diem project) and is designed specifically for secure asset management:
- Resource types: Cannot be copied or dropped, only moved → naturally prevents double-spending
- Linear type system: Compiler-level guarantees for asset safety
- Module system: Code is organized into modules; resources can only be created/destroyed by the module that defines them
- Formal verification: Move Prover enables mathematical proofs of contract correctness
Key Differences: Aptos vs Sui
| Dimension | Aptos | Sui |
|---|---|---|
| Data model | Account-based (resources live under accounts) | Object-based (each object stored independently) |
| Concurrency | Sequential execution (Block-STM optimistic concurrency) | Object-level parallelism (true high concurrency) |
| Move version | Move (original Meta version, lightly modified) | Move (heavily reworked — Sui Move) |
| Storage fees | Per-byte storage deposit | Per-object storage fee |
| TPS | ~160,000 (theoretical) | ~297,000 (theoretical) |
| NFT model | Token V2 (extensible) | Sui Object (native objects) |
| DeFi ecosystem | Thala / Pancake / Aries | Cetus / Turbos / Navi |
| Dev tooling | Aptos CLI + TS SDK | Sui CLI + TS/Rust SDK |
Aptos Move Contract
module my_addr::coin_example {
use std::signer;
use aptos_framework::coin::{Self, Coin};
// Resource: can only be moved, not copied or dropped
struct MyCoin has key, store {
value: u64,
}
// Initializer (called automatically on deploy)
fun init_module(deployer: &signer) {
// Register as CoinType
}
public entry fun mint(account: &signer, amount: u64) {
let addr = signer::address_of(account);
if (!exists<MyCoin>(addr)) {
move_to(account, MyCoin { value: 0 });
};
let coin = borrow_global_mut<MyCoin>(addr);
coin.value = coin.value + amount;
}
public entry fun transfer(from: &signer, to: address, amount: u64) {
let from_addr = signer::address_of(from);
let from_coin = borrow_global_mut<MyCoin>(from_addr);
assert!(from_coin.value >= amount, 1); // E_INSUFFICIENT
from_coin.value = from_coin.value - amount;
if (!exists<MyCoin>(to)) {
// The recipient account must register first (Aptos-specific requirement)
};
let to_coin = borrow_global_mut<MyCoin>(to);
to_coin.value = to_coin.value + amount;
}
}
Sui Move Contract (Object Model)
module my_package::nft {
use sui::object::{Self, UID};
use sui::transfer;
use sui::tx_context::{Self, TxContext};
use std::string::{Self, String};
// In Sui, every resource is an Object (has a UID)
public struct NFT has key, store {
id: UID,
name: String,
image_url: String,
}
// Mint an NFT and send it to the caller
public entry fun mint(name: vector<u8>, image_url: vector<u8>, ctx: &mut TxContext) {
let nft = NFT {
id: object::new(ctx),
name: string::utf8(name),
image_url: string::utf8(image_url),
};
transfer::public_transfer(nft, tx_context::sender(ctx));
}
// Transfer
public entry fun transfer_nft(nft: NFT, recipient: address) {
transfer::public_transfer(nft, recipient);
}
}
Aptos TypeScript SDK
npm install @aptos-labs/ts-sdk
import { Aptos, AptosConfig, Network, Account } from "@aptos-labs/ts-sdk"
const config = new AptosConfig({ network: Network.MAINNET })
const aptos = new Aptos(config)
// Query balance
const balance = await aptos.getAccountAPTAmount({ accountAddress: address })
// Submit a transaction
const account = Account.fromPrivateKey({ privateKey })
const tx = await aptos.transaction.build.simple({
sender: account.accountAddress,
data: {
function: "0x1::aptos_account::transfer",
functionArguments: [recipientAddress, 100000000n], // 1 APT = 1e8
},
})
const { hash } = await aptos.signAndSubmitTransaction({ signer: account, transaction: tx })
await aptos.waitForTransaction({ transactionHash: hash })
Sui TypeScript SDK
npm install @mysten/sui
import { SuiClient, getFullnodeUrl } from "@mysten/sui/client"
import { Transaction } from "@mysten/sui/transactions"
import { Ed25519Keypair } from "@mysten/sui/keypairs/ed25519"
const client = new SuiClient({ url: getFullnodeUrl("mainnet") })
// Build a transaction
const tx = new Transaction()
const [coin] = tx.splitCoins(tx.gas, [1000000000n]) // 1 SUI
tx.transferObjects([coin], recipientAddress)
// Sign and submit
const keypair = Ed25519Keypair.fromSecretKey(privateKey)
const result = await client.signAndExecuteTransaction({
transaction: tx,
signer: keypair,
})
Chain Selection Guide
What is your use case?
│
├─ Gaming / high-frequency on-chain operations (need high concurrency)
│ → Sui (object-level parallelism, naturally suited for game assets)
│
├─ DeFi protocol (need existing liquidity)
│ → Aptos (Thala/Aries ecosystem is more mature)
│
├─ NFT / digital collectibles
│ → Sui (Object model natively supports complex NFT attributes)
│
├─ Enterprise / compliance requirements
│ → Aptos (partnerships with Google Cloud / Microsoft)
│
└─ Learning Move
→ Start with Aptos (more complete docs, original Move)
Resources
- Aptos Docs: aptos.dev
- Sui Docs: docs.sui.io
- Move Book: move-book.com
- Aptos Learn: learn.aptoslabs.com