diff --git a/CHANGELOG.md b/CHANGELOG.md index cd6f132..9dba6ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased +- added: `proposeFulfillingPaymentURI` support - changed: iOS - Emit balance after rescan - fixed: iOS - get UUID after starting synchronizer diff --git a/android/src/main/java/app/edge/rnzcash/RNZcashModule.kt b/android/src/main/java/app/edge/rnzcash/RNZcashModule.kt index 9f19d48..15330b8 100644 --- a/android/src/main/java/app/edge/rnzcash/RNZcashModule.kt +++ b/android/src/main/java/app/edge/rnzcash/RNZcashModule.kt @@ -381,6 +381,32 @@ class RNZcashModule( } } + @ReactMethod + fun proposeFulfillingPaymentURI( + alias: String, + paymentUri: String, + promise: Promise, + ) { + val wallet = getWallet(alias) + wallet.coroutineScope.launch { + try { + val account = wallet.getAccounts().first() + val proposal = + wallet.proposeFulfillingPaymentUri( + account, + paymentUri, + ) + val map = Arguments.createMap() + map.putInt("transactionCount", proposal.transactionCount()) + map.putString("totalFee", proposal.totalFeeRequired().value.toString()) + map.putString("proposalBase64", Base64.getEncoder().encodeToString(proposal.toByteArray())) + promise.resolve(map) + } catch (t: Throwable) { + promise.reject("Err", t) + } + } + } + @kotlin.ExperimentalStdlibApi @ReactMethod fun createTransfer( diff --git a/ios/RNZcash.m b/ios/RNZcash.m index dee79f5..5bcc02b 100644 --- a/ios/RNZcash.m +++ b/ios/RNZcash.m @@ -39,6 +39,12 @@ @interface RCT_EXTERN_MODULE(RNZcash, RCTEventEmitter) rejecter:(RCTPromiseRejectBlock)reject ) +RCT_EXTERN_METHOD(proposeFulfillingPaymentURI:(NSString *)alias +:(NSString *)paymentUri +resolver:(RCTPromiseResolveBlock)resolve +rejecter:(RCTPromiseRejectBlock)reject +) + RCT_EXTERN_METHOD(createTransfer:(NSString *)alias :(NSString *)proposalBase64 :(NSString *)seed diff --git a/ios/RNZcash.swift b/ios/RNZcash.swift index 32344b0..0286ea8 100644 --- a/ios/RNZcash.swift +++ b/ios/RNZcash.swift @@ -247,6 +247,42 @@ class RNZcash: RCTEventEmitter { } } + @objc func proposeFulfillingPaymentURI( + _ alias: String, _ paymentUri: String, + resolver resolve: @escaping RCTPromiseResolveBlock, + rejecter reject: @escaping RCTPromiseRejectBlock + ) { + Task { + if let wallet = await synchronizerStore.get(alias) { + do { + guard let accountUUID = wallet.accountUUID else { + reject("proposeFulfillingPaymentURI", "Account UUID not found", genericError) + return + } + let proposal = try await wallet.synchronizer.proposefulfillingPaymentURI( + paymentUri, + accountUUID: accountUUID + ) + let proposalBase64 = try proposal.inner.serializedData().base64EncodedString() + + let out: NSMutableDictionary = [ + "proposalBase64": proposalBase64, + "transactionCount": proposal.transactionCount(), + "totalFee": String(proposal.totalFeeRequired().amount), + ] + + resolve(out) + } catch let error as ZcashError { + reject("proposeFulfillingPaymentURI", "Failed to propose from payment URI", error) + } catch { + reject("proposeFulfillingPaymentURI", "Unknown error", error) + } + } else { + reject("proposeFulfillingPaymentURI", "Wallet does not exist", genericError) + } + } + } + @objc func createTransfer( _ alias: String, _ proposalBase64: String, _ seed: String, resolver resolve: @escaping RCTPromiseResolveBlock, diff --git a/src/react-native.ts b/src/react-native.ts index 0f0c6a3..3d71f67 100644 --- a/src/react-native.ts +++ b/src/react-native.ts @@ -98,6 +98,16 @@ export class Synchronizer { return result } + async proposeFulfillingPaymentURI( + paymentUri: string + ): Promise { + const result = await RNZcash.proposeFulfillingPaymentURI( + this.alias, + paymentUri + ) + return result + } + async createTransfer( opts: CreateTransferOpts ): Promise {