WalletConnectV2 ---- Wallet使用

298 阅读2分钟

集成 WalletConnectSwiftV2 按照官方文档就可以(github.com/WalletConne… WalletConnect Inc 现已更名为 Reown。作为此次过渡的一部分,我们将弃用我们支持的平台上的大量存储库/软件包,并过渡到 Reown 组织下发布的等效版本。 此存储库现已被视为已弃用,并将于 2025 年 2 月 17 日终止使用。有关更多详细信息(包括迁移指南),请参阅:docs.reown.com/advanced/wa…),

WalletConnectSwiftV2(reown-swift)是用swift实现的,所有项目用swift会方便很多 git库 github.com/WalletConne…改为github.com/reown-com/r…

pod WalletConnectSwiftV2

图片.png

但有些依赖库会缺少, 需要单独pod 如:

pod 'WalletConnectSwiftV2/Web3Wallet', '1.6.6' pod 'WalletConnectSwiftV2/WalletConnectRouter', '1.6.6' pod 'WalletConnectSwiftV2/WalletConnectIdentity', '1.6.6'

wallet使用

AppDelegate-- didFinishLaunchingWithOptions 中初始化 walletConfigurators()

    private let app = Application()
    var presenter:WalletPresenter?
    
    private var configurators: [Configurator] {
        return [
            MigrationConfigurator(app: app),
            ThirdPartyConfigurator(),
            ApplicationConfigurator(app: app)
        ]
    }
    
    public func walletConfigurators(){
        configurators.configure()
        let interactor = WalletInteractor()
        self.presenter = WalletPresenter(interactor: interactor, uri:app.uri)
    }

WalletPresenter

  init(
        interactor: WalletInteractor,
        uri: String?
    ) {
        defer {
            setupInitialState()
        }
        self.interactor = interactor
        self.uri = uri
    }
    
    
 private func setupInitialState() {
        interactor.requestPublisher
            .receive(on: DispatchQueue.main)
            .sink { [weak self] result in
                //self?.router.present(request: result.request, context: result.context)
            }
            .store(in: &disposeBag)
        //状态更新
        interactor.sessionProposalPublisher
            .receive(on: DispatchQueue.main)
            .sink { [weak self] session in
                self?.connectionStatusUpdated(proposal:session.proposal, context: session.context)
            }
            .store(in: &disposeBag)
    //数据返回
        interactor.sessionRequestPublisher
            .receive(on: DispatchQueue.main)
            .sink { [weak self] request, context in
                self?.handle(request: request,context: context)
            }.store(in: &disposeBag)

        interactor.sessionsPublisher
            .receive(on: DispatchQueue.main)
            .sink { [weak self] sessions in
                self?.sessions = sessions
            }
            .store(in: &disposeBag)
        
        sessions = interactor.getSessions()
        
        pairFromDapp()
    }

扫码获取Dapp的URI

 func onScanUri(uri:String) {
        guard let uri = WalletConnectURI(string: uri) else {
            self.errorMessage = Errors.invalidUri(uri: uri).localizedDescription
            self.showError.toggle()
            return
        }
        print("URI: \(uri)")
        self.pair(uri: uri)
    }
      private func pair(uri: WalletConnectURI) {
        Task(priority: .high) { [self] in
            do {
                try await self.interactor.pair(uri: uri)
            } catch {
                Task.detached { @MainActor in
                    self.errorMessage = error.localizedDescription
                    self.showError.toggle()
                }
            }
        }
    }

是否同意连接提示

  func connectionStatusUpdated(proposal: Session.Proposal, context: VerifyContext?) {
        let interactor = SessionProposalInteractor()
        let presenter = SessionProposalPresenter(
            interactor: interactor,
            proposal: proposal,
            context: context
        )

        DecentralizeWalletConnectManager.shared().showConnectPopViewType(.connectSuccess, dict: [:]) {[weak self] index,_ in
            if index == 1{
                Task(priority: .userInitiated) { try await
                    presenter.onApprove()
                }
            }else{
                Task(priority: .userInitiated) { try await
                    presenter.onReject()
                }
            }
        }
    }

签名,交易授权

 private func handle(request: Request,context:VerifyContext?) {
        let interactor = SessionRequestInteractor()
        let presenter = SessionRequestPresenter(interactor: interactor ,sessionRequest: request, context: context)
      
        DispatchQueue.main.async { [unowned self] in
            if request.method == "eth_sendTransaction" {
                let arr:[Any] = request.params.value as? [Any] ?? []
                DecentralizeWalletConnectManager.shared().showConnectPopViewType(.transaction,dict:arr[0] as! [AnyHashable : Any]) {[weak self] index, dic in
                    if index == 1{
                        let hashHex:String = dic["hashHex"] as! String
                        Task(priority: .userInitiated) { try await
                            presenter.onApprove(hashHex: hashHex)
                        }
                    }else{
                        Task(priority: .userInitiated) { try await
                            presenter.onReject()
                        }
                    }
                }
                
            }
            else if request.method == "personal_sign"{
                DecentralizeWalletConnectManager.shared().showConnectPopViewType(.auth, dict: ["message":presenter.message]) { [weak self] index,_ in
                    if index == 1 {
                        //self?.setURICode(code: self!.codeStr)
                        Task(priority: .userInitiated) { try await
                            presenter.onApprove(hashHex: "")
                        }
                    }else{
                        Task(priority: .userInitiated) { try await
                            presenter.onReject()
                        }
                    }
                }
            }
            else if request.method == "eth_signTransaction"{
                let arr:[Any] = request.params.value as? [Any] ?? []
                DecentralizeWalletConnectManager.shared().showConnectPopViewType(.transaction, dict:arr[0] as! [AnyHashable : Any]) {[weak self] index, dic in
                    if index == 1{
                        let hashHex:String = dic["hashHex"] as! String
                        Task(priority: .userInitiated) { try await
                            presenter.onApprove(hashHex: hashHex)
                        }
                    }else{
                        Task(priority: .userInitiated) { try await
                            presenter.onReject()
                        }
                    }
                }
            }
            else {
               
                
            }
        }
    }