En esta página
Cardano
Integra la cadena de bloques Cardano mediante el proveedor de OneKey compatible con CIP-30. Accede a través de window.cardano.onekey o window.cardano.nami.
OneKey implementa CIP-30 (Cardano dApp Connector) para las operaciones documentadas aquí. También ofrece compatibilidad con la cartera Nami.
Enlaces rápidos
Detección del proveedor
// OneKey provides both onekey and nami interfaces
const onekey = window.cardano?.onekey
const nami = window.cardano?.nami
// Check availability
if (!onekey) {
throw new Error('OneKey Cardano provider not detected')
}
// Get wallet info
console.log('Name:', onekey.name) // 'OneKey'
console.log('API Version:', onekey.apiVersion) // '0.1.0'
console.log('Icon:', onekey.icon)Inicio rápido
Habilitar la cartera
// Request wallet access
const api = await window.cardano.onekey.enable()
// Now you can use the full API
const networkId = await api.getNetworkId()
console.log('Network:', networkId === 1 ? 'Mainnet' : 'Testnet')Comprobar si está habilitada
const isEnabled = await window.cardano.onekey.isEnabled()
if (isEnabled) {
const api = await window.cardano.onekey.enable()
// Use API...
}Información de la cuenta
Obtener el ID de red
const api = await window.cardano.onekey.enable()
const networkId = await api.getNetworkId()
// 0 = Testnet, 1 = Mainnet
console.log('Network:', networkId)Obtener el saldo
const balance = await api.getBalance()
// Returns CBOR-encoded value (hex string)
console.log('Balance (CBOR):', balance)
// Decode using cardano-serialization-lib
import { Value, BigNum } from '@emurgo/cardano-serialization-lib-browser'
const value = Value.from_bytes(Buffer.from(balance, 'hex'))
const lovelace = value.coin().to_str()
console.log('Balance in lovelace:', lovelace) // Keep the exact integer string.Obtener direcciones
// Get used addresses (addresses with transaction history)
const usedAddresses = await api.getUsedAddresses()
console.log('Used addresses:', usedAddresses)
// Get unused addresses (fresh addresses)
const unusedAddresses = await api.getUnusedAddresses()
console.log('Unused addresses:', unusedAddresses)
// Get change address
const changeAddress = await api.getChangeAddress()
console.log('Change address:', changeAddress)
// Get reward/staking addresses
const rewardAddresses = await api.getRewardAddresses()
console.log('Reward addresses:', rewardAddresses)Obtener UTxO
// Get all UTxOs
const utxos = await api.getUtxos()
console.log('UTxOs:', utxos)
// Get UTxOs with minimum amount
const utxosWithAmount = await api.getUtxos(
Buffer.from(Value.new(BigNum.from_str('1000000')).to_bytes()).toString('hex')
// CBOR-encoded Value for 1 ADA; import Value and BigNum from the serialization SDK.
)
// With pagination
const paginatedUtxos = await api.getUtxos(undefined, {
page: 0,
limit: 10,
})Transacciones
Firmar una transacción
// transaction should be CBOR-encoded hex string
const witnessSetCbor = await api.signTx(transactionCbor, partialSign)
// partialSign: boolean
// - false: reject if the wallet cannot provide every required signature
// - true: return the signatures the wallet can provide
console.log('Witness set:', witnessSetCbor)Enviar una transacción
// Submit signed transaction
const txHash = await api.submitTx(signedTransactionCbor)
console.log('Transaction hash:', txHash)Construir, firmar y enviar
signTx devuelve un conjunto de testigos, no una transacción firmada completa. Construye la transacción sin firmar con una biblioteca de transacciones de Cardano, combina los testigos devueltos con el conjunto de testigos existente y envía la transacción completa resultante.
// `unsignedTransactionCbor` is a complete transaction built with current
// protocol parameters, selected inputs, outputs, fees, and change.
const witnessSetCbor = await api.signTx(unsignedTransactionCbor, false)
// Merge witnessSetCbor into the original transaction using your Cardano SDK.
// Preserve existing witnesses, scripts, datums, redeemers, and auxiliary data.
// Submit the serialized complete transaction, never witnessSetCbor alone.
const txHash = await api.submitTx(completeSignedTransactionCbor)Usa el flujo de Lucid o Mesh que aparece a continuación si tu aplicación aún no implementa la construcción de transacciones y la combinación de testigos. Estos ejemplos de SDK son específicos de una versión; sigue la documentación de la versión que instales.
Firma de datos
Firmar datos (CIP-8)
Firma datos arbitrarios para autenticación:
const api = await window.cardano.onekey.enable()
const addresses = await api.getUsedAddresses()
const address = addresses[0]
// Message to sign
const payload = Buffer.from('Hello Cardano!').toString('hex')
const signature = await api.signData(address, payload)
console.log({
signature: signature.signature, // COSE_Sign1 signature
key: signature.key, // COSE_Key public key
})Verificar la firma
import { COSESign1, COSEKey } from '@emurgo/cardano-message-signing-browser'
const coseSign1 = COSESign1.from_bytes(
Buffer.from(signature.signature, 'hex')
)
const coseKey = COSEKey.from_bytes(
Buffer.from(signature.key, 'hex')
)
// Get the signed payload
const signedPayload = coseSign1.payload()
// Verify signature
// Parsing COSE is not verification. Use a CIP-8 verifier to check the
// protected headers, signing structure, payload, signature, and address binding.Gestión de eventos
Escuchar cambios de cuenta
const api = await window.cardano.onekey.enable()
// Nami-compatible event API
api.experimental.on('accountChange', (addresses) => {
console.log('Account changed:', addresses)
})Referencia de la API
Interfaz de cartera (CIP-30)
| Propiedad/método | Descripción |
|---|---|
name | Nombre de la cartera (‘OneKey’) |
icon | URL del icono de la cartera |
apiVersion | Versión de la API |
isEnabled() | Comprobar si está habilitada |
enable() | Solicitar acceso a la cartera |
API para dApps (tras habilitar)
| Método | Descripción |
|---|---|
getNetworkId() | Obtener la red (0=red de pruebas, 1=red principal) |
getBalance() | Obtener el saldo total (CBOR) |
getUtxos(amount?, paginate?) | Obtener UTxO |
getUsedAddresses() | Obtener las direcciones usadas |
getUnusedAddresses() | Obtener las direcciones sin usar |
getChangeAddress() | Obtener la dirección de cambio |
getRewardAddresses() | Obtener las direcciones de staking |
signTx(tx, partialSign?) | Devolver las partes firmadas de un conjunto de testigos |
signData(addr, payload) | Firmar datos (CIP-8) |
submitTx(tx) | Enviar una transacción |
API experimental
| Método | Descripción |
|---|---|
experimental.getCollateral() | Obtener UTxO de garantía |
experimental.on(event, cb) | Suscribirse a eventos |
experimental.off() | Cancelar la suscripción |
Tipos
type Cbor = string // Hex-encoded CBOR
interface Paginate {
page: number
limit: number
}
interface Cip30DataSignature {
signature: string // COSE_Sign1 hex
key: string // COSE_Key hex
}
type NetworkId = 0 | 1 // 0=testnet, 1=mainnetEventos
| Evento | Descripción |
|---|---|
accountChange | Cuenta cambiada |
Gestión de errores
try {
const api = await window.cardano.onekey.enable()
} catch (error) {
if (error.code === -3) {
console.log('The wallet refused the request')
} else if (error.code === -4) {
console.log('The account changed; reconnect and retry')
} else {
console.error('Error:', error.message)
}
}Errores habituales
| Código | Descripción |
|---|---|
| -1 | Solicitud no válida |
| -2 | Error interno |
| -3 | Solicitud rechazada |
| -4 | Cuenta cambiada |
Uso con Lucid
Lucid ofrece una API más sencilla:
npm install lucid-cardanoimport { Lucid, Blockfrost } from 'lucid-cardano'
// Initialize Lucid with OneKey
const lucid = await Lucid.new(
new Blockfrost('https://cardano-mainnet.blockfrost.io/api', 'your-api-key'),
'Mainnet'
)
// Connect OneKey
const api = await window.cardano.onekey.enable()
lucid.selectWallet(api)
// Send ADA
const tx = await lucid
.newTx()
.payToAddress('addr1...', { lovelace: 5000000n })
.complete()
const signedTx = await tx.sign().complete()
const txHash = await signedTx.submit()
console.log('TX Hash:', txHash)Uso con Mesh
Mesh es otro SDK popular de Cardano:
npm install @meshsdk/coreimport { BrowserWallet, Transaction } from '@meshsdk/core'
// Connect to OneKey
const wallet = await BrowserWallet.enable('onekey')
// Get wallet info
const balance = await wallet.getBalance()
const addresses = await wallet.getUsedAddresses()
// Build and send transaction
const tx = new Transaction({ initiator: wallet })
.sendLovelace('addr1...', '5000000')
const unsignedTx = await tx.build()
const signedTx = await wallet.signTx(unsignedTx)
const txHash = await wallet.submitTx(signedTx)Compatibilidad con Nami
El alias de compatibilidad puede pertenecer a otra extensión. Usa window.cardano.onekey para seleccionar OneKey explícitamente.
// Access via Nami interface
const nami = window.cardano.nami
const api = await nami.enable()
// Same API as OneKey
const balance = await api.getBalance()