Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | 36x 36x 36x 36x 36x 36x 36x 36x 36x 2x 2x 8x 1x 7x 5x 8x 5x 1x 4x 2x 36x 5x 36x 124x 98x 75x | import { Cardano, DRepInfo, DRepProvider } from '@cardano-sdk/core';
import { Logger } from 'ts-log';
import { Observable, map, merge, of, withLatestFrom } from 'rxjs';
import { RetryBackoffConfig } from 'backoff-rxjs';
import { distinctBlock } from './util';
import { isNotNil } from '@cardano-sdk/util';
import { poll } from '@cardano-sdk/util-rxjs';
type DrepInfoObservableProps = {
drepProvider: DRepProvider;
logger: Logger;
retryBackoffConfig: RetryBackoffConfig;
refetchTrigger$: Observable<void>;
};
/** Use DRepProvider to fetch DRepInfos with retry backoff logic */
export const createDrepInfoColdObservable =
({ drepProvider, retryBackoffConfig, refetchTrigger$, logger }: DrepInfoObservableProps) =>
(drepIds: Cardano.DRepID[]) =>
poll<DRepInfo[]>({
logger,
retryBackoffConfig,
sample: () => drepProvider.getDRepsInfo({ ids: drepIds }),
trigger$: merge(of(true), refetchTrigger$)
});
/** Replaces drep credential entries with DrepInfo. Undefined if drep not found in drepInfo */
export const drepsToDelegatees =
(dreps: (Cardano.DelegateRepresentative | undefined)[]) =>
(drepInfos: DRepInfo[]): (Cardano.DRepDelegatee | undefined)[] =>
dreps.map((drep) => {
if (!drep) {
return;
}
if (Cardano.isDRepCredential(drep)) {
const drepInfo = drepInfos.find(
(info) => Cardano.DRepID.toCip129DRepID(info.id) === Cardano.DRepID.cip129FromCredential(drep)
);
if (!drepInfo) {
// DRep not found, assume it's inactive
return;
}
return { delegateRepresentative: drepInfo };
}
return { delegateRepresentative: drep };
});
/** Removes undefined, AlwaysAbstain and AlwaysNoConfidence, removes duplicates and maps to DRepID[] */
export const drepsToDrepIds = (dreps: Array<Cardano.DelegateRepresentative | undefined>): Cardano.DRepID[] => [
...new Set<Cardano.DRepID>(
dreps
.filter(isNotNil)
.filter(Cardano.isDRepCredential)
.map((drepCredential) => Cardano.DRepID.cip129FromCredential(drepCredential))
)
];
export const onlyDistinctBlockRefetch = (
refetchTrigger$: Observable<void>,
tip$: Observable<Pick<Cardano.PartialBlockHeader, 'blockNo'>>
): Observable<void> =>
distinctBlock(
refetchTrigger$.pipe(
withLatestFrom(tip$),
map(([, tip]) => tip)
)
).pipe(map(() => void 0));
|