关于 ts-sdk-wallet-adapter
面向 React Aptos dapp 的浏览器钱包集成指南,涵盖钱包适配器 Provider 与 Hook、经用户授权提交交易以及确认交易状态。
主要功能
- 01配置 AptosWalletAdapterProvider
- 02使用 useWallet() 访问钱包功能
- 03通过钱包适配器提交交易
- 04等待交易完成提交
- 05处理拒绝操作并动态列出钱包
适用场景
- 01在 React dapp 中连接浏览器钱包
- 02提交用户授权的交易
- 03处理前端流程中的钱包拒绝
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ aptos-labs/ aptos-agent-skills --skill ts-sdk-wallet-adapter安装后在 Claude Code 中输入/ts-sdk-wallet-adapter确认已加载。
详细介绍
TypeScript SDK:钱包适配器(React)
用途
在 React 中使用 @aptos-labs/wallet-adapter-react 引导钱包连接和前端交易提交。终端用户通过浏览器钱包(Petra、Nightly 等)签署交易,而不是使用原始私钥。
始终遵循
- 使用
@aptos-labs/wallet-adapter-react集成前端钱包——这是标准的 React 适配器。 - 使用
AptosWalletAdapterProvider包裹应用根节点——所有useWallet()调用都需要此上下文。 - 使用
useWallet()Hook 在 React 组件中访问钱包功能。 - 在前端使用钱包适配器的
signAndSubmitTransaction(来自useWallet())——不要使用 SDK 的直接调用aptos.signAndSubmitTransaction。 - 提交后始终调用
aptos.waitForTransaction({ transactionHash })——钱包在交易被接受时返回,而不是在交易提交完成时返回。
绝不
- 不要在浏览器/前端使用
Account.generate()或原始私钥——终端用户应使用钱包适配器。 - 不要在 React 组件中使用 SDK 的
aptos.signAndSubmitTransaction——使用useWallet()提供的钱包适配器版本。 - 不要硬编码钱包名称——使用
useWallet()中的wallets数组生成动态列表。
安装
npm install @aptos-labs/wallet-adapter-react
现代 AIP-62 标准钱包(Petra、Nightly 等)会自动检测,无需安装其他软件包。旧版钱包需要单独安装其插件软件包。
设置 Provider
使用 AptosWalletAdapterProvider 包裹应用根节点:
// main.tsx or App.tsx
import { AptosWalletAdapterProvider } from "@aptos-labs/wallet-adapter-react";
import { Network } from "@aptos-labs/ts-sdk";
function App() {
return (
<AptosWalletAdapterProvider
autoConnect={true}
dappConfig={{
network: Network.TESTNET
}}
onError={(error) => console.error("Wallet error:", error)}
>
<YourApp />
</AptosWalletAdapterProvider>
);
}
useWallet() Hook
import { useWallet } from "@aptos-labs/wallet-adapter-react";
function MyComponent() {
const {
account, // Current connected account { address, publicKey }
connected, // Boolean: is wallet connected?
wallet, // Current wallet info { name, icon, url }
wallets, // Array of available wallets
connect, // (walletName) => Promise<void>
disconnect, // () => Promise<void>
signAndSubmitTransaction, // Submit entry function calls (use THIS in frontend)
signTransaction, // Sign without submitting
submitTransaction, // Submit a signed transaction
signMessage, // Sign an arbitrary message
signMessageAndVerify, // Sign and verify a message
changeNetwork, // Switch networks (not all wallets support this)
network // Current network info
} = useWallet();
}
前端交易模式
使用 InputTransactionData 类型化载荷:
// entry-functions/increment.ts
import { InputTransactionData } from "@aptos-labs/wallet-adapter-react";
import { MODULE_ADDRESS } from "../lib/aptos";
export function buildIncrementPayload(): InputTransactionData {
return {
data: {
function: `${MODULE_ADDRESS}::counter::increment`,
functionArguments: []
}
};
}
// components/IncrementButton.tsx
import { useWallet } from "@aptos-labs/wallet-adapter-react";
import { aptos } from "../lib/aptos";
import { buildIncrementPayload } from "../entry-functions/increment";
function IncrementButton() {
const { signAndSubmitTransaction } = useWallet();
const handleClick = async () => {
try {
const response = await signAndSubmitTransaction(buildIncrementPayload());
await aptos.waitForTransaction({
transactionHash: response.hash
});
} catch (error) {
console.error("Transaction failed:", error);
}
};
return <button onClick={handleClick}>Increment</button>;
}
钱包连接界面
import { useWallet } from "@aptos-labs/wallet-adapter-react";
function WalletInfo() {
const { account, connected, connect, disconnect, wallet, wallets } = useWallet();
if (!connected) {
return (
<div>
{wallets.map((w) => (
<button key={w.name} onClick={() => connect(w.name)}>
Connect {w.name}
</button>
))}
</div>
);
}
return (
<div>
<p>Connected: {account?.address}</p>
<p>Wallet: {wallet?.name}</p>
<button onClick={disconnect}>Disconnect</button>
</div>
);
}
常见错误
| 错误 | 正确做法 |
|---|---|
未使用 AptosWalletAdapterProvider 包裹 | 使用 Provider 包裹应用根节点 |
| 提交后未等待交易 | 始终调用 aptos.waitForTransaction() |
在 React 中使用 SDK 的 aptos.signAndSubmitTransaction | 使用 useWallet() 提供的钱包适配器 signAndSubmitTransaction |
在前端使用 Account.generate() | 使用钱包适配器;仅在服务器/脚本中生成 |
| 未处理用户拒绝 | 捕获错误并检查与拒绝相关的错误消息 |
| 硬编码钱包名称 | 使用 useWallet() 中的 wallets 数组生成动态列表 |
参考资料
评论
支持 Markdown