// eslint-disable-next-line spaced-comment
///
import { filter } from 'rxjs/operators';
import { Observable, Observer, from } from 'rxjs';
/**
* blockConfirmationUntil operator waits until transaction is confirmed
* @param transactionId transaction id
*/
export const blockConfirmationUntil$ = (transactionId: string) =>
Observable.create(async (observer: Observer) => {
let block: Connex.Thor.Block = await connex.thor.block().get();
let hasBlock = await connex.thor.transaction(transactionId).get();
while (!hasBlock) {
await connex.thor.ticker().next();
block = await connex.thor.block().get();
hasBlock = await connex.thor.transaction(transactionId).get();
}
observer.next(!!hasBlock);
observer.complete();
});
export const blockConfirmationUntil = (transactionId: string) => blockConfirmationUntil$(transactionId).toPromise();
/**
* waitConfirmationUntil operator waits until transaction is confirmed
* @param transactionId transaction id
*/
export const waitConfirmationUntil = (address: string, clause: any) =>
Observable.create(async (observer: Observer) => {
let hasBlock = null;
let block;
while (!hasBlock) {
// get ticker
await connex.thor.ticker().next();
// get block
block = await connex.thor.block().get();
// get block transactions
const { transactions }: { transactions: Array } = block;
// get all txs by address
const hasTransaction = (await from(transactions)
.pipe(
filter(i => i.origin === address)
)
.toPromise());
// if tx and tx has clauses,
// if clause match, then read receipt and return
if (hasTransaction && hasTransaction.clauses.length > 0) {
const hasClause = hasTransaction.clauses.find(c => {
if (c.to === clause.to
&& c.value === clause.value
&& c.data === clause.data) {
return true;
}
});
if (hasClause) {
const receipt = await connex.thor.transaction(hasTransaction.id).getReceipt();
observer.next(receipt);
observer.complete();
}
}
hasBlock = true;
}
});