Sui
Integrate Sui blockchain using OneKey’s provider. Access via window.$onekey.sui.
OneKey implements the Sui Wallet Standard, ensuring compatibility with all Sui dApps.
Quick Links
Provider Detection
// Detect OneKey Sui provider
const provider = window.$onekey?.sui
if (!provider) {
throw new Error('OneKey Sui provider not detected')
}Quick Start
Check Permissions
// Check if already connected
const hasPermission = await provider.hasPermissions()
if (hasPermission) {
const accounts = await provider.getAccounts()
console.log('Connected accounts:', accounts)
}Request Connection
// Request permissions to connect
const result = await provider.requestPermissions()
if (result) {
const accounts = await provider.getAccounts()
console.log('Connected:', accounts[0].address)
}Disconnect
await provider.disconnect()Account Management
Get Accounts
const accounts = await provider.getAccounts()
accounts.forEach(account => {
console.log({
address: account.address, // Sui address
publicKey: account.publicKey, // Public key bytes
chains: account.chains, // Supported chains
features: account.features, // Supported features
})
})Get Active Chain
const chain = await provider.getActiveChain()
console.log('Active chain:', chain) // e.g., 'sui:mainnet'Transactions
Sign and Execute Transaction Block
import { TransactionBlock } from '@mysten/sui.js/transactions'
// Create transaction block
const txb = new TransactionBlock()
// Add a transfer
txb.transferObjects(
[txb.object('0xobject_id')],
txb.pure('0xrecipient_address')
)
// Or send SUI
const [coin] = txb.splitCoins(txb.gas, [txb.pure(1000000000)]) // 1 SUI
txb.transferObjects([coin], txb.pure('0xrecipient_address'))
// Sign and execute
const result = await provider.signAndExecuteTransactionBlock({
transactionBlock: txb,
options: {
showEffects: true,
showEvents: true,
showObjectChanges: true,
},
})
console.log({
digest: result.digest,
effects: result.effects,
events: result.events,
})Sign Transaction Block (Without Executing)
const txb = new TransactionBlock()
// ... build transaction
const signedTxb = await provider.signTransactionBlock({
transactionBlock: txb,
})
console.log({
transactionBlockBytes: signedTxb.transactionBlockBytes,
signature: signedTxb.signature,
})
// Execute later using Sui SDK
// const result = await suiClient.executeTransactionBlock({
// transactionBlock: signedTxb.transactionBlockBytes,
// signature: signedTxb.signature,
// })Sign and Execute Transaction (New API)
// Using the newer signAndExecuteTransaction API
const result = await provider.signAndExecuteTransaction({
transaction: txb,
options: {
showEffects: true,
},
})Sign Transaction (New API)
const signedTxn = await provider.signTransaction({
transaction: txb,
})Message Signing
Sign Personal Message
Sign arbitrary messages for authentication:
const message = new TextEncoder().encode('Hello, Sui!')
const result = await provider.signPersonalMessage({
message,
})
console.log({
signature: result.signature, // Base64 encoded signature
bytes: result.bytes, // Signed message bytes
})Sign Message (Legacy)
const message = new TextEncoder().encode('Hello, Sui!')
const result = await provider.signMessage({
message,
})
console.log({
signature: result.signature,
messageBytes: result.messageBytes,
})Verify Signature
import { verifyPersonalMessage } from '@mysten/sui.js/verify'
const message = new TextEncoder().encode('Hello, Sui!')
const { signature } = await provider.signPersonalMessage({ message })
const accounts = await provider.getAccounts()
const publicKey = accounts[0].publicKey
const isValid = await verifyPersonalMessage(message, signature)
console.log('Signature valid:', isValid)Smart Contract Interaction
Move Call
const txb = new TransactionBlock()
// Call a Move function
txb.moveCall({
target: '0xpackage::module::function',
arguments: [
txb.pure('arg1'),
txb.object('0xobject_id'),
],
typeArguments: ['0x2::sui::SUI'],
})
const result = await provider.signAndExecuteTransactionBlock({
transactionBlock: txb,
})Publish Package
const txb = new TransactionBlock()
const [upgradeCap] = txb.publish({
modules: compiledModules,
dependencies: [
'0x1', // Move stdlib
'0x2', // Sui framework
],
})
txb.transferObjects([upgradeCap], txb.pure(senderAddress))
const result = await provider.signAndExecuteTransactionBlock({
transactionBlock: txb,
})API Reference
Methods
| Method | Description |
|---|---|
hasPermissions() | Check if connected |
requestPermissions() | Request connection |
disconnect() | Disconnect wallet |
getAccounts() | Get connected accounts |
getActiveChain() | Get current chain |
signAndExecuteTransactionBlock(input) | Sign and execute transaction |
signTransactionBlock(input) | Sign transaction only |
signAndExecuteTransaction(input) | Sign and execute (new API) |
signTransaction(input) | Sign transaction (new API) |
signMessage(input) | Sign message (legacy) |
signPersonalMessage(input) | Sign personal message |
Types
interface WalletAccount {
address: string
publicKey: Uint8Array
chains: string[]
features: string[]
}
interface SignAndExecuteTransactionBlockInput {
transactionBlock: TransactionBlock
options?: {
showEffects?: boolean
showEvents?: boolean
showObjectChanges?: boolean
showBalanceChanges?: boolean
showInput?: boolean
showRawInput?: boolean
}
}
interface SignTransactionBlockOutput {
transactionBlockBytes: string
signature: string
}
interface SignPersonalMessageInput {
message: Uint8Array
}
interface SignPersonalMessageOutput {
signature: string
bytes: string
}Supported Chains
| Chain | Identifier |
|---|---|
| Mainnet | sui:mainnet |
| Testnet | sui:testnet |
| Devnet | sui:devnet |
| Localnet | sui:localnet |
Error Handling
try {
await provider.requestPermissions()
} catch (error) {
if (error.code === 4001) {
console.log('User rejected the connection request')
} else {
console.error('Connection error:', error.message)
}
}Common Error Codes
| Code | Description |
|---|---|
| 4001 | User rejected request |
| 4100 | Unauthorized |
| -32603 | Internal error |
Using with Sui Wallet Kit
For React applications, use the official Sui Wallet Kit:
npm install @mysten/dapp-kit @mysten/sui.js @tanstack/react-queryimport { SuiClientProvider, WalletProvider } from '@mysten/dapp-kit'
import { getFullnodeUrl } from '@mysten/sui.js/client'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
const queryClient = new QueryClient()
const networks = {
mainnet: { url: getFullnodeUrl('mainnet') },
testnet: { url: getFullnodeUrl('testnet') },
}
function App() {
return (
<QueryClientProvider client={queryClient}>
<SuiClientProvider networks={networks} defaultNetwork="mainnet">
<WalletProvider>
<YourApp />
</WalletProvider>
</SuiClientProvider>
</QueryClientProvider>
)
}OneKey is automatically detected through the Sui Wallet Standard.
Using with Sui SDK
import { SuiClient } from '@mysten/sui.js/client'
const client = new SuiClient({ url: 'https://fullnode.mainnet.sui.io' })
// Get balance
const balance = await client.getBalance({
owner: accountAddress,
})
// Get objects
const objects = await client.getOwnedObjects({
owner: accountAddress,
})
// Get transaction
const txn = await client.getTransactionBlock({
digest: txDigest,
options: { showEffects: true },
})Last updated on