@walletconnect/client vs @walletconnect/web3-provider vs @web3-react/core vs ethers
Web3 钱包连接
@walletconnect/client@walletconnect/web3-provider@web3-react/coreethers类似的npm包:

Web3 钱包连接

Web3 钱包连接库是用于在去中心化应用(dApp)中与用户的加密钱包进行交互的工具。这些库提供了标准化的方法来连接、认证和与用户的钱包进行通信,从而实现区块链交易、签名消息和访问用户的区块链账户。它们简化了 dApp 与各种钱包(如 MetaMask、WalletConnect 等)之间的集成,支持多种钱包提供者和连接方式。@walletconnect/client 是一个实现 WalletConnect 协议的库,支持与任何兼容的 WalletConnect 钱包进行连接。@walletconnect/web3-provider 是一个 WalletConnect 提供者,允许 dApp 通过 WalletConnect 协议与移动钱包连接。@web3-react/core 是一个灵活的 React 组件库,提供了与多个钱包和区块链网络集成的抽象层。ethers 是一个全面的以太坊库,提供钱包连接、智能合约交互和以太坊区块链的各种功能。

npm下载趋势

3 年

GitHub Stars 排名

统计详情

npm包名称
下载量
Stars
大小
Issues
发布时间
License
@walletconnect/client01,688188 kB110-Apache-2.0
@walletconnect/web3-provider01,688876 kB110-Apache-2.0
@web3-react/core05,68567.6 kB1753 年前GPL-3.0-or-later
ethers08,71713 MB6734 个月前MIT

功能对比: @walletconnect/client vs @walletconnect/web3-provider vs @web3-react/core vs ethers

钱包连接

  • @walletconnect/client:

    @walletconnect/client 提供与任何 WalletConnect 兼容钱包的连接,支持多链和多钱包。它允许开发者实现自定义连接流程,适合需要灵活性和自定义的应用。

  • @walletconnect/web3-provider:

    @walletconnect/web3-provider 作为 Web3 提供者,简化了与 WalletConnect 钱包的连接。它支持自动处理连接、断开和重连,适合需要快速集成的项目。

  • @web3-react/core:

    @web3-react/core 提供与多个钱包提供者的连接,包括 WalletConnect 和 MetaMask。它允许开发者根据需要选择和切换钱包,提供更大的灵活性。

  • ethers:

    ethers 通过集成钱包 API 支持与各种钱包的连接,包括 MetaMask 和 WalletConnect。它提供简单的接口来管理钱包连接和账户。

智能合约交互

  • @walletconnect/client:

    @walletconnect/client 允许通过 WalletConnect 发送交易和签名消息,但不提供直接的智能合约交互功能。开发者需要实现与合约的交互逻辑。

  • @walletconnect/web3-provider:

    @walletconnect/web3-provider 作为 Web3 提供者,支持与智能合约的交互。它允许 dApp 通过标准的 Web3 接口与合约进行交互。

  • @web3-react/core:

    @web3-react/core 不直接处理智能合约交互,但可以与其他库(如 ethers.js)结合使用,提供灵活的合约交互解决方案。

  • ethers:

    ethers 提供全面的智能合约交互功能,包括部署合约、调用合约函数和监听事件。它是与以太坊合约交互的强大工具。

多链支持

  • @walletconnect/client:

    @walletconnect/client 支持多链连接,允许与不同区块链上的 WalletConnect 兼容钱包进行交互。

  • @walletconnect/web3-provider:

    @walletconnect/web3-provider 也支持多链,允许 dApp 连接到不同链上的 WalletConnect 钱包。

  • @web3-react/core:

    @web3-react/core 支持多链集成,但具体链的支持取决于所使用的钱包提供者。

  • ethers:

    ethers 原生支持以太坊及其兼容链,支持多链环境。

代码示例

  • @walletconnect/client:

    使用 @walletconnect/client 连接 WalletConnect 钱包

    import { WalletConnectClient } from '@walletconnect/client';
    
    const connector = new WalletConnectClient({
      bridge: 'https://bridge.walletconnect.org', // WalletConnect 桥接服务器
      qrcode: true, // 显示二维码
    });
    
    // 连接钱包
    connector.connect().then(() => {
      console.log('钱包已连接');
    });
    
  • @walletconnect/web3-provider:

    使用 @walletconnect/web3-provider 作为 Web3 提供者

    import WalletConnectProvider from '@walletconnect/web3-provider';
    
    const provider = new WalletConnectProvider({
      infuraId: 'YOUR_INFURA_ID', // Infura ID
    });
    
    // 连接钱包
    await provider.enable();
    console.log('钱包已连接');
    
  • @web3-react/core:

    使用 @web3-react/core 连接多个钱包

    import { Web3ReactProvider } from '@web3-react/core';
    
    function getLibrary(provider) {
      return new ethers.providers.Web3Provider(provider);
    }
    
    <Web3ReactProvider getLibrary={getLibrary}>
      {/* 你的 dApp 组件 */}
    </Web3ReactProvider>
    
  • ethers:

    使用 ethers 连接 MetaMask 钱包

    import { ethers } from 'ethers';
    
    const provider = new ethers.providers.Web3Provider(window.ethereum);
    await provider.send('eth_requestAccounts', []);
    const signer = provider.getSigner();
    console.log('钱包已连接');
    

如何选择: @walletconnect/client vs @walletconnect/web3-provider vs @web3-react/core vs ethers

  • @walletconnect/client:

    选择 @walletconnect/client 如果您需要直接与 WalletConnect 兼容的钱包进行连接,且希望实现自定义的连接逻辑。它提供了与 WalletConnect 协议的低级 API,适合需要高度自定义的应用。

  • @walletconnect/web3-provider:

    选择 @walletconnect/web3-provider 如果您希望快速集成 WalletConnect 作为 Web3 提供者,支持与现有的 Web3 兼容应用无缝连接。它适合需要简单集成但仍希望利用 WalletConnect 功能的项目。

  • @web3-react/core:

    选择 @web3-react/core 如果您正在构建一个 React 应用,并希望获得与多个钱包提供者(包括 MetaMask、WalletConnect 等)集成的灵活性。它提供了可组合的组件和钩子,适合需要高度可定制的解决方案。

  • ethers:

    选择 ethers 如果您需要一个功能全面的库来处理以太坊区块链的各种操作,包括钱包连接、智能合约交互和以太坊数据处理。它适合需要全面功能和高性能的应用,尤其是在与智能合约进行复杂交互时。

@walletconnect/client的README

WalletConnect Client

Client for WalletConnect

For more details, read the documentation

Install

yarn add @walletconnect/client
# OR

npm install --save @walletconnect/client

Initiate Connection

import WalletConnect from "@walletconnect/client";

// Create a connector
const connector = new WalletConnect({
  bridge: "https://bridge.walletconnect.org", // Required
});

connector.on("session_update", (error, payload) => {
  if (error) {
    throw error;
  }

  // Get updated accounts and chainId
  const { accounts, chainId } = payload.params[0];
});

connector.on("disconnect", (error, payload) => {
  if (error) {
    throw error;
  }

  // Delete connector
});

const { accounts, chainId } = await connector.connect();

Send Transaction (eth_sendTransaction)

// Draft transaction
const tx = {
  from: "0xbc28Ea04101F03aA7a94C1379bc3AB32E65e62d3", // Required
  to: "0x89D24A7b4cCB1b6fAA2625Fe562bDd9A23260359", // Required (for non contract deployments)
  data: "0x", // Required
  gasPrice: "0x02540be400", // Optional
  gasLimit: "0x9c40", // Optional
  value: "0x00", // Optional
  nonce: "0x0114", // Optional
};

// Send transaction
connector
  .sendTransaction(tx)
  .then(result => {
    // Returns transaction id (hash)
    console.log(result);
  })
  .catch(error => {
    // Error returned when rejected
    console.error(error);
  });

Sign Transaction (eth_signTransaction)

// Draft transaction
const tx = {
  from: "0xbc28Ea04101F03aA7a94C1379bc3AB32E65e62d3", // Required
  to: "0x89D24A7b4cCB1b6fAA2625Fe562bDd9A23260359", // Required (for non contract deployments)
  data: "0x", // Required
  gasPrice: "0x02540be400", // Optional
  gasLimit: "0x9c40", // Optional
  value: "0x00", // Optional
  nonce: "0x0114", // Optional
};

// Sign transaction
connector
  .signTransaction(tx)
  .then(result => {
    // Returns signed transaction
    console.log(result);
  })
  .catch(error => {
    // Error returned when rejected
    console.error(error);
  });

Sign Personal Message (personal_sign)


// Draft Message Parameters
const message = "My email is [email protected] - 1537836206101"

const msgParams = [
  convertUtf8ToHex(message)                                                 // Required
  "0xbc28ea04101f03ea7a94c1379bc3ab32e65e62d3",                             // Required
];


// Sign personal message
connector
  .signPersonalMessage(msgParams)
  .then((result) => {
    // Returns signature.
    console.log(result)
  })
  .catch(error => {
    // Error returned when rejected
    console.error(error);
  })

Sign Message (eth_sign)


// Draft Message Parameters
const message = "My email is [email protected] - 1537836206101";

const msgParams = [
  "0xbc28ea04101f03ea7a94c1379bc3ab32e65e62d3",                            // Required
  keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))    // Required
];


// Sign message
connector
  .signMessage(msgParams)
  .then((result) => {
    // Returns signature.
    console.log(result)
  })
  .catch(error => {
    // Error returned when rejected
    console.error(error);
  })

Sign Typed Data (eth_signTypedData)

// Draft Message Parameters
const typedData = {
  types: {
    EIP712Domain: [
      { name: "name", type: "string" },
      { name: "version", type: "string" },
      { name: "chainId", type: "uint256" },
      { name: "verifyingContract", type: "address" },
    ],
    Person: [
      { name: "name", type: "string" },
      { name: "account", type: "address" },
    ],
    Mail: [
      { name: "from", type: "Person" },
      { name: "to", type: "Person" },
      { name: "contents", type: "string" },
    ],
  },
  primaryType: "Mail",
  domain: {
    name: "Example Dapp",
    version: "1.0.0-beta",
    chainId: 1,
    verifyingContract: "0x0000000000000000000000000000000000000000",
  },
  message: {
    from: {
      name: "Alice",
      account: "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
    },
    to: {
      name: "Bob",
      account: "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
    },
    contents: "Hey, Bob!",
  },
};

const msgParams = [
  "0xbc28ea04101f03ea7a94c1379bc3ab32e65e62d3", // Required
  typedData, // Required
];

// Sign Typed Data
connector
  .signTypedData(msgParams)
  .then(result => {
    // Returns signature.
    console.log(result);
  })
  .catch(error => {
    // Error returned when rejected
    console.error(error);
  });

Send Custom Request

// Draft Custom Request
const customRequest = {
  id: 1337,
  jsonrpc: "2.0",
  method: "eth_signTransaction",
  params: [
    {
      from: "0xbc28Ea04101F03aA7a94C1379bc3AB32E65e62d3",
      to: "0x89D24A7b4cCB1b6fAA2625Fe562bDd9A23260359",
      data: "0x",
      gasPrice: "0x02540be400",
      gasLimit: "0x9c40",
      value: "0x00",
      nonce: "0x0114",
    },
  ],
};

// Send Custom Request
connector
  .sendCustomRequest(customRequest)
  .then(result => {
    // Returns request result
    console.log(result);
  })
  .catch(error => {
    // Error returned when rejected
    console.error(error);
  });

Create Instant Request

import WalletConnect from "@walletconnect/browser";
import WalletConnectQRCodeModal from "@walletconnect/qrcode-modal";

// Create a connector
const connector = new WalletConnect();

// Draft Instant Request
const instantRequest = {
  id: 1,
  jsonrpc: "2.0",
  method: "eth_signTransaction",
  params: [
    {
      from: "0xbc28ea04101f03ea7a94c1379bc3ab32e65e62d3",
      to: "0x0000000000000000000000000000000000000000",
      nonce: 1,
      gas: 100000,
      value: 0,
      data: "0x0",
    },
  ],
};

// Create Instant Request
connector
  .createInstantRequest(instantRequest)
  .then(result => {
    // Get Instant Request Result
    console.log(result);
  })
  .catch(error => {
    // Handle Error or Rejection
    console.error(error);
  });