A comprehensive SUI blockchain library for Internet Computer (ICP) built in Motoko. This library enables ICP canisters to interact with the SUI blockchain using ICP's threshold ECDSA for secure key management.
- Address Generation: Generate SUI addresses using ICP threshold ECDSA (Secp256k1)
- SUI Transfers: Send SUI tokens with proper BCS serialization
- Balance Queries: Check balances and list coin objects
- Transaction Status: Query transaction confirmation and details
- Testnet Faucet: Request testnet SUI tokens programmatically
- Type Definitions: Complete type system for SUI blockchain objects
git clone <repository-url>
cd sui
mops install
dfx start --background
dfx deploydfx canister call sui_example_basic generateAddress '(null)'Returns:
(variant { ok = record { address = "0x9c219cda57d9f8cac8bbcd5356f7d416d5286a91605ea6c1465c645e7b054c02"; ... }})
dfx canister call sui_example_basic getFormattedBalance '("0x9c219cda...")'Returns:
(variant { ok = "0.8190 SUI" })
dfx canister call sui_example_basic transferSuiSafe '(
"0x<sender_address>",
"0x<recipient_address>",
1000000 : nat64,
10000000 : nat64
)'Returns:
(variant { ok = "8vvjczwT2PicnDSuj5sjfJxCehZAR5U9ugZ8rqGfHgEG" })
dfx canister call sui_example_basic getTransactionStatus '("8vvjczwT2PicnDSuj5sjfJxCehZAR5U9ugZ8rqGfHgEG")'Returns:
(variant { ok = record { status = "success"; gasUsed = 1_997_880 : nat64; ... }})
| Function | Description |
|---|---|
generateAddress(?path) |
Generate SUI address using ICP threshold ECDSA |
validateAddress(address) |
Validate SUI address format |
checkBalance(address) |
Get balance in MIST with coin count |
getFormattedBalance(address) |
Get human-readable balance ("X.XXXX SUI") |
getSuiCoins(address) |
List all coin objects for an address |
transferSuiSafe(sender, recipient, amount, gasBudget) |
Transfer SUI using BCS serialization (recommended) |
transferSuiSimple(sender, recipient, amount, gasBudget) |
Transfer SUI using RPC method |
splitCoins(owner, amounts, gasBudget) |
Split one coin into multiple coins |
mergeCoins(owner, gasBudget) |
Merge multiple coins into one |
getTransactionStatus(digest) |
Get transaction status, gas used, timestamp |
requestFaucet(address) |
Request testnet SUI tokens |
Core transfer functionality with BCS serialization:
transferSuiSimple()- Transfer usingunsafe_transferSuiRPCtransferSuiSafe()- Transfer with proper BCS transaction buildingsplitCoins()- Split one coin into multiple coinsmergeCoins()- Merge multiple coins into onegetTransactionStatus()- Query transaction statusgetObjectInfo()- Fetch object data from RPCformatBalance()- Format MIST to SUI stringrequestTestnetFaucet()- Request testnet tokens
Wallet management using ICP threshold ECDSA:
createTestnetWallet()/createMainnetWallet()/createDevnetWallet()generateAddress()- Generate new SUI addressgetBalance()- Query balance from RPCsignTransaction()- Sign with threshold ECDSA
Address utilities:
isValidAddress()- Validate SUI address formatnormalizeAddress()- Normalize to full 64-char formatpublicKeyToAddress()- Derive address from public key
Transaction building:
createTransferTransaction()- Build transfer transactioncreateMoveCallTransaction()- Build Move call transactionserializeTransaction()- BCS serialization
Type definitions:
SuiAddress,ObjectRef,TransactionDataCommand,Argument,CallArgGasData,SignatureScheme
Validation utilities:
- Address validation
- Object ID validation
- Hex conversion
See USAGE_EXAMPLES.md for detailed examples including:
- Address generation and validation
- SUI transfers on testnet
- Transaction building
- Balance queries
- Error handling patterns
See API_REFERENCE.md for complete API documentation.
# Start local replica
dfx start --background
# Deploy canisters
dfx deploy
# Test a function
dfx canister call sui_example_basic generateAddress '(null)'src/
├── lib.mo # Main library entry point
├── types.mo # Type definitions
├── address.mo # Address utilities
├── transaction.mo # Transaction builder
├── wallet.mo # Wallet management (ICP ECDSA)
├── sui_transfer.mo # SUI transfer functions
├── validation.mo # Validation utilities
├── utils.mo # Helper functions
└── sui_backend/
└── main.mo # Backend canister
examples/
└── sui_example_basic.mo # Example canister with all functions
test/
└── *.test.mo # Test files
mops testThe example canister uses SUI testnet by default:
- RPC URL:
https://fullnode.testnet.sui.io:443 - Faucet:
https://faucet.testnet.sui.io/v2/gas
- 1 SUI = 1,000,000,000 MIST
- All amounts in the API are in MIST
- Use
getFormattedBalance()for human-readable format
- Recommended: 10,000,000 MIST (0.01 SUI) for simple transfers
- The actual gas used is typically ~2,000,000 MIST
This library uses ICP's threshold ECDSA (Secp256k1) for:
- Secure key generation without exposing private keys
- Transaction signing within the canister
- Key derivation paths for multiple addresses
This project is licensed under the MIT License - see the LICENSE file for details.