53
}
54
final receiver = Receiver.fromJson(json: session.receiver!);
55
printV("Resuming Payjoin Receiver Session ${receiver.id()}");
56
- return _spawnReceiver(receiver: receiver);
56
+ return spawnReceiver(receiver: receiver);
57
});
58
59
printV("Resumed ${spawnedSessions.length} Payjoin Sessions");
121
}
122
} catch (e) {
123
_cleanupSession(pjUri);
124
- printV(e);
125
- await _payjoinStorage.markSenderSessionUnrecoverable(pjUri);
126
- completer.completeError(e);
124
+ await _payjoinStorage.markSenderSessionUnrecoverable(pjUri, e.toString());
125
+ completer.complete();
126
}
127
} else if (message is PayjoinSessionError) {
128
_cleanupSession(pjUri);
129
if (message is UnrecoverableError) {
131
- printV(message.message);
132
- await _payjoinStorage.markSenderSessionUnrecoverable(pjUri);
130
+ await _payjoinStorage.markSenderSessionUnrecoverable(pjUri, message.message);
131
completer.complete();
132
} else if (message is RecoverableError) {
133
completer.complete();
147
return completer.future;
148
}
149
152
- Future<Receiver> initReceiver(String address,
150
+ Future<Receiver> getUnusedReceiver(String address,
151
[bool isTestnet = false]) async {
154
- try {
155
- final ohttpKeys = await PayjoinUri.fetchOhttpKeys(
156
- ohttpRelay: await randomOhttpRelayUrl(),
157
- payjoinDirectory: payjoinDirectoryUrl,
158
- );
152
+ final session = _payjoinStorage.getUnusedActiveReceiverSession(_wallet.id);
153
160
- final newReceiver = await NewReceiver.create(
161
- address: address,
162
- network: isTestnet ? Network.testnet : Network.bitcoin,
163
- directory: payjoinDirectoryUrl,
164
- ohttpKeys: ohttpKeys,
165
- );
166
- final persister = PayjoinReceiverPersister.impl();
167
- final receiverToken = await newReceiver.persist(persister: persister);
168
- final receiver =
169
- await Receiver.load(persister: persister, token: receiverToken);
170
-
171
- await _payjoinStorage.insertReceiverSession(receiver, _wallet.id);
154
+ if (session != null) {
155
+ await PayjoinUri.Url.fromStr(payjoinDirectoryUrl);
156
173
- return receiver;
174
- } catch (e) {
175
- throw Exception('Error initializing Payjoin Receiver: $e');
157
+ return Receiver.fromJson(json: session.receiver!);
158
}
159
+
160
+ return initReceiver(address);
161
}
162
179
- Future<void> spawnNewReceiver({
180
- required Receiver receiver,
181
- bool isTestnet = false,
182
- }) async {
163
+ Future<Receiver> initReceiver(String address, [bool isTestnet = false]) async {
164
+ final ohttpKeys = await PayjoinUri.fetchOhttpKeys(
165
+ ohttpRelay: await randomOhttpRelayUrl(),
166
+ payjoinDirectory: payjoinDirectoryUrl,
167
+ );
168
+
169
+ final newReceiver = await NewReceiver.create(
170
+ address: address,
171
+ network: isTestnet ? Network.testnet : Network.bitcoin,
172
+ directory: payjoinDirectoryUrl,
173
+ ohttpKeys: ohttpKeys,
174
+ );
175
+ final persister = PayjoinReceiverPersister.impl();
176
+ final receiverToken = await newReceiver.persist(persister: persister);
177
+ final receiver = await Receiver.load(persister: persister, token: receiverToken);
178
+
179
await _payjoinStorage.insertReceiverSession(receiver, _wallet.id);
184
- return _spawnReceiver(isTestnet: isTestnet, receiver: receiver);
180
+
181
+ return receiver;
182
}
183
187
- Future<void> _spawnReceiver({
184
+ Future<void> spawnReceiver({
185
required Receiver receiver,
186
bool isTestnet = false,
187
}) async {
226
227
case PayjoinReceiverRequestTypes.getCandidateInputs:
228
utxos = _wallet.getUtxoWithPrivateKeys();
229
+ if (utxos.isEmpty) {
230
+ await _wallet.updateAllUnspents();
231
+ utxos = _wallet.getUtxoWithPrivateKeys();
232
+ }
233
mainToIsolateSendPort?.send({
234
'requestId': message['requestId'],
235
'result': utxos,