⚠️ 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](https://docs.github.com/en/site-policy/github-terms/github-terms-of-service). 📋 Details: Sorry, you've exhausted this model's rate limit. Please try a different model. Please review our [Terms of Service](https://docs.github.com/en/site-policy/github-terms/github-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 ```move 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(addr)) { move_to(account, MyCoin { value: 0 }); }; let coin = borrow_global_mut(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(from_addr); assert!(from_coin.value >= amount, 1); // E_INSUFFICIENT from_coin.value = from_coin.value - amount; if (!exists(to)) { // The recipient account must register first (Aptos-specific requirement) }; let to_coin = borrow_global_mut(to); to_coin.value = to_coin.value + amount; } } ``` --- ## Sui Move Contract (Object Model) ```move 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, image_url: vector, 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 ```bash npm install @aptos-labs/ts-sdk ``` ```typescript 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 ```bash npm install @mysten/sui ``` ```typescript 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 ```move 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(addr)) { move_to(account, MyCoin { value: 0 }); }; let coin = borrow_global_mut(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(from_addr); assert!(from_coin.value >= amount, 1); // E_INSUFFICIENT from_coin.value = from_coin.value - amount; if (!exists(to)) { // The recipient account must register first (Aptos-specific requirement) }; let to_coin = borrow_global_mut(to); to_coin.value = to_coin.value + amount; } } ``` --- ## Sui Move Contract (Object Model) ```move 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, image_url: vector, 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 ```bash npm install @aptos-labs/ts-sdk ``` ```typescript 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 ```bash npm install @mysten/sui ``` ```typescript 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