Advertisement
Guest User

Untitled

a guest
Nov 18th, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 3.63 KB | None | 0 0
  1. // Copyright SIX DAY LLC. All rights reserved.
  2.  
  3. import Foundation
  4. import Geth
  5. import APIKit
  6. import JSONRPCKit
  7. import Result
  8.  
  9. struct SentTransaction {
  10.     let id: String
  11. }
  12.  
  13. class SendTransactionCoordinator {
  14.  
  15.     let keystore = EtherKeystore()
  16.     let config = Config()
  17.     let session: WalletSession
  18.  
  19.     init(
  20.         session: WalletSession
  21.     ) {
  22.         self.session = session
  23.     }
  24.  
  25.     func send(
  26.         address: Address,
  27.         value: Double,
  28.         data: Data = Data(),
  29.         configuration: TransactionConfiguration,
  30.         completion: @escaping (Result<SentTransaction, AnyError>) -> Void
  31.     ) {
  32.         let amountDouble = BDouble(floatLiteral: value) * BDouble(Double(EthereumUnit.ether.rawValue) ?? 0)
  33.         let amount = GethBigInt.from(double: amountDouble)
  34.  
  35.         let request = EtherServiceRequest(batch: BatchFactory().create(GetTransactionCountRequest(address: session.account.address.address)))
  36.         Session.send(request) { [weak self] result in
  37.             guard let `self` = self else { return }
  38.             switch result {
  39.             case .success(let count):
  40.                 self.sign(address: address, nonce: count, amount: amount, data: data, configuration: configuration, completion: completion)
  41.             case .failure(let error):
  42.                 completion(.failure(AnyError(error)))
  43.             }
  44.         }
  45.     }
  46.  
  47.     func send(
  48.         contract: Address,
  49.         to: Address,
  50.         amount: Double,
  51.         decimals: Int,
  52.         configuration: TransactionConfiguration,
  53.         completion: @escaping (Result<SentTransaction, AnyError>) -> Void
  54.     ) {
  55.         let amountToSend = (BDouble(floatLiteral: amount) * BDouble(pow(10, decimals).doubleValue)).description
  56.         session.web3.request(request: ContractERC20Transfer(amount: amountToSend, address: to.address)) { result in
  57.             switch result {
  58.             case .success(let res):
  59.                 NSLog("result \(res)")
  60.                 self.send(
  61.                     address: contract,
  62.                     value: 0,
  63.                     data: Data(hex: res.drop0x),
  64.                     configuration: configuration,
  65.                     completion: completion
  66.                 )
  67.             case .failure(let error):
  68.                 completion(.failure(AnyError(error)))
  69.             }
  70.         }
  71.     }
  72.  
  73.     func sign(
  74.         address: Address,
  75.         nonce: Int64 = 0,
  76.         amount: GethBigInt,
  77.         data: Data,
  78.         configuration: TransactionConfiguration,
  79.         completion: @escaping (Result<SentTransaction, AnyError>) -> Void
  80.     ) {
  81.         let signTransaction = SignTransaction(
  82.             amount: amount,
  83.             account: session.account,
  84.             address: address,
  85.             nonce: nonce,
  86.             speed: configuration.speed,
  87.             data: data,
  88.             chainID: GethBigInt.from(int: config.chainID)
  89.         )
  90.         let signedTransaction = keystore.signTransaction(signTransaction)
  91.  
  92.         switch signedTransaction {
  93.         case .success(let data):
  94.             let sendData = data.hexEncoded
  95.             let request = EtherServiceRequest(batch: BatchFactory().create(SendRawTransactionRequest(signedTransaction: sendData)))
  96.             Session.send(request) { result in
  97.                 switch result {
  98.                 case .success(let transactionID):
  99.                     completion(.success(SentTransaction(id: transactionID)))
  100.                 case .failure(let error):
  101.                     completion(.failure(AnyError(error)))
  102.                 }
  103.             }
  104.         case .failure(let error):
  105.             completion(.failure(AnyError(error)))
  106.         }
  107.     }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement