Skip to content

Commit

Permalink
savepoint
Browse files Browse the repository at this point in the history
  • Loading branch information
llbartekll committed Jun 13, 2024
1 parent 43da343 commit be72b87
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 12 deletions.
2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ let package = Package(
dependencies: [
.package(
url: "https://github.com/WalletConnect/WalletConnectSwiftV2",
.revision("b0bf7892844fac62207aa8dcd27cda6c72287645")
.revision("997be80a6f86be4ba340ac8121acde24fc428520")
),
.package(
url: "https://github.com/WalletConnect/QRCode",
Expand Down
2 changes: 2 additions & 0 deletions Sources/Web3Modal/Core/Web3ModalClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ public class Web3ModalClient {
return analyticsService.isAnalyticsEnabled
}

// add user authenticated publisher authResponsePublisher+SIWE

// MARK: - Private Properties

private let signClient: SignClient
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ class WalletDetailViewModel: ObservableObject {
let router: Router
let store: Store
let signInteractor: SignInteractor



@Published var preferredPlatform: Platform = .mobile

private var disposeBag = Set<AnyCancellable>()
Expand Down Expand Up @@ -67,18 +68,29 @@ class WalletDetailViewModel: ObservableObject {
self?.store.SIWEFallbackState = false
}
guard let account = store.account?.account(),
let authRequestParams = Web3Modal.config.authRequestParams else { return }
let authRequestParams = Web3Modal.config.authRequestParams,
let topic = Web3Modal.instance.getSessions().first?.topic,
let chain = Web3Modal.instance.getSelectedChain(),
let blockchain = Blockchain(namespace: chain.chainNamespace, reference: chain.chainReference)
else { return }

let authPayload = AuthPayload(requestParams: authRequestParams, iat: DefaultIATProvider().iat)
let siweMessage = try Sign.instance.formatAuthMessage(payload: authPayload, account: account)

let rpcRequest: W3MJSONRPC = .personal_sign(address: account.address, message: siweMessage)
try await Web3Modal.instance.request(rpcRequest)

let rpcRequest = try Request(topic: topic, method: "personal_sign", params: AnyCodable([siweMessage, account.address]), chainId: blockchain)
try await Sign.instance.request(params: rpcRequest)

store.siweRequestId = rpcRequest.id
navigateToDeepLink(
wallet: wallet,
preferBrowser: preferredPlatform == .browser
)
store.siweMessage = siweMessage

DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
self.navigateToDeepLink(
wallet: self.wallet,
preferBrowser: preferredPlatform == .browser
)
}
}

func handle(_ event: Event) {
Expand Down
39 changes: 38 additions & 1 deletion Sources/Web3Modal/Sheets/Web3ModalViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class Web3ModalViewModel: ObservableObject {
private let supportsAuthenticatedSession: Bool

private var disposeBag = Set<AnyCancellable>()

init(
router: Router,
store: Store,
Expand All @@ -26,6 +26,8 @@ class Web3ModalViewModel: ObservableObject {
self.blockchainApiInteractor = blockchainApiInteractor
self.supportsAuthenticatedSession = supportsAuthenticatedSession

setupSIWEFallback()

Web3Modal.instance.sessionEventPublisher
.receive(on: DispatchQueue.main)
.sink { event, _, _ in
Expand Down Expand Up @@ -232,4 +234,39 @@ class Web3ModalViewModel: ObservableObject {
}

private let namespaceRegex = try! NSRegularExpression(pattern: "^[-a-z0-9]{3,8}$")

private func setupSIWEFallback() {
Sign.instance.sessionResponsePublisher.sink { [weak self] response in
if response.id == self?.store.siweRequestId {
switch response.result {
case .response(let result):
guard let signature = try? result.get(String.self),
let siweMessage = self?.store.siweMessage,
let account = self?.store.account?.account() else { return }

Task { [weak self] in
do {
try await Sign.instance.verifySIWE(signature: signature, message: siweMessage, address: account.address, chainId: account.blockchainIdentifier)

guard let self = self else { return }

DispatchQueue.main.async {
self.router.setRoute(Router.AccountSubpage.profile)
self.store.isModalShown = false
}
} catch {
guard let self = self else { return }

DispatchQueue.main.async {
self.store.toast = .init(style: .error, message: error.localizedDescription)
}
}
}
case .error(let error):
guard let self = self else { return }
self.store.toast = .init(style: .error, message: error.message)
}
}
}.store(in: &disposeBag)
}
}
3 changes: 2 additions & 1 deletion Sources/Web3Modal/Store.swift
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ class Store: ObservableObject {
var totalPages: Int = .max
var walletImages: [String: UIImage] = [:]
var installedWalletIds: [String] = []
var siweRequestId: RPCID
var siweRequestId: RPCID? = nil
var siweMessage: String? = nil

var recentWallets: [Wallet] {
get {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/WalletConnect/WalletConnectSwiftV2",
"state" : {
"revision" : "b0bf7892844fac62207aa8dcd27cda6c72287645"
"revision" : "997be80a6f86be4ba340ac8121acde24fc428520"
}
},
{
Expand Down

0 comments on commit be72b87

Please sign in to comment.