连接浏览器插件钱包

Provider API#

什么是 Injected provider API?#

欧易 Injected providers API 是一个 JavaScript API,欧易将其注入用户访问的网站。您的 DApp 可以使用此 API 请求用户帐户,从用户连接的区块链读取数据,帮助用户签署消息和交易。

获取注入的对象#

Dapp 可以通过两种方式访问注入的对象,分别是:

  • window.okxwallet.starknet
  • window.starknet_okxwallet

这两个属性都指向同一个对象,提供两个方式是为了方便 Dapp 使用。

如果 Dapp 希望直接访问欧易 Web3 钱包注入的 Starknet 对象,可以直接使用 window.okxwallet.starknet 或者 window.starknet_okxwallet ,从而避免意外引用到其他钱包注入的 Starknet 对象。

如果 Dapp 使用了 get-starknet 这种第三方工具库,也可以完全支持。

注入对象的属性和方法#

  1. name - string:钱包的名称,值为 'OKX Wallet'
  2. icon - string:钱包的图标
  3. version - string:版本号
  4. isConnected - boolean::当前钱包是否已连接上
  5. selectedAddress - string:用户当前选中的钱包地址
  6. account - Account:访问账户对象,继承自 starknet.js 的 Account ,实例上的具体属性和方法,可参考 starknet.js 的文档
  7. chainId - string:仅支持主网,值为 SN_MAIN
  8. provider - Provider:访问 provider 对象,使用的是 starknet.js 的 RpcProvider ,实例上的具体属性和方法,可参考 starknet.js 的文档
  9. enable - () => [string]:用于连接钱包,成功调用后,会唤起欧易 Web3 钱包连接钱包页面,用户可以决定是否连接当前 DApp,如果用户同意,将会返回选中地址的单项数组
  10. on - (event, callback) => void:添加事件监听
    • accountsChanged 事件:当用户切换账户时会触发该事件,并返回新地址的数组;当断开连接时,会返回空数组。
  11. off - (event, callback) => void:移除事件监听

连接钱包的简单示例#

async function connect() {
    if(window.okxwallet.starknet.isConnected) {
        return
    }

    try {
        const [address] = await window.okxwallet.starknet.enable()

        console.log(address)
        console.log(window.okxwallet.starknet.account)
        console.log(window.okxwallet.starknet.selectedAddress)
        console.log(window.okxwallet.starknet.isConnected)

        window.okxwallet.starknet.on('accountsChanged', ([addr]) => {
            if (addr) {
                console.log('switched address')
            } else {
                console.log('disconnected')
            }
        })
    } catch (e) {
        console.error(e)
    }
}

合约调用#

window.okxwallet.starknet.account.execute(transactions [, abi])

执行一个或多个调用。如果只有一个调用,则 transactions 就是一个对象,其包含的属性会在下面说明。如果有多个调用,则是一个对象的数组。

参数#

transactions 对象的结构如下:

  • contractAddress - string:合约的地址
  • entrypoint - string:合约的入口点
  • calldata - array:调用数据
  • signature - array:签名

abi - 合约的 abi,可选的

返回值#

  • result - object
    • transaction_hash - string:交易的 hash
const transaction = {
    "contractAddress": "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7",
    "calldata": [
        "3055261660830722006547698919883585605584552967779072711973046411977660833095",
        "100000000000000",
        "0"
    ],
    "entrypoint": "transfer"
}

const result = await window.okxwallet.starknet.account.execute(transaction)

签名消息#

window.okxwallet.starknet.account.signMessage(data)

参数#

  • data - object:要签名的对象

返回值#

  • signature - string[]:签名的结果,包含两项
let data = {
   "domain": {
       "name": "OKX",
       "chainId": "SN_MAIN",
       "version": "0.0.1"
   },
   "types": {
       "StarkNetDomain": [
           {
               "name": "name",
               "type": "felt"
           }
       ],
       "Message": [
           {
               "name": "message",
               "type": "felt"
           }
       ]
   },
   "primaryType": "Message",
   "message": {
       "message": "hello"
   }
}

const [r, s] = await window.okxwallet.starknet.account.signMessage(data)

starknet.accountstarknet.provider 上的其他属性和方法,请查看 starknet.js 文档。