///
import { MethodContext, ImmutableMethodContext, NextValidatorsSetter } from '../../state_machine/types';
import { JSONObject } from '../../types';
export type TokenID = Buffer;
export interface ModuleConfig {
factorSelfStakes: number;
maxLengthName: number;
maxNumberSentStakes: number;
maxNumberPendingUnlocks: number;
failSafeMissedBlocks: number;
failSafeInactiveWindow: number;
punishmentWindowStaking: number;
punishmentWindowSelfStaking: number;
roundLength: number;
minWeightStandby: bigint;
numberActiveValidators: number;
numberStandbyValidators: number;
posTokenID: TokenID;
validatorRegistrationFee: bigint;
maxBFTWeightCap: number;
commissionIncreasePeriod: number;
maxCommissionIncreaseRate: number;
useInvalidBLSKey: boolean;
baseStakeAmount: bigint;
lockingPeriodStaking: number;
lockingPeriodSelfStaking: number;
reportMisbehaviorReward: bigint;
reportMisbehaviorLimitBanned: number;
weightScaleFactor: bigint;
}
export type ModuleConfigJSON = JSONObject;
export type GetConstantsResponse = JSONObject;
export interface PunishmentLockingPeriods {
punishmentWindowStaking: number;
punishmentWindowSelfStaking: number;
lockingPeriodStaking: number;
lockingPeriodSelfStaking: number;
}
export interface RandomMethod {
getRandomBytes(methodContext: ImmutableMethodContext, height: number, numberOfSeeds: number): Promise;
}
export interface ValidatorsMethod {
setValidatorGeneratorKey(methodContext: MethodContext, validatorAddress: Buffer, generatorKey: Buffer): Promise;
registerValidatorKeys(methodContext: MethodContext, validatorAddress: Buffer, blsKey: Buffer, generatorKey: Buffer, proofOfPossession: Buffer): Promise;
registerValidatorWithoutBLSKey(methodContext: MethodContext, validatorAddress: Buffer, generatorKey: Buffer): Promise;
getValidatorKeys(methodContext: ImmutableMethodContext, address: Buffer): Promise;
getGeneratorsBetweenTimestamps(methodContext: ImmutableMethodContext, startTimestamp: number, endTimestamp: number): Promise>;
setValidatorsParams(methodContext: MethodContext, validatorSetter: NextValidatorsSetter, preCommitThreshold: bigint, certificateThreshold: bigint, validators: {
address: Buffer;
bftWeight: bigint;
}[]): Promise;
}
export interface TokenMethod {
lock(methodContext: MethodContext, address: Buffer, module: string, tokenID: TokenID, amount: bigint): Promise;
getAvailableBalance(methodContext: ImmutableMethodContext, address: Buffer, tokenID: TokenID): Promise;
burn(methodContext: MethodContext, address: Buffer, tokenID: Buffer, amount: bigint): Promise;
transfer(methodContext: MethodContext, senderAddress: Buffer, recipientAddress: Buffer, tokenID: TokenID, amount: bigint): Promise;
unlock(methodContext: MethodContext, address: Buffer, module: string, tokenID: TokenID, amount: bigint): Promise;
getLockedAmount(methodContext: ImmutableMethodContext, address: Buffer, tokenID: TokenID, module: string): Promise;
}
export interface FeeMethod {
payFee(methodContext: MethodContext, amount: bigint): void;
}
export interface UnlockingObject {
readonly validatorAddress: Buffer;
readonly amount: bigint;
readonly unstakeHeight: number;
}
export interface UpdateGeneratorKeyParams {
generatorKey: Buffer;
}
export interface ValidatorRegistrationParams {
name: string;
blsKey: Buffer;
proofOfPossession: Buffer;
generatorKey: Buffer;
}
export interface StakeSharingCoefficient {
tokenID: Buffer;
coefficient: Buffer;
}
export interface ValidatorAccount {
name: string;
totalStake: bigint;
selfStake: bigint;
lastGeneratedHeight: number;
isBanned: boolean;
reportMisbehaviorHeights: number[];
consecutiveMissedBlocks: number;
commission: number;
lastCommissionIncreaseHeight: number;
sharingCoefficients: StakeSharingCoefficient[];
}
export type StakerDataJSON = JSONObject;
export interface StakeObject {
validatorAddress: Buffer;
amount: bigint;
sharingCoefficients: StakeSharingCoefficient[];
}
export interface StakerData {
stakes: StakeObject[];
pendingUnlocks: UnlockingObject[];
}
export interface NameStoreData {
validatorAddress: Buffer;
}
export interface StakeTransactionParams {
stakes: StakeObject[];
}
export interface BlockHeaderAssetForPOS {
seedReveal: Buffer;
maxHeightPreviouslyForged: number;
maxHeightPrestaked: number;
}
export interface PomTransactionParams {
header1: Buffer;
header2: Buffer;
}
export interface PomCommandDependencies {
tokenMethod: TokenMethod;
validatorsMethod: ValidatorsMethod;
}
export interface ChangeCommissionParams {
newCommission: number;
}
export interface ValidatorKeys {
generatorKey: Buffer;
blsKey: Buffer;
}
export interface UnlockCommandDependencies {
tokenMethod: TokenMethod;
}
export interface PreviousTimestampData {
timestamp: number;
}
export interface GenesisData {
height: number;
initRounds: number;
initValidators: Buffer[];
}
export interface GenesisStore {
validators: {
address: Buffer;
name: string;
blsKey: Buffer;
proofOfPossession: Buffer;
generatorKey: Buffer;
lastGeneratedHeight: number;
isBanned: boolean;
reportMisbehaviorHeights: number[];
consecutiveMissedBlocks: number;
commission: number;
lastCommissionIncreaseHeight: number;
sharingCoefficients: StakeSharingCoefficient[];
}[];
stakers: {
address: Buffer;
stakes: {
validatorAddress: Buffer;
amount: bigint;
sharingCoefficients: StakeSharingCoefficient[];
}[];
pendingUnlocks: {
validatorAddress: Buffer;
amount: bigint;
unstakeHeight: number;
}[];
}[];
genesisData: {
initRounds: number;
initValidators: Buffer[];
};
}
export interface GetUnlockHeightResponse {
pendingUnlocks: {
validatorAddress: string;
amount: string;
unstakeHeight: number;
expectedUnlockableHeight: number;
unlockable: boolean;
}[];
}
export interface GetPoSTokenIDResponse {
tokenID: string;
}
export interface GetValidatorsByStakeRequest {
limit: number | undefined;
}
export interface GetLockedRewardRequest {
address: string;
tokenID: string;
}
export interface GetLockedRewardResponse {
reward: string;
}
export interface GetClaimableRewardsRequest {
address: string;
}
export interface ClaimableReward {
tokenID: string;
reward: string;
}
export interface GetExpectedSharedRewardsRequest {
validatorAddress: string;
validatorReward: string;
stake: string;
}