TP钱包添加代码实战指南,代币导入与DApp集成全流程
本指南为TP钱包开发实战教程,完整覆盖代币导入与DApp集成全流程,开篇讲解开发前置准备,包括开发环境搭建、TP钱包SDK引入与基础配置,随后详解代币导入实操:涵盖ERC20等主流代币标准对接、代码实现代币识别、余额查询与导入授权等核心环节,附带关键代码片段与避坑要点,最后聚焦DApp集成,讲解如何调用TP钱包开放API完成用户授权、交易签名、链上交互等流程,附调试排障技巧,助力开发者快速落地TP钱包集成项目。
修正优化后的完整教程
TP钱包是国内用户规模领先的去中心化Web3钱包,已覆盖以太坊、BSC、Polygon、Arbitrum、Optimism等数十条主流公链与L2生态,它不仅支持主流代币一键导入查看,还为开发者提供了完善的SDK与API接口,助力快速完成钱包集成、多链自定义代币批量添加等核心功能开发,无论是普通用户需要批量导入多链自定义代币提升操作效率,还是开发者希望将TP钱包无缝集成到自研DApp中,掌握对应的代码实现方案都能大幅节省时间成本,本文将从实操角度,详解两类TP钱包添加代码的落地方法与注意事项。
普通用户自动化添加自定义代币的代码实现
手动在TP钱包中逐个搜索并添加自定义代币,不仅操作繁琐耗时,当需要批量导入多链代币时效率尤为低下,通过调用TP钱包官方兼容的EIP-747标准接口,可以实现一键批量添加代币,大幅提升操作体验。
实现原理
TP钱包完全兼容以太坊官方定义的wallet_watchAsset JSON-RPC接口,该接口是Web3生态通用的代币添加标准,调用该方法后会唤起TP钱包的代币添加授权弹窗,用户确认后即可自动将自定义代币添加到钱包资产列表中,支持ERC20、ERC721、ERC1155三类主流代币标准。
前端批量添加代币完整代码示例(基于Ethers.js)
前置依赖安装
npm install ethers脚本代码
// 浏览器环境可删除dotenv相关代码 require('dotenv').config(); const { ethers } = require('ethers');async function addTokenToTPWallet() { // 仅支持TP钱包内置浏览器或兼容Web3的浏览器环境 if (!window.ethereum) { alert("请在TP钱包浏览器中打开本页面"); return; }
// 可选:提前切换到目标公链,避免链ID不匹配导致添加失败 // await window.ethereum.request({ // method: 'wallet_switchEthereumChain', // params: [{ chainId: '0x38' }] // 示例:切换到BSC主网,0x38为十进制56的十六进制形式 // }); // 配置自定义代币信息 const tokenConfig = { type: "ERC20", // 可选:ERC20/ERC721/ERC1155 options: { address: "0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", // 代币合约地址 symbol: "TKN", // 代币简称,如ETH、BNB decimals: 18, // 代币小数位数,ERC20默认18位,需与合约实际配置一致 image: "https://your-project-website.com/token-logo.png" // 代币图标URL,建议使用200*200px的HTTPS协议PNG资源 } }; // 仅ERC721/ERC1155代币需要传入tokenId参数 // tokenConfig.options.tokenId = "123"; try { // 唤起TP钱包授权弹窗 const addResult = await window.ethereum.send("wallet_watchAsset", [tokenConfig]); if (addResult) { console.log("✅ 代币成功添加到TP钱包"); alert("代币已成功添加到钱包资产列表"); } else { console.log("❌ 用户拒绝了代币添加请求"); alert("您已拒绝添加代币"); } } catch (error) { console.error("⚠️ 添加代币失败:", error.message); // 针对不同错误做差异化提示 if(error.code === 4902){ alert("当前链未在钱包中添加,请先切换到对应公链"); } else { alert(`添加失败:${error.message}`); } }// 执行脚本,可绑定到页面按钮点击事件 addTokenToTPWallet();
多链适配说明
如果需要添加其他公链的代币,只需切换对应链的RPC节点并提前完成链切换即可:
// 示例:切换到Polygon主网并使用官方RPC await window.ethereum.request({ method: 'wallet_switchEthereumChain', params: [{ chainId: '0x89' }] // 0x89对应十进制137,Polygon主网链ID }); const provider = new ethers.providers.JsonRpcProvider("https://polygon-rpc.com");常见公链链ID对照表:以太坊主网1(0x1)、BSC主网56(0x38)、Arbitrum主网42161(0xa4b1)。
开发者集成TP钱包到DApp的完整代码
绝大多数Web3 DApp都需要支持TP钱包作为连接入口,TP钱包的注入对象
window.ethereum完全兼容EIP-1193标准,与MetaMask接口逻辑一致,仅需增加专属校验即可完成无缝集成。前置依赖安装
npm install @web3-react/core @web3-react/injected-connector ethersReact项目集成示例
import { useWeb3React, Web3ReactProvider } from '@web3-react/core'; import { InjectedConnector } from '@web3-react/injected-connector'; import { ethers } from 'ethers';// 配置TP钱包支持的公链ID,可根据业务需求自行增减 const TPWalletConnector = new InjectedConnector({ supportedChainIds: [1, 56, 137, 42161] });
function TPWalletConnectButton() { const { activate, active, account, deactivate, library } = useWeb3React();
// 连接TP钱包并做专属校验 const connectTPWallet = async () => { try { await activate(TPWalletConnector); // 校验当前连接的是否为TP钱包,避免其他兼容钱包误触发 const isTPWallet = window.ethereum?.isTokenPocket === true; if (!isTPWallet) { alert("请切换到TP钱包浏览器打开本页面"); await deactivate(); return; } console.log("✅ 已连接TP钱包,当前账户:", account); } catch (error) { console.error("❌ 连接失败:", error.message); alert(`钱包连接失败:${error.message}`); } }; // 断开钱包连接 const disconnectWallet = async () => { await deactivate(); console.log("✅ 已断开钱包连接"); alert("已断开TP钱包连接"); }; // 示例:调用合约Mint功能 const callContractMint = async () => { if (!active) return alert("请先连接钱包"); try { const contract = new ethers.Contract( "0xYourContractAddress", // 替换为你的合约地址 ["function mint() external payable"], // 替换为实际合约ABI library.getSigner() ); const tx = await contract.mint({ value: ethers.utils.parseEther("0.01") }); await tx.wait(); console.log("✅ 交易成功,交易哈希:", tx.hash); alert(` mint成功,交易哈希:${tx.hash}`); } catch (error) { console.error(" mint失败:", error.message); alert(` mint失败:${error.message}`); } }; return ( <div className="wallet-connect-wrap"> {!active ? ( <button onClick={connectTPWallet} className="connect-btn"> 连接TP钱包 </button> ) : ( <div className="connected-info"> <p>已连接账户:{account.slice(0,6)}...{account.slice(-4)}</p> <button onClick={disconnectWallet} className="disconnect-btn">断开连接</button> <button onClick={callContractMint} className="mint-btn"> 调用Mint功能</button> </div> )} </div> );// 全局配置Web3 Provider function App() { const getLibrary = (provider) => { return new ethers.providers.Web3Provider(provider); }; return ( <Web3ReactProvider getLibrary={getLibrary}> <TPWalletConnectButton /> </Web3ReactProvider> ); }
export default App;
开发注意事项
- 链ID匹配
