diff --git a/doc/icon_chainscore_api.md b/doc/icon_chainscore_api.md index 547ffb5ac..2cd78c9c9 100644 --- a/doc/icon_chainscore_api.md +++ b/doc/icon_chainscore_api.md @@ -47,6 +47,7 @@ + [getPRepStatsOf](#getprepstatsof) + [getSlashingRates](#getslashingrates) + [getMinimumBond](#getminimumbond) + + [getPRepCountConfig](#getprepcountconfig) * Writable APIs + [setStake](#setstake) + [setDelegation](#setdelegation) @@ -67,6 +68,8 @@ + [setCommissionRate](#setcommissionrate) + [setSlashingRates](#setslashingrates) + [requestUnjail](#requestunjail) + + [setPRepCountConfig](#setprepcountconfig) + + [handleDoubleSignReport](#handledoublesignreport) - [BTP](#btp) * ReadOnly APIs + [getBTPNetworkTypeID](#getbtpnetworktypeid) @@ -903,37 +906,53 @@ def getPRepStatsOf(address: Address) -> dict: ### getSlashingRates -Returns slashing rates for given `names` +Returns slashing rates for all penalties ``` -def getSlashingRates(names: List[str]) -> dict: +def getSlashingRates() -> dict: ``` -*Parameters:* +*Returns:* + +| Key | Type | Description | +|:-----------------------------|:-----|:-------------------------------------------------------| +| prepDisqualification | int | slashing rate for prepDisqualification penalty | +| accumulatedValidationFailure | int | slashing rate for accumulatedValidationFailure penalty | +| validationFailure | int | slashing rate for validationFailure penalty | +| missedNetworkProposalVote | int | slashing rate for missedNetworkProposalVote penalty | +| doubleSign | int | slashing rate for doubleSign penalty | + +*Revision:* 24 ~ + +### getMinimumBond -| Name | Type | Description | -|:------|:------------|:----------------------------------------------------------------| -| names | List\[str\] | list of names to query. Pass an empty list to query all values. | +Returns the minimum amount of bond required for a P-Rep to earn the minimum wage + +``` +def getMinimumBond() -> int: +``` *Returns:* -| Key | Type | Description | -|:--------------------------------|:-----|:-------------------------------------| -| ${[PENALTY_TYPE](#penaltytype)} | int | slashing rate value from 0 to 10,000 | +* the minimum amount of bond in loop unit *Revision:* 24 ~ -### getMinimumBond +### getPRepCountConfig -Returns the minimum bond amount required to earn the minimum wage +Returns the information on P-Rep count configuration ``` -def getMinimumBond() -> int: +def getPRepCountConfig() -> dict: ``` *Returns:* -* the minimum bond amount +| Key | Type | Description | +|:------|:-----|:----------------------------| +| main | int | number of main P-Reps | +| sub | int | number of sub P-Reps | +| extra | int | number of extra main P-Reps | *Revision:* 24 ~ @@ -1286,7 +1305,7 @@ def setRewardFundAllocation2(values: List[NamedValue]) -> None: | values | List\[[NamedValue](#namedvalue)\] | available `name` is [REWARD_FUND_ALLOCATION_KEY](#rewardfundallocationkey)
sum of values must be 10,000 | *Event Log:* -- from revision 24 + ``` @eventlog(indexed=0) def RewardFundAllocationSet(type: str, value: int) -> None: @@ -1295,13 +1314,15 @@ def RewardFundAllocationSet(type: str, value: int) -> None: | Name | Type | Description | |:------|:-----|:---------------------------------------------------------------------------| | name | str | available `name` is [REWARD_FUND_ALLOCATION_KEY](#rewardfundallocationkey) | -| value | int | allocation value | +| value | int | allocation value ranging from 0 (0%) ~ 10,000 (100%) | *Revision:* 24 ~ ### setMinimumBond -Updates the minimum amount of bond that can earn minimum wage. Governance only. +* Specifies the minimum amount of bond required for a P-Rep to earn the minimum wage +* Governance Only +* It is assumed to 0 if not specified. ``` def setMinimumBond(bond: int) -> None: @@ -1309,28 +1330,29 @@ def setMinimumBond(bond: int) -> None: *Parameters:* -| Name | Type | Description | -|:----------------------------------------------------------|:-----|:-------------------------------------------------------------------------------------| -| ${[REWARD_FUND_ALLOCATION_KEY](#rewardfundallocationkey)} | int | rate allocated to the reward fund. (0 ~ 10,000).
sum of all rates must be 10,000 | +| Name | Type | Description | +|:-----|:-----|:------------------------------------| +| bond | int | minimum amount of bond in loop unit | *Event Log:* ``` @eventlog(indexed=0) -def MinimumBondChanged(bond: int) -> None: +def MinimumBondSet(bond: int) -> None: ``` -| Name | Type | Description | -|:-----|:-----|:--------------------| -| bond | int | minimum bond amount | +| Name | Type | Description | +|:-----|:-----|:------------------------------------| +| bond | int | minimum amount of bond in loop unit | *Revision:* 24 ~ ### initCommissionRate -Initializes commission rate parameters of the P-Rep. - -- After initialization, `maxCommissionRate` and `maxCommissionChangeRate` can't be changed +* Initializes commission rate parameters of the P-Rep. +* Called by a P-Rep owner +* After initialization, `maxCommissionRate` and `maxCommissionChangeRate` can't be changed. +* All rates are assumed to be 0% if not initialized. ``` def initCommissionRate(rate: int, maxRate: int, maxChangeRate: int) -> None: @@ -1348,20 +1370,24 @@ def initCommissionRate(rate: int, maxRate: int, maxChangeRate: int) -> None: ``` @eventlog(indexed=1) -def CommissionRateInitialized(address: Address, rate: int, maxRate: int, maxChangeRate: int) -> None: +def CommissionRateInitialized(owner: Address, rate: int, maxRate: int, maxChangeRate: int) -> None: ``` -| Name | Type | Description | -|:--------------|:-----|:----------------------------------------------------------| -| rate | int | commission rate | -| maxRate | int | maximum commission rate that P-Rep can configure | -| maxChangeRate | int | maximum rate of change of `commission rate` in one `Term` | +| Name | Type | Description | +|:--------------|:--------|:----------------------------------------------------------| +| owner | Address | address of P-Rep owner | +| rate | int | commission rate | +| maxRate | int | maximum commission rate that P-Rep can configure | +| maxChangeRate | int | maximum rate of change of `commission rate` in one `Term` | *Revision:* 24 ~ ### setCommissionRate -Updates commission rate of the P-Rep. +* Updates commission rate of the P-Rep. +* Called by a P-Rep owner +* New commission rate will take effect next term. +* No limit for reducing the rate ``` def setCommissionRate(rate: int) -> None: @@ -1373,16 +1399,21 @@ def setCommissionRate(rate: int) -> None: |:-----|:-----|:----------------| | rate | int | commission rate | +* 0 <= rate <= 10,000 +* rate <= maxCommissionRate +* rate <= oldRate + maxCommissionChangeRate + *Event Log:* ``` @eventlog(indexed=1) -def CommissionRateChanged(address: Address, rate: int) -> None: +def CommissionRateSet(owner: Address, rate: int) -> None: ``` -| Name | Type | Description | -|:-----|:-----|:----------------| -| rate | int | commission rate | +| Name | Type | Description | +|:------|:--------|:---------------------------| +| owner | Address | address of the P-Rep owner | +| rate | int | commission rate | *Revision:* 24 ~ @@ -1391,32 +1422,40 @@ def CommissionRateChanged(address: Address, rate: int) -> None: Updates slashing rates of penalties. Governance only. ``` -def setSlashingRates(rate: int) -> None: +def setSlashingRates(rates: List[NamedValue]) -> None: ``` *Parameters:* -| Name | Type | Description | -|:------|:----------------------------------|:-----------------------------------------------------------------------------------| -| rates | List\[[NamedValue](#namedvalue)\] | available `name` is [PENALTY_TYPE](#penaltytype)
range of `value` is 0 ~ 10,000 | +| Name | Type | Description | +|:------|:----------------------------------|:--------------------------------------------| +| rates | List\[[NamedValue](#namedvalue)\] | list of each penalty name and its rate pair | + +Fields in [NamedValue](#namedvalue) + +| Field | Type | Description | +|:------|:-----|:------------------------------------------------------------------| +| name | str | penalty name. Refer to [PENALTY_TYPE](#penaltytype) section | +| value | int | slashingRate for each penalty ranging from 0 (0%) ~ 10,000 (100%) | *Event Log:* ``` @eventlog(indexed=0) -def SlashingRateChangedV2(type: str, rate: int) -> None: +def SlashingRateSet(penaltyName: str, rate: int) -> None: ``` -| Name | Type | Description | -|:-----|:-----|:--------------| -| type | str | penalty type | -| rate | int | slashing rate | +| Name | Type | Description | +|:------------|:-----|:------------------------------------------------------------| +| penaltyName | str | penalty name. Refer to [PENALTY_TYPE](#penaltytype) section | +| rate | int | slashing rate ranging from 0 ~ 10,000 | *Revision:* 24 ~ ### requestUnjail -Requests unjail +* Requests unjail +* Called by a PRep owner ``` def requestUnjail() -> None: @@ -1424,6 +1463,75 @@ def requestUnjail() -> None: *Revision:* 25 ~ +### setPRepCountConfig + +* Configures the numbers of main, sub and extra main P-Reps +* Governance Only + +``` +def setPRepCountConfig(counts List[NamedValue]) -> None: +``` + +*Parameters:* + +| Name | Type | Description | +|:-------|:----------------------------------|:--------------------------------------| +| counts | List\[[NamedValue](#namedvalue)\] | list of P-Rep type and its count pair | + +Fields in [NamedValue](#namedvalue) + +| Field | Type | Description | +|:------|:-----|:-------------------------------------------| +| name | str | available name: `main`, `sub`, `extra` | +| value | int | number of P-Reps specified by `name` field | + +*Event Log:* + +``` +@eventlog(indexed=0) +def PRepCountConfigSet(main: int, sub: int, extra: int) +``` + +| Name | Type | Description | +|:------|:-----|:----------------------------| +| main | int | number of main P-Reps | +| sub | int | number of sub P-Reps | +| extra | int | number of extra main P-Reps | + +*Revision:* 24 ~ + +### handleDoubleSignReport + +* Reports DoubleSign event +* System Only + +``` +def handleDoubleSignReport(type string, blockHeight int, signer Address) -> None: +``` + +*Parameters:* + +| Name | Type | Description | +|:------------|:--------|:----------------------------------------------------------| +| type | string | doubleSign type: `proposal`, `vote` | +| blockHeight | int | blockHeight when the doubleSign event occurred | +| signer | Address | address of the validator that caused the doubleSign event | + +*Event Log:* + +``` +@eventlog(indexed=1) +def DoubleSignReported(owner Address, blockHeight int, type: str) +``` + +| Name | Type | Description | +|:------------|:--------|:-----------------------------------------------------------------------| +| owner | Address | address of the P-Rep owner whose validator caused the doubleSign event | +| blockHeight | int | blockHeight when the doubleSign event occurred | +| type | str | `proposal`, `vote` | + +*Revision:* 25 ~ + # BTP ## ReadOnly APIs @@ -1783,13 +1891,13 @@ def PenaltyImposed(address: Address, status: int, penalty_type: int) -> None: ## PENALTY_TYPE -| value | revision | Description | -|:-------------------------------|:---------|:-----------------------------------------------| -| "disqualification" | 6 ~ | P-Rep disqualification penalty | -| "accumulatedValidationFailure" | 6 ~ | accumulated block validation failure penalty | -| "validationFailure" | 6 ~ | block validation failure penalty | -| "missedNetworkProposalVote" | 6 ~ | missed Network Proposal vote penalty | -| "doubleVote" | 25 ~ | submit multiple votes to same height and round | +| id | name | revision | Description | +|:---|:-------------------------------|:---------|:-----------------------------------------------| +| 1 | "prepDisqualification" | 6 ~ | P-Rep disqualification penalty | +| 2 | "accumulatedValidationFailure" | 6 ~ | accumulated block validation failure penalty | +| 3 | "validationFailure" | 6 ~ | block validation failure penalty | +| 4 | "missedNetworkProposalVote" | 6 ~ | missed Network Proposal vote penalty | +| 5 | "doubleSign" | 25 ~ | submit multiple votes to same height and round | ## NETWORK_SCORE_TYPE