欧易 Injected providers API 是一个 JavaScript API,欧易将其注入用户访问的网站。您的 DApp 可以使用此 API 请求用户帐户,从用户连接的区块链读取数据,帮助用户签署消息和交易。
Sui 钱包使用的是 wallet standard,相比其他异构链有些不同,可以通过事件通知的方式获取 wallet 对象:
const GlobalWallet = {
register: (wallet) => {
GlobalWallet[wallet.chainName] = wallet
}
}
const event = new CustomEvent('wallet-standard:app-ready', { detail: GlobalWallet });
window.dispatchEvent(event);
const suiWallet = GlobalWallet.suiMainnet
通过以上获取到的 suiWallet 对象,可以获取到账户:
const suiAccounts = suiWallet.connectedAccounts
// suiAccounts 结构:
[
{
"address": "0x7995ca23961fe06d8cea7da58ca751567ce820d7cba77b4a373249034eecca4a",
"publicKey": "tUvCYrG22rHKR0c306MxgnhXOSf16Ot6H3GMO7btwDI=",
"chains": [
"sui:mainnet"
],
"features": [
"sui:signAndExecuteTransactionBlock",
"sui:signTransactionBlock",
"sui:signMessage"
]
}
]
suiWallet.features['sui:signAndExecuteTransactionBlock'].signAndExecuteTransactionBlock
签名并发送交易
Sui 钱包使用的是 wallet standard,相比其他异构链有些不同,所有方法都挂在 features[] 里
创建交易后,Web 应用程序可能会要求用户的欧易 Web3 钱包签署并发送交易。如果接受,欧易 Web3 钱包将使用用户的私钥签署交易并通过 SUI JSON RPC
连接提交。在 suiWallet
上调用 signAndExecuteTransactionBlock
方法会为已签名的交易返回 promise
。
const handleTransaction = async () => {
const tx = new TransactionBlock()
tx.moveCall({
target: `${packageId}::${moduleName}::${functionName}`,
arguments: [
tx.pure(params1),
tx.pure(params2),
],
typeArguments: [],
})
const result = await suiWallet.features['sui:signAndExecuteTransactionBlock'].signAndExecuteTransactionBlock({
transactionBlock: tx,
options: { showEffects: true },
})
console.log('result', result)
// 通过result?.effects?.status?.status获取交易状态,成功为 'success',失败为'failure'
}
拆币
在发交易时,付 gas 费的 objectId,如果这个 object 本身就要被发送,还要用来付 gas 费,这时候就需要用到拆币(split coin)
const handleTransaction = async () => {
const tx = new TransactionBlock()
const value = '300000000' // 这里是想要拆出的目标值
const [coins] = tx.splitCoins(tx.gas, [
tx.pure(BigInt(value)),
])
tx.moveCall({
target: `${packageId}::${moduleName}::${functionName}`,
arguments: [
tx.pure(参数1),
tx.pure(参数2),
tx.makeMoveVec({ objects: [coins] }),
],
typeArguments: [],
})
const result = await suiWallet.features['sui:signAndExecuteTransactionBlock'].signAndExecuteTransactionBlock({
transactionBlock: tx,
options: { showEffects: true },
})
console.log('result', result)
// 通过result?.effects?.status?.status获取交易状态,成功为 'success',失败为'failure'
}
对交易块进行签名
通过 provider
上的 signTransactionBlock
方法可以签署一个交易块(多个交易的集合)。
const tx = new TransactionBlock();
tx.moveCall({
target: 'xxx',
arguments: [
tx.pure('okx'),
tx.pure('wallet'),
],
});
const input = {
transactionBlockSerialized: tx.serialize(),
options: {
showEffects: true,
}
}l
const transaction = await suiWallet.features['sui:signTransactionBlock'].signTransactionBlock({ transactionBlock: tx })
对单个交易签名(不发送)
创建交易后,Web 应用程序可能会要求用户的欧易 Web3 钱包签署交易,而无需将其提交到网络。调用 signMessage
方法会为已签名的交易返回 Promise
。
import { ethers } from 'ethers';
// 这里借用 ethers 库来帮我们处理 message,将其转为 Uint8Array 类型
const message = ethers.utils.toUtf8Bytes('okx')
const { signature, messageBytes } = await suiWallet.features['sui:signMessage'].signMessage({ message })
错误码 | 标题 | 描述 |
---|---|---|
4900 | 断开连接 | OKX Wallet could not connect to the network. |
4100 | 未授权 | The requested method and/or account has not been authorized by the user. |
4001 | 用户拒绝请求 | The user rejected the request through OKX wallet. |
-32000 | 无效输入 | Missing or invalid parameters. |
-32002 | 请求资源不可用 | This error occurs when a dapp attempts to submit a new transaction while OKX wallet's approval dialog is already open for a previous transaction. Only one approve window can be open at a time. Users should approve or reject their transaction before initiating a new transaction. |
-32003 | 拒绝交易 | OKX Wallet does not recognize a valid transaction. |
-32601 | 未找到方法 | OKX Wallet does not recognize the method. |
-32603 | 内部错误 | Something went wrong within OKX wallet. |
suiWallet.features['standard:connect'].connect()
描述
连接到欧易 Web3 钱包可以通过调用 suiWallet.features['standard:connect'].connect()
。
connect
调用将返回一个 Promise
对象,该 Promise
对象在用户接受连接请求时 resolve
,并在用户拒绝请求或关闭弹出窗口时 reject
。有关欧易 Web3 钱包可能发生错误的详细信息,请参考 错误码。
当用户接受连接请求时,suiWallet.features['standard:events']
也会触发连接事件。
suiWallet.features['standard:events'].on("connect", () => console.log("connected!"));
一旦 Web 应用程序连接到欧易 Web3 钱包,它将能够读取连接账户的公钥并提示用户进行其他交易。
例子
在 codeopen中打开。
成功连接
连接到欧易 Web3 钱包可以通过调用 suiWallet.features['standard:events'].on
。 当用户接受连接请求时,会触发连接事件。
用法
suiWallet.features['standard:events'].on("connect", () => console.log("connected!"));
断开连接
断开连接与连接过程相同。但是,钱包也有可能发起断开连接,而不是应用程序本身。
用法
suiWallet.features['standard:events'].on("disconnect", () => {
console.log("disconnected!")
});
账户变更
欧易 Web3 钱包允许用户从单个扩展程序或移动应用程序中无缝管理多个账户。每当用户切换账户时,欧易 Web3 钱包都会发出一个 accountChanged
事件。
如果用户在已连接到应用程序时更改账户,并且新账户已经将该应用程序列入白名单,那么用户将保持连接状态并且欧易 Web3 钱包将传递新账户的公钥:
用法
suiWallet.features['standard:events'].on('accountChanged', (publicKey) => {
if (publicKey) {
console.log(`Switched to account ${publicKey.toBase58()}`);
}
});