使用 ether.js 的 reactnnative walletconnect

Use reactnnative walletconnect with ether.js

这是一个粗略的总结,因为这些东西存在不同的观点。

我有一个使用 wallet connect 的 React 本机应用程序。 这允许我连接到我的 phone 上的元掩码钱包并创建一个连接器实例。

import {
  useWalletConnect,
  withWalletConnect,
} from "@walletconnect/react-native-dapp";

const connector = useWalletConnect();

connector.connect();

在我的应用程序的其他地方,我正在使用以太来部署..

    // local hard hat HTTP and WebSocket JSON-RPC server 
    let provider = ethers.getDefaultProvider('http://127.0.0.1:8545/');
    const signer = provider.getSigner()

    let contract = new ethers.Contract(nftaddress, NFT.abi, signer);

    let transaction = await contract.createToken(url);

    let tx = await transaction.wait();
    let event = tx.events[0];
    let value = event.args[2];
    let tokenId = value.toNumber();
    const price = ethers.utils.parseUnits(formInput.price, "ether");

    contract = new ethers.Contract(nftmarketaddress, Market.abi, signer);
    let listingPrice = await contract.getListingPrice();
    listingPrice = listingPrice.toString();

    transaction = await contract.createMarketItem(nftaddress, tokenId, price, {
      value: listingPrice,
    });
    await transaction.wait();

我想我不完全明白我是如何使用我的钱包(连接器实例)来签署这些交易的。钱包连接器实例似乎不包含“签名者”,它只有一种方法可以让您签署交易?我完全被这个难住了。

这是输出

我也偶然发现了你的问题,我也被难住了,直到我意识到这一点:

@walletconnect/web3-provider 必须与 @walletconnect/react-native-dapp 一起使用,以便您可以设置(BSC 链的示例,当您已经为 useWalletConnect() 实例调用了 connector.connect() 时):

import WalletConnectProvider from '@walletconnect/web3-provider';
import { useWalletConnect } from '@walletconnect/react-native-dapp';

const connector = useWalletConnect();
const provider = new WalletConnectProvider({
        rpc: {
            56: 'https://bsc-dataseed1.binance.org:443',
        },
        chainId: 56,
        connector: connector,
        qrcode: false,
    });
await provider.enable();
const ethers_provider = new ethers.providers.Web3Provider(provider);
const signer = ethers_provider.getSigner();

其中 connector@walletconnect/react-native-dapp 传递的实例并且需要 qrcode: false 因为否则它会尝试调用 window.document.

同样对于 expo 用户:不幸的是要让 walletconnect 在 Android 11+ 上工作,你至少需要 expo prebuild 添加

<queries>
    <intent>
      <action android:name="android.intent.action.VIEW"/>
      <category android:name="android.intent.category.BROWSABLE"/>
      <data android:scheme="https"/>
    </intent>
    <intent>
      <action android:name="android.intent.action.VIEW"/>
      <category android:name="android.intent.category.BROWSABLE"/>
      <data android:scheme="http"/>
    </intent>
    <intent>
      <action android:name="android.intent.action.VIEW"/>
      <category android:name="android.intent.category.BROWSABLE"/>
      <data android:scheme="wc"/>
    </intent>
    <intent>
      <action android:name="android.intent.action.VIEW"/>
      <category android:name="android.intent.category.BROWSABLE"/>
      <data android:scheme="mqtt"/>
    </intent>
    <intent>
      <action android:name="android.intent.action.VIEW"/>
      <category android:name="android.intent.category.BROWSABLE"/>
      <data android:scheme="wamp"/>
    </intent>
  </queries>

否则你的app看不到安装了哪些支持wallet connect的app,也不能发送websocket请求(这最后一部分我不太确定,如果我错了请指正,但至少你需要 wc 意图)