En esta página
Algorand
Integra la cadena de bloques Algorand mediante el proveedor de OneKey. Accede a través de window.$onekey.algo.
El proveedor de Algorand de OneKey admite tanto interfaces heredadas como interfaces compatibles con ARC-0001.
Enlaces rápidos
Detección del proveedor
// Detect OneKey Algorand provider
const provider = window.$onekey?.algo
if (!provider) {
throw new Error('OneKey Algorand provider not detected')
}
// Check compatibility
console.log('isOneKey:', provider.isOneKey) // trueInicio rápido
Conectar (API heredada)
const { address } = await provider.connect()
console.log('Connected:', address)
// Check connection status
console.log('isConnected:', provider.isConnected)
console.log('Address:', provider.address)Habilitar (ARC-0001)
const result = await provider.enable({
genesisID: 'mainnet-v1.0',
genesisHash: 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=',
})
console.log('Accounts:', result.accounts)
console.log('Genesis Hash:', result.genesisHash)Desconectar
await provider.disconnect()
console.log('Disconnected')Transacciones
Firmar transacciones (ARC-0001)
Firma una o varias transacciones:
import algosdk from 'algosdk'
// Create transaction
const suggestedParams = await algodClient.getTransactionParams().do()
const txn = algosdk.makePaymentTxnWithSuggestedParamsFromObject({
from: senderAddress,
to: recipientAddress,
amount: 1000000, // 1 ALGO (microAlgos)
suggestedParams,
})
// Prepare for signing
const walletTxns = [{
txn: Buffer.from(algosdk.encodeUnsignedTransaction(txn)).toString('base64'),
}]
// Sign
const signedTxns = await provider.signTxns(walletTxns)
console.log('Signed transactions:', signedTxns)Firmar varias transacciones
// Group transactions
const txns = [txn1, txn2, txn3]
algosdk.assignGroupID(txns)
// Prepare for signing
const walletTxns = txns.map(txn => ({
txn: Buffer.from(algosdk.encodeUnsignedTransaction(txn)).toString('base64'),
}))
// Sign all
const signedTxns = await provider.signTxns(walletTxns)Firma parcial (multifirma)
// Only sign specific transactions in a group
const walletTxns = [
{ txn: encodedTxn1 },
{ txn: encodedTxn2, signers: [] }, // Skip this one
{ txn: encodedTxn3 },
]
const signedTxns = await provider.signTxns(walletTxns)
// signedTxns[1] will be nullEnviar transacciones
Difunde las transacciones firmadas:
const completeTxns = signedTxns.filter((txn) => txn !== null)
if (completeTxns.length !== signedTxns.length) {
throw new Error('Complete all required signatures before broadcasting the group')
}
const result = await provider.postTxns(completeTxns)
console.log('Transaction IDs:', result.txnIDs)Firmar y enviar
Firma y difunde en un solo paso:
const result = await provider.signAndPostTxns(walletTxns)
console.log('Transaction IDs:', result.txnIDs)API de transacciones heredada
Firmar una transacción (heredado)
// Create transaction as Uint8Array
const txnBytes = algosdk.encodeUnsignedTransaction(txn)
// Sign
const signedTxnBytes = await provider.signTransaction([txnBytes])
// Send
const { txId } = await algodClient.sendRawTransaction(signedTxnBytes[0]).do()Firmar y enviar (heredado)
const result = await provider.signAndSendTransaction([txnBytes])
console.log('Transaction ID:', result.txId)Firma de mensajes
Firmar un mensaje arbitrario
const message = new TextEncoder().encode('Hello Algorand!')
const { signature, address } = await provider.signMessage(
message,
'utf8' // or 'hex'
)
console.log('Signature:', signature)
console.log('Signer:', address)Verificar la firma
import nacl from 'tweetnacl'
const message = new TextEncoder().encode('Hello Algorand!')
const { signature } = await provider.signMessage(message)
// Get public key from address
const publicKey = algosdk.decodeAddress(provider.address).publicKey
const isValid = nacl.sign.detached.verify(message, signature, publicKey)
console.log('Valid:', isValid)Gestión de eventos
Escuchar cambios de cuenta
provider.on('accountChanged', (address) => {
if (address) {
console.log('Account changed:', address)
} else {
console.log('Disconnected')
}
})Escuchar conexiones
provider.on('connect', ({ address }) => {
console.log('Connected:', address)
})
provider.on('disconnect', () => {
console.log('Disconnected')
})Uso con el cliente Algod
Obtener el cliente del proveedor
// Get pre-configured clients
const algodTransport = await provider.getAlgodv2Client()
const indexerTransport = await provider.getIndexerClient()
// These are BaseHTTPClient transports, not Algodv2 or Indexer SDK instances.
// Use the manual setup below for SDK methods such as status().do().Configuración manual del cliente
import algosdk from 'algosdk'
const algodClient = new algosdk.Algodv2(
'', // Token (not needed for public nodes)
'https://mainnet-api.algonode.cloud',
''
)
const indexerClient = new algosdk.Indexer(
'',
'https://mainnet-idx.algonode.cloud',
''
)Referencia de la API
Métodos
| Método | Descripción |
|---|---|
connect() | Conectar la cartera (heredado) |
disconnect() | Desconectar la cartera |
enable(opts?) | Habilitar la cartera (ARC-0001) |
signTxns(transactions) | Firmar transacciones (ARC-0001) |
postTxns(signedTxns) | Difundir transacciones |
signAndPostTxns(transactions) | Firmar y difundir |
signTransaction(txns) | Firmar transacciones (heredado) |
signAndSendTransaction(txns) | Firmar y enviar (heredado) |
signMessage(message, encoding?) | Firmar un mensaje arbitrario |
getAlgodv2Client() | Obtener el cliente Algod |
getIndexerClient() | Obtener el cliente Indexer |
Tipos
interface EnableOpts {
genesisID?: string
genesisHash?: string
}
interface EnableResult {
genesisID: string
genesisHash: string
accounts: string[]
}
interface WalletTransaction {
txn: string // Base64 encoded unsigned transaction
signers?: string[] // Addresses that should sign (empty = skip)
stxn?: string // Pre-signed transaction
message?: string // Message to display
msig?: MultisigMetadata
authAddr?: string // Rekeyed auth address
}
type SignTxnsResult = (string | null)[]; // Base64 signed transactions; null means skipped.
interface PostTxnsResult {
txnIDs: string[]
}
interface TransactionResult {
txId: string
}Propiedades
| Propiedad | Tipo | Descripción |
|---|---|---|
isConnected | boolean | Estado de conexión |
address | string | null | Dirección conectada |
isOneKey | boolean | Identificador de OneKey |
Eventos
| Evento | Parámetros | Descripción |
|---|---|---|
connect | { address } | Cartera conectada |
disconnect | - | Cartera desconectada |
accountChanged | address | Cuenta cambiada |
Gestión de errores
try {
const signedTxns = await provider.signTxns(walletTxns)
} catch (error) {
if (error.code === 4001) {
console.log('User rejected the request')
} else if (error.code === 4100) {
console.log('The account or method is not authorized')
} else {
console.error('Error:', error.message)
}
}Códigos de error habituales
| Código | Descripción |
|---|---|
| 4001 | El usuario rechazó la solicitud |
| 4100 | Sin autorización |
| 4200 | Método no compatible |
| -32602 | Parámetros no válidos |
Ejemplo completo
import algosdk from 'algosdk'
async function sendAlgo() {
// Connect
const provider = window.$onekey?.algo
if (!provider) throw new Error("OneKey Algorand provider is unavailable")
const { address } = await provider.connect()
// Setup client
const algodClient = new algosdk.Algodv2(
'',
'https://mainnet-api.algonode.cloud',
''
)
// Get params
const suggestedParams = await algodClient.getTransactionParams().do()
// Create transaction
const txn = algosdk.makePaymentTxnWithSuggestedParamsFromObject({
from: address,
to: 'RECIPIENT_ADDRESS',
amount: 1000000, // 1 ALGO
suggestedParams,
})
// Sign
const walletTxns = [{
txn: Buffer.from(algosdk.encodeUnsignedTransaction(txn)).toString('base64'),
}]
const signedTxns = await provider.signTxns(walletTxns)
if (!signedTxns[0]) throw new Error("The transaction was not signed")
// Send
const { txId } = await algodClient.sendRawTransaction(
Buffer.from(signedTxns[0], 'base64')
).do()
console.log('Transaction ID:', txId)
// Wait for confirmation
await algosdk.waitForConfirmation(algodClient, txId, 4)
console.log('Confirmed!')
}Última actualización el