快速上手
这里演示如何检测 UKey Wallet Cosmos Provider、启用目标链、读取账户信息,并与 CosmJS 配合完成交易。
找 Provider
// 检查 UKey Wallet Cosmos provider
const provider = window.$ukey?.cosmos;
if (!provider) {
throw new Error("未检测到 UKey Wallet Cosmos provider");
}
// 确认是否为 UKey Wallet
console.log("识别到的 Provider:", provider.isUKey ? "UKey Wallet" : "未知");
启用目标链
const chainId = "cosmoshub-4";
// 启用链并返回密钥信息
const key = await provider.enable(chainId);
// 也可以一口气启用多条链
await provider.enable(["cosmoshub-4", "osmosis-1", "juno-1"]);
读取账户信息
const chainId = "cosmoshub-4";
const key = await provider.getKey(chainId);
console.log({
name: key.name, // 账户显示名
algo: key.algo, // 签名方案(secp256k1)
pubKey: key.pubKey, // Uint8Array 公钥
address: key.address, // 地址值 (Uint8Array)
bech32Address: key.bech32Address, // Bech32 地址
isNanoLedger: key.isNanoLedger, // 是否来自硬件钱包
});
添加自定义链
如果目标链尚未内置支持,可以通过 experimentalSuggestChain 提供链配置并请求用户添加:
await provider.experimentalSuggestChain({
chainId: "my-chain-1",
chainName: "My Custom Chain",
rpc: "https://rpc.mychain.io",
rest: "https://lcd.mychain.io",
bip44: { coinType: 118 },
bech32Config: {
bech32PrefixAccAddr: "mychain",
bech32PrefixAccPub: "mychainpub",
bech32PrefixValAddr: "mychainvaloper",
bech32PrefixValPub: "mychainvaloperpub",
bech32PrefixConsAddr: "mychainvalcons",
bech32PrefixConsPub: "mychainvalconspub",
},
currencies: [
{
coinDenom: "TOKEN",
coinMinimalDenom: "utoken",
coinDecimals: 6,
},
],
feeCurrencies: [
{
coinDenom: "TOKEN",
coinMinimalDenom: "utoken",
coinDecimals: 6,
gasPriceStep: { low: 0.01, average: 0.025, high: 0.04 },
},
],
stakeCurrency: {
coinDenom: "TOKEN",
coinMinimalDenom: "utoken",
coinDecimals: 6,
},
});
断连
await provider.disconnect();
与 CosmJS 配合使用
可以从 Provider 获取离线签名器,再交给 CosmJS 构造和发送交易:
import { SigningStargateClient } from "@cosmjs/stargate";
const chainId = "cosmoshub-4";
// 自动判断最合适的签名器类型
const offlineSigner = await provider.getOfflineSignerAuto(chainId);
// 也可以切换成指定的签名器类型
const aminoSigner = provider.getOfflineSignerOnlyAmino(chainId);
const directSigner = provider.getOfflineSigner(chainId);
// 结合 CosmJS 使用
const client = await SigningStargateClient.connectWithSigner(
"https://rpc.cosmos.network",
offlineSigner,
);
// 发起代币转账
const callResult = await client.sendTokens(
senderAddress,
recipientAddress,
[{ denom: "uatom", amount: "1000000" }],
{ amount: [{ denom: "uatom", amount: "5000" }], gas: "200000" },
);
从 Keplr 接入迁移
UKey Wallet Cosmos Provider 与 Keplr 接口兼容。迁移时优先读取 UKey Wallet,未安装时再回退到 Keplr:
// 旧写法(仅 Keplr)
const keplrProvider = window.keplr;
// 调整后(UKey Wallet 优先,Keplr 作为备选)
const cosmosProvider = window.$ukey?.cosmos || keplrProvider;