-
Notifications
You must be signed in to change notification settings - Fork 259
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement send handlers for Binance chain
- Loading branch information
Showing
19 changed files
with
352 additions
and
44 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
64 changes: 64 additions & 0 deletions
64
UnstoppableWallet/UnstoppableWallet/Modules/SendNew/BinancePreSendHandler.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
import Combine | ||
import Foundation | ||
import MarketKit | ||
import RxSwift | ||
|
||
class BinancePreSendHandler { | ||
private let token: Token | ||
private let adapter: ISendBinanceAdapter & IBalanceAdapter | ||
|
||
private let balanceStateSubject = PassthroughSubject<AdapterState, Never>() | ||
private let balanceDataSubject = PassthroughSubject<BalanceData, Never>() | ||
|
||
private let disposeBag = DisposeBag() | ||
|
||
init(token: Token, adapter: ISendBinanceAdapter & IBalanceAdapter) { | ||
self.token = token | ||
self.adapter = adapter | ||
|
||
adapter.balanceStateUpdatedObservable | ||
.observeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated)) | ||
.subscribe { [weak self] state in | ||
self?.balanceStateSubject.send(state) | ||
} | ||
.disposed(by: disposeBag) | ||
|
||
adapter.balanceDataUpdatedObservable | ||
.observeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated)) | ||
.subscribe { [weak self] _ in | ||
self?.onUpdateBalance() | ||
} | ||
.disposed(by: disposeBag) | ||
} | ||
|
||
private func onUpdateBalance() { | ||
balanceDataSubject.send(BalanceData(available: adapter.availableBalance)) | ||
} | ||
} | ||
|
||
extension BinancePreSendHandler: IPreSendHandler { | ||
var hasMemo: Bool { | ||
true | ||
} | ||
|
||
var balanceState: AdapterState { | ||
adapter.balanceState | ||
} | ||
|
||
var balanceStatePublisher: AnyPublisher<AdapterState, Never> { | ||
balanceStateSubject.eraseToAnyPublisher() | ||
} | ||
|
||
var balanceData: BalanceData { | ||
BalanceData(available: adapter.availableBalance) | ||
} | ||
|
||
var balanceDataPublisher: AnyPublisher<BalanceData, Never> { | ||
balanceDataSubject.eraseToAnyPublisher() | ||
} | ||
|
||
func sendData(amount: Decimal, address: String, memo: String?) -> SendData? { | ||
let memo = memo?.trimmingCharacters(in: .whitespaces) | ||
return .binance(token: token, amount: amount, address: address, memo: memo.flatMap { $0.isEmpty ? nil : $0 }) | ||
} | ||
} |
135 changes: 135 additions & 0 deletions
135
UnstoppableWallet/UnstoppableWallet/Modules/SendNew/BinanceSendHandler.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
import Foundation | ||
import MarketKit | ||
|
||
class BinanceSendHandler { | ||
let baseToken: Token | ||
private let token: Token | ||
private let amount: Decimal | ||
private let address: String | ||
private let memo: String? | ||
private var adapter: ISendBinanceAdapter | ||
|
||
init(baseToken: Token, token: Token, amount: Decimal, address: String, memo: String?, adapter: ISendBinanceAdapter) { | ||
self.baseToken = baseToken | ||
self.token = token | ||
self.amount = amount | ||
self.address = address | ||
self.memo = memo | ||
self.adapter = adapter | ||
} | ||
} | ||
|
||
extension BinanceSendHandler: ISendHandler { | ||
func sendData(transactionSettings _: TransactionSettings?) async throws -> ISendData { | ||
SendData( | ||
token: token, | ||
amount: amount, | ||
address: address, | ||
memo: memo, | ||
fee: adapter.fee | ||
) | ||
} | ||
|
||
func send(data: ISendData) async throws { | ||
guard let data = data as? SendData else { | ||
throw SendError.invalidData | ||
} | ||
|
||
_ = try await adapter.send(amount: data.amount, address: data.address, memo: data.memo) | ||
} | ||
} | ||
|
||
extension BinanceSendHandler { | ||
class SendData: ISendData { | ||
private let token: Token | ||
let amount: Decimal | ||
let address: String | ||
let memo: String? | ||
private let fee: Decimal | ||
|
||
init(token: Token, amount: Decimal, address: String, memo: String?, fee: Decimal) { | ||
self.token = token | ||
self.amount = amount | ||
self.address = address | ||
self.memo = memo | ||
self.fee = fee | ||
} | ||
|
||
var feeData: FeeData? { | ||
nil | ||
} | ||
|
||
var canSend: Bool { | ||
true | ||
} | ||
|
||
var rateCoins: [Coin] { | ||
[token.coin] | ||
} | ||
|
||
func cautions(baseToken _: Token) -> [CautionNew] { | ||
[] | ||
} | ||
|
||
func sections(baseToken: Token, currency: Currency, rates: [String: Decimal]) -> [[SendField]] { | ||
var fields: [SendField] = [ | ||
.amount( | ||
title: "send.confirmation.you_send".localized, | ||
token: token, | ||
coinValueType: .regular(coinValue: CoinValue(kind: .token(token: token), value: amount)), | ||
currencyValue: rates[token.coin.uid].map { CurrencyValue(currency: currency, value: $0 * amount) }, | ||
type: .neutral | ||
), | ||
.address( | ||
title: "send.confirmation.to".localized, | ||
value: address, | ||
blockchainType: .binanceChain | ||
), | ||
] | ||
|
||
if let memo { | ||
fields.append(.levelValue(title: "send.confirmation.memo".localized, value: memo, level: .regular)) | ||
} | ||
|
||
return [ | ||
fields, | ||
[ | ||
.value( | ||
title: "fee_settings.network_fee".localized, | ||
description: .init(title: "fee_settings.network_fee".localized, description: "fee_settings.network_fee.info".localized), | ||
coinValue: CoinValue(kind: .token(token: baseToken), value: fee), | ||
currencyValue: rates[baseToken.coin.uid].map { CurrencyValue(currency: currency, value: fee * $0) }, | ||
formatFull: true | ||
), | ||
], | ||
] | ||
} | ||
} | ||
} | ||
|
||
extension BinanceSendHandler { | ||
enum SendError: Error { | ||
case invalidData | ||
} | ||
} | ||
|
||
extension BinanceSendHandler { | ||
static func instance(token: Token, amount: Decimal, address: String, memo: String?) -> BinanceSendHandler? { | ||
guard let baseToken = try? App.shared.coinManager.token(query: .init(blockchainType: .binanceChain, tokenType: .native)) else { | ||
return nil | ||
} | ||
|
||
guard let adapter = App.shared.adapterManager.adapter(for: token) as? ISendBinanceAdapter else { | ||
return nil | ||
} | ||
|
||
return BinanceSendHandler( | ||
baseToken: baseToken, | ||
token: token, | ||
amount: amount, | ||
address: address, | ||
memo: memo, | ||
adapter: adapter | ||
) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.