このページの内容
Sui
以下の署名例では、はじめにで説明する connectSuiAccount() を使用します。この関数は Wallet Standard アカウントと有効なチェーンを返します。例では @mysten/[email protected] を使用します。従来の *TransactionBlock メソッドも、現在は @mysten/[email protected] で定義された Transaction を入力として宣言しています。
OneKey のプロバイダーで Sui ブロックチェーンを統合します。アクセス先: window.$onekey.sui.
OneKey は Sui Wallet Standard を実装し、互換性のある wallet-standard 統合に対応しています。
クイックリンク
プロバイダーの検出
// Detect OneKey Sui provider
const provider = window.$onekey?.sui
if (!provider) {
throw new Error('OneKey Sui provider not detected')
}クイックスタート
権限を確認
// Check if already connected
const hasPermission = await provider.hasPermissions()
if (hasPermission) {
const accounts = await provider.getAccounts()
console.log('Connected accounts:', accounts)
}接続を要求
// Request permissions to connect
const result = await provider.requestPermissions()
if (result) {
const accounts = await provider.getAccounts()
console.log('Connected:', accounts[0].address)
}切断
await provider.disconnect()アカウント管理
アカウントを取得
const accounts = await provider.getAccounts()
accounts.forEach(account => {
console.log({
address: account.address, // Sui address
publicKey: account.publicKey, // Public key (hex string)
})
})有効なチェーンを取得
const chain = await provider.getActiveChain()
console.log('Active chain:', chain) // e.g., 'sui:testnet'トランザクション
トランザクションブロックに署名して実行
現在の注入型プロバイダーは、signAndExecuteTransactionBlock の options を転送しません。同じチェーンの Sui クライアントで返された digest を照会し、effects、events、object changes を要求します。
import { Transaction } from '@mysten/sui/transactions'
// Create transaction block
const txb = new Transaction()
// Add a transfer
txb.transferObjects(
[txb.object('0xobject_id')],
txb.pure.address('RECIPIENT_SUI_ADDRESS')
)
// Or send SUI
const [coin] = txb.splitCoins(txb.gas, [txb.pure.u64(1000000000)]) // 1 SUI
txb.transferObjects([coin], txb.pure.address('RECIPIENT_SUI_ADDRESS'))
const { account, chain } = await connectSuiAccount()
// Sign and execute
const result = await provider.signAndExecuteTransactionBlock({
account,
chain,
transactionBlock: txb,
})
console.log({
digest: result.digest,
})トランザクションブロックに署名 (実行なし)
const txb = new Transaction()
// ... build transaction
const { account, chain } = await connectSuiAccount()
const signedTxb = await provider.signTransactionBlock({
account,
chain,
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,
// })トランザクションに署名して実行 (新 API)
// Using the newer signAndExecuteTransaction API (Transaction type)
import { Transaction } from '@mysten/sui/transactions'
const tx = new Transaction()
// ... build transaction
const { account, chain } = await connectSuiAccount()
const result = await provider.signAndExecuteTransaction({
account,
chain,
transaction: tx,
})トランザクションに署名 (新 API)
import { Transaction } from '@mysten/sui/transactions'
const tx = new Transaction()
// ... build transaction
const { account, chain } = await connectSuiAccount()
const signedTxn = await provider.signTransaction({
account,
chain,
transaction: tx,
})メッセージ署名
個人メッセージに署名
認証のために任意のメッセージに署名します:
const message = new TextEncoder().encode('Hello, Sui!')
const { account, chain } = await connectSuiAccount()
const result = await provider.signPersonalMessage({
account,
chain,
message,
})
console.log({
signature: result.signature, // Base64 encoded signature
bytes: result.bytes, // Signed message bytes
})メッセージに署名 (従来方式)
const message = new TextEncoder().encode('Hello, Sui!')
const { account, chain } = await connectSuiAccount()
const result = await provider.signMessage({
account,
message,
})
console.log({
signature: result.signature,
messageBytes: result.messageBytes,
})署名を検証
import { verifyPersonalMessageSignature } from '@mysten/sui/verify'
const message = new TextEncoder().encode('Hello, Sui!')
const { account, chain } = await connectSuiAccount()
const { signature } = await provider.signPersonalMessage({ message, account, chain })
const signerKey = await verifyPersonalMessageSignature(message, signature)
const isExpectedSigner = signerKey.toSuiAddress() === account.address
console.log('Expected signer:', isExpectedSigner)スマートコントラクト操作
Move 呼び出し
const txb = new Transaction()
// Call a Move function
txb.moveCall({
target: '0xpackage::module::function',
arguments: [
txb.pure.string('arg1'),
txb.object('0xobject_id'),
],
typeArguments: ['0x2::sui::SUI'],
})
const { account, chain } = await connectSuiAccount()
const result = await provider.signAndExecuteTransactionBlock({
account,
chain,
transactionBlock: txb,
})パッケージを公開
const txb = new Transaction()
const [upgradeCap] = txb.publish({
modules: compiledModules,
dependencies: [
'0x1', // Move stdlib
'0x2', // Sui framework
],
})
const { account, chain } = await connectSuiAccount()
txb.transferObjects([upgradeCap], txb.pure.address(account.address))
const result = await provider.signAndExecuteTransactionBlock({
account,
chain,
transactionBlock: txb,
})API リファレンス
メソッド
| メソッド | 説明 |
|---|---|
hasPermissions() | 接続済みか確認 |
requestPermissions() | 接続を要求 |
disconnect() | ウォレットを切断 |
getAccounts() | 接続済みアカウントを取得 (address, publicKey のみ) |
getActiveChain() | 現在のチェーンを取得 |
signAndExecuteTransactionBlock(input) | 署名して実行。次が必要: account/chain |
signTransactionBlock(input) | 署名のみ。次が必要: account/chain |
signAndExecuteTransaction(input) | 署名して実行 (新 API、 Transaction, 次が必要: account/chain) |
signTransaction(input) | トランザクションに署名 (新 API、 Transaction, 次が必要: account/chain) |
signMessage(input) | メッセージに署名 (従来方式、次が必要: account) |
signPersonalMessage(input) | 個人メッセージに署名 (次が必要: account/chain) |
型
getAccounts() は AccountInfo[] を返します。署名の入力には Wallet Standard の WalletAccount が必要です。その publicKey はバイト配列で、chains と features も含まれます。standard:connect で取得し、AccountInfo を WalletAccount にキャストしないでください。
import type { WalletAccount, IdentifierString } from '@mysten/wallet-standard'
import type { Transaction } from '@mysten/sui/transactions'
// provider.getAccounts()
interface AccountInfo {
address: string
publicKey: string // Hex-encoded public key
}
interface SignAndExecuteTransactionBlockInput {
account: WalletAccount
chain: IdentifierString
transactionBlock: Transaction
options?: {
showEffects?: boolean
showEvents?: boolean
showObjectChanges?: boolean
showBalanceChanges?: boolean
showInput?: boolean
showRawInput?: boolean
}
}
interface SignTransactionBlockOutput {
transactionBlockBytes: string
signature: string
}
interface SignPersonalMessageInput {
account: WalletAccount
chain?: IdentifierString
message: Uint8Array
}
interface SignPersonalMessageOutput {
signature: string
bytes: string
}対応チェーン
| チェーン | 識別子 |
|---|---|
| メインネット | sui:mainnet |
| テストネット | sui:testnet |
| 開発ネット | sui:devnet |
エラー処理
try {
await provider.requestPermissions()
} catch (error) {
if (error.code === 4001) {
console.log('User rejected the connection request')
} else {
console.error('Connection error:', error.message)
}
}主なエラーコード
| コード | 説明 |
|---|---|
| 4001 | ユーザーがリクエストを拒否 |
| 4100 | 未認証 |
| -32603 | 内部エラー |
Sui Wallet Kit との併用
この React の例では、以下に固定した互換性のあるパッケージバージョンを使用します:
npm install @mysten/[email protected] @mysten/[email protected] @tanstack/react-query@^5import { SuiClientProvider, WalletProvider } from '@mysten/dapp-kit'
import { getFullnodeUrl } from '@mysten/sui/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 は Sui Wallet Standard を通じて自動検出されます。
Sui SDK との併用
import { SuiClient } from '@mysten/sui/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 },
})