首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SafeServiceClient未正确初始化

SafeServiceClient未正确初始化
EN

Ethereum用户
提问于 2023-01-21 18:31:02
回答 1查看 39关注 0票数 0

在我的next.js应用程序中,我初始化SafeServiceClient,如下所示:

代码语言:javascript
复制
import React, {useState, useEffect } from 'react';
import EthersAdapter from '@gnosis.pm/safe-ethers-lib'
import SafeServiceClient from '@gnosis.pm/safe-service-client'
import { InjectedConnector } from '@web3-react/injected-connector'
import {ethers} from 'ethers'
import { useWeb3React } from "@web3-react/core";

const txServiceUrl = 'https://safe-transaction-goerli.safe.global/';
declare let window: any;

function Comp() {

  const injected = new InjectedConnector({
    supportedChainIds: [1, 3, 4, 5, 42],
  })

  /// Local states
  const [safeService, setSafeService] = useState<any>()
  const [safes, setSafes] = useState([])

  // Hooks
  const { account, activate, deactivate } = useWeb3React();
  
  const provider = new ethers.providers.Web3Provider(window.ethereum)
  const safeOwner = provider.getSigner(0)

  const adapter = new EthersAdapter({
      ethers,
      signer: safeOwner
    })

  /** 
   *  Initialise: SafeServiceClient
   *  Fetch: Safes
   *  @issue SafeServiceClient not initialised properly
   * */ 
   useEffect(() => {        
    const fetchData = async (ownerAddress:string) => {
      const ethAdapter = adapter as EthersAdapter
      const initSafeService = new SafeServiceClient({ txServiceUrl, ethAdapter })

      // successfully returns safeService object
      console.log(initSafeService) 
      
      // returns error Cannot read properties of undefined (reading 'getEip3770Address')
      const fetchedSafes:any = await initSafeService.getSafesByOwner(ownerAddress)
      setSafes(fetchedSafes.safes)
      setSafeService(initSafeService)
    }
    if(account){
      fetchData(account)
    }
  }, [account]);



  /// Connect Metamask
  async function connect() {
    try {
    await activate(injected)//.then(() => initSafeService())
    } catch (ex) {
    console.log(ex)
    }
  }

  /// Disconnect Metamask
  async function disconnect() {
    try {
    deactivate()
    } catch (ex) {
    console.log(ex)
    }
  }

  return (
    <div>
      <button onClick={() => connect()}>
        connect
      </button>
      <button onClick={() => disconnect()}>
        disconnect
      </button>
    </div>
  );
}


export default Comp;

console.log(initSafeService)成功地返回SafeServiceClient对象。但是,initSafeService.getSafesByOwner(ownerAddress)返回错误:

如果我重新运行useEffect (通过断开和重新连接account),错误就不会显示,安全也会被正确地获取。

我遗漏了什么?

EN

回答 1

Ethereum用户

发布于 2023-01-21 20:29:14

听起来像是同步问题..。

编辑:更改等待,因为useEffect不能接收异步函数.

也许您需要等待fetchData()函数完成它的工作?

代码语言:javascript
复制
  useEffect(() => {        
    const fetchData = async (ownerAddress:string) => {
      const ethAdapter = adapter as EthersAdapter
      const initSafeService = new SafeServiceClient({ txServiceUrl, ethAdapter })
      console.log(initSafeService)
      const fetchedSafes = await initSafeService.getSafesByOwner(ownerAddress)
      setSafes(fetchedSafes.safes)
    }
    if(account){
      setSafeOwner(account as string);
      fetchData(account).then(() => {
        // do other dependent things...
      });
    }
  }, [account]);

一个想法,因为fetchData()函数是异步的.

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/143438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档