Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 1000i100-test
  • 105_gitlab_container_registry
  • cgeek/issue-297-cpu
  • ci_cache
  • debug/podman
  • elois-compose-metrics
  • elois-duniter-storage
  • elois-smoldot
  • feature/dc-dump
  • feature/distance-rule
  • feature/show_milestone
  • fix-252
  • fix_picked_up_file_in_runtime_release
  • gdev-800-tests
  • hugo-release/runtime-701
  • hugo-tmp-dockerfile-cache
  • hugo/195-doc
  • hugo/195-graphql-schema
  • hugo/distance-precompute
  • hugo/endpoint-gossip
  • hugo/tmp-0.9.1
  • master
  • network/gdev-800
  • network/gdev-802
  • network/gdev-803
  • network/gdev-900
  • network/gtest-1000
  • pini-check-password
  • release/client-800.2
  • release/hugo-chainspec-gdev5
  • release/poka-chainspec-gdev5
  • release/poka-chainspec-gdev5-pini-docker
  • release/runtime-100
  • release/runtime-200
  • release/runtime-300
  • release/runtime-400
  • release/runtime-401
  • release/runtime-500
  • release/runtime-600
  • release/runtime-700
  • release/runtime-701
  • release/runtime-800
  • runtime/gtest-1000
  • tests/distance-with-oracle
  • tuxmain/anonymous-tx
  • tuxmain/benchmark-distance
  • tuxmain/fix-change-owner-key
  • update-docker-compose-rpc-squid-names
  • upgradable-multisig
  • gdev-800
  • gdev-800-0.8.0
  • gdev-802
  • gdev-803
  • gdev-900-0.10.0
  • gdev-900-0.10.1
  • gdev-900-0.9.0
  • gdev-900-0.9.1
  • gdev-900-0.9.2
  • gtest-1000
  • gtest-1000-0.11.0
  • gtest-1000-0.11.1
  • runtime-100
  • runtime-101
  • runtime-102
  • runtime-103
  • runtime-104
  • runtime-105
  • runtime-200
  • runtime-201
  • runtime-300
  • runtime-301
  • runtime-302
  • runtime-303
  • runtime-400
  • runtime-401
  • runtime-500
  • runtime-600
  • runtime-700
  • runtime-701
  • runtime-800
  • runtime-800-backup
  • runtime-800-bis
  • runtime-801
  • v0.1.0
  • v0.2.0
  • v0.3.0
  • v0.4.0
  • v0.4.1
88 results

Target

Select target project
  • nodes/rust/duniter-v2s
  • llaq/lc-core-substrate
  • pini-gh/duniter-v2s
  • vincentux/duniter-v2s
  • mildred/duniter-v2s
  • d0p1/duniter-v2s
  • bgallois/duniter-v2s
  • Nicolas80/duniter-v2s
8 results
Select Git revision
  • master
1 result
Show changes
Showing
with 9942 additions and 2 deletions
#!/bin/bash
# Custom startup if a first argument is present and is equal to '--'
# then we just run duniter with the provided arguments (but the '--')
# without applying all the automated configuration below
if [ "$1" = -- ]; then
shift
exec duniter "$@"
fi
# Normal startup
function boolean () {
echo "$1" | sed -E 's/^(true|yes|1)$/true/i'
}
function ternary () {
if [ $(boolean "$1") = true ]; then
echo "$2"
else
echo "$3"
fi
}
# Define chain name at the beginning
# with #274 we could have default given in network branch
DUNITER_CHAIN_NAME="${DUNITER_CHAIN_NAME:-dev}"
case "$DUNITER_CHAIN_NAME" in
dev)
chain=(--dev)
;;
*)
chain=(--chain "$DUNITER_CHAIN_NAME")
;;
esac
# Node name will appear on network
DUNITER_NODE_NAME="${DUNITER_NODE_NAME:-$DUNITER_INSTANCE_NAME}"
if [ -n "$DUNITER_NODE_NAME" ]; then
set -- "$@" --name "$DUNITER_NODE_NAME"
fi
# Path of key file. Should be generated below if not present before starting Duniter
_DUNITER_KEY_FILE=/var/lib/duniter/node.key
set -- "$@" --node-key-file "$_DUNITER_KEY_FILE"
# Generate node.key if not existing (chain name is required)
if [ ! -f "$_DUNITER_KEY_FILE" ]; then
echo "Generating node key file '$_DUNITER_KEY_FILE'..."
duniter key generate-node-key --file "$_DUNITER_KEY_FILE" "${chain[@]}"
else
echo "Node key file '$_DUNITER_KEY_FILE' exists."
fi
# Log peer ID
_DUNITER_PEER_ID="$(duniter key inspect-node-key --file "$_DUNITER_KEY_FILE")"
echo "Node peer ID is '$_DUNITER_PEER_ID'."
# Define public address (with dns, correct port and protocol for instance)
if [ -n "$DUNITER_PUBLIC_ADDR" ]; then
set -- "$@" --public-addr "$DUNITER_PUBLIC_ADDR"
fi
# Define public RPC endpoint (gossiped on the network)
if [ -n "$DUNITER_PUBLIC_RPC" ]; then
set -- "$@" --public-rpc "$DUNITER_PUBLIC_RPC"
fi
# Define public Squid endpoint (gossiped on the network)
if [ -n "$DUNITER_PUBLIC_SQUID" ]; then
set -- "$@" --public-squid "$DUNITER_PUBLIC_SQUID"
fi
# Define public endpoints from JSON file (gossiped on the network)
if [ -n "$DUNITER_PUBLIC_ENDPOINTS" ]; then
set -- "$@" --public-endpoints "$DUNITER_PUBLIC_ENDPOINTS"
fi
# Define listen address (inside docker)
if [ -n "$DUNITER_LISTEN_ADDR" ]; then
set -- "$@" --listen-addr "$DUNITER_LISTEN_ADDR"
fi
DUNITER_RPC_CORS="${DUNITER_RPC_CORS:-all}"
set -- "$@" --rpc-cors "$DUNITER_RPC_CORS"
# In case of validator, unsafe rpc methods are needed (like rotate_key) and should not be exposed publicly
DUNITER_VALIDATOR=$(boolean "${DUNITER_VALIDATOR:-false}")
if [ "$DUNITER_VALIDATOR" = true ]; then
set -- "$@" --rpc-methods Unsafe --validator
fi
DUNITER_DISABLE_PROMETHEUS=$(boolean "${DUNITER_DISABLE_PROMETHEUS:-false}")
if [ "$DUNITER_DISABLE_PROMETHEUS" = true ]; then
set -- "$@" --no-prometheus
fi
DUNITER_DISABLE_TELEMETRY=$(boolean "${DUNITER_DISABLE_TELEMETRY:-false}")
if [ "$DUNITER_DISABLE_TELEMETRY" = true ]; then
set -- "$@" --no-telemetry
fi
# Set pruning profile
DUNITER_PRUNING_PROFILE="${DUNITER_PRUNING_PROFILE:-default}"
case "$DUNITER_PRUNING_PROFILE" in
default)
;;
archive)
set -- "$@" --state-pruning archive --blocks-pruning archive
;;
light)
set -- "$@" --blocks-pruning 14400
;;
*)
echo "ERROR: ignoring unknown DUNITER_PRUNING_PROFILE value '$DUNITER_PRUNING_PROFILE'" >&2
;;
esac
# Set main command
# Since we are inside docker, we can bind to all interfaces.
# User will bind port to host interface or set reverse proxy when needed.
set -- "$@" \
"${chain[@]}" \
-d /var/lib/duniter --unsafe-rpc-external
echo "Starting duniter with parameters:" "$@"
exec duniter "$@"
# Manual for wallet developers
This functional documentation presents how wallets can interact with the blockchain.
It is intended to complete the [runtime calls documentation](./runtime-calls.md) in a runtime-specific way to fit the real needs of wallet developers.
NOTE : a more detailed doc is available at <https://duniter.org/wiki/duniter-v2/doc/>
## Notations
1 ĞD = 100 units
## Account existence
An account exists if and only if it contains at least the existential deposit (`balances.existentialDeposit` = 1 ĞD).
## Become member
Only use `identity` pallet.
1. The account that wants to gain membership needs to exists.
1. Any account that already has membership and respects the identity creation period can create an identity for another account, using `identity.createIdentity`.
1. The account has to confirm its identity with a name, using `identity.confirmIdentity`. The name must be ASCII alphanumeric, punctuation or space characters: `` /^[-!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~a-zA-Z0-9 ]{3,64}$/ `` (additionally, trailing spaces and double spaces are forbidden, as a phishing countermeasure). If the name is already used, the call will fail.
1. 4 different member accounts must certify the account using `cert.addCert`.
1. The distance evaluation must be requested for the pending identity using `distance.requestDistanceEvaluation`.
1. 3 distance sessions later, if the distance rule is respected, identity is validated automatically.
## Change key
A member can request a key change via the `identity.change_onwner_key` call. It needs the following SCALE encoded (see SCALE encoding section below) payload:
- The new owner key payload prefix (rust definition: `b"icok"`)
- the genesis block hash. (rust type `[u8; 32]` (`H256`))
- The identity index (rust type `u64`)
- The old key (rust type `u64`)
This payload must be signed with the new key.
## Revoke an identity
Revoking an identity makes it lose its membership, hence UD creation and governance rights. Other data such as balance will remain.
This feature is useful in case the user has lost their private key since the revocation document can be made in advance.
### Generate the revocation payload
The revocation needs this SCALE encoded (see SCALE encoding section below) payload:
- The revocation payload prefix (rust definition: `b"revo"`)
- The identity index (rust type `u64`)
- the genesis block hash. (rust type `[u8; 32]` (`H256`))
This payload must be signed with the corresponding revocation key.
### Effectively revoke the identity
1. From any origin that can pay the fee, use `identity.revokeIdentity` with the revocation payload.
## SCALE encoding
SCALE codec documentation: https://docs.substrate.io/reference/scale-codec/.
At the end of this documentation you'll find links to SCALE codec implementation for other languages.
# Runtime calls
Calls are categorized according to the dispatch origin they require:
1. **User calls**: the dispatch origin for this kind of call must be signed by
the transactor. This is the only call category that can be submitted with an extrinsic.
1. **Root calls**: This kind of call requires a special origin that can only be invoked
through on-chain governance mechanisms.
1. **Inherent calls**: This kind of call is invoked by the author of the block itself
(usually automatically by the node).
1. **Disabled calls**: These calls can not be called directly, they are reserved for internal use by other runtime calls.
We only document user calls below.
There are **65** user calls from **17** pallets.
## Account - 1
### unlink_identity - 0
<details><summary><code>unlink_identity()</code></summary>
Taking 0.0106 % of a block.
```rust
```
</details>
Unlink the identity associated with the account.
## Balances - 6
### transfer_allow_death - 0
<details><summary><code>transfer_allow_death(dest, value)</code></summary>
Taking 0.0186 % of a block.
```rust
dest: AccountIdLookupOf<T>
value: T::Balance
```
</details>
Transfer some liquid free balance to another account.
`transfer_allow_death` will set the `FreeBalance` of the sender and receiver.
If the sender's account is below the existential deposit as a result
of the transfer, the account will be reaped.
The dispatch origin for this call must be `Signed` by the transactor.
### transfer_keep_alive - 3
<details><summary><code>transfer_keep_alive(dest, value)</code></summary>
Taking 0.0119 % of a block.
```rust
dest: AccountIdLookupOf<T>
value: T::Balance
```
</details>
Same as the [`transfer_allow_death`] call, but with a check that the transfer will not
kill the origin account.
99% of the time you want [`transfer_allow_death`] instead.
[`transfer_allow_death`]: struct.Pallet.html#method.transfer
### transfer_all - 4
<details><summary><code>transfer_all(dest, keep_alive)</code></summary>
Taking 0.0122 % of a block.
```rust
dest: AccountIdLookupOf<T>
keep_alive: bool
```
</details>
Transfer the entire transferable balance from the caller account.
NOTE: This function only attempts to transfer _transferable_ balances. This means that
any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be
transferred by this function. To ensure that this function results in a killed account,
you might need to prepare the account by removing any reference counters, storage
deposits, etc...
The dispatch origin of this call must be Signed.
- `dest`: The recipient of the transfer.
- `keep_alive`: A boolean to determine if the `transfer_all` operation should send all
of the funds the account has, causing the sender account to be killed (false), or
transfer everything except at least the existential deposit, which will guarantee to
keep the sender account alive (true).
## OneshotAccount - 7
### create_oneshot_account - 0
<details><summary><code>create_oneshot_account(dest, value)</code></summary>
Taking 0.0115 % of a block.
```rust
dest: <T::Lookup as StaticLookup>::Source
value: BalanceOf<T>
```
</details>
Create an account that can only be consumed once
- `dest`: The oneshot account to be created.
- `balance`: The balance to be transfered to this oneshot account.
Origin account is kept alive.
### consume_oneshot_account - 1
<details><summary><code>consume_oneshot_account(block_height, dest)</code></summary>
Taking 0.0182 % of a block.
```rust
block_height: BlockNumberFor<T>
dest: Account<<T::Lookup as StaticLookup>::Source>
```
</details>
Consume a oneshot account and transfer its balance to an account
- `block_height`: Must be a recent block number. The limit is `BlockHashCount` in the past. (this is to prevent replay attacks)
- `dest`: The destination account.
- `dest_is_oneshot`: If set to `true`, then a oneshot account is created at `dest`. Else, `dest` has to be an existing account.
### consume_oneshot_account_with_remaining - 2
<details><summary><code>consume_oneshot_account_with_remaining(block_height, dest, remaining_to, balance)</code></summary>
Taking 0.0246 % of a block.
```rust
block_height: BlockNumberFor<T>
dest: Account<<T::Lookup as StaticLookup>::Source>
remaining_to: Account<<T::Lookup as StaticLookup>::Source>
balance: BalanceOf<T>
```
</details>
Consume a oneshot account then transfer some amount to an account,
and the remaining amount to another account.
- `block_height`: Must be a recent block number.
The limit is `BlockHashCount` in the past. (this is to prevent replay attacks)
- `dest`: The destination account.
- `dest_is_oneshot`: If set to `true`, then a oneshot account is created at `dest`. Else, `dest` has to be an existing account.
- `dest2`: The second destination account.
- `dest2_is_oneshot`: If set to `true`, then a oneshot account is created at `dest2`. Else, `dest2` has to be an existing account.
- `balance1`: The amount transfered to `dest`, the leftover being transfered to `dest2`.
## SmithMembers - 10
### invite_smith - 0
<details><summary><code>invite_smith(receiver)</code></summary>
Taking 0.0214 % of a block.
```rust
receiver: T::IdtyIndex
```
</details>
Invite a member of the Web of Trust to attempt becoming a Smith.
### accept_invitation - 1
<details><summary><code>accept_invitation()</code></summary>
Taking 0.0119 % of a block.
```rust
```
</details>
Accept an invitation to become a Smith (must have been invited first).
### certify_smith - 2
<details><summary><code>certify_smith(receiver)</code></summary>
Taking 0.0255 % of a block.
```rust
receiver: T::IdtyIndex
```
</details>
Certify an invited Smith, which can lead the certified to become a Smith.
## AuthorityMembers - 11
### go_offline - 0
<details><summary><code>go_offline()</code></summary>
Taking 0.0152 % of a block.
```rust
```
</details>
Request to leave the set of validators two sessions later.
### go_online - 1
<details><summary><code>go_online()</code></summary>
Taking 0.0172 % of a block.
```rust
```
</details>
Request to join the set of validators two sessions later.
### set_session_keys - 2
<details><summary><code>set_session_keys(keys)</code></summary>
Taking 0.0225 % of a block.
```rust
keys: T::Keys
```
</details>
Declare new session keys to replace current ones.
## Preimage - 22
### note_preimage - 0
<details><summary><code>note_preimage(bytes)</code></summary>
Taking 0.2846 % of a block.
```rust
bytes: Vec<u8>
```
</details>
Register a preimage on-chain.
If the preimage was previously requested, no fees or deposits are taken for providing
the preimage. Otherwise, a deposit is taken proportional to the size of the preimage.
### unnote_preimage - 1
<details><summary><code>unnote_preimage(hash)</code></summary>
Taking 0.0171 % of a block.
```rust
hash: T::Hash
```
</details>
Clear an unrequested preimage from the runtime storage.
If `len` is provided, then it will be a much cheaper operation.
- `hash`: The hash of the preimage to be removed from the store.
- `len`: The length of the preimage of `hash`.
### request_preimage - 2
<details><summary><code>request_preimage(hash)</code></summary>
Taking 0.0121 % of a block.
```rust
hash: T::Hash
```
</details>
Request a preimage be uploaded to the chain without paying any fees or deposits.
If the preimage requests has already been provided on-chain, we unreserve any deposit
a user may have paid, and take the control of the preimage out of their hands.
### unrequest_preimage - 3
<details><summary><code>unrequest_preimage(hash)</code></summary>
Taking 0.0171 % of a block.
```rust
hash: T::Hash
```
</details>
Clear a previously made request for a preimage.
NOTE: THIS MUST NOT BE CALLED ON `hash` MORE TIMES THAN `request_preimage`.
### ensure_updated - 4
<details><summary><code>ensure_updated(hashes)</code></summary>
Taking 17.5344 % of a block.
```rust
hashes: Vec<T::Hash>
```
</details>
Ensure that the a bulk of pre-images is upgraded.
The caller pays no fee if at least 90% of pre-images were successfully updated.
## TechnicalCommittee - 23
### execute - 1
<details><summary><code>execute(proposal, length_bound)</code></summary>
Taking 0.006 % of a block.
```rust
proposal: Box<<T as Config<I>>::Proposal>
length_bound: u32
```
</details>
Dispatch a proposal from a member using the `Member` origin.
Origin must be a member of the collective.
###### Complexity:
- `O(B + M + P)` where:
- `B` is `proposal` size in bytes (length-fee-bounded)
- `M` members-count (code-bounded)
- `P` complexity of dispatching `proposal`
### propose - 2
<details><summary><code>propose(threshold, proposal, length_bound)</code></summary>
No weight available.
```rust
threshold: MemberCount
proposal: Box<<T as Config<I>>::Proposal>
length_bound: u32
```
</details>
Add a new proposal to either be voted on or executed directly.
Requires the sender to be member.
`threshold` determines whether `proposal` is executed directly (`threshold < 2`)
or put up for voting.
###### Complexity
- `O(B + M + P1)` or `O(B + M + P2)` where:
- `B` is `proposal` size in bytes (length-fee-bounded)
- `M` is members-count (code- and governance-bounded)
- branching is influenced by `threshold` where:
- `P1` is proposal execution complexity (`threshold < 2`)
- `P2` is proposals-count (code-bounded) (`threshold >= 2`)
### vote - 3
<details><summary><code>vote(proposal, index, approve)</code></summary>
Taking 0.0121 % of a block.
```rust
proposal: T::Hash
index: ProposalIndex
approve: bool
```
</details>
Add an aye or nay vote for the sender to the given proposal.
Requires the sender to be a member.
Transaction fees will be waived if the member is voting on any particular proposal
for the first time and the call is successful. Subsequent vote changes will charge a
fee.
###### Complexity
- `O(M)` where `M` is members-count (code- and governance-bounded)
### close - 6
<details><summary><code>close(proposal_hash, index, proposal_weight_bound, length_bound)</code></summary>
No weight available.
```rust
proposal_hash: T::Hash
index: ProposalIndex
proposal_weight_bound: Weight
length_bound: u32
```
</details>
Close a vote that is either approved, disapproved or whose voting period has ended.
May be called by any signed account in order to finish voting and close the proposal.
If called before the end of the voting period it will only close the vote if it is
has enough votes to be approved or disapproved.
If called after the end of the voting period abstentions are counted as rejections
unless there is a prime member set and the prime member cast an approval.
If the close operation completes successfully with disapproval, the transaction fee will
be waived. Otherwise execution of the approved operation will be charged to the caller.
+ `proposal_weight_bound`: The maximum amount of weight consumed by executing the closed
proposal.
+ `length_bound`: The upper bound for the length of the proposal in storage. Checked via
`storage::read` so it is `size_of::<u32>() == 4` larger than the pure length.
###### Complexity
- `O(B + M + P1 + P2)` where:
- `B` is `proposal` size in bytes (length-fee-bounded)
- `M` is members-count (code- and governance-bounded)
- `P1` is the complexity of `proposal` preimage.
- `P2` is proposal-count (code-bounded)
### kill - 7
<details><summary><code>kill(proposal_hash)</code></summary>
Taking 0.0229 % of a block.
```rust
proposal_hash: T::Hash
```
</details>
Disapprove the proposal and burn the cost held for storing this proposal.
Parameters:
- `origin`: must be the `KillOrigin`.
- `proposal_hash`: The hash of the proposal that should be killed.
Emits `Killed` and `ProposalCostBurned` if any cost was held for a given proposal.
### release_proposal_cost - 8
<details><summary><code>release_proposal_cost(proposal_hash)</code></summary>
Taking 0.0066 % of a block.
```rust
proposal_hash: T::Hash
```
</details>
Release the cost held for storing a proposal once the given proposal is completed.
If there is no associated cost for the given proposal, this call will have no effect.
Parameters:
- `origin`: must be `Signed` or `Root`.
- `proposal_hash`: The hash of the proposal.
Emits `ProposalCostReleased` if any cost held for a given proposal.
## UniversalDividend - 30
### claim_uds - 0
<details><summary><code>claim_uds()</code></summary>
Taking 0.02 % of a block.
```rust
```
</details>
Claim Universal Dividends.
### transfer_ud - 1
<details><summary><code>transfer_ud(dest, value)</code></summary>
Taking 0.0194 % of a block.
```rust
dest: <T::Lookup as StaticLookup>::Source
value: BalanceOf<T>
```
</details>
Transfer some liquid free balance to another account, in milliUD.
### transfer_ud_keep_alive - 2
<details><summary><code>transfer_ud_keep_alive(dest, value)</code></summary>
Taking 0.0129 % of a block.
```rust
dest: <T::Lookup as StaticLookup>::Source
value: BalanceOf<T>
```
</details>
Transfer some liquid free balance to another account in milliUD and keep the account alive.
## Identity - 41
### create_identity - 0
<details><summary><code>create_identity(owner_key)</code></summary>
Taking 0.0776 % of a block.
```rust
owner_key: T::AccountId
```
</details>
Create an identity for an existing account
- `owner_key`: the public key corresponding to the identity to be created
The origin must be allowed to create an identity.
### confirm_identity - 1
<details><summary><code>confirm_identity(idty_name)</code></summary>
Taking 0.0298 % of a block.
```rust
idty_name: IdtyName
```
</details>
Confirm the creation of an identity and give it a name
- `idty_name`: the name uniquely associated to this identity. Must match the validation rules defined by the runtime.
The identity must have been created using `create_identity` before it can be confirmed.
### change_owner_key - 3
<details><summary><code>change_owner_key(new_key, new_key_sig)</code></summary>
Taking 0.0388 % of a block.
```rust
new_key: T::AccountId
new_key_sig: T::Signature
```
</details>
Change identity owner key.
- `new_key`: the new owner key.
- `new_key_sig`: the signature of the encoded form of `IdtyIndexAccountIdPayload`.
Must be signed by `new_key`.
The origin should be the old identity owner key.
### revoke_identity - 4
<details><summary><code>revoke_identity(idty_index, revocation_key, revocation_sig)</code></summary>
Taking 0.0365 % of a block.
```rust
idty_index: T::IdtyIndex
revocation_key: T::AccountId
revocation_sig: T::Signature
```
</details>
Revoke an identity using a revocation signature
- `idty_index`: the index of the identity to be revoked.
- `revocation_key`: the key used to sign the revocation payload.
- `revocation_sig`: the signature of the encoded form of `RevocationPayload`.
Must be signed by `revocation_key`.
Any signed origin can execute this call.
### revoke_identity_legacy - 9
<details><summary><code>revoke_identity_legacy(revocation_document)</code></summary>
Taking 0.04 % of a block.
```rust
revocation_document: Vec<u8>
```
</details>
Revoke an identity using a legacy (DUBP) revocation document
- `revocation document`: the full-length revocation document, signature included
Any signed origin can execute this call.
### link_account - 8
<details><summary><code>link_account(account_id, payload_sig)</code></summary>
Taking 0.0144 % of a block.
```rust
account_id: T::AccountId
payload_sig: T::Signature
```
</details>
Link an account to an identity.
This function links a specified account to an identity, requiring both the account and the
identity to sign the operation.
- `origin` - The origin of the call, which must have an associated identity index.
- `account_id` - The account ID to link, which must sign the payload.
- `payload_sig` - The signature with the linked identity.
## Certification - 43
### add_cert - 0
<details><summary><code>add_cert(receiver)</code></summary>
Taking 0.0324 % of a block.
```rust
receiver: T::IdtyIndex
```
</details>
Add a new certification.
### renew_cert - 3
<details><summary><code>renew_cert(receiver)</code></summary>
Taking 0.0266 % of a block.
```rust
receiver: T::IdtyIndex
```
</details>
Renew an existing certification.
## Distance - 44
### request_distance_evaluation - 0
<details><summary><code>request_distance_evaluation()</code></summary>
Taking 0.0351 % of a block.
```rust
```
</details>
Request evaluation of the caller's identity distance.
This function allows the caller to request an evaluation of their distance.
A positive evaluation will lead to claiming or renewing membership, while a negative
evaluation will result in slashing for the caller.
### request_distance_evaluation_for - 4
<details><summary><code>request_distance_evaluation_for(target)</code></summary>
Taking 0.036 % of a block.
```rust
target: T::IdtyIndex
```
</details>
Request evaluation of a target identity's distance.
This function allows the caller to request an evaluation of a specific target identity's distance.
This action is only permitted for unvalidated identities.
## AtomicSwap - 50
### create_swap - 0
<details><summary><code>create_swap(target, hashed_proof, action, duration)</code></summary>
No weight available.
```rust
target: T::AccountId
hashed_proof: HashedProof
action: T::SwapAction
duration: BlockNumberFor<T>
```
</details>
Register a new atomic swap, declaring an intention to send funds from origin to target
on the current blockchain. The target can claim the fund using the revealed proof. If
the fund is not claimed after `duration` blocks, then the sender can cancel the swap.
The dispatch origin for this call must be _Signed_.
- `target`: Receiver of the atomic swap.
- `hashed_proof`: The blake2_256 hash of the secret proof.
- `balance`: Funds to be sent from origin.
- `duration`: Locked duration of the atomic swap. For safety reasons, it is recommended
that the revealer uses a shorter duration than the counterparty, to prevent the
situation where the revealer reveals the proof too late around the end block.
### claim_swap - 1
<details><summary><code>claim_swap(proof, action)</code></summary>
No weight available.
```rust
proof: Vec<u8>
action: T::SwapAction
```
</details>
Claim an atomic swap.
The dispatch origin for this call must be _Signed_.
- `proof`: Revealed proof of the claim.
- `action`: Action defined in the swap, it must match the entry in blockchain. Otherwise
the operation fails. This is used for weight calculation.
### cancel_swap - 2
<details><summary><code>cancel_swap(target, hashed_proof)</code></summary>
No weight available.
```rust
target: T::AccountId
hashed_proof: HashedProof
```
</details>
Cancel an atomic swap. Only possible after the originally set duration has passed.
The dispatch origin for this call must be _Signed_.
- `target`: Target of the original atomic swap.
- `hashed_proof`: Hashed proof of the original atomic swap.
## Multisig - 51
### as_multi_threshold_1 - 0
<details><summary><code>as_multi_threshold_1(other_signatories, call)</code></summary>
Taking 0.0051 % of a block.
```rust
other_signatories: Vec<T::AccountId>
call: Box<<T as Config>::RuntimeCall>
```
</details>
Immediately dispatch a multi-signature call using a single approval from the caller.
The dispatch origin for this call must be _Signed_.
- `other_signatories`: The accounts (other than the sender) who are part of the
multi-signature, but do not participate in the approval process.
- `call`: The call to be executed.
Result is equivalent to the dispatched result.
###### Complexity
O(Z + C) where Z is the length of the call and C its execution weight.
### as_multi - 1
<details><summary><code>as_multi(threshold, other_signatories, maybe_timepoint, call, max_weight)</code></summary>
No weight available.
```rust
threshold: u16
other_signatories: Vec<T::AccountId>
maybe_timepoint: Option<Timepoint<BlockNumberFor<T>>>
call: Box<<T as Config>::RuntimeCall>
max_weight: Weight
```
</details>
Register approval for a dispatch to be made from a deterministic composite account if
approved by a total of `threshold - 1` of `other_signatories`.
If there are enough, then dispatch the call.
Payment: `DepositBase` will be reserved if this is the first approval, plus
`threshold` times `DepositFactor`. It is returned once this dispatch happens or
is cancelled.
The dispatch origin for this call must be _Signed_.
- `threshold`: The total number of approvals for this dispatch before it is executed.
- `other_signatories`: The accounts (other than the sender) who can approve this
dispatch. May not be empty.
- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is
not the first approval, then it must be `Some`, with the timepoint (block number and
transaction index) of the first approval transaction.
- `call`: The call to be executed.
NOTE: Unless this is the final approval, you will generally want to use
`approve_as_multi` instead, since it only requires a hash of the call.
Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise
on success, result is `Ok` and the result from the interior call, if it was executed,
may be found in the deposited `MultisigExecuted` event.
###### Complexity
- `O(S + Z + Call)`.
- Up to one balance-reserve or unreserve operation.
- One passthrough operation, one insert, both `O(S)` where `S` is the number of
signatories. `S` is capped by `MaxSignatories`, with weight being proportional.
- One call encode & hash, both of complexity `O(Z)` where `Z` is tx-len.
- One encode & hash, both of complexity `O(S)`.
- Up to one binary search and insert (`O(logS + S)`).
- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove.
- One event.
- The weight of the `call`.
- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit
taken for its lifetime of `DepositBase + threshold * DepositFactor`.
### approve_as_multi - 2
<details><summary><code>approve_as_multi(threshold, other_signatories, maybe_timepoint, call_hash, max_weight)</code></summary>
No weight available.
```rust
threshold: u16
other_signatories: Vec<T::AccountId>
maybe_timepoint: Option<Timepoint<BlockNumberFor<T>>>
call_hash: [u8; 32]
max_weight: Weight
```
</details>
Register approval for a dispatch to be made from a deterministic composite account if
approved by a total of `threshold - 1` of `other_signatories`.
Payment: `DepositBase` will be reserved if this is the first approval, plus
`threshold` times `DepositFactor`. It is returned once this dispatch happens or
is cancelled.
The dispatch origin for this call must be _Signed_.
- `threshold`: The total number of approvals for this dispatch before it is executed.
- `other_signatories`: The accounts (other than the sender) who can approve this
dispatch. May not be empty.
- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is
not the first approval, then it must be `Some`, with the timepoint (block number and
transaction index) of the first approval transaction.
- `call_hash`: The hash of the call to be executed.
NOTE: If this is the final approval, you will want to use `as_multi` instead.
###### Complexity
- `O(S)`.
- Up to one balance-reserve or unreserve operation.
- One passthrough operation, one insert, both `O(S)` where `S` is the number of
signatories. `S` is capped by `MaxSignatories`, with weight being proportional.
- One encode & hash, both of complexity `O(S)`.
- Up to one binary search and insert (`O(logS + S)`).
- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove.
- One event.
- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit
taken for its lifetime of `DepositBase + threshold * DepositFactor`.
### cancel_as_multi - 3
<details><summary><code>cancel_as_multi(threshold, other_signatories, timepoint, call_hash)</code></summary>
Taking 0.0117 % of a block.
```rust
threshold: u16
other_signatories: Vec<T::AccountId>
timepoint: Timepoint<BlockNumberFor<T>>
call_hash: [u8; 32]
```
</details>
Cancel a pre-existing, on-going multisig transaction. Any deposit reserved previously
for this operation will be unreserved on success.
The dispatch origin for this call must be _Signed_.
- `threshold`: The total number of approvals for this dispatch before it is executed.
- `other_signatories`: The accounts (other than the sender) who can approve this
dispatch. May not be empty.
- `timepoint`: The timepoint (block number and transaction index) of the first approval
transaction for this dispatch.
- `call_hash`: The hash of the call to be executed.
###### Complexity
- `O(S)`.
- Up to one balance-reserve or unreserve operation.
- One passthrough operation, one insert, both `O(S)` where `S` is the number of
signatories. `S` is capped by `MaxSignatories`, with weight being proportional.
- One encode & hash, both of complexity `O(S)`.
- One event.
- I/O: 1 read `O(S)`, one remove.
- Storage: removes one item.
## ProvideRandomness - 52
### request - 0
<details><summary><code>request(randomness_type, salt)</code></summary>
Taking 0.0367 % of a block.
```rust
randomness_type: RandomnessType
salt: H256
```
</details>
Request randomness.
## Proxy - 53
### proxy - 0
<details><summary><code>proxy(real, force_proxy_type, call)</code></summary>
Taking 0.0061 % of a block.
```rust
real: AccountIdLookupOf<T>
force_proxy_type: Option<T::ProxyType>
call: Box<<T as Config>::RuntimeCall>
```
</details>
Dispatch the given `call` from an account that the sender is authorised for through
`add_proxy`.
The dispatch origin for this call must be _Signed_.
Parameters:
- `real`: The account that the proxy will make a call on behalf of.
- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call.
- `call`: The call to be made by the `real` account.
### add_proxy - 1
<details><summary><code>add_proxy(delegate, proxy_type, delay)</code></summary>
Taking 0.0114 % of a block.
```rust
delegate: AccountIdLookupOf<T>
proxy_type: T::ProxyType
delay: BlockNumberFor<T>
```
</details>
Register a proxy account for the sender that is able to make calls on its behalf.
The dispatch origin for this call must be _Signed_.
Parameters:
- `proxy`: The account that the `caller` would like to make a proxy.
- `proxy_type`: The permissions allowed for this proxy account.
- `delay`: The announcement period required of the initial proxy. Will generally be
zero.
### remove_proxy - 2
<details><summary><code>remove_proxy(delegate, proxy_type, delay)</code></summary>
Taking 0.0114 % of a block.
```rust
delegate: AccountIdLookupOf<T>
proxy_type: T::ProxyType
delay: BlockNumberFor<T>
```
</details>
Unregister a proxy account for the sender.
The dispatch origin for this call must be _Signed_.
Parameters:
- `proxy`: The account that the `caller` would like to remove as a proxy.
- `proxy_type`: The permissions currently enabled for the removed proxy account.
### remove_proxies - 3
<details><summary><code>remove_proxies()</code></summary>
Taking 0.0113 % of a block.
```rust
```
</details>
Unregister all proxy accounts for the sender.
The dispatch origin for this call must be _Signed_.
WARNING: This may be called on accounts created by `pure`, however if done, then
the unreserved fees will be inaccessible. **All access to this account will be lost.**
### create_pure - 4
<details><summary><code>create_pure(proxy_type, delay, index)</code></summary>
Taking 0.0114 % of a block.
```rust
proxy_type: T::ProxyType
delay: BlockNumberFor<T>
index: u16
```
</details>
Spawn a fresh new account that is guaranteed to be otherwise inaccessible, and
initialize it with a proxy of `proxy_type` for `origin` sender.
Requires a `Signed` origin.
- `proxy_type`: The type of the proxy that the sender will be registered as over the
new account. This will almost always be the most permissive `ProxyType` possible to
allow for maximum flexibility.
- `index`: A disambiguation index, in case this is called multiple times in the same
transaction (e.g. with `utility::batch`). Unless you're using `batch` you probably just
want to use `0`.
- `delay`: The announcement period required of the initial proxy. Will generally be
zero.
Fails with `Duplicate` if this has already been called in this transaction, from the
same sender, with the same parameters.
Fails if there are insufficient funds to pay for deposit.
### kill_pure - 5
<details><summary><code>kill_pure(spawner, proxy_type, index, height, ext_index)</code></summary>
Taking 0.0114 % of a block.
```rust
spawner: AccountIdLookupOf<T>
proxy_type: T::ProxyType
index: u16
height: BlockNumberFor<T>
ext_index: u32
```
</details>
Removes a previously spawned pure proxy.
WARNING: **All access to this account will be lost.** Any funds held in it will be
inaccessible.
Requires a `Signed` origin, and the sender account must have been created by a call to
`pure` with corresponding parameters.
- `spawner`: The account that originally called `pure` to create this account.
- `index`: The disambiguation index originally passed to `pure`. Probably `0`.
- `proxy_type`: The proxy type originally passed to `pure`.
- `height`: The height of the chain when the call to `pure` was processed.
- `ext_index`: The extrinsic index in which the call to `pure` was processed.
Fails with `NoPermission` in case the caller is not a previously created pure
account whose `pure` call has corresponding parameters.
### announce - 6
<details><summary><code>announce(real, call_hash)</code></summary>
Taking 0.0185 % of a block.
```rust
real: AccountIdLookupOf<T>
call_hash: CallHashOf<T>
```
</details>
Publish the hash of a proxy-call that will be made in the future.
This must be called some number of blocks before the corresponding `proxy` is attempted
if the delay associated with the proxy relationship is greater than zero.
No more than `MaxPending` announcements may be made at any one time.
This will take a deposit of `AnnouncementDepositFactor` as well as
`AnnouncementDepositBase` if there are no other pending announcements.
The dispatch origin for this call must be _Signed_ and a proxy of `real`.
Parameters:
- `real`: The account that the proxy will make a call on behalf of.
- `call_hash`: The hash of the call to be made by the `real` account.
### remove_announcement - 7
<details><summary><code>remove_announcement(real, call_hash)</code></summary>
Taking 0.0173 % of a block.
```rust
real: AccountIdLookupOf<T>
call_hash: CallHashOf<T>
```
</details>
Remove a given announcement.
May be called by a proxy account to remove a call they previously announced and return
the deposit.
The dispatch origin for this call must be _Signed_.
Parameters:
- `real`: The account that the proxy will make a call on behalf of.
- `call_hash`: The hash of the call to be made by the `real` account.
### reject_announcement - 8
<details><summary><code>reject_announcement(delegate, call_hash)</code></summary>
Taking 0.0173 % of a block.
```rust
delegate: AccountIdLookupOf<T>
call_hash: CallHashOf<T>
```
</details>
Remove the given announcement of a delegate.
May be called by a target (proxied) account to remove a call that one of their delegates
(`delegate`) has announced they want to execute. The deposit is returned.
The dispatch origin for this call must be _Signed_.
Parameters:
- `delegate`: The account that previously announced the call.
- `call_hash`: The hash of the call to be made.
### proxy_announced - 9
<details><summary><code>proxy_announced(delegate, real, force_proxy_type, call)</code></summary>
Taking 0.0187 % of a block.
```rust
delegate: AccountIdLookupOf<T>
real: AccountIdLookupOf<T>
force_proxy_type: Option<T::ProxyType>
call: Box<<T as Config>::RuntimeCall>
```
</details>
Dispatch the given `call` from an account that the sender is authorized for through
`add_proxy`.
Removes any corresponding announcement(s).
The dispatch origin for this call must be _Signed_.
Parameters:
- `real`: The account that the proxy will make a call on behalf of.
- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call.
- `call`: The call to be made by the `real` account.
## Utility - 54
### batch - 0
<details><summary><code>batch(calls)</code></summary>
Taking 0.1152 % of a block.
```rust
calls: Vec<<T as Config>::RuntimeCall>
```
</details>
Send a batch of dispatch calls.
May be called from any origin except `None`.
- `calls`: The calls to be dispatched from the same origin. The number of call must not
exceed the constant: `batched_calls_limit` (available in constant metadata).
If origin is root then the calls are dispatched without checking origin filter. (This
includes bypassing `frame_system::Config::BaseCallFilter`).
###### Complexity
- O(C) where C is the number of calls to be batched.
This will return `Ok` in all circumstances. To determine the success of the batch, an
event is deposited. If a call failed and the batch was interrupted, then the
`BatchInterrupted` event is deposited, along with the number of successful calls made
and the error of the failed call. If all were successful, then the `BatchCompleted`
event is deposited.
### as_derivative - 1
<details><summary><code>as_derivative(index, call)</code></summary>
Taking 0.0048 % of a block.
```rust
index: u16
call: Box<<T as Config>::RuntimeCall>
```
</details>
Send a call through an indexed pseudonym of the sender.
Filter from origin are passed along. The call will be dispatched with an origin which
use the same filter as the origin of this call.
NOTE: If you need to ensure that any account-based filtering is not honored (i.e.
because you expect `proxy` to have been used prior in the call stack and you do not want
the call restrictions to apply to any sub-accounts), then use `as_multi_threshold_1`
in the Multisig pallet instead.
NOTE: Prior to version *12, this was called `as_limited_sub`.
The dispatch origin for this call must be _Signed_.
### batch_all - 2
<details><summary><code>batch_all(calls)</code></summary>
Taking 0.123 % of a block.
```rust
calls: Vec<<T as Config>::RuntimeCall>
```
</details>
Send a batch of dispatch calls and atomically execute them.
The whole transaction will rollback and fail if any of the calls failed.
May be called from any origin except `None`.
- `calls`: The calls to be dispatched from the same origin. The number of call must not
exceed the constant: `batched_calls_limit` (available in constant metadata).
If origin is root then the calls are dispatched without checking origin filter. (This
includes bypassing `frame_system::Config::BaseCallFilter`).
###### Complexity
- O(C) where C is the number of calls to be batched.
### force_batch - 4
<details><summary><code>force_batch(calls)</code></summary>
Taking 0.1152 % of a block.
```rust
calls: Vec<<T as Config>::RuntimeCall>
```
</details>
Send a batch of dispatch calls.
Unlike `batch`, it allows errors and won't interrupt.
May be called from any origin except `None`.
- `calls`: The calls to be dispatched from the same origin. The number of call must not
exceed the constant: `batched_calls_limit` (available in constant metadata).
If origin is root then the calls are dispatch without checking origin filter. (This
includes bypassing `frame_system::Config::BaseCallFilter`).
###### Complexity
- O(C) where C is the number of calls to be batched.
## Treasury - 55
### spend_local - 3
<details><summary><code>spend_local(amount, beneficiary)</code></summary>
Taking 0.0046 % of a block.
```rust
amount: BalanceOf<T, I>
beneficiary: AccountIdLookupOf<T>
```
</details>
Propose and approve a spend of treasury funds.
###### Dispatch Origin
Must be [`Config::SpendOrigin`] with the `Success` value being at least `amount`.
###### Details
NOTE: For record-keeping purposes, the proposer is deemed to be equivalent to the
beneficiary.
###### Parameters
- `amount`: The amount to be transferred from the treasury to the `beneficiary`.
- `beneficiary`: The destination account for the transfer.
###### Events
Emits [`Event::SpendApproved`] if successful.
### remove_approval - 4
<details><summary><code>remove_approval(proposal_id)</code></summary>
Taking 0.0056 % of a block.
```rust
proposal_id: ProposalIndex
```
</details>
Force a previously approved proposal to be removed from the approval queue.
###### Dispatch Origin
Must be [`Config::RejectOrigin`].
###### Details
The original deposit will no longer be returned.
###### Parameters
- `proposal_id`: The index of a proposal
###### Complexity
- O(A) where `A` is the number of approvals
###### Errors
- [`Error::ProposalNotApproved`]: The `proposal_id` supplied was not found in the
approval queue, i.e., the proposal has not been approved. This could also mean the
proposal does not exist altogether, thus there is no way it would have been approved
in the first place.
### spend - 5
<details><summary><code>spend(asset_kind, amount, beneficiary, valid_from)</code></summary>
Taking 0.0046 % of a block.
```rust
asset_kind: Box<T::AssetKind>
amount: AssetBalanceOf<T, I>
beneficiary: Box<BeneficiaryLookupOf<T, I>>
valid_from: Option<BlockNumberFor<T>>
```
</details>
Propose and approve a spend of treasury funds.
###### Dispatch Origin
Must be [`Config::SpendOrigin`] with the `Success` value being at least
`amount` of `asset_kind` in the native asset. The amount of `asset_kind` is converted
for assertion using the [`Config::BalanceConverter`].
###### Details
Create an approved spend for transferring a specific `amount` of `asset_kind` to a
designated beneficiary. The spend must be claimed using the `payout` dispatchable within
the [`Config::PayoutPeriod`].
###### Parameters
- `asset_kind`: An indicator of the specific asset class to be spent.
- `amount`: The amount to be transferred from the treasury to the `beneficiary`.
- `beneficiary`: The beneficiary of the spend.
- `valid_from`: The block number from which the spend can be claimed. It can refer to
the past if the resulting spend has not yet expired according to the
[`Config::PayoutPeriod`]. If `None`, the spend can be claimed immediately after
approval.
###### Events
Emits [`Event::AssetSpendApproved`] if successful.
### payout - 6
<details><summary><code>payout(index)</code></summary>
Taking 0.0056 % of a block.
```rust
index: SpendIndex
```
</details>
Claim a spend.
###### Dispatch Origin
Must be signed
###### Details
Spends must be claimed within some temporal bounds. A spend may be claimed within one
[`Config::PayoutPeriod`] from the `valid_from` block.
In case of a payout failure, the spend status must be updated with the `check_status`
dispatchable before retrying with the current function.
###### Parameters
- `index`: The spend index.
###### Events
Emits [`Event::Paid`] if successful.
### check_status - 7
<details><summary><code>check_status(index)</code></summary>
Taking 0.0056 % of a block.
```rust
index: SpendIndex
```
</details>
Check the status of the spend and remove it from the storage if processed.
###### Dispatch Origin
Must be signed.
###### Details
The status check is a prerequisite for retrying a failed payout.
If a spend has either succeeded or expired, it is removed from the storage by this
function. In such instances, transaction fees are refunded.
###### Parameters
- `index`: The spend index.
###### Events
Emits [`Event::PaymentFailed`] if the spend payout has failed.
Emits [`Event::SpendProcessed`] if the spend payout has succeed.
### void_spend - 8
<details><summary><code>void_spend(index)</code></summary>
Taking 0.0056 % of a block.
```rust
index: SpendIndex
```
</details>
Void previously approved spend.
###### Dispatch Origin
Must be [`Config::RejectOrigin`].
###### Details
A spend void is only possible if the payout has not been attempted yet.
###### Parameters
- `index`: The spend index.
###### Events
Emits [`Event::AssetSpendVoided`] if successful.
# Runtime Constant
There are **69** constants from **35** pallets.
<ul>
<li>System - 0
<ul>
<li>
<details>
<summary>
<code>BlockWeights</code>
</summary>
Block & extrinsics weights: base values and limits.
```rust
value: frame_system::limits::BlockWeights({ base_block: { ref_time: 431614000, proof_size: 0 }, max_block: { ref_time: 2000000000000, proof_size: 18446744073709551615 }, per_class: { normal: { base_extrinsic: { ref_time: 108157000, proof_size: 0 }, max_extrinsic: Some ({ ref_time: 1299891843000, proof_size: 11990383647911208550 }), max_total: Some ({ ref_time: 1500000000000, proof_size: 13835058055282163711 }), reserved: Some ({ ref_time: 0, proof_size: 0 }) }, operational: { base_extrinsic: { ref_time: 108157000, proof_size: 0 }, max_extrinsic: Some ({ ref_time: 1799891843000, proof_size: 16602069666338596454 }), max_total: Some ({ ref_time: 2000000000000, proof_size: 18446744073709551615 }), reserved: Some ({ ref_time: 500000000000, proof_size: 4611686018427387904 }) }, mandatory: { base_extrinsic: { ref_time: 108157000, proof_size: 0 }, max_extrinsic: None (), max_total: None (), reserved: None () } } })
```
</details>
</li>
<li>
<details>
<summary>
<code>BlockLength</code>
</summary>
The maximum length of a block (in bytes).
```rust
value: frame_system::limits::BlockLength({ max: { normal: 3932160, operational: 5242880, mandatory: 5242880 } })
```
</details>
</li>
<li>
<details>
<summary>
<code>BlockHashCount</code>
</summary>
Maximum number of block number to block hash mappings to keep (oldest pruned first).
```rust
value: U32(2400)
```
</details>
</li>
<li>
<details>
<summary>
<code>DbWeight</code>
</summary>
The weight of runtime database operations the runtime can invoke.
```rust
value: sp_weights::RuntimeDbWeight({ read: 14314000, write: 99642000 })
```
</details>
</li>
<li>
<details>
<summary>
<code>Version</code>
</summary>
Get the chain's in-code version.
```rust
value: sp_version::RuntimeVersion({ spec_name: ("gdev"), impl_name: ("duniter-gdev"), authoring_version: 1, spec_version: 800, impl_version: 1, apis: ((((104, 122, 212, 74, 211, 127, 3, 194), 1), ((203, 202, 37, 227, 159, 20, 35, 135), 2), ((223, 106, 203, 104, 153, 7, 96, 155), 5), ((55, 227, 151, 252, 124, 145, 245, 228), 2), ((64, 254, 58, 212, 1, 248, 149, 154), 6), ((210, 188, 152, 151, 238, 208, 143, 21), 3), ((247, 139, 39, 139, 229, 63, 69, 76), 2), ((171, 60, 5, 114, 41, 31, 235, 139), 1), ((237, 153, 197, 172, 178, 94, 237, 245), 3), ((188, 157, 137, 144, 79, 91, 146, 63), 1), ((55, 200, 187, 19, 80, 169, 162, 168), 4), ((251, 197, 119, 185, 215, 71, 239, 214), 1))), transaction_version: 1, system_version: 1 })
```
</details>
</li>
<li>
<details>
<summary>
<code>SS58Prefix</code>
</summary>
The designated SS58 prefix of this chain.
This replaces the "ss58Format" property declared in the chain spec. Reason is
that the runtime should know about the prefix in order to make use of it as
an identifier of the chain.
```rust
value: U16(42)
```
</details>
</li>
</ul>
</li>
<li>Account - 1
<ul>
</ul>
</li>
<li>Scheduler - 2
<ul>
<li>
<details>
<summary>
<code>MaximumWeight</code>
</summary>
The maximum weight that may be scheduled per block for any dispatchables.
```rust
value: sp_weights::weight_v2::Weight({ ref_time: 1600000000000, proof_size: 14757395258967641292 })
```
</details>
</li>
<li>
<details>
<summary>
<code>MaxScheduledPerBlock</code>
</summary>
The maximum number of scheduled calls in the queue for a single block.
NOTE:
+ Dependent pallets' benchmarks might require a higher limit for the setting. Set a
higher limit under `runtime-benchmarks` feature.
```rust
value: U32(50)
```
</details>
</li>
</ul>
</li>
<li>Babe - 3
<ul>
<li>
<details>
<summary>
<code>EpochDuration</code>
</summary>
The amount of time, in slots, that each epoch should last.
NOTE: Currently it is not possible to change the epoch duration after
the chain has started. Attempting to do so will brick block production.
```rust
value: U64(30)
```
</details>
</li>
<li>
<details>
<summary>
<code>ExpectedBlockTime</code>
</summary>
The expected average block time at which BABE should be creating
blocks. Since BABE is probabilistic it is not trivial to figure out
what the expected average block time should be based on the slot
duration and the security parameter `c` (where `1 - c` represents
the probability of a slot being empty).
```rust
value: U64(6000)
```
</details>
</li>
<li>
<details>
<summary>
<code>MaxAuthorities</code>
</summary>
Max number of authorities allowed
```rust
value: U32(32)
```
</details>
</li>
<li>
<details>
<summary>
<code>MaxNominators</code>
</summary>
The maximum number of nominators for each validator.
```rust
value: U32(64)
```
</details>
</li>
</ul>
</li>
<li>Timestamp - 4
<ul>
<li>
<details>
<summary>
<code>MinimumPeriod</code>
</summary>
The minimum period between blocks.
Be aware that this is different to the *expected* period that the block production
apparatus provides. Your chosen consensus system will generally work with this to
determine a sensible block time. For example, in the Aura pallet it will be double this
period on default settings.
```rust
value: U64(3000)
```
</details>
</li>
</ul>
</li>
<li>Parameters - 5
<ul>
</ul>
</li>
<li>Balances - 6
<ul>
<li>
<details>
<summary>
<code>ExistentialDeposit</code>
</summary>
The minimum amount required to keep an account open. MUST BE GREATER THAN ZERO!
If you *really* need it to be zero, you can enable the feature `insecure_zero_ed` for
this pallet. However, you do so at your own risk: this will open up a major DoS vector.
In case you have multiple sources of provider references, you may also get unexpected
behaviour if you set this to zero.
Bottom line: Do yourself a favour and make it at least one!
```rust
value: U64(100)
```
</details>
</li>
<li>
<details>
<summary>
<code>MaxLocks</code>
</summary>
The maximum number of locks that should exist on an account.
Not strictly enforced, but used for weight estimation.
Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/`
```rust
value: U32(50)
```
</details>
</li>
<li>
<details>
<summary>
<code>MaxReserves</code>
</summary>
The maximum number of named reserves that can exist on an account.
Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/`
```rust
value: U32(5)
```
</details>
</li>
<li>
<details>
<summary>
<code>MaxFreezes</code>
</summary>
The maximum number of individual freeze locks that can exist on an account at any time.
```rust
value: U32(0)
```
</details>
</li>
</ul>
</li>
<li>TransactionPayment - 32
<ul>
<li>
<details>
<summary>
<code>OperationalFeeMultiplier</code>
</summary>
A fee multiplier for `Operational` extrinsics to compute "virtual tip" to boost their
`priority`
This value is multiplied by the `final_fee` to obtain a "virtual tip" that is later
added to a tip component in regular `priority` calculations.
It means that a `Normal` transaction can front-run a similarly-sized `Operational`
extrinsic (with no tip), by including a tip value greater than the virtual tip.
```rust,ignore
// For `Normal`
let priority = priority_calc(tip);
// For `Operational`
let virtual_tip = (inclusion_fee + tip) * OperationalFeeMultiplier;
let priority = priority_calc(tip + virtual_tip);
```
Note that since we use `final_fee` the multiplier applies also to the regular `tip`
sent with the transaction. So, not only does the transaction get a priority bump based
on the `inclusion_fee`, but we also amplify the impact of tips applied to `Operational`
transactions.
```rust
value: U8(5)
```
</details>
</li>
</ul>
</li>
<li>OneshotAccount - 7
<ul>
</ul>
</li>
<li>Quota - 66
<ul>
<li>
<details>
<summary>
<code>RefundAccount</code>
</summary>
Account used to refund fees.
```rust
value: sp_core::crypto::AccountId32(((109, 111, 100, 108, 112, 121, 47, 116, 114, 115, 114, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)))
```
</details>
</li>
</ul>
</li>
<li>SmithMembers - 10
<ul>
<li>
<details>
<summary>
<code>MaxByIssuer</code>
</summary>
Maximum number of active certifications per issuer.
```rust
value: U32(8)
```
</details>
</li>
<li>
<details>
<summary>
<code>MinCertForMembership</code>
</summary>
Minimum number of certifications required to become a Smith.
```rust
value: U32(2)
```
</details>
</li>
<li>
<details>
<summary>
<code>SmithInactivityMaxDuration</code>
</summary>
Maximum duration of inactivity allowed before a Smith is removed.
```rust
value: U32(48)
```
</details>
</li>
</ul>
</li>
<li>AuthorityMembers - 11
<ul>
<li>
<details>
<summary>
<code>MaxAuthorities</code>
</summary>
Maximum number of authorities allowed.
```rust
value: U32(32)
```
</details>
</li>
</ul>
</li>
<li>Authorship - 12
<ul>
</ul>
</li>
<li>Offences - 13
<ul>
</ul>
</li>
<li>Historical - 14
<ul>
</ul>
</li>
<li>Session - 15
<ul>
</ul>
</li>
<li>Grandpa - 16
<ul>
<li>
<details>
<summary>
<code>MaxAuthorities</code>
</summary>
Max Authorities in use
```rust
value: U32(32)
```
</details>
</li>
<li>
<details>
<summary>
<code>MaxNominators</code>
</summary>
The maximum number of nominators for each validator.
```rust
value: U32(64)
```
</details>
</li>
<li>
<details>
<summary>
<code>MaxSetIdSessionEntries</code>
</summary>
The maximum number of entries to keep in the set id to session index mapping.
Since the `SetIdSession` map is only used for validating equivocations this
value should relate to the bonding duration of whatever staking system is
being used (if any). If equivocation handling is not enabled then this value
can be zero.
```rust
value: U64(1000)
```
</details>
</li>
</ul>
</li>
<li>ImOnline - 17
<ul>
<li>
<details>
<summary>
<code>UnsignedPriority</code>
</summary>
A configuration for base priority of unsigned transactions.
This is exposed so that it can be tuned for particular runtime, when
multiple pallets send unsigned transactions.
```rust
value: U64(18446744073709551615)
```
</details>
</li>
</ul>
</li>
<li>AuthorityDiscovery - 18
<ul>
</ul>
</li>
<li>Sudo - 20
<ul>
</ul>
</li>
<li>UpgradeOrigin - 21
<ul>
</ul>
</li>
<li>Preimage - 22
<ul>
</ul>
</li>
<li>TechnicalCommittee - 23
<ul>
<li>
<details>
<summary>
<code>MaxProposalWeight</code>
</summary>
The maximum weight of a dispatch call that can be proposed and executed.
```rust
value: sp_weights::weight_v2::Weight({ ref_time: 1000000000000, proof_size: 9223372036854775807 })
```
</details>
</li>
</ul>
</li>
<li>UniversalDividend - 30
<ul>
<li>
<details>
<summary>
<code>MaxPastReeval</code>
</summary>
Maximum number of past UD revaluations to keep in storage.
```rust
value: U32(160)
```
</details>
</li>
<li>
<details>
<summary>
<code>SquareMoneyGrowthRate</code>
</summary>
Square of the money growth rate per UD reevaluation period.
```rust
value: sp_arithmetic::per_things::Perbill((2381440))
```
</details>
</li>
<li>
<details>
<summary>
<code>UdCreationPeriod</code>
</summary>
Universal dividend creation period in milliseconds.
```rust
value: U64(60000)
```
</details>
</li>
<li>
<details>
<summary>
<code>UdReevalPeriod</code>
</summary>
Universal dividend reevaluation period in milliseconds.
```rust
value: U64(1200000)
```
</details>
</li>
</ul>
</li>
<li>Wot - 40
<ul>
<li>
<details>
<summary>
<code>FirstIssuableOn</code>
</summary>
The block number from which the first certification can be issued.
```rust
value: U32(20)
```
</details>
</li>
<li>
<details>
<summary>
<code>MinCertForMembership</code>
</summary>
The minimum number of certifications required for membership eligibility.
```rust
value: U32(2)
```
</details>
</li>
<li>
<details>
<summary>
<code>MinCertForCreateIdtyRight</code>
</summary>
The minimum number of certifications required to create an identity.
```rust
value: U32(2)
```
</details>
</li>
</ul>
</li>
<li>Identity - 41
<ul>
<li>
<details>
<summary>
<code>ConfirmPeriod</code>
</summary>
The period during which the owner can confirm the new identity.
```rust
value: U32(40)
```
</details>
</li>
<li>
<details>
<summary>
<code>ValidationPeriod</code>
</summary>
The period during which the identity has to be validated to become a member.
```rust
value: U32(876600)
```
</details>
</li>
<li>
<details>
<summary>
<code>AutorevocationPeriod</code>
</summary>
The period before which an identity that lost membership is automatically revoked.
```rust
value: U32(438300)
```
</details>
</li>
<li>
<details>
<summary>
<code>DeletionPeriod</code>
</summary>
The period after which a revoked identity is removed and the keys are freed.
```rust
value: U32(438300)
```
</details>
</li>
<li>
<details>
<summary>
<code>ChangeOwnerKeyPeriod</code>
</summary>
The minimum duration between two owner key changes to prevent identity theft.
```rust
value: U32(100800)
```
</details>
</li>
<li>
<details>
<summary>
<code>IdtyCreationPeriod</code>
</summary>
The minimum duration between the creation of two identities by the same creator.
Should be greater than or equal to the certification period defined in the certification pallet.
```rust
value: U32(50)
```
</details>
</li>
</ul>
</li>
<li>Membership - 42
<ul>
<li>
<details>
<summary>
<code>MembershipPeriod</code>
</summary>
Maximum lifespan of a single membership (in number of blocks).
```rust
value: U32(1000)
```
</details>
</li>
<li>
<details>
<summary>
<code>MembershipRenewalPeriod</code>
</summary>
Minimum delay to wait before renewing membership, i.e., asking for distance evaluation.
```rust
value: U32(1000)
```
</details>
</li>
</ul>
</li>
<li>Certification - 43
<ul>
<li>
<details>
<summary>
<code>CertPeriod</code>
</summary>
The minimum duration (in blocks) between two certifications issued by the same issuer.
```rust
value: U32(15)
```
</details>
</li>
<li>
<details>
<summary>
<code>MaxByIssuer</code>
</summary>
The maximum number of active certifications that can be issued by a single issuer.
```rust
value: U32(10)
```
</details>
</li>
<li>
<details>
<summary>
<code>MinReceivedCertToBeAbleToIssueCert</code>
</summary>
The minimum number of certifications received that an identity must have
to be allowed to issue a certification.
```rust
value: U32(2)
```
</details>
</li>
<li>
<details>
<summary>
<code>ValidityPeriod</code>
</summary>
The duration (in blocks) for which a certification remains valid.
```rust
value: U32(1000)
```
</details>
</li>
</ul>
</li>
<li>Distance - 44
<ul>
<li>
<details>
<summary>
<code>EvaluationPrice</code>
</summary>
The amount reserved during evaluation.
```rust
value: U64(1000)
```
</details>
</li>
<li>
<details>
<summary>
<code>EvaluationPeriod</code>
</summary>
The evaluation period in blocks.
Since the evaluation uses 3 pools, the total evaluation time will be 3 * EvaluationPeriod.
```rust
value: U32(7)
```
</details>
</li>
<li>
<details>
<summary>
<code>MaxRefereeDistance</code>
</summary>
The maximum distance used to define a referee's accessibility.
This value is not used by the runtime but is needed by the client distance oracle.
```rust
value: U32(5)
```
</details>
</li>
<li>
<details>
<summary>
<code>MinAccessibleReferees</code>
</summary>
The minimum ratio of accessible referees required.
```rust
value: sp_arithmetic::per_things::Perbill((800000000))
```
</details>
</li>
</ul>
</li>
<li>AtomicSwap - 50
<ul>
<li>
<details>
<summary>
<code>ProofLimit</code>
</summary>
Limit of proof size.
Atomic swap is only atomic if once the proof is revealed, both parties can submit the
proofs on-chain. If A is the one that generates the proof, then it requires that either:
- A's blockchain has the same proof length limit as B's blockchain.
- Or A's blockchain has shorter proof length limit as B's blockchain.
If B sees A is on a blockchain with larger proof length limit, then it should kindly
refuse to accept the atomic swap request if A generates the proof, and asks that B
generates the proof instead.
```rust
value: U32(1024)
```
</details>
</li>
</ul>
</li>
<li>Multisig - 51
<ul>
<li>
<details>
<summary>
<code>DepositBase</code>
</summary>
The base amount of currency needed to reserve for creating a multisig execution or to
store a dispatch call for later.
This is held for an additional storage item whose value size is
`4 + sizeof((BlockNumber, Balance, AccountId))` bytes and whose key size is
`32 + sizeof(AccountId)` bytes.
```rust
value: U64(100)
```
</details>
</li>
<li>
<details>
<summary>
<code>DepositFactor</code>
</summary>
The amount of currency needed per unit threshold when creating a multisig execution.
This is held for adding 32 bytes more into a pre-existing storage value.
```rust
value: U64(32)
```
</details>
</li>
<li>
<details>
<summary>
<code>MaxSignatories</code>
</summary>
The maximum amount of signatories allowed in the multisig.
```rust
value: U32(10)
```
</details>
</li>
</ul>
</li>
<li>ProvideRandomness - 52
<ul>
<li>
<details>
<summary>
<code>MaxRequests</code>
</summary>
Maximum number of not yet filled requests.
```rust
value: U32(100)
```
</details>
</li>
<li>
<details>
<summary>
<code>RequestPrice</code>
</summary>
The price of a request.
```rust
value: U64(2000)
```
</details>
</li>
</ul>
</li>
<li>Proxy - 53
<ul>
<li>
<details>
<summary>
<code>ProxyDepositBase</code>
</summary>
The base amount of currency needed to reserve for creating a proxy.
This is held for an additional storage item whose value size is
`sizeof(Balance)` bytes and whose key size is `sizeof(AccountId)` bytes.
```rust
value: U64(108)
```
</details>
</li>
<li>
<details>
<summary>
<code>ProxyDepositFactor</code>
</summary>
The amount of currency needed per proxy added.
This is held for adding 32 bytes plus an instance of `ProxyType` more into a
pre-existing storage value. Thus, when configuring `ProxyDepositFactor` one should take
into account `32 + proxy_type.encode().len()` bytes of data.
```rust
value: U64(33)
```
</details>
</li>
<li>
<details>
<summary>
<code>MaxProxies</code>
</summary>
The maximum amount of proxies allowed for a single account.
```rust
value: U32(32)
```
</details>
</li>
<li>
<details>
<summary>
<code>MaxPending</code>
</summary>
The maximum amount of time-delayed announcements that are allowed to be pending.
```rust
value: U32(32)
```
</details>
</li>
<li>
<details>
<summary>
<code>AnnouncementDepositBase</code>
</summary>
The base amount of currency needed to reserve for creating an announcement.
This is held when a new storage item holding a `Balance` is created (typically 16
bytes).
```rust
value: U64(108)
```
</details>
</li>
<li>
<details>
<summary>
<code>AnnouncementDepositFactor</code>
</summary>
The amount of currency needed per announcement made.
This is held for adding an `AccountId`, `Hash` and `BlockNumber` (typically 68 bytes)
into a pre-existing storage value.
```rust
value: U64(66)
```
</details>
</li>
</ul>
</li>
<li>Utility - 54
<ul>
<li>
<details>
<summary>
<code>batched_calls_limit</code>
</summary>
The limit on the number of batched calls.
```rust
value: U32(10922)
```
</details>
</li>
</ul>
</li>
<li>Treasury - 55
<ul>
<li>
<details>
<summary>
<code>SpendPeriod</code>
</summary>
Period between successive spends.
```rust
value: U32(14400)
```
</details>
</li>
<li>
<details>
<summary>
<code>Burn</code>
</summary>
Percentage of spare funds (if any) that are burnt per spend period.
```rust
value: sp_arithmetic::per_things::Permill((0))
```
</details>
</li>
<li>
<details>
<summary>
<code>PalletId</code>
</summary>
The treasury's pallet id, used for deriving its sovereign account ID.
```rust
value: frame_support::PalletId(((112, 121, 47, 116, 114, 115, 114, 121)))
```
</details>
</li>
<li>
<details>
<summary>
<code>MaxApprovals</code>
</summary>
DEPRECATED: associated with `spend_local` call and will be removed in May 2025.
Refer to <https://github.com/paritytech/polkadot-sdk/pull/5961> for migration to `spend`.
The maximum number of approvals that can wait in the spending queue.
NOTE: This parameter is also used within the Bounties Pallet extension if enabled.
```rust
value: U32(100)
```
</details>
</li>
<li>
<details>
<summary>
<code>PayoutPeriod</code>
</summary>
The period during which an approved treasury spend has to be claimed.
```rust
value: U32(10)
```
</details>
</li>
</ul>
</li>
</ul>
# Runtime errors
There are **192** errors from **35** pallets.
<ul>
<li>System - 0
<ul>
<li>
<details>
<summary>
<code>InvalidSpecName</code> - 0</summary>
The name of specification does not match between the current runtime
and the new runtime.
</details>
</li>
<li>
<details>
<summary>
<code>SpecVersionNeedsToIncrease</code> - 1</summary>
The specification version is not allowed to decrease between the current runtime
and the new runtime.
</details>
</li>
<li>
<details>
<summary>
<code>FailedToExtractRuntimeVersion</code> - 2</summary>
Failed to extract the runtime version from the new runtime.
Either calling `Core_version` or decoding `RuntimeVersion` failed.
</details>
</li>
<li>
<details>
<summary>
<code>NonDefaultComposite</code> - 3</summary>
Suicide called when the account has non-default composite data.
</details>
</li>
<li>
<details>
<summary>
<code>NonZeroRefCount</code> - 4</summary>
There is a non-zero reference count preventing the account from being purged.
</details>
</li>
<li>
<details>
<summary>
<code>CallFiltered</code> - 5</summary>
The origin filter prevent the call to be dispatched.
</details>
</li>
<li>
<details>
<summary>
<code>MultiBlockMigrationsOngoing</code> - 6</summary>
A multi-block migration is ongoing and prevents the current code from being replaced.
</details>
</li>
<li>
<details>
<summary>
<code>NothingAuthorized</code> - 7</summary>
No upgrade authorized.
</details>
</li>
<li>
<details>
<summary>
<code>Unauthorized</code> - 8</summary>
The submitted code is not authorized.
</details>
</li>
</ul>
</li>
<li>Account - 1
<ul>
</ul>
</li>
<li>Scheduler - 2
<ul>
<li>
<details>
<summary>
<code>FailedToSchedule</code> - 0</summary>
Failed to schedule a call
</details>
</li>
<li>
<details>
<summary>
<code>NotFound</code> - 1</summary>
Cannot find the scheduled call.
</details>
</li>
<li>
<details>
<summary>
<code>TargetBlockNumberInPast</code> - 2</summary>
Given target block number is in the past.
</details>
</li>
<li>
<details>
<summary>
<code>RescheduleNoChange</code> - 3</summary>
Reschedule failed because it does not change scheduled time.
</details>
</li>
<li>
<details>
<summary>
<code>Named</code> - 4</summary>
Attempt to use a non-named function on a named task.
</details>
</li>
</ul>
</li>
<li>Babe - 3
<ul>
<li>
<details>
<summary>
<code>InvalidEquivocationProof</code> - 0</summary>
An equivocation proof provided as part of an equivocation report is invalid.
</details>
</li>
<li>
<details>
<summary>
<code>InvalidKeyOwnershipProof</code> - 1</summary>
A key ownership proof provided as part of an equivocation report is invalid.
</details>
</li>
<li>
<details>
<summary>
<code>DuplicateOffenceReport</code> - 2</summary>
A given equivocation report is valid but already previously reported.
</details>
</li>
<li>
<details>
<summary>
<code>InvalidConfiguration</code> - 3</summary>
Submitted configuration is invalid.
</details>
</li>
</ul>
</li>
<li>Timestamp - 4
<ul>
</ul>
</li>
<li>Parameters - 5
<ul>
</ul>
</li>
<li>Balances - 6
<ul>
<li>
<details>
<summary>
<code>VestingBalance</code> - 0</summary>
Vesting balance too high to send value.
</details>
</li>
<li>
<details>
<summary>
<code>LiquidityRestrictions</code> - 1</summary>
Account liquidity restrictions prevent withdrawal.
</details>
</li>
<li>
<details>
<summary>
<code>InsufficientBalance</code> - 2</summary>
Balance too low to send value.
</details>
</li>
<li>
<details>
<summary>
<code>ExistentialDeposit</code> - 3</summary>
Value too low to create account due to existential deposit.
</details>
</li>
<li>
<details>
<summary>
<code>Expendability</code> - 4</summary>
Transfer/payment would kill account.
</details>
</li>
<li>
<details>
<summary>
<code>ExistingVestingSchedule</code> - 5</summary>
A vesting schedule already exists for this account.
</details>
</li>
<li>
<details>
<summary>
<code>DeadAccount</code> - 6</summary>
Beneficiary account must pre-exist.
</details>
</li>
<li>
<details>
<summary>
<code>TooManyReserves</code> - 7</summary>
Number of named reserves exceed `MaxReserves`.
</details>
</li>
<li>
<details>
<summary>
<code>TooManyHolds</code> - 8</summary>
Number of holds exceed `VariantCountOf<T::RuntimeHoldReason>`.
</details>
</li>
<li>
<details>
<summary>
<code>TooManyFreezes</code> - 9</summary>
Number of freezes exceed `MaxFreezes`.
</details>
</li>
<li>
<details>
<summary>
<code>IssuanceDeactivated</code> - 10</summary>
The issuance cannot be modified since it is already deactivated.
</details>
</li>
<li>
<details>
<summary>
<code>DeltaZero</code> - 11</summary>
The delta cannot be zero.
</details>
</li>
</ul>
</li>
<li>TransactionPayment - 32
<ul>
</ul>
</li>
<li>OneshotAccount - 7
<ul>
<li>
<details>
<summary>
<code>BlockHeightInFuture</code> - 0</summary>
Block height is in the future.
</details>
</li>
<li>
<details>
<summary>
<code>BlockHeightTooOld</code> - 1</summary>
Block height is too old.
</details>
</li>
<li>
<details>
<summary>
<code>DestAccountNotExist</code> - 2</summary>
Destination account does not exist.
</details>
</li>
<li>
<details>
<summary>
<code>ExistentialDeposit</code> - 3</summary>
Destination account has a balance less than the existential deposit.
</details>
</li>
<li>
<details>
<summary>
<code>InsufficientBalance</code> - 4</summary>
Source account has insufficient balance.
</details>
</li>
<li>
<details>
<summary>
<code>OneshotAccountAlreadyCreated</code> - 5</summary>
Destination oneshot account already exists.
</details>
</li>
<li>
<details>
<summary>
<code>OneshotAccountNotExist</code> - 6</summary>
Source oneshot account does not exist.
</details>
</li>
</ul>
</li>
<li>Quota - 66
<ul>
</ul>
</li>
<li>SmithMembers - 10
<ul>
<li>
<details>
<summary>
<code>OriginMustHaveAnIdentity</code> - 0</summary>
Issuer of anything (invitation, acceptance, certification) must have an identity ID
</details>
</li>
<li>
<details>
<summary>
<code>OriginHasNeverBeenInvited</code> - 1</summary>
Issuer must be known as a potential smith
</details>
</li>
<li>
<details>
<summary>
<code>InvitationIsASmithPrivilege</code> - 2</summary>
Invitation is reseverd to smiths
</details>
</li>
<li>
<details>
<summary>
<code>InvitationIsAOnlineSmithPrivilege</code> - 3</summary>
Invitation is reseverd to online smiths
</details>
</li>
<li>
<details>
<summary>
<code>InvitationAlreadyAccepted</code> - 4</summary>
Invitation must not have been accepted yet
</details>
</li>
<li>
<details>
<summary>
<code>InvitationOfExistingNonExcluded</code> - 5</summary>
Invitation of an already known smith is forbidden except if it has been excluded
</details>
</li>
<li>
<details>
<summary>
<code>InvitationOfNonMember</code> - 6</summary>
Invitation of a non-member (of the WoT) is forbidden
</details>
</li>
<li>
<details>
<summary>
<code>CertificationMustBeAgreed</code> - 7</summary>
Certification cannot be made on someone who has not accepted an invitation
</details>
</li>
<li>
<details>
<summary>
<code>CertificationOnExcludedIsForbidden</code> - 8</summary>
Certification cannot be made on excluded
</details>
</li>
<li>
<details>
<summary>
<code>CertificationIsASmithPrivilege</code> - 9</summary>
Issuer must be a smith
</details>
</li>
<li>
<details>
<summary>
<code>CertificationIsAOnlineSmithPrivilege</code> - 10</summary>
Only online smiths can certify
</details>
</li>
<li>
<details>
<summary>
<code>CertificationOfSelfIsForbidden</code> - 11</summary>
Smith cannot certify itself
</details>
</li>
<li>
<details>
<summary>
<code>CertificationReceiverMustHaveBeenInvited</code> - 12</summary>
Receiver must be invited by another smith
</details>
</li>
<li>
<details>
<summary>
<code>CertificationAlreadyExists</code> - 13</summary>
Receiver must not already have this certification
</details>
</li>
<li>
<details>
<summary>
<code>CertificationStockFullyConsumed</code> - 14</summary>
A smith has a limited stock of certifications
</details>
</li>
</ul>
</li>
<li>AuthorityMembers - 11
<ul>
<li>
<details>
<summary>
<code>AlreadyIncoming</code> - 0</summary>
Member already incoming.
</details>
</li>
<li>
<details>
<summary>
<code>AlreadyOnline</code> - 1</summary>
Member already online.
</details>
</li>
<li>
<details>
<summary>
<code>AlreadyOutgoing</code> - 2</summary>
Member already outgoing.
</details>
</li>
<li>
<details>
<summary>
<code>MemberIdNotFound</code> - 3</summary>
Owner key is invalid as a member.
</details>
</li>
<li>
<details>
<summary>
<code>MemberBlacklisted</code> - 4</summary>
Member is blacklisted.
</details>
</li>
<li>
<details>
<summary>
<code>MemberNotBlacklisted</code> - 5</summary>
Member is not blacklisted.
</details>
</li>
<li>
<details>
<summary>
<code>MemberNotFound</code> - 6</summary>
Member not found.
</details>
</li>
<li>
<details>
<summary>
<code>NotOnlineNorIncoming</code> - 7</summary>
Neither online nor scheduled.
</details>
</li>
<li>
<details>
<summary>
<code>NotMember</code> - 8</summary>
Not member.
</details>
</li>
<li>
<details>
<summary>
<code>SessionKeysNotProvided</code> - 9</summary>
Session keys not provided.
</details>
</li>
<li>
<details>
<summary>
<code>TooManyAuthorities</code> - 10</summary>
Too many authorities.
</details>
</li>
</ul>
</li>
<li>Authorship - 12
<ul>
</ul>
</li>
<li>Offences - 13
<ul>
</ul>
</li>
<li>Historical - 14
<ul>
</ul>
</li>
<li>Session - 15
<ul>
<li>
<details>
<summary>
<code>InvalidProof</code> - 0</summary>
Invalid ownership proof.
</details>
</li>
<li>
<details>
<summary>
<code>NoAssociatedValidatorId</code> - 1</summary>
No associated validator ID for account.
</details>
</li>
<li>
<details>
<summary>
<code>DuplicatedKey</code> - 2</summary>
Registered duplicate key.
</details>
</li>
<li>
<details>
<summary>
<code>NoKeys</code> - 3</summary>
No keys are associated with this account.
</details>
</li>
<li>
<details>
<summary>
<code>NoAccount</code> - 4</summary>
Key setting account is not live, so it's impossible to associate keys.
</details>
</li>
</ul>
</li>
<li>Grandpa - 16
<ul>
<li>
<details>
<summary>
<code>PauseFailed</code> - 0</summary>
Attempt to signal GRANDPA pause when the authority set isn't live
(either paused or already pending pause).
</details>
</li>
<li>
<details>
<summary>
<code>ResumeFailed</code> - 1</summary>
Attempt to signal GRANDPA resume when the authority set isn't paused
(either live or already pending resume).
</details>
</li>
<li>
<details>
<summary>
<code>ChangePending</code> - 2</summary>
Attempt to signal GRANDPA change with one already pending.
</details>
</li>
<li>
<details>
<summary>
<code>TooSoon</code> - 3</summary>
Cannot signal forced change so soon after last.
</details>
</li>
<li>
<details>
<summary>
<code>InvalidKeyOwnershipProof</code> - 4</summary>
A key ownership proof provided as part of an equivocation report is invalid.
</details>
</li>
<li>
<details>
<summary>
<code>InvalidEquivocationProof</code> - 5</summary>
An equivocation proof provided as part of an equivocation report is invalid.
</details>
</li>
<li>
<details>
<summary>
<code>DuplicateOffenceReport</code> - 6</summary>
A given equivocation report is valid but already previously reported.
</details>
</li>
</ul>
</li>
<li>ImOnline - 17
<ul>
<li>
<details>
<summary>
<code>InvalidKey</code> - 0</summary>
Non existent public key.
</details>
</li>
<li>
<details>
<summary>
<code>DuplicatedHeartbeat</code> - 1</summary>
Duplicated heartbeat.
</details>
</li>
</ul>
</li>
<li>AuthorityDiscovery - 18
<ul>
</ul>
</li>
<li>Sudo - 20
<ul>
<li>
<details>
<summary>
<code>RequireSudo</code> - 0</summary>
Sender must be the Sudo account.
</details>
</li>
</ul>
</li>
<li>UpgradeOrigin - 21
<ul>
</ul>
</li>
<li>Preimage - 22
<ul>
<li>
<details>
<summary>
<code>TooBig</code> - 0</summary>
Preimage is too large to store on-chain.
</details>
</li>
<li>
<details>
<summary>
<code>AlreadyNoted</code> - 1</summary>
Preimage has already been noted on-chain.
</details>
</li>
<li>
<details>
<summary>
<code>NotAuthorized</code> - 2</summary>
The user is not authorized to perform this action.
</details>
</li>
<li>
<details>
<summary>
<code>NotNoted</code> - 3</summary>
The preimage cannot be removed since it has not yet been noted.
</details>
</li>
<li>
<details>
<summary>
<code>Requested</code> - 4</summary>
A preimage may not be removed when there are outstanding requests.
</details>
</li>
<li>
<details>
<summary>
<code>NotRequested</code> - 5</summary>
The preimage request cannot be removed since no outstanding requests exist.
</details>
</li>
<li>
<details>
<summary>
<code>TooMany</code> - 6</summary>
More than `MAX_HASH_UPGRADE_BULK_COUNT` hashes were requested to be upgraded at once.
</details>
</li>
<li>
<details>
<summary>
<code>TooFew</code> - 7</summary>
Too few hashes were requested to be upgraded (i.e. zero).
</details>
</li>
</ul>
</li>
<li>TechnicalCommittee - 23
<ul>
<li>
<details>
<summary>
<code>NotMember</code> - 0</summary>
Account is not a member
</details>
</li>
<li>
<details>
<summary>
<code>DuplicateProposal</code> - 1</summary>
Duplicate proposals not allowed
</details>
</li>
<li>
<details>
<summary>
<code>ProposalMissing</code> - 2</summary>
Proposal must exist
</details>
</li>
<li>
<details>
<summary>
<code>WrongIndex</code> - 3</summary>
Mismatched index
</details>
</li>
<li>
<details>
<summary>
<code>DuplicateVote</code> - 4</summary>
Duplicate vote ignored
</details>
</li>
<li>
<details>
<summary>
<code>AlreadyInitialized</code> - 5</summary>
Members are already initialized!
</details>
</li>
<li>
<details>
<summary>
<code>TooEarly</code> - 6</summary>
The close call was made too early, before the end of the voting.
</details>
</li>
<li>
<details>
<summary>
<code>TooManyProposals</code> - 7</summary>
There can only be a maximum of `MaxProposals` active proposals.
</details>
</li>
<li>
<details>
<summary>
<code>WrongProposalWeight</code> - 8</summary>
The given weight bound for the proposal was too low.
</details>
</li>
<li>
<details>
<summary>
<code>WrongProposalLength</code> - 9</summary>
The given length bound for the proposal was too low.
</details>
</li>
<li>
<details>
<summary>
<code>PrimeAccountNotMember</code> - 10</summary>
Prime account is not a member
</details>
</li>
<li>
<details>
<summary>
<code>ProposalActive</code> - 11</summary>
Proposal is still active.
</details>
</li>
</ul>
</li>
<li>UniversalDividend - 30
<ul>
<li>
<details>
<summary>
<code>AccountNotAllowedToClaimUds</code> - 0</summary>
This account is not allowed to claim UDs.
</details>
</li>
</ul>
</li>
<li>Wot - 40
<ul>
<li>
<details>
<summary>
<code>NotEnoughCerts</code> - 0</summary>
Insufficient certifications received.
</details>
</li>
<li>
<details>
<summary>
<code>TargetStatusInvalid</code> - 1</summary>
Target status is incompatible with this operation.
</details>
</li>
<li>
<details>
<summary>
<code>IdtyCreationPeriodNotRespected</code> - 2</summary>
Identity creation period not respected.
</details>
</li>
<li>
<details>
<summary>
<code>NotEnoughReceivedCertsToCreateIdty</code> - 3</summary>
Insufficient received certifications to create identity.
</details>
</li>
<li>
<details>
<summary>
<code>MaxEmittedCertsReached</code> - 4</summary>
Maximum number of emitted certifications reached.
</details>
</li>
<li>
<details>
<summary>
<code>IssuerNotMember</code> - 5</summary>
Issuer cannot emit a certification because it is not member.
</details>
</li>
<li>
<details>
<summary>
<code>IdtyNotFound</code> - 6</summary>
Issuer or receiver not found.
</details>
</li>
<li>
<details>
<summary>
<code>MembershipRenewalPeriodNotRespected</code> - 7</summary>
Membership can only be renewed after an antispam delay.
</details>
</li>
</ul>
</li>
<li>Identity - 41
<ul>
<li>
<details>
<summary>
<code>IdtyAlreadyConfirmed</code> - 0</summary>
Identity already confirmed.
</details>
</li>
<li>
<details>
<summary>
<code>IdtyAlreadyCreated</code> - 1</summary>
Identity already created.
</details>
</li>
<li>
<details>
<summary>
<code>IdtyIndexNotFound</code> - 2</summary>
Identity index not found.
</details>
</li>
<li>
<details>
<summary>
<code>IdtyNameAlreadyExist</code> - 3</summary>
Identity name already exists.
</details>
</li>
<li>
<details>
<summary>
<code>IdtyNameInvalid</code> - 4</summary>
Invalid identity name.
</details>
</li>
<li>
<details>
<summary>
<code>IdtyNotFound</code> - 5</summary>
Identity not found.
</details>
</li>
<li>
<details>
<summary>
<code>InvalidSignature</code> - 6</summary>
Invalid payload signature.
</details>
</li>
<li>
<details>
<summary>
<code>InvalidRevocationKey</code> - 7</summary>
Invalid revocation key.
</details>
</li>
<li>
<details>
<summary>
<code>IssuerNotMember</code> - 8</summary>
Issuer is not member and can not perform this action.
</details>
</li>
<li>
<details>
<summary>
<code>NotRespectIdtyCreationPeriod</code> - 9</summary>
Identity creation period is not respected.
</details>
</li>
<li>
<details>
<summary>
<code>OwnerKeyAlreadyRecentlyChanged</code> - 10</summary>
Owner key already changed recently.
</details>
</li>
<li>
<details>
<summary>
<code>OwnerKeyAlreadyUsed</code> - 11</summary>
Owner key already used.
</details>
</li>
<li>
<details>
<summary>
<code>ProhibitedToRevertToAnOldKey</code> - 12</summary>
Reverting to an old key is prohibited.
</details>
</li>
<li>
<details>
<summary>
<code>AlreadyRevoked</code> - 13</summary>
Already revoked.
</details>
</li>
<li>
<details>
<summary>
<code>CanNotRevokeUnconfirmed</code> - 14</summary>
Can not revoke identity that never was member.
</details>
</li>
<li>
<details>
<summary>
<code>CanNotRevokeUnvalidated</code> - 15</summary>
Can not revoke identity that never was member.
</details>
</li>
<li>
<details>
<summary>
<code>AccountNotExist</code> - 16</summary>
Cannot link to an inexisting account.
</details>
</li>
<li>
<details>
<summary>
<code>InsufficientBalance</code> - 17</summary>
Insufficient balance to create an identity.
</details>
</li>
<li>
<details>
<summary>
<code>OwnerKeyUsedAsValidator</code> - 18</summary>
Owner key currently used as validator.
</details>
</li>
<li>
<details>
<summary>
<code>InvalidLegacyRevocationFormat</code> - 19</summary>
Legacy revocation document format is invalid
</details>
</li>
</ul>
</li>
<li>Membership - 42
<ul>
<li>
<details>
<summary>
<code>MembershipNotFound</code> - 0</summary>
Membership not found, can not renew.
</details>
</li>
<li>
<details>
<summary>
<code>AlreadyMember</code> - 1</summary>
Already member, can not add membership.
</details>
</li>
</ul>
</li>
<li>Certification - 43
<ul>
<li>
<details>
<summary>
<code>OriginMustHaveAnIdentity</code> - 0</summary>
Issuer of a certification must have an identity
</details>
</li>
<li>
<details>
<summary>
<code>CannotCertifySelf</code> - 1</summary>
Identity cannot certify itself.
</details>
</li>
<li>
<details>
<summary>
<code>IssuedTooManyCert</code> - 2</summary>
Identity has already issued the maximum number of certifications.
</details>
</li>
<li>
<details>
<summary>
<code>NotEnoughCertReceived</code> - 3</summary>
Insufficient certifications received.
</details>
</li>
<li>
<details>
<summary>
<code>NotRespectCertPeriod</code> - 4</summary>
Identity has issued a certification too recently.
</details>
</li>
<li>
<details>
<summary>
<code>CertAlreadyExists</code> - 5</summary>
Can not add an already-existing cert
</details>
</li>
<li>
<details>
<summary>
<code>CertDoesNotExist</code> - 6</summary>
Can not renew a non-existing cert
</details>
</li>
</ul>
</li>
<li>Distance - 44
<ul>
<li>
<details>
<summary>
<code>AlreadyInEvaluation</code> - 0</summary>
Distance is already under evaluation.
</details>
</li>
<li>
<details>
<summary>
<code>TooManyEvaluationsByAuthor</code> - 1</summary>
Too many evaluations requested by author.
</details>
</li>
<li>
<details>
<summary>
<code>TooManyEvaluationsInBlock</code> - 2</summary>
Too many evaluations for this block.
</details>
</li>
<li>
<details>
<summary>
<code>NoAuthor</code> - 3</summary>
No author for this block.
</details>
</li>
<li>
<details>
<summary>
<code>CallerHasNoIdentity</code> - 4</summary>
Caller has no identity.
</details>
</li>
<li>
<details>
<summary>
<code>CallerIdentityNotFound</code> - 5</summary>
Caller identity not found.
</details>
</li>
<li>
<details>
<summary>
<code>CallerNotMember</code> - 6</summary>
Caller not member.
</details>
</li>
<li>
<details>
<summary>
<code>CallerStatusInvalid</code> - 7</summary>
</details>
</li>
<li>
<details>
<summary>
<code>TargetIdentityNotFound</code> - 8</summary>
Target identity not found.
</details>
</li>
<li>
<details>
<summary>
<code>QueueFull</code> - 9</summary>
Evaluation queue is full.
</details>
</li>
<li>
<details>
<summary>
<code>TooManyEvaluators</code> - 10</summary>
Too many evaluators in the current evaluation pool.
</details>
</li>
<li>
<details>
<summary>
<code>WrongResultLength</code> - 11</summary>
Evaluation result has a wrong length.
</details>
</li>
<li>
<details>
<summary>
<code>TargetMustBeUnvalidated</code> - 12</summary>
Targeted distance evaluation request is only possible for an unvalidated identity.
</details>
</li>
</ul>
</li>
<li>AtomicSwap - 50
<ul>
<li>
<details>
<summary>
<code>AlreadyExist</code> - 0</summary>
Swap already exists.
</details>
</li>
<li>
<details>
<summary>
<code>InvalidProof</code> - 1</summary>
Swap proof is invalid.
</details>
</li>
<li>
<details>
<summary>
<code>ProofTooLarge</code> - 2</summary>
Proof is too large.
</details>
</li>
<li>
<details>
<summary>
<code>SourceMismatch</code> - 3</summary>
Source does not match.
</details>
</li>
<li>
<details>
<summary>
<code>AlreadyClaimed</code> - 4</summary>
Swap has already been claimed.
</details>
</li>
<li>
<details>
<summary>
<code>NotExist</code> - 5</summary>
Swap does not exist.
</details>
</li>
<li>
<details>
<summary>
<code>ClaimActionMismatch</code> - 6</summary>
Claim action mismatch.
</details>
</li>
<li>
<details>
<summary>
<code>DurationNotPassed</code> - 7</summary>
Duration has not yet passed for the swap to be cancelled.
</details>
</li>
</ul>
</li>
<li>Multisig - 51
<ul>
<li>
<details>
<summary>
<code>MinimumThreshold</code> - 0</summary>
Threshold must be 2 or greater.
</details>
</li>
<li>
<details>
<summary>
<code>AlreadyApproved</code> - 1</summary>
Call is already approved by this signatory.
</details>
</li>
<li>
<details>
<summary>
<code>NoApprovalsNeeded</code> - 2</summary>
Call doesn't need any (more) approvals.
</details>
</li>
<li>
<details>
<summary>
<code>TooFewSignatories</code> - 3</summary>
There are too few signatories in the list.
</details>
</li>
<li>
<details>
<summary>
<code>TooManySignatories</code> - 4</summary>
There are too many signatories in the list.
</details>
</li>
<li>
<details>
<summary>
<code>SignatoriesOutOfOrder</code> - 5</summary>
The signatories were provided out of order; they should be ordered.
</details>
</li>
<li>
<details>
<summary>
<code>SenderInSignatories</code> - 6</summary>
The sender was contained in the other signatories; it shouldn't be.
</details>
</li>
<li>
<details>
<summary>
<code>NotFound</code> - 7</summary>
Multisig operation not found when attempting to cancel.
</details>
</li>
<li>
<details>
<summary>
<code>NotOwner</code> - 8</summary>
Only the account that originally created the multisig is able to cancel it.
</details>
</li>
<li>
<details>
<summary>
<code>NoTimepoint</code> - 9</summary>
No timepoint was given, yet the multisig operation is already underway.
</details>
</li>
<li>
<details>
<summary>
<code>WrongTimepoint</code> - 10</summary>
A different timepoint was given to the multisig operation that is underway.
</details>
</li>
<li>
<details>
<summary>
<code>UnexpectedTimepoint</code> - 11</summary>
A timepoint was given, yet no multisig operation is underway.
</details>
</li>
<li>
<details>
<summary>
<code>MaxWeightTooLow</code> - 12</summary>
The maximum weight information provided was too low.
</details>
</li>
<li>
<details>
<summary>
<code>AlreadyStored</code> - 13</summary>
The data to be stored is already stored.
</details>
</li>
</ul>
</li>
<li>ProvideRandomness - 52
<ul>
<li>
<details>
<summary>
<code>QueueFull</code> - 0</summary>
Request randomness queue is full.
</details>
</li>
</ul>
</li>
<li>Proxy - 53
<ul>
<li>
<details>
<summary>
<code>TooMany</code> - 0</summary>
There are too many proxies registered or too many announcements pending.
</details>
</li>
<li>
<details>
<summary>
<code>NotFound</code> - 1</summary>
Proxy registration not found.
</details>
</li>
<li>
<details>
<summary>
<code>NotProxy</code> - 2</summary>
Sender is not a proxy of the account to be proxied.
</details>
</li>
<li>
<details>
<summary>
<code>Unproxyable</code> - 3</summary>
A call which is incompatible with the proxy type's filter was attempted.
</details>
</li>
<li>
<details>
<summary>
<code>Duplicate</code> - 4</summary>
Account is already a proxy.
</details>
</li>
<li>
<details>
<summary>
<code>NoPermission</code> - 5</summary>
Call may not be made by proxy because it may escalate its privileges.
</details>
</li>
<li>
<details>
<summary>
<code>Unannounced</code> - 6</summary>
Announcement, if made at all, was made too recently.
</details>
</li>
<li>
<details>
<summary>
<code>NoSelfProxy</code> - 7</summary>
Cannot add self as proxy.
</details>
</li>
</ul>
</li>
<li>Utility - 54
<ul>
<li>
<details>
<summary>
<code>TooManyCalls</code> - 0</summary>
Too many calls batched.
</details>
</li>
</ul>
</li>
<li>Treasury - 55
<ul>
<li>
<details>
<summary>
<code>InvalidIndex</code> - 0</summary>
No proposal, bounty or spend at that index.
</details>
</li>
<li>
<details>
<summary>
<code>TooManyApprovals</code> - 1</summary>
Too many approvals in the queue.
</details>
</li>
<li>
<details>
<summary>
<code>InsufficientPermission</code> - 2</summary>
The spend origin is valid but the amount it is allowed to spend is lower than the
amount to be spent.
</details>
</li>
<li>
<details>
<summary>
<code>ProposalNotApproved</code> - 3</summary>
Proposal has not been approved.
</details>
</li>
<li>
<details>
<summary>
<code>FailedToConvertBalance</code> - 4</summary>
The balance of the asset kind is not convertible to the balance of the native asset.
</details>
</li>
<li>
<details>
<summary>
<code>SpendExpired</code> - 5</summary>
The spend has expired and cannot be claimed.
</details>
</li>
<li>
<details>
<summary>
<code>EarlyPayout</code> - 6</summary>
The spend is not yet eligible for payout.
</details>
</li>
<li>
<details>
<summary>
<code>AlreadyAttempted</code> - 7</summary>
The payment has already been attempted.
</details>
</li>
<li>
<details>
<summary>
<code>PayoutError</code> - 8</summary>
There was some issue with the mechanism of payment.
</details>
</li>
<li>
<details>
<summary>
<code>NotAttempted</code> - 9</summary>
The payout was not yet attempted/claimed.
</details>
</li>
<li>
<details>
<summary>
<code>Inconclusive</code> - 10</summary>
The payment has neither failed nor succeeded yet.
</details>
</li>
</ul>
</li>
</ul>
\ No newline at end of file
msgid "System.InvalidSpecName"
msgstr "The name of specification does not match between the current runtime
and the new runtime."
msgid "System.SpecVersionNeedsToIncrease"
msgstr "The specification version is not allowed to decrease between the current runtime
and the new runtime."
msgid "System.FailedToExtractRuntimeVersion"
msgstr "Failed to extract the runtime version from the new runtime.
Either calling `Core_version` or decoding `RuntimeVersion` failed."
msgid "System.NonDefaultComposite"
msgstr "Suicide called when the account has non-default composite data."
msgid "System.NonZeroRefCount"
msgstr "There is a non-zero reference count preventing the account from being purged."
msgid "System.CallFiltered"
msgstr "The origin filter prevent the call to be dispatched."
msgid "System.MultiBlockMigrationsOngoing"
msgstr "A multi-block migration is ongoing and prevents the current code from being replaced."
msgid "System.NothingAuthorized"
msgstr "No upgrade authorized."
msgid "System.Unauthorized"
msgstr "The submitted code is not authorized."
msgid "Scheduler.FailedToSchedule"
msgstr "Failed to schedule a call"
msgid "Scheduler.NotFound"
msgstr "Cannot find the scheduled call."
msgid "Scheduler.TargetBlockNumberInPast"
msgstr "Given target block number is in the past."
msgid "Scheduler.RescheduleNoChange"
msgstr "Reschedule failed because it does not change scheduled time."
msgid "Scheduler.Named"
msgstr "Attempt to use a non-named function on a named task."
msgid "Babe.InvalidEquivocationProof"
msgstr "An equivocation proof provided as part of an equivocation report is invalid."
msgid "Babe.InvalidKeyOwnershipProof"
msgstr "A key ownership proof provided as part of an equivocation report is invalid."
msgid "Babe.DuplicateOffenceReport"
msgstr "A given equivocation report is valid but already previously reported."
msgid "Babe.InvalidConfiguration"
msgstr "Submitted configuration is invalid."
msgid "Balances.VestingBalance"
msgstr "Vesting balance too high to send value."
msgid "Balances.LiquidityRestrictions"
msgstr "Account liquidity restrictions prevent withdrawal."
msgid "Balances.InsufficientBalance"
msgstr "Balance too low to send value."
msgid "Balances.ExistentialDeposit"
msgstr "Value too low to create account due to existential deposit."
msgid "Balances.Expendability"
msgstr "Transfer/payment would kill account."
msgid "Balances.ExistingVestingSchedule"
msgstr "A vesting schedule already exists for this account."
msgid "Balances.DeadAccount"
msgstr "Beneficiary account must pre-exist."
msgid "Balances.TooManyReserves"
msgstr "Number of named reserves exceed `MaxReserves`."
msgid "Balances.TooManyHolds"
msgstr "Number of holds exceed `VariantCountOf<T::RuntimeHoldReason>`."
msgid "Balances.TooManyFreezes"
msgstr "Number of freezes exceed `MaxFreezes`."
msgid "Balances.IssuanceDeactivated"
msgstr "The issuance cannot be modified since it is already deactivated."
msgid "Balances.DeltaZero"
msgstr "The delta cannot be zero."
msgid "OneshotAccount.BlockHeightInFuture"
msgstr "Block height is in the future."
msgid "OneshotAccount.BlockHeightTooOld"
msgstr "Block height is too old."
msgid "OneshotAccount.DestAccountNotExist"
msgstr "Destination account does not exist."
msgid "OneshotAccount.ExistentialDeposit"
msgstr "Destination account has a balance less than the existential deposit."
msgid "OneshotAccount.InsufficientBalance"
msgstr "Source account has insufficient balance."
msgid "OneshotAccount.OneshotAccountAlreadyCreated"
msgstr "Destination oneshot account already exists."
msgid "OneshotAccount.OneshotAccountNotExist"
msgstr "Source oneshot account does not exist."
msgid "SmithMembers.OriginMustHaveAnIdentity"
msgstr "Issuer of anything (invitation, acceptance, certification) must have an identity ID"
msgid "SmithMembers.OriginHasNeverBeenInvited"
msgstr "Issuer must be known as a potential smith"
msgid "SmithMembers.InvitationIsASmithPrivilege"
msgstr "Invitation is reseverd to smiths"
msgid "SmithMembers.InvitationIsAOnlineSmithPrivilege"
msgstr "Invitation is reseverd to online smiths"
msgid "SmithMembers.InvitationAlreadyAccepted"
msgstr "Invitation must not have been accepted yet"
msgid "SmithMembers.InvitationOfExistingNonExcluded"
msgstr "Invitation of an already known smith is forbidden except if it has been excluded"
msgid "SmithMembers.InvitationOfNonMember"
msgstr "Invitation of a non-member (of the WoT) is forbidden"
msgid "SmithMembers.CertificationMustBeAgreed"
msgstr "Certification cannot be made on someone who has not accepted an invitation"
msgid "SmithMembers.CertificationOnExcludedIsForbidden"
msgstr "Certification cannot be made on excluded"
msgid "SmithMembers.CertificationIsASmithPrivilege"
msgstr "Issuer must be a smith"
msgid "SmithMembers.CertificationIsAOnlineSmithPrivilege"
msgstr "Only online smiths can certify"
msgid "SmithMembers.CertificationOfSelfIsForbidden"
msgstr "Smith cannot certify itself"
msgid "SmithMembers.CertificationReceiverMustHaveBeenInvited"
msgstr "Receiver must be invited by another smith"
msgid "SmithMembers.CertificationAlreadyExists"
msgstr "Receiver must not already have this certification"
msgid "SmithMembers.CertificationStockFullyConsumed"
msgstr "A smith has a limited stock of certifications"
msgid "AuthorityMembers.AlreadyIncoming"
msgstr "Member already incoming."
msgid "AuthorityMembers.AlreadyOnline"
msgstr "Member already online."
msgid "AuthorityMembers.AlreadyOutgoing"
msgstr "Member already outgoing."
msgid "AuthorityMembers.MemberIdNotFound"
msgstr "Owner key is invalid as a member."
msgid "AuthorityMembers.MemberBlacklisted"
msgstr "Member is blacklisted."
msgid "AuthorityMembers.MemberNotBlacklisted"
msgstr "Member is not blacklisted."
msgid "AuthorityMembers.MemberNotFound"
msgstr "Member not found."
msgid "AuthorityMembers.NotOnlineNorIncoming"
msgstr "Neither online nor scheduled."
msgid "AuthorityMembers.NotMember"
msgstr "Not member."
msgid "AuthorityMembers.SessionKeysNotProvided"
msgstr "Session keys not provided."
msgid "AuthorityMembers.TooManyAuthorities"
msgstr "Too many authorities."
msgid "Session.InvalidProof"
msgstr "Invalid ownership proof."
msgid "Session.NoAssociatedValidatorId"
msgstr "No associated validator ID for account."
msgid "Session.DuplicatedKey"
msgstr "Registered duplicate key."
msgid "Session.NoKeys"
msgstr "No keys are associated with this account."
msgid "Session.NoAccount"
msgstr "Key setting account is not live, so it's impossible to associate keys."
msgid "Grandpa.PauseFailed"
msgstr "Attempt to signal GRANDPA pause when the authority set isn't live
(either paused or already pending pause)."
msgid "Grandpa.ResumeFailed"
msgstr "Attempt to signal GRANDPA resume when the authority set isn't paused
(either live or already pending resume)."
msgid "Grandpa.ChangePending"
msgstr "Attempt to signal GRANDPA change with one already pending."
msgid "Grandpa.TooSoon"
msgstr "Cannot signal forced change so soon after last."
msgid "Grandpa.InvalidKeyOwnershipProof"
msgstr "A key ownership proof provided as part of an equivocation report is invalid."
msgid "Grandpa.InvalidEquivocationProof"
msgstr "An equivocation proof provided as part of an equivocation report is invalid."
msgid "Grandpa.DuplicateOffenceReport"
msgstr "A given equivocation report is valid but already previously reported."
msgid "ImOnline.InvalidKey"
msgstr "Non existent public key."
msgid "ImOnline.DuplicatedHeartbeat"
msgstr "Duplicated heartbeat."
msgid "Sudo.RequireSudo"
msgstr "Sender must be the Sudo account."
msgid "Preimage.TooBig"
msgstr "Preimage is too large to store on-chain."
msgid "Preimage.AlreadyNoted"
msgstr "Preimage has already been noted on-chain."
msgid "Preimage.NotAuthorized"
msgstr "The user is not authorized to perform this action."
msgid "Preimage.NotNoted"
msgstr "The preimage cannot be removed since it has not yet been noted."
msgid "Preimage.Requested"
msgstr "A preimage may not be removed when there are outstanding requests."
msgid "Preimage.NotRequested"
msgstr "The preimage request cannot be removed since no outstanding requests exist."
msgid "Preimage.TooMany"
msgstr "More than `MAX_HASH_UPGRADE_BULK_COUNT` hashes were requested to be upgraded at once."
msgid "Preimage.TooFew"
msgstr "Too few hashes were requested to be upgraded (i.e. zero)."
msgid "TechnicalCommittee.NotMember"
msgstr "Account is not a member"
msgid "TechnicalCommittee.DuplicateProposal"
msgstr "Duplicate proposals not allowed"
msgid "TechnicalCommittee.ProposalMissing"
msgstr "Proposal must exist"
msgid "TechnicalCommittee.WrongIndex"
msgstr "Mismatched index"
msgid "TechnicalCommittee.DuplicateVote"
msgstr "Duplicate vote ignored"
msgid "TechnicalCommittee.AlreadyInitialized"
msgstr "Members are already initialized!"
msgid "TechnicalCommittee.TooEarly"
msgstr "The close call was made too early, before the end of the voting."
msgid "TechnicalCommittee.TooManyProposals"
msgstr "There can only be a maximum of `MaxProposals` active proposals."
msgid "TechnicalCommittee.WrongProposalWeight"
msgstr "The given weight bound for the proposal was too low."
msgid "TechnicalCommittee.WrongProposalLength"
msgstr "The given length bound for the proposal was too low."
msgid "TechnicalCommittee.PrimeAccountNotMember"
msgstr "Prime account is not a member"
msgid "TechnicalCommittee.ProposalActive"
msgstr "Proposal is still active."
msgid "UniversalDividend.AccountNotAllowedToClaimUds"
msgstr "This account is not allowed to claim UDs."
msgid "Wot.NotEnoughCerts"
msgstr "Insufficient certifications received."
msgid "Wot.TargetStatusInvalid"
msgstr "Target status is incompatible with this operation."
msgid "Wot.IdtyCreationPeriodNotRespected"
msgstr "Identity creation period not respected."
msgid "Wot.NotEnoughReceivedCertsToCreateIdty"
msgstr "Insufficient received certifications to create identity."
msgid "Wot.MaxEmittedCertsReached"
msgstr "Maximum number of emitted certifications reached."
msgid "Wot.IssuerNotMember"
msgstr "Issuer cannot emit a certification because it is not member."
msgid "Wot.IdtyNotFound"
msgstr "Issuer or receiver not found."
msgid "Wot.MembershipRenewalPeriodNotRespected"
msgstr "Membership can only be renewed after an antispam delay."
msgid "Identity.IdtyAlreadyConfirmed"
msgstr "Identity already confirmed."
msgid "Identity.IdtyAlreadyCreated"
msgstr "Identity already created."
msgid "Identity.IdtyIndexNotFound"
msgstr "Identity index not found."
msgid "Identity.IdtyNameAlreadyExist"
msgstr "Identity name already exists."
msgid "Identity.IdtyNameInvalid"
msgstr "Invalid identity name."
msgid "Identity.IdtyNotFound"
msgstr "Identity not found."
msgid "Identity.InvalidSignature"
msgstr "Invalid payload signature."
msgid "Identity.InvalidRevocationKey"
msgstr "Invalid revocation key."
msgid "Identity.IssuerNotMember"
msgstr "Issuer is not member and can not perform this action."
msgid "Identity.NotRespectIdtyCreationPeriod"
msgstr "Identity creation period is not respected."
msgid "Identity.OwnerKeyAlreadyRecentlyChanged"
msgstr "Owner key already changed recently."
msgid "Identity.OwnerKeyAlreadyUsed"
msgstr "Owner key already used."
msgid "Identity.ProhibitedToRevertToAnOldKey"
msgstr "Reverting to an old key is prohibited."
msgid "Identity.AlreadyRevoked"
msgstr "Already revoked."
msgid "Identity.CanNotRevokeUnconfirmed"
msgstr "Can not revoke identity that never was member."
msgid "Identity.CanNotRevokeUnvalidated"
msgstr "Can not revoke identity that never was member."
msgid "Identity.AccountNotExist"
msgstr "Cannot link to an inexisting account."
msgid "Identity.InsufficientBalance"
msgstr "Insufficient balance to create an identity."
msgid "Identity.OwnerKeyUsedAsValidator"
msgstr "Owner key currently used as validator."
msgid "Identity.InvalidLegacyRevocationFormat"
msgstr "Legacy revocation document format is invalid"
msgid "Membership.MembershipNotFound"
msgstr "Membership not found, can not renew."
msgid "Membership.AlreadyMember"
msgstr "Already member, can not add membership."
msgid "Certification.OriginMustHaveAnIdentity"
msgstr "Issuer of a certification must have an identity"
msgid "Certification.CannotCertifySelf"
msgstr "Identity cannot certify itself."
msgid "Certification.IssuedTooManyCert"
msgstr "Identity has already issued the maximum number of certifications."
msgid "Certification.NotEnoughCertReceived"
msgstr "Insufficient certifications received."
msgid "Certification.NotRespectCertPeriod"
msgstr "Identity has issued a certification too recently."
msgid "Certification.CertAlreadyExists"
msgstr "Can not add an already-existing cert"
msgid "Certification.CertDoesNotExist"
msgstr "Can not renew a non-existing cert"
msgid "Distance.AlreadyInEvaluation"
msgstr "Distance is already under evaluation."
msgid "Distance.TooManyEvaluationsByAuthor"
msgstr "Too many evaluations requested by author."
msgid "Distance.TooManyEvaluationsInBlock"
msgstr "Too many evaluations for this block."
msgid "Distance.NoAuthor"
msgstr "No author for this block."
msgid "Distance.CallerHasNoIdentity"
msgstr "Caller has no identity."
msgid "Distance.CallerIdentityNotFound"
msgstr "Caller identity not found."
msgid "Distance.CallerNotMember"
msgstr "Caller not member."
msgid "Distance.CallerStatusInvalid"
msgstr ""
msgid "Distance.TargetIdentityNotFound"
msgstr "Target identity not found."
msgid "Distance.QueueFull"
msgstr "Evaluation queue is full."
msgid "Distance.TooManyEvaluators"
msgstr "Too many evaluators in the current evaluation pool."
msgid "Distance.WrongResultLength"
msgstr "Evaluation result has a wrong length."
msgid "Distance.TargetMustBeUnvalidated"
msgstr "Targeted distance evaluation request is only possible for an unvalidated identity."
msgid "AtomicSwap.AlreadyExist"
msgstr "Swap already exists."
msgid "AtomicSwap.InvalidProof"
msgstr "Swap proof is invalid."
msgid "AtomicSwap.ProofTooLarge"
msgstr "Proof is too large."
msgid "AtomicSwap.SourceMismatch"
msgstr "Source does not match."
msgid "AtomicSwap.AlreadyClaimed"
msgstr "Swap has already been claimed."
msgid "AtomicSwap.NotExist"
msgstr "Swap does not exist."
msgid "AtomicSwap.ClaimActionMismatch"
msgstr "Claim action mismatch."
msgid "AtomicSwap.DurationNotPassed"
msgstr "Duration has not yet passed for the swap to be cancelled."
msgid "Multisig.MinimumThreshold"
msgstr "Threshold must be 2 or greater."
msgid "Multisig.AlreadyApproved"
msgstr "Call is already approved by this signatory."
msgid "Multisig.NoApprovalsNeeded"
msgstr "Call doesn't need any (more) approvals."
msgid "Multisig.TooFewSignatories"
msgstr "There are too few signatories in the list."
msgid "Multisig.TooManySignatories"
msgstr "There are too many signatories in the list."
msgid "Multisig.SignatoriesOutOfOrder"
msgstr "The signatories were provided out of order; they should be ordered."
msgid "Multisig.SenderInSignatories"
msgstr "The sender was contained in the other signatories; it shouldn't be."
msgid "Multisig.NotFound"
msgstr "Multisig operation not found when attempting to cancel."
msgid "Multisig.NotOwner"
msgstr "Only the account that originally created the multisig is able to cancel it."
msgid "Multisig.NoTimepoint"
msgstr "No timepoint was given, yet the multisig operation is already underway."
msgid "Multisig.WrongTimepoint"
msgstr "A different timepoint was given to the multisig operation that is underway."
msgid "Multisig.UnexpectedTimepoint"
msgstr "A timepoint was given, yet no multisig operation is underway."
msgid "Multisig.MaxWeightTooLow"
msgstr "The maximum weight information provided was too low."
msgid "Multisig.AlreadyStored"
msgstr "The data to be stored is already stored."
msgid "ProvideRandomness.QueueFull"
msgstr "Request randomness queue is full."
msgid "Proxy.TooMany"
msgstr "There are too many proxies registered or too many announcements pending."
msgid "Proxy.NotFound"
msgstr "Proxy registration not found."
msgid "Proxy.NotProxy"
msgstr "Sender is not a proxy of the account to be proxied."
msgid "Proxy.Unproxyable"
msgstr "A call which is incompatible with the proxy type's filter was attempted."
msgid "Proxy.Duplicate"
msgstr "Account is already a proxy."
msgid "Proxy.NoPermission"
msgstr "Call may not be made by proxy because it may escalate its privileges."
msgid "Proxy.Unannounced"
msgstr "Announcement, if made at all, was made too recently."
msgid "Proxy.NoSelfProxy"
msgstr "Cannot add self as proxy."
msgid "Utility.TooManyCalls"
msgstr "Too many calls batched."
msgid "Treasury.InvalidIndex"
msgstr "No proposal, bounty or spend at that index."
msgid "Treasury.TooManyApprovals"
msgstr "Too many approvals in the queue."
msgid "Treasury.InsufficientPermission"
msgstr "The spend origin is valid but the amount it is allowed to spend is lower than the
amount to be spent."
msgid "Treasury.ProposalNotApproved"
msgstr "Proposal has not been approved."
msgid "Treasury.FailedToConvertBalance"
msgstr "The balance of the asset kind is not convertible to the balance of the native asset."
msgid "Treasury.SpendExpired"
msgstr "The spend has expired and cannot be claimed."
msgid "Treasury.EarlyPayout"
msgstr "The spend is not yet eligible for payout."
msgid "Treasury.AlreadyAttempted"
msgstr "The payment has already been attempted."
msgid "Treasury.PayoutError"
msgstr "There was some issue with the mechanism of payment."
msgid "Treasury.NotAttempted"
msgstr "The payout was not yet attempted/claimed."
msgid "Treasury.Inconclusive"
msgstr "The payment has neither failed nor succeeded yet."
# Runtime events
There are **139** events from **35** pallets.
<ul>
<li>System - 0
<ul>
<li>
<details>
<summary>
<code>ExtrinsicSuccess(dispatch_info)</code> - 0</summary>
An extrinsic completed successfully.
```rust
dispatch_info: DispatchEventInfo
```
</details>
</li>
<li>
<details>
<summary>
<code>ExtrinsicFailed(dispatch_error, dispatch_info)</code> - 1</summary>
An extrinsic failed.
```rust
dispatch_error: DispatchError
dispatch_info: DispatchEventInfo
```
</details>
</li>
<li>
<details>
<summary>
<code>CodeUpdated()</code> - 2</summary>
`:code` was updated.
```rust
no args
```
</details>
</li>
<li>
<details>
<summary>
<code>NewAccount(account)</code> - 3</summary>
A new account was created.
```rust
account: T::AccountId
```
</details>
</li>
<li>
<details>
<summary>
<code>KilledAccount(account)</code> - 4</summary>
An account was reaped.
```rust
account: T::AccountId
```
</details>
</li>
<li>
<details>
<summary>
<code>Remarked(sender, hash)</code> - 5</summary>
On on-chain remark happened.
```rust
sender: T::AccountId
hash: T::Hash
```
</details>
</li>
<li>
<details>
<summary>
<code>UpgradeAuthorized(code_hash, check_version)</code> - 6</summary>
An upgrade was authorized.
```rust
code_hash: T::Hash
check_version: bool
```
</details>
</li>
</ul>
</li>
<li>Account - 1
<ul>
<li>
<details>
<summary>
<code>AccountLinked(who, identity)</code> - 0</summary>
account linked to identity
```rust
who: T::AccountId
identity: IdtyIdOf<T>
```
</details>
</li>
<li>
<details>
<summary>
<code>AccountUnlinked()</code> - 1</summary>
The account was unlinked from its identity.
```rust
: T::AccountId
```
</details>
</li>
</ul>
</li>
<li>Scheduler - 2
<ul>
<li>
<details>
<summary>
<code>Scheduled(when, index)</code> - 0</summary>
Scheduled some task.
```rust
when: BlockNumberFor<T>
index: u32
```
</details>
</li>
<li>
<details>
<summary>
<code>Canceled(when, index)</code> - 1</summary>
Canceled some task.
```rust
when: BlockNumberFor<T>
index: u32
```
</details>
</li>
<li>
<details>
<summary>
<code>Dispatched(task, id, result)</code> - 2</summary>
Dispatched some task.
```rust
task: TaskAddress<BlockNumberFor<T>>
id: Option<TaskName>
result: DispatchResult
```
</details>
</li>
<li>
<details>
<summary>
<code>RetrySet(task, id, period, retries)</code> - 3</summary>
Set a retry configuration for some task.
```rust
task: TaskAddress<BlockNumberFor<T>>
id: Option<TaskName>
period: BlockNumberFor<T>
retries: u8
```
</details>
</li>
<li>
<details>
<summary>
<code>RetryCancelled(task, id)</code> - 4</summary>
Cancel a retry configuration for some task.
```rust
task: TaskAddress<BlockNumberFor<T>>
id: Option<TaskName>
```
</details>
</li>
<li>
<details>
<summary>
<code>CallUnavailable(task, id)</code> - 5</summary>
The call for the provided hash was not found so the task has been aborted.
```rust
task: TaskAddress<BlockNumberFor<T>>
id: Option<TaskName>
```
</details>
</li>
<li>
<details>
<summary>
<code>PeriodicFailed(task, id)</code> - 6</summary>
The given task was unable to be renewed since the agenda is full at that block.
```rust
task: TaskAddress<BlockNumberFor<T>>
id: Option<TaskName>
```
</details>
</li>
<li>
<details>
<summary>
<code>RetryFailed(task, id)</code> - 7</summary>
The given task was unable to be retried since the agenda is full at that block or there
was not enough weight to reschedule it.
```rust
task: TaskAddress<BlockNumberFor<T>>
id: Option<TaskName>
```
</details>
</li>
<li>
<details>
<summary>
<code>PermanentlyOverweight(task, id)</code> - 8</summary>
The given task can never be executed since it is overweight.
```rust
task: TaskAddress<BlockNumberFor<T>>
id: Option<TaskName>
```
</details>
</li>
</ul>
</li>
<li>Babe - 3
<ul>
</ul>
</li>
<li>Timestamp - 4
<ul>
</ul>
</li>
<li>Parameters - 5
<ul>
</ul>
</li>
<li>Balances - 6
<ul>
<li>
<details>
<summary>
<code>Endowed(account, free_balance)</code> - 0</summary>
An account was created with some free balance.
```rust
account: T::AccountId
free_balance: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>DustLost(account, amount)</code> - 1</summary>
An account was removed whose balance was non-zero but below ExistentialDeposit,
resulting in an outright loss.
```rust
account: T::AccountId
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>Transfer(from, to, amount)</code> - 2</summary>
Transfer succeeded.
```rust
from: T::AccountId
to: T::AccountId
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>BalanceSet(who, free)</code> - 3</summary>
A balance was set by root.
```rust
who: T::AccountId
free: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>Reserved(who, amount)</code> - 4</summary>
Some balance was reserved (moved from free to reserved).
```rust
who: T::AccountId
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>Unreserved(who, amount)</code> - 5</summary>
Some balance was unreserved (moved from reserved to free).
```rust
who: T::AccountId
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>ReserveRepatriated(from, to, amount, destination_status)</code> - 6</summary>
Some balance was moved from the reserve of the first account to the second account.
Final argument indicates the destination balance type.
```rust
from: T::AccountId
to: T::AccountId
amount: T::Balance
destination_status: Status
```
</details>
</li>
<li>
<details>
<summary>
<code>Deposit(who, amount)</code> - 7</summary>
Some amount was deposited (e.g. for transaction fees).
```rust
who: T::AccountId
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>Withdraw(who, amount)</code> - 8</summary>
Some amount was withdrawn from the account (e.g. for transaction fees).
```rust
who: T::AccountId
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>Slashed(who, amount)</code> - 9</summary>
Some amount was removed from the account (e.g. for misbehavior).
```rust
who: T::AccountId
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>Minted(who, amount)</code> - 10</summary>
Some amount was minted into an account.
```rust
who: T::AccountId
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>Burned(who, amount)</code> - 11</summary>
Some amount was burned from an account.
```rust
who: T::AccountId
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>Suspended(who, amount)</code> - 12</summary>
Some amount was suspended from an account (it can be restored later).
```rust
who: T::AccountId
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>Restored(who, amount)</code> - 13</summary>
Some amount was restored into an account.
```rust
who: T::AccountId
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>Upgraded(who)</code> - 14</summary>
An account was upgraded.
```rust
who: T::AccountId
```
</details>
</li>
<li>
<details>
<summary>
<code>Issued(amount)</code> - 15</summary>
Total issuance was increased by `amount`, creating a credit to be balanced.
```rust
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>Rescinded(amount)</code> - 16</summary>
Total issuance was decreased by `amount`, creating a debt to be balanced.
```rust
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>Locked(who, amount)</code> - 17</summary>
Some balance was locked.
```rust
who: T::AccountId
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>Unlocked(who, amount)</code> - 18</summary>
Some balance was unlocked.
```rust
who: T::AccountId
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>Frozen(who, amount)</code> - 19</summary>
Some balance was frozen.
```rust
who: T::AccountId
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>Thawed(who, amount)</code> - 20</summary>
Some balance was thawed.
```rust
who: T::AccountId
amount: T::Balance
```
</details>
</li>
<li>
<details>
<summary>
<code>TotalIssuanceForced(old, new)</code> - 21</summary>
The `TotalIssuance` was forcefully changed.
```rust
old: T::Balance
new: T::Balance
```
</details>
</li>
</ul>
</li>
<li>TransactionPayment - 32
<ul>
<li>
<details>
<summary>
<code>TransactionFeePaid(who, actual_fee, tip)</code> - 0</summary>
A transaction fee `actual_fee`, of which `tip` was added to the minimum inclusion fee,
has been paid by `who`.
```rust
who: T::AccountId
actual_fee: BalanceOf<T>
tip: BalanceOf<T>
```
</details>
</li>
</ul>
</li>
<li>OneshotAccount - 7
<ul>
<li>
<details>
<summary>
<code>OneshotAccountCreated(account, balance, creator)</code> - 0</summary>
A oneshot account was created.
```rust
account: T::AccountId
balance: BalanceOf<T>
creator: T::AccountId
```
</details>
</li>
<li>
<details>
<summary>
<code>OneshotAccountConsumed(account, dest1, dest2)</code> - 1</summary>
A oneshot account was consumed.
```rust
account: T::AccountId
dest1: (T::AccountId, BalanceOf<T>)
dest2: Option<(T::AccountId, BalanceOf<T>)>
```
</details>
</li>
<li>
<details>
<summary>
<code>Withdraw(account, balance)</code> - 2</summary>
A withdrawal was executed on a oneshot account.
```rust
account: T::AccountId
balance: BalanceOf<T>
```
</details>
</li>
</ul>
</li>
<li>Quota - 66
<ul>
<li>
<details>
<summary>
<code>Refunded(who, identity, amount)</code> - 0</summary>
Transaction fees were refunded.
```rust
who: T::AccountId
identity: IdtyId<T>
amount: BalanceOf<T>
```
</details>
</li>
<li>
<details>
<summary>
<code>NoQuotaForIdty()</code> - 1</summary>
No more quota available for refund.
```rust
: IdtyId<T>
```
</details>
</li>
<li>
<details>
<summary>
<code>NoMoreCurrencyForRefund()</code> - 2</summary>
No more currency available for refund.
This scenario should never occur if the fees are intended for the refund account.
```rust
no args
```
</details>
</li>
<li>
<details>
<summary>
<code>RefundFailed()</code> - 3</summary>
The refund has failed.
This scenario should rarely occur, except when the account was destroyed in the interim between the request and the refund.
```rust
: T::AccountId
```
</details>
</li>
<li>
<details>
<summary>
<code>RefundQueueFull()</code> - 4</summary>
Refund queue was full.
```rust
no args
```
</details>
</li>
</ul>
</li>
<li>SmithMembers - 10
<ul>
<li>
<details>
<summary>
<code>InvitationSent(issuer, receiver)</code> - 0</summary>
An identity is being inivited to become a smith.
```rust
issuer: T::IdtyIndex
receiver: T::IdtyIndex
```
</details>
</li>
<li>
<details>
<summary>
<code>InvitationAccepted(idty_index)</code> - 1</summary>
The invitation has been accepted.
```rust
idty_index: T::IdtyIndex
```
</details>
</li>
<li>
<details>
<summary>
<code>SmithCertAdded(issuer, receiver)</code> - 2</summary>
Certification received
```rust
issuer: T::IdtyIndex
receiver: T::IdtyIndex
```
</details>
</li>
<li>
<details>
<summary>
<code>SmithCertRemoved(issuer, receiver)</code> - 3</summary>
Certification lost
```rust
issuer: T::IdtyIndex
receiver: T::IdtyIndex
```
</details>
</li>
<li>
<details>
<summary>
<code>SmithMembershipAdded(idty_index)</code> - 4</summary>
A smith gathered enough certifications to become an authority (can call `go_online()`).
```rust
idty_index: T::IdtyIndex
```
</details>
</li>
<li>
<details>
<summary>
<code>SmithMembershipRemoved(idty_index)</code> - 5</summary>
A smith has been removed from the smiths set.
```rust
idty_index: T::IdtyIndex
```
</details>
</li>
</ul>
</li>
<li>AuthorityMembers - 11
<ul>
<li>
<details>
<summary>
<code>IncomingAuthorities(members)</code> - 0</summary>
List of members scheduled to join the set of authorities in the next session.
```rust
members: Vec<T::MemberId>
```
</details>
</li>
<li>
<details>
<summary>
<code>OutgoingAuthorities(members)</code> - 1</summary>
List of members leaving the set of authorities in the next session.
```rust
members: Vec<T::MemberId>
```
</details>
</li>
<li>
<details>
<summary>
<code>MemberGoOffline(member)</code> - 2</summary>
A member will leave the set of authorities in 2 sessions.
```rust
member: T::MemberId
```
</details>
</li>
<li>
<details>
<summary>
<code>MemberGoOnline(member)</code> - 3</summary>
A member will join the set of authorities in 2 sessions.
```rust
member: T::MemberId
```
</details>
</li>
<li>
<details>
<summary>
<code>MemberRemoved(member)</code> - 4</summary>
A member, who no longer has authority rights, will be removed from the authority set in 2 sessions.
```rust
member: T::MemberId
```
</details>
</li>
<li>
<details>
<summary>
<code>MemberRemovedFromBlacklist(member)</code> - 5</summary>
A member has been removed from the blacklist.
```rust
member: T::MemberId
```
</details>
</li>
<li>
<details>
<summary>
<code>MemberAddedToBlacklist(member)</code> - 6</summary>
A member has been blacklisted.
```rust
member: T::MemberId
```
</details>
</li>
</ul>
</li>
<li>Authorship - 12
<ul>
</ul>
</li>
<li>Offences - 13
<ul>
<li>
<details>
<summary>
<code>Offence(kind, timeslot)</code> - 0</summary>
An offense was reported during the specified time slot. This event is not deposited for duplicate slashes.
```rust
kind: Kind
timeslot: OpaqueTimeSlot
```
</details>
</li>
</ul>
</li>
<li>Historical - 14
<ul>
</ul>
</li>
<li>Session - 15
<ul>
<li>
<details>
<summary>
<code>NewSession(session_index)</code> - 0</summary>
New session has happened. Note that the argument is the session index, not the
block number as the type might suggest.
```rust
session_index: SessionIndex
```
</details>
</li>
</ul>
</li>
<li>Grandpa - 16
<ul>
<li>
<details>
<summary>
<code>NewAuthorities(authority_set)</code> - 0</summary>
New authority set has been applied.
```rust
authority_set: AuthorityList
```
</details>
</li>
<li>
<details>
<summary>
<code>Paused()</code> - 1</summary>
Current authority set has been paused.
```rust
no args
```
</details>
</li>
<li>
<details>
<summary>
<code>Resumed()</code> - 2</summary>
Current authority set has been resumed.
```rust
no args
```
</details>
</li>
</ul>
</li>
<li>ImOnline - 17
<ul>
<li>
<details>
<summary>
<code>HeartbeatReceived(authority_id)</code> - 0</summary>
A new heartbeat was received from `AuthorityId`.
```rust
authority_id: T::AuthorityId
```
</details>
</li>
<li>
<details>
<summary>
<code>AllGood()</code> - 1</summary>
At the end of the session, no offence was committed.
```rust
no args
```
</details>
</li>
<li>
<details>
<summary>
<code>SomeOffline(offline)</code> - 2</summary>
At the end of the session, at least one validator was found to be offline.
```rust
offline: Vec<IdentificationTuple<T>>
```
</details>
</li>
</ul>
</li>
<li>AuthorityDiscovery - 18
<ul>
</ul>
</li>
<li>Sudo - 20
<ul>
<li>
<details>
<summary>
<code>Sudid(sudo_result)</code> - 0</summary>
A sudo call just took place.
```rust
sudo_result: DispatchResult
```
</details>
</li>
<li>
<details>
<summary>
<code>KeyChanged(old, new)</code> - 1</summary>
The sudo key has been updated.
```rust
old: Option<T::AccountId>
new: T::AccountId
```
</details>
</li>
<li>
<details>
<summary>
<code>KeyRemoved()</code> - 2</summary>
The key was permanently removed.
```rust
no args
```
</details>
</li>
<li>
<details>
<summary>
<code>SudoAsDone(sudo_result)</code> - 3</summary>
A [sudo_as](Pallet::sudo_as) call just took place.
```rust
sudo_result: DispatchResult
```
</details>
</li>
</ul>
</li>
<li>UpgradeOrigin - 21
<ul>
<li>
<details>
<summary>
<code>DispatchedAsRoot(result)</code> - 0</summary>
A call was dispatched as root from an upgradable origin
```rust
result: DispatchResult
```
</details>
</li>
</ul>
</li>
<li>Preimage - 22
<ul>
<li>
<details>
<summary>
<code>Noted(hash)</code> - 0</summary>
A preimage has been noted.
```rust
hash: T::Hash
```
</details>
</li>
<li>
<details>
<summary>
<code>Requested(hash)</code> - 1</summary>
A preimage has been requested.
```rust
hash: T::Hash
```
</details>
</li>
<li>
<details>
<summary>
<code>Cleared(hash)</code> - 2</summary>
A preimage has ben cleared.
```rust
hash: T::Hash
```
</details>
</li>
</ul>
</li>
<li>TechnicalCommittee - 23
<ul>
<li>
<details>
<summary>
<code>Proposed(account, proposal_index, proposal_hash, threshold)</code> - 0</summary>
A motion (given hash) has been proposed (by given account) with a threshold (given
`MemberCount`).
```rust
account: T::AccountId
proposal_index: ProposalIndex
proposal_hash: T::Hash
threshold: MemberCount
```
</details>
</li>
<li>
<details>
<summary>
<code>Voted(account, proposal_hash, voted, yes, no)</code> - 1</summary>
A motion (given hash) has been voted on by given account, leaving
a tally (yes votes and no votes given respectively as `MemberCount`).
```rust
account: T::AccountId
proposal_hash: T::Hash
voted: bool
yes: MemberCount
no: MemberCount
```
</details>
</li>
<li>
<details>
<summary>
<code>Approved(proposal_hash)</code> - 2</summary>
A motion was approved by the required threshold.
```rust
proposal_hash: T::Hash
```
</details>
</li>
<li>
<details>
<summary>
<code>Disapproved(proposal_hash)</code> - 3</summary>
A motion was not approved by the required threshold.
```rust
proposal_hash: T::Hash
```
</details>
</li>
<li>
<details>
<summary>
<code>Executed(proposal_hash, result)</code> - 4</summary>
A motion was executed; result will be `Ok` if it returned without error.
```rust
proposal_hash: T::Hash
result: DispatchResult
```
</details>
</li>
<li>
<details>
<summary>
<code>MemberExecuted(proposal_hash, result)</code> - 5</summary>
A single member did some action; result will be `Ok` if it returned without error.
```rust
proposal_hash: T::Hash
result: DispatchResult
```
</details>
</li>
<li>
<details>
<summary>
<code>Closed(proposal_hash, yes, no)</code> - 6</summary>
A proposal was closed because its threshold was reached or after its duration was up.
```rust
proposal_hash: T::Hash
yes: MemberCount
no: MemberCount
```
</details>
</li>
<li>
<details>
<summary>
<code>Killed(proposal_hash)</code> - 7</summary>
A proposal was killed.
```rust
proposal_hash: T::Hash
```
</details>
</li>
<li>
<details>
<summary>
<code>ProposalCostBurned(proposal_hash, who)</code> - 8</summary>
Some cost for storing a proposal was burned.
```rust
proposal_hash: T::Hash
who: T::AccountId
```
</details>
</li>
<li>
<details>
<summary>
<code>ProposalCostReleased(proposal_hash, who)</code> - 9</summary>
Some cost for storing a proposal was released.
```rust
proposal_hash: T::Hash
who: T::AccountId
```
</details>
</li>
</ul>
</li>
<li>UniversalDividend - 30
<ul>
<li>
<details>
<summary>
<code>NewUdCreated(amount, index, monetary_mass, members_count)</code> - 0</summary>
A new universal dividend is created.
```rust
amount: BalanceOf<T>
index: UdIndex
monetary_mass: BalanceOf<T>
members_count: BalanceOf<T>
```
</details>
</li>
<li>
<details>
<summary>
<code>UdReevalued(new_ud_amount, monetary_mass, members_count)</code> - 1</summary>
The universal dividend has been re-evaluated.
```rust
new_ud_amount: BalanceOf<T>
monetary_mass: BalanceOf<T>
members_count: BalanceOf<T>
```
</details>
</li>
<li>
<details>
<summary>
<code>UdsAutoPaid(count, total, who)</code> - 2</summary>
DUs were automatically transferred as part of a member removal.
```rust
count: UdIndex
total: BalanceOf<T>
who: T::AccountId
```
</details>
</li>
<li>
<details>
<summary>
<code>UdsClaimed(count, total, who)</code> - 3</summary>
A member claimed his UDs.
```rust
count: UdIndex
total: BalanceOf<T>
who: T::AccountId
```
</details>
</li>
</ul>
</li>
<li>Wot - 40
<ul>
</ul>
</li>
<li>Identity - 41
<ul>
<li>
<details>
<summary>
<code>IdtyCreated(idty_index, owner_key)</code> - 0</summary>
A new identity has been created.
```rust
idty_index: T::IdtyIndex
owner_key: T::AccountId
```
</details>
</li>
<li>
<details>
<summary>
<code>IdtyConfirmed(idty_index, name)</code> - 1</summary>
An identity has been confirmed by its owner.
```rust
idty_index: T::IdtyIndex
name: IdtyName
```
</details>
</li>
<li>
<details>
<summary>
<code>IdtyValidated(idty_index)</code> - 2</summary>
An identity has been validated.
```rust
idty_index: T::IdtyIndex
```
</details>
</li>
<li>
<details>
<summary>
<code>IdtyChangedOwnerKey(idty_index, new_owner_key)</code> - 3</summary>
```rust
idty_index: T::IdtyIndex
new_owner_key: T::AccountId
```
</details>
</li>
<li>
<details>
<summary>
<code>IdtyRevoked(idty_index, reason)</code> - 4</summary>
An identity has been revoked.
```rust
idty_index: T::IdtyIndex
reason: RevocationReason
```
</details>
</li>
<li>
<details>
<summary>
<code>IdtyRemoved(idty_index, reason)</code> - 5</summary>
An identity has been removed.
```rust
idty_index: T::IdtyIndex
reason: RemovalReason
```
</details>
</li>
</ul>
</li>
<li>Membership - 42
<ul>
<li>
<details>
<summary>
<code>MembershipAdded(member, expire_on)</code> - 0</summary>
A membership was added.
```rust
member: T::IdtyId
expire_on: BlockNumberFor<T>
```
</details>
</li>
<li>
<details>
<summary>
<code>MembershipRenewed(member, expire_on)</code> - 1</summary>
A membership was renewed.
```rust
member: T::IdtyId
expire_on: BlockNumberFor<T>
```
</details>
</li>
<li>
<details>
<summary>
<code>MembershipRemoved(member, reason)</code> - 2</summary>
A membership was removed.
```rust
member: T::IdtyId
reason: MembershipRemovalReason
```
</details>
</li>
</ul>
</li>
<li>Certification - 43
<ul>
<li>
<details>
<summary>
<code>CertAdded(issuer, receiver)</code> - 0</summary>
A new certification was added.
```rust
issuer: T::IdtyIndex
receiver: T::IdtyIndex
```
</details>
</li>
<li>
<details>
<summary>
<code>CertRemoved(issuer, receiver, expiration)</code> - 1</summary>
A certification was removed.
```rust
issuer: T::IdtyIndex
receiver: T::IdtyIndex
expiration: bool
```
</details>
</li>
<li>
<details>
<summary>
<code>CertRenewed(issuer, receiver)</code> - 2</summary>
A certification was renewed.
```rust
issuer: T::IdtyIndex
receiver: T::IdtyIndex
```
</details>
</li>
</ul>
</li>
<li>Distance - 44
<ul>
<li>
<details>
<summary>
<code>EvaluationRequested(idty_index, who)</code> - 0</summary>
A distance evaluation was requested.
```rust
idty_index: T::IdtyIndex
who: T::AccountId
```
</details>
</li>
<li>
<details>
<summary>
<code>EvaluatedValid(idty_index, distance)</code> - 1</summary>
Distance rule was found valid.
```rust
idty_index: T::IdtyIndex
distance: Perbill
```
</details>
</li>
<li>
<details>
<summary>
<code>EvaluatedInvalid(idty_index, distance)</code> - 2</summary>
Distance rule was found invalid.
```rust
idty_index: T::IdtyIndex
distance: Perbill
```
</details>
</li>
</ul>
</li>
<li>AtomicSwap - 50
<ul>
<li>
<details>
<summary>
<code>NewSwap(account, proof, swap)</code> - 0</summary>
Swap created.
```rust
account: T::AccountId
proof: HashedProof
swap: PendingSwap<T>
```
</details>
</li>
<li>
<details>
<summary>
<code>SwapClaimed(account, proof, success)</code> - 1</summary>
Swap claimed. The last parameter indicates whether the execution succeeds.
```rust
account: T::AccountId
proof: HashedProof
success: bool
```
</details>
</li>
<li>
<details>
<summary>
<code>SwapCancelled(account, proof)</code> - 2</summary>
Swap cancelled.
```rust
account: T::AccountId
proof: HashedProof
```
</details>
</li>
</ul>
</li>
<li>Multisig - 51
<ul>
<li>
<details>
<summary>
<code>NewMultisig(approving, multisig, call_hash)</code> - 0</summary>
A new multisig operation has begun.
```rust
approving: T::AccountId
multisig: T::AccountId
call_hash: CallHash
```
</details>
</li>
<li>
<details>
<summary>
<code>MultisigApproval(approving, timepoint, multisig, call_hash)</code> - 1</summary>
A multisig operation has been approved by someone.
```rust
approving: T::AccountId
timepoint: Timepoint<BlockNumberFor<T>>
multisig: T::AccountId
call_hash: CallHash
```
</details>
</li>
<li>
<details>
<summary>
<code>MultisigExecuted(approving, timepoint, multisig, call_hash, result)</code> - 2</summary>
A multisig operation has been executed.
```rust
approving: T::AccountId
timepoint: Timepoint<BlockNumberFor<T>>
multisig: T::AccountId
call_hash: CallHash
result: DispatchResult
```
</details>
</li>
<li>
<details>
<summary>
<code>MultisigCancelled(cancelling, timepoint, multisig, call_hash)</code> - 3</summary>
A multisig operation has been cancelled.
```rust
cancelling: T::AccountId
timepoint: Timepoint<BlockNumberFor<T>>
multisig: T::AccountId
call_hash: CallHash
```
</details>
</li>
</ul>
</li>
<li>ProvideRandomness - 52
<ul>
<li>
<details>
<summary>
<code>FilledRandomness(request_id, randomness)</code> - 0</summary>
A request for randomness was fulfilled.
```rust
request_id: RequestId
randomness: H256
```
</details>
</li>
<li>
<details>
<summary>
<code>RequestedRandomness(request_id, salt, r#type)</code> - 1</summary>
A request for randomness was made.
```rust
request_id: RequestId
salt: H256
r#type: RandomnessType
```
</details>
</li>
</ul>
</li>
<li>Proxy - 53
<ul>
<li>
<details>
<summary>
<code>ProxyExecuted(result)</code> - 0</summary>
A proxy was executed correctly, with the given.
```rust
result: DispatchResult
```
</details>
</li>
<li>
<details>
<summary>
<code>PureCreated(pure, who, proxy_type, disambiguation_index)</code> - 1</summary>
A pure account has been created by new proxy with given
disambiguation index and proxy type.
```rust
pure: T::AccountId
who: T::AccountId
proxy_type: T::ProxyType
disambiguation_index: u16
```
</details>
</li>
<li>
<details>
<summary>
<code>Announced(real, proxy, call_hash)</code> - 2</summary>
An announcement was placed to make a call in the future.
```rust
real: T::AccountId
proxy: T::AccountId
call_hash: CallHashOf<T>
```
</details>
</li>
<li>
<details>
<summary>
<code>ProxyAdded(delegator, delegatee, proxy_type, delay)</code> - 3</summary>
A proxy was added.
```rust
delegator: T::AccountId
delegatee: T::AccountId
proxy_type: T::ProxyType
delay: BlockNumberFor<T>
```
</details>
</li>
<li>
<details>
<summary>
<code>ProxyRemoved(delegator, delegatee, proxy_type, delay)</code> - 4</summary>
A proxy was removed.
```rust
delegator: T::AccountId
delegatee: T::AccountId
proxy_type: T::ProxyType
delay: BlockNumberFor<T>
```
</details>
</li>
</ul>
</li>
<li>Utility - 54
<ul>
<li>
<details>
<summary>
<code>BatchInterrupted(index, error)</code> - 0</summary>
Batch of dispatches did not complete fully. Index of first failing dispatch given, as
well as the error.
```rust
index: u32
error: DispatchError
```
</details>
</li>
<li>
<details>
<summary>
<code>BatchCompleted()</code> - 1</summary>
Batch of dispatches completed fully with no error.
```rust
no args
```
</details>
</li>
<li>
<details>
<summary>
<code>BatchCompletedWithErrors()</code> - 2</summary>
Batch of dispatches completed but has errors.
```rust
no args
```
</details>
</li>
<li>
<details>
<summary>
<code>ItemCompleted()</code> - 3</summary>
A single item within a Batch of dispatches has completed with no error.
```rust
no args
```
</details>
</li>
<li>
<details>
<summary>
<code>ItemFailed(error)</code> - 4</summary>
A single item within a Batch of dispatches has completed with error.
```rust
error: DispatchError
```
</details>
</li>
<li>
<details>
<summary>
<code>DispatchedAs(result)</code> - 5</summary>
A call was dispatched.
```rust
result: DispatchResult
```
</details>
</li>
</ul>
</li>
<li>Treasury - 55
<ul>
<li>
<details>
<summary>
<code>Spending(budget_remaining)</code> - 0</summary>
We have ended a spend period and will now allocate funds.
```rust
budget_remaining: BalanceOf<T, I>
```
</details>
</li>
<li>
<details>
<summary>
<code>Awarded(proposal_index, award, account)</code> - 1</summary>
Some funds have been allocated.
```rust
proposal_index: ProposalIndex
award: BalanceOf<T, I>
account: T::AccountId
```
</details>
</li>
<li>
<details>
<summary>
<code>Burnt(burnt_funds)</code> - 2</summary>
Some of our funds have been burnt.
```rust
burnt_funds: BalanceOf<T, I>
```
</details>
</li>
<li>
<details>
<summary>
<code>Rollover(rollover_balance)</code> - 3</summary>
Spending has finished; this is the amount that rolls over until next spend.
```rust
rollover_balance: BalanceOf<T, I>
```
</details>
</li>
<li>
<details>
<summary>
<code>Deposit(value)</code> - 4</summary>
Some funds have been deposited.
```rust
value: BalanceOf<T, I>
```
</details>
</li>
<li>
<details>
<summary>
<code>SpendApproved(proposal_index, amount, beneficiary)</code> - 5</summary>
A new spend proposal has been approved.
```rust
proposal_index: ProposalIndex
amount: BalanceOf<T, I>
beneficiary: T::AccountId
```
</details>
</li>
<li>
<details>
<summary>
<code>UpdatedInactive(reactivated, deactivated)</code> - 6</summary>
The inactive funds of the pallet have been updated.
```rust
reactivated: BalanceOf<T, I>
deactivated: BalanceOf<T, I>
```
</details>
</li>
<li>
<details>
<summary>
<code>AssetSpendApproved(index, asset_kind, amount, beneficiary, valid_from, expire_at)</code> - 7</summary>
A new asset spend proposal has been approved.
```rust
index: SpendIndex
asset_kind: T::AssetKind
amount: AssetBalanceOf<T, I>
beneficiary: T::Beneficiary
valid_from: BlockNumberFor<T>
expire_at: BlockNumberFor<T>
```
</details>
</li>
<li>
<details>
<summary>
<code>AssetSpendVoided(index)</code> - 8</summary>
An approved spend was voided.
```rust
index: SpendIndex
```
</details>
</li>
<li>
<details>
<summary>
<code>Paid(index, payment_id)</code> - 9</summary>
A payment happened.
```rust
index: SpendIndex
payment_id: <T::Paymaster as Pay>::Id
```
</details>
</li>
<li>
<details>
<summary>
<code>PaymentFailed(index, payment_id)</code> - 10</summary>
A payment failed and can be retried.
```rust
index: SpendIndex
payment_id: <T::Paymaster as Pay>::Id
```
</details>
</li>
<li>
<details>
<summary>
<code>SpendProcessed(index)</code> - 11</summary>
A spend was processed and removed from the storage. It might have been successfully
paid or it may have expired.
```rust
index: SpendIndex
```
</details>
</li>
</ul>
</li>
</ul>
\ No newline at end of file
# Runtime Storage
There are **139** storages from **35** pallets.
<ul>
<li>System - 0
<ul>
<li>
<details>
<summary>
<code>Account</code>
</summary>
The full account information for a particular account ID.
```rust
key: sp_core::crypto::AccountId32
value: frame_system::AccountInfo<U32, pallet_duniter_account::types::AccountData<U64, U32>>
```
</details>
</li>
<li>
<details>
<summary>
<code>ExtrinsicCount</code>
</summary>
Total extrinsics count for the current block.
```rust
value: Option<U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>InherentsApplied</code>
</summary>
Whether all inherents have been applied.
```rust
value: Bool
```
</details>
</li>
<li>
<details>
<summary>
<code>BlockWeight</code>
</summary>
The current weight for the block.
```rust
value: frame_support::dispatch::PerDispatchClass<sp_weights::weight_v2::Weight>
```
</details>
</li>
<li>
<details>
<summary>
<code>AllExtrinsicsLen</code>
</summary>
Total length (in bytes) for all extrinsics put together, for the current block.
```rust
value: Option<U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>BlockHash</code>
</summary>
Map of block numbers to block hashes.
```rust
key: U32
value: primitive_types::H256
```
</details>
</li>
<li>
<details>
<summary>
<code>ExtrinsicData</code>
</summary>
Extrinsics data for the current block (maps an extrinsic's index to its data).
```rust
key: U32
value: Vec<U8>
```
</details>
</li>
<li>
<details>
<summary>
<code>Number</code>
</summary>
The current block number being processed. Set by `execute_block`.
```rust
value: U32
```
</details>
</li>
<li>
<details>
<summary>
<code>ParentHash</code>
</summary>
Hash of the previous block.
```rust
value: primitive_types::H256
```
</details>
</li>
<li>
<details>
<summary>
<code>Digest</code>
</summary>
Digest of the current block, also part of the block header.
```rust
value: sp_runtime::generic::digest::Digest
```
</details>
</li>
<li>
<details>
<summary>
<code>Events</code>
</summary>
Events deposited for the current block.
NOTE: The item is unbound and should therefore never be read on chain.
It could otherwise inflate the PoV size of a block.
Events have a large in-memory size. Box the events to not go out-of-memory
just in case someone still reads them from within the runtime.
```rust
value: Vec<frame_system::EventRecord<gdev_runtime::RuntimeEvent, primitive_types::H256>>
```
</details>
</li>
<li>
<details>
<summary>
<code>EventCount</code>
</summary>
The number of events in the `Events<T>` list.
```rust
value: U32
```
</details>
</li>
<li>
<details>
<summary>
<code>EventTopics</code>
</summary>
Mapping between a topic (represented by T::Hash) and a vector of indexes
of events in the `<Events<T>>` list.
All topic vectors have deterministic storage locations depending on the topic. This
allows light-clients to leverage the changes trie storage tracking mechanism and
in case of changes fetch the list of events of interest.
The value has the type `(BlockNumberFor<T>, EventIndex)` because if we used only just
the `EventIndex` then in case if the topic has the same contents on the next block
no notification will be triggered thus the event might be lost.
```rust
key: primitive_types::H256
value: Vec<(U32, U32)>
```
</details>
</li>
<li>
<details>
<summary>
<code>LastRuntimeUpgrade</code>
</summary>
Stores the `spec_version` and `spec_name` of when the last runtime upgrade happened.
```rust
value: Option<frame_system::LastRuntimeUpgradeInfo>
```
</details>
</li>
<li>
<details>
<summary>
<code>UpgradedToU32RefCount</code>
</summary>
True if we have upgraded so that `type RefCount` is `u32`. False (default) if not.
```rust
value: Bool
```
</details>
</li>
<li>
<details>
<summary>
<code>UpgradedToTripleRefCount</code>
</summary>
True if we have upgraded so that AccountInfo contains three types of `RefCount`. False
(default) if not.
```rust
value: Bool
```
</details>
</li>
<li>
<details>
<summary>
<code>ExecutionPhase</code>
</summary>
The execution phase of the block.
```rust
value: Option<frame_system::Phase>
```
</details>
</li>
<li>
<details>
<summary>
<code>AuthorizedUpgrade</code>
</summary>
`Some` if a code upgrade has been authorized.
```rust
value: Option<frame_system::CodeUpgradeAuthorization<>>
```
</details>
</li>
</ul>
</li>
<li>Account - 1
<ul>
</ul>
</li>
<li>Scheduler - 2
<ul>
<li>
<details>
<summary>
<code>IncompleteSince</code>
</summary>
```rust
value: Option<U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>Agenda</code>
</summary>
Items to be executed, indexed by the block number that they should be executed on.
```rust
key: U32
value: bounded_collections::bounded_vec::BoundedVec<Option<pallet_scheduler::Scheduled<[U8; 32], frame_support::traits::preimages::Bounded<gdev_runtime::RuntimeCall, sp_runtime::traits::BlakeTwo256>, U32, gdev_runtime::OriginCaller, sp_core::crypto::AccountId32>>, >
```
</details>
</li>
<li>
<details>
<summary>
<code>Retries</code>
</summary>
Retry configurations for items to be executed, indexed by task address.
```rust
key: (U32, U32)
value: pallet_scheduler::RetryConfig<U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>Lookup</code>
</summary>
Lookup from a name to the block number and index of the task.
For v3 -> v4 the previously unbounded identities are Blake2-256 hashed to form the v4
identities.
```rust
key: [U8; 32]
value: (U32, U32)
```
</details>
</li>
</ul>
</li>
<li>Babe - 3
<ul>
<li>
<details>
<summary>
<code>EpochIndex</code>
</summary>
Current epoch index.
```rust
value: U64
```
</details>
</li>
<li>
<details>
<summary>
<code>Authorities</code>
</summary>
Current epoch authorities.
```rust
value: bounded_collections::weak_bounded_vec::WeakBoundedVec<(sp_consensus_babe::app::Public, U64), >
```
</details>
</li>
<li>
<details>
<summary>
<code>GenesisSlot</code>
</summary>
The slot at which the first epoch actually started. This is 0
until the first block of the chain.
```rust
value: sp_consensus_slots::Slot
```
</details>
</li>
<li>
<details>
<summary>
<code>CurrentSlot</code>
</summary>
Current slot number.
```rust
value: sp_consensus_slots::Slot
```
</details>
</li>
<li>
<details>
<summary>
<code>Randomness</code>
</summary>
The epoch randomness for the *current* epoch.
# Security
This MUST NOT be used for gambling, as it can be influenced by a
malicious validator in the short term. It MAY be used in many
cryptographic protocols, however, so long as one remembers that this
(like everything else on-chain) it is public. For example, it can be
used where a number is needed that cannot have been chosen by an
adversary, for purposes such as public-coin zero-knowledge proofs.
```rust
value: [U8; 32]
```
</details>
</li>
<li>
<details>
<summary>
<code>PendingEpochConfigChange</code>
</summary>
Pending epoch configuration change that will be applied when the next epoch is enacted.
```rust
value: Option<sp_consensus_babe::digests::NextConfigDescriptor>
```
</details>
</li>
<li>
<details>
<summary>
<code>NextRandomness</code>
</summary>
Next epoch randomness.
```rust
value: [U8; 32]
```
</details>
</li>
<li>
<details>
<summary>
<code>NextAuthorities</code>
</summary>
Next epoch authorities.
```rust
value: bounded_collections::weak_bounded_vec::WeakBoundedVec<(sp_consensus_babe::app::Public, U64), >
```
</details>
</li>
<li>
<details>
<summary>
<code>SegmentIndex</code>
</summary>
Randomness under construction.
We make a trade-off between storage accesses and list length.
We store the under-construction randomness in segments of up to
`UNDER_CONSTRUCTION_SEGMENT_LENGTH`.
Once a segment reaches this length, we begin the next one.
We reset all segments and return to `0` at the beginning of every
epoch.
```rust
value: U32
```
</details>
</li>
<li>
<details>
<summary>
<code>UnderConstruction</code>
</summary>
TWOX-NOTE: `SegmentIndex` is an increasing integer, so this is okay.
```rust
key: U32
value: bounded_collections::bounded_vec::BoundedVec<[U8; 32], >
```
</details>
</li>
<li>
<details>
<summary>
<code>Initialized</code>
</summary>
Temporary value (cleared at block finalization) which is `Some`
if per-block initialization has already been called for current block.
```rust
value: Option<Option<sp_consensus_babe::digests::PreDigest>>
```
</details>
</li>
<li>
<details>
<summary>
<code>AuthorVrfRandomness</code>
</summary>
This field should always be populated during block processing unless
secondary plain slots are enabled (which don't contain a VRF output).
It is set in `on_finalize`, before it will contain the value from the last block.
```rust
value: Option<[U8; 32]>
```
</details>
</li>
<li>
<details>
<summary>
<code>EpochStart</code>
</summary>
The block numbers when the last and current epoch have started, respectively `N-1` and
`N`.
NOTE: We track this is in order to annotate the block number when a given pool of
entropy was fixed (i.e. it was known to chain observers). Since epochs are defined in
slots, which may be skipped, the block numbers may not line up with the slot numbers.
```rust
value: (U32, U32)
```
</details>
</li>
<li>
<details>
<summary>
<code>Lateness</code>
</summary>
How late the current block is compared to its parent.
This entry is populated as part of block execution and is cleaned up
on block finalization. Querying this storage entry outside of block
execution context should always yield zero.
```rust
value: U32
```
</details>
</li>
<li>
<details>
<summary>
<code>EpochConfig</code>
</summary>
The configuration for the current epoch. Should never be `None` as it is initialized in
genesis.
```rust
value: Option<sp_consensus_babe::BabeEpochConfiguration>
```
</details>
</li>
<li>
<details>
<summary>
<code>NextEpochConfig</code>
</summary>
The configuration for the next epoch, `None` if the config will not change
(you can fallback to `EpochConfig` instead in that case).
```rust
value: Option<sp_consensus_babe::BabeEpochConfiguration>
```
</details>
</li>
<li>
<details>
<summary>
<code>SkippedEpochs</code>
</summary>
A list of the last 100 skipped epochs and the corresponding session index
when the epoch was skipped.
This is only used for validating equivocation proofs. An equivocation proof
must contains a key-ownership proof for a given session, therefore we need a
way to tie together sessions and epoch indices, i.e. we need to validate that
a validator was the owner of a given key on a given session, and what the
active epoch index was during that session.
```rust
value: bounded_collections::bounded_vec::BoundedVec<(U64, U32), >
```
</details>
</li>
</ul>
</li>
<li>Timestamp - 4
<ul>
<li>
<details>
<summary>
<code>Now</code>
</summary>
The current time for the current block.
```rust
value: U64
```
</details>
</li>
<li>
<details>
<summary>
<code>DidUpdate</code>
</summary>
Whether the timestamp has been updated in this block.
This value is updated to `true` upon successful submission of a timestamp by a node.
It is then checked at the end of each block execution in the `on_finalize` hook.
```rust
value: Bool
```
</details>
</li>
</ul>
</li>
<li>Parameters - 5
<ul>
<li>
<details>
<summary>
<code>ParametersStorage</code>
</summary>
```rust
value: pallet_duniter_test_parameters::types::Parameters<U32, U32, U64, U32>
```
</details>
</li>
</ul>
</li>
<li>Balances - 6
<ul>
<li>
<details>
<summary>
<code>TotalIssuance</code>
</summary>
The total units issued in the system.
```rust
value: U64
```
</details>
</li>
<li>
<details>
<summary>
<code>InactiveIssuance</code>
</summary>
The total units of outstanding deactivated balance in the system.
```rust
value: U64
```
</details>
</li>
<li>
<details>
<summary>
<code>Account</code>
</summary>
The Balances pallet example of storing the balance of an account.
# Example
```nocompile
impl pallet_balances::Config for Runtime {
type AccountStore = StorageMapShim<Self::Account<Runtime>, frame_system::Provider<Runtime>, AccountId, Self::AccountData<Balance>>
}
```
You can also store the balance of an account in the `System` pallet.
# Example
```nocompile
impl pallet_balances::Config for Runtime {
type AccountStore = System
}
```
But this comes with tradeoffs, storing account balances in the system pallet stores
`frame_system` data alongside the account data contrary to storing account balances in the
`Balances` pallet, which uses a `StorageMap` to store balances data only.
NOTE: This is only used in the case that this pallet is used to store balances.
```rust
key: sp_core::crypto::AccountId32
value: pallet_balances::types::AccountData<U64>
```
</details>
</li>
<li>
<details>
<summary>
<code>Locks</code>
</summary>
Any liquidity locks on some account balances.
NOTE: Should only be accessed when setting, changing and freeing a lock.
Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/`
```rust
key: sp_core::crypto::AccountId32
value: bounded_collections::weak_bounded_vec::WeakBoundedVec<pallet_balances::types::BalanceLock<U64>, >
```
</details>
</li>
<li>
<details>
<summary>
<code>Reserves</code>
</summary>
Named reserves on some account balances.
Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/`
```rust
key: sp_core::crypto::AccountId32
value: bounded_collections::bounded_vec::BoundedVec<pallet_balances::types::ReserveData<[U8; 8], U64>, >
```
</details>
</li>
<li>
<details>
<summary>
<code>Holds</code>
</summary>
Holds on account balances.
```rust
key: sp_core::crypto::AccountId32
value: bounded_collections::bounded_vec::BoundedVec<frame_support::traits::tokens::misc::IdAmount<gdev_runtime::RuntimeHoldReason, U64>, >
```
</details>
</li>
<li>
<details>
<summary>
<code>Freezes</code>
</summary>
Freeze locks on account balances.
```rust
key: sp_core::crypto::AccountId32
value: bounded_collections::bounded_vec::BoundedVec<frame_support::traits::tokens::misc::IdAmount<(), U64>, >
```
</details>
</li>
</ul>
</li>
<li>TransactionPayment - 32
<ul>
<li>
<details>
<summary>
<code>NextFeeMultiplier</code>
</summary>
```rust
value: sp_arithmetic::fixed_point::FixedU128
```
</details>
</li>
<li>
<details>
<summary>
<code>StorageVersion</code>
</summary>
```rust
value: pallet_transaction_payment::Releases
```
</details>
</li>
</ul>
</li>
<li>OneshotAccount - 7
<ul>
<li>
<details>
<summary>
<code>OneshotAccounts</code>
</summary>
The balance for each oneshot account.
```rust
key: sp_core::crypto::AccountId32
value: U64
```
</details>
</li>
</ul>
</li>
<li>Quota - 66
<ul>
<li>
<details>
<summary>
<code>IdtyQuota</code>
</summary>
The quota for each identity.
```rust
key: U32
value: pallet_quota::pallet::Quota<U32, U64>
```
</details>
</li>
<li>
<details>
<summary>
<code>RefundQueue</code>
</summary>
The fees waiting to be refunded.
```rust
value: bounded_collections::bounded_vec::BoundedVec<pallet_quota::pallet::Refund<sp_core::crypto::AccountId32, U32, U64>, >
```
</details>
</li>
</ul>
</li>
<li>SmithMembers - 10
<ul>
<li>
<details>
<summary>
<code>Smiths</code>
</summary>
The Smith metadata for each identity.
```rust
key: U32
value: pallet_smith_members::types::SmithMeta<U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>ExpiresOn</code>
</summary>
The indexes of Smith to remove at a given session.
```rust
key: U32
value: Vec<U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>CurrentSession</code>
</summary>
The current session index.
```rust
value: U32
```
</details>
</li>
</ul>
</li>
<li>AuthorityMembers - 11
<ul>
<li>
<details>
<summary>
<code>IncomingAuthorities</code>
</summary>
The incoming authorities.
```rust
value: Vec<U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>OnlineAuthorities</code>
</summary>
The online authorities.
```rust
value: Vec<U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>OutgoingAuthorities</code>
</summary>
The outgoing authorities.
```rust
value: Vec<U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>Members</code>
</summary>
The member data.
```rust
key: U32
value: pallet_authority_members::types::MemberData<sp_core::crypto::AccountId32>
```
</details>
</li>
<li>
<details>
<summary>
<code>Blacklist</code>
</summary>
The blacklisted authorities.
```rust
value: Vec<U32>
```
</details>
</li>
</ul>
</li>
<li>Authorship - 12
<ul>
<li>
<details>
<summary>
<code>Author</code>
</summary>
Author of current block.
```rust
value: Option<sp_core::crypto::AccountId32>
```
</details>
</li>
</ul>
</li>
<li>Offences - 13
<ul>
<li>
<details>
<summary>
<code>Reports</code>
</summary>
The primary structure that holds all offence records keyed by report identifiers.
```rust
key: primitive_types::H256
value: sp_staking::offence::OffenceDetails<sp_core::crypto::AccountId32, (sp_core::crypto::AccountId32, common_runtime::entities::ValidatorFullIdentification)>
```
</details>
</li>
<li>
<details>
<summary>
<code>ConcurrentReportsIndex</code>
</summary>
A vector of reports of the same kind that happened at the same time slot.
```rust
key: ([U8; 16], Vec<U8>)
value: Vec<primitive_types::H256>
```
</details>
</li>
</ul>
</li>
<li>Historical - 14
<ul>
<li>
<details>
<summary>
<code>HistoricalSessions</code>
</summary>
Mapping from historical session indices to session-data root hash and validator count.
```rust
key: U32
value: (primitive_types::H256, U32)
```
</details>
</li>
<li>
<details>
<summary>
<code>StoredRange</code>
</summary>
The range of historical sessions we store. [first, last)
```rust
value: Option<(U32, U32)>
```
</details>
</li>
</ul>
</li>
<li>Session - 15
<ul>
<li>
<details>
<summary>
<code>Validators</code>
</summary>
The current set of validators.
```rust
value: Vec<sp_core::crypto::AccountId32>
```
</details>
</li>
<li>
<details>
<summary>
<code>CurrentIndex</code>
</summary>
Current index of the session.
```rust
value: U32
```
</details>
</li>
<li>
<details>
<summary>
<code>QueuedChanged</code>
</summary>
True if the underlying economic identities or weighting behind the validators
has changed in the queued validator set.
```rust
value: Bool
```
</details>
</li>
<li>
<details>
<summary>
<code>QueuedKeys</code>
</summary>
The queued keys for the next session. When the next session begins, these keys
will be used to determine the validator's session keys.
```rust
value: Vec<(sp_core::crypto::AccountId32, gdev_runtime::opaque::SessionKeys)>
```
</details>
</li>
<li>
<details>
<summary>
<code>DisabledValidators</code>
</summary>
Indices of disabled validators.
The vec is always kept sorted so that we can find whether a given validator is
disabled using binary search. It gets cleared when `on_session_ending` returns
a new set of identities.
```rust
value: Vec<U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>NextKeys</code>
</summary>
The next session keys for a validator.
```rust
key: sp_core::crypto::AccountId32
value: gdev_runtime::opaque::SessionKeys
```
</details>
</li>
<li>
<details>
<summary>
<code>KeyOwner</code>
</summary>
The owner of a key. The key is the `KeyTypeId` + the encoded key.
```rust
key: (sp_core::crypto::KeyTypeId, Vec<U8>)
value: sp_core::crypto::AccountId32
```
</details>
</li>
</ul>
</li>
<li>Grandpa - 16
<ul>
<li>
<details>
<summary>
<code>State</code>
</summary>
State of the current authority set.
```rust
value: pallet_grandpa::StoredState<U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>PendingChange</code>
</summary>
Pending change: (signaled at, scheduled change).
```rust
value: Option<pallet_grandpa::StoredPendingChange<U32, >>
```
</details>
</li>
<li>
<details>
<summary>
<code>NextForced</code>
</summary>
next block number where we can force a change.
```rust
value: Option<U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>Stalled</code>
</summary>
`true` if we are currently stalled.
```rust
value: Option<(U32, U32)>
```
</details>
</li>
<li>
<details>
<summary>
<code>CurrentSetId</code>
</summary>
The number of changes (both in terms of keys and underlying economic responsibilities)
in the "set" of Grandpa validators from genesis.
```rust
value: U64
```
</details>
</li>
<li>
<details>
<summary>
<code>SetIdSession</code>
</summary>
A mapping from grandpa set ID to the index of the *most recent* session for which its
members were responsible.
This is only used for validating equivocation proofs. An equivocation proof must
contains a key-ownership proof for a given session, therefore we need a way to tie
together sessions and GRANDPA set ids, i.e. we need to validate that a validator
was the owner of a given key on a given session, and what the active set ID was
during that session.
TWOX-NOTE: `SetId` is not under user control.
```rust
key: U64
value: U32
```
</details>
</li>
<li>
<details>
<summary>
<code>Authorities</code>
</summary>
The current list of authorities.
```rust
value: bounded_collections::weak_bounded_vec::WeakBoundedVec<(sp_consensus_grandpa::app::Public, U64), >
```
</details>
</li>
</ul>
</li>
<li>ImOnline - 17
<ul>
<li>
<details>
<summary>
<code>HeartbeatAfter</code>
</summary>
The block number after which it's ok to send heartbeats in the current
session.
At the beginning of each session we set this to a value that should fall
roughly in the middle of the session duration. The idea is to first wait for
the validators to produce a block in the current session, so that the
heartbeat later on will not be necessary.
This value will only be used as a fallback if we fail to get a proper session
progress estimate from `NextSessionRotation`, as those estimates should be
more accurate then the value we calculate for `HeartbeatAfter`.
```rust
value: U32
```
</details>
</li>
<li>
<details>
<summary>
<code>Keys</code>
</summary>
The current set of keys that may issue a heartbeat.
```rust
value: bounded_collections::weak_bounded_vec::WeakBoundedVec<pallet_im_online::sr25519::app_sr25519::Public, >
```
</details>
</li>
<li>
<details>
<summary>
<code>ReceivedHeartbeats</code>
</summary>
For each session index, we keep a mapping of `SessionIndex` and `AuthIndex`.
```rust
key: (U32, U32)
value: Bool
```
</details>
</li>
<li>
<details>
<summary>
<code>AuthoredBlocks</code>
</summary>
For each session index, we keep a mapping of `ValidatorId<T>` to the
number of blocks authored by the given authority.
```rust
key: (U32, sp_core::crypto::AccountId32)
value: U32
```
</details>
</li>
</ul>
</li>
<li>AuthorityDiscovery - 18
<ul>
<li>
<details>
<summary>
<code>Keys</code>
</summary>
Keys of the current authority set.
```rust
value: bounded_collections::weak_bounded_vec::WeakBoundedVec<sp_authority_discovery::app::Public, >
```
</details>
</li>
<li>
<details>
<summary>
<code>NextKeys</code>
</summary>
Keys of the next authority set.
```rust
value: bounded_collections::weak_bounded_vec::WeakBoundedVec<sp_authority_discovery::app::Public, >
```
</details>
</li>
</ul>
</li>
<li>Sudo - 20
<ul>
<li>
<details>
<summary>
<code>Key</code>
</summary>
The `AccountId` of the sudo key.
```rust
value: Option<sp_core::crypto::AccountId32>
```
</details>
</li>
</ul>
</li>
<li>UpgradeOrigin - 21
<ul>
</ul>
</li>
<li>Preimage - 22
<ul>
<li>
<details>
<summary>
<code>StatusFor</code>
</summary>
The request status of a given hash.
```rust
key: primitive_types::H256
value: pallet_preimage::OldRequestStatus<sp_core::crypto::AccountId32, U64>
```
</details>
</li>
<li>
<details>
<summary>
<code>RequestStatusFor</code>
</summary>
The request status of a given hash.
```rust
key: primitive_types::H256
value: pallet_preimage::RequestStatus<sp_core::crypto::AccountId32, ()>
```
</details>
</li>
<li>
<details>
<summary>
<code>PreimageFor</code>
</summary>
```rust
key: (primitive_types::H256, U32)
value: bounded_collections::bounded_vec::BoundedVec<U8, >
```
</details>
</li>
</ul>
</li>
<li>TechnicalCommittee - 23
<ul>
<li>
<details>
<summary>
<code>Proposals</code>
</summary>
The hashes of the active proposals.
```rust
value: bounded_collections::bounded_vec::BoundedVec<primitive_types::H256, >
```
</details>
</li>
<li>
<details>
<summary>
<code>ProposalOf</code>
</summary>
Actual proposal for a given hash, if it's current.
```rust
key: primitive_types::H256
value: gdev_runtime::RuntimeCall
```
</details>
</li>
<li>
<details>
<summary>
<code>CostOf</code>
</summary>
Consideration cost created for publishing and storing a proposal.
Determined by [Config::Consideration] and may be not present for certain proposals (e.g. if
the proposal count at the time of creation was below threshold N).
```rust
key: primitive_types::H256
value: (sp_core::crypto::AccountId32, ())
```
</details>
</li>
<li>
<details>
<summary>
<code>Voting</code>
</summary>
Votes on a given proposal, if it is ongoing.
```rust
key: primitive_types::H256
value: pallet_collective::Votes<sp_core::crypto::AccountId32, U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>ProposalCount</code>
</summary>
Proposals so far.
```rust
value: U32
```
</details>
</li>
<li>
<details>
<summary>
<code>Members</code>
</summary>
The current members of the collective. This is stored sorted (just by value).
```rust
value: Vec<sp_core::crypto::AccountId32>
```
</details>
</li>
<li>
<details>
<summary>
<code>Prime</code>
</summary>
The prime member that helps determine the default vote behavior in case of abstentions.
```rust
value: Option<sp_core::crypto::AccountId32>
```
</details>
</li>
</ul>
</li>
<li>UniversalDividend - 30
<ul>
<li>
<details>
<summary>
<code>CurrentUd</code>
</summary>
The current Universal Dividend value.
```rust
value: U64
```
</details>
</li>
<li>
<details>
<summary>
<code>CurrentUdIndex</code>
</summary>
The current Universal Dividend index.
```rust
value: U16
```
</details>
</li>
<li>
<details>
<summary>
<code>MonetaryMass</code>
</summary>
The total quantity of money created by Universal Dividend, excluding potential money destruction.
```rust
value: U64
```
</details>
</li>
<li>
<details>
<summary>
<code>NextReeval</code>
</summary>
The next Universal Dividend re-evaluation.
```rust
value: Option<U64>
```
</details>
</li>
<li>
<details>
<summary>
<code>NextUd</code>
</summary>
The next Universal Dividend creation.
```rust
value: Option<U64>
```
</details>
</li>
<li>
<details>
<summary>
<code>PastReevals</code>
</summary>
The past Universal Dividend re-evaluations.
```rust
value: bounded_collections::bounded_vec::BoundedVec<(U16, U64), >
```
</details>
</li>
</ul>
</li>
<li>Wot - 40
<ul>
</ul>
</li>
<li>Identity - 41
<ul>
<li>
<details>
<summary>
<code>Identities</code>
</summary>
The identity value for each identity.
```rust
key: U32
value: pallet_identity::types::IdtyValue<U32, sp_core::crypto::AccountId32, common_runtime::entities::IdtyData>
```
</details>
</li>
<li>
<details>
<summary>
<code>CounterForIdentities</code>
</summary>
Counter for the related counted storage map
```rust
value: U32
```
</details>
</li>
<li>
<details>
<summary>
<code>IdentityIndexOf</code>
</summary>
The identity associated with each account.
```rust
key: sp_core::crypto::AccountId32
value: U32
```
</details>
</li>
<li>
<details>
<summary>
<code>IdentitiesNames</code>
</summary>
The name associated with each identity.
```rust
key: pallet_identity::types::IdtyName
value: U32
```
</details>
</li>
<li>
<details>
<summary>
<code>NextIdtyIndex</code>
</summary>
The identity index to assign to the next created identity.
```rust
value: U32
```
</details>
</li>
<li>
<details>
<summary>
<code>IdentityChangeSchedule</code>
</summary>
The identities to remove at a given block.
```rust
key: U32
value: Vec<U32>
```
</details>
</li>
</ul>
</li>
<li>Membership - 42
<ul>
<li>
<details>
<summary>
<code>Membership</code>
</summary>
The membership data for each identity.
```rust
key: U32
value: sp_membership::MembershipData<U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>CounterForMembership</code>
</summary>
Counter for the related counted storage map
```rust
value: U32
```
</details>
</li>
<li>
<details>
<summary>
<code>MembershipsExpireOn</code>
</summary>
The identities of memberships to expire at a given block.
```rust
key: U32
value: Vec<U32>
```
</details>
</li>
</ul>
</li>
<li>Certification - 43
<ul>
<li>
<details>
<summary>
<code>StorageIdtyCertMeta</code>
</summary>
The certification metadata for each issuer.
```rust
key: U32
value: pallet_certification::types::IdtyCertMeta<U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>CertsByReceiver</code>
</summary>
The certifications for each receiver.
```rust
key: U32
value: Vec<(U32, U32)>
```
</details>
</li>
<li>
<details>
<summary>
<code>CertsRemovableOn</code>
</summary>
The certifications that should expire at a given block.
```rust
key: U32
value: Vec<(U32, U32)>
```
</details>
</li>
</ul>
</li>
<li>Distance - 44
<ul>
<li>
<details>
<summary>
<code>EvaluationPool0</code>
</summary>
The first evaluation pool for distance evaluation queuing identities to evaluate for a given
evaluator account.
```rust
value: pallet_distance::types::EvaluationPool<sp_core::crypto::AccountId32, U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>EvaluationPool1</code>
</summary>
The second evaluation pool for distance evaluation queuing identities to evaluate for a given
evaluator account.
```rust
value: pallet_distance::types::EvaluationPool<sp_core::crypto::AccountId32, U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>EvaluationPool2</code>
</summary>
The third evaluation pool for distance evaluation queuing identities to evaluate for a given
evaluator account.
```rust
value: pallet_distance::types::EvaluationPool<sp_core::crypto::AccountId32, U32>
```
</details>
</li>
<li>
<details>
<summary>
<code>EvaluationBlock</code>
</summary>
The block at which the distance is evaluated.
```rust
value: primitive_types::H256
```
</details>
</li>
<li>
<details>
<summary>
<code>PendingEvaluationRequest</code>
</summary>
The pending evaluation requesters.
```rust
key: U32
value: sp_core::crypto::AccountId32
```
</details>
</li>
<li>
<details>
<summary>
<code>DidUpdate</code>
</summary>
Store if the evaluation was updated in this block.
```rust
value: Bool
```
</details>
</li>
<li>
<details>
<summary>
<code>CurrentPeriodIndex</code>
</summary>
The current evaluation period index.
```rust
value: U32
```
</details>
</li>
</ul>
</li>
<li>AtomicSwap - 50
<ul>
<li>
<details>
<summary>
<code>PendingSwaps</code>
</summary>
```rust
key: (sp_core::crypto::AccountId32, [U8; 32])
value: pallet_atomic_swap::PendingSwap<>
```
</details>
</li>
</ul>
</li>
<li>Multisig - 51
<ul>
<li>
<details>
<summary>
<code>Multisigs</code>
</summary>
The set of open multisig operations.
```rust
key: (sp_core::crypto::AccountId32, [U8; 32])
value: pallet_multisig::Multisig<U32, U64, sp_core::crypto::AccountId32, >
```
</details>
</li>
</ul>
</li>
<li>ProvideRandomness - 52
<ul>
<li>
<details>
<summary>
<code>NexEpochHookIn</code>
</summary>
The number of blocks before the next epoch.
```rust
value: U8
```
</details>
</li>
<li>
<details>
<summary>
<code>RequestIdProvider</code>
</summary>
The request ID.
```rust
value: U64
```
</details>
</li>
<li>
<details>
<summary>
<code>RequestsReadyAtNextBlock</code>
</summary>
The requests that will be fulfilled at the next block.
```rust
value: Vec<pallet_provide_randomness::types::Request>
```
</details>
</li>
<li>
<details>
<summary>
<code>RequestsReadyAtEpoch</code>
</summary>
The requests that will be fulfilled at the next epoch.
```rust
key: U64
value: Vec<pallet_provide_randomness::types::Request>
```
</details>
</li>
<li>
<details>
<summary>
<code>RequestsIds</code>
</summary>
The requests being processed.
```rust
key: U64
value: ()
```
</details>
</li>
<li>
<details>
<summary>
<code>CounterForRequestsIds</code>
</summary>
Counter for the related counted storage map
```rust
value: U32
```
</details>
</li>
</ul>
</li>
<li>Proxy - 53
<ul>
<li>
<details>
<summary>
<code>Proxies</code>
</summary>
The set of account proxies. Maps the account which has delegated to the accounts
which are being delegated to, together with the amount held on deposit.
```rust
key: sp_core::crypto::AccountId32
value: (bounded_collections::bounded_vec::BoundedVec<pallet_proxy::ProxyDefinition<sp_core::crypto::AccountId32, gdev_runtime::ProxyType, U32>, >, U64)
```
</details>
</li>
<li>
<details>
<summary>
<code>Announcements</code>
</summary>
The announcements made by the proxy (key).
```rust
key: sp_core::crypto::AccountId32
value: (bounded_collections::bounded_vec::BoundedVec<pallet_proxy::Announcement<sp_core::crypto::AccountId32, primitive_types::H256, U32>, >, U64)
```
</details>
</li>
</ul>
</li>
<li>Utility - 54
<ul>
</ul>
</li>
<li>Treasury - 55
<ul>
<li>
<details>
<summary>
<code>ProposalCount</code>
</summary>
DEPRECATED: associated with `spend_local` call and will be removed in May 2025.
Refer to <https://github.com/paritytech/polkadot-sdk/pull/5961> for migration to `spend`.
Number of proposals that have been made.
```rust
value: U32
```
</details>
</li>
<li>
<details>
<summary>
<code>Proposals</code>
</summary>
DEPRECATED: associated with `spend_local` call and will be removed in May 2025.
Refer to <https://github.com/paritytech/polkadot-sdk/pull/5961> for migration to `spend`.
Proposals that have been made.
```rust
key: U32
value: pallet_treasury::Proposal<sp_core::crypto::AccountId32, U64>
```
</details>
</li>
<li>
<details>
<summary>
<code>Deactivated</code>
</summary>
The amount which has been reported as inactive to Currency.
```rust
value: U64
```
</details>
</li>
<li>
<details>
<summary>
<code>Approvals</code>
</summary>
DEPRECATED: associated with `spend_local` call and will be removed in May 2025.
Refer to <https://github.com/paritytech/polkadot-sdk/pull/5961> for migration to `spend`.
Proposal indices that have been approved but not yet awarded.
```rust
value: bounded_collections::bounded_vec::BoundedVec<U32, >
```
</details>
</li>
<li>
<details>
<summary>
<code>SpendCount</code>
</summary>
The count of spends that have been made.
```rust
value: U32
```
</details>
</li>
<li>
<details>
<summary>
<code>Spends</code>
</summary>
Spends that have been approved and being processed.
```rust
key: U32
value: pallet_treasury::SpendStatus<(), U64, sp_core::crypto::AccountId32, U32, ()>
```
</details>
</li>
<li>
<details>
<summary>
<code>LastSpendPeriod</code>
</summary>
The blocknumber for the last triggered spend period.
```rust
value: Option<U32>
```
</details>
</li>
</ul>
</li>
</ul>
# Beginner walkthrough
This is a beginner tutorial for those who do not have a previous experience with Rust ecosystem or need guidance to get familiar with Duniter v2s project. You'll need a development machine with an internet connection, at least **20 GB of free storage**, and **an hour or two** depending on your computing power.
This walkthrough is based on the following video (french), don't hesitate to record an english voiceover if you feel so.
[![preview](https://tube.p2p.legal/lazy-static/previews/654006dc-66c0-4e37-a32f-b7b5a1c13213.jpg)](https://tube.p2p.legal/w/n4TXxQ4SqxzpHPY4TNMXFu)
> video walkthrough on peertube https://tube.p2p.legal/w/n4TXxQ4SqxzpHPY4TNMXFu
## Requirements
If you are on a debian based system, you can install the required packages with:
```bash
sudo apt install cmake pkg-config libssl-dev git build-essential clang libclang-dev curl protobuf-compiler
```
Else, look at the corresponding section in the [system setup documentation](./setup.md).
Rust recommended installation method is through the rustup script that you can run with:
```bash
curl https://sh.rustup.rs -sSf | sh
```
If you reopen your terminal, it will give you access to the `rustup`, `rustc` and `cargo` commands. You can then install the required Rust toolchains with:
```bash
rustup default stable
rustup update nightly
rustup update stable
rustup target add wasm32-unknown-unknown --toolchain nightly
```
This can take about **2 minutes**.
## Build project
After cloning wherever you want the `duniter-v2s` repo with:
```bash
git clone https://git.duniter.org/nodes/rust/duniter-v2s.git
```
you can go to the root folder and build the substrate client and default runtime with:
```bash
cargo build
```
This will take about **2 minutes** to download dependencies plus between 5 and **15 minutes** to build in debug mode depending on the power of your processor. At this point, you built the *substrate client* (a kind of "shell" in which lies the runtime) and the default *runtime* itself. You can run a local blockchain with:
```bash
cargo run -- --dev --tmp # here, --dev means --chain=dev which selects the gdev runtime
```
When you see the logs, the blockchain is running and you can connect to it with polkadotjs app: [https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:9944](https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944). You should see blocks being added every 6 seconds. You can use Alice, Bob, etc test accounts to submit extrinsics.
## Autocompletion
When using Duniter commands, you will benefit a lot from commands autocompletion. This can be achieved by following [autocompletion documentation](../user/autocompletion.md) for you shell. If you use bash the commands are:
```bash
# create local dir to store completion script
mkdir -p ~/.local/share/duniter
# export the bash completion file
cargo run -- completion --generator bash > ~/.local/share/duniter/completion.bash
# add the following line to your ~/.bashrc to automatically load completion on startup
[[ -f $HOME/.local/share/duniter/completion.bash ]] && source $HOME/.local/share/duniter/completion.bash
```
You will then benefit from completion using `<Tab>` key and `*`.
## End-to-end tests using cucumber
Cucumber end2end tests are a good way to dive in Duniter's business procedure. They work by spawning a local blockchain and submitting extrinsics to it. You can build and run the cucumber tests by running:
```bash
cargo cucumber
```
which should take about **4 minutes** to build and run the tests. A highly detailed documentation about the end2end tests is available [in the dedicated folder](../../end2end-tests/README.md), you will learn how to read and modify the tests.
## Get in touch with us
Wether you are stuck and need help or have sucessfully completed this tutorial, don't hesitate to get in touch with us on the Duniter forum! If you found this walkthrough useful, please 🙏 let us know on the [walkthrough topic](https://forum.duniter.org/t/contribuer-a-duniter-tutoriel-video/9770) on the forum 😊.
\ No newline at end of file
# Compilation
Duniter is compiled using the Rust compiler. For a general overview, refer to the [Rustc Dev Guide](https://rustc-dev-guide.rust-lang.org/overview.html).
Substrate and Duniter provide a set of features enabling or disabling parts of the code using conditional compilation. More information on conditional compilation can be found [here](https://doc.rust-lang.org/reference/conditional-compilation.html), or by enabling or disabling compilation of packages. Below is a list of all available features:
## External
- **runtime-benchmarks**: Compiles the runtime with benchmarks for extrinsics benchmarking.
- **try-runtime**: Compiles the runtime for tests and verifies operations in a simulated environment.
- **std**: Enables the Rust standard library.
## Duniter
- **gdev**: Sets `gdev-runtime` and `std` used to build the development chain.
- **gtest**: Sets `gtest-runtime` and `std` used to build the test chain.
- **g1**: Sets `g1-runtime` and `std` used to build the production chain.
- **constant-fees**: Uses a constant and predictable weight-to-fee conversion only for testing.
- **embed**: Enables hardcoded live chainspecs loaded from "../specs/gtest-raw.json" file.
- **native**: Compiles the runtime into native-platform executable only for debugging purposes.
Note: By default, Duniter will be compiled using the `gdev` feature and including the compilation of the distance oracle. Since the three Duniter chains are mutually exclusive, it is mandatory to disable the default feature to compile `gtest` and `g1` as follows:
- `cargo build --no-default-features --features gtest`
- `cargo build --no-default-features --features g1`
- `cargo build --no-default-features -p distance-oracle --features std`
# Duniter git conventions
## TL;DR summary of this page, workflow instructions
The summary gives an overview of the rules described below. Reading it will help you to dive into the details.
- draft work must be prefixed by "WIP" (work in progress)
- the naming of final commits must comply with the template `type(scope): action subject`
- one should communicate with developers through dedicated spaces
- integrating a contribution can only be done via a merge request on our gitlab option and since the following critera are fullfilled
- branch up to date with `master` branch (except hotfixes, see the hotfix section)
- idiomatic code formatting, automated tests passed successfully
- clean commit history, understandable and concise
- contribution approved by a reviewer
## Naming commits
Every commit must comply with [conventional commit specification v1.0.0].
The commit name has to be meaningful in the context of commit history reread. It should not make reference to a specific MR or discussion.
Among other, commit history is used in changlogs and to track the project progress, that's why it has to be self-explanatory.
If you have a new need, please contact the main developers to add a type together.
## Update strategy
We only use **rebases**, *merges* are strictly fordbidden !
Every time the `master` branch is updated, you must rebase each of your working branch on it. For each of them:
1. Go on your branch
1. Rebase on master with `git rebase master`
1. If you see conflicts, fix them by editing the sources. Once it is done, you must:
1. commit the files that were in conflict
1. continue the rebase with `git rebase --continue`
1. Keep doing until you don't have any more conflict after `git rebase --continue`.
To prevent accidental merge commits, we recommend to force the `--ff-only` option on the merge command:
git config --global merge.ff only
## When to push
Ideally, you should push when you are about to shut down your computer, so about once a day.
You must prefix your commit with `wip:` when it is a work in progress.
> But why push if I am not done ?
Pushing is no big deal and prevents you from loosing work in case of
any problem with your material.
## Before requesting proofreading of your merge request
After complying with the above criteria in your commits, you should check that your branch is up to date with the target branch (`master` in this example). As this branch is moving forward frequently, it is possible that new commits may have occurred while you were working on your branch (named YOUR_BRANCH, here). If this is the case or in case of doubt, to update your branch with respect to `master`, do the following:
```bash
git checkout master # switch to master branch
git pull # updates the remote branch based on remote
git checkout YOU_BRANCH # switch back to your branch
git rebase master # rebase you work on master branch
```
In case of conflict during rebase that you can not solve, contact a lead developer telling them the hash of the commit on which YOUR_BRANCH is currently based so they can reproduce the rebase and see the conflicts. While waiting for their answer, you can cancel the rebase and work on YOUR_BRANCH without updating:
```
git rebase --abort
```
It is better to take your time before integrating a new contribution because the history of the master branch cannot be modified: it is a protected branch. Each commit on this branch remains there *ad vitam aeternam* that is why we make sure to keep a clear and understandable commit history.
## Discussion in a merge request
On Gitlab, a discussion is opened for each merge request. It will allow you to discuss the changes you have made. Feel free to tag someone by writing @pseudo so that they are notified of your request. Don't be impatient, the review of your contribution may take more or less time depending on its content!
The general discussion is used to comment on the merge request as a whole, for example to tag a developer for a proofreading request. When it comes to discussing a specific change in the code, you should go to the "Changes" tab of the merge request and comment under the code extract involved. This makes it easier to break down the resolution of problems raised by the merge request via the "comment resolution" feature. Each segment can be marked as resolved, but only the reviewer is allowed to do so!
## How to merge
When you finished developing, you must compile, run linter and run all tests:
cargo fmt
cargo clippy
cargo tu
cargo cucumber
Then commit everything.
In case you had a `wip:` prefix, you can remove it.
If you have a pile of commits, use the useful interactive rebase to clean up your branch history and create atomic ones:
git rebase -i master
There you can rename the `wip:` commits, you can "fixup" commits that go together, you can rename and re-order commits,...
After an interactive rebase, your local git history differs from Gitlab's version, so you need a force push to make it to Gitlab:
git push -f
Now is time to go to Gitlab and re-check your commits.
Wait for the Continuous Integration pipeline to finish (it lasts ±20min), and at last when it is done you can remove the "WIP" mention of your Merge Request and mention (with "@name") the lead developers to ask for a code review.
## Workflow
There are 3 types of permanent branches:
- The `master` branch is the default branch (the trunk), all contributions must be merged to this branch (except hotfixes).
- The `stable` branch, it always points to the most recent tag of the latest stable release. It is used as a reference for documentation, in particular.
- The hotfix branches, in `hotfix/x.y` format. A hotfix branch for an `x.y` release is only created when there is a patch to be released to production on that `x.y` release that cannot wait for the next release.
## Hotfix
If a blocking bug occurs in production and requires a hotfix, the latter must be the subject of 2 issues and 2 branches :
1. The original issue, must be processed on a `hotfix/issue-number-or-bug-description` branch, then merged to the `hotfix/x.y` branch, where `x.y` is the version in production at that time.
2. A carryover issue must be created, quoting the original issue and tracing the bug fix to the `master` branch. If for any reason the hotfix does not need to be carried over to the `master` branch, the carryover issue should explain why and then be closed.
[conventional commit specification v1.0.0]: https://www.conventionalcommits.org/en/v1.0.0/#specification
docs/dev/img/release-pipeline.png

44.1 KiB

# How to launch a live network
Launching a new live network is more difficult than spawning a local blockchain. Follow this process if you know what you are doing and you already experimented a bit with local blockchains. Part of this process is automated with Rust scripts, including interaction with GitLab's GraphQL API. Do not hesitate to improve and complete it (see TODOs inside `xtask/**/*.rs` files).
## Requirements
In order to build in a standardized environment, you need Docker.
- see docker docs to [install docker](https://docs.docker.com/engine/install/)
- make sure you can run docker as non-root user with `docker info` or so
## Preparation
When launching a new network, you're likely to use a new runtime. See how to [release a new runtime](./release-new-runtime.md).
### Inject runtime in chainspec
ĞDev runtime is automatically embeded in the raw chainspec with the `include_bytes!` macro. An other way to inject the runtime is to use "inject-runtime-code" xtask:
```bash
cargo xtask inject-runtime-code --runtime runtime/gdev/target/srtool/release/wbuild/gdev-runtime/gdev_runtime.compact.compressed.wasm --raw-spec resources/gdev-raw.json
```
## Bootstraping
### Choose the currency type
For now, only `gdev` is supported.
In the commands that will be indicated afterwards, you will have to replace `CURRENCY` by the
currency type you have chosen.
### Choose the docker image
Choose the docker image that contains the version of the code that you want to use.
In the commands that will be indicated afterwards, you will have to replace `TAG` by the tag of the
docker image that you have chosen (example : runtime-400).
### Generate the session keys of genesis authority
Generate a random secret phrase:
```bash
$ docker run --rm duniter/duniter-v2s:TAG -- key generate
Secret phrase: noble stay fury mean poverty delay stadium organ evil east vague can
Secret seed: 0xb39c31fb10c5080721738880c2ea45412cb3df33df022bf8d9a51483b3a9b7a6
Public key (hex): 0x90a0c2866034db9d05f8193a95fe5af8d5e12ab295a501c17c95cdbeaf226d62
Account ID: 0x90a0c2866034db9d05f8193a95fe5af8d5e12ab295a501c17c95cdbeaf226d62
Public key (SS58): 5FLLWRsxdLKfXH9VQH6Yv73hN1oc9KoFkZ5LEHEz1uTR1Qt3
SS58 Address: 5FLLWRsxdLKfXH9VQH6Yv73hN1oc9KoFkZ5LEHEz1uTR1Qt3
```
Keep this secret phrase **carefully**, it will be used **several** times later.
Then, generate the session keys:
```bash
$ docker run --rm duniter/duniter-v2s:TAG -- key generate-session-keys --chain CURRENCY_local --suri "<your secret phrase>"
Session Keys: 0x87189d723e1b2826c243bc433c718ac26ba60526932216a09102a254d54462b890a0c2866034db9d05f8193a95fe5af8d5e12ab295a501c17c95cdbeaf226d6290a0c2866034db9d05f8193a95fe5af8d5e12ab295a501c17c95cdbeaf226d6290a0c2866034db9d05f8193a95fe5af8d5e12ab295a501c17c95cdbeaf226d62
```
### Paste sessions keys in the genesis configuration file
An example of genesis configuration file: `resources/gdev.json`. Paste your session keys in your `smith` identity with key `session_keys`.
### Generate raw spec
```docker
docker run -v $HOME/dev/duniter-v2s/resources:/var/lib/duniter/resources -e DUNITER_GENESIS_CONFIG=/var/lib/duniter/resources/gdev.json --rm duniter/duniter-v2s:TAG -- build-spec -lerror --chain=gdev_live --raw > name-raw.json
```
```bash
./scripts/gen-live-network-raw-spec.sh CURRENCY "<path/to/your/genesis/config/file>"
```
This builds the specs using debug version of Duniter.
### Generate the docker compose and prepare nodes keys
```bash
./scripts/create-live-network.sh "<your secret phrase>" CURRENCY "<path/to/dist/folder>"
```
The new distribution folder can be copied to a server
```bash
scp -r "<path/to/dist/folder>" <server>:/remote/dist/path
```
then on the server, launch the compose file from the the distribution folder's root:
```bash
ssh <server>
cd "<path/to/dist/folder>"
docker compose up -d
```
This is the first node of the new live network.
## Finalization
The following steps should be completed once you are satisfied with the new live network.
### Rotate session keys
You should rotate session keys for more secured keys produced on the server (the one you used before are still in your develop machine bash history and clipboard).
### Publish image
With these new session keys in the chainspec and the runtime build with srtool, you can release the new runtime again with:
```bash
cargo xtask release-runtime 400
```
### Tell the other smith
Once you completed all these steps, the other smith can pull the docker image with a genesis containing your bootnode with the correct session keys. They can base their `docker-compose.yml` on the `duniter-validator` template.
# Duniter Pallet Conventions
## Call
Custom Duniter pallet calls should adhere to the standard Substrate naming convention:
- `action_` for regular calls (e.g., `create_identity`).
- `force_action_` for calls with a privileged origin (e.g., `force_set_distance_status`).
## Error
In the event of a call failure, it should trigger a pallet error with a self-explanatory name, for instance, `IdtyNotFound`.
## Event
Successful calls should deposit a system event to notify external entities of the change. The event name should be self-explanatory and structured in the form of a Rust struct with named fields, ensuring clarity in autogenerated documentation. An example is:
```rust
IdtyRemoved {
idty_index: T::IdtyIndex,
reason: IdtyRemovalReason<T::IdtyRemovalOtherReason>,
}
```
## Hook
Hooks are inherently infallible, and no errors should be emitted within them. To monitor progression from inside the hook, events can be employed to inform external entities about changes or no-changes.
## Internal Function
Internal functions should adhere to the following naming convention:
- `do_action_` for regular functions executing the base logic of a call (e.g., `do_remove_identity_`). These functions should directly emit events and trigger errors as needed.
- `force_action_` for privileged functions that bypass any checks. This can be useful for specific benchmarking functions.
- `check_` for functions performing checks and triggering errors in case of failure.
# Release a new Runtime
![](img/release-pipeline.png)
> The following instructions have been described in french at: [Créer une release](https://forum.duniter.org/t/industrialiser-le-demarrage-dune-nouvelle-gx/11535/41).
## Process
Example for `runtime-800`.
### New release with new Runtime
* create a `release/runtime-800` branch locally
* update the values:
* update spec version (in `runtime/<currency>/src/lib.rs`)
* eventually update `gdev.yml` (smiths, tech. committee, ...)
* push the `release/runtime-800` branch
* in the CI/CD, wait for `Create release` button to be available and click on it (see above screenshot)
The Runtime is now available on the release page [runtime-800](https://git.duniter.org/nodes/rust/duniter-v2s/-/releases/runtime-800).
### New Client
The Client is published as a Docker image.
You may want to publish a new Client version along with a Runtime update.
#### New raw specs (optional)
For a reboot, you will likely want to update the raw specs:
* in the CI/CD, wait for `release_gdev_specs` button to be available and click on it
* in the CI/CD, wait for `release_gtest_specs` button to be available and click on it
* wait for both jobs to finish
* update the Client raw specs with `cargo xtask update-raw-specs runtime-800`
#### New version (mandatory)
Update Client values:
* update Client version (in `Cargo.toml`)
* update `Cargo.lock` with `cargo build`
#### Publish Docker image
Commit everything and push the branch:
* in the CI/CD, a new pipeline has been launched
* you can stop jobs `create_g1_data`, `gdev_srtool`, `gtest_srtool` (won't be used)
* click on `gdev_docker_deploy` and `gtest_docker_deploy`
The Docker images should now be available at: https://hub.docker.com/r/duniter/duniter-v2s-gdev/tags.
## Runtime tag and spec version
Our runtime tags use `xxyy` version numbers where `x` corresponds to major change and `y` hotfix.
Make sure to move any issue or merge request assigned to the choosen milestone `runtime-xxyy` to the next one. This prevents from forgetting unfinished work.
# How to replay a block
WARN: try-runtime is not properly implemented
You can use `try-runtime` subcommand to replay a block against a real state from a live network.
1. Checkout the git tag of the runtime version at the block you want to replay
2. Build duniter with feature `try-runtime`: `cargo build --features try-runtime`
3. Find the hash of the block to replay
4. Choose an RPC endpoint without path (try-runtime not support path)
5. Replay the block a first time to get the state:
```
duniter try-runtime --execution=Native execute-block --block-at 0x2633026e3e428b010cfe08d215b6253843a9fe54db28748ca56de37e6a83c644 live -s tmp/snapshot1 -u ws://localhost:9944
```
6. Then, replay the block as many times as you need against your local snapshot:
```
duniter try-runtime --execution=Native execute-block --block-at 0x2633026e3e428b010cfe08d215b6253843a9fe54db28748ca56de37e6a83c644 --block-ws-uri ws://localhost:9944 snap -s tmp/snapshot1
```
try-runtime does not allow (for now) to store the block locally, only the storage can be stored.
...@@ -3,7 +3,7 @@ title: Installation ...@@ -3,7 +3,7 @@ title: Installation
--- ---
This page will guide you through the steps needed to prepare a computer for development with the This page will guide you through the steps needed to prepare a computer for development with the
Substrate Node. Since Substrate is built with Duniter Substrate Node. Since Substrate is built with
[the Rust programming language](https://www.rust-lang.org/), the first thing you will need to do is [the Rust programming language](https://www.rust-lang.org/), the first thing you will need to do is
prepare the computer for Rust development - these steps will vary based on the computer's operating prepare the computer for Rust development - these steps will vary based on the computer's operating
system. Once Rust is configured, you will use its toolchains to interact with Rust projects; the system. Once Rust is configured, you will use its toolchains to interact with Rust projects; the
...@@ -35,7 +35,7 @@ Use a terminal shell to execute the following commands: ...@@ -35,7 +35,7 @@ Use a terminal shell to execute the following commands:
```bash ```bash
sudo apt update sudo apt update
# May prompt for location information # May prompt for location information
sudo apt install -y cmake pkg-config libssl-dev git build-essential clang libclang-dev curl sudo apt install -y cmake pkg-config libssl-dev git build-essential clang libclang-dev curl protobuf-compiler
``` ```
### Arch Linux ### Arch Linux
...@@ -79,3 +79,16 @@ rustup update nightly ...@@ -79,3 +79,16 @@ rustup update nightly
rustup update stable rustup update stable
rustup target add wasm32-unknown-unknown --toolchain nightly rustup target add wasm32-unknown-unknown --toolchain nightly
``` ```
### Installing mold linker to decrease build time
Mold (modern linker) (https://github.com/rui314/mold) decreases the build time. Install it through your system package for example then add the following to your `~/.cargo/config`:
```toml
[target.x86_64-unknown-linux-gnu]
linker = "clang"
rustflags = ["-C", "link-arg=-fuse-ld=/usr/bin/mold"]
```
(see https://forum.duniter.org/t/decrease-duniter-build-time/10170 on the forum)
\ No newline at end of file
# Polkadot Upgrade Guide
ParityTech frequently releases upgrades of the polkadot-sdk. For each upgrade, Duniter should be upgraded following the instructions below. These instructions are based on upgrading from version 1.8.0 to 1.9.0.
## 1. Upgrade the duniter-polkadot-sdk
* Clone the repository: `git clone git@github.com:duniter/duniter-polkadot-sdk.git`
* Set the upstream repository: `git remote add upstream git@github.com:paritytech/polkadot-sdk.git`
* Fetch the latest released version: `git fetch --tag polkadot-v1.9.0`
* Create a new branch: `git checkout -b duniter-polkadot-v1.9.0`
* Rebase the branch, keeping only specific commits: "fix treasury benchmarks when no SpendOrigin", "allow manual seal to produce non-empty blocks with BABE", "add custom pallet-balance GenesisConfig", and "remove pallet-balances upgrade_account extrinsic", "remove all paritytech sdk dependencies".
* Push the new branch: `git push`
## 2. Upgrade repository
* In the `Cargo.toml` file of Duniter, change the version number from 1.8.0 to 1.9.0 for all polkadot-sdk dependencies. Also, change the version for Subxt. `find . -type f -name "Cargo.toml" -exec sed -i'' -e 's/polkadot-v1.8.0\/polkadot-v1.9.0/g' {} +`.
* Upgrade the version number of all crateio dependencies to ensure compatibility with those used in the polkadot-sdk, see the node template at: [Node Template](https://github.com/paritytech/polkadot-sdk/blob/master/templates/solochain/node/Cargo.toml) (choose the correct branch/tag).
At this point, two cases may arise:
1. If the upgrade only adds some types and minor changes, add the types in the pallet configuration, replace the offending `WeightInfo`, and delete the corresponding weights files until they can be regenerated.
2. If there are many breaking changes, it is recommended to break down the process:
* Start by correcting errors on individual pallets using `cargo check -p my_pallet` to identify and rectify any errors. Then, test using `cargo test -p my_pallet` and benchmark using `cargo test -p my_pallet --feature runtime-benchmark`.
* After correcting all pallets, fix the runtimes using the same approach: check for trait declarations added or removed in each pallet configuration, and use `cargo check -p runtime`, `cargo test -p runtime`, and `cargo test -p runtime --feature runtime-benchmark`.
* Repeat this process with the node part, the distance-oracle, all the tests, xtask, and the client.
* Conclude the process by executing all benchmarks using the command `scripts/run_all_benchmarks.sh`.
## 4. Troubleshooting
As Duniter may sometimes be the only chain implementing advanced features, such as manual sealing, not many references can be found. However, the following projects may be useful:
* Node template for general up-to-date implementation: [Node Template](https://github.com/paritytech/polkadot-sdk/tree/master/templates)
* Acala: [Acala](https://github.com/AcalaNetwork/Acala), which also uses manual sealing add a similar node implementation.
# Compile the runtime with srtool
When voting for a runtime upgrade, you should check that the proposed hash actually corresponds to the published code you reviewed. Otherwise, a malicious runtime upgrade could be advertised as a legitimate one.
```sh
mkdir runtime/gdev/target
chmod o+w runtime/gdev/target
# Workaround see !239
echo -e "[toolchain]\nchannel = \"1.74.0\"\ncomponents = [ \"rust-std\", \"rust-src\" ]" > runtime/gdev/rust-toolchain.toml
docker run \
-i \
--rm \
-e PACKAGE=gdev-runtime \
-e RUNTIME_DIR=runtime/gdev \
-v $PWD:/build \
paritytech/srtool:1.74.0-0.13.0 build --app --json -cM
```
Then, the runtime wasm bytecode is generated in this location:
```
runtime/gdev/target/srtool/release/wbuild/gdev-runtime/gdev_runtime.compact.compressed.wasm
```
To compare it to last official :
- download it here : https://git.duniter.org/nodes/rust/duniter-v2s/-/releases
- compare `sha256sum` of it and of the one you've built
# Weights benchmarking
## What is the reference machine?
For now (09/2022), it's a `Raspberry Pi 4 Model B - 4GB` with an SSD connected via USB3.
To cross-compile the benchmarks binary for armv7:
```
./scripts/cross-build-arm.sh --features runtime-benchmarks
```
The cross compiled binary is generated here: `target/armv7-unknown-linux-gnueabihf/release/duniter`
## How to benchmarks weights of a Call/Hook/Pallet
1. Create the benchmarking tests. See commit f5f2ae969ac592ba9957b0e40e18d6e4b0048473 for a
complete real example.
2. Run the benchmark test on your local machine:
```
cargo test -p <pallet> --features runtime-benchmarks
```
3. If the benchmark tests compiles and pass, compile the binary with benchmarks on your local
machine:
```
cargo build --release --features runtime-benchmarks
```
4. Run the benchmarks on your local machine (to test if it work with a real runtime). See 0d1232cd0d8b5809e1586b48376f8952cebc0d27 for a complete real example. The command is:
```
duniter benchmark pallet --chain=CHAINSPEC --steps=50 --repeat=20 --pallet=<pallet> --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/common/src/weights/
```
5. Use the generated file content to create the `WeightInfo` trait and the `()` dummy implementation in `pallets/<pallet>/src/weights.rs`. Then use the `WeightInfo` trait in the real code of the pallet. See 62dcc17f2c0b922e883fbc6337a9e7da97fc3218 for a complete real example.
6. Redo steps `3.` and `4.` on the reference machine.
7. Use the `runtime/common/src/weights/pallet_<pallet>.rs` generated on the reference machine in the runtimes configuration. See af62a3b9cfc42d6653b3a957836f58540c18e65a for a complete real example.
Note 1: Use relevant chainspec for the benchmarks in place of `CHAINSPEC`, for example `--chain=dev`.
Note 2: If the reference machine does not support wasmtime, you should replace `--wasm-execution=compiled`
by `--wasm-execution=interpreted-i-know-what-i-do`.
## Generate base block benchmarking
1. Build binary for reference machine and copy it on reference machine.
2. Run base block benchmarks command:
```
duniter benchmark overhead --chain=dev --execution=wasm --wasm-execution=compiled --weight-path=./runtime/common/src/weights/ --warmup=10 --repeat=100
```
3. Commit changes and open an MR.
## Generate storage benchmarking
1. Build binary for reference machine and copy it on reference machine.
2. Copy a DB on reference machine (on ssd), example: `scp -r -P 37015 tmp/t1 pi@192.168.1.188:/mnt/ssd1/duniter-v2s/`
3. Run storage benchmarks command, example:
```
duniter benchmark storage -d=/mnt/ssd1/duniter-v2s/t1 --chain=gdev --mul=2 --weight-path=. --state-version=1
```
4. Copy the generated file `paritydb_weights.rs` in the codebase in folder `runtime/common/src/weights/`.
5. Commit changes and open an MR.
## How to Write Benchmarks
### Calls
Ensure that any extrinsic call is benchmarked using the most computationally intensive path, i.e., the worst-case scenario.
### Hooks
Benchmark each hook to determine the weight consumed by it; hence, it is essential to benchmark all possible paths.
### Handlers and Internal Functions
When designing handlers and internal functions, it is advisable to avoid having them return weight for the following reasons:
1. **Simplified Benchmarking**: Writing benchmarks for hooks or calls where handlers and internal functions are utilized becomes more straightforward.
2. **Reduced Benchmarking Complexity**: By directly measuring execution and overhead in a single pass, the number of benchmarks is minimized.
3. **Enhanced Readability**: Understanding that weight accounting occurs at the outermost level improves the overall readability of the code.
One notable exception is the internal functions called in hooks like `on_idle` or `on_initialize` that can be easier to benchmark separately when the hook contains numerous branching.