| 
									
										
										
										
											2023-10-27 14:13:44 -04:00
										 |  |  | import XCTest | 
					
						
							|  |  |  | @testable import BitcoinDevKit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | final class LiveWalletTests: XCTestCase { | 
					
						
							|  |  |  |     func testSyncedBalance() throws { | 
					
						
							|  |  |  |         let descriptor = try Descriptor( | 
					
						
							| 
									
										
										
										
											2023-11-17 13:25:33 -05:00
										 |  |  |             descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", | 
					
						
							| 
									
										
										
										
											2023-10-27 14:13:44 -04:00
										 |  |  |             network: Network.testnet | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         let wallet = try Wallet.newNoPersist( | 
					
						
							|  |  |  |             descriptor: descriptor, | 
					
						
							|  |  |  |             changeDescriptor: nil, | 
					
						
							|  |  |  |             network: .testnet | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         let esploraClient = EsploraClient(url: "https://mempool.space/testnet/api") | 
					
						
							| 
									
										
										
										
											2024-01-11 07:13:04 -05:00
										 |  |  |         let update = try esploraClient.fullScan( | 
					
						
							| 
									
										
										
										
											2023-10-27 14:13:44 -04:00
										 |  |  |             wallet: wallet, | 
					
						
							|  |  |  |             stopGap: 10, | 
					
						
							|  |  |  |             parallelRequests: 1 | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         try wallet.applyUpdate(update: update) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-15 15:57:02 -06:00
										 |  |  |         XCTAssertGreaterThan(wallet.getBalance().total, UInt64(0)) | 
					
						
							| 
									
										
										
										
											2023-12-07 13:24:39 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |         print("Transactions count: \(wallet.transactions().count)") | 
					
						
							|  |  |  |         let transactions = wallet.transactions().prefix(3) | 
					
						
							|  |  |  |         for tx in transactions { | 
					
						
							|  |  |  |             let sentAndReceived = wallet.sentAndReceived(tx: tx) | 
					
						
							|  |  |  |             print("Transaction: \(tx.txid())") | 
					
						
							|  |  |  |             print("Sent \(sentAndReceived.sent)") | 
					
						
							|  |  |  |             print("Received \(sentAndReceived.received)") | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-10-27 14:13:44 -04:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-11-17 13:25:33 -05:00
										 |  |  |      | 
					
						
							|  |  |  |     func testBroadcastTransaction() throws { | 
					
						
							|  |  |  |         let descriptor = try Descriptor( | 
					
						
							|  |  |  |             descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", | 
					
						
							|  |  |  |             network: Network.testnet | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         let wallet = try Wallet.newNoPersist( | 
					
						
							|  |  |  |             descriptor: descriptor, | 
					
						
							|  |  |  |             changeDescriptor: nil, | 
					
						
							|  |  |  |             network: .testnet | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         let esploraClient = EsploraClient(url: "https://mempool.space/testnet/api") | 
					
						
							| 
									
										
										
										
											2024-01-11 07:13:04 -05:00
										 |  |  |         let update = try esploraClient.fullScan( | 
					
						
							| 
									
										
										
										
											2023-11-17 13:25:33 -05:00
										 |  |  |             wallet: wallet, | 
					
						
							|  |  |  |             stopGap: 10, | 
					
						
							|  |  |  |             parallelRequests: 1 | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         try wallet.applyUpdate(update: update) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-15 15:57:02 -06:00
										 |  |  |         XCTAssertGreaterThan(wallet.getBalance().total, UInt64(0), "Wallet must have positive balance, please add funds") | 
					
						
							| 
									
										
										
										
											2023-11-17 13:25:33 -05:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2023-11-15 15:57:02 -06:00
										 |  |  |         print("Balance: \(wallet.getBalance().total)") | 
					
						
							| 
									
										
										
										
											2023-11-17 13:25:33 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         let recipient: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .testnet) | 
					
						
							|  |  |  |         let psbt: PartiallySignedTransaction = try | 
					
						
							|  |  |  |             TxBuilder() | 
					
						
							|  |  |  |                 .addRecipient(script: recipient.scriptPubkey(), amount: 4200) | 
					
						
							| 
									
										
										
										
											2024-01-16 14:17:56 -06:00
										 |  |  |                 .feeRate(feeRate: FeeRate.fromSatPerVb(satPerVb: 2.0)) | 
					
						
							| 
									
										
										
										
											2023-11-17 13:25:33 -05:00
										 |  |  |                 .finish(wallet: wallet) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         print(psbt.serialize()) | 
					
						
							|  |  |  |         XCTAssertTrue(psbt.serialize().hasPrefix("cHNi"), "PSBT should start with cHNI") | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         let walletDidSign: Bool = try wallet.sign(psbt: psbt) | 
					
						
							|  |  |  |         XCTAssertTrue(walletDidSign, "Wallet did not sign transaction") | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         let tx: Transaction = psbt.extractTx() | 
					
						
							|  |  |  |         print(tx.txid()) | 
					
						
							| 
									
										
										
										
											2023-12-16 19:24:02 -06:00
										 |  |  |         let fee: UInt64 = try wallet.calculateFee(tx: tx) | 
					
						
							|  |  |  |         print("Transaction Fee: \(fee)") | 
					
						
							|  |  |  |         let feeRate: FeeRate = try wallet.calculateFeeRate(tx: tx) | 
					
						
							|  |  |  |         print("Transaction Fee Rate: \(feeRate.asSatPerVb()) sat/vB") | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2023-11-17 13:25:33 -05:00
										 |  |  |         try esploraClient.broadcast(transaction: tx) | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-10-27 14:13:44 -04:00
										 |  |  | } |