Skip to content

Commit ce91de8

Browse files
authored
Merge pull request #401 from Concordium/release/web-sdk/9
Release/web sdk/9
2 parents 2f051f1 + 701a947 commit ce91de8

File tree

16 files changed

+482
-23
lines changed

16 files changed

+482
-23
lines changed

deps/concordium-base

Submodule concordium-base updated 109 files

examples/nodejs/client/getAccountInfo.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,9 @@ const client = new ConcordiumGRPCNodeClient(address, Number(port), credentials.c
6464
if (accountInfo.type === AccountInfoType.Delegator) {
6565
console.log('Delegated stake amount:', accountInfo.accountDelegation.stakedAmount);
6666
}
67+
68+
if (accountInfo.type === AccountInfoType.Baker) {
69+
console.log('Validator pool info:', accountInfo.accountBaker);
70+
}
6771
// #endregion documentation-snippet
6872
})();

examples/nodejs/client/getPoolInfo.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,5 +65,7 @@ const client = new ConcordiumGRPCNodeClient(address, Number(port), credentials.c
6565
);
6666
console.log('Total capital in CCD of ALL pools:', CcdAmount.toCcd(bakerPool.allPoolTotalCapital));
6767
console.log('Pool commision rates:', bakerPool.poolInfo?.commissionRates);
68+
console.log('Is suspended:', bakerPool.isSuspended);
69+
console.log('Current payday status:', bakerPool.currentPaydayStatus);
6870
// #endregion documentation-snippet
6971
})();

examples/nodejs/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"devDependencies": {
2121
"@types/node": "^20.12.13",
2222
"eslint": "8",
23-
"ts-node": "10.9",
23+
"tsx": "^4.19.2",
2424
"typescript": "^5.2.2"
2525
},
2626
"scripts": {
@@ -30,6 +30,6 @@
3030
"fmt": "yarn prettier --write",
3131
"fmt-check": "yarn prettier --check",
3232
"build": "tsc --noEmit",
33-
"run-example": "ts-node"
33+
"run-example": "tsx"
3434
}
3535
}

examples/reactnative/ios/Podfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -716,4 +716,4 @@ SPEC CHECKSUMS:
716716

717717
PODFILE CHECKSUM: c70448f9d8b13c40c47391af88ee9f69ffe85d63
718718

719-
COCOAPODS: 1.15.2
719+
COCOAPODS: 1.16.2

packages/sdk/CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,20 @@
22

33
## Unreleased
44

5+
## 9.0.0
6+
7+
### Breaking changes
8+
9+
- Protocol version 8:
10+
- Add `isSuspended` field to `AccountBakerDetails` and `BakerPoolStatusDetails`.
11+
- Add `BakerSuspendedEvent` and `BakerResumedEvent` to `BakerEvent` union type.
12+
- Add `BlockSpecialEventValidatorSuspended` and `BlockSpecialEventValidatorPrimedForSuspension` to `BlockSpecialEvent` union type.
13+
- Add `PendingValidatorScoreUpdate` to `UpdateInstructionPayload` union type.
14+
- Add `ChainParametersV3` to `ChainParameters` union type.
15+
- Add `isPrimedForSuspension` and `missedRounds` fields to `CurrentPaydayBakerPoolStatus`.
16+
- Add suspended field to the `ConfigureBakerPayload`.
17+
- Add `validatorScoreParameters` to `NextUpdateSequenceNumbers`.
18+
519
## 8.1.1
620

721
### Fixed

packages/sdk/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@concordium/web-sdk",
3-
"version": "8.1.1",
3+
"version": "9.0.0",
44
"license": "Apache-2.0",
55
"engines": {
66
"node": ">=16"

packages/sdk/src/grpc/translation.ts

Lines changed: 64 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ function trOpenStatus(openStatus: v2.OpenStatus | undefined): v1.OpenStatusText
215215

216216
function trBaker(baker: v2.AccountStakingInfo_Baker): v1.AccountBakerDetails {
217217
const bakerInfo = baker.bakerInfo;
218+
const isSuspended = baker.isSuspended;
218219

219220
const v0: v1.AccountBakerDetails = {
220221
version: 0,
@@ -228,6 +229,7 @@ function trBaker(baker: v2.AccountStakingInfo_Baker): v1.AccountBakerDetails {
228229
...(baker.pendingChange && {
229230
pendingChange: trPendingChange(baker.pendingChange),
230231
}),
232+
isSuspended,
231233
};
232234

233235
if (baker.poolInfo === undefined) {
@@ -324,6 +326,8 @@ function transPaydayStatus(status: v2.PoolCurrentPaydayInfo): v1.CurrentPaydayBa
324326
bakerEquityCapital: CcdAmount.fromProto(unwrap(status.bakerEquityCapital)),
325327
delegatedCapital: CcdAmount.fromProto(unwrap(status.delegatedCapital)),
326328
commissionRates: trCommissionRates(status.commissionRates),
329+
isPrimedForSuspension: status.isPrimedForSuspension ?? false,
330+
missedRounds: status.missedRounds ?? 0n,
327331
};
328332
}
329333

@@ -499,7 +503,7 @@ function trChainParametersV1(params: v2.ChainParametersV1): v1.ChainParametersV1
499503
};
500504
}
501505

502-
function trChainParametersV2(params: v2.ChainParametersV2): v1.ChainParametersV2 {
506+
function trChainParametersV2(params: v2.ChainParametersV2 | v2.ChainParametersV3): v1.ChainParametersV2 {
503507
const common = translateChainParametersCommon(params);
504508
const commonRewardParameters = translateRewardParametersCommon(params);
505509

@@ -548,8 +552,22 @@ function trChainParametersV2(params: v2.ChainParametersV2): v1.ChainParametersV2
548552
};
549553
}
550554

555+
function trChainParametersV3(params: v2.ChainParametersV3): v1.ChainParametersV3 {
556+
const { version, ...common } = trChainParametersV2(params);
557+
return {
558+
...common,
559+
version: 3,
560+
validatorScoreParameters: {
561+
maxMissedRounds: unwrap(params.validatorScoreParameters?.maximumMissedRounds),
562+
},
563+
};
564+
}
565+
551566
export function blockChainParameters(params: v2.ChainParameters): v1.ChainParameters {
552567
switch (params.parameters.oneofKind) {
568+
case 'v3': {
569+
return trChainParametersV3(params.parameters.v3);
570+
}
553571
case 'v2': {
554572
return trChainParametersV2(params.parameters.v2);
555573
}
@@ -559,7 +577,7 @@ export function blockChainParameters(params: v2.ChainParameters): v1.ChainParame
559577
case 'v0': {
560578
return trChainParametersV0(params.parameters.v0);
561579
}
562-
default:
580+
case undefined:
563581
throw new Error('Missing chain parameters');
564582
}
565583
}
@@ -578,6 +596,7 @@ export function bakerPoolInfo(info: v2.PoolInfoResponse): v1.BakerPoolStatus {
578596
currentPaydayStatus:
579597
info.currentPaydayInfo !== undefined ? transPaydayStatus(info.currentPaydayInfo) : undefined,
580598
allPoolTotalCapital: CcdAmount.fromProto(unwrap(info.allPoolTotalCapital)),
599+
isSuspended: info.isSuspended ?? false,
581600
};
582601
}
583602

@@ -876,6 +895,18 @@ function trBakerEvent(bakerEvent: v2.BakerEvent, account: AccountAddress.Type):
876895
delegatorId: unwrap(event.delegationRemoved.delegatorId?.id?.value),
877896
};
878897
}
898+
case 'bakerSuspended': {
899+
return {
900+
tag: v1.TransactionEventTag.BakerSuspended,
901+
bakerId: unwrap(event.bakerSuspended.bakerId?.value),
902+
};
903+
}
904+
case 'bakerResumed': {
905+
return {
906+
tag: v1.TransactionEventTag.BakerResumed,
907+
bakerId: unwrap(event.bakerResumed.bakerId?.value),
908+
};
909+
}
879910
case undefined:
880911
throw Error('Unrecognized event type. This should be impossible.');
881912
}
@@ -1436,10 +1467,15 @@ export function trPendingUpdateEffect(pendingUpdate: v2.PendingUpdate): v1.Pendi
14361467
updatePayload: trAuthorizationsV1(effect.level2KeysCpv1),
14371468
},
14381469
};
1470+
case 'validatorScoreParameters':
1471+
return {
1472+
updateType: v1.UpdateType.ValidatorScoreParameters,
1473+
update: {
1474+
maxMissedRounds: effect.validatorScoreParameters.maximumMissedRounds,
1475+
},
1476+
};
14391477
case undefined:
14401478
throw Error('Unexpected missing pending update');
1441-
default:
1442-
throw Error(`Unsupported update: ${effect}`);
14431479
}
14441480
}
14451481

@@ -1502,10 +1538,16 @@ function trUpdatePayload(updatePayload: v2.UpdatePayload | undefined): v1.Update
15021538
update: keyUpdate,
15031539
};
15041540
}
1541+
case 'validatorScoreParametersUpdate': {
1542+
return {
1543+
updateType: v1.UpdateType.ValidatorScoreParameters,
1544+
update: {
1545+
maxMissedRounds: payload.validatorScoreParametersUpdate.maximumMissedRounds,
1546+
},
1547+
};
1548+
}
15051549
case undefined:
15061550
throw new Error('Unexpected missing update payload');
1507-
default:
1508-
throw Error(`Unsupported update payload type: ${payload}`);
15091551
}
15101552
}
15111553

@@ -2190,6 +2232,8 @@ export function nextUpdateSequenceNumbers(nextNums: v2.NextUpdateSequenceNumbers
21902232
minBlockTime: unwrap(nextNums.minBlockTime?.value),
21912233
blockEnergyLimit: unwrap(nextNums.blockEnergyLimit?.value),
21922234
finalizationCommiteeParameters: unwrap(nextNums.finalizationCommitteeParameters?.value),
2235+
// We fall back to be backwards compatible.
2236+
validatorScoreParameters: nextNums.validatorScoreParameters?.value ?? 1n,
21932237
};
21942238
}
21952239

@@ -2408,6 +2452,20 @@ export function blockSpecialEvent(specialEvent: v2.BlockSpecialEvent): v1.BlockS
24082452
...(poolOwner !== undefined && { poolOwner }),
24092453
};
24102454
}
2455+
case 'validatorSuspended': {
2456+
return {
2457+
tag: 'validatorSuspended',
2458+
account: AccountAddress.fromProto(unwrap(event.validatorSuspended.account)),
2459+
bakerId: unwrap(event.validatorSuspended.bakerId?.value),
2460+
};
2461+
}
2462+
case 'validatorPrimedForSuspension': {
2463+
return {
2464+
tag: 'validatorPrimedForSuspension',
2465+
account: AccountAddress.fromProto(unwrap(event.validatorPrimedForSuspension.account)),
2466+
bakerId: unwrap(event.validatorPrimedForSuspension.bakerId?.value),
2467+
};
2468+
}
24112469
case undefined: {
24122470
throw Error('Error translating BlockSpecialEvent: unexpected undefined');
24132471
}

packages/sdk/src/serializationHelpers.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,7 @@ const configureBakerSerializationSpec: SerializationSpec<ConfigureBakerPayload>
357357
transactionFeeCommission: orUndefined(encodeWord32),
358358
bakingRewardCommission: orUndefined(encodeWord32),
359359
finalizationRewardCommission: orUndefined(encodeWord32),
360+
suspended: orUndefined(encodeBool),
360361
};
361362

362363
const getSerializedConfigureBakerBitmap = (payload: ConfigureBakerPayload): Buffer =>

packages/sdk/src/types.ts

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ export type ChainParametersV1 = ChainParametersCommon &
453453
level2Keys: AuthorizationsV1;
454454
};
455455

456-
/** Chain parameters used from protocol version 6 */
456+
/** Chain parameters used in protocol version 6 and 7 */
457457
export type ChainParametersV2 = ChainParametersCommon &
458458
CooldownParametersV1 &
459459
TimeParametersV1 &
@@ -468,8 +468,24 @@ export type ChainParametersV2 = ChainParametersCommon &
468468
level2Keys: AuthorizationsV1;
469469
};
470470

471+
/**
472+
* Validator score parameters. These parameters control the threshold of
473+
* maximal missed rounds before a validator gets suspended.
474+
*/
475+
export interface ValidatorScoreParameters {
476+
/** Maximal number of missed rounds before a validator gets suspended. */
477+
maxMissedRounds: bigint;
478+
}
479+
480+
/** Chain parameters used from protocol version 8 */
481+
export type ChainParametersV3 = Omit<ChainParametersV2, 'version'> & {
482+
version: 3;
483+
/** The current validator score parameters */
484+
validatorScoreParameters: ValidatorScoreParameters;
485+
};
486+
471487
/** Union of all chain parameters across all protocol versions */
472-
export type ChainParameters = ChainParametersV0 | ChainParametersV1 | ChainParametersV2;
488+
export type ChainParameters = ChainParametersV0 | ChainParametersV1 | ChainParametersV2 | ChainParametersV3;
473489

474490
export interface Authorization {
475491
threshold: number;
@@ -875,15 +891,28 @@ export interface CommissionRates {
875891
finalizationCommission: number;
876892
}
877893

894+
/** Information about a baker pool in the current reward period. */
878895
export interface CurrentPaydayBakerPoolStatus {
896+
/** The number of blocks baked in the current reward period. */
879897
blocksBaked: bigint;
898+
/** The number of blocks baked in the current reward period. */
880899
finalizationLive: boolean;
900+
/** The transaction fees accruing to the pool in the current reward period. */
881901
transactionFeesEarned: CcdAmount.Type;
902+
/** The effective stake of the baker in the current reward period. */
882903
effectiveStake: CcdAmount.Type;
904+
/** The lottery power of the baker in the current reward period. */
883905
lotteryPower: number;
906+
/** The effective equity capital of the baker for the current reward period. */
884907
bakerEquityCapital: CcdAmount.Type;
908+
/** The effective delegated capital to the pool for the current reward period. */
885909
delegatedCapital: CcdAmount.Type;
910+
/** The commission rates that apply for the current reward period. */
886911
commissionRates: CommissionRates;
912+
/** A flag indicating whether the pool owner is primed for suspension. Will always be `false` if the protocol version does not support validator suspension. */
913+
isPrimedForSuspension: boolean;
914+
/** The number of missed rounds in the current reward period. Will always be `0n` if the protocol version does not support validator suspension. */
915+
missedRounds: bigint;
887916
}
888917

889918
export enum BakerPoolPendingChangeType {
@@ -963,6 +992,11 @@ export interface BakerPoolStatusDetails {
963992
currentPaydayStatus?: CurrentPaydayBakerPoolStatus;
964993
/** Total capital staked across all pools, including passive delegation. */
965994
allPoolTotalCapital: CcdAmount.Type;
995+
/**
996+
* A flag indicating whether the pool owner is suspended.
997+
* Will always be `false` if the protocol version does not support validator suspension.
998+
*/
999+
isSuspended: boolean;
9661000
}
9671001

9681002
/**
@@ -1029,6 +1063,12 @@ interface AccountBakerDetailsCommon {
10291063
bakerSignatureVerifyKey: string;
10301064
stakedAmount: CcdAmount.Type;
10311065
pendingChange?: StakePendingChange;
1066+
/**
1067+
* A flag indicating whether the validator is currently suspended or not.
1068+
* In protocol versions prior to protocol version 8, this will always be `false`.
1069+
* A suspended validator will not be included in the validator committee the next time it is calculated.
1070+
*/
1071+
isSuspended: boolean;
10321072
}
10331073

10341074
/** Protocol version 1-3. */
@@ -1187,6 +1227,7 @@ export interface NextUpdateSequenceNumbers {
11871227
minBlockTime: bigint;
11881228
blockEnergyLimit: bigint;
11891229
finalizationCommiteeParameters: bigint;
1230+
validatorScoreParameters: bigint;
11901231
}
11911232

11921233
export type BlockFinalizationSummary = BlockFinalizationSummary_None | BlockFinalizationSummary_Record;
@@ -1382,16 +1423,21 @@ export type BakerKeysWithProofs = PublicBakerKeys & BakerKeyProofs;
13821423
export type GenerateBakerKeysOutput = PublicBakerKeys & PrivateBakerKeys & BakerKeyProofs;
13831424

13841425
export interface ConfigureBakerPayload {
1385-
/* stake to bake. if set to 0, this removes the account as a baker */
1426+
/** stake to bake. if set to 0, this removes the account as a baker */
13861427
stake?: CcdAmount.Type;
1387-
/* should earnings from baking be added to staked amount */
1428+
/** should earnings from baking be added to staked amount */
13881429
restakeEarnings?: boolean;
13891430
openForDelegation?: OpenStatus;
13901431
keys?: BakerKeysWithProofs;
13911432
metadataUrl?: UrlString;
13921433
transactionFeeCommission?: number;
13931434
bakingRewardCommission?: number;
13941435
finalizationRewardCommission?: number;
1436+
/**
1437+
* Describes whether the validator should change its suspended status. This field is only from protocol version 8
1438+
* and later.
1439+
*/
1440+
suspended?: boolean;
13951441
}
13961442

13971443
export interface ConfigureDelegationPayload {

0 commit comments

Comments
 (0)