@polkadot/types/interfaces#UnappliedSlash TypeScript Examples
The following examples show how to use
@polkadot/types/interfaces#UnappliedSlash.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: index.tsx From crust-apps with Apache License 2.0 | 6 votes |
function extractSlashes (stashId: string, allSlashes: [BN, UnappliedSlash[]][] = []): Slash[] {
return allSlashes
.map(([era, all]) => ({
era,
slashes: all.filter(({ others, validator }) =>
validator.eq(stashId) || others.some(([nominatorId]) => nominatorId.eq(stashId))
)
}))
.filter(({ slashes }) => slashes.length);
}
Example #2
Source File: index.tsx From crust-apps with Apache License 2.0 | 5 votes |
function calcSlashEras (slashes: [BN, UnappliedSlash[]][], ownStashes: StakerState[]): SlashEra[] {
const slashEras: SlashEra[] = [];
slashes
.reduce((rows: Slash[], [era, slashes]): Slash[] => {
return slashes.reduce((rows: Slash[], slash): Slash[] => {
const totalOther = slash.others.reduce((total: BN, [, value]): BN => {
return total.add(value);
}, new BN(0));
const isMine = ownStashes.some(({ stashId }): boolean => {
return slash.validator.eq(stashId) || slash.others.some(([nominatorId]) => nominatorId.eq(stashId));
});
rows.push({ era, isMine, slash, total: slash.own.add(totalOther), totalOther });
return rows;
}, rows);
}, [])
.forEach((slash): void => {
let slashEra = slashEras.find(({ era }) => era.eq(slash.era));
if (!slashEra) {
slashEra = {
era: slash.era,
nominators: [],
payout: new BN(0),
reporters: [],
slashes: [],
total: new BN(0),
validators: []
};
slashEras.push(slashEra);
}
slashEra.payout.iadd(slash.slash.payout);
slashEra.total.iadd(slash.total);
slashEra.slashes.push(slash);
const validatorId = slash.slash.validator.toString();
if (!slashEra.validators.includes(validatorId)) {
slashEra.validators.push(validatorId);
}
slash.slash.others.forEach(([accountId]): void => {
const nominatorId = accountId.toString();
if (slashEra && !slashEra.nominators.includes(nominatorId)) {
slashEra.nominators.push(nominatorId);
}
});
slash.slash.reporters.forEach((accountId): void => {
const reporterId = accountId.toString();
if (slashEra && !slashEra.reporters.includes(reporterId)) {
slashEra.reporters.push(reporterId);
}
});
});
return slashEras.sort((a, b) => b.era.cmp(a.era));
}
Example #3
Source File: useAvailableSlashes.ts From crust-apps with Apache License 2.0 | 5 votes |
export function useAvailableSlashes (): [BN, UnappliedSlash[]][] {
const { api } = useApi();
const indexes = useCall<DeriveSessionIndexes>(api.derive.session?.indexes);
const earliestSlash = useCall<Option<EraIndex>>(api.query.staking?.earliestUnappliedSlash);
const mountedRef = useIsMountedRef();
const [slashes, setSlashes] = useState<[BN, UnappliedSlash[]][]>([]);
useEffect((): Unsub => {
let unsub: Unsub | undefined;
if (mountedRef.current && indexes && earliestSlash && earliestSlash.isSome) {
const from = earliestSlash.unwrap();
const range: BN[] = [];
let start = new BN(from);
// any <= activeEra (we include activeEra since slashes are immediately reflected)
while (start.lte(indexes.activeEra)) {
range.push(start);
start = start.add(BN_ONE);
}
if (range.length) {
(async (): Promise<void> => {
unsub = await api.query.staking.unappliedSlashes.multi<Vec<UnappliedSlash>>(range, (values): void => {
mountedRef.current && setSlashes(
values
.map((value, index): [BN, UnappliedSlash[]] => [from.addn(index), value])
.filter(([, slashes]) => slashes.length)
);
});
})().catch(console.error);
}
}
return (): void => {
unsub && unsub();
};
}, [api, earliestSlash, indexes, mountedRef]);
return slashes;
}
Example #4
Source File: useAvailableSlashes.ts From subscan-multisig-react with Apache License 2.0 | 5 votes |
export function useAvailableSlashes(): [BN, UnappliedSlash[]][] {
const { api } = useApi();
const indexes = useCall<DeriveSessionIndexes>(api.derive.session?.indexes);
const earliestSlash = useCall<Option<EraIndex>>(api.query.staking?.earliestUnappliedSlash);
const mountedRef = useIsMountedRef();
const [slashes, setSlashes] = useState<[BN, UnappliedSlash[]][]>([]);
// eslint-disable-next-line
useEffect((): Unsub => {
let unsub: Unsub | undefined;
if (mountedRef.current && indexes && earliestSlash && earliestSlash.isSome) {
const from = earliestSlash.unwrap();
const range: BN[] = [];
let start = new BN(from);
// any <= activeEra (we include activeEra since slashes are immediately reflected)
while (start.lte(indexes.activeEra)) {
range.push(start);
start = start.add(BN_ONE);
}
if (range.length) {
(async (): Promise<void> => {
unsub = await api.query.staking.unappliedSlashes.multi<Vec<UnappliedSlash>>(range, (values): void => {
// eslint-disable-next-line
mountedRef.current &&
setSlashes(
values
.map((value, index): [BN, UnappliedSlash[]] => [from.addn(index), value])
// eslint-disable-next-line
.filter(([, slashes]) => slashes.length)
);
});
})().catch(console.error);
}
}
return (): void => {
// eslint-disable-next-line
unsub && unsub();
};
}, [api, earliestSlash, indexes, mountedRef]);
return slashes;
}