TP钱包添加代码实战指南,代币导入与DApp集成全流程

本指南为TP钱包开发实战教程,完整覆盖代币导入与DApp集成全流程,开篇讲解开发前置准备,包括开发环境搭建、TP钱包SDK引入与基础配置,随后详解代币导入实操:涵盖ERC20等主流代币标准对接、代码实...
本指南为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 ethers

React项目集成示例

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;


开发注意事项

  1. 链ID匹配