Skip to content

常见问题

1. 检测不到 bitkeep.ethereum

检测不到 window.bitkeep.ethereum 时,开发者可引导用户跳转到 Bitget Wallet 官网下载插件。 示例代码如下:

js
 function getProvider() {
    const provider = window?.bitkeep?.ethereum;
    if (!provider) {
        window.open('https://web3.bitget.com/wallet-download?type=2');
        throw "可以引导用户官网下载"
    }
    return provider;
}
 function getProvider() {
    const provider = window?.bitkeep?.ethereum;
    if (!provider) {
        window.open('https://web3.bitget.com/wallet-download?type=2');
        throw "可以引导用户官网下载"
    }
    return provider;
}

2. 钱包调用冲突问题

请使用 window.bitkeep.ethereum 接入 Bitget Wallet Extension,它和 web3.currentProviderwindow.ethereum 提供功能是相同的。

3. 多个钱包冲突问题

在切换钱包链接之前,清空上一次钱包监听的事件。

js
async function connect(type = "bitkeep") {
  const lastProvider = provider;
  const newProvider = getProvider(type);

  await newProvider.request({ method: "eth_requestAccounts" });

  //1. 删除上一个钱包的监听 防止逻辑冲突
  if (lastProvider) {
    provider.removeAllListeners();
  }

  //2. 授权链接成功替换钱包的providers
  provider = newProvider;
  web3 = new Web3(provider);

  //3. 事件监听 地址 和链id的变化 地址不存在就算是断开了
  provider.on("accountsChanged", async (accounts) => {
    accountsChanged(accounts);
  });
  provider.on("chainChanged", async (chainId) => {
    chainChanged(chainId);
  });
  //获取当前地址 chainId
  accountsChanged();
  chainChanged();

  // 4. 缓存默认链接钱包
  localStorage.setItem("injected", type);
}
async function connect(type = "bitkeep") {
  const lastProvider = provider;
  const newProvider = getProvider(type);

  await newProvider.request({ method: "eth_requestAccounts" });

  //1. 删除上一个钱包的监听 防止逻辑冲突
  if (lastProvider) {
    provider.removeAllListeners();
  }

  //2. 授权链接成功替换钱包的providers
  provider = newProvider;
  web3 = new Web3(provider);

  //3. 事件监听 地址 和链id的变化 地址不存在就算是断开了
  provider.on("accountsChanged", async (accounts) => {
    accountsChanged(accounts);
  });
  provider.on("chainChanged", async (chainId) => {
    chainChanged(chainId);
  });
  //获取当前地址 chainId
  accountsChanged();
  chainChanged();

  // 4. 缓存默认链接钱包
  localStorage.setItem("injected", type);
}

4. web3modal 接入问题

Bitget Wallet Extension 提供如下 2 种解决方案示例代码

  1. 打开 Bitget Wallet,但无法使用问题的解决方案 https://github.com/WalletConnect/web3modal/issues/574
  2. 使用 bitkeep-web3modal 示例代码来支持 Bitget Wallet Extension

支持多钱包存在的集成方式:

js
import web3modal from 'bitkeep-web3modal';
const web3Modal = new Web3Modal({
  network: 'mainnet', // optional
  cacheProvider: true, // optional
  providerOptions: {
    bitkeep: {
      package: true,
    },
    walletconnect: {
      display: {
        logo: 'data:image/gif;base64,INSERT_BASE64_STRING',
        name: 'Mobile',
        description: 'Scan qrcode with your mobile wallet',
      },
      package: WalletConnectProvider,
      options: {
        infuraId: 'INFURA_ID', // required
      },
    },
  }, // required
});
import web3modal from 'bitkeep-web3modal';
const web3Modal = new Web3Modal({
  network: 'mainnet', // optional
  cacheProvider: true, // optional
  providerOptions: {
    bitkeep: {
      package: true,
    },
    walletconnect: {
      display: {
        logo: 'data:image/gif;base64,INSERT_BASE64_STRING',
        name: 'Mobile',
        description: 'Scan qrcode with your mobile wallet',
      },
      package: WalletConnectProvider,
      options: {
        infuraId: 'INFURA_ID', // required
      },
    },
  }, // required
});

5. ethers.js 接入问题

不建议使用 ethers.js 在window 上挂载 _ethers 对象,避免使用 _ethers 因为加载顺序造成使用冲突。

推荐使用 BitKeep 注入的 _ethers 对象,参考以下方式引入使用

js
//直接引入使用
import ethers from "ethers"
const ethers = rquire("ethers")
//cdn
window.ethers
//直接引入使用
import ethers from "ethers"
const ethers = rquire("ethers")
//cdn
window.ethers

6. Ton Connect High Risk 问题

为了保证Ton Connect的链接安全,避免用户产生资金损失,Bitget Wallet上线了域名检测逻辑,逻辑如下

在Dapp中,通过Ton Connect唤起Bitget Wallet进行授权时,调用的Deeplink Url中会传入授权连接数据

js
https://bkcode.vip/ton-connect?
v=2&
id=xxxxx&
r={"manifestUrl":"https://mini-app.tomarket.ai/tonconnect-manifest.json","items":[{"name":"ton_addr"}]}&
ret=none
https://bkcode.vip/ton-connect?
v=2&
id=xxxxx&
r={"manifestUrl":"https://mini-app.tomarket.ai/tonconnect-manifest.json","items":[{"name":"ton_addr"}]}&
ret=none

Bitget Wallet会解析以上数据中的 manifestUrl 对应的JSON文件数据,请求数据如下

json
{
  "url": "https://mini-app.tomarket.ai",
  "name": "Tomarket",
  "iconUrl": "https://mini-app.tomarket.ai/assets/tomarket-gray-180x180.png"
}
{
  "url": "https://mini-app.tomarket.ai",
  "name": "Tomarket",
  "iconUrl": "https://mini-app.tomarket.ai/assets/tomarket-gray-180x180.png"
}

Bitget Wallet会根据mainfestUrl的请求url与manifest.json文件中的url进行主域名对比

如:

  • manifestUrl:https://mini-app.tomarket.ai/tonconnect-manifest.json
  • tonconnect-manifest.json 文件中的Url:https://mini-app.tomarket.ai

如以上两个链接的主域名(tomarket.ai)为一致则为通过状态,不一致会出现警告提醒。