连接App或Mini钱包

SDK#

Solana 是一种高性能的区块链平台,致力于为去中心化应用和加密货币提供快速、安全和可扩展的解决方案。该平台采用了创新的共识算法——Proof of History (PoH),可以处理高达数万笔交易每秒 (TPS),同时保持了去中心化和安全性。总的来说,Solana 的目标是通过其独特的技术优势,实现区块链的大规模采用,服务于各种复杂的去中心化应用和全球金融系统。

Sonic是为在Solana上实现主权游戏经济而构建的首个原子SVM链。

安装及初始化#

请确保更新OKX App到 6.90.1版本或以后版本,即可开始接入:

将 OKX Connect 集成到您的 DApp 中,可以使用 npm:

npm install @okxconnect/solana-provider

连接钱包之前,需要先创建一个对象,用于后续连接钱包、发送交易等操作。

OKXUniversalProvider.init({dappMetaData: {name, icon}})

请求参数

  • dappMetaData - object
    • name - string: 应用名称,不会作为唯一表示
    • icon - string: 应用图标的 URL。必须是 PNG、ICO 等格式,不支持 SVG 图标。最好传递指向 180x180px PNG 图标的 url。

返回值

  • OKXUniversalProvider

示例

import { OKXUniversalProvider } from "@okxconnect/universal-provider";

const okxUniversalProvider = await OKXUniversalProvider.init({
    dappMetaData: {
        name: "application name",
        icon: "application icon url"
    },
})

连接钱包#

连接钱包去获取钱包地址,作为标识符和用于签名交易的必要参数。

okxUniversalProvider.connect(connectParams: ConnectParams);

请求参数

  • connectParams - ConnectParams
    • namespaces - [namespace: string]: ConnectNamespace ; 请求连接的必要信息,Solana系的key为"solana" ,如果请求的链中,有任何一个链钱包不支持的话,钱包会拒绝连接
      • chains: string[]; 链id信息
      • optionalNamespaces - [namespace: string]: ConnectNamespace; 请求连接的可选信息,Solana系的key为"solana" ,如果对应的链信息钱包不支持,依然可以连接
      • chains: string[]; 链id信息
      • defaultChain?: string; 默认链
    • sessionConfig: object
      • redirect: string 连接成功后的跳转参数,如果是Telegram中的Mini App,这里可以设置为Telegram的deeplink: "tg://resolve"

返回值

  • Promise<SessionTypes.Struct | undefined>
    • topic: string; 会话标识
    • namespaces: Record<string, Namespace>; 成功连接的namespace 信息
      • chains: string[]; 连接的链信息
      • accounts: string[]; 连接的账户信息
      • methods: string[]; 当前namespace下,钱包支持的方法
      • defaultChain?: string; 当前会话的默认链
    • sessionConfig?: SessionConfig
      • dappInfo: object DApp 信息
        • name:string
        • icon:string
      • redirect?:string, 连接成功后的跳转参数

示例

var session = await okxUniversalProvider.connect({
    namespaces: {
        solana: {
            chains: ["solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", // solana mainnet
            //  "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",// solana testnet
            //  "sonic:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",// sonic testnet
            ],
        }
    },
    sessionConfig: {
        redirect: "tg://resolve"
    }
})

判断钱包是否已连接#

获取当前是否有连接钱包

返回值

  • boolean

示例

okxUniversalProvider.connected()

准备交易#

向钱包发送消息的方法,支持签名,交易

首先创建一个OKXSolanaProvider对象,构造函数传入OKXUniversalProvider

import { OKXSolanaProvider } from "@okxconnect/solana-provider/OKXSolanaProvider";
let okxSolanaProvider = new OKXSolanaProvider(okxUniversalProvider)

签名#

okxSolanaProvider.signMessage(message, chain)

请求参数

  • message - string 需要签名的消息
  • chain: string, 请求签名执行的链,建议传递此参数;连接多条链时为必传参数;连接一条链如果未传,则按照solana:mainnet或sonic:testnet处理

返回值

  • Promise - object
    • publicKey:string 钱包地址
    • signature:Uint8Array 签名结果

签单笔交易#

okxSolanaProvider.signTransaction(transaction, chain)

请求参数

  • transaction - Transaction | VersionedTransaction 交易数据对象
  • chain: string, 请求签名执行的链,建议传递此参数;连接多条链时为必传参数;连接一条链如果未传,则按照solana:mainnet或sonic:testnet处理

返回值

  • Promise - Transaction | VersionedTransaction 签名后的交易对象

签多笔交易#

okxSolanaProvider.signAllTransactions(transactions, chain)

请求参数

  • transactions - [Transaction | VersionedTransaction] 交易数据对象数组
  • chain: string, 请求签名执行的链,建议传递此参数;连接多条链时为必传参数;连接一条链如果未传,则按照solana:mainnet或sonic:testnet处理

返回值

  • Promise - [Transaction | VersionedTransaction] 签名后的交易对象数组

签一笔交易并广播上链#

okxSolanaProvider.signAndSendTransaction(transaction, chain)

请求参数

  • transactions - Transaction | VersionedTransaction 交易数据对象
  • chain: string, 请求签名执行的链,建议传递此参数;连接多条链时为必传参数;连接一条链如果未传,则按照solana:mainnet或sonic:testnet处理

返回值

  • Promise - string 交易hash

获取钱包地址及PublicKey#

okxSolanaProvider.getAccount(chain)

请求参数

  • chain: string, 获取钱包地址的链Id,不传则默认取第一个连接的svm地址

返回值

  • Object
    • address: string 钱包地址
    • publicKey: PublicKey

示例

//在solana mainnet上签名一笔转账交易
let provider = new OKXSolanaProvider(okxUniversalProvider)
const transaction = new Transaction({
    feePayer: new PublicKey(provider.getAccount().address),
    recentBlockhash: "xNWbUfdEPktMsZQHY6Zk5RJqamWFcTKasekjr7c3wFX",
}).add(SystemProgram.transfer(
    {
        fromPubkey: new PublicKey(provider.getAccount().address),
        toPubkey: new PublicKey(provider.getAccount().address),
        lamports: 1000,
    }
))

let result = await provider.signTransaction(transaction, "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp")

断开钱包连接#

断开已连接钱包,并删除当前会话,如果要切换连接钱包,请先断开当前钱包

okxUniversalProvider.disconnect()

Event事件#

// 生成 universalLink
okxUniversalProvider.on("display_uri", (uri) => {
    console.log(uri);
});
// session 信息变更会触发该事件;
okxUniversalProvider.on("session_update", (session) => {
    console.log(JSON.stringify(session));
});
// 断开连接会触发该事件;
okxUniversalProvider.on("session_delete", ({topic}) => {
    console.log(topic);
});

错误码#

在连接,交易,断开连接的过程中可能抛出的异常

异常

错误码描述
OKX_CONNECT_ERROR_CODES.UNKNOWN_ERROR未知异常
OKX_CONNECT_ERROR_CODES.ALREADY_CONNECTED_ERROR钱包已连接
OKX_CONNECT_ERROR_CODES.NOT_CONNECTED_ERROR钱包未连接
OKX_CONNECT_ERROR_CODES.USER_REJECTS_ERROR用户拒绝
OKX_CONNECT_ERROR_CODES.METHOD_NOT_SUPPORTED方法不支持
OKX_CONNECT_ERROR_CODES.CHAIN_NOT_SUPPORTED链不支持
OKX_CONNECT_ERROR_CODES.WALLET_NOT_SUPPORTED钱包不支持
OKX_CONNECT_ERROR_CODES.CONNECTION_ERROR连接异常
export enum OKX_CONNECT_ERROR_CODES {
    UNKNOWN_ERROR = 0,
    ALREADY_CONNECTED_ERROR = 11,
    NOT_CONNECTED_ERROR = 12,
    USER_REJECTS_ERROR = 300,
    METHOD_NOT_SUPPORTED = 400,
    CHAIN_NOT_SUPPORTED = 500,
    WALLET_NOT_SUPPORTED = 600,
    CONNECTION_ERROR = 700
}