diff --git a/.cargo/config.toml b/.cargo/config.toml
index f332af4742084f126384572493ebe830601317c4..767a123c86da2b30638a55e39c7828fb7fae945f 100644
--- a/.cargo/config.toml
+++ b/.cargo/config.toml
@@ -1,12 +1,13 @@
 [alias]
-sanity-gdev = "test -p duniter-live-tests --test sanity_gdev -- --nocapture"
-tu = "test --workspace --exclude duniter-end2end-tests --exclude duniter-live-tests --features constant-fees"
+sanity-gdev = "test -Zgit=shallow-deps -p duniter-live-tests --test sanity_gdev -- --nocapture"
+tu = "test -Zgit=shallow-deps --workspace --exclude duniter-end2end-tests --exclude duniter-live-tests --features constant-fees" # Unit tests with constant-fees
+tf = "test -Zgit=shallow-deps --workspace --exclude duniter-end2end-tests --exclude duniter-live-tests test_fee" # Custom fee model tests
 # `te` and `cucumber` are synonyms
 te = "test -p duniter-end2end-tests --test cucumber_tests --features constant-fees --"
-cucumber-build = "build --features constant-fees"
-cucumber = "test -p duniter-end2end-tests --test cucumber_tests --"
-ta = "test --workspace --exclude duniter-live-tests --features constant-fees"
-tb = "test --features runtime-benchmarks -p"
-rbp = "run --release --features runtime-benchmarks -- benchmark pallet --chain=dev --steps=50 --repeat=20 --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=. --pallet"
-xtask = "run --package xtask --"
-cucumber-node = "run -- --chain=gdev_dev --execution=Native --sealing=manual --force-authoring --rpc-cors=all --tmp --ws-port 9944 --alice --features constant-fees"
+cucumber-build = "build -Zgit=shallow-deps --features constant-fees"
+cucumber = "test -Zgit=shallow-deps -p duniter-end2end-tests --test cucumber_tests --"
+ta = "test -Zgit=shallow-deps --workspace --exclude duniter-live-tests --features constant-fees"
+tb = "test -Zgit=shallow-deps --features runtime-benchmarks -p"
+rbp = "run -Zgit=shallow-deps --release --features runtime-benchmarks -- benchmark pallet --chain=dev --steps=50 --repeat=20 --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=. --pallet"
+xtask = "run -Zgit=shallow-deps --package xtask --"
+cucumber-node = "run -Zgit=shallow-deps -- --chain=gdev_dev --execution=Native --sealing=manual --force-authoring --rpc-cors=all --tmp --rpc-port 9944 --alice --features constant-fees"
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b1f00c3e49cff8ddb9a977048fd7af385fbd6470..a0c3e9cf0ea4a16bb4409115bc52222c6461dc88 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -44,7 +44,6 @@ check_labels:
   script:
     - ./scripts/check_labels.sh $CI_MERGE_REQUEST_LABELS $CI_MERGE_REQUEST_MILESTONE
 
-
 check_metadata:
   extends: .env
   stage: tests
@@ -76,7 +75,7 @@ fmt_and_clippy:
     - cargo fmt -- --version
     - cargo fmt -- --check
     - cargo clippy -- -V
-    - cargo clippy --features runtime-benchmarks --all --tests -- -D warnings
+    - cargo clippy -Zgit=shallow-deps --features runtime-benchmarks --all --tests -- -D warnings
 
 run_benchmarks:
   extends: .env
@@ -86,20 +85,24 @@ run_benchmarks:
       when: never
     - if: $CI_COMMIT_REF_NAME =~ /^wip*$/
       when: manual
+    - <<: *is_network_branch
+      when: never
     - if: $CI_COMMIT_TAG
       when: never
     - if: '$CI_MERGE_REQUEST_ID || $CI_COMMIT_BRANCH == "master"'
     - when: manual
   script:
-    - cargo build --release --features runtime-benchmarks
+    - cargo build -Zgit=shallow-deps --release --features runtime-benchmarks
     - target/release/duniter benchmark storage --chain=dev --mul=2 --state-version=1
     - target/release/duniter benchmark overhead --chain=dev --wasm-execution=compiled --warmup=1 --repeat=100
     - target/release/duniter benchmark pallet --chain=dev --steps=5 --repeat=2 --pallet="*" --extrinsic="*" --wasm-execution=compiled
-# FIXME: "gtest_build"
-gdev_build:
+
+gtest_build:
   stage: build
-  image: rust:1-bullseye
+  extends: .env
   rules:
+    - <<: *is_network_branch
+      when: never
     - if: $CI_COMMIT_REF_NAME =~ /^wip*$/
       when: manual
     - if: $CI_COMMIT_TAG
@@ -111,13 +114,33 @@ gdev_build:
   variables:
     DEBIAN_FRONTEND: noninteractive
   script:
-    - apt-get update
-    - apt-get install -y clang cmake protobuf-compiler
-    - cargo build --no-default-features --features gtest
+    - cargo build -Zgit=shallow-deps --no-default-features --features gtest
+
+build_deb:
+  stage: deploy
+  extends: .env
+  rules:
+    - if: $CI_COMMIT_REF_NAME =~ /^wip*$/
+      when: manual
+    - if: $CI_COMMIT_TAG
+      when: never
+    - <<: *is_network_branch
+      when: never
+    - if: '$CI_MERGE_REQUEST_ID || $CI_COMMIT_BRANCH == "master"'
+    - when: manual
+  variables:
+    DEBIAN_FRONTEND: noninteractive
+  script:
+    - cargo install cargo-deb
+    - cargo build -Zgit=shallow-deps --release
+    - cargo deb --no-build -p duniter
+  artifacts:
+    paths:
+      - target/debian/duniter*.deb
 
 tests:
   stage: tests
-  image: rust:1-bullseye
+  extends: .env
   rules:
     - if: $CI_COMMIT_REF_NAME =~ /^wip*$/
       when: manual
@@ -130,9 +153,8 @@ tests:
   variables:
     DEBIAN_FRONTEND: noninteractive
   script:
-    - apt-get update
-    - apt-get install -y clang cmake protobuf-compiler
     - cargo tu
+    - cargo tf
     - cargo cucumber-build
     - cargo cucumber
 
@@ -159,7 +181,7 @@ tests:
   - export MANIFEST=localhost/manifest-$IMAGE_NAME:$DOCKER_TAG
   - echo $MANIFEST
   # Files to be pushed in a release
-  - export RELEASE_FILE_G1_DATA=release/g1-data.json
+  - export RELEASE_FILE_G1_DATA=release/genesis.json
   - echo $RELEASE_FILE_G1_DATA
   - export RELEASE_FILE_SPEC_CONFIG=release/${RUNTIME}.yaml
   - echo $RELEASE_FILE_SPEC_CONFIG
@@ -171,6 +193,8 @@ tests:
   - echo $RELEASE_FILE_RAW_SPEC
   - export RELEASE_FILE_CLIENT_SPEC=release/gdev_client-specs.yaml
   - echo $RELEASE_FILE_CLIENT_SPEC
+  - export CLIENT_RELEASE_NAME=$RUNTIME-$RUNTIME_VERSION-$CLIENT_VERSION
+  - echo $CLIENT_RELEASE_NAME
 
 trigger_network_release:
   stage: build
@@ -195,7 +219,8 @@ trigger_client_release:
     - curl -s https://git.duniter.org/api/v4/projects/$CI_PROJECT_ID/releases/$NETWORK --fail 1>/dev/null && echo "Release présente" || (echo "Release absente" && exit 1)
 
 docker_deploy:
-  stage: build
+  stage: release
+  needs: ["build_raw_specs"]
   rules:
     - <<: *is_network_branch
     - when: never
@@ -205,7 +230,7 @@ docker_deploy:
   script:
     - *define_network_branch_vars
     - podman manifest rm "$MANIFEST" 2>/dev/null || true
-    - podman build --layers --platform linux/amd64,linux/arm64 --manifest "$MANIFEST" -f docker/Dockerfile --build-arg chain=$RUNTIME .
+    - podman build --layers --platform linux/amd64 --manifest "$MANIFEST" -f docker/Dockerfile --build-arg chain=$RUNTIME .
     - podman manifest push --all "$MANIFEST" "docker://docker.io/$IMAGE_NAME:$DOCKER_TAG"
     - podman manifest push --all "$MANIFEST" "docker://docker.io/$IMAGE_NAME:latest"
   after_script:
@@ -240,6 +265,7 @@ build_runtime:
     - /srtool/build --app --json -cM | tee -a $SRTOOL_OUTPUT
     - mv /build/runtime/$RUNTIME/target/srtool/release/wbuild/$RUNTIME-runtime/${RUNTIME}_runtime.compact.compressed.wasm $CI_PROJECT_DIR/release/
   artifacts:
+    expire_in: never
     name: "runtime"
     paths:
       - $CI_PROJECT_DIR/release
@@ -253,7 +279,7 @@ g1_data:
   needs: ["trigger_network_release"]
   rules:
     - <<: *is_network_branch
-  image: python:3.9.18
+  image: h30x/py-g1-migrator # this image already has plyvel python requirement and dependency
   variables:
     DEBIAN_FRONTEND: noninteractive
     LEVELDB_PATH: /dump/duniter_default/data/leveldb
@@ -266,8 +292,6 @@ g1_data:
     #  - bin/duniter sync g1.cgeek.fr --store-txs --nointeractive --mdb 1.8.7
     #  - mkdir -p /tmp/backup-g1-duniter-1.8.7
     #  - cp -R $HOME/.config/duniter/1.8.7/data /tmp/backup-g1-duniter-1.8.7
-    #  - cp -R $HOME/.config/duniter/1.8.7/g1 /tmp/backup-g1-duniter-1.8.7
-    #  - cp -R $HOME/.config/duniter/1.8.7/txs.db /tmp/backup-g1-duniter-1.8.7
     #  - tar -cvzf /tmp/backup-g1-duniter-1.8.7.tgz /tmp/backup-g1-duniter-1.8.7
     # Then the file is uploaded to dl.cgeek.fr manually
     - curl https://dl.cgeek.fr/public/backup-g1-duniter-1.8.7.tgz -o g1-dump.tgz
@@ -275,20 +299,22 @@ g1_data:
     - rm g1-dump.tgz
     - mv tmp/backup-g1-duniter-1.8.7 duniter_default
     # py-g1-migrator conversion
-    - git clone https://git.duniter.org/tools/py-g1-migrator.git /py-g1-migrator
+    - git clone https://git.duniter.org/tools/py-g1-migrator.git --depth 1 /py-g1-migrator
     - cd /py-g1-migrator
-    - rm -rf inputs/*
-    - apt-get update
-    - apt-get install -y sqlite3 libleveldb-dev jq
-    - pip install -r requirements.txt
-    # Export identities and wallets
-    - ./main.py
-    # Export transaction history
-    - sqlite3 /dump/duniter_default/txs.db --json "select time,comment,issuers,outputs from txs;" > inputs/transactions_history.json 2>> inputs/txs.err
+    # Export genesis file
+    - ./main.py # ./output/genesis.json
+    # Expore history files for squid
+    - ./squid-block.py # ./output/block_hist.json
+    - ./squid-cert.py # ./output/cert_hist.json
+    - ./squid-tx.py # ./output/tx_hist.json
     # Make the exported file available for next jobs
     - mkdir -p $CI_PROJECT_DIR/release/
     - cp output/genesis.json $CI_PROJECT_DIR/$RELEASE_FILE_G1_DATA
+    - cp output/block_hist.json $CI_PROJECT_DIR/release/
+    - cp output/cert_hist.json $CI_PROJECT_DIR/release/
+    - cp output/tx_hist.json $CI_PROJECT_DIR/release/
   artifacts:
+    expire_in: never
     paths:
       - $CI_PROJECT_DIR/release/
   tags:
@@ -300,6 +326,7 @@ build_specs:
   rules:
     - <<: *is_network_branch
   image: rust:1-bullseye
+  extends: .env
   variables:
     DEBIAN_FRONTEND: noninteractive
   script:
@@ -313,10 +340,11 @@ build_specs:
     - apt-get update
     - apt-get install -y clang cmake protobuf-compiler
     # Build the spec file (including the G1 data), e.g.: "release/gdev.json"
-    - cargo run ${FEATURES} -- build-spec --chain=${RUNTIME}_live > $RELEASE_FILE_SPEC
+    - cargo run -Zgit=shallow-deps ${FEATURES} -- build-spec --chain=${RUNTIME}_live > $RELEASE_FILE_SPEC
     # Save spec configuration file for release
     - cp resources/${RUNTIME}.yaml $RELEASE_FILE_SPEC_CONFIG
   artifacts:
+    expire_in: never
     name: "runtime"
     paths:
       - $CI_PROJECT_DIR/release
@@ -339,7 +367,7 @@ build_raw_specs:
     - cargo xtask print-spec $NETWORK_RELEASE > ${RUNTIME}.json
     # Produce raw spec file
     - mkdir -p $CI_PROJECT_DIR/release
-    - cargo run ${FEATURES} -- build-spec --chain=${RUNTIME}.json --disable-default-bootnode --raw > $RELEASE_FILE_RAW_SPEC
+    - cargo run -Zgit=shallow-deps ${FEATURES} -- build-spec --chain=${RUNTIME}.json --disable-default-bootnode --raw > $RELEASE_FILE_RAW_SPEC
   artifacts:
     expire_in: never
     name: "runtime"
@@ -372,6 +400,7 @@ create_network_release:
     # the result: gdev.json (genesis)
     - cargo xtask create-asset-link $NETWORK_RELEASE ${RUNTIME}.json https://nodes.pages.duniter.org/-/rust/duniter-v2s/-/jobs/$CI_JOB_ID/artifacts/$RELEASE_FILE_SPEC
   artifacts:
+    expire_in: never
     paths:
       - $CI_PROJECT_DIR/release/
   tags:
@@ -388,11 +417,12 @@ create_client_release:
     SRTOOL_OUTPUT: $CI_PROJECT_DIR/release/srtool_output.json
   script:
     - *define_network_branch_vars
-    - cargo xtask release-runtime $NETWORK_RELEASE $CI_COMMIT_BRANCH $RUNTIME_MILESTONE
-    - cargo xtask create-asset-link $RUNTIME_MILESTONE ${RUNTIME}_runtime.compact.compressed.wasm https://nodes.pages.duniter.org/-/rust/duniter-v2s/-/jobs/$CI_JOB_ID/artifacts/$RELEASE_FILE_WASM
-    - cargo xtask create-asset-link $RUNTIME_MILESTONE ${RUNTIME}_client-specs.yaml https://nodes.pages.duniter.org/-/rust/duniter-v2s/-/jobs/$CI_JOB_ID/artifacts/$RELEASE_FILE_CLIENT_SPEC
-    - cargo xtask create-asset-link $RUNTIME_MILESTONE ${RUNTIME}-raw.json https://nodes.pages.duniter.org/-/rust/duniter-v2s/-/jobs/$CI_JOB_ID/artifacts/$RELEASE_FILE_RAW_SPEC
+    - cargo xtask release-runtime $CLIENT_RELEASE_NAME $NETWORK_RELEASE $CI_COMMIT_BRANCH $RUNTIME_MILESTONE
+    - cargo xtask create-asset-link $CLIENT_RELEASE_NAME ${RUNTIME}_runtime.compact.compressed.wasm https://nodes.pages.duniter.org/-/rust/duniter-v2s/-/jobs/$CI_JOB_ID/artifacts/$RELEASE_FILE_WASM
+    - cargo xtask create-asset-link $CLIENT_RELEASE_NAME ${RUNTIME}_client-specs.yaml https://nodes.pages.duniter.org/-/rust/duniter-v2s/-/jobs/$CI_JOB_ID/artifacts/$RELEASE_FILE_CLIENT_SPEC
+    - cargo xtask create-asset-link $CLIENT_RELEASE_NAME ${RUNTIME}-raw.json https://nodes.pages.duniter.org/-/rust/duniter-v2s/-/jobs/$CI_JOB_ID/artifacts/$RELEASE_FILE_RAW_SPEC
   artifacts:
+    expire_in: never
     paths:
       - $CI_PROJECT_DIR/release/
   tags:
diff --git a/.maintain/local-docker-test-network/duniter.Dockerfile b/.maintain/local-docker-test-network/duniter.Dockerfile
index 948917a3f081e29d222254ec78c956545dc1972e..b481147d073125c61370387984e417a234d3c83f 100644
--- a/.maintain/local-docker-test-network/duniter.Dockerfile
+++ b/.maintain/local-docker-test-network/duniter.Dockerfile
@@ -29,7 +29,7 @@ USER duniter
 # check if executable works in this container
 RUN /usr/local/bin/duniter --version
 
-EXPOSE 30333 9933 9944
+EXPOSE 30333 9944
 VOLUME ["/duniter"]
 
 ENTRYPOINT ["/usr/local/bin/duniter"]
diff --git a/Cargo.lock b/Cargo.lock
index f3ed19bb625cb4b58e876c54ce200c6e99afba91..1c0b2a6f04711cd1c172f92141872d0fa0e5ce48 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -23,18 +23,18 @@ dependencies = [
 
 [[package]]
 name = "addr2line"
-version = "0.22.0"
+version = "0.24.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678"
+checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375"
 dependencies = [
- "gimli 0.29.0",
+ "gimli 0.31.0",
 ]
 
 [[package]]
-name = "adler"
-version = "1.0.2"
+name = "adler2"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
 
 [[package]]
 name = "aead"
@@ -68,18 +68,7 @@ dependencies = [
  "cipher 0.4.4",
  "ctr",
  "ghash",
- "subtle 2.5.0",
-]
-
-[[package]]
-name = "ahash"
-version = "0.7.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9"
-dependencies = [
- "getrandom 0.2.15",
- "once_cell",
- "version_check",
+ "subtle 2.6.1",
 ]
 
 [[package]]
@@ -89,7 +78,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
 dependencies = [
  "cfg-if",
- "getrandom 0.2.15",
+ "getrandom",
  "once_cell",
  "version_check",
  "zerocopy",
@@ -125,20 +114,11 @@ dependencies = [
  "libc",
 ]
 
-[[package]]
-name = "ansi_term"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
-dependencies = [
- "winapi",
-]
-
 [[package]]
 name = "anstream"
-version = "0.6.14"
+version = "0.6.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b"
+checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526"
 dependencies = [
  "anstyle",
  "anstyle-parse",
@@ -151,33 +131,33 @@ dependencies = [
 
 [[package]]
 name = "anstyle"
-version = "1.0.7"
+version = "1.0.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b"
+checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1"
 
 [[package]]
 name = "anstyle-parse"
-version = "0.2.4"
+version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4"
+checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb"
 dependencies = [
  "utf8parse",
 ]
 
 [[package]]
 name = "anstyle-query"
-version = "1.1.0"
+version = "1.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391"
+checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a"
 dependencies = [
  "windows-sys 0.52.0",
 ]
 
 [[package]]
 name = "anstyle-wincon"
-version = "3.0.3"
+version = "3.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19"
+checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8"
 dependencies = [
  "anstyle",
  "windows-sys 0.52.0",
@@ -185,9 +165,9 @@ dependencies = [
 
 [[package]]
 name = "anyhow"
-version = "1.0.86"
+version = "1.0.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
+checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6"
 
 [[package]]
 name = "approx"
@@ -209,7 +189,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -223,18 +203,6 @@ dependencies = [
  "ark-std",
 ]
 
-[[package]]
-name = "ark-bls12-377-ext"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20c7021f180a0cbea0380eba97c2af3c57074cdaffe0eef7e840e1c9f2841e55"
-dependencies = [
- "ark-bls12-377",
- "ark-ec",
- "ark-models-ext",
- "ark-std",
-]
-
 [[package]]
 name = "ark-bls12-381"
 version = "0.4.0"
@@ -247,45 +215,6 @@ dependencies = [
  "ark-std",
 ]
 
-[[package]]
-name = "ark-bls12-381-ext"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1dc4b3d08f19e8ec06e949712f95b8361e43f1391d94f65e4234df03480631c"
-dependencies = [
- "ark-bls12-381",
- "ark-ec",
- "ark-ff",
- "ark-models-ext",
- "ark-serialize",
- "ark-std",
-]
-
-[[package]]
-name = "ark-bw6-761"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e0605daf0cc5aa2034b78d008aaf159f56901d92a52ee4f6ecdfdac4f426700"
-dependencies = [
- "ark-bls12-377",
- "ark-ec",
- "ark-ff",
- "ark-std",
-]
-
-[[package]]
-name = "ark-bw6-761-ext"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccee5fba47266f460067588ee1bf070a9c760bf2050c1c509982c5719aadb4f2"
-dependencies = [
- "ark-bw6-761",
- "ark-ec",
- "ark-ff",
- "ark-models-ext",
- "ark-std",
-]
-
 [[package]]
 name = "ark-ec"
 version = "0.4.2"
@@ -300,60 +229,9 @@ dependencies = [
  "hashbrown 0.13.2",
  "itertools 0.10.5",
  "num-traits 0.2.19",
- "rayon",
  "zeroize",
 ]
 
-[[package]]
-name = "ark-ed-on-bls12-377"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b10d901b9ac4b38f9c32beacedfadcdd64e46f8d7f8e88c1ae1060022cf6f6c6"
-dependencies = [
- "ark-bls12-377",
- "ark-ec",
- "ark-ff",
- "ark-std",
-]
-
-[[package]]
-name = "ark-ed-on-bls12-377-ext"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "524a4fb7540df2e1a8c2e67a83ba1d1e6c3947f4f9342cc2359fc2e789ad731d"
-dependencies = [
- "ark-ec",
- "ark-ed-on-bls12-377",
- "ark-ff",
- "ark-models-ext",
- "ark-std",
-]
-
-[[package]]
-name = "ark-ed-on-bls12-381-bandersnatch"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9cde0f2aa063a2a5c28d39b47761aa102bda7c13c84fc118a61b87c7b2f785c"
-dependencies = [
- "ark-bls12-381",
- "ark-ec",
- "ark-ff",
- "ark-std",
-]
-
-[[package]]
-name = "ark-ed-on-bls12-381-bandersnatch-ext"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d15185f1acb49a07ff8cbe5f11a1adc5a93b19e211e325d826ae98e98e124346"
-dependencies = [
- "ark-ec",
- "ark-ed-on-bls12-381-bandersnatch",
- "ark-ff",
- "ark-models-ext",
- "ark-std",
-]
-
 [[package]]
 name = "ark-ff"
 version = "0.4.2"
@@ -397,19 +275,6 @@ dependencies = [
  "syn 1.0.109",
 ]
 
-[[package]]
-name = "ark-models-ext"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e9eab5d4b5ff2f228b763d38442adc9b084b0a465409b059fac5c2308835ec2"
-dependencies = [
- "ark-ec",
- "ark-ff",
- "ark-serialize",
- "ark-std",
- "derivative",
-]
-
 [[package]]
 name = "ark-poly"
 version = "0.4.2"
@@ -423,35 +288,6 @@ dependencies = [
  "hashbrown 0.13.2",
 ]
 
-[[package]]
-name = "ark-scale"
-version = "0.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f69c00b3b529be29528a6f2fd5fa7b1790f8bed81b9cdca17e326538545a179"
-dependencies = [
- "ark-ec",
- "ark-ff",
- "ark-serialize",
- "ark-std",
- "parity-scale-codec",
- "scale-info",
-]
-
-[[package]]
-name = "ark-secret-scalar"
-version = "0.0.2"
-source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e"
-dependencies = [
- "ark-ec",
- "ark-ff",
- "ark-serialize",
- "ark-std",
- "ark-transcript",
- "digest 0.10.7",
- "getrandom_or_panic",
- "zeroize",
-]
-
 [[package]]
 name = "ark-serialize"
 version = "0.4.2"
@@ -483,28 +319,8 @@ checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185"
 dependencies = [
  "num-traits 0.2.19",
  "rand",
- "rayon",
-]
-
-[[package]]
-name = "ark-transcript"
-version = "0.0.2"
-source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e"
-dependencies = [
- "ark-ff",
- "ark-serialize",
- "ark-std",
- "digest 0.10.7",
- "rand_core 0.6.4",
- "sha3",
 ]
 
-[[package]]
-name = "array-bytes"
-version = "4.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6"
-
 [[package]]
 name = "array-bytes"
 version = "6.2.3"
@@ -513,9 +329,9 @@ checksum = "5d5dde061bd34119e902bbb2d9b90c5692635cf59fb91d582c2b68043f1b8293"
 
 [[package]]
 name = "arrayref"
-version = "0.3.7"
+version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545"
+checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb"
 
 [[package]]
 name = "arrayvec"
@@ -528,9 +344,9 @@ dependencies = [
 
 [[package]]
 name = "arrayvec"
-version = "0.7.4"
+version = "0.7.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
+checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
 
 [[package]]
 name = "ascii"
@@ -544,8 +360,24 @@ version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0"
 dependencies = [
- "asn1-rs-derive",
- "asn1-rs-impl",
+ "asn1-rs-derive 0.4.0",
+ "asn1-rs-impl 0.1.0",
+ "displaydoc",
+ "nom",
+ "num-traits 0.2.19",
+ "rusticata-macros",
+ "thiserror",
+ "time",
+]
+
+[[package]]
+name = "asn1-rs"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048"
+dependencies = [
+ "asn1-rs-derive 0.5.1",
+ "asn1-rs-impl 0.2.0",
  "displaydoc",
  "nom",
  "num-traits 0.2.19",
@@ -563,7 +395,19 @@ dependencies = [
  "proc-macro2",
  "quote",
  "syn 1.0.109",
- "synstructure",
+ "synstructure 0.12.6",
+]
+
+[[package]]
+name = "asn1-rs-derive"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
+ "synstructure 0.13.1",
 ]
 
 [[package]]
@@ -577,6 +421,17 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "asn1-rs-impl"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
+]
+
 [[package]]
 name = "assert_matches"
 version = "1.5.0"
@@ -603,14 +458,14 @@ dependencies = [
  "concurrent-queue",
  "event-listener-strategy",
  "futures-core",
- "pin-project-lite 0.2.14",
+ "pin-project-lite",
 ]
 
 [[package]]
 name = "async-executor"
-version = "1.12.0"
+version = "1.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0"
+checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec"
 dependencies = [
  "async-task",
  "concurrent-queue",
@@ -625,37 +480,28 @@ version = "2.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a"
 dependencies = [
- "async-lock 3.4.0",
+ "async-lock",
  "blocking",
  "futures-lite",
 ]
 
 [[package]]
 name = "async-io"
-version = "2.3.3"
+version = "2.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964"
+checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8"
 dependencies = [
- "async-lock 3.4.0",
+ "async-lock",
  "cfg-if",
  "concurrent-queue",
  "futures-io",
  "futures-lite",
  "parking",
  "polling",
- "rustix 0.38.34",
+ "rustix 0.38.37",
  "slab",
  "tracing",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "async-lock"
-version = "2.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b"
-dependencies = [
- "event-listener 2.5.3",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -666,7 +512,7 @@ checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18"
 dependencies = [
  "event-listener 5.3.1",
  "event-listener-strategy",
- "pin-project-lite 0.2.14",
+ "pin-project-lite",
 ]
 
 [[package]]
@@ -682,40 +528,39 @@ dependencies = [
 
 [[package]]
 name = "async-process"
-version = "2.2.3"
+version = "2.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7eda79bbd84e29c2b308d1dc099d7de8dcc7035e48f4bf5dc4a531a44ff5e2a"
+checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb"
 dependencies = [
  "async-channel 2.3.1",
  "async-io",
- "async-lock 3.4.0",
+ "async-lock",
  "async-signal",
  "async-task",
  "blocking",
  "cfg-if",
  "event-listener 5.3.1",
  "futures-lite",
- "rustix 0.38.34",
+ "rustix 0.38.37",
  "tracing",
- "windows-sys 0.52.0",
 ]
 
 [[package]]
 name = "async-signal"
-version = "0.2.8"
+version = "0.2.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "794f185324c2f00e771cd9f1ae8b5ac68be2ca7abb129a87afd6e86d228bc54d"
+checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3"
 dependencies = [
  "async-io",
- "async-lock 3.4.0",
+ "async-lock",
  "atomic-waker",
  "cfg-if",
  "futures-core",
  "futures-io",
- "rustix 0.38.34",
+ "rustix 0.38.37",
  "signal-hook-registry",
  "slab",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -726,13 +571,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
 
 [[package]]
 name = "async-trait"
-version = "0.1.80"
+version = "0.1.83"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca"
+checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -745,7 +590,7 @@ dependencies = [
  "futures-sink",
  "futures-util",
  "memchr",
- "pin-project-lite 0.2.14",
+ "pin-project-lite",
 ]
 
 [[package]]
@@ -760,48 +605,36 @@ version = "1.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
 
+[[package]]
+name = "attohttpc"
+version = "0.24.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2"
+dependencies = [
+ "http 0.2.12",
+ "log",
+ "url",
+]
+
 [[package]]
 name = "autocfg"
-version = "1.3.0"
+version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
+checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
 
 [[package]]
 name = "backtrace"
-version = "0.3.73"
+version = "0.3.74"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a"
+checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
 dependencies = [
- "addr2line 0.22.0",
- "cc",
+ "addr2line 0.24.1",
  "cfg-if",
  "libc",
  "miniz_oxide",
- "object 0.36.0",
+ "object 0.36.4",
  "rustc-demangle",
-]
-
-[[package]]
-name = "bandersnatch_vrfs"
-version = "0.0.4"
-source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e"
-dependencies = [
- "ark-bls12-381",
- "ark-ec",
- "ark-ed-on-bls12-381-bandersnatch",
- "ark-ff",
- "ark-serialize",
- "ark-std",
- "dleq_vrf",
- "fflonk",
- "merlin",
- "rand_chacha",
- "rand_core 0.6.4",
- "ring 0.1.0",
- "sha2 0.10.8",
- "sp-ark-bls12-381",
- "sp-ark-ed-on-bls12-381-bandersnatch",
- "zeroize",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -864,38 +697,13 @@ dependencies = [
  "serde",
 ]
 
-[[package]]
-name = "bindgen"
-version = "0.65.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5"
-dependencies = [
- "bitflags 1.3.2",
- "cexpr",
- "clang-sys",
- "lazy_static",
- "lazycell",
- "peeking_take_while",
- "prettyplease 0.2.20",
- "proc-macro2",
- "quote",
- "regex",
- "rustc-hash",
- "shlex",
- "syn 2.0.66",
-]
-
 [[package]]
 name = "bip39"
 version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f"
 dependencies = [
- "bitcoin_hashes",
- "rand",
- "rand_core 0.6.4",
- "serde",
- "unicode-normalization",
+ "bitcoin_hashes 0.11.0",
 ]
 
 [[package]]
@@ -913,12 +721,28 @@ version = "0.6.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
 
+[[package]]
+name = "bitcoin-internals"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb"
+
 [[package]]
 name = "bitcoin_hashes"
 version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4"
 
+[[package]]
+name = "bitcoin_hashes"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b"
+dependencies = [
+ "bitcoin-internals",
+ "hex-conservative",
+]
+
 [[package]]
 name = "bitflags"
 version = "1.3.2"
@@ -927,9 +751,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
 [[package]]
 name = "bitflags"
-version = "2.5.0"
+version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
+checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
 [[package]]
 name = "bitvec"
@@ -981,8 +805,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780"
 dependencies = [
  "arrayref",
- "arrayvec 0.7.4",
- "constant_time_eq 0.3.0",
+ "arrayvec 0.7.6",
+ "constant_time_eq 0.3.1",
 ]
 
 [[package]]
@@ -992,21 +816,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "94230421e395b9920d23df13ea5d77a20e1725331f90fbbf6df6040b33f756ae"
 dependencies = [
  "arrayref",
- "arrayvec 0.7.4",
- "constant_time_eq 0.3.0",
+ "arrayvec 0.7.6",
+ "constant_time_eq 0.3.1",
 ]
 
 [[package]]
 name = "blake3"
-version = "1.5.1"
+version = "1.5.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52"
+checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7"
 dependencies = [
  "arrayref",
- "arrayvec 0.7.4",
+ "arrayvec 0.7.6",
  "cc",
  "cfg-if",
- "constant_time_eq 0.3.0",
+ "constant_time_eq 0.3.1",
 ]
 
 [[package]]
@@ -1042,9 +866,9 @@ dependencies = [
 
 [[package]]
 name = "bounded-collections"
-version = "0.1.9"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca548b6163b872067dc5eb82fd130c56881435e30367d2073594a3d9744120dd"
+checksum = "d32385ecb91a31bddaf908e8dcf4a15aef1bcd3913cc03ebfad02ff6d568abc1"
 dependencies = [
  "log",
  "parity-scale-codec",
@@ -1069,9 +893,9 @@ dependencies = [
 
 [[package]]
 name = "bstr"
-version = "1.9.1"
+version = "1.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706"
+checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c"
 dependencies = [
  "memchr",
  "serde",
@@ -1112,9 +936,9 @@ checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce"
 
 [[package]]
 name = "bytemuck"
-version = "1.16.1"
+version = "1.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e"
+checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae"
 
 [[package]]
 name = "byteorder"
@@ -1124,20 +948,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
 
 [[package]]
 name = "bytes"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
-
-[[package]]
-name = "bzip2-sys"
-version = "0.1.11+1.0.8"
+version = "1.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc"
-dependencies = [
- "cc",
- "libc",
- "pkg-config",
-]
+checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3"
 
 [[package]]
 name = "c2-chacha"
@@ -1151,9 +964,9 @@ dependencies = [
 
 [[package]]
 name = "camino"
-version = "1.1.7"
+version = "1.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239"
+checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3"
 dependencies = [
  "serde",
 ]
@@ -1183,23 +996,20 @@ dependencies = [
 
 [[package]]
 name = "cc"
-version = "1.0.99"
+version = "1.1.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695"
+checksum = "9540e661f81799159abee814118cc139a2004b3a3aa3ea37724a1b66530b90e0"
 dependencies = [
  "jobserver",
  "libc",
- "once_cell",
+ "shlex",
 ]
 
 [[package]]
-name = "cexpr"
-version = "0.6.0"
+name = "cesu8"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
-dependencies = [
- "nom",
-]
+checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
 
 [[package]]
 name = "cfg-expr"
@@ -1222,6 +1032,12 @@ version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
 
+[[package]]
+name = "cfg_aliases"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
+
 [[package]]
 name = "chacha"
 version = "0.3.0"
@@ -1267,7 +1083,7 @@ dependencies = [
  "js-sys",
  "num-traits 0.2.19",
  "wasm-bindgen",
- "windows-targets 0.52.5",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -1278,9 +1094,22 @@ checksum = "b9b68e3193982cd54187d71afdb2a271ad4cf8af157858e9cb911b91321de143"
 dependencies = [
  "core2",
  "multibase",
- "multihash",
+ "multihash 0.17.0",
+ "serde",
+ "unsigned-varint 0.7.2",
+]
+
+[[package]]
+name = "cid"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd94671561e36e4e7de75f753f577edafb0e7c05d6e4547229fdf7938fbcd2c3"
+dependencies = [
+ "core2",
+ "multibase",
+ "multihash 0.18.1",
  "serde",
- "unsigned-varint",
+ "unsigned-varint 0.7.2",
 ]
 
 [[package]]
@@ -1303,22 +1132,11 @@ dependencies = [
  "zeroize",
 ]
 
-[[package]]
-name = "clang-sys"
-version = "1.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
-dependencies = [
- "glob",
- "libc",
- "libloading",
-]
-
 [[package]]
 name = "clap"
-version = "4.5.7"
+version = "4.5.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f"
+checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3"
 dependencies = [
  "clap_builder",
  "clap_derive",
@@ -1326,9 +1144,9 @@ dependencies = [
 
 [[package]]
 name = "clap_builder"
-version = "4.5.7"
+version = "4.5.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f"
+checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b"
 dependencies = [
  "anstream",
  "anstyle",
@@ -1339,36 +1157,36 @@ dependencies = [
 
 [[package]]
 name = "clap_complete"
-version = "4.5.5"
+version = "4.5.29"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2020fa13af48afc65a9a87335bda648309ab3d154cd03c7ff95b378c7ed39c4"
+checksum = "8937760c3f4c60871870b8c3ee5f9b30771f792a7045c48bcbba999d7d6b3b8e"
 dependencies = [
  "clap",
 ]
 
 [[package]]
 name = "clap_derive"
-version = "4.5.5"
+version = "4.5.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6"
+checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab"
 dependencies = [
  "heck 0.5.0",
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "clap_lex"
-version = "0.7.1"
+version = "0.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70"
+checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97"
 
 [[package]]
 name = "cmake"
-version = "0.1.50"
+version = "0.1.51"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130"
+checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a"
 dependencies = [
  "cc",
 ]
@@ -1385,9 +1203,9 @@ dependencies = [
 
 [[package]]
 name = "colorchoice"
-version = "1.0.1"
+version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"
+checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0"
 
 [[package]]
 name = "combine"
@@ -1402,33 +1220,27 @@ dependencies = [
  "unreachable",
 ]
 
+[[package]]
+name = "combine"
+version = "4.6.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"
+dependencies = [
+ "bytes",
+ "memchr",
+]
+
 [[package]]
 name = "comfy-table"
 version = "7.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b34115915337defe99b2aff5c2ce6771e5fbc4079f4b506301f5cf394c8452f7"
 dependencies = [
- "strum 0.26.2",
+ "strum 0.26.3",
  "strum_macros 0.26.4",
  "unicode-width",
 ]
 
-[[package]]
-name = "common"
-version = "0.1.0"
-source = "git+https://github.com/w3f/ring-proof#b273d33f9981e2bb3375ab45faeb537f7ee35224"
-dependencies = [
- "ark-ec",
- "ark-ff",
- "ark-poly",
- "ark-serialize",
- "ark-std",
- "fflonk",
- "getrandom_or_panic",
- "merlin",
- "rand_chacha",
-]
-
 [[package]]
 name = "common-path"
 version = "1.0.0"
@@ -1443,34 +1255,24 @@ dependencies = [
  "frame-benchmarking",
  "frame-support",
  "frame-system",
- "frame-system-benchmarking",
  "pallet-authority-members",
  "pallet-babe",
  "pallet-balances",
  "pallet-certification",
- "pallet-collective",
  "pallet-distance",
  "pallet-duniter-account",
- "pallet-grandpa",
+ "pallet-duniter-wot",
  "pallet-identity",
- "pallet-im-online",
  "pallet-membership",
- "pallet-multisig",
  "pallet-offences",
- "pallet-oneshot-account",
- "pallet-preimage",
  "pallet-provide-randomness",
- "pallet-proxy",
  "pallet-quota",
- "pallet-scheduler",
  "pallet-session",
  "pallet-smith-members",
- "pallet-sudo",
  "pallet-timestamp",
+ "pallet-transaction-payment",
  "pallet-treasury",
  "pallet-universal-dividend",
- "pallet-upgrade-origin",
- "pallet-utility",
  "parity-scale-codec",
  "scale-info",
  "serde",
@@ -1481,7 +1283,6 @@ dependencies = [
  "sp-membership",
  "sp-runtime",
  "sp-staking",
- "sp-std 8.0.0",
  "sp-weights",
 ]
 
@@ -1528,7 +1329,7 @@ version = "0.1.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e"
 dependencies = [
- "getrandom 0.2.15",
+ "getrandom",
  "once_cell",
  "tiny-keccak",
 ]
@@ -1541,9 +1342,9 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
 
 [[package]]
 name = "constant_time_eq"
-version = "0.3.0"
+version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2"
+checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6"
 
 [[package]]
 name = "constcat"
@@ -1578,9 +1379,9 @@ dependencies = [
 
 [[package]]
 name = "core-foundation-sys"
-version = "0.8.6"
+version = "0.8.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
 
 [[package]]
 name = "core2"
@@ -1611,9 +1412,9 @@ dependencies = [
 
 [[package]]
 name = "cpufeatures"
-version = "0.2.12"
+version = "0.2.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
+checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0"
 dependencies = [
  "libc",
 ]
@@ -1642,7 +1443,7 @@ dependencies = [
  "gimli 0.27.3",
  "hashbrown 0.13.2",
  "log",
- "regalloc2",
+ "regalloc2 0.6.1",
  "smallvec",
  "target-lexicon",
 ]
@@ -1716,6 +1517,21 @@ dependencies = [
  "wasmtime-types",
 ]
 
+[[package]]
+name = "crc"
+version = "3.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636"
+dependencies = [
+ "crc-catalog",
+]
+
+[[package]]
+name = "crc-catalog"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
+
 [[package]]
 name = "crc32fast"
 version = "1.4.2"
@@ -1781,8 +1597,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76"
 dependencies = [
  "generic-array 0.14.7",
- "rand_core 0.6.4",
- "subtle 2.5.0",
+ "rand_core",
+ "subtle 2.6.1",
  "zeroize",
 ]
 
@@ -1793,7 +1609,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
 dependencies = [
  "generic-array 0.14.7",
- "rand_core 0.6.4",
+ "rand_core",
  "typenum",
 ]
 
@@ -1814,17 +1630,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab"
 dependencies = [
  "generic-array 0.14.7",
- "subtle 2.5.0",
-]
-
-[[package]]
-name = "crypto-mac"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e"
-dependencies = [
- "generic-array 0.14.7",
- "subtle 2.5.0",
+ "subtle 2.6.1",
 ]
 
 [[package]]
@@ -1838,12 +1644,12 @@ dependencies = [
 
 [[package]]
 name = "ctrlc"
-version = "3.4.4"
+version = "3.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "672465ae37dc1bc6380a6547a8883d5dd397b0f1faaad4f265726cc7042a5345"
+checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3"
 dependencies = [
- "nix 0.28.0",
- "windows-sys 0.52.0",
+ "nix 0.29.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -1888,7 +1694,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "regex",
- "syn 2.0.66",
+ "syn 2.0.79",
  "synthez",
 ]
 
@@ -1906,19 +1712,6 @@ dependencies = [
  "regex-syntax 0.7.5",
 ]
 
-[[package]]
-name = "curve25519-dalek"
-version = "3.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61"
-dependencies = [
- "byteorder",
- "digest 0.9.0",
- "rand_core 0.5.1",
- "subtle 2.5.0",
- "zeroize",
-]
-
 [[package]]
 name = "curve25519-dalek"
 version = "4.1.3"
@@ -1931,7 +1724,7 @@ dependencies = [
  "digest 0.10.7",
  "fiat-crypto",
  "rustc_version",
- "subtle 2.5.0",
+ "subtle 2.6.1",
  "zeroize",
 ]
 
@@ -1943,14 +1736,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "cxx"
-version = "1.0.124"
+version = "1.0.128"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "273dcfd3acd4e1e276af13ed2a43eea7001318823e7a726a6b3ed39b4acc0b82"
+checksum = "54ccead7d199d584d139148b04b4a368d1ec7556a1d9ea2548febb1b9d49f9a4"
 dependencies = [
  "cc",
  "cxxbridge-flags",
@@ -1960,9 +1753,9 @@ dependencies = [
 
 [[package]]
 name = "cxx-build"
-version = "1.0.124"
+version = "1.0.128"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8b2766fbd92be34e9ed143898fce6c572dc009de39506ed6903e5a05b68914e"
+checksum = "c77953e99f01508f89f55c494bfa867171ef3a6c8cea03d26975368f2121a5c1"
 dependencies = [
  "cc",
  "codespan-reporting",
@@ -1970,24 +1763,24 @@ dependencies = [
  "proc-macro2",
  "quote",
  "scratch",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "cxxbridge-flags"
-version = "1.0.124"
+version = "1.0.128"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "839fcd5e43464614ffaa989eaf1c139ef1f0c51672a1ed08023307fa1b909ccd"
+checksum = "65777e06cc48f0cb0152024c77d6cf9e4bdb4408e7b48bea993d42fa0f5b02b6"
 
 [[package]]
 name = "cxxbridge-macro"
-version = "1.0.124"
+version = "1.0.128"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b2c1c1776b986979be68bb2285da855f8d8a35851a769fca8740df7c3d07877"
+checksum = "98532a60dedaebc4848cb2cba5023337cc9ea3af16a5b062633fabfd9f18fb60"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -2002,12 +1795,12 @@ dependencies = [
 
 [[package]]
 name = "darling"
-version = "0.20.9"
+version = "0.20.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1"
+checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989"
 dependencies = [
- "darling_core 0.20.9",
- "darling_macro 0.20.9",
+ "darling_core 0.20.10",
+ "darling_macro 0.20.10",
 ]
 
 [[package]]
@@ -2026,16 +1819,16 @@ dependencies = [
 
 [[package]]
 name = "darling_core"
-version = "0.20.9"
+version = "0.20.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120"
+checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5"
 dependencies = [
  "fnv",
  "ident_case",
  "proc-macro2",
  "quote",
  "strsim 0.11.1",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -2051,13 +1844,26 @@ dependencies = [
 
 [[package]]
 name = "darling_macro"
-version = "0.20.9"
+version = "0.20.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178"
+checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
 dependencies = [
- "darling_core 0.20.9",
+ "darling_core 0.20.10",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
+]
+
+[[package]]
+name = "dashmap"
+version = "5.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856"
+dependencies = [
+ "cfg-if",
+ "hashbrown 0.14.5",
+ "lock_api",
+ "once_cell",
+ "parking_lot_core 0.9.10",
 ]
 
 [[package]]
@@ -2119,7 +1925,21 @@ version = "8.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e"
 dependencies = [
- "asn1-rs",
+ "asn1-rs 0.5.2",
+ "displaydoc",
+ "nom",
+ "num-bigint",
+ "num-traits 0.2.19",
+ "rusticata-macros",
+]
+
+[[package]]
+name = "der-parser"
+version = "9.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553"
+dependencies = [
+ "asn1-rs 0.6.2",
  "displaydoc",
  "nom",
  "num-bigint",
@@ -2149,24 +1969,24 @@ dependencies = [
 
 [[package]]
 name = "derive-syn-parse"
-version = "0.1.5"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e79116f119dd1dba1abf1f3405f03b9b0e79a27a3883864bfebded8a3dc768cd"
+checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 1.0.109",
+ "syn 2.0.79",
 ]
 
 [[package]]
-name = "derive-syn-parse"
-version = "0.2.0"
+name = "derive-where"
+version = "1.2.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762"
+checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -2179,7 +1999,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "rustc_version",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -2215,7 +2035,7 @@ dependencies = [
  "block-buffer 0.10.4",
  "const-oid",
  "crypto-common",
- "subtle 2.5.0",
+ "subtle 2.6.1",
 ]
 
 [[package]]
@@ -2262,13 +2082,13 @@ dependencies = [
 
 [[package]]
 name = "displaydoc"
-version = "0.2.4"
+version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
+checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -2293,22 +2113,6 @@ dependencies = [
  "tokio",
 ]
 
-[[package]]
-name = "dleq_vrf"
-version = "0.0.2"
-source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e"
-dependencies = [
- "ark-ec",
- "ark-ff",
- "ark-scale",
- "ark-secret-scalar",
- "ark-serialize",
- "ark-std",
- "ark-transcript",
- "arrayvec 0.7.4",
- "zeroize",
-]
-
 [[package]]
 name = "docify"
 version = "0.2.8"
@@ -2330,9 +2134,9 @@ dependencies = [
  "proc-macro2",
  "quote",
  "regex",
- "syn 2.0.66",
+ "syn 2.0.79",
  "termcolor",
- "toml 0.8.14",
+ "toml 0.8.19",
  "walkdir",
 ]
 
@@ -2392,9 +2196,9 @@ dependencies = [
  "gdev-runtime",
  "gtest-runtime",
  "hex",
- "jsonrpsee 0.16.3",
+ "jsonrpsee 0.24.5",
  "log",
- "memmap2 0.9.4",
+ "memmap2 0.9.5",
  "num-format",
  "pallet-grandpa",
  "pallet-im-online",
@@ -2411,11 +2215,13 @@ dependencies = [
  "sc-consensus-babe",
  "sc-consensus-babe-rpc",
  "sc-consensus-grandpa",
+ "sc-consensus-grandpa-rpc",
  "sc-consensus-manual-seal",
  "sc-executor",
  "sc-keystore",
  "sc-network",
  "sc-offchain",
+ "sc-rpc",
  "sc-rpc-api",
  "sc-service",
  "sc-telemetry",
@@ -2441,14 +2247,13 @@ dependencies = [
  "sp-offchain",
  "sp-runtime",
  "sp-session",
- "sp-storage 13.0.0",
+ "sp-storage",
  "sp-timestamp",
  "sp-transaction-pool",
  "sp-transaction-storage-proof",
  "sp-trie",
  "substrate-build-script-utils",
  "substrate-frame-rpc-system",
- "try-runtime-cli",
 ]
 
 [[package]]
@@ -2460,7 +2265,7 @@ dependencies = [
  "ctrlc",
  "cucumber",
  "distance-oracle",
- "env_logger 0.11.3",
+ "env_logger 0.11.5",
  "hex",
  "notify",
  "notify-debouncer-mini",
@@ -2468,7 +2273,6 @@ dependencies = [
  "portpicker",
  "serde_json",
  "sp-core",
- "sp-core-hashing",
  "sp-keyring",
  "sp-runtime",
  "subxt",
@@ -2481,7 +2285,6 @@ version = "1.0.0"
 dependencies = [
  "anyhow",
  "countmap",
- "hex-literal",
  "parity-scale-codec",
  "sp-core",
  "sp-runtime",
@@ -2530,6 +2333,7 @@ dependencies = [
  "digest 0.10.7",
  "elliptic-curve",
  "rfc6979",
+ "serdect",
  "signature",
  "spki",
 ]
@@ -2550,26 +2354,12 @@ version = "2.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871"
 dependencies = [
- "curve25519-dalek 4.1.3",
+ "curve25519-dalek",
  "ed25519",
- "rand_core 0.6.4",
+ "rand_core",
  "serde",
  "sha2 0.10.8",
- "subtle 2.5.0",
- "zeroize",
-]
-
-[[package]]
-name = "ed25519-zebra"
-version = "3.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6"
-dependencies = [
- "curve25519-dalek 3.2.0",
- "hashbrown 0.12.3",
- "hex",
- "rand_core 0.6.4",
- "sha2 0.9.9",
+ "subtle 2.6.1",
  "zeroize",
 ]
 
@@ -2579,20 +2369,20 @@ version = "4.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9"
 dependencies = [
- "curve25519-dalek 4.1.3",
+ "curve25519-dalek",
  "ed25519",
  "hashbrown 0.14.5",
  "hex",
- "rand_core 0.6.4",
+ "rand_core",
  "sha2 0.10.8",
  "zeroize",
 ]
 
 [[package]]
 name = "either"
-version = "1.12.0"
+version = "1.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b"
+checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
 
 [[package]]
 name = "elliptic-curve"
@@ -2607,9 +2397,10 @@ dependencies = [
  "generic-array 0.14.7",
  "group",
  "pkcs8",
- "rand_core 0.6.4",
+ "rand_core",
  "sec1",
- "subtle 2.5.0",
+ "serdect",
+ "subtle 2.6.1",
  "zeroize",
 ]
 
@@ -2620,31 +2411,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
 
 [[package]]
-name = "encoding_rs"
-version = "0.8.34"
+name = "enum-as-inner"
+version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59"
+checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116"
 dependencies = [
- "cfg-if",
+ "heck 0.4.1",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
 ]
 
 [[package]]
 name = "enum-as-inner"
-version = "0.5.1"
+version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116"
+checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc"
 dependencies = [
- "heck 0.4.1",
+ "heck 0.5.0",
  "proc-macro2",
  "quote",
- "syn 1.0.109",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "env_filter"
-version = "0.1.0"
+version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea"
+checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab"
 dependencies = [
  "log",
 ]
@@ -2664,9 +2458,9 @@ dependencies = [
 
 [[package]]
 name = "env_logger"
-version = "0.11.3"
+version = "0.11.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9"
+checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d"
 dependencies = [
  "env_filter",
  "log",
@@ -2707,7 +2501,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e"
 dependencies = [
  "concurrent-queue",
- "pin-project-lite 0.2.14",
+ "pin-project-lite",
 ]
 
 [[package]]
@@ -2718,7 +2512,7 @@ checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba"
 dependencies = [
  "concurrent-queue",
  "parking",
- "pin-project-lite 0.2.14",
+ "pin-project-lite",
 ]
 
 [[package]]
@@ -2728,7 +2522,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1"
 dependencies = [
  "event-listener 5.3.1",
- "pin-project-lite 0.2.14",
+ "pin-project-lite",
 ]
 
 [[package]]
@@ -2749,39 +2543,23 @@ dependencies = [
  "blake2 0.10.6",
  "file-guard",
  "fs-err",
- "prettyplease 0.2.20",
+ "prettyplease 0.2.22",
  "proc-macro2",
  "quote",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "failure"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86"
-dependencies = [
- "backtrace",
- "failure_derive",
+ "syn 2.0.79",
 ]
 
 [[package]]
-name = "failure_derive"
-version = "0.1.8"
+name = "fallible-iterator"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
- "synstructure",
-]
+checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
 
 [[package]]
 name = "fallible-iterator"
-version = "0.2.0"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
+checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649"
 
 [[package]]
 name = "fancy-regex"
@@ -2790,15 +2568,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2"
 dependencies = [
  "bit-set",
- "regex-automata 0.4.7",
- "regex-syntax 0.8.4",
+ "regex-automata 0.4.8",
+ "regex-syntax 0.8.5",
 ]
 
 [[package]]
 name = "fastrand"
-version = "2.1.0"
+version = "2.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
+checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6"
 
 [[package]]
 name = "fdlimit"
@@ -2816,21 +2594,8 @@ version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449"
 dependencies = [
- "rand_core 0.6.4",
- "subtle 2.5.0",
-]
-
-[[package]]
-name = "fflonk"
-version = "0.1.0"
-source = "git+https://github.com/w3f/fflonk#1e854f35e9a65d08b11a86291405cdc95baa0a35"
-dependencies = [
- "ark-ec",
- "ark-ff",
- "ark-poly",
- "ark-serialize",
- "ark-std",
- "merlin",
+ "rand_core",
+ "subtle 2.6.1",
 ]
 
 [[package]]
@@ -2861,14 +2626,14 @@ dependencies = [
 
 [[package]]
 name = "filetime"
-version = "0.2.23"
+version = "0.2.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd"
+checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586"
 dependencies = [
  "cfg-if",
  "libc",
- "redox_syscall 0.4.1",
- "windows-sys 0.52.0",
+ "libredox",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -2887,6 +2652,16 @@ dependencies = [
  "scale-info",
 ]
 
+[[package]]
+name = "finito"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2384245d85162258a14b43567a9ee3598f5ae746a1581fb5d3d2cb780f0dbf95"
+dependencies = [
+ "futures-timer",
+ "pin-project",
+]
+
 [[package]]
 name = "fixed-hash"
 version = "0.8.0"
@@ -2907,9 +2682,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
 
 [[package]]
 name = "flate2"
-version = "1.0.30"
+version = "1.0.34"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae"
+checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0"
 dependencies = [
  "crc32fast",
  "libz-sys",
@@ -2931,10 +2706,25 @@ version = "1.0.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
 
+[[package]]
+name = "foreign-types"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+dependencies = [
+ "foreign-types-shared",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+
 [[package]]
 name = "fork-tree"
-version = "3.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "13.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "parity-scale-codec",
 ]
@@ -2948,6 +2738,16 @@ dependencies = [
  "percent-encoding",
 ]
 
+[[package]]
+name = "forwarded-header-value"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8835f84f38484cc86f110a805655697908257fb9a7af005234060891557198e9"
+dependencies = [
+ "nonempty",
+ "thiserror",
+]
+
 [[package]]
 name = "fragile"
 version = "2.0.0"
@@ -2956,8 +2756,8 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa"
 
 [[package]]
 name = "frame-benchmarking"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-support",
  "frame-support-procedural",
@@ -2973,19 +2773,18 @@ dependencies = [
  "sp-core",
  "sp-io",
  "sp-runtime",
- "sp-runtime-interface 17.0.0",
- "sp-std 8.0.0",
- "sp-storage 13.0.0",
+ "sp-runtime-interface",
+ "sp-storage",
  "static_assertions",
 ]
 
 [[package]]
 name = "frame-benchmarking-cli"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "43.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "Inflector",
- "array-bytes 6.2.3",
+ "array-bytes",
  "chrono",
  "clap",
  "comfy-table",
@@ -2994,7 +2793,7 @@ dependencies = [
  "frame-system",
  "gethostname",
  "handlebars",
- "itertools 0.10.5",
+ "itertools 0.11.0",
  "lazy_static",
  "linked-hash-map",
  "log",
@@ -3002,6 +2801,7 @@ dependencies = [
  "rand",
  "rand_pcg",
  "sc-block-builder",
+ "sc-chain-spec",
  "sc-cli",
  "sc-client-api",
  "sc-client-db",
@@ -3014,24 +2814,26 @@ dependencies = [
  "sp-blockchain",
  "sp-core",
  "sp-database",
- "sp-externalities 0.19.0",
+ "sp-externalities",
+ "sp-genesis-builder",
  "sp-inherents",
  "sp-io",
  "sp-keystore",
  "sp-runtime",
  "sp-state-machine",
- "sp-storage 13.0.0",
+ "sp-storage",
  "sp-trie",
- "sp-wasm-interface 14.0.0",
+ "sp-wasm-interface",
  "thiserror",
  "thousands",
 ]
 
 [[package]]
 name = "frame-executive"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
+ "aquamarine",
  "frame-support",
  "frame-system",
  "frame-try-runtime",
@@ -3041,8 +2843,7 @@ dependencies = [
  "sp-core",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
- "sp-tracing 10.0.0",
+ "sp-tracing",
 ]
 
 [[package]]
@@ -3069,33 +2870,12 @@ dependencies = [
 ]
 
 [[package]]
-name = "frame-remote-externalities"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
-dependencies = [
- "futures 0.3.30",
- "indicatif",
- "jsonrpsee 0.16.3",
- "log",
- "parity-scale-codec",
- "serde",
- "sp-core",
- "sp-io",
- "sp-runtime",
- "sp-state-machine",
- "spinners",
- "substrate-rpc-client",
- "tokio",
- "tokio-retry",
-]
-
-[[package]]
-name = "frame-support"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+name = "frame-support"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "aquamarine",
- "array-bytes 6.2.3",
+ "array-bytes",
  "bitflags 1.3.2",
  "docify",
  "environmental",
@@ -3114,8 +2894,8 @@ dependencies = [
  "sp-api",
  "sp-arithmetic",
  "sp-core",
- "sp-core-hashing-proc-macro",
- "sp-debug-derive 8.0.0",
+ "sp-crypto-hashing-proc-macro",
+ "sp-debug-derive",
  "sp-genesis-builder",
  "sp-inherents",
  "sp-io",
@@ -3123,8 +2903,8 @@ dependencies = [
  "sp-runtime",
  "sp-staking",
  "sp-state-machine",
- "sp-std 8.0.0",
- "sp-tracing 10.0.0",
+ "sp-std",
+ "sp-tracing",
  "sp-weights",
  "static_assertions",
  "tt-call",
@@ -3132,49 +2912,50 @@ dependencies = [
 
 [[package]]
 name = "frame-support-procedural"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "30.0.3"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "Inflector",
  "cfg-expr",
- "derive-syn-parse 0.1.5",
+ "derive-syn-parse",
+ "docify",
  "expander",
  "frame-support-procedural-tools",
- "itertools 0.10.5",
+ "itertools 0.11.0",
  "macro_magic",
- "proc-macro-warning",
+ "proc-macro-warning 1.0.2",
  "proc-macro2",
  "quote",
- "sp-core-hashing",
- "syn 2.0.66",
+ "sp-crypto-hashing",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "frame-support-procedural-tools"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "13.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-support-procedural-tools-derive",
- "proc-macro-crate 3.1.0",
+ "proc-macro-crate 3.2.0",
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "frame-support-procedural-tools-derive"
-version = "3.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "12.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "frame-system"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "cfg-if",
  "docify",
@@ -3186,15 +2967,15 @@ dependencies = [
  "sp-core",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
+ "sp-std",
  "sp-version",
  "sp-weights",
 ]
 
 [[package]]
 name = "frame-system-benchmarking"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -3203,28 +2984,27 @@ dependencies = [
  "scale-info",
  "sp-core",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "frame-system-rpc-runtime-api"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "34.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
+ "docify",
  "parity-scale-codec",
  "sp-api",
 ]
 
 [[package]]
 name = "frame-try-runtime"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.44.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-support",
  "parity-scale-codec",
  "sp-api",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
@@ -3282,6 +3062,16 @@ dependencies = [
  "futures-util",
 ]
 
+[[package]]
+name = "futures-bounded"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b07bbbe7d7e78809544c6f718d875627addc73a7c3582447abc052cd3dc67e0"
+dependencies = [
+ "futures-timer",
+ "futures-util",
+]
+
 [[package]]
 name = "futures-channel"
 version = "0.3.30"
@@ -3326,7 +3116,7 @@ dependencies = [
  "futures-core",
  "futures-io",
  "parking",
- "pin-project-lite 0.2.14",
+ "pin-project-lite",
 ]
 
 [[package]]
@@ -3337,18 +3127,17 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "futures-rustls"
-version = "0.22.2"
+version = "0.24.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2411eed028cdf8c8034eaf21f9915f956b6c3abec4d4c7949ee67f0721127bd"
+checksum = "35bd3cf68c183738046838e300353e4716c674dc5e56890de4826801a6622a28"
 dependencies = [
  "futures-io",
- "rustls 0.20.9",
- "webpki",
+ "rustls 0.21.12",
 ]
 
 [[package]]
@@ -3383,7 +3172,7 @@ dependencies = [
  "futures-sink",
  "futures-task",
  "memchr",
- "pin-project-lite 0.2.14",
+ "pin-project-lite",
  "pin-utils",
  "slab",
 ]
@@ -3408,6 +3197,7 @@ dependencies = [
  "frame-system",
  "frame-system-benchmarking",
  "frame-system-rpc-runtime-api",
+ "frame-try-runtime",
  "hex-literal",
  "log",
  "node-primitives",
@@ -3464,9 +3254,9 @@ dependencies = [
  "sp-runtime",
  "sp-session",
  "sp-staking",
- "sp-std 8.0.0",
  "sp-transaction-pool",
  "sp-version",
+ "sp-weights",
  "substrate-wasm-builder",
 ]
 
@@ -3481,6 +3271,7 @@ dependencies = [
  "frame-system",
  "frame-system-benchmarking",
  "frame-system-rpc-runtime-api",
+ "frame-try-runtime",
  "hex-literal",
  "log",
  "node-primitives",
@@ -3540,9 +3331,9 @@ dependencies = [
  "sp-runtime",
  "sp-session",
  "sp-staking",
- "sp-std 8.0.0",
  "sp-transaction-pool",
  "sp-version",
+ "sp-weights",
  "substrate-wasm-builder",
 ]
 
@@ -3576,17 +3367,6 @@ dependencies = [
  "winapi",
 ]
 
-[[package]]
-name = "getrandom"
-version = "0.1.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
-dependencies = [
- "cfg-if",
- "libc",
- "wasi 0.9.0+wasi-snapshot-preview1",
-]
-
 [[package]]
 name = "getrandom"
 version = "0.2.15"
@@ -3594,10 +3374,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
 dependencies = [
  "cfg-if",
- "js-sys",
  "libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
- "wasm-bindgen",
+ "wasi",
 ]
 
 [[package]]
@@ -3607,7 +3385,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6ea1015b5a70616b688dc230cfe50c8af89d972cb132d5a622814d29773b10b9"
 dependencies = [
  "rand",
- "rand_core 0.6.4",
+ "rand_core",
 ]
 
 [[package]]
@@ -3631,7 +3409,7 @@ dependencies = [
  "quote",
  "serde",
  "serde_json",
- "syn 2.0.66",
+ "syn 2.0.79",
  "textwrap",
  "thiserror",
  "typed-builder",
@@ -3643,7 +3421,7 @@ version = "0.27.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
 dependencies = [
- "fallible-iterator",
+ "fallible-iterator 0.2.0",
  "indexmap 1.9.3",
  "stable_deref_trait",
 ]
@@ -3652,7 +3430,17 @@ dependencies = [
 name = "gimli"
 version = "0.29.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd"
+checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
+dependencies = [
+ "fallible-iterator 0.3.0",
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "gimli"
+version = "0.31.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64"
 
 [[package]]
 name = "git-version"
@@ -3671,7 +3459,7 @@ checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -3682,15 +3470,15 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
 
 [[package]]
 name = "globset"
-version = "0.4.14"
+version = "0.4.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
+checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19"
 dependencies = [
  "aho-corasick",
  "bstr",
  "log",
- "regex-automata 0.4.7",
- "regex-syntax 0.8.4",
+ "regex-automata 0.4.8",
+ "regex-syntax 0.8.5",
 ]
 
 [[package]]
@@ -3710,11 +3498,31 @@ version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757"
 dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
  "ignore",
  "walkdir",
 ]
 
+[[package]]
+name = "governor"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68a7f542ee6b35af73b06abc0dad1c1bae89964e4e253bc4b587b91c9637867b"
+dependencies = [
+ "cfg-if",
+ "dashmap",
+ "futures 0.3.30",
+ "futures-timer",
+ "no-std-compat",
+ "nonzero_ext",
+ "parking_lot 0.12.3",
+ "portable-atomic",
+ "quanta",
+ "rand",
+ "smallvec",
+ "spinning_top",
+]
+
 [[package]]
 name = "graphql-introspection-query"
 version = "0.2.0"
@@ -3726,19 +3534,19 @@ dependencies = [
 
 [[package]]
 name = "graphql-parser"
-version = "0.2.3"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5613c31f18676f164112732202124f373bb2103ff017b3b85ca954ea6a66ada"
+checksum = "d2ebc8013b4426d5b81a4364c419a95ed0b404af2b82e2457de52d9348f0e474"
 dependencies = [
- "combine",
- "failure",
+ "combine 3.8.1",
+ "thiserror",
 ]
 
 [[package]]
 name = "graphql_client"
-version = "0.10.0"
+version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9b58571cfc3cc42c3e8ff44fc6cfbb6c0dea17ed22d20f9d8f1efc4e8209a3f"
+checksum = "09cdf7b487d864c2939b23902291a5041bc4a84418268f25fda1c8d4e15ad8fa"
 dependencies = [
  "graphql_query_derive",
  "serde",
@@ -3747,13 +3555,13 @@ dependencies = [
 
 [[package]]
 name = "graphql_client_codegen"
-version = "0.10.0"
+version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4bf9cd823359d74ad3d3ecf1afd4a975f4ff2f891cdf9a66744606daf52de8c"
+checksum = "a40f793251171991c4eb75bd84bc640afa8b68ff6907bc89d3b712a22f700506"
 dependencies = [
  "graphql-introspection-query",
  "graphql-parser",
- "heck 0.3.3",
+ "heck 0.4.1",
  "lazy_static",
  "proc-macro2",
  "quote",
@@ -3764,9 +3572,9 @@ dependencies = [
 
 [[package]]
 name = "graphql_query_derive"
-version = "0.10.0"
+version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e56b093bfda71de1da99758b036f4cc811fd2511c8a76f75680e9ffbd2bb4251"
+checksum = "00bda454f3d313f909298f626115092d348bc231025699f557b27e248475f48c"
 dependencies = [
  "graphql_client_codegen",
  "proc-macro2",
@@ -3780,8 +3588,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63"
 dependencies = [
  "ff",
- "rand_core 0.6.4",
- "subtle 2.5.0",
+ "rand_core",
+ "subtle 2.6.1",
 ]
 
 [[package]]
@@ -3852,9 +3660,9 @@ dependencies = [
  "sp-runtime",
  "sp-session",
  "sp-staking",
- "sp-std 8.0.0",
  "sp-transaction-pool",
  "sp-version",
+ "sp-weights",
  "substrate-wasm-builder",
 ]
 
@@ -3869,8 +3677,27 @@ dependencies = [
  "futures-core",
  "futures-sink",
  "futures-util",
- "http",
- "indexmap 2.2.6",
+ "http 0.2.12",
+ "indexmap 2.5.0",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "h2"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205"
+dependencies = [
+ "atomic-waker",
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "http 1.1.0",
+ "indexmap 2.5.0",
  "slab",
  "tokio",
  "tokio-util",
@@ -3879,9 +3706,9 @@ dependencies = [
 
 [[package]]
 name = "handlebars"
-version = "4.5.0"
+version = "5.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "faa67bab9ff362228eb3d00bd024a4965d8231bbb7921167f0cfa66c6626b225"
+checksum = "d08485b96a0e6393e9e4d1b8d48cf74ad6c063cd905eb33f42c1ce3f0377539b"
 dependencies = [
  "log",
  "pest",
@@ -3911,9 +3738,6 @@ name = "hashbrown"
 version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
-dependencies = [
- "ahash 0.7.8",
-]
 
 [[package]]
 name = "hashbrown"
@@ -3921,7 +3745,7 @@ version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
 dependencies = [
- "ahash 0.8.11",
+ "ahash",
 ]
 
 [[package]]
@@ -3930,7 +3754,7 @@ version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
 dependencies = [
- "ahash 0.8.11",
+ "ahash",
  "allocator-api2",
  "serde",
 ]
@@ -3944,15 +3768,6 @@ dependencies = [
  "hashbrown 0.14.5",
 ]
 
-[[package]]
-name = "heck"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
-dependencies = [
- "unicode-segmentation",
-]
-
 [[package]]
 name = "heck"
 version = "0.4.1"
@@ -3983,6 +3798,12 @@ version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
 
+[[package]]
+name = "hex-conservative"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20"
+
 [[package]]
 name = "hex-literal"
 version = "0.4.1"
@@ -4008,16 +3829,6 @@ dependencies = [
  "digest 0.9.0",
 ]
 
-[[package]]
-name = "hmac"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b"
-dependencies = [
- "crypto-mac 0.11.0",
- "digest 0.9.0",
-]
-
 [[package]]
 name = "hmac"
 version = "0.12.1"
@@ -4069,6 +3880,17 @@ dependencies = [
  "itoa",
 ]
 
+[[package]]
+name = "http"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
 [[package]]
 name = "http-body"
 version = "0.4.6"
@@ -4076,15 +3898,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
 dependencies = [
  "bytes",
- "http",
- "pin-project-lite 0.2.14",
+ "http 0.2.12",
+ "pin-project-lite",
 ]
 
 [[package]]
-name = "http-range-header"
-version = "0.3.1"
+name = "http-body"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
+dependencies = [
+ "bytes",
+ "http 1.1.0",
+]
+
+[[package]]
+name = "http-body-util"
+version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f"
+checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
+dependencies = [
+ "bytes",
+ "futures-util",
+ "http 1.1.0",
+ "http-body 1.0.1",
+ "pin-project-lite",
+]
 
 [[package]]
 name = "httparse"
@@ -4106,21 +3945,21 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
 
 [[package]]
 name = "hyper"
-version = "0.14.29"
+version = "0.14.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33"
+checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9"
 dependencies = [
  "bytes",
  "futures-channel",
  "futures-core",
  "futures-util",
- "h2",
- "http",
- "http-body",
+ "h2 0.3.26",
+ "http 0.2.12",
+ "http-body 0.4.6",
  "httparse",
  "httpdate",
  "itoa",
- "pin-project-lite 0.2.14",
+ "pin-project-lite",
  "socket2 0.5.7",
  "tokio",
  "tower-service",
@@ -4128,6 +3967,27 @@ dependencies = [
  "want",
 ]
 
+[[package]]
+name = "hyper"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "h2 0.4.6",
+ "http 1.1.0",
+ "http-body 1.0.1",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "smallvec",
+ "tokio",
+ "want",
+]
+
 [[package]]
 name = "hyper-rustls"
 version = "0.24.2"
@@ -4135,21 +3995,57 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
 dependencies = [
  "futures-util",
- "http",
- "hyper",
+ "http 0.2.12",
+ "hyper 0.14.30",
  "log",
  "rustls 0.21.12",
  "rustls-native-certs 0.6.3",
  "tokio",
  "tokio-rustls 0.24.1",
- "webpki-roots 0.25.4",
+]
+
+[[package]]
+name = "hyper-rustls"
+version = "0.27.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333"
+dependencies = [
+ "futures-util",
+ "http 1.1.0",
+ "hyper 1.4.1",
+ "hyper-util",
+ "rustls 0.23.13",
+ "rustls-pki-types",
+ "tokio",
+ "tokio-rustls 0.26.0",
+ "tower-service",
+ "webpki-roots 0.26.6",
+]
+
+[[package]]
+name = "hyper-util"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "http 1.1.0",
+ "http-body 1.0.1",
+ "hyper 1.4.1",
+ "pin-project-lite",
+ "socket2 0.5.7",
+ "tokio",
+ "tower-service",
+ "tracing",
 ]
 
 [[package]]
 name = "iana-time-zone"
-version = "0.1.60"
+version = "0.1.61"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
 dependencies = [
  "android_system_properties",
  "core-foundation-sys",
@@ -4185,6 +4081,16 @@ dependencies = [
  "unicode-normalization",
 ]
 
+[[package]]
+name = "idna"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
 [[package]]
 name = "idna"
 version = "0.5.0"
@@ -4224,17 +4130,36 @@ dependencies = [
  "windows",
 ]
 
+[[package]]
+name = "igd-next"
+version = "0.14.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "064d90fec10d541084e7b39ead8875a5a80d9114a2b18791565253bae25f49e4"
+dependencies = [
+ "async-trait",
+ "attohttpc",
+ "bytes",
+ "futures 0.3.30",
+ "http 0.2.12",
+ "hyper 0.14.30",
+ "log",
+ "rand",
+ "tokio",
+ "url",
+ "xmltree",
+]
+
 [[package]]
 name = "ignore"
-version = "0.4.22"
+version = "0.4.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1"
+checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b"
 dependencies = [
  "crossbeam-deque",
  "globset",
  "log",
  "memchr",
- "regex-automata 0.4.7",
+ "regex-automata 0.4.8",
  "same-file",
  "walkdir",
  "winapi-util",
@@ -4301,9 +4226,9 @@ dependencies = [
 
 [[package]]
 name = "indexmap"
-version = "2.2.6"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
+checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5"
 dependencies = [
  "equivalent",
  "hashbrown 0.14.5",
@@ -4315,19 +4240,6 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590"
 
-[[package]]
-name = "indicatif"
-version = "0.17.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3"
-dependencies = [
- "console",
- "instant",
- "number_prefix",
- "portable-atomic",
- "unicode-width",
-]
-
 [[package]]
 name = "inflections"
 version = "1.1.1"
@@ -4418,26 +4330,26 @@ dependencies = [
 
 [[package]]
 name = "ipnet"
-version = "2.9.0"
+version = "2.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
+checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4"
 
 [[package]]
 name = "is-terminal"
-version = "0.4.12"
+version = "0.4.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b"
+checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b"
 dependencies = [
- "hermit-abi 0.3.9",
+ "hermit-abi 0.4.0",
  "libc",
  "windows-sys 0.52.0",
 ]
 
 [[package]]
 name = "is_terminal_polyfill"
-version = "1.70.0"
+version = "1.70.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800"
+checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
 
 [[package]]
 name = "itertools"
@@ -4448,6 +4360,15 @@ dependencies = [
  "either",
 ]
 
+[[package]]
+name = "itertools"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
+dependencies = [
+ "either",
+]
+
 [[package]]
 name = "itertools"
 version = "0.12.1"
@@ -4463,85 +4384,94 @@ version = "1.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
 
+[[package]]
+name = "jni"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec"
+dependencies = [
+ "cesu8",
+ "combine 4.6.7",
+ "jni-sys",
+ "log",
+ "thiserror",
+ "walkdir",
+]
+
+[[package]]
+name = "jni-sys"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
+
 [[package]]
 name = "jobserver"
-version = "0.1.31"
+version = "0.1.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e"
+checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
 dependencies = [
  "libc",
 ]
 
 [[package]]
 name = "js-sys"
-version = "0.3.69"
+version = "0.3.70"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d"
+checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a"
 dependencies = [
  "wasm-bindgen",
 ]
 
 [[package]]
 name = "jsonrpsee"
-version = "0.16.3"
+version = "0.22.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "367a292944c07385839818bb71c8d76611138e2dedb0677d035b8da21d29c78b"
+checksum = "cfdb12a2381ea5b2e68c3469ec604a007b367778cdb14d09612c8069ebd616ad"
 dependencies = [
- "jsonrpsee-core 0.16.3",
- "jsonrpsee-http-client 0.16.3",
- "jsonrpsee-proc-macros",
- "jsonrpsee-server",
- "jsonrpsee-types 0.16.3",
- "jsonrpsee-ws-client",
- "tracing",
+ "jsonrpsee-client-transport 0.22.5",
+ "jsonrpsee-core 0.22.5",
+ "jsonrpsee-http-client",
+ "jsonrpsee-types 0.22.5",
 ]
 
 [[package]]
 name = "jsonrpsee"
-version = "0.21.0"
+version = "0.23.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9579d0ca9fb30da026bac2f0f7d9576ec93489aeb7cd4971dd5b4617d82c79b2"
+checksum = "62b089779ad7f80768693755a031cc14a7766aba707cbe886674e3f79e9b7e47"
 dependencies = [
- "jsonrpsee-client-transport 0.21.0",
- "jsonrpsee-core 0.21.0",
- "jsonrpsee-http-client 0.21.0",
- "jsonrpsee-types 0.21.0",
+ "jsonrpsee-core 0.23.2",
+ "jsonrpsee-types 0.23.2",
+ "jsonrpsee-ws-client",
 ]
 
 [[package]]
-name = "jsonrpsee-client-transport"
-version = "0.16.3"
+name = "jsonrpsee"
+version = "0.24.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8b3815d9f5d5de348e5f162b316dc9cdf4548305ebb15b4eb9328e66cf27d7a"
+checksum = "126b48a5acc3c52fbd5381a77898cb60e145123179588a29e7ac48f9c06e401b"
 dependencies = [
- "futures-util",
- "http",
- "jsonrpsee-core 0.16.3",
- "jsonrpsee-types 0.16.3",
- "pin-project",
- "rustls-native-certs 0.6.3",
- "soketto",
- "thiserror",
+ "jsonrpsee-core 0.24.5",
+ "jsonrpsee-proc-macros",
+ "jsonrpsee-server",
+ "jsonrpsee-types 0.24.5",
  "tokio",
- "tokio-rustls 0.24.1",
- "tokio-util",
  "tracing",
- "webpki-roots 0.25.4",
 ]
 
 [[package]]
 name = "jsonrpsee-client-transport"
-version = "0.21.0"
+version = "0.22.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9f9ed46590a8d5681975f126e22531698211b926129a40a2db47cbca429220"
+checksum = "4978087a58c3ab02efc5b07c5e5e2803024536106fd5506f558db172c889b3aa"
 dependencies = [
  "futures-util",
- "http",
- "jsonrpsee-core 0.21.0",
+ "http 0.2.12",
+ "jsonrpsee-core 0.22.5",
  "pin-project",
- "rustls-native-certs 0.7.0",
+ "rustls-native-certs 0.7.3",
  "rustls-pki-types",
- "soketto",
+ "soketto 0.7.1",
  "thiserror",
  "tokio",
  "tokio-rustls 0.25.0",
@@ -4551,49 +4481,65 @@ dependencies = [
 ]
 
 [[package]]
-name = "jsonrpsee-core"
-version = "0.16.3"
+name = "jsonrpsee-client-transport"
+version = "0.23.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b5dde66c53d6dcdc8caea1874a45632ec0fcf5b437789f1e45766a1512ce803"
+checksum = "08163edd8bcc466c33d79e10f695cdc98c00d1e6ddfb95cec41b6b0279dd5432"
+dependencies = [
+ "base64 0.22.1",
+ "futures-util",
+ "http 1.1.0",
+ "jsonrpsee-core 0.23.2",
+ "pin-project",
+ "rustls 0.23.13",
+ "rustls-pki-types",
+ "rustls-platform-verifier",
+ "soketto 0.8.0",
+ "thiserror",
+ "tokio",
+ "tokio-rustls 0.26.0",
+ "tokio-util",
+ "tracing",
+ "url",
+]
+
+[[package]]
+name = "jsonrpsee-core"
+version = "0.22.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4b257e1ec385e07b0255dde0b933f948b5c8b8c28d42afda9587c3a967b896d"
 dependencies = [
  "anyhow",
- "arrayvec 0.7.4",
- "async-lock 2.8.0",
  "async-trait",
  "beef",
- "futures-channel",
  "futures-timer",
  "futures-util",
- "globset",
- "hyper",
- "jsonrpsee-types 0.16.3",
- "parking_lot 0.12.3",
- "rand",
- "rustc-hash",
+ "hyper 0.14.30",
+ "jsonrpsee-types 0.22.5",
+ "pin-project",
+ "rustc-hash 1.1.0",
  "serde",
  "serde_json",
- "soketto",
  "thiserror",
  "tokio",
+ "tokio-stream",
  "tracing",
 ]
 
 [[package]]
 name = "jsonrpsee-core"
-version = "0.21.0"
+version = "0.23.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "776d009e2f591b78c038e0d053a796f94575d66ca4e77dd84bfc5e81419e436c"
+checksum = "79712302e737d23ca0daa178e752c9334846b08321d439fd89af9a384f8c830b"
 dependencies = [
  "anyhow",
- "async-lock 3.4.0",
  "async-trait",
  "beef",
  "futures-timer",
  "futures-util",
- "hyper",
- "jsonrpsee-types 0.21.0",
+ "jsonrpsee-types 0.23.2",
  "pin-project",
- "rustc-hash",
+ "rustc-hash 1.1.0",
  "serde",
  "serde_json",
  "thiserror",
@@ -4603,17 +4549,21 @@ dependencies = [
 ]
 
 [[package]]
-name = "jsonrpsee-http-client"
-version = "0.16.3"
+name = "jsonrpsee-core"
+version = "0.24.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e5f9fabdd5d79344728521bb65e3106b49ec405a78b66fbff073b72b389fa43"
+checksum = "b0e503369a76e195b65af35058add0e6900b794a4e9a9316900ddd3a87a80477"
 dependencies = [
  "async-trait",
- "hyper",
- "hyper-rustls",
- "jsonrpsee-core 0.16.3",
- "jsonrpsee-types 0.16.3",
- "rustc-hash",
+ "bytes",
+ "futures-util",
+ "http 1.1.0",
+ "http-body 1.0.1",
+ "http-body-util",
+ "jsonrpsee-types 0.24.5",
+ "parking_lot 0.12.3",
+ "rand",
+ "rustc-hash 2.0.0",
  "serde",
  "serde_json",
  "thiserror",
@@ -4623,15 +4573,15 @@ dependencies = [
 
 [[package]]
 name = "jsonrpsee-http-client"
-version = "0.21.0"
+version = "0.22.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78b7de9f3219d95985eb77fd03194d7c1b56c19bce1abfcc9d07462574b15572"
+checksum = "1ccf93fc4a0bfe05d851d37d7c32b7f370fe94336b52a2f0efc5f1981895c2e5"
 dependencies = [
  "async-trait",
- "hyper",
- "hyper-rustls",
- "jsonrpsee-core 0.21.0",
- "jsonrpsee-types 0.21.0",
+ "hyper 0.14.30",
+ "hyper-rustls 0.24.2",
+ "jsonrpsee-core 0.22.5",
+ "jsonrpsee-types 0.22.5",
  "serde",
  "serde_json",
  "thiserror",
@@ -4643,32 +4593,37 @@ dependencies = [
 
 [[package]]
 name = "jsonrpsee-proc-macros"
-version = "0.16.3"
+version = "0.24.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44e8ab85614a08792b9bff6c8feee23be78c98d0182d4c622c05256ab553892a"
+checksum = "fc660a9389e2748e794a40673a4155d501f32db667757cdb80edeff0306b489b"
 dependencies = [
- "heck 0.4.1",
- "proc-macro-crate 1.1.3",
+ "heck 0.5.0",
+ "proc-macro-crate 3.2.0",
  "proc-macro2",
  "quote",
- "syn 1.0.109",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "jsonrpsee-server"
-version = "0.16.3"
+version = "0.24.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf4d945a6008c9b03db3354fb3c83ee02d2faa9f2e755ec1dfb69c3551b8f4ba"
+checksum = "af6e6c9b6d975edcb443565d648b605f3e85a04ec63aa6941811a8894cc9cded"
 dependencies = [
- "futures-channel",
  "futures-util",
- "http",
- "hyper",
- "jsonrpsee-core 0.16.3",
- "jsonrpsee-types 0.16.3",
+ "http 1.1.0",
+ "http-body 1.0.1",
+ "http-body-util",
+ "hyper 1.4.1",
+ "hyper-util",
+ "jsonrpsee-core 0.24.5",
+ "jsonrpsee-types 0.24.5",
+ "pin-project",
+ "route-recognizer",
  "serde",
  "serde_json",
- "soketto",
+ "soketto 0.8.0",
+ "thiserror",
  "tokio",
  "tokio-stream",
  "tokio-util",
@@ -4678,26 +4633,37 @@ dependencies = [
 
 [[package]]
 name = "jsonrpsee-types"
-version = "0.16.3"
+version = "0.22.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "245ba8e5aa633dd1c1e4fae72bce06e71f42d34c14a2767c6b4d173b57bee5e5"
+checksum = "150d6168405890a7a3231a3c74843f58b8959471f6df76078db2619ddee1d07d"
 dependencies = [
  "anyhow",
  "beef",
  "serde",
  "serde_json",
  "thiserror",
- "tracing",
 ]
 
 [[package]]
 name = "jsonrpsee-types"
-version = "0.21.0"
+version = "0.23.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3266dfb045c9174b24c77c2dfe0084914bb23a6b2597d70c9dc6018392e1cd1b"
+checksum = "d9c465fbe385238e861fdc4d1c85e04ada6c1fd246161d26385c1b311724d2af"
 dependencies = [
- "anyhow",
  "beef",
+ "http 1.1.0",
+ "serde",
+ "serde_json",
+ "thiserror",
+]
+
+[[package]]
+name = "jsonrpsee-types"
+version = "0.24.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8fb16314327cbc94fdf7965ef7e4422509cd5597f76d137bd104eb34aeede67"
+dependencies = [
+ "http 1.1.0",
  "serde",
  "serde_json",
  "thiserror",
@@ -4705,26 +4671,28 @@ dependencies = [
 
 [[package]]
 name = "jsonrpsee-ws-client"
-version = "0.16.3"
+version = "0.23.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e1b3975ed5d73f456478681a417128597acd6a2487855fdb7b4a3d4d195bf5e"
+checksum = "1c28759775f5cb2f1ea9667672d3fe2b0e701d1f4b7b67954e60afe7fd058b5e"
 dependencies = [
- "http",
- "jsonrpsee-client-transport 0.16.3",
- "jsonrpsee-core 0.16.3",
- "jsonrpsee-types 0.16.3",
+ "http 1.1.0",
+ "jsonrpsee-client-transport 0.23.2",
+ "jsonrpsee-core 0.23.2",
+ "jsonrpsee-types 0.23.2",
+ "url",
 ]
 
 [[package]]
 name = "k256"
-version = "0.13.3"
+version = "0.13.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b"
+checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b"
 dependencies = [
  "cfg-if",
  "ecdsa",
  "elliptic-curve",
  "once_cell",
+ "serdect",
  "sha2 0.10.8",
 ]
 
@@ -4782,25 +4750,11 @@ dependencies = [
  "parking_lot 0.12.3",
 ]
 
-[[package]]
-name = "kvdb-rocksdb"
-version = "0.19.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b644c70b92285f66bfc2032922a79000ea30af7bc2ab31902992a5dcb9b434f6"
-dependencies = [
- "kvdb",
- "num_cpus",
- "parking_lot 0.12.3",
- "regex",
- "rocksdb",
- "smallvec",
-]
-
 [[package]]
 name = "lazy-regex"
-version = "3.1.0"
+version = "3.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d12be4595afdf58bd19e4a9f4e24187da2a66700786ff660a418e9059937a4c"
+checksum = "8d8e41c97e6bc7ecb552016274b99fbb5d035e8de288c582d9b933af6677bfda"
 dependencies = [
  "lazy-regex-proc_macros",
  "once_cell",
@@ -4809,43 +4763,27 @@ dependencies = [
 
 [[package]]
 name = "lazy-regex-proc_macros"
-version = "3.1.0"
+version = "3.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44bcd58e6c97a7fcbaffcdc95728b393b8d98933bfadad49ed4097845b57ef0b"
+checksum = "76e1d8b05d672c53cb9c7b920bbba8783845ae4f0b076e02a3db1d02c81b4163"
 dependencies = [
  "proc-macro2",
  "quote",
  "regex",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "lazy_static"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-
-[[package]]
-name = "lazycell"
-version = "1.3.0"
+version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
 
 [[package]]
 name = "libc"
-version = "0.2.155"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
-
-[[package]]
-name = "libloading"
-version = "0.8.3"
+version = "0.2.159"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19"
-dependencies = [
- "cfg-if",
- "windows-targets 0.52.5",
-]
+checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5"
 
 [[package]]
 name = "libm"
@@ -4855,14 +4793,15 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
 
 [[package]]
 name = "libp2p"
-version = "0.51.4"
+version = "0.52.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f35eae38201a993ece6bdc823292d6abd1bffed1c4d0f4a3517d2bd8e1d917fe"
+checksum = "e94495eb319a85b70a68b85e2389a95bb3555c71c49025b78c691a854a7e6464"
 dependencies = [
  "bytes",
+ "either",
  "futures 0.3.30",
  "futures-timer",
- "getrandom 0.2.15",
+ "getrandom",
  "instant",
  "libp2p-allow-block-list",
  "libp2p-connection-limits",
@@ -4879,18 +4818,21 @@ dependencies = [
  "libp2p-request-response",
  "libp2p-swarm",
  "libp2p-tcp",
+ "libp2p-upnp",
  "libp2p-wasm-ext",
  "libp2p-websocket",
  "libp2p-yamux",
- "multiaddr",
+ "multiaddr 0.18.2",
  "pin-project",
+ "rw-stream-sink",
+ "thiserror",
 ]
 
 [[package]]
 name = "libp2p-allow-block-list"
-version = "0.1.1"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "510daa05efbc25184458db837f6f9a5143888f1caa742426d92e1833ddd38a50"
+checksum = "55b46558c5c0bf99d3e2a1a38fd54ff5476ca66dd1737b12466a1824dd219311"
 dependencies = [
  "libp2p-core",
  "libp2p-identity",
@@ -4900,9 +4842,9 @@ dependencies = [
 
 [[package]]
 name = "libp2p-connection-limits"
-version = "0.1.0"
+version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4caa33f1d26ed664c4fe2cca81a08c8e07d4c1c04f2f4ac7655c2dd85467fda0"
+checksum = "2f5107ad45cb20b2f6c3628c7b6014b996fcb13a88053f4569c872c6e30abf58"
 dependencies = [
  "libp2p-core",
  "libp2p-identity",
@@ -4912,9 +4854,9 @@ dependencies = [
 
 [[package]]
 name = "libp2p-core"
-version = "0.39.2"
+version = "0.40.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c1df63c0b582aa434fb09b2d86897fa2b419ffeccf934b36f87fcedc8e835c2"
+checksum = "dd44289ab25e4c9230d9246c475a22241e301b23e8f4061d3bdef304a1a99713"
 dependencies = [
  "either",
  "fnv",
@@ -4923,8 +4865,8 @@ dependencies = [
  "instant",
  "libp2p-identity",
  "log",
- "multiaddr",
- "multihash",
+ "multiaddr 0.18.2",
+ "multihash 0.19.1",
  "multistream-select",
  "once_cell",
  "parking_lot 0.12.3",
@@ -4934,18 +4876,20 @@ dependencies = [
  "rw-stream-sink",
  "smallvec",
  "thiserror",
- "unsigned-varint",
+ "unsigned-varint 0.7.2",
  "void",
 ]
 
 [[package]]
 name = "libp2p-dns"
-version = "0.39.0"
+version = "0.40.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "146ff7034daae62077c415c2376b8057368042df6ab95f5432ad5e88568b1554"
+checksum = "e6a18db73084b4da2871438f6239fef35190b05023de7656e877c18a00541a3b"
 dependencies = [
+ "async-trait",
  "futures 0.3.30",
  "libp2p-core",
+ "libp2p-identity",
  "log",
  "parking_lot 0.12.3",
  "smallvec",
@@ -4954,19 +4898,20 @@ dependencies = [
 
 [[package]]
 name = "libp2p-identify"
-version = "0.42.2"
+version = "0.43.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5455f472243e63b9c497ff320ded0314254a9eb751799a39c283c6f20b793f3c"
+checksum = "45a96638a0a176bec0a4bcaebc1afa8cf909b114477209d7456ade52c61cd9cd"
 dependencies = [
  "asynchronous-codec",
  "either",
  "futures 0.3.30",
+ "futures-bounded",
  "futures-timer",
  "libp2p-core",
  "libp2p-identity",
  "libp2p-swarm",
  "log",
- "lru 0.10.1",
+ "lru",
  "quick-protobuf",
  "quick-protobuf-codec",
  "smallvec",
@@ -4976,29 +4921,29 @@ dependencies = [
 
 [[package]]
 name = "libp2p-identity"
-version = "0.1.3"
+version = "0.2.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "276bb57e7af15d8f100d3c11cbdd32c6752b7eef4ba7a18ecf464972c07abcce"
+checksum = "55cca1eb2bc1fd29f099f3daaab7effd01e1a54b7c577d0ed082521034d912e8"
 dependencies = [
- "bs58 0.4.0",
+ "bs58 0.5.1",
  "ed25519-dalek",
- "log",
- "multiaddr",
- "multihash",
+ "hkdf",
+ "multihash 0.19.1",
  "quick-protobuf",
  "rand",
  "sha2 0.10.8",
  "thiserror",
+ "tracing",
  "zeroize",
 ]
 
 [[package]]
 name = "libp2p-kad"
-version = "0.43.3"
+version = "0.44.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39d5ef876a2b2323d63c258e63c2f8e36f205fe5a11f0b3095d59635650790ff"
+checksum = "16ea178dabba6dde6ffc260a8e0452ccdc8f79becf544946692fff9d412fc29d"
 dependencies = [
- "arrayvec 0.7.4",
+ "arrayvec 0.7.6",
  "asynchronous-codec",
  "bytes",
  "either",
@@ -5011,20 +4956,21 @@ dependencies = [
  "libp2p-swarm",
  "log",
  "quick-protobuf",
+ "quick-protobuf-codec",
  "rand",
  "sha2 0.10.8",
  "smallvec",
  "thiserror",
  "uint",
- "unsigned-varint",
+ "unsigned-varint 0.7.2",
  "void",
 ]
 
 [[package]]
 name = "libp2p-mdns"
-version = "0.43.1"
+version = "0.44.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19983e1f949f979a928f2c603de1cf180cc0dc23e4ac93a62651ccb18341460b"
+checksum = "42a2567c305232f5ef54185e9604579a894fd0674819402bb0ac0246da82f52a"
 dependencies = [
  "data-encoding",
  "futures 0.3.30",
@@ -5035,38 +4981,43 @@ dependencies = [
  "log",
  "rand",
  "smallvec",
- "socket2 0.4.10",
+ "socket2 0.5.7",
  "tokio",
- "trust-dns-proto",
+ "trust-dns-proto 0.22.0",
  "void",
 ]
 
 [[package]]
 name = "libp2p-metrics"
-version = "0.12.0"
+version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a42ec91e227d7d0dafa4ce88b333cdf5f277253873ab087555c92798db2ddd46"
+checksum = "239ba7d28f8d0b5d77760dc6619c05c7e88e74ec8fbbe97f856f20a56745e620"
 dependencies = [
+ "instant",
  "libp2p-core",
  "libp2p-identify",
+ "libp2p-identity",
  "libp2p-kad",
  "libp2p-ping",
  "libp2p-swarm",
+ "once_cell",
  "prometheus-client",
 ]
 
 [[package]]
 name = "libp2p-noise"
-version = "0.42.2"
+version = "0.43.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c3673da89d29936bc6435bafc638e2f184180d554ce844db65915113f86ec5e"
+checksum = "d2eeec39ad3ad0677551907dd304b2f13f17208ccebe333bef194076cd2e8921"
 dependencies = [
  "bytes",
- "curve25519-dalek 3.2.0",
+ "curve25519-dalek",
  "futures 0.3.30",
  "libp2p-core",
  "libp2p-identity",
  "log",
+ "multiaddr 0.18.2",
+ "multihash 0.19.1",
  "once_cell",
  "quick-protobuf",
  "rand",
@@ -5074,21 +5025,22 @@ dependencies = [
  "snow",
  "static_assertions",
  "thiserror",
- "x25519-dalek 1.1.1",
+ "x25519-dalek",
  "zeroize",
 ]
 
 [[package]]
 name = "libp2p-ping"
-version = "0.42.0"
+version = "0.43.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e57759c19c28a73ef1eb3585ca410cefb72c1a709fcf6de1612a378e4219202"
+checksum = "e702d75cd0827dfa15f8fd92d15b9932abe38d10d21f47c50438c71dd1b5dae3"
 dependencies = [
  "either",
  "futures 0.3.30",
  "futures-timer",
  "instant",
  "libp2p-core",
+ "libp2p-identity",
  "libp2p-swarm",
  "log",
  "rand",
@@ -5097,9 +5049,9 @@ dependencies = [
 
 [[package]]
 name = "libp2p-quic"
-version = "0.7.0-alpha.3"
+version = "0.9.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6b26abd81cd2398382a1edfe739b539775be8a90fa6914f39b2ab49571ec735"
+checksum = "130d451d83f21b81eb7b35b360bc7972aeafb15177784adc56528db082e6b927"
 dependencies = [
  "bytes",
  "futures 0.3.30",
@@ -5110,18 +5062,20 @@ dependencies = [
  "libp2p-tls",
  "log",
  "parking_lot 0.12.3",
- "quinn-proto",
+ "quinn 0.10.2",
  "rand",
- "rustls 0.20.9",
+ "ring 0.16.20",
+ "rustls 0.21.12",
+ "socket2 0.5.7",
  "thiserror",
  "tokio",
 ]
 
 [[package]]
 name = "libp2p-request-response"
-version = "0.24.1"
+version = "0.25.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ffdb374267d42dc5ed5bc53f6e601d4a64ac5964779c6e40bb9e4f14c1e30d5"
+checksum = "d8e3b4d67870478db72bac87bfc260ee6641d0734e0e3e275798f089c3fecfd4"
 dependencies = [
  "async-trait",
  "futures 0.3.30",
@@ -5129,15 +5083,17 @@ dependencies = [
  "libp2p-core",
  "libp2p-identity",
  "libp2p-swarm",
+ "log",
  "rand",
  "smallvec",
+ "void",
 ]
 
 [[package]]
 name = "libp2p-swarm"
-version = "0.42.2"
+version = "0.43.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "903b3d592d7694e56204d211f29d31bc004be99386644ba8731fc3e3ef27b296"
+checksum = "580189e0074af847df90e75ef54f3f30059aedda37ea5a1659e8b9fca05c0141"
 dependencies = [
  "either",
  "fnv",
@@ -5148,6 +5104,8 @@ dependencies = [
  "libp2p-identity",
  "libp2p-swarm-derive",
  "log",
+ "multistream-select",
+ "once_cell",
  "rand",
  "smallvec",
  "tokio",
@@ -5156,36 +5114,39 @@ dependencies = [
 
 [[package]]
 name = "libp2p-swarm-derive"
-version = "0.32.0"
+version = "0.33.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fba456131824ab6acd4c7bf61e9c0f0a3014b5fc9868ccb8e10d344594cdc4f"
+checksum = "c4d5ec2a3df00c7836d7696c136274c9c59705bac69133253696a6c932cd1d74"
 dependencies = [
  "heck 0.4.1",
+ "proc-macro-warning 0.4.2",
+ "proc-macro2",
  "quote",
- "syn 1.0.109",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "libp2p-tcp"
-version = "0.39.0"
+version = "0.40.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33d33698596d7722d85d3ab0c86c2c322254fce1241e91208e3679b4eb3026cf"
+checksum = "b558dd40d1bcd1aaaed9de898e9ec6a436019ecc2420dd0016e712fbb61c5508"
 dependencies = [
  "futures 0.3.30",
  "futures-timer",
  "if-watch",
  "libc",
  "libp2p-core",
+ "libp2p-identity",
  "log",
- "socket2 0.4.10",
+ "socket2 0.5.7",
  "tokio",
 ]
 
 [[package]]
 name = "libp2p-tls"
-version = "0.1.0"
+version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff08d13d0dc66e5e9ba6279c1de417b84fa0d0adc3b03e5732928c180ec02781"
+checksum = "8218d1d5482b122ccae396bbf38abdcb283ecc96fa54760e1dfd251f0546ac61"
 dependencies = [
  "futures 0.3.30",
  "futures-rustls",
@@ -5193,51 +5154,69 @@ dependencies = [
  "libp2p-identity",
  "rcgen",
  "ring 0.16.20",
- "rustls 0.20.9",
+ "rustls 0.21.12",
+ "rustls-webpki 0.101.7",
  "thiserror",
- "webpki",
- "x509-parser",
+ "x509-parser 0.15.1",
  "yasna",
 ]
 
+[[package]]
+name = "libp2p-upnp"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82775a47b34f10f787ad3e2a22e2c1541e6ebef4fe9f28f3ac553921554c94c1"
+dependencies = [
+ "futures 0.3.30",
+ "futures-timer",
+ "igd-next",
+ "libp2p-core",
+ "libp2p-swarm",
+ "log",
+ "tokio",
+ "void",
+]
+
 [[package]]
 name = "libp2p-wasm-ext"
-version = "0.39.0"
+version = "0.40.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77dff9d32353a5887adb86c8afc1de1a94d9e8c3bc6df8b2201d7cdf5c848f43"
+checksum = "1e5d8e3a9e07da0ef5b55a9f26c009c8fb3c725d492d8bb4b431715786eea79c"
 dependencies = [
  "futures 0.3.30",
  "js-sys",
  "libp2p-core",
- "parity-send-wrapper",
+ "send_wrapper",
  "wasm-bindgen",
  "wasm-bindgen-futures",
 ]
 
 [[package]]
 name = "libp2p-websocket"
-version = "0.41.0"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "111273f7b3d3510524c752e8b7a5314b7f7a1fee7e68161c01a7d72cbb06db9f"
+checksum = "004ee9c4a4631435169aee6aad2f62e3984dc031c43b6d29731e8e82a016c538"
 dependencies = [
  "either",
  "futures 0.3.30",
  "futures-rustls",
  "libp2p-core",
+ "libp2p-identity",
  "log",
  "parking_lot 0.12.3",
- "quicksink",
+ "pin-project-lite",
  "rw-stream-sink",
- "soketto",
+ "soketto 0.8.0",
+ "thiserror",
  "url",
- "webpki-roots 0.22.6",
+ "webpki-roots 0.25.4",
 ]
 
 [[package]]
 name = "libp2p-yamux"
-version = "0.43.1"
+version = "0.44.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4dcd21d950662700a385d4c6d68e2f5f54d778e97068cdd718522222ef513bda"
+checksum = "8eedcb62824c4300efb9cfd4e2a6edaf3ca097b9e68b36dabe45a44469fd6a85"
 dependencies = [
  "futures 0.3.30",
  "libp2p-core",
@@ -5252,23 +5231,9 @@ version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
 dependencies = [
- "bitflags 2.5.0",
- "libc",
-]
-
-[[package]]
-name = "librocksdb-sys"
-version = "0.11.0+8.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3386f101bcb4bd252d8e9d2fb41ec3b0862a15a62b478c355b2982efa469e3e"
-dependencies = [
- "bindgen",
- "bzip2-sys",
- "cc",
- "glob",
+ "bitflags 2.6.0",
  "libc",
- "libz-sys",
- "tikv-jemalloc-sys",
+ "redox_syscall 0.5.7",
 ]
 
 [[package]]
@@ -5298,7 +5263,7 @@ checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451"
 dependencies = [
  "crunchy",
  "digest 0.9.0",
- "subtle 2.5.0",
+ "subtle 2.6.1",
 ]
 
 [[package]]
@@ -5321,9 +5286,9 @@ dependencies = [
 
 [[package]]
 name = "libz-sys"
-version = "1.1.18"
+version = "1.1.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e"
+checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472"
 dependencies = [
  "cc",
  "cmake",
@@ -5389,6 +5354,61 @@ dependencies = [
  "keystream",
 ]
 
+[[package]]
+name = "litep2p"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f46c51c205264b834ceed95c8b195026e700494bc3991aaba3b4ea9e20626d9"
+dependencies = [
+ "async-trait",
+ "bs58 0.4.0",
+ "bytes",
+ "cid 0.10.1",
+ "ed25519-dalek",
+ "futures 0.3.30",
+ "futures-timer",
+ "hex-literal",
+ "indexmap 2.5.0",
+ "libc",
+ "mockall 0.12.1",
+ "multiaddr 0.17.1",
+ "multihash 0.17.0",
+ "network-interface",
+ "nohash-hasher",
+ "parking_lot 0.12.3",
+ "pin-project",
+ "prost 0.12.6",
+ "prost-build 0.11.9",
+ "quinn 0.9.4",
+ "rand",
+ "rcgen",
+ "ring 0.16.20",
+ "rustls 0.20.9",
+ "serde",
+ "sha2 0.10.8",
+ "simple-dns",
+ "smallvec",
+ "snow",
+ "socket2 0.5.7",
+ "static_assertions",
+ "str0m",
+ "thiserror",
+ "tokio",
+ "tokio-stream",
+ "tokio-tungstenite",
+ "tokio-util",
+ "tracing",
+ "trust-dns-resolver",
+ "uint",
+ "unsigned-varint 0.8.0",
+ "url",
+ "webpki",
+ "x25519-dalek",
+ "x509-parser 0.16.0",
+ "yasna",
+ "zeroize",
+]
+
 [[package]]
 name = "lock_api"
 version = "0.4.12"
@@ -5401,24 +5421,15 @@ dependencies = [
 
 [[package]]
 name = "log"
-version = "0.4.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
-
-[[package]]
-name = "lru"
-version = "0.10.1"
+version = "0.4.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "718e8fae447df0c7e1ba7f5189829e63fd536945c8988d61444c19039f16b670"
-dependencies = [
- "hashbrown 0.13.2",
-]
+checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
 
 [[package]]
 name = "lru"
-version = "0.12.3"
+version = "0.12.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc"
+checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904"
 dependencies = [
  "hashbrown 0.14.5",
 ]
@@ -5434,19 +5445,18 @@ dependencies = [
 
 [[package]]
 name = "lz4"
-version = "1.25.0"
+version = "1.28.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6eab492fe7f8651add23237ea56dbf11b3c4ff762ab83d40a47f11433421f91"
+checksum = "4d1febb2b4a79ddd1980eede06a8f7902197960aa0383ffcfdd62fe723036725"
 dependencies = [
- "libc",
  "lz4-sys",
 ]
 
 [[package]]
 name = "lz4-sys"
-version = "1.9.5"
+version = "1.11.1+lz4-1.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9764018d143cc854c9f17f0b907de70f14393b1f502da6375dce70f00514eb3"
+checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6"
 dependencies = [
  "cc",
  "libc",
@@ -5463,50 +5473,50 @@ dependencies = [
 
 [[package]]
 name = "macro_magic"
-version = "0.5.0"
+version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e03844fc635e92f3a0067e25fa4bf3e3dbf3f2927bf3aa01bb7bc8f1c428949d"
+checksum = "cc33f9f0351468d26fbc53d9ce00a096c8522ecb42f19b50f34f2c422f76d21d"
 dependencies = [
  "macro_magic_core",
  "macro_magic_macros",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "macro_magic_core"
-version = "0.5.0"
+version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "468155613a44cfd825f1fb0ffa532b018253920d404e6fca1e8d43155198a46d"
+checksum = "1687dc887e42f352865a393acae7cf79d98fab6351cde1f58e9e057da89bf150"
 dependencies = [
  "const-random",
  "derive-syn-parse 0.1.5",
  "macro_magic_core_macros",
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "macro_magic_core_macros"
-version = "0.5.0"
+version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654"
+checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "macro_magic_macros"
-version = "0.5.0"
+version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3"
+checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869"
 dependencies = [
  "macro_magic_core",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -5523,9 +5533,9 @@ checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4"
 
 [[package]]
 name = "matchers"
-version = "0.0.1"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1"
+checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
 dependencies = [
  "regex-automata 0.1.10",
 ]
@@ -5547,9 +5557,9 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
 
 [[package]]
 name = "matrixmultiply"
-version = "0.3.8"
+version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2"
+checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a"
 dependencies = [
  "autocfg",
  "rawpointer",
@@ -5567,7 +5577,7 @@ version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64"
 dependencies = [
- "rustix 0.38.34",
+ "rustix 0.38.37",
 ]
 
 [[package]]
@@ -5581,9 +5591,9 @@ dependencies = [
 
 [[package]]
 name = "memmap2"
-version = "0.9.4"
+version = "0.9.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322"
+checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f"
 dependencies = [
  "libc",
 ]
@@ -5614,7 +5624,7 @@ checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d"
 dependencies = [
  "byteorder",
  "keccak",
- "rand_core 0.6.4",
+ "rand_core",
  "zeroize",
 ]
 
@@ -5632,11 +5642,11 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
 
 [[package]]
 name = "miniz_oxide"
-version = "0.7.4"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
+checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
 dependencies = [
- "adler",
+ "adler2",
 ]
 
 [[package]]
@@ -5647,10 +5657,22 @@ checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
 dependencies = [
  "libc",
  "log",
- "wasi 0.11.0+wasi-snapshot-preview1",
+ "wasi",
  "windows-sys 0.48.0",
 ]
 
+[[package]]
+name = "mio"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec"
+dependencies = [
+ "hermit-abi 0.3.9",
+ "libc",
+ "wasi",
+ "windows-sys 0.52.0",
+]
+
 [[package]]
 name = "mixnet"
 version = "0.7.0"
@@ -5658,11 +5680,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "daa3eb39495d8e2e2947a1d862852c90cc6a4a8845f8b41c8829cb9fcc047f4a"
 dependencies = [
  "arrayref",
- "arrayvec 0.7.4",
+ "arrayvec 0.7.6",
  "bitflags 1.3.2",
  "blake2 0.10.6",
  "c2-chacha",
- "curve25519-dalek 4.1.3",
+ "curve25519-dalek",
  "either",
  "hashlink",
  "lioness",
@@ -5671,7 +5693,7 @@ dependencies = [
  "rand",
  "rand_chacha",
  "rand_distr",
- "subtle 2.5.0",
+ "subtle 2.6.1",
  "thiserror",
  "zeroize",
 ]
@@ -5686,8 +5708,23 @@ dependencies = [
  "downcast",
  "fragile",
  "lazy_static",
- "mockall_derive",
- "predicates",
+ "mockall_derive 0.11.4",
+ "predicates 2.1.5",
+ "predicates-tree",
+]
+
+[[package]]
+name = "mockall"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43766c2b5203b10de348ffe19f7e54564b64f3d6018ff7648d1e2d6d3a0f0a48"
+dependencies = [
+ "cfg-if",
+ "downcast",
+ "fragile",
+ "lazy_static",
+ "mockall_derive 0.12.1",
+ "predicates 3.1.2",
  "predicates-tree",
 ]
 
@@ -5703,6 +5740,18 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "mockall_derive"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af7cbce79ec385a1d4f54baa90a76401eb15d9cab93685f62e7e9f942aa00ae2"
+dependencies = [
+ "cfg-if",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
+]
+
 [[package]]
 name = "multiaddr"
 version = "0.17.1"
@@ -5714,17 +5763,36 @@ dependencies = [
  "data-encoding",
  "log",
  "multibase",
- "multihash",
+ "multihash 0.17.0",
  "percent-encoding",
  "serde",
  "static_assertions",
- "unsigned-varint",
+ "unsigned-varint 0.7.2",
  "url",
 ]
 
 [[package]]
-name = "multibase"
-version = "0.9.1"
+name = "multiaddr"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe6351f60b488e04c1d21bc69e56b89cb3f5e8f5d22557d6e8031bdfd79b6961"
+dependencies = [
+ "arrayref",
+ "byteorder",
+ "data-encoding",
+ "libp2p-identity",
+ "multibase",
+ "multihash 0.19.1",
+ "percent-encoding",
+ "serde",
+ "static_assertions",
+ "unsigned-varint 0.8.0",
+ "url",
+]
+
+[[package]]
+name = "multibase"
+version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404"
 dependencies = [
@@ -5747,7 +5815,34 @@ dependencies = [
  "multihash-derive",
  "sha2 0.10.8",
  "sha3",
- "unsigned-varint",
+ "unsigned-varint 0.7.2",
+]
+
+[[package]]
+name = "multihash"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfd8a792c1694c6da4f68db0a9d707c72bd260994da179e6030a5dcee00bb815"
+dependencies = [
+ "blake2b_simd",
+ "blake2s_simd",
+ "blake3",
+ "core2",
+ "digest 0.10.7",
+ "multihash-derive",
+ "sha2 0.10.8",
+ "sha3",
+ "unsigned-varint 0.7.2",
+]
+
+[[package]]
+name = "multihash"
+version = "0.19.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "076d548d76a0e2a0d4ab471d0b1c36c577786dfc4471242035d97a12a735c492"
+dependencies = [
+ "core2",
+ "unsigned-varint 0.7.2",
 ]
 
 [[package]]
@@ -5761,7 +5856,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "syn 1.0.109",
- "synstructure",
+ "synstructure 0.12.6",
 ]
 
 [[package]]
@@ -5770,18 +5865,24 @@ version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a"
 
+[[package]]
+name = "multimap"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03"
+
 [[package]]
 name = "multistream-select"
-version = "0.12.1"
+version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8552ab875c1313b97b8d20cb857b9fd63e2d1d6a0a1b53ce9821e575405f27a"
+checksum = "ea0df8e5eec2298a62b326ee4f0d7fe1a6b90a09dfcf9df37b38f947a8c42f19"
 dependencies = [
  "bytes",
  "futures 0.3.30",
  "log",
  "pin-project",
  "smallvec",
- "unsigned-varint",
+ "unsigned-varint 0.7.2",
 ]
 
 [[package]]
@@ -5802,13 +5903,13 @@ dependencies = [
 
 [[package]]
 name = "nalgebra-macros"
-version = "0.2.1"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91761aed67d03ad966ef783ae962ef9bbaca728d2dd7ceb7939ec110fffad998"
+checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 1.0.109",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -5886,6 +5987,18 @@ dependencies = [
  "tokio",
 ]
 
+[[package]]
+name = "network-interface"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4a43439bf756eed340bdf8feba761e2d50c7d47175d87545cd5cbe4a137c4d1"
+dependencies = [
+ "cc",
+ "libc",
+ "thiserror",
+ "winapi",
+]
+
 [[package]]
 name = "nix"
 version = "0.24.3"
@@ -5899,16 +6012,22 @@ dependencies = [
 
 [[package]]
 name = "nix"
-version = "0.28.0"
+version = "0.29.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4"
+checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
 dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
  "cfg-if",
- "cfg_aliases",
+ "cfg_aliases 0.2.1",
  "libc",
 ]
 
+[[package]]
+name = "no-std-compat"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c"
+
 [[package]]
 name = "no-std-net"
 version = "0.6.0"
@@ -5918,7 +6037,7 @@ checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65"
 [[package]]
 name = "node-primitives"
 version = "2.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "sp-core",
  "sp-runtime",
@@ -5957,6 +6076,18 @@ dependencies = [
  "nom",
 ]
 
+[[package]]
+name = "nonempty"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e9e591e719385e6ebaeb5ce5d3887f7d5676fceca6411d1925ccc95745f3d6f7"
+
+[[package]]
+name = "nonzero_ext"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21"
+
 [[package]]
 name = "normalize-line-endings"
 version = "0.3.0"
@@ -5969,7 +6100,7 @@ version = "6.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d"
 dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
  "crossbeam-channel",
  "filetime",
  "fsevent-sys",
@@ -5977,7 +6108,7 @@ dependencies = [
  "kqueue",
  "libc",
  "log",
- "mio",
+ "mio 0.8.11",
  "walkdir",
  "windows-sys 0.48.0",
 ]
@@ -6004,9 +6135,9 @@ dependencies = [
 
 [[package]]
 name = "num-bigint"
-version = "0.4.5"
+version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7"
+checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
 dependencies = [
  "num-integer",
  "num-traits 0.2.19",
@@ -6033,7 +6164,7 @@ version = "0.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3"
 dependencies = [
- "arrayvec 0.7.4",
+ "arrayvec 0.7.6",
  "itoa",
 ]
 
@@ -6086,12 +6217,6 @@ dependencies = [
  "libc",
 ]
 
-[[package]]
-name = "number_prefix"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
-
 [[package]]
 name = "object"
 version = "0.30.4"
@@ -6113,20 +6238,41 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "object"
+version = "0.36.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a"
+dependencies = [
+ "memchr",
+]
+
 [[package]]
 name = "oid-registry"
 version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff"
 dependencies = [
- "asn1-rs",
+ "asn1-rs 0.5.2",
+]
+
+[[package]]
+name = "oid-registry"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9"
+dependencies = [
+ "asn1-rs 0.6.2",
 ]
 
 [[package]]
 name = "once_cell"
-version = "1.19.0"
+version = "1.20.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1"
+dependencies = [
+ "portable-atomic",
+]
 
 [[package]]
 name = "opaque-debug"
@@ -6140,12 +6286,60 @@ version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
 
+[[package]]
+name = "openssl"
+version = "0.10.66"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1"
+dependencies = [
+ "bitflags 2.6.0",
+ "cfg-if",
+ "foreign-types",
+ "libc",
+ "once_cell",
+ "openssl-macros",
+ "openssl-sys",
+]
+
+[[package]]
+name = "openssl-macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
+]
+
 [[package]]
 name = "openssl-probe"
 version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
 
+[[package]]
+name = "openssl-src"
+version = "300.3.2+3.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a211a18d945ef7e648cc6e0058f4c548ee46aab922ea203e0d30e966ea23647b"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.103"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6"
+dependencies = [
+ "cc",
+ "libc",
+ "openssl-src",
+ "pkg-config",
+ "vcpkg",
+]
+
 [[package]]
 name = "option-ext"
 version = "0.2.0"
@@ -6160,8 +6354,8 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
 
 [[package]]
 name = "pallet-atomic-swap"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -6170,13 +6364,12 @@ dependencies = [
  "sp-core",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-authority-discovery"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -6186,7 +6379,6 @@ dependencies = [
  "sp-application-crypto",
  "sp-authority-discovery",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
@@ -6207,13 +6399,12 @@ dependencies = [
  "sp-runtime",
  "sp-staking",
  "sp-state-machine",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-authorship"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -6221,13 +6412,12 @@ dependencies = [
  "parity-scale-codec",
  "scale-info",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-babe"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -6245,14 +6435,14 @@ dependencies = [
  "sp-runtime",
  "sp-session",
  "sp-staking",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-balances"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "39.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
+ "docify",
  "frame-benchmarking",
  "frame-support",
  "frame-system",
@@ -6260,7 +6450,6 @@ dependencies = [
  "parity-scale-codec",
  "scale-info",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
@@ -6278,13 +6467,12 @@ dependencies = [
  "sp-io",
  "sp-keystore",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-collective"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -6295,7 +6483,6 @@ dependencies = [
  "sp-core",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
@@ -6305,7 +6492,6 @@ dependencies = [
  "frame-benchmarking",
  "frame-support",
  "frame-system",
- "getrandom 0.2.15",
  "pallet-authority-members",
  "pallet-authorship",
  "pallet-balances",
@@ -6320,7 +6506,6 @@ dependencies = [
  "sp-io",
  "sp-keystore",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
@@ -6342,14 +6527,12 @@ dependencies = [
  "sp-core",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-duniter-test-parameters"
 version = "1.0.0"
 dependencies = [
- "frame-benchmarking",
  "frame-support",
  "frame-system",
  "pallet-duniter-test-parameters-macro",
@@ -6359,7 +6542,6 @@ dependencies = [
  "sp-core",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
@@ -6368,7 +6550,7 @@ version = "1.0.0"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -6389,13 +6571,12 @@ dependencies = [
  "sp-membership",
  "sp-runtime",
  "sp-state-machine",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-grandpa"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -6412,7 +6593,6 @@ dependencies = [
  "sp-runtime",
  "sp-session",
  "sp-staking",
- "sp-std 8.0.0",
 ]
 
 [[package]]
@@ -6423,7 +6603,6 @@ dependencies = [
  "frame-benchmarking",
  "frame-support",
  "frame-system",
- "impl-trait-for-tuples",
  "parity-scale-codec",
  "scale-info",
  "serde",
@@ -6432,14 +6611,12 @@ dependencies = [
  "sp-keystore",
  "sp-runtime",
  "sp-state-machine",
- "sp-std 8.0.0",
- "substrate-wasm-builder",
 ]
 
 [[package]]
 name = "pallet-im-online"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "37.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -6453,13 +6630,13 @@ dependencies = [
  "sp-io",
  "sp-runtime",
  "sp-staking",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-membership"
 version = "1.0.0"
 dependencies = [
+ "duniter-primitives",
  "frame-benchmarking",
  "frame-support",
  "frame-system",
@@ -6470,13 +6647,12 @@ dependencies = [
  "sp-io",
  "sp-membership",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-multisig"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -6486,7 +6662,6 @@ dependencies = [
  "scale-info",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
@@ -6502,7 +6677,6 @@ dependencies = [
  "sp-io",
  "sp-runtime",
  "sp-staking",
- "sp-std 8.0.0",
 ]
 
 [[package]]
@@ -6520,13 +6694,12 @@ dependencies = [
  "sp-core",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-preimage"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -6537,7 +6710,6 @@ dependencies = [
  "sp-core",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
@@ -6553,13 +6725,12 @@ dependencies = [
  "sp-core",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-proxy"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -6568,7 +6739,6 @@ dependencies = [
  "scale-info",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
@@ -6585,13 +6755,12 @@ dependencies = [
  "sp-core",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-scheduler"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "39.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "docify",
  "frame-benchmarking",
@@ -6602,14 +6771,13 @@ dependencies = [
  "scale-info",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
  "sp-weights",
 ]
 
 [[package]]
 name = "pallet-session"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -6624,7 +6792,6 @@ dependencies = [
  "sp-session",
  "sp-staking",
  "sp-state-machine",
- "sp-std 8.0.0",
  "sp-trie",
 ]
 
@@ -6636,14 +6803,15 @@ dependencies = [
  "frame-system",
  "pallet-session",
  "parity-scale-codec",
+ "scale-info",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-smith-members"
 version = "1.0.0"
 dependencies = [
+ "duniter-primitives",
  "frame-benchmarking",
  "frame-support",
  "frame-system",
@@ -6656,13 +6824,12 @@ dependencies = [
  "sp-io",
  "sp-runtime",
  "sp-staking",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-sudo"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "docify",
  "frame-benchmarking",
@@ -6672,13 +6839,12 @@ dependencies = [
  "scale-info",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-timestamp"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "37.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "docify",
  "frame-benchmarking",
@@ -6690,15 +6856,14 @@ dependencies = [
  "sp-inherents",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
- "sp-storage 13.0.0",
+ "sp-storage",
  "sp-timestamp",
 ]
 
 [[package]]
 name = "pallet-transaction-payment"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -6708,15 +6873,14 @@ dependencies = [
  "sp-core",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-transaction-payment-rpc"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "41.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "jsonrpsee 0.16.3",
+ "jsonrpsee 0.24.5",
  "pallet-transaction-payment-rpc-runtime-api",
  "parity-scale-codec",
  "sp-api",
@@ -6729,8 +6893,8 @@ dependencies = [
 
 [[package]]
 name = "pallet-transaction-payment-rpc-runtime-api"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "pallet-transaction-payment",
  "parity-scale-codec",
@@ -6741,8 +6905,8 @@ dependencies = [
 
 [[package]]
 name = "pallet-treasury"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "37.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "docify",
  "frame-benchmarking",
@@ -6755,13 +6919,13 @@ dependencies = [
  "serde",
  "sp-core",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-universal-dividend"
 version = "1.0.0"
 dependencies = [
+ "duniter-primitives",
  "frame-benchmarking",
  "frame-support",
  "frame-system",
@@ -6774,7 +6938,6 @@ dependencies = [
  "sp-core",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
@@ -6790,13 +6953,12 @@ dependencies = [
  "sp-io",
  "sp-runtime",
  "sp-staking",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "pallet-utility"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -6806,7 +6968,19 @@ dependencies = [
  "sp-core",
  "sp-io",
  "sp-runtime",
- "sp-std 8.0.0",
+]
+
+[[package]]
+name = "parity-bip39"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e69bf016dc406eff7d53a7d3f7cf1c2e72c82b9088aac1118591e36dd2cd3e9"
+dependencies = [
+ "bitcoin_hashes 0.13.0",
+ "rand",
+ "rand_core",
+ "serde",
+ "unicode-normalization",
 ]
 
 [[package]]
@@ -6836,7 +7010,7 @@ version = "3.6.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee"
 dependencies = [
- "arrayvec 0.7.4",
+ "arrayvec 0.7.6",
  "bitvec",
  "byte-slice-cast",
  "bytes",
@@ -6851,18 +7025,12 @@ version = "3.6.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c"
 dependencies = [
- "proc-macro-crate 3.1.0",
+ "proc-macro-crate 3.2.0",
  "proc-macro2",
  "quote",
  "syn 1.0.109",
 ]
 
-[[package]]
-name = "parity-send-wrapper"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f"
-
 [[package]]
 name = "parity-wasm"
 version = "0.45.0"
@@ -6871,9 +7039,9 @@ checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304"
 
 [[package]]
 name = "parking"
-version = "2.2.0"
+version = "2.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae"
+checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
 
 [[package]]
 name = "parking_lot"
@@ -6918,9 +7086,9 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
 dependencies = [
  "cfg-if",
  "libc",
- "redox_syscall 0.5.2",
+ "redox_syscall 0.5.7",
  "smallvec",
- "windows-targets 0.52.5",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -6930,19 +7098,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7924d1d0ad836f665c9065e26d016c673ece3993f30d340068b16f282afc1156"
 
 [[package]]
-name = "paste"
-version = "1.0.15"
+name = "password-hash"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166"
+dependencies = [
+ "base64ct",
+ "rand_core",
+ "subtle 2.6.1",
+]
 
 [[package]]
-name = "pbkdf2"
-version = "0.8.0"
+name = "paste"
+version = "1.0.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa"
-dependencies = [
- "crypto-mac 0.11.0",
-]
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
 
 [[package]]
 name = "pbkdf2"
@@ -6951,14 +7121,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2"
 dependencies = [
  "digest 0.10.7",
+ "password-hash",
 ]
 
-[[package]]
-name = "peeking_take_while"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
-
 [[package]]
 name = "peg"
 version = "0.6.3"
@@ -7003,9 +7168,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
 
 [[package]]
 name = "pest"
-version = "2.7.10"
+version = "2.7.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8"
+checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9"
 dependencies = [
  "memchr",
  "thiserror",
@@ -7014,9 +7179,9 @@ dependencies = [
 
 [[package]]
 name = "pest_derive"
-version = "2.7.10"
+version = "2.7.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26293c9193fbca7b1a3bf9b79dc1e388e927e6cacaa78b4a3ab705a1d3d41459"
+checksum = "4d3a6e3394ec80feb3b6393c725571754c6188490265c61aaf260810d6b95aa0"
 dependencies = [
  "pest",
  "pest_generator",
@@ -7024,22 +7189,22 @@ dependencies = [
 
 [[package]]
 name = "pest_generator"
-version = "2.7.10"
+version = "2.7.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ec22af7d3fb470a85dd2ca96b7c577a1eb4ef6f1683a9fe9a8c16e136c04687"
+checksum = "94429506bde1ca69d1b5601962c73f4172ab4726571a59ea95931218cb0e930e"
 dependencies = [
  "pest",
  "pest_meta",
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "pest_meta"
-version = "2.7.10"
+version = "2.7.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7a240022f37c361ec1878d646fc5b7d7c4d28d5946e1a80ad5a7a4f4ca0bdcd"
+checksum = "ac8a071862e93690b6e34e9a5fb8e33ff3734473ac0245b27232222c4906a33f"
 dependencies = [
  "once_cell",
  "pest",
@@ -7053,7 +7218,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
 dependencies = [
  "fixedbitset",
- "indexmap 2.2.6",
+ "indexmap 2.5.0",
 ]
 
 [[package]]
@@ -7073,15 +7238,9 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
-[[package]]
-name = "pin-project-lite"
-version = "0.1.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777"
-
 [[package]]
 name = "pin-project-lite"
 version = "0.2.14"
@@ -7096,9 +7255,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
 
 [[package]]
 name = "piper"
-version = "0.2.3"
+version = "0.2.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391"
+checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066"
 dependencies = [
  "atomic-waker",
  "fastrand",
@@ -7117,9 +7276,9 @@ dependencies = [
 
 [[package]]
 name = "pkg-config"
-version = "0.3.30"
+version = "0.3.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
+checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
 
 [[package]]
 name = "placeholder"
@@ -7131,11 +7290,36 @@ dependencies = [
  "regex",
 ]
 
+[[package]]
+name = "polkavm"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a3693e5efdb2bf74e449cd25fd777a28bd7ed87e41f5d5da75eb31b4de48b94"
+dependencies = [
+ "libc",
+ "log",
+ "polkavm-assembler",
+ "polkavm-common",
+ "polkavm-linux-raw",
+]
+
+[[package]]
+name = "polkavm-assembler"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fa96d6d868243acc12de813dd48e756cbadcc8e13964c70d272753266deadc1"
+dependencies = [
+ "log",
+]
+
 [[package]]
 name = "polkavm-common"
 version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1d9428a5cfcc85c5d7b9fc4b6a18c4b802d0173d768182a51cc7751640f08b92"
+dependencies = [
+ "log",
+]
 
 [[package]]
 name = "polkavm-derive"
@@ -7155,7 +7339,7 @@ dependencies = [
  "polkavm-common",
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -7165,22 +7349,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8ba81f7b5faac81e528eb6158a6f3c9e0bb1008e0ffa19653bc8dea925ecb429"
 dependencies = [
  "polkavm-derive-impl",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
+[[package]]
+name = "polkavm-linker"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c7be503e60cf56c0eb785f90aaba4b583b36bff00e93997d93fef97f9553c39"
+dependencies = [
+ "gimli 0.28.1",
+ "hashbrown 0.14.5",
+ "log",
+ "object 0.32.2",
+ "polkavm-common",
+ "regalloc2 0.9.3",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "polkavm-linux-raw"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26e85d3456948e650dff0cfc85603915847faf893ed1e66b020bb82ef4557120"
+
 [[package]]
 name = "polling"
-version = "3.7.2"
+version = "3.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b"
+checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511"
 dependencies = [
  "cfg-if",
  "concurrent-queue",
  "hermit-abi 0.4.0",
- "pin-project-lite 0.2.14",
- "rustix 0.38.34",
+ "pin-project-lite",
+ "rustix 0.38.37",
  "tracing",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -7208,9 +7413,9 @@ dependencies = [
 
 [[package]]
 name = "portable-atomic"
-version = "1.6.0"
+version = "1.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0"
+checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2"
 
 [[package]]
 name = "portpicker"
@@ -7229,9 +7434,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
 
 [[package]]
 name = "ppv-lite86"
-version = "0.2.17"
+version = "0.2.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
+dependencies = [
+ "zerocopy",
+]
 
 [[package]]
 name = "predicates"
@@ -7247,17 +7455,27 @@ dependencies = [
  "regex",
 ]
 
+[[package]]
+name = "predicates"
+version = "3.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e9086cc7640c29a356d1a29fd134380bee9d8f79a17410aa76e7ad295f42c97"
+dependencies = [
+ "anstyle",
+ "predicates-core",
+]
+
 [[package]]
 name = "predicates-core"
-version = "1.0.6"
+version = "1.0.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174"
+checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931"
 
 [[package]]
 name = "predicates-tree"
-version = "1.0.9"
+version = "1.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf"
+checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13"
 dependencies = [
  "predicates-core",
  "termtree",
@@ -7275,12 +7493,12 @@ dependencies = [
 
 [[package]]
 name = "prettyplease"
-version = "0.2.20"
+version = "0.2.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e"
+checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba"
 dependencies = [
  "proc-macro2",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -7308,11 +7526,11 @@ dependencies = [
 
 [[package]]
 name = "proc-macro-crate"
-version = "3.1.0"
+version = "3.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284"
+checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b"
 dependencies = [
- "toml_edit 0.21.1",
+ "toml_edit",
 ]
 
 [[package]]
@@ -7339,6 +7557,17 @@ dependencies = [
  "version_check",
 ]
 
+[[package]]
+name = "proc-macro-warning"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d1eaa7fa0aa1929ffdf7eeb6eac234dde6268914a14ad44d23521ab6a9b258e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
+]
+
 [[package]]
 name = "proc-macro-warning"
 version = "1.0.2"
@@ -7347,14 +7576,14 @@ checksum = "834da187cfe638ae8abb0203f0b33e5ccdb02a28e7199f2f47b3e2754f50edca"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.85"
+version = "1.0.86"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23"
+checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
 dependencies = [
  "unicode-ident",
 ]
@@ -7375,9 +7604,9 @@ dependencies = [
 
 [[package]]
 name = "prometheus-client"
-version = "0.19.0"
+version = "0.21.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d6fa99d535dd930d1249e6c79cb3c2915f9172a540fe2b02a4c8f9ca954721e"
+checksum = "3c99afa9a01501019ac3a14d71d9f94050346f55ca471ce90c799a15c58f61e2"
 dependencies = [
  "dtoa",
  "itoa",
@@ -7393,7 +7622,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -7403,7 +7632,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd"
 dependencies = [
  "bytes",
- "prost-derive",
+ "prost-derive 0.11.9",
+]
+
+[[package]]
+name = "prost"
+version = "0.12.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29"
+dependencies = [
+ "bytes",
+ "prost-derive 0.12.6",
 ]
 
 [[package]]
@@ -7417,17 +7656,38 @@ dependencies = [
  "itertools 0.10.5",
  "lazy_static",
  "log",
- "multimap",
+ "multimap 0.8.3",
  "petgraph",
  "prettyplease 0.1.25",
- "prost",
- "prost-types",
+ "prost 0.11.9",
+ "prost-types 0.11.9",
  "regex",
  "syn 1.0.109",
  "tempfile",
  "which",
 ]
 
+[[package]]
+name = "prost-build"
+version = "0.12.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4"
+dependencies = [
+ "bytes",
+ "heck 0.5.0",
+ "itertools 0.12.1",
+ "log",
+ "multimap 0.10.0",
+ "once_cell",
+ "petgraph",
+ "prettyplease 0.2.22",
+ "prost 0.12.6",
+ "prost-types 0.12.6",
+ "regex",
+ "syn 2.0.79",
+ "tempfile",
+]
+
 [[package]]
 name = "prost-derive"
 version = "0.11.9"
@@ -7441,24 +7701,61 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "prost-derive"
+version = "0.12.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1"
+dependencies = [
+ "anyhow",
+ "itertools 0.12.1",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
+]
+
 [[package]]
 name = "prost-types"
 version = "0.11.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13"
 dependencies = [
- "prost",
+ "prost 0.11.9",
+]
+
+[[package]]
+name = "prost-types"
+version = "0.12.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0"
+dependencies = [
+ "prost 0.12.6",
 ]
 
 [[package]]
 name = "psm"
-version = "0.1.21"
+version = "0.1.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874"
+checksum = "aa37f80ca58604976033fae9515a8a2989fc13797d953f7c04fb8fa36a11f205"
 dependencies = [
  "cc",
 ]
 
+[[package]]
+name = "quanta"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5"
+dependencies = [
+ "crossbeam-utils",
+ "libc",
+ "once_cell",
+ "raw-cpuid",
+ "wasi",
+ "web-sys",
+ "winapi",
+]
+
 [[package]]
 name = "quick-error"
 version = "1.2.3"
@@ -7476,26 +7773,69 @@ dependencies = [
 
 [[package]]
 name = "quick-protobuf-codec"
-version = "0.1.0"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1693116345026436eb2f10b677806169c1a1260c1c60eaaffe3fb5a29ae23d8b"
+checksum = "f8ededb1cd78531627244d51dd0c7139fbe736c7d57af0092a76f0ffb2f56e98"
 dependencies = [
  "asynchronous-codec",
  "bytes",
  "quick-protobuf",
  "thiserror",
- "unsigned-varint",
+ "unsigned-varint 0.7.2",
 ]
 
 [[package]]
-name = "quicksink"
-version = "0.1.2"
+name = "quinn"
+version = "0.9.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77de3c815e5a160b1539c6592796801df2043ae35e123b46d73380cfa57af858"
+checksum = "2e8b432585672228923edbbf64b8b12c14e1112f62e88737655b4a083dbcd78e"
 dependencies = [
- "futures-core",
- "futures-sink",
- "pin-project-lite 0.1.12",
+ "bytes",
+ "pin-project-lite",
+ "quinn-proto 0.9.6",
+ "quinn-udp 0.3.2",
+ "rustc-hash 1.1.0",
+ "rustls 0.20.9",
+ "thiserror",
+ "tokio",
+ "tracing",
+ "webpki",
+]
+
+[[package]]
+name = "quinn"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75"
+dependencies = [
+ "bytes",
+ "futures-io",
+ "pin-project-lite",
+ "quinn-proto 0.10.6",
+ "quinn-udp 0.4.1",
+ "rustc-hash 1.1.0",
+ "rustls 0.21.12",
+ "thiserror",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "quinn"
+version = "0.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684"
+dependencies = [
+ "bytes",
+ "pin-project-lite",
+ "quinn-proto 0.11.8",
+ "quinn-udp 0.5.5",
+ "rustc-hash 2.0.0",
+ "rustls 0.23.13",
+ "socket2 0.5.7",
+ "thiserror",
+ "tokio",
+ "tracing",
 ]
 
 [[package]]
@@ -7507,7 +7847,7 @@ dependencies = [
  "bytes",
  "rand",
  "ring 0.16.20",
- "rustc-hash",
+ "rustc-hash 1.1.0",
  "rustls 0.20.9",
  "slab",
  "thiserror",
@@ -7516,11 +7856,84 @@ dependencies = [
  "webpki",
 ]
 
+[[package]]
+name = "quinn-proto"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a"
+dependencies = [
+ "bytes",
+ "rand",
+ "ring 0.16.20",
+ "rustc-hash 1.1.0",
+ "rustls 0.21.12",
+ "slab",
+ "thiserror",
+ "tinyvec",
+ "tracing",
+]
+
+[[package]]
+name = "quinn-proto"
+version = "0.11.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6"
+dependencies = [
+ "bytes",
+ "rand",
+ "ring 0.17.8",
+ "rustc-hash 2.0.0",
+ "rustls 0.23.13",
+ "slab",
+ "thiserror",
+ "tinyvec",
+ "tracing",
+]
+
+[[package]]
+name = "quinn-udp"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "641538578b21f5e5c8ea733b736895576d0fe329bb883b937db6f4d163dbaaf4"
+dependencies = [
+ "libc",
+ "quinn-proto 0.9.6",
+ "socket2 0.4.10",
+ "tracing",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "quinn-udp"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7"
+dependencies = [
+ "bytes",
+ "libc",
+ "socket2 0.5.7",
+ "tracing",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "quinn-udp"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b"
+dependencies = [
+ "libc",
+ "once_cell",
+ "socket2 0.5.7",
+ "tracing",
+ "windows-sys 0.59.0",
+]
+
 [[package]]
 name = "quote"
-version = "1.0.36"
+version = "1.0.37"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
+checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
 dependencies = [
  "proc-macro2",
 ]
@@ -7539,7 +7952,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
 dependencies = [
  "libc",
  "rand_chacha",
- "rand_core 0.6.4",
+ "rand_core",
 ]
 
 [[package]]
@@ -7549,16 +7962,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
 dependencies = [
  "ppv-lite86",
- "rand_core 0.6.4",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
-dependencies = [
- "getrandom 0.1.16",
+ "rand_core",
 ]
 
 [[package]]
@@ -7567,7 +7971,7 @@ version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
 dependencies = [
- "getrandom 0.2.15",
+ "getrandom",
 ]
 
 [[package]]
@@ -7586,7 +7990,16 @@ version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e"
 dependencies = [
- "rand_core 0.6.4",
+ "rand_core",
+]
+
+[[package]]
+name = "raw-cpuid"
+version = "11.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb9ee317cfe3fbd54b36a511efc1edd42e216903c9cd575e686dd68a2ba90d8d"
+dependencies = [
+ "bitflags 2.6.0",
 ]
 
 [[package]]
@@ -7628,39 +8041,46 @@ dependencies = [
 ]
 
 [[package]]
-name = "redox_syscall"
-version = "0.2.16"
+name = "reconnecting-jsonrpsee-ws-client"
+version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+checksum = "06fa4f17e09edfc3131636082faaec633c7baa269396b4004040bc6c52f49f65"
 dependencies = [
- "bitflags 1.3.2",
+ "cfg_aliases 0.2.1",
+ "finito",
+ "futures 0.3.30",
+ "jsonrpsee 0.23.2",
+ "serde_json",
+ "thiserror",
+ "tokio",
+ "tracing",
 ]
 
 [[package]]
 name = "redox_syscall"
-version = "0.4.1"
+version = "0.2.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
 dependencies = [
  "bitflags 1.3.2",
 ]
 
 [[package]]
 name = "redox_syscall"
-version = "0.5.2"
+version = "0.5.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd"
+checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f"
 dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
 ]
 
 [[package]]
 name = "redox_users"
-version = "0.4.5"
+version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891"
+checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43"
 dependencies = [
- "getrandom 0.2.15",
+ "getrandom",
  "libredox",
  "thiserror",
 ]
@@ -7682,7 +8102,7 @@ checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -7697,16 +8117,29 @@ dependencies = [
  "smallvec",
 ]
 
+[[package]]
+name = "regalloc2"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad156d539c879b7a24a363a2016d77961786e71f48f2e2fc8302a92abd2429a6"
+dependencies = [
+ "hashbrown 0.13.2",
+ "log",
+ "rustc-hash 1.1.0",
+ "slice-group-by",
+ "smallvec",
+]
+
 [[package]]
 name = "regex"
-version = "1.10.5"
+version = "1.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f"
+checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8"
 dependencies = [
  "aho-corasick",
  "memchr",
- "regex-automata 0.4.7",
- "regex-syntax 0.8.4",
+ "regex-automata 0.4.8",
+ "regex-syntax 0.8.5",
 ]
 
 [[package]]
@@ -7720,13 +8153,13 @@ dependencies = [
 
 [[package]]
 name = "regex-automata"
-version = "0.4.7"
+version = "0.4.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
+checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3"
 dependencies = [
  "aho-corasick",
  "memchr",
- "regex-syntax 0.8.4",
+ "regex-syntax 0.8.5",
 ]
 
 [[package]]
@@ -7743,49 +8176,50 @@ checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
 
 [[package]]
 name = "regex-syntax"
-version = "0.8.4"
+version = "0.8.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
+checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
 
 [[package]]
 name = "reqwest"
-version = "0.11.27"
+version = "0.12.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62"
+checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63"
 dependencies = [
- "base64 0.21.7",
+ "base64 0.22.1",
  "bytes",
- "encoding_rs",
  "futures-core",
  "futures-util",
- "h2",
- "http",
- "http-body",
- "hyper",
- "hyper-rustls",
+ "http 1.1.0",
+ "http-body 1.0.1",
+ "http-body-util",
+ "hyper 1.4.1",
+ "hyper-rustls 0.27.3",
+ "hyper-util",
  "ipnet",
  "js-sys",
  "log",
  "mime",
  "once_cell",
  "percent-encoding",
- "pin-project-lite 0.2.14",
- "rustls 0.21.12",
- "rustls-pemfile 1.0.4",
+ "pin-project-lite",
+ "quinn 0.11.5",
+ "rustls 0.23.13",
+ "rustls-pemfile 2.1.3",
+ "rustls-pki-types",
  "serde",
  "serde_json",
  "serde_urlencoded",
  "sync_wrapper",
- "system-configuration",
  "tokio",
- "tokio-rustls 0.24.1",
+ "tokio-rustls 0.26.0",
  "tower-service",
  "url",
  "wasm-bindgen",
  "wasm-bindgen-futures",
  "web-sys",
- "webpki-roots 0.25.4",
- "winreg",
+ "webpki-roots 0.26.6",
+ "windows-registry",
 ]
 
 [[package]]
@@ -7805,23 +8239,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2"
 dependencies = [
  "hmac 0.12.1",
- "subtle 2.5.0",
-]
-
-[[package]]
-name = "ring"
-version = "0.1.0"
-source = "git+https://github.com/w3f/ring-proof#b273d33f9981e2bb3375ab45faeb537f7ee35224"
-dependencies = [
- "ark-ec",
- "ark-ff",
- "ark-poly",
- "ark-serialize",
- "ark-std",
- "blake2 0.10.6",
- "common",
- "fflonk",
- "merlin",
+ "subtle 2.6.1",
 ]
 
 [[package]]
@@ -7847,7 +8265,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
 dependencies = [
  "cc",
  "cfg-if",
- "getrandom 0.2.15",
+ "getrandom",
  "libc",
  "spin 0.9.8",
  "untrusted 0.9.0",
@@ -7855,14 +8273,10 @@ dependencies = [
 ]
 
 [[package]]
-name = "rocksdb"
-version = "0.21.0"
+name = "route-recognizer"
+version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb6f170a4041d50a0ce04b0d2e14916d6ca863ea2e422689a5b694395d299ffe"
-dependencies = [
- "libc",
- "librocksdb-sys",
-]
+checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746"
 
 [[package]]
 name = "rpassword"
@@ -7912,6 +8326,12 @@ version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
 
+[[package]]
+name = "rustc-hash"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152"
+
 [[package]]
 name = "rustc-hex"
 version = "2.1.0"
@@ -7920,9 +8340,9 @@ checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6"
 
 [[package]]
 name = "rustc_version"
-version = "0.4.0"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
 dependencies = [
  "semver 1.0.23",
 ]
@@ -7952,11 +8372,11 @@ dependencies = [
 
 [[package]]
 name = "rustix"
-version = "0.38.34"
+version = "0.38.37"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
+checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811"
 dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
  "errno",
  "libc",
  "linux-raw-sys 0.4.14",
@@ -7969,7 +8389,6 @@ version = "0.20.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99"
 dependencies = [
- "log",
  "ring 0.16.20",
  "sct",
  "webpki",
@@ -7979,25 +8398,40 @@ dependencies = [
 name = "rustls"
 version = "0.21.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e"
+checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e"
+dependencies = [
+ "log",
+ "ring 0.17.8",
+ "rustls-webpki 0.101.7",
+ "sct",
+]
+
+[[package]]
+name = "rustls"
+version = "0.22.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432"
 dependencies = [
  "log",
  "ring 0.17.8",
- "rustls-webpki 0.101.7",
- "sct",
+ "rustls-pki-types",
+ "rustls-webpki 0.102.8",
+ "subtle 2.6.1",
+ "zeroize",
 ]
 
 [[package]]
 name = "rustls"
-version = "0.22.4"
+version = "0.23.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432"
+checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8"
 dependencies = [
  "log",
+ "once_cell",
  "ring 0.17.8",
  "rustls-pki-types",
- "rustls-webpki 0.102.4",
- "subtle 2.5.0",
+ "rustls-webpki 0.102.8",
+ "subtle 2.6.1",
  "zeroize",
 ]
 
@@ -8015,12 +8449,12 @@ dependencies = [
 
 [[package]]
 name = "rustls-native-certs"
-version = "0.7.0"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792"
+checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5"
 dependencies = [
  "openssl-probe",
- "rustls-pemfile 2.1.2",
+ "rustls-pemfile 2.1.3",
  "rustls-pki-types",
  "schannel",
  "security-framework",
@@ -8037,9 +8471,9 @@ dependencies = [
 
 [[package]]
 name = "rustls-pemfile"
-version = "2.1.2"
+version = "2.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d"
+checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425"
 dependencies = [
  "base64 0.22.1",
  "rustls-pki-types",
@@ -8047,9 +8481,36 @@ dependencies = [
 
 [[package]]
 name = "rustls-pki-types"
-version = "1.7.0"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55"
+
+[[package]]
+name = "rustls-platform-verifier"
+version = "0.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d"
+checksum = "afbb878bdfdf63a336a5e63561b1835e7a8c91524f51621db870169eac84b490"
+dependencies = [
+ "core-foundation",
+ "core-foundation-sys",
+ "jni",
+ "log",
+ "once_cell",
+ "rustls 0.23.13",
+ "rustls-native-certs 0.7.3",
+ "rustls-platform-verifier-android",
+ "rustls-webpki 0.102.8",
+ "security-framework",
+ "security-framework-sys",
+ "webpki-roots 0.26.6",
+ "winapi",
+]
+
+[[package]]
+name = "rustls-platform-verifier-android"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f"
 
 [[package]]
 name = "rustls-webpki"
@@ -8063,9 +8524,9 @@ dependencies = [
 
 [[package]]
 name = "rustls-webpki"
-version = "0.102.4"
+version = "0.102.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e"
+checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9"
 dependencies = [
  "ring 0.17.8",
  "rustls-pki-types",
@@ -8091,9 +8552,9 @@ dependencies = [
 
 [[package]]
 name = "rw-stream-sink"
-version = "0.3.0"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26338f5e09bb721b85b135ea05af7767c90b52f6de4f087d4f4a3a9d64e7dc04"
+checksum = "d8c9026ff5d2f23da5e45bbc283f156383001bfb09c4e44256d02c1a685fe9a1"
 dependencies = [
  "futures 0.3.30",
  "pin-project",
@@ -8126,19 +8587,19 @@ dependencies = [
 
 [[package]]
 name = "sc-allocator"
-version = "4.1.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "29.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "log",
  "sp-core",
- "sp-wasm-interface 14.0.0",
+ "sp-wasm-interface",
  "thiserror",
 ]
 
 [[package]]
 name = "sc-basic-authorship"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.45.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "futures 0.3.30",
  "futures-timer",
@@ -8159,8 +8620,8 @@ dependencies = [
 
 [[package]]
 name = "sc-block-builder"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.42.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "parity-scale-codec",
  "sp-api",
@@ -8174,13 +8635,13 @@ dependencies = [
 
 [[package]]
 name = "sc-chain-spec"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "array-bytes 6.2.3",
+ "array-bytes",
  "docify",
  "log",
- "memmap2 0.5.10",
+ "memmap2 0.9.5",
  "parity-scale-codec",
  "sc-chain-spec-derive",
  "sc-client-api",
@@ -8191,38 +8652,40 @@ dependencies = [
  "serde_json",
  "sp-blockchain",
  "sp-core",
+ "sp-crypto-hashing",
  "sp-genesis-builder",
  "sp-io",
  "sp-runtime",
  "sp-state-machine",
+ "sp-tracing",
 ]
 
 [[package]]
 name = "sc-chain-spec-derive"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "12.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "proc-macro-crate 3.1.0",
+ "proc-macro-crate 3.2.0",
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "sc-cli"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.47.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "array-bytes 6.2.3",
- "bip39",
+ "array-bytes",
  "chrono",
  "clap",
  "fdlimit",
  "futures 0.3.30",
- "itertools 0.10.5",
+ "itertools 0.11.0",
  "libp2p-identity",
  "log",
  "names",
+ "parity-bip39",
  "parity-scale-codec",
  "rand",
  "regex",
@@ -8251,8 +8714,8 @@ dependencies = [
 
 [[package]]
 name = "sc-client-api"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "37.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "fnv",
  "futures 0.3.30",
@@ -8267,24 +8730,23 @@ dependencies = [
  "sp-consensus",
  "sp-core",
  "sp-database",
- "sp-externalities 0.19.0",
+ "sp-externalities",
  "sp-runtime",
  "sp-state-machine",
  "sp-statement-store",
- "sp-storage 13.0.0",
+ "sp-storage",
  "sp-trie",
  "substrate-prometheus-endpoint",
 ]
 
 [[package]]
 name = "sc-client-db"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.44.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "hash-db",
  "kvdb",
  "kvdb-memorydb",
- "kvdb-rocksdb",
  "linked-hash-map",
  "log",
  "parity-db",
@@ -8304,17 +8766,16 @@ dependencies = [
 
 [[package]]
 name = "sc-consensus"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.44.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "async-trait",
  "futures 0.3.30",
- "futures-timer",
- "libp2p-identity",
  "log",
- "mockall",
+ "mockall 0.11.4",
  "parking_lot 0.12.3",
  "sc-client-api",
+ "sc-network-types",
  "sc-utils",
  "serde",
  "sp-api",
@@ -8329,8 +8790,8 @@ dependencies = [
 
 [[package]]
 name = "sc-consensus-aura"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.45.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "async-trait",
  "futures 0.3.30",
@@ -8358,8 +8819,8 @@ dependencies = [
 
 [[package]]
 name = "sc-consensus-babe"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.45.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "async-trait",
  "fork-tree",
@@ -8384,6 +8845,7 @@ dependencies = [
  "sp-consensus-babe",
  "sp-consensus-slots",
  "sp-core",
+ "sp-crypto-hashing",
  "sp-inherents",
  "sp-keystore",
  "sp-runtime",
@@ -8393,11 +8855,11 @@ dependencies = [
 
 [[package]]
 name = "sc-consensus-babe-rpc"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.45.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "futures 0.3.30",
- "jsonrpsee 0.16.3",
+ "jsonrpsee 0.24.5",
  "sc-consensus-babe",
  "sc-consensus-epochs",
  "sc-rpc-api",
@@ -8415,8 +8877,8 @@ dependencies = [
 
 [[package]]
 name = "sc-consensus-epochs"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.44.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "fork-tree",
  "parity-scale-codec",
@@ -8428,11 +8890,11 @@ dependencies = [
 
 [[package]]
 name = "sc-consensus-grandpa"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.30.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "ahash 0.8.11",
- "array-bytes 6.2.3",
+ "ahash",
+ "array-bytes",
  "async-trait",
  "dyn-clone",
  "finality-grandpa",
@@ -8451,6 +8913,7 @@ dependencies = [
  "sc-network-common",
  "sc-network-gossip",
  "sc-network-sync",
+ "sc-network-types",
  "sc-telemetry",
  "sc-transaction-pool-api",
  "sc-utils",
@@ -8462,22 +8925,43 @@ dependencies = [
  "sp-consensus",
  "sp-consensus-grandpa",
  "sp-core",
+ "sp-crypto-hashing",
  "sp-keystore",
  "sp-runtime",
  "substrate-prometheus-endpoint",
  "thiserror",
 ]
 
+[[package]]
+name = "sc-consensus-grandpa-rpc"
+version = "0.30.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
+dependencies = [
+ "finality-grandpa",
+ "futures 0.3.30",
+ "jsonrpsee 0.24.5",
+ "log",
+ "parity-scale-codec",
+ "sc-client-api",
+ "sc-consensus-grandpa",
+ "sc-rpc",
+ "serde",
+ "sp-blockchain",
+ "sp-core",
+ "sp-runtime",
+ "thiserror",
+]
+
 [[package]]
 name = "sc-consensus-manual-seal"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.46.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "assert_matches",
  "async-trait",
  "futures 0.3.30",
  "futures-timer",
- "jsonrpsee 0.16.3",
+ "jsonrpsee 0.24.5",
  "log",
  "parity-scale-codec",
  "sc-client-api",
@@ -8505,8 +8989,8 @@ dependencies = [
 
 [[package]]
 name = "sc-consensus-slots"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.44.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "async-trait",
  "futures 0.3.30",
@@ -8528,42 +9012,55 @@ dependencies = [
 
 [[package]]
 name = "sc-executor"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.40.1"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "parity-scale-codec",
  "parking_lot 0.12.3",
  "sc-executor-common",
+ "sc-executor-polkavm",
  "sc-executor-wasmtime",
  "schnellru",
  "sp-api",
  "sp-core",
- "sp-externalities 0.19.0",
+ "sp-externalities",
  "sp-io",
  "sp-panic-handler",
- "sp-runtime-interface 17.0.0",
+ "sp-runtime-interface",
  "sp-trie",
  "sp-version",
- "sp-wasm-interface 14.0.0",
+ "sp-wasm-interface",
  "tracing",
 ]
 
 [[package]]
 name = "sc-executor-common"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.35.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
+ "polkavm",
  "sc-allocator",
  "sp-maybe-compressed-blob",
- "sp-wasm-interface 14.0.0",
+ "sp-wasm-interface",
  "thiserror",
  "wasm-instrument",
 ]
 
+[[package]]
+name = "sc-executor-polkavm"
+version = "0.32.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
+dependencies = [
+ "log",
+ "polkavm",
+ "sc-executor-common",
+ "sp-wasm-interface",
+]
+
 [[package]]
 name = "sc-executor-wasmtime"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.35.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "anyhow",
  "cfg-if",
@@ -8573,17 +9070,17 @@ dependencies = [
  "rustix 0.36.17",
  "sc-allocator",
  "sc-executor-common",
- "sp-runtime-interface 17.0.0",
- "sp-wasm-interface 14.0.0",
+ "sp-runtime-interface",
+ "sp-wasm-interface",
  "wasmtime",
 ]
 
 [[package]]
 name = "sc-informant"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.44.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "ansi_term",
+ "console",
  "futures 0.3.30",
  "futures-timer",
  "log",
@@ -8597,10 +9094,10 @@ dependencies = [
 
 [[package]]
 name = "sc-keystore"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "33.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "array-bytes 6.2.3",
+ "array-bytes",
  "parking_lot 0.12.3",
  "serde_json",
  "sp-application-crypto",
@@ -8611,23 +9108,23 @@ dependencies = [
 
 [[package]]
 name = "sc-mixnet"
-version = "0.1.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.15.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "array-bytes 4.2.0",
- "arrayvec 0.7.4",
+ "array-bytes",
+ "arrayvec 0.7.6",
  "blake2 0.10.6",
  "bytes",
  "futures 0.3.30",
  "futures-timer",
- "libp2p-identity",
  "log",
  "mixnet",
- "multiaddr",
+ "multiaddr 0.18.2",
  "parity-scale-codec",
  "parking_lot 0.12.3",
  "sc-client-api",
  "sc-network",
+ "sc-network-types",
  "sc-transaction-pool-api",
  "sp-api",
  "sp-consensus",
@@ -8640,14 +9137,15 @@ dependencies = [
 
 [[package]]
 name = "sc-network"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.45.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "array-bytes 6.2.3",
+ "array-bytes",
  "async-channel 1.9.0",
  "async-trait",
  "asynchronous-codec",
  "bytes",
+ "cid 0.9.0",
  "either",
  "fnv",
  "futures 0.3.30",
@@ -8655,16 +9153,22 @@ dependencies = [
  "ip_network",
  "libp2p",
  "linked_hash_set",
+ "litep2p",
  "log",
- "mockall",
+ "mockall 0.11.4",
+ "once_cell",
  "parity-scale-codec",
  "parking_lot 0.12.3",
  "partial_sort",
  "pin-project",
+ "prost 0.12.6",
+ "prost-build 0.12.6",
  "rand",
  "sc-client-api",
  "sc-network-common",
+ "sc-network-types",
  "sc-utils",
+ "schnellru",
  "serde",
  "serde_json",
  "smallvec",
@@ -8676,43 +9180,25 @@ dependencies = [
  "thiserror",
  "tokio",
  "tokio-stream",
- "unsigned-varint",
+ "unsigned-varint 0.7.2",
+ "void",
  "wasm-timer",
  "zeroize",
 ]
 
-[[package]]
-name = "sc-network-bitswap"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
-dependencies = [
- "async-channel 1.9.0",
- "cid",
- "futures 0.3.30",
- "libp2p-identity",
- "log",
- "prost",
- "prost-build",
- "sc-client-api",
- "sc-network",
- "sp-blockchain",
- "sp-runtime",
- "thiserror",
- "unsigned-varint",
-]
-
 [[package]]
 name = "sc-network-common"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.44.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "async-trait",
  "bitflags 1.3.2",
  "futures 0.3.30",
  "libp2p-identity",
  "parity-scale-codec",
- "prost-build",
+ "prost-build 0.12.6",
  "sc-consensus",
+ "sc-network-types",
  "sp-consensus",
  "sp-consensus-grandpa",
  "sp-runtime",
@@ -8720,17 +9206,17 @@ dependencies = [
 
 [[package]]
 name = "sc-network-gossip"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.45.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "ahash 0.8.11",
+ "ahash",
  "futures 0.3.30",
  "futures-timer",
- "libp2p",
  "log",
  "sc-network",
  "sc-network-common",
  "sc-network-sync",
+ "sc-network-types",
  "schnellru",
  "sp-runtime",
  "substrate-prometheus-endpoint",
@@ -8739,19 +9225,19 @@ dependencies = [
 
 [[package]]
 name = "sc-network-light"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.44.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "array-bytes 6.2.3",
+ "array-bytes",
  "async-channel 1.9.0",
  "futures 0.3.30",
- "libp2p-identity",
  "log",
  "parity-scale-codec",
- "prost",
- "prost-build",
+ "prost 0.12.6",
+ "prost-build 0.12.6",
  "sc-client-api",
  "sc-network",
+ "sc-network-types",
  "sp-blockchain",
  "sp-core",
  "sp-runtime",
@@ -8760,10 +9246,10 @@ dependencies = [
 
 [[package]]
 name = "sc-network-sync"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.44.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "array-bytes 6.2.3",
+ "array-bytes",
  "async-channel 1.9.0",
  "async-trait",
  "fork-tree",
@@ -8771,14 +9257,15 @@ dependencies = [
  "futures-timer",
  "libp2p",
  "log",
- "mockall",
+ "mockall 0.11.4",
  "parity-scale-codec",
- "prost",
- "prost-build",
+ "prost 0.12.6",
+ "prost-build 0.12.6",
  "sc-client-api",
  "sc-consensus",
  "sc-network",
  "sc-network-common",
+ "sc-network-types",
  "sc-utils",
  "schnellru",
  "smallvec",
@@ -8796,36 +9283,52 @@ dependencies = [
 
 [[package]]
 name = "sc-network-transactions"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.44.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "array-bytes 6.2.3",
+ "array-bytes",
  "futures 0.3.30",
- "libp2p",
  "log",
  "parity-scale-codec",
  "sc-network",
  "sc-network-common",
  "sc-network-sync",
+ "sc-network-types",
  "sc-utils",
  "sp-consensus",
  "sp-runtime",
  "substrate-prometheus-endpoint",
 ]
 
+[[package]]
+name = "sc-network-types"
+version = "0.12.1"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
+dependencies = [
+ "bs58 0.5.1",
+ "ed25519-dalek",
+ "libp2p-identity",
+ "litep2p",
+ "log",
+ "multiaddr 0.18.2",
+ "multihash 0.19.1",
+ "rand",
+ "thiserror",
+ "zeroize",
+]
+
 [[package]]
 name = "sc-offchain"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "40.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "array-bytes 6.2.3",
+ "array-bytes",
  "bytes",
  "fnv",
  "futures 0.3.30",
  "futures-timer",
- "hyper",
- "hyper-rustls",
- "libp2p",
+ "hyper 0.14.30",
+ "hyper-rustls 0.24.2",
  "log",
  "num_cpus",
  "once_cell",
@@ -8835,11 +9338,12 @@ dependencies = [
  "sc-client-api",
  "sc-network",
  "sc-network-common",
+ "sc-network-types",
  "sc-transaction-pool-api",
  "sc-utils",
  "sp-api",
  "sp-core",
- "sp-externalities 0.19.0",
+ "sp-externalities",
  "sp-keystore",
  "sp-offchain",
  "sp-runtime",
@@ -8849,8 +9353,8 @@ dependencies = [
 
 [[package]]
 name = "sc-proposer-metrics"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.18.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "log",
  "substrate-prometheus-endpoint",
@@ -8858,11 +9362,11 @@ dependencies = [
 
 [[package]]
 name = "sc-rpc"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "40.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "futures 0.3.30",
- "jsonrpsee 0.16.3",
+ "jsonrpsee 0.24.5",
  "log",
  "parity-scale-codec",
  "parking_lot 0.12.3",
@@ -8890,10 +9394,10 @@ dependencies = [
 
 [[package]]
 name = "sc-rpc-api"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.44.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "jsonrpsee 0.16.3",
+ "jsonrpsee 0.24.5",
  "parity-scale-codec",
  "sc-chain-spec",
  "sc-mixnet",
@@ -8910,12 +9414,21 @@ dependencies = [
 
 [[package]]
 name = "sc-rpc-server"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "17.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "http",
- "jsonrpsee 0.16.3",
+ "dyn-clone",
+ "forwarded-header-value",
+ "futures 0.3.30",
+ "governor",
+ "http 1.1.0",
+ "http-body-util",
+ "hyper 1.4.1",
+ "ip_network",
+ "jsonrpsee 0.24.5",
  "log",
+ "sc-rpc-api",
+ "serde",
  "serde_json",
  "substrate-prometheus-endpoint",
  "tokio",
@@ -8925,21 +9438,24 @@ dependencies = [
 
 [[package]]
 name = "sc-rpc-spec-v2"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.45.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "array-bytes 6.2.3",
+ "array-bytes",
  "futures 0.3.30",
  "futures-util",
  "hex",
- "jsonrpsee 0.16.3",
+ "jsonrpsee 0.24.5",
  "log",
  "parity-scale-codec",
  "parking_lot 0.12.3",
+ "rand",
  "sc-chain-spec",
  "sc-client-api",
+ "sc-rpc",
  "sc-transaction-pool-api",
  "sc-utils",
+ "schnellru",
  "serde",
  "sp-api",
  "sp-blockchain",
@@ -8954,15 +9470,15 @@ dependencies = [
 
 [[package]]
 name = "sc-service"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.46.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "async-trait",
  "directories",
  "exit-future",
  "futures 0.3.30",
  "futures-timer",
- "jsonrpsee 0.16.3",
+ "jsonrpsee 0.24.5",
  "log",
  "parity-scale-codec",
  "parking_lot 0.12.3",
@@ -8976,11 +9492,11 @@ dependencies = [
  "sc-informant",
  "sc-keystore",
  "sc-network",
- "sc-network-bitswap",
  "sc-network-common",
  "sc-network-light",
  "sc-network-sync",
  "sc-network-transactions",
+ "sc-network-types",
  "sc-rpc",
  "sc-rpc-server",
  "sc-rpc-spec-v2",
@@ -8990,18 +9506,19 @@ dependencies = [
  "sc-transaction-pool",
  "sc-transaction-pool-api",
  "sc-utils",
+ "schnellru",
  "serde",
  "serde_json",
  "sp-api",
  "sp-blockchain",
  "sp-consensus",
  "sp-core",
- "sp-externalities 0.19.0",
+ "sp-externalities",
  "sp-keystore",
  "sp-runtime",
  "sp-session",
  "sp-state-machine",
- "sp-storage 13.0.0",
+ "sp-storage",
  "sp-transaction-pool",
  "sp-transaction-storage-proof",
  "sp-trie",
@@ -9017,8 +9534,8 @@ dependencies = [
 
 [[package]]
 name = "sc-state-db"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.36.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "log",
  "parity-scale-codec",
@@ -9028,8 +9545,8 @@ dependencies = [
 
 [[package]]
 name = "sc-sysinfo"
-version = "6.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "derive_more",
  "futures 0.3.30",
@@ -9042,14 +9559,15 @@ dependencies = [
  "serde",
  "serde_json",
  "sp-core",
+ "sp-crypto-hashing",
  "sp-io",
- "sp-std 8.0.0",
+ "sp-std",
 ]
 
 [[package]]
 name = "sc-telemetry"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "25.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "chrono",
  "futures 0.3.30",
@@ -9058,6 +9576,7 @@ dependencies = [
  "parking_lot 0.12.3",
  "pin-project",
  "rand",
+ "sc-network",
  "sc-utils",
  "serde",
  "serde_json",
@@ -9067,19 +9586,18 @@ dependencies = [
 
 [[package]]
 name = "sc-tracing"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "37.0.1"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "ansi_term",
  "chrono",
+ "console",
  "is-terminal",
  "lazy_static",
  "libc",
  "log",
  "parity-scale-codec",
  "parking_lot 0.12.3",
- "regex",
- "rustc-hash",
+ "rustc-hash 1.1.0",
  "sc-client-api",
  "sc-tracing-proc-macro",
  "serde",
@@ -9088,7 +9606,7 @@ dependencies = [
  "sp-core",
  "sp-rpc",
  "sp-runtime",
- "sp-tracing 10.0.0",
+ "sp-tracing",
  "thiserror",
  "tracing",
  "tracing-log 0.1.4",
@@ -9097,19 +9615,19 @@ dependencies = [
 
 [[package]]
 name = "sc-tracing-proc-macro"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "11.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "proc-macro-crate 3.1.0",
+ "proc-macro-crate 3.2.0",
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "sc-transaction-pool"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "37.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "async-trait",
  "futures 0.3.30",
@@ -9125,8 +9643,9 @@ dependencies = [
  "sp-api",
  "sp-blockchain",
  "sp-core",
+ "sp-crypto-hashing",
  "sp-runtime",
- "sp-tracing 10.0.0",
+ "sp-tracing",
  "sp-transaction-pool",
  "substrate-prometheus-endpoint",
  "thiserror",
@@ -9134,8 +9653,8 @@ dependencies = [
 
 [[package]]
 name = "sc-transaction-pool-api"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "37.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "async-trait",
  "futures 0.3.30",
@@ -9150,8 +9669,8 @@ dependencies = [
 
 [[package]]
 name = "sc-utils"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "17.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "async-channel 1.9.0",
  "futures 0.3.30",
@@ -9165,38 +9684,63 @@ dependencies = [
 
 [[package]]
 name = "scale-bits"
-version = "0.4.0"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "662d10dcd57b1c2a3c41c9cf68f71fb09747ada1ea932ad961aca7e2ca28315f"
+dependencies = [
+ "parity-scale-codec",
+ "scale-info",
+ "scale-type-resolver 0.1.1",
+ "serde",
+]
+
+[[package]]
+name = "scale-bits"
+version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "036575c29af9b6e4866ffb7fa055dbf623fe7a9cc159b33786de6013a6969d89"
+checksum = "e57b1e7f6b65ed1f04e79a85a57d755ad56d76fdf1e9bddcc9ae14f71fcdcf54"
 dependencies = [
  "parity-scale-codec",
  "scale-info",
+ "scale-type-resolver 0.2.0",
  "serde",
 ]
 
 [[package]]
 name = "scale-decode"
-version = "0.10.0"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "afc79ba56a1c742f5aeeed1f1801f3edf51f7e818f0a54582cac6f131364ea7b"
+dependencies = [
+ "derive_more",
+ "parity-scale-codec",
+ "scale-bits 0.5.0",
+ "scale-type-resolver 0.1.1",
+ "smallvec",
+]
+
+[[package]]
+name = "scale-decode"
+version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7caaf753f8ed1ab4752c6afb20174f03598c664724e0e32628e161c21000ff76"
+checksum = "e98f3262c250d90e700bb802eb704e1f841e03331c2eb815e46516c4edbf5b27"
 dependencies = [
  "derive_more",
  "parity-scale-codec",
  "primitive-types",
- "scale-bits",
+ "scale-bits 0.6.0",
  "scale-decode-derive",
- "scale-info",
+ "scale-type-resolver 0.2.0",
  "smallvec",
 ]
 
 [[package]]
 name = "scale-decode-derive"
-version = "0.10.0"
+version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3475108a1b62c7efd1b5c65974f30109a598b2f45f23c9ae030acb9686966db"
+checksum = "9bb22f574168103cdd3133b19281639ca65ad985e24612728f727339dcaf4021"
 dependencies = [
  "darling 0.14.4",
- "proc-macro-crate 1.1.3",
  "proc-macro2",
  "quote",
  "syn 1.0.109",
@@ -9204,24 +9748,37 @@ dependencies = [
 
 [[package]]
 name = "scale-encode"
-version = "0.5.0"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "628800925a33794fb5387781b883b5e14d130fece9af5a63613867b8de07c5c7"
+dependencies = [
+ "derive_more",
+ "parity-scale-codec",
+ "scale-bits 0.5.0",
+ "scale-type-resolver 0.1.1",
+ "smallvec",
+]
+
+[[package]]
+name = "scale-encode"
+version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d70cb4b29360105483fac1ed567ff95d65224a14dd275b6303ed0a654c78de5"
+checksum = "4ba0b9c48dc0eb20c60b083c29447c0c4617cb7c4a4c9fef72aa5c5bc539e15e"
 dependencies = [
  "derive_more",
  "parity-scale-codec",
  "primitive-types",
- "scale-bits",
+ "scale-bits 0.6.0",
  "scale-encode-derive",
- "scale-info",
+ "scale-type-resolver 0.2.0",
  "smallvec",
 ]
 
 [[package]]
 name = "scale-encode-derive"
-version = "0.5.0"
+version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "995491f110efdc6bea96d6a746140e32bfceb4ea47510750a5467295a4707a25"
+checksum = "82ab7e60e2d9c8d47105f44527b26f04418e5e624ffc034f6b4a86c0ba19c5bf"
 dependencies = [
  "darling 0.14.4",
  "proc-macro-crate 1.1.3",
@@ -9250,30 +9807,67 @@ version = "2.11.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62"
 dependencies = [
- "proc-macro-crate 3.1.0",
+ "proc-macro-crate 3.2.0",
  "proc-macro2",
  "quote",
  "syn 1.0.109",
 ]
 
 [[package]]
-name = "scale-typegen"
+name = "scale-type-resolver"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00860983481ac590ac87972062909bef0d6a658013b592ccc0f2feb272feab11"
+checksum = "10b800069bfd43374e0f96f653e0d46882a2cb16d6d961ac43bea80f26c76843"
+dependencies = [
+ "scale-info",
+ "smallvec",
+]
+
+[[package]]
+name = "scale-type-resolver"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0cded6518aa0bd6c1be2b88ac81bf7044992f0f154bfbabd5ad34f43512abcb"
+dependencies = [
+ "scale-info",
+ "smallvec",
+]
+
+[[package]]
+name = "scale-typegen"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "498d1aecf2ea61325d4511787c115791639c0fd21ef4f8e11e49dd09eff2bbac"
 dependencies = [
  "proc-macro2",
  "quote",
  "scale-info",
- "syn 2.0.66",
+ "syn 2.0.79",
  "thiserror",
 ]
 
 [[package]]
 name = "scale-value"
-version = "0.13.0"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c07ccfee963104335c971aaf8b7b0e749be8569116322df23f1f75c4ca9e4a28"
+dependencies = [
+ "derive_more",
+ "either",
+ "frame-metadata 15.1.0",
+ "parity-scale-codec",
+ "scale-bits 0.5.0",
+ "scale-decode 0.11.1",
+ "scale-encode 0.6.0",
+ "scale-info",
+ "scale-type-resolver 0.1.1",
+]
+
+[[package]]
+name = "scale-value"
+version = "0.16.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58223c7691bf0bd46b43c9aea6f0472d1067f378d574180232358d7c6e0a8089"
+checksum = "8cd6ab090d823e75cfdb258aad5fe92e13f2af7d04b43a55d607d25fcc38c811"
 dependencies = [
  "base58",
  "blake2 0.10.6",
@@ -9281,21 +9875,22 @@ dependencies = [
  "either",
  "frame-metadata 15.1.0",
  "parity-scale-codec",
- "scale-bits",
- "scale-decode",
- "scale-encode",
+ "scale-bits 0.6.0",
+ "scale-decode 0.13.1",
+ "scale-encode 0.7.1",
  "scale-info",
+ "scale-type-resolver 0.2.0",
  "serde",
  "yap",
 ]
 
 [[package]]
 name = "schannel"
-version = "0.1.23"
+version = "0.1.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"
+checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b"
 dependencies = [
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -9304,7 +9899,7 @@ version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c9a8ef13a93c54d20580de1e5c413e624e53121d42fc7e2c11d10ef7f8b02367"
 dependencies = [
- "ahash 0.8.11",
+ "ahash",
  "cfg-if",
  "hashbrown 0.13.2",
 ]
@@ -9317,14 +9912,14 @@ checksum = "8de18f6d8ba0aad7045f5feae07ec29899c1112584a38509a84ad7b04451eaa0"
 dependencies = [
  "aead",
  "arrayref",
- "arrayvec 0.7.4",
- "curve25519-dalek 4.1.3",
+ "arrayvec 0.7.6",
+ "curve25519-dalek",
  "getrandom_or_panic",
  "merlin",
- "rand_core 0.6.4",
+ "rand_core",
  "serde_bytes",
  "sha2 0.10.8",
- "subtle 2.5.0",
+ "subtle 2.6.1",
  "zeroize",
 ]
 
@@ -9350,6 +9945,21 @@ dependencies = [
  "untrusted 0.9.0",
 ]
 
+[[package]]
+name = "sctp-proto"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6220f78bb44c15f326b0596113305f6101097a18755d53727a575c97e09fb24"
+dependencies = [
+ "bytes",
+ "crc",
+ "fxhash",
+ "log",
+ "rand",
+ "slab",
+ "thiserror",
+]
+
 [[package]]
 name = "sealed"
 version = "0.5.0"
@@ -9359,7 +9969,7 @@ dependencies = [
  "heck 0.4.1",
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -9372,7 +9982,8 @@ dependencies = [
  "der",
  "generic-array 0.14.7",
  "pkcs8",
- "subtle 2.5.0",
+ "serdect",
+ "subtle 2.6.1",
  "zeroize",
 ]
 
@@ -9405,22 +10016,23 @@ dependencies = [
 
 [[package]]
 name = "security-framework"
-version = "2.11.0"
+version = "2.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0"
+checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
 dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
  "core-foundation",
  "core-foundation-sys",
  "libc",
+ "num-bigint",
  "security-framework-sys",
 ]
 
 [[package]]
 name = "security-framework-sys"
-version = "2.11.0"
+version = "2.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7"
+checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6"
 dependencies = [
  "core-foundation-sys",
  "libc",
@@ -9450,51 +10062,58 @@ version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
 
+[[package]]
+name = "send_wrapper"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73"
+
 [[package]]
 name = "serde"
-version = "1.0.203"
+version = "1.0.210"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
+checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_bytes"
-version = "0.11.14"
+version = "0.11.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734"
+checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.203"
+version = "1.0.210"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
+checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "serde_json"
-version = "1.0.117"
+version = "1.0.128"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3"
+checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8"
 dependencies = [
  "itoa",
+ "memchr",
  "ryu",
  "serde",
 ]
 
 [[package]]
 name = "serde_spanned"
-version = "0.6.6"
+version = "0.6.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0"
+checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
 dependencies = [
  "serde",
 ]
@@ -9517,13 +10136,23 @@ version = "0.9.34+deprecated"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
 dependencies = [
- "indexmap 2.2.6",
+ "indexmap 2.5.0",
  "itoa",
  "ryu",
  "serde",
  "unsafe-libyaml",
 ]
 
+[[package]]
+name = "serdect"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177"
+dependencies = [
+ "base16ct",
+ "serde",
+]
+
 [[package]]
 name = "sha-1"
 version = "0.9.8"
@@ -9537,6 +10166,38 @@ dependencies = [
  "opaque-debug 0.3.1",
 ]
 
+[[package]]
+name = "sha-1"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest 0.10.7",
+ "sha1-asm",
+]
+
+[[package]]
+name = "sha1"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest 0.10.7",
+]
+
+[[package]]
+name = "sha1-asm"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "286acebaf8b67c1130aedffad26f594eff0c1292389158135327d2e23aed582b"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "sha2"
 version = "0.9.9"
@@ -9602,7 +10263,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
 dependencies = [
  "digest 0.10.7",
- "rand_core 0.6.4",
+ "rand_core",
 ]
 
 [[package]]
@@ -9618,10 +10279,20 @@ dependencies = [
  "wide",
 ]
 
+[[package]]
+name = "simple-dns"
+version = "0.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cae9a3fcdadafb6d97f4c0e007e4247b114ee0f119f650c3cbf3a8b3a1479694"
+dependencies = [
+ "bitflags 2.6.0",
+]
+
 [[package]]
 name = "simple-mermaid"
-version = "0.1.0"
-source = "git+https://github.com/kianenigma/simple-mermaid.git?rev=e48b187bcfd5cc75111acd9d241f1bd36604344b#e48b187bcfd5cc75111acd9d241f1bd36604344b"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "620a1d43d70e142b1d46a929af51d44f383db9c7a2ec122de2cd992ccfcf3c18"
 
 [[package]]
 name = "simple_logger"
@@ -9674,7 +10345,7 @@ checksum = "0eb01866308440fc64d6c44d9e86c5cc17adfe33c4d6eed55da9145044d0ffc1"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -9685,15 +10356,15 @@ checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c"
 
 [[package]]
 name = "smol"
-version = "2.0.0"
+version = "2.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e635339259e51ef85ac7aa29a1cd991b957047507288697a690e80ab97d07cad"
+checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f"
 dependencies = [
  "async-channel 2.3.1",
  "async-executor",
  "async-fs",
  "async-io",
- "async-lock 3.4.0",
+ "async-lock",
  "async-net",
  "async-process",
  "blocking",
@@ -9706,8 +10377,8 @@ version = "0.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e6d1eaa97d77be4d026a1e7ffad1bb3b78448763b357ea6f8188d3e6f736a9b9"
 dependencies = [
- "arrayvec 0.7.4",
- "async-lock 3.4.0",
+ "arrayvec 0.7.6",
+ "async-lock",
  "atomic-take",
  "base64 0.21.7",
  "bip39",
@@ -9716,7 +10387,7 @@ dependencies = [
  "chacha20",
  "crossbeam-queue",
  "derive_more",
- "ed25519-zebra 4.0.3",
+ "ed25519-zebra",
  "either",
  "event-listener 4.0.3",
  "fnv",
@@ -9734,7 +10405,7 @@ dependencies = [
  "num-bigint",
  "num-rational",
  "num-traits 0.2.19",
- "pbkdf2 0.12.2",
+ "pbkdf2",
  "pin-project",
  "poly1305",
  "rand",
@@ -9748,10 +10419,10 @@ dependencies = [
  "siphasher 1.0.1",
  "slab",
  "smallvec",
- "soketto",
+ "soketto 0.7.1",
  "twox-hash",
  "wasmi",
- "x25519-dalek 2.0.1",
+ "x25519-dalek",
  "zeroize",
 ]
 
@@ -9762,7 +10433,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5496f2d116b7019a526b1039ec2247dd172b8670633b1a64a614c9ea12c9d8c7"
 dependencies = [
  "async-channel 2.3.1",
- "async-lock 3.4.0",
+ "async-lock",
  "base64 0.21.7",
  "blake2-rfc",
  "derive_more",
@@ -9776,7 +10447,7 @@ dependencies = [
  "hex",
  "itertools 0.12.1",
  "log",
- "lru 0.12.3",
+ "lru",
  "no-std-net",
  "parking_lot 0.12.3",
  "pin-project",
@@ -9806,12 +10477,12 @@ dependencies = [
  "aes-gcm",
  "blake2 0.10.6",
  "chacha20poly1305",
- "curve25519-dalek 4.1.3",
- "rand_core 0.6.4",
+ "curve25519-dalek",
+ "rand_core",
  "ring 0.17.8",
  "rustc_version",
  "sha2 0.10.8",
- "subtle 2.5.0",
+ "subtle 2.6.1",
 ]
 
 [[package]]
@@ -9842,31 +10513,46 @@ checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2"
 dependencies = [
  "base64 0.13.1",
  "bytes",
- "flate2",
  "futures 0.3.30",
- "http",
  "httparse",
  "log",
  "rand",
- "sha-1",
+ "sha-1 0.9.8",
+]
+
+[[package]]
+name = "soketto"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37468c595637c10857701c990f93a40ce0e357cedb0953d1c26c8d8027f9bb53"
+dependencies = [
+ "base64 0.22.1",
+ "bytes",
+ "futures 0.3.30",
+ "http 1.1.0",
+ "httparse",
+ "log",
+ "rand",
+ "sha1",
 ]
 
 [[package]]
 name = "sp-api"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "34.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
+ "docify",
  "hash-db",
  "log",
  "parity-scale-codec",
  "scale-info",
  "sp-api-proc-macro",
  "sp-core",
- "sp-externalities 0.19.0",
+ "sp-externalities",
  "sp-metadata-ir",
  "sp-runtime",
+ "sp-runtime-interface",
  "sp-state-machine",
- "sp-std 8.0.0",
  "sp-trie",
  "sp-version",
  "thiserror",
@@ -9874,109 +10560,89 @@ dependencies = [
 
 [[package]]
 name = "sp-api-proc-macro"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "20.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "Inflector",
  "blake2 0.10.6",
  "expander",
- "proc-macro-crate 3.1.0",
+ "proc-macro-crate 3.2.0",
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "sp-application-crypto"
-version = "23.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "parity-scale-codec",
  "scale-info",
  "serde",
  "sp-core",
  "sp-io",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "sp-arithmetic"
-version = "16.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "26.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
+ "docify",
  "integer-sqrt",
  "num-traits 0.2.19",
  "parity-scale-codec",
  "scale-info",
  "serde",
- "sp-std 8.0.0",
  "static_assertions",
 ]
 
-[[package]]
-name = "sp-ark-bls12-381"
-version = "0.4.2"
-source = "git+https://github.com/paritytech/arkworks-substrate#caa2eed74beb885dd07c7db5f916f2281dad818f"
-dependencies = [
- "ark-bls12-381-ext",
- "sp-crypto-ec-utils",
-]
-
-[[package]]
-name = "sp-ark-ed-on-bls12-381-bandersnatch"
-version = "0.4.2"
-source = "git+https://github.com/paritytech/arkworks-substrate#caa2eed74beb885dd07c7db5f916f2281dad818f"
-dependencies = [
- "ark-ed-on-bls12-381-bandersnatch-ext",
- "sp-crypto-ec-utils",
-]
-
 [[package]]
 name = "sp-authority-discovery"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "34.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "parity-scale-codec",
  "scale-info",
  "sp-api",
  "sp-application-crypto",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "sp-block-builder"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "34.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "sp-api",
  "sp-inherents",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "sp-blockchain"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "37.0.1"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "futures 0.3.30",
- "log",
  "parity-scale-codec",
  "parking_lot 0.12.3",
  "schnellru",
  "sp-api",
  "sp-consensus",
+ "sp-core",
  "sp-database",
  "sp-runtime",
  "sp-state-machine",
  "thiserror",
+ "tracing",
 ]
 
 [[package]]
 name = "sp-consensus"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.40.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "async-trait",
  "futures 0.3.30",
@@ -9990,8 +10656,8 @@ dependencies = [
 
 [[package]]
 name = "sp-consensus-aura"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.40.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "async-trait",
  "parity-scale-codec",
@@ -10001,14 +10667,13 @@ dependencies = [
  "sp-consensus-slots",
  "sp-inherents",
  "sp-runtime",
- "sp-std 8.0.0",
  "sp-timestamp",
 ]
 
 [[package]]
 name = "sp-consensus-babe"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.40.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "async-trait",
  "parity-scale-codec",
@@ -10020,14 +10685,13 @@ dependencies = [
  "sp-core",
  "sp-inherents",
  "sp-runtime",
- "sp-std 8.0.0",
  "sp-timestamp",
 ]
 
 [[package]]
 name = "sp-consensus-grandpa"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "21.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "finality-grandpa",
  "log",
@@ -10039,43 +10703,41 @@ dependencies = [
  "sp-core",
  "sp-keystore",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "sp-consensus-slots"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.40.1"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "parity-scale-codec",
  "scale-info",
  "serde",
- "sp-std 8.0.0",
  "sp-timestamp",
 ]
 
 [[package]]
 name = "sp-core"
-version = "21.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "34.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "array-bytes 6.2.3",
- "bandersnatch_vrfs",
- "bip39",
+ "array-bytes",
  "bitflags 1.3.2",
  "blake2 0.10.6",
  "bounded-collections",
  "bs58 0.5.1",
  "dyn-clonable",
- "ed25519-zebra 3.1.0",
+ "ed25519-zebra",
  "futures 0.3.30",
  "hash-db",
  "hash256-std-hasher",
  "impl-serde",
- "itertools 0.10.5",
+ "itertools 0.11.0",
+ "k256",
  "libsecp256k1",
  "log",
  "merlin",
+ "parity-bip39",
  "parity-scale-codec",
  "parking_lot 0.12.3",
  "paste",
@@ -10086,12 +10748,12 @@ dependencies = [
  "secp256k1",
  "secrecy",
  "serde",
- "sp-core-hashing",
- "sp-debug-derive 8.0.0",
- "sp-externalities 0.19.0",
- "sp-runtime-interface 17.0.0",
- "sp-std 8.0.0",
- "sp-storage 13.0.0",
+ "sp-crypto-hashing",
+ "sp-debug-derive",
+ "sp-externalities",
+ "sp-runtime-interface",
+ "sp-std",
+ "sp-storage",
  "ss58-registry",
  "substrate-bip39",
  "thiserror",
@@ -10101,9 +10763,9 @@ dependencies = [
 ]
 
 [[package]]
-name = "sp-core-hashing"
-version = "9.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+name = "sp-crypto-hashing"
+version = "0.1.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "blake2b_simd",
  "byteorder",
@@ -10114,62 +10776,32 @@ dependencies = [
 ]
 
 [[package]]
-name = "sp-core-hashing-proc-macro"
-version = "9.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+name = "sp-crypto-hashing-proc-macro"
+version = "0.1.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "quote",
- "sp-core-hashing",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "sp-crypto-ec-utils"
-version = "0.10.0"
-source = "git+https://github.com/paritytech/polkadot-sdk#739c37bfd6df30fac0ffb9b491ee2495e1753054"
-dependencies = [
- "ark-bls12-377",
- "ark-bls12-377-ext",
- "ark-bls12-381",
- "ark-bls12-381-ext",
- "ark-bw6-761",
- "ark-bw6-761-ext",
- "ark-ec",
- "ark-ed-on-bls12-377",
- "ark-ed-on-bls12-377-ext",
- "ark-ed-on-bls12-381-bandersnatch",
- "ark-ed-on-bls12-381-bandersnatch-ext",
- "ark-scale",
- "sp-runtime-interface 24.0.0",
+ "sp-crypto-hashing",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "sp-database"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "10.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "kvdb",
  "parking_lot 0.12.3",
 ]
 
-[[package]]
-name = "sp-debug-derive"
-version = "8.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.66",
-]
-
 [[package]]
 name = "sp-debug-derive"
 version = "14.0.0"
-source = "git+https://github.com/paritytech/polkadot-sdk#739c37bfd6df30fac0ffb9b491ee2495e1753054"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -10183,75 +10815,65 @@ dependencies = [
  "serde",
  "sp-inherents",
  "sp-runtime",
- "sp-std 8.0.0",
  "thiserror",
 ]
 
 [[package]]
 name = "sp-externalities"
-version = "0.19.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
-dependencies = [
- "environmental",
- "parity-scale-codec",
- "sp-std 8.0.0",
- "sp-storage 13.0.0",
-]
-
-[[package]]
-name = "sp-externalities"
-version = "0.25.0"
-source = "git+https://github.com/paritytech/polkadot-sdk#739c37bfd6df30fac0ffb9b491ee2495e1753054"
+version = "0.29.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "environmental",
  "parity-scale-codec",
- "sp-storage 19.0.0",
+ "sp-storage",
 ]
 
 [[package]]
 name = "sp-genesis-builder"
-version = "0.1.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.15.1"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
+ "parity-scale-codec",
+ "scale-info",
  "serde_json",
  "sp-api",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "sp-inherents"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "34.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "async-trait",
  "impl-trait-for-tuples",
  "parity-scale-codec",
  "scale-info",
  "sp-runtime",
- "sp-std 8.0.0",
  "thiserror",
 ]
 
 [[package]]
 name = "sp-io"
-version = "23.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "38.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "bytes",
+ "docify",
  "ed25519-dalek",
  "libsecp256k1",
  "log",
  "parity-scale-codec",
+ "polkavm-derive",
  "rustversion",
  "secp256k1",
  "sp-core",
- "sp-externalities 0.19.0",
+ "sp-crypto-hashing",
+ "sp-externalities",
  "sp-keystore",
- "sp-runtime-interface 17.0.0",
+ "sp-runtime-interface",
  "sp-state-machine",
- "sp-std 8.0.0",
- "sp-tracing 10.0.0",
+ "sp-tracing",
  "sp-trie",
  "tracing",
  "tracing-core",
@@ -10259,30 +10881,29 @@ dependencies = [
 
 [[package]]
 name = "sp-keyring"
-version = "24.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "39.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "sp-core",
  "sp-runtime",
- "strum 0.24.1",
+ "strum 0.26.3",
 ]
 
 [[package]]
 name = "sp-keystore"
-version = "0.27.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.40.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "parity-scale-codec",
  "parking_lot 0.12.3",
  "sp-core",
- "sp-externalities 0.19.0",
- "thiserror",
+ "sp-externalities",
 ]
 
 [[package]]
 name = "sp-maybe-compressed-blob"
-version = "4.1.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "11.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "thiserror",
  "zstd 0.12.4",
@@ -10293,41 +10914,37 @@ name = "sp-membership"
 version = "1.0.0"
 dependencies = [
  "frame-support",
- "impl-trait-for-tuples",
  "parity-scale-codec",
  "scale-info",
  "serde",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "sp-metadata-ir"
-version = "0.1.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.7.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "frame-metadata 16.0.0",
  "parity-scale-codec",
  "scale-info",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "sp-mixnet"
-version = "0.1.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.12.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "parity-scale-codec",
  "scale-info",
  "sp-api",
  "sp-application-crypto",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "sp-offchain"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "34.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "sp-api",
  "sp-core",
@@ -10336,8 +10953,8 @@ dependencies = [
 
 [[package]]
 name = "sp-panic-handler"
-version = "8.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "13.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "backtrace",
  "lazy_static",
@@ -10346,24 +10963,25 @@ dependencies = [
 
 [[package]]
 name = "sp-rpc"
-version = "6.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "32.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "rustc-hash",
+ "rustc-hash 1.1.0",
  "serde",
  "sp-core",
 ]
 
 [[package]]
 name = "sp-runtime"
-version = "24.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "39.0.1"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "docify",
  "either",
  "hash256-std-hasher",
  "impl-trait-for-tuples",
  "log",
+ "num-traits 0.2.19",
  "parity-scale-codec",
  "paste",
  "rand",
@@ -10374,77 +10992,47 @@ dependencies = [
  "sp-arithmetic",
  "sp-core",
  "sp-io",
- "sp-std 8.0.0",
+ "sp-std",
  "sp-weights",
+ "tracing",
 ]
 
 [[package]]
 name = "sp-runtime-interface"
-version = "17.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
-dependencies = [
- "bytes",
- "impl-trait-for-tuples",
- "parity-scale-codec",
- "primitive-types",
- "sp-externalities 0.19.0",
- "sp-runtime-interface-proc-macro 11.0.0",
- "sp-std 8.0.0",
- "sp-storage 13.0.0",
- "sp-tracing 10.0.0",
- "sp-wasm-interface 14.0.0",
- "static_assertions",
-]
-
-[[package]]
-name = "sp-runtime-interface"
-version = "24.0.0"
-source = "git+https://github.com/paritytech/polkadot-sdk#739c37bfd6df30fac0ffb9b491ee2495e1753054"
+version = "28.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "bytes",
  "impl-trait-for-tuples",
  "parity-scale-codec",
  "polkavm-derive",
  "primitive-types",
- "sp-externalities 0.25.0",
- "sp-runtime-interface-proc-macro 17.0.0",
- "sp-std 14.0.0",
- "sp-storage 19.0.0",
- "sp-tracing 16.0.0",
- "sp-wasm-interface 20.0.0",
+ "sp-externalities",
+ "sp-runtime-interface-proc-macro",
+ "sp-std",
+ "sp-storage",
+ "sp-tracing",
+ "sp-wasm-interface",
  "static_assertions",
 ]
 
 [[package]]
 name = "sp-runtime-interface-proc-macro"
-version = "11.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
-dependencies = [
- "Inflector",
- "expander",
- "proc-macro-crate 3.1.0",
- "proc-macro2",
- "quote",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "sp-runtime-interface-proc-macro"
-version = "17.0.0"
-source = "git+https://github.com/paritytech/polkadot-sdk#739c37bfd6df30fac0ffb9b491ee2495e1753054"
+version = "18.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "Inflector",
  "expander",
- "proc-macro-crate 3.1.0",
+ "proc-macro-crate 3.2.0",
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "sp-session"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "36.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "parity-scale-codec",
  "scale-info",
@@ -10453,13 +11041,12 @@ dependencies = [
  "sp-keystore",
  "sp-runtime",
  "sp-staking",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "sp-staking"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "36.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "impl-trait-for-tuples",
  "parity-scale-codec",
@@ -10467,13 +11054,12 @@ dependencies = [
  "serde",
  "sp-core",
  "sp-runtime",
- "sp-std 8.0.0",
 ]
 
 [[package]]
 name = "sp-state-machine"
-version = "0.28.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.43.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "hash-db",
  "log",
@@ -10482,9 +11068,8 @@ dependencies = [
  "rand",
  "smallvec",
  "sp-core",
- "sp-externalities 0.19.0",
+ "sp-externalities",
  "sp-panic-handler",
- "sp-std 8.0.0",
  "sp-trie",
  "thiserror",
  "tracing",
@@ -10493,11 +11078,11 @@ dependencies = [
 
 [[package]]
 name = "sp-statement-store"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "18.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "aes-gcm",
- "curve25519-dalek 4.1.3",
+ "curve25519-dalek",
  "ed25519-dalek",
  "hkdf",
  "parity-scale-codec",
@@ -10507,78 +11092,47 @@ dependencies = [
  "sp-api",
  "sp-application-crypto",
  "sp-core",
- "sp-externalities 0.19.0",
+ "sp-crypto-hashing",
+ "sp-externalities",
  "sp-runtime",
- "sp-runtime-interface 17.0.0",
- "sp-std 8.0.0",
+ "sp-runtime-interface",
  "thiserror",
- "x25519-dalek 2.0.1",
+ "x25519-dalek",
 ]
 
-[[package]]
-name = "sp-std"
-version = "8.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
-
 [[package]]
 name = "sp-std"
 version = "14.0.0"
-source = "git+https://github.com/paritytech/polkadot-sdk#739c37bfd6df30fac0ffb9b491ee2495e1753054"
-
-[[package]]
-name = "sp-storage"
-version = "13.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
-dependencies = [
- "impl-serde",
- "parity-scale-codec",
- "ref-cast",
- "serde",
- "sp-debug-derive 8.0.0",
- "sp-std 8.0.0",
-]
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 
 [[package]]
 name = "sp-storage"
-version = "19.0.0"
-source = "git+https://github.com/paritytech/polkadot-sdk#739c37bfd6df30fac0ffb9b491ee2495e1753054"
+version = "21.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "impl-serde",
  "parity-scale-codec",
  "ref-cast",
  "serde",
- "sp-debug-derive 14.0.0",
+ "sp-debug-derive",
 ]
 
 [[package]]
 name = "sp-timestamp"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "34.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "async-trait",
  "parity-scale-codec",
  "sp-inherents",
  "sp-runtime",
- "sp-std 8.0.0",
  "thiserror",
 ]
 
 [[package]]
 name = "sp-tracing"
-version = "10.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
-dependencies = [
- "parity-scale-codec",
- "sp-std 8.0.0",
- "tracing",
- "tracing-core",
- "tracing-subscriber 0.2.25",
-]
-
-[[package]]
-name = "sp-tracing"
-version = "16.0.0"
-source = "git+https://github.com/paritytech/polkadot-sdk#739c37bfd6df30fac0ffb9b491ee2495e1753054"
+version = "17.0.1"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "parity-scale-codec",
  "tracing",
@@ -10588,8 +11142,8 @@ dependencies = [
 
 [[package]]
 name = "sp-transaction-pool"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "34.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "sp-api",
  "sp-runtime",
@@ -10597,8 +11151,8 @@ dependencies = [
 
 [[package]]
 name = "sp-transaction-storage-proof"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "34.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "async-trait",
  "parity-scale-codec",
@@ -10606,16 +11160,15 @@ dependencies = [
  "sp-core",
  "sp-inherents",
  "sp-runtime",
- "sp-std 8.0.0",
  "sp-trie",
 ]
 
 [[package]]
 name = "sp-trie"
-version = "22.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "37.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "ahash 0.8.11",
+ "ahash",
  "hash-db",
  "lazy_static",
  "memory-db",
@@ -10626,8 +11179,7 @@ dependencies = [
  "scale-info",
  "schnellru",
  "sp-core",
- "sp-externalities 0.19.0",
- "sp-std 8.0.0",
+ "sp-externalities",
  "thiserror",
  "tracing",
  "trie-db",
@@ -10636,59 +11188,48 @@ dependencies = [
 
 [[package]]
 name = "sp-version"
-version = "22.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "37.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "impl-serde",
  "parity-scale-codec",
  "parity-wasm",
  "scale-info",
  "serde",
- "sp-core-hashing-proc-macro",
+ "sp-crypto-hashing-proc-macro",
  "sp-runtime",
- "sp-std 8.0.0",
+ "sp-std",
  "sp-version-proc-macro",
  "thiserror",
 ]
 
 [[package]]
 name = "sp-version-proc-macro"
-version = "8.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "14.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "parity-scale-codec",
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "sp-wasm-interface"
-version = "14.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "21.0.1"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "anyhow",
  "impl-trait-for-tuples",
  "log",
  "parity-scale-codec",
- "sp-std 8.0.0",
  "wasmtime",
 ]
 
-[[package]]
-name = "sp-wasm-interface"
-version = "20.0.0"
-source = "git+https://github.com/paritytech/polkadot-sdk#739c37bfd6df30fac0ffb9b491ee2495e1753054"
-dependencies = [
- "impl-trait-for-tuples",
- "log",
- "parity-scale-codec",
-]
-
 [[package]]
 name = "sp-weights"
-version = "20.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "31.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
  "bounded-collections",
  "parity-scale-codec",
@@ -10696,8 +11237,7 @@ dependencies = [
  "serde",
  "smallvec",
  "sp-arithmetic",
- "sp-debug-derive 8.0.0",
- "sp-std 8.0.0",
+ "sp-debug-derive",
 ]
 
 [[package]]
@@ -10713,14 +11253,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
 
 [[package]]
-name = "spinners"
-version = "4.1.1"
+name = "spinning_top"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0ef947f358b9c238923f764c72a4a9d42f2d637c46e059dbd319d6e7cfb4f82"
+checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300"
 dependencies = [
- "lazy_static",
- "maplit",
- "strum 0.24.1",
+ "lock_api",
 ]
 
 [[package]]
@@ -10735,9 +11273,9 @@ dependencies = [
 
 [[package]]
 name = "ss58-registry"
-version = "1.47.0"
+version = "1.50.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4743ce898933fbff7bbf414f497c459a782d496269644b3d650a398ae6a487ba"
+checksum = "43fce22ed1df64d04b262351c8f9d5c6da4f76f79f25ad15529792f893fad25d"
 dependencies = [
  "Inflector",
  "num-format",
@@ -10767,7 +11305,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8a2a1c578e98c1c16fc3b8ec1328f7659a500737d7a0c6d625e73e830ff9c1f6"
 dependencies = [
  "bitflags 1.3.2",
- "cfg_aliases",
+ "cfg_aliases 0.1.1",
  "libc",
  "parking_lot 0.11.2",
  "parking_lot_core 0.8.6",
@@ -10781,13 +11319,33 @@ version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "70a2595fc3aa78f2d0e45dd425b22282dd863273761cc77780914b2cf3003acf"
 dependencies = [
- "cfg_aliases",
+ "cfg_aliases 0.1.1",
  "memchr",
  "proc-macro2",
  "quote",
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "str0m"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6706347e49b13373f7ddfafad47df7583ed52083d6fc8a594eb2c80497ef959d"
+dependencies = [
+ "combine 4.6.7",
+ "crc",
+ "fastrand",
+ "hmac 0.12.1",
+ "once_cell",
+ "openssl",
+ "openssl-sys",
+ "sctp-proto",
+ "serde",
+ "sha-1 0.10.1",
+ "thiserror",
+ "tracing",
+]
+
 [[package]]
 name = "strsim"
 version = "0.10.0"
@@ -10805,15 +11363,15 @@ name = "strum"
 version = "0.24.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f"
-dependencies = [
- "strum_macros 0.24.3",
-]
 
 [[package]]
 name = "strum"
-version = "0.26.2"
+version = "0.26.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29"
+checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
+dependencies = [
+ "strum_macros 0.26.4",
+]
 
 [[package]]
 name = "strum_macros"
@@ -10838,35 +11396,35 @@ dependencies = [
  "proc-macro2",
  "quote",
  "rustversion",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "substrate-bip39"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a7590dc041b9bc2825e52ce5af8416c73dbe9d0654402bfd4b4941938b94d8f"
+version = "0.6.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "hmac 0.11.0",
- "pbkdf2 0.8.0",
+ "hmac 0.12.1",
+ "pbkdf2",
  "schnorrkel",
- "sha2 0.9.9",
+ "sha2 0.10.8",
  "zeroize",
 ]
 
 [[package]]
 name = "substrate-build-script-utils"
-version = "3.0.0"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "11.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 
 [[package]]
 name = "substrate-frame-rpc-system"
-version = "4.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "39.0.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
+ "docify",
  "frame-system-rpc-runtime-api",
  "futures 0.3.30",
- "jsonrpsee 0.16.3",
+ "jsonrpsee 0.24.5",
  "log",
  "parity-scale-codec",
  "sc-rpc-api",
@@ -10880,43 +11438,34 @@ dependencies = [
 
 [[package]]
 name = "substrate-prometheus-endpoint"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "0.17.0"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "hyper",
+ "http-body-util",
+ "hyper 1.4.1",
+ "hyper-util",
  "log",
  "prometheus",
  "thiserror",
  "tokio",
 ]
 
-[[package]]
-name = "substrate-rpc-client"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
-dependencies = [
- "async-trait",
- "jsonrpsee 0.16.3",
- "log",
- "sc-rpc-api",
- "serde",
- "sp-runtime",
-]
-
 [[package]]
 name = "substrate-wasm-builder"
-version = "5.0.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
+version = "24.0.1"
+source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.16.0#90e77c4c212232c85b81fbd9e83064a3e7586db7"
 dependencies = [
- "ansi_term",
  "build-helper",
  "cargo_metadata",
+ "console",
  "filetime",
+ "jobserver",
  "parity-wasm",
+ "polkavm-linker",
  "sp-maybe-compressed-blob",
- "strum 0.24.1",
+ "strum 0.26.3",
  "tempfile",
- "toml 0.8.14",
+ "toml 0.8.19",
  "walkdir",
  "wasm-opt",
 ]
@@ -10929,9 +11478,9 @@ checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee"
 
 [[package]]
 name = "subtle"
-version = "2.5.0"
+version = "2.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
+checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
 
 [[package]]
 name = "subweight-core"
@@ -10949,37 +11498,35 @@ dependencies = [
  "semver 1.0.23",
  "serde",
  "serde_json",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "subxt"
-version = "0.34.0"
-source = "git+https://github.com/duniter/subxt?branch=subxt-v0.34.0-duniter-substrate-v1.6.0#b648c5e3a260d4e7d47df42d784ad4c723637411"
+version = "0.37.0"
+source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.16.0#be63f133b5b90bff7ead1dae749a1b6f7c34cbc8"
 dependencies = [
  "async-trait",
- "base58",
- "blake2 0.10.6",
- "derivative",
+ "derive-where",
  "either",
  "frame-metadata 16.0.0",
  "futures 0.3.30",
  "hex",
  "impl-serde",
  "instant",
- "jsonrpsee 0.21.0",
+ "jsonrpsee 0.22.5",
  "parity-scale-codec",
  "primitive-types",
- "scale-bits",
- "scale-decode",
- "scale-encode",
+ "reconnecting-jsonrpsee-ws-client",
+ "scale-bits 0.6.0",
+ "scale-decode 0.13.1",
+ "scale-encode 0.7.1",
  "scale-info",
- "scale-value",
+ "scale-value 0.16.3",
  "serde",
  "serde_json",
- "sp-core",
- "sp-core-hashing",
- "sp-runtime",
+ "sp-crypto-hashing",
+ "subxt-core",
  "subxt-lightclient",
  "subxt-macro",
  "subxt-metadata",
@@ -10991,28 +11538,56 @@ dependencies = [
 
 [[package]]
 name = "subxt-codegen"
-version = "0.34.0"
-source = "git+https://github.com/duniter/subxt?branch=subxt-v0.34.0-duniter-substrate-v1.6.0#b648c5e3a260d4e7d47df42d784ad4c723637411"
+version = "0.37.0"
+source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.16.0#be63f133b5b90bff7ead1dae749a1b6f7c34cbc8"
 dependencies = [
  "frame-metadata 16.0.0",
- "heck 0.4.1",
+ "heck 0.5.0",
  "hex",
- "jsonrpsee 0.21.0",
+ "jsonrpsee 0.22.5",
  "parity-scale-codec",
  "proc-macro2",
  "quote",
  "scale-info",
  "scale-typegen",
  "subxt-metadata",
- "syn 2.0.66",
+ "syn 2.0.79",
  "thiserror",
  "tokio",
 ]
 
+[[package]]
+name = "subxt-core"
+version = "0.37.0"
+source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.16.0#be63f133b5b90bff7ead1dae749a1b6f7c34cbc8"
+dependencies = [
+ "base58",
+ "blake2 0.10.6",
+ "derive-where",
+ "frame-metadata 16.0.0",
+ "hashbrown 0.14.5",
+ "hex",
+ "impl-serde",
+ "parity-scale-codec",
+ "primitive-types",
+ "scale-bits 0.6.0",
+ "scale-decode 0.13.1",
+ "scale-encode 0.7.1",
+ "scale-info",
+ "scale-value 0.16.3",
+ "serde",
+ "serde_json",
+ "sp-core",
+ "sp-crypto-hashing",
+ "sp-runtime",
+ "subxt-metadata",
+ "tracing",
+]
+
 [[package]]
 name = "subxt-lightclient"
-version = "0.34.0"
-source = "git+https://github.com/duniter/subxt?branch=subxt-v0.34.0-duniter-substrate-v1.6.0#b648c5e3a260d4e7d47df42d784ad4c723637411"
+version = "0.37.0"
+source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.16.0#be63f133b5b90bff7ead1dae749a1b6f7c34cbc8"
 dependencies = [
  "futures 0.3.30",
  "futures-util",
@@ -11027,28 +11602,28 @@ dependencies = [
 
 [[package]]
 name = "subxt-macro"
-version = "0.34.0"
-source = "git+https://github.com/duniter/subxt?branch=subxt-v0.34.0-duniter-substrate-v1.6.0#b648c5e3a260d4e7d47df42d784ad4c723637411"
+version = "0.37.0"
+source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.16.0#be63f133b5b90bff7ead1dae749a1b6f7c34cbc8"
 dependencies = [
- "darling 0.20.9",
+ "darling 0.20.10",
  "parity-scale-codec",
  "proc-macro-error",
  "quote",
  "scale-typegen",
  "subxt-codegen",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "subxt-metadata"
-version = "0.34.0"
-source = "git+https://github.com/duniter/subxt?branch=subxt-v0.34.0-duniter-substrate-v1.6.0#b648c5e3a260d4e7d47df42d784ad4c723637411"
+version = "0.37.0"
+source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.16.0#be63f133b5b90bff7ead1dae749a1b6f7c34cbc8"
 dependencies = [
  "frame-metadata 16.0.0",
+ "hashbrown 0.14.5",
  "parity-scale-codec",
  "scale-info",
- "sp-core-hashing",
- "thiserror",
+ "sp-crypto-hashing",
 ]
 
 [[package]]
@@ -11064,9 +11639,9 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "2.0.66"
+version = "2.0.79"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5"
+checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -11075,9 +11650,12 @@ dependencies = [
 
 [[package]]
 name = "sync_wrapper"
-version = "0.1.2"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
+dependencies = [
+ "futures-core",
+]
 
 [[package]]
 name = "synstructure"
@@ -11091,13 +11669,24 @@ dependencies = [
  "unicode-xid",
 ]
 
+[[package]]
+name = "synstructure"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
+]
+
 [[package]]
 name = "synthez"
 version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a3d2c2202510a1e186e63e596d9318c91a8cbe85cd1a56a7be0c333e5f59ec8d"
 dependencies = [
- "syn 2.0.66",
+ "syn 2.0.79",
  "synthez-codegen",
  "synthez-core",
 ]
@@ -11108,7 +11697,7 @@ version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f724aa6d44b7162f3158a57bccd871a77b39a4aef737e01bcdff41f4772c7746"
 dependencies = [
- "syn 2.0.66",
+ "syn 2.0.79",
  "synthez-core",
 ]
 
@@ -11121,7 +11710,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "sealed",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -11153,20 +11742,21 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
 
 [[package]]
 name = "target-lexicon"
-version = "0.12.14"
+version = "0.12.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f"
+checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
 
 [[package]]
 name = "tempfile"
-version = "3.10.1"
+version = "3.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
+checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b"
 dependencies = [
  "cfg-if",
  "fastrand",
- "rustix 0.38.34",
- "windows-sys 0.52.0",
+ "once_cell",
+ "rustix 0.38.37",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -11200,7 +11790,7 @@ version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7"
 dependencies = [
- "rustix 0.38.34",
+ "rustix 0.38.37",
  "windows-sys 0.48.0",
 ]
 
@@ -11223,22 +11813,22 @@ dependencies = [
 
 [[package]]
 name = "thiserror"
-version = "1.0.61"
+version = "1.0.64"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709"
+checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.61"
+version = "1.0.64"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533"
+checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -11266,16 +11856,6 @@ dependencies = [
  "num_cpus",
 ]
 
-[[package]]
-name = "tikv-jemalloc-sys"
-version = "0.5.4+5.3.0-patched"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9402443cb8fd499b6f327e40565234ff34dbda27460c5b47db0db77443dd85d1"
-dependencies = [
- "cc",
- "libc",
-]
-
 [[package]]
 name = "time"
 version = "0.3.36"
@@ -11318,9 +11898,9 @@ dependencies = [
 
 [[package]]
 name = "tinyvec"
-version = "1.6.0"
+version = "1.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938"
 dependencies = [
  "tinyvec_macros",
 ]
@@ -11333,43 +11913,31 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
 
 [[package]]
 name = "tokio"
-version = "1.38.0"
+version = "1.40.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a"
+checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998"
 dependencies = [
  "backtrace",
  "bytes",
  "libc",
- "mio",
- "num_cpus",
+ "mio 1.0.2",
  "parking_lot 0.12.3",
- "pin-project-lite 0.2.14",
+ "pin-project-lite",
  "signal-hook-registry",
  "socket2 0.5.7",
  "tokio-macros",
- "windows-sys 0.48.0",
-]
-
-[[package]]
-name = "tokio-macros"
-version = "2.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.66",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
-name = "tokio-retry"
-version = "0.3.0"
+name = "tokio-macros"
+version = "2.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f57eb36ecbe0fc510036adff84824dd3c24bb781e21bfa67b69d556aa85214f"
+checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
 dependencies = [
- "pin-project",
- "rand",
- "tokio",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -11393,29 +11961,55 @@ dependencies = [
  "tokio",
 ]
 
+[[package]]
+name = "tokio-rustls"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4"
+dependencies = [
+ "rustls 0.23.13",
+ "rustls-pki-types",
+ "tokio",
+]
+
 [[package]]
 name = "tokio-stream"
-version = "0.1.15"
+version = "0.1.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af"
+checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1"
 dependencies = [
  "futures-core",
- "pin-project-lite 0.2.14",
+ "pin-project-lite",
  "tokio",
  "tokio-util",
 ]
 
+[[package]]
+name = "tokio-tungstenite"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c"
+dependencies = [
+ "futures-util",
+ "log",
+ "rustls 0.21.12",
+ "rustls-native-certs 0.6.3",
+ "tokio",
+ "tokio-rustls 0.24.1",
+ "tungstenite",
+]
+
 [[package]]
 name = "tokio-util"
-version = "0.7.11"
+version = "0.7.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1"
+checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a"
 dependencies = [
  "bytes",
  "futures-core",
  "futures-io",
  "futures-sink",
- "pin-project-lite 0.2.14",
+ "pin-project-lite",
  "tokio",
 ]
 
@@ -11430,43 +12024,32 @@ dependencies = [
 
 [[package]]
 name = "toml"
-version = "0.8.14"
+version = "0.8.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335"
+checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
 dependencies = [
  "serde",
  "serde_spanned",
  "toml_datetime",
- "toml_edit 0.22.14",
+ "toml_edit",
 ]
 
 [[package]]
 name = "toml_datetime"
-version = "0.6.6"
+version = "0.6.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf"
+checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "toml_edit"
-version = "0.21.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1"
-dependencies = [
- "indexmap 2.2.6",
- "toml_datetime",
- "winnow 0.5.40",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.22.14"
+version = "0.22.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38"
+checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
 dependencies = [
- "indexmap 2.2.6",
+ "indexmap 2.5.0",
  "serde",
  "serde_spanned",
  "toml_datetime",
@@ -11482,7 +12065,7 @@ dependencies = [
  "futures-core",
  "futures-util",
  "pin-project",
- "pin-project-lite 0.2.14",
+ "pin-project-lite",
  "tower-layer",
  "tower-service",
  "tracing",
@@ -11490,33 +12073,31 @@ dependencies = [
 
 [[package]]
 name = "tower-http"
-version = "0.4.4"
+version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140"
+checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5"
 dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
  "bytes",
- "futures-core",
- "futures-util",
- "http",
- "http-body",
- "http-range-header",
- "pin-project-lite 0.2.14",
+ "http 1.1.0",
+ "http-body 1.0.1",
+ "http-body-util",
+ "pin-project-lite",
  "tower-layer",
  "tower-service",
 ]
 
 [[package]]
 name = "tower-layer"
-version = "0.3.2"
+version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
+checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
 
 [[package]]
 name = "tower-service"
-version = "0.3.2"
+version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
 
 [[package]]
 name = "tracing"
@@ -11525,7 +12106,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
 dependencies = [
  "log",
- "pin-project-lite 0.2.14",
+ "pin-project-lite",
  "tracing-attributes",
  "tracing-core",
 ]
@@ -11538,7 +12119,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -11561,17 +12142,6 @@ dependencies = [
  "tracing",
 ]
 
-[[package]]
-name = "tracing-log"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2"
-dependencies = [
- "log",
- "once_cell",
- "tracing-core",
-]
-
 [[package]]
 name = "tracing-log"
 version = "0.2.0"
@@ -11583,37 +12153,24 @@ dependencies = [
  "tracing-core",
 ]
 
-[[package]]
-name = "tracing-serde"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1"
-dependencies = [
- "serde",
- "tracing-core",
-]
-
 [[package]]
 name = "tracing-subscriber"
-version = "0.2.25"
+version = "0.3.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71"
+checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
 dependencies = [
- "ansi_term",
- "chrono",
- "lazy_static",
- "matchers 0.0.1",
- "parking_lot 0.11.2",
+ "matchers",
+ "nu-ansi-term",
+ "once_cell",
+ "parking_lot 0.12.3",
  "regex",
- "serde",
- "serde_json",
  "sharded-slab",
  "smallvec",
  "thread_local",
+ "time",
  "tracing",
  "tracing-core",
- "tracing-log 0.1.4",
- "tracing-serde",
+ "tracing-log",
 ]
 
 [[package]]
@@ -11636,12 +12193,11 @@ dependencies = [
 
 [[package]]
 name = "trie-db"
-version = "0.28.0"
+version = "0.29.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff28e0f815c2fea41ebddf148e008b077d2faddb026c9555b29696114d602642"
+checksum = "0c992b4f40c234a074d48a757efeabb1a6be88af84c0c23f7ca158950cb0ae7f"
 dependencies = [
  "hash-db",
- "hashbrown 0.13.2",
  "log",
  "rustc-hex",
  "smallvec",
@@ -11665,7 +12221,7 @@ dependencies = [
  "async-trait",
  "cfg-if",
  "data-encoding",
- "enum-as-inner",
+ "enum-as-inner 0.5.1",
  "futures-channel",
  "futures-io",
  "futures-util",
@@ -11682,24 +12238,50 @@ dependencies = [
  "url",
 ]
 
+[[package]]
+name = "trust-dns-proto"
+version = "0.23.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3119112651c157f4488931a01e586aa459736e9d6046d3bd9105ffb69352d374"
+dependencies = [
+ "async-trait",
+ "cfg-if",
+ "data-encoding",
+ "enum-as-inner 0.6.1",
+ "futures-channel",
+ "futures-io",
+ "futures-util",
+ "idna 0.4.0",
+ "ipnet",
+ "once_cell",
+ "rand",
+ "smallvec",
+ "thiserror",
+ "tinyvec",
+ "tokio",
+ "tracing",
+ "url",
+]
+
 [[package]]
 name = "trust-dns-resolver"
-version = "0.22.0"
+version = "0.23.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aff21aa4dcefb0a1afbfac26deb0adc93888c7d295fb63ab273ef276ba2b7cfe"
+checksum = "10a3e6c3aff1718b3c73e395d1f35202ba2ffa847c6a62eea0db8fb4cfe30be6"
 dependencies = [
  "cfg-if",
  "futures-util",
  "ipconfig",
- "lazy_static",
  "lru-cache",
+ "once_cell",
  "parking_lot 0.12.3",
+ "rand",
  "resolv-conf",
  "smallvec",
  "thiserror",
  "tokio",
  "tracing",
- "trust-dns-proto",
+ "trust-dns-proto 0.23.2",
 ]
 
 [[package]]
@@ -11708,48 +12290,32 @@ version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
 
-[[package]]
-name = "try-runtime-cli"
-version = "0.10.0-dev"
-source = "git+https://github.com/duniter/duniter-polkadot-sdk?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
-dependencies = [
- "async-trait",
- "clap",
- "frame-remote-externalities",
- "frame-try-runtime",
- "hex",
- "log",
- "parity-scale-codec",
- "sc-cli",
- "sc-executor",
- "serde",
- "serde_json",
- "sp-api",
- "sp-consensus-aura",
- "sp-consensus-babe",
- "sp-core",
- "sp-debug-derive 8.0.0",
- "sp-externalities 0.19.0",
- "sp-inherents",
- "sp-io",
- "sp-keystore",
- "sp-rpc",
- "sp-runtime",
- "sp-state-machine",
- "sp-timestamp",
- "sp-transaction-storage-proof",
- "sp-version",
- "sp-weights",
- "substrate-rpc-client",
- "zstd 0.12.4",
-]
-
 [[package]]
 name = "tt-call"
 version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f4f195fd851901624eee5a58c4bb2b4f06399148fcd0ed336e6f1cb60a9881df"
 
+[[package]]
+name = "tungstenite"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9"
+dependencies = [
+ "byteorder",
+ "bytes",
+ "data-encoding",
+ "http 0.2.12",
+ "httparse",
+ "log",
+ "rand",
+ "rustls 0.21.12",
+ "sha1",
+ "thiserror",
+ "url",
+ "utf-8",
+]
+
 [[package]]
 name = "twox-hash"
 version = "1.6.3"
@@ -11779,7 +12345,7 @@ checksum = "29a3151c41d0b13e3d011f98adc24434560ef06673a155a6c7f66b9879eecce2"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -11790,9 +12356,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
 
 [[package]]
 name = "ucd-trie"
-version = "0.1.6"
+version = "0.1.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9"
+checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
 
 [[package]]
 name = "uint"
@@ -11864,9 +12430,9 @@ checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.12"
+version = "1.0.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
 
 [[package]]
 name = "unicode-linebreak"
@@ -11885,21 +12451,21 @@ dependencies = [
 
 [[package]]
 name = "unicode-segmentation"
-version = "1.11.0"
+version = "1.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202"
+checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
 
 [[package]]
 name = "unicode-width"
-version = "0.1.13"
+version = "0.1.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d"
+checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
 
 [[package]]
 name = "unicode-xid"
-version = "0.2.4"
+version = "0.2.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
+checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
 
 [[package]]
 name = "universal-hash"
@@ -11908,7 +12474,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea"
 dependencies = [
  "crypto-common",
- "subtle 2.5.0",
+ "subtle 2.6.1",
 ]
 
 [[package]]
@@ -11938,6 +12504,16 @@ dependencies = [
  "futures-util",
 ]
 
+[[package]]
+name = "unsigned-varint"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06"
+dependencies = [
+ "bytes",
+ "tokio-util",
+]
+
 [[package]]
 name = "untrusted"
 version = "0.7.1"
@@ -11961,6 +12537,12 @@ dependencies = [
  "percent-encoding",
 ]
 
+[[package]]
+name = "utf-8"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+
 [[package]]
 name = "utf8parse"
 version = "0.2.2"
@@ -11981,9 +12563,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
 
 [[package]]
 name = "version_check"
-version = "0.9.4"
+version = "0.9.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
 
 [[package]]
 name = "void"
@@ -12008,7 +12590,7 @@ dependencies = [
  "digest 0.10.7",
  "rand",
  "rand_chacha",
- "rand_core 0.6.4",
+ "rand_core",
  "sha2 0.10.8",
  "sha3",
  "thiserror",
@@ -12034,12 +12616,6 @@ dependencies = [
  "try-lock",
 ]
 
-[[package]]
-name = "wasi"
-version = "0.9.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
-
 [[package]]
 name = "wasi"
 version = "0.11.0+wasi-snapshot-preview1"
@@ -12048,34 +12624,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
 [[package]]
 name = "wasm-bindgen"
-version = "0.2.92"
+version = "0.2.93"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8"
+checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5"
 dependencies = [
  "cfg-if",
+ "once_cell",
  "wasm-bindgen-macro",
 ]
 
 [[package]]
 name = "wasm-bindgen-backend"
-version = "0.2.92"
+version = "0.2.93"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da"
+checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b"
 dependencies = [
  "bumpalo",
  "log",
  "once_cell",
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
  "wasm-bindgen-shared",
 ]
 
 [[package]]
 name = "wasm-bindgen-futures"
-version = "0.4.42"
+version = "0.4.43"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0"
+checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed"
 dependencies = [
  "cfg-if",
  "js-sys",
@@ -12085,9 +12662,9 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-macro"
-version = "0.2.92"
+version = "0.2.93"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726"
+checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf"
 dependencies = [
  "quote",
  "wasm-bindgen-macro-support",
@@ -12095,28 +12672,28 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-macro-support"
-version = "0.2.92"
+version = "0.2.93"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
+checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
 
 [[package]]
 name = "wasm-bindgen-shared"
-version = "0.2.92"
+version = "0.2.93"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
+checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484"
 
 [[package]]
 name = "wasm-instrument"
-version = "0.3.0"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa1dafb3e60065305741e83db35c6c2584bb3725b692b5b66148a38d72ace6cd"
+checksum = "2a47ecb37b9734d1085eaa5ae1a81e60801fd8c28d4cabdd8aedb982021918bc"
 dependencies = [
  "parity-wasm",
 ]
@@ -12423,9 +13000,9 @@ dependencies = [
 
 [[package]]
 name = "web-sys"
-version = "0.3.69"
+version = "0.3.70"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef"
+checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0"
 dependencies = [
  "js-sys",
  "wasm-bindgen",
@@ -12443,18 +13020,18 @@ dependencies = [
 
 [[package]]
 name = "webpki-roots"
-version = "0.22.6"
+version = "0.25.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87"
-dependencies = [
- "webpki",
-]
+checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1"
 
 [[package]]
 name = "webpki-roots"
-version = "0.25.4"
+version = "0.26.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1"
+checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958"
+dependencies = [
+ "rustls-pki-types",
+]
 
 [[package]]
 name = "weight-analyzer"
@@ -12475,14 +13052,14 @@ dependencies = [
  "either",
  "home",
  "once_cell",
- "rustix 0.38.34",
+ "rustix 0.38.37",
 ]
 
 [[package]]
 name = "wide"
-version = "0.7.24"
+version = "0.7.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a040b111774ab63a19ef46bbc149398ab372b4ccdcfd719e9814dbd7dfd76c8"
+checksum = "b828f995bf1e9622031f8009f8481a85406ce1f4d4588ff746d872043e855690"
 dependencies = [
  "bytemuck",
  "safe_arch",
@@ -12512,11 +13089,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 
 [[package]]
 name = "winapi-util"
-version = "0.1.8"
+version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b"
+checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
 dependencies = [
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -12550,7 +13127,52 @@ version = "0.52.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
 dependencies = [
- "windows-targets 0.52.5",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-registry"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0"
+dependencies = [
+ "windows-result",
+ "windows-strings",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-result"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
+dependencies = [
+ "windows-result",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
 ]
 
 [[package]]
@@ -12577,7 +13199,16 @@ version = "0.52.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
 dependencies = [
- "windows-targets 0.52.5",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -12612,18 +13243,18 @@ dependencies = [
 
 [[package]]
 name = "windows-targets"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
 dependencies = [
- "windows_aarch64_gnullvm 0.52.5",
- "windows_aarch64_msvc 0.52.5",
- "windows_i686_gnu 0.52.5",
+ "windows_aarch64_gnullvm 0.52.6",
+ "windows_aarch64_msvc 0.52.6",
+ "windows_i686_gnu 0.52.6",
  "windows_i686_gnullvm",
- "windows_i686_msvc 0.52.5",
- "windows_x86_64_gnu 0.52.5",
- "windows_x86_64_gnullvm 0.52.5",
- "windows_x86_64_msvc 0.52.5",
+ "windows_i686_msvc 0.52.6",
+ "windows_x86_64_gnu 0.52.6",
+ "windows_x86_64_gnullvm 0.52.6",
+ "windows_x86_64_msvc 0.52.6",
 ]
 
 [[package]]
@@ -12640,9 +13271,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
 
 [[package]]
 name = "windows_aarch64_gnullvm"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
 
 [[package]]
 name = "windows_aarch64_msvc"
@@ -12658,9 +13289,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
 
 [[package]]
 name = "windows_aarch64_msvc"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
 
 [[package]]
 name = "windows_i686_gnu"
@@ -12676,15 +13307,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
 
 [[package]]
 name = "windows_i686_gnu"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
 
 [[package]]
 name = "windows_i686_gnullvm"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
 
 [[package]]
 name = "windows_i686_msvc"
@@ -12700,9 +13331,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
 
 [[package]]
 name = "windows_i686_msvc"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
 
 [[package]]
 name = "windows_x86_64_gnu"
@@ -12718,9 +13349,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
 
 [[package]]
 name = "windows_x86_64_gnu"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
 
 [[package]]
 name = "windows_x86_64_gnullvm"
@@ -12736,9 +13367,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
 
 [[package]]
 name = "windows_x86_64_gnullvm"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
 
 [[package]]
 name = "windows_x86_64_msvc"
@@ -12754,15 +13385,15 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
 
 [[package]]
 name = "windows_x86_64_msvc"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
 
 [[package]]
 name = "winnow"
-version = "0.5.40"
+version = "0.6.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
+checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b"
 dependencies = [
  "memchr",
 ]
@@ -12797,45 +13428,65 @@ dependencies = [
 
 [[package]]
 name = "x25519-dalek"
-version = "1.1.1"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a0c105152107e3b96f6a00a65e86ce82d9b125230e1c4302940eca58ff71f4f"
+checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277"
 dependencies = [
- "curve25519-dalek 3.2.0",
- "rand_core 0.5.1",
+ "curve25519-dalek",
+ "rand_core",
+ "serde",
  "zeroize",
 ]
 
 [[package]]
-name = "x25519-dalek"
-version = "2.0.1"
+name = "x509-parser"
+version = "0.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277"
+checksum = "7069fba5b66b9193bd2c5d3d4ff12b839118f6bcbef5328efafafb5395cf63da"
 dependencies = [
- "curve25519-dalek 4.1.3",
- "rand_core 0.6.4",
- "serde",
- "zeroize",
+ "asn1-rs 0.5.2",
+ "data-encoding",
+ "der-parser 8.2.0",
+ "lazy_static",
+ "nom",
+ "oid-registry 0.6.1",
+ "rusticata-macros",
+ "thiserror",
+ "time",
 ]
 
 [[package]]
 name = "x509-parser"
-version = "0.14.0"
+version = "0.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8"
+checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69"
 dependencies = [
- "asn1-rs",
- "base64 0.13.1",
+ "asn1-rs 0.6.2",
  "data-encoding",
- "der-parser",
+ "der-parser 9.0.0",
  "lazy_static",
  "nom",
- "oid-registry",
+ "oid-registry 0.7.1",
  "rusticata-macros",
  "thiserror",
  "time",
 ]
 
+[[package]]
+name = "xml-rs"
+version = "0.8.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26"
+
+[[package]]
+name = "xmltree"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb"
+dependencies = [
+ "xml-rs",
+]
+
 [[package]]
 name = "xtask"
 version = "0.1.0"
@@ -12845,12 +13496,12 @@ dependencies = [
  "frame-metadata 16.0.0",
  "graphql_client",
  "hex",
- "memmap2 0.9.4",
+ "memmap2 0.9.5",
  "parity-scale-codec",
  "placeholder",
  "reqwest",
  "scale-info",
- "scale-value",
+ "scale-value 0.14.1",
  "serde",
  "serde_json",
  "tera",
@@ -12861,14 +13512,15 @@ dependencies = [
 
 [[package]]
 name = "yamux"
-version = "0.10.2"
+version = "0.12.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5d9ba232399af1783a58d8eb26f6b5006fbefe2dc9ef36bd283324792d03ea5"
+checksum = "9ed0164ae619f2dc144909a9f082187ebb5893693d8c0196e8085283ccd4b776"
 dependencies = [
  "futures 0.3.30",
  "log",
  "nohash-hasher",
  "parking_lot 0.12.3",
+ "pin-project",
  "rand",
  "static_assertions",
 ]
@@ -12890,22 +13542,23 @@ dependencies = [
 
 [[package]]
 name = "zerocopy"
-version = "0.7.34"
+version = "0.7.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087"
+checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
 dependencies = [
+ "byteorder",
  "zerocopy-derive",
 ]
 
 [[package]]
 name = "zerocopy-derive"
-version = "0.7.34"
+version = "0.7.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b"
+checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -12925,7 +13578,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.66",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -12968,9 +13621,9 @@ dependencies = [
 
 [[package]]
 name = "zstd-sys"
-version = "2.0.11+zstd.1.5.6"
+version = "2.0.13+zstd.1.5.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75652c55c0b6f3e6f12eb786fe1bc960396bf05a1eb3bf1f3691c3610ac2e6d4"
+checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa"
 dependencies = [
  "cc",
  "pkg-config",
diff --git a/Cargo.toml b/Cargo.toml
index c45f48512539fdca202ee7a61b02f03933826ce5..08f95c2c362174222c86df2a3b1b53f086bde0f2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -47,17 +47,17 @@ version = '1.0.0'
 
 [workspace.dependencies]
 # crates.io dependencies
-anyhow = { version = "1.0.79", default-features = false }
+anyhow = { version = "1.0.81", default-features = false }
 countmap = { version = "0.2.0", default-features = false }
-ctrlc = { version = "3.4.2", default-features = false }
+ctrlc = { version = "3.4.4", default-features = false }
 cucumber = { version = "0.20.2", default-features = false }
-env_logger = { version = "0.11.1", default-features = false }
+env_logger = { version = "0.11.3", default-features = false }
 notify = { version = "6.1.1", default-features = false }
 portpicker = { version = "0.1.1", default-features = false }
 notify-debouncer-mini = { version = "0.4.1", default-features = false }
 async-io = { version = "2.3.1", default-features = false }
-async-trait = { version = "0.1.77", default-features = false }
-thiserror = { version = "1.0.56", default-features = false }
+async-trait = { version = "0.1.78", default-features = false }
+thiserror = { version = "1.0.58", default-features = false }
 frame-metadata = { version = "16.0.0", default-features = false }
 graphql_client = { version = "0.10.0" }
 bs58 = { version = "0.5.0", default-features = false }
@@ -66,46 +66,48 @@ getrandom = { version = "0.2.12", default-features = false }
 impl-trait-for-tuples = { version = "0.2.2", default-features = false }
 clap = { version = "4.4.18" }
 clap_complete = { version = "4.4.10" }
-reqwest = { version = "0.11.11", default-features = false, features = ["rustls-tls"] }
+reqwest = { version = "0.12.0", default-features = false, features = [
+    "rustls-tls",
+] }
 glob = { version = "0.3.1", default-features = false }
 convert_case = { version = "0.6.0", default-features = false }
 subweight-core = { version = "3.3.1", default-features = false }
-version_check = { version = "0.9.2", default-features = false }
+version_check = { version = "0.9.4", default-features = false }
 codec = { package = "parity-scale-codec", version = "3.6.9", default-features = false }
-enum-as-inner = { version = "=0.5.1", default-features = false }                        #https://github.com/bluejekyll/trust-dns/issues/1946
+enum-as-inner = { version = "=0.5.1", default-features = false } #https://github.com/bluejekyll/trust-dns/issues/1946
 futures = { version = "0.3.30", default-features = false }
 tera = { version = "1", default-features = false }
 hex = { version = "0.4.3", default-features = false }
-jsonrpsee = { version = "0.16.2", default-features = false }
+jsonrpsee = { version = "0.24.3", default-features = false } # Version should exactly match polkadot one
 lazy_static = { version = "1.4.0", default-features = false }
-log = { version = "0.4.20", default-features = false }
+log = { version = "0.4.21", default-features = false }
 maplit = { version = '1.0.2', default-features = false }
-proc-macro2 = { version = '1.0.76', default-features = false }
+proc-macro2 = { version = '1.0.79', default-features = false }
 quote = { version = '1.0.35', default-features = false }
-syn = { version = '2.0.48', default-features = false }
+syn = { version = '2.0.53', default-features = false }
 memmap2 = { version = "0.9.4", default-features = false }
 num-format = { version = "0.4.4", default-features = false }
-smallvec = { version = "1.13.1", default-features = false }
+smallvec = { version = "1.13.2", default-features = false }
 hex-literal = { version = '0.4.1', default-features = false }
-scale-info = { version = "2.10.0", default-features = false }
-scale-value = { version = "0.13.0", default-features = false }
-serde = { version = "1.0.196", default-features = false }
-serde_derive = { version = "1.0.196", default-features = false }
-serde_yaml = { version = "0.9.27", default-features = false }
-serde_json = { version = "1.0.64", default-features = false }
+scale-info = { version = "2.11.0", default-features = false }
+scale-value = { version = "0.14.1", default-features = false }
+serde = { version = "1.0.197", default-features = false }
+serde_derive = { version = "1.0.197", default-features = false }
+serde_yaml = { version = "0.9.33", default-features = false }
+serde_json = { version = "1.0.114", default-features = false }
 fnv = { version = "1.0.7", default-features = false }
-tokio = { version = "1.35.1", default-features = false }
-time = { version = "0.3.31", default-features = false }
-time-macros = { version = "0.2.16", default-features = false }
-num-traits = { version = "0.2.17", default-features = false }
-rayon = { version = "1.8.1", default-features = false }
+tokio = { version = "1.36.0", default-features = false }
+time = { version = "0.3.34", default-features = false }
+time-macros = { version = "0.2.17", default-features = false }
+num-traits = { version = "0.2.18", default-features = false }
+rayon = { version = "1.9.0", default-features = false }
 simple_logger = { version = "4.3.3", default-features = false }
 bincode = { version = "1.3.3", default-features = false }
 dubp-wot = { version = "0.11.1", default-features = false }
 flate2 = { version = "1.0.28", default-features = false }
 
 # Subxt
-subxt = { git = 'https://github.com/duniter/subxt', branch = 'subxt-v0.34.0-duniter-substrate-v1.6.0', default-features = false }
+subxt = { git = 'https://github.com/duniter/subxt', branch = 'subxt-v0.37.0-duniter-substrate-v1.16.0', default-features = false }
 
 # local dependencies
 weight-analyzer = { path = "resources/weight_analyzer", default-features = false }
@@ -137,86 +139,86 @@ sp-distance = { path = 'primitives/distance', default-features = false }
 sp-membership = { path = 'primitives/membership', default-features = false }
 
 # substrate dependencies
-pallet-transaction-payment-rpc = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-frame-benchmarking = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-frame-executive = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-frame-support = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-frame-system = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-frame-system-benchmarking = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-frame-system-rpc-runtime-api = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-frame-try-runtime = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-atomic-swap = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-authority-discovery = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-authorship = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-babe = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-balances = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-collective = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-grandpa = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-im-online = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-multisig = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-preimage = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-proxy = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-scheduler = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-session = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-sudo = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-timestamp = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-transaction-payment = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-transaction-payment-rpc-runtime-api = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-treasury = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-pallet-utility = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-api = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-arithmetic = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-block-builder = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-client-db = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-client-api = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-consensus-grandpa = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-consensus-babe = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-consensus-babe-rpc = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-blockchain = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-offchain = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-try-runtime-cli = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-consensus-babe = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-consensus-grandpa = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-core = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-inherents = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-offchain = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-runtime = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-session = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-std = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-staking = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-weights = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-transaction-pool = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-version = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-cli = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-service = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-trie = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-authority-discovery = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-genesis-builder = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-keyring = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-consensus = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-core-hashing = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-keystore = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-rpc-api = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-substrate-wasm-builder = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-io = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-substrate-build-script-utils = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0' }
-node-primitives = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-frame-benchmarking-cli = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-chain-spec = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-consensus = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-consensus-manual-seal = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-executor = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-telemetry = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-transaction-pool = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-basic-authorship = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-network = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-keystore = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-storage = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-timestamp = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-transaction-storage-proof = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sc-transaction-pool-api = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-sp-state-machine = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
-substrate-frame-rpc-system = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
+pallet-transaction-payment-rpc = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+frame-benchmarking = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+frame-executive = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+frame-support = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+frame-system = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+frame-system-benchmarking = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+frame-system-rpc-runtime-api = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+frame-try-runtime = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-atomic-swap = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-authority-discovery = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-authorship = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-babe = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-balances = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-collective = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-grandpa = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-im-online = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-multisig = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-preimage = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-proxy = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-scheduler = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-session = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-sudo = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-timestamp = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-transaction-payment = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-transaction-payment-rpc-runtime-api = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-treasury = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+pallet-utility = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-api = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-arithmetic = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-block-builder = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-client-db = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-client-api = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-consensus-grandpa = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-rpc = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-consensus-grandpa-rpc = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-consensus-babe = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-consensus-babe-rpc = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-blockchain = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-offchain = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-consensus-babe = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-consensus-grandpa = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-core = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-inherents = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-offchain = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-runtime = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-session = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-staking = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-weights = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-transaction-pool = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-version = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-cli = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-service = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-trie = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-authority-discovery = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-genesis-builder = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-keyring = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-consensus = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-core-hashing = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-keystore = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-rpc-api = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+substrate-wasm-builder = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-io = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+substrate-build-script-utils = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0' }
+node-primitives = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+frame-benchmarking-cli = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-chain-spec = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-consensus = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-consensus-manual-seal = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-executor = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-telemetry = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-transaction-pool = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-basic-authorship = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-network = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-keystore = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-storage = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-timestamp = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-transaction-storage-proof = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sc-transaction-pool-api = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+sp-state-machine = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
+substrate-frame-rpc-system = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.16.0', default-features = false }
 
 # The list of dependencies below (which can be both direct and indirect dependencies) are crates
 # that are suspected to be CPU-intensive, and that are unlikely to require debugging (as some of
@@ -242,7 +244,6 @@ crossbeam-deque = { opt-level = 3 }
 crypto-mac = { opt-level = 3 }
 curve25519-dalek = { opt-level = 3 }
 ed25519-dalek = { opt-level = 3 }
-flate2 = { opt-level = 3 }
 futures-channel = { opt-level = 3 }
 hashbrown = { opt-level = 3 }
 hash-db = { opt-level = 3 }
@@ -268,7 +269,6 @@ smallvec = { opt-level = 3 }
 snow = { opt-level = 3 }
 twox-hash = { opt-level = 3 }
 uint = { opt-level = 3 }
-wasmi = { opt-level = 3 }
 x25519-dalek = { opt-level = 3 }
 yamux = { opt-level = 3 }
 zeroize = { opt-level = 3 }
diff --git a/README.md b/README.md
index e0f90e8b379a7cf4ffa0faef05677e90e4d97cae..513381125b9ed7e92c3a3a96f443a8c093f2f21a 100644
--- a/README.md
+++ b/README.md
@@ -22,11 +22,14 @@
   - [api](./docs/api/)
     - [manual](./docs/api/manual.md)
     - [runtime-calls](./docs/api/runtime-calls.md) the calls you can submit through the RPC API
+    - [runtime-errors](./docs/api/runtime-errors.md) the errors you can get submitting a call
+    - [runtime-events](./docs/api/runtime-events.md) the events you can get submitting a call
   - [dev](./docs/dev/)
     - [beginner-walkthrough](./docs/dev/beginner-walkthrough.md)
     - [git-conventions](./docs/dev/git-conventions.md)
     - [launch-a-live-network](./docs/dev/launch-a-live-network.md)
     - [setup](./docs/dev/setup.md)
+    - [compilation features](./docs/dev/compilation.md)
     - [verify-runtime-code](./docs/dev/verify-runtime-code.md)
     - [weights-benchmarking](./docs/dev/weights-benchmarking.md)
     - [upgrade-substrate](./docs/dev/upgrade-substrate.md)
@@ -34,9 +37,12 @@
     - [replay-block](./docs/test/replay-block.md)
   - [user](./docs/user/)
     - [autocompletion](./docs/user/autocompletion.md)
-    - [build-for-arm](./docs/user/build-for-arm.md)
     - [mirror](./docs/user/mirror.md) deploy a permanent ǦDev mirror node
     - [smith](./docs/user/smith.md) deploy a permanent ǦDev validator node
+    - [debian installation](./docs/user/installation_debian.md)
+  - [packaging](./docs/packaging/)
+    - [build-for-arm](./docs/packaging/build-for-arm.md)
+    - [build-debian](./docs/packaging/build-deb.md) build a native Debian package
 - [end2end-tests](./end2end-tests/) automated end to end tests written with cucumber
 - [live-tests](./live-tests/) sanity checks to test the storage of a live chain
 
@@ -169,8 +175,7 @@ If you want to see the multi-node consensus algorithm in action, refer to
   --chain local \
   --alice \
   --port 30333 \
-  --ws-port 9945 \
-  --rpc-port 9933 \
+  --rpc-port 9944 \
   --node-key 0000000000000000000000000000000000000000000000000000000000000001 \
   --validator
 ```
@@ -183,8 +188,7 @@ If you want to see the multi-node consensus algorithm in action, refer to
   --chain local \
   --bob \
   --port 30334 \
-  --ws-port 9946 \
-  --rpc-port 9934 \
+  --rpc-port 9945 \
   --validator \
   --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp
 ```
diff --git a/client/distance/src/lib.rs b/client/distance/src/lib.rs
index f2b29cbe9786b9f96b1e7238673da787baf25fe7..85885d33903d745f02f74ce962e485c3dbf0207c 100644
--- a/client/distance/src/lib.rs
+++ b/client/distance/src/lib.rs
@@ -14,10 +14,8 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Substrate-Libre-Currency. If not, see <https://www.gnu.org/licenses/>.
 
-use codec::{Decode, Encode};
 use frame_support::pallet_prelude::*;
 use sc_client_api::{ProvideUncles, StorageKey, StorageProvider};
-use scale_info::TypeInfo;
 use sp_runtime::{generic::BlockId, traits::Block as BlockT, AccountId32};
 use std::path::PathBuf;
 
@@ -42,57 +40,69 @@ where
     Backend: sc_client_api::Backend<B>,
     IdtyIndex: Decode + Encode + PartialEq + TypeInfo,
 {
-    let &[owner_key] = owner_keys else {
-        log::error!("🧙 [distance oracle] More than one Babe owner key: oracle cannot work");
-        return Ok(sp_distance::InherentDataProvider::<IdtyIndex>::new(None));
-    };
-    let owner_key = sp_runtime::AccountId32::new(owner_key.0);
-
-    let session_index = client
+    // Retrieve the pool_index from storage. If storage is inaccessible or the data is corrupted,
+    // return the appropriate error.
+    let pool_index = client
         .storage(
             parent,
             &StorageKey(
-                frame_support::storage::storage_prefix(b"Session", b"CurrentIndex").to_vec(),
+                frame_support::storage::storage_prefix(b"Distance", b"CurrentPoolIndex").to_vec(),
             ),
-        )
-        .expect("CurrentIndex is Err")
-        .map_or(0, |raw| {
-            u32::decode(&mut &raw.0[..]).expect("cannot decode CurrentIndex")
-        });
+        )?
+        .map_or_else(
+            || {
+                Err(sc_client_api::blockchain::Error::Storage(
+                    "CurrentPoolIndex value not found".to_string(),
+                ))
+            },
+            |raw| {
+                u32::decode(&mut &raw.0[..])
+                    .map_err(|e| sc_client_api::blockchain::Error::from_state(Box::new(e)))
+            },
+        )?;
 
+    // Retrieve the published_results from storage.
+    // Return an error if the storage is inaccessible.
+    // If accessible, continue execution. If None, it means there are no published_results at this block.
     let published_results = client
         .storage(
             parent,
             &StorageKey(
                 frame_support::storage::storage_prefix(
                     b"Distance",
-                    match session_index % 3 {
-                        0 => b"StoragePublishedResults1",
-                        1 => b"StoragePublishedResults2",
-                        2 => b"StoragePublishedResults0",
-                        _ => unreachable!("n%3<3"),
+                    match pool_index {
+                        0 => b"EvaluationPool0",
+                        1 => b"EvaluationPool1",
+                        2 => b"EvaluationPool2",
+                        _ => unreachable!("n<3"),
                     },
                 )
                 .to_vec(),
             ),
         )?
-        .map_or_else(Default::default, |raw| {
-            pallet_distance::EvaluationPool::<AccountId32, IdtyIndex>::decode(&mut &raw.0[..])
-                .expect("cannot decode EvaluationPool")
+        .and_then(|raw| {
+            pallet_distance::EvaluationPool::<AccountId32, IdtyIndex>::decode(&mut &raw.0[..]).ok()
         });
 
-    // Have we already published a result for this session?
-    if published_results.evaluators.contains(&owner_key) {
-        log::debug!("🧙 [distance oracle] Already published a result for this session");
-        return Ok(sp_distance::InherentDataProvider::<IdtyIndex>::new(None));
+    // Have we already published a result for this period?
+    // The block author is guaranteed to be in the owner_keys.
+    if let Some(results) = published_results {
+        if owner_keys
+            .iter()
+            .map(|&key| sp_runtime::AccountId32::new(key.0))
+            .any(|key| results.evaluators.contains(&key))
+        {
+            log::debug!("🧙 [distance oracle] Already published a result for this period");
+            return Ok(sp_distance::InherentDataProvider::<IdtyIndex>::new(None));
+        }
     }
 
     // Read evaluation result from file, if it exists
     log::debug!(
         "🧙 [distance oracle] Reading evaluation result from file {:?}",
-        distance_dir.clone().join(session_index.to_string())
+        distance_dir.clone().join(pool_index.to_string())
     );
-    let evaluation_result = match std::fs::read(distance_dir.join(session_index.to_string())) {
+    let evaluation_result = match std::fs::read(distance_dir.join(pool_index.to_string())) {
         Ok(data) => data,
         Err(e) => {
             match e.kind() {
diff --git a/distance-oracle/src/api.rs b/distance-oracle/src/api.rs
index fae73cdd7228e957e9da25c318bcc4d686f70d19..99e6b6f518e9a2de9d3dba6f4499b8e647486905 100644
--- a/distance-oracle/src/api.rs
+++ b/distance-oracle/src/api.rs
@@ -40,38 +40,38 @@ pub async fn parent_hash(client: &Client) -> H256 {
         .hash()
 }
 
-pub async fn current_session(client: &Client, parent_hash: H256) -> u32 {
+pub async fn current_pool_index(client: &Client, parent_hash: H256) -> u32 {
     client
         .storage()
         .at(parent_hash)
-        .fetch(&runtime::storage().session().current_index())
+        .fetch(&runtime::storage().distance().current_pool_index())
         .await
-        .expect("Cannot fetch current session")
+        .expect("Cannot fetch current pool index")
         .unwrap_or_default()
 }
 
 pub async fn current_pool(
     client: &Client,
     parent_hash: H256,
-    current_session: u32,
+    current_pool_index: u32,
 ) -> Option<runtime::runtime_types::pallet_distance::types::EvaluationPool<AccountId, IdtyIndex>> {
     client
         .storage()
         .at(parent_hash)
-        .fetch(&match current_session % 3 {
+        .fetch(&match current_pool_index {
             0 => {
-                debug!("Looking at Pool1 for session {}", current_session);
+                debug!("Looking at Pool1 for pool index {}", current_pool_index);
                 runtime::storage().distance().evaluation_pool1()
             }
             1 => {
-                debug!("Looking at Pool2 for session {}", current_session);
+                debug!("Looking at Pool2 for pool index {}", current_pool_index);
                 runtime::storage().distance().evaluation_pool2()
             }
             2 => {
-                debug!("Looking at Pool0 for session {}", current_session);
+                debug!("Looking at Pool0 for pool index {}", current_pool_index);
                 runtime::storage().distance().evaluation_pool0()
             }
-            _ => unreachable!("n%3<3"),
+            _ => unreachable!("n<3"),
         })
         .await
         .expect("Cannot fetch current pool")
@@ -106,17 +106,26 @@ pub async fn member_iter(client: &Client, evaluation_block: H256) -> MemberIter
 }
 
 pub struct MemberIter(
-    subxt::backend::StreamOfResults<(
-        Vec<u8>,
-        runtime::runtime_types::sp_membership::MembershipData<u32>,
-    )>,
+    subxt::backend::StreamOfResults<
+        subxt::storage::StorageKeyValuePair<
+            subxt::storage::StaticAddress<
+                (),
+                runtime::runtime_types::sp_membership::MembershipData<u32>,
+                (),
+                (),
+                subxt::utils::Yes,
+            >,
+        >,
+    >,
 );
 
 impl MemberIter {
     pub async fn next(&mut self) -> Result<Option<IdtyIndex>, subxt::error::Error> {
-        self.0.next().await.transpose().map(|i| {
-            i.map(|(storage_key, _membership_data)| idty_id_from_storage_key(&storage_key))
-        })
+        self.0
+            .next()
+            .await
+            .transpose()
+            .map(|i| i.map(|j| idty_id_from_storage_key(&j.key_bytes)))
     }
 }
 
@@ -131,15 +140,29 @@ pub async fn cert_iter(client: &Client, evaluation_block: H256) -> CertIter {
     )
 }
 
-pub struct CertIter(subxt::backend::StreamOfResults<(Vec<u8>, Vec<(IdtyIndex, u32)>)>);
+pub struct CertIter(
+    subxt::backend::StreamOfResults<
+        subxt::storage::StorageKeyValuePair<
+            subxt::storage::StaticAddress<
+                (),
+                Vec<(u32, u32)>,
+                (),
+                subxt::utils::Yes,
+                subxt::utils::Yes,
+            >,
+        >,
+    >,
+);
 
 impl CertIter {
     pub async fn next(
         &mut self,
     ) -> Result<Option<(IdtyIndex, Vec<(IdtyIndex, u32)>)>, subxt::error::Error> {
-        self.0.next().await.transpose().map(|i| {
-            i.map(|(storage_key, issuers)| (idty_id_from_storage_key(&storage_key), issuers))
-        })
+        self.0
+            .next()
+            .await
+            .transpose()
+            .map(|i| i.map(|j| (idty_id_from_storage_key(&j.key_bytes), j.value)))
     }
 }
 
diff --git a/distance-oracle/src/lib.rs b/distance-oracle/src/lib.rs
index 955759efd0ebc69ab5d9eb64a04f7ee71feef90a..965ed8b20ee0d8f79eb261600ae948536b466559 100644
--- a/distance-oracle/src/lib.rs
+++ b/distance-oracle/src/lib.rs
@@ -29,10 +29,8 @@ use api::{AccountId, IdtyIndex};
 use codec::Encode;
 use fnv::{FnvHashMap, FnvHashSet};
 use log::{debug, error, info, warn};
-use rayon::iter::IntoParallelRefIterator;
-use rayon::iter::ParallelIterator;
-use std::io::Write;
-use std::path::PathBuf;
+use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
+use std::{io::Write, path::PathBuf};
 
 // TODO select metadata file using features
 #[subxt::subxt(runtime_metadata_path = "../resources/metadata.scale")]
@@ -51,6 +49,7 @@ impl subxt::config::Config for RuntimeConfig {
     type Signature = subxt::ext::sp_runtime::MultiSignature;
 }
 
+/// Represents a tipping amount.
 #[derive(Copy, Clone, Debug, Default, Encode)]
 pub struct Tip {
     #[codec(compact)]
@@ -69,6 +68,7 @@ impl From<u64> for Tip {
     }
 }
 
+/// Represents configuration parameters.
 pub struct Settings {
     pub evaluation_result_dir: PathBuf,
     pub rpc_url: String,
@@ -83,8 +83,9 @@ impl Default for Settings {
     }
 }
 
+/// Asynchronously runs a computation using the provided client and saves the result to a file.
 pub async fn run_and_save(client: &api::Client, settings: Settings) {
-    let Some((evaluation, current_session, evaluation_result_path)) =
+    let Some((evaluation, current_pool_index, evaluation_result_path)) =
         run(client, &settings, true).await
     else {
         return;
@@ -127,8 +128,8 @@ pub async fn run_and_save(client: &api::Client, settings: Settings) {
         .flatten()
     {
         if let Ok(entry_name) = entry.file_name().into_string() {
-            if let Ok(entry_session) = entry_name.parse::<isize>() {
-                if current_session as isize - entry_session > 3 {
+            if let Ok(entry_pool) = entry_name.parse::<isize>() {
+                if current_pool_index as isize - entry_pool > 3 {
                     files_to_remove.push(entry.path());
                 }
             }
@@ -140,7 +141,8 @@ pub async fn run_and_save(client: &api::Client, settings: Settings) {
     });
 }
 
-/// Returns `Option<(evaluation, current_session, evaluation_result_path)>`
+/// Asynchronously runs a computation based on the provided client and settings.
+/// Returns `Option<(evaluation, current_pool_index, evaluation_result_path)>`.
 pub async fn run(
     client: &api::Client,
     settings: &Settings,
@@ -150,10 +152,10 @@ pub async fn run(
 
     let max_depth = api::max_referee_distance(client).await;
 
-    let current_session = api::current_session(client, parent_hash).await;
+    let current_pool_index = api::current_pool_index(client, parent_hash).await;
 
     // Fetch the pending identities
-    let Some(evaluation_pool) = api::current_pool(client, parent_hash, current_session).await
+    let Some(evaluation_pool) = api::current_pool(client, parent_hash, current_pool_index).await
     else {
         info!("Nothing to do: Pool does not exist");
         return None;
@@ -167,7 +169,7 @@ pub async fn run(
 
     let evaluation_result_path = settings
         .evaluation_result_dir
-        .join((current_session + 1).to_string());
+        .join((current_pool_index + 1).to_string());
 
     if handle_fs {
         // Stop if already evaluated
@@ -187,7 +189,7 @@ pub async fn run(
         });
     }
 
-    info!("Evaluating distance for session {}", current_session);
+    info!("Evaluating distance for pool {}", current_pool_index);
     let evaluation_block = api::evaluation_block(client, parent_hash).await;
 
     // member idty -> issued certs
@@ -243,7 +245,7 @@ pub async fn run(
         .map(|(idty, _)| distance_rule(&received_certs, &referees, max_depth, *idty))
         .collect();
 
-    Some((evaluation, current_session, evaluation_result_path))
+    Some((evaluation, current_pool_index, evaluation_result_path))
 }
 
 fn distance_rule_recursive(
diff --git a/distance-oracle/src/mock.rs b/distance-oracle/src/mock.rs
index 805ac607bc72e49d9824dd9dbc510f4f820b71d3..b21f4e796a97b054336a95753bb376dccb255f49 100644
--- a/distance-oracle/src/mock.rs
+++ b/distance-oracle/src/mock.rs
@@ -46,7 +46,7 @@ pub async fn parent_hash(_client: &Client) -> H256 {
     Default::default()
 }
 
-pub async fn current_session(_client: &Client, _parent_hash: H256) -> u32 {
+pub async fn current_pool_index(_client: &Client, _parent_hash: H256) -> u32 {
     0
 }
 
@@ -64,7 +64,10 @@ pub async fn current_pool(
             .zip(0..client.pool_len)
             .map(|(wot_id, _)| {
                 (wot_id.0 as IdtyIndex, unsafe {
-                    std::mem::transmute((Vec::<()>::new(), Option::<u32>::None, 0))
+                    std::mem::transmute::<
+                        (std::vec::Vec<()>, std::option::Option<u32>, i32),
+                        MedianAcc<Perbill>,
+                    >((Vec::<()>::new(), Option::<u32>::None, 0))
                 })
             })
             .collect(),),
diff --git a/docker-compose.yml b/docker-compose.yml
index d50ab885b495d91f249beefd5b0adb156e30dd27..85dac1986254ae50a35fd08e9e303dcd59edf593 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,38 +1,25 @@
-# This is a minimal docker-compose.yml template for running a Duniter instance
+# This is a minimal docker-compose.yml template for running a Duniter mirror node
 # For more detailed examples, look at docker/compose folder
-
-version: "3.5"
-
 services:
-  duniter-v2s:
-    container_name: duniter-v2s
-    # choose the version of the image here
-    image: duniter/duniter-v2s:latest
+  duniter-v2s-mirror:
+    container_name: duniter-v2s-mirror
+    # the image tells which network you are connecting to
+    # here it is gdev network
+    image: duniter/duniter-v2s-gdev:latest
     ports:
-      # telemetry
+      # prometheus telemetry to monitor resource use
       - 9615:9615
-      # rpc
-      - 9933:9933
-      # rpc-ws
+      # RPC API (ws and http)
       - 9944:9944
-      # p2p
+      # public p2p endpoint
       - 30333:30333
     environment:
-      DUNITER_NODE_NAME: "duniter_local"
-      DUNITER_CHAIN_NAME: "gdev"
-    volumes:
-      - duniter-local-data:/var/lib/duniter
-  distance-oracle:
-    container_name: distance-oracle
-    # choose the version of the image here
-    image: duniter/duniter-v2s:latest
-    entrypoint: docker-distance-entrypoint
-    environment:
-      ORACLE_RPC_URL: "ws://duniter-v2s:9944"
-      ORACLE_RESULT_DIR: "/var/lib/duniter/chains/gdev/distance/"
-      ORACLE_EXECUTION_INTERVAL: "1800"
-      ORACLE_MAX_DEPTH: "5"
-      ORACLE_LOG_LEVEL: "info"
+      # read https://duniter.org/wiki/duniter-v2/configure-docker/
+      # to configure these
+      DUNITER_NODE_NAME: duniter_local
+      DUNITER_CHAIN_NAME: gdev
+      DUNITER_PUBLIC_ADDR: /dns/your.domain.name/tcp/30333
+      DUNITER_LISTEN_ADDR: /ip4/0.0.0.0/tcp/30333
     volumes:
       - duniter-local-data:/var/lib/duniter
 
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 3553f19723c592e18bb0f7044c19836ce2799853..de4215ee03149c605324709f97160353fd3fb626 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -53,8 +53,8 @@ ARG chain="gdev"
 RUN set -x && \
     cat /root/dynenv && \
     . /root/dynenv && \
-    cargo build --locked $CARGO_OPTIONS --no-default-features $BENCH_OPTIONS --features $chain --target "$RUST_ARCH_TRIPLET" && \
-    cargo build --locked $CARGO_OPTIONS --target "$RUST_ARCH_TRIPLET" --package distance-oracle && \
+    cargo build -Zgit=shallow-deps --locked $CARGO_OPTIONS --no-default-features $BENCH_OPTIONS --features $chain --target "$RUST_ARCH_TRIPLET" && \
+    cargo build -Zgit=shallow-deps --locked $CARGO_OPTIONS --target "$RUST_ARCH_TRIPLET" --package distance-oracle && \
     mkdir -p build && \
     mv target/$RUST_ARCH_TRIPLET/$TARGET_FOLDER/duniter build/ && \
     mv target/$RUST_ARCH_TRIPLET/$TARGET_FOLDER/distance-oracle build/
@@ -63,7 +63,7 @@ RUN set -x && \
 ARG cucumber=0
 RUN if [ "$cucumber" != 0 ] && [ "$TARGETPLATFORM" = "$BUILDPLATFORM" ]; then \
         cargo ta && \
-        cargo test --workspace --exclude duniter-end2end-tests --exclude duniter-live-tests --features=runtime-benchmarks,constant-fees \
+        cargo test -Zgit=shallow-deps --workspace --exclude duniter-end2end-tests --exclude duniter-live-tests --features=runtime-benchmarks,constant-fees \
         cd target/debug/deps/ && \
         rm cucumber_tests-*.d && \
         mv cucumber_tests* ../../../build/duniter-cucumber; \
@@ -88,8 +88,8 @@ RUN apt-get clean && rm -rf /var/lib/apt/lists/*
 RUN adduser --home /var/lib/duniter duniter
 
 # Configuration
-# rpc, rpc-ws, p2p, telemetry
-EXPOSE 9933 9944 30333 9615
+# rpc, p2p, telemetry
+EXPOSE 9944 30333 9615
 VOLUME /var/lib/duniter
 ENTRYPOINT ["docker-entrypoint"]
 USER duniter
diff --git a/docker/README.md b/docker/README.md
index 3f7791239ad9ad925d8ccab8945044d8a2d1ff50..0110be191582010114cf4ac6e164a318b8f03405 100644
--- a/docker/README.md
+++ b/docker/README.md
@@ -16,9 +16,7 @@ services:
     ports:
       # Prometheus endpoint
       - 9615:9615
-      # rpc via http
-      - 9933:9933
-      # rpc via websocket
+      # rpc
       - 9944:9944
       # p2p
       - 30333:30333
@@ -60,20 +58,21 @@ volumes:
 ## Environment variables
 
 | Name                         | Description                                                                                                                                                                                                                                                                                                                                          | Default                                                                                     |
-|------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|
+| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
 | `DUNITER_NODE_NAME`          | The node name. This name will appear on the Substrate telemetry server when telemetry is enabled.                                                                                                                                                                                                                                                    | Random name                                                                                 |
 | `DUNITER_CHAIN_NAME`         | The currency to process. "gdev" uses the embeded chainspec. A path allows to use a local json raw chainspec.                                                                                                                                                                                                                                         | `dev` (development mode)                                                                    |
 | `DUNITER_PUBLIC_ADDR`        | The libp2p public address base. See [libp2p documentation](https://docs.libp2p.io/concepts/fundamentals/addressing/). This variable is useful when the node is behind a reverse proxy with its ports not directly exposed.<br>Note: the `p2p/<peer_id>` part of the address shouldn't be set in this variable. It is automatically added by Duniter. | duniter-v2s guesses one from the node's IPv4 address.                                       |
-| `DUNITER_LISTEN_ADDR`        | The libp2p listen address. See [libp2p documentation](https://docs.libp2p.io/concepts/fundamentals/addressing/). This variable is useful when running a validator node behind a reverse proxy, to force the P2P end point in websocket mode with:<br>  `DUNITER_LISTEN_ADDR=/ip4/0.0.0.0/tcp/30333/ws`                                               | Non validator node: `/ip4/0.0.0.0/tcp/30333/ws`<br>Validator node: `/ip4/0.0.0.0/tcp/30333` |
+| `DUNITER_LISTEN_ADDR`        | The libp2p listen address. See [libp2p documentation](https://docs.libp2p.io/concepts/fundamentals/addressing/). This variable is useful when running a validator node behind a reverse proxy, to force the P2P end point in websocket mode with:<br> `DUNITER_LISTEN_ADDR=/ip4/0.0.0.0/tcp/30333/ws`                                                | Non validator node: `/ip4/0.0.0.0/tcp/30333/ws`<br>Validator node: `/ip4/0.0.0.0/tcp/30333` |
 | `DUNITER_RPC_CORS`           | Value of the polkadot `--rpc-cors` option.                                                                                                                                                                                                                                                                                                           | `all`                                                                                       |
 | `DUNITER_VALIDATOR`          | Boolean (`true` / `false`) to run the node in validator mode. Configure the polkadot options `--validator --rpc-methods Unsafe`.                                                                                                                                                                                                                     | `false`                                                                                     |
 | `DUNITER_DISABLE_PROMETHEUS` | Boolean to disable the Prometheus endpoint on port 9615.                                                                                                                                                                                                                                                                                             | `false`                                                                                     |
 | `DUNITER_DISABLE_TELEMETRY`  | Boolean to disable connecting to the Substrate telemetry server.                                                                                                                                                                                                                                                                                     | `false`                                                                                     |
-| `DUNITER_PRUNING_PROFILE`    | * `default`<br> * `archive`: keep all blocks and state blocks<br> * `light`: keep only last 256 state blocks and last 14400 blocks (one day duration)                                                                                                                                                                                                | `default`                                                                                   |
+| `DUNITER_PRUNING_PROFILE`    | _ `default`<br> _ `archive`: keep all blocks and state blocks<br> \* `light`: keep only last 256 state blocks and last 14400 blocks (one day duration)                                                                                                                                                                                               | `default`                                                                                   |
 
 ## Other Duniter options
 
 You can pass any other option to Duniter using the `command` docker-compose element:
+
 ```
     command:
       # workaround for substrate issue #12073
@@ -92,6 +91,7 @@ docker compose up -d
 ## Running duniter subcommands or custom set of options
 
 To run duniter from the command line without the default configuration detailed in the "Environment variables" section use `--` as the first argument. For example:
+
 ```
 $ docker run --rm duniter/duniter-v2s-gdev:latest -- key generate
 $ docker run --rm duniter/duniter-v2s-gdev:latest -- --chain gdev ...
diff --git a/docker/build-deb.Dockerfile b/docker/build-deb.Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..6fb06a3bc50795b2933ffee6b3df931a860ae7c4
--- /dev/null
+++ b/docker/build-deb.Dockerfile
@@ -0,0 +1,37 @@
+FROM paritytech/ci-linux:production
+
+# Set the working directory
+WORKDIR /app/
+
+# Copy the toolchain
+COPY rust-toolchain.toml ./
+
+# Install toolchain, substrate and cargo-deb with cargo cache
+RUN --mount=type=cache,target=/root/.cargo \
+    cargo install cargo-deb
+
+# Create a dummy project to cache dependencies
+COPY Cargo.toml .
+COPY rust-toolchain.toml ./
+RUN --mount=type=cache,target=/app/target \
+    --mount=type=cache,target=/root/.cargo/registry \
+    mkdir src && \
+    sed -i '/git = \|version = /!d' Cargo.toml && \
+    sed -i 's/false/true/' Cargo.toml && \
+    sed -i '1s/^/\[package\]\nname\=\"Dummy\"\n\[dependencies\]\n/' Cargo.toml && \
+    echo "fn main() {}" > src/main.rs && \
+    cargo build -Zgit=shallow-deps --release && \
+    rm -rf src Cargo.lock Cargo.toml
+
+# Copy the entire project
+COPY . .
+
+# Build the project and create Debian packages
+RUN --mount=type=cache,target=/app/target \
+    --mount=type=cache,target=/root/.cargo/registry \
+    cargo build -Zgit=shallow-deps --release && \
+    cargo deb --no-build -p duniter && \
+    cp -r ./target/debian/ ./
+
+# Clean up unnecessary files to reduce image size
+RUN rm -rf /app/target/release /root/.cargo/registry
diff --git a/docker/compose/docker-compose.smith.yml b/docker/compose/docker-compose.smith.yml
new file mode 100644
index 0000000000000000000000000000000000000000..cf36c98ed0cd71ba368011871b9750592a31e0e8
--- /dev/null
+++ b/docker/compose/docker-compose.smith.yml
@@ -0,0 +1,37 @@
+# docker-compose.yml template for running a Duniter smith node
+# for more doc, see https://duniter.org/wiki/duniter-v2/
+services:
+  # duniter smith node
+  duniter-v2s-smith:
+    container_name: duniter-v2s-smith
+    image: duniter/duniter-v2s-gdev:latest
+    ports:
+      # RPC API of a smith node should not be exposed publicly!
+      - 127.0.0.1:9944:9944
+      # public p2p endpoint
+      - 30333:30333
+    environment:
+      DUNITER_NODE_NAME: duniter_smith
+      DUNITER_CHAIN_NAME: gdev
+      DUNITER_VALIDATOR: true
+      DUNITER_PRUNING_PROFILE: light
+      DUNITER_PUBLIC_ADDR: /dns/your.domain.name/tcp/30333
+      DUNITER_LISTEN_ADDR: /ip4/0.0.0.0/tcp/30333
+    volumes:
+      - duniter-smith-data:/var/lib/duniter
+  # distance oracle
+  distance-oracle:
+    container_name: distance-oracle
+    # choose the version of the image here
+    image: duniter/duniter-v2s-gdev:latest
+    entrypoint: docker-distance-entrypoint
+    environment:
+      ORACLE_RPC_URL: ws://duniter-v2s-smith:9944
+      ORACLE_RESULT_DIR: /var/lib/duniter/chains/gdev/distance/
+      ORACLE_EXECUTION_INTERVAL: 1800
+      ORACLE_LOG_LEVEL: info
+    volumes:
+      - duniter-smith-data:/var/lib/duniter
+
+volumes:
+  duniter-smith-data:
diff --git a/docker/compose/live-template.docker-compose.yml b/docker/compose/live-template.docker-compose.yml
deleted file mode 100644
index 8c2aba285224ba0aacfe1919deb46475bde044ea..0000000000000000000000000000000000000000
--- a/docker/compose/live-template.docker-compose.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-# this template is used in /scripts/create-live-network.sh script
-
-version: "3.5"
-
-services:
-  duniter-rpc:
-    image: duniter/duniter-v2s:DUNITER_IMAGE_TAG
-    restart: unless-stopped
-    ports:
-      - "9944:9944"
-      - "30333:30333"
-    volumes:
-      - ./duniter-rpc/:/var/lib/duniter/
-    environment:
-      - DUNITER_CHAIN_NAME=/var/lib/duniter/CURRENCY-raw.json
-    command:
-      - "--bootnodes"
-      - "/dns/duniter-validator/tcp/30333/p2p/VALIDATOR_NODE_KEY"
-
-  duniter-validator:
-    image: duniter/duniter-v2s:DUNITER_IMAGE_TAG
-    restart: unless-stopped
-    ports:
-      - "127.0.0.1:9945:9944"
-      - "30334:30333"
-    volumes:
-      - ./duniter-validator/:/var/lib/duniter/
-    environment:
-      - DUNITER_CHAIN_NAME=/var/lib/duniter/CURRENCY-raw.json
-      - DUNITER_VALIDATOR=true
-    command:
-      - "--bootnodes"
-      - "/dns/duniter-rpc/tcp/30333/p2p/RPC_NODE_KEY"
diff --git a/docs/api/runtime-calls.md b/docs/api/runtime-calls.md
index 21d0d0a3236d90a80e9d464416410064625b9d34..3ab03a9326b6db1555a061be6a0dc5cd63c3f172 100644
--- a/docs/api/runtime-calls.md
+++ b/docs/api/runtime-calls.md
@@ -13,7 +13,7 @@ through on-chain governance mechanisms.
 
 ## User calls
 
-There are **81** user calls from **21** pallets.
+There are **86** user calls from **21** pallets.
 
 ### Account - 1
 
@@ -21,14 +21,14 @@ There are **81** user calls from **21** pallets.
 
 <details><summary><code>unlink_identity()</code></summary>
 
-Taking 0.0113 % of a block.
+Taking 0.0111 % of a block.
 
 ```rust
 ```
 </details>
 
 
-See [`Pallet::unlink_identity`].
+Unlink the identity associated with the account.
 
 ### Scheduler - 2
 
@@ -36,7 +36,7 @@ See [`Pallet::unlink_identity`].
 
 <details><summary><code>schedule(when, maybe_periodic, priority, call)</code></summary>
 
-Taking 0.013 % of a block.
+Taking 0.0122 % of a block.
 
 ```rust
 when: BlockNumberFor<T>
@@ -47,13 +47,13 @@ call: Box<<T as Config>::RuntimeCall>
 </details>
 
 
-See [`Pallet::schedule`].
+Anonymously schedule a task.
 
 #### cancel - 1
 
 <details><summary><code>cancel(when, index)</code></summary>
 
-Taking 0.0195 % of a block.
+Taking 0.0236 % of a block.
 
 ```rust
 when: BlockNumberFor<T>
@@ -62,13 +62,13 @@ index: u32
 </details>
 
 
-See [`Pallet::cancel`].
+Cancel an anonymously scheduled task.
 
 #### schedule_named - 2
 
 <details><summary><code>schedule_named(id, when, maybe_periodic, priority, call)</code></summary>
 
-Taking 0.0203 % of a block.
+Taking 0.0189 % of a block.
 
 ```rust
 id: TaskName
@@ -80,13 +80,13 @@ call: Box<<T as Config>::RuntimeCall>
 </details>
 
 
-See [`Pallet::schedule_named`].
+Schedule a named task.
 
 #### cancel_named - 3
 
 <details><summary><code>cancel_named(id)</code></summary>
 
-Taking 0.0209 % of a block.
+Taking 0.0248 % of a block.
 
 ```rust
 id: TaskName
@@ -94,7 +94,7 @@ id: TaskName
 </details>
 
 
-See [`Pallet::cancel_named`].
+Cancel a named scheduled task.
 
 #### schedule_after - 4
 
@@ -111,7 +111,7 @@ call: Box<<T as Config>::RuntimeCall>
 </details>
 
 
-See [`Pallet::schedule_after`].
+Anonymously schedule a task after a delay.
 
 #### schedule_named_after - 5
 
@@ -129,7 +129,89 @@ call: Box<<T as Config>::RuntimeCall>
 </details>
 
 
-See [`Pallet::schedule_named_after`].
+Schedule a named task after a delay.
+
+#### set_retry - 6
+
+<details><summary><code>set_retry(task, retries, period)</code></summary>
+
+Taking 0.012 % of a block.
+
+```rust
+task: TaskAddress<BlockNumberFor<T>>
+retries: u8
+period: BlockNumberFor<T>
+```
+</details>
+
+
+Set a retry configuration for a task so that, in case its scheduled run fails, it will
+be retried after `period` blocks, for a total amount of `retries` retries or until it
+succeeds.
+
+Tasks which need to be scheduled for a retry are still subject to weight metering and
+agenda space, same as a regular task. If a periodic task fails, it will be scheduled
+normally while the task is retrying.
+
+Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic
+clones of the original task. Their retry configuration will be derived from the
+original task's configuration, but will have a lower value for `remaining` than the
+original `total_retries`.
+
+#### set_retry_named - 7
+
+<details><summary><code>set_retry_named(id, retries, period)</code></summary>
+
+Taking 0.0132 % of a block.
+
+```rust
+id: TaskName
+retries: u8
+period: BlockNumberFor<T>
+```
+</details>
+
+
+Set a retry configuration for a named task so that, in case its scheduled run fails, it
+will be retried after `period` blocks, for a total amount of `retries` retries or until
+it succeeds.
+
+Tasks which need to be scheduled for a retry are still subject to weight metering and
+agenda space, same as a regular task. If a periodic task fails, it will be scheduled
+normally while the task is retrying.
+
+Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic
+clones of the original task. Their retry configuration will be derived from the
+original task's configuration, but will have a lower value for `remaining` than the
+original `total_retries`.
+
+#### cancel_retry - 8
+
+<details><summary><code>cancel_retry(task)</code></summary>
+
+Taking 0.012 % of a block.
+
+```rust
+task: TaskAddress<BlockNumberFor<T>>
+```
+</details>
+
+
+Removes the retry configuration of a task.
+
+#### cancel_retry_named - 9
+
+<details><summary><code>cancel_retry_named(id)</code></summary>
+
+Taking 0.0132 % of a block.
+
+```rust
+id: TaskName
+```
+</details>
+
+
+Cancel the retry configuration of a named task.
 
 ### Babe - 3
 
@@ -146,7 +228,10 @@ key_owner_proof: T::KeyOwnerProof
 </details>
 
 
-See [`Pallet::report_equivocation`].
+Report authority equivocation/misbehavior. This method will verify
+the equivocation proof and validate the given key ownership proof
+against the extracted offender. If both are valid, the offence will
+be reported.
 
 ### Balances - 6
 
@@ -154,7 +239,7 @@ See [`Pallet::report_equivocation`].
 
 <details><summary><code>transfer_allow_death(dest, value)</code></summary>
 
-Taking 0.0216 % of a block.
+Taking 0.0199 % of a block.
 
 ```rust
 dest: AccountIdLookupOf<T>
@@ -163,13 +248,19 @@ value: T::Balance
 </details>
 
 
-See [`Pallet::transfer_allow_death`].
+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.0232 % of a block.
+Taking 0.0125 % of a block.
 
 ```rust
 dest: AccountIdLookupOf<T>
@@ -178,13 +269,18 @@ value: T::Balance
 </details>
 
 
-See [`Pallet::transfer_keep_alive`].
+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.0184 % of a block.
+Taking 0.0129 % of a block.
 
 ```rust
 dest: AccountIdLookupOf<T>
@@ -193,7 +289,21 @@ keep_alive: bool
 </details>
 
 
-See [`Pallet::transfer_all`].
+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).
 
 #### force_set_balance - 8
 
@@ -208,7 +318,57 @@ new_free: T::Balance
 </details>
 
 
-See [`Pallet::force_set_balance`].
+Upgrade a specified account.
+
+- `origin`: Must be `Signed`.
+- `who`: The account to be upgraded.
+
+This will waive the transaction fee if at least all but 10% of the accounts needed to
+be upgraded. (We let some not have to be upgraded just in order to allow for the
+possibility of churn).
+Set the regular balance of a given account.
+
+The dispatch origin for this call is `root`.
+
+#### force_adjust_total_issuance - 9
+
+<details><summary><code>force_adjust_total_issuance(direction, delta)</code></summary>
+
+Taking 0.0048 % of a block.
+
+```rust
+direction: AdjustmentDirection
+delta: T::Balance
+```
+</details>
+
+
+Adjust the total issuance in a saturating way.
+
+Can only be called by root and always needs a positive `delta`.
+
+# Example
+
+#### burn - 10
+
+<details><summary><code>burn(value, keep_alive)</code></summary>
+
+No weight available.
+
+```rust
+value: T::Balance
+keep_alive: bool
+```
+</details>
+
+
+Burn the specified liquid free balance from the origin account.
+
+If the origin's account ends up below the existential deposit as a result
+of the burn and `keep_alive` is false, the account will be reaped.
+
+Unlike sending funds to a _burn_ address, which merely makes the funds inaccessible,
+this `burn` operation will reduce total issuance by the amount _burned_.
 
 ### OneshotAccount - 7
 
@@ -216,22 +376,27 @@ See [`Pallet::force_set_balance`].
 
 <details><summary><code>create_oneshot_account(dest, value)</code></summary>
 
-Taking 0.0126 % of a block.
+Taking 0.012 % of a block.
 
 ```rust
 dest: <T::Lookup as StaticLookup>::Source
-value: <T::Currency as Currency<T::AccountId>>::Balance
+value: BalanceOf<T>
 ```
 </details>
 
 
-See [`Pallet::create_oneshot_account`].
+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.0214 % of a block.
+Taking 0.0197 % of a block.
 
 ```rust
 block_height: BlockNumberFor<T>
@@ -240,24 +405,37 @@ dest: Account<<T::Lookup as StaticLookup>::Source>
 </details>
 
 
-See [`Pallet::consume_oneshot_account`].
+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.0295 % of a block.
+Taking 0.0268 % of a block.
 
 ```rust
 block_height: BlockNumberFor<T>
 dest: Account<<T::Lookup as StaticLookup>::Source>
 remaining_to: Account<<T::Lookup as StaticLookup>::Source>
-balance: <T::Currency as Currency<T::AccountId>>::Balance
+balance: BalanceOf<T>
 ```
 </details>
 
 
-See [`Pallet::consume_oneshot_account_with_remaining`].
+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
 
@@ -265,7 +443,7 @@ See [`Pallet::consume_oneshot_account_with_remaining`].
 
 <details><summary><code>invite_smith(receiver)</code></summary>
 
-Taking 0.0265 % of a block.
+Taking 0.0235 % of a block.
 
 ```rust
 receiver: T::IdtyIndex
@@ -273,26 +451,26 @@ receiver: T::IdtyIndex
 </details>
 
 
-See [`Pallet::invite_smith`].
+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.0133 % of a block.
+Taking 0.0127 % of a block.
 
 ```rust
 ```
 </details>
 
 
-See [`Pallet::accept_invitation`].
+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.0234 % of a block.
+Taking 0.0279 % of a block.
 
 ```rust
 receiver: T::IdtyIndex
@@ -300,7 +478,7 @@ receiver: T::IdtyIndex
 </details>
 
 
-See [`Pallet::certify_smith`].
+Certify an invited Smith, which can lead the certified to become a Smith.
 
 ### AuthorityMembers - 11
 
@@ -308,33 +486,33 @@ See [`Pallet::certify_smith`].
 
 <details><summary><code>go_offline()</code></summary>
 
-Taking 0.0188 % of a block.
+Taking 0.0167 % of a block.
 
 ```rust
 ```
 </details>
 
 
-See [`Pallet::go_offline`].
+Request to leave the set of validators two sessions later.
 
 #### go_online - 1
 
 <details><summary><code>go_online()</code></summary>
 
-Taking 0.0225 % of a block.
+Taking 0.0189 % of a block.
 
 ```rust
 ```
 </details>
 
 
-See [`Pallet::go_online`].
+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.0296 % of a block.
+Taking 0.0249 % of a block.
 
 ```rust
 keys: T::Keys
@@ -342,13 +520,13 @@ keys: T::Keys
 </details>
 
 
-See [`Pallet::set_session_keys`].
+Declare new session keys to replace current ones.
 
 #### remove_member_from_blacklist - 4
 
 <details><summary><code>remove_member_from_blacklist(member_id)</code></summary>
 
-Taking 0.0125 % of a block.
+Taking 0.0114 % of a block.
 
 ```rust
 member_id: T::MemberId
@@ -356,7 +534,8 @@ member_id: T::MemberId
 </details>
 
 
-See [`Pallet::remove_member_from_blacklist`].
+Remove a member from the blacklist.
+remove an identity from the blacklist
 
 ### Grandpa - 16
 
@@ -373,7 +552,10 @@ key_owner_proof: T::KeyOwnerProof
 </details>
 
 
-See [`Pallet::report_equivocation`].
+Report voter equivocation/misbehavior. This method will verify the
+equivocation proof and validate the given key ownership proof
+against the extracted offender. If both are valid, the offence
+will be reported.
 
 ### UpgradeOrigin - 21
 
@@ -390,7 +572,11 @@ weight: Weight
 </details>
 
 
-See [`Pallet::dispatch_as_root_unchecked_weight`].
+Dispatches a function call from root origin.
+This function does not check the weight of the call, and instead allows the
+caller to specify the weight of the call.
+
+The weight of this call is defined by the caller.
 
 ### Preimage - 22
 
@@ -398,7 +584,7 @@ See [`Pallet::dispatch_as_root_unchecked_weight`].
 
 <details><summary><code>note_preimage(bytes)</code></summary>
 
-Taking 0.5106 % of a block.
+Taking 0.2947 % of a block.
 
 ```rust
 bytes: Vec<u8>
@@ -406,13 +592,16 @@ bytes: Vec<u8>
 </details>
 
 
-See [`Pallet::note_preimage`].
+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.0211 % of a block.
+Taking 0.0184 % of a block.
 
 ```rust
 hash: T::Hash
@@ -420,13 +609,18 @@ hash: T::Hash
 </details>
 
 
-See [`Pallet::unnote_preimage`].
+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.0136 % of a block.
+Taking 0.0129 % of a block.
 
 ```rust
 hash: T::Hash
@@ -434,13 +628,16 @@ hash: T::Hash
 </details>
 
 
-See [`Pallet::request_preimage`].
+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.0195 % of a block.
+Taking 0.0184 % of a block.
 
 ```rust
 hash: T::Hash
@@ -448,13 +645,15 @@ hash: T::Hash
 </details>
 
 
-See [`Pallet::unrequest_preimage`].
+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 21.0381 % of a block.
+Taking 19.3634 % of a block.
 
 ```rust
 hashes: Vec<T::Hash>
@@ -462,7 +661,9 @@ hashes: Vec<T::Hash>
 </details>
 
 
-See [`Pallet::ensure_updated`].
+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
 
@@ -470,7 +671,7 @@ See [`Pallet::ensure_updated`].
 
 <details><summary><code>execute(proposal, length_bound)</code></summary>
 
-Taking 0.006 % of a block.
+Taking 0.0061 % of a block.
 
 ```rust
 proposal: Box<<T as Config<I>>::Proposal>
@@ -479,7 +680,15 @@ length_bound: u32
 </details>
 
 
-See [`Pallet::execute`].
+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
 
@@ -495,13 +704,26 @@ length_bound: u32
 </details>
 
 
-See [`Pallet::propose`].
+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.0144 % of a block.
+Taking 0.0129 % of a block.
 
 ```rust
 proposal: T::Hash
@@ -511,7 +733,15 @@ approve: bool
 </details>
 
 
-See [`Pallet::vote`].
+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
 
@@ -528,7 +758,30 @@ length_bound: u32
 </details>
 
 
-See [`Pallet::close`].
+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)
 
 ### UniversalDividend - 30
 
@@ -536,20 +789,20 @@ See [`Pallet::close`].
 
 <details><summary><code>claim_uds()</code></summary>
 
-Taking 0.0224 % of a block.
+Taking 0.0218 % of a block.
 
 ```rust
 ```
 </details>
 
 
-See [`Pallet::claim_uds`].
+Claim Universal Dividends.
 
 #### transfer_ud - 1
 
 <details><summary><code>transfer_ud(dest, value)</code></summary>
 
-Taking 0.027 % of a block.
+Taking 0.021 % of a block.
 
 ```rust
 dest: <T::Lookup as StaticLookup>::Source
@@ -558,13 +811,13 @@ value: BalanceOf<T>
 </details>
 
 
-See [`Pallet::transfer_ud`].
+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.0193 % of a block.
+Taking 0.0135 % of a block.
 
 ```rust
 dest: <T::Lookup as StaticLookup>::Source
@@ -573,7 +826,7 @@ value: BalanceOf<T>
 </details>
 
 
-See [`Pallet::transfer_ud_keep_alive`].
+Transfer some liquid free balance to another account in milliUD and keep the account alive.
 
 ### Identity - 41
 
@@ -581,7 +834,7 @@ See [`Pallet::transfer_ud_keep_alive`].
 
 <details><summary><code>create_identity(owner_key)</code></summary>
 
-Taking 0.0969 % of a block.
+Taking 0.0856 % of a block.
 
 ```rust
 owner_key: T::AccountId
@@ -589,13 +842,17 @@ owner_key: T::AccountId
 </details>
 
 
-See [`Pallet::create_identity`].
+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.0365 % of a block.
+Taking 0.0327 % of a block.
 
 ```rust
 idty_name: IdtyName
@@ -603,13 +860,17 @@ idty_name: IdtyName
 </details>
 
 
-See [`Pallet::confirm_identity`].
+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.0507 % of a block.
+Taking 0.0424 % of a block.
 
 ```rust
 new_key: T::AccountId
@@ -618,13 +879,19 @@ new_key_sig: T::Signature
 </details>
 
 
-See [`Pallet::change_owner_key`].
+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.0487 % of a block.
+Taking 0.0399 % of a block.
 
 ```rust
 idty_index: T::IdtyIndex
@@ -634,7 +901,14 @@ revocation_sig: T::Signature
 </details>
 
 
-See [`Pallet::revoke_identity`].
+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.
 
 #### fix_sufficients - 7
 
@@ -649,13 +923,21 @@ inc: bool
 </details>
 
 
-See [`Pallet::fix_sufficients`].
+Change sufficient reference count for a given key.
+
+This function allows a privileged root origin to increment or decrement the sufficient
+reference count associated with a specified owner key.
+
+- `origin` - The origin of the call. It must be root.
+- `owner_key` - The account whose sufficient reference count will be modified.
+- `inc` - A boolean indicating whether to increment (`true`) or decrement (`false`) the count.
+
 
 #### link_account - 8
 
 <details><summary><code>link_account(account_id, payload_sig)</code></summary>
 
-Taking 0.0182 % of a block.
+Taking 0.0155 % of a block.
 
 ```rust
 account_id: T::AccountId
@@ -664,7 +946,14 @@ payload_sig: T::Signature
 </details>
 
 
-See [`Pallet::link_account`].
+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
 
@@ -672,7 +961,7 @@ See [`Pallet::link_account`].
 
 <details><summary><code>add_cert(receiver)</code></summary>
 
-Taking 0.0398 % of a block.
+Taking 0.0356 % of a block.
 
 ```rust
 receiver: T::IdtyIndex
@@ -680,13 +969,13 @@ receiver: T::IdtyIndex
 </details>
 
 
-See [`Pallet::add_cert`].
+Add a new certification.
 
 #### renew_cert - 3
 
 <details><summary><code>renew_cert(receiver)</code></summary>
 
-Taking 0.0324 % of a block.
+Taking 0.0292 % of a block.
 
 ```rust
 receiver: T::IdtyIndex
@@ -694,13 +983,13 @@ receiver: T::IdtyIndex
 </details>
 
 
-See [`Pallet::renew_cert`].
+Renew an existing certification.
 
 #### del_cert - 1
 
 <details><summary><code>del_cert(issuer, receiver)</code></summary>
 
-Taking 0.0276 % of a block.
+Taking 0.0257 % of a block.
 
 ```rust
 issuer: T::IdtyIndex
@@ -709,13 +998,15 @@ receiver: T::IdtyIndex
 </details>
 
 
-See [`Pallet::del_cert`].
+Remove one certification given the issuer and the receiver.
+
+- `origin`: Must be `Root`.
 
 #### remove_all_certs_received_by - 2
 
 <details><summary><code>remove_all_certs_received_by(idty_index)</code></summary>
 
-Taking 7.8043 % of a block.
+Taking 6.846 % of a block.
 
 ```rust
 idty_index: T::IdtyIndex
@@ -723,7 +1014,9 @@ idty_index: T::IdtyIndex
 </details>
 
 
-See [`Pallet::remove_all_certs_received_by`].
+Remove all certifications received by an identity.
+
+- `origin`: Must be `Root`.
 
 ### Distance - 44
 
@@ -731,20 +1024,24 @@ See [`Pallet::remove_all_certs_received_by`].
 
 <details><summary><code>request_distance_evaluation()</code></summary>
 
-Taking 0.0354 % of a block.
+Taking 0.0389 % of a block.
 
 ```rust
 ```
 </details>
 
 
-See [`Pallet::request_distance_evaluation`].
+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.0367 % of a block.
+Taking 0.0399 % of a block.
 
 ```rust
 target: T::IdtyIndex
@@ -752,13 +1049,16 @@ target: T::IdtyIndex
 </details>
 
 
-See [`Pallet::request_distance_evaluation_for`].
+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.
 
 #### update_evaluation - 1
 
 <details><summary><code>update_evaluation(computation_result)</code></summary>
 
-Taking 0.0351 % of a block.
+Taking 0.0341 % of a block.
 
 ```rust
 computation_result: ComputationResult
@@ -766,13 +1066,16 @@ computation_result: ComputationResult
 </details>
 
 
-See [`Pallet::update_evaluation`].
+Push an evaluation result to the pool.
+
+This inherent function is called internally by validators to push an evaluation result
+to the evaluation pool.
 
 #### force_update_evaluation - 2
 
 <details><summary><code>force_update_evaluation(evaluator, computation_result)</code></summary>
 
-Taking 0.018 % of a block.
+Taking 0.0192 % of a block.
 
 ```rust
 evaluator: <T as frame_system::Config>::AccountId
@@ -781,13 +1084,17 @@ computation_result: ComputationResult
 </details>
 
 
-See [`Pallet::force_update_evaluation`].
+Force push an evaluation result to the pool.
+
+It is primarily used for testing purposes.
+
+- `origin`: Must be `Root`.
 
 #### force_valid_distance_status - 3
 
 <details><summary><code>force_valid_distance_status(identity)</code></summary>
 
-Taking 0.0301 % of a block.
+Taking 0.027 % of a block.
 
 ```rust
 identity: <T as pallet_identity::Config>::IdtyIndex
@@ -795,7 +1102,11 @@ identity: <T as pallet_identity::Config>::IdtyIndex
 </details>
 
 
-See [`Pallet::force_valid_distance_status`].
+Force set the distance evaluation status of an identity.
+
+It is primarily used for testing purposes.
+
+- `origin`: Must be `Root`.
 
 ### AtomicSwap - 50
 
@@ -814,7 +1125,18 @@ duration: BlockNumberFor<T>
 </details>
 
 
-See [`Pallet::create_swap`].
+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
 
@@ -829,7 +1151,13 @@ action: T::SwapAction
 </details>
 
 
-See [`Pallet::claim_swap`].
+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
 
@@ -844,7 +1172,12 @@ hashed_proof: HashedProof
 </details>
 
 
-See [`Pallet::cancel_swap`].
+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
 
@@ -852,7 +1185,7 @@ See [`Pallet::cancel_swap`].
 
 <details><summary><code>as_multi_threshold_1(other_signatories, call)</code></summary>
 
-Taking 0.0045 % of a block.
+Taking 0.005 % of a block.
 
 ```rust
 other_signatories: Vec<T::AccountId>
@@ -861,7 +1194,18 @@ call: Box<<T as Config>::RuntimeCall>
 </details>
 
 
-See [`Pallet::as_multi_threshold_1`].
+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
 
@@ -879,7 +1223,45 @@ max_weight: Weight
 </details>
 
 
-See [`Pallet::as_multi`].
+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
 
@@ -897,13 +1279,42 @@ max_weight: Weight
 </details>
 
 
-See [`Pallet::approve_as_multi`].
+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.0135 % of a block.
+Taking 0.0123 % of a block.
 
 ```rust
 threshold: u16
@@ -914,7 +1325,27 @@ call_hash: [u8; 32]
 </details>
 
 
-See [`Pallet::cancel_as_multi`].
+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
 
@@ -922,7 +1353,7 @@ See [`Pallet::cancel_as_multi`].
 
 <details><summary><code>request(randomness_type, salt)</code></summary>
 
-Taking 0.0393 % of a block.
+Taking 0.0404 % of a block.
 
 ```rust
 randomness_type: RandomnessType
@@ -931,7 +1362,7 @@ salt: H256
 </details>
 
 
-See [`Pallet::request`].
+Request randomness.
 
 ### Proxy - 53
 
@@ -939,7 +1370,7 @@ See [`Pallet::request`].
 
 <details><summary><code>proxy(real, force_proxy_type, call)</code></summary>
 
-Taking 0.0063 % of a block.
+Taking 0.0062 % of a block.
 
 ```rust
 real: AccountIdLookupOf<T>
@@ -949,13 +1380,21 @@ call: Box<<T as Config>::RuntimeCall>
 </details>
 
 
-See [`Pallet::proxy`].
+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.0129 % of a block.
+Taking 0.0121 % of a block.
 
 ```rust
 delegate: AccountIdLookupOf<T>
@@ -965,13 +1404,21 @@ delay: BlockNumberFor<T>
 </details>
 
 
-See [`Pallet::add_proxy`].
+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.0133 % of a block.
+Taking 0.0121 % of a block.
 
 ```rust
 delegate: AccountIdLookupOf<T>
@@ -981,26 +1428,37 @@ delay: BlockNumberFor<T>
 </details>
 
 
-See [`Pallet::remove_proxy`].
+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.0129 % of a block.
+Taking 0.012 % of a block.
 
 ```rust
 ```
 </details>
 
 
-See [`Pallet::remove_proxies`].
+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.0141 % of a block.
+Taking 0.0121 % of a block.
 
 ```rust
 proxy_type: T::ProxyType
@@ -1010,13 +1468,30 @@ index: u16
 </details>
 
 
-See [`Pallet::create_pure`].
+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.0125 % of a block.
+Taking 0.012 % of a block.
 
 ```rust
 spawner: AccountIdLookupOf<T>
@@ -1028,13 +1503,28 @@ ext_index: u32
 </details>
 
 
-See [`Pallet::kill_pure`].
+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.0218 % of a block.
+Taking 0.0199 % of a block.
 
 ```rust
 real: AccountIdLookupOf<T>
@@ -1043,13 +1533,27 @@ call_hash: CallHashOf<T>
 </details>
 
 
-See [`Pallet::announce`].
+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.0198 % of a block.
+Taking 0.0186 % of a block.
 
 ```rust
 real: AccountIdLookupOf<T>
@@ -1058,13 +1562,22 @@ call_hash: CallHashOf<T>
 </details>
 
 
-See [`Pallet::remove_announcement`].
+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.02 % of a block.
+Taking 0.0186 % of a block.
 
 ```rust
 delegate: AccountIdLookupOf<T>
@@ -1073,13 +1586,22 @@ call_hash: CallHashOf<T>
 </details>
 
 
-See [`Pallet::reject_announcement`].
+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.0235 % of a block.
+Taking 0.02 % of a block.
 
 ```rust
 delegate: AccountIdLookupOf<T>
@@ -1090,7 +1612,17 @@ call: Box<<T as Config>::RuntimeCall>
 </details>
 
 
-See [`Pallet::proxy_announced`].
+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
 
@@ -1098,7 +1630,7 @@ See [`Pallet::proxy_announced`].
 
 <details><summary><code>batch(calls)</code></summary>
 
-Taking 0.2728 % of a block.
+Taking 0.1149 % of a block.
 
 ```rust
 calls: Vec<<T as Config>::RuntimeCall>
@@ -1106,13 +1638,30 @@ calls: Vec<<T as Config>::RuntimeCall>
 </details>
 
 
-See [`Pallet::batch`].
+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.004 % of a block.
+Taking 0.0047 % of a block.
 
 ```rust
 index: u16
@@ -1121,13 +1670,25 @@ call: Box<<T as Config>::RuntimeCall>
 </details>
 
 
-See [`Pallet::as_derivative`].
+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.2935 % of a block.
+Taking 0.1241 % of a block.
 
 ```rust
 calls: Vec<<T as Config>::RuntimeCall>
@@ -1135,13 +1696,25 @@ calls: Vec<<T as Config>::RuntimeCall>
 </details>
 
 
-See [`Pallet::batch_all`].
+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.3104 % of a block.
+Taking 0.1155 % of a block.
 
 ```rust
 calls: Vec<<T as Config>::RuntimeCall>
@@ -1149,7 +1722,19 @@ calls: Vec<<T as Config>::RuntimeCall>
 </details>
 
 
-See [`Pallet::force_batch`].
+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.
 
 #### with_weight - 5
 
@@ -1164,45 +1749,51 @@ weight: Weight
 </details>
 
 
-See [`Pallet::with_weight`].
+Dispatch a function call with a specified weight.
+
+This function does not check the weight of the call, and instead allows the
+Root origin to specify the weight of the call.
+
+The dispatch origin for this call must be _Root_.
 
 ### Treasury - 55
 
-#### propose_spend - 0
+#### spend_local - 3
 
-<details><summary><code>propose_spend(value, beneficiary)</code></summary>
+<details><summary><code>spend_local(amount, beneficiary)</code></summary>
 
-Taking 0.0183 % of a block.
+Taking 0.0045 % of a block.
 
 ```rust
-value: BalanceOf<T, I>
+amount: BalanceOf<T, I>
 beneficiary: AccountIdLookupOf<T>
 ```
 </details>
 
 
-See [`Pallet::propose_spend`].
+Propose and approve a spend of treasury funds.
 
-#### spend_local - 3
+## Dispatch Origin
 
-<details><summary><code>spend_local(amount, beneficiary)</code></summary>
+Must be [`Config::SpendOrigin`] with the `Success` value being at least `amount`.
 
-Taking 0.0036 % of a block.
+### Details
+NOTE: For record-keeping purposes, the proposer is deemed to be equivalent to the
+beneficiary.
 
-```rust
-amount: BalanceOf<T, I>
-beneficiary: AccountIdLookupOf<T>
-```
-</details>
+### Parameters
+- `amount`: The amount to be transferred from the treasury to the `beneficiary`.
+- `beneficiary`: The destination account for the transfer.
 
+## Events
 
-See [`Pallet::spend_local`].
+Emits [`Event::SpendApproved`] if successful.
 
 #### remove_approval - 4
 
 <details><summary><code>remove_approval(proposal_id)</code></summary>
 
-Taking 0.0111 % of a block.
+Taking 0.0056 % of a block.
 
 ```rust
 proposal_id: ProposalIndex
@@ -1210,13 +1801,33 @@ proposal_id: ProposalIndex
 </details>
 
 
-See [`Pallet::remove_approval`].
+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.0035 % of a block.
+Taking 0.0045 % of a block.
 
 ```rust
 asset_kind: Box<T::AssetKind>
@@ -1227,13 +1838,38 @@ valid_from: Option<BlockNumberFor<T>>
 </details>
 
 
-See [`Pallet::spend`].
+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.0326 % of a block.
+Taking 0.0057 % of a block.
 
 ```rust
 index: SpendIndex
@@ -1241,13 +1877,31 @@ index: SpendIndex
 </details>
 
 
-See [`Pallet::payout`].
+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.011 % of a block.
+Taking 0.0057 % of a block.
 
 ```rust
 index: SpendIndex
@@ -1255,13 +1909,31 @@ index: SpendIndex
 </details>
 
 
-See [`Pallet::check_status`].
+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.011 % of a block.
+Taking 0.0057 % of a block.
 
 ```rust
 index: SpendIndex
@@ -1269,7 +1941,22 @@ index: SpendIndex
 </details>
 
 
-See [`Pallet::void_spend`].
+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.
 
 
 
@@ -1283,7 +1970,7 @@ There are **18** root calls from **8** pallets.
 
 <details><summary><code>set_heap_pages(pages)</code></summary>
 
-Taking 0.0169 % of a block.
+Taking 0.0165 % of a block.
 
 ```rust
 pages: u64
@@ -1291,13 +1978,13 @@ pages: u64
 </details>
 
 
-See [`Pallet::set_heap_pages`].
+Set the number of pages in the WebAssembly environment's heap.
 
 #### set_code - 2
 
 <details><summary><code>set_code(code)</code></summary>
 
-Taking 3.9604 % of a block.
+Taking 3.9234 % of a block.
 
 ```rust
 code: Vec<u8>
@@ -1305,7 +1992,7 @@ code: Vec<u8>
 </details>
 
 
-See [`Pallet::set_code`].
+Set the new runtime code.
 
 #### set_code_without_checks - 3
 
@@ -1319,13 +2006,16 @@ code: Vec<u8>
 </details>
 
 
-See [`Pallet::set_code_without_checks`].
+Set the new runtime code without doing any checks of the given `code`.
+
+Note that runtime upgrades will not run if this is called with a not-increasing spec
+version!
 
 #### set_storage - 4
 
 <details><summary><code>set_storage(items)</code></summary>
 
-Taking 5.9169 % of a block.
+Taking 5.4867 % of a block.
 
 ```rust
 items: Vec<KeyValue>
@@ -1333,13 +2023,13 @@ items: Vec<KeyValue>
 </details>
 
 
-See [`Pallet::set_storage`].
+Set some items of storage.
 
 #### kill_storage - 5
 
 <details><summary><code>kill_storage(keys)</code></summary>
 
-Taking 5.8899 % of a block.
+Taking 5.4797 % of a block.
 
 ```rust
 keys: Vec<Key>
@@ -1347,13 +2037,13 @@ keys: Vec<Key>
 </details>
 
 
-See [`Pallet::kill_storage`].
+Kill some items from storage.
 
 #### kill_prefix - 6
 
 <details><summary><code>kill_prefix(prefix, subkeys)</code></summary>
 
-Taking 7.0785 % of a block.
+Taking 6.4024 % of a block.
 
 ```rust
 prefix: Key
@@ -1362,13 +2052,16 @@ subkeys: u32
 </details>
 
 
-See [`Pallet::kill_prefix`].
+Kill all storage items with a key that starts with the given prefix.
+
+**NOTE:** We rely on the Root origin to provide us the number of subkeys under
+the prefix we are removing to accurately calculate the weight of this function.
 
 #### authorize_upgrade - 9
 
 <details><summary><code>authorize_upgrade(code_hash)</code></summary>
 
-Taking 0.0098 % of a block.
+Taking 0.0105 % of a block.
 
 ```rust
 code_hash: T::Hash
@@ -1376,7 +2069,10 @@ code_hash: T::Hash
 </details>
 
 
-See [`Pallet::authorize_upgrade`].
+Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied
+later.
+
+This call requires Root origin.
 
 #### authorize_upgrade_without_checks - 10
 
@@ -1390,13 +2086,20 @@ code_hash: T::Hash
 </details>
 
 
-See [`Pallet::authorize_upgrade_without_checks`].
+Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied
+later.
+
+WARNING: This authorizes an upgrade that will take place without any safety checks, for
+example that the spec name remains the same and that the version number increases. Not
+recommended for normal use. Use `authorize_upgrade` instead.
+
+This call requires Root origin.
 
 #### apply_authorized_upgrade - 11
 
 <details><summary><code>apply_authorized_upgrade(code)</code></summary>
 
-Taking 4.1178 % of a block.
+Taking 4.1629 % of a block.
 
 ```rust
 code: Vec<u8>
@@ -1404,7 +2107,15 @@ code: Vec<u8>
 </details>
 
 
-See [`Pallet::apply_authorized_upgrade`].
+Provide the preimage (runtime binary) `code` for an upgrade that has been authorized.
+
+If the authorization required a version check, this call will ensure the spec name
+remains unchanged and that the spec version has increased.
+
+Depending on the runtime's `OnSetCode` configuration, this function may directly apply
+the new `code` in the same block or attempt to schedule the upgrade.
+
+All origins are allowed.
 
 ### Babe - 3
 
@@ -1420,7 +2131,10 @@ config: NextConfigDescriptor
 </details>
 
 
-See [`Pallet::plan_config_change`].
+Plan an epoch config change. The epoch config change is recorded and will be enacted on
+the next call to `enact_epoch_change`. The config will be activated one epoch after.
+Multiple calls to this method will replace any existing planned config change that had
+not been enacted yet.
 
 ### Balances - 6
 
@@ -1428,7 +2142,7 @@ See [`Pallet::plan_config_change`].
 
 <details><summary><code>force_transfer(source, dest, value)</code></summary>
 
-Taking 0.0347 % of a block.
+Taking 0.0262 % of a block.
 
 ```rust
 source: AccountIdLookupOf<T>
@@ -1438,13 +2152,14 @@ value: T::Balance
 </details>
 
 
-See [`Pallet::force_transfer`].
+Exactly as `transfer_allow_death`, except the origin must be root and the source account
+may be specified.
 
 #### force_unreserve - 5
 
 <details><summary><code>force_unreserve(who, amount)</code></summary>
 
-Taking 0.0128 % of a block.
+Taking 0.0117 % of a block.
 
 ```rust
 who: AccountIdLookupOf<T>
@@ -1453,7 +2168,9 @@ amount: T::Balance
 </details>
 
 
-See [`Pallet::force_unreserve`].
+Unreserve some balance from a user by force.
+
+Can only be called by ROOT.
 
 ### AuthorityMembers - 11
 
@@ -1461,7 +2178,7 @@ See [`Pallet::force_unreserve`].
 
 <details><summary><code>remove_member(member_id)</code></summary>
 
-Taking 0.073 % of a block.
+Taking 0.0665 % of a block.
 
 ```rust
 member_id: T::MemberId
@@ -1469,7 +2186,7 @@ member_id: T::MemberId
 </details>
 
 
-See [`Pallet::remove_member`].
+Remove a member from the set of validators.
 
 ### Grandpa - 16
 
@@ -1486,7 +2203,18 @@ best_finalized_block_number: BlockNumberFor<T>
 </details>
 
 
-See [`Pallet::note_stalled`].
+Note that the current authority set of the GRANDPA finality gadget has stalled.
+
+This will trigger a forced authority set change at the beginning of the next session, to
+be enacted `delay` blocks after that. The `delay` should be high enough to safely assume
+that the block signalling the forced change will not be re-orged e.g. 1000 blocks.
+The block production rate (which may be slowed down because of finality lagging) should
+be taken into account when choosing the `delay`. The GRANDPA voters based on the new
+authority will start voting on top of `best_finalized_block_number` for new finalized
+blocks. `best_finalized_block_number` should be the highest of the latest finalized
+block of all validators of the new authority set.
+
+Only callable by root.
 
 ### TechnicalCommittee - 23
 
@@ -1494,7 +2222,7 @@ See [`Pallet::note_stalled`].
 
 <details><summary><code>set_members(new_members, prime, old_count)</code></summary>
 
-Taking 0.175 % of a block.
+Taking 0.1558 % of a block.
 
 ```rust
 new_members: Vec<T::AccountId>
@@ -1504,13 +2232,36 @@ old_count: MemberCount
 </details>
 
 
-See [`Pallet::set_members`].
+Set the collective's membership.
+
+- `new_members`: The new member list. Be nice to the chain and provide it sorted.
+- `prime`: The prime member whose vote sets the default.
+- `old_count`: The upper bound for the previous number of members in storage. Used for
+  weight estimation.
+
+The dispatch of this call must be `SetMembersOrigin`.
+
+NOTE: Does not enforce the expected `MaxMembers` limit on the amount of members, but
+      the weight estimations rely on it to estimate dispatchable weight.
+
+WARNING:
+
+The `pallet-collective` can also be managed by logic outside of the pallet through the
+implementation of the trait [`ChangeMembers`].
+Any call to `set_members` must be careful that the member set doesn't get out of sync
+with other logic managing the member set.
+
+**Complexity**:
+- `O(MP + N)` where:
+  - `M` old-members-count (code- and governance-bounded)
+  - `N` new-members-count (code- and governance-bounded)
+  - `P` proposals-count (code-bounded)
 
 #### disapprove_proposal - 5
 
 <details><summary><code>disapprove_proposal(proposal_hash)</code></summary>
 
-Taking 0.0236 % of a block.
+Taking 0.0226 % of a block.
 
 ```rust
 proposal_hash: T::Hash
@@ -1518,7 +2269,16 @@ proposal_hash: T::Hash
 </details>
 
 
-See [`Pallet::disapprove_proposal`].
+Disapprove a proposal, close, and remove it from the system, regardless of its current
+state.
+
+Must be called by the Root origin.
+
+Parameters:
+* `proposal_hash`: The hash of the proposal that should be disapproved.
+
+**Complexity**
+O(P) where P is the number of max proposals
 
 ### Identity - 41
 
@@ -1526,7 +2286,7 @@ See [`Pallet::disapprove_proposal`].
 
 <details><summary><code>prune_item_identities_names(names)</code></summary>
 
-Taking 5.9553 % of a block.
+Taking 5.524 % of a block.
 
 ```rust
 names: Vec<IdtyName>
@@ -1534,7 +2294,13 @@ names: Vec<IdtyName>
 </details>
 
 
-See [`Pallet::prune_item_identities_names`].
+Remove identity names from storage.
+
+This function allows a privileged root origin to remove multiple identity names from storage
+in bulk.
+
+- `origin` - The origin of the call. It must be root.
+- `names` - A vector containing the identity names to be removed from storage.
 
 ### Utility - 54
 
@@ -1542,7 +2308,7 @@ See [`Pallet::prune_item_identities_names`].
 
 <details><summary><code>dispatch_as(as_origin, call)</code></summary>
 
-Taking 0.005 % of a block.
+Taking 0.0048 % of a block.
 
 ```rust
 as_origin: Box<T::PalletsOrigin>
@@ -1551,7 +2317,12 @@ call: Box<<T as Config>::RuntimeCall>
 </details>
 
 
-See [`Pallet::dispatch_as`].
+Dispatches a function call with a provided origin.
+
+The dispatch origin for this call must be _Root_.
+
+**Complexity**
+- O(1).
 
 
 
@@ -1568,7 +2339,7 @@ There are **4** disabled calls from **2** pallets.
 
 <details><summary><code>remark(remark)</code></summary>
 
-Taking 0.0946 % of a block.
+Taking 0.0546 % of a block.
 
 ```rust
 remark: Vec<u8>
@@ -1576,13 +2347,15 @@ remark: Vec<u8>
 </details>
 
 
-See [`Pallet::remark`].
+Make some on-chain remark.
+
+Can be executed by every `origin`.
 
 #### remark_with_event - 7
 
 <details><summary><code>remark_with_event(remark)</code></summary>
 
-Taking 0.3505 % of a block.
+Taking 0.2093 % of a block.
 
 ```rust
 remark: Vec<u8>
@@ -1590,7 +2363,7 @@ remark: Vec<u8>
 </details>
 
 
-See [`Pallet::remark_with_event`].
+Make some on-chain remark and emit event.
 
 ### Session - 15
 
@@ -1598,7 +2371,7 @@ See [`Pallet::remark_with_event`].
 
 <details><summary><code>set_keys(keys, proof)</code></summary>
 
-Taking 0.0406 % of a block.
+Taking 0.0378 % of a block.
 
 ```rust
 keys: T::Keys
@@ -1607,18 +2380,37 @@ proof: Vec<u8>
 </details>
 
 
-See [`Pallet::set_keys`].
+Sets the session key(s) of the function caller to `keys`.
+Allows an account to set its session key prior to becoming a validator.
+This doesn't take effect until the next session.
+
+The dispatch origin of this function must be signed.
+
+**Complexity**
+- `O(1)`. Actual cost depends on the number of length of `T::Keys::key_ids()` which is
+  fixed.
 
 #### purge_keys - 1
 
 <details><summary><code>purge_keys()</code></summary>
 
-Taking 0.0351 % of a block.
+Taking 0.0336 % of a block.
 
 ```rust
 ```
 </details>
 
 
-See [`Pallet::purge_keys`].
+Removes any session key(s) of the function caller.
+
+This doesn't take effect until the next session.
+
+The dispatch origin of this function must be Signed and the account must be either be
+convertible to a validator ID using the chain's typical addressing system (this usually
+means being a controller account) or directly convertible into a validator ID (which
+usually means being a stash account).
+
+**Complexity**
+- `O(1)` in number of key types. Actual cost depends on the number of length of
+  `T::Keys::key_ids()` which is fixed.
 
diff --git a/docs/api/runtime-errors.md b/docs/api/runtime-errors.md
index 2821e156c619c5dfc2433cd5fb1e7f0f69b79d54..ac6528e906befc2b6d5b7f9068867f929903bfd3 100644
--- a/docs/api/runtime-errors.md
+++ b/docs/api/runtime-errors.md
@@ -1,6 +1,6 @@
 # Runtime errors
 
-There are **186** errors from **35** pallets.
+There are **190** errors from **35** pallets.
 
 <ul>
 <li>System - 0
@@ -54,14 +54,21 @@ The origin filter prevent the call to be dispatched.
 <li>
 <details>
 <summary>
-<code>NothingAuthorized</code> - 6</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> - 7</summary>
+<code>Unauthorized</code> - 8</summary>
 The submitted code is not authorized.
 </details>
 </li>
@@ -212,7 +219,7 @@ Number of named reserves exceed `MaxReserves`.
 <details>
 <summary>
 <code>TooManyHolds</code> - 8</summary>
-Number of holds exceed `MaxHolds`.
+Number of holds exceed `VariantCountOf<T::RuntimeHoldReason>`.
 </details>
 </li>
 <li>
@@ -222,6 +229,20 @@ Number of holds exceed `MaxHolds`.
 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
@@ -951,6 +972,20 @@ Can not revoke identity that never was member.
 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>
 </ul>
 </li>
 <li>Membership - 42
@@ -1368,28 +1403,21 @@ Too many calls batched.
 <li>
 <details>
 <summary>
-<code>InsufficientProposersBalance</code> - 0</summary>
-Proposer's balance is too low.
-</details>
-</li>
-<li>
-<details>
-<summary>
-<code>InvalidIndex</code> - 1</summary>
+<code>InvalidIndex</code> - 0</summary>
 No proposal, bounty or spend at that index.
 </details>
 </li>
 <li>
 <details>
 <summary>
-<code>TooManyApprovals</code> - 2</summary>
+<code>TooManyApprovals</code> - 1</summary>
 Too many approvals in the queue.
 </details>
 </li>
 <li>
 <details>
 <summary>
-<code>InsufficientPermission</code> - 3</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>
@@ -1397,56 +1425,56 @@ amount to be spent.
 <li>
 <details>
 <summary>
-<code>ProposalNotApproved</code> - 4</summary>
+<code>ProposalNotApproved</code> - 3</summary>
 Proposal has not been approved.
 </details>
 </li>
 <li>
 <details>
 <summary>
-<code>FailedToConvertBalance</code> - 5</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> - 6</summary>
+<code>SpendExpired</code> - 5</summary>
 The spend has expired and cannot be claimed.
 </details>
 </li>
 <li>
 <details>
 <summary>
-<code>EarlyPayout</code> - 7</summary>
+<code>EarlyPayout</code> - 6</summary>
 The spend is not yet eligible for payout.
 </details>
 </li>
 <li>
 <details>
 <summary>
-<code>AlreadyAttempted</code> - 8</summary>
+<code>AlreadyAttempted</code> - 7</summary>
 The payment has already been attempted.
 </details>
 </li>
 <li>
 <details>
 <summary>
-<code>PayoutError</code> - 9</summary>
+<code>PayoutError</code> - 8</summary>
 There was some issue with the mechanism of payment.
 </details>
 </li>
 <li>
 <details>
 <summary>
-<code>NotAttempted</code> - 10</summary>
+<code>NotAttempted</code> - 9</summary>
 The payout was not yet attempted/claimed.
 </details>
 </li>
 <li>
 <details>
 <summary>
-<code>Inconclusive</code> - 11</summary>
+<code>Inconclusive</code> - 10</summary>
 The payment has neither failed nor succeeded yet.
 </details>
 </li>
diff --git a/docs/api/runtime-errors.po b/docs/api/runtime-errors.po
new file mode 100644
index 0000000000000000000000000000000000000000..6be74ca09b7c1987f058632f6fcac7f59162b97c
--- /dev/null
+++ b/docs/api/runtime-errors.po
@@ -0,0 +1,387 @@
+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 "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 "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."
diff --git a/docs/api/runtime-events.md b/docs/api/runtime-events.md
index bc1206827a529f9cb9321f72f0b0568d98155dd4..f843ea5eb6e87ef3595de8da477dbeff6ae1920c 100644
--- a/docs/api/runtime-events.md
+++ b/docs/api/runtime-events.md
@@ -1,6 +1,6 @@
 # Runtime events
 
-There are **134** events from **35** pallets.
+There are **136** events from **35** pallets.
 
 <ul>
 <li>System - 0
@@ -168,7 +168,35 @@ result: DispatchResult
 <li>
 <details>
 <summary>
-<code>CallUnavailable(task, id)</code> - 3</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
@@ -181,7 +209,7 @@ id: Option<TaskName>
 <li>
 <details>
 <summary>
-<code>PeriodicFailed(task, id)</code> - 4</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
@@ -194,7 +222,21 @@ id: Option<TaskName>
 <li>
 <details>
 <summary>
-<code>PermanentlyOverweight(task, id)</code> - 5</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
@@ -493,6 +535,19 @@ 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>
@@ -526,7 +581,7 @@ A oneshot account was created.
 
 ```rust
 account: T::AccountId
-balance: <T::Currency as Currency<T::AccountId>>::Balance
+balance: BalanceOf<T>
 creator: T::AccountId
 ```
 
@@ -540,10 +595,8 @@ A oneshot account was consumed.
 
 ```rust
 account: T::AccountId
-dest1: (T::AccountId,<T::Currency as Currency<T::AccountId>>::Balance,)
-dest2: Option<
-(T::AccountId,<T::Currency as Currency<T::AccountId>>::Balance,)
->
+dest1: (T::AccountId, BalanceOf<T>)
+dest2: Option<(T::AccountId, BalanceOf<T>)>
 ```
 
 </details>
@@ -556,7 +609,7 @@ A withdrawal was executed on a oneshot account.
 
 ```rust
 account: T::AccountId
-balance: <T::Currency as Currency<T::AccountId>>::Balance
+balance: BalanceOf<T>
 ```
 
 </details>
@@ -636,12 +689,12 @@ no args
 <li>
 <details>
 <summary>
-<code>InvitationSent(receiver, issuer)</code> - 0</summary>
+<code>InvitationSent(issuer, receiver)</code> - 0</summary>
 An identity is being inivited to become a smith.
 
 ```rust
-receiver: T::IdtyIndex
 issuer: T::IdtyIndex
+receiver: T::IdtyIndex
 ```
 
 </details>
@@ -661,12 +714,12 @@ idty_index: T::IdtyIndex
 <li>
 <details>
 <summary>
-<code>SmithCertAdded(receiver, issuer)</code> - 2</summary>
+<code>SmithCertAdded(issuer, receiver)</code> - 2</summary>
 Certification received
 
 ```rust
-receiver: T::IdtyIndex
 issuer: T::IdtyIndex
+receiver: T::IdtyIndex
 ```
 
 </details>
@@ -674,12 +727,12 @@ issuer: T::IdtyIndex
 <li>
 <details>
 <summary>
-<code>SmithCertRemoved(receiver, issuer)</code> - 3</summary>
+<code>SmithCertRemoved(issuer, receiver)</code> - 3</summary>
 Certification lost
 
 ```rust
-receiver: T::IdtyIndex
 issuer: T::IdtyIndex
+receiver: T::IdtyIndex
 ```
 
 </details>
@@ -1386,11 +1439,12 @@ who: T::AccountId
 <li>
 <details>
 <summary>
-<code>EvaluatedValid(idty_index)</code> - 1</summary>
+<code>EvaluatedValid(idty_index, distance)</code> - 1</summary>
 Distance rule was found valid.
 
 ```rust
 idty_index: T::IdtyIndex
+distance: Perbill
 ```
 
 </details>
@@ -1398,11 +1452,12 @@ idty_index: T::IdtyIndex
 <li>
 <details>
 <summary>
-<code>EvaluatedInvalid(idty_index)</code> - 2</summary>
+<code>EvaluatedInvalid(idty_index, distance)</code> - 2</summary>
 Distance rule was found invalid.
 
 ```rust
 idty_index: T::IdtyIndex
+distance: Perbill
 ```
 
 </details>
@@ -1708,19 +1763,7 @@ result: DispatchResult
 <li>
 <details>
 <summary>
-<code>Proposed(proposal_index)</code> - 0</summary>
-New proposal.
-
-```rust
-proposal_index: ProposalIndex
-```
-
-</details>
-</li>
-<li>
-<details>
-<summary>
-<code>Spending(budget_remaining)</code> - 1</summary>
+<code>Spending(budget_remaining)</code> - 0</summary>
 We have ended a spend period and will now allocate funds.
 
 ```rust
@@ -1732,7 +1775,7 @@ budget_remaining: BalanceOf<T, I>
 <li>
 <details>
 <summary>
-<code>Awarded(proposal_index, award, account)</code> - 2</summary>
+<code>Awarded(proposal_index, award, account)</code> - 1</summary>
 Some funds have been allocated.
 
 ```rust
@@ -1746,20 +1789,7 @@ account: T::AccountId
 <li>
 <details>
 <summary>
-<code>Rejected(proposal_index, slashed)</code> - 3</summary>
-A proposal was rejected; funds were slashed.
-
-```rust
-proposal_index: ProposalIndex
-slashed: BalanceOf<T, I>
-```
-
-</details>
-</li>
-<li>
-<details>
-<summary>
-<code>Burnt(burnt_funds)</code> - 4</summary>
+<code>Burnt(burnt_funds)</code> - 2</summary>
 Some of our funds have been burnt.
 
 ```rust
@@ -1771,7 +1801,7 @@ burnt_funds: BalanceOf<T, I>
 <li>
 <details>
 <summary>
-<code>Rollover(rollover_balance)</code> - 5</summary>
+<code>Rollover(rollover_balance)</code> - 3</summary>
 Spending has finished; this is the amount that rolls over until next spend.
 
 ```rust
@@ -1783,7 +1813,7 @@ rollover_balance: BalanceOf<T, I>
 <li>
 <details>
 <summary>
-<code>Deposit(value)</code> - 6</summary>
+<code>Deposit(value)</code> - 4</summary>
 Some funds have been deposited.
 
 ```rust
@@ -1795,7 +1825,7 @@ value: BalanceOf<T, I>
 <li>
 <details>
 <summary>
-<code>SpendApproved(proposal_index, amount, beneficiary)</code> - 7</summary>
+<code>SpendApproved(proposal_index, amount, beneficiary)</code> - 5</summary>
 A new spend proposal has been approved.
 
 ```rust
@@ -1809,7 +1839,7 @@ beneficiary: T::AccountId
 <li>
 <details>
 <summary>
-<code>UpdatedInactive(reactivated, deactivated)</code> - 8</summary>
+<code>UpdatedInactive(reactivated, deactivated)</code> - 6</summary>
 The inactive funds of the pallet have been updated.
 
 ```rust
@@ -1822,7 +1852,7 @@ deactivated: BalanceOf<T, I>
 <li>
 <details>
 <summary>
-<code>AssetSpendApproved(index, asset_kind, amount, beneficiary, valid_from, expire_at)</code> - 9</summary>
+<code>AssetSpendApproved(index, asset_kind, amount, beneficiary, valid_from, expire_at)</code> - 7</summary>
 A new asset spend proposal has been approved.
 
 ```rust
@@ -1839,7 +1869,7 @@ expire_at: BlockNumberFor<T>
 <li>
 <details>
 <summary>
-<code>AssetSpendVoided(index)</code> - 10</summary>
+<code>AssetSpendVoided(index)</code> - 8</summary>
 An approved spend was voided.
 
 ```rust
@@ -1851,7 +1881,7 @@ index: SpendIndex
 <li>
 <details>
 <summary>
-<code>Paid(index, payment_id)</code> - 11</summary>
+<code>Paid(index, payment_id)</code> - 9</summary>
 A payment happened.
 
 ```rust
@@ -1864,7 +1894,7 @@ payment_id: <T::Paymaster as Pay>::Id
 <li>
 <details>
 <summary>
-<code>PaymentFailed(index, payment_id)</code> - 12</summary>
+<code>PaymentFailed(index, payment_id)</code> - 10</summary>
 A payment failed and can be retried.
 
 ```rust
@@ -1877,7 +1907,7 @@ payment_id: <T::Paymaster as Pay>::Id
 <li>
 <details>
 <summary>
-<code>SpendProcessed(index)</code> - 13</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.
 
diff --git a/docs/dev/compilation.md b/docs/dev/compilation.md
new file mode 100644
index 0000000000000000000000000000000000000000..e26c408be9ae7c3c7077c3e63ffe62ae72851070
--- /dev/null
+++ b/docs/dev/compilation.md
@@ -0,0 +1,26 @@
+# 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`
diff --git a/docs/dev/upgrade-substrate.md b/docs/dev/upgrade-substrate.md
index 2345be020332b81228b7e51c35169a7467f1e007..899053ea2a97c4b535de84174fe71b7fe641aa4c 100644
--- a/docs/dev/upgrade-substrate.md
+++ b/docs/dev/upgrade-substrate.md
@@ -1,31 +1,47 @@
-# Upgrade Substrate
+# Polkadot Upgrade Guide
 
-We need to keep up to date with Substrate. Here is an empirical 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.
 
-Let's say for the example that we want to upgrade from `v0.9.26` to `v0.9.32`.
+## 1. Upgrade the duniter-polkadot-sdk
 
-## Upgrade Substrate fork
-1. Checkout the latest Substrate Polkadot branch `polkadot-v0.9.xy` in [our Substrate](https://github.com/duniter/substrate/)
-2. Create a new branch `duniter-substrate-v0.9.xy`
-3. Cherry-pick `3ad5e1a1fdac5398d4911272a34e1f16c1bdd8f0`, `87ef489034ca2b15c4f30da387e06b1f6716d9a2` and `c36ab4f32454318a47777b24b6533c44121fc10b`
-4. Run `cargo check` to check the cherry-picking
+* 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`
 
-## Upgrade Subxt fork
+## 2. Upgrade duniter subxt
 
-1. Checkout the currently used branch in [our Subxt fork](https://github.com/duniter/subxt), e.g. `duniter-substrate-v0.9.26`
-2. Create a new branch `duniter-substrate-v0.9.32`
-3. Fetch the [upstream repository](https://github.com/paritytech/subxt)
-4. Rebase on an upstream stable branch matching the wanted version
+* Clone the repository: `git clone git@github.com:duniter/subxt.git`
+* Set the upstream repository: `git remote add upstream git@github.com:paritytech/subxt.git`
+* If a new version compatible with the polkadot-sdk version used in duniter is available, upgrade Subxt using the same method as duniter-polkadot-sdk.
+* In the `Cargo.toml` file of duniter subxt, change the GitHub path pointing to the paritytech polkadot-sdk, or old duniter-polkadot-sdk to the new duniter-polkadot-sdk.
+* Run `cargo upgrade` and push the branch.
 
-## Upgrade Duniter
+## 3. Upgrade Dependencies
 
-1. Replace `duniter-substrate-v0.9.26` with `duniter-substrate-v0.9.32` in `Cargo.toml`
-2. Update the `rust-toolchain` file according to [Polkadot release notes](https://github.com/paritytech/polkadot/releases)
-	* Tip: To save storage space on your machine, do `rm target -r` after changing the rust toolchain version and before re-building the project with the new version.
-3. While needed, iterate `cargo check`, `cargo update` and upgrading dependencies to match substrate's dependencies
-4. Fix errors in Duniter code
-	* You may need to check how Polkadot is doing by searching in [their repo](https://github.com/paritytech/polkadot). Luckily, the project structure and Substrate patterns are close enough to ours.
-	* Some errors may happen due to two semver-incompatible versions of a same crate being used. To check this, use `cargo tree -i <crate>`. Update the dependency accordingly, then do `cargo update`.
-5. As always, don't forget to `clippy` once you're done with the errors.
-6. Test benchmarking:  
-	`cargo run --features runtime-benchmarks -- benchmark overhead --chain=dev --execution=wasm --wasm-execution=interpreted-i-know-what-i-do --weight-path=. --warmup=10 --repeat=100`
\ No newline at end of file
+Ensure that the dependencies for [Arkwork](https://github.com/duniter/arkworks-substrate) and [ring-vrf bandersnatch-vrfs](https://github.com/duniter/ring-vrf/) only depend on the duniter-polkadot-sdk. When upgrading these repositories, make sure to cherry-pick the "use duniter polkadot-sdk" commit.
+
+## 4. 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.
diff --git a/docs/packaging/build-deb.md b/docs/packaging/build-deb.md
new file mode 100644
index 0000000000000000000000000000000000000000..124512d15abca92033049785565ee5fda9594bb3
--- /dev/null
+++ b/docs/packaging/build-deb.md
@@ -0,0 +1,29 @@
+# How to Build Duniter-V2S Debian Package
+
+Compile packages for native integration for Debian-based systems.
+
+## With Docker (on any system)
+
+1. Install Docker and Docker Buildx.
+2. Use the `scripts/build-deb.sh` script.
+3. The `.deb` packages will be located in the `target/debian` folder.
+
+## Without Docker (on a Debian-based system)
+
+1. Install the necessary dependencies:
+   ```sh
+   sudo apt-get install -y clang cmake protobuf-compiler libssl-dev
+   ```
+2. Compile the project:
+   ```sh
+   cargo build --release
+   ```
+3. Install `cargo-deb`:
+   ```sh
+   cargo install cargo-deb
+   ```
+4. Build the Duniter node `.deb` package:
+   ```sh
+   cargo deb --no-build -p duniter
+   ```
+5. The `.deb` package will be located in the `target/debian` folder.
diff --git a/docs/user/build-for-arm.md b/docs/packaging/build-for-arm.md
similarity index 100%
rename from docs/user/build-for-arm.md
rename to docs/packaging/build-for-arm.md
diff --git a/docs/user/fees.md b/docs/user/fees.md
new file mode 100644
index 0000000000000000000000000000000000000000..4b79c2a5e0fb9f35ded49c5efb331f4004fc1e51
--- /dev/null
+++ b/docs/user/fees.md
@@ -0,0 +1,35 @@
+## Weights and Fees Calculation
+
+### Introduction
+
+Transaction weights and fees ensure network efficiency, fairness, and security in Substrate-based blockchains. These concepts are designed to manage resource allocation and incentivize proper usage of the blockchain infrastructure.
+
+### Transaction Weights
+
+Transaction weight measures the computational resources required to process a transaction. It is determined by factors such as the complexity of the transaction logic and the amount of data involved. Transactions with higher weights consume more resources and thus contribute to the overall load on the network.
+
+### Transaction Fees
+
+Transaction fees in Substrate-based blockchains are crucial for efficiently managing network resources and sustaining economic viability. They regulate resource allocation by ensuring transactions consuming more computational resources incur higher fees, discouraging spam, and promoting fair use of network capacity.
+The fees are computed as follows:
+`fee = base_fee + weight2fee * fee_multiplier + length2fee + tip`
+
+## Fees in Duniter
+
+### Fees Implementation Details
+
+Implementing a zero-fee chain in Duniter involves configuring the blockchain to waive transaction fees when the current block weight is below a specified target. This approach aims to promote accessibility and encourage participation by eliminating fees during periods of lower network activity.
+However, transaction fees are applied when the block weight or length surpasses the defined targets to ensure network security and stability during increased usage. Additionally, leveraging the fee multiplier mechanism helps deter potential prolonged network attacks by dynamically adjusting fee levels based on previous network conditions.
+Duniter members benefit from the quota system, which refunds transaction fees during high network activity periods.
+
+Fees are computed as follows:
+* If `current_weight < 0.25 * max_weight` and `current_length < 0.25 * max_length` and `fee_multiplier = 1`, ie. normal load:
+`fee = 0`
+* If `current_weight > 0.25 * max_weight` or `current_length > 0.25 * max_length` or `fee_multiplier > 1`, ie. heavy usage (approximately more than 135 transactions per second):
+`fee = `5cĞ1 + extrinsic_weight * (5cĞ1/base_extrinsic_weight)* fee_multiplier + extrinsic_length/100 + tip`
+
+The multiplier is updated as follows:
+* If `current_weight > 0.25 * max_weight` or `current_length > 0.25 * max_length`:
+`Min(fee_multiplier += 1, 10)`
+* If `current_weight < 0.25 * max_weight` and `current_length < 0.25 * max_length`:
+`Max(fee_multiplier -= 1, 1)`
diff --git a/docs/user/installation_debian.md b/docs/user/installation_debian.md
new file mode 100644
index 0000000000000000000000000000000000000000..63bc8b37a46f3891c665666eb41fa8ee18a0dd6a
--- /dev/null
+++ b/docs/user/installation_debian.md
@@ -0,0 +1,26 @@
+# Debian Setup Instructions
+
+## Mirror Node
+
+1. Download the Duniter .deb file.
+2. Install the package: `dpkg -i duniter_vx.y.z.deb`.
+3. Change the default configuration (at least the node name) by modifying `/etc/duniter/env_file`.
+4. Start the service: `sudo systemctl start duniter-mirror.service`.
+5. Enable the service at startup: `sudo systemctl enable duniter-mirror.service`.
+
+## Smith Node
+
+1. Download the Duniter .deb file.
+2. Install the package: `dpkg -i duniter_vx.y.z.deb`.
+3. Change the default configuration (at least the node name) by modifying `/etc/duniter/env_file`.
+4. Create network keys using the same base path as in the config file: `duniter2 key generate-node-key --base-path <YOUR_BASE_PATH> --chain <YOUR_CHAIN>`.
+5. Start the service: `sudo systemctl start duniter-smith.service`.
+6. Enable the service at startup: `sudo systemctl enable duniter-smith.service`.
+
+## Distance Oracle
+
+A Smith node needs to be installed.
+
+1. Change the default configuration by modifying `/etc/duniter/env_file`.
+2. Start the service: `sudo systemctl start distance-oracle.timer`.
+3. Enable the service at startup: `sudo systemctl enable distance-oracle.timer`.
diff --git a/docs/user/nginx_reverse_proxy.md b/docs/user/nginx_reverse_proxy.md
index b315cea8e312f9f72236ad660bdbab03371fd2e2..cd17455eb47b8e0588b29a8d774435aef1acd284 100644
--- a/docs/user/nginx_reverse_proxy.md
+++ b/docs/user/nginx_reverse_proxy.md
@@ -1,9 +1,14 @@
-
 # Nginx reverse proxy example
 
 In `/etc/nginx/sites-enabled/gdev.YOUR_DOMAIN` put (you can probably do simpler):
 
 ```nginx
+# see http://nginx.org/en/docs/http/websocket.html
+map $http_upgrade $connection_upgrade {
+    default upgrade;
+    ''      close;
+}
+
 server {
   server_name gdev.YOUR_DOMAIN.fr;
 
@@ -25,15 +30,12 @@ server {
   proxy_set_header X-Forwarded-Port $server_port;
   proxy_read_timeout 90;
 
-  location /http {
-    proxy_pass http://localhost:9933;
-    proxy_http_version 1.1;
-  }
-  location /ws {
+
+  location / {
     proxy_pass http://localhost:9944;
 
     proxy_set_header Upgrade $http_upgrade;
-    proxy_set_header Connection "upgrade";
+    proxy_set_header Connection $connection_upgrade;
     proxy_http_version 1.1;
 
     proxy_read_timeout 1200s;
diff --git a/end2end-tests/Cargo.toml b/end2end-tests/Cargo.toml
index d045afbb890d7429f99f0cb14e798b5ef738795a..a88a2395501c50d4216502a75145fa90e38e81ae 100644
--- a/end2end-tests/Cargo.toml
+++ b/end2end-tests/Cargo.toml
@@ -20,7 +20,6 @@ std = [
 	"distance-oracle/std",
 	"hex/std",
 	"serde_json/std",
-	"sp-core-hashing/std",
 	"sp-core/std",
 	"sp-runtime/std",
 ]
@@ -42,7 +41,6 @@ notify-debouncer-mini = { workspace = true }
 portpicker = { workspace = true }
 serde_json = { workspace = true }
 sp-core = { workspace = true }
-sp-core-hashing = { workspace = true }
 sp-keyring = { workspace = true }
 sp-runtime = { workspace = true }
 subxt = { workspace = true, features = [
diff --git a/end2end-tests/README.md b/end2end-tests/README.md
index 5e298eb7509e62817f3f6f86637ae0bb00faf3c4..1205be0dac892ea936b189bf212d5f0c0a81eca7 100644
--- a/end2end-tests/README.md
+++ b/end2end-tests/README.md
@@ -125,7 +125,7 @@ For some scenarios, you may need to perform an action (When) that fails voluntar
 
 ### Run cucumber functional tests
 
-The cucumber tests use the last debug binary in your `target` folder. Make sure this binary corresponds to the executable you want to test by running `cargo build` before.
+The cucumber tests use the last debug binary in your `target` folder. Make sure this binary corresponds to the executable you want to test by running `cargo build --features constant-fees` before.
 
 To run the cucumber tests, you will need to have the rust toolchain installed locally.
 
@@ -168,6 +168,19 @@ subxt metadata -f bytes --version 14 > resources/metadata.scale
 
 If you don't have subxt, install it: `cargo install subxt-cli`
 
+### Debug
+
+Cucumber uses carriage returns to pretty-print.
+Hence you may need to append an additional newline to your debug printings.
+
+This commandline can be used to enable more debugging:
+
+```bash
+RUST_LOG=debug cargo cucumber -i distance_fail.feature -vvv --show-output
+```
+
+You can use the `log::debug` macro if the line `env_logger::init()` is uncommented in `cucumber_tests.rs`.
+
 [BDD]: https://en.wikipedia.org/wiki/Behavior-driven_development
 [cucumber]: https://cucumber.io/
 [Cucumber Rust Book]: https://cucumber-rs.github.io/cucumber/current/writing/index.html
diff --git a/end2end-tests/cucumber-features/distance_fail.feature b/end2end-tests/cucumber-features/distance_fail.feature
new file mode 100644
index 0000000000000000000000000000000000000000..1abb9df532bda6e0dd03da47b8885fe39af3d30e
--- /dev/null
+++ b/end2end-tests/cucumber-features/distance_fail.feature
@@ -0,0 +1,50 @@
+@genesis.bad_distance
+
+Feature: Distance fail
+#
+# WoT:
+#
+# H<->G<->E<->D<->C-->B
+# ^   ^           ^   ^
+#  \ /             \ /
+#  v v             v v
+#   I               A
+#
+# Every member is referee. Referee count = 8; 80% = 6.4
+# Certs from Alice and Bob do not ensure the fulfilling of the distance rule
+# because the newcomer would reach only 6 members up to G.
+
+
+  Scenario: an unvalidated member fails the distance rule
+    Then treasury should contain 1 ĞD
+    When alice sends 7 ĞD to ferdie
+    Then alice should have 0 ĞD reserved
+    Then alice should have 199 cĞD
+    When bob sends 750 cĞD to ferdie
+    When 15 block later
+    When alice creates identity for ferdie
+    Then ferdie identity should be unconfirmed
+    Then ferdie should be certified by alice
+    When ferdie confirms his identity with pseudo "ferdie"
+    Then ferdie identity should be unvalidated
+    When 3 block later
+    When bob certifies ferdie
+    Then ferdie should be certified by bob
+    Then ferdie should have 0 ĞD reserved
+    Then ferdie should have 1449 cĞD
+    When ferdie requests distance evaluation
+    Then ferdie should have 10 ĞD reserved
+    Then ferdie should have 449 cĞD
+    When 7 blocks later
+    Then treasury should contain 102 cĞD
+    When alice runs distance oracle
+    When 7 blocks later
+    Then ferdie should be certified by alice
+    Then ferdie should be certified by bob
+    # The distance rule is failed
+    Then ferdie identity should be unvalidated
+    # Ferdie got his reserve slashed
+    Then ferdie should have 0 ĞD reserved
+    Then ferdie should have 449 cĞD
+    # Slashed amount is transfered to treasury
+    Then treasury should contain 1102 cĞD
diff --git a/end2end-tests/cucumber-features/identity_creation.feature b/end2end-tests/cucumber-features/identity_creation.feature
index 7de97f182dd43c222dd6e737b53693ccabd4ccc1..97ae14b029732fc33643301a75cccdbb94fcdaf2 100644
--- a/end2end-tests/cucumber-features/identity_creation.feature
+++ b/end2end-tests/cucumber-features/identity_creation.feature
@@ -2,11 +2,11 @@ Feature: Identity creation
 
   Scenario: alice invites a new member to join the web of trust
     # 6 ĞD covers:
-    # - account creation fees (3 ĞD)
     # - existential deposit (1 ĞD)
     # - transaction fees (below 1 ĞD)
     When alice sends 7 ĞD to dave
     # Alice is treasury funder for 1 ĞD => 10-1-7 = 2 (minus TODO fees)
+    Then alice should have 0 ĞD reserved
     Then alice should have 199 cĞD
     When bob sends 750 cĞD to dave
     When charlie sends 6 ĞD to eve
@@ -23,10 +23,14 @@ Feature: Identity creation
     When charlie certifies dave
     Then dave should be certified by bob
     Then dave should be certified by charlie
+    Then dave should have 0 ĞD reserved
+    Then dave should have 1449 cĞD
     When dave requests distance evaluation
-    Then dave should have distance result in 2 sessions
-    When 30 blocks later
-    Then dave should have distance result in 1 session
+    Then dave should have 10 ĞD reserved
+    Then dave should have 449 cĞD
+    When 7 blocks later
     When alice runs distance oracle
-    When 30 blocks later
+    When 7 blocks later
     Then dave identity should be member
+    Then dave should have 0 ĞD reserved
+    Then dave should have 1449 cĞD
diff --git a/end2end-tests/cucumber-genesis/bad_distance.json b/end2end-tests/cucumber-genesis/bad_distance.json
new file mode 100644
index 0000000000000000000000000000000000000000..cb040ba2ccf19837a14c8a7d488aeb466d9a0019
--- /dev/null
+++ b/end2end-tests/cucumber-genesis/bad_distance.json
@@ -0,0 +1,162 @@
+{
+  "first_ud": null,
+  "first_ud_reeval": null,
+  "genesis_parameters": {
+    "genesis_certs_expire_on": 1000,
+    "genesis_certs_min_received": 2,
+    "genesis_memberships_expire_on": 1000,
+    "genesis_smith_certs_expire_on": 1000,
+    "genesis_smith_certs_min_received": 2,
+    "genesis_smith_memberships_expire_on": 100000
+  },
+  "identities": {
+    "Alice": {
+      "index": 1,
+      "balance": 1000,
+      "certs_received": {
+        "Bob": 2700000000,
+        "Charlie": 2700000000
+      },
+      "owner_address": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY",
+      "membership_expire_on": 2700000000,
+      "membership_revokes_on": 2700000001,
+      "revoked": false,
+      "next_cert_issuable_on": 0
+    },
+    "Bob": {
+      "index": 2,
+      "balance": 1000,
+      "certs_received": {
+        "Alice": 2700000000,
+        "Charlie": 2700000000
+      },
+      "owner_address": "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty",
+      "membership_expire_on": 2700000000,
+      "membership_revokes_on": 2700000001,
+      "revoked": false,
+      "next_cert_issuable_on": 0
+    },
+    "Charlie": {
+      "index": 3,
+      "balance": 1000,
+      "certs_received": {
+        "Alice": 2700000000,
+        "Dave": 2700000000
+      },
+      "owner_address": "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y",
+      "membership_expire_on": 2700000000,
+      "membership_revokes_on": 2700000001,
+      "revoked": false,
+      "next_cert_issuable_on": 0
+    },
+    "Dave": {
+      "index": 4,
+      "balance": 1000,
+      "certs_received": {
+        "Charlie": 2700000000,
+        "Eve": 2700000000
+      },
+      "owner_address": "5EWtNo12S57725GF641a6avLkHaXMWnJ5RPoo721GR92gSEt",
+      "membership_expire_on": 2700000000,
+      "membership_revokes_on": 2700000001,
+      "revoked": false,
+      "next_cert_issuable_on": 0
+    },
+    "Eve": {
+      "index": 5,
+      "balance": 1000,
+      "certs_received": {
+        "Dave": 2700000000,
+        "Gertrude": 2700000000
+      },
+      "owner_address": "5EjiXi8p1sCEUevSCQkHom6yUFQY9N5U5xpEofE2N4ZhJ9vs",
+      "membership_expire_on": 2700000000,
+      "membership_revokes_on": 2700000001,
+      "revoked": false,
+      "next_cert_issuable_on": 0
+    },
+    "Gertrude": {
+      "index": 6,
+      "balance": 1000,
+      "certs_received": {
+        "Eve": 2700000000,
+        "Henry": 2700000000,
+        "Irene": 2700000000
+      },
+      "owner_address": "5Hgx76GUW5ETtxTX53BJqzeRtxTASC4AgCPwGDuUjvSuKbC6",
+      "membership_expire_on": 2700000000,
+      "membership_revokes_on": 2700000001,
+      "revoked": false,
+      "next_cert_issuable_on": 0
+    },
+    "Henry": {
+      "index": 7,
+      "balance": 1000,
+      "certs_received": {
+        "Irene": 2700000000,
+        "Gertrude": 2700000000
+      },
+      "owner_address": "5DJZ3Ns49G7B8tr2av53WZorSsMLzvfhPPVeS2RPispMK3Y9",
+      "membership_expire_on": 2700000000,
+      "membership_revokes_on": 2700000001,
+      "revoked": false,
+      "next_cert_issuable_on": 0
+    },
+    "Irene": {
+      "index": 8,
+      "balance": 1000,
+      "certs_received": {
+        "Henry": 2700000000,
+        "Gertrude": 2700000000
+      },
+      "owner_address": "5EqdTcg58VmBfd7DGPj1GJeHahqUEh3fjWH2fS4KRQmhpAjN",
+      "membership_expire_on": 2700000000,
+      "membership_revokes_on": 2700000001,
+      "revoked": false,
+      "next_cert_issuable_on": 0
+    }
+  },
+  "parameters": {
+    "babe_epoch_duration": 30,
+    "cert_period": 15,
+    "cert_max_by_issuer": 10,
+    "cert_min_received_cert_to_issue_cert": 2,
+    "cert_validity_period": 1000,
+    "idty_confirm_period": 40,
+    "idty_creation_period": 50,
+    "membership_period": 1000,
+    "membership_renewal_period": 500,
+    "ud_creation_period": 60000,
+    "ud_reeval_period": 600000,
+    "smith_cert_max_by_issuer": 8,
+    "smith_inactivity_max_duration": 48,
+    "smith_wot_min_cert_for_membership": 2,
+    "wot_first_cert_issuable_on": 20,
+    "wot_min_cert_for_create_idty_right": 2,
+    "wot_min_cert_for_membership": 2
+  },
+  "clique_smiths": [
+    {
+      "name": "Alice"
+    },
+    {
+      "name": "Bob"
+    },
+    {
+      "name": "Charlie"
+    }
+  ],
+  "sudo_key": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY",
+  "technical_committee": [
+    "Alice",
+    "Bob",
+    "Charlie"
+  ],
+  "treasury_funder_pubkey": "FHNpKmJrUtusuvKPGomAygQqeiks98bdV6yD61Stb6vg",
+  "ud": 1000,
+  "initial_monetary_mass": 8000,
+  "current_block": {
+    "number": 0,
+    "medianTime": 1700000000
+  }
+}
diff --git a/end2end-tests/tests/common/balances.rs b/end2end-tests/tests/common/balances.rs
index 9329a5fe13bcf9ca6081cd783611ef17c5b934c6..e7b703736316ea3bcd02bfcb932ed611263324de 100644
--- a/end2end-tests/tests/common/balances.rs
+++ b/end2end-tests/tests/common/balances.rs
@@ -14,9 +14,7 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-use super::gdev;
-use super::gdev::runtime_types::pallet_balances;
-use super::*;
+use super::{gdev, gdev::runtime_types::pallet_balances, *};
 use sp_keyring::AccountKeyring;
 use subxt::{tx::PairSigner, utils::MultiAddress};
 
diff --git a/end2end-tests/tests/common/cert.rs b/end2end-tests/tests/common/cert.rs
index 86efaed685f7a8962949df0d1c6facf9576b5612..bccd2db932f8d570d3923dd2ab05e2462d0eb0a1 100644
--- a/end2end-tests/tests/common/cert.rs
+++ b/end2end-tests/tests/common/cert.rs
@@ -14,16 +14,14 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-use super::gdev;
-use super::gdev::runtime_types::pallet_certification;
-use super::*;
+use super::{gdev, gdev::runtime_types::pallet_certification, *};
 use sp_keyring::AccountKeyring;
 use subxt::{tx::PairSigner, utils::MultiAddress};
 
 pub async fn certify(client: &FullClient, from: AccountKeyring, to: AccountKeyring) -> Result<()> {
     let signer = PairSigner::new(from.pair());
-    let from = from.to_account_id();
-    let to = to.to_account_id();
+    let from: subxt::utils::AccountId32 = from.to_account_id().into();
+    let to: subxt::utils::AccountId32 = to.to_account_id().into();
 
     let _issuer_index = client
         .client
@@ -31,11 +29,7 @@ pub async fn certify(client: &FullClient, from: AccountKeyring, to: AccountKeyri
         .at_latest()
         .await
         .unwrap()
-        .fetch(
-            &gdev::storage()
-                .identity()
-                .identity_index_of(&from.clone().into()),
-        )
+        .fetch(&gdev::storage().identity().identity_index_of(from.clone()))
         .await?
         .unwrap_or_else(|| panic!("{} issuer must exist", from));
     let receiver_index = client
@@ -44,7 +38,7 @@ pub async fn certify(client: &FullClient, from: AccountKeyring, to: AccountKeyri
         .at_latest()
         .await
         .unwrap()
-        .fetch(&gdev::storage().identity().identity_index_of(&to.into()))
+        .fetch(&gdev::storage().identity().identity_index_of(to))
         .await?
         .unwrap_or_else(|| panic!("{} issuer must exist", from));
 
diff --git a/end2end-tests/tests/common/distance.rs b/end2end-tests/tests/common/distance.rs
index 97add31a313804b983b61b3d5feb4228dc9593f9..f9f43d6707559ea0145d72ff043b0b7ecd50cc09 100644
--- a/end2end-tests/tests/common/distance.rs
+++ b/end2end-tests/tests/common/distance.rs
@@ -14,14 +14,14 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-use super::gdev;
-use super::gdev::runtime_types::pallet_identity;
-use super::*;
+use super::{gdev, gdev::runtime_types::pallet_identity, *};
 use crate::DuniterWorld;
 use sp_keyring::AccountKeyring;
-use subxt::backend::rpc::RpcClient;
-use subxt::tx::{PairSigner, Signer};
-use subxt::utils::AccountId32;
+use subxt::{
+    backend::rpc::RpcClient,
+    tx::{PairSigner, Signer},
+    utils::AccountId32,
+};
 
 pub async fn request_evaluation(client: &FullClient, origin: AccountKeyring) -> Result<()> {
     let origin = PairSigner::new(origin.pair());
@@ -61,13 +61,13 @@ pub async fn run_oracle(
     )
     .await
     {
-        for _ in 0..30 {
+        // Distance evaluation period is 7 blocks
+        for _ in 0..7 {
             super::create_empty_block(&client.rpc).await?;
         }
-
         let _events = create_block_with_extrinsic(
-        &client.rpc,
-        client.client
+            &client.rpc,
+            client.client
                 .tx()
                 .create_signed(
                     &gdev::tx().sudo().sudo(gdev::runtime_types::gdev_runtime::RuntimeCall::Distance(
@@ -86,6 +86,15 @@ pub async fn run_oracle(
                 .await?,
         )
         .await?;
+        /*for event in events.iter() {
+            let event = event.unwrap();
+            println!(
+                "Event: {}::{} -> {:?}\n\n",
+                event.pallet_name(),
+                event.variant_name(),
+                event.field_values()
+            );
+        }*/
     }
 
     Ok(())
diff --git a/end2end-tests/tests/common/identity.rs b/end2end-tests/tests/common/identity.rs
index ab42cff025a9044cc3b23646fa1de82ef4ead41b..da532a67edc83e9bcbec3bae4af19a5c7013402a 100644
--- a/end2end-tests/tests/common/identity.rs
+++ b/end2end-tests/tests/common/identity.rs
@@ -14,11 +14,8 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Substrate-Libre-Currency. If not, see <https://www.gnu.org/licenses/>.
 
-use super::gdev;
-use super::gdev::runtime_types::pallet_identity;
-use super::*;
-use crate::gdev::runtime_types::pallet_identity::types::IdtyName;
-use crate::DuniterWorld;
+use super::{gdev, gdev::runtime_types::pallet_identity, *};
+use crate::{gdev::runtime_types::pallet_identity::types::IdtyName, DuniterWorld};
 use sp_keyring::AccountKeyring;
 use subxt::tx::PairSigner;
 
diff --git a/end2end-tests/tests/common/mod.rs b/end2end-tests/tests/common/mod.rs
index 6e61a839878013481132b382521131d0f38e12d3..6ed0e8375c02367af9262d01261c2b198474a5a2 100644
--- a/end2end-tests/tests/common/mod.rs
+++ b/end2end-tests/tests/common/mod.rs
@@ -33,17 +33,19 @@ use codec::Encode;
 use notify_debouncer_mini::new_debouncer;
 use serde_json::Value;
 use sp_keyring::AccountKeyring;
-use std::io::prelude::*;
-use std::path::{Path, PathBuf};
-use std::process::Command;
-use std::str::FromStr;
-use std::time::{Duration, Instant};
-use subxt::backend::rpc::RpcClient;
-use subxt::backend::rpc::RpcParams;
-use subxt::config::substrate::SubstrateExtrinsicParamsBuilder;
-use subxt::config::SubstrateExtrinsicParams;
-use subxt::ext::{sp_core, sp_runtime};
-use subxt::rpc_params;
+use std::{
+    io::prelude::*,
+    path::{Path, PathBuf},
+    process::Command,
+    str::FromStr,
+    time::{Duration, Instant},
+};
+use subxt::{
+    backend::rpc::{RpcClient, RpcParams},
+    config::{substrate::SubstrateExtrinsicParamsBuilder, SubstrateExtrinsicParams},
+    ext::{sp_core, sp_runtime},
+    rpc_params,
+};
 
 pub type Client = subxt::OnlineClient<GdevConfig>;
 pub type Event = gdev::Event;
@@ -144,6 +146,7 @@ pub async fn spawn_node(
                 "--rpc-cors=all",
                 "--alice",
                 "--tmp",
+                "--unsafe-force-node-key-generation",
                 // Fix: End2End test may fail due to network discovery. This option disables automatic peer discovery.π
                 "--reserved-only",
                 // prevent local network discovery (even it does not connect due to above flag)
diff --git a/end2end-tests/tests/common/oneshot.rs b/end2end-tests/tests/common/oneshot.rs
index 51478d12978f6432da50e06c7d47e180dae32a63..bcfe65dc84f06c40a5b6fbc530180633e750bae6 100644
--- a/end2end-tests/tests/common/oneshot.rs
+++ b/end2end-tests/tests/common/oneshot.rs
@@ -14,13 +14,16 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-use super::gdev;
-use super::gdev::runtime_types::pallet_balances;
-use super::gdev::runtime_types::pallet_oneshot_account;
-use super::*;
+use super::{
+    gdev,
+    gdev::runtime_types::{pallet_balances, pallet_oneshot_account},
+    *,
+};
 use sp_keyring::AccountKeyring;
-use subxt::utils::AccountId32;
-use subxt::{tx::PairSigner, utils::MultiAddress};
+use subxt::{
+    tx::PairSigner,
+    utils::{AccountId32, MultiAddress},
+};
 
 pub enum Account {
     Normal(AccountKeyring),
diff --git a/end2end-tests/tests/cucumber_tests.rs b/end2end-tests/tests/cucumber_tests.rs
index 5c174c954d817b8a5ec0751818e82f2bf7359060..642779ec85b58b5f02da11126586dda095156499 100644
--- a/end2end-tests/tests/cucumber_tests.rs
+++ b/end2end-tests/tests/cucumber_tests.rs
@@ -17,14 +17,15 @@
 mod common;
 
 use common::*;
-use cucumber::StatsWriter;
-use cucumber::{given, then, when, World};
+use cucumber::{given, then, when, StatsWriter, World};
 use sp_keyring::AccountKeyring;
-use std::path::PathBuf;
-use std::str::FromStr;
-use std::sync::{
-    atomic::{AtomicBool, Ordering},
-    Arc,
+use std::{
+    path::PathBuf,
+    str::FromStr,
+    sync::{
+        atomic::{AtomicBool, Ordering},
+        Arc,
+    },
 };
 use subxt::backend::rpc::RpcClient;
 
@@ -93,7 +94,7 @@ impl DuniterWorld {
         Output = std::result::Result<Option<Address::Target>, subxt::error::Error>,
     > + 'a
     where
-        Address: subxt::storage::StorageAddress<IsFetchable = subxt::storage::address::Yes> + 'a,
+        Address: subxt::storage::Address<IsFetchable = subxt::custom_values::Yes> + 'a,
     {
         self.client()
             .storage()
@@ -109,9 +110,9 @@ impl DuniterWorld {
         address: &'a Address,
     ) -> impl std::future::Future<Output = std::result::Result<Address::Target, subxt::error::Error>> + 'a
     where
-        Address: subxt::storage::StorageAddress<
-                IsFetchable = subxt::storage::address::Yes,
-                IsDefaultable = subxt::storage::address::Yes,
+        Address: subxt::storage::Address<
+                IsFetchable = subxt::custom_values::Yes,
+                IsDefaultable = subxt::custom_values::Yes,
             > + 'a,
     {
         self.client()
@@ -368,12 +369,33 @@ async fn run_distance_oracle(world: &mut DuniterWorld, who: String) -> Result<()
 // ===== then ====
 
 #[allow(clippy::needless_pass_by_ref_mut)]
-#[then(regex = r"([a-zA-Z]+) should have (\d+) (ĞD|cĞD)")]
+#[then(regex = r"treasury should contain (\d+) (ĞD|cĞD)")]
+async fn treasury_should_contain(
+    world: &mut DuniterWorld,
+    amount: u64,
+    unit: String,
+) -> Result<()> {
+    let who =
+        subxt::utils::AccountId32::from_str("5EYCAe5ijiYfyeZ2JJCGq56LmPyNRAKzpG4QkoQkkQNB5e6Z")
+            .expect("invalid treasury account id");
+    let (amount, _is_ud) = parse_amount(amount, &unit);
+
+    let who_account = world
+        .read_or_default(&gdev::storage().system().account(&who))
+        .await
+        .await?;
+    assert_eq!(who_account.data.free, amount);
+    Ok(())
+}
+
+#[allow(clippy::needless_pass_by_ref_mut)]
+#[then(regex = r"([a-zA-Z]+) should have (\d+) (ĞD|cĞD)( reserved)?")]
 async fn should_have(
     world: &mut DuniterWorld,
     who: String,
     amount: u64,
     unit: String,
+    reserved: String,
 ) -> Result<()> {
     // Parse inputs
     let who: subxt::utils::AccountId32 = AccountKeyring::from_str(&who)
@@ -386,7 +408,11 @@ async fn should_have(
         .read_or_default(&gdev::storage().system().account(&who))
         .await
         .await?;
-    assert_eq!(who_account.data.free, amount);
+    if reserved.is_empty() {
+        assert_eq!(who_account.data.free, amount);
+    } else {
+        assert_eq!(who_account.data.reserved, amount);
+    }
     Ok(())
 }
 
@@ -500,50 +526,6 @@ async fn should_be_certified_by(
     }
 }
 
-#[allow(clippy::needless_pass_by_ref_mut)]
-#[then(regex = r"([a-zA-Z]+) should have distance result in (\d+) sessions?")]
-async fn should_have_distance_result_in_sessions(
-    world: &mut DuniterWorld,
-    who: String,
-    sessions: u32,
-) -> Result<()> {
-    assert!(sessions < 3, "Session number must be < 3");
-
-    let who = AccountKeyring::from_str(&who).unwrap().to_account_id();
-
-    let idty_id = world
-        .read(&gdev::storage().identity().identity_index_of(&who.into()))
-        .await
-        .await?
-        .unwrap();
-
-    let current_session = world
-        .read(&gdev::storage().session().current_index())
-        .await
-        .await?
-        .unwrap_or_default();
-
-    let pool = world
-        .read(&match (current_session + sessions) % 3 {
-            0 => gdev::storage().distance().evaluation_pool0(),
-            1 => gdev::storage().distance().evaluation_pool1(),
-            2 => gdev::storage().distance().evaluation_pool2(),
-            _ => unreachable!("n%3<3"),
-        })
-        .await
-        .await
-        .unwrap()
-        .ok_or_else(|| anyhow::anyhow!("given pool is empty"))?;
-
-    for (sample_idty, _) in pool.evaluations.0 {
-        if sample_idty == idty_id {
-            return Ok(());
-        }
-    }
-
-    Err(anyhow::anyhow!("no evaluation in given pool").into())
-}
-
 use gdev::runtime_types::pallet_identity::types::IdtyStatus;
 
 // status from string
@@ -624,7 +606,7 @@ async fn main() {
     .expect("Error setting Ctrl-C handler");
 
     let summarize = DuniterWorld::cucumber()
-        //.fail_on_skipped()
+        .fail_on_skipped()
         .max_concurrent_scenarios(4)
         .before(move |feature, _rule, scenario, world| {
             let mut genesis_conf_file_path = PathBuf::new();
diff --git a/live-tests/Cargo.toml b/live-tests/Cargo.toml
index 620bfd4b534cee4e3aa0fff458e2094ee59b4c55..3faa5c2eb7d4f8cca2a185b3f274da7ce260f6bd 100644
--- a/live-tests/Cargo.toml
+++ b/live-tests/Cargo.toml
@@ -12,7 +12,6 @@ version.workspace = true
 anyhow = { workspace = true }
 codec = { workspace = true }
 countmap = { workspace = true }
-hex-literal = { workspace = true }
 sp-core = { workspace = true }
 sp-runtime = { workspace = true }
 subxt = { workspace = true, features = [
diff --git a/live-tests/tests/sanity_gdev.rs b/live-tests/tests/sanity_gdev.rs
index 86cec2524db03228691c8a5b48dc5dfa4ffda3fb..ca6ded3e811b6c576b1d8f4a037474cadaf7dd47 100644
--- a/live-tests/tests/sanity_gdev.rs
+++ b/live-tests/tests/sanity_gdev.rs
@@ -14,31 +14,20 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-// WARNING
-// these live test build but I'm not sure they actually test something
-// they should be checked against corrupted storage to see that they actually fail
-
 #[subxt::subxt(runtime_metadata_path = "../resources/metadata.scale")]
 pub mod gdev {}
 
 use countmap::CountMap;
-use hex_literal::hex;
-use sp_core::crypto::AccountId32;
-use sp_core::{blake2_128, ByteArray, H256};
+use sp_core::{blake2_128, crypto::AccountId32, ByteArray, H256};
 use std::collections::{HashMap, HashSet};
-use subxt::backend::rpc::RpcClient;
-use subxt::config::SubstrateConfig as GdevConfig;
-use subxt::ext::sp_core;
-// use subxt::config::substrate::SubstrateExtrinsicParamsBuilder;
-// use subxt::backend::rpc::RpcParams;
-// use subxt::config::SubstrateExtrinsicParams;
-// use subxt::ext::{sp_core, sp_runtime};
+use subxt::{backend::rpc::RpcClient, config::SubstrateConfig as GdevConfig};
 
 const DEFAULT_ENDPOINT: &str = "ws://localhost:9944";
 
 const EXISTENTIAL_DEPOSIT: u64 = 100;
-const TREASURY_ACCOUNT_ID: [u8; 32] =
-    hex!("6d6f646c70792f74727372790000000000000000000000000000000000000000");
+//use hex_literal::hex;
+//const TREASURY_ACCOUNT_ID: [u8; 32] =
+//    hex!("6d6f646c70792f74727372790000000000000000000000000000000000000000");
 
 type Client = subxt::OnlineClient<GdevConfig>;
 
@@ -56,12 +45,15 @@ type IdtyData = gdev::runtime_types::common_runtime::entities::IdtyData;
 type IdtyIndex = u32;
 type IdtyValue =
     gdev::runtime_types::pallet_identity::types::IdtyValue<BlockNumber, AccountId32, IdtyData>;
-// use gdev::runtime_types::pallet_identity::types::IdtyStatus;
+type MembershipData = gdev::runtime_types::sp_membership::MembershipData<BlockNumber>;
+use gdev::runtime_types::pallet_identity::types::{IdtyName, IdtyStatus};
 
 struct Storage {
     accounts: HashMap<AccountId32, AccountInfo>,
     identities: HashMap<IdtyIndex, IdtyValue>,
     identity_index_of: HashMap<[u8; 16], IdtyIndex>,
+    memberships: HashMap<IdtyIndex, MembershipData>,
+    identities_names: HashMap<IdtyIndex, IdtyName>,
 }
 
 #[tokio::test(flavor = "current_thread")]
@@ -99,10 +91,10 @@ async fn sanity_tests_at(client: Client, _maybe_block_hash: Option<H256>) -> any
         .unwrap()
         .iter(gdev::storage().system().account_iter())
         .await?;
-    while let Some(Ok((key, account_info))) = account_iter.next().await {
+    while let Some(Ok(key)) = account_iter.next().await {
         let mut account_id_bytes = [0u8; 32];
-        account_id_bytes.copy_from_slice(&key[48..]);
-        accounts.insert(AccountId32::new(account_id_bytes), account_info);
+        account_id_bytes.copy_from_slice(&key.key_bytes[48..]);
+        accounts.insert(AccountId32::new(account_id_bytes), key.value);
     }
     println!("accounts.len(): {}.", accounts.len());
 
@@ -115,16 +107,16 @@ async fn sanity_tests_at(client: Client, _maybe_block_hash: Option<H256>) -> any
         .unwrap()
         .iter(gdev::storage().identity().identities_iter())
         .await?;
-    while let Some(Ok((key, idty_value))) = idty_iter.next().await {
+    while let Some(Ok(key)) = idty_iter.next().await {
         let mut idty_index_bytes = [0u8; 4];
-        idty_index_bytes.copy_from_slice(&key[40..]);
+        idty_index_bytes.copy_from_slice(&key.key_bytes[40..]);
         let idty_val = IdtyValue {
-            data: idty_value.data,
-            next_creatable_identity_on: idty_value.next_creatable_identity_on,
+            data: key.value.data,
+            next_creatable_identity_on: key.value.next_creatable_identity_on,
             old_owner_key: None, // Not used in the live test, skip the conversion
-            owner_key: AccountId32::from(idty_value.owner_key.0),
-            next_scheduled: idty_value.next_scheduled,
-            status: idty_value.status,
+            owner_key: AccountId32::from(key.value.owner_key.0),
+            next_scheduled: key.value.next_scheduled,
+            status: key.value.status,
         };
         identities.insert(IdtyIndex::from_le_bytes(idty_index_bytes), idty_val);
     }
@@ -139,17 +131,53 @@ async fn sanity_tests_at(client: Client, _maybe_block_hash: Option<H256>) -> any
         .unwrap()
         .iter(gdev::storage().identity().identity_index_of_iter())
         .await?;
-    while let Some(Ok((key, idty_index))) = idty_index_of_iter.next().await {
+    while let Some(Ok(key)) = idty_index_of_iter.next().await {
         let mut blake2_128_bytes = [0u8; 16];
-        blake2_128_bytes.copy_from_slice(&key[32..48]);
-        identity_index_of.insert(blake2_128_bytes, idty_index);
+        blake2_128_bytes.copy_from_slice(&key.key_bytes[32..48]);
+        identity_index_of.insert(blake2_128_bytes, key.value);
     }
     println!("identity_index_of.len(): {}.", identity_index_of.len());
 
+    // Collect identity_names
+    let mut identities_names: HashMap<IdtyIndex, IdtyName> = HashMap::new();
+    let mut idty_name_iter = client
+        .storage()
+        .at_latest()
+        .await
+        .unwrap()
+        .iter(gdev::storage().identity().identities_names_iter())
+        .await?;
+    while let Some(Ok(key)) = idty_name_iter.next().await {
+        let name = IdtyName(key.key_bytes);
+        identities_names.insert(key.value, name);
+    }
+    println!("identities_names.len(): {}.", identities_names.len());
+
+    // Collect memberships
+    let mut memberships: HashMap<IdtyIndex, MembershipData> = HashMap::new();
+    let mut membership_iter = client
+        .storage()
+        .at_latest()
+        .await
+        .unwrap()
+        .iter(gdev::storage().membership().membership_iter())
+        .await?;
+    while let Some(Ok(key)) = membership_iter.next().await {
+        let mut idty_index_bytes = [0u8; 4];
+        idty_index_bytes.copy_from_slice(&key.key_bytes[40..]);
+        let membership_val = MembershipData {
+            expire_on: key.value.expire_on,
+        };
+        memberships.insert(IdtyIndex::from_le_bytes(idty_index_bytes), membership_val);
+    }
+    println!("memberships.len(): {}.", memberships.len());
+
     let storage = Storage {
         accounts,
         identities,
         identity_index_of,
+        memberships,
+        identities_names,
     };
 
     // ===== Verify storage ===== //
@@ -178,6 +206,12 @@ mod verifier {
                 .await;
             self.verify_identity_coherence(&storage.identities, &storage.identity_index_of)
                 .await;
+            self.verify_status_coherence(
+                &storage.identities,
+                &storage.memberships,
+                &storage.identities_names,
+            )
+            .await;
 
             if self.errors.is_empty() {
                 Ok(())
@@ -232,15 +266,6 @@ mod verifier {
                         format!("Account {} has no providers nor sufficients.", account_id),
                     );
                 }
-
-                if account_id.as_slice() != TREASURY_ACCOUNT_ID {
-                    // Rule 4: If the account is not a "special account",
-                    // it should have a consumer
-                    self.assert(
-                        account_info.consumers > 0,
-                        format!("Account {} has no consumer.", account_id),
-                    );
-                }
             }
         }
 
@@ -340,6 +365,76 @@ mod verifier {
             }
         }
 
+        /// check identities status and membership coherence
+        async fn verify_status_coherence(
+            &mut self,
+            identities: &HashMap<IdtyIndex, IdtyValue>,
+            memberships: &HashMap<IdtyIndex, MembershipData>,
+            names: &HashMap<IdtyIndex, IdtyName>,
+        ) {
+            for (idty_index, idty_value) in identities {
+                // Rule 1: each Status::Member should have a membership and a name.
+                if let IdtyStatus::Member = idty_value.status {
+                    self.assert(
+                        memberships.get(idty_index).is_some(),
+                        format!("identity number {idty_index} should have a valid membership"),
+                    );
+                    self.assert(
+                        names.get(idty_index).is_some(),
+                        format!("identity number {idty_index} should have a name"),
+                    );
+                }
+
+                // Rule 2: each Status::NotMember should have a name but no membership.
+                if let IdtyStatus::NotMember = idty_value.status {
+                    self.assert(
+                        memberships.get(idty_index).is_none(),
+                        format!("identity number {idty_index} should not have a valid membership"),
+                    );
+                    self.assert(
+                        names.get(idty_index).is_some(),
+                        format!("identity number {idty_index} should have a name"),
+                    );
+                }
+
+                // Rule 3: each Status::Revoke should should have a name but no membership.
+                if let IdtyStatus::Revoked = idty_value.status {
+                    self.assert(
+                        memberships.get(idty_index).is_none(),
+                        format!("identity number {idty_index} should not have a valid membership"),
+                    );
+                    self.assert(
+                        names.get(idty_index).is_some(),
+                        format!("identity number {idty_index} should have a name"),
+                    );
+                }
+
+                // Rule 4: each Status::Unvalidaded should have a name but no membership.
+                if let IdtyStatus::Unvalidated = idty_value.status {
+                    self.assert(
+                        memberships.get(idty_index).is_none(),
+                        format!("identity number {idty_index} should not have a valid membership"),
+                    );
+                    self.assert(
+                        names.get(idty_index).is_some(),
+                        format!("identity number {idty_index} should have a name"),
+                    );
+                }
+
+                // Rule 5: each Status::Unconfirmed should not have a name neither a membership.
+                if let IdtyStatus::Unconfirmed = idty_value.status {
+                    self.assert(
+                        memberships.get(idty_index).is_none(),
+                        format!("identity number {idty_index} should not have a valid membership"),
+                    );
+                    self.assert(
+                        names.get(idty_index).is_none(),
+                        format!("identity number {idty_index} should not have a name"),
+                    );
+                }
+            }
+        }
+
         /// check coherence between identity list and identity index hashmap
         async fn verify_identity_coherence(
             &mut self,
diff --git a/node/Cargo.toml b/node/Cargo.toml
index 35f856a5788f992ebb5d9b0be65171c2a5eb591a..784c75437b24cb72553aedef80387b5bda69e77c 100644
--- a/node/Cargo.toml
+++ b/node/Cargo.toml
@@ -30,9 +30,10 @@ constant-fees = [
 ]
 gtest = ["gtest-runtime", "std"]
 embed = []
+native = []
 runtime-benchmarks = [
 	"common-runtime/runtime-benchmarks",
-	"dc-distance/runtime-benchmarks",
+	"dc-distance?/runtime-benchmarks",
 	"frame-benchmarking-cli/runtime-benchmarks",
 	"frame-benchmarking/runtime-benchmarks",
 	"frame-system/runtime-benchmarks",
@@ -47,8 +48,9 @@ runtime-benchmarks = [
 	"sp-runtime/runtime-benchmarks",
 ]
 try-runtime = [
+  "runtime-benchmarks",
 	"common-runtime/try-runtime",
-	"dc-distance/try-runtime",
+	"dc-distance?/try-runtime",
 	"distance-oracle?/try-runtime",
 	"frame-system/try-runtime",
 	"g1-runtime/try-runtime",
@@ -61,8 +63,6 @@ try-runtime = [
 	"sp-distance/try-runtime",
 	"sp-membership/try-runtime",
 	"sp-runtime/try-runtime",
-	"try-runtime-cli",
-	"try-runtime-cli?/try-runtime",
 ]
 std = [
 	"bs58/std",
@@ -113,76 +113,90 @@ async-io = { workspace = true }
 bs58 = { workspace = true }
 clap = { workspace = true, features = ["derive"] }
 clap_complete = { workspace = true }
-common-runtime = { workspace = true }
-dc-distance = { workspace = true }
-distance-oracle = { workspace = true, optional = true }
 frame-benchmarking = { workspace = true }
 frame-benchmarking-cli = { workspace = true }
 frame-system = { workspace = true }
 futures = { workspace = true, features = ["compat"] }
-g1-runtime = { workspace = true, optional = true }
-gdev-runtime = { workspace = true, optional = true }
-gtest-runtime = { workspace = true, optional = true }
 hex = { workspace = true }
 jsonrpsee = { workspace = true, features = ["server"] }
 log = { workspace = true }
 memmap2 = { workspace = true }
 num-format = { workspace = true }
-pallet-grandpa = { workspace = true }
-pallet-im-online = { workspace = true }
-pallet-transaction-payment = { workspace = true }
-pallet-transaction-payment-rpc = { workspace = true }
-pallet-transaction-payment-rpc-runtime-api = { workspace = true }
-pallet-treasury = { workspace = true }
-sc-basic-authorship = { workspace = true }
-sc-chain-spec = { workspace = true }
-sc-client-api = { workspace = true }
-sc-client-db = { workspace = true }
-sc-consensus = { workspace = true }
-sc-consensus-babe = { workspace = true }
-sc-consensus-babe-rpc = { workspace = true }
-sc-consensus-grandpa = { workspace = true }
-sc-consensus-manual-seal = { workspace = true }
-sc-executor = { workspace = true }
-sc-keystore = { workspace = true }
-sc-network = { workspace = true }
-sc-offchain = { workspace = true }
-sc-rpc-api = { workspace = true }
-sc-telemetry = { workspace = true }
-sc-transaction-pool = { workspace = true }
-sc-transaction-pool-api = { workspace = true }
 serde = { workspace = true }
 serde_json = { workspace = true }
 serde_yaml = { workspace = true }
-sp-api = { workspace = true }
-sp-authority-discovery = { workspace = true }
-sp-block-builder = { workspace = true }
-sp-blockchain = { workspace = true }
-sp-consensus = { workspace = true }
-sp-consensus-babe = { workspace = true }
-sp-consensus-grandpa = { workspace = true }
-sp-core = { workspace = true }
-sp-distance = { workspace = true }
-sp-inherents = { workspace = true }
-sp-io = { workspace = true }
-sp-keyring = { workspace = true }
-sp-keystore = { workspace = true }
-sp-membership = { workspace = true }
-sp-offchain = { workspace = true }
-sp-runtime = { workspace = true }
-sp-session = { workspace = true }
-sp-storage = { workspace = true }
-sp-timestamp = { workspace = true }
-sp-transaction-pool = { workspace = true }
-sp-transaction-storage-proof = { workspace = true }
-substrate-frame-rpc-system = { workspace = true }
-try-runtime-cli = { workspace = true, optional = true }
+
+# Local
+common-runtime = { workspace = true }
+g1-runtime = { workspace = true, optional = true }
+gdev-runtime = { workspace = true, optional = true }
+gtest-runtime = { workspace = true, optional = true }
+distance-oracle = { workspace = true, optional = true }
+dc-distance = { workspace = true, optional = true }
+
+# Substrate
+pallet-grandpa = { workspace = true, default-features = true }
+pallet-im-online = { workspace = true, default-features = true }
+pallet-transaction-payment = { workspace = true, default-features = true }
+pallet-transaction-payment-rpc = { workspace = true, default-features = true }
+pallet-transaction-payment-rpc-runtime-api = { workspace = true, default-features = true }
+pallet-treasury = { workspace = true, default-features = true }
+sc-basic-authorship = { workspace = true, default-features = true }
+sc-chain-spec = { workspace = true, default-features = true }
+sc-client-api = { workspace = true, default-features = true }
+sc-client-db = { workspace = true, default-features = true }
+sc-consensus = { workspace = true, default-features = true }
+sc-rpc = { workspace = true, default-features = true }
+sc-consensus-babe = { workspace = true, default-features = true }
+sc-consensus-babe-rpc = { workspace = true, default-features = true }
+sc-consensus-grandpa = { workspace = true, default-features = true }
+sc-consensus-grandpa-rpc = { workspace = true, default-features = true }
+sc-consensus-manual-seal = { workspace = true, default-features = true }
+sc-executor = { workspace = true, default-features = true }
+sc-keystore = { workspace = true, default-features = true }
+sc-network = { workspace = true, default-features = true }
+sc-offchain = { workspace = true, default-features = true }
+sc-rpc-api = { workspace = true, default-features = true }
+sc-telemetry = { workspace = true, default-features = true }
+sc-transaction-pool = { workspace = true, default-features = true }
+sc-transaction-pool-api = { workspace = true, default-features = true }
+sp-api = { workspace = true, default-features = true }
+sp-authority-discovery = { workspace = true, default-features = true }
+sp-block-builder = { workspace = true, default-features = true }
+sp-blockchain = { workspace = true, default-features = true }
+sp-consensus = { workspace = true, default-features = true }
+sp-consensus-babe = { workspace = true, default-features = true }
+sp-consensus-grandpa = { workspace = true, default-features = true }
+sp-core = { workspace = true, default-features = true }
+sp-distance = { workspace = true, default-features = true }
+sp-inherents = { workspace = true, default-features = true }
+sp-io = { workspace = true, default-features = true }
+sp-keyring = { workspace = true, default-features = true }
+sp-keystore = { workspace = true, default-features = true }
+sp-membership = { workspace = true, default-features = true }
+sp-offchain = { workspace = true, default-features = true }
+sp-runtime = { workspace = true, default-features = true }
+sp-session = { workspace = true, default-features = true }
+sp-storage = { workspace = true, default-features = true }
+sp-timestamp = { workspace = true, default-features = true }
+sp-transaction-pool = { workspace = true, default-features = true }
+sp-transaction-storage-proof = { workspace = true, default-features = true }
+substrate-frame-rpc-system = { workspace = true, default-features = true }
 
 [build-dependencies]
-substrate-build-script-utils = { workspace = true }
+substrate-build-script-utils = { workspace = true, default-features = true}
 
 # Dependencies for specific targets
 [target.'cfg(any(target_arch="x86_64", target_arch="aarch64"))'.dependencies]
-sc-cli = { workspace = true }
-sc-service = { workspace = true }
-sp-trie = { workspace = true }
+sc-cli = { workspace = true, default-features = true }
+sc-service = { workspace = true, default-features = true }
+sp-trie = { workspace = true, default-features = true }
+
+[package.metadata.deb]
+maintainer-scripts = "../resources/debian"
+systemd-units = [ { unit-name = "duniter-mirror", enable = false },
+                  { unit-name = "duniter-smith", enable = false },
+                  { unit-name = "distance-oracle", enable = false },
+                  ]
+assets = [ ["../resources/debian/env_file", "/etc/duniter/env_file", "0640"],
+           ["../target/release/duniter", "/usr/bin/duniter2", "755"]]
diff --git a/node/src/chain_spec/g1.rs b/node/src/chain_spec/g1.rs
index 952f493e96e92e1b8754dc1839c427b1724b10be..b84e42225256c6b152a5ae4b5b3c40b80176b4c4 100644
--- a/node/src/chain_spec/g1.rs
+++ b/node/src/chain_spec/g1.rs
@@ -14,8 +14,232 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-pub type ChainSpec = sc_service::GenericChainSpec<g1_runtime::GenesisConfig>;
+use super::*;
+use crate::chain_spec::gen_genesis_data::{
+    AuthorityKeys, CommonParameters, GenesisIdentity, SessionKeysProvider,
+};
+use common_runtime::{constants::*, entities::IdtyData, GenesisIdty, IdtyStatus};
+use g1_runtime::{
+    opaque::SessionKeys, pallet_universal_dividend, parameters, Runtime, WASM_BINARY,
+};
+use sc_service::ChainType;
+use serde::Deserialize;
+use sp_core::{sr25519, Get};
+use std::{env, fs};
 
-pub fn development_chain_spec() -> Result<ChainSpec, String> {
-    todo!()
+pub type ChainSpec = sc_service::GenericChainSpec;
+
+#[derive(Default, Clone, Deserialize)]
+// No parameters for G1 (unlike GDev)
+struct GenesisParameters {}
+
+const TOKEN_DECIMALS: usize = 2;
+const TOKEN_SYMBOL: &str = "Ğ";
+static EXISTENTIAL_DEPOSIT: u64 = parameters::ExistentialDeposit::get();
+
+struct G1SKP;
+impl SessionKeysProvider<SessionKeys> for G1SKP {
+    fn session_keys(keys: &AuthorityKeys) -> SessionKeys {
+        let cloned = keys.clone();
+        SessionKeys {
+            grandpa: cloned.1,
+            babe: cloned.2,
+            im_online: cloned.3,
+            authority_discovery: cloned.4,
+        }
+    }
+}
+
+fn get_parameters(_parameters_from_file: &Option<GenesisParameters>) -> CommonParameters {
+    CommonParameters {
+        currency_name: TOKEN_SYMBOL.to_string(),
+        decimals: TOKEN_DECIMALS,
+        babe_epoch_duration: parameters::EpochDuration::get(),
+        babe_expected_block_time: parameters::ExpectedBlockTime::get(),
+        babe_max_authorities: parameters::MaxAuthorities::get(),
+        timestamp_minimum_period: parameters::MinimumPeriod::get(),
+        balances_existential_deposit: parameters::ExistentialDeposit::get(),
+        authority_members_max_authorities: parameters::MaxAuthorities::get(),
+        grandpa_max_authorities: parameters::MaxAuthorities::get(),
+        universal_dividend_max_past_reevals:
+            <Runtime as pallet_universal_dividend::Config>::MaxPastReeval::get(),
+        universal_dividend_square_money_growth_rate: parameters::SquareMoneyGrowthRate::get(),
+        universal_dividend_ud_creation_period: parameters::UdCreationPeriod::get() as u64,
+        universal_dividend_ud_reeval_period: parameters::UdReevalPeriod::get() as u64,
+        wot_first_issuable_on: parameters::WotFirstCertIssuableOn::get(),
+        wot_min_cert_for_membership: parameters::WotMinCertForMembership::get(),
+        wot_min_cert_for_create_idty_right: parameters::WotMinCertForCreateIdtyRight::get(),
+        identity_confirm_period: parameters::ConfirmPeriod::get(),
+        identity_change_owner_key_period: parameters::ChangeOwnerKeyPeriod::get(),
+        identity_idty_creation_period: parameters::IdtyCreationPeriod::get(),
+        identity_autorevocation_period: parameters::AutorevocationPeriod::get(),
+        membership_membership_period: parameters::MembershipPeriod::get(),
+        membership_membership_renewal_period: parameters::MembershipRenewalPeriod::get(),
+        cert_max_by_issuer: parameters::MaxByIssuer::get(),
+        cert_min_received_cert_to_be_able_to_issue_cert:
+            parameters::MinReceivedCertToBeAbleToIssueCert::get(),
+        cert_validity_period: parameters::ValidityPeriod::get(),
+        distance_min_accessible_referees: parameters::MinAccessibleReferees::get(),
+        distance_max_depth: parameters::MaxRefereeDistance::get(),
+        smith_sub_wot_min_cert_for_membership: parameters::SmithWotMinCertForMembership::get(),
+        smith_inactivity_max_duration: parameters::SmithInactivityMaxDuration::get(),
+        smith_cert_max_by_issuer: parameters::SmithMaxByIssuer::get(),
+        cert_cert_period: parameters::CertPeriod::get(),
+        treasury_spend_period: <Runtime as pallet_treasury::Config>::SpendPeriod::get(),
+    }
+}
+
+/// generate local network chainspects
+pub fn local_testnet_config(
+    initial_authorities_len: usize,
+    initial_smiths_len: usize,
+    initial_identities_len: usize,
+) -> Result<ChainSpec, String> {
+    Ok(ChainSpec::builder(
+        &get_wasm_binary().ok_or_else(|| "Development wasm not available".to_string())?,
+        None,
+    )
+    .with_name("Ğ1 Local Testnet")
+    .with_id("g1_local")
+    .with_chain_type(ChainType::Local)
+    .with_genesis_config_patch({
+        let genesis_data =
+            gen_genesis_data::generate_genesis_data_for_local_chain::<_, _, SessionKeys, G1SKP>(
+                // Initial authorities len
+                initial_authorities_len,
+                // Initial smiths len,
+                initial_smiths_len,
+                // Initial identities len
+                initial_identities_len,
+                EXISTENTIAL_DEPOSIT,
+                None,
+                // Sudo account
+                get_account_id_from_seed::<sr25519::Public>("Alice"),
+                get_parameters,
+            )
+            .expect("Genesis Data must be buildable");
+        genesis_data_to_g1_genesis_conf(genesis_data)
+    })
+    .with_properties(
+        serde_json::json!({
+            "tokenDecimals": TOKEN_DECIMALS,
+            "tokenSymbol": TOKEN_SYMBOL,
+        })
+        .as_object()
+        .expect("must be a map")
+        .clone(),
+    )
+    .build())
+}
+
+/// custom genesis
+fn genesis_data_to_g1_genesis_conf(
+    genesis_data: super::gen_genesis_data::GenesisData<GenesisParameters, SessionKeys>,
+) -> serde_json::Value {
+    let super::gen_genesis_data::GenesisData {
+        accounts,
+        treasury_balance,
+        certs_by_receiver,
+        first_ud,
+        first_ud_reeval,
+        identities,
+        initial_authorities,
+        initial_monetary_mass,
+        memberships,
+        parameters: _,
+        common_parameters: _,
+        session_keys_map,
+        initial_smiths,
+        sudo_key,
+        technical_committee_members,
+        ud,
+    } = genesis_data;
+
+    serde_json::json!({
+        "account": {
+            "accounts": accounts,
+            "treasuryBalance": treasury_balance,
+        },
+        "authorityMembers": {
+            "initialAuthorities": initial_authorities,
+        },
+        "balances": {
+            "totalIssuance": initial_monetary_mass,
+        },
+        "babe": {
+            "epochConfig": Some(BABE_GENESIS_EPOCH_CONFIG),
+        },
+        "session": {
+            "keys": session_keys_map
+                .into_iter()
+                .map(|(account_id, session_keys)| (account_id.clone(), account_id, session_keys))
+                .collect::<Vec<_>>(),
+        },
+        "sudo": { "key": sudo_key },
+        "technicalCommittee": {
+            "members": technical_committee_members,
+        },
+        "quota": {
+            "identities": identities.iter().map(|i| i.idty_index).collect::<Vec<_>>(),
+        },
+        "identity": {
+            "identities": identities
+                .into_iter()
+                .map(
+                    |GenesisIdentity {
+                         idty_index,
+                         name,
+                         owner_key,
+                         status,
+                         expires_on,
+                         revokes_on,
+                     }| GenesisIdty {
+                        index: idty_index,
+                        name: common_runtime::IdtyName::from(name.as_str()),
+                        value: common_runtime::IdtyValue {
+                            data: IdtyData::new(),
+                            next_creatable_identity_on: 0,
+                            old_owner_key: None,
+                            owner_key,
+                            next_scheduled: match status {
+                                IdtyStatus::Unconfirmed | IdtyStatus::Unvalidated => {
+                                    panic!("Unconfirmed or Unvalidated identity in genesis")
+                                }
+                                IdtyStatus::Member => expires_on.expect("must have expires_on set"),
+                                IdtyStatus::Revoked => 0,
+                                IdtyStatus::NotMember => {
+                                    revokes_on.expect("must have revokes_on set")
+                                }
+                            },
+                            status,
+                        },
+                    },
+                )
+                .collect::<Vec<GenesisIdty<g1_runtime::Runtime>>>(),
+        },
+        "certification": {
+            "applyCertPeriodAtGenesis": false,
+            "certsByReceiver": certs_by_receiver,
+        },
+        "membership": { "memberships": memberships },
+        "smithMembers": { "initialSmiths": initial_smiths},
+        "universalDividend": {
+            "firstReeval": first_ud_reeval,
+            "firstUd": first_ud,
+            "initialMonetaryMass": initial_monetary_mass,
+            "ud": ud,
+        },
+    })
+}
+
+/// Get the WASM bytes either from filesytem (`WASM_FILE` env variable giving the path to the wasm blob)
+/// or else get the one compiled from source code.
+/// Goal: allow to provide the WASM built with srtool, which is reproductible.
+fn get_wasm_binary() -> Option<Vec<u8>> {
+    let wasm_bytes_from_file = if let Ok(file_path) = env::var("WASM_FILE") {
+        Some(fs::read(file_path).unwrap_or_else(|e| panic!("Could not read wasm file: {}", e)))
+    } else {
+        None
+    };
+    wasm_bytes_from_file.or_else(|| WASM_BINARY.map(|bytes| bytes.to_vec()))
 }
diff --git a/node/src/chain_spec/gdev.rs b/node/src/chain_spec/gdev.rs
index 45a6f051423d9cc5e3e5d774389f7bc7941e3413..5b4a27c1d72bcb0d97dcf28bba5592a0b392c0c0 100644
--- a/node/src/chain_spec/gdev.rs
+++ b/node/src/chain_spec/gdev.rs
@@ -18,13 +18,9 @@ use super::*;
 use crate::chain_spec::gen_genesis_data::{
     AuthorityKeys, CommonParameters, GenesisIdentity, SessionKeysProvider,
 };
-use common_runtime::constants::*;
-use common_runtime::entities::IdtyData;
-use common_runtime::GenesisIdty;
-use common_runtime::IdtyStatus;
+use common_runtime::{constants::*, entities::IdtyData, GenesisIdty, IdtyStatus};
 use gdev_runtime::{
-    opaque::SessionKeys, pallet_universal_dividend, parameters, Runtime, RuntimeGenesisConfig,
-    WASM_BINARY,
+    opaque::SessionKeys, pallet_universal_dividend, parameters, Runtime, WASM_BINARY,
 };
 use jsonrpsee::core::JsonValue;
 use sc_network::config::MultiaddrWithPeerId;
@@ -32,10 +28,9 @@ use sc_service::ChainType;
 use sc_telemetry::TelemetryEndpoints;
 use serde::Deserialize;
 use sp_core::{sr25519, Get};
-use sp_runtime::Perbill;
 use std::{env, fs};
 
-pub type ChainSpec = sc_service::GenericChainSpec<RuntimeGenesisConfig>;
+pub type ChainSpec = sc_service::GenericChainSpec;
 
 type GenesisParameters = gdev_runtime::GenesisParameters<u32, u32, u64, u32>;
 
@@ -77,8 +72,6 @@ fn get_parameters(parameters_from_file: &Option<GenesisParameters>) -> CommonPar
         universal_dividend_square_money_growth_rate: parameters::SquareMoneyGrowthRate::get(),
         universal_dividend_ud_creation_period: parameters_from_file.ud_creation_period,
         universal_dividend_ud_reeval_period: parameters_from_file.ud_reeval_period,
-        universal_dividend_units_per_ud:
-            <Runtime as pallet_universal_dividend::Config>::UnitsPerUd::get(),
         wot_first_issuable_on: parameters_from_file.wot_first_cert_issuable_on,
         wot_min_cert_for_membership: parameters_from_file.wot_min_cert_for_membership,
         wot_min_cert_for_create_idty_right: parameters_from_file.wot_min_cert_for_create_idty_right,
@@ -92,8 +85,8 @@ fn get_parameters(parameters_from_file: &Option<GenesisParameters>) -> CommonPar
         cert_min_received_cert_to_be_able_to_issue_cert: parameters_from_file
             .cert_min_received_cert_to_issue_cert,
         cert_validity_period: parameters_from_file.cert_validity_period,
-        distance_min_accessible_referees: Perbill::from_percent(80), // TODO: generalize
-        distance_max_depth: 5,                                       // TODO: generalize
+        distance_min_accessible_referees: parameters::MinAccessibleReferees::get(),
+        distance_max_depth: parameters::MaxRefereeDistance::get(),
         smith_sub_wot_min_cert_for_membership: parameters_from_file
             .smith_wot_min_cert_for_membership,
         smith_cert_max_by_issuer: parameters_from_file.smith_cert_max_by_issuer,
diff --git a/node/src/chain_spec/gen_genesis_data.rs b/node/src/chain_spec/gen_genesis_data.rs
index 86cb6d6b7fb4afeb9be5536749c822d4f23bcb36..72a7a0dc628f0c7cde1d23d459eb923cce2e3e45 100644
--- a/node/src/chain_spec/gen_genesis_data.rs
+++ b/node/src/chain_spec/gen_genesis_data.rs
@@ -14,9 +14,14 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
+#![allow(unused_imports)]
+#![allow(dead_code)]
+
 use crate::chain_spec::{get_account_id_from_seed, get_from_seed, AccountPublic};
-use common_runtime::constants::{DAYS, MILLISECS_PER_BLOCK};
-use common_runtime::*;
+use common_runtime::{
+    constants::{DAYS, MILLISECS_PER_BLOCK},
+    *,
+};
 use log::{error, warn};
 use num_format::{Locale, ToFormattedString};
 use pallet_im_online::sr25519::AuthorityId as ImOnlineId;
@@ -24,14 +29,16 @@ use serde::{de::DeserializeOwned, Deserialize, Serialize};
 use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId;
 use sp_consensus_babe::AuthorityId as BabeId;
 use sp_consensus_grandpa::AuthorityId as GrandpaId;
-use sp_core::crypto::AccountId32;
-use sp_core::{ed25519, sr25519, Decode, Encode};
-use sp_runtime::traits::{IdentifyAccount, Verify};
-use sp_runtime::{MultiSignature, Perbill};
-use std::collections::{BTreeMap, HashMap};
-use std::fmt::{Display, Formatter};
-use std::fs;
-use std::ops::{Add, Sub};
+use sp_core::{crypto::AccountId32, ed25519, sr25519, Decode, Encode};
+use sp_runtime::{
+    traits::{IdentifyAccount, Verify},
+    MultiSignature, Perbill,
+};
+use std::{
+    collections::{BTreeMap, HashMap},
+    fmt::{Display, Formatter},
+    ops::{Add, Sub},
+};
 
 static G1_DUNITER_V1_EXISTENTIAL_DEPOSIT: u64 = 100;
 static G1_DUNITER_V1_DECIMALS: usize = 2;
@@ -124,7 +131,6 @@ pub struct GenesisIndexerExport {
     technical_committee: Vec<String>,
     ud: u64,
     wallets: BTreeMap<AccountId, u64>,
-    transactions_history: Option<BTreeMap<AccountId, Vec<TransactionV2>>>,
 }
 
 #[derive(Deserialize, Serialize)]
@@ -150,7 +156,6 @@ struct GenesisMigrationData {
     identities: BTreeMap<String, IdentityV1>,
     #[serde(default)]
     wallets: BTreeMap<PubkeyV1, u64>,
-    transactions_history: Option<BTreeMap<PubkeyV1, Vec<TransactionV1>>>,
 }
 
 // Base58 encoded Ed25519 public key
@@ -661,6 +666,9 @@ where
         panic!();
     }
 
+    // Indexer output
+    // handled by indexer directly from py-g1-migrator output
+
     let genesis_data = GenesisData {
         accounts,
         treasury_balance,
@@ -744,11 +752,6 @@ fn dump_genesis_info(info: GenesisInfo) {
         get_best_unit_and_diviser_for_ms(p.universal_dividend_ud_creation_period as f32);
     let (universal_dividend_ud_reeval_period, universal_dividend_ud_reeval_period_unit) =
         get_best_unit_and_diviser_for_ms(p.universal_dividend_ud_reeval_period as f32);
-    let (universal_dividend_units_per_ud, universal_dividend_units_per_ud_unit) =
-        get_best_unit_and_diviser_for_currency_units(
-            p.universal_dividend_units_per_ud,
-            p.currency_name.clone(),
-        );
     let (wot_first_issuable_on, wot_first_issuable_on_unit) =
         get_best_unit_and_diviser_for_blocks(p.wot_first_issuable_on);
     let (wot_min_cert_for_membership, wot_min_cert_for_membership_unit) =
@@ -805,7 +808,6 @@ fn dump_genesis_info(info: GenesisInfo) {
         - universal_dividend.square_money_growth_rate: {} {}/equinox
         - universal_dividend.ud_creation_period: {} {}
         - universal_dividend.ud_reeval_period: {} {}
-        - universal_dividend.units_per_ud: {} {}
         - wot.first_issuable_on: {} {}
         - wot.min_cert_for_membership: {} {}
         - wot.min_cert_for_create_idty_right: {} {}
@@ -847,8 +849,6 @@ fn dump_genesis_info(info: GenesisInfo) {
         universal_dividend_ud_creation_period_unit,
         universal_dividend_ud_reeval_period,
         universal_dividend_ud_reeval_period_unit,
-        universal_dividend_units_per_ud,
-        universal_dividend_units_per_ud_unit,
         wot_first_issuable_on,
         wot_first_issuable_on_unit,
         wot_min_cert_for_membership,
@@ -1614,7 +1614,6 @@ fn decorate_smiths_with_identity(
         .collect()
 }
 
-#[cfg(feature = "gdev")]
 pub fn generate_genesis_data_for_local_chain<P, SK, SessionKeys: Encode, SKP>(
     initial_authorities_len: usize,
     initial_smiths_len: usize,
@@ -1629,6 +1628,7 @@ where
     SK: Decode,
     SKP: SessionKeysProvider<SessionKeys>,
 {
+    // For benchmarking, the total length of identities should be at least MinReceivedCertToBeAbleToIssueCert + 1
     assert!(initial_identities_len <= 6);
     assert!(initial_smiths_len <= initial_identities_len);
     assert!(initial_authorities_len <= initial_smiths_len);
@@ -1773,7 +1773,6 @@ where
     Ok(genesis_data)
 }
 
-#[cfg(feature = "gdev")]
 fn clique_wot(
     initial_identities_len: usize,
 ) -> (
@@ -1800,7 +1799,6 @@ fn clique_wot(
     (certs_by_issuer, count)
 }
 
-#[cfg(feature = "gdev")]
 fn clique_smith_wot(initial_identities_len: usize) -> BTreeMap<IdtyIndex, (bool, Vec<IdtyIndex>)> {
     let mut certs_by_issuer = BTreeMap::new();
     for i in 1..=initial_identities_len {
@@ -1930,7 +1928,6 @@ pub struct CommonParameters {
     pub universal_dividend_square_money_growth_rate: Perbill,
     pub universal_dividend_ud_creation_period: u64,
     pub universal_dividend_ud_reeval_period: u64,
-    pub universal_dividend_units_per_ud: u64,
     pub wot_first_issuable_on: u32,
     pub wot_min_cert_for_membership: u32,
     pub wot_min_cert_for_create_idty_right: u32,
@@ -2000,8 +1997,10 @@ fn seconds_to_blocs(seconds: u32) -> u32 {
 #[cfg(test)]
 mod tests {
     use super::*;
-    use sp_core::crypto::{Ss58AddressFormat, Ss58Codec};
-    use sp_core::ByteArray;
+    use sp_core::{
+        crypto::{Ss58AddressFormat, Ss58Codec},
+        ByteArray,
+    };
     use std::str::FromStr;
 
     #[test]
diff --git a/node/src/chain_spec/gtest.rs b/node/src/chain_spec/gtest.rs
index 018b130b0254e9fdf1074db8b69517657a6e9de3..930d5ea75263a8cb3477ad3d0ff66af76d87a41b 100644
--- a/node/src/chain_spec/gtest.rs
+++ b/node/src/chain_spec/gtest.rs
@@ -16,14 +16,9 @@
 
 use super::*;
 use crate::chain_spec::gen_genesis_data::{CommonParameters, GenesisIdentity, SessionKeysProvider};
-use common_runtime::constants::*;
-use common_runtime::entities::IdtyData;
-use common_runtime::GenesisIdty;
-use common_runtime::IdtyStatus;
-use gtest_runtime::ImOnlineId;
+use common_runtime::{constants::*, entities::IdtyData, GenesisIdty, IdtyStatus};
 use gtest_runtime::{
-    opaque::SessionKeys, pallet_universal_dividend, parameters, AccountId, Perbill, Runtime,
-    RuntimeGenesisConfig, WASM_BINARY,
+    opaque::SessionKeys, pallet_universal_dividend, parameters, ImOnlineId, Runtime, WASM_BINARY,
 };
 use jsonrpsee::core::JsonValue;
 use sc_consensus_grandpa::AuthorityId as GrandpaId;
@@ -33,10 +28,10 @@ use sc_telemetry::TelemetryEndpoints;
 use serde::Deserialize;
 use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId;
 use sp_consensus_babe::AuthorityId as BabeId;
-use sp_core::Get;
+use sp_core::{sr25519, Get};
 use std::{env, fs};
 
-pub type ChainSpec = sc_service::GenericChainSpec<RuntimeGenesisConfig>;
+pub type ChainSpec = sc_service::GenericChainSpec;
 pub type AuthorityKeys = (
     AccountId,
     GrandpaId,
@@ -47,6 +42,7 @@ pub type AuthorityKeys = (
 
 const TOKEN_DECIMALS: usize = 2;
 const TOKEN_SYMBOL: &str = "ĞT";
+static EXISTENTIAL_DEPOSIT: u64 = parameters::ExistentialDeposit::get();
 
 #[derive(Default, Clone, Deserialize)]
 // No parameters for GTest (unlike GDev)
@@ -65,6 +61,49 @@ impl SessionKeysProvider<SessionKeys> for GTestSKP {
     }
 }
 
+/// generate local network chainspects
+pub fn local_testnet_config(
+    initial_authorities_len: usize,
+    initial_smiths_len: usize,
+    initial_identities_len: usize,
+) -> Result<ChainSpec, String> {
+    Ok(ChainSpec::builder(
+        &get_wasm_binary().ok_or_else(|| "Development wasm not available".to_string())?,
+        None,
+    )
+    .with_name("ĞTest Local Testnet")
+    .with_id("gtest_local")
+    .with_chain_type(ChainType::Local)
+    .with_genesis_config_patch({
+        let genesis_data =
+            gen_genesis_data::generate_genesis_data_for_local_chain::<_, _, SessionKeys, GTestSKP>(
+                // Initial authorities len
+                initial_authorities_len,
+                // Initial smiths len,
+                initial_smiths_len,
+                // Initial identities len
+                initial_identities_len,
+                EXISTENTIAL_DEPOSIT,
+                None,
+                // Sudo account
+                get_account_id_from_seed::<sr25519::Public>("Alice"),
+                get_parameters,
+            )
+            .expect("Genesis Data must be buildable");
+        genesis_data_to_gtest_genesis_conf(genesis_data)
+    })
+    .with_properties(
+        serde_json::json!({
+            "tokenDecimals": TOKEN_DECIMALS,
+            "tokenSymbol": TOKEN_SYMBOL,
+        })
+        .as_object()
+        .expect("must be a map")
+        .clone(),
+    )
+    .build())
+}
+
 fn get_parameters(_: &Option<GenesisParameters>) -> CommonParameters {
     CommonParameters {
         currency_name: TOKEN_SYMBOL.to_string(),
@@ -81,8 +120,6 @@ fn get_parameters(_: &Option<GenesisParameters>) -> CommonParameters {
         universal_dividend_square_money_growth_rate: parameters::SquareMoneyGrowthRate::get(),
         universal_dividend_ud_creation_period: parameters::UdCreationPeriod::get() as u64,
         universal_dividend_ud_reeval_period: parameters::UdReevalPeriod::get() as u64,
-        universal_dividend_units_per_ud:
-            <Runtime as pallet_universal_dividend::Config>::UnitsPerUd::get(),
         wot_first_issuable_on: parameters::WotFirstCertIssuableOn::get(),
         wot_min_cert_for_membership: parameters::WotMinCertForMembership::get(),
         wot_min_cert_for_create_idty_right: parameters::WotMinCertForCreateIdtyRight::get(),
@@ -96,8 +133,8 @@ fn get_parameters(_: &Option<GenesisParameters>) -> CommonParameters {
         cert_min_received_cert_to_be_able_to_issue_cert:
             parameters::MinReceivedCertToBeAbleToIssueCert::get(),
         cert_validity_period: parameters::ValidityPeriod::get(),
-        distance_min_accessible_referees: Perbill::from_percent(80), // TODO: generalize
-        distance_max_depth: 5,                                       // TODO: generalize
+        distance_min_accessible_referees: parameters::MinAccessibleReferees::get(),
+        distance_max_depth: parameters::MaxRefereeDistance::get(),
         smith_sub_wot_min_cert_for_membership: parameters::SmithWotMinCertForMembership::get(),
         smith_inactivity_max_duration: parameters::SmithInactivityMaxDuration::get(),
         smith_cert_max_by_issuer: parameters::SmithMaxByIssuer::get(),
diff --git a/node/src/cli.rs b/node/src/cli.rs
index effac655de2fd519c2a098967d56a53128fcc601..a494a87277526392ea467bd24b12c5e60f1d553c 100644
--- a/node/src/cli.rs
+++ b/node/src/cli.rs
@@ -80,14 +80,6 @@ pub enum Subcommand {
     /// The pallet benchmarking moved to the `pallet` sub-command.
     #[clap(subcommand)]
     Benchmark(Box<frame_benchmarking_cli::BenchmarkCmd>),
-
-    /// Try some command against runtime state.
-    #[cfg(feature = "try-runtime")]
-    TryRuntime(try_runtime_cli::TryRuntimeCmd),
-
-    /// Try some command against runtime state. Note: `try-runtime` feature must be enabled.
-    #[cfg(not(feature = "try-runtime"))]
-    TryRuntime,
 }
 
 /// Block authoring scheme to be used by the node
diff --git a/node/src/command.rs b/node/src/command.rs
index 0173cf03f01b23283029739cdfbeab1b96b2a1c7..29af1944580fb2cbd3d0cef340c20c0fb9e2b70d 100644
--- a/node/src/command.rs
+++ b/node/src/command.rs
@@ -20,17 +20,12 @@
 pub mod key;
 pub mod utils;
 
-#[cfg(feature = "gtest")]
-use crate::chain_spec::gtest;
-use crate::cli::{Cli, Subcommand};
-#[cfg(feature = "g1")]
-use crate::service::g1_executor::G1Executor;
-#[cfg(feature = "gdev")]
-use crate::service::gdev_executor::GDevExecutor;
-#[cfg(feature = "gtest")]
-use crate::service::gtest_executor::GTestExecutor;
-use crate::service::{IdentifyRuntimeType, RuntimeType};
-use crate::{chain_spec, service};
+use crate::{
+    chain_spec,
+    cli::{Cli, Subcommand},
+    service,
+    service::{runtime_executor::Executor, RuntimeType},
+};
 use clap::CommandFactory;
 #[cfg(feature = "runtime-benchmarks")]
 use frame_benchmarking_cli::{BenchmarkCmd, SUBSTRATE_REFERENCE_HARDWARE};
@@ -48,7 +43,7 @@ lazy_static! {
     };
 }*/
 
-/// Unwraps a [`crate::client::Client`] into the concrete runtime client.
+/// Unwraps a [`crate::service::client::Client`] into the concrete runtime client.
 #[cfg(feature = "runtime-benchmarks")]
 macro_rules! unwrap_client {
     (
@@ -56,14 +51,7 @@ macro_rules! unwrap_client {
 		$code:expr
 	) => {
         match $client.as_ref() {
-            #[cfg(feature = "g1")]
-            crate::service::client::Client::G1($client) => $code,
-            #[cfg(feature = "gtest")]
-            crate::service::client::Client::GTest($client) => $code,
-            #[cfg(feature = "gdev")]
-            crate::service::client::Client::GDev($client) => $code,
-            #[allow(unreachable_patterns)]
-            _ => panic!("unknown runtime"),
+            crate::service::client::Client::Client($client) => $code,
         }
     };
 }
@@ -95,19 +83,21 @@ impl SubstrateCli for Cli {
 
     fn load_spec(&self, id: &str) -> Result<Box<dyn sc_service::ChainSpec>, String> {
         Ok(match id {
-            // === GDEV ===
-            // development chainspec with generated genesis and Alice validator
+            // Development chainspec with generated genesis and Alice as a validator
+            // For benchmarking, the total length of identities should be at least MinReceivedCertToBeAbleToIssueCert + 1
             #[cfg(feature = "gdev")]
-            "dev" => Box::new(chain_spec::gdev::local_testnet_config(1, 3, 4)?),
-            // local testnet with g1 data, gdev configuration (parameters & smiths) and Alice validator
-            // > optionally from DUNITER_GENESIS_CONFIG file to override default gdev configuration
+            "dev" => Box::new(chain_spec::gdev::local_testnet_config(1, 5, 6)?),
+
+            // Local testnet with G1 data, Gdev configuration (parameters & Smiths), and Alice as a validator.
+            // Optionally, load configuration from DUNITER_GENESIS_CONFIG file to override default Gdev configuration.
             #[cfg(feature = "gdev")]
             "gdev_dev" => Box::new(chain_spec::gdev::gdev_development_chain_spec(
                 "resources/gdev.yaml".to_string(),
             )?),
-            // chainspecs for live network with g1 data, gdev configuration (parameters & smiths)
-            // but must have a smith with declared session keys
-            // > optionally from DUNITER_GENESIS_CONFIG file to override default gdev configuration
+
+            // Chainspecs for live network with G1 data, Gdev configuration (parameters & Smiths).
+            // A Smith with declared session keys is required.
+            // Optionally load configuration from DUNITER_GENESIS_CONFIG file to override default Gdev configuration.
             #[cfg(feature = "gdev")]
             "gdev_live" => {
                 const CLIENT_SPEC: &str = "./node/specs/gdev_client-specs.yaml";
@@ -119,34 +109,37 @@ impl SubstrateCli for Cli {
                     .map_err(|e| format!("failed to read {CLIENT_SPEC} {e}"))?[..],
                 )
                 .map_err(|e| format!("failed to parse {e}"))?;
-                // rebuild chainspecs from these files
                 Box::new(chain_spec::gdev::gen_live_conf(
                     client_spec,
                     "resources/gdev.yaml".to_string(),
                 )?)
             }
-            // hardcoded previously generated raw chainspecs
-            // yields a pointlessly heavy binary because of hexadecimal-text-encoded values
+
+            // Hardcoded raw chainspecs with previously generated values, resulting in a needlessly heavy binary due to hexadecimal-text-encoded values.
             #[cfg(feature = "gdev")]
             "gdev" => Box::new(chain_spec::gdev::ChainSpec::from_json_bytes(
                 &include_bytes!("../specs/gdev-raw.json")[..],
             )?),
-            // === GTEST ===
-            // generate dev chainspecs with Alice validator
-            // provide DUNITER_GTEST_GENESIS env var if you want to build genesis from json
-            // otherwise you get a local testnet with generated genesis
+
+            // For benchmarking, the total length of identities should be at least MinReceivedCertToBeAbleToIssueCert + 1
+            #[cfg(feature = "gtest")]
+            "dev" => Box::new(chain_spec::gtest::local_testnet_config(1, 5, 6)?),
+
+            // Generate development chainspecs with Alice as a validator.
+            // Provide the DUNITER_GTEST_GENESIS environment variable to build genesis from JSON; otherwise, a local testnet with generated genesis will be used.
             #[cfg(feature = "gtest")]
             "gtest_dev" => Box::new(chain_spec::gtest::development_chainspecs(
                 "resources/gtest.yaml".to_string(),
             )?),
-            // chainspecs for live network
-            // must have following files in ./node/specs folder or overwrite with env var:
+
+            // Chainspecs for the live network.
+            // Required files in the ./node/specs folder or override with environment variables:
             // - gtest.json / DUNITER_GTEST_GENESIS
             // - gtest_client-specs.json / DUNITER_GTEST_CLIENT_SPEC
             #[cfg(feature = "gtest")]
             "gtest_live" => {
                 const JSON_CLIENT_SPEC: &str = "./node/specs/gtest_client-specs.yaml";
-                let client_spec: gtest::ClientSpec = serde_yaml::from_slice(
+                let client_spec: chain_spec::gtest::ClientSpec = serde_yaml::from_slice(
                     &std::fs::read(
                         std::env::var("DUNITER_CLIENT_SPEC")
                             .unwrap_or_else(|_| JSON_CLIENT_SPEC.to_string()),
@@ -154,31 +147,25 @@ impl SubstrateCli for Cli {
                     .map_err(|e| format!("failed to read {JSON_CLIENT_SPEC} {e}"))?[..],
                 )
                 .map_err(|e| format!("failed to parse {e}"))?;
-                // rebuild chainspecs from these files
                 Box::new(chain_spec::gtest::live_chainspecs(
                     client_spec,
                     "resources/gtest.yaml".to_string(),
                 )?)
             }
-            // return hardcoded live chainspecs, only with embed feature
-            // embed client spec and genesis to avoid embeding hexadecimal runtime
-            // and having hexadecimal runtime in git history
-            // will only build on a branch that has a file
-            // ./node/specs/gtest-raw.json
+
+            // Return hardcoded live chainspecs, only with the embed feature enabled.
+            // Embed client spec and genesis to avoid embedding hexadecimal runtime
+            // and having hexadecimal runtime in the git history.
+            // This will only build on a branch that has a file named ./node/specs/gtest-raw.json.
             #[cfg(all(feature = "gtest", feature = "embed"))]
             "gtest" => Box::new(chain_spec::gtest::ChainSpec::from_json_bytes(
                 &include_bytes!("../specs/gtest-raw.json")[..],
             )?),
 
-            // === G1 ===
+            // For benchmarking, the total length of identities should be at least MinReceivedCertToBeAbleToIssueCert + 1
             #[cfg(feature = "g1")]
-            "g1" => {
-                unimplemented!()
-                //Box::new(chain_spec::g1::ChainSpec::from_json_file(file_path)?)
-            }
-            // Specs provided as json specify which runtime to use in their file name. For example,
-            // `g1-custom.json` uses the g1 runtime.
-            // `gdev-workshop.json` uses the gdev runtime.
+            "dev" => Box::new(chain_spec::g1::local_testnet_config(1, 5, 6)?),
+
             path => {
                 let path = std::path::PathBuf::from(path);
 
@@ -311,7 +298,7 @@ pub fn run() -> sc_cli::Result<()> {
         #[cfg(feature = "runtime-benchmarks")]
         Some(Subcommand::Benchmark(cmd)) => {
             let runner = cli.create_runner(&**cmd)?;
-            let chain_spec = &runner.config().chain_spec;
+            let _chain_spec = &runner.config().chain_spec;
 
             match &**cmd {
                 BenchmarkCmd::Storage(cmd) => runner.sync_run(|config| {
@@ -346,30 +333,14 @@ pub fn run() -> sc_cli::Result<()> {
                 }),
                 BenchmarkCmd::Pallet(cmd) => {
                     if cfg!(feature = "runtime-benchmarks") {
-                        match chain_spec.runtime_type() {
-                            #[cfg(feature = "g1")]
-                            RuntimeType::G1 => runner.sync_run(|config| {
-                                cmd.run::<g1_runtime::Block, ExtendedHostFunctions<
-                                    sp_io::SubstrateHostFunctions,
-                                    <G1Executor as NativeExecutionDispatch>::ExtendHostFunctions,
-                                >>(config)
-                            }),
-                            #[cfg(feature = "gtest")]
-                            RuntimeType::GTest => runner.sync_run(|config| {
-                                cmd.run::<gtest_runtime::Block, ExtendedHostFunctions<
-                                    sp_io::SubstrateHostFunctions,
-                                    <GTestExecutor as NativeExecutionDispatch>::ExtendHostFunctions,
-                                >>(config)
-                            }),
-                            #[cfg(feature = "gdev")]
-                            RuntimeType::GDev => runner.sync_run(|config| {
-                                cmd.run::<gdev_runtime::Block, ExtendedHostFunctions<
-                                    sp_io::SubstrateHostFunctions,
-                                    <GDevExecutor as NativeExecutionDispatch>::ExtendHostFunctions,
-                                >>(config)
-                            }),
-                            _ => Err(sc_cli::Error::Application("unknown runtime type".into())),
-                        }
+                        runner.sync_run(|config| {
+                            cmd.run_with_spec::<sp_runtime::traits::HashingFor<
+                                service::runtime_executor::runtime::Block,
+                            >, ExtendedHostFunctions<
+                                sp_io::SubstrateHostFunctions,
+                                <Executor as NativeExecutionDispatch>::ExtendHostFunctions,
+                            >>(Some(config.chain_spec))
+                        })
                     } else {
                         Err("Benchmarking wasn't enabled when building the node. \
 								You can enable it with `--features runtime-benchmarks`."
@@ -391,47 +362,6 @@ pub fn run() -> sc_cli::Result<()> {
             You can enable it with `--features runtime-benchmarks`."
                 .into())
         }
-        #[cfg(feature = "try-runtime")]
-        Some(Subcommand::TryRuntime(cmd)) => {
-            let runner = cli.create_runner(cmd)?;
-            let chain_spec = &runner.config().chain_spec;
-
-            use sc_service::TaskManager;
-            let registry = &runner
-                .config()
-                .prometheus_config
-                .as_ref()
-                .map(|cfg| &cfg.registry);
-            let task_manager = TaskManager::new(runner.config().tokio_handle.clone(), *registry)
-                .map_err(|e| {
-                    sc_cli::Error::Application(format!("Fail to create TaskManager: {}", e).into())
-                })?;
-
-            // Ensure dev spec
-            if !chain_spec.id().ends_with("dev") {
-                return Err(sc_cli::Error::Application(
-                    "try-runtime only support dev specs".into(),
-                ));
-            }
-
-            match chain_spec.runtime_type() {
-                #[cfg(feature = "gdev")]
-                RuntimeType::GDev => {
-                    //sp_core::crypto::set_default_ss58_version(Ss58AddressFormatRegistry::GDev);
-                    runner.async_run(|config| {
-                        Ok((
-                            cmd.run::<gdev_runtime::Block, GDevExecutor>(config),
-                            task_manager,
-                        ))
-                    })
-                }
-                _ => Err(sc_cli::Error::Application("unknown runtime type".into())),
-            }
-        }
-        #[cfg(not(feature = "try-runtime"))]
-        Some(Subcommand::TryRuntime) => Err("TryRuntime wasn't enabled when building the node. \
-				You can enable it with `--features try-runtime`."
-            .into()),
         None => {
             let runner = cli.create_runner(&cli.run)?;
             runner.run_node_until_exit(|mut config| async move {
@@ -441,23 +371,13 @@ pub fn run() -> sc_cli::Result<()> {
                     config.offchain_worker.indexing_enabled = true;
                 }
 
-                match config.chain_spec.runtime_type() {
-                    #[cfg(feature = "g1")]
-                    RuntimeType::G1 => {
-                        service::new_full::<g1_runtime::RuntimeApi>(config, cli.sealing)
-                            .map_err(sc_cli::Error::Service)
-                    }
-                    #[cfg(feature = "gtest")]
-                    RuntimeType::GTest => {
-                        service::new_full::<gtest_runtime::RuntimeApi>(config, cli.sealing)
-                            .map_err(sc_cli::Error::Service)
-                    }
-                    #[cfg(feature = "gdev")]
-                    RuntimeType::GDev => {
-                        service::new_full::<gdev_runtime::RuntimeApi>(config, cli.sealing)
-                            .map_err(sc_cli::Error::Service)
-                    }
-                    _ => Err(sc_cli::Error::Application("unknown runtime".into())),
+                {
+                    service::new_full::<
+                        service::runtime_executor::runtime::RuntimeApi,
+                        Executor,
+                        sc_network::Litep2pNetworkBackend,
+                    >(config, cli.sealing)
+                    .map_err(sc_cli::Error::Service)
                 }
             })
         }
diff --git a/node/src/rpc.rs b/node/src/rpc.rs
index 301d4ce9febc08b08b9f4adfec31b5b1664e4ead..f5e6f09b23a70f8f48131f89b7c92ff756a63386 100644
--- a/node/src/rpc.rs
+++ b/node/src/rpc.rs
@@ -21,13 +21,13 @@
 
 #![warn(missing_docs)]
 
-pub use sc_rpc_api::DenyUnsafe;
-
-use common_runtime::Block;
-use common_runtime::{AccountId, Balance, Index};
+use common_runtime::{AccountId, Balance, Block, BlockNumber, Hash, Index};
 use jsonrpsee::RpcModule;
-use sc_consensus_babe::BabeApi;
-use sc_consensus_babe::BabeWorkerHandle;
+use sc_consensus_babe::{BabeApi, BabeWorkerHandle};
+use sc_consensus_grandpa::{
+    self, FinalityProofProvider, GrandpaJustificationStream, SharedAuthoritySet, SharedVoterState,
+};
+use sc_rpc::SubscriptionTaskExecutor;
 use sc_transaction_pool_api::TransactionPool;
 use sp_api::ProvideRuntimeApi;
 use sp_block_builder::BlockBuilder;
@@ -45,29 +45,42 @@ pub struct BabeDeps {
     pub keystore: KeystorePtr,
 }
 
+/// Dependencies for GRANDPA
+#[derive(Clone)]
+pub struct GrandpaDeps<B> {
+    /// Voting round info.
+    pub shared_voter_state: SharedVoterState,
+    /// Authority set info.
+    pub shared_authority_set: SharedAuthoritySet<Hash, BlockNumber>,
+    /// Receives notifications about justification events from Grandpa.
+    pub justification_stream: GrandpaJustificationStream<Block>,
+    /// Executor to drive the subscription manager in the Grandpa RPC handler.
+    pub subscription_executor: SubscriptionTaskExecutor,
+    /// Finality proof provider.
+    pub finality_provider: Arc<FinalityProofProvider<B, Block>>,
+}
+
 /// Full client dependencies.
-pub struct FullDeps<C, P, SC> {
+pub struct FullDeps<C, P, SC, B> {
     /// The client instance to use.
     pub client: Arc<C>,
     /// Transaction pool instance.
     pub pool: Arc<P>,
     /// The SelectChain Strategy
     pub select_chain: SC,
-    /// A copy of the chain spec.
-    pub chain_spec: Box<dyn sc_chain_spec::ChainSpec>,
-    /// Whether to deny unsafe calls
-    pub deny_unsafe: DenyUnsafe,
     /// Manual seal command sink
     pub command_sink_opt: Option<
         futures::channel::mpsc::Sender<sc_consensus_manual_seal::EngineCommand<sp_core::H256>>,
     >,
     /// BABE specific dependencies.
     pub babe: Option<BabeDeps>,
+    /// GRANDPA specific dependencies.
+    pub grandpa: GrandpaDeps<B>,
 }
 
 /// Instantiate all full RPC extensions.
-pub fn create_full<C, P, SC>(
-    deps: FullDeps<C, P, SC>,
+pub fn create_full<C, P, SC, B>(
+    deps: FullDeps<C, P, SC, B>,
 ) -> Result<RpcModule<()>, Box<dyn std::error::Error + Send + Sync>>
 where
     C: ProvideRuntimeApi<Block>,
@@ -79,9 +92,11 @@ where
     C::Api: BlockBuilder<Block>,
     P: TransactionPool + 'static,
     SC: SelectChain<Block> + 'static,
+    B: sc_client_api::Backend<Block> + 'static,
 {
     use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer};
     use sc_consensus_babe_rpc::{Babe, BabeApiServer};
+    use sc_consensus_grandpa_rpc::{Grandpa, GrandpaApiServer};
     use sc_consensus_manual_seal::rpc::{ManualSeal, ManualSealApiServer};
     use substrate_frame_rpc_system::{System, SystemApiServer};
 
@@ -90,10 +105,9 @@ where
         client,
         pool,
         select_chain,
-        chain_spec: _,
-        deny_unsafe,
         command_sink_opt,
         babe,
+        grandpa,
     } = deps;
 
     if let Some(babe) = babe {
@@ -102,17 +116,29 @@ where
             keystore,
         } = babe;
         module.merge(
-            Babe::new(
-                client.clone(),
-                babe_worker_handle,
-                keystore,
-                select_chain,
-                deny_unsafe,
-            )
-            .into_rpc(),
+            Babe::new(client.clone(), babe_worker_handle, keystore, select_chain).into_rpc(),
         )?;
     }
-    module.merge(System::new(client.clone(), pool, deny_unsafe).into_rpc())?;
+
+    let GrandpaDeps {
+        shared_voter_state,
+        shared_authority_set,
+        justification_stream,
+        subscription_executor,
+        finality_provider,
+    } = grandpa;
+    module.merge(
+        Grandpa::new(
+            subscription_executor,
+            shared_authority_set,
+            shared_voter_state,
+            justification_stream,
+            finality_provider,
+        )
+        .into_rpc(),
+    )?;
+
+    module.merge(System::new(client.clone(), pool).into_rpc())?;
     module.merge(TransactionPayment::new(client).into_rpc())?;
     if let Some(command_sink) = command_sink_opt {
         // We provide the rpc handler with the sending end of the channel to allow the rpc
diff --git a/node/src/service.rs b/node/src/service.rs
index 134e7e49e1ca0596d56cc6ab06897cb2ad246c8e..8946443088e3857c2f5c5c6feb4c9c43582919f9 100644
--- a/node/src/service.rs
+++ b/node/src/service.rs
@@ -22,14 +22,15 @@ use self::client::{Client, ClientHandle, RuntimeApiCollection};
 use async_io::Timer;
 use common_runtime::Block;
 use futures::{Stream, StreamExt};
-use sc_client_api::client::BlockBackend;
-use sc_client_api::Backend;
-use sc_consensus_grandpa::SharedVoterState;
+use sc_client_api::{client::BlockBackend, Backend};
+use sc_consensus_grandpa::{FinalityProofProvider, SharedVoterState};
 use sc_consensus_manual_seal::{run_manual_seal, EngineCommand, ManualSealParams};
-pub use sc_executor::WasmExecutor;
-use sc_service::WarpSyncParams;
-use sc_service::{error::Error as ServiceError, Configuration, PartialComponents, TaskManager};
+use sc_rpc::SubscriptionTaskExecutor;
+use sc_service::{
+    error::Error as ServiceError, Configuration, PartialComponents, TaskManager, WarpSyncConfig,
+};
 use sc_telemetry::{Telemetry, TelemetryWorker};
+use sp_consensus_babe::inherents::InherentDataProvider;
 use sp_core::H256;
 use sp_runtime::traits::BlakeTwo256;
 use std::{sync::Arc, time::Duration};
@@ -43,64 +44,51 @@ type HostFunctions = (
     frame_benchmarking::benchmarking::HostFunctions,
 );
 
-type FullClient<RuntimeApi> =
-    sc_service::TFullClient<Block, RuntimeApi, WasmExecutor<HostFunctions>>;
+// Allow to use native Runtime for debugging/development purposes
+#[cfg(feature = "native")]
+type FullClient<RuntimeApi, Executor> =
+    sc_service::TFullClient<Block, RuntimeApi, sc_executor::NativeElseWasmExecutor<Executor>>;
+// By default, WASM only Runtime
+#[cfg(not(feature = "native"))]
+type FullClient<RuntimeApi, Executor> =
+    sc_service::TFullClient<Block, RuntimeApi, sc_executor::WasmExecutor<Executor>>;
+
 type FullBackend = sc_service::TFullBackend<Block>;
 type FullSelectChain = sc_consensus::LongestChain<FullBackend, Block>;
 
-#[allow(dead_code)]
-#[cfg(feature = "gdev")]
-pub mod gdev_executor {
-    pub use gdev_runtime;
+pub mod runtime_executor {
+    use crate::service::HostFunctions;
+    #[cfg(feature = "g1")]
+    pub use g1_runtime as runtime;
+    #[cfg(feature = "gdev")]
+    pub use gdev_runtime as runtime;
+    #[cfg(feature = "gtest")]
+    pub use gtest_runtime as runtime;
 
-    pub struct GDevExecutor;
-    impl sc_executor::NativeExecutionDispatch for GDevExecutor {
-        type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions;
+    use sc_executor::sp_wasm_interface::{Function, HostFunctionRegistry};
 
-        fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {
-            gdev_runtime::api::dispatch(method, data)
-        }
-
-        fn native_version() -> sc_executor::NativeVersion {
-            gdev_runtime::native_version()
-        }
-    }
-}
-
-#[allow(dead_code)]
-#[cfg(feature = "g1")]
-pub mod g1_executor {
-    pub use g1_runtime;
-
-    pub struct G1Executor;
-    impl sc_executor::NativeExecutionDispatch for G1Executor {
+    pub struct Executor;
+    impl sc_executor::NativeExecutionDispatch for Executor {
         type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions;
 
         fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {
-            g1_runtime::api::dispatch(method, data)
+            runtime::api::dispatch(method, data)
         }
 
         fn native_version() -> sc_executor::NativeVersion {
-            g1_runtime::native_version()
+            runtime::native_version()
         }
     }
-}
-
-#[allow(dead_code)]
-#[cfg(feature = "gtest")]
-pub mod gtest_executor {
-    pub use gtest_runtime;
-
-    pub struct GTestExecutor;
-    impl sc_executor::NativeExecutionDispatch for GTestExecutor {
-        type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions;
-
-        fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {
-            gtest_runtime::api::dispatch(method, data)
+    impl sc_executor::sp_wasm_interface::HostFunctions for Executor {
+        fn host_functions() -> Vec<&'static dyn Function> {
+            HostFunctions::host_functions()
         }
 
-        fn native_version() -> sc_executor::NativeVersion {
-            gtest_runtime::native_version()
+        fn register_static<T>(registry: &mut T) -> Result<(), T::Error>
+        where
+            T: HostFunctionRegistry,
+        {
+            HostFunctions::register_static(registry)
         }
     }
 }
@@ -116,27 +104,6 @@ pub enum RuntimeType {
     GTest,
 }
 
-/// Can be called for a `Configuration` to check if it is a configuration for
-/// a particular runtime type.
-pub trait IdentifyRuntimeType {
-    /// Returns the runtime type
-    fn runtime_type(&self) -> RuntimeType;
-}
-
-impl IdentifyRuntimeType for Box<dyn sc_chain_spec::ChainSpec> {
-    fn runtime_type(&self) -> RuntimeType {
-        if self.id().starts_with("g1") {
-            RuntimeType::G1
-        } else if self.id().starts_with("dev") || self.id().starts_with("gdev") {
-            RuntimeType::GDev
-        } else if self.id().starts_with("gtest") {
-            RuntimeType::GTest
-        } else {
-            panic!("unknown runtime")
-        }
-    }
-}
-
 /// Builds a new object suitable for chain operations.
 #[allow(clippy::type_complexity)]
 pub fn new_chain_ops(
@@ -151,94 +118,68 @@ pub fn new_chain_ops(
     ),
     ServiceError,
 > {
-    match config.chain_spec.runtime_type() {
-        #[cfg(feature = "g1")]
-        RuntimeType::G1::G1 => {
-            let PartialComponents {
-                client,
-                backend,
-                import_queue,
-                task_manager,
-                ..
-            } = new_partial::<g1_runtime::RuntimeApi>(config, manual_consensus)?;
-            Ok((
-                Arc::new(Client::G1(client)),
-                backend,
-                import_queue,
-                task_manager,
-            ))
-        }
-        #[cfg(feature = "gtest")]
-        RuntimeType::GTest => {
-            let PartialComponents {
-                client,
-                backend,
-                import_queue,
-                task_manager,
-                ..
-            } = new_partial::<gtest_runtime::RuntimeApi>(config, manual_consensus)?;
-            Ok((
-                Arc::new(Client::GTest(client)),
-                backend,
-                import_queue,
-                task_manager,
-            ))
-        }
-        #[cfg(feature = "gdev")]
-        RuntimeType::GDev => {
-            let PartialComponents {
-                client,
-                backend,
-                import_queue,
-                task_manager,
-                ..
-            } = new_partial::<gdev_runtime::RuntimeApi>(config, manual_consensus)?;
-            Ok((
-                Arc::new(Client::GDev(client)),
-                backend,
-                import_queue,
-                task_manager,
-            ))
-        }
-        _ => panic!("unknown runtime"),
-    }
+    let PartialComponents {
+        client,
+        backend,
+        import_queue,
+        task_manager,
+        ..
+    } = new_partial::<runtime_executor::runtime::RuntimeApi, runtime_executor::Executor>(
+        config,
+        manual_consensus,
+    )?;
+    Ok((
+        Arc::new(Client::Client(client)),
+        backend,
+        import_queue,
+        task_manager,
+    ))
 }
 
-type FullGrandpaBlockImport<RuntimeApi> = sc_consensus_grandpa::GrandpaBlockImport<
+type FullGrandpaBlockImport<RuntimeApi, Executor> = sc_consensus_grandpa::GrandpaBlockImport<
     FullBackend,
     Block,
-    FullClient<RuntimeApi>,
+    FullClient<RuntimeApi, Executor>,
     FullSelectChain,
 >;
 
 #[allow(clippy::type_complexity)]
-pub fn new_partial<RuntimeApi>(
+pub fn new_partial<RuntimeApi, Executor>(
     config: &Configuration,
     consensus_manual: bool,
 ) -> Result<
     sc_service::PartialComponents<
-        FullClient<RuntimeApi>,
+        FullClient<RuntimeApi, Executor>,
         FullBackend,
         FullSelectChain,
         sc_consensus::DefaultImportQueue<Block>,
-        sc_transaction_pool::FullPool<Block, FullClient<RuntimeApi>>,
+        sc_transaction_pool::FullPool<Block, FullClient<RuntimeApi, Executor>>,
         (
             sc_consensus_babe::BabeBlockImport<
                 Block,
-                FullClient<RuntimeApi>,
-                FullGrandpaBlockImport<RuntimeApi>,
+                FullClient<RuntimeApi, Executor>,
+                FullGrandpaBlockImport<RuntimeApi, Executor>,
             >,
             sc_consensus_babe::BabeLink<Block>,
             Option<sc_consensus_babe::BabeWorkerHandle<Block>>,
-            sc_consensus_grandpa::LinkHalf<Block, FullClient<RuntimeApi>, FullSelectChain>,
+            sc_consensus_grandpa::LinkHalf<
+                Block,
+                FullClient<RuntimeApi, Executor>,
+                FullSelectChain,
+            >,
             Option<Telemetry>,
         ),
     >,
     ServiceError,
 >
 where
-    RuntimeApi: sp_api::ConstructRuntimeApi<Block, FullClient<RuntimeApi>> + Send + Sync + 'static,
+    RuntimeApi: sp_api::ConstructRuntimeApi<Block, FullClient<RuntimeApi, Executor>>
+        + Send
+        + Sync
+        + 'static,
     RuntimeApi::RuntimeApi: RuntimeApiCollection,
+    Executor: sc_executor::NativeExecutionDispatch + 'static,
+    Executor: sc_executor::sp_wasm_interface::HostFunctions + 'static,
 {
     let telemetry = config
         .telemetry_endpoints
@@ -251,7 +192,10 @@ where
         })
         .transpose()?;
 
-    let executor = sc_service::new_wasm_executor(config);
+    #[cfg(feature = "native")]
+    let executor = sc_service::new_native_or_wasm_executor(&config.executor);
+    #[cfg(not(feature = "native"))]
+    let executor = sc_service::new_wasm_executor(&config.executor);
 
     let (client, backend, keystore_container, task_manager) =
         sc_service::new_full_parts::<Block, RuntimeApi, _>(
@@ -314,11 +258,10 @@ where
                 create_inherent_data_providers: move |_, ()| async move {
                     let timestamp = sp_timestamp::InherentDataProvider::from_system_time();
 
-                    let slot =
-				sp_consensus_babe::inherents::InherentDataProvider::from_timestamp_and_slot_duration(
-					*timestamp,
-					slot_duration,
-				);
+                    let slot = InherentDataProvider::from_timestamp_and_slot_duration(
+                        *timestamp,
+                        slot_duration,
+                    );
 
                     Ok((slot, timestamp))
                 },
@@ -353,13 +296,22 @@ where
 }
 
 /// Builds a new service for a full client.
-pub fn new_full<RuntimeApi>(
+pub fn new_full<
+    RuntimeApi,
+    Executor,
+    N: sc_network::NetworkBackend<Block, <Block as sp_runtime::traits::Block>::Hash>,
+>(
     config: Configuration,
     sealing: crate::cli::Sealing,
 ) -> Result<TaskManager, ServiceError>
 where
-    RuntimeApi: sp_api::ConstructRuntimeApi<Block, FullClient<RuntimeApi>> + Send + Sync + 'static,
+    RuntimeApi: sp_api::ConstructRuntimeApi<Block, FullClient<RuntimeApi, Executor>>
+        + Send
+        + Sync
+        + 'static,
     RuntimeApi::RuntimeApi: RuntimeApiCollection,
+    Executor: sc_executor::NativeExecutionDispatch + 'static,
+    Executor: sc_executor::sp_wasm_interface::HostFunctions + 'static,
 {
     let sc_service::PartialComponents {
         client,
@@ -370,7 +322,7 @@ where
         select_chain,
         transaction_pool,
         other: (block_import, babe_link, babe_worker_handle, grandpa_link, mut telemetry),
-    } = new_partial::<RuntimeApi>(&config, sealing.is_manual_consensus())?;
+    } = new_partial::<RuntimeApi, Executor>(&config, sealing.is_manual_consensus())?;
 
     let grandpa_protocol_name = sc_consensus_grandpa::protocol_standard_name(
         &client
@@ -381,9 +333,19 @@ where
         &config.chain_spec,
     );
 
-    let mut net_config = sc_network::config::FullNetworkConfiguration::new(&config.network);
+    let mut net_config = sc_network::config::FullNetworkConfiguration::<
+        Block,
+        <Block as sp_runtime::traits::Block>::Hash,
+        N,
+    >::new(&config.network, config.prometheus_registry().cloned());
+    let metrics = N::register_notification_metrics(config.prometheus_registry());
+    let peer_store_handle = net_config.peer_store_handle();
     let (grandpa_protocol_config, grandpa_notification_service) =
-        sc_consensus_grandpa::grandpa_peers_set_config(grandpa_protocol_name.clone());
+        sc_consensus_grandpa::grandpa_peers_set_config::<_, N>(
+            grandpa_protocol_name.clone(),
+            metrics.clone(),
+            peer_store_handle,
+        );
     net_config.add_notification_protocol(grandpa_protocol_config);
 
     let warp_sync = Arc::new(sc_consensus_grandpa::warp_proof::NetworkProvider::new(
@@ -401,11 +363,12 @@ where
             spawn_handle: task_manager.spawn_handle(),
             import_queue,
             block_announce_validator_builder: None,
-            warp_sync_params: Some(WarpSyncParams::WithProvider(warp_sync)),
+            warp_sync_config: Some(WarpSyncConfig::WithProvider(warp_sync)),
             block_relay: None,
+            metrics,
         })?;
 
-    let role = config.role.clone();
+    let role = config.role;
     let force_authoring = config.force_authoring;
     let backoff_authoring_blocks: Option<()> = None;
     let name = config.network.node_name.clone();
@@ -427,7 +390,7 @@ where
                         transaction_pool.clone(),
                     ),
                 ),
-                network_provider: network.clone(),
+                network_provider: Arc::new(network.clone()),
                 is_validator: role.is_authority(),
                 enable_http_requests: false,
                 custom_extensions: move |_| vec![],
@@ -530,13 +493,13 @@ where
                                     client.clone(),
                                 )
                                 .map_err(|err| format!("{:?}", err))?;
-                            let babe = sp_consensus_babe::inherents::InherentDataProvider::new(
+                            let babe = InherentDataProvider::new(
                                 timestamp.slot(),
                             );
                             let distance =
                                 dc_distance::create_distance_inherent_data_provider::<
                                     Block,
-                                    FullClient<RuntimeApi>,
+                                    FullClient<RuntimeApi, Executor>,
                                     FullBackend,
                                 >(
                                     &*client, parent, distance_dir, &babe_owner_keys.clone()
@@ -570,11 +533,10 @@ where
                     async move {
                         let timestamp = sp_timestamp::InherentDataProvider::from_system_time();
 
-                        let slot =
-						sp_consensus_babe::inherents::InherentDataProvider::from_timestamp_and_slot_duration(
-							*timestamp,
-							slot_duration,
-						);
+                        let slot = InherentDataProvider::from_timestamp_and_slot_duration(
+                            *timestamp,
+                            slot_duration,
+                        );
 
                         let storage_proof =
                             sp_transaction_storage_proof::registration::new_data_provider(
@@ -583,7 +545,7 @@ where
 
                         let distance = dc_distance::create_distance_inherent_data_provider::<
                             Block,
-                            FullClient<RuntimeApi>,
+                            FullClient<RuntimeApi, Executor>,
                             FullBackend,
                         >(
                             &*client, parent, distance_dir, &babe_owner_keys.clone()
@@ -611,30 +573,45 @@ where
         }
     }
 
+    let justification_stream = grandpa_link.justification_stream();
+    let shared_authority_set = grandpa_link.shared_authority_set().clone();
+    let shared_voter_state = SharedVoterState::empty();
+    let finality_proof_provider =
+        FinalityProofProvider::new_for_service(backend.clone(), Some(shared_authority_set.clone()));
+
     let rpc_extensions_builder = {
         let client = client.clone();
         let pool = transaction_pool.clone();
         let select_chain = select_chain;
-        let chain_spec = config.chain_spec.cloned_box();
         let keystore = keystore_container.keystore().clone();
         let babe_deps = babe_worker_handle.map(|babe_worker_handle| crate::rpc::BabeDeps {
             babe_worker_handle,
             keystore: keystore.clone(),
         });
+        let rpc_setup = shared_voter_state.clone();
+
+        Box::new(
+            move |subscription_task_executor: SubscriptionTaskExecutor| {
+                let grandpa_deps = crate::rpc::GrandpaDeps {
+                    shared_voter_state: rpc_setup.clone(),
+                    shared_authority_set: shared_authority_set.clone(),
+                    justification_stream: justification_stream.clone(),
+                    subscription_executor: subscription_task_executor.clone(),
+                    finality_provider: finality_proof_provider.clone(),
+                };
 
-        Box::new(move |deny_unsafe, _| {
-            let deps = crate::rpc::FullDeps {
-                client: client.clone(),
-                pool: pool.clone(),
-                select_chain: select_chain.clone(),
-                chain_spec: chain_spec.cloned_box(),
-                deny_unsafe,
-                babe: babe_deps.clone(),
-                command_sink_opt: command_sink_opt.clone(),
-            };
+                let deps = crate::rpc::FullDeps {
+                    client: client.clone(),
+                    pool: pool.clone(),
+                    select_chain: select_chain.clone(),
+                    babe: babe_deps.clone(),
+                    grandpa: grandpa_deps,
+                    command_sink_opt: command_sink_opt.clone(),
+                };
 
-            crate::rpc::create_full(deps).map_err(Into::into)
-        })
+                crate::rpc::create_full(deps).map_err(Into::into)
+            },
+        )
     };
 
     let _rpc_handlers = sc_service::spawn_tasks(sc_service::SpawnTasksParams {
@@ -685,7 +662,7 @@ where
             network,
             voting_rule: sc_consensus_grandpa::VotingRulesBuilder::default().build(),
             prometheus_registry,
-            shared_voter_state: SharedVoterState::empty(),
+            shared_voter_state,
             telemetry: telemetry.as_ref().map(|x| x.handle()),
             notification_service: grandpa_notification_service,
             offchain_tx_pool_factory: sc_transaction_pool_api::OffchainTransactionPoolFactory::new(
diff --git a/node/src/service/client.rs b/node/src/service/client.rs
index 1faebeb6c44fd4561bf23621b43e147745cad237..34fbea16a7e4ae512759761d3a9a7d5359865873 100644
--- a/node/src/service/client.rs
+++ b/node/src/service/client.rs
@@ -15,9 +15,9 @@
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
 use common_runtime::{AccountId, Balance, Block, BlockNumber, Hash, Header, Index};
-use sc_client_api::MerkleValue;
 use sc_client_api::{
-    AuxStore, Backend as BackendT, BlockchainEvents, KeysIter, PairsIter, UsageProvider,
+    AuxStore, Backend as BackendT, BlockchainEvents, KeysIter, MerkleValue, PairsIter,
+    UsageProvider,
 };
 use sp_api::{CallApiAt, ProvideRuntimeApi};
 use sp_blockchain::{HeaderBackend, HeaderMetadata};
@@ -145,12 +145,14 @@ impl<Api> RuntimeApiCollection for Api where
 /// A client instance.
 #[derive(Clone)]
 pub enum Client {
-    #[cfg(feature = "g1")]
-    G1(Arc<super::FullClient<g1_runtime::RuntimeApi>>),
-    #[cfg(feature = "gtest")]
-    GTest(Arc<super::FullClient<gtest_runtime::RuntimeApi>>),
-    #[cfg(feature = "gdev")]
-    GDev(Arc<super::FullClient<gdev_runtime::RuntimeApi>>),
+    Client(
+        Arc<
+            super::FullClient<
+                super::runtime_executor::runtime::RuntimeApi,
+                super::runtime_executor::Executor,
+            >,
+        >,
+    ),
 }
 
 macro_rules! with_client {
@@ -162,22 +164,8 @@ macro_rules! with_client {
         }
     } => {
         match $self {
-            #[cfg(feature = "g1")]
-            Self::G1($client) => {
+            Self::Client($client) => {
                 #[allow(unused_imports)]
-                use g1_runtime as runtime;
-                $( $code )*
-            }
-            #[cfg(feature = "gtest")]
-            Self::GTest($client) => {
-                #[allow(unused_imports)]
-                use gtest_runtime as runtime;
-                $( $code )*
-            }
-            #[cfg(feature = "gdev")]
-            Self::GDev($client) => {
-                #[allow(unused_imports)]
-                use gdev_runtime as runtime;
                 $( $code )*
             }
         }
@@ -196,36 +184,32 @@ impl ClientHandle for Client {
     }
 }
 
-#[cfg(feature = "g1")]
-impl From<Arc<super::FullClient<g1_runtime::RuntimeApi>>> for Client {
-    fn from(client: Arc<super::FullClient<g1_runtime::RuntimeApi>>) -> Self {
-        Self::G1(client)
-    }
-}
-
-#[cfg(feature = "gtest")]
-impl From<Arc<super::FullClient<gtest_runtime::RuntimeApi>>> for Client {
-    fn from(client: Arc<super::FullClient<gtest_runtime::RuntimeApi>>) -> Self {
-        Self::GTest(client)
-    }
-}
-
-#[cfg(feature = "gdev")]
-impl From<Arc<super::FullClient<gdev_runtime::RuntimeApi>>> for Client {
-    fn from(client: Arc<super::FullClient<gdev_runtime::RuntimeApi>>) -> Self {
-        Self::GDev(client)
+impl
+    From<
+        Arc<
+            super::FullClient<
+                super::runtime_executor::runtime::RuntimeApi,
+                super::runtime_executor::Executor,
+            >,
+        >,
+    > for Client
+{
+    fn from(
+        client: Arc<
+            super::FullClient<
+                super::runtime_executor::runtime::RuntimeApi,
+                super::runtime_executor::Executor,
+            >,
+        >,
+    ) -> Self {
+        Self::Client(client)
     }
 }
 
 macro_rules! match_client {
     ($self:ident, $method:ident($($param:ident),*)) => {
         match $self {
-            #[cfg(feature = "g1")]
-            Self::G1(client) => client.$method($($param),*),
-            #[cfg(feature = "gtest")]
-            Self::GTest(client) => client.$method($($param),*),
-            #[cfg(feature = "gdev")]
-            Self::GDev(client) => client.$method($($param),*),
+            Self::Client(client) => client.$method($($param),*),
         }
     };
 }
@@ -310,21 +294,28 @@ trait BenchmarkCallSigner<RuntimeCall: Encode + Clone, Signer: Pair> {
 }
 
 #[cfg(feature = "g1")]
-use g1_runtime as runtime;
-#[cfg(feature = "gdev")]
-use gdev_runtime as runtime;
+type FullClient = super::FullClient<
+    super::runtime_executor::runtime::RuntimeApi,
+    super::runtime_executor::Executor,
+>;
 #[cfg(feature = "gdev")]
-type FullClient = super::FullClient<runtime::RuntimeApi>;
-#[cfg(feature = "gtest")]
-use gtest_runtime as runtime;
+type FullClient = super::FullClient<
+    super::runtime_executor::runtime::RuntimeApi,
+    super::runtime_executor::Executor,
+>;
 #[cfg(feature = "gtest")]
-type FullClient = super::FullClient<runtime::RuntimeApi>;
-
-#[cfg(any(feature = "gdev", feature = "gtest"))]
-impl BenchmarkCallSigner<runtime::RuntimeCall, sp_core::sr25519::Pair> for FullClient {
+type FullClient = super::FullClient<
+    super::runtime_executor::runtime::RuntimeApi,
+    super::runtime_executor::Executor,
+>;
+
+#[cfg(any(feature = "gdev", feature = "gtest", feature = "g1"))]
+impl BenchmarkCallSigner<super::runtime_executor::runtime::RuntimeCall, sp_core::sr25519::Pair>
+    for FullClient
+{
     fn sign_call(
         &self,
-        call: runtime::RuntimeCall,
+        call: super::runtime_executor::runtime::RuntimeCall,
         nonce: u32,
         current_block: u64,
         period: u64,
@@ -333,17 +324,20 @@ impl BenchmarkCallSigner<runtime::RuntimeCall, sp_core::sr25519::Pair> for FullC
     ) -> sp_runtime::OpaqueExtrinsic {
         // use runtime;
 
-        let extra: runtime::SignedExtra = (
-            frame_system::CheckNonZeroSender::<runtime::Runtime>::new(),
-            frame_system::CheckSpecVersion::<runtime::Runtime>::new(),
-            frame_system::CheckTxVersion::<runtime::Runtime>::new(),
-            frame_system::CheckGenesis::<runtime::Runtime>::new(),
-            frame_system::CheckMortality::<runtime::Runtime>::from(
+        let extra: super::runtime_executor::runtime::SignedExtra = (
+            frame_system::CheckNonZeroSender::<super::runtime_executor::runtime::Runtime>::new(),
+            frame_system::CheckSpecVersion::<super::runtime_executor::runtime::Runtime>::new(),
+            frame_system::CheckTxVersion::<super::runtime_executor::runtime::Runtime>::new(),
+            frame_system::CheckGenesis::<super::runtime_executor::runtime::Runtime>::new(),
+            frame_system::CheckMortality::<super::runtime_executor::runtime::Runtime>::from(
                 sp_runtime::generic::Era::mortal(period, current_block),
             ),
-            frame_system::CheckNonce::<runtime::Runtime>::from(nonce).into(),
-            frame_system::CheckWeight::<runtime::Runtime>::new(),
-            pallet_transaction_payment::ChargeTransactionPayment::<runtime::Runtime>::from(0),
+            frame_system::CheckNonce::<super::runtime_executor::runtime::Runtime>::from(nonce)
+                .into(),
+            frame_system::CheckWeight::<super::runtime_executor::runtime::Runtime>::new(),
+            pallet_transaction_payment::ChargeTransactionPayment::<
+                super::runtime_executor::runtime::Runtime,
+            >::from(0),
         );
 
         let payload = sp_runtime::generic::SignedPayload::from_raw(
@@ -351,8 +345,8 @@ impl BenchmarkCallSigner<runtime::RuntimeCall, sp_core::sr25519::Pair> for FullC
             extra.clone(),
             (
                 (),
-                runtime::VERSION.spec_version,
-                runtime::VERSION.transaction_version,
+                super::runtime_executor::runtime::VERSION.spec_version,
+                super::runtime_executor::runtime::VERSION.transaction_version,
                 genesis,
                 genesis,
                 (),
@@ -362,7 +356,7 @@ impl BenchmarkCallSigner<runtime::RuntimeCall, sp_core::sr25519::Pair> for FullC
         );
 
         let signature = payload.using_encoded(|p| acc.sign(p));
-        runtime::UncheckedExtrinsic::new_signed(
+        super::runtime_executor::runtime::UncheckedExtrinsic::new_signed(
             call,
             sp_runtime::AccountId32::from(acc.public()).into(),
             common_runtime::Signature::Sr25519(signature),
@@ -384,10 +378,10 @@ impl frame_benchmarking_cli::ExtrinsicBuilder for Client {
     fn build(&self, nonce: u32) -> std::result::Result<sp_runtime::OpaqueExtrinsic, &'static str> {
         with_client! {
             self, client, {
-                let call = runtime::RuntimeCall::System(runtime::SystemCall::remark { remark: vec![] });
+                let call = super::runtime_executor::runtime::RuntimeCall::System(super::runtime_executor::runtime::SystemCall::remark { remark: vec![] });
                 let signer = sp_keyring::Sr25519Keyring::Bob.pair();
 
-                let period = runtime::BlockHashCount::get().checked_next_power_of_two().map(|c| c / 2).unwrap_or(2) as u64;
+                let period = super::runtime_executor::runtime::BlockHashCount::get().checked_next_power_of_two().map(|c| c / 2).unwrap_or(2) as u64;
                 let genesis = client.usage_info().chain.best_hash;
 
                 Ok(client.sign_call(call, nonce, 0, period, genesis, signer))
diff --git a/pallets/authority-members/Cargo.toml b/pallets/authority-members/Cargo.toml
index 2e3aa3a14701a2d6e84086fe6ef47f4b73575ccb..36885c3bab0c77110fe3a75f38058e2242cb0ab8 100644
--- a/pallets/authority-members/Cargo.toml
+++ b/pallets/authority-members/Cargo.toml
@@ -5,7 +5,6 @@ edition.workspace = true
 homepage.workspace = true
 license.workspace = true
 name = "pallet-authority-members"
-readme = "README.md"
 repository.workspace = true
 version.workspace = true
 
@@ -34,7 +33,6 @@ std = [
 	"sp-runtime/std",
 	"sp-staking/std",
 	"sp-state-machine/std",
-	"sp-std/std",
 ]
 try-runtime = [
 	"frame-support/try-runtime",
@@ -60,8 +58,7 @@ serde = { workspace = true, features = ["derive"] }
 sp-core = { workspace = true }
 sp-runtime = { workspace = true }
 sp-staking = { workspace = true }
-sp-std = { workspace = true }
 
 [dev-dependencies]
-sp-io = { workspace = true }
-sp-state-machine = { workspace = true }
+sp-io = { workspace = true, default-features = true }
+sp-state-machine = { workspace = true, default-features = true }
diff --git a/pallets/authority-members/README.md b/pallets/authority-members/README.md
deleted file mode 100644
index 3edf76eba9a5e7702065681758bd89966a0747f5..0000000000000000000000000000000000000000
--- a/pallets/authority-members/README.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Duniter authority members pallet
-
-In a permissioned network, we have to define the set of authorities, and among these authorities, the ones validators in the next session. That's what authority members pallet does. In practice:
-
-- it manages a `Members` set with some custom rules
-- it implements the `SessionManager` trait from the FRAME session pallet
-
-## Entering the set of authorities
-
-To become part of Duniter authorities, one has to complete these steps:
-
-1. become member of the main web of trust
-1. request membership to the smith sub wot
-1. get enough certs to get smith membership
-1. claim membership to the set of authorities
-
-Then one can "go online" and "go offline" to enter or leave two sessions after.
-
-## Some vocabulary
-
-*Smiths* are people allowed to forge blocks, but in details this is:
-
-- **smith** status required to become an authority
-- **authority** status required to become validator
-- **validator** status required to add blocks
\ No newline at end of file
diff --git a/pallets/authority-members/src/impls.rs b/pallets/authority-members/src/impls.rs
index 6a1930e3f42ed0a98fc865ce7b4bcaf483c630af..337f4689584f66d2296bc585cc562ac86e9d5086 100644
--- a/pallets/authority-members/src/impls.rs
+++ b/pallets/authority-members/src/impls.rs
@@ -23,13 +23,10 @@
 #![allow(clippy::type_complexity)]
 
 use super::pallet::*;
-use frame_support::pallet_prelude::Weight;
-use frame_support::traits::Get;
-use pallet_offences::traits::OnOffenceHandler;
-use pallet_offences::SlashStrategy;
+use frame_support::{pallet_prelude::Weight, traits::Get};
+use pallet_offences::{traits::OnOffenceHandler, SlashStrategy};
 use sp_runtime::traits::Convert;
-use sp_staking::offence::OffenceDetails;
-use sp_staking::SessionIndex;
+use sp_staking::{offence::OffenceDetails, SessionIndex};
 
 impl<T: Config>
     OnOffenceHandler<T::AccountId, pallet_session::historical::IdentificationTuple<T>, Weight>
diff --git a/pallets/authority-members/src/lib.rs b/pallets/authority-members/src/lib.rs
index 963a180b59a92982758d71828484d7b7eabdb657..587e82aa343c51fbc62bf36d61d3755a68d536f4 100644
--- a/pallets/authority-members/src/lib.rs
+++ b/pallets/authority-members/src/lib.rs
@@ -14,6 +14,33 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
+//! # Duniter Authority Members Pallet
+//!
+//! In a permissioned network, defining the set of authorities and selecting validators for the next session is crucial.
+//! The authority members pallet is responsible for this. Specifically, it:
+//!
+//! - Manages a `Members` set with custom rules.
+//! - Implements the `SessionManager` trait from the FRAME session pallet.
+//!
+//! ## Entering the Set of Authorities
+//!
+//! To become part of Duniter authorities, one must follow these steps:
+//!
+//! 1. Become a member of the main web of trust.
+//! 2. Request membership to the smith sub web of trust.
+//! 3. Obtain enough certifications to gain smith membership.
+//! 4. Claim membership to the set of authorities.
+//!
+//! After becoming an authority, one can "go online" and "go offline" to enter or leave two sessions later.
+//!
+//! ## Some Vocabulary
+//!
+//! *Smiths* are individuals allowed to forge blocks. Specifically, this entails:
+//!
+//! - **Smith** status is required to become an authority.
+//! - **Authority** status is required to become a validator.
+//! - **Validator** status is required to add blocks.
+
 #![cfg_attr(not(feature = "std"), no_std)]
 #![allow(clippy::type_complexity)]
 
@@ -28,30 +55,27 @@ mod mock;
 #[cfg(test)]
 mod tests;
 
-#[cfg(feature = "runtime-benchmarks")]
 mod benchmarking;
 
-//pub use impls::*;
 pub use pallet::*;
 pub use sp_staking::SessionIndex;
 pub use traits::*;
 pub use types::*;
 pub use weights::WeightInfo;
 
+use codec::alloc::borrow::ToOwned;
 use frame_support::traits::Get;
-use sp_runtime::traits::Convert;
-use sp_std::prelude::*;
+use scale_info::prelude::{collections::BTreeMap, vec, vec::Vec};
+use sp_runtime::traits::{Convert, IsMember};
 
 #[frame_support::pallet]
 pub mod pallet {
     use super::*;
-    use frame_support::pallet_prelude::*;
-    use frame_support::traits::ValidatorRegistration;
-    use frame_support::traits::{StorageVersion, UnfilteredDispatchable};
+    use frame_support::{
+        pallet_prelude::*,
+        traits::{StorageVersion, UnfilteredDispatchable, ValidatorRegistration},
+    };
     use frame_system::pallet_prelude::*;
-    use sp_runtime::traits::{Convert, IsMember};
-    use sp_std::collections::btree_map::BTreeMap;
-    use sp_std::vec;
 
     /// The current storage version.
     const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);
@@ -67,17 +91,35 @@ pub mod pallet {
     pub trait Config:
         frame_system::Config + pallet_session::Config + pallet_session::historical::Config
     {
+        /// Specifies the type that determines membership status.
         type IsMember: IsMember<Self::MemberId>;
+
+        /// Handler for when a new session is initiated.
         type OnNewSession: OnNewSession;
+
+        /// Handler for when a member is removed from authorities.
         type OnOutgoingMember: OnOutgoingMember<Self::MemberId>;
+
+        /// Handler for when a new member is added to authorities.
         type OnIncomingMember: OnIncomingMember<Self::MemberId>;
-        /// Max number of authorities allowed
+
+        /// Maximum number of authorities allowed.
         #[pallet::constant]
         type MaxAuthorities: Get<u32>;
+
+        /// Type representing the identifier of a member.
         type MemberId: Copy + Ord + MaybeSerializeDeserialize + Parameter;
+
+        /// Converts an `AccountId` to an optional `MemberId`.
         type MemberIdOf: Convert<Self::AccountId, Option<Self::MemberId>>;
+
+        /// Specifies the origin type required to remove a member.
         type RemoveMemberOrigin: EnsureOrigin<Self::RuntimeOrigin>;
+
+        /// The overarching event type.
         type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
+
+        /// Type representing the weight of this pallet
         type WeightInfo: WeightInfo;
     }
 
@@ -123,28 +165,28 @@ pub mod pallet {
 
     // STORAGE //
 
-    /// list incoming authorities
+    /// The incoming authorities.
     #[pallet::storage]
     #[pallet::getter(fn incoming)]
     pub type IncomingAuthorities<T: Config> = StorageValue<_, Vec<T::MemberId>, ValueQuery>;
 
-    /// list online authorities
+    /// The online authorities.
     #[pallet::storage]
     #[pallet::getter(fn online)]
     pub type OnlineAuthorities<T: Config> = StorageValue<_, Vec<T::MemberId>, ValueQuery>;
 
-    /// list outgoing authorities
+    /// The outgoing authorities.
     #[pallet::storage]
     #[pallet::getter(fn outgoing)]
     pub type OutgoingAuthorities<T: Config> = StorageValue<_, Vec<T::MemberId>, ValueQuery>;
 
-    /// maps member id to member data
+    /// The member data.
     #[pallet::storage]
     #[pallet::getter(fn member)]
     pub type Members<T: Config> =
         StorageMap<_, Twox64Concat, T::MemberId, MemberData<T::AccountId>, OptionQuery>;
 
-    // Blacklist.
+    /// The blacklisted authorities.
     #[pallet::storage]
     #[pallet::getter(fn blacklist)]
     pub type Blacklist<T: Config> = StorageValue<_, Vec<T::MemberId>, ValueQuery>;
@@ -204,7 +246,7 @@ pub mod pallet {
 
     #[pallet::call]
     impl<T: Config> Pallet<T> {
-        /// ask to leave the set of validators two sessions after
+        /// Request to leave the set of validators two sessions later.
         #[pallet::call_index(0)]
         #[pallet::weight(<T as pallet::Config>::WeightInfo::go_offline())]
         pub fn go_offline(origin: OriginFor<T>) -> DispatchResultWithPostInfo {
@@ -233,7 +275,7 @@ pub mod pallet {
             Ok(().into())
         }
 
-        /// ask to join the set of validators two sessions after
+        /// Request to join the set of validators two sessions later.
         #[pallet::call_index(1)]
         #[pallet::weight(<T as pallet::Config>::WeightInfo::go_online())]
         pub fn go_online(origin: OriginFor<T>) -> DispatchResultWithPostInfo {
@@ -274,7 +316,7 @@ pub mod pallet {
             Ok(().into())
         }
 
-        /// declare new session keys to replace current ones
+        /// Declare new session keys to replace current ones.
         #[pallet::call_index(2)]
         #[pallet::weight(<T as pallet::Config>::WeightInfo::set_session_keys())]
         pub fn set_session_keys(origin: OriginFor<T>, keys: T::Keys) -> DispatchResultWithPostInfo {
@@ -292,7 +334,7 @@ pub mod pallet {
             Ok(().into())
         }
 
-        /// remove an identity from the set of authorities
+        /// Remove a member from the set of validators.
         #[pallet::call_index(3)]
         #[pallet::weight(<T as pallet::Config>::WeightInfo::remove_member())]
         pub fn remove_member(
@@ -307,6 +349,7 @@ pub mod pallet {
             Ok(().into())
         }
 
+        /// Remove a member from the blacklist.
         #[pallet::call_index(4)]
         #[pallet::weight(<T as pallet::Config>::WeightInfo::remove_member_from_blacklist())]
         /// remove an identity from the blacklist
@@ -335,7 +378,7 @@ pub mod pallet {
         //  The return type of the annotated function must be `Result`. All changes to storage performed
         //  by the annotated function are discarded if it returns `Err`, or committed if `Ok`.
         #[frame_support::transactional]
-        /// change owner key of an authority member
+        /// Change the owner key of an authority member.
         pub fn change_owner_key(
             member_id: T::MemberId,
             new_owner_key: T::AccountId,
@@ -370,6 +413,7 @@ pub mod pallet {
             Ok(().into())
         }
 
+        /// Get the number of authorities.
         pub fn authorities_counter() -> u32 {
             let count = OnlineAuthorities::<T>::get().len() + IncomingAuthorities::<T>::get().len()
                 - OutgoingAuthorities::<T>::get().len();
@@ -380,7 +424,7 @@ pub mod pallet {
     // INTERNAL FUNCTIONS //
 
     impl<T: Config> Pallet<T> {
-        /// perform authority member removal
+        /// Perform authority member removal.
         fn do_remove_member(member_id: T::MemberId, owner_key: T::AccountId) {
             if Self::is_online(member_id) {
                 // Trigger the member deletion for next session
@@ -407,7 +451,7 @@ pub mod pallet {
             Self::deposit_event(Event::MemberRemoved { member: member_id });
         }
 
-        /// perform incoming authorities insertion
+        /// Perform incoming authorities insertion.
         fn insert_in(member_id: T::MemberId) -> bool {
             let not_already_inserted = IncomingAuthorities::<T>::mutate(|members_ids| {
                 if let Err(index) = members_ids.binary_search(&member_id) {
@@ -423,7 +467,7 @@ pub mod pallet {
             not_already_inserted
         }
 
-        /// perform outgoing authority insertion
+        /// Perform outgoing authority insertion.
         pub fn insert_out(member_id: T::MemberId) -> bool {
             let not_already_inserted = OutgoingAuthorities::<T>::mutate(|members_ids| {
                 if let Err(index) = members_ids.binary_search(&member_id) {
@@ -439,33 +483,33 @@ pub mod pallet {
             not_already_inserted
         }
 
-        /// check if member is incoming
+        /// Check if member is incoming.
         fn is_incoming(member_id: T::MemberId) -> bool {
             IncomingAuthorities::<T>::get()
                 .binary_search(&member_id)
                 .is_ok()
         }
 
-        /// check if member is online
+        /// C&heck if member is online.
         fn is_online(member_id: T::MemberId) -> bool {
             OnlineAuthorities::<T>::get()
                 .binary_search(&member_id)
                 .is_ok()
         }
 
-        /// check if member is outgoing
+        /// Check if member is outgoing.
         fn is_outgoing(member_id: T::MemberId) -> bool {
             OutgoingAuthorities::<T>::get()
                 .binary_search(&member_id)
                 .is_ok()
         }
 
-        /// check if member is blacklisted
+        /// Check if member is blacklisted.
         fn is_blacklisted(member_id: T::MemberId) -> bool {
             Blacklist::<T>::get().contains(&member_id)
         }
 
-        /// perform removal from incoming authorities
+        /// Perform removal from incoming authorities.
         fn remove_in(member_id: T::MemberId) {
             IncomingAuthorities::<T>::mutate(|members_ids| {
                 if let Ok(index) = members_ids.binary_search(&member_id) {
@@ -474,7 +518,7 @@ pub mod pallet {
             })
         }
 
-        /// perform removal from online authorities
+        /// Perform removal from online authorities.
         fn remove_online(member_id: T::MemberId) {
             OnlineAuthorities::<T>::mutate(|members_ids| {
                 if let Ok(index) = members_ids.binary_search(&member_id) {
@@ -483,7 +527,7 @@ pub mod pallet {
             });
         }
 
-        /// perform removal from outgoing authorities
+        /// Perform removal from outgoing authorities.
         fn remove_out(member_id: T::MemberId) {
             OutgoingAuthorities::<T>::mutate(|members_ids| {
                 if let Ok(index) = members_ids.binary_search(&member_id) {
@@ -492,7 +536,7 @@ pub mod pallet {
             });
         }
 
-        /// check that accountid is member
+        /// Check that account is member.
         fn verify_ownership_and_membership(
             who: &T::AccountId,
         ) -> Result<T::MemberId, DispatchError> {
@@ -616,7 +660,7 @@ impl<T: Config> pallet_session::historical::SessionManager<T::ValidatorId, T::Fu
 {
     fn new_session(
         new_index: SessionIndex,
-    ) -> Option<sp_std::vec::Vec<(T::ValidatorId, T::FullIdentification)>> {
+    ) -> Option<Vec<(T::ValidatorId, T::FullIdentification)>> {
         <Self as pallet_session::SessionManager<_>>::new_session(new_index).map(|validators_ids| {
             validators_ids
                 .into_iter()
@@ -627,7 +671,7 @@ impl<T: Config> pallet_session::historical::SessionManager<T::ValidatorId, T::Fu
 
     fn new_session_genesis(
         new_index: SessionIndex,
-    ) -> Option<sp_std::vec::Vec<(T::ValidatorId, T::FullIdentification)>> {
+    ) -> Option<Vec<(T::ValidatorId, T::FullIdentification)>> {
         <Self as pallet_session::SessionManager<_>>::new_session_genesis(new_index).map(
             |validators_ids| {
                 validators_ids
diff --git a/pallets/authority-members/src/mock.rs b/pallets/authority-members/src/mock.rs
index f4d412df500eacbd3f611a7d28f574f92e3c77a3..8afd17edf1855d4cae6591f65a5dd05f63635ddf 100644
--- a/pallets/authority-members/src/mock.rs
+++ b/pallets/authority-members/src/mock.rs
@@ -18,16 +18,14 @@ use super::*;
 use crate::{self as pallet_authority_members};
 use frame_support::{pallet_prelude::*, parameter_types, traits::Everything};
 use frame_system as system;
-use pallet_offences::traits::OnOffenceHandler;
-use pallet_offences::SlashStrategy;
+use pallet_offences::{traits::OnOffenceHandler, SlashStrategy};
 use pallet_session::ShouldEndSession;
 use sp_core::{crypto::key_types::DUMMY, H256};
-use sp_runtime::BuildStorage;
 use sp_runtime::{
     impl_opaque_keys,
     testing::UintAuthorityId,
     traits::{BlakeTwo256, ConvertInto, IdentityLookup, IsMember, OpaqueKeys},
-    KeyTypeId,
+    BuildStorage, KeyTypeId,
 };
 use sp_staking::offence::OffenceDetails;
 use sp_state_machine::BasicExternalities;
@@ -75,16 +73,21 @@ impl system::Config for Test {
     type Hashing = BlakeTwo256;
     type Lookup = IdentityLookup<Self::AccountId>;
     type MaxConsumers = frame_support::traits::ConstU32<16>;
+    type MultiBlockMigrator = ();
     type Nonce = u64;
     type OnKilledAccount = ();
     type OnNewAccount = ();
     type OnSetCode = ();
     type PalletInfo = PalletInfo;
+    type PostInherents = ();
+    type PostTransactions = ();
+    type PreInherents = ();
     type RuntimeCall = RuntimeCall;
     type RuntimeEvent = RuntimeEvent;
     type RuntimeOrigin = RuntimeOrigin;
     type RuntimeTask = ();
     type SS58Prefix = SS58Prefix;
+    type SingleBlockMigrations = ();
     type SystemWeightInfo = ();
     type Version = ();
 }
@@ -165,6 +168,8 @@ pub fn new_test_ext(initial_authorities_len: u64) -> sp_io::TestExternalities {
         .map(|i| (i * 3, i * 3, UintAuthorityId(i * 3).into()))
         .collect();
 
+    let non_authority_keys = Vec::default();
+
     let mut t = frame_system::GenesisConfig::<Test>::default()
         .build_storage()
         .unwrap();
@@ -181,9 +186,12 @@ pub fn new_test_ext(initial_authorities_len: u64) -> sp_io::TestExternalities {
     }
     .assimilate_storage(&mut t)
     .unwrap();
-    pallet_session::GenesisConfig::<Test> { keys }
-        .assimilate_storage(&mut t)
-        .unwrap();
+    pallet_session::GenesisConfig::<Test> {
+        keys,
+        non_authority_keys,
+    }
+    .assimilate_storage(&mut t)
+    .unwrap();
     sp_io::TestExternalities::new(t)
 }
 
diff --git a/pallets/authority-members/src/tests.rs b/pallets/authority-members/src/tests.rs
index ab1218ccd334407b8ab86895773830ddabfac15e..35dbced547b14c81c773c8286a97a88e0bd3e37f 100644
--- a/pallets/authority-members/src/tests.rs
+++ b/pallets/authority-members/src/tests.rs
@@ -16,11 +16,9 @@
 
 use super::*;
 use crate::mock::*;
-use crate::MemberData;
 use frame_support::{assert_err, assert_noop, assert_ok};
 use frame_system::RawOrigin;
-use sp_runtime::testing::UintAuthorityId;
-use sp_runtime::traits::BadOrigin;
+use sp_runtime::{testing::UintAuthorityId, traits::BadOrigin};
 use sp_staking::offence::OffenceDetails;
 
 const EMPTY: Vec<u64> = Vec::new();
diff --git a/pallets/authority-members/src/types.rs b/pallets/authority-members/src/types.rs
index bec91587a7c82061ffd27b1f6e5cdfd022fa1bba..577ed751b1ef4cbbed4190ed797d665cc5df72f6 100644
--- a/pallets/authority-members/src/types.rs
+++ b/pallets/authority-members/src/types.rs
@@ -21,10 +21,11 @@ use scale_info::TypeInfo;
 #[cfg(feature = "std")]
 use serde::{Deserialize, Serialize};
 
+/// Represents data associated with a member.
 #[cfg_attr(feature = "std", derive(Debug, Deserialize, Serialize))]
 #[derive(Encode, Decode, Clone, PartialEq, Eq, TypeInfo)]
 pub struct MemberData<AccountId> {
-    /// pubkey of the member
+    /// Public key of the member.
     pub owner_key: AccountId,
 }
 
diff --git a/pallets/certification/Cargo.toml b/pallets/certification/Cargo.toml
index eff126ff965729be10b2f487ec5ffa34b6b54ac3..da66e2a7ec65c2bb562a72b0747871ba462631c5 100644
--- a/pallets/certification/Cargo.toml
+++ b/pallets/certification/Cargo.toml
@@ -5,7 +5,6 @@ edition.workspace = true
 homepage.workspace = true
 license.workspace = true
 name = "pallet-certification"
-readme = "README.md"
 repository.workspace = true
 version.workspace = true
 
@@ -28,7 +27,6 @@ std = [
 	"sp-io/std",
 	"sp-keystore/std",
 	"sp-runtime/std",
-	"sp-std/std",
 ]
 try-runtime = [
 	"duniter-primitives/try-runtime",
@@ -50,9 +48,8 @@ frame-system = { workspace = true }
 scale-info = { workspace = true, features = ["derive"] }
 sp-core = { workspace = true }
 sp-runtime = { workspace = true }
-sp-std = { workspace = true }
 
 [dev-dependencies]
-maplit = { workspace = true }
-sp-io = { workspace = true }
-sp-keystore = { workspace = true }
+maplit = { workspace = true, default-features = true }
+sp-io = { workspace = true, default-features = true }
+sp-keystore = { workspace = true, default-features = true }
diff --git a/pallets/certification/README.md b/pallets/certification/README.md
deleted file mode 100644
index a84e9f9eadc0250a756b32d0bfb1cf3e24c198bb..0000000000000000000000000000000000000000
--- a/pallets/certification/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# Duniter certification pallet
-
-Duniter certifications are the *edges* in the Duniter [Web of Trust](../duniter-wot/). They can have different meanings:
-
-- in the case of the main WoT, they mean "I have met this person IRL and trust them" (see Ğ1 Licence)
-- in the case of the smith sub-WoT, they mean "I trust this person to be able to run Duniter securely" (see smith Licence)
-
-This pallet manages certifications creation, deletion...
\ No newline at end of file
diff --git a/pallets/certification/src/benchmarking.rs b/pallets/certification/src/benchmarking.rs
index 7fa0534d5afa95819aacb5b1d522a83d8f20fe4b..1fa4b0bfb708c1573e8dc46f2fdd60c2488b723c 100644
--- a/pallets/certification/src/benchmarking.rs
+++ b/pallets/certification/src/benchmarking.rs
@@ -82,7 +82,7 @@ mod benchmarks {
     }
 
     #[benchmark]
-    fn del_cert() -> Result<(), BenchmarkError> {
+    fn del_cert() {
         let issuer: T::IdtyIndex = 1.into();
         let receiver: T::IdtyIndex = 2.into();
         // try to add cert if missing, else ignore
@@ -100,7 +100,6 @@ mod benchmarks {
             }
             .into(),
         );
-        Ok(())
     }
 
     #[benchmark]
diff --git a/pallets/certification/src/lib.rs b/pallets/certification/src/lib.rs
index 88cdf0c29eb380a495eaef0cb5f8baff799715a5..08aa992f71627b50bc57fb8bf059eeb8b3dabc72 100644
--- a/pallets/certification/src/lib.rs
+++ b/pallets/certification/src/lib.rs
@@ -14,9 +14,17 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
+//! # Duniter Certification Pallet
+//!
+//! This pallet manages certification creation and deletion.
+//!
+//! Duniter certifications are the *edges* in the Duniter [Web of Trust](../duniter-wot/). They can have different meanings:
+//!
+//! - In the case of the main WoT, they mean "I have met this person in real life and trust them" (see Ğ1 Licence).
+//! - In the case of the smith sub-WoT, they mean "I trust this person to be able to run Duniter securely" (see smith Licence).
+
 #![cfg_attr(not(feature = "std"), no_std)]
 
-#[cfg(feature = "runtime-benchmarks")]
 pub mod benchmarking;
 
 pub mod traits;
@@ -37,17 +45,15 @@ pub use weights::WeightInfo;
 use crate::traits::*;
 use codec::Codec;
 use duniter_primitives::Idty;
-use frame_support::pallet_prelude::*;
-use frame_support::traits::StorageVersion;
+use frame_support::{pallet_prelude::*, traits::StorageVersion};
+use scale_info::prelude::{collections::BTreeMap, fmt::Debug, vec::Vec};
 use sp_runtime::traits::AtLeast32BitUnsigned;
-use sp_std::{fmt::Debug, vec::Vec};
 
 #[frame_support::pallet]
 pub mod pallet {
     use super::*;
     use frame_system::pallet_prelude::*;
     use sp_runtime::traits::Saturating;
-    use sp_std::collections::btree_map::BTreeMap;
 
     /// The current storage version.
     const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);
@@ -59,10 +65,11 @@ pub mod pallet {
 
     #[pallet::config]
     pub trait Config: frame_system::Config {
+        /// The minimum duration (in blocks) between two certifications issued by the same issuer.
         #[pallet::constant]
-        /// Minimum duration between two certifications issued by the same issuer.
         type CertPeriod: Get<BlockNumberFor<Self>>;
-        /// A short identity index.
+
+        /// A short identity index type.
         type IdtyIndex: Parameter
             + Member
             + AtLeast32BitUnsigned
@@ -72,26 +79,36 @@ pub mod pallet {
             + MaybeSerializeDeserialize
             + Debug
             + MaxEncodedLen;
-        /// Something that gives the IdtyId of an AccountId and reverse
+
+        /// A type that provides methods to get the IdtyIndex of an AccountId and vice versa.
         type IdtyAttr: duniter_primitives::Idty<Self::IdtyIndex, Self::AccountId>;
-        /// Provide method to check that cert is allowed.
+
+        /// A type that provides a method to check if issuing a certification is allowed.
         type CheckCertAllowed: CheckCertAllowed<Self::IdtyIndex>;
+
+        /// The maximum number of active certifications that can be issued by a single issuer.
         #[pallet::constant]
-        /// Maximum number of active certifications by issuer.
         type MaxByIssuer: Get<u32>;
-        /// Minimum number of certifications received to be allowed to issue a certification.
+
+        /// The minimum number of certifications received that an identity must have
+        /// to be allowed to issue a certification.
         #[pallet::constant]
         type MinReceivedCertToBeAbleToIssueCert: Get<u32>;
-        /// Handler for NewCert event.
+
+        /// A handler that is called when a new certification event (`NewCert`) occurs.
         type OnNewcert: OnNewcert<Self::IdtyIndex>;
-        /// Handler for Removed event.
+
+        /// A handler that is called when a certification is removed (`RemovedCert`).
         type OnRemovedCert: OnRemovedCert<Self::IdtyIndex>;
-        /// Because this pallet emits events, it depends on the runtime's definition of an event.
+
+        /// The overarching event type.
         type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
-        /// Type representing the weight of this pallet.
+
+        /// Type representing the weight of this pallet
         type WeightInfo: WeightInfo;
+
+        /// The duration (in blocks) for which a certification remains valid.
         #[pallet::constant]
-        /// Duration of validity of a certification.
         type ValidityPeriod: Get<BlockNumberFor<Self>>;
     }
 
@@ -200,13 +217,13 @@ pub mod pallet {
 
     // STORAGE //
 
-    /// Certifications metada by issuer.
+    /// The certification metadata for each issuer.
     #[pallet::storage]
     #[pallet::getter(fn idty_cert_meta)]
     pub type StorageIdtyCertMeta<T: Config> =
         StorageMap<_, Twox64Concat, T::IdtyIndex, IdtyCertMeta<BlockNumberFor<T>>, ValueQuery>;
 
-    /// Certifications by receiver.
+    /// The certifications for each receiver.
     #[pallet::storage]
     #[pallet::getter(fn certs_by_receiver)]
     pub type CertsByReceiver<T: Config> = StorageMap<
@@ -217,7 +234,7 @@ pub mod pallet {
         ValueQuery,
     >;
 
-    /// Certifications removable on.
+    /// The certifications that should expire at a given block.
     #[pallet::storage]
     #[pallet::getter(fn certs_removable_on)]
     pub type CertsRemovableOn<T: Config> = StorageMap<
@@ -310,7 +327,9 @@ pub mod pallet {
             Ok(().into())
         }
 
-        /// remove a certification (only root)
+        /// Remove one certification given the issuer and the receiver.
+        ///
+        /// - `origin`: Must be `Root`.
         #[pallet::call_index(1)]
         #[pallet::weight(T::WeightInfo::del_cert())]
         pub fn del_cert(
@@ -323,7 +342,9 @@ pub mod pallet {
             Ok(().into())
         }
 
-        /// remove all certifications received by an identity (only root)
+        /// Remove all certifications received by an identity.
+        ///
+        /// - `origin`: Must be `Root`.
         #[pallet::call_index(2)]
         #[pallet::weight(T::WeightInfo::remove_all_certs_received_by(CertsByReceiver::<T>::get(idty_index).len() as u32))]
         pub fn remove_all_certs_received_by(
@@ -331,9 +352,7 @@ pub mod pallet {
             idty_index: T::IdtyIndex,
         ) -> DispatchResultWithPostInfo {
             ensure_root(origin)?;
-            for (issuer, _) in CertsByReceiver::<T>::get(idty_index) {
-                Self::do_remove_cert(issuer, idty_index, None);
-            }
+            let _ = Self::do_remove_all_certs_received_by(idty_index);
             Ok(().into())
         }
     }
@@ -341,14 +360,26 @@ pub mod pallet {
     // INTERNAL FUNCTIONS //
 
     impl<T: Config> Pallet<T> {
-        /// get issuer index from origin
+        /// Perform removal of all certifications received by an identity.
+        pub fn do_remove_all_certs_received_by(idty_index: T::IdtyIndex) -> Weight {
+            let mut weight = T::DbWeight::get().reads_writes(1, 0);
+            for (issuer, _) in CertsByReceiver::<T>::get(idty_index) {
+                weight = weight.saturating_add(Self::do_remove_cert(issuer, idty_index, None));
+            }
+            weight
+        }
+
+        /// Get the issuer index from the origin.
         pub fn origin_to_index(origin: OriginFor<T>) -> Result<T::IdtyIndex, DispatchError> {
             let who = ensure_signed(origin)?;
             T::IdtyAttr::idty_index(who).ok_or(Error::<T>::OriginMustHaveAnIdentity.into())
         }
 
-        /// add a certification without checks
-        // this is used on identity creation to add the first certification
+        /// Add a certification without performing checks.
+        ///
+        /// This function is used during identity creation to add the first certification without
+        /// validation checks.
+        // The weight is approximated based on the worst-case scenario path.
         pub fn do_add_cert_checked(
             issuer: T::IdtyIndex,
             receiver: T::IdtyIndex,
@@ -362,11 +393,10 @@ pub mod pallet {
             };
 
             Self::try_add_cert(block_number, issuer, receiver)?;
-
             Ok(().into())
         }
 
-        /// perform cert addition if not existing, else CertAlreadyExists
+        /// Perform certification addition if it does not already exist, otherwise return `CertAlreadyExists`.
         // must be transactional
         fn try_add_cert(
             block_number: BlockNumberFor<T>,
@@ -418,7 +448,7 @@ pub mod pallet {
             Ok(().into())
         }
 
-        /// perform cert renewal if exisiting, else error with CertDoesNotExist
+        /// Perform certification renewal if it exists, otherwise return an error indicating `CertDoesNotExist`.
         // must be used in transactional context
         // (it can fail if certification does not exist after having modified state)
         fn try_renew_cert(
@@ -450,24 +480,29 @@ pub mod pallet {
             Ok(().into())
         }
 
-        /// remove the certifications due to expire on the given block
+        /// Remove certifications that are due to expire on the given block.
         // (run at on_initialize step)
         fn prune_certifications(block_number: BlockNumberFor<T>) -> Weight {
             // See on initialize for the overhead weight accounting
-            let mut total_weight = Weight::zero();
+            let mut weight = Weight::zero();
 
             if let Some(certs) = CertsRemovableOn::<T>::take(block_number) {
                 for (issuer, receiver) in certs {
-                    total_weight += Self::do_remove_cert(issuer, receiver, Some(block_number));
+                    weight = weight.saturating_add(Self::do_remove_cert(
+                        issuer,
+                        receiver,
+                        Some(block_number),
+                    ));
                 }
             }
-
-            total_weight
+            weight
         }
 
-        /// perform the certification removal
-        /// if block number is given only remove cert if still set to expire at this block number
-        // this is used because cert expiry unscheduling is not done (#110)
+        /// Perform the certification removal.
+        ///
+        /// If a block number is provided, this function removes certifications only if they are still
+        /// scheduled to expire at that block number.
+        // This function is used because the unscheduling of certification expiry (#110) is not yet implemented.
         pub fn do_remove_cert(
             issuer: T::IdtyIndex,
             receiver: T::IdtyIndex,
@@ -512,7 +547,6 @@ pub mod pallet {
                     receiver,
                     expiration: block_number_opt.is_some(),
                 });
-                // Should always return Weight::zero
                 T::OnRemovedCert::on_removed_cert(
                     issuer,
                     issuer_issued_count,
@@ -528,7 +562,7 @@ pub mod pallet {
             total_weight
         }
 
-        /// check cert allowed
+        /// Check if adding a certification is allowed.
         // 1. no self cert
         // 2. issuer received cert count
         // 3. issuer max emitted cert
@@ -565,7 +599,7 @@ pub mod pallet {
             Ok(())
         }
 
-        /// check cert allowed
+        /// Check if adding a certification is allowed.
         // first internal checks
         // then external checks
         fn check_add_cert(
@@ -585,7 +619,7 @@ pub mod pallet {
             Ok(())
         }
 
-        /// check renew cert allowed
+        /// Check if renewing a certification is allowed based.
         fn check_renew_cert(
             issuer: T::IdtyIndex,
             receiver: T::IdtyIndex,
diff --git a/pallets/certification/src/mock.rs b/pallets/certification/src/mock.rs
index 066753f25f2abe6c112476de07586c481746ae5e..7f24b214bb241c170a08a26e714ff77ebe621f6a 100644
--- a/pallets/certification/src/mock.rs
+++ b/pallets/certification/src/mock.rs
@@ -56,16 +56,21 @@ impl system::Config for Test {
     type Hashing = BlakeTwo256;
     type Lookup = IdentityLookup<Self::AccountId>;
     type MaxConsumers = frame_support::traits::ConstU32<16>;
+    type MultiBlockMigrator = ();
     type Nonce = u64;
     type OnKilledAccount = ();
     type OnNewAccount = ();
     type OnSetCode = ();
     type PalletInfo = PalletInfo;
+    type PostInherents = ();
+    type PostTransactions = ();
+    type PreInherents = ();
     type RuntimeCall = RuntimeCall;
     type RuntimeEvent = RuntimeEvent;
     type RuntimeOrigin = RuntimeOrigin;
     type RuntimeTask = ();
     type SS58Prefix = SS58Prefix;
+    type SingleBlockMigrations = ();
     type SystemWeightInfo = ();
     type Version = ();
 }
diff --git a/pallets/certification/src/tests.rs b/pallets/certification/src/tests.rs
index 0bde9557b9a882ec521a6d06b3d0db90d27df67f..bc5a570734f89c5ad2738b4f86ce47052120038c 100644
--- a/pallets/certification/src/tests.rs
+++ b/pallets/certification/src/tests.rs
@@ -14,11 +14,10 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-use crate::mock::*;
-use crate::{Error, Event};
+use crate::{mock::*, Error, Event};
 use frame_support::{assert_noop, assert_ok};
 use maplit::btreemap;
-use sp_std::collections::btree_map::BTreeMap;
+use scale_info::prelude::{collections::BTreeMap, vec};
 
 #[test]
 fn test_must_receive_cert_before_can_issue() {
diff --git a/pallets/certification/src/traits.rs b/pallets/certification/src/traits.rs
index ae6e37c0f2a1b15baf3658897559cdbd19d9fcc0..7ee7832d575f98d788c02627f18366608ea7b086 100644
--- a/pallets/certification/src/traits.rs
+++ b/pallets/certification/src/traits.rs
@@ -16,7 +16,9 @@
 
 use frame_support::pallet_prelude::*;
 
+/// Trait for checking if a certification is allowed between two identities.
 pub trait CheckCertAllowed<IdtyIndex> {
+    /// Check if the certification is allowed from the issuer to the receiver.
     fn check_cert_allowed(issuer: IdtyIndex, receiver: IdtyIndex) -> Result<(), DispatchError>;
 }
 
@@ -26,7 +28,9 @@ impl<IdtyIndex> CheckCertAllowed<IdtyIndex> for () {
     }
 }
 
+/// Trait for handling actions to take when a new certification is issued.
 pub trait OnNewcert<IdtyIndex> {
+    /// Called when a new certification is issued.
     fn on_new_cert(
         issuer: IdtyIndex,
         issuer_issued_count: u32,
@@ -34,6 +38,7 @@ pub trait OnNewcert<IdtyIndex> {
         receiver_received_count: u32,
     );
 }
+
 impl<IdtyIndex> OnNewcert<IdtyIndex> for () {
     fn on_new_cert(
         _issuer: IdtyIndex,
@@ -44,7 +49,9 @@ impl<IdtyIndex> OnNewcert<IdtyIndex> for () {
     }
 }
 
+/// Trait for handling actions to take when a certification is removed.
 pub trait OnRemovedCert<IdtyIndex> {
+    /// Called when a certification is removed.
     fn on_removed_cert(
         issuer: IdtyIndex,
         issuer_issued_count: u32,
@@ -53,6 +60,7 @@ pub trait OnRemovedCert<IdtyIndex> {
         expiration: bool,
     );
 }
+
 impl<IdtyIndex> OnRemovedCert<IdtyIndex> for () {
     fn on_removed_cert(
         _issuer: IdtyIndex,
@@ -64,6 +72,8 @@ impl<IdtyIndex> OnRemovedCert<IdtyIndex> for () {
     }
 }
 
+/// Trait for setting the next issuable block number for an identity.
 pub trait SetNextIssuableOn<BlockNumber, IdtyIndex> {
+    /// Set the next block number when the identity can issue a certification.
     fn set_next_issuable_on(idty_index: IdtyIndex, next_issuable_on: BlockNumber);
 }
diff --git a/pallets/certification/src/types.rs b/pallets/certification/src/types.rs
index 7eadcabc5ba714f2d1d5a130fb94f79d79c5a24b..5a158f8a9aa9805df642eb1ed51be3a6c76cd1ea 100644
--- a/pallets/certification/src/types.rs
+++ b/pallets/certification/src/types.rs
@@ -20,14 +20,14 @@ use codec::{Decode, Encode};
 use frame_support::pallet_prelude::*;
 use scale_info::TypeInfo;
 
-/// certification metadata attached to an identity
+/// Represents the certification metadata attached to an identity.
 #[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo)]
 pub struct IdtyCertMeta<BlockNumber: Default> {
-    /// count issued certifications
+    /// Number of certifications issued by this identity.
     pub issued_count: u32,
-    /// block before which identity not allowed to issue a new certification
+    /// Block number before which the identity is not allowed to issue a new certification.
     pub next_issuable_on: BlockNumber,
-    /// number of certifications received
+    /// Number of certifications received by this identity.
     pub received_count: u32,
 }
 
diff --git a/pallets/distance/Cargo.toml b/pallets/distance/Cargo.toml
index a878035017afde01f5de90b182930280123502fd..f2aa02319eb4d9107072f8816345951b5b6ca709 100644
--- a/pallets/distance/Cargo.toml
+++ b/pallets/distance/Cargo.toml
@@ -5,7 +5,6 @@ edition.workspace = true
 homepage.workspace = true
 license.workspace = true
 name = "pallet-distance"
-readme = "README.md"
 repository.workspace = true
 version.workspace = true
 
@@ -25,7 +24,6 @@ std = [
 	"frame-benchmarking?/std",
 	"frame-support/std",
 	"frame-system/std",
-	"getrandom/std",
 	"pallet-authority-members/std",
 	"pallet-authorship/std",
 	"pallet-balances/std",
@@ -39,7 +37,6 @@ std = [
 	"sp-io/std",
 	"sp-keystore/std",
 	"sp-runtime/std",
-	"sp-std/std",
 ]
 try-runtime = [
 	"frame-support/try-runtime",
@@ -62,7 +59,6 @@ codec = { workspace = true, features = ["derive"] }
 frame-benchmarking = { workspace = true, optional = true }
 frame-support = { workspace = true }
 frame-system = { workspace = true }
-getrandom = { workspace = true, features = ["js"] }
 pallet-authority-members = { workspace = true }
 pallet-authorship = { workspace = true }
 pallet-balances = { workspace = true }
@@ -74,8 +70,7 @@ sp-core = { workspace = true }
 sp-distance = { workspace = true }
 sp-inherents = { workspace = true }
 sp-runtime = { workspace = true }
-sp-std = { workspace = true }
 
 [dev-dependencies]
-sp-io = { workspace = true }
-sp-keystore = { workspace = true }
+sp-io = { workspace = true, default-features = true }
+sp-keystore = { workspace = true, default-features = true }
diff --git a/pallets/distance/README.md b/pallets/distance/README.md
deleted file mode 100644
index 7b34661e1a6bb99892808d29d5aa24b82a7fb4fe..0000000000000000000000000000000000000000
--- a/pallets/distance/README.md
+++ /dev/null
@@ -1,47 +0,0 @@
-# Distance pallet
-
-The distance pallet uses results provided in a file by the `distance-oracle` offchain worker.
-At some point an inherent is called to submit the results of this file to the blockchain.
-The pallet then selects the median of the results (reach perbill) of an evaluation pool and fills the storage with the result status.
-The status of an identity can be:
-
-- inexistant: distance evaluation has not been requested or has expired
-- pending: distance evaluation for this identity has been requested and is waiting two sessions for results
-- valid: distance has been evaluated positively for this identity
-
-The result of the evaluation is used by `duniter-wot` pallet to determine if an identity can get / should loose membership to the web of trust. 
-
-## Process
-
-Any account can request a distance evaluation for a given identity provided it has enough currency to be reserved. In this case, the distance status is marked as pending and in the next session, inherents can start to publish results. 
-
-This is how a result is published:
-
-1. local worker creates a file containing the result of computation
-1. inherent is created with the data from this file
-1. author is registered as an evaluator
-1. the result is added to the current evaluation pool
-1. a flag is set to prevent other distance evaluation in the same block
-
-On each new session:
-
-1. old results set to expire at this session do expire
-1. results from the current pool (previous session's result pool) are taken and for each identity
-    - the median of the distance results for this identity is chosen
-    - if the distance is ok, the distance is marked as valid
-    - if the distance is ko, the result for this identity is removed and reserved currency is slashed (from the account which requested the evaluation)
-
-Then, in other pallets, when a membership is claimed, it is possible to look if there is a valid evaluation of distance for this identity.
-
-## Pools
-
-Evaluation pools are made of two components:
-
-- a set of evaluators
-- a vec of results
-
-The evaluation are separated in three pools (N - 2 is the session index):
-
-- pool number N - 1 % 3: results from the previous session used in the current one (let empty for next session)
-- pool number N + 0 % 3: inherent results are added there
-- pool number N + 1 % 3: identities are added there for evaluation
\ No newline at end of file
diff --git a/pallets/distance/src/benchmarking.rs b/pallets/distance/src/benchmarking.rs
index 0e888c8264c180d1ee4f494675ad8a853b4180b6..bd44e676948414b4c674baa3e09b2bd87b33b196 100644
--- a/pallets/distance/src/benchmarking.rs
+++ b/pallets/distance/src/benchmarking.rs
@@ -15,16 +15,15 @@
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
 #![cfg(feature = "runtime-benchmarks")]
+#![allow(clippy::multiple_bound_locations)]
 
 use super::*;
 
 use codec::Encode;
 use frame_benchmarking::v2::*;
-use frame_support::traits::{Currency, OnFinalize};
-use frame_system::pallet_prelude::BlockNumberFor;
-use frame_system::RawOrigin;
-use pallet_balances::Pallet as Balances;
-use sp_runtime::traits::{Bounded, One};
+use frame_support::traits::{Get, OnFinalize, OnInitialize};
+use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin};
+use scale_info::prelude::vec;
 use sp_runtime::Perbill;
 
 use crate::Pallet;
@@ -32,7 +31,7 @@ use crate::Pallet;
 #[benchmarks(
         where
         T: pallet_balances::Config,
-		T::Balance: From<u64>,
+		BalanceOf<T>: From<u32>,
         BlockNumberFor<T>: From<u32>,
 )]
 mod benchmarks {
@@ -56,12 +55,13 @@ mod benchmarks {
 
     #[benchmark]
     fn request_distance_evaluation() {
+        // More than membership renewal to avoid antispam
+        frame_system::pallet::Pallet::<T>::set_block_number(500_000_000u32.into());
         let idty = T::IdtyIndex::one();
         let caller: T::AccountId = pallet_identity::Identities::<T>::get(idty)
             .unwrap()
             .owner_key;
-        let _ =
-            <Balances<T> as Currency<_>>::make_free_balance_be(&caller, T::Balance::max_value());
+        let _ = T::Currency::set_balance(&caller, u32::MAX.into());
 
         #[extrinsic_call]
         _(RawOrigin::Signed(caller.clone()));
@@ -81,11 +81,13 @@ mod benchmarks {
 
     #[benchmark]
     fn request_distance_evaluation_for() {
+        // More than membership renewal to avoid antispam
+        frame_system::pallet::Pallet::<T>::set_block_number(500_000_000u32.into());
         let idty = T::IdtyIndex::one();
         let caller: T::AccountId = pallet_identity::Identities::<T>::get(idty)
             .unwrap()
             .owner_key;
-        <Balances<T> as Currency<_>>::make_free_balance_be(&caller, T::Balance::max_value());
+        T::Currency::set_balance(&caller, u32::MAX.into());
         let target: T::IdtyIndex = 2u32;
         // set target status since targeted distance evaluation only allowed for unvalidated
         pallet_identity::Identities::<T>::mutate(target, |idty_val| {
@@ -161,7 +163,122 @@ mod benchmarks {
         #[extrinsic_call]
         _(RawOrigin::Root, idty);
 
-        assert_has_event::<T>(Event::<T>::EvaluatedValid { idty_index: idty }.into());
+        assert_has_event::<T>(
+            Event::<T>::EvaluatedValid {
+                idty_index: idty,
+                distance: Perbill::one(),
+            }
+            .into(),
+        );
+    }
+
+    #[benchmark]
+    fn on_initialize_overhead() {
+        // Benchmark on_initialize with no on_finalize and no do_evaluation.
+        let block_number: BlockNumberFor<T> = (T::EvaluationPeriod::get() + 1).into();
+
+        #[block]
+        {
+            Pallet::<T>::on_initialize(block_number);
+        }
+    }
+
+    #[benchmark]
+    fn do_evaluation_success() -> Result<(), BenchmarkError> {
+        // Benchmarking do_evaluation in case of a single success.
+        CurrentPoolIndex::<T>::put(0);
+        // More than membership renewal to avoid antispam
+        frame_system::pallet::Pallet::<T>::set_block_number(500_000_000u32.into());
+        let idty = T::IdtyIndex::one();
+        let caller: T::AccountId = pallet_identity::Identities::<T>::get(idty)
+            .unwrap()
+            .owner_key;
+        let _ = T::Currency::set_balance(&caller, u32::MAX.into());
+        Pallet::<T>::request_distance_evaluation(RawOrigin::Signed(caller.clone()).into())?;
+        assert_has_event::<T>(
+            Event::<T>::EvaluationRequested {
+                idty_index: idty,
+                who: caller.clone(),
+            }
+            .into(),
+        );
+
+        CurrentPoolIndex::<T>::put(2);
+        Pallet::<T>::force_update_evaluation(
+            RawOrigin::Root.into(),
+            caller,
+            ComputationResult {
+                distances: vec![Perbill::one()],
+            },
+        )?;
+
+        #[block]
+        {
+            Pallet::<T>::do_evaluation(0);
+        }
+
+        assert_has_event::<T>(
+            Event::<T>::EvaluatedValid {
+                idty_index: idty,
+                distance: Perbill::one(),
+            }
+            .into(),
+        );
+        Ok(())
+    }
+
+    #[benchmark]
+    fn do_evaluation_failure() -> Result<(), BenchmarkError> {
+        // Benchmarking do_evaluation in case of a single failure.
+        CurrentPoolIndex::<T>::put(0);
+        // More than membership renewal to avoid antispam
+        frame_system::pallet::Pallet::<T>::set_block_number(500_000_000u32.into());
+        let idty = T::IdtyIndex::one();
+        let caller: T::AccountId = pallet_identity::Identities::<T>::get(idty)
+            .unwrap()
+            .owner_key;
+        let _ = T::Currency::set_balance(&caller, u32::MAX.into());
+        Pallet::<T>::request_distance_evaluation(RawOrigin::Signed(caller.clone()).into())?;
+        assert_has_event::<T>(
+            Event::<T>::EvaluationRequested {
+                idty_index: idty,
+                who: caller.clone(),
+            }
+            .into(),
+        );
+
+        CurrentPoolIndex::<T>::put(2);
+        Pallet::<T>::force_update_evaluation(
+            RawOrigin::Root.into(),
+            caller,
+            ComputationResult {
+                distances: vec![Perbill::zero()],
+            },
+        )?;
+
+        #[block]
+        {
+            Pallet::<T>::do_evaluation(0);
+        }
+
+        assert_has_event::<T>(
+            Event::<T>::EvaluatedInvalid {
+                idty_index: idty,
+                distance: Perbill::zero(),
+            }
+            .into(),
+        );
+        Ok(())
+    }
+
+    #[benchmark]
+    fn do_evaluation_overhead() -> Result<(), BenchmarkError> {
+        #[block]
+        {
+            Pallet::<T>::do_evaluation(0);
+        }
+
+        Ok(())
     }
 
     #[benchmark]
diff --git a/pallets/distance/src/lib.rs b/pallets/distance/src/lib.rs
index 4860ff4b4f9e9b9a25a1bc0016500021200559dd..f1866bf17e584a6e5f52a68be25825beb2d0a650 100644
--- a/pallets/distance/src/lib.rs
+++ b/pallets/distance/src/lib.rs
@@ -14,6 +14,54 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
+//! # Distance Pallet
+//!
+//! The distance pallet utilizes results provided in a file by the `distance-oracle` offchain worker.
+//! At a some point, an inherent is called to submit the results of this file to the blockchain.
+//! The pallet then selects the median of the results (reach perbill) from an evaluation pool and fills the storage with the result status.
+//! The status of an identity can be:
+//!
+//! - **Non-existent**: Distance evaluation has not been requested or has expired.
+//! - **Pending**: Distance evaluation for this identity has been requested and is awaiting results after two evaluation periods.
+//! - **Valid**: Distance has been evaluated positively for this identity.
+//!
+//! The evaluation result is used by the `duniter-wot` pallet to determine if an identity can gain or should lose membership in the web of trust.
+//!
+//! ## Process
+//!
+//! Any account can request a distance evaluation for a given identity provided it has enough currency to reserve. In this case, the distance status is marked as pending, and in the next evaluation period, inherents can start to publish results.
+//!
+//! This is the process for publishing a result:
+//!
+//! 1. A local worker creates a file containing the computation result.
+//! 2. An inherent is created with the data from this file.
+//! 3. The author is registered as an evaluator.
+//! 4. The result is added to the current evaluation pool.
+//! 5. A flag is set to prevent other distance evaluations in the same block.
+//!
+//! At the start of each new evaluation period:
+//!
+//! 1. Old results set to expire at this period are removed.
+//! 2. Results from the current pool (results from the previous period's pool) are processed, and for each identity:
+//!     - The median of the distance results for this identity is chosen.
+//!     - If the distance is acceptable, it is marked as valid.
+//!     - If the distance is not acceptable, the result for this identity is discarded, and reserved currency is slashed (from the account which requested the evaluation).
+//!
+//! Then, in other pallets, when a membership is claimed, it is possible to check if there is a valid distance evaluation for this identity.
+//!
+//! ## Pools
+//!
+//! Evaluation pools consist of two components:
+//!
+//! - A set of evaluators.
+//! - A vector of results.
+//!
+//! The evaluations are divided into three pools:
+//!
+//! - Pool number N - 1 % 3: Results from the previous evaluation period used in the current one (emptied for the next evaluation period).
+//! - Pool number N + 0 % 3: Inherent results are added here.
+//! - Pool number N + 1 % 3: Identities are added here for evaluation.
+
 #![cfg_attr(not(feature = "std"), no_std)]
 
 mod median;
@@ -21,7 +69,6 @@ pub mod traits;
 mod types;
 mod weights;
 
-#[cfg(feature = "runtime-benchmarks")]
 pub mod benchmarking;
 
 #[cfg(test)]
@@ -34,26 +81,42 @@ pub use traits::*;
 pub use types::*;
 pub use weights::WeightInfo;
 
-use frame_support::traits::StorageVersion;
-use pallet_authority_members::SessionIndex;
+use frame_support::{
+    traits::{
+        fungible::{self, hold, Credit, Mutate, MutateHold},
+        tokens::Precision,
+        OnUnbalanced, StorageVersion,
+    },
+    DefaultNoBound,
+};
 use sp_distance::{InherentError, INHERENT_IDENTIFIER};
 use sp_inherents::{InherentData, InherentIdentifier};
-use sp_std::convert::TryInto;
-use sp_std::prelude::*;
+use sp_runtime::{
+    traits::{One, Zero},
+    Saturating,
+};
 
 type IdtyIndex = u32;
 
-/// Maximum number of identities to be evaluated in a session
-pub const MAX_EVALUATIONS_PER_SESSION: u32 = 600;
-/// Maximum number of evaluators in a session
+/// Maximum number of identities to be evaluated in an evaluation period.
+pub const MAX_EVALUATIONS_PER_SESSION: u32 = 1_300; // See https://git.duniter.org/nodes/rust/duniter-v2s/-/merge_requests/252
+/// Maximum number of evaluators in an evaluation period.
 pub const MAX_EVALUATORS_PER_SESSION: u32 = 100;
 
 #[frame_support::pallet()]
 pub mod pallet {
     use super::*;
-    use frame_support::{pallet_prelude::*, traits::ReservableCurrency};
+    use frame_support::pallet_prelude::*;
     use frame_system::pallet_prelude::*;
     use sp_runtime::Perbill;
+    pub type AccountIdOf<T> = <T as frame_system::Config>::AccountId;
+    pub type BalanceOf<T> = <<T as Config>::Currency as fungible::Inspect<AccountIdOf<T>>>::Balance;
+
+    #[pallet::composite_enum]
+    pub enum HoldReason {
+        /// The funds are held as deposit for the distance evaluation.
+        DistanceHold,
+    }
 
     /// The current storage version.
     const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);
@@ -67,35 +130,53 @@ pub mod pallet {
         frame_system::Config
         + pallet_authorship::Config
         + pallet_identity::Config<IdtyIndex = IdtyIndex>
-        + pallet_session::Config
     {
-        /// Currency type used in this pallet (used for reserve/slash)
-        type Currency: ReservableCurrency<Self::AccountId>;
-        /// Amount reserved during evaluation
+        /// Currency type used in this pallet for reserve and slash operations.
+        type Currency: Mutate<Self::AccountId>
+            + MutateHold<Self::AccountId, Reason = Self::RuntimeHoldReason>
+            + hold::Balanced<Self::AccountId>;
+
+        /// The overarching hold reason type.
+        type RuntimeHoldReason: From<HoldReason>;
+
+        /// The amount reserved during evaluation.
+        #[pallet::constant]
+        type EvaluationPrice: Get<BalanceOf<Self>>;
+
+        /// The evaluation period in blocks.
+        /// Since the evaluation uses 3 pools, the total evaluation time will be 3 * EvaluationPeriod.
         #[pallet::constant]
-        type EvaluationPrice: Get<
-            <Self::Currency as frame_support::traits::Currency<Self::AccountId>>::Balance,
-        >;
-        /// Maximum distance used to define referee's accessibility
-        /// Unused by runtime but needed by client distance oracle
+        type EvaluationPeriod: Get<u32>;
+
+        /// 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.
         #[pallet::constant]
         type MaxRefereeDistance: Get<u32>;
-        /// Minimum ratio of accessible referees
+
+        /// The minimum ratio of accessible referees required.
         #[pallet::constant]
         type MinAccessibleReferees: Get<Perbill>;
+
+        /// Handler for unbalanced reduction when invalid distance causes a slash.
+        type OnUnbalanced: OnUnbalanced<Credit<Self::AccountId, Self::Currency>>;
+
         /// The overarching event type.
         type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
+
         /// Type representing the weight of this pallet
         type WeightInfo: WeightInfo;
-        /// Handler for successful distance evaluation
+
+        /// A handler that is called when a distance evaluation is successfully validated.
         type OnValidDistanceStatus: OnValidDistanceStatus<Self>;
-        /// Trait to check that distance evaluation request is allowed
+
+        /// A trait that provides a method to check if a distance evaluation request is allowed.
         type CheckRequestDistanceEvaluation: CheckRequestDistanceEvaluation<Self>;
     }
 
     // STORAGE //
 
-    /// Identities queued for distance evaluation
+    /// The first evaluation pool for distance evaluation queuing identities to evaluate for a given
+    /// evaluator account.
     #[pallet::storage]
     #[pallet::getter(fn evaluation_pool_0)]
     pub type EvaluationPool0<T: Config> = StorageValue<
@@ -106,7 +187,9 @@ pub mod pallet {
         >,
         ValueQuery,
     >;
-    /// Identities queued for distance evaluation
+
+    /// The second evaluation pool for distance evaluation queuing identities to evaluate for a given
+    /// evaluator account.
     #[pallet::storage]
     #[pallet::getter(fn evaluation_pool_1)]
     pub type EvaluationPool1<T: Config> = StorageValue<
@@ -117,7 +200,9 @@ pub mod pallet {
         >,
         ValueQuery,
     >;
-    /// Identities queued for distance evaluation
+
+    /// The third evaluation pool for distance evaluation queuing identities to evaluate for a given
+    /// evaluator account.
     #[pallet::storage]
     #[pallet::getter(fn evaluation_pool_2)]
     pub type EvaluationPool2<T: Config> = StorageValue<
@@ -129,15 +214,12 @@ pub mod pallet {
         ValueQuery,
     >;
 
-    /// Block for which the distance rule must be checked
+    /// The block at which the distance is evaluated.
     #[pallet::storage]
     pub type EvaluationBlock<T: Config> =
         StorageValue<_, <T as frame_system::Config>::Hash, ValueQuery>;
 
-    /// Pending evaluation requesters
-    ///
-    /// account who requested an evaluation and reserved the price,
-    ///   for whom the price will be unreserved or slashed when the evaluation completes.
+    /// The pending evaluation requesters.
     #[pallet::storage]
     #[pallet::getter(fn pending_evaluation_request)]
     pub type PendingEvaluationRequest<T: Config> = StorageMap<
@@ -148,16 +230,14 @@ pub mod pallet {
         OptionQuery,
     >;
 
-    /// Did evaluation get updated in this block?
+    /// Store if the evaluation was updated in this block.
     #[pallet::storage]
     pub(super) type DidUpdate<T: Config> = StorageValue<_, bool, ValueQuery>;
 
-    // session_index % 3:
-    //   storage_id + 0 => pending
-    //   storage_id + 1 => receives results
-    //   storage_id + 2 => receives new identities
-    // (this avoids problems for session_index < 3)
-    //
+    /// The current evaluation pool index.
+    #[pallet::storage]
+    #[pallet::getter(fn current_pool_index)]
+    pub(super) type CurrentPoolIndex<T: Config> = StorageValue<_, u32, ValueQuery>;
 
     #[pallet::event]
     #[pallet::generate_deposit(pub(super) fn deposit_event)]
@@ -168,9 +248,15 @@ pub mod pallet {
             who: T::AccountId,
         },
         /// Distance rule was found valid.
-        EvaluatedValid { idty_index: T::IdtyIndex },
+        EvaluatedValid {
+            idty_index: T::IdtyIndex,
+            distance: Perbill,
+        },
         /// Distance rule was found invalid.
-        EvaluatedInvalid { idty_index: T::IdtyIndex },
+        EvaluatedInvalid {
+            idty_index: T::IdtyIndex,
+            distance: Perbill,
+        },
     }
 
     // ERRORS //
@@ -205,18 +291,38 @@ pub mod pallet {
         TargetMustBeUnvalidated,
     }
 
+    #[pallet::genesis_config]
+    #[derive(DefaultNoBound)]
+    pub struct GenesisConfig<T: Config> {
+        pub _config: core::marker::PhantomData<T>,
+    }
+
+    #[pallet::genesis_build]
+    impl<T: Config> BuildGenesisConfig for GenesisConfig<T> {
+        fn build(&self) {
+            CurrentPoolIndex::<T>::put(0u32);
+        }
+    }
+
     #[pallet::hooks]
     impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {
-        /// dummy `on_initialize` to return the weight used in `on_finalize`.
-        fn on_initialize(_n: BlockNumberFor<T>) -> Weight {
-            // weight of `on_finalize`
-            <T as pallet::Config>::WeightInfo::on_finalize()
+        fn on_initialize(block: BlockNumberFor<T>) -> Weight
+        where
+            BlockNumberFor<T>: From<u32>,
+        {
+            let mut weight = <T as pallet::Config>::WeightInfo::on_initialize_overhead();
+            if block % BlockNumberFor::<T>::one().saturating_mul(T::EvaluationPeriod::get().into())
+                == BlockNumberFor::<T>::zero()
+            {
+                let index = (CurrentPoolIndex::<T>::get() + 1) % 3;
+                CurrentPoolIndex::<T>::put(index);
+                weight = weight
+                    .saturating_add(Self::do_evaluation(index))
+                    .saturating_add(T::DbWeight::get().reads_writes(1, 1));
+            }
+            weight.saturating_add(<T as pallet::Config>::WeightInfo::on_finalize())
         }
 
-        /// # <weight>
-        /// - `O(1)`
-        /// - 1 storage deletion (codec `O(1)`).
-        /// # </weight>
         fn on_finalize(_n: BlockNumberFor<T>) {
             DidUpdate::<T>::take();
         }
@@ -226,9 +332,11 @@ pub mod pallet {
 
     #[pallet::call]
     impl<T: Config> Pallet<T> {
-        /// Request caller identity to be evaluated
-        /// positive evaluation will result in claim/renew membership
-        /// negative evaluation will result in slash for caller
+        /// 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.
         #[pallet::call_index(0)]
         #[pallet::weight(<T as pallet::Config>::WeightInfo::request_distance_evaluation())]
         pub fn request_distance_evaluation(origin: OriginFor<T>) -> DispatchResultWithPostInfo {
@@ -240,8 +348,10 @@ pub mod pallet {
             Ok(().into())
         }
 
-        /// Request target identity to be evaluated
-        /// only possible for unvalidated identity
+        /// 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.
         #[pallet::call_index(4)]
         #[pallet::weight(<T as pallet::Config>::WeightInfo::request_distance_evaluation_for())]
         pub fn request_distance_evaluation_for(
@@ -256,8 +366,10 @@ pub mod pallet {
             Ok(().into())
         }
 
-        /// (Inherent) Push an evaluation result to the pool
-        /// this is called internally by validators (= inherent)
+        /// Push an evaluation result to the pool.
+        ///
+        /// This inherent function is called internally by validators to push an evaluation result
+        /// to the evaluation pool.
         #[pallet::call_index(1)]
         #[pallet::weight(<T as pallet::Config>::WeightInfo::update_evaluation(MAX_EVALUATIONS_PER_SESSION))]
         pub fn update_evaluation(
@@ -278,8 +390,11 @@ pub mod pallet {
             Ok(())
         }
 
-        /// Force push an evaluation result to the pool
-        // (it is convenient to have this call in end2end tests)
+        /// Force push an evaluation result to the pool.
+        ///
+        /// It is primarily used for testing purposes.
+        ///
+        /// - `origin`: Must be `Root`.
         #[pallet::call_index(2)]
         #[pallet::weight(<T as pallet::Config>::WeightInfo::force_update_evaluation(MAX_EVALUATIONS_PER_SESSION))]
         pub fn force_update_evaluation(
@@ -292,8 +407,11 @@ pub mod pallet {
             Pallet::<T>::do_update_evaluation(evaluator, computation_result)
         }
 
-        /// Force set the distance evaluation status of an identity
-        // (it is convenient to have this in test network)
+        /// Force set the distance evaluation status of an identity.
+        ///
+        /// It is primarily used for testing purposes.
+        ///
+        /// - `origin`: Must be `Root`.
         #[pallet::call_index(3)]
         #[pallet::weight(<T as pallet::Config>::WeightInfo::force_valid_distance_status())]
         pub fn force_valid_distance_status(
@@ -302,7 +420,7 @@ pub mod pallet {
         ) -> DispatchResult {
             ensure_root(origin)?;
 
-            Self::do_valid_distance_status(identity);
+            Self::do_valid_distance_status(identity, Perbill::one());
             Ok(())
         }
     }
@@ -311,8 +429,8 @@ pub mod pallet {
 
     impl<T: Config> Pallet<T> {
         /// Mutate the evaluation pool containing:
-        /// * when this session begins: the evaluation results to be applied
-        /// * when this session ends: the evaluation requests
+        /// * when this period begins: the evaluation results to be applied.
+        /// * when this period ends: the evaluation requests.
         fn mutate_current_pool<
             R,
             F: FnOnce(
@@ -322,18 +440,18 @@ pub mod pallet {
                 >,
             ) -> R,
         >(
-            index: SessionIndex,
+            index: u32,
             f: F,
         ) -> R {
-            match index % 3 {
+            match index {
                 0 => EvaluationPool2::<T>::mutate(f),
                 1 => EvaluationPool0::<T>::mutate(f),
                 2 => EvaluationPool1::<T>::mutate(f),
-                _ => unreachable!("index % 3 < 3"),
+                _ => unreachable!("index < 3"),
             }
         }
 
-        /// Mutate the evaluation pool containing the results sent by evaluators on this session.
+        /// Mutate the evaluation pool containing the results sent by evaluators for this period.
         fn mutate_next_pool<
             R,
             F: FnOnce(
@@ -343,28 +461,28 @@ pub mod pallet {
                 >,
             ) -> R,
         >(
-            index: SessionIndex,
+            index: u32,
             f: F,
         ) -> R {
-            match index % 3 {
+            match index {
                 0 => EvaluationPool0::<T>::mutate(f),
                 1 => EvaluationPool1::<T>::mutate(f),
                 2 => EvaluationPool2::<T>::mutate(f),
-                _ => unreachable!("index % 3 < 3"),
+                _ => unreachable!("index < 3"),
             }
         }
 
-        /// Take (and leave empty) the evaluation pool containing:
-        /// * when this session begins: the evaluation results to be applied
-        /// * when this session ends: the evaluation requests
+        /// Take (*and leave empty*) the evaluation pool containing:
+        /// * when this period begins: the evaluation results to be applied.
+        /// * when this period ends: the evaluation requests.
         #[allow(clippy::type_complexity)]
         fn take_current_pool(
-            index: SessionIndex,
+            index: u32,
         ) -> EvaluationPool<
             <T as frame_system::Config>::AccountId,
             <T as pallet_identity::Config>::IdtyIndex,
         > {
-            match index % 3 {
+            match index {
                 0 => EvaluationPool2::<T>::take(),
                 1 => EvaluationPool0::<T>::take(),
                 2 => EvaluationPool1::<T>::take(),
@@ -372,7 +490,7 @@ pub mod pallet {
             }
         }
 
-        /// check that request distance evaluation is allowed
+        /// Check if requested distance evaluation is allowed.
         fn check_request_distance_evaluation_self(
             who: &T::AccountId,
         ) -> Result<<T as pallet_identity::Config>::IdtyIndex, DispatchError> {
@@ -434,44 +552,45 @@ pub mod pallet {
             T::CheckRequestDistanceEvaluation::check_request_distance_evaluation(target)
         }
 
-        /// request distance evaluation in current pool
+        /// Request distance evaluation in the current pool.
         fn do_request_distance_evaluation(
             who: &T::AccountId,
             idty_index: <T as pallet_identity::Config>::IdtyIndex,
         ) -> Result<(), DispatchError> {
-            Pallet::<T>::mutate_current_pool(
-                pallet_session::CurrentIndex::<T>::get(),
-                |current_pool| {
-                    // extrinsics are transactional by default, this check might not be needed
-                    ensure!(
-                        current_pool.evaluations.len() < (MAX_EVALUATIONS_PER_SESSION as usize),
-                        Error::<T>::QueueFull
-                    );
-
-                    T::Currency::reserve(who, <T as Config>::EvaluationPrice::get())?;
-
-                    current_pool
-                        .evaluations
-                        .try_push((idty_index, median::MedianAcc::new()))
-                        .map_err(|_| Error::<T>::QueueFull)?;
-
-                    PendingEvaluationRequest::<T>::insert(idty_index, who);
-
-                    Self::deposit_event(Event::EvaluationRequested {
-                        idty_index,
-                        who: who.clone(),
-                    });
-                    Ok(())
-                },
-            )
+            Pallet::<T>::mutate_current_pool(CurrentPoolIndex::<T>::get(), |current_pool| {
+                // extrinsics are transactional by default, this check might not be needed
+                ensure!(
+                    current_pool.evaluations.len() < (MAX_EVALUATIONS_PER_SESSION as usize),
+                    Error::<T>::QueueFull
+                );
+
+                T::Currency::hold(
+                    &HoldReason::DistanceHold.into(),
+                    who,
+                    <T as Config>::EvaluationPrice::get(),
+                )?;
+
+                current_pool
+                    .evaluations
+                    .try_push((idty_index, median::MedianAcc::new()))
+                    .map_err(|_| Error::<T>::QueueFull)?;
+
+                PendingEvaluationRequest::<T>::insert(idty_index, who);
+
+                Self::deposit_event(Event::EvaluationRequested {
+                    idty_index,
+                    who: who.clone(),
+                });
+                Ok(())
+            })
         }
 
-        /// update distance evaluation in next pool
+        /// Update distance evaluation in the next pool.
         fn do_update_evaluation(
             evaluator: <T as frame_system::Config>::AccountId,
             computation_result: ComputationResult,
         ) -> DispatchResult {
-            Pallet::<T>::mutate_next_pool(pallet_session::CurrentIndex::<T>::get(), |result_pool| {
+            Pallet::<T>::mutate_next_pool(CurrentPoolIndex::<T>::get(), |result_pool| {
                 // evaluation must be provided for all identities (no more, no less)
                 ensure!(
                     computation_result.distances.len() == result_pool.evaluations.len(),
@@ -500,71 +619,109 @@ pub mod pallet {
             })
         }
 
-        /// Set the distance status using IdtyIndex and AccountId
-        pub fn do_valid_distance_status(idty: <T as pallet_identity::Config>::IdtyIndex) {
+        /// Set the distance status using for an identity.
+        pub fn do_valid_distance_status(
+            idty: <T as pallet_identity::Config>::IdtyIndex,
+            distance: Perbill,
+        ) {
             // callback
             T::OnValidDistanceStatus::on_valid_distance_status(idty);
             // deposit event
-            Self::deposit_event(Event::EvaluatedValid { idty_index: idty });
+            Self::deposit_event(Event::EvaluatedValid {
+                idty_index: idty,
+                distance,
+            });
         }
-    }
 
-    impl<T: Config> pallet_authority_members::OnNewSession for Pallet<T> {
-        fn on_new_session(index: SessionIndex) {
+        /// Perform evaluation for a specified pool.
+        ///
+        /// This function executes evaluation logic based on the provided pool index. It retrieves the current
+        /// evaluation pool for the index, processes each evaluation, and handles the outcomes based on the
+        /// computed median distances. If a positive evaluation result is obtained, it releases reserved funds
+        /// and updates the distance status accordingly. For negative or inconclusive results, it slashes funds
+        /// or releases them, respectively.
+        pub fn do_evaluation(index: u32) -> Weight {
+            let mut weight = <T as pallet::Config>::WeightInfo::do_evaluation_overhead();
             // set evaluation block
             EvaluationBlock::<T>::set(frame_system::Pallet::<T>::parent_hash());
 
-            // Apply the results from the current pool (which was previous session's result pool)
-            // We take the results so the pool is left empty for the new session.
+            // Apply the results from the current pool (which was previous period's result pool)
+            // We take the results so the pool is left empty for the new period.
             #[allow(clippy::type_complexity)]
             let current_pool: EvaluationPool<
                 <T as frame_system::Config>::AccountId,
                 <T as pallet_identity::Config>::IdtyIndex,
             > = Pallet::<T>::take_current_pool(index);
-            for (idty, median_acc) in current_pool.evaluations.into_iter() {
-                // distance result
-                let mut distance_result: Option<bool> = None;
 
-                // get result of the computation
+            for (idty, median_acc) in current_pool.evaluations.into_iter() {
+                let mut distance_result: Option<Perbill> = None;
+                // Retrieve the result of the computation from the median accumulator
                 if let Some(median_result) = median_acc.get_median() {
-                    let median = match median_result {
+                    let distance = match median_result {
                         MedianResult::One(m) => m,
                         MedianResult::Two(m1, m2) => m1 + (m2 - m1) / 2, // Avoid overflow (since max is 1)
                     };
-                    // update distance result
-                    distance_result = Some(median >= T::MinAccessibleReferees::get());
+                    // Update distance result
+                    distance_result = Some(distance);
                 }
 
-                // take requester and perform unreserve or slash
+                // If there's a pending evaluation request with the provided identity
                 if let Some(requester) = PendingEvaluationRequest::<T>::take(idty) {
-                    match distance_result {
-                        None => {
-                            // no result, unreserve
-                            T::Currency::unreserve(
+                    // If distance_result is available
+                    if let Some(distance) = distance_result {
+                        if distance >= T::MinAccessibleReferees::get() {
+                            // Positive result, unreserve and apply
+                            let _ = T::Currency::release(
+                                &HoldReason::DistanceHold.into(),
                                 &requester,
                                 <T as Config>::EvaluationPrice::get(),
+                                Precision::Exact,
                             );
-                        }
-                        Some(true) => {
-                            // positive result, unreserve and apply
-                            T::Currency::unreserve(
-                                &requester,
-                                <T as Config>::EvaluationPrice::get(),
+                            Self::do_valid_distance_status(idty, distance);
+                            weight = weight.saturating_add(
+                                <T as pallet::Config>::WeightInfo::do_evaluation_success()
+                                    .saturating_sub(
+                                        <T as pallet::Config>::WeightInfo::do_evaluation_overhead(),
+                                    ),
                             );
-                            Self::do_valid_distance_status(idty);
-                        }
-                        Some(false) => {
-                            // negative result, slash and deposit event
-                            let _ = T::Currency::slash_reserved(
+                        } else {
+                            // Negative result, slash and deposit event
+                            let (imbalance, _) = <T::Currency as hold::Balanced<_>>::slash(
+                                &HoldReason::DistanceHold.into(),
                                 &requester,
                                 <T as Config>::EvaluationPrice::get(),
                             );
-                            Self::deposit_event(Event::EvaluatedInvalid { idty_index: idty });
+                            T::OnUnbalanced::on_unbalanced(imbalance);
+                            Self::deposit_event(Event::EvaluatedInvalid {
+                                idty_index: idty,
+                                distance,
+                            });
+                            weight = weight.saturating_add(
+                                <T as pallet::Config>::WeightInfo::do_evaluation_failure()
+                                    .saturating_sub(
+                                        <T as pallet::Config>::WeightInfo::do_evaluation_overhead(),
+                                    ),
+                            );
                         }
+                    } else {
+                        // No result, unreserve
+                        let _ = T::Currency::release(
+                            &HoldReason::DistanceHold.into(),
+                            &requester,
+                            <T as Config>::EvaluationPrice::get(),
+                            Precision::Exact,
+                        );
+                        weight = weight.saturating_add(
+                            <T as pallet::Config>::WeightInfo::do_evaluation_failure()
+                                .saturating_sub(
+                                    <T as pallet::Config>::WeightInfo::do_evaluation_overhead(),
+                                ),
+                        );
                     }
                 }
-                // if evaluation happened without request, it's ok to do nothing
+                // If evaluation happened without request, it's ok to do nothing
             }
+            weight
         }
     }
 
diff --git a/pallets/distance/src/median.rs b/pallets/distance/src/median.rs
index feab0d863176a4d24e33b85856717346a1ec29a7..647109308b407a1bfb9ee87c362a53c828d98338 100644
--- a/pallets/distance/src/median.rs
+++ b/pallets/distance/src/median.rs
@@ -15,8 +15,9 @@
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
 use frame_support::pallet_prelude::*;
-use sp_std::cmp::Ordering;
+use scale_info::prelude::cmp::Ordering;
 
+/// Represents a median accumulator.
 #[derive(Clone, Debug, Decode, Default, Encode, TypeInfo)]
 pub struct MedianAcc<
     T: Clone + Decode + Encode + Ord + TypeInfo,
@@ -35,6 +36,7 @@ pub struct MedianAcc<
     fn type_info() -> scale_info::Type<scale_info::form::MetaForm> {}
 }*/
 
+/// Represents the result of a median calculation.
 #[derive(Clone, Debug, Eq, PartialEq)]
 pub enum MedianResult<T: Clone + Ord> {
     One(T),
diff --git a/pallets/distance/src/mock.rs b/pallets/distance/src/mock.rs
index c95da08752eb25e07acb39bd2fe6ce8980738b21..5198424e0f7f4970210adef99c0355edf93bda3a 100644
--- a/pallets/distance/src/mock.rs
+++ b/pallets/distance/src/mock.rs
@@ -14,7 +14,6 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-use super::*;
 use crate::{self as pallet_distance};
 use core::marker::PhantomData;
 use frame_support::{
@@ -25,13 +24,12 @@ use frame_system as system;
 use pallet_balances::AccountData;
 use pallet_session::ShouldEndSession;
 use sp_core::{ConstU32, H256};
-use sp_runtime::BuildStorage;
 use sp_runtime::{
     impl_opaque_keys,
     key_types::DUMMY,
     testing::{TestSignature, UintAuthorityId},
     traits::{BlakeTwo256, ConvertInto, IdentityLookup, IsMember, OpaqueKeys},
-    KeyTypeId, Perbill,
+    BuildStorage, KeyTypeId, Perbill,
 };
 
 type Balance = u64;
@@ -81,16 +79,21 @@ impl system::Config for Test {
     type Hashing = BlakeTwo256;
     type Lookup = IdentityLookup<Self::AccountId>;
     type MaxConsumers = frame_support::traits::ConstU32<16>;
+    type MultiBlockMigrator = ();
     type Nonce = u64;
     type OnKilledAccount = ();
     type OnNewAccount = ();
     type OnSetCode = ();
     type PalletInfo = PalletInfo;
+    type PostInherents = ();
+    type PostTransactions = ();
+    type PreInherents = ();
     type RuntimeCall = RuntimeCall;
     type RuntimeEvent = RuntimeEvent;
     type RuntimeOrigin = RuntimeOrigin;
     type RuntimeTask = ();
     type SS58Prefix = SS58Prefix;
+    type SingleBlockMigrations = ();
     type SystemWeightInfo = ();
     type Version = ();
 }
@@ -200,13 +203,12 @@ impl pallet_balances::Config for Test {
     type ExistentialDeposit = ExistentialDeposit;
     type FreezeIdentifier = ();
     type MaxFreezes = ConstU32<0>;
-    type MaxHolds = ConstU32<0>;
     type MaxLocks = MaxLocks;
     type MaxReserves = ();
     type ReserveIdentifier = [u8; 8];
     type RuntimeEvent = RuntimeEvent;
     type RuntimeFreezeReason = ();
-    type RuntimeHoldReason = ();
+    type RuntimeHoldReason = RuntimeHoldReason;
     type WeightInfo = pallet_balances::weights::SubstrateWeight<Test>;
 }
 
@@ -230,6 +232,7 @@ impl pallet_identity::Config for Test {
     type AccountLinker = ();
     type AutorevocationPeriod = AutorevocationPeriod;
     type ChangeOwnerKeyPeriod = ChangeOwnerKeyPeriod;
+    type CheckAccountWorthiness = ();
     type CheckIdtyCallAllowed = ();
     type ConfirmPeriod = ConfirmPeriod;
     type DeletionPeriod = DeletionPeriod;
@@ -237,7 +240,9 @@ impl pallet_identity::Config for Test {
     type IdtyData = ();
     type IdtyIndex = u32;
     type IdtyNameValidator = IdtyNameValidatorTestImpl;
-    type OnIdtyChange = ();
+    type OnNewIdty = ();
+    type OnRemoveIdty = ();
+    type OwnerKeyChangePermission = ();
     type RuntimeEvent = RuntimeEvent;
     type Signature = TestSignature;
     type Signer = UintAuthorityId;
@@ -251,11 +256,14 @@ parameter_types! {
 impl pallet_distance::Config for Test {
     type CheckRequestDistanceEvaluation = ();
     type Currency = Balances;
+    type EvaluationPeriod = frame_support::traits::ConstU32<300>;
     type EvaluationPrice = frame_support::traits::ConstU64<1000>;
     type MaxRefereeDistance = frame_support::traits::ConstU32<5>;
     type MinAccessibleReferees = MinAccessibleReferees;
+    type OnUnbalanced = ();
     type OnValidDistanceStatus = ();
     type RuntimeEvent = RuntimeEvent;
+    type RuntimeHoldReason = RuntimeHoldReason;
     type WeightInfo = ();
 }
 
diff --git a/pallets/distance/src/tests.rs b/pallets/distance/src/tests.rs
index 18302be75c61c8ed2718d33d353e7a49b8148253..4ec3087cbc36f1f10c13e24bfdacbfc40a08c835 100644
--- a/pallets/distance/src/tests.rs
+++ b/pallets/distance/src/tests.rs
@@ -14,10 +14,8 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-use crate::mock::*;
-use crate::*;
-use frame_support::traits::Currency;
-use frame_support::{assert_noop, assert_ok};
+use crate::{mock::*, *};
+use frame_support::{assert_noop, assert_ok, traits::Currency};
 
 // allow request distance evaluation for oneself
 #[test]
diff --git a/pallets/distance/src/traits.rs b/pallets/distance/src/traits.rs
index 6849d9c250c29421bffb67f4d52c0cf626271a59..8313abcf9437e0b2ffb53c7ac2c603620c162065 100644
--- a/pallets/distance/src/traits.rs
+++ b/pallets/distance/src/traits.rs
@@ -17,8 +17,9 @@
 use crate::*;
 use frame_support::pallet_prelude::*;
 
+/// Trait for handling actions when an identity has a valid distance status.
 pub trait OnValidDistanceStatus<T: Config> {
-    /// Handler for valid distance evaluation
+    /// Called when an identity has been determined to have a valid distance status.
     fn on_valid_distance_status(idty_index: T::IdtyIndex);
 }
 
@@ -26,7 +27,9 @@ impl<T: Config> OnValidDistanceStatus<T> for () {
     fn on_valid_distance_status(_idty_index: T::IdtyIndex) {}
 }
 
+/// Trait for checking if a request for distance evaluation is allowed.
 pub trait CheckRequestDistanceEvaluation<T: Config> {
+    /// Check if the request for distance evaluation is allowed for the given identity.
     fn check_request_distance_evaluation(idty_index: T::IdtyIndex) -> Result<(), DispatchError>;
 }
 
diff --git a/pallets/distance/src/types.rs b/pallets/distance/src/types.rs
index 95ab967e2476983ea4b8f9b87ae23b8b3fb329b3..63408283bff888466c071aa7f65ee3ad9d32f46d 100644
--- a/pallets/distance/src/types.rs
+++ b/pallets/distance/src/types.rs
@@ -18,34 +18,33 @@ pub use crate::{median::*, MAX_EVALUATIONS_PER_SESSION, MAX_EVALUATORS_PER_SESSI
 pub use sp_distance::ComputationResult;
 
 use codec::{Decode, Encode};
-use frame_support::{pallet_prelude::*, BoundedBTreeSet};
+use frame_support::pallet_prelude::*;
 use sp_runtime::Perbill;
 
-/// Status of the distance evaluation of an identity
+/// Status of the distance evaluation of an identity.
 #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)]
 pub enum DistanceStatus {
     /// Identity is in evaluation.
     Pending,
-    /// Identity respects the distance
+    /// Identity respects the distance.
     Valid,
-    /// Identity doesn't respect the distance
+    /// Identity doesn't respect the distance.
     Invalid,
 }
 
-/// Pool where distance evaluation requests and results are stored
+/// Represents a pool where distance evaluation requests and results are stored.
 ///
-/// Depending on the pool rotation, this may not be complete, and still be accepting
-/// new evaluation requests (with empty median accumulators) or new evaluations (with evaluators
-/// and new samples in the median accumulators).
+/// Depending on the pool rotation, this may not be complete and may still be accepting
+/// new evaluation requests (with empty median accumulators) or new evaluations (with evaluators and new samples in the median accumulators).
 #[derive(Encode, Decode, Clone, RuntimeDebug, TypeInfo)]
 pub struct EvaluationPool<AccountId: Ord, IdtyIndex> {
-    /// List of identities with their evaluation result
+    /// List of identities with their evaluation result.
     /// The result is the median of all the evaluations.
     pub evaluations: BoundedVec<
         (IdtyIndex, MedianAcc<Perbill, MAX_EVALUATORS_PER_SESSION>),
         ConstU32<MAX_EVALUATIONS_PER_SESSION>,
     >,
-    /// Evaluators who have published a result
+    /// Evaluators who have published a result.
     /// Its length should be the same as the number of samples
     /// in each evaluation result `MedianAcc`.
     /// An evaluator is not allowed to publish twice in a single session.
diff --git a/pallets/distance/src/weights.rs b/pallets/distance/src/weights.rs
index 0e8f34c45944c330c446ce4ac047c395f157702e..93b5a5aaef057f4382c6a8d1ba021203c852a523 100644
--- a/pallets/distance/src/weights.rs
+++ b/pallets/distance/src/weights.rs
@@ -24,6 +24,10 @@ pub trait WeightInfo {
     fn update_evaluation(i: u32) -> Weight;
     fn force_update_evaluation(i: u32) -> Weight;
     fn force_valid_distance_status() -> Weight;
+    fn on_initialize_overhead() -> Weight;
+    fn do_evaluation_overhead() -> Weight;
+    fn do_evaluation_success() -> Weight;
+    fn do_evaluation_failure() -> Weight;
     fn on_finalize() -> Weight;
 }
 
@@ -90,6 +94,53 @@ impl WeightInfo for () {
             .saturating_add(RocksDbWeight::get().writes(5))
     }
 
+    fn do_evaluation_success() -> Weight {
+        // Proof Size summary in bytes:
+        //  Measured:  `612 + i * (10 ±0)`
+        //  Estimated: `2095 + i * (10 ±0)`
+        // Minimum execution time: 208_812_000 picoseconds.
+        Weight::from_parts(257_150_521, 0)
+            .saturating_add(Weight::from_parts(0, 2095))
+            // Standard Error: 53_366
+            .saturating_add(RocksDbWeight::get().reads(2))
+            .saturating_add(RocksDbWeight::get().writes(1))
+    }
+
+    fn do_evaluation_failure() -> Weight {
+        // Proof Size summary in bytes:
+        //  Measured:  `612 + i * (10 ±0)`
+        //  Estimated: `2095 + i * (10 ±0)`
+        // Minimum execution time: 208_812_000 picoseconds.
+        Weight::from_parts(257_150_521, 0)
+            .saturating_add(Weight::from_parts(0, 2095))
+            // Standard Error: 53_366
+            .saturating_add(RocksDbWeight::get().reads(2))
+            .saturating_add(RocksDbWeight::get().writes(1))
+    }
+
+    fn do_evaluation_overhead() -> Weight {
+        // Proof Size summary in bytes:
+        //  Measured:  `612 + i * (10 ±0)`
+        //  Estimated: `2095 + i * (10 ±0)`
+        // Minimum execution time: 208_812_000 picoseconds.
+        Weight::from_parts(257_150_521, 0)
+            .saturating_add(Weight::from_parts(0, 2095))
+            // Standard Error: 53_366
+            .saturating_add(RocksDbWeight::get().reads(2))
+            .saturating_add(RocksDbWeight::get().writes(1))
+    }
+
+    fn on_initialize_overhead() -> Weight {
+        // Proof Size summary in bytes:
+        //  Measured:  `170`
+        //  Estimated: `1655`
+        // Minimum execution time: 93_595_000 picoseconds.
+        Weight::from_parts(109_467_000, 0)
+            .saturating_add(Weight::from_parts(0, 1655))
+            .saturating_add(RocksDbWeight::get().reads(1))
+            .saturating_add(RocksDbWeight::get().writes(1))
+    }
+
     fn on_finalize() -> Weight {
         // Proof Size summary in bytes:
         //  Measured:  `170`
diff --git a/pallets/duniter-account/Cargo.toml b/pallets/duniter-account/Cargo.toml
index 6b0737d783019605791004815da0c68f28097bd4..6f5d79aff488c6f3244065502027c639fdd92aff 100644
--- a/pallets/duniter-account/Cargo.toml
+++ b/pallets/duniter-account/Cargo.toml
@@ -5,7 +5,6 @@ edition.workspace = true
 homepage.workspace = true
 license.workspace = true
 name = "pallet-duniter-account"
-readme = "README.md"
 repository.workspace = true
 version.workspace = true
 
@@ -37,7 +36,6 @@ std = [
 	"sp-core/std",
 	"sp-io/std",
 	"sp-runtime/std",
-	"sp-std/std",
 ]
 try-runtime = [
 	"frame-support/try-runtime",
@@ -68,7 +66,6 @@ frame-support = { workspace = true }
 frame-system = { workspace = true }
 sp-core = { workspace = true }
 sp-io = { workspace = true }
-sp-std = { workspace = true }
 sp-runtime = { workspace = true }
 serde = { workspace = true, features = ["derive"] }
 pallet-transaction-payment = { workspace = true }
diff --git a/pallets/duniter-account/README.md b/pallets/duniter-account/README.md
deleted file mode 100644
index 185e37ce5496a348698d413f9166637a41a22692..0000000000000000000000000000000000000000
--- a/pallets/duniter-account/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Duniter account pallet
-
-Duniter customizes the `AccountData` of the `Balances` Substrate pallet. In particular, it adds the field `linked_idty`. 
-
-## Account creation fee
-
-DuniterAccount defines a creation fee that is preleved to the account one block after its creation. This fee goes to the treasury.
-
-## Sufficient 
-
-DuniterAccount tweaks the substrate AccountInfo to allow identity accounts to exist without existential deposit. This allows to spare the creation fee.
-
-## Linked identity
-
-Duniter offers the possibility to link an account to an identity with the `linked_idty` field. It allows to request refund of transaction fees in `OnChargeTransaction`.
\ No newline at end of file
diff --git a/pallets/duniter-account/src/lib.rs b/pallets/duniter-account/src/lib.rs
index 346dab97619dfa125435274e00260d96c1fa48a2..ddd56e0addf284638668be629f5a1b5e7e077374 100644
--- a/pallets/duniter-account/src/lib.rs
+++ b/pallets/duniter-account/src/lib.rs
@@ -14,11 +14,23 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-// Note: refund queue mechanism is inspired from frame contract
+//! # Duniter Account Pallet
+//!
+//! Duniter customizes the `AccountData` of the `Balances` Substrate pallet to include additional fields
+//! such as `linked_idty`.
+//!
+//! ## Sufficiency
+//!
+//! DuniterAccount adjusts the Substrate `AccountInfo` to accommodate identity-linked accounts without requiring
+//! an existential deposit. This flexibility helps reduce barriers to account creation.
+//!
+//! ## Linked Identity
+//!
+//! Duniter allows accounts to be linked to identities using the `linked_idty` field. This linkage facilitates
+//! transaction fee refunds through the `OnChargeTransaction` mechanism.
 
 #![cfg_attr(not(feature = "std"), no_std)]
 
-#[cfg(feature = "runtime-benchmarks")]
 mod benchmarking;
 
 mod types;
@@ -28,22 +40,34 @@ pub use pallet::*;
 pub use types::*;
 pub use weights::WeightInfo;
 
-use frame_support::pallet_prelude::*;
-use frame_support::traits::StoredMap;
-use frame_support::traits::{Currency, StorageVersion};
+use core::cmp;
+#[cfg(feature = "runtime-benchmarks")]
+use frame_support::traits::tokens::fungible::Mutate;
+use frame_support::{
+    pallet_prelude::*,
+    traits::{
+        fungible,
+        fungible::{Credit, Inspect},
+        tokens::WithdrawConsequence,
+        IsSubType, StorageVersion, StoredMap,
+    },
+};
 use frame_system::pallet_prelude::*;
 use pallet_quota::traits::RefundFee;
 use pallet_transaction_payment::OnChargeTransaction;
+use scale_info::prelude::{
+    collections::{BTreeMap, BTreeSet},
+    fmt::Debug,
+};
 use sp_runtime::traits::{DispatchInfoOf, PostDispatchInfoOf, Saturating};
-use sp_std::fmt::Debug;
 
 #[frame_support::pallet]
 pub mod pallet {
     use super::*;
     pub type IdtyIdOf<T> = <T as pallet_identity::Config>::IdtyIndex;
     pub type CurrencyOf<T> = pallet_balances::Pallet<T>;
-    pub type BalanceOf<T> =
-        <CurrencyOf<T> as Currency<<T as frame_system::Config>::AccountId>>::Balance;
+    type AccountIdOf<T> = <T as frame_system::Config>::AccountId;
+    pub type BalanceOf<T> = <CurrencyOf<T> as fungible::Inspect<AccountIdOf<T>>>::Balance;
 
     /// The current storage version.
     const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);
@@ -65,11 +89,14 @@ pub mod pallet {
     {
         /// The overarching event type.
         type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
-        /// Type representing the weight of this pallet
+
+        /// Type representing the weight of this pallet.
         type WeightInfo: WeightInfo;
-        /// wrapped type
+
+        /// A wrapped type that handles the charging of transaction fees.
         type InnerOnChargeTransaction: OnChargeTransaction<Self>;
-        /// type implementing refund behavior
+
+        /// A type that implements the refund behavior for transaction fees.
         type Refund: pallet_quota::traits::RefundFee<Self>;
     }
 
@@ -77,10 +104,7 @@ pub mod pallet {
 
     #[pallet::genesis_config]
     pub struct GenesisConfig<T: Config> {
-        pub accounts: sp_std::collections::btree_map::BTreeMap<
-            T::AccountId,
-            GenesisAccountData<T::Balance, IdtyIdOf<T>>,
-        >,
+        pub accounts: BTreeMap<T::AccountId, GenesisAccountData<T::Balance, IdtyIdOf<T>>>,
         pub treasury_balance: T::Balance,
     }
 
@@ -106,11 +130,7 @@ pub mod pallet {
             );
 
             // ensure no duplicate
-            let endowed_accounts = self
-                .accounts
-                .keys()
-                .cloned()
-                .collect::<sp_std::collections::btree_set::BTreeSet<_>>();
+            let endowed_accounts = self.accounts.keys().cloned().collect::<BTreeSet<_>>();
 
             assert!(
                 endowed_accounts.len() == self.accounts.len(),
@@ -156,7 +176,7 @@ pub mod pallet {
     // CALLS //
     #[pallet::call]
     impl<T: Config> Pallet<T> {
-        /// unlink the identity associated with the account
+        /// Unlink the identity associated with the account.
         #[pallet::call_index(0)]
         #[pallet::weight(<T as pallet::Config>::WeightInfo::unlink_identity())]
         pub fn unlink_identity(origin: OriginFor<T>) -> DispatchResultWithPostInfo {
@@ -168,7 +188,7 @@ pub mod pallet {
 
     // INTERNAL FUNCTIONS //
     impl<T: Config> Pallet<T> {
-        /// unlink account
+        /// Unlink the account from its associated identity.
         pub fn do_unlink_identity(account_id: T::AccountId) {
             // no-op if account already linked to nothing
             frame_system::Account::<T>::mutate(&account_id, |account| {
@@ -179,7 +199,7 @@ pub mod pallet {
             })
         }
 
-        /// link account to identity
+        /// Link an account to an identity.
         pub fn do_link_identity(account_id: &T::AccountId, idty_id: IdtyIdOf<T>) {
             // no-op if identity does not change
             if frame_system::Account::<T>::get(account_id).data.linked_idty != Some(idty_id) {
@@ -290,14 +310,15 @@ where
 // allows pay fees with quota instead of currency if available
 impl<T: Config> OnChargeTransaction<T> for Pallet<T>
 where
+    T::RuntimeCall: IsSubType<Call<T>>,
     T::InnerOnChargeTransaction: OnChargeTransaction<
         T,
-        Balance = <CurrencyOf<T> as Currency<T::AccountId>>::Balance,
-        LiquidityInfo = Option<<CurrencyOf<T> as Currency<T::AccountId>>::NegativeImbalance>,
+        Balance = BalanceOf<T>,
+        LiquidityInfo = Option<Credit<T::AccountId, T::Currency>>,
     >,
 {
     type Balance = BalanceOf<T>;
-    type LiquidityInfo = Option<<CurrencyOf<T> as Currency<T::AccountId>>::NegativeImbalance>;
+    type LiquidityInfo = Option<Credit<T::AccountId, T::Currency>>;
 
     fn withdraw_fee(
         who: &T::AccountId,
@@ -335,3 +356,33 @@ where
         Ok(())
     }
 }
+
+/// Implementation of the CheckAccountWorthiness trait for the Pallet.
+/// This trait is used to verify the worthiness of an account in terms
+/// of existence and sufficient balance to handle identity creation.
+impl<AccountId, T: Config> pallet_identity::traits::CheckAccountWorthiness<T> for Pallet<T>
+where
+    T: frame_system::Config<AccountId = AccountId>,
+    AccountId: cmp::Eq,
+{
+    /// Checks that the account exists and has the balance to handle the
+    /// identity creation process.
+    fn check_account_worthiness(account: &AccountId) -> Result<(), DispatchError> {
+        ensure!(
+            frame_system::Pallet::<T>::providers(account) > 0,
+            pallet_identity::Error::<T>::AccountNotExist
+        );
+        // This check verifies that the account can withdraw at least twice the minimum balance.
+        ensure!(
+            T::Currency::can_withdraw(account, T::Currency::minimum_balance() * 2u32.into())
+                == WithdrawConsequence::Success,
+            pallet_identity::Error::<T>::InsufficientBalance
+        );
+        Ok(())
+    }
+
+    #[cfg(feature = "runtime-benchmarks")]
+    fn set_worthy(account: &AccountId) {
+        T::Currency::set_balance(account, T::Currency::minimum_balance() * 4u32.into());
+    }
+}
diff --git a/pallets/duniter-account/src/types.rs b/pallets/duniter-account/src/types.rs
index c44cb08734204b753a4fe1852b86c337d2de0160..5e25ff783ff660b2b5d9465c5938a0e691cab7dc 100644
--- a/pallets/duniter-account/src/types.rs
+++ b/pallets/duniter-account/src/types.rs
@@ -19,18 +19,18 @@ use frame_support::pallet_prelude::*;
 use scale_info::TypeInfo;
 use sp_runtime::traits::Zero;
 
-// see `struct AccountData` for details in substrate code
+/// Account data structure.
+///
+/// For details, refer to `struct AccountData` in Substrate code.
 #[derive(Clone, Decode, Encode, Eq, MaxEncodedLen, PartialEq, RuntimeDebug, TypeInfo)] // Default,
 pub struct AccountData<Balance, IdtyId> {
-    // see Substrate AccountData
+    /// Free balance of the account.
     pub(super) free: Balance,
-    // see Substrate AccountData
+    /// Reserved balance of the account.
     pub(super) reserved: Balance,
-    // see Substrate AccountData
+    /// Frozen fee balance of the account.
     fee_frozen: Balance,
-    /// an optional pointer to an identity
-    // used to know if this account is linked to a member
-    // used in quota system to refund fees
+    /// Optional pointer to an identity used to determine if this account is linked to a member and in the quota system for fee refunds.
     pub linked_idty: Option<IdtyId>,
 }
 
diff --git a/pallets/duniter-test-parameters/Cargo.toml b/pallets/duniter-test-parameters/Cargo.toml
index 735c973357204e65c0b1e327412f5c8a49360306..0aa8a0d60ca9fae5d9ab1ebeb7b02fb516c51dc3 100644
--- a/pallets/duniter-test-parameters/Cargo.toml
+++ b/pallets/duniter-test-parameters/Cargo.toml
@@ -11,14 +11,12 @@ version.workspace = true
 [features]
 default = ["std"]
 runtime-benchmarks = [
-	"frame-benchmarking/runtime-benchmarks",
 	"frame-support/runtime-benchmarks",
 	"frame-system/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
 ]
 std = [
 	"codec/std",
-	"frame-benchmarking?/std",
 	"frame-support/std",
 	"frame-system/std",
 	"scale-info/std",
@@ -26,7 +24,6 @@ std = [
 	"sp-core/std",
 	"sp-io/std",
 	"sp-runtime/std",
-	"sp-std/std",
 ]
 try-runtime = [
 	"frame-support/try-runtime",
@@ -40,7 +37,6 @@ targets = ["x86_64-unknown-linux-gnu"]
 
 [dependencies]
 codec = { workspace = true, features = ["derive"] }
-frame-benchmarking = { workspace = true, optional = true }
 frame-support = { workspace = true }
 frame-system = { workspace = true }
 pallet-duniter-test-parameters-macro = { workspace = true }
@@ -49,4 +45,3 @@ serde = { workspace = true, features = ["derive"] }
 sp-core = { workspace = true }
 sp-io = { workspace = true }
 sp-runtime = { workspace = true }
-sp-std = { workspace = true }
diff --git a/pallets/duniter-test-parameters/README.md b/pallets/duniter-test-parameters/README.md
deleted file mode 100644
index 80a352ff46980635c72de80029cedc324ea6da30..0000000000000000000000000000000000000000
--- a/pallets/duniter-test-parameters/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Duniter test parameters
-
-This pallet allows ĞDev runtime to tweak parameter values instead of having it runtime constants.
\ No newline at end of file
diff --git a/pallets/duniter-test-parameters/src/lib.rs b/pallets/duniter-test-parameters/src/lib.rs
index 98db19954b354ca28baded4fff508da6a8426deb..346a8823035c4707e5f209f865bcdd05122f08f7 100644
--- a/pallets/duniter-test-parameters/src/lib.rs
+++ b/pallets/duniter-test-parameters/src/lib.rs
@@ -14,6 +14,10 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
+//! # Duniter Test Parameters Pallet
+//!
+//! This pallet allows ĞDev runtime to tweak parameter values instead of having it as runtime constants.
+
 #![cfg_attr(not(feature = "std"), no_std)]
 
 pub use pallet::*;
@@ -65,8 +69,7 @@ pub mod types {
 #[frame_support::pallet]
 pub mod pallet {
     use super::*;
-    use frame_support::pallet_prelude::*;
-    use frame_support::traits::StorageVersion;
+    use frame_support::{pallet_prelude::*, traits::StorageVersion};
 
     /// The current storage version.
     const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);
diff --git a/pallets/duniter-wot/Cargo.toml b/pallets/duniter-wot/Cargo.toml
index dd247896ebd67929680cdc85cc248b684023a654..68e2dda4488de1e483037ad29561f4895256df0c 100644
--- a/pallets/duniter-wot/Cargo.toml
+++ b/pallets/duniter-wot/Cargo.toml
@@ -5,7 +5,6 @@ edition.workspace = true
 homepage.workspace = true
 license.workspace = true
 name = "pallet-duniter-wot"
-readme = "README.md"
 repository.workspace = true
 version.workspace = true
 
@@ -36,7 +35,6 @@ std = [
 	"sp-membership/std",
 	"sp-runtime/std",
 	"sp-state-machine/std",
-	"sp-std/std",
 ]
 try-runtime = [
 	"frame-support/try-runtime",
@@ -67,7 +65,6 @@ sp-core = { workspace = true }
 sp-io = { workspace = true }
 sp-membership = { workspace = true }
 sp-runtime = { workspace = true }
-sp-std = { workspace = true }
 
 [dev-dependencies]
-sp-state-machine = { workspace = true }
+sp-state-machine = { workspace = true, default-features = true }
diff --git a/pallets/duniter-wot/README.md b/pallets/duniter-wot/README.md
deleted file mode 100644
index 4ac1baf7bc13165d1eb323ea5ef82018492e08a3..0000000000000000000000000000000000000000
--- a/pallets/duniter-wot/README.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Duniter Web of Trust pallet
-
-Duniter WoT is at the core of its identity system and is a big improvement compared to PGP WoT. It is a dynamic directed graph whose nodes are [identities](../identity/) and edges [certifications](../certification/).
-
-There are two instances:
-
-- the main WoT, for every human
-- the smith sub-WoT, for authorities
-
-It has both static and dynamic rules, controlling the condition to join and remain [member](../membership/).
-
-- static rules
-    - minimum number of received certifications (min indegree)
-    - maximum number of emited certifications (max outdegree)
-    - distance criterion (see distance pallet)
-- dynamic rules
-    - time interval between two certifications
-    - certification duration (see certification pallet)
-    - membership renewal (see membership pallet)
-
-This pallet's main role is to check the Web of Trust rules.
\ No newline at end of file
diff --git a/pallets/duniter-wot/src/lib.rs b/pallets/duniter-wot/src/lib.rs
index 9985c6822cea6b38e1f258a5dd5c7be544ca9f03..1a560bdf699808f4c7ee7d1da2f4c7189ec600e2 100644
--- a/pallets/duniter-wot/src/lib.rs
+++ b/pallets/duniter-wot/src/lib.rs
@@ -14,6 +14,35 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
+//! # Duniter Web of Trust Pallet
+//!
+//! Duniter Web of Trust (WoT) lies at the heart of its identity system, representing a significant improvement over PGP Web of Trust. It functions as a dynamic directed graph where nodes are [identities](../identity/) and edges are [certifications](../certification/).
+//!
+//! ## Instances
+//!
+//! Duniter WoT consists of two distinct instances:
+//!
+//! - **Main WoT**: Designed for every human participant in the Duniter network.
+//! - **Smith Sub-WoT**: Intended for authorities.
+//!
+//! ## Rules
+//!
+//! The Duniter WoT operates under a set of static and dynamic rules that govern membership conditions.
+//!
+//! ### Static Rules
+//!
+//! - **Minimum Received Certifications (Min Indegree)**: Specifies the minimum number of certifications an identity must receive to join the WoT.
+//! - **Maximum Emitted Certifications (Max Outdegree)**: Limits the maximum number of certifications an identity can issue.
+//! - **Distance Criterion**: Governed by the distance pallet, it defines the permissible distance between identities within the WoT graph.
+//!
+//! ### Dynamic Rules
+//!
+//! - **Time Interval Between Certifications**: Sets the minimum time interval required between two consecutive certifications issued by the same identity.
+//! - **Certification Duration**: Managed by the certification pallet, it determines the validity duration of a certification.
+//! - **Membership Renewal**: Regulates the frequency and conditions under which an identity must renew its membership within the WoT.
+//!
+//! This pallet is responsible for enforcing and validating the rules of the Duniter Web of Trust. It ensures compliance with both static prerequisites for joining and dynamic conditions for ongoing participation.
+
 #![cfg_attr(not(feature = "std"), no_std)]
 #![allow(clippy::type_complexity)]
 
@@ -23,16 +52,11 @@ mod mock;
 #[cfg(test)]
 mod tests;
 
-pub mod traits;
-
-/*#[cfg(feature = "runtime-benchmarks")]
-mod benchmarking;*/
-
 pub use pallet::*;
 
 use frame_support::pallet_prelude::*;
 use pallet_certification::traits::SetNextIssuableOn;
-use pallet_identity::{IdtyEvent, IdtyStatus};
+use pallet_identity::IdtyStatus;
 use pallet_membership::MembershipRemovalReason;
 
 type IdtyIndex = u32;
@@ -59,10 +83,15 @@ pub mod pallet {
         + pallet_identity::Config<IdtyIndex = IdtyIndex>
         + pallet_membership::Config<IdtyId = IdtyIndex>
     {
+        /// The block number from which the first certification can be issued.
         #[pallet::constant]
         type FirstIssuableOn: Get<frame_system::pallet_prelude::BlockNumberFor<Self>>;
+
+        /// The minimum number of certifications required for membership eligibility.
         #[pallet::constant]
         type MinCertForMembership: Get<u32>;
+
+        /// The minimum number of certifications required to create an identity.
         #[pallet::constant]
         type MinCertForCreateIdtyRight: Get<u32>;
     }
@@ -104,28 +133,34 @@ pub mod pallet {
     }
 }
 
-// implement identity call checks
+/// Implementing identity call allowance check for the pallet.
 impl<AccountId, T: Config> pallet_identity::traits::CheckIdtyCallAllowed<T> for Pallet<T>
 where
     T: frame_system::Config<AccountId = AccountId> + pallet_membership::Config,
 {
-    // identity creation checks
+    /// Checks if identity creation is allowed.
+    /// This implementation checks the following:
+    ///
+    /// - Whether the identity has the right to create an identity.
+    /// - Whether the issuer can emit a certification.
+    /// - Whether the issuer respect creation period.
     fn check_create_identity(creator: IdtyIndex) -> Result<(), DispatchError> {
         let cert_meta = pallet_certification::Pallet::<T>::idty_cert_meta(creator);
-        // perform all checks
-        // 1. check that identity has the right to create an identity
-        // identity can be member with 5 certifications and still not reach identity creation threshold which could be higher (6, 7...)
+
+        // 1. Check that the identity has the right to create an identity
+        // Identity can be a member with 5 certifications and still not reach the identity creation threshold, which could be higher (6, 7...)
         ensure!(
             cert_meta.received_count >= T::MinCertForCreateIdtyRight::get(),
             Error::<T>::NotEnoughReceivedCertsToCreateIdty
         );
-        // 2. check that issuer can emit one more certification
-        // (this is only a partial check)
+
+        // 2. Check that the issuer can emit one more certification (partial check)
         ensure!(
             cert_meta.issued_count < T::MaxByIssuer::get(),
             Error::<T>::MaxEmittedCertsReached
         );
-        // 3. check that issuer respects certification creation period
+
+        // 3. Check that the issuer respects certification creation period
         ensure!(
             cert_meta.next_issuable_on <= frame_system::pallet::Pallet::<T>::block_number(),
             Error::<T>::IdtyCreationPeriodNotRespected
@@ -134,16 +169,18 @@ where
     }
 }
 
-// implement cert call checks
+/// Implementing certification allowance check for the pallet.
 impl<T: Config> pallet_certification::traits::CheckCertAllowed<IdtyIndex> for Pallet<T> {
-    // check the following:
-    // - issuer has identity
-    // - issuer identity is member
-    // - receiver has identity
-    // - receiver identity is confirmed and not revoked
+    /// Checks if certification is allowed.
+    /// This implementation checks the following:
+    ///
+    /// - Whether the issuer has an identity.
+    /// - Whether the issuer's identity is a member.
+    /// - Whether the receiver has an identity.
+    /// - Whether the receiver's identity is confirmed and not revoked.
     fn check_cert_allowed(issuer: IdtyIndex, receiver: IdtyIndex) -> Result<(), DispatchError> {
-        // issuer checks
-        // ensure issuer is member
+        // Issuer checks
+        // Ensure issuer is a member
         let issuer_data =
             pallet_identity::Pallet::<T>::identity(issuer).ok_or(Error::<T>::IdtyNotFound)?;
         ensure!(
@@ -151,8 +188,8 @@ impl<T: Config> pallet_certification::traits::CheckCertAllowed<IdtyIndex> for Pa
             Error::<T>::IssuerNotMember
         );
 
-        // receiver checks
-        // ensure receiver identity is confirmed and not revoked
+        // Receiver checks
+        // Ensure receiver identity is confirmed and not revoked
         let receiver_data =
             pallet_identity::Pallet::<T>::identity(receiver).ok_or(Error::<T>::IdtyNotFound)?;
         ensure!(
@@ -165,10 +202,14 @@ impl<T: Config> pallet_certification::traits::CheckCertAllowed<IdtyIndex> for Pa
     }
 }
 
-// implement membership call checks
+/// Implementing membership operation checks for the pallet.
 impl<T: Config> sp_membership::traits::CheckMembershipOpAllowed<IdtyIndex> for Pallet<T> {
+    /// This implementation checks the following:
+    ///
+    /// - Whether the identity's status is unvalidated or not a member.
+    /// - The count of certifications associated with the identity.
     fn check_add_membership(idty_index: IdtyIndex) -> Result<(), DispatchError> {
-        // check identity status
+        // Check identity status
         let idty_value =
             pallet_identity::Pallet::<T>::identity(idty_index).ok_or(Error::<T>::IdtyNotFound)?;
         ensure!(
@@ -176,99 +217,93 @@ impl<T: Config> sp_membership::traits::CheckMembershipOpAllowed<IdtyIndex> for P
                 || idty_value.status == IdtyStatus::NotMember,
             Error::<T>::TargetStatusInvalid
         );
-        // check cert count
+
+        // Check certificate count
         check_cert_count::<T>(idty_index)?;
         Ok(())
     }
 
-    // membership renewal is only possible when identity is member (otherwise it should claim again)
+    /// This implementation checks the following:
+    ///
+    /// - Whether the identity's status is member.
+    ///
+    /// Note: There is no need to check certification count since losing certifications makes membership expire.
+    /// Membership renewal is only possible when identity is member.
     fn check_renew_membership(idty_index: IdtyIndex) -> Result<(), DispatchError> {
-        // check identity status
         let idty_value =
             pallet_identity::Pallet::<T>::identity(idty_index).ok_or(Error::<T>::IdtyNotFound)?;
         ensure!(
             idty_value.status == IdtyStatus::Member,
             Error::<T>::TargetStatusInvalid
         );
-        // no need to check certification count since loosing certifications make membership expire
         Ok(())
     }
 }
 
-// implement membership event handler
-impl<T: Config> sp_membership::traits::OnEvent<IdtyIndex> for Pallet<T>
+/// Implementing membership event handling for the pallet.
+impl<T: Config> sp_membership::traits::OnNewMembership<IdtyIndex> for Pallet<T>
 where
     T: pallet_membership::Config,
 {
-    fn on_event(membership_event: &sp_membership::Event<IdtyIndex>) {
-        match membership_event {
-            sp_membership::Event::<IdtyIndex>::MembershipAdded(idty_index) => {
-                // when main membership is acquired, tell identity
-                // (only used on first membership acquiry)
-                pallet_identity::Pallet::<T>::membership_added(*idty_index);
-            }
-            sp_membership::Event::<IdtyIndex>::MembershipRemoved(idty_index) => {
-                // when main membership is lost, tell identity
-                pallet_identity::Pallet::<T>::membership_removed(*idty_index);
-            }
-            sp_membership::Event::<IdtyIndex>::MembershipRenewed(_) => {}
-        }
+    /// This implementation notifies the identity pallet when a main membership is acquired.
+    /// It is only used on the first membership acquisition.
+    fn on_created(idty_index: &IdtyIndex) {
+        pallet_identity::Pallet::<T>::membership_added(*idty_index);
     }
+
+    fn on_renewed(_idty_index: &IdtyIndex) {}
 }
 
-// implement identity event handler
-impl<T: Config> pallet_identity::traits::OnIdtyChange<T> for Pallet<T> {
-    fn on_idty_change(idty_index: IdtyIndex, idty_event: &IdtyEvent<T>) {
-        match idty_event {
-            // identity just has been created, a cert must be added
-            IdtyEvent::Created { creator, .. } => {
-                if let Err(e) = <pallet_certification::Pallet<T>>::do_add_cert_checked(
-                    *creator, idty_index, true,
-                ) {
-                    sp_std::if_std! {
-                        println!("fail to force add cert: {:?}", e)
-                    }
-                }
-            }
-            // we could split this event in removed / revoked:
-            // if identity is revoked keep it
-            // if identity is removed also remove certs
-            IdtyEvent::Removed { status } => {
-                // try remove membership in any case
-                <pallet_membership::Pallet<T>>::do_remove_membership(
-                    idty_index,
-                    MembershipRemovalReason::Revoked,
-                );
-
-                // only remove certs if identity is unvalidated
-                match status {
-                    IdtyStatus::Unconfirmed | IdtyStatus::Unvalidated => {
-                        if let Err(e) =
-                            <pallet_certification::Pallet<T>>::remove_all_certs_received_by(
-                                frame_system::Origin::<T>::Root.into(),
-                                idty_index,
-                            )
-                        {
-                            sp_std::if_std! {
-                                println!("fail to remove certs received by some idty: {:?}", e)
-                            }
-                        }
-                    }
-                    IdtyStatus::Revoked => {}
-                    IdtyStatus::Member | IdtyStatus::NotMember => {
-                        sp_std::if_std! {
-                            println!("removed non-revoked identity: {:?}", idty_index);
-                        }
-                    }
-                }
-            }
+/// Implementing membership removal event handling for the pallet.
+impl<T: Config> sp_membership::traits::OnRemoveMembership<IdtyIndex> for Pallet<T>
+where
+    T: pallet_membership::Config,
+{
+    /// This implementation notifies the identity pallet when a main membership is lost.
+    fn on_removed(idty_index: &IdtyIndex) -> Weight {
+        pallet_identity::Pallet::<T>::membership_removed(*idty_index)
+    }
+}
+
+/// Implementing the identity event handler for the pallet.
+impl<T: Config> pallet_identity::traits::OnNewIdty<T> for Pallet<T> {
+    /// This implementation adds a certificate when a new identity is created.
+    fn on_created(idty_index: &IdtyIndex, creator: &IdtyIndex) {
+        if let Err(e) =
+            <pallet_certification::Pallet<T>>::do_add_cert_checked(*creator, *idty_index, true)
+        {
+            #[cfg(feature = "std")]
+            println!("fail to force add cert: {:?}", e)
         }
     }
 }
 
-// implement certification event handlers
-// new cert handler
+/// Implementing identity removal event handling for the pallet.
+impl<T: Config> pallet_identity::traits::OnRemoveIdty<T> for Pallet<T> {
+    /// This implementation removes both membership and certificates associated with the identity.
+    fn on_removed(idty_index: &IdtyIndex) -> Weight {
+        let mut weight = Self::on_revoked(idty_index);
+        weight = weight.saturating_add(
+            <pallet_certification::Pallet<T>>::do_remove_all_certs_received_by(*idty_index),
+        );
+        weight
+    }
+
+    /// This implementation removes membership only.
+    fn on_revoked(idty_index: &IdtyIndex) -> Weight {
+        let mut weight = Weight::zero();
+        weight = weight.saturating_add(<pallet_membership::Pallet<T>>::do_remove_membership(
+            *idty_index,
+            MembershipRemovalReason::Revoked,
+        ));
+        weight
+    }
+}
+
+/// Implementing the certification event handler for the pallet.
 impl<T: Config> pallet_certification::traits::OnNewcert<IdtyIndex> for Pallet<T> {
+    /// This implementation checks if the receiver has received enough certificates to be able to issue certificates,
+    /// and applies the first issuable if the condition is met.
     fn on_new_cert(
         _issuer: IdtyIndex,
         _issuer_issued_count: u32,
@@ -281,8 +316,10 @@ impl<T: Config> pallet_certification::traits::OnNewcert<IdtyIndex> for Pallet<T>
     }
 }
 
-// remove cert handler
+/// Implementing the certification removal event handler for the pallet.
 impl<T: Config> pallet_certification::traits::OnRemovedCert<IdtyIndex> for Pallet<T> {
+    /// This implementation checks if the receiver has received fewer certificates than required for membership,
+    /// and if so, and the receiver is a member, it expires the receiver's membership.
     fn on_removed_cert(
         _issuer: IdtyIndex,
         _issuer_issued_count: u32,
@@ -293,19 +330,24 @@ impl<T: Config> pallet_certification::traits::OnRemovedCert<IdtyIndex> for Palle
         if receiver_received_count < T::MinCertForMembership::get()
             && pallet_membership::Pallet::<T>::is_member(&receiver)
         {
-            // expire receiver membership
+            // Expire receiver membership
             <pallet_membership::Pallet<T>>::do_remove_membership(
                 receiver,
                 MembershipRemovalReason::NotEnoughCerts,
-            )
+            );
         }
     }
 }
 
-/// valid distance status handler
+/// Implementing the valid distance status event handler for the pallet.
 impl<T: Config + pallet_distance::Config> pallet_distance::traits::OnValidDistanceStatus<T>
     for Pallet<T>
 {
+    /// This implementation handles different scenarios based on the identity's status:
+    ///
+    /// - For `Unconfirmed` or `Revoked` identities, no action is taken.
+    /// - For `Unvalidated` or `NotMember` identities, an attempt is made to add membership.
+    /// - For `Member` identities, an attempt is made to renew membership.
     fn on_valid_distance_status(idty_index: IdtyIndex) {
         if let Some(identity) = pallet_identity::Identities::<T>::get(idty_index) {
             match identity.status {
@@ -349,22 +391,28 @@ impl<T: Config + pallet_distance::Config> pallet_distance::traits::OnValidDistan
         } else {
             // identity was removed before distance status was found
             // so it's ok to do nothing
-            sp_std::if_std! {
-                println!("identity was removed before distance status was found: {:?}", idty_index);
-            }
+            #[cfg(feature = "std")]
+            println!(
+                "identity was removed before distance status was found: {:?}",
+                idty_index
+            );
         }
     }
 }
 
-/// distance evaluation request allowed check
+/// Implementing the request distance evaluation check for the pallet.
 impl<T: Config + pallet_distance::Config> pallet_distance::traits::CheckRequestDistanceEvaluation<T>
     for Pallet<T>
 {
+    /// This implementation performs the following checks:
+    ///
+    /// - Membership renewal anti-spam check: Ensures that membership renewal requests respect the anti-spam period.
+    /// - Certificate count check: Ensures that the identity has a sufficient number of certificates.
     fn check_request_distance_evaluation(idty_index: IdtyIndex) -> Result<(), DispatchError> {
-        // check membership renewal antispam
+        // Check membership renewal anti-spam
         let maybe_membership_data = pallet_membership::Pallet::<T>::membership(idty_index);
         if let Some(membership_data) = maybe_membership_data {
-            // if membership data exists, this is for a renewal, apply antispam
+            // If membership data exists, this is for a renewal, apply anti-spam
             ensure!(
                 // current_block > expiration block - membership period + renewal period
                 membership_data.expire_on
@@ -374,13 +422,13 @@ impl<T: Config + pallet_distance::Config> pallet_distance::traits::CheckRequestD
                 Error::<T>::MembershipRenewalPeriodNotRespected
             );
         };
-        // check cert count
+        // Check certificate count
         check_cert_count::<T>(idty_index)?;
         Ok(())
     }
 }
 
-/// check certification count
+/// Checks the certificate count for an identity.
 fn check_cert_count<T: Config>(idty_index: IdtyIndex) -> Result<(), DispatchError> {
     let idty_cert_meta = pallet_certification::Pallet::<T>::idty_cert_meta(idty_index);
     ensure!(
diff --git a/pallets/duniter-wot/src/mock.rs b/pallets/duniter-wot/src/mock.rs
index c7be1ef5541523b46ebcc84629918232cd2b3ba3..ddb4bf63f64b807a7a40abe2aa40a9d91a43ad57 100644
--- a/pallets/duniter-wot/src/mock.rs
+++ b/pallets/duniter-wot/src/mock.rs
@@ -19,10 +19,10 @@ use crate::{self as pallet_duniter_wot};
 use frame_support::{parameter_types, traits::Everything};
 use frame_system as system;
 use sp_core::H256;
-use sp_runtime::BuildStorage;
 use sp_runtime::{
     testing::{TestSignature, UintAuthorityId},
     traits::{BlakeTwo256, IdentityLookup},
+    BuildStorage,
 };
 use sp_state_machine::BasicExternalities;
 use std::collections::BTreeMap;
@@ -30,15 +30,6 @@ use std::collections::BTreeMap;
 type AccountId = u64;
 type Block = frame_system::mocking::MockBlock<Test>;
 
-pub struct IdentityIndexOf<T: pallet_identity::Config>(PhantomData<T>);
-impl<T: pallet_identity::Config> sp_runtime::traits::Convert<T::AccountId, Option<T::IdtyIndex>>
-    for IdentityIndexOf<T>
-{
-    fn convert(account_id: T::AccountId) -> Option<T::IdtyIndex> {
-        pallet_identity::Pallet::<T>::identity_index_of(account_id)
-    }
-}
-
 // Configure a mock runtime to test the pallet.
 frame_support::construct_runtime!(
     pub enum Test {
@@ -69,16 +60,21 @@ impl system::Config for Test {
     type Hashing = BlakeTwo256;
     type Lookup = IdentityLookup<Self::AccountId>;
     type MaxConsumers = frame_support::traits::ConstU32<16>;
+    type MultiBlockMigrator = ();
     type Nonce = u64;
     type OnKilledAccount = ();
     type OnNewAccount = ();
     type OnSetCode = ();
     type PalletInfo = PalletInfo;
+    type PostInherents = ();
+    type PostTransactions = ();
+    type PreInherents = ();
     type RuntimeCall = RuntimeCall;
     type RuntimeEvent = RuntimeEvent;
     type RuntimeOrigin = RuntimeOrigin;
     type RuntimeTask = ();
     type SS58Prefix = SS58Prefix;
+    type SingleBlockMigrations = ();
     type SystemWeightInfo = ();
     type Version = ();
 }
@@ -117,6 +113,7 @@ impl pallet_identity::Config for Test {
     type AccountLinker = ();
     type AutorevocationPeriod = AutorevocationPeriod;
     type ChangeOwnerKeyPeriod = ChangeOwnerKeyPeriod;
+    type CheckAccountWorthiness = ();
     type CheckIdtyCallAllowed = DuniterWot;
     type ConfirmPeriod = ConfirmPeriod;
     type DeletionPeriod = DeletionPeriod;
@@ -124,7 +121,9 @@ impl pallet_identity::Config for Test {
     type IdtyData = ();
     type IdtyIndex = IdtyIndex;
     type IdtyNameValidator = IdtyNameValidatorTestImpl;
-    type OnIdtyChange = DuniterWot;
+    type OnNewIdty = DuniterWot;
+    type OnRemoveIdty = DuniterWot;
+    type OwnerKeyChangePermission = ();
     type RuntimeEvent = RuntimeEvent;
     type Signature = TestSignature;
     type Signer = UintAuthorityId;
@@ -139,15 +138,15 @@ parameter_types! {
 }
 
 impl pallet_membership::Config for Test {
-    type AccountIdOf = ();
     #[cfg(feature = "runtime-benchmarks")]
     type BenchmarkSetupHandler = ();
     type CheckMembershipOpAllowed = DuniterWot;
+    type IdtyAttr = Identity;
     type IdtyId = IdtyIndex;
-    type IdtyIdOf = IdentityIndexOf<Self>;
     type MembershipPeriod = MembershipPeriod;
     type MembershipRenewalPeriod = MembershipRenewalPeriod;
-    type OnEvent = DuniterWot;
+    type OnNewMembership = DuniterWot;
+    type OnRemoveMembership = DuniterWot;
     type RuntimeEvent = RuntimeEvent;
     type WeightInfo = ();
 }
diff --git a/pallets/duniter-wot/src/tests.rs b/pallets/duniter-wot/src/tests.rs
index 515827526523ae876a6c13d7c551a3a9daa08d15..c82be351435b92b532ec752ca1c30f08459d6678 100644
--- a/pallets/duniter-wot/src/tests.rs
+++ b/pallets/duniter-wot/src/tests.rs
@@ -14,8 +14,7 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-use crate::mock::*;
-use crate::pallet as pallet_duniter_wot;
+use crate::{mock::*, pallet as pallet_duniter_wot};
 use codec::Encode;
 use frame_support::{assert_noop, assert_ok};
 use pallet_identity::{
diff --git a/pallets/duniter-wot/src/traits.rs b/pallets/duniter-wot/src/traits.rs
deleted file mode 100644
index f3474822b34656f1c99a9b12d34a548316c87941..0000000000000000000000000000000000000000
--- a/pallets/duniter-wot/src/traits.rs
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2023 Axiom-Team
-//
-// This file is part of Duniter-v2S.
-//
-// Duniter-v2S is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Affero General Public License as published by
-// the Free Software Foundation, version 3 of the License.
-//
-// Duniter-v2S is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Affero General Public License for more details.
-//
-// You should have received a copy of the GNU Affero General Public License
-// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
diff --git a/pallets/identity/Cargo.toml b/pallets/identity/Cargo.toml
index 4cbd9dab004bf0df6b07c598437d7024e83a2e91..7e163e2ab298f42ee421f0429d1eee12e79feab6 100644
--- a/pallets/identity/Cargo.toml
+++ b/pallets/identity/Cargo.toml
@@ -5,7 +5,6 @@ edition.workspace = true
 homepage.workspace = true
 license.workspace = true
 name = "pallet-identity"
-readme = "README.md"
 repository.workspace = true
 version.workspace = true
 
@@ -30,7 +29,6 @@ std = [
 	"sp-keystore/std",
 	"sp-runtime/std",
 	"sp-state-machine/std",
-	"sp-std/std",
 ]
 try-runtime = [
 	"duniter-primitives/try-runtime",
@@ -43,23 +41,18 @@ try-runtime = [
 default-features = false
 targets = ["x86_64-unknown-linux-gnu"]
 
-[build-dependencies]
-substrate-wasm-builder = { git = "https://github.com/duniter/duniter-polkadot-sdk", branch = "duniter-substrate-v1.6.0" }
-
 [dependencies]
 codec = { workspace = true, features = ["derive"] }
 duniter-primitives = { workspace = true }
 frame-benchmarking = { workspace = true, optional = true }
 frame-support = { workspace = true }
 frame-system = { workspace = true }
-impl-trait-for-tuples = { workspace = true }
 scale-info = { workspace = true, features = ["derive"] }
 serde = { workspace = true, features = ["derive"] }
 sp-core = { workspace = true }
 sp-io = { workspace = true }
 sp-runtime = { workspace = true }
-sp-std = { workspace = true }
 
 [dev-dependencies]
-sp-keystore = { workspace = true }
-sp-state-machine = { workspace = true }
+sp-keystore = { workspace = true, default-features = true }
+sp-state-machine = { workspace = true, default-features = true }
diff --git a/pallets/identity/README.md b/pallets/identity/README.md
deleted file mode 100644
index e8da9f126f9ff87610106d9323a479af506881e1..0000000000000000000000000000000000000000
--- a/pallets/identity/README.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# Duniter identity pallet
-
-Duniter has a builtin identity system that does not work with external registrar compared to [parity identity pallet](https://github.com/paritytech/substrate/tree/master/frame/identity).
-
-## Duniter identity
-
-A Duniter identity contains:
-
-- its **owner key** (that can change)
-- an optional **old owner key** with the date of the key change
-- a **status** that can be
-  - unconfirmed (created by a member identity)
-  - unvalidated (confirmed by owner = given a name)
-  - member (of the main wot)
-  - notmember (of the main wot)
-  - revoked (automatically of manually)
-
-It also contains:
-
-- the block number at which it can emit its **next certification** (TODO distinguish next certification and next identity creation)
-- the block number at which it can be **removed from storage**
-
-It also contains attached data defined by the runtime that can be for example
-
-- the number of the first UD it is eligible to
-
-### Name
-
-Each identity is declared with a name emited on confirmation event. Duniter keeps a list of identity names hash to ensure unicity.
-
-### Owner key
-
-The idea of the owner key is to allow the user to keep a fixed identity while changing the keys for security reasons. For example when a device with the keys might have been compromised. There is a limit to the frequency of owner key change and the old owner key can still revoke the identity for a given period.
-
-### Status / removable date
-
-The status is a temporary value allowing to prune identities before they become member. When an identity is not valiated (not member of the WoT for instance), it can be removed when the date is reached. The remove date of a validated identity is block zero.
-
-### Next certification
-
-The next certification is a rate limit to the emission of certification (and then identity creation).
-
-### Revokation
-
-Revoking an identity basically means deleting it.
diff --git a/pallets/identity/src/benchmarking.rs b/pallets/identity/src/benchmarking.rs
index e013a2ac4ce3a05ccea869cbcb3d882d7baff722..831b724292df6b14a98468f82f3a6da285c12fd4 100644
--- a/pallets/identity/src/benchmarking.rs
+++ b/pallets/identity/src/benchmarking.rs
@@ -19,11 +19,9 @@
 use super::*;
 
 use codec::Encode;
-use frame_benchmarking::account;
-use frame_benchmarking::v2::*;
+use frame_benchmarking::{account, v2::*};
 use frame_support::traits::OnInitialize;
-use frame_system::pallet_prelude::BlockNumberFor;
-use frame_system::RawOrigin;
+use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin};
 use sp_core::Get;
 use sp_io::crypto::{sr25519_generate, sr25519_sign};
 use sp_runtime::{AccountId32, MultiSigner};
@@ -62,6 +60,7 @@ mod benchmarks {
             RawOrigin::Signed(caller.clone()).into();
         let owner_key_origin: <T as frame_system::Config>::RuntimeOrigin =
             RawOrigin::Signed(owner_key.clone()).into();
+        T::CheckAccountWorthiness::set_worthy(&owner_key);
         Pallet::<T>::create_identity(caller_origin.clone(), owner_key.clone())?;
         let name = IdtyName("new_identity".into());
         Pallet::<T>::confirm_identity(owner_key_origin.clone(), name.clone())?;
@@ -126,6 +125,7 @@ mod benchmarks {
     fn create_identity() {
         let caller: T::AccountId = Identities::<T>::get(T::IdtyIndex::one()).unwrap().owner_key; // Alice
         let owner_key: T::AccountId = account("new_identity", 2, 1);
+        T::CheckAccountWorthiness::set_worthy(&owner_key);
 
         #[extrinsic_call]
         _(RawOrigin::Signed(caller), owner_key.clone());
@@ -147,6 +147,7 @@ mod benchmarks {
         let caller_origin: <T as frame_system::Config>::RuntimeOrigin =
             RawOrigin::Signed(caller.clone()).into();
         let owner_key: T::AccountId = account("new_identity", 2, 1);
+        T::CheckAccountWorthiness::set_worthy(&owner_key);
         Pallet::<T>::create_identity(caller_origin.clone(), owner_key.clone())?;
 
         #[extrinsic_call]
@@ -429,6 +430,49 @@ mod benchmarks {
         );
     }
 
+    #[benchmark]
+    fn do_remove_identity_handler() {
+        let idty_index: T::IdtyIndex = 1u32.into();
+        let new_identity: T::AccountId = account("Bob", 2, 1);
+        assert!(Identities::<T>::get(idty_index).is_some());
+        frame_system::Pallet::<T>::inc_sufficients(&new_identity);
+        Identities::<T>::mutate(idty_index, |id| {
+            if let Some(id) = id {
+                id.old_owner_key = Some((new_identity, BlockNumberFor::<T>::zero()));
+            }
+        });
+        assert!(Identities::<T>::get(idty_index)
+            .unwrap()
+            .old_owner_key
+            .is_some());
+
+        #[block]
+        {
+            T::OnRemoveIdty::on_removed(&idty_index);
+        }
+    }
+
+    #[benchmark]
+    fn membership_removed() -> Result<(), BenchmarkError> {
+        let key: T::AccountId = account("new_identity", 2, 1);
+        let account: Account<T> = create_one_identity(key)?;
+        assert_eq!(
+            Identities::<T>::get(account.index).unwrap().status,
+            IdtyStatus::Member
+        );
+
+        #[block]
+        {
+            Pallet::<T>::membership_removed(account.index);
+        }
+
+        assert_eq!(
+            Identities::<T>::get(account.index).unwrap().status,
+            IdtyStatus::NotMember
+        );
+        Ok(())
+    }
+
     #[benchmark]
     fn prune_identities_noop() {
         assert!(IdentityChangeSchedule::<T>::try_get(BlockNumberFor::<T>::zero()).is_err());
diff --git a/pallets/identity/src/lib.rs b/pallets/identity/src/lib.rs
index eac91bda1c4ec511792487cc13b9342d8807cd9e..981a029bab39cad33777bbc92f8210712189a37e 100644
--- a/pallets/identity/src/lib.rs
+++ b/pallets/identity/src/lib.rs
@@ -14,6 +14,43 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
+//! # Duniter Identity Pallet
+//!
+//! Duniter features a built-in identity system that does not rely on external registrars, unlike the [Parity Identity Pallet](https://github.com/paritytech/substrate/tree/master/frame/identity).
+//!
+//! ## Duniter Identity Structure
+//!
+//! A Duniter identity comprises several key components:
+//!
+//! ### Name
+//!
+//! Each identity is declared with a name emitted during the confirmation event. Duniter maintains a hashed list of identity names to ensure uniqueness.
+//!
+//! ### Owner Key
+//!
+//! The owner key allows users to maintain a fixed identity while changing keys for security reasons, such as when a device with the keys might have been compromised. Changes are subject to frequency limits, and the old owner key can still revoke the identity for a given period.
+//!
+//! ### Status / Removable Date
+//!
+//! The status is a temporary value that allows pruning of identities before they become full members:
+//!   - **Unconfirmed**: Created by a member identity but not yet confirmed by the owner.
+//!   - **Unvalidated**: Confirmed by the owner, including assignment of a name.
+//!   - **Member**: Part of the main Web of Trust (WoT).
+//!   - **NotMember**: Not part of the main WoT.
+//!   - **Revoked**: Automatically or manually revoked.
+//!
+//! An identity that is not yet validated (e.g., not a member of the WoT) can be removed when its removable date is reached. The removable date of a validated identity is set to block zero.
+//!
+//! ### Next Certification
+//!
+//! The next certification specifies the block number from which the identity can issue its next certification, acting as a rate limit for certification issuance and identity creation.
+//!
+//! ### Revocation
+//!
+//! Revoking an identity essentially means deleting it from the system.
+//!
+//! Additional runtime-defined data may also be attached to identities, such the number of the first Universal Dividends (UD) it is eligible to.
+
 #![cfg_attr(not(feature = "std"), no_std)]
 #![allow(clippy::type_complexity)]
 
@@ -27,7 +64,6 @@ mod mock;
 #[cfg(test)]
 mod tests;
 
-#[cfg(feature = "runtime-benchmarks")]
 pub mod benchmarking;
 
 pub use pallet::*;
@@ -37,9 +73,8 @@ pub use weights::WeightInfo;
 use crate::traits::*;
 use codec::Codec;
 use frame_support::pallet_prelude::Weight;
+use scale_info::prelude::{collections::BTreeSet, fmt::Debug, vec::Vec};
 use sp_runtime::traits::{AtLeast32BitUnsigned, IdentifyAccount, One, Saturating, Verify, Zero};
-use sp_std::fmt::Debug;
-use sp_std::prelude::*;
 
 // icok = identity change owner key
 pub const NEW_OWNER_KEY_PAYLOAD_PREFIX: [u8; 4] = [b'i', b'c', b'o', b'k'];
@@ -51,8 +86,7 @@ pub const LINK_IDTY_PAYLOAD_PREFIX: [u8; 4] = [b'l', b'i', b'n', b'k'];
 #[frame_support::pallet]
 pub mod pallet {
     use super::*;
-    use frame_support::pallet_prelude::*;
-    use frame_support::traits::StorageVersion;
+    use frame_support::{pallet_prelude::*, traits::StorageVersion};
     use frame_system::pallet_prelude::*;
 
     /// The current storage version.
@@ -67,32 +101,40 @@ pub mod pallet {
 
     #[pallet::config]
     pub trait Config: frame_system::Config {
-        /// Period during which the owner can confirm the new identity.
-        // something like 2 days but this should be done quickly as the first certifier is helping
+        /// The period during which the owner can confirm the new identity.
         #[pallet::constant]
         type ConfirmPeriod: Get<BlockNumberFor<Self>>;
-        /// Period before which the identity has to be validated (become member).
-        // this is the 2 month period in v1
+
+        /// The period during which the identity has to be validated to become a member.
         #[pallet::constant]
         type ValidationPeriod: Get<BlockNumberFor<Self>>;
-        /// Period before which an identity who lost membership is automatically revoked.
-        // this is the 1 year period in v1
+
+        /// The period before which an identity that lost membership is automatically revoked.
         #[pallet::constant]
         type AutorevocationPeriod: Get<BlockNumberFor<Self>>;
-        /// Period after which a revoked identity is removed and the keys are freed.
+
+        /// The period after which a revoked identity is removed and the keys are freed.
         #[pallet::constant]
         type DeletionPeriod: Get<BlockNumberFor<Self>>;
-        /// Minimum duration between two owner key changes.
-        // to avoid stealing the identity without means to revoke
+
+        /// The minimum duration between two owner key changes to prevent identity theft.
         #[pallet::constant]
         type ChangeOwnerKeyPeriod: Get<BlockNumberFor<Self>>;
-        /// Minimum duration between the creation of 2 identities by the same creator.
-        // it should be greater or equal than the certification period in certification pallet
+
+        /// 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.
         #[pallet::constant]
         type IdtyCreationPeriod: Get<BlockNumberFor<Self>>;
-        /// Management of the authorizations of the different calls.
-        /// The default implementation allows everything.
+
+        /// Management of the authorizations of the different calls related to identity.
         type CheckIdtyCallAllowed: CheckIdtyCallAllowed<Self>;
+
+        /// The type used to check account worthiness.
+        type CheckAccountWorthiness: CheckAccountWorthiness<Self>;
+
+        /// Handler that checks the necessary permissions for an identity's owner key change.
+        type OwnerKeyChangePermission: CheckKeyChangeAllowed<Self>;
+
         /// Custom data to store in each identity.
         type IdtyData: Clone
             + Codec
@@ -101,7 +143,8 @@ pub mod pallet {
             + TypeInfo
             + MaybeSerializeDeserialize
             + MaxEncodedLen;
-        /// A short identity index.
+
+        /// A short identity index type.
         type IdtyIndex: Parameter
             + Member
             + AtLeast32BitUnsigned
@@ -111,18 +154,28 @@ pub mod pallet {
             + MaybeSerializeDeserialize
             + Debug
             + MaxEncodedLen;
-        /// custom type for account data
+
+        /// A type for linking account data to identity.
         type AccountLinker: LinkIdty<Self::AccountId, Self::IdtyIndex>;
-        /// Handle logic to validate an identity name
+
+        /// Handle logic to validate an identity name.
         type IdtyNameValidator: IdtyNameValidator;
-        /// On identity confirmed by its owner
-        type OnIdtyChange: OnIdtyChange<Self>;
-        /// Signing key of a payload
+
+        /// Handler called when a new identity is created.
+        type OnNewIdty: OnNewIdty<Self>;
+
+        /// Handler called when an identity is removed.
+        type OnRemoveIdty: OnRemoveIdty<Self>;
+
+        /// Signing key type used for payload signatures.
         type Signer: IdentifyAccount<AccountId = Self::AccountId>;
-        /// Signature of a payload
+
+        /// Signature type for payload verification.
         type Signature: Parameter + Verify<Signer = Self::Signer>;
-        /// Because this pallet emits events, it depends on the runtime's definition of an event.
+
+        /// The overarching event type.
         type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
+
         /// Type representing the weight of this pallet
         type WeightInfo: WeightInfo;
     }
@@ -153,7 +206,7 @@ pub mod pallet {
     #[pallet::genesis_build]
     impl<T: Config> BuildGenesisConfig for GenesisConfig<T> {
         fn build(&self) {
-            let mut names = sp_std::collections::btree_set::BTreeSet::new();
+            let mut names = BTreeSet::new();
             for idty in &self.identities {
                 assert!(
                     !names.contains(&idty.name),
@@ -188,7 +241,7 @@ pub mod pallet {
 
     // STORAGE //
 
-    /// maps identity index to identity value
+    /// The identity value for each identity.
     #[pallet::storage]
     #[pallet::getter(fn identity)]
     pub type Identities<T: Config> = CountedStorageMap<
@@ -199,23 +252,23 @@ pub mod pallet {
         OptionQuery,
     >;
 
-    /// maps account id to identity index
+    /// The identity associated with each account.
     #[pallet::storage]
     #[pallet::getter(fn identity_index_of)]
     pub type IdentityIndexOf<T: Config> =
         StorageMap<_, Blake2_128Concat, T::AccountId, T::IdtyIndex, OptionQuery>;
 
-    /// maps identity name to identity index (simply a set)
+    /// The name associated with each identity.
     #[pallet::storage]
     #[pallet::getter(fn identity_by_did)]
     pub type IdentitiesNames<T: Config> =
         StorageMap<_, Blake2_128Concat, IdtyName, T::IdtyIndex, OptionQuery>;
 
-    /// counter of the identity index to give to the next identity
+    /// The identity index to assign to the next created identity.
     #[pallet::storage]
     pub(super) type NextIdtyIndex<T: Config> = StorageValue<_, T::IdtyIndex, ValueQuery>;
 
-    /// maps block number to the list of identities set to be removed at this bloc
+    /// The identities to remove at a given block.
     #[pallet::storage]
     #[pallet::getter(fn next_scheduled)]
     pub type IdentityChangeSchedule<T: Config> =
@@ -325,13 +378,7 @@ pub mod pallet {
                 owner_key: owner_key.clone(),
             });
             T::AccountLinker::link_identity(&owner_key, idty_index)?;
-            T::OnIdtyChange::on_idty_change(
-                idty_index,
-                &IdtyEvent::Created {
-                    creator: creator_index,
-                    owner_key,
-                },
-            );
+            T::OnNewIdty::on_created(&idty_index, &creator_index);
             Ok(().into())
         }
 
@@ -409,6 +456,12 @@ pub mod pallet {
                 Error::<T>::OwnerKeyAlreadyUsed
             );
 
+            // Ensure that the key is not currently as a validator
+            ensure!(
+                T::OwnerKeyChangePermission::check_allowed(&idty_index),
+                Error::<T>::OwnerKeyUsedAsValidator
+            );
+
             let block_number = frame_system::Pallet::<T>::block_number();
             let maybe_old_old_owner_key =
                 if let Some((old_owner_key, last_change)) = idty_value.old_owner_key {
@@ -517,9 +570,15 @@ pub mod pallet {
             Ok(().into())
         }
 
+        /// Remove identity names from storage.
+        ///
+        /// This function allows a privileged root origin to remove multiple identity names from storage
+        /// in bulk.
+        ///
+        /// - `origin` - The origin of the call. It must be root.
+        /// - `names` - A vector containing the identity names to be removed from storage.
         #[pallet::call_index(6)]
         #[pallet::weight(T::WeightInfo::prune_item_identities_names(names.len() as u32))]
-        /// remove identity names from storage
         pub fn prune_item_identities_names(
             origin: OriginFor<T>,
             names: Vec<IdtyName>,
@@ -533,9 +592,17 @@ pub mod pallet {
             Ok(().into())
         }
 
+        /// Change sufficient reference count for a given key.
+        ///
+        /// This function allows a privileged root origin to increment or decrement the sufficient
+        /// reference count associated with a specified owner key.
+        ///
+        /// - `origin` - The origin of the call. It must be root.
+        /// - `owner_key` - The account whose sufficient reference count will be modified.
+        /// - `inc` - A boolean indicating whether to increment (`true`) or decrement (`false`) the count.
+        ///
         #[pallet::call_index(7)]
         #[pallet::weight(T::WeightInfo::fix_sufficients())]
-        /// change sufficient ref count for given key
         pub fn fix_sufficients(
             origin: OriginFor<T>,
             owner_key: T::AccountId,
@@ -552,17 +619,23 @@ pub mod pallet {
             Ok(().into())
         }
 
-        /// Link an account to an identity
-        // both must sign (target account and identity)
+        /// 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.
         // can be used for quota system
         // re-uses new owner key payload for simplicity
         // with other custom prefix
         #[pallet::call_index(8)]
         #[pallet::weight(T::WeightInfo::link_account())]
         pub fn link_account(
-            origin: OriginFor<T>,      // origin must have an identity index
-            account_id: T::AccountId,  // id of account to link (must sign the payload)
-            payload_sig: T::Signature, // signature with linked identity
+            origin: OriginFor<T>,
+            account_id: T::AccountId,
+            payload_sig: T::Signature,
         ) -> DispatchResultWithPostInfo {
             // verif
             let who = ensure_signed(origin)?;
@@ -624,20 +697,25 @@ pub mod pallet {
         CanNotRevokeUnvalidated,
         /// Cannot link to an inexisting account.
         AccountNotExist,
+        /// Insufficient balance to create an identity.
+        InsufficientBalance,
+        /// Owner key currently used as validator.
+        OwnerKeyUsedAsValidator,
     }
 
     // INTERNAL FUNCTIONS //
 
     impl<T: Config> Pallet<T> {
-        /// get identity count
+        /// Get the number of identities.
         pub fn identities_count() -> u32 {
             Identities::<T>::count()
         }
 
-        /// membership added
-        // when an identity becomes member, update its status
-        // unschedule identity action, this falls back to membership scheduling
-        // no identity schedule while membership is active
+        /// Handle the addition of membership to an identity.
+        ///
+        /// This function is called when an identity transitions to a member status. It updates
+        /// the identity's status, unschedules any pending identity change actions, and resets
+        /// the identity's next scheduled action to zero.
         pub fn membership_added(idty_index: T::IdtyIndex) {
             if let Some(mut idty_value) = Identities::<T>::get(idty_index) {
                 Self::unschedule_identity_change(idty_index, idty_value.next_scheduled);
@@ -652,11 +730,12 @@ pub mod pallet {
             // else should not happen
         }
 
-        /// membership removed
-        // only does something if identity is actually member
-        // a membership can be removed when the identity is revoked
-        // in this case, this does nothing
-        pub fn membership_removed(idty_index: T::IdtyIndex) {
+        /// Handle the removal of membership from an identity.
+        ///
+        /// This function is called when membership is revoked from an identity. It checks
+        /// if the identity is currently a member, and if so, updates its status to `NotMember`.
+        /// If the identity is already revoked, this function does nothing.
+        pub fn membership_removed(idty_index: T::IdtyIndex) -> Weight {
             if let Some(idty_value) = Identities::<T>::get(idty_index) {
                 if idty_value.status == IdtyStatus::Member {
                     Self::update_identity_status(
@@ -667,13 +746,15 @@ pub mod pallet {
                     );
                 }
             }
+            T::WeightInfo::membership_removed()
             // else should not happen
         }
 
-        /// perform identity removal
-        // (kind of garbage collector)
-        // this should not be called while the identity is still member
-        // otherwise there will still be a membership in storage, but no more identity
+        /// Perform the removal of an identity.
+        ///
+        /// This function acts as a garbage collector for identities. It should not be called
+        /// while the identity is still a member; otherwise, there will still be a membership
+        /// in storage, but no more identity.
         pub fn do_remove_identity(idty_index: T::IdtyIndex, reason: RemovalReason) -> Weight {
             if let Some(idty_value) = Identities::<T>::get(idty_index) {
                 // this line allows the owner key to be used after that
@@ -685,18 +766,19 @@ pub mod pallet {
                     frame_system::Pallet::<T>::dec_sufficients(&old_owner_key);
                 }
                 Self::deposit_event(Event::IdtyRemoved { idty_index, reason });
-                T::OnIdtyChange::on_idty_change(
-                    idty_index,
-                    &IdtyEvent::Removed {
-                        status: idty_value.status,
-                    },
+                let weight = T::OnRemoveIdty::on_removed(&idty_index);
+                return weight.saturating_add(
+                    T::WeightInfo::do_remove_identity()
+                        .saturating_sub(T::WeightInfo::do_remove_identity_handler()),
                 );
-                return T::WeightInfo::do_remove_identity();
             }
             T::WeightInfo::do_remove_identity_noop()
         }
 
-        /// revoke identity
+        /// Revoke an identity.
+        ///
+        /// This function revokes an identity, updating its status to `Revoked` and scheduling
+        /// it for removal after the specified deletion period.
         pub fn do_revoke_identity(idty_index: T::IdtyIndex, reason: RevocationReason) -> Weight {
             if let Some(idty_value) = Identities::<T>::get(idty_index) {
                 Self::update_identity_status(
@@ -707,12 +789,7 @@ pub mod pallet {
                 );
 
                 Self::deposit_event(Event::IdtyRevoked { idty_index, reason });
-                T::OnIdtyChange::on_idty_change(
-                    idty_index,
-                    &IdtyEvent::Removed {
-                        status: IdtyStatus::Revoked,
-                    },
-                );
+                T::OnRemoveIdty::on_revoked(&idty_index);
                 return T::WeightInfo::do_revoke_identity();
             }
             T::WeightInfo::do_revoke_identity_noop()
@@ -729,7 +806,7 @@ pub mod pallet {
             }
         }
 
-        /// remove identities planned for removal at the given block
+        /// Prune identities planned for removal at the given block number.
         pub fn prune_identities(block_number: BlockNumberFor<T>) -> Weight {
             let mut total_weight = Weight::zero();
 
@@ -738,39 +815,50 @@ pub mod pallet {
                     if idty_val.next_scheduled == block_number {
                         match idty_val.status {
                             IdtyStatus::Unconfirmed => {
-                                total_weight +=
-                                    Self::do_remove_identity(idty_index, RemovalReason::Unconfirmed)
+                                total_weight =
+                                    total_weight.saturating_add(Self::do_remove_identity(
+                                        idty_index,
+                                        RemovalReason::Unconfirmed,
+                                    ));
                             }
                             IdtyStatus::Unvalidated => {
-                                total_weight +=
-                                    Self::do_remove_identity(idty_index, RemovalReason::Unvalidated)
+                                total_weight =
+                                    total_weight.saturating_add(Self::do_remove_identity(
+                                        idty_index,
+                                        RemovalReason::Unvalidated,
+                                    ));
                             }
                             IdtyStatus::Revoked => {
-                                total_weight +=
-                                    Self::do_remove_identity(idty_index, RemovalReason::Revoked)
+                                total_weight = total_weight.saturating_add(
+                                    Self::do_remove_identity(idty_index, RemovalReason::Revoked),
+                                );
                             }
                             IdtyStatus::NotMember => {
-                                total_weight +=
-                                    Self::do_revoke_identity(idty_index, RevocationReason::Expired)
+                                total_weight = total_weight.saturating_add(
+                                    Self::do_revoke_identity(idty_index, RevocationReason::Expired),
+                                );
                             }
                             IdtyStatus::Member => { // do not touch identities of member accounts
                                  // this should not happen
                             }
                         }
                     } else {
-                        total_weight += T::WeightInfo::prune_identities_err()
-                            .saturating_sub(T::WeightInfo::prune_identities_none())
+                        total_weight = total_weight.saturating_add(
+                            T::WeightInfo::prune_identities_err()
+                                .saturating_sub(T::WeightInfo::prune_identities_none()),
+                        );
                     }
                 } else {
-                    total_weight += T::WeightInfo::prune_identities_none()
-                        .saturating_sub(T::WeightInfo::prune_identities_noop())
+                    total_weight = total_weight.saturating_add(
+                        T::WeightInfo::prune_identities_none()
+                            .saturating_sub(T::WeightInfo::prune_identities_noop()),
+                    );
                 }
             }
-
             total_weight.saturating_add(T::WeightInfo::prune_identities_noop())
         }
 
-        /// change identity status and reschedule next action
+        /// Change the identity status and reschedule the next action accordingly.
         fn update_identity_status(
             idty_index: T::IdtyIndex,
             mut idty_value: IdtyValue<BlockNumberFor<T>, T::AccountId, T::IdtyData>,
@@ -783,7 +871,7 @@ pub mod pallet {
             <Identities<T>>::insert(idty_index, idty_value);
         }
 
-        /// unschedule identity change
+        /// Unschedules the change related to an identity.
         fn unschedule_identity_change(idty_id: T::IdtyIndex, block_number: BlockNumberFor<T>) {
             let mut scheduled = IdentityChangeSchedule::<T>::get(block_number);
             if let Some(pos) = scheduled.iter().position(|x| *x == idty_id) {
@@ -792,7 +880,7 @@ pub mod pallet {
             }
         }
 
-        /// schedule identity change after given period
+        /// Schedule an identity change after a specified period.
         fn schedule_identity_change(
             idty_id: T::IdtyIndex,
             period: BlockNumberFor<T>,
@@ -803,7 +891,7 @@ pub mod pallet {
             next_scheduled
         }
 
-        /// check create identity
+        /// Check if creating an identity is allowed.
         // first internal checks
         // then other pallet checks trough trait
         fn check_create_identity(
@@ -839,6 +927,7 @@ pub mod pallet {
             // --- other checks depend on other pallets
             // run checks for identity creation
             T::CheckIdtyCallAllowed::check_create_identity(creator_index)?;
+            T::CheckAccountWorthiness::check_account_worthiness(receiver_key)?;
 
             Ok(creator_index)
         }
@@ -867,7 +956,7 @@ impl<T> frame_support::traits::StoredMap<T::AccountId, T::IdtyData> for Pallet<T
 where
     T: Config,
 {
-    /// get identity data for an account id
+    /// Get identity data for an account.
     fn get(key: &T::AccountId) -> T::IdtyData {
         if let Some(idty_index) = Self::identity_index_of(key) {
             if let Some(idty_val) = Identities::<T>::get(idty_index) {
@@ -880,7 +969,7 @@ where
         }
     }
 
-    /// mutate an account given a function of its data
+    /// Mutate an account in function of its data.
     fn try_mutate_exists<R, E: From<sp_runtime::DispatchError>>(
         key: &T::AccountId,
         f: impl FnOnce(&mut Option<T::IdtyData>) -> Result<R, E>,
diff --git a/pallets/identity/src/mock.rs b/pallets/identity/src/mock.rs
index 8941544143f6bcc790726e2f08def0c65d091efc..92380ce2cc3d7cb54fd2bf45fa2c941de787608b 100644
--- a/pallets/identity/src/mock.rs
+++ b/pallets/identity/src/mock.rs
@@ -23,10 +23,9 @@ use frame_support::{
 use frame_system as system;
 use sp_core::{Pair, H256};
 use sp_keystore::{testing::MemoryKeystore, KeystoreExt};
-use sp_runtime::BuildStorage;
 use sp_runtime::{
     traits::{BlakeTwo256, IdentityLookup},
-    MultiSignature, MultiSigner,
+    BuildStorage, MultiSignature, MultiSigner,
 };
 use sp_state_machine::BasicExternalities;
 use std::sync::Arc;
@@ -68,16 +67,21 @@ impl system::Config for Test {
     type Hashing = BlakeTwo256;
     type Lookup = IdentityLookup<Self::AccountId>;
     type MaxConsumers = frame_support::traits::ConstU32<16>;
+    type MultiBlockMigrator = ();
     type Nonce = u64;
     type OnKilledAccount = ();
     type OnNewAccount = ();
     type OnSetCode = ();
     type PalletInfo = PalletInfo;
+    type PostInherents = ();
+    type PostTransactions = ();
+    type PreInherents = ();
     type RuntimeCall = RuntimeCall;
     type RuntimeEvent = RuntimeEvent;
     type RuntimeOrigin = RuntimeOrigin;
     type RuntimeTask = ();
     type SS58Prefix = SS58Prefix;
+    type SingleBlockMigrations = ();
     type SystemWeightInfo = ();
     type Version = ();
 }
@@ -102,6 +106,7 @@ impl pallet_identity::Config for Test {
     type AccountLinker = ();
     type AutorevocationPeriod = AutorevocationPeriod;
     type ChangeOwnerKeyPeriod = ChangeOwnerKeyPeriod;
+    type CheckAccountWorthiness = ();
     type CheckIdtyCallAllowed = ();
     type ConfirmPeriod = ConfirmPeriod;
     type DeletionPeriod = DeletionPeriod;
@@ -109,7 +114,9 @@ impl pallet_identity::Config for Test {
     type IdtyData = ();
     type IdtyIndex = u64;
     type IdtyNameValidator = IdtyNameValidatorTestImpl;
-    type OnIdtyChange = ();
+    type OnNewIdty = ();
+    type OnRemoveIdty = ();
+    type OwnerKeyChangePermission = ();
     type RuntimeEvent = RuntimeEvent;
     type Signature = Signature;
     type Signer = AccountPublic;
diff --git a/pallets/identity/src/tests.rs b/pallets/identity/src/tests.rs
index 7d8c3abc618523f278b2cddcb40e5483b1beeffa..9bc2205ebad0eba7b654884651743deca7a1d199 100644
--- a/pallets/identity/src/tests.rs
+++ b/pallets/identity/src/tests.rs
@@ -14,14 +14,11 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-use crate::mock::*;
-use crate::*;
+use crate::{mock::*, *};
 use codec::Encode;
-use frame_support::dispatch::DispatchResultWithPostInfo;
-use frame_support::{assert_noop, assert_ok};
-use sp_core::sr25519::Pair as KeyPair;
-use sp_core::Pair;
-use sp_runtime::{traits::IdentifyAccount, MultiSignature, MultiSigner};
+use frame_support::{assert_noop, assert_ok, dispatch::DispatchResultWithPostInfo};
+use sp_core::{sr25519::Pair as KeyPair, Pair};
+use sp_runtime::{MultiSignature, MultiSigner};
 
 type IdtyVal = IdtyValue<u64, AccountId, ()>;
 
diff --git a/pallets/identity/src/traits.rs b/pallets/identity/src/traits.rs
index 6a1b457c1850bef852ac42bc0c160fc759b3f039..8366d1cff76022599feb2d118e622128cc12a59e 100644
--- a/pallets/identity/src/traits.rs
+++ b/pallets/identity/src/traits.rs
@@ -16,42 +16,93 @@
 
 use crate::*;
 use frame_support::pallet_prelude::*;
-use impl_trait_for_tuples::impl_for_tuples;
 
+/// Trait defining operations for checking if identity-related calls are allowed.
 pub trait CheckIdtyCallAllowed<T: Config> {
+    /// Check if creating an identity is allowed.
     fn check_create_identity(creator: T::IdtyIndex) -> Result<(), DispatchError>;
 }
 
-#[impl_for_tuples(5)]
-impl<T: Config> CheckIdtyCallAllowed<T> for Tuple {
-    fn check_create_identity(creator: T::IdtyIndex) -> Result<(), DispatchError> {
-        for_tuples!( #( Tuple::check_create_identity(creator)?; )* );
+impl<T: Config> CheckIdtyCallAllowed<T> for () {
+    fn check_create_identity(_creator: T::IdtyIndex) -> Result<(), DispatchError> {
         Ok(())
     }
 }
 
+/// Trait to check the worthiness of an account.
+pub trait CheckAccountWorthiness<T: Config> {
+    /// Check the worthiness of an account.
+    fn check_account_worthiness(account: &T::AccountId) -> Result<(), DispatchError>;
+    /// Set an account as worthy. Only available for runtime benchmarks.
+    #[cfg(feature = "runtime-benchmarks")]
+    fn set_worthy(account: &T::AccountId);
+}
+
+impl<T: Config> CheckAccountWorthiness<T> for () {
+    fn check_account_worthiness(_account: &T::AccountId) -> Result<(), DispatchError> {
+        Ok(())
+    }
+
+    #[cfg(feature = "runtime-benchmarks")]
+    fn set_worthy(_account: &T::AccountId) {}
+}
+
+/// Trait defining operations for validating identity names.
 pub trait IdtyNameValidator {
+    /// Validate an identity name.
     fn validate(idty_name: &IdtyName) -> bool;
 }
 
-pub trait OnIdtyChange<T: Config> {
-    fn on_idty_change(idty_index: T::IdtyIndex, idty_event: &IdtyEvent<T>);
+/// Trait defining behavior for handling new identities creation.
+pub trait OnNewIdty<T: Config> {
+    /// Called when a new identity is created.
+    fn on_created(idty_index: &T::IdtyIndex, creator: &T::IdtyIndex);
 }
 
-#[impl_for_tuples(5)]
-#[allow(clippy::let_and_return)]
-impl<T: Config> OnIdtyChange<T> for Tuple {
-    fn on_idty_change(idty_index: T::IdtyIndex, idty_event: &IdtyEvent<T>) {
-        for_tuples!( #( Tuple::on_idty_change(idty_index, idty_event); )* );
+/// Trait defining behavior for handling removed identities.
+/// As the weight accounting can be complicated it should be done
+/// at the handler level.
+pub trait OnRemoveIdty<T: Config> {
+    /// Called when an identity is removed.
+    fn on_removed(idty_index: &T::IdtyIndex) -> Weight;
+    /// Called when an identity is revoked.
+    fn on_revoked(idty_index: &T::IdtyIndex) -> Weight;
+}
+
+impl<T: Config> OnNewIdty<T> for () {
+    fn on_created(_idty_index: &T::IdtyIndex, _creator: &T::IdtyIndex) {}
+}
+
+impl<T: Config> OnRemoveIdty<T> for () {
+    fn on_removed(_idty_index: &T::IdtyIndex) -> Weight {
+        Weight::zero()
+    }
+
+    fn on_revoked(_idty_index: &T::IdtyIndex) -> Weight {
+        Weight::zero()
     }
 }
 
-/// trait used to link an account to an identity
+/// Trait defining operations for linking identities to accounts.
 pub trait LinkIdty<AccountId, IdtyIndex> {
+    /// Links an identity to an account.
     fn link_identity(account_id: &AccountId, idty_index: IdtyIndex) -> Result<(), DispatchError>;
 }
+
 impl<AccountId, IdtyIndex> LinkIdty<AccountId, IdtyIndex> for () {
     fn link_identity(_: &AccountId, _: IdtyIndex) -> Result<(), DispatchError> {
         Ok(())
     }
 }
+
+/// Trait for checking whether a key change is allowed for a given identity.
+pub trait CheckKeyChangeAllowed<T: Config> {
+    /// Determines if a key change is allowed for the given identity.
+    fn check_allowed(account_id: &T::IdtyIndex) -> bool;
+}
+
+impl<T: Config> CheckKeyChangeAllowed<T> for () {
+    fn check_allowed(_: &T::IdtyIndex) -> bool {
+        true
+    }
+}
diff --git a/pallets/identity/src/types.rs b/pallets/identity/src/types.rs
index e3c8b35dba622b34ed0f6d566c07fe1896db28ff..60d92bbb676fb34301dcc1a9ba80a99eca2cbf9c 100644
--- a/pallets/identity/src/types.rs
+++ b/pallets/identity/src/types.rs
@@ -17,55 +17,58 @@
 //! Various basic types for use in the identity pallet.
 
 use codec::{Decode, Encode};
-use core::primitive::str;
 use frame_support::pallet_prelude::*;
-use scale_info::TypeInfo;
+use scale_info::{prelude::vec::Vec, TypeInfo};
 use serde::{Deserialize, Serialize};
-use sp_std::vec::Vec;
 
-/// internal events related to identity
+/// Internal events related to identity.
 pub enum IdtyEvent<T: crate::Config> {
-    /// IdtyEvent::Created
-    /// creation of a new identity by an other
+    /// Creation of a new identity by another.
     // pallet account links account to identity
     // pallet wot adds certification
     // pallet quota adds storage item for this identity
     Created {
+        /// Identity of the creator.
         creator: T::IdtyIndex,
+        /// Account of the identity owner.
         owner_key: T::AccountId,
     },
-    /// IdtyEvent::Removed
-    /// removing an identity (unvalidated or revoked)
+    /// Removing an identity (unvalidated or revoked).
     // pallet wot removes associated certifications if status is not revoked
     // pallet quota removes associated quota
     // pallet smith-members exclude smith
-    Removed { status: IdtyStatus },
+    Removed {
+        /// Status of the identity.
+        status: IdtyStatus,
+    },
     // TODO add a way to unlink accounts corresponding to revoked or removed identities
 }
 
+/// Reasons for revocation.
 #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)]
 pub enum RevocationReason {
-    /// revoked by root (e.g. governance or migration)
+    /// Revoked by root (e.g., governance or migration).
     Root,
-    /// revoked by user action (revocation document)
+    /// Revoked by user action (revocation document).
     User,
-    /// revoked due to inactive period
+    /// Revoked due to inactive period.
     Expired,
 }
 
+/// Reasons for removal.
 #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)]
 pub enum RemovalReason {
-    /// removed by root
+    /// Removed by root.
     Root,
-    /// removed because unconfirmed
+    /// Removed because unconfirmed.
     Unconfirmed,
-    /// removed because unvalidated
+    /// Removed because unvalidated.
     Unvalidated,
-    /// removed automatically after revocation buffer
+    /// Removed automatically after revocation buffer.
     Revoked,
 }
 
-/// name of the identity, ascii encoded
+/// Represents the name of an identity, ASCII encoded.
 #[derive(
     Encode,
     Decode,
@@ -88,8 +91,7 @@ impl From<&str> for IdtyName {
     }
 }
 
-/// status of the identity
-// this is a kind of index to tell the state of the identity
+/// State of an identity.
 #[derive(
     Encode,
     Decode,
@@ -104,56 +106,60 @@ impl From<&str> for IdtyName {
     Serialize,
 )]
 pub enum IdtyStatus {
-    /// created through a first certification but unconfirmed
+    /// Created through a first certification but unconfirmed.
     #[default]
     Unconfirmed,
-    /// confirmed by key owner with a name published but unvalidated
+    /// Confirmed by key owner with a name published but unvalidated.
     Unvalidated,
-    /// member of the main web of trust
+    /// Member of the main web of trust.
     // (there must be a membership in membership pallet storage)
     Member,
-    /// not member of the main web of trust, auto-revocation planned
+    /// Not a member of the main web of trust, auto-revocation planned.
     NotMember,
-    /// revoked manually or automatically, deletion possible
+    /// Revoked manually or automatically, deletion possible.
     Revoked,
 }
 
-/// identity value (as in key/value)
+/// Identity value structure.
+///
+/// Represents the value associated with an identity, akin to key/value pairs.
 #[derive(Serialize, Deserialize, Debug, Encode, Decode, Clone, PartialEq, Eq, TypeInfo)]
 pub struct IdtyValue<BlockNumber, AccountId, IdtyData> {
-    /// data shared between pallets defined by runtime
-    /// only contains first_eligible_ud in our case
+    /// Data shared between pallets defined by runtime.
+    /// Only contains `first_eligible_ud` in our case.
     pub data: IdtyData,
-    /// block before which creating a new identity is not allowed
+    /// Block before which creating a new identity is not allowed.
     pub next_creatable_identity_on: BlockNumber,
-    /// previous owner key of this identity (optional)
+    /// Previous owner key of this identity (optional).
     pub old_owner_key: Option<(AccountId, BlockNumber)>,
-    /// current owner key of this identity
+    /// Current owner key of this identity.
     pub owner_key: AccountId,
-    /// next action scheduled on identity
-    // 0 if no action scheduled
+    /// Next action scheduled on identity.
+    ///
+    /// `0` if no action is scheduled.
     pub next_scheduled: BlockNumber,
-    /// current status of the identity (until validation)
+    /// Current status of the identity (until validation).
     pub status: IdtyStatus,
 }
 
-/// payload to define a new owner key
+/// Reprensent the payload to define a new owner key.
 #[derive(Clone, Copy, Encode, RuntimeDebug)]
 pub struct IdtyIndexAccountIdPayload<'a, AccountId, IdtyIndex, Hash> {
-    /// hash of the genesis block
-    // Avoid replay attack across networks
+    /// Hash of the genesis block.
+    // Used to avoid replay attacks across networks.
     pub genesis_hash: &'a Hash,
-    /// identity index
+    /// Identity index.
     pub idty_index: IdtyIndex,
-    /// old owner key of the identity
+    /// Old owner key of the identity.
     pub old_owner_key: &'a AccountId,
 }
 
+/// Represents the payload for identity revocation.
 #[derive(Clone, Copy, Encode, Decode, PartialEq, Eq, TypeInfo, RuntimeDebug)]
 pub struct RevocationPayload<IdtyIndex, Hash> {
-    /// hash of the genesis block
-    // Avoid replay attack across networks
+    /// Hash of the genesis block.
+    // Used to avoid replay attacks across networks.
     pub genesis_hash: Hash,
-    /// identity index
+    /// Identity index.
     pub idty_index: IdtyIndex,
 }
diff --git a/pallets/identity/src/weights.rs b/pallets/identity/src/weights.rs
index 879cbe3f40d0816d10ce88cb99d309200dbdf34f..61d15aba77a28c887301ec22b8c7863c24dedc58 100644
--- a/pallets/identity/src/weights.rs
+++ b/pallets/identity/src/weights.rs
@@ -30,10 +30,12 @@ pub trait WeightInfo {
     fn do_revoke_identity_noop() -> Weight;
     fn do_revoke_identity() -> Weight;
     fn do_remove_identity_noop() -> Weight;
+    fn do_remove_identity_handler() -> Weight;
     fn do_remove_identity() -> Weight;
     fn prune_identities_noop() -> Weight;
     fn prune_identities_none() -> Weight;
     fn prune_identities_err() -> Weight;
+    fn membership_removed() -> Weight;
 }
 
 // Insecure weights implementation, use it for tests only!
@@ -155,6 +157,16 @@ impl WeightInfo for () {
             .saturating_add(RocksDbWeight::get().reads(1))
     }
 
+    fn do_remove_identity_handler() -> Weight {
+        // Proof Size summary in bytes:
+        //  Measured:  `269`
+        //  Estimated: `3734`
+        // Minimum execution time: 104_296_000 picoseconds.
+        Weight::from_parts(115_316_000, 0)
+            .saturating_add(Weight::from_parts(0, 3734))
+            .saturating_add(RocksDbWeight::get().reads(1))
+    }
+
     fn do_remove_identity() -> Weight {
         // Proof Size summary in bytes:
         //  Measured:  `1432`
@@ -197,4 +209,15 @@ impl WeightInfo for () {
             .saturating_add(RocksDbWeight::get().reads(8))
             .saturating_add(RocksDbWeight::get().writes(8))
     }
+
+    fn membership_removed() -> Weight {
+        // Proof Size summary in bytes:
+        //  Measured:  `1177`
+        //  Estimated: `4642`
+        // Minimum execution time: 1_427_848_000 picoseconds.
+        Weight::from_parts(2_637_229_000, 0)
+            .saturating_add(Weight::from_parts(0, 4642))
+            .saturating_add(RocksDbWeight::get().reads(8))
+            .saturating_add(RocksDbWeight::get().writes(8))
+    }
 }
diff --git a/pallets/membership/Cargo.toml b/pallets/membership/Cargo.toml
index e33045ca98b3f71de1a1c0149e17eb3be9c215d3..f5cfa34a179623869b7f5c6a721af1fa95c28e97 100644
--- a/pallets/membership/Cargo.toml
+++ b/pallets/membership/Cargo.toml
@@ -5,7 +5,6 @@ edition.workspace = true
 homepage.workspace = true
 license.workspace = true
 name = "pallet-membership"
-readme = "README.md"
 repository.workspace = true
 version.workspace = true
 
@@ -27,7 +26,6 @@ std = [
 	"sp-io/std",
 	"sp-membership/std",
 	"sp-runtime/std",
-	"sp-std/std",
 ]
 try-runtime = [
 	"frame-support/try-runtime",
@@ -40,6 +38,7 @@ try-runtime = [
 targets = ["x86_64-unknown-linux-gnu"]
 
 [dependencies]
+duniter-primitives = { workspace = true }
 codec = { workspace = true, features = ["derive"] }
 frame-benchmarking = { workspace = true, optional = true }
 frame-support = { workspace = true }
@@ -49,8 +48,7 @@ sp-core = { workspace = true }
 sp-io = { workspace = true }
 sp-membership = { workspace = true }
 sp-runtime = { workspace = true }
-sp-std = { workspace = true }
 
 [dev-dependencies]
-maplit = { workspace = true }
-sp-io = { workspace = true }
+maplit = { workspace = true, default-features = true }
+sp-io = { workspace = true, default-features = true }
diff --git a/pallets/membership/README.md b/pallets/membership/README.md
deleted file mode 100644
index c6dc0da834a30d0766609fc20773da17e1fd3136..0000000000000000000000000000000000000000
--- a/pallets/membership/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Duniter membership pallet
-
-Duniter membership is related to duniter Web of Trust and more specific than [parity membership pallet](https://github.com/paritytech/substrate/tree/master/frame/membership). It is used only internally by the identity, WoT, and distance pallets.
-
-## Main Web of Trust
-
-Membership pallet manages all events related to web of trust membership of an identity. It exposes no calls to the user and its features are only available trough distance evaluation provided by distance oracle.
diff --git a/pallets/membership/src/lib.rs b/pallets/membership/src/lib.rs
index d1fb52e3598a9797020ef063cf4449eeaa44eb49..0a096b0a309bbcd093bf5caaac3c3ddfa82e7987 100644
--- a/pallets/membership/src/lib.rs
+++ b/pallets/membership/src/lib.rs
@@ -14,6 +14,14 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
+//! # Duniter Membership Pallet
+//!
+//! The Duniter Membership Pallet is closely integrated with the Duniter Web of Trust (WoT) and is tailored specifically for Duniter, in contrast to the [Parity Membership Pallet](https://github.com/paritytech/substrate/tree/master/frame/membership). It operates exclusively within the Duniter ecosystem and is utilized internally by the Identity, Web of Trust, and Distance Pallets.
+//!
+//! ## Main Web of Trust (WoT)
+//!
+//! The Membership Pallet manages all aspects related to the membership of identities within the Duniter Web of Trust. Unlike traditional membership systems, it does not expose any external calls to users. Instead, its functionalities are accessible through distance evaluations provided by the Distance Oracle.
+
 #![cfg_attr(not(feature = "std"), no_std)]
 #![allow(clippy::type_complexity)]
 
@@ -23,7 +31,6 @@ mod mock;
 #[cfg(test)]
 mod tests;
 
-#[cfg(feature = "runtime-benchmarks")]
 mod benchmarking;
 
 pub mod weights;
@@ -31,13 +38,10 @@ pub mod weights;
 pub use pallet::*;
 pub use weights::WeightInfo;
 
-use frame_support::pallet_prelude::Weight;
-use frame_support::pallet_prelude::*;
-use sp_membership::traits::*;
-use sp_membership::MembershipData;
+use frame_support::pallet_prelude::{Weight, *};
+use scale_info::prelude::{collections::BTreeMap, vec::Vec};
+use sp_membership::{traits::*, MembershipData};
 use sp_runtime::traits::Zero;
-use sp_std::collections::btree_map::BTreeMap;
-use sp_std::prelude::*;
 
 #[cfg(feature = "runtime-benchmarks")]
 pub trait SetupBenchmark<IdtyId, AccountId> {
@@ -52,15 +56,16 @@ impl<IdtyId, AccountId> SetupBenchmark<IdtyId, AccountId> for () {
     fn add_cert(_issuer: &IdtyId, _receiver: &IdtyId) {}
 }
 
+/// Represent reasons for the removal of membership.
 #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)]
 pub enum MembershipRemovalReason {
-    // reach end of life
+    /// Indicates membership was removed because it reached the end of its life.
     Expired,
-    // was explicitly revoked
+    /// Indicates membership was explicitly revoked.
     Revoked,
-    // received certs count passed below threshold
+    /// Indicates membership was removed because the received certifications count fell below the threshold.
     NotEnoughCerts,
-    // system reasons (consumers, authority members, or root)
+    /// Indicates membership was removed due to system reasons (e.g., consumers, authority members, or root).
     System,
 }
 
@@ -69,7 +74,6 @@ pub mod pallet {
     use super::*;
     use frame_support::traits::StorageVersion;
     use frame_system::pallet_prelude::*;
-    use sp_runtime::traits::Convert;
 
     /// The current storage version.
     const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);
@@ -83,27 +87,36 @@ pub mod pallet {
 
     #[pallet::config]
     pub trait Config: frame_system::Config {
-        /// Ask the runtime whether the identity can perform membership operations
+        /// Check if the identity can perform membership operations.
         type CheckMembershipOpAllowed: CheckMembershipOpAllowed<Self::IdtyId>;
-        /// Something that identifies an identity
+
+        /// Something that identifies an identity.
         type IdtyId: Copy + MaybeSerializeDeserialize + Parameter + Ord;
-        /// Something that gives the IdtyId of an AccountId
-        type IdtyIdOf: Convert<Self::AccountId, Option<Self::IdtyId>>;
-        /// Something that gives the AccountId of an IdtyId
-        type AccountIdOf: Convert<Self::IdtyId, Option<Self::AccountId>>;
-        /// Maximum life span of a single membership (in number of blocks)
-        // (this could be renamed "validity" or "duration")
+
+        /// Something that gives the IdtyId of an AccountId and reverse.
+        type IdtyAttr: duniter_primitives::Idty<Self::IdtyId, Self::AccountId>;
+
+        /// Maximum lifespan of a single membership (in number of blocks).
         #[pallet::constant]
         type MembershipPeriod: Get<BlockNumberFor<Self>>;
-        /// Minimum delay to wait before renewing membership
-        // i.e. asking for distance evaluation
+
+        /// Minimum delay to wait before renewing membership, i.e., asking for distance evaluation.
         #[pallet::constant]
         type MembershipRenewalPeriod: Get<BlockNumberFor<Self>>;
-        /// On event handler
-        type OnEvent: OnEvent<Self::IdtyId>;
-        /// Because this pallet emits events, it depends on the runtime's definition of an event.
+
+        /// Handler called when a new membership is created or renewed.
+        type OnNewMembership: OnNewMembership<Self::IdtyId>;
+
+        /// Handler called when a membership is revoked or removed.
+        type OnRemoveMembership: OnRemoveMembership<Self::IdtyId>;
+
+        /// The overarching event type.
         type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
+
+        /// Type representing the weight of this pallet.
         type WeightInfo: WeightInfo;
+
+        /// Benchmark setup handler for runtime benchmarks (feature-dependent).
         #[cfg(feature = "runtime-benchmarks")]
         type BenchmarkSetupHandler: SetupBenchmark<Self::IdtyId, Self::AccountId>;
     }
@@ -135,8 +148,7 @@ pub mod pallet {
 
     // STORAGE //
 
-    /// maps identity id to membership data
-    // (expiration block for instance)
+    /// The membership data for each identity.
     #[pallet::storage]
     #[pallet::getter(fn membership)]
     pub type Membership<T: Config> = CountedStorageMap<
@@ -147,7 +159,7 @@ pub mod pallet {
         OptionQuery,
     >;
 
-    /// maps block number to the list of identity id set to expire at this block
+    /// The identities of memberships to expire at a given block.
     #[pallet::storage]
     #[pallet::getter(fn memberships_expire_on)]
     pub type MembershipsExpireOn<T: Config> =
@@ -206,7 +218,7 @@ pub mod pallet {
 
     // INTERNAL FUNCTIONS //
     impl<T: Config> Pallet<T> {
-        /// unschedule membership expiry
+        /// Unschedules membership expiry.
         fn unschedule_membership_expiry(idty_id: T::IdtyId, block_number: BlockNumberFor<T>) {
             let mut scheduled = MembershipsExpireOn::<T>::get(block_number);
 
@@ -216,7 +228,7 @@ pub mod pallet {
             }
         }
 
-        /// schedule membership expiry
+        /// Insert membership and schedule its expiry.
         fn insert_membership_and_schedule_expiry(idty_id: T::IdtyId) -> BlockNumberFor<T> {
             let block_number = frame_system::pallet::Pallet::<T>::block_number();
             let expire_on = block_number + T::MembershipPeriod::get();
@@ -226,7 +238,7 @@ pub mod pallet {
             expire_on
         }
 
-        /// check that membership can be claimed
+        /// Check if membership can be claimed.
         pub fn check_add_membership(idty_id: T::IdtyId) -> Result<(), DispatchError> {
             // no-op is error
             ensure!(
@@ -234,12 +246,12 @@ pub mod pallet {
                 Error::<T>::AlreadyMember
             );
 
-            // enough certifications and distance rule for example
+            // check status and enough certifications
             T::CheckMembershipOpAllowed::check_add_membership(idty_id)?;
             Ok(())
         }
 
-        /// check that membership can be renewed
+        /// Check if membership renewal is allowed.
         pub fn check_renew_membership(
             idty_id: T::IdtyId,
         ) -> Result<MembershipData<BlockNumberFor<T>>, DispatchError> {
@@ -251,31 +263,31 @@ pub mod pallet {
             Ok(membership_data)
         }
 
-        /// try claim membership
+        /// Attempt to add membership.
         pub fn try_add_membership(idty_id: T::IdtyId) -> Result<(), DispatchError> {
             Self::check_add_membership(idty_id)?;
             Self::do_add_membership(idty_id);
             Ok(())
         }
 
-        /// try renew membership
+        /// Attempt to renew membership.
         pub fn try_renew_membership(idty_id: T::IdtyId) -> Result<(), DispatchError> {
             let membership_data = Self::check_renew_membership(idty_id)?;
             Self::do_renew_membership(idty_id, membership_data);
             Ok(())
         }
 
-        /// perform membership addition
+        /// Perform membership addition.
         fn do_add_membership(idty_id: T::IdtyId) {
             let expire_on = Self::insert_membership_and_schedule_expiry(idty_id);
             Self::deposit_event(Event::MembershipAdded {
                 member: idty_id,
                 expire_on,
             });
-            T::OnEvent::on_event(&sp_membership::Event::MembershipAdded(idty_id));
+            T::OnNewMembership::on_created(&idty_id);
         }
 
-        /// perform membership renewal
+        /// Perform membership renewal.
         fn do_renew_membership(
             idty_id: T::IdtyId,
             membership_data: MembershipData<BlockNumberFor<T>>,
@@ -286,22 +298,24 @@ pub mod pallet {
                 member: idty_id,
                 expire_on,
             });
-            T::OnEvent::on_event(&sp_membership::Event::MembershipRenewed(idty_id));
+            T::OnNewMembership::on_renewed(&idty_id);
         }
 
-        /// perform membership removal
-        pub fn do_remove_membership(idty_id: T::IdtyId, reason: MembershipRemovalReason) {
+        /// Perform membership removal.
+        pub fn do_remove_membership(idty_id: T::IdtyId, reason: MembershipRemovalReason) -> Weight {
+            let mut weight = T::DbWeight::get().reads_writes(2, 3);
             if let Some(membership_data) = Membership::<T>::take(idty_id) {
                 Self::unschedule_membership_expiry(idty_id, membership_data.expire_on);
                 Self::deposit_event(Event::MembershipRemoved {
                     member: idty_id,
                     reason,
                 });
-                T::OnEvent::on_event(&sp_membership::Event::MembershipRemoved(idty_id));
+                weight += T::OnRemoveMembership::on_removed(&idty_id);
             }
+            weight
         }
 
-        /// perform the membership expiry scheduled at given block
+        /// Perform membership expiry scheduled at the given block number.
         pub fn expire_memberships(block_number: BlockNumberFor<T>) -> Weight {
             let mut expired_idty_count = 0u32;
 
@@ -313,7 +327,7 @@ pub mod pallet {
             T::WeightInfo::expire_memberships(expired_idty_count)
         }
 
-        /// check if identity is member
+        /// Check if an identity is a member.
         pub fn is_member(idty_id: &T::IdtyId) -> bool {
             Membership::<T>::contains_key(idty_id)
         }
diff --git a/pallets/membership/src/mock.rs b/pallets/membership/src/mock.rs
index 27070cd5ff7199212632dfebdfd7e537bdeab161..6269ed615639f46c57dde4fd3dc6e882d67eade1 100644
--- a/pallets/membership/src/mock.rs
+++ b/pallets/membership/src/mock.rs
@@ -22,7 +22,7 @@ use frame_support::{
 use frame_system as system;
 use sp_core::H256;
 use sp_runtime::{
-    traits::{BlakeTwo256, ConvertInto, IdentityLookup},
+    traits::{BlakeTwo256, IdentityLookup},
     BuildStorage,
 };
 
@@ -57,16 +57,21 @@ impl system::Config for Test {
     type Hashing = BlakeTwo256;
     type Lookup = IdentityLookup<Self::AccountId>;
     type MaxConsumers = frame_support::traits::ConstU32<16>;
+    type MultiBlockMigrator = ();
     type Nonce = u64;
     type OnKilledAccount = ();
     type OnNewAccount = ();
     type OnSetCode = ();
     type PalletInfo = PalletInfo;
+    type PostInherents = ();
+    type PostTransactions = ();
+    type PreInherents = ();
     type RuntimeCall = RuntimeCall;
     type RuntimeEvent = RuntimeEvent;
     type RuntimeOrigin = RuntimeOrigin;
     type RuntimeTask = ();
     type SS58Prefix = SS58Prefix;
+    type SingleBlockMigrations = ();
     type SystemWeightInfo = ();
     type Version = ();
 }
@@ -77,15 +82,15 @@ parameter_types! {
 }
 
 impl pallet_membership::Config for Test {
-    type AccountIdOf = ConvertInto;
     #[cfg(feature = "runtime-benchmarks")]
     type BenchmarkSetupHandler = ();
     type CheckMembershipOpAllowed = ();
+    type IdtyAttr = ();
     type IdtyId = IdtyId;
-    type IdtyIdOf = ConvertInto;
     type MembershipPeriod = MembershipPeriod;
     type MembershipRenewalPeriod = MembershipRenewalPeriod;
-    type OnEvent = ();
+    type OnNewMembership = ();
+    type OnRemoveMembership = ();
     type RuntimeEvent = RuntimeEvent;
     type WeightInfo = ();
 }
diff --git a/pallets/membership/src/tests.rs b/pallets/membership/src/tests.rs
index 4f22c32135af2cd04f215261307b0ad5278dfba2..c9b04c0a272eefad5b15774e1a145e3b63975681 100644
--- a/pallets/membership/src/tests.rs
+++ b/pallets/membership/src/tests.rs
@@ -14,13 +14,10 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-use crate::mock::*;
-use crate::MembershipRemovalReason;
-use crate::{Error, Event};
+use crate::{mock::*, Error, Event, MembershipRemovalReason};
 use frame_support::{assert_noop, assert_ok};
 use maplit::btreemap;
-use sp_membership::traits::*;
-use sp_membership::MembershipData;
+use sp_membership::{traits::*, MembershipData};
 
 fn default_gen_conf() -> MembershipConfig {
     MembershipConfig {
diff --git a/pallets/offences/Cargo.toml b/pallets/offences/Cargo.toml
index ccc57523e523a7dd5c60aed1d4b82e2415483c77..5c8f387124e44acbc396cffcc8da3b3ac416618e 100644
--- a/pallets/offences/Cargo.toml
+++ b/pallets/offences/Cargo.toml
@@ -6,7 +6,6 @@ edition.workspace = true
 homepage.workspace = true
 license.workspace = true
 repository.workspace = true
-readme = "README.md"
 version.workspace = true
 
 [package.metadata.docs.rs]
@@ -20,11 +19,6 @@ frame-support = { workspace = true }
 frame-system = { workspace = true }
 sp-runtime = { workspace = true }
 sp-staking = { workspace = true }
-sp-std = { workspace = true }
-
-[dev-dependencies]
-sp-core = { workspace = true }
-sp-io = { workspace = true }
 
 [features]
 default = ["std"]
@@ -38,7 +32,6 @@ std = [
 	"sp-io/std",
 	"sp-runtime/std",
 	"sp-staking/std",
-	"sp-std/std",
 ]
 runtime-benchmarks = [
 	"frame-support/runtime-benchmarks",
@@ -51,3 +44,7 @@ try-runtime = [
 	"frame-system/try-runtime",
 	"sp-runtime/try-runtime",
 ]
+
+[dev-dependencies]
+sp-core = { workspace = true, default-features = true }
+sp-io = { workspace = true, default-features = true }
diff --git a/pallets/offences/README.md b/pallets/offences/README.md
deleted file mode 100644
index 62fa734c335500b442f440ab9100beed1ebeab68..0000000000000000000000000000000000000000
--- a/pallets/offences/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Duniter offences pallet
-
-This is a fork of the Substrate `offences` pallet that is modified to agree with the offence rules based on the `authority-member` pallet and not in the Substrate `staking` pallet.
-
-Duniter provides a basic way to process offences:
-* On offences from `im-online` pallet, the offender disconnection is required.
-* On other offences, the offender disconnection is required and the offender is required to be blacklisted and only an authorized origin can remove the offender from the blacklist.
-
-The offences triage is realized in the `offences` pallet and the slashing execution is done in the `authority-member` pallet.
\ No newline at end of file
diff --git a/pallets/offences/src/lib.rs b/pallets/offences/src/lib.rs
index f6b30289d9ad283633cb4636a9df800abe748649..8b2d32cc4ef802160ec069dfcfe4a8a182248d2b 100644
--- a/pallets/offences/src/lib.rs
+++ b/pallets/offences/src/lib.rs
@@ -14,6 +14,25 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
+//! # Duniter Offences Pallet
+//!
+//! This pallet is a fork of the Substrate `offences` pallet, customized to align with the offence rules specified by the `authority-member` pallet rather than the Substrate `staking` pallet.
+//!
+//! ## Offences Processing
+//!
+//! The Duniter Offences Pallet manages various types of offences as follows:
+//!
+//! - **`im-online` Pallet Offences**: Offences from the `im-online` pallet necessitate disconnection of the offender.
+//!
+//! - **Other Offences**: For all other offences, the pallet enforces:
+//!   - Disconnection of the offender.
+//!   - Addition of the offender to a blacklist.
+//!   - Authorization from a designated origin to remove offenders from the blacklist.
+//!
+//! ## Offences Triage and Slashing Execution
+//!
+//! This pallet handles the triage of offences, categorizing them based on predefined rules. The actual execution of slashing and other punitive measures is delegated to the `authority-member` pallet.
+
 #![cfg_attr(not(feature = "std"), no_std)]
 
 #[cfg(test)]
@@ -26,9 +45,9 @@ use core::marker::PhantomData;
 
 use codec::Encode;
 use frame_support::weights::Weight;
+use scale_info::prelude::vec::Vec;
 use sp_runtime::traits::Hash;
 use sp_staking::offence::{Kind, Offence, OffenceDetails, OffenceError, ReportOffence};
-use sp_std::prelude::*;
 
 pub use pallet::*;
 
@@ -63,8 +82,10 @@ pub mod pallet {
     pub trait Config: frame_system::Config {
         /// The overarching event type.
         type RuntimeEvent: From<Event> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
+
         /// Full identification of the validator.
         type IdentificationTuple: Parameter;
+
         /// A handler called for every offence report.
         type OnOffenceHandler: OnOffenceHandler<Self::AccountId, Self::IdentificationTuple, Weight>;
     }
diff --git a/pallets/offences/src/mock.rs b/pallets/offences/src/mock.rs
index 11b2b4109bf36dbc31dca713ee06fe3ba95bccbd..49611fb08cf700cc869405c661efd08c23547321 100644
--- a/pallets/offences/src/mock.rs
+++ b/pallets/offences/src/mock.rs
@@ -14,10 +14,7 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-#![cfg(test)]
-
-use crate::Config;
-use crate::{self as pallet_offences, SlashStrategy};
+use crate::{self as pallet_offences, Config, SlashStrategy};
 use codec::Encode;
 use frame_support::{
     parameter_types,
@@ -25,10 +22,9 @@ use frame_support::{
     weights::{constants::RocksDbWeight, Weight},
 };
 use sp_core::H256;
-use sp_runtime::BuildStorage;
 use sp_runtime::{
     traits::{BlakeTwo256, IdentityLookup},
-    Perbill,
+    BuildStorage, Perbill,
 };
 use sp_staking::{
     offence::{Kind, OffenceDetails},
@@ -76,16 +72,21 @@ impl frame_system::Config for Runtime {
     type Hashing = BlakeTwo256;
     type Lookup = IdentityLookup<Self::AccountId>;
     type MaxConsumers = ConstU32<16>;
+    type MultiBlockMigrator = ();
     type Nonce = u64;
     type OnKilledAccount = ();
     type OnNewAccount = ();
     type OnSetCode = ();
     type PalletInfo = PalletInfo;
+    type PostInherents = ();
+    type PostTransactions = ();
+    type PreInherents = ();
     type RuntimeCall = RuntimeCall;
     type RuntimeEvent = RuntimeEvent;
     type RuntimeOrigin = RuntimeOrigin;
     type RuntimeTask = ();
     type SS58Prefix = ();
+    type SingleBlockMigrations = ();
     type SystemWeightInfo = ();
     type Version = ();
 }
diff --git a/pallets/offences/src/tests.rs b/pallets/offences/src/tests.rs
index 1b5fefff81ad4f38b1283519400566474f5ae4f3..cf7fc9fc2a00ef873816f67f55daa1e1d6529f8b 100644
--- a/pallets/offences/src/tests.rs
+++ b/pallets/offences/src/tests.rs
@@ -14,8 +14,6 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-#![cfg(test)]
-
 use super::*;
 use crate::mock::{new_test_ext, offence_reports, Offence, Offences, RuntimeEvent, System, KIND};
 use frame_system::{EventRecord, Phase};
diff --git a/pallets/offences/src/traits.rs b/pallets/offences/src/traits.rs
index 69dfe649d87f4a6d88d38f530321cb064dbb48cb..cbc203ff4f863d9cb34e4c388c79f6373c2f56b4 100644
--- a/pallets/offences/src/traits.rs
+++ b/pallets/offences/src/traits.rs
@@ -18,8 +18,9 @@ use sp_staking::{offence::OffenceDetails, SessionIndex};
 
 use crate::SlashStrategy;
 
+/// Trait for handling offences.
 pub trait OnOffenceHandler<Reporter, Offender, Res> {
-    // Required method
+    /// Handle an offence committed by one or more offenders.
     fn on_offence(
         offenders: &[OffenceDetails<Reporter, Offender>],
         slash_strategy: SlashStrategy,
diff --git a/pallets/oneshot-account/Cargo.toml b/pallets/oneshot-account/Cargo.toml
index d019ccef62160a32576c5be677050be6254143af..b0e9dda3671e62905ecd063ef737684daa3985f1 100644
--- a/pallets/oneshot-account/Cargo.toml
+++ b/pallets/oneshot-account/Cargo.toml
@@ -5,7 +5,6 @@ edition.workspace = true
 homepage.workspace = true
 license.workspace = true
 name = "pallet-oneshot-account"
-readme = "README.md"
 repository.workspace = true
 version.workspace = true
 
@@ -38,7 +37,6 @@ std = [
 	"sp-core/std",
 	"sp-io/std",
 	"sp-runtime/std",
-	"sp-std/std",
 ]
 
 [package.metadata.docs.rs]
@@ -57,7 +55,6 @@ scale-info = { workspace = true, features = ["derive"] }
 sp-core = { workspace = true }
 sp-io = { workspace = true }
 sp-runtime = { workspace = true }
-sp-std = { workspace = true }
 
 [dev-dependencies]
-pallet-balances = { workspace = true }
+pallet-balances = { workspace = true, default-features = true }
diff --git a/pallets/oneshot-account/README.md b/pallets/oneshot-account/README.md
deleted file mode 100644
index 7d3f030eabb1384ae07203d6577dae0bde54b5fa..0000000000000000000000000000000000000000
--- a/pallets/oneshot-account/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Duniter oneshot account pallet
-
-Duniter provides light accounts without `AccountInfo` (nonce, consumers, providers, sufficients, free, reserved, misc_frozen, fee_frozen) that can only be consumed once. This should reduce transaction weight and then fees. The use case is anonymous accounts or physical supports.
\ No newline at end of file
diff --git a/pallets/oneshot-account/src/benchmarking.rs b/pallets/oneshot-account/src/benchmarking.rs
index cf79d049413a018a17f12aa4561b09d383988259..1a936058713b0c0e98dd5bf780a2ff0cd81937ef 100644
--- a/pallets/oneshot-account/src/benchmarking.rs
+++ b/pallets/oneshot-account/src/benchmarking.rs
@@ -15,23 +15,24 @@
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
 #![cfg(feature = "runtime-benchmarks")]
+#![allow(clippy::multiple_bound_locations)]
 
 use super::*;
 
-use frame_benchmarking::v2::*;
-use frame_benchmarking::{account, whitelisted_caller};
-use frame_support::pallet_prelude::IsType;
-use frame_support::traits::Get;
+use frame_benchmarking::{account, v2::*, whitelisted_caller};
+use frame_support::{pallet_prelude::IsType, traits::fungible::Mutate};
 use frame_system::RawOrigin;
 use pallet_balances::Pallet as Balances;
 
 use crate::Pallet;
 
+type BalanceOf<T> = <<T as Config>::Currency as fungible::Inspect<AccountIdOf<T>>>::Balance;
+
 #[benchmarks(
         where
         T: pallet_balances::Config,
         T::Balance: From<u64>,
-        <T::Currency as Currency<T::AccountId>>::Balance: IsType<T::Balance>+From<T::Balance>
+        BalanceOf<T>: IsType<T::Balance>+From<T::Balance>
 )]
 mod benchmarks {
     use super::*;
@@ -41,7 +42,10 @@ mod benchmarks {
         let existential_deposit = T::ExistentialDeposit::get();
         let caller = whitelisted_caller();
         let balance = existential_deposit.saturating_mul((2).into());
-        let _ = T::Currency::make_free_balance_be(&caller, balance.into());
+        let _ = <<T as pallet::Config>::Currency as Mutate<T::AccountId>>::set_balance(
+            &caller,
+            balance.into(),
+        );
         let recipient: T::AccountId = account("recipient", 0, 1);
         let recipient_lookup: <T::Lookup as StaticLookup>::Source =
             T::Lookup::unlookup(recipient.clone());
@@ -66,16 +70,16 @@ mod benchmarks {
         let existential_deposit = T::ExistentialDeposit::get();
         let caller: T::AccountId = whitelisted_caller();
         let balance = existential_deposit.saturating_mul((2).into());
-        OneshotAccounts::<T>::insert(
-            caller.clone(),
-            Into::<<T::Currency as Currency<T::AccountId>>::Balance>::into(balance),
-        );
+        OneshotAccounts::<T>::insert(caller.clone(), Into::<BalanceOf<T>>::into(balance));
         // Deposit into a normal account is more expensive than into a oneshot account
         // so we create the recipient account with an existential deposit.
         let recipient: T::AccountId = account("recipient", 0, 1);
         let recipient_lookup: <T::Lookup as StaticLookup>::Source =
             T::Lookup::unlookup(recipient.clone());
-        let _ = T::Currency::make_free_balance_be(&recipient, existential_deposit.into());
+        let _ = <<T as pallet::Config>::Currency as Mutate<T::AccountId>>::set_balance(
+            &recipient,
+            existential_deposit.into(),
+        );
 
         #[extrinsic_call]
         _(
@@ -96,20 +100,23 @@ mod benchmarks {
         let existential_deposit = T::ExistentialDeposit::get();
         let caller: T::AccountId = whitelisted_caller();
         let balance = existential_deposit.saturating_mul((2).into());
-        OneshotAccounts::<T>::insert(
-            caller.clone(),
-            Into::<<T::Currency as Currency<T::AccountId>>::Balance>::into(balance),
-        );
+        OneshotAccounts::<T>::insert(caller.clone(), Into::<BalanceOf<T>>::into(balance));
         // Deposit into a normal account is more expensive than into a oneshot account
         // so we create the recipient accounts with an existential deposits.
         let recipient1: T::AccountId = account("recipient1", 0, 1);
         let recipient1_lookup: <T::Lookup as StaticLookup>::Source =
             T::Lookup::unlookup(recipient1.clone());
-        let _ = T::Currency::make_free_balance_be(&recipient1, existential_deposit.into());
+        let _ = <<T as pallet::Config>::Currency as Mutate<T::AccountId>>::set_balance(
+            &recipient1,
+            existential_deposit.into(),
+        );
         let recipient2: T::AccountId = account("recipient2", 1, 1);
         let recipient2_lookup: <T::Lookup as StaticLookup>::Source =
             T::Lookup::unlookup(recipient2.clone());
-        let _ = T::Currency::make_free_balance_be(&recipient2, existential_deposit.into());
+        let _ = <<T as pallet::Config>::Currency as Mutate<T::AccountId>>::set_balance(
+            &recipient2,
+            existential_deposit.into(),
+        );
 
         #[extrinsic_call]
         _(
diff --git a/pallets/oneshot-account/src/check_nonce.rs b/pallets/oneshot-account/src/check_nonce.rs
index 83bd7494fe4c7ce9408d163b904352bcc104873e..3d792e53b130a94d77800ad806b6d6fa2dc35e77 100644
--- a/pallets/oneshot-account/src/check_nonce.rs
+++ b/pallets/oneshot-account/src/check_nonce.rs
@@ -17,15 +17,18 @@
 use crate::Config;
 
 use codec::{Decode, Encode};
-use frame_support::dispatch::DispatchInfo;
-use frame_support::traits::IsSubType;
+use frame_support::{dispatch::DispatchInfo, traits::IsSubType};
 //use frame_system::Config;
-use scale_info::TypeInfo;
+use scale_info::{
+    prelude::fmt::{Debug, Formatter},
+    TypeInfo,
+};
 use sp_runtime::{
     traits::{DispatchInfoOf, Dispatchable, SignedExtension},
     transaction_validity::{TransactionValidity, TransactionValidityError},
 };
 
+/// Wrapper around `frame_system::CheckNonce<T>`.
 #[derive(Encode, Decode, Clone, Eq, PartialEq, TypeInfo)]
 #[scale_info(skip_type_params(Runtime))]
 pub struct CheckNonce<T: Config>(pub frame_system::CheckNonce<T>);
@@ -36,14 +39,14 @@ impl<T: Config> From<frame_system::CheckNonce<T>> for CheckNonce<T> {
     }
 }
 
-impl<T: Config> sp_std::fmt::Debug for CheckNonce<T> {
+impl<T: Config> Debug for CheckNonce<T> {
     #[cfg(feature = "std")]
-    fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
+    fn fmt(&self, f: &mut Formatter) -> scale_info::prelude::fmt::Result {
         write!(f, "CheckNonce({})", self.0 .0)
     }
 
     #[cfg(not(feature = "std"))]
-    fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
+    fn fmt(&self, _: &mut Formatter) -> scale_info::prelude::fmt::Result {
         Ok(())
     }
 }
@@ -59,7 +62,7 @@ where
 
     const IDENTIFIER: &'static str = "CheckNonce";
 
-    fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> {
+    fn additional_signed(&self) -> Result<(), TransactionValidityError> {
         self.0.additional_signed()
     }
 
diff --git a/pallets/oneshot-account/src/lib.rs b/pallets/oneshot-account/src/lib.rs
index 637debf4d6ee77bd9aac739bc967ee57048a1d58..42adac55a8fce9bd6cb629c506c2b6424c2d6980 100644
--- a/pallets/oneshot-account/src/lib.rs
+++ b/pallets/oneshot-account/src/lib.rs
@@ -14,6 +14,10 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
+//! # Duniter Oneshot Account Pallet
+//!
+//! Duniter Oneshot Account Pallet introduces lightweight accounts that do not utilize `AccountInfo`, including fields like nonce, consumers, providers, sufficients, free, reserved. These accounts are designed for single-use scenarios, aiming to reduce transaction weight and associated fees. The primary use cases include anonymous transactions and physical support scenarios where lightweight and disposable accounts are beneficial.
+
 #![cfg_attr(not(feature = "std"), no_std)]
 
 mod benchmarking;
@@ -28,14 +32,21 @@ pub use pallet::*;
 pub use types::*;
 pub use weights::WeightInfo;
 
-use frame_support::pallet_prelude::*;
-use frame_support::traits::{
-    Currency, ExistenceRequirement, Imbalance, IsSubType, WithdrawReasons,
+use frame_support::{
+    pallet_prelude::*,
+    traits::{
+        fungible,
+        fungible::{Balanced, Credit, Inspect},
+        tokens::{Fortitude, Precision, Preservation},
+        Imbalance, IsSubType,
+    },
 };
 use frame_system::pallet_prelude::*;
 use pallet_transaction_payment::OnChargeTransaction;
 use sp_runtime::traits::{DispatchInfoOf, PostDispatchInfoOf, Saturating, StaticLookup, Zero};
-use sp_std::convert::TryInto;
+
+type AccountIdOf<T> = <T as frame_system::Config>::AccountId;
+type BalanceOf<T> = <<T as Config>::Currency as fungible::Inspect<AccountIdOf<T>>>::Balance;
 
 #[frame_support::pallet]
 pub mod pallet {
@@ -49,24 +60,26 @@ pub mod pallet {
 
     #[pallet::config]
     pub trait Config: frame_system::Config + pallet_transaction_payment::Config {
-        type Currency: Currency<Self::AccountId>;
+        /// The currency type.
+        type Currency: fungible::Balanced<Self::AccountId> + fungible::Mutate<Self::AccountId>;
+
+        /// A handler for charging transactions.
         type InnerOnChargeTransaction: OnChargeTransaction<Self>;
+
+        /// The overarching event type.
         type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
-        /// Type representing the weight of this pallet
+
+        /// Type representing the weight of this pallet.
         type WeightInfo: WeightInfo;
     }
 
     // STORAGE //
 
+    /// The balance for each oneshot account.
     #[pallet::storage]
     #[pallet::getter(fn oneshot_account)]
-    pub type OneshotAccounts<T: Config> = StorageMap<
-        _,
-        Blake2_128Concat,
-        T::AccountId,
-        <T::Currency as Currency<T::AccountId>>::Balance,
-        OptionQuery,
-    >;
+    pub type OneshotAccounts<T: Config> =
+        StorageMap<_, Blake2_128Concat, T::AccountId, BalanceOf<T>, OptionQuery>;
 
     // EVENTS //
 
@@ -77,25 +90,19 @@ pub mod pallet {
         /// A oneshot account was created.
         OneshotAccountCreated {
             account: T::AccountId,
-            balance: <T::Currency as Currency<T::AccountId>>::Balance,
+            balance: BalanceOf<T>,
             creator: T::AccountId,
         },
         /// A oneshot account was consumed.
         OneshotAccountConsumed {
             account: T::AccountId,
-            dest1: (
-                T::AccountId,
-                <T::Currency as Currency<T::AccountId>>::Balance,
-            ),
-            dest2: Option<(
-                T::AccountId,
-                <T::Currency as Currency<T::AccountId>>::Balance,
-            )>,
+            dest1: (T::AccountId, BalanceOf<T>),
+            dest2: Option<(T::AccountId, BalanceOf<T>)>,
         },
         /// A withdrawal was executed on a oneshot account.
         Withdraw {
             account: T::AccountId,
-            balance: <T::Currency as Currency<T::AccountId>>::Balance,
+            balance: BalanceOf<T>,
         },
     }
 
@@ -133,13 +140,13 @@ pub mod pallet {
         pub fn create_oneshot_account(
             origin: OriginFor<T>,
             dest: <T::Lookup as StaticLookup>::Source,
-            #[pallet::compact] value: <T::Currency as Currency<T::AccountId>>::Balance,
+            #[pallet::compact] value: BalanceOf<T>,
         ) -> DispatchResult {
             let transactor = ensure_signed(origin)?;
             let dest = T::Lookup::lookup(dest)?;
 
             ensure!(
-                value >= <T::Currency as Currency<T::AccountId>>::minimum_balance(),
+                value >= T::Currency::minimum_balance(),
                 Error::<T>::ExistentialDeposit
             );
             ensure!(
@@ -147,11 +154,12 @@ pub mod pallet {
                 Error::<T>::OneshotAccountAlreadyCreated
             );
 
-            let _ = <T::Currency as Currency<T::AccountId>>::withdraw(
+            let _ = T::Currency::withdraw(
                 &transactor,
                 value,
-                WithdrawReasons::TRANSFER,
-                ExistenceRequirement::KeepAlive,
+                Precision::Exact,
+                Preservation::Preserve,
+                Fortitude::Polite,
             )?;
             OneshotAccounts::<T>::insert(&dest, value);
             Self::deposit_event(Event::OneshotAccountCreated {
@@ -205,9 +213,8 @@ pub mod pallet {
                     balance: value,
                     creator: transactor.clone(),
                 });
-            } else {
-                let _ =
-                    <T::Currency as Currency<T::AccountId>>::deposit_into_existing(&dest, value)?;
+            } else if frame_system::Pallet::<T>::providers(&dest) > 0 {
+                let _ = T::Currency::deposit(&dest, value, Precision::Exact)?;
             }
             OneshotAccounts::<T>::remove(&transactor);
             Self::deposit_event(Event::OneshotAccountConsumed {
@@ -236,7 +243,7 @@ pub mod pallet {
             block_height: BlockNumberFor<T>,
             dest: Account<<T::Lookup as StaticLookup>::Source>,
             remaining_to: Account<<T::Lookup as StaticLookup>::Source>,
-            #[pallet::compact] balance: <T::Currency as Currency<T::AccountId>>::Balance,
+            #[pallet::compact] balance: BalanceOf<T>,
         ) -> DispatchResult {
             let transactor = ensure_signed(origin)?;
 
@@ -271,12 +278,12 @@ pub mod pallet {
                     Error::<T>::OneshotAccountAlreadyCreated
                 );
                 ensure!(
-                    balance1 >= <T::Currency as Currency<T::AccountId>>::minimum_balance(),
+                    balance1 >= T::Currency::minimum_balance(),
                     Error::<T>::ExistentialDeposit
                 );
             } else {
                 ensure!(
-                    !<T::Currency as Currency<T::AccountId>>::free_balance(&dest1).is_zero(),
+                    !T::Currency::balance(&dest1).is_zero(),
                     Error::<T>::DestAccountNotExist
                 );
             }
@@ -286,7 +293,7 @@ pub mod pallet {
                     Error::<T>::OneshotAccountAlreadyCreated
                 );
                 ensure!(
-                    balance2 >= <T::Currency as Currency<T::AccountId>>::minimum_balance(),
+                    balance2 >= T::Currency::minimum_balance(),
                     Error::<T>::ExistentialDeposit
                 );
                 OneshotAccounts::<T>::insert(&dest2, balance2);
@@ -295,10 +302,8 @@ pub mod pallet {
                     balance: balance2,
                     creator: transactor.clone(),
                 });
-            } else {
-                let _ = <T::Currency as Currency<T::AccountId>>::deposit_into_existing(
-                    &dest2, balance2,
-                )?;
+            } else if frame_system::Pallet::<T>::providers(&dest2) > 0 {
+                let _ = T::Currency::deposit(&dest2, balance2, Precision::Exact)?;
             }
             if dest1_is_oneshot {
                 OneshotAccounts::<T>::insert(&dest1, balance1);
@@ -307,10 +312,8 @@ pub mod pallet {
                     balance: balance1,
                     creator: transactor.clone(),
                 });
-            } else {
-                let _ = <T::Currency as Currency<T::AccountId>>::deposit_into_existing(
-                    &dest1, balance1,
-                )?;
+            } else if frame_system::Pallet::<T>::providers(&dest1) > 0 {
+                let _ = T::Currency::deposit(&dest1, balance1, Precision::Exact)?;
             }
             OneshotAccounts::<T>::remove(&transactor);
             Self::deposit_event(Event::OneshotAccountConsumed {
@@ -329,12 +332,12 @@ where
     T::RuntimeCall: IsSubType<Call<T>>,
     T::InnerOnChargeTransaction: OnChargeTransaction<
         T,
-        Balance = <T::Currency as Currency<T::AccountId>>::Balance,
-        LiquidityInfo = Option<<T::Currency as Currency<T::AccountId>>::NegativeImbalance>,
+        Balance = BalanceOf<T>,
+        LiquidityInfo = Option<Credit<T::AccountId, T::Currency>>,
     >,
 {
-    type Balance = <T::Currency as Currency<T::AccountId>>::Balance;
-    type LiquidityInfo = Option<<T::Currency as Currency<T::AccountId>>::NegativeImbalance>;
+    type Balance = BalanceOf<T>;
+    type LiquidityInfo = Option<Credit<T::AccountId, T::Currency>>;
 
     fn withdraw_fee(
         who: &T::AccountId,
@@ -359,10 +362,7 @@ where
                         account: who.clone(),
                         balance: fee,
                     });
-                    // TODO
-                    return Ok(Some(
-                        <T::Currency as Currency<T::AccountId>>::NegativeImbalance::zero(),
-                    ));
+                    return Ok(Some(Imbalance::zero()));
                 }
             }
             Err(TransactionValidityError::Invalid(
diff --git a/pallets/oneshot-account/src/mock.rs b/pallets/oneshot-account/src/mock.rs
index 7e35d0efe45e8841223925ce63d38682028f286d..d742e3343b77c85bf0e3bf445879494d1a200195 100644
--- a/pallets/oneshot-account/src/mock.rs
+++ b/pallets/oneshot-account/src/mock.rs
@@ -17,13 +17,12 @@
 use crate::{self as pallet_oneshot_account};
 use frame_support::{parameter_types, traits::Everything, weights::IdentityFee};
 use frame_system as system;
-use pallet_transaction_payment::CurrencyAdapter;
+use pallet_transaction_payment::FungibleAdapter;
 use sp_core::{ConstU32, H256};
 use sp_runtime::{
     traits::{BlakeTwo256, IdentityLookup},
     BuildStorage,
 };
-use sp_std::convert::{TryFrom, TryInto};
 
 type Balance = u64;
 type Block = frame_system::mocking::MockBlock<Test>;
@@ -57,16 +56,21 @@ impl system::Config for Test {
     type Hashing = BlakeTwo256;
     type Lookup = IdentityLookup<Self::AccountId>;
     type MaxConsumers = frame_support::traits::ConstU32<16>;
+    type MultiBlockMigrator = ();
     type Nonce = u64;
     type OnKilledAccount = ();
     type OnNewAccount = ();
     type OnSetCode = ();
     type PalletInfo = PalletInfo;
+    type PostInherents = ();
+    type PostTransactions = ();
+    type PreInherents = ();
     type RuntimeCall = RuntimeCall;
     type RuntimeEvent = RuntimeEvent;
     type RuntimeOrigin = RuntimeOrigin;
     type RuntimeTask = ();
     type SS58Prefix = SS58Prefix;
+    type SingleBlockMigrations = ();
     type SystemWeightInfo = ();
     type Version = ();
 }
@@ -83,7 +87,6 @@ impl pallet_balances::Config for Test {
     type ExistentialDeposit = ExistentialDeposit;
     type FreezeIdentifier = ();
     type MaxFreezes = ConstU32<0>;
-    type MaxHolds = ConstU32<0>;
     type MaxLocks = MaxLocks;
     type MaxReserves = ();
     type ReserveIdentifier = [u8; 8];
@@ -102,17 +105,11 @@ impl pallet_transaction_payment::Config for Test {
 }
 impl pallet_oneshot_account::Config for Test {
     type Currency = Balances;
-    type InnerOnChargeTransaction = CurrencyAdapter<Balances, HandleFees>;
+    type InnerOnChargeTransaction = FungibleAdapter<Balances, ()>;
     type RuntimeEvent = RuntimeEvent;
     type WeightInfo = ();
 }
 
-pub struct HandleFees;
-type NegativeImbalance = <Balances as frame_support::traits::Currency<u64>>::NegativeImbalance;
-impl frame_support::traits::OnUnbalanced<NegativeImbalance> for HandleFees {
-    fn on_nonzero_unbalanced(_amount: NegativeImbalance) {}
-}
-
 // Build genesis storage according to the mock runtime.
 #[allow(dead_code)]
 pub fn new_test_ext() -> sp_io::TestExternalities {
diff --git a/pallets/oneshot-account/src/types.rs b/pallets/oneshot-account/src/types.rs
index ee8b45bd048920c57868523408a45c0e04dbfe91..f81d051a05cc3388bc204c543a6cf9f7dda51d51 100644
--- a/pallets/oneshot-account/src/types.rs
+++ b/pallets/oneshot-account/src/types.rs
@@ -17,8 +17,11 @@
 use codec::{Decode, Encode};
 use frame_support::pallet_prelude::*;
 
+/// The type of account.
 #[derive(Clone, Decode, Encode, PartialEq, RuntimeDebug, TypeInfo)]
 pub enum Account<AccountId> {
+    /// Normal account type.
     Normal(AccountId),
+    /// Oneshot account type.
     Oneshot(AccountId),
 }
diff --git a/pallets/provide-randomness/Cargo.toml b/pallets/provide-randomness/Cargo.toml
index c16ed1399689885cc69be3f0eabebceb2b1e2be9..a5a104c34583c85e389c35412deedd5b8593e340 100644
--- a/pallets/provide-randomness/Cargo.toml
+++ b/pallets/provide-randomness/Cargo.toml
@@ -33,7 +33,6 @@ std = [
 	"sp-core/std",
 	"sp-io/std",
 	"sp-runtime/std",
-	"sp-std/std",
 ]
 
 [dependencies]
@@ -43,7 +42,6 @@ frame-benchmarking = { workspace = true, optional = true }
 frame-support = { workspace = true }
 frame-system = { workspace = true }
 sp-runtime = { workspace = true }
-sp-std = { workspace = true }
 sp-core = { workspace = true }
 sp-io = { workspace = true }
 pallet-balances = { workspace = true }
diff --git a/pallets/provide-randomness/README.md b/pallets/provide-randomness/README.md
deleted file mode 100644
index 12138fbd60ba21715edbbb1cd42ad7c477d8bbf4..0000000000000000000000000000000000000000
--- a/pallets/provide-randomness/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Duniter provide randomness pallet
-
-TODO
\ No newline at end of file
diff --git a/pallets/provide-randomness/src/benchmarking.rs b/pallets/provide-randomness/src/benchmarking.rs
index 5f0ed8eedfa54ac9ea3905c9191f8df74bf157fc..c0a4a9a557a613b70cdc541b6796b2ae640f2c2b 100644
--- a/pallets/provide-randomness/src/benchmarking.rs
+++ b/pallets/provide-randomness/src/benchmarking.rs
@@ -15,17 +15,18 @@
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
 #![cfg(feature = "runtime-benchmarks")]
+#![allow(clippy::multiple_bound_locations)]
 
 use super::*;
 
-use frame_benchmarking::v2::*;
-use frame_benchmarking::whitelisted_caller;
-use frame_support::ensure;
-use frame_support::pallet_prelude::IsType;
-use frame_support::sp_runtime::{traits::One, Saturating};
-use frame_support::traits::{Currency, Get, OnInitialize};
-use frame_system::pallet_prelude::BlockNumberFor;
-use frame_system::RawOrigin;
+use frame_benchmarking::{v2::*, whitelisted_caller};
+use frame_support::{
+    ensure,
+    pallet_prelude::IsType,
+    sp_runtime::{traits::One, Saturating},
+    traits::{fungible::Mutate, Get, OnInitialize},
+};
+use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin};
 use sp_core::H256;
 
 use crate::Pallet;
@@ -34,7 +35,7 @@ use crate::Pallet;
         where
         T: pallet_balances::Config,
         T::Balance: From<u64>,
-        <T::Currency as Currency<T::AccountId>>::Balance: IsType<T::Balance>,
+        BalanceOf<T>: IsType<T::Balance>,
         BlockNumberFor<T>: From<u32>,
 )]
 mod benchmarks {
@@ -79,7 +80,7 @@ mod benchmarks {
         // Provide deposit
         let existential_deposit = T::ExistentialDeposit::get();
         let balance = existential_deposit.saturating_mul((200).into());
-        let _ = T::Currency::make_free_balance_be(&caller, balance.into());
+        let _ = T::Currency::set_balance(&caller, balance.into());
 
         // Set randomness parameters
         let random = RandomnessType::RandomnessFromOneEpochAgo;
diff --git a/pallets/provide-randomness/src/lib.rs b/pallets/provide-randomness/src/lib.rs
index b6c36c3454f54e2da6e22f1b374d14b0e5a71bee..20dcfa91bd1b8a06a31f1df75c6b2d0499283ad2 100644
--- a/pallets/provide-randomness/src/lib.rs
+++ b/pallets/provide-randomness/src/lib.rs
@@ -14,18 +14,29 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
+//! # Provides Randomness Pallet
+//!
+//! The Provides Randomness Pallet facilitates the generation of randomness within the Duniter blockchain.
+//!
+//! This pallet manages randomness requests and emits events upon requesting and fulfilling randomness.
+
 #![cfg_attr(not(feature = "std"), no_std)]
 #![allow(clippy::boxed_local)]
 
-#[cfg(feature = "runtime-benchmarks")]
 mod benchmarking;
 
 mod types;
 pub mod weights;
 
-use frame_support::pallet_prelude::Weight;
+use frame_support::{
+    pallet_prelude::Weight,
+    traits::{
+        fungible::{self, Balanced, Credit},
+        tokens::{Fortitude, Precision, Preservation},
+    },
+};
+use scale_info::prelude::vec::Vec;
 use sp_core::H256;
-use sp_std::prelude::*;
 
 pub use pallet::*;
 pub use types::*;
@@ -45,18 +56,15 @@ impl OnFilledRandomness for () {
 #[frame_support::pallet]
 pub mod pallet {
     use super::*;
-    use frame_support::pallet_prelude::*;
-    use frame_support::traits::{
-        Currency, ExistenceRequirement, OnUnbalanced, Randomness, StorageVersion, WithdrawReasons,
+    use frame_support::{
+        pallet_prelude::*,
+        traits::{OnUnbalanced, Randomness, StorageVersion},
     };
     use frame_system::pallet_prelude::*;
     use sp_core::H256;
 
-    pub type BalanceOf<T> =
-        <<T as Config>::Currency as Currency<<T as frame_system::Config>::AccountId>>::Balance;
-    pub type NegativeImbalanceOf<T> = <<T as Config>::Currency as Currency<
-        <T as frame_system::Config>::AccountId,
-    >>::NegativeImbalance;
+    type AccountIdOf<T> = <T as frame_system::Config>::AccountId;
+    pub type BalanceOf<T> = <<T as Config>::Currency as fungible::Inspect<AccountIdOf<T>>>::Balance;
 
     /// The current storage version.
     const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);
@@ -69,47 +77,61 @@ pub mod pallet {
     /// Configuration trait.
     #[pallet::config]
     pub trait Config: frame_system::Config<Hash = H256> {
-        // The currency
-        type Currency: Currency<Self::AccountId>;
-        /// Get the current epoch index
+        // The currency type.
+        type Currency: fungible::Balanced<Self::AccountId> + fungible::Mutate<Self::AccountId>;
+
+        /// Type providing the current epoch index.
         type GetCurrentEpochIndex: Get<u64>;
-        /// Maximum number of not yet filled requests
+
+        /// Maximum number of not yet filled requests.
         #[pallet::constant]
         type MaxRequests: Get<u32>;
-        /// The price of a request
+
+        /// The price of a request.
         #[pallet::constant]
         type RequestPrice: Get<BalanceOf<Self>>;
-        /// On filled randomness
+
+        /// Handler called when randomness is filled.
         type OnFilledRandomness: OnFilledRandomness;
-        /// Handler for the unbalanced reduction when the requestor pays fees.
-        type OnUnbalanced: OnUnbalanced<NegativeImbalanceOf<Self>>;
-        /// A safe source of randomness from the parent block
+
+        /// Handler for unbalanced reduction when the requestor pays fees.
+        type OnUnbalanced: OnUnbalanced<Credit<Self::AccountId, Self::Currency>>;
+
+        /// A safe source of randomness from the parent block.
         type ParentBlockRandomness: Randomness<Option<H256>, BlockNumberFor<Self>>;
-        /// A safe source of randomness from one epoch ago
+
+        /// A safe source of randomness from one epoch ago.
         type RandomnessFromOneEpochAgo: Randomness<H256, BlockNumberFor<Self>>;
+
         /// The overarching event type.
         type RuntimeEvent: From<Event> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
-        /// Type representing the weight of this pallet
+
+        /// Type representing the weight of this pallet.
         type WeightInfo: WeightInfo;
     }
 
     // STORAGE //
 
+    /// The number of blocks before the next epoch.
     #[pallet::storage]
     pub(super) type NexEpochHookIn<T: Config> = StorageValue<_, u8, ValueQuery>;
 
+    /// The request ID.
     #[pallet::storage]
     pub(super) type RequestIdProvider<T: Config> = StorageValue<_, RequestId, ValueQuery>;
 
+    /// The requests that will be fulfilled at the next block.
     #[pallet::storage]
     #[pallet::getter(fn requests_ready_at_next_block)]
     pub type RequestsReadyAtNextBlock<T: Config> = StorageValue<_, Vec<Request>, ValueQuery>;
 
+    /// The requests that will be fulfilled at the next epoch.
     #[pallet::storage]
     #[pallet::getter(fn requests_ready_at_epoch)]
     pub type RequestsReadyAtEpoch<T: Config> =
         StorageMap<_, Twox64Concat, u64, Vec<Request>, ValueQuery>;
 
+    /// The requests being processed.
     #[pallet::storage]
     #[pallet::getter(fn requests_ids)]
     pub type RequestsIds<T: Config> =
@@ -145,7 +167,7 @@ pub mod pallet {
 
     #[pallet::call]
     impl<T: Config> Pallet<T> {
-        /// Request a randomness
+        /// Request randomness.
         #[pallet::call_index(0)]
         #[pallet::weight(T::WeightInfo::request())]
         pub fn request(
@@ -218,6 +240,7 @@ pub mod pallet {
     // PUBLIC FUNCTIONS //
 
     impl<T: Config> Pallet<T> {
+        /// Initiates a randomness request with specified parameters.
         pub fn do_request(
             requestor: &T::AccountId,
             randomness_type: RandomnessType,
@@ -235,10 +258,12 @@ pub mod pallet {
             Ok(Self::apply_request(randomness_type, salt))
         }
 
+        /// Forcefully initiates a randomness request using the specified parameters.
         pub fn force_request(randomness_type: RandomnessType, salt: H256) -> RequestId {
             Self::apply_request(randomness_type, salt)
         }
 
+        /// Set the next epoch hook value to 5.
         pub fn on_new_epoch() {
             NexEpochHookIn::<T>::put(5)
         }
@@ -247,17 +272,20 @@ pub mod pallet {
     // INTERNAL FUNCTIONS //
 
     impl<T: Config> Pallet<T> {
+        /// Withdraw funds from the requestor's account to pay for a request.
         fn pay_request(requestor: &T::AccountId) -> DispatchResult {
             let imbalance = T::Currency::withdraw(
                 requestor,
                 T::RequestPrice::get(),
-                WithdrawReasons::FEE,
-                ExistenceRequirement::KeepAlive,
+                Precision::Exact,
+                Preservation::Preserve,
+                Fortitude::Polite,
             )?;
             T::OnUnbalanced::on_unbalanced(imbalance);
             Ok(())
         }
 
+        /// Apply a randomness request with the specified type and salt.
         fn apply_request(randomness_type: RandomnessType, salt: H256) -> RequestId {
             let request_id = RequestIdProvider::<T>::mutate(|next_request_id| {
                 core::mem::replace(next_request_id, next_request_id.saturating_add(1))
diff --git a/pallets/provide-randomness/src/types.rs b/pallets/provide-randomness/src/types.rs
index 8e7b883011a98aeb3d77b334ba9468c38a5741ea..4dfeda203152ff43330ecf9814644845ffe7d3de 100644
--- a/pallets/provide-randomness/src/types.rs
+++ b/pallets/provide-randomness/src/types.rs
@@ -22,15 +22,22 @@ use frame_support::pallet_prelude::*;
 use scale_info::TypeInfo;
 use sp_core::H256;
 
+/// The type of randomness source.
 #[derive(Clone, Copy, Decode, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)]
 pub enum RandomnessType {
+    /// Randomness derived from the previous block.
     RandomnessFromPreviousBlock,
+    /// Randomness derived from one epoch ago.
     RandomnessFromOneEpochAgo,
+    /// Randomness derived from two epochs ago.
     RandomnessFromTwoEpochsAgo,
 }
 
+/// Represents a randomness request.
 #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo)]
 pub struct Request {
+    /// Request ID.
     pub request_id: RequestId,
+    /// Salt used for the request.
     pub salt: H256,
 }
diff --git a/pallets/quota/Cargo.toml b/pallets/quota/Cargo.toml
index 3c92a89ec438d823a34d91fe3a6eacaaf77b4adc..9df99355f7735a97d06dc783a59d6852a444e01c 100644
--- a/pallets/quota/Cargo.toml
+++ b/pallets/quota/Cargo.toml
@@ -5,7 +5,6 @@ edition.workspace = true
 homepage.workspace = true
 license.workspace = true
 name = "pallet-quota"
-readme = "README.md"
 repository.workspace = true
 version.workspace = true
 
@@ -39,7 +38,6 @@ std = [
 	"sp-core/std",
 	"sp-io/std",
 	"sp-runtime/std",
-	"sp-std/std",
 ]
 
 [package.metadata.docs.rs]
@@ -55,7 +53,6 @@ pallet-identity = { workspace = true }
 scale-info = { workspace = true, features = ["derive"] }
 sp-core = { workspace = true }
 sp-runtime = { workspace = true }
-sp-std = { workspace = true }
 
 [dev-dependencies]
-sp-io = { workspace = true }
+sp-io = { workspace = true, default-features = true }
diff --git a/pallets/quota/README.md b/pallets/quota/README.md
deleted file mode 100644
index 485460de592face6a99597fef19eb952df5936d4..0000000000000000000000000000000000000000
--- a/pallets/quota/README.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Duniter quota pallet
-
-Duniter identity system allows to allocate quota and refund transaction fees when not consumed.
-
-## General behavior
-
-Quota system is plugged to transactions fees which is a rather critical aspect of substrate.
-That's why in `duniter-account` pallet `OnChargeTransaction` implementation, the default behavior is preserved, and refunds are added to a queue handled in `on_idle`.
-
-## Path for a refund
-
-This is what happens on a transaction:
-
-- `frame-executive` calls `OnChargeTransaction` implementations
-- `duniter-account` `OnChargeTransaction` implementation is called, and if an identity is linked to the account who pays the fees, `request_refund` is called
-- `request_refund` implementation of `quota` pallet determines whether the fees are eligible for refund based on the identity and then call `queue_refund`
-- `queue_refund` adds a refund to the `RefundQueue` which will be processed in `on_idle`
-- during `on_idle`, `quota` pallet processes the refund queue within the supplied weight limit with `process_refund_queue`
-- for each refund in the `RefundQueue`, `try_refund` is called
-- it first tries to use quotas to refund fees with `spend_quota`
-- if a certain amount of quotas has been spend, it actually performs the refund with `do_refund`, taking currency from the `RefundAccount` to give it back to the account who paid the fee
-
-The conditions for a refund to happen are:
-
-1. an identity is linked to the account who pays the fees
-1. some quotas are defined for the identity and have a non-null value after update
-
-
-## TODO
-
-- [ ] sanity test checking that only member identities have quota
\ No newline at end of file
diff --git a/pallets/quota/src/benchmarking.rs b/pallets/quota/src/benchmarking.rs
index 834268d9c014194c61a16a092e1fcd15c0f53e65..24dcd895e3065766c64472b68d960538e3c44dfe 100644
--- a/pallets/quota/src/benchmarking.rs
+++ b/pallets/quota/src/benchmarking.rs
@@ -17,8 +17,7 @@
 #![cfg(feature = "runtime-benchmarks")]
 
 use super::*;
-use frame_benchmarking::account;
-use frame_benchmarking::v2::*;
+use frame_benchmarking::{account, v2::*};
 use sp_runtime::traits::One;
 
 fn assert_has_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) {
diff --git a/pallets/quota/src/lib.rs b/pallets/quota/src/lib.rs
index 8a063dcb13ca8b19f79023df55f69854ef5c9ede..67340ef670a1d12c7294dbde1f93111e4bffa3e1 100644
--- a/pallets/quota/src/lib.rs
+++ b/pallets/quota/src/lib.rs
@@ -14,6 +14,27 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
+//! # Duniter Quota Pallet
+//!
+//! ## Overview
+//!
+//! This pallet is designed to manage transaction fee refunds based on quotas allocated to identities within the Duniter identity system. Quotas are linked to transaction fees, ensuring efficient handling of fee refunds when transactions occur.
+//!
+//! ## Refund Mechanism
+//!
+//! When a transaction is processed:
+//! - The `OnChargeTransaction` implementation in the `frame-executive` pallet is called.
+//! - The `OnChargeTransaction` implementation in the `duniter-account` pallet checks if the paying account is linked to an identity.
+//! - If linked, the `request_refund` function in the `quota` pallet evaluates the eligibility for fee refund based on the identity's quota.
+//! - Eligible refunds are added to the `RefundQueue`, managed by `process_refund_queue` during the `on_idle` phase.
+//! - Refunds are processed with `try_refund`, using quotas to refund fees via `spend_quota`, and then executing the refund through `do_refund` by transferring currency from the `RefundAccount` back to the paying account.
+//!
+//! ## Conditions for Refund
+//!
+//! Refunds are executed under the following conditions:
+//! 1. The paying account is linked to an identity.
+//! 2. Quotas are allocated to the identity and have a non-zero value after updates.
+
 #![cfg_attr(not(feature = "std"), no_std)]
 
 pub mod traits;
@@ -25,18 +46,17 @@ mod mock;
 #[cfg(test)]
 mod tests;
 
-#[cfg(feature = "runtime-benchmarks")]
 pub mod benchmarking;
 
 use crate::traits::*;
-use frame_support::pallet_prelude::*;
-use frame_support::traits::{Currency, ExistenceRequirement};
+use frame_support::{
+    pallet_prelude::*,
+    traits::{Currency, ExistenceRequirement},
+};
 use frame_system::pallet_prelude::*;
 pub use pallet::*;
-use pallet_identity::IdtyEvent;
+use scale_info::prelude::vec::Vec;
 use sp_runtime::traits::Zero;
-use sp_std::fmt::Debug;
-use sp_std::vec::Vec;
 pub use weights::WeightInfo;
 
 #[frame_support::pallet]
@@ -61,46 +81,52 @@ pub mod pallet {
     pub trait Config:
         frame_system::Config + pallet_balances::Config + pallet_identity::Config
     {
-        /// Because this pallet emits events, it depends on the runtime's definition of an event.
+        /// The overarching event type.
         type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
-        /// number of blocks in which max quota is replenished
+
+        /// Number of blocks after which the maximum quota is replenished.
         type ReloadRate: Get<BlockNumberFor<Self>>;
-        /// maximum amount of quota an identity can get
+
+        /// Maximum amount of quota an identity can receive.
         type MaxQuota: Get<BalanceOf<Self>>;
-        /// Account used to refund fee
+
+        /// Account used to refund fees.
         #[pallet::constant]
         type RefundAccount: Get<Self::AccountId>;
-        /// Weight
+
+        /// Type representing the weight of this pallet.
         type WeightInfo: WeightInfo;
     }
 
     // TYPES //
+    /// Represents a refund.
     #[derive(Encode, Decode, Clone, TypeInfo, Debug, PartialEq, MaxEncodedLen)]
     pub struct Refund<AccountId, IdtyId, Balance> {
-        /// account to refund
+        /// Account to refund.
         pub account: AccountId,
-        /// identity to use quota
+        /// Identity to use quota.
         pub identity: IdtyId,
-        /// amount of refund
+        /// Amount of refund.
         pub amount: Balance,
     }
 
+    /// Represents a quota.
     #[derive(Encode, Decode, Clone, TypeInfo, Debug, PartialEq, MaxEncodedLen)]
     pub struct Quota<BlockNumber, Balance> {
-        /// block number of last quota use
+        /// Block number of the last quota used.
         pub last_use: BlockNumber,
-        /// amount of remaining quota
+        /// Amount of remaining quota.
         pub amount: Balance,
     }
 
     // STORAGE //
-    /// maps identity index to quota
+    /// The quota for each identity.
     #[pallet::storage]
     #[pallet::getter(fn quota)]
     pub type IdtyQuota<T: Config> =
         StorageMap<_, Twox64Concat, IdtyId<T>, Quota<BlockNumberFor<T>, BalanceOf<T>>, OptionQuery>;
 
-    /// fees waiting for refund
+    /// The fees waiting to be refunded.
     #[pallet::storage]
     pub type RefundQueue<T: Config> = StorageValue<
         _,
@@ -137,14 +163,14 @@ pub mod pallet {
 
     // INTERNAL FUNCTIONS //
     impl<T: Config> Pallet<T> {
-        /// add a new refund to the queue
+        /// Adds a new refund request to the refund queue.
         pub fn queue_refund(refund: Refund<T::AccountId, IdtyId<T>, BalanceOf<T>>) {
             if RefundQueue::<T>::mutate(|v| v.try_push(refund)).is_err() {
                 Self::deposit_event(Event::RefundQueueFull);
             }
         }
 
-        /// try to refund using quota if available
+        /// Attempts to process a refund using available quota.
         pub fn try_refund(queued_refund: Refund<T::AccountId, IdtyId<T>, BalanceOf<T>>) -> Weight {
             // get the amount of quota that identity is able to spend
             let amount = Self::spend_quota(queued_refund.identity, queued_refund.amount);
@@ -159,7 +185,7 @@ pub mod pallet {
                 .saturating_add(<T as pallet::Config>::WeightInfo::do_refund())
         }
 
-        /// do refund a non-null amount
+        /// Performs a refund operation for a specified non-null amount from the refund account to the requester's account.
         // opti: more accurate estimation of consumed weight
         pub fn do_refund(
             queued_refund: Refund<T::AccountId, IdtyId<T>, BalanceOf<T>>,
@@ -199,7 +225,7 @@ pub mod pallet {
             }
         }
 
-        /// perform as many refunds as possible within the supplied weight limit
+        /// Processes as many refunds as possible from the refund queue within the supplied weight limit.
         pub fn process_refund_queue(weight_limit: Weight) -> Weight {
             RefundQueue::<T>::mutate(|queue| {
                 // The weight to process an empty queue
@@ -232,7 +258,7 @@ pub mod pallet {
             })
         }
 
-        /// spend quota of identity
+        /// Spends the quota of an identity by deducting the specified `amount` from its quota balance.
         pub fn spend_quota(idty_id: IdtyId<T>, amount: BalanceOf<T>) -> BalanceOf<T> {
             IdtyQuota::<T>::mutate_exists(idty_id, |quota| {
                 if let Some(ref mut quota) = quota {
@@ -246,7 +272,7 @@ pub mod pallet {
             })
         }
 
-        /// update quota according to the growth rate, max value, and last use
+        /// Update the quota according to the growth rate, maximum value, and last use.
         fn update_quota(quota: &mut Quota<BlockNumberFor<T>, BalanceOf<T>>) {
             let current_block = frame_system::pallet::Pallet::<T>::block_number();
             let quota_growth = sp_runtime::Perbill::from_rational(
@@ -259,7 +285,7 @@ pub mod pallet {
             quota.amount = core::cmp::min(quota.amount + quota_growth, T::MaxQuota::get());
         }
 
-        /// spend a certain amount of quota and return what was spent
+        /// Spend a certain amount of quota and return the amount that was spent.
         fn do_spend_quota(
             quota: &mut Quota<BlockNumberFor<T>, BalanceOf<T>>,
             amount: BalanceOf<T>,
@@ -317,8 +343,9 @@ pub mod pallet {
     }
 }
 
-// implement quota traits
+/// Implementing the refund fee trait for the pallet.
 impl<T: Config> RefundFee<T> for Pallet<T> {
+    /// This implementation checks if the identity is eligible for a refund and queues the refund if so.
     fn request_refund(account: T::AccountId, identity: IdtyId<T>, amount: BalanceOf<T>) {
         if is_eligible_for_refund::<T>(identity) {
             Self::queue_refund(Refund {
@@ -330,31 +357,45 @@ impl<T: Config> RefundFee<T> for Pallet<T> {
     }
 }
 
-/// tells whether an identity is eligible for refund
+/// Checks if an identity is eligible for a refund.
+///
+/// This function returns `true` for all identities, regardless of their status.
+/// If the identity has no quotas or has been deleted, the refund request is still queued,
+/// but when handled, no refund will be issued (and `NoQuotaForIdty` may be raised).
 fn is_eligible_for_refund<T: pallet_identity::Config>(_identity: IdtyId<T>) -> bool {
-    // all identities are eligible for refund, no matter their status
-    // if the identity has no quotas or has been deleted, the refund request is still queued
-    // but when handeled, no refund will be issued (and `NoQuotaForIdty` may be raised)
     true
 }
 
-// implement identity event handler
-impl<T: Config> pallet_identity::traits::OnIdtyChange<T> for Pallet<T> {
-    fn on_idty_change(idty_id: IdtyId<T>, idty_event: &IdtyEvent<T>) {
-        match idty_event {
-            // initialize quota on identity creation
-            IdtyEvent::Created { .. } => {
-                IdtyQuota::<T>::insert(
-                    idty_id,
-                    Quota {
-                        last_use: frame_system::pallet::Pallet::<T>::block_number(),
-                        amount: BalanceOf::<T>::zero(),
-                    },
-                );
-            }
-            IdtyEvent::Removed { .. } => {
-                IdtyQuota::<T>::remove(idty_id);
-            }
-        }
+/// Implementing the on new identity event handler for the pallet.
+impl<T: Config> pallet_identity::traits::OnNewIdty<T> for Pallet<T> {
+    /// This implementation initializes the identity quota for the newly created identity.
+    fn on_created(idty_index: &IdtyId<T>, _creator: &T::IdtyIndex) {
+        IdtyQuota::<T>::insert(
+            idty_index,
+            Quota {
+                last_use: frame_system::pallet::Pallet::<T>::block_number(),
+                amount: BalanceOf::<T>::zero(),
+            },
+        );
+    }
+}
+
+/// Implementing the on remove identity event handler for the pallet.
+impl<T: Config> pallet_identity::traits::OnRemoveIdty<T> for Pallet<T> {
+    /// This implementation removes the identity quota associated with the removed identity.
+    fn on_removed(idty_id: &IdtyId<T>) -> Weight {
+        let mut weight = Weight::zero();
+        let mut add_db_reads_writes = |reads, writes| {
+            weight = weight.saturating_add(T::DbWeight::get().reads_writes(reads, writes));
+        };
+
+        IdtyQuota::<T>::remove(idty_id);
+        add_db_reads_writes(1, 1);
+        weight
+    }
+
+    /// This implementation removes the identity quota associated with the removed identity.
+    fn on_revoked(idty_id: &IdtyId<T>) -> Weight {
+        Self::on_removed(idty_id)
     }
 }
diff --git a/pallets/quota/src/mock.rs b/pallets/quota/src/mock.rs
index 5f7f79a2f411b12dc7082727c41529acab238223..a21f3b85c552e77c4ff63397e2ebf5b60be8e812 100644
--- a/pallets/quota/src/mock.rs
+++ b/pallets/quota/src/mock.rs
@@ -24,12 +24,9 @@ use frame_support::{
 };
 use frame_system as system;
 use sp_core::{Pair, H256};
-use sp_runtime::traits::IdentifyAccount;
-use sp_runtime::traits::Verify;
-use sp_runtime::BuildStorage;
 use sp_runtime::{
-    traits::{BlakeTwo256, IdentityLookup},
-    MultiSignature, MultiSigner,
+    traits::{BlakeTwo256, IdentifyAccount, IdentityLookup, Verify},
+    BuildStorage, MultiSignature, MultiSigner,
 };
 
 type BlockNumber = u64;
@@ -91,16 +88,21 @@ impl system::Config for Test {
     type Hashing = BlakeTwo256;
     type Lookup = IdentityLookup<Self::AccountId>;
     type MaxConsumers = frame_support::traits::ConstU32<16>;
+    type MultiBlockMigrator = ();
     type Nonce = u64;
     type OnKilledAccount = ();
     type OnNewAccount = ();
     type OnSetCode = ();
     type PalletInfo = PalletInfo;
+    type PostInherents = ();
+    type PostTransactions = ();
+    type PreInherents = ();
     type RuntimeCall = RuntimeCall;
     type RuntimeEvent = RuntimeEvent;
     type RuntimeOrigin = RuntimeOrigin;
     type RuntimeTask = ();
     type SS58Prefix = SS58Prefix;
+    type SingleBlockMigrations = ();
     type SystemWeightInfo = ();
     type Version = ();
 }
@@ -117,7 +119,6 @@ impl pallet_balances::Config for Test {
     type ExistentialDeposit = ExistentialDeposit;
     type FreezeIdentifier = ();
     type MaxFreezes = ConstU32<0>;
-    type MaxHolds = ConstU32<0>;
     type MaxLocks = MaxLocks;
     type MaxReserves = ();
     type ReserveIdentifier = [u8; 8];
@@ -146,6 +147,7 @@ impl pallet_identity::Config for Test {
     type AccountLinker = ();
     type AutorevocationPeriod = AutorevocationPeriod;
     type ChangeOwnerKeyPeriod = ChangeOwnerKeyPeriod;
+    type CheckAccountWorthiness = ();
     type CheckIdtyCallAllowed = ();
     type ConfirmPeriod = ConfirmPeriod;
     type DeletionPeriod = DeletionPeriod;
@@ -153,7 +155,9 @@ impl pallet_identity::Config for Test {
     type IdtyData = ();
     type IdtyIndex = u64;
     type IdtyNameValidator = IdtyNameValidatorTestImpl;
-    type OnIdtyChange = ();
+    type OnNewIdty = ();
+    type OnRemoveIdty = ();
+    type OwnerKeyChangePermission = ();
     type RuntimeEvent = RuntimeEvent;
     type Signature = Signature;
     type Signer = AccountPublic;
diff --git a/pallets/quota/src/tests.rs b/pallets/quota/src/tests.rs
index 81f65b8bfc62755e9694cc688052af98bcaddd21..40f7469286abeda7cad25e159294f1b132f18f84 100644
--- a/pallets/quota/src/tests.rs
+++ b/pallets/quota/src/tests.rs
@@ -14,8 +14,7 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-use crate::mock::*;
-use crate::Weight;
+use crate::{mock::*, Weight};
 use frame_support::traits::Currency;
 use sp_core::Get;
 
diff --git a/pallets/quota/src/traits.rs b/pallets/quota/src/traits.rs
index fb2e377fd0fed6a6718703a0a3b893ad62e6b332..9b1f4298d08abf61c712f2d1d2861635676ff1e3 100644
--- a/pallets/quota/src/traits.rs
+++ b/pallets/quota/src/traits.rs
@@ -16,12 +16,12 @@
 
 use crate::*;
 
-/// trait used to request refund of a fee
+/// Trait for managing refund operations.
 pub trait RefundFee<T: Config> {
-    /// request refund for the account `account` using the quotas of identity `identity`
+    /// Request a refund of a fee for a specific account and identity.
     fn request_refund(account: T::AccountId, identity: IdtyId<T>, amount: BalanceOf<T>);
 }
-// dummy impl
+
 impl<T: Config> RefundFee<T> for () {
     fn request_refund(_account: T::AccountId, _identity: IdtyId<T>, _amount: BalanceOf<T>) {}
 }
diff --git a/pallets/session-benchmarking/Cargo.toml b/pallets/session-benchmarking/Cargo.toml
index 3da6b64a6edc96811e58a6ae367922d750305869..d7ab97ff0bc4468435106c792ff1a49eaa607fb8 100644
--- a/pallets/session-benchmarking/Cargo.toml
+++ b/pallets/session-benchmarking/Cargo.toml
@@ -6,19 +6,18 @@ license.workspace = true
 homepage.workspace = true
 repository.workspace = true
 description = "FRAME sessions pallet benchmarking"
-readme = "README.md"
 version.workspace = true
 
 [package.metadata.docs.rs]
 targets = ["x86_64-unknown-linux-gnu"]
 
 [dependencies]
+codec = { workspace = true }
 frame-benchmarking = { workspace = true, optional = true }
 frame-system = { workspace = true }
 pallet-session = { workspace = true }
-sp-std = { workspace = true }
+scale-info = { workspace = true, features = ["derive"] }
 sp-runtime = { workspace = true }
-codec = { workspace = true }
 
 [features]
 default = ["std"]
@@ -28,7 +27,6 @@ std = [
 	"frame-system/std",
 	"pallet-session/std",
 	"sp-runtime/std",
-	"sp-std/std",
 ]
 try-runtime = [
 	"frame-system/try-runtime",
diff --git a/pallets/session-benchmarking/README.md b/pallets/session-benchmarking/README.md
deleted file mode 100644
index 8d0946772e12c530b15d43fe41738bffe1301c06..0000000000000000000000000000000000000000
--- a/pallets/session-benchmarking/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# Duniter session-benchmarking pallet
-
-Benchmark crate for the `pallet-session` that is decoupled from the `staking-pallet` not used in Duniter.  
-In Duniter, the `SessionManager `and `SessionHandler` hooks are implemented in the `authority-members` pallet.
\ No newline at end of file
diff --git a/pallets/session-benchmarking/src/lib.rs b/pallets/session-benchmarking/src/lib.rs
index dd22408a1a7e1918bd8da529f2bd296bdd0ba916..8ce793b54ae3085f713d94f271b70f81552e49ae 100644
--- a/pallets/session-benchmarking/src/lib.rs
+++ b/pallets/session-benchmarking/src/lib.rs
@@ -14,17 +14,22 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-//! Benchmarks for the Session Pallet.
-// This is separated into its own crate due to cyclic dependency issues.
+//! # Duniter Session Benchmarking Pallet
+//!
+//! This crate provides benchmarks specifically for the `pallet-session` within Duniter. Unlike traditional setups, this implementation is decoupled from the `staking-pallet`, which is not utilized in Duniter's architecture. Instead, session management functionalities are integrated into the `authority-members` pallet.
+//!
+//! ## Note
+//!
+//! This crate is separated from the main codebase due to cyclic dependency issues, focusing solely on session-related benchmarking independent of staking-related functionalities.
 
 #![cfg_attr(not(feature = "std"), no_std)]
 #![cfg(feature = "runtime-benchmarks")]
 use codec::Decode;
-use sp_std::{prelude::*, vec};
 
 use frame_benchmarking::{benchmarks, whitelisted_caller};
 use frame_system::RawOrigin;
 use pallet_session::*;
+use scale_info::prelude::{vec, vec::Vec};
 
 pub struct Pallet<T: Config>(pallet_session::Pallet<T>);
 pub trait Config: pallet_session::Config {}
diff --git a/pallets/smith-members/Cargo.toml b/pallets/smith-members/Cargo.toml
index 651a62a8a77f543bfaf71ee4b09128a424c30844..4d1cb68cefc2cb6b585e292a232c24d984073556 100644
--- a/pallets/smith-members/Cargo.toml
+++ b/pallets/smith-members/Cargo.toml
@@ -6,13 +6,13 @@ edition.workspace = true
 homepage.workspace = true
 license.workspace = true
 repository.workspace = true
-readme = "README.md"
 version.workspace = true
 
 [package.metadata.docs.rs]
 targets = ["x86_64-unknown-linux-gnu"]
 
 [dependencies]
+duniter-primitives = { workspace = true }
 codec = { workspace = true, features = ["derive"] }
 frame-benchmarking = { workspace = true, optional = true }
 frame-support = { workspace = true }
@@ -22,12 +22,6 @@ pallet-authority-members = { workspace = true }
 scale-info = { workspace = true, features = ["derive"] }
 sp-runtime = { workspace = true }
 sp-staking = { workspace = true }
-sp-std = { workspace = true }
-
-[dev-dependencies]
-maplit = { workspace = true }
-sp-core = { workspace = true }
-sp-io = { workspace = true }
 
 [features]
 default = ["std"]
@@ -43,7 +37,6 @@ std = [
 	"sp-io/std",
 	"sp-runtime/std",
 	"sp-staking/std",
-	"sp-std/std",
 ]
 runtime-benchmarks = [
 	"frame-benchmarking/runtime-benchmarks",
@@ -60,3 +53,8 @@ try-runtime = [
 	"pallet-authority-members/try-runtime",
 	"sp-runtime/try-runtime",
 ]
+
+[dev-dependencies]
+maplit = { workspace = true, default-features = true }
+sp-core = { workspace = true, default-features = true }
+sp-io = { workspace = true, default-features = true }
diff --git a/pallets/smith-members/README.md b/pallets/smith-members/README.md
deleted file mode 100644
index 655534a2a74d357c3d0f856dd3e4de6493eddd44..0000000000000000000000000000000000000000
--- a/pallets/smith-members/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Duniter smith pallet
-
-The bridge between `identity` and `authority-members` pallet.
\ No newline at end of file
diff --git a/pallets/smith-members/src/benchmarking.rs b/pallets/smith-members/src/benchmarking.rs
index b3730a866f87cf3131a8c749122e1e6e939ab71a..7db266901c06c6f41ed0a8f2f2490a341e309efd 100644
--- a/pallets/smith-members/src/benchmarking.rs
+++ b/pallets/smith-members/src/benchmarking.rs
@@ -20,7 +20,6 @@ use super::*;
 
 use frame_benchmarking::v2::*;
 use frame_system::RawOrigin;
-use sp_runtime::traits::Convert;
 
 use crate::Pallet;
 
@@ -38,9 +37,10 @@ mod benchmarks {
     #[benchmark]
     fn invite_smith() {
         let issuer: T::IdtyIndex = 1.into();
-        let caller: T::AccountId = T::OwnerKeyOf::convert(issuer).unwrap();
+        let caller: T::AccountId = T::IdtyAttr::owner_key(issuer).unwrap();
         Pallet::<T>::on_smith_goes_online(1.into());
-        let receiver: T::IdtyIndex = 4.into();
+        // Should be the last identities from the local_testnet_config
+        let receiver: T::IdtyIndex = 6.into();
 
         #[extrinsic_call]
         _(RawOrigin::Signed(caller), receiver);
@@ -51,14 +51,15 @@ mod benchmarks {
     #[benchmark]
     fn accept_invitation() -> Result<(), BenchmarkError> {
         let issuer: T::IdtyIndex = 1.into();
-        let caller: T::AccountId = T::OwnerKeyOf::convert(issuer).unwrap();
+        let caller: T::AccountId = T::IdtyAttr::owner_key(issuer).unwrap();
         Pallet::<T>::on_smith_goes_online(1.into());
         let caller_origin: <T as frame_system::Config>::RuntimeOrigin =
             RawOrigin::Signed(caller.clone()).into();
-        let receiver: T::IdtyIndex = 4.into();
+        // Should be the last identities from the local_testnet_config
+        let receiver: T::IdtyIndex = 6.into();
         Pallet::<T>::invite_smith(caller_origin, receiver)?;
-        let issuer: T::IdtyIndex = 4.into();
-        let caller: T::AccountId = T::OwnerKeyOf::convert(issuer).unwrap();
+        let issuer: T::IdtyIndex = 6.into();
+        let caller: T::AccountId = T::IdtyAttr::owner_key(issuer).unwrap();
 
         #[extrinsic_call]
         _(RawOrigin::Signed(caller));
@@ -75,19 +76,20 @@ mod benchmarks {
     #[benchmark]
     fn certify_smith() -> Result<(), BenchmarkError> {
         let issuer: T::IdtyIndex = 1.into();
-        let caller: T::AccountId = T::OwnerKeyOf::convert(issuer).unwrap();
+        let caller: T::AccountId = T::IdtyAttr::owner_key(issuer).unwrap();
         Pallet::<T>::on_smith_goes_online(1.into());
         let caller_origin: <T as frame_system::Config>::RuntimeOrigin =
             RawOrigin::Signed(caller.clone()).into();
-        let receiver: T::IdtyIndex = 4.into();
+        // Should be the last identities from the local_testnet_config
+        let receiver: T::IdtyIndex = 6.into();
         Pallet::<T>::invite_smith(caller_origin, receiver)?;
         let issuer: T::IdtyIndex = receiver;
-        let caller: T::AccountId = T::OwnerKeyOf::convert(issuer).unwrap();
+        let caller: T::AccountId = T::IdtyAttr::owner_key(issuer).unwrap();
         let caller_origin: <T as frame_system::Config>::RuntimeOrigin =
             RawOrigin::Signed(caller.clone()).into();
         Pallet::<T>::accept_invitation(caller_origin)?;
         let issuer: T::IdtyIndex = 1.into();
-        let caller: T::AccountId = T::OwnerKeyOf::convert(issuer).unwrap();
+        let caller: T::AccountId = T::IdtyAttr::owner_key(issuer).unwrap();
 
         #[extrinsic_call]
         _(RawOrigin::Signed(caller), receiver);
@@ -96,6 +98,28 @@ mod benchmarks {
         Ok(())
     }
 
+    #[benchmark]
+    fn on_removed_wot_member() {
+        let idty: T::IdtyIndex = 1.into();
+        assert!(Smiths::<T>::get(idty).is_some());
+
+        #[block]
+        {
+            Pallet::<T>::on_removed_wot_member(idty);
+        }
+    }
+
+    #[benchmark]
+    fn on_removed_wot_member_empty() {
+        let idty: T::IdtyIndex = 100.into();
+        assert!(Smiths::<T>::get(idty).is_none());
+
+        #[block]
+        {
+            Pallet::<T>::on_removed_wot_member(idty);
+        }
+    }
+
     impl_benchmark_test_suite!(
         Pallet,
         crate::mock::new_test_ext(crate::GenesisConfig {
diff --git a/pallets/smith-members/src/impls.rs b/pallets/smith-members/src/impls.rs
index 95a1e49dfd63d25acd45e8a5b5f7c983bad89aef..c4662164e457f4e95419aabd3042d928751c2ada 100644
--- a/pallets/smith-members/src/impls.rs
+++ b/pallets/smith-members/src/impls.rs
@@ -19,7 +19,6 @@ impl<T: Config> pallet_authority_members::OnIncomingMember<T::MemberId> for Pall
     }
 }
 
-///
 impl<T: Config> pallet_authority_members::OnNewSession for Pallet<T> {
     fn on_new_session(index: SessionIndex) {
         CurrentSession::<T>::put(index);
diff --git a/pallets/smith-members/src/lib.rs b/pallets/smith-members/src/lib.rs
index f9e126a18bab3fcc60d678e5ce333659b081a673..35918f55a00283378fd80f27686c8ecf7c6e0845 100644
--- a/pallets/smith-members/src/lib.rs
+++ b/pallets/smith-members/src/lib.rs
@@ -14,6 +14,29 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
+//! # Duniter Smith Pallet
+//!
+//! The Smith pallet in Duniter serves as a bridge between the `identity` and `authority-members` pallets.
+//!
+//! ## Overview
+//!
+//! The Smith pallet manages the certification and membership status of Smiths. Smiths are identities that have met certain requirements and play a critical role in the network's operations (block authoring, distance evaluation).
+//!
+//! ## Key Concepts
+//!
+//! ### Smith Status
+//!
+//! The status of an identity within the Smith pallet can be one of the following:
+//! - **Invited**: The identity has been invited by a Smith but has not yet accepted the invitation.
+//! - **Pending**: The identity has accepted the invitation and is pending to become a full Smith.
+//! - **Smith**: The identity has fulfilled the requirements and is a full-fledged Smith, eligible to perform critical network functions.
+//! - **Excluded**: The identity has been removed from the Smiths set but its certifications are retained for tracking purposes.
+//!
+//! ### Certifications
+//!
+//! Certifications are crucial in determining Smith status:
+//! - An identity needs a minimum number of certifications to become a Smith (`MinCertForMembership`).
+
 #![cfg_attr(not(feature = "std"), no_std)]
 
 #[cfg(test)]
@@ -27,21 +50,21 @@ pub mod traits;
 mod types;
 pub mod weights;
 
-#[cfg(feature = "runtime-benchmarks")]
 mod benchmarking;
 
 use codec::{Codec, Decode, Encode};
-use frame_support::dispatch::DispatchResultWithPostInfo;
-use frame_support::ensure;
-use frame_support::pallet_prelude::Get;
-use frame_support::pallet_prelude::RuntimeDebug;
-use frame_system::ensure_signed;
-use frame_system::pallet_prelude::OriginFor;
-use scale_info::TypeInfo;
-use sp_runtime::traits::AtLeast32BitUnsigned;
-use sp_runtime::traits::IsMember;
-use sp_std::fmt::Debug;
-use sp_std::prelude::*;
+use duniter_primitives::Idty;
+use frame_support::{
+    dispatch::DispatchResultWithPostInfo,
+    ensure,
+    pallet_prelude::{Get, RuntimeDebug, Weight},
+};
+use frame_system::{ensure_signed, pallet_prelude::OriginFor};
+use scale_info::{
+    prelude::{collections::BTreeMap, fmt::Debug, vec, vec::Vec},
+    TypeInfo,
+};
+use sp_runtime::traits::{AtLeast32BitUnsigned, IsMember};
 
 use crate::traits::OnSmithDelete;
 pub use crate::weights::WeightInfo;
@@ -49,35 +72,36 @@ pub use pallet::*;
 use pallet_authority_members::SessionIndex;
 pub use types::*;
 
+/// Reasons for the removal of a Smith identity.
 #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)]
 pub enum SmithRemovalReason {
+    /// Membership was lost due to expiration or other reasons.
     LostMembership,
+    /// Smith was offline for too long.
     OfflineTooLong,
+    /// Smith was blacklisted.
     Blacklisted,
 }
 
+/// Possible statuses of a Smith identity.
 #[derive(Encode, Decode, Copy, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)]
 pub enum SmithStatus {
-    /// The identity has been invited by a smith but has not accepted yet
+    /// The identity has been invited by a Smith but has not accepted yet.
     Invited,
-    /// The identity has accepted to eventually become a smith
+    /// The identity has accepted to eventually become a Smith.
     Pending,
-    /// The identity has reached the requirements to become a smith and can now goGoOnline() or invite/certify other smiths
+    /// The identity has reached the requirements to become a Smith and can now perform Smith operations.
     Smith,
-    /// The identity has been removed from the smiths set but is kept to keep track of its certifications
+    /// The identity has been removed from the Smiths set but is kept to track its certifications.
     Excluded,
 }
 
 #[frame_support::pallet]
 pub mod pallet {
     use super::*;
-    use frame_support::pallet_prelude::*;
-    use frame_support::traits::StorageVersion;
+    use frame_support::{pallet_prelude::*, traits::StorageVersion};
     use pallet_authority_members::SessionIndex;
     use sp_runtime::traits::{Convert, IsMember};
-    use sp_std::collections::btree_map::BTreeMap;
-    use sp_std::vec;
-    use sp_std::vec::Vec;
 
     const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);
 
@@ -89,13 +113,15 @@ pub mod pallet {
     /// The pallet's config trait.
     #[pallet::config]
     pub trait Config: frame_system::Config {
-        /// To only allow WoT members to be invited
+        /// Trait to check if identity is a WoT members.
         type IsWoTMember: IsMember<Self::IdtyIndex>;
-        /// Notify when a smith is removed (for authority-members to react)
+
         type OnSmithDelete: traits::OnSmithDelete<Self::IdtyIndex>;
-        /// The overarching event type.
+
+        /// The overarching event type for this pallet.
         type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
-        /// A short identity index.
+
+        /// A short identity index type.
         type IdtyIndex: Parameter
             + Member
             + AtLeast32BitUnsigned
@@ -105,24 +131,29 @@ pub mod pallet {
             + MaybeSerializeDeserialize
             + Debug
             + MaxEncodedLen;
-        /// Identifier for an authority-member
+
+        /// Identifier type for an authority-member.
         type MemberId: Copy + Ord + MaybeSerializeDeserialize + Parameter;
-        /// Something that gives the IdtyId of an AccountId
-        type IdtyIdOf: Convert<Self::AccountId, Option<Self::IdtyIndex>>;
-        /// Something that give the owner key of an identity
-        type OwnerKeyOf: Convert<Self::IdtyIndex, Option<Self::AccountId>>;
-        /// Something that gives the IdtyId of an AccountId
+
+        /// Something that gives the IdtyIndex of an AccountId and reverse.
+        type IdtyAttr: duniter_primitives::Idty<Self::IdtyIndex, Self::AccountId>;
+
+        /// Something that gives the AccountId of an identity.
         type IdtyIdOfAuthorityId: Convert<Self::MemberId, Option<Self::IdtyIndex>>;
-        /// Maximum number of active certifications by issuer
+
+        /// Maximum number of active certifications per issuer.
         #[pallet::constant]
         type MaxByIssuer: Get<u32>;
-        /// Minimum number of certifications to become a Smith
+
+        /// Minimum number of certifications required to become a Smith.
         #[pallet::constant]
         type MinCertForMembership: Get<u32>;
-        /// Maximum duration of inactivity before a smith is removed
+
+        /// Maximum duration of inactivity allowed before a Smith is removed.
         #[pallet::constant]
         type SmithInactivityMaxDuration: Get<u32>;
-        /// Type representing the weight of this pallet
+
+        /// Type representing the weight of this pallet.
         type WeightInfo: WeightInfo;
     }
 
@@ -132,20 +163,20 @@ pub mod pallet {
     pub enum Event<T: Config> {
         /// An identity is being inivited to become a smith.
         InvitationSent {
-            receiver: T::IdtyIndex,
             issuer: T::IdtyIndex,
+            receiver: T::IdtyIndex,
         },
         /// The invitation has been accepted.
         InvitationAccepted { idty_index: T::IdtyIndex },
         /// Certification received
         SmithCertAdded {
-            receiver: T::IdtyIndex,
             issuer: T::IdtyIndex,
+            receiver: T::IdtyIndex,
         },
         /// Certification lost
         SmithCertRemoved {
-            receiver: T::IdtyIndex,
             issuer: T::IdtyIndex,
+            receiver: T::IdtyIndex,
         },
         /// A smith gathered enough certifications to become an authority (can call `go_online()`).
         SmithMembershipAdded { idty_index: T::IdtyIndex },
@@ -226,19 +257,19 @@ pub mod pallet {
         }
     }
 
-    /// maps identity index to smith status
+    /// The Smith metadata for each identity.
     #[pallet::storage]
     #[pallet::getter(fn smiths)]
     pub type Smiths<T: Config> =
         StorageMap<_, Twox64Concat, T::IdtyIndex, SmithMeta<T::IdtyIndex>, OptionQuery>;
 
-    /// maps session index to possible smith removals
+    /// The indexes of Smith to remove at a given session.
     #[pallet::storage]
     #[pallet::getter(fn expires_on)]
     pub type ExpiresOn<T: Config> =
         StorageMap<_, Twox64Concat, SessionIndex, Vec<T::IdtyIndex>, OptionQuery>;
 
-    /// stores the current session index
+    /// The current session index.
     #[pallet::storage]
     #[pallet::getter(fn current_session)]
     pub type CurrentSession<T: Config> = StorageValue<_, SessionIndex, ValueQuery>;
@@ -281,7 +312,7 @@ pub mod pallet {
 
     #[pallet::call]
     impl<T: Config> Pallet<T> {
-        /// Invite a WoT member to try becoming a Smith
+        /// Invite a member of the Web of Trust to attempt becoming a Smith.
         #[pallet::call_index(0)]
         #[pallet::weight(T::WeightInfo::invite_smith())]
         pub fn invite_smith(
@@ -290,25 +321,25 @@ pub mod pallet {
         ) -> DispatchResultWithPostInfo {
             let who = ensure_signed(origin.clone())?;
             let issuer =
-                T::IdtyIdOf::convert(who.clone()).ok_or(Error::<T>::OriginMustHaveAnIdentity)?;
+                T::IdtyAttr::idty_index(who.clone()).ok_or(Error::<T>::OriginMustHaveAnIdentity)?;
             Self::check_invite_smith(issuer, receiver)?;
             Self::do_invite_smith(issuer, receiver);
             Ok(().into())
         }
 
-        /// Accept an invitation (must have been invited first)
+        /// Accept an invitation to become a Smith (must have been invited first).
         #[pallet::call_index(1)]
         #[pallet::weight(T::WeightInfo::accept_invitation())]
         pub fn accept_invitation(origin: OriginFor<T>) -> DispatchResultWithPostInfo {
             let who = ensure_signed(origin.clone())?;
             let receiver =
-                T::IdtyIdOf::convert(who.clone()).ok_or(Error::<T>::OriginMustHaveAnIdentity)?;
+                T::IdtyAttr::idty_index(who.clone()).ok_or(Error::<T>::OriginMustHaveAnIdentity)?;
             Self::check_accept_invitation(receiver)?;
             Self::do_accept_invitation(receiver)?;
             Ok(().into())
         }
 
-        /// Certify an invited smith which can lead the certified to become a Smith
+        /// Certify an invited Smith, which can lead the certified to become a Smith.
         #[pallet::call_index(2)]
         #[pallet::weight(T::WeightInfo::certify_smith())]
         pub fn certify_smith(
@@ -317,7 +348,7 @@ pub mod pallet {
         ) -> DispatchResultWithPostInfo {
             let who = ensure_signed(origin)?;
             let issuer =
-                T::IdtyIdOf::convert(who.clone()).ok_or(Error::<T>::OriginMustHaveAnIdentity)?;
+                T::IdtyAttr::idty_index(who.clone()).ok_or(Error::<T>::OriginMustHaveAnIdentity)?;
             Self::check_certify_smith(issuer, receiver)?;
             Self::do_certify_smith(receiver, issuer);
             Ok(().into())
@@ -326,6 +357,7 @@ pub mod pallet {
 }
 
 impl<T: Config> Pallet<T> {
+    /// Check conditions before inviting a potential Smith.
     fn check_invite_smith(
         issuer: T::IdtyIndex,
         receiver: T::IdtyIndex,
@@ -353,6 +385,7 @@ impl<T: Config> Pallet<T> {
         Ok(().into())
     }
 
+    /// Perform the invitation of a potential Smith.
     fn do_invite_smith(issuer: T::IdtyIndex, receiver: T::IdtyIndex) {
         let new_expires_on = CurrentSession::<T>::get() + T::SmithInactivityMaxDuration::get();
         let mut existing = Smiths::<T>::get(receiver).unwrap_or_default();
@@ -361,9 +394,10 @@ impl<T: Config> Pallet<T> {
         existing.received_certs = vec![];
         Smiths::<T>::insert(receiver, existing);
         ExpiresOn::<T>::append(new_expires_on, receiver);
-        Self::deposit_event(Event::<T>::InvitationSent { receiver, issuer });
+        Self::deposit_event(Event::<T>::InvitationSent { issuer, receiver });
     }
 
+    /// Check conditions before accepting an invitation to become a Smith.
     fn check_accept_invitation(receiver: T::IdtyIndex) -> DispatchResultWithPostInfo {
         let pretender_status = Smiths::<T>::get(receiver)
             .ok_or(Error::<T>::OriginHasNeverBeenInvited)?
@@ -375,6 +409,7 @@ impl<T: Config> Pallet<T> {
         Ok(().into())
     }
 
+    /// Accept the invitation to become a Smith.
     fn do_accept_invitation(receiver: T::IdtyIndex) -> DispatchResultWithPostInfo {
         Smiths::<T>::mutate(receiver, |maybe_smith_meta| {
             if let Some(smith_meta) = maybe_smith_meta {
@@ -387,6 +422,7 @@ impl<T: Config> Pallet<T> {
         Ok(().into())
     }
 
+    /// Check conditions before certifying a potential Smith.
     fn check_certify_smith(
         issuer_index: T::IdtyIndex,
         receiver_index: T::IdtyIndex,
@@ -430,6 +466,7 @@ impl<T: Config> Pallet<T> {
         Ok(().into())
     }
 
+    /// Perform certification of a potential Smith by another Smith.
     fn do_certify_smith(receiver: T::IdtyIndex, issuer: T::IdtyIndex) {
         // - adds a certification in issuer issued list
         Smiths::<T>::mutate(issuer, |maybe_smith_meta| {
@@ -443,7 +480,7 @@ impl<T: Config> Pallet<T> {
                 // - adds a certification in receiver received list
                 smith_meta.received_certs.push(issuer);
                 smith_meta.received_certs.sort();
-                Self::deposit_event(Event::<T>::SmithCertAdded { receiver, issuer });
+                Self::deposit_event(Event::<T>::SmithCertAdded { issuer, receiver });
 
                 // - receiving a certification either lead us to Pending or Smith status
                 let previous_status = smith_meta.status;
@@ -477,6 +514,7 @@ impl<T: Config> Pallet<T> {
         });
     }
 
+    /// Handle the removal of Smiths whose expiration time has been reached at a given session index.
     fn on_exclude_expired_smiths(at: SessionIndex) {
         if let Some(smiths_to_remove) = ExpiresOn::<T>::get(at) {
             for smith in smiths_to_remove {
@@ -491,12 +529,17 @@ impl<T: Config> Pallet<T> {
         }
     }
 
-    pub fn on_removed_wot_member(idty_index: T::IdtyIndex) {
+    /// Handle actions upon the removal of a Web of Trust member.
+    pub fn on_removed_wot_member(idty_index: T::IdtyIndex) -> Weight {
+        let mut weight = T::WeightInfo::on_removed_wot_member_empty();
         if Smiths::<T>::get(idty_index).is_some() {
             Self::_do_exclude_smith(idty_index, SmithRemovalReason::LostMembership);
+            weight = weight.saturating_add(T::WeightInfo::on_removed_wot_member());
         }
+        weight
     }
 
+    /// Perform the exclusion of a Smith.
     fn _do_exclude_smith(receiver: T::IdtyIndex, reason: SmithRemovalReason) {
         let mut lost_certs = vec![];
         Smiths::<T>::mutate(receiver, |maybe_smith_meta| {
@@ -517,8 +560,8 @@ impl<T: Config> Pallet<T> {
                     if let Ok(index) = smith_meta.issued_certs.binary_search(&receiver) {
                         smith_meta.issued_certs.remove(index);
                         Self::deposit_event(Event::<T>::SmithCertRemoved {
-                            receiver,
                             issuer: lost_cert_issuer,
+                            receiver,
                         });
                     }
                 }
@@ -531,6 +574,7 @@ impl<T: Config> Pallet<T> {
         });
     }
 
+    /// Handle the event when a Smith goes online.
     pub fn on_smith_goes_online(idty_index: T::IdtyIndex) {
         if let Some(smith_meta) = Smiths::<T>::get(idty_index) {
             if smith_meta.expires_on.is_some() {
@@ -545,6 +589,7 @@ impl<T: Config> Pallet<T> {
         }
     }
 
+    /// Handle the event when a Smith goes offline.
     pub fn on_smith_goes_offline(idty_index: T::IdtyIndex) {
         if let Some(smith_meta) = Smiths::<T>::get(idty_index) {
             if smith_meta.expires_on.is_none() {
@@ -561,6 +606,7 @@ impl<T: Config> Pallet<T> {
         }
     }
 
+    /// Provide whether the given identity index is a Smith.
     fn provide_is_member(idty_id: &T::IdtyIndex) -> bool {
         let Some(smith) = Smiths::<T>::get(idty_id) else {
             return false;
diff --git a/pallets/smith-members/src/mock.rs b/pallets/smith-members/src/mock.rs
index 2e7ddf15b5147d2ee1fc40cd7220bcecb198dfe8..27ecfe8854e244347001eaa979a30823d2146b8d 100644
--- a/pallets/smith-members/src/mock.rs
+++ b/pallets/smith-members/src/mock.rs
@@ -14,19 +14,16 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-#![cfg(test)]
-
 use crate::{self as pallet_smith_members};
-use frame_support::pallet_prelude::Hooks;
 use frame_support::{
+    pallet_prelude::Hooks,
     parameter_types,
     traits::{ConstU32, ConstU64},
     weights::{constants::RocksDbWeight, Weight},
 };
 use sp_core::H256;
-use sp_runtime::traits::{ConvertInto, IsMember};
 use sp_runtime::{
-    traits::{BlakeTwo256, IdentityLookup},
+    traits::{BlakeTwo256, ConvertInto, IdentityLookup, IsMember},
     BuildStorage, Perbill,
 };
 
@@ -57,16 +54,21 @@ impl frame_system::Config for Runtime {
     type Hashing = BlakeTwo256;
     type Lookup = IdentityLookup<Self::AccountId>;
     type MaxConsumers = ConstU32<16>;
+    type MultiBlockMigrator = ();
     type Nonce = u64;
     type OnKilledAccount = ();
     type OnNewAccount = ();
     type OnSetCode = ();
     type PalletInfo = PalletInfo;
+    type PostInherents = ();
+    type PostTransactions = ();
+    type PreInherents = ();
     type RuntimeCall = RuntimeCall;
     type RuntimeEvent = RuntimeEvent;
     type RuntimeOrigin = RuntimeOrigin;
     type RuntimeTask = ();
     type SS58Prefix = ();
+    type SingleBlockMigrations = ();
     type SystemWeightInfo = ();
     type Version = ();
 }
@@ -79,7 +81,7 @@ impl IsMember<u64> for EveryoneExceptIdZero {
 }
 
 impl pallet_smith_members::Config for Runtime {
-    type IdtyIdOf = ConvertInto;
+    type IdtyAttr = ();
     type IdtyIdOfAuthorityId = ConvertInto;
     type IdtyIndex = u64;
     type IsWoTMember = EveryoneExceptIdZero;
@@ -87,7 +89,6 @@ impl pallet_smith_members::Config for Runtime {
     type MemberId = u64;
     type MinCertForMembership = ConstU32<2>;
     type OnSmithDelete = ();
-    type OwnerKeyOf = ConvertInto;
     type RuntimeEvent = RuntimeEvent;
     type SmithInactivityMaxDuration = ConstU32<5>;
     type WeightInfo = ();
diff --git a/pallets/smith-members/src/tests.rs b/pallets/smith-members/src/tests.rs
index 3f30805ea6fba656fe715c527ebe9266db4f970e..0ac9ba7ed63137d4519d484f20523a607cc6c329 100644
--- a/pallets/smith-members/src/tests.rs
+++ b/pallets/smith-members/src/tests.rs
@@ -14,8 +14,6 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-#![cfg(test)]
-
 use super::*;
 use crate::mock::{new_test_ext, run_to_block, Runtime, RuntimeEvent, RuntimeOrigin, System};
 use frame_support::{assert_err, assert_ok};
diff --git a/pallets/smith-members/src/traits.rs b/pallets/smith-members/src/traits.rs
index f59b6fc1c775e15ba69e32704da9238516a18db4..3fc6aaecb1ca95189d91bbc60c5e25f21607e238 100644
--- a/pallets/smith-members/src/traits.rs
+++ b/pallets/smith-members/src/traits.rs
@@ -1,8 +1,11 @@
 use crate::SmithRemovalReason;
 
+/// Trait for handling actions when a Smith is deleted.
 pub trait OnSmithDelete<IdtyIndex> {
+    /// Handle the deletion of a smith.
     fn on_smith_delete(idty_index: IdtyIndex, reason: SmithRemovalReason);
 }
+
 impl<IdtyIndex> OnSmithDelete<IdtyIndex> for () {
     fn on_smith_delete(_: IdtyIndex, _: SmithRemovalReason) {}
 }
diff --git a/pallets/smith-members/src/types.rs b/pallets/smith-members/src/types.rs
index fcccd3468e8c6577e3dc68d9781fc3decc7b5c58..8399226517f42337ebc36b031d07d76c39dbdd0f 100644
--- a/pallets/smith-members/src/types.rs
+++ b/pallets/smith-members/src/types.rs
@@ -19,20 +19,19 @@
 use crate::SmithStatus;
 use codec::{Decode, Encode};
 use frame_support::pallet_prelude::*;
-use scale_info::TypeInfo;
+use scale_info::{prelude::vec::Vec, TypeInfo};
 use sp_staking::SessionIndex;
-use sp_std::vec::Vec;
 
-/// certification metadata attached to an identity
+/// Represents a certification metadata attached to a Smith identity.
 #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)]
 pub struct SmithMeta<IdtyIndex> {
-    /// current status of the smith
+    /// Current status of the Smith.
     pub status: SmithStatus,
-    /// the session at which the smith will expire (for lack of validation activity)
+    /// The session at which the Smith will expire (for lack of validation activity).
     pub expires_on: Option<SessionIndex>,
-    /// the certifications issued to other smiths
+    /// Certifications issued to other Smiths.
     pub issued_certs: Vec<IdtyIndex>,
-    /// the certifications received from other smiths
+    /// Certifications received from other Smiths.
     pub received_certs: Vec<IdtyIndex>,
 }
 
diff --git a/pallets/smith-members/src/weights.rs b/pallets/smith-members/src/weights.rs
index 76a6d6af7afaacfe3221db91195b65504f32305a..869d598f729e843b754f23730b8780253387d62d 100644
--- a/pallets/smith-members/src/weights.rs
+++ b/pallets/smith-members/src/weights.rs
@@ -23,6 +23,8 @@ pub trait WeightInfo {
     fn invite_smith() -> Weight;
     fn accept_invitation() -> Weight;
     fn certify_smith() -> Weight;
+    fn on_removed_wot_member() -> Weight;
+    fn on_removed_wot_member_empty() -> Weight;
 }
 
 impl WeightInfo for () {
@@ -37,4 +39,12 @@ impl WeightInfo for () {
     fn certify_smith() -> Weight {
         Weight::zero()
     }
+
+    fn on_removed_wot_member() -> Weight {
+        Weight::zero()
+    }
+
+    fn on_removed_wot_member_empty() -> Weight {
+        Weight::zero()
+    }
 }
diff --git a/pallets/universal-dividend/Cargo.toml b/pallets/universal-dividend/Cargo.toml
index 5fdfc69f5e85236bb3ec576abc7247b3052c4fad..8b03f528a6453ba7984506953ef627dde5fe91f4 100644
--- a/pallets/universal-dividend/Cargo.toml
+++ b/pallets/universal-dividend/Cargo.toml
@@ -40,7 +40,6 @@ std = [
 	"sp-core/std",
 	"sp-io/std",
 	"sp-runtime/std",
-	"sp-std/std",
 ]
 ### DOC ###
 
@@ -49,6 +48,7 @@ default-features = false
 targets = ["x86_64-unknown-linux-gnu"]
 
 [dependencies]
+duniter-primitives = { workspace = true }
 codec = { workspace = true, features = ["derive", "max-encoded-len"] }
 frame-benchmarking = { workspace = true, optional = true }
 frame-support = { workspace = true }
@@ -61,7 +61,6 @@ sp-arithmetic = { workspace = true }
 sp-core = { workspace = true }
 sp-io = { workspace = true }
 sp-runtime = { workspace = true }
-sp-std = { workspace = true }
 
 [dev-dependencies]
-sp-core = { workspace = true }
+sp-core = { workspace = true, default-features = true }
diff --git a/pallets/universal-dividend/README.md b/pallets/universal-dividend/README.md
deleted file mode 100644
index b7e862551d60c73dd215e25d31647c2357dfc4e0..0000000000000000000000000000000000000000
--- a/pallets/universal-dividend/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Duniter universal dividend pallet
-
-One of the main features of Duniter is the Universal Dividend based on the Relative Theory of Money. It is both a daily monetary creation and a measure unit.
-
-This pallet provides functions to create UDs and transfer an amount of currency counted in UD. It should be noted that the UD is not actually created every day on every account which would be very resource consuming but must be claimed by the member in a given extrinsic.
\ No newline at end of file
diff --git a/pallets/universal-dividend/src/benchmarking.rs b/pallets/universal-dividend/src/benchmarking.rs
index 8614441b3a2025c50ef9518a95d5e71f7f471723..0f43c27215c0d9f2ad9c97c450c1692d0665f43f 100644
--- a/pallets/universal-dividend/src/benchmarking.rs
+++ b/pallets/universal-dividend/src/benchmarking.rs
@@ -15,19 +15,14 @@
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
 #![cfg(feature = "runtime-benchmarks")]
+#![allow(clippy::multiple_bound_locations)]
 
 use super::*;
-
 use core::num::NonZeroU16;
-use frame_benchmarking::v2::*;
-use frame_benchmarking::{account, whitelisted_caller};
-use frame_support::pallet_prelude::IsType;
-use frame_support::traits::Get;
-use frame_support::traits::StoredMap;
+use frame_benchmarking::{account, v2::*, whitelisted_caller};
+use frame_support::{pallet_prelude::IsType, traits::StoredMap};
 use frame_system::RawOrigin;
 use pallet_balances::Pallet as Balances;
-use sp_runtime::traits::Bounded;
-use sp_runtime::traits::Convert;
 
 use crate::Pallet;
 
@@ -36,7 +31,7 @@ const ED_MULTIPLIER: u32 = 10;
 #[benchmarks(
         where
         T: pallet_balances::Config, T::Balance: From<u64>,
-        <T::Currency as Currency<T::AccountId>>::Balance: IsType<T::Balance>
+        BalanceOf<T>: IsType<T::Balance>
 )]
 mod benchmarks {
     use super::*;
@@ -50,7 +45,7 @@ mod benchmarks {
         // Benchmark `transfer_ud` extrinsic with the worst possible conditions:
         // * Transfer will kill the sender account.
         // * Transfer will create the recipient account.
-        let caller: T::AccountId = T::AccountIdOf::convert(1).unwrap();
+        let caller: T::AccountId = T::IdtyAttr::owner_key(1).unwrap();
         CurrentUdIndex::<T>::put(2054u16);
         T::MembersStorage::insert(
             &caller,
@@ -83,7 +78,7 @@ mod benchmarks {
         let existential_deposit = T::ExistentialDeposit::get();
         let caller = whitelisted_caller();
         let balance = existential_deposit.saturating_mul(ED_MULTIPLIER.into());
-        let _ = T::Currency::make_free_balance_be(&caller, balance.into());
+        let _ = T::Currency::set_balance(&caller, balance.into());
         // Transfer `e - 1` existential deposits + 1 unit, which guarantees to create one account and reap this user.
         let recipient: T::AccountId = account("recipient", 0, 1);
         let recipient_lookup: <T::Lookup as StaticLookup>::Source =
@@ -113,10 +108,7 @@ mod benchmarks {
         let recipient_lookup: <T::Lookup as StaticLookup>::Source =
             T::Lookup::unlookup(recipient.clone());
         // Give the sender account max funds, thus a transfer will not kill account.
-        let _ = T::Currency::make_free_balance_be(
-            &caller,
-            <T::Currency as Currency<T::AccountId>>::Balance::max_value(),
-        );
+        let _ = T::Currency::set_balance(&caller, u32::MAX.into());
         let existential_deposit = T::ExistentialDeposit::get();
         let transfer_amount = existential_deposit.saturating_mul(ED_MULTIPLIER.into());
         let transfer_amount_ud =
@@ -135,7 +127,7 @@ mod benchmarks {
 
     #[benchmark]
     fn on_removed_member(i: Linear<1, { T::MaxPastReeval::get() }>) -> Result<(), BenchmarkError> {
-        let caller: T::AccountId = T::AccountIdOf::convert(1).unwrap();
+        let caller: T::AccountId = T::IdtyAttr::owner_key(1).unwrap();
         CurrentUdIndex::<T>::put(2054u16);
         T::MembersStorage::insert(
             &caller,
diff --git a/pallets/universal-dividend/src/compute_claim_uds.rs b/pallets/universal-dividend/src/compute_claim_uds.rs
index e932e8482d33441a5d3bc63c6df1ce38d16535fd..7d58edcea4bbdb5061eca67b188380c54045d492 100644
--- a/pallets/universal-dividend/src/compute_claim_uds.rs
+++ b/pallets/universal-dividend/src/compute_claim_uds.rs
@@ -15,7 +15,6 @@
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
 use super::UdIndex;
-use core::iter::DoubleEndedIterator;
 use sp_arithmetic::traits::{AtLeast32BitUnsigned, Zero};
 
 pub(super) fn compute_claim_uds<Balance: AtLeast32BitUnsigned>(
diff --git a/pallets/universal-dividend/src/lib.rs b/pallets/universal-dividend/src/lib.rs
index a360fbdf4a9cac88631fd1353e33822fa57fdea2..70518f7fd0f83752431c2e5f5c69a5385401cde9 100644
--- a/pallets/universal-dividend/src/lib.rs
+++ b/pallets/universal-dividend/src/lib.rs
@@ -14,22 +14,42 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
+//! # Duniter Universal Dividend Pallet
+//!
+//! One of Duniter's core features is the Universal Dividend (UD), which operates based on the Relative Theory of Money. The UD serves both as a daily monetary creation mechanism and a unit of measure within the Duniter ecosystem.
+//!
+//! ## Overview
+//!
+//! This pallet enables:
+//! - Creation of Universal Dividends (UD) as a daily monetary issuance and measure unit.
+//! - Transfer of currency denominated in UD between accounts.
+//!
+//! **Note**: The UD is not automatically created daily for every account due to resource constraints. Instead, members must claim their UD using a specific extrinsic.
+
 #![cfg_attr(not(feature = "std"), no_std)]
 
 mod benchmarking;
 mod compute_claim_uds;
+mod types;
+mod weights;
+
 #[cfg(test)]
 mod mock;
 #[cfg(test)]
 mod tests;
-mod types;
-mod weights;
+
+#[cfg(feature = "runtime-benchmarks")]
+use duniter_primitives::Idty;
 
 pub use pallet::*;
 pub use types::*;
 pub use weights::WeightInfo;
 
-use frame_support::traits::{tokens::ExistenceRequirement, Currency, OnTimestampSet};
+use frame_support::traits::{
+    fungible::{self, Balanced, Mutate},
+    tokens::{Precision, Preservation},
+    OnTimestampSet,
+};
 use sp_arithmetic::{
     per_things::Perbill,
     traits::{One, Saturating, Zero},
@@ -39,72 +59,78 @@ use sp_runtime::traits::{Get, MaybeSerializeDeserialize, StaticLookup};
 #[frame_support::pallet]
 pub mod pallet {
     use super::*;
-    use frame_support::pallet_prelude::*;
-    use frame_support::traits::{StorageVersion, StoredMap};
+    use frame_support::{
+        pallet_prelude::*,
+        traits::{StorageVersion, StoredMap},
+    };
     use frame_system::pallet_prelude::*;
     use sp_runtime::traits::Convert;
 
-    pub type BalanceOf<T> =
-        <<T as Config>::Currency as Currency<<T as frame_system::Config>::AccountId>>::Balance;
+    type AccountIdOf<T> = <T as frame_system::Config>::AccountId;
+    pub type BalanceOf<T> = <<T as Config>::Currency as fungible::Inspect<AccountIdOf<T>>>::Balance;
 
     /// The current storage version.
     const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);
 
     #[pallet::pallet]
     #[pallet::storage_version(STORAGE_VERSION)]
-    //#[pallet::without_storage_info]
     pub struct Pallet<T>(_);
 
     #[pallet::config]
     pub trait Config: frame_system::Config + pallet_timestamp::Config {
-        // Moment into Balance converter
+        /// Something that convert a Moment inot a Balance.
         type MomentIntoBalance: Convert<Self::Moment, BalanceOf<Self>>;
-        // The currency
-        type Currency: Currency<Self::AccountId>;
+
+        /// The currency type used in this pallet.
+        type Currency: fungible::Balanced<Self::AccountId> + fungible::Mutate<Self::AccountId>;
+
         /// Maximum number of past UD revaluations to keep in storage.
         #[pallet::constant]
         type MaxPastReeval: Get<u32>;
-        /// Somethings that must provide the number of accounts allowed to create the universal dividend
+
+        /// Provides the number of accounts allowed to create the universal dividend.
         type MembersCount: Get<BalanceOf<Self>>;
-        /// Somethings that must provide the list of accounts ids allowed to create the universal dividend
+
+        /// Storage for mapping AccountId to their first eligible UD creation time.
         type MembersStorage: frame_support::traits::StoredMap<Self::AccountId, FirstEligibleUd>;
-        /// Because this pallet emits events, it depends on the runtime's definition of an event.
+
+        /// The overarching event type for this pallet.
         type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
-        /// Square of the money growth rate per ud reevaluation period
+
+        /// Square of the money growth rate per UD reevaluation period.
         #[pallet::constant]
         type SquareMoneyGrowthRate: Get<Perbill>;
-        /// Universal dividend creation period (ms)
+
+        /// Universal dividend creation period in milliseconds.
         #[pallet::constant]
         type UdCreationPeriod: Get<Self::Moment>;
-        /// Universal dividend reevaluation period (ms)
+
+        /// Universal dividend reevaluation period in milliseconds.
         #[pallet::constant]
         type UdReevalPeriod: Get<Self::Moment>;
-        /// The number of units to divide the amounts expressed in number of UDs
-        /// Example: If you wish to express the UD amounts with a maximum precision of the order
-        /// of the milliUD, choose 1000
-        #[pallet::constant]
-        type UnitsPerUd: Get<BalanceOf<Self>>;
-        /// Pallet weights info
+
+        /// Type representing the weight of this pallet.
         type WeightInfo: WeightInfo;
+
+        /// Something that gives the IdtyIndex of an AccountId and reverse, used for benchmarks.
         #[cfg(feature = "runtime-benchmarks")]
-        type AccountIdOf: Convert<u32, Option<Self::AccountId>>;
+        type IdtyAttr: duniter_primitives::Idty<u32, Self::AccountId>;
     }
 
     // STORAGE //
 
-    /// Current UD amount
+    /// The current Universal Dividend value.
     #[pallet::storage]
     #[pallet::getter(fn current_ud)]
     pub type CurrentUd<T: Config> = StorageValue<_, BalanceOf<T>, ValueQuery>;
 
-    // default value for number of the next UD
+    /// The default index for the current Universal Dividend.
     #[pallet::type_value]
     pub fn DefaultForCurrentUdIndex() -> UdIndex {
         1
     }
 
-    /// Current UD index
-    // (more like the index of the ongoing UD = the next one)
+    /// The current Universal Dividend index.
     #[pallet::storage]
     #[pallet::getter(fn ud_index)]
     pub type CurrentUdIndex<T: Config> =
@@ -125,22 +151,22 @@ pub mod pallet {
         ConstU32<300_000>,
     >;
 
-    /// Total quantity of money created by universal dividend (does not take into account the possible destruction of money)
+    /// The total quantity of money created by Universal Dividend, excluding potential money destruction.
     #[pallet::storage]
     #[pallet::getter(fn total_money_created)]
     pub type MonetaryMass<T: Config> = StorageValue<_, BalanceOf<T>, ValueQuery>;
 
-    /// Next UD reevaluation
+    /// The next Universal Dividend re-evaluation.
     #[pallet::storage]
     #[pallet::getter(fn next_reeval)]
     pub type NextReeval<T: Config> = StorageValue<_, T::Moment, OptionQuery>;
 
-    /// Next UD creation
+    /// The next Universal Dividend creation.
     #[pallet::storage]
     #[pallet::getter(fn next_ud)]
     pub type NextUd<T: Config> = StorageValue<_, T::Moment, OptionQuery>;
 
-    /// Past UD reevaluations
+    /// The past Universal Dividend re-evaluations.
     #[pallet::storage]
     #[pallet::getter(fn past_reevals)]
     pub type PastReevals<T: Config> =
@@ -181,7 +207,7 @@ pub mod pallet {
                 initial_monetary_mass: Default::default(),
                 #[cfg(test)]
                 initial_members: Default::default(),
-                ud: Default::default(),
+                ud: BalanceOf::<T>::one(),
             }
         }
     }
@@ -305,7 +331,7 @@ pub mod pallet {
                             core::num::NonZeroU16::new(current_ud_index)
                                 .expect("unreachable because current_ud_index is never zero."),
                         );
-                        let _ = T::Currency::deposit_creating(who, uds_total);
+                        let _ = T::Currency::deposit(who, uds_total, Precision::Exact);
                         Self::deposit_event(Event::UdsClaimed {
                             count: uds_count,
                             total: uds_total,
@@ -319,12 +345,12 @@ pub mod pallet {
             })
         }
 
-        /// like balance.transfer, but give an amount in UD
+        /// like balance.transfer, but give an amount in milliUD
         fn do_transfer_ud(
             origin: OriginFor<T>,
             dest: <T::Lookup as StaticLookup>::Source,
             value: BalanceOf<T>,
-            existence_requirement: ExistenceRequirement,
+            preservation: Preservation,
         ) -> DispatchResultWithPostInfo {
             let who = ensure_signed(origin)?;
             let dest = T::Lookup::lookup(dest)?;
@@ -332,8 +358,8 @@ pub mod pallet {
             T::Currency::transfer(
                 &who,
                 &dest,
-                value.saturating_mul(ud_amount) / T::UnitsPerUd::get(),
-                existence_requirement,
+                value.saturating_mul(ud_amount) / 1_000u32.into(),
+                preservation,
             )?;
             Ok(().into())
         }
@@ -395,7 +421,7 @@ pub mod pallet {
 
     #[pallet::call]
     impl<T: Config> Pallet<T> {
-        /// Claim Universal Dividends
+        /// Claim Universal Dividends.
         #[pallet::call_index(0)]
         #[pallet::weight(<T as pallet::Config>::WeightInfo::claim_uds(T::MaxPastReeval::get()))]
         pub fn claim_uds(origin: OriginFor<T>) -> DispatchResultWithPostInfo {
@@ -411,10 +437,10 @@ pub mod pallet {
             dest: <T::Lookup as StaticLookup>::Source,
             #[pallet::compact] value: BalanceOf<T>,
         ) -> DispatchResultWithPostInfo {
-            Self::do_transfer_ud(origin, dest, value, ExistenceRequirement::AllowDeath)
+            Self::do_transfer_ud(origin, dest, value, Preservation::Expendable)
         }
 
-        /// Transfer some liquid free balance to another account, in milliUD.
+        /// Transfer some liquid free balance to another account in milliUD and keep the account alive.
         #[pallet::call_index(2)]
         #[pallet::weight(<T as pallet::Config>::WeightInfo::transfer_ud_keep_alive())]
         pub fn transfer_ud_keep_alive(
@@ -422,19 +448,19 @@ pub mod pallet {
             dest: <T::Lookup as StaticLookup>::Source,
             #[pallet::compact] value: BalanceOf<T>,
         ) -> DispatchResultWithPostInfo {
-            Self::do_transfer_ud(origin, dest, value, ExistenceRequirement::KeepAlive)
+            Self::do_transfer_ud(origin, dest, value, Preservation::Preserve)
         }
     }
 
     // PUBLIC FUNCTIONS
 
     impl<T: Config> Pallet<T> {
+        /// Initialize the first eligible Universal Dividend index.
         pub fn init_first_eligible_ud() -> FirstEligibleUd {
             CurrentUdIndex::<T>::get().into()
         }
 
-        /// function to call when removing a member
-        /// auto-claims UDs
+        /// Handle the removal of a member, which automatically claims Universal Dividends.
         pub fn on_removed_member(first_ud_index: UdIndex, who: &T::AccountId) -> Weight {
             let current_ud_index = CurrentUdIndex::<T>::get();
             if first_ud_index < current_ud_index {
@@ -443,7 +469,7 @@ pub mod pallet {
                     first_ud_index,
                     PastReevals::<T>::get().into_iter(),
                 );
-                let _ = T::Currency::deposit_creating(who, uds_total);
+                let _ = T::Currency::deposit(who, uds_total, Precision::Exact);
                 Self::deposit_event(Event::UdsAutoPaid {
                     count: uds_count,
                     total: uds_total,
diff --git a/pallets/universal-dividend/src/mock.rs b/pallets/universal-dividend/src/mock.rs
index ada04634e5c57e11dfdf220e3610c8b3828e9723..233ec61e7aa9e8c538c362a05036e56b6eec9835 100644
--- a/pallets/universal-dividend/src/mock.rs
+++ b/pallets/universal-dividend/src/mock.rs
@@ -27,9 +27,6 @@ use sp_runtime::{
     BuildStorage,
 };
 
-#[cfg(feature = "runtime-benchmarks")]
-use sp_runtime::traits::ConvertInto;
-
 pub const BLOCK_TIME: u64 = 6_000;
 
 type Balance = u64;
@@ -64,16 +61,21 @@ impl system::Config for Test {
     type Hashing = BlakeTwo256;
     type Lookup = IdentityLookup<Self::AccountId>;
     type MaxConsumers = frame_support::traits::ConstU32<16>;
+    type MultiBlockMigrator = ();
     type Nonce = u64;
     type OnKilledAccount = ();
     type OnNewAccount = ();
     type OnSetCode = ();
     type PalletInfo = PalletInfo;
+    type PostInherents = ();
+    type PostTransactions = ();
+    type PreInherents = ();
     type RuntimeCall = RuntimeCall;
     type RuntimeEvent = RuntimeEvent;
     type RuntimeOrigin = RuntimeOrigin;
     type RuntimeTask = ();
     type SS58Prefix = SS58Prefix;
+    type SingleBlockMigrations = ();
     type SystemWeightInfo = ();
     type Version = ();
 }
@@ -101,7 +103,6 @@ impl pallet_balances::Config for Test {
     type ExistentialDeposit = ExistentialDeposit;
     type FreezeIdentifier = ();
     type MaxFreezes = ConstU32<0>;
-    type MaxHolds = ConstU32<0>;
     type MaxLocks = MaxLocks;
     type MaxReserves = ();
     type ReserveIdentifier = [u8; 8];
@@ -138,9 +139,9 @@ impl frame_support::traits::StoredMap<u32, FirstEligibleUd> for TestMembersStora
 }
 
 impl pallet_universal_dividend::Config for Test {
-    #[cfg(feature = "runtime-benchmarks")]
-    type AccountIdOf = ConvertInto;
     type Currency = pallet_balances::Pallet<Test>;
+    #[cfg(feature = "runtime-benchmarks")]
+    type IdtyAttr = ();
     type MaxPastReeval = frame_support::traits::ConstU32<2>;
     type MembersCount = MembersCount;
     type MembersStorage = TestMembersStorage;
@@ -149,7 +150,6 @@ impl pallet_universal_dividend::Config for Test {
     type SquareMoneyGrowthRate = SquareMoneyGrowthRate;
     type UdCreationPeriod = UdCreationPeriod;
     type UdReevalPeriod = UdReevalPeriod;
-    type UnitsPerUd = frame_support::traits::ConstU64<1_000>;
     type WeightInfo = ();
 }
 
diff --git a/pallets/universal-dividend/src/types.rs b/pallets/universal-dividend/src/types.rs
index da94dd22d1da1f293986fc821f92a90c6630c3e5..bc5bcd7214fbd2a8514064b6a0d66d83670e168b 100644
--- a/pallets/universal-dividend/src/types.rs
+++ b/pallets/universal-dividend/src/types.rs
@@ -16,11 +16,12 @@
 
 use codec::{Decode, Encode, Error, Input, MaxEncodedLen, Output};
 use core::num::NonZeroU16;
+use scale_info::prelude::vec::Vec;
 use sp_runtime::RuntimeDebug;
-use sp_std::vec::Vec;
 
 pub type UdIndex = u16;
 
+/// Represents the first eligible Universal Dividend.
 #[derive(
     Clone, Copy, Default, Eq, PartialEq, RuntimeDebug, serde::Deserialize, serde::Serialize,
 )]
diff --git a/pallets/upgrade-origin/Cargo.toml b/pallets/upgrade-origin/Cargo.toml
index b1f08f0bced4e8a5baac966d5b1a5677cb41dd15..65646fcf2a210f21f79f4002778e798bfae69fe2 100644
--- a/pallets/upgrade-origin/Cargo.toml
+++ b/pallets/upgrade-origin/Cargo.toml
@@ -32,7 +32,6 @@ std = [
 	"sp-io/std",
 	"sp-runtime/std",
 	"sp-staking/std",
-	"sp-std/std",
 ]
 
 [package.metadata.docs.rs]
@@ -49,4 +48,3 @@ sp-core = { workspace = true }
 sp-io = { workspace = true }
 sp-runtime = { workspace = true }
 sp-staking = { workspace = true }
-sp-std = { workspace = true }
diff --git a/pallets/upgrade-origin/README.md b/pallets/upgrade-origin/README.md
deleted file mode 100644
index 204c2a034feefc807118bd55572fc21b5c5be25c..0000000000000000000000000000000000000000
--- a/pallets/upgrade-origin/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Duniter upgrade origin pallet
-
-TODO
\ No newline at end of file
diff --git a/pallets/upgrade-origin/src/benchmarking.rs b/pallets/upgrade-origin/src/benchmarking.rs
index 33821436d4bf96c90e6b9602e5e731c093d2ce70..6a273f28a1197a0c77c97def61b1da5225ffd2c1 100644
--- a/pallets/upgrade-origin/src/benchmarking.rs
+++ b/pallets/upgrade-origin/src/benchmarking.rs
@@ -21,6 +21,7 @@ use super::*;
 use crate::Pallet;
 use frame_benchmarking::v2::*;
 use frame_support::traits::Get;
+use scale_info::prelude::vec;
 
 #[benchmarks]
 mod benchmarks {
diff --git a/pallets/upgrade-origin/src/lib.rs b/pallets/upgrade-origin/src/lib.rs
index 15ebd1ae95c4aa18d78e2dd45d24f411646b3625..d98c21f84b3f2870ff4ecff6f91d84c923881a3f 100644
--- a/pallets/upgrade-origin/src/lib.rs
+++ b/pallets/upgrade-origin/src/lib.rs
@@ -24,12 +24,11 @@ pub use pallet::*;
 pub use weights::WeightInfo;
 
 use frame_support::{
-    dispatch::GetDispatchInfo,
-    dispatch::PostDispatchInfo,
+    dispatch::{GetDispatchInfo, PostDispatchInfo},
     traits::{IsSubType, UnfilteredDispatchable},
 };
+use scale_info::prelude::boxed::Box;
 use sp_runtime::traits::Dispatchable;
-use sp_std::prelude::*;
 
 #[frame_support::pallet]
 pub mod pallet {
@@ -55,18 +54,18 @@ pub mod pallet {
         /// The overarching event type.
         type RuntimeEvent: From<Event> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
 
-        /// The upgradable origin
+        /// The origin type required for performing upgradable operations.
         type UpgradableOrigin: EnsureOrigin<Self::RuntimeOrigin>;
 
-        /// Pallet weights info
+        /// Type representing the weight of this pallet.
         type WeightInfo: WeightInfo;
 
+        /// Type representing the worst case origin type used in weight benchmarks.
         #[cfg(feature = "runtime-benchmarks")]
-        /// The worst case origin type to use in weights benchmarking
         type WorstCaseOriginType: Into<Self::RuntimeOrigin>;
 
+        /// Retrieves the worst case origin for use in weight benchmarks.
         #[cfg(feature = "runtime-benchmarks")]
-        /// The worst case origin to use in weights benchmarking
         type WorstCaseOrigin: Get<Self::WorstCaseOriginType>;
     }
 
diff --git a/primitives/distance/Cargo.toml b/primitives/distance/Cargo.toml
index 9c035c38be1091c0d33dbbea6069c0ec0860756c..843ef11b794f2826c94c53b4ccfb7cb1332e2249 100644
--- a/primitives/distance/Cargo.toml
+++ b/primitives/distance/Cargo.toml
@@ -23,7 +23,6 @@ std = [
 	"serde/std",
 	"sp-inherents/std",
 	"sp-runtime/std",
-	"sp-std/std",
 	"thiserror",
 ]
 try-runtime = ["frame-support/try-runtime", "sp-runtime/try-runtime"]
@@ -37,5 +36,4 @@ scale-info = { workspace = true, features = ["derive"] }
 serde = { workspace = true, features = ["derive"] }
 sp-inherents = { workspace = true }
 sp-runtime = { workspace = true }
-sp-std = { workspace = true }
 thiserror = { workspace = true, optional = true }
diff --git a/primitives/distance/src/lib.rs b/primitives/distance/src/lib.rs
index bf878cc9b6a201e456c463aaac6e05fa96a1008f..acaf53c381bfe586b6dc48980875e1ab2f597faa 100644
--- a/primitives/distance/src/lib.rs
+++ b/primitives/distance/src/lib.rs
@@ -22,19 +22,17 @@
 use codec::{Decode, Encode};
 use frame_support::pallet_prelude::RuntimeDebug;
 use scale_info::TypeInfo;
-//#[cfg(feature = "std")]
-//use serde::{Deserialize, Serialize};
 use sp_inherents::{InherentData, InherentIdentifier, IsFatalError};
 use sp_runtime::Perbill;
-use sp_std::vec::Vec;
 #[cfg(feature = "std")]
 use std::marker::PhantomData;
 
 pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"distanc0";
 
+/// Represents the result of a distance computation.
 #[derive(Clone, Decode, Encode, PartialEq, RuntimeDebug, TypeInfo)]
 pub struct ComputationResult {
-    pub distances: Vec<Perbill>,
+    pub distances: scale_info::prelude::vec::Vec<Perbill>,
 }
 
 #[derive(Encode, sp_runtime::RuntimeDebug)]
diff --git a/primitives/duniter/src/lib.rs b/primitives/duniter/src/lib.rs
index 44c1257daa6733ae87dc50eac5a89bf8a9a3ae66..0dccbe9d79abdcaa5b9b6be2a57b2e1b9ab6d68b 100644
--- a/primitives/duniter/src/lib.rs
+++ b/primitives/duniter/src/lib.rs
@@ -16,19 +16,19 @@
 
 #![cfg_attr(not(feature = "std"), no_std)]
 
-/// Rules for valid identity names are defined below
-/// - Bound length to 42
-/// - accept only ascii alphanumeric or - or _
+/// Checks rules for valid identity names
+/// - Limit length to 42
+/// - Accept only ascii alphanumeric or `-` or `_`
 pub fn validate_idty_name(idty_name: &[u8]) -> bool {
     idty_name.len() >= 3
-        && idty_name.len() <= 42 // length smaller than 42
-        // all characters are alphanumeric or - or _
+        && idty_name.len() <= 42
         && idty_name
             .iter()
             .all(|c| c.is_ascii_alphanumeric() || *c == b'-' || *c == b'_')
 }
 
 /// trait used to go from index to owner key and reverse
+// replaces less explicit "Convert" implementations
 pub trait Idty<IdtyIndex, AccountId> {
     fn owner_key(index: IdtyIndex) -> Option<AccountId>;
     fn idty_index(owner_key: AccountId) -> Option<IdtyIndex>;
diff --git a/primitives/membership/Cargo.toml b/primitives/membership/Cargo.toml
index 0a79733901f4d79ddcc017acbe669a4ef595a6dc..88c35eb41428a2387fae0f36aca2bac19a0ea16c 100644
--- a/primitives/membership/Cargo.toml
+++ b/primitives/membership/Cargo.toml
@@ -21,17 +21,13 @@ std = [
 	"scale-info/std",
 	"serde/std",
 	"sp-runtime/std",
-	"sp-std/std",
 ]
 try-runtime = ["frame-support/try-runtime", "sp-runtime/try-runtime"]
 runtime-benchmarks = []
 
 [dependencies]
-
 codec = { workspace = true, features = ["derive"] }
 frame-support = { workspace = true }
-impl-trait-for-tuples = { workspace = true }
 scale-info = { workspace = true, features = ["derive"] }
 serde = { workspace = true }
 sp-runtime = { workspace = true }
-sp-std = { workspace = true }
diff --git a/primitives/membership/src/lib.rs b/primitives/membership/src/lib.rs
index 64f7f821f1ec8a9dd05b77d1491b3c6b9479e490..96e37af823353829e8014756053b371d5a77bb11 100644
--- a/primitives/membership/src/lib.rs
+++ b/primitives/membership/src/lib.rs
@@ -22,12 +22,12 @@
 pub mod traits;
 
 use codec::{Decode, Encode};
-use frame_support::pallet_prelude::RuntimeDebug;
+use frame_support::pallet_prelude::{RuntimeDebug, Weight};
 
 use scale_info::TypeInfo;
 use serde::{Deserialize, Serialize};
 
-/// membership events
+/// Represent membership-related events.
 pub enum Event<IdtyId> {
     /// A membership was acquired.
     MembershipAdded(IdtyId),
@@ -37,6 +37,7 @@ pub enum Event<IdtyId> {
     MembershipRenewed(IdtyId),
 }
 
+/// Represent membership data.
 #[derive(
     Encode,
     Decode,
@@ -54,14 +55,14 @@ pub struct MembershipData<BlockNumber: Decode + Encode + TypeInfo> {
     pub expire_on: BlockNumber,
 }
 
-use impl_trait_for_tuples::impl_for_tuples;
-// use sp_std::prelude::*;
-// use frame_support::pallet_prelude::*;
-// use frame_system::pallet_prelude::*;
+impl<IdtyId> traits::OnNewMembership<IdtyId> for () {
+    fn on_created(_idty_index: &IdtyId) {}
 
-#[impl_for_tuples(5)]
-impl<IdtyId> traits::OnEvent<IdtyId> for Tuple {
-    fn on_event(event: &Event<IdtyId>) {
-        for_tuples!( #( Tuple::on_event(event); )* );
+    fn on_renewed(_idty_index: &IdtyId) {}
+}
+
+impl<IdtyId> traits::OnRemoveMembership<IdtyId> for () {
+    fn on_removed(_idty_index: &IdtyId) -> Weight {
+        Weight::zero()
     }
 }
diff --git a/primitives/membership/src/traits.rs b/primitives/membership/src/traits.rs
index a877fa9fb1643804e47a6c30dc1b565f4961c485..7eef2c1bfe83e77a9d74cf30974bbd12d062061f 100644
--- a/primitives/membership/src/traits.rs
+++ b/primitives/membership/src/traits.rs
@@ -16,8 +16,11 @@
 
 use frame_support::pallet_prelude::*;
 
+/// A trait defining operations for checking if membership-related operations are allowed.
 pub trait CheckMembershipOpAllowed<IdtyId> {
+    /// Checks if adding a membership is allowed.
     fn check_add_membership(idty_id: IdtyId) -> Result<(), DispatchError>;
+    /// Checks if renewing a membership is allowed.
     fn check_renew_membership(idty_id: IdtyId) -> Result<(), DispatchError>;
 }
 
@@ -31,14 +34,22 @@ impl<IdtyId> CheckMembershipOpAllowed<IdtyId> for () {
     }
 }
 
-pub trait OnEvent<IdtyId> {
-    fn on_event(event: &crate::Event<IdtyId>);
+/// A trait defining behavior for handling new memberships and membership renewals.
+pub trait OnNewMembership<IdtyId> {
+    /// Called when a new membership is created.
+    fn on_created(idty_index: &IdtyId);
+    /// Called when a membership is renewed.
+    fn on_renewed(idty_index: &IdtyId);
 }
 
-// impl<IdtyId> OnEvent<IdtyId> for () {
-//     fn on_event(_: &crate::Event<IdtyId>) {}
-// }
+/// A trait defining operations for handling the removal of memberships.
+pub trait OnRemoveMembership<IdtyId> {
+    /// Called when a membership is removed.
+    fn on_removed(idty_index: &IdtyId) -> Weight;
+}
 
+/// A trait defining an operation to retrieve the count of members.
 pub trait MembersCount {
+    /// The count of members.
     fn members_count() -> u32;
 }
diff --git a/resources/debian/distance-oracle.service b/resources/debian/distance-oracle.service
new file mode 100644
index 0000000000000000000000000000000000000000..66fe13e536b2ee0055d081f11f196e03fb273638
--- /dev/null
+++ b/resources/debian/distance-oracle.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Duniter distance oracle.
+Requires=duniter-smith.service
+After=duniter-smith.service
+
+[Service]
+EnvironmentFile=/etc/duniter/env_file
+ExecStart=/usr/bin/duniter2 distance-oracle --evaluation-result-dir ${BASE_PATH}/chains/${DUNITER_CHAIN_NAME}/distance --rpc-url ${ORACLE_RPC_URL} --log ${ORACLE_LOG_LEVEL}
+User=duniter
+Group=duniter
diff --git a/resources/debian/distance-oracle.timer b/resources/debian/distance-oracle.timer
new file mode 100644
index 0000000000000000000000000000000000000000..de70093292fb6c3c65379a854e8e180feb61e43e
--- /dev/null
+++ b/resources/debian/distance-oracle.timer
@@ -0,0 +1,10 @@
+[Unit]
+Description=Duniter distance oracle timer.
+
+[Timer]
+EnvironmentFile=/etc/duniter/env_file
+OnBootSec=1min
+OnUnitActiveSec=2min
+
+[Install]
+WantedBy=multi-user.target
diff --git a/resources/debian/duniter-mirror.service b/resources/debian/duniter-mirror.service
new file mode 100644
index 0000000000000000000000000000000000000000..f48e1f2fb594b862bfe8afdf7771643fc97e30c2
--- /dev/null
+++ b/resources/debian/duniter-mirror.service
@@ -0,0 +1,37 @@
+# Inspired from https://github.com/paritytech/polkadot-sdk/blob/master/polkadot/scripts/packaging/polkadot.service
+[Unit]
+Description=Duniter mirror node.
+
+[Service]
+EnvironmentFile=/etc/duniter/env_file
+ExecStart=/usr/bin/duniter2 --chain ${DUNITER_CHAIN_NAME} --name ${DUNITER_NODE_NAME}_mirror --listen-addr ${DUNITER_LISTEN_ADDR} --rpc-cors ${DUNITER_RPC_CORS} --state-pruning ${DUNITER_PRUNING_PROFILE} --base-path ${BASE_PATH}
+User=duniter
+Group=duniter
+Restart=always
+RestartSec=120
+CapabilityBoundingSet=
+LockPersonality=true
+NoNewPrivileges=true
+PrivateDevices=true
+PrivateMounts=true
+PrivateTmp=true
+PrivateUsers=true
+ProtectClock=true
+ProtectControlGroups=true
+ProtectHostname=true
+ProtectKernelModules=true
+ProtectKernelTunables=true
+ProtectSystem=strict
+RemoveIPC=true
+RestrictAddressFamilies=AF_INET AF_INET6 AF_NETLINK AF_UNIX
+RestrictNamespaces=false
+RestrictSUIDSGID=true
+SystemCallArchitectures=native
+SystemCallFilter=@system-service
+SystemCallFilter=landlock_add_rule landlock_create_ruleset landlock_restrict_self seccomp mount umount2
+SystemCallFilter=~@clock @module @reboot @swap @privileged
+SystemCallFilter=pivot_root
+UMask=0027
+
+[Install]
+WantedBy=multi-user.target
diff --git a/resources/debian/duniter-smith.service b/resources/debian/duniter-smith.service
new file mode 100644
index 0000000000000000000000000000000000000000..5b6ebd9d9465ea566acbf40555209e5bf6268c94
--- /dev/null
+++ b/resources/debian/duniter-smith.service
@@ -0,0 +1,37 @@
+# Inspired from https://github.com/paritytech/polkadot-sdk/blob/master/polkadot/scripts/packaging/polkadot.service
+[Unit]
+Description=Duniter smith node.
+
+[Service]
+EnvironmentFile=/etc/duniter/env_file
+ExecStart=/usr/bin/duniter2 --chain ${DUNITER_CHAIN_NAME} --name ${DUNITER_NODE_NAME}_smith --listen-addr ${DUNITER_LISTEN_ADDR} --rpc-cors ${DUNITER_RPC_CORS} --state-pruning ${DUNITER_PRUNING_PROFILE} --base-path ${BASE_PATH} --rpc-methods Unsafe --validator
+User=duniter
+Group=duniter
+Restart=always
+RestartSec=120
+CapabilityBoundingSet=
+LockPersonality=true
+NoNewPrivileges=true
+PrivateDevices=true
+PrivateMounts=true
+PrivateTmp=true
+PrivateUsers=true
+ProtectClock=true
+ProtectControlGroups=true
+ProtectHostname=true
+ProtectKernelModules=true
+ProtectKernelTunables=true
+ProtectSystem=strict
+RemoveIPC=true
+RestrictAddressFamilies=AF_INET AF_INET6 AF_NETLINK AF_UNIX
+RestrictNamespaces=false
+RestrictSUIDSGID=true
+SystemCallArchitectures=native
+SystemCallFilter=@system-service
+SystemCallFilter=landlock_add_rule landlock_create_ruleset landlock_restrict_self seccomp mount umount2
+SystemCallFilter=~@clock @module @reboot @swap @privileged
+SystemCallFilter=pivot_root
+UMask=0027
+
+[Install]
+WantedBy=multi-user.target
diff --git a/resources/debian/env_file b/resources/debian/env_file
new file mode 100644
index 0000000000000000000000000000000000000000..e896759f70e3df66de01624fb8e61f9fa540504e
--- /dev/null
+++ b/resources/debian/env_file
@@ -0,0 +1,43 @@
+# Sets the name of the node.
+# This should be a unique identifier for your node within the network.
+DUNITER_NODE_NAME=My Node
+
+# Specifies the blockchain network to connect to.
+DUNITER_CHAIN_NAME=gdev
+
+# Defines the address and port for node communication.
+# The format is /ip4/[IP address]/tcp/[port]/[protocol].
+# If SMITH NODE: `/ip4/0.0.0.0/tcp/<port>` and `/ip6/[::]/tcp/<port>`. Otherwise: `/ip4/0.0.0.0/tcp/<port>/ws` and `/ip6/[::]/tcp/<port>/ws`.
+DUNITER_LISTEN_ADDR=/ip4/0.0.0.0/tcp/30333
+
+# Specify browser origins allowed to access the HTTP & WS RPC servers.
+# A comma-separated list with no space of origins.
+# Value of `all` will disable origin validation. Default is to allow localhost and
+#<https://polkadot.js.org> origins.
+# Default: "http://localhost:*,http://127.0.0.1:*,https://localhost:*,https://127.0.0.1:*,https://polkadot.js.org"
+DUNITER_RPC_CORS=http://localhost:*,http://127.0.0.1:*,https://localhost:*,https://127.0.0.1:*,https://polkadot.js.org
+
+# Configures the pruning profile to manage how old blockchain data is stored.
+# This setting can only be set on the first creation of the database.
+# Options:
+# - 'archive': Keep the state of all blocks.
+# - 'archive-canonical': Keep only the state of finalized blocks.
+# - [number]: Keep the state of the last specified number of finalized blocks.
+# Default: 256 for a balanced pruning strategy.
+DUNITER_PRUNING_PROFILE=256
+
+# Sets the directory for storing Duniter data.
+# This should be a writable path on your system by the duniter user where the node can store its data.
+# Default: /home/duniter/.local/share/duniter
+BASE_PATH=/home/duniter/.local/share/duniter
+
+# URL for the Oracle RPC server.
+# This should point to the RPC endpoint that the oracle will use to communicate with the blockchain.
+# Default: ws://127.0.0.1:9944 for a local WebSocket RPC server.
+ORACLE_RPC_URL=ws://127.0.0.1:9944
+
+# Determines the log level for the Oracle.
+# Options include 'error', 'warn', 'info', 'debug', 'trace'.
+# 'info' is a good default that provides useful runtime information without too much detail.
+# Default: info
+ORACLE_LOG_LEVEL=info
diff --git a/resources/debian/postinst b/resources/debian/postinst
new file mode 100644
index 0000000000000000000000000000000000000000..d2bdfc53161459d6fb72be7de4c2809076bd34a3
--- /dev/null
+++ b/resources/debian/postinst
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+set -e
+
+action="$1"
+config_file="/etc/duniter/env_file"
+
+if [ "$action" = "configure" ]; then
+  # Make user and group
+  getent group duniter >/dev/null 2>&1 || addgroup --system duniter
+  getent passwd duniter >/dev/null 2>&1 ||
+    adduser --system --disabled-password \
+    --ingroup duniter duniter
+
+  # Create user home dir
+  if [ ! -d "/home/duniter/" ]; then
+      mkdir /home/duniter
+      chown -R duniter:duniter /home/duniter
+      chmod 700 /home/duniter
+  fi
+fi
+
+#DEBHELPER#
diff --git a/resources/metadata.scale b/resources/metadata.scale
index 1d38da799164b8bde953d18f7f14fe192863634b..945a23e9cc05e24d7f4eced0da1216cf5843b4db 100644
Binary files a/resources/metadata.scale and b/resources/metadata.scale differ
diff --git a/resources/weight_analyzer/src/lib.rs b/resources/weight_analyzer/src/lib.rs
index 14e8bf7ae2b38acc702924d0c85107726085ac9c..0f39bbd7232c75455e548cce8194190b2134855d 100644
--- a/resources/weight_analyzer/src/lib.rs
+++ b/resources/weight_analyzer/src/lib.rs
@@ -1,15 +1,16 @@
 use convert_case::{Case, Casing};
 use glob::glob;
 use serde::Serialize;
-use std::collections::HashMap;
-use std::ops::Div;
-use std::path::Path;
-use subweight_core::parse::overhead::Weight;
-use subweight_core::parse::pallet::ChromaticExtrinsic;
-use subweight_core::parse::pallet::ComponentRange;
-use subweight_core::parse::storage::Weights;
-use subweight_core::scope::Scope;
-use subweight_core::term::Term;
+use std::{collections::HashMap, ops::Div, path::Path};
+use subweight_core::{
+    parse::{
+        overhead::Weight,
+        pallet::{ChromaticExtrinsic, ComponentRange},
+        storage::Weights,
+    },
+    scope::Scope,
+    term::Term,
+};
 
 // Substrate default maximum weight of a block in nanoseconds.
 // Since the maximum block weight is one-third of the execution time,
@@ -46,10 +47,10 @@ pub struct WeightInfo {
 ///
 /// # Arguments
 ///
-/// * `folder_path` - A Path to a folder where the weight files are stored.
-/// `paritydb_weights.rs` is mandatory and pallet weights should start by
-/// `pallet_`.
-/// *`max_block_weight` - The maximal weight of a block.
+///   * `folder_path` - A Path to a folder where the weight files are stored.
+///     `paritydb_weights.rs` is mandatory and pallet weights should start by
+///     `pallet_`.
+///   * `max_block_weight` - The maximal weight of a block.
 ///
 /// # Examples
 ///
@@ -57,7 +58,7 @@ pub struct WeightInfo {
 ///    use weightanalyzer::analyze_weight;
 ///    use std::path::Path;
 ///    use weightanalyzer::MaxBlockWeight;
-///    let weight_by_pallet = analyze_weight(Path::new("../../runtime/common/src/weights/"), &MaxBlockWeight::default());
+///    let weight_by_pallet = analyze_weight(Path::new("../../runtime/gdev/src/weights/"), &MaxBlockWeight::default());
 ///    println!("{:?}", weight_by_pallet);
 /// ```
 pub fn analyze_weight(
@@ -171,13 +172,12 @@ fn process(
 
 #[cfg(test)]
 mod tests {
-    use crate::analyze_weight;
-    use crate::MaxBlockWeight;
+    use crate::{analyze_weight, MaxBlockWeight};
     use std::path::Path;
     #[test]
     fn should_works() {
         let weight_by_pallet = analyze_weight(
-            Path::new("../../runtime/common/src/weights/"),
+            Path::new("../../runtime/gdev/src/weights/"),
             &MaxBlockWeight::default(),
         );
         assert!(
@@ -187,8 +187,8 @@ mod tests {
                 .get("Balances")
                 .unwrap()
                 .len()
-                == 7
-        ); // 7 extrinsics in pallet
+                == 10
+        ); // 8 extrinsics in pallet
         println!("{:?}", weight_by_pallet); // cargo test  -- --nocapture
     }
     #[test]
diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml
index 4dae708319da060ab31d88f70a9f7ff399b6a4e8..3bce7226e7e879e37e1718482350df827cfe9228 100644
--- a/runtime/common/Cargo.toml
+++ b/runtime/common/Cargo.toml
@@ -16,34 +16,23 @@ constant-fees = []
 runtime-benchmarks = [
 	"frame-benchmarking/runtime-benchmarks",
 	"frame-support/runtime-benchmarks",
-	"frame-system-benchmarking/runtime-benchmarks",
 	"frame-system/runtime-benchmarks",
 	"pallet-authority-members/runtime-benchmarks",
 	"pallet-babe/runtime-benchmarks",
 	"pallet-balances/runtime-benchmarks",
 	"pallet-certification/runtime-benchmarks",
-	"pallet-collective/runtime-benchmarks",
 	"pallet-distance/runtime-benchmarks",
 	"pallet-duniter-account/runtime-benchmarks",
-	"pallet-grandpa/runtime-benchmarks",
+	"pallet-duniter-wot/runtime-benchmarks",
 	"pallet-identity/runtime-benchmarks",
-	"pallet-im-online/runtime-benchmarks",
 	"pallet-membership/runtime-benchmarks",
-	"pallet-multisig/runtime-benchmarks",
 	"pallet-offences/runtime-benchmarks",
-	"pallet-oneshot-account/runtime-benchmarks",
-	"pallet-preimage/runtime-benchmarks",
 	"pallet-provide-randomness/runtime-benchmarks",
-	"pallet-proxy/runtime-benchmarks",
 	"pallet-quota/runtime-benchmarks",
-	"pallet-scheduler/runtime-benchmarks",
 	"pallet-smith-members/runtime-benchmarks",
-	"pallet-sudo/runtime-benchmarks",
 	"pallet-timestamp/runtime-benchmarks",
 	"pallet-treasury/runtime-benchmarks",
 	"pallet-universal-dividend/runtime-benchmarks",
-	"pallet-upgrade-origin/runtime-benchmarks",
-	"pallet-utility/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
 	"sp-staking/runtime-benchmarks",
 ]
@@ -52,35 +41,24 @@ std = [
 	"duniter-primitives/std",
 	"frame-benchmarking/std",
 	"frame-support/std",
-	"frame-system-benchmarking?/std",
 	"frame-system/std",
 	"pallet-authority-members/std",
 	"pallet-babe/std",
 	"pallet-balances/std",
 	"pallet-certification/std",
-	"pallet-collective/std",
 	"pallet-distance/std",
 	"pallet-duniter-account/std",
-	"pallet-grandpa/std",
+	"pallet-duniter-wot/std",
 	"pallet-identity/std",
-	"pallet-im-online/std",
 	"pallet-membership/std",
-	"pallet-multisig/std",
 	"pallet-offences/std",
-	"pallet-oneshot-account/std",
-	"pallet-preimage/std",
 	"pallet-provide-randomness/std",
-	"pallet-proxy/std",
 	"pallet-quota/std",
-	"pallet-scheduler/std",
 	"pallet-session/std",
 	"pallet-smith-members/std",
-	"pallet-sudo/std",
 	"pallet-timestamp/std",
 	"pallet-treasury/std",
 	"pallet-universal-dividend/std",
-	"pallet-upgrade-origin/std",
-	"pallet-utility/std",
 	"scale-info/std",
 	"serde/std",
 	"sp-arithmetic/std",
@@ -89,7 +67,6 @@ std = [
 	"sp-membership/std",
 	"sp-runtime/std",
 	"sp-staking/std",
-	"sp-std/std",
 	"sp-weights/std",
 ]
 try-runtime = [
@@ -100,29 +77,20 @@ try-runtime = [
 	"pallet-babe/try-runtime",
 	"pallet-balances/try-runtime",
 	"pallet-certification/try-runtime",
-	"pallet-collective/try-runtime",
 	"pallet-distance/try-runtime",
 	"pallet-duniter-account/try-runtime",
-	"pallet-grandpa/try-runtime",
+	"pallet-duniter-wot/try-runtime",
 	"pallet-identity/try-runtime",
-	"pallet-im-online/try-runtime",
 	"pallet-membership/try-runtime",
-	"pallet-multisig/try-runtime",
 	"pallet-offences/try-runtime",
-	"pallet-oneshot-account/try-runtime",
-	"pallet-preimage/try-runtime",
 	"pallet-provide-randomness/try-runtime",
-	"pallet-proxy/try-runtime",
 	"pallet-quota/try-runtime",
-	"pallet-scheduler/try-runtime",
 	"pallet-session/try-runtime",
 	"pallet-smith-members/try-runtime",
-	"pallet-sudo/try-runtime",
 	"pallet-timestamp/try-runtime",
+	"pallet-transaction-payment/try-runtime",
 	"pallet-treasury/try-runtime",
 	"pallet-universal-dividend/try-runtime",
-	"pallet-upgrade-origin/try-runtime",
-	"pallet-utility/try-runtime",
 	"sp-membership/try-runtime",
 	"sp-runtime/try-runtime",
 ]
@@ -133,34 +101,24 @@ duniter-primitives = { workspace = true }
 frame-benchmarking = { workspace = true }
 frame-support = { workspace = true }
 frame-system = { workspace = true }
-frame-system-benchmarking = { workspace = true, optional = true }
 pallet-authority-members = { workspace = true }
 pallet-babe = { workspace = true }
 pallet-balances = { workspace = true }
 pallet-certification = { workspace = true }
-pallet-collective = { workspace = true }
 pallet-distance = { workspace = true }
 pallet-duniter-account = { workspace = true }
-pallet-grandpa = { workspace = true }
+pallet-duniter-wot = { workspace = true }
 pallet-identity = { workspace = true }
-pallet-im-online = { workspace = true }
 pallet-membership = { workspace = true }
-pallet-multisig = { workspace = true }
 pallet-offences = { workspace = true }
-pallet-oneshot-account = { workspace = true }
-pallet-preimage = { workspace = true }
 pallet-provide-randomness = { workspace = true }
-pallet-proxy = { workspace = true }
 pallet-quota = { workspace = true }
-pallet-scheduler = { workspace = true }
 pallet-session = { workspace = true }
 pallet-smith-members = { workspace = true }
-pallet-sudo = { workspace = true }
 pallet-timestamp = { workspace = true }
+pallet-transaction-payment = { workspace = true }
 pallet-treasury = { workspace = true }
 pallet-universal-dividend = { workspace = true }
-pallet-upgrade-origin = { workspace = true }
-pallet-utility = { workspace = true }
 scale-info = { workspace = true, features = ["derive"] }
 serde = { workspace = true }
 smallvec = { workspace = true }
@@ -170,5 +128,4 @@ sp-core = { workspace = true }
 sp-membership = { workspace = true }
 sp-runtime = { workspace = true }
 sp-staking = { workspace = true }
-sp-std = { workspace = true }
 sp-weights = { workspace = true }
diff --git a/runtime/common/src/apis.rs b/runtime/common/src/apis.rs
index af95e113f640d2a2318d6f464d20722c1b760f63..77ed9caec2e507cce00ccd178b249e170f7dfc29 100644
--- a/runtime/common/src/apis.rs
+++ b/runtime/common/src/apis.rs
@@ -89,7 +89,7 @@ macro_rules! runtime_apis {
                     Executive::execute_block(block)
                 }
 
-                fn initialize_block(header: &<Block as BlockT>::Header) {
+                fn initialize_block(header: &<Block as BlockT>::Header) -> sp_runtime::ExtrinsicInclusionMode {
                     Executive::initialize_block(header)
                 }
             }
@@ -101,7 +101,7 @@ macro_rules! runtime_apis {
 		fn metadata_at_version(version: u32) -> Option<OpaqueMetadata> {
 			Runtime::metadata_at_version(version)
 		}
-		fn metadata_versions() -> sp_std::vec::Vec<u32> {
+		fn metadata_versions() -> Vec<u32> {
 			Runtime::metadata_versions()
 		}
             }
@@ -221,33 +221,33 @@ macro_rules! runtime_apis {
 		}
             }
 	impl sp_genesis_builder::GenesisBuilder<Block> for Runtime {
-		fn create_default_config() -> Vec<u8> {
-			frame_support::genesis_builder_helper::create_default_config::<RuntimeGenesisConfig>()
+		fn build_state(config: Vec<u8>) -> sp_genesis_builder::Result {
+			frame_support::genesis_builder_helper::build_state::<RuntimeGenesisConfig>(config)
 		}
 
-		fn build_config(config: Vec<u8>) -> sp_genesis_builder::Result {
-			frame_support::genesis_builder_helper::build_config::<RuntimeGenesisConfig>(config)
+		fn get_preset(id: &Option<sp_genesis_builder::PresetId>) -> Option<Vec<u8>> {
+			frame_support::genesis_builder_helper::get_preset::<RuntimeGenesisConfig>(id, |_| None)
+		}
+
+		fn preset_names() -> Vec<sp_genesis_builder::PresetId> {
+			vec![]
 		}
 	}
 
             #[cfg(feature = "try-runtime")]
-            impl frame_try_runtime::TryRuntime<Block> for Runtime where <Runtime as frame_system::Config>::BlockNumber: Clone + sp_std::fmt::Debug + sp_runtime::traits::AtLeast32BitUnsigned {
-                fn on_runtime_upgrade() -> (Weight, Weight) {
-                    log::info!("try-runtime::on_runtime_upgrade.");
-                    todo!()
-                    // TODO solve the problem to uncomment this:
-                    //let weight = Executive::try_runtime_upgrade().unwrap();
-                    //(weight, BlockWeights::get().max_block)
+            impl frame_try_runtime::TryRuntime<Block> for Runtime {
+                fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) {
+                    let weight = Executive::try_runtime_upgrade(checks).unwrap();
+					(weight, BlockWeights::get().max_block)
                 }
 
                 fn execute_block(
                     block: Block,
                     state_root_check: bool,
+					signature_check: bool,
                     select: frame_try_runtime::TryStateSelect,
                 ) -> Weight {
-                    todo!()
-                    // TODO solve the problem to uncomment this:
-                    //Executive::try_execute_block(block, state_root_check, select).expect("try_execute_block failed")
+                    Executive::try_execute_block(block, state_root_check, signature_check, select).expect("execute-block failed")
                 }
             }
 
diff --git a/runtime/common/src/constants.rs b/runtime/common/src/constants.rs
index 135e5bad62db4acbad6a182b07e128ca31d5aa24..a9f31004c1b2ad447e3976056f11505aecd91d06 100644
--- a/runtime/common/src/constants.rs
+++ b/runtime/common/src/constants.rs
@@ -15,11 +15,8 @@
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
 use crate::{Balance, BlockNumber};
-use frame_support::weights::Weight;
 use sp_runtime::Perbill;
 
-pub use crate::weights::paritydb_weights::constants::ParityDbWeight as DbWeight;
-
 /// This determines the average expected block time that we are targeting.
 /// Blocks will be produced at a minimum duration defined by `SLOT_DURATION`.
 /// `SLOT_DURATION` is picked up by `pallet_timestamp` which is in turn picked
@@ -61,32 +58,3 @@ pub const fn deposit(items: u32, bytes: u32) -> Balance {
 
 // Maximal weight proportion of normal extrinsics per block
 pub const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75);
-
-// WEIGHTS CONSTANTS //
-
-// Block weights limits
-pub fn block_weights(
-    expected_block_weight: Weight,
-    normal_ratio: sp_arithmetic::Perbill,
-) -> frame_system::limits::BlockWeights {
-    let base_weight = crate::weights::extrinsic_weights::ExtrinsicBaseWeight::get();
-    let normal_weight = normal_ratio * expected_block_weight;
-    frame_system::limits::BlockWeights::builder()
-        .base_block(crate::weights::block_weights::BlockExecutionWeight::get())
-        .for_class(frame_support::dispatch::DispatchClass::all(), |weights| {
-            weights.base_extrinsic = base_weight;
-        })
-        .for_class(frame_support::dispatch::DispatchClass::Normal, |weights| {
-            weights.max_total = normal_weight.into();
-        })
-        .for_class(
-            frame_support::dispatch::DispatchClass::Operational,
-            |weights| {
-                weights.max_total = expected_block_weight.into();
-                weights.reserved = (expected_block_weight - normal_weight).into();
-            },
-        )
-        .avg_block_initialization(sp_arithmetic::Perbill::from_percent(10))
-        .build()
-        .expect("Fatal error: invalid BlockWeights configuration")
-}
diff --git a/runtime/common/src/fees.rs b/runtime/common/src/fees.rs
index 1bea9d5759d1a77d1c1aabf231c082a4bb72922d..2ec9a7087e755056072e990af4a78f09389f92eb 100644
--- a/runtime/common/src/fees.rs
+++ b/runtime/common/src/fees.rs
@@ -14,76 +14,282 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-// In the deployed fees model, a mapping of 5 (5cG) corresponds to a base extrinsic weight,
-// achieved through a 1-dimensional polynomial. Additionally, 1 (1cG) corresponds to an extrinsic length of 100 bytes.
-//
-// For testing purposes, we adopt a human-predictable weight system that remains invariant to the chosen fees model for release.
-// This involves setting a constant weight_to_fee equal to 1 and a constant length_to_fee set to 0, resulting in each extrinsic costing 2 (2cG).
-
+/// In our deployed fee model, users will not pay any fees if blockchain usage remains below a
+/// specified threshold, and fees are applied based on transaction weight and length once this
+/// threshold is exceeded, helping to prevent spamming attacks.
+///
+/// When the current block's weight and length are below the targeted thresholds, no fees are charged,
+/// as the weight-to-fee conversion results in zero. Once the block's weight and length exceed these
+/// targets, the weight-to-fee conversion maps BASE_EXTRINSIC_WEIGHT_COST to a base extrinsic weight.
+/// Additionally, a fee is applied based on the length of the extrinsic and is mapped affinely:
+/// 2_000 (20G) corresponds to an extrinsic length of BYTES_PER_UNIT*10 plus the BASE_EXTRINSIC_LENGTH_COST and will be applied only if the extrinsic
+/// exceeds MAX_EXTRINSIC_LENGTH bytes or if the block target in weight or length is surpassed.
+///
+/// To further deter abuse, if the previous block's weight or length  the target thresholds,
+/// the chain increases the fees by multiplying the transaction weight with a `FeeMultiplier`. For each
+/// consecutive block that exceeds the targets, this multiplier increases by one. If the targets are
+/// not reached, the multiplier decreases by one. The `FeeMultiplier` ranges from 1 (normal usage) to
+/// `MaxMultiplier`, where heavy usage causes a number `MaxMultiplier` of consecutive blocks to exceed targets.
+///
+/// For testing purposes, a simplified, human-predictable weight system is used. This test model sets
+/// a constant `weight_to_fee` of 1 and a `length_to_fee` of 0, making each extrinsic cost 2 (2cG),
+/// and can be activated with the #[cfg(feature = "constant-fees")] feature.
 pub use frame_support::weights::{Weight, WeightToFee};
+use pallet_transaction_payment::{Multiplier, MultiplierUpdate};
+use scale_info::prelude::marker::PhantomData;
 use sp_arithmetic::traits::{BaseArithmetic, Unsigned};
-
+use sp_core::Get;
+use sp_runtime::{traits::Convert, Perquintill};
 #[cfg(not(feature = "constant-fees"))]
 use {
-    crate::weights::extrinsic_weights::ExtrinsicBaseWeight,
+    frame_support::pallet_prelude::DispatchClass,
     frame_support::weights::{
         WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial,
     },
     smallvec::smallvec,
     sp_arithmetic::MultiplyRational,
+    sp_runtime::traits::One,
     sp_runtime::Perbill,
     sp_runtime::SaturatedConversion,
+    sp_runtime::Saturating,
 };
 
-pub struct LengthToFeeImpl<T>(sp_std::marker::PhantomData<T>);
+/// A structure to implement Length to Fee conversion.
+/// - `Balance`: The balance type.
+/// - `Runtime`: The system configuration type, providing access to block weights.
+/// - `Target`: A type providing the target block fullness.
+pub struct LengthToFeeImpl<Balance, Runtime, Target>(
+    PhantomData<Balance>,
+    PhantomData<Runtime>,
+    PhantomData<Target>,
+);
 
-impl<T> WeightToFee for LengthToFeeImpl<T>
+/// Trait implementation for converting transaction length to fee.
+impl<Balance, Runtime, Target> WeightToFee for LengthToFeeImpl<Balance, Runtime, Target>
 where
-    T: BaseArithmetic + From<u32> + Copy + Unsigned,
+    Balance: BaseArithmetic + From<u32> + Copy + Unsigned,
+    Runtime: frame_system::Config + pallet_transaction_payment::Config,
+    Target: Get<Perquintill>,
 {
-    type Balance = T;
+    type Balance = Balance;
 
+    /// Function to convert weight to fee when "constant-fees" feature is not enabled.
+    ///
+    /// This function calculates the fee based on the length of the transaction in bytes.
+    /// If the current block weight and length are less than a fraction of the max block weight and length, the fee multiplier is one,
+    /// and the extrinsic length is less than MAX_EXTRINSIC_LENGTH bytes, no fees are applied. Otherwise, it calculates the fee based on the length in bytes.
     #[cfg(not(feature = "constant-fees"))]
     fn weight_to_fee(length_in_bytes: &Weight) -> Self::Balance {
-        Self::Balance::saturated_from(length_in_bytes.ref_time() / 100u64)
+        // The extrinsic overhead for a remark is approximately 110 bytes.
+        // This leaves 146 bytes available for the actual remark content.
+        const MAX_EXTRINSIC_LENGTH: u64 = 256;
+        const BYTES_PER_UNIT: u64 = 350;
+        const BASE_EXTRINSIC_LENGTH_COST: u64 = 5;
+
+        let weights = Runtime::BlockWeights::get();
+        let fee_multiplier = pallet_transaction_payment::Pallet::<Runtime>::next_fee_multiplier();
+        let normal_max_weight = weights
+            .get(DispatchClass::Normal)
+            .max_total
+            .unwrap_or(weights.max_block);
+        let current_block_weight = <frame_system::Pallet<Runtime>>::block_weight();
+
+        let length = Runtime::BlockLength::get();
+        let normal_max_length = *length.max.get(DispatchClass::Normal) as u64;
+        let current_block_length = <frame_system::Pallet<Runtime>>::all_extrinsics_len() as u64;
+
+        if current_block_weight
+            .get(DispatchClass::Normal)
+            .all_lt(Target::get() * normal_max_weight)
+            && current_block_length < (Target::get() * normal_max_length)
+            && fee_multiplier.is_one()
+            && length_in_bytes.ref_time() < MAX_EXTRINSIC_LENGTH
+        {
+            0u32.into()
+        } else {
+            Self::Balance::saturated_from(
+                length_in_bytes.ref_time() / BYTES_PER_UNIT + BASE_EXTRINSIC_LENGTH_COST,
+            )
+        }
     }
 
+    /// Function to convert weight to fee when "constant-fees" feature is enabled.
+    ///
+    /// This function always returns a constant fee of zero when the "constant-fees" feature is enabled.
     #[cfg(feature = "constant-fees")]
     fn weight_to_fee(_length_in_bytes: &Weight) -> Self::Balance {
         0u32.into()
     }
 }
 
-pub struct WeightToFeeImpl<T>(sp_std::marker::PhantomData<T>);
+/// A structure to implement Weight to Fee conversion.
+/// - `Balance`: The balance type.
+/// - `Runtime`: The system configuration type, providing access to block weights.
+/// - `Target`: A type providing the target block fullness.
+pub struct WeightToFeeImpl<Balance, Runtime, Target>(
+    PhantomData<Balance>,
+    PhantomData<Runtime>,
+    PhantomData<Target>,
+);
 
+/// Trait implementation for converting transaction weight to fee.
+///
+/// This implementation is only included when the "constant-fees" feature is not enabled.
 #[cfg(not(feature = "constant-fees"))]
-impl<T> WeightToFeePolynomial for WeightToFeeImpl<T>
+impl<Balance, Runtime, Target> WeightToFeePolynomial for WeightToFeeImpl<Balance, Runtime, Target>
 where
-    T: BaseArithmetic + From<u64> + Copy + Unsigned + From<u32> + MultiplyRational,
+    Balance: BaseArithmetic + From<u64> + Copy + Unsigned + From<u32> + MultiplyRational,
+    Runtime: frame_system::Config + pallet_transaction_payment::Config,
+    Target: Get<Perquintill>,
 {
-    type Balance = T;
+    type Balance = Balance;
 
+    /// Function to get the polynomial coefficients for weight to fee conversion.
+    ///
+    /// This function calculates the polynomial coefficients for converting transaction weight to fee.
+    /// If the current block weight and length are less than a fraction of the block max weight and length, and the fee multiplier is one,
+    /// it returns zero. Otherwise, it calculates the coefficients based on the extrinsic base weight mapped to 5 cents.
     fn polynomial() -> WeightToFeeCoefficients<Self::Balance> {
-        // The extrinsic base weight (smallest non-zero weight) is mapped to 5 cent
-        let p: Self::Balance = 5u64.into();
-        let q: Self::Balance = Self::Balance::from(ExtrinsicBaseWeight::get().ref_time());
-        smallvec![WeightToFeeCoefficient {
-            degree: 1,
-            negative: false,
-            coeff_frac: Perbill::from_rational(p % q, q),
-            coeff_integer: p / q,
-        }]
+        let weights = Runtime::BlockWeights::get();
+        let fee_multiplier = pallet_transaction_payment::Pallet::<Runtime>::next_fee_multiplier();
+        let normal_max_weight = weights
+            .get(DispatchClass::Normal)
+            .max_total
+            .unwrap_or(weights.max_block);
+        let current_block_weight = <frame_system::Pallet<Runtime>>::block_weight();
+
+        let length = Runtime::BlockLength::get();
+        let normal_max_length = *length.max.get(DispatchClass::Normal) as u64;
+        let current_block_length = <frame_system::Pallet<Runtime>>::all_extrinsics_len() as u64;
+
+        if current_block_weight
+            .get(DispatchClass::Normal)
+            .all_lt(Target::get() * normal_max_weight)
+            && current_block_length < (Target::get() * normal_max_length)
+            && fee_multiplier.is_one()
+        {
+            smallvec![WeightToFeeCoefficient {
+                degree: 1,
+                negative: false,
+                coeff_frac: Perbill::zero(),
+                coeff_integer: Self::Balance::zero(),
+            }]
+        } else {
+            // The extrinsic base weight (smallest non-zero weight) is mapped to 5 cents
+            const BASE_EXTRINSIC_WEIGHT_COST: u64 = 5;
+            let p: Self::Balance = BASE_EXTRINSIC_WEIGHT_COST.into();
+            let q: Self::Balance =
+                Self::Balance::from(weights.get(DispatchClass::Normal).base_extrinsic.ref_time());
+            smallvec![WeightToFeeCoefficient {
+                degree: 1,
+                negative: false,
+                coeff_frac: Perbill::from_rational(p % q, q),
+                coeff_integer: p / q,
+            }]
+        }
     }
 }
 
+/// Trait implementation for converting transaction weight to a constant fee.
+///
+/// This implementation is only included when the "constant-fees" feature is enabled.
 #[cfg(feature = "constant-fees")]
-impl<T> WeightToFee for WeightToFeeImpl<T>
+impl<Balance, Runtime, Target> WeightToFee for WeightToFeeImpl<Balance, Runtime, Target>
 where
-    T: BaseArithmetic + From<u32> + Copy + Unsigned,
+    Balance: BaseArithmetic + From<u32> + Copy + Unsigned,
 {
-    type Balance = T;
+    type Balance = Balance;
 
     fn weight_to_fee(_weight: &Weight) -> Self::Balance {
         1u32.into()
     }
 }
+
+/// A structure to implement fee multiplier adjustments.
+///
+/// - `Runtime`: The system configuration type.
+/// - `Target`: A type providing the target block fullness.
+/// - `MaxMultiplier`: A type providing the maximum multiplier value.
+pub struct FeeMultiplier<Runtime, Target, MaxMultiplier>(
+    PhantomData<Runtime>,
+    PhantomData<Target>,
+    PhantomData<MaxMultiplier>,
+);
+
+/// Trait implementation for updating the fee multiplier.
+impl<Runtime, Target, MaxMultiplier> MultiplierUpdate
+    for FeeMultiplier<Runtime, Target, MaxMultiplier>
+where
+    Runtime: frame_system::Config,
+    Target: Get<Perquintill>,
+    MaxMultiplier: Get<Multiplier>,
+{
+    fn min() -> Multiplier {
+        0.into()
+    }
+
+    fn max() -> Multiplier {
+        MaxMultiplier::get()
+    }
+
+    fn target() -> Perquintill {
+        Target::get()
+    }
+
+    fn variability() -> Multiplier {
+        Default::default()
+    }
+}
+
+/// Trait implementation for converting previous `Multiplier` to another for fee adjustment.
+impl<Runtime, Target, MaxMultiplier> Convert<Multiplier, Multiplier>
+    for FeeMultiplier<Runtime, Target, MaxMultiplier>
+where
+    Runtime: frame_system::Config,
+    Target: Get<Perquintill>,
+    MaxMultiplier: Get<Multiplier>,
+{
+    /// Function to convert the previous fee multiplier to a new fee multiplier.
+    ///
+    /// This function adjusts the fee multiplier based on the current block weight, length and target block fullness.
+    /// - If the current block weight and length are less than the target, it decreases the multiplier by one, with a minimum of one.
+    /// - If the current block weight or length is more than the target, it increases the multiplier by one, up to the maximum multiplier.
+    #[cfg(not(feature = "constant-fees"))]
+    fn convert(previous: Multiplier) -> Multiplier {
+        let max_multiplier = MaxMultiplier::get();
+        let target_block_fullness = Target::get();
+
+        let weights = Runtime::BlockWeights::get();
+        let normal_max_weight = weights
+            .get(DispatchClass::Normal)
+            .max_total
+            .unwrap_or(weights.max_block);
+
+        let length = Runtime::BlockLength::get();
+        let normal_max_length = *length.max.get(DispatchClass::Normal) as u64;
+        let current_block_length = <frame_system::Pallet<Runtime>>::all_extrinsics_len() as u64;
+
+        if <frame_system::Pallet<Runtime>>::block_weight()
+            .get(DispatchClass::Normal)
+            .all_lt(target_block_fullness * normal_max_weight)
+            && current_block_length < (target_block_fullness * normal_max_length)
+        {
+            // If the current block weight and length are less than the target, keep the
+            // multiplier at the minimum or decrease it by one to slowly
+            // return to the minimum.
+            previous.saturating_sub(1.into()).max(1.into())
+        } else {
+            // If the current block weight or length is more than the target, increase
+            // the multiplier by one.
+            previous.saturating_add(1.into()).min(max_multiplier)
+        }
+    }
+
+    /// Function to convert the previous fee multiplier to a constant fee multiplier when "constant-fees" feature is enabled.
+    ///
+    /// This function always returns a constant multiplier of 1 when the "constant-fees" feature is enabled.
+    #[cfg(feature = "constant-fees")]
+    fn convert(_previous: Multiplier) -> Multiplier {
+        1.into()
+    }
+}
diff --git a/runtime/common/src/handlers.rs b/runtime/common/src/handlers.rs
index f72a59a3c07ab8d00afa533227061c66ad4972ca..197e3574378589bc969d502d1d81976033de72d8 100644
--- a/runtime/common/src/handlers.rs
+++ b/runtime/common/src/handlers.rs
@@ -14,71 +14,124 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-use super::entities::*;
-use super::{AccountId, IdtyIndex};
-use frame_support::pallet_prelude::Weight;
-use frame_support::traits::UnfilteredDispatchable;
+use super::{entities::*, AccountId, IdtyIndex};
+use frame_support::{pallet_prelude::Weight, traits::UnfilteredDispatchable};
 use pallet_smith_members::SmithRemovalReason;
+use sp_core::Get;
 
-// new session handler
+/// OnNewSession handler for the runtime calling all the implementation
+/// of OnNewSession
 pub struct OnNewSessionHandler<Runtime>(core::marker::PhantomData<Runtime>);
 impl<Runtime> pallet_authority_members::traits::OnNewSession for OnNewSessionHandler<Runtime>
 where
-    Runtime:
-        pallet_provide_randomness::Config + pallet_distance::Config + pallet_smith_members::Config,
+    Runtime: pallet_provide_randomness::Config + pallet_smith_members::Config,
 {
     fn on_new_session(index: sp_staking::SessionIndex) {
         pallet_provide_randomness::Pallet::<Runtime>::on_new_epoch();
-        pallet_distance::Pallet::<Runtime>::on_new_session(index);
         pallet_smith_members::Pallet::<Runtime>::on_new_session(index);
     }
 }
 
-// membership event runtime handler
-pub struct OnMembershipEventHandler<Inner, Runtime>(core::marker::PhantomData<(Inner, Runtime)>);
+/// Runtime handler for OnNewIdty, calling all implementations of
+/// OnNewIdty and implementing logic at the runtime level.
+pub struct OnNewIdtyHandler<Runtime>(core::marker::PhantomData<Runtime>);
+impl<Runtime: pallet_duniter_wot::Config + pallet_quota::Config>
+    pallet_identity::traits::OnNewIdty<Runtime> for OnNewIdtyHandler<Runtime>
+{
+    fn on_created(idty_index: &IdtyIndex, creator: &IdtyIndex) {
+        pallet_duniter_wot::Pallet::<Runtime>::on_created(idty_index, creator);
+        pallet_quota::Pallet::<Runtime>::on_created(idty_index, creator);
+    }
+}
+
+/// Runtime handler for OnRemoveIdty, calling all implementations of
+/// OnRemoveIdty and implementing logic at the runtime level.
+pub struct OnRemoveIdtyHandler<Runtime>(core::marker::PhantomData<Runtime>);
+impl<Runtime: pallet_duniter_wot::Config + pallet_quota::Config>
+    pallet_identity::traits::OnRemoveIdty<Runtime> for OnRemoveIdtyHandler<Runtime>
+{
+    fn on_removed(idty_index: &IdtyIndex) -> Weight {
+        let mut weight = pallet_duniter_wot::Pallet::<Runtime>::on_removed(idty_index);
+        weight += pallet_quota::Pallet::<Runtime>::on_removed(idty_index);
+        weight
+    }
+
+    fn on_revoked(idty_index: &IdtyIndex) -> Weight {
+        let mut weight = pallet_duniter_wot::Pallet::<Runtime>::on_revoked(idty_index);
+        weight += pallet_quota::Pallet::<Runtime>::on_revoked(idty_index);
+        weight
+    }
+}
+
+/// Runtime handler for OnNewMembership, calling all implementations of
+/// OnNewMembership and implementing logic at the runtime level.
+pub struct OnNewMembershipHandler<Runtime>(core::marker::PhantomData<Runtime>);
 impl<
-        Inner: sp_membership::traits::OnEvent<IdtyIndex>,
         Runtime: frame_system::Config<AccountId = AccountId>
             + pallet_identity::Config<IdtyData = IdtyData, IdtyIndex = IdtyIndex>
-            + pallet_membership::Config
-            + pallet_smith_members::Config<IdtyIndex = IdtyIndex>
+            + pallet_duniter_wot::Config
             + pallet_universal_dividend::Config,
-    > sp_membership::traits::OnEvent<IdtyIndex> for OnMembershipEventHandler<Inner, Runtime>
+    > sp_membership::traits::OnNewMembership<IdtyIndex> for OnNewMembershipHandler<Runtime>
 {
-    fn on_event(membership_event: &sp_membership::Event<IdtyIndex>) {
-        (match membership_event {
-            // when membership is removed, call on_removed_member handler which auto claims UD
-            sp_membership::Event::MembershipRemoved(idty_index) => {
-                if let Some(idty_value) = pallet_identity::Identities::<Runtime>::get(idty_index) {
-                    if let Some(first_ud_index) = idty_value.data.first_eligible_ud.into() {
-                        pallet_universal_dividend::Pallet::<Runtime>::on_removed_member(
-                            first_ud_index,
-                            &idty_value.owner_key,
-                        );
-                    }
-                }
-                pallet_smith_members::Pallet::<Runtime>::on_removed_wot_member(*idty_index);
-            }
-            // when main membership is acquired, it starts getting right to UD
-            sp_membership::Event::MembershipAdded(idty_index) => {
-                pallet_identity::Identities::<Runtime>::mutate_exists(idty_index, |idty_val_opt| {
-                    if let Some(ref mut idty_val) = idty_val_opt {
-                        idty_val.data = IdtyData {
-                            first_eligible_ud:
-                                pallet_universal_dividend::Pallet::<Runtime>::init_first_eligible_ud(
-                                ),
-                        };
-                    }
-                });
+    fn on_created(idty_index: &IdtyIndex) {
+        // duniter-wot related actions
+        pallet_duniter_wot::Pallet::<Runtime>::on_created(idty_index);
+
+        // When main membership is acquired, it starts getting right to UD.
+        pallet_identity::Identities::<Runtime>::mutate_exists(idty_index, |idty_val_opt| {
+            if let Some(ref mut idty_val) = idty_val_opt {
+                idty_val.data = IdtyData {
+                    first_eligible_ud:
+                        pallet_universal_dividend::Pallet::<Runtime>::init_first_eligible_ud(),
+                };
             }
-            // in other case, ther is nothing to do
-            sp_membership::Event::MembershipRenewed(_) => (),
         });
-        Inner::on_event(membership_event)
     }
+
+    fn on_renewed(_idty_index: &IdtyIndex) {}
 }
 
-// spend treasury handler
+/// Runtime handler for OnRemoveMembership, calling all implementations of
+/// OnRemoveMembership and implementing logic at the runtime level.
+/// As the weight accounting is not trivial in this handler, the weight is
+/// done at the handler level.
+pub struct OnRemoveMembershipHandler<Runtime>(core::marker::PhantomData<Runtime>);
+impl<
+        Runtime: frame_system::Config<AccountId = AccountId>
+            + pallet_identity::Config<IdtyData = IdtyData, IdtyIndex = IdtyIndex>
+            + pallet_smith_members::Config<IdtyIndex = IdtyIndex>
+            + pallet_duniter_wot::Config
+            + pallet_universal_dividend::Config,
+    > sp_membership::traits::OnRemoveMembership<IdtyIndex> for OnRemoveMembershipHandler<Runtime>
+{
+    fn on_removed(idty_index: &IdtyIndex) -> Weight {
+        // duniter-wot related actions
+        let mut weight = pallet_duniter_wot::Pallet::<Runtime>::on_removed(idty_index);
+
+        let mut add_db_reads_writes = |reads, writes| {
+            weight += Runtime::DbWeight::get().reads_writes(reads, writes);
+        };
+
+        // When membership is removed, call on_removed_member handler which auto claims UD.
+        if let Some(idty_value) = pallet_identity::Identities::<Runtime>::get(idty_index) {
+            add_db_reads_writes(1, 0);
+            if let Some(first_ud_index) = idty_value.data.first_eligible_ud.into() {
+                add_db_reads_writes(1, 0);
+                weight += pallet_universal_dividend::Pallet::<Runtime>::on_removed_member(
+                    first_ud_index,
+                    &idty_value.owner_key,
+                );
+            }
+        }
+
+        // When membership is removed, also remove from smith member.
+        weight.saturating_add(
+            pallet_smith_members::Pallet::<Runtime>::on_removed_wot_member(*idty_index),
+        )
+    }
+}
+
+/// Runtime handler for TreasurySpendFunds.
 pub struct TreasurySpendFunds<Runtime>(core::marker::PhantomData<Runtime>);
 impl<Runtime> pallet_treasury::SpendFunds<Runtime> for TreasurySpendFunds<Runtime>
 where
@@ -94,6 +147,7 @@ where
     }
 }
 
+/// Runtime handler for OnSmithDelete.
 pub struct OnSmithDeletedHandler<Runtime>(core::marker::PhantomData<Runtime>);
 impl<Runtime> pallet_smith_members::traits::OnSmithDelete<Runtime::MemberId>
     for OnSmithDeletedHandler<Runtime>
@@ -105,9 +159,22 @@ where
             member_id: idty_index,
         };
         if let Err(e) = call.dispatch_bypass_filter(frame_system::Origin::<Runtime>::Root.into()) {
-            sp_std::if_std! {
-                println!("faid to remove member: {:?}", e)
-            }
+            #[cfg(feature = "std")]
+            println!("faid to remove member: {:?}", e)
         }
     }
 }
+
+/// Runtime handler OwnerKeyChangePermission.
+pub struct OwnerKeyChangePermissionHandler<Runtime>(core::marker::PhantomData<Runtime>);
+impl<
+        Runtime: frame_system::Config
+            + pallet_identity::Config<IdtyIndex = IdtyIndex>
+            + pallet_authority_members::Config<MemberId = IdtyIndex>,
+    > pallet_identity::traits::CheckKeyChangeAllowed<Runtime>
+    for OwnerKeyChangePermissionHandler<Runtime>
+{
+    fn check_allowed(idty_index: &IdtyIndex) -> bool {
+        !pallet_authority_members::Pallet::<Runtime>::online().contains(idty_index)
+    }
+}
diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs
index 589b4f3812f87b937d04f309518eda1fa5742b63..e4fac0aa6e84cb9e85410ec6029bb20b166b3751 100644
--- a/runtime/common/src/lib.rs
+++ b/runtime/common/src/lib.rs
@@ -23,7 +23,6 @@ pub mod fees;
 pub mod handlers;
 mod pallets_config;
 pub mod providers;
-pub mod weights;
 
 pub use pallet_duniter_account::GenesisAccountData;
 pub use pallet_identity::{GenesisIdty, IdtyName, IdtyStatus, IdtyValue};
diff --git a/runtime/common/src/pallets_config.rs b/runtime/common/src/pallets_config.rs
index 6a17704a6df675ea0d5028587408bd8a3ef664df..3b5ae90ba85c60d1ab677e5e3c1014cfceb3e414 100644
--- a/runtime/common/src/pallets_config.rs
+++ b/runtime/common/src/pallets_config.rs
@@ -16,9 +16,7 @@
 
 #[macro_export]
 macro_rules! pallets_config {
-    {$($custom:tt)*} => {
-        $($custom)*
-
+    () => {
         // SYSTEM //
 
         parameter_types! {
@@ -26,54 +24,59 @@ macro_rules! pallets_config {
         }
 
         impl frame_system::Config for Runtime {
+            /// The data to be stored in an account.
+            type AccountData = pallet_duniter_account::AccountData<Balance, IdtyIndex>;
+            /// The identifier used to distinguish between accounts.
+            type AccountId = AccountId;
             /// The basic call filter to use in dispatchable.
             type BaseCallFilter = BaseCallFilter;
-            /// Block & extrinsics weights: base values and limits.
-            type BlockWeights = BlockWeights;
+            /// The block type for the runtime.
+            type Block = Block;
+            /// Maximum number of block number to block hash mappings to keep (oldest pruned first).
+            type BlockHashCount = BlockHashCount;
             /// The maximum length of a block (in bytes).
             type BlockLength = BlockLength;
-            /// The identifier used to distinguish between accounts.
-            type AccountId = AccountId;
-            /// The aggregated dispatch type that is available for extrinsics.
-            type RuntimeCall = RuntimeCall;
-            /// The lookup mechanism to get account ID from whatever is passed in dispatchers.
-            type Lookup = AccountIdLookup<AccountId, ()>;
+            /// Block & extrinsics weights: base values and limits.
+            type BlockWeights = BlockWeights;
+            /// The weight of database operations that the runtime can invoke.
+            type DbWeight = DbWeight;
             /// The type for hashing blocks and tries.
             type Hash = Hash;
             /// The hashing algorithm used.
             type Hashing = BlakeTwo256;
-            /// The ubiquitous event type.
-            type RuntimeEvent = RuntimeEvent;
-            /// The ubiquitous origin type.
-            type RuntimeOrigin = RuntimeOrigin;
-            /// Maximum number of block number to block hash mappings to keep (oldest pruned first).
-            type BlockHashCount = BlockHashCount;
-            /// The weight of database operations that the runtime can invoke.
-            type DbWeight = DbWeight;
-            /// Version of the runtime.
-            type Version = Version;
+            /// The lookup mechanism to get account ID from whatever is passed in dispatchers.
+            type Lookup = AccountIdLookup<AccountId, ()>;
+            type MaxConsumers = frame_support::traits::ConstU32<16>;
+            type MultiBlockMigrator = ();
+            /// The type for storing how many extrinsics an account has signed.
+            type Nonce = node_primitives::Nonce;
+            /// What to do if an account is fully reaped from the system.
+            type OnKilledAccount = ();
+            /// What to do if a new account is created.
+            type OnNewAccount = ();
+            /// The set code logic, just the default since we're not a parachain.
+            type OnSetCode = ();
             /// Converts a module to the index of the module in `construct_runtime!`.
             ///
             /// This type is being generated by `construct_runtime!`.
             type PalletInfo = PalletInfo;
-            /// What to do if a new account is created.
-            type OnNewAccount = ();
-            /// What to do if an account is fully reaped from the system.
-            type OnKilledAccount = ();
-            /// The data to be stored in an account.
-            type AccountData = pallet_duniter_account::AccountData<Balance, IdtyIndex>;
-            /// Weight information for the extrinsics of this pallet.
-            type SystemWeightInfo = common_runtime::weights::frame_system::WeightInfo<Runtime>;
+            type PostInherents = ();
+            type PostTransactions = ();
+            type PreInherents = ();
+            /// The aggregated dispatch type that is available for extrinsics.
+            type RuntimeCall = RuntimeCall;
+            /// The ubiquitous event type.
+            type RuntimeEvent = RuntimeEvent;
+            /// The ubiquitous origin type.
+            type RuntimeOrigin = RuntimeOrigin;
+            type RuntimeTask = ();
             /// This is used as an identifier of the chain. 42 is the generic substrate prefix.
             type SS58Prefix = SS58Prefix;
-            /// The set code logic, just the default since we're not a parachain.
-            type OnSetCode = ();
-            type MaxConsumers = frame_support::traits::ConstU32<16>;
-	/// The type for storing how many extrinsics an account has signed.
-	type Nonce = node_primitives::Nonce;
-	/// The block type for the runtime.
-	type Block = Block;
-type RuntimeTask = ();
+            type SingleBlockMigrations = ();
+            /// Weight information for the extrinsics of this pallet.
+            type SystemWeightInfo = weights::frame_system::WeightInfo<Runtime>;
+            /// Version of the runtime.
+            type Version = Version;
         }
 
         // SCHEDULER //
@@ -85,26 +88,26 @@ type RuntimeTask = ();
             pub const NoPreimagePostponement: Option<u32> = Some(10);
         }
         impl pallet_scheduler::Config for Runtime {
-            type RuntimeEvent = RuntimeEvent;
-            type RuntimeOrigin = RuntimeOrigin;
-            type PalletsOrigin = OriginCaller;
-            type RuntimeCall = RuntimeCall;
+            type MaxScheduledPerBlock = MaxScheduledPerBlock;
             type MaximumWeight = MaximumSchedulerWeight;
-            type ScheduleOrigin = EnsureRoot<AccountId>;
             type OriginPrivilegeCmp = EqualPrivilegeOnly;
-            type MaxScheduledPerBlock = MaxScheduledPerBlock;
-            type WeightInfo = common_runtime::weights::pallet_scheduler::WeightInfo<Runtime>;
+            type PalletsOrigin = OriginCaller;
             type Preimages = Preimage;
+            type RuntimeCall = RuntimeCall;
+            type RuntimeEvent = RuntimeEvent;
+            type RuntimeOrigin = RuntimeOrigin;
+            type ScheduleOrigin = EnsureRoot<AccountId>;
+            type WeightInfo = weights::pallet_scheduler::WeightInfo<Runtime>;
         }
 
         // ACCOUNT //
 
         impl pallet_duniter_account::Config for Runtime {
-            type RuntimeEvent = RuntimeEvent;
-            type WeightInfo = common_runtime::weights::pallet_duniter_account::WeightInfo<Runtime>;
             // does currency adapter in any case, but adds "refund with quota" feature
-            type InnerOnChargeTransaction = CurrencyAdapter<Balances, HandleFees>;
+            type InnerOnChargeTransaction = FungibleAdapter<Balances, HandleFees>;
             type Refund = Quota;
+            type RuntimeEvent = RuntimeEvent;
+            type WeightInfo = weights::pallet_duniter_account::WeightInfo<Runtime>;
         }
 
         // QUOTA //
@@ -117,113 +120,95 @@ type RuntimeTask = ();
             }
         }
         parameter_types! {
-            pub const ReloadRate: BlockNumber = 1 * HOURS; // faster than DAYS
-            pub const MaxQuota: Balance = 1000; // 10 ĞD
-			pub const MaxNominators: u32 = 64;
-pub TreasuryAccount: AccountId = Treasury::account_id(); // TODO
-        }
+                    pub const ReloadRate: BlockNumber = 1 * HOURS; // faster than DAYS
+                    pub const MaxQuota: Balance = 1000; // 10 ĞD
+                    pub const MaxNominators: u32 = 64;
+        pub TreasuryAccount: AccountId = Treasury::account_id(); // TODO
+                }
         impl pallet_quota::Config for Runtime {
-            type RuntimeEvent = RuntimeEvent;
-            // type IdtyId = IdtyIndex;
-            type ReloadRate = ReloadRate;
             type MaxQuota = MaxQuota;
             type RefundAccount = TreasuryAccountId;
-            type WeightInfo = common_runtime::weights::pallet_quota::WeightInfo<Runtime>;
+            type ReloadRate = ReloadRate;
+            type RuntimeEvent = RuntimeEvent;
+            type WeightInfo = weights::pallet_quota::WeightInfo<Runtime>;
         }
 
         // BLOCK CREATION //
 
         impl pallet_babe::Config for Runtime {
-            type EpochDuration = EpochDuration;
-            type ExpectedBlockTime = ExpectedBlockTime;
+            type DisabledValidators = Session;
             // session module is the trigger
             type EpochChangeTrigger = pallet_babe::ExternalTrigger;
-            type DisabledValidators = Session;
-            type KeyOwnerProof = <Historical as KeyOwnerProofSystem<(
-                KeyTypeId,
-                pallet_babe::AuthorityId,
-            )>>::Proof;
+            type EpochDuration = EpochDuration;
             type EquivocationReportSystem =
                 pallet_babe::EquivocationReportSystem<Self, Offences, Historical, ReportLongevity>;
-            type WeightInfo = common_runtime::weights::pallet_babe::WeightInfo<Runtime>;
+            type ExpectedBlockTime = ExpectedBlockTime;
+            type KeyOwnerProof =
+                <Historical as KeyOwnerProofSystem<(KeyTypeId, pallet_babe::AuthorityId)>>::Proof;
             type MaxAuthorities = MaxAuthorities;
-type MaxNominators = MaxNominators;
+            type MaxNominators = MaxNominators;
+            type WeightInfo = weights::pallet_babe::WeightInfo<Runtime>;
         }
 
         impl pallet_timestamp::Config for Runtime {
+            type MinimumPeriod = MinimumPeriod;
             type Moment = u64;
             type OnTimestampSet = (Babe, UniversalDividend);
-            type MinimumPeriod = MinimumPeriod;
-            type WeightInfo = common_runtime::weights::pallet_timestamp::WeightInfo<Runtime>;
+            type WeightInfo = weights::pallet_timestamp::WeightInfo<Runtime>;
         }
 
         // MONEY MANAGEMENT //
 
         impl pallet_balances::Config for Runtime {
-type RuntimeHoldReason = ();
-type RuntimeFreezeReason = ();
-            type RuntimeEvent = RuntimeEvent;
+            type AccountStore = Account;
+            type Balance = Balance;
+            type DustRemoval = HandleFees;
+            type ExistentialDeposit = ExistentialDeposit;
+            type FreezeIdentifier = ();
+            type MaxFreezes = frame_support::pallet_prelude::ConstU32<0>;
             type MaxLocks = MaxLocks;
             type MaxReserves = frame_support::pallet_prelude::ConstU32<5>;
             type ReserveIdentifier = [u8; 8];
-            /// The type for recording an account's balance.
-            type Balance = Balance;
-            type DustRemoval = HandleDust;
-            type ExistentialDeposit = ExistentialDeposit;
-            type AccountStore = Account;
-			type FreezeIdentifier = ();
-			type MaxHolds = frame_support::pallet_prelude::ConstU32<0>;
-			type MaxFreezes = frame_support::pallet_prelude::ConstU32<0>;
-            type WeightInfo = common_runtime::weights::pallet_balances::WeightInfo<Runtime>;
+            type RuntimeEvent = RuntimeEvent;
+            type RuntimeFreezeReason = ();
+            type RuntimeHoldReason = RuntimeHoldReason;
+            type WeightInfo = weights::pallet_balances::WeightInfo<Runtime>;
         }
 
-        // Take Dust from Balances and put it in the Treasury pot
-        pub struct HandleDust;
         type CreditOf = frame_support::traits::tokens::fungible::Credit<AccountId, Balances>;
-        impl frame_support::traits::OnUnbalanced<CreditOf> for HandleDust {
-            fn on_nonzero_unbalanced(amount: CreditOf) {
-                use frame_support::traits::Currency as _;
-                use frame_support::traits::Imbalance as _;
-                let imbalance = NegativeImbalance::new(amount.peek());
-                Balances::resolve_creating(&Treasury::account_id(), imbalance);
-            }
-        }
-
-        // fees are moved to the treasury
         pub struct HandleFees;
-        type NegativeImbalance = <Balances as frame_support::traits::Currency<AccountId>>::NegativeImbalance;
-        impl frame_support::traits::OnUnbalanced<NegativeImbalance> for HandleFees {
-            fn on_nonzero_unbalanced(amount: NegativeImbalance) {
-                use frame_support::traits::Currency as _;
-
+        impl frame_support::traits::OnUnbalanced<CreditOf> for HandleFees {
+            fn on_nonzero_unbalanced(amount: CreditOf) {
                 // fee is moved to treasury
-                Balances::resolve_creating(&Treasury::account_id(), amount);
-                // should move the tip to author
-                // if let Some(author) = Authorship::author() {
-                //     Balances::resolve_creating(&author, amount);
-                // }
+                let _ = Balances::deposit(
+                    &Treasury::account_id(),
+                    amount.peek(),
+                    frame_support::traits::tokens::Precision::Exact,
+                );
             }
         }
         pub struct OnChargeTransaction;
 
         parameter_types! {
-            pub FeeMultiplier: pallet_transaction_payment::Multiplier = pallet_transaction_payment::Multiplier::one();
+        pub Target: Perquintill = Perquintill::from_percent(25);
+        pub MaxMultiplier: sp_runtime::FixedU128 = 10.into();
         }
         impl pallet_transaction_payment::Config for Runtime {
-            type RuntimeEvent = RuntimeEvent;
+            type FeeMultiplierUpdate =
+                common_runtime::fees::FeeMultiplier<Self, Target, MaxMultiplier>;
+            type LengthToFee = common_runtime::fees::LengthToFeeImpl<Balance, Self, Target>;
             // does a filter on the call
             type OnChargeTransaction = OneshotAccount;
             type OperationalFeeMultiplier = frame_support::traits::ConstU8<5>;
-            type WeightToFee = common_runtime::fees::WeightToFeeImpl<Balance>;
-            type LengthToFee = common_runtime::fees::LengthToFeeImpl<Balance>;
-            type FeeMultiplierUpdate = pallet_transaction_payment::ConstFeeMultiplier<FeeMultiplier>;
+            type RuntimeEvent = RuntimeEvent;
+            type WeightToFee = common_runtime::fees::WeightToFeeImpl<Balance, Self, Target>;
         }
         impl pallet_oneshot_account::Config for Runtime {
-            type RuntimeEvent = RuntimeEvent;
             type Currency = Balances;
             // when call is not oneshot account, fall back to duniter-account implementation
             type InnerOnChargeTransaction = Account;
-            type WeightInfo = common_runtime::weights::pallet_oneshot_account::WeightInfo<Runtime>;
+            type RuntimeEvent = RuntimeEvent;
+            type WeightInfo = weights::pallet_oneshot_account::WeightInfo<Runtime>;
         }
 
         // CONSENSUS  //
@@ -232,66 +217,70 @@ type RuntimeFreezeReason = ();
             type MaxAuthorities = MaxAuthorities;
         }
         impl pallet_authority_members::Config for Runtime {
-            type RuntimeEvent = RuntimeEvent;
             type IsMember = SmithMembers;
-            type OnNewSession = OnNewSessionHandler<Runtime>;
+            type MaxAuthorities = MaxAuthorities;
             type MemberId = IdtyIndex;
             type MemberIdOf = common_runtime::providers::IdentityIndexOf<Self>;
-            type MaxAuthorities = MaxAuthorities;
-            type RemoveMemberOrigin = EnsureRoot<Self::AccountId>;
-			type WeightInfo = common_runtime::weights::pallet_authority_members::WeightInfo<Runtime>;
             type OnIncomingMember = SmithMembers;
+            type OnNewSession = OnNewSessionHandler<Runtime>;
             type OnOutgoingMember = SmithMembers;
+            type RemoveMemberOrigin = EnsureRoot<Self::AccountId>;
+            type RuntimeEvent = RuntimeEvent;
+            type WeightInfo = weights::pallet_authority_members::WeightInfo<Runtime>;
         }
         impl pallet_authorship::Config for Runtime {
             type EventHandler = ImOnline;
             type FindAuthor = pallet_session::FindAccountFromAuthorIndex<Self, Babe>;
         }
         impl pallet_im_online::Config for Runtime {
-            type RuntimeEvent = RuntimeEvent;
             type AuthorityId = ImOnlineId;
-            type ValidatorSet = Historical;
-            type NextSessionRotation = Babe;
-            type ReportUnresponsiveness = Offences;
-            type UnsignedPriority = ImOnlineUnsignedPriority;
-            type WeightInfo = common_runtime::weights::pallet_im_online::WeightInfo<Runtime>;
             #[cfg(not(feature = "runtime-benchmarks"))]
             type MaxKeys = MaxAuthorities;
             #[cfg(feature = "runtime-benchmarks")]
-            type MaxKeys = frame_support::traits::ConstU32<1_000>; // At least 1000 to be benchmarkable see https://github.com/paritytech/substrate/blob/e94cb0dafd4f30ff29512c1c00ec513ada7d2b5d/frame/im-online/src/benchmarking.rs#L35
+            type MaxKeys = frame_support::traits::ConstU32<1_000>;
             type MaxPeerInHeartbeats = MaxPeerInHeartbeats;
+            type NextSessionRotation = Babe;
+            type ReportUnresponsiveness = Offences;
+            type RuntimeEvent = RuntimeEvent;
+            type UnsignedPriority = ImOnlineUnsignedPriority;
+            type ValidatorSet = Historical;
+            type WeightInfo = weights::pallet_im_online::WeightInfo<Runtime>;
         }
         impl pallet_offences::Config for Runtime {
-            type RuntimeEvent = RuntimeEvent;
             type IdentificationTuple = pallet_session::historical::IdentificationTuple<Self>;
             type OnOffenceHandler = AuthorityMembers;
+            type RuntimeEvent = RuntimeEvent;
         }
         impl pallet_session::Config for Runtime {
+            type Keys = opaque::SessionKeys;
+            type NextSessionRotation = Babe;
             type RuntimeEvent = RuntimeEvent;
+            type SessionHandler = <opaque::SessionKeys as OpaqueKeys>::KeyTypeIdProviders;
+            type SessionManager =
+                pallet_session::historical::NoteHistoricalRoot<Self, AuthorityMembers>;
+            type ShouldEndSession = Babe;
             type ValidatorId = AccountId;
             type ValidatorIdOf = sp_runtime::traits::ConvertInto;
-            type ShouldEndSession = Babe;
-            type NextSessionRotation = Babe;
-            type SessionManager = pallet_session::historical::NoteHistoricalRoot<Self, AuthorityMembers>;
-            type SessionHandler = <opaque::SessionKeys as OpaqueKeys>::KeyTypeIdProviders;
-            type Keys = opaque::SessionKeys;
-            type WeightInfo = common_runtime::weights::pallet_session::WeightInfo<Runtime>;
+            type WeightInfo = weights::pallet_session::WeightInfo<Runtime>;
         }
         impl pallet_session::historical::Config for Runtime {
             type FullIdentification = ValidatorFullIdentification;
             type FullIdentificationOf = FullIdentificationOfImpl;
         }
         impl pallet_grandpa::Config for Runtime {
-            type RuntimeEvent = RuntimeEvent;
-            type KeyOwnerProof =
-                <Historical as KeyOwnerProofSystem<(KeyTypeId, GrandpaId)>>::Proof;
-            type EquivocationReportSystem =
-            		pallet_grandpa::EquivocationReportSystem<Self, Offences, Historical, ReportLongevity>;
-            type WeightInfo = common_runtime::weights::pallet_grandpa::WeightInfo<Runtime>;
+            type EquivocationReportSystem = pallet_grandpa::EquivocationReportSystem<
+                Self,
+                Offences,
+                Historical,
+                ReportLongevity,
+            >;
+            type KeyOwnerProof = <Historical as KeyOwnerProofSystem<(KeyTypeId, GrandpaId)>>::Proof;
             type MaxAuthorities = MaxAuthorities;
-			type MaxSetIdSessionEntries = MaxSetIdSessionEntries;
-			type MaxNominators = frame_support::traits::ConstU32<64>;
-		}
+            type MaxNominators = frame_support::traits::ConstU32<64>;
+            type MaxSetIdSessionEntries = MaxSetIdSessionEntries;
+            type RuntimeEvent = RuntimeEvent;
+            type WeightInfo = weights::pallet_grandpa::WeightInfo<Runtime>;
+        }
         parameter_types! {
             // BondingDuration::get() * SessionsPerEra::get();
             pub const MaxSetIdSessionEntries: u32 = 1000;
@@ -299,22 +288,26 @@ type RuntimeFreezeReason = ();
 
         // ONCHAIN GOVERNANCE //
 
-		#[cfg(feature = "runtime-benchmarks")]
-		parameter_types! {
-			pub const WorstCaseOrigin: pallet_collective::RawOrigin<AccountId, TechnicalCommitteeInstance> =
-				pallet_collective::RawOrigin::<AccountId, TechnicalCommitteeInstance>::Members(2, 3);
-		}
-
-		impl pallet_upgrade_origin::Config for Runtime {
-			type RuntimeEvent = RuntimeEvent;
-			type Call = RuntimeCall;
-			type UpgradableOrigin = pallet_collective::EnsureProportionAtLeast<AccountId, TechnicalCommitteeInstance, 2, 3>;
-			type WeightInfo = common_runtime::weights::pallet_upgrade_origin::WeightInfo<Runtime>;
-			#[cfg(feature = "runtime-benchmarks")]
-			type WorstCaseOriginType = pallet_collective::RawOrigin<AccountId, TechnicalCommitteeInstance>;
-			#[cfg(feature = "runtime-benchmarks")]
-			type WorstCaseOrigin = WorstCaseOrigin;
-		}
+        #[cfg(feature = "runtime-benchmarks")]
+        parameter_types! {
+        pub const WorstCaseOrigin: WorstOrigin = WorstOrigin::Members(2, 3);
+        }
+
+        impl pallet_upgrade_origin::Config for Runtime {
+            type Call = RuntimeCall;
+            type RuntimeEvent = RuntimeEvent;
+            type UpgradableOrigin = pallet_collective::EnsureProportionAtLeast<
+                AccountId,
+                TechnicalCommitteeInstance,
+                2,
+                3,
+            >;
+            type WeightInfo = weights::pallet_upgrade_origin::WeightInfo<Runtime>;
+            #[cfg(feature = "runtime-benchmarks")]
+            type WorstCaseOrigin = WorstCaseOrigin;
+            #[cfg(feature = "runtime-benchmarks")]
+            type WorstCaseOriginType = RawOrigin<AccountId, TechnicalCommitteeInstance>;
+        }
 
         parameter_types! {
             pub const PreimageMaxSize: u32 = 4096 * 1024;
@@ -323,32 +316,32 @@ type RuntimeFreezeReason = ();
         }
 
         impl pallet_preimage::Config for Runtime {
-            type RuntimeEvent = RuntimeEvent;
-            type WeightInfo = common_runtime::weights::pallet_preimage::WeightInfo<Runtime>;
+            type Consideration = ();
             type Currency = Balances;
             type ManagerOrigin = EnsureRoot<AccountId>;
-			type Consideration = ();
+            type RuntimeEvent = RuntimeEvent;
+            type WeightInfo = weights::pallet_preimage::WeightInfo<Runtime>;
         }
 
         // UTILITIES //
 
         impl pallet_atomic_swap::Config for Runtime {
+            type ProofLimit = frame_support::traits::ConstU32<1_024>;
             type RuntimeEvent = RuntimeEvent;
             type SwapAction = pallet_atomic_swap::BalanceSwapAction<AccountId, Balances>;
-            type ProofLimit = frame_support::traits::ConstU32<1_024>;
         }
 
         impl pallet_provide_randomness::Config for Runtime {
-            type RuntimeEvent = RuntimeEvent;
             type Currency = Balances;
             type GetCurrentEpochIndex = GetCurrentEpochIndex<Self>;
             type MaxRequests = frame_support::traits::ConstU32<100>;
-            type RequestPrice = frame_support::traits::ConstU64<2_000>;
             type OnFilledRandomness = ();
-            type OnUnbalanced = Treasury;
+            type OnUnbalanced = HandleFees;
             type ParentBlockRandomness = pallet_babe::ParentBlockRandomness<Self>;
             type RandomnessFromOneEpochAgo = pallet_babe::RandomnessFromOneEpochAgo<Self>;
-			type WeightInfo = common_runtime::weights::pallet_provide_randomness::WeightInfo<Runtime>;
+            type RequestPrice = frame_support::traits::ConstU64<2_000>;
+            type RuntimeEvent = RuntimeEvent;
+            type WeightInfo = weights::pallet_provide_randomness::WeightInfo<Runtime>;
         }
 
         parameter_types! {
@@ -360,18 +353,18 @@ type RuntimeFreezeReason = ();
             pub const AnnouncementDepositFactor: Balance = deposit(0, 66);
         }
         impl pallet_proxy::Config for Runtime {
-            type RuntimeEvent = RuntimeEvent;
-            type RuntimeCall = RuntimeCall;
+            type AnnouncementDepositBase = AnnouncementDepositBase;
+            type AnnouncementDepositFactor = AnnouncementDepositFactor;
+            type CallHasher = BlakeTwo256;
             type Currency = Balances;
-            type ProxyType = ProxyType;
+            type MaxPending = frame_support::traits::ConstU32<32>;
+            type MaxProxies = frame_support::traits::ConstU32<32>;
             type ProxyDepositBase = ProxyDepositBase;
             type ProxyDepositFactor = ProxyDepositFactor;
-            type MaxProxies = frame_support::traits::ConstU32<32>;
-            type MaxPending = frame_support::traits::ConstU32<32>;
-            type CallHasher = BlakeTwo256;
-            type AnnouncementDepositBase = AnnouncementDepositBase;
-            type AnnouncementDepositFactor = AnnouncementDepositFactor;
-            type WeightInfo = common_runtime::weights::pallet_proxy::WeightInfo<Runtime>;
+            type ProxyType = ProxyType;
+            type RuntimeCall = RuntimeCall;
+            type RuntimeEvent = RuntimeEvent;
+            type WeightInfo = weights::pallet_proxy::WeightInfo<Runtime>;
         }
 
         parameter_types! {
@@ -379,20 +372,20 @@ type RuntimeFreezeReason = ();
             pub const DepositFactor: Balance = DEPOSIT_PER_BYTE * 32;
         }
         impl pallet_multisig::Config for Runtime {
-            type RuntimeEvent = RuntimeEvent;
-            type RuntimeCall = RuntimeCall;
             type Currency = Balances;
             type DepositBase = DepositBase;
             type DepositFactor = DepositFactor;
             type MaxSignatories = MaxSignatories;
-            type WeightInfo = common_runtime::weights::pallet_multisig::WeightInfo<Runtime>;
+            type RuntimeCall = RuntimeCall;
+            type RuntimeEvent = RuntimeEvent;
+            type WeightInfo = weights::pallet_multisig::WeightInfo<Runtime>;
         }
 
         impl pallet_utility::Config for Runtime {
-            type RuntimeEvent = RuntimeEvent;
-            type RuntimeCall = RuntimeCall;
             type PalletsOrigin = OriginCaller;
-            type WeightInfo = common_runtime::weights::pallet_utility::WeightInfo<Runtime>;
+            type RuntimeCall = RuntimeCall;
+            type RuntimeEvent = RuntimeEvent;
+            type WeightInfo = weights::pallet_utility::WeightInfo<Runtime>;
         }
 
         parameter_types! {
@@ -405,63 +398,58 @@ type RuntimeFreezeReason = ();
             pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry");
         }
         impl pallet_treasury::Config for Runtime {
-            type ApproveOrigin = TreasuryApproveOrigin;
+            type AssetKind = ();
+            type BalanceConverter = frame_support::traits::tokens::UnityAssetBalanceConversion;
+            #[cfg(feature = "runtime-benchmarks")]
+            type BenchmarkHelper = ();
+            type Beneficiary = AccountId;
+            type BeneficiaryLookup = AccountIdLookup<AccountId, ()>;
             type Burn = Burn;
             type BurnDestination = ();
             type Currency = Balances;
-            type RuntimeEvent = RuntimeEvent;
-            type OnSlash = Treasury;
-            type ProposalBond = ProposalBond;
-            type ProposalBondMinimum = frame_support::traits::ConstU64<10_000>;
-            type ProposalBondMaximum = ProposalBondMaximum;
             type MaxApprovals = frame_support::traits::ConstU32<100>;
             type PalletId = TreasuryPalletId;
+            type Paymaster =
+                frame_support::traits::tokens::pay::PayFromAccount<Balances, TreasuryAccount>;
+            type PayoutPeriod = sp_core::ConstU32<10>;
             type RejectOrigin = TreasuryRejectOrigin;
+            type RuntimeEvent = RuntimeEvent;
             type SpendFunds = TreasurySpendFunds<Self>;
-            type SpendPeriod = SpendPeriod;
             type SpendOrigin = frame_support::traits::NeverEnsureOrigin<Balance>;
-            type WeightInfo = common_runtime::weights::pallet_treasury::WeightInfo<Runtime>;
-            type AssetKind = ();
-            type Beneficiary = AccountId;
-            type BeneficiaryLookup = AccountIdLookup<AccountId, ()>;
-            type Paymaster = frame_support::traits::tokens::pay::PayFromAccount<Balances, TreasuryAccount>;
-            type BalanceConverter = frame_support::traits::tokens::UnityAssetBalanceConversion;
-            type PayoutPeriod = sp_core::ConstU32<10>;
-            #[cfg(feature = "runtime-benchmarks")]
-            type BenchmarkHelper = ();
+            type SpendPeriod = SpendPeriod;
+            type WeightInfo = weights::pallet_treasury::WeightInfo<Runtime>;
         }
 
         // UNIVERSAL DIVIDEND //
 
-		pub struct MembersCount;
-		impl frame_support::pallet_prelude::Get<Balance> for MembersCount {
-			fn get() -> Balance {
-				<Membership as sp_membership::traits::MembersCount>::members_count() as Balance
-			}
-		}
+        pub struct MembersCount;
+        impl frame_support::pallet_prelude::Get<Balance> for MembersCount {
+            fn get() -> Balance {
+                <Membership as sp_membership::traits::MembersCount>::members_count() as Balance
+            }
+        }
 
         impl pallet_universal_dividend::Config for Runtime {
-            type MomentIntoBalance = sp_runtime::traits::ConvertInto;
             type Currency = Balances;
-            type RuntimeEvent = RuntimeEvent;
-			type MaxPastReeval = frame_support::traits::ConstU32<160>;
+            #[cfg(feature = "runtime-benchmarks")]
+            type IdtyAttr = Identity;
+            type MaxPastReeval = frame_support::traits::ConstU32<160>;
             type MembersCount = MembersCount;
             type MembersStorage = common_runtime::providers::UdMembersStorage<Runtime>;
+            type MomentIntoBalance = sp_runtime::traits::ConvertInto;
+            type RuntimeEvent = RuntimeEvent;
             type SquareMoneyGrowthRate = SquareMoneyGrowthRate;
             type UdCreationPeriod = UdCreationPeriod;
             type UdReevalPeriod = UdReevalPeriod;
-            type UnitsPerUd = frame_support::traits::ConstU64<1_000>;
-			type WeightInfo = common_runtime::weights::pallet_universal_dividend::WeightInfo<Runtime>;
-            #[cfg(feature = "runtime-benchmarks")]
-            type AccountIdOf = common_runtime::providers::IdentityAccountIdProvider<Self>;
+            type WeightInfo = weights::pallet_universal_dividend::WeightInfo<Runtime>;
         }
 
         // WEB OF TRUST //
 
         impl pallet_duniter_wot::Config for Runtime {
             type FirstIssuableOn = WotFirstCertIssuableOn;
-            type MinCertForMembership = WotMinCertForMembership;
             type MinCertForCreateIdtyRight = WotMinCertForCreateIdtyRight;
+            type MinCertForMembership = WotMinCertForMembership;
         }
 
         parameter_types! {
@@ -469,86 +457,88 @@ type RuntimeFreezeReason = ();
             pub const DeletionPeriod: BlockNumber = 10 * YEARS;
         }
         impl pallet_identity::Config for Runtime {
-			type ChangeOwnerKeyPeriod = ChangeOwnerKeyPeriod;
-            type ConfirmPeriod = ConfirmPeriod;
-            type ValidationPeriod = ValidationPeriod;
+            type AccountLinker = Account;
             type AutorevocationPeriod = AutorevocationPeriod;
-            type DeletionPeriod = DeletionPeriod;
+            type ChangeOwnerKeyPeriod = ChangeOwnerKeyPeriod;
+            type CheckAccountWorthiness = Account;
             type CheckIdtyCallAllowed = Wot;
+            type ConfirmPeriod = ConfirmPeriod;
+            type DeletionPeriod = DeletionPeriod;
             type IdtyCreationPeriod = IdtyCreationPeriod;
-			type IdtyData = IdtyData;
+            type IdtyData = IdtyData;
             type IdtyIndex = IdtyIndex;
-            type AccountLinker = Account;
             type IdtyNameValidator = IdtyNameValidatorImpl;
-            type Signer = <Signature as sp_runtime::traits::Verify>::Signer;
-			type Signature = Signature;
-            type OnIdtyChange = (Wot, Quota);
+            type OnNewIdty = OnNewIdtyHandler<Runtime>;
+            type OnRemoveIdty = OnRemoveIdtyHandler<Runtime>;
+            type OwnerKeyChangePermission = OwnerKeyChangePermissionHandler<Runtime>;
             type RuntimeEvent = RuntimeEvent;
-            type WeightInfo = common_runtime::weights::pallet_identity::WeightInfo<Runtime>;
+            type Signature = Signature;
+            type Signer = <Signature as sp_runtime::traits::Verify>::Signer;
+            type ValidationPeriod = ValidationPeriod;
+            type WeightInfo = weights::pallet_identity::WeightInfo<Runtime>;
         }
 
-    impl pallet_sudo::Config for Runtime {
-        type RuntimeEvent = RuntimeEvent;
-        type RuntimeCall = RuntimeCall;
-        type WeightInfo = common_runtime::weights::pallet_sudo::WeightInfo<Runtime>;
-    }
+        impl pallet_sudo::Config for Runtime {
+            type RuntimeCall = RuntimeCall;
+            type RuntimeEvent = RuntimeEvent;
+            type WeightInfo = weights::pallet_sudo::WeightInfo<Runtime>;
+        }
 
         impl pallet_membership::Config for Runtime {
+            #[cfg(feature = "runtime-benchmarks")]
+            type BenchmarkSetupHandler = common_runtime::providers::BenchmarkSetupHandler<Runtime>;
             type CheckMembershipOpAllowed = Wot;
+            type IdtyAttr = Identity;
             type IdtyId = IdtyIndex;
-            type IdtyIdOf = common_runtime::providers::IdentityIndexOf<Self>;
-            type AccountIdOf = common_runtime::providers::IdentityAccountIdProvider<Self>;
             type MembershipPeriod = MembershipPeriod;
             type MembershipRenewalPeriod = MembershipRenewalPeriod;
-            type OnEvent = (OnMembershipEventHandler<Wot, Runtime>, Wot);
+            type OnNewMembership = OnNewMembershipHandler<Runtime>;
+            type OnRemoveMembership = OnRemoveMembershipHandler<Runtime>;
             type RuntimeEvent = RuntimeEvent;
-            type WeightInfo = common_runtime::weights::pallet_membership::WeightInfo<Runtime>;
-            #[cfg(feature = "runtime-benchmarks")]
-            type BenchmarkSetupHandler = common_runtime::providers::BenchmarkSetupHandler<Runtime>;
+            type WeightInfo = weights::pallet_membership::WeightInfo<Runtime>;
         }
 
         impl pallet_certification::Config for Runtime {
             type CertPeriod = CertPeriod;
-            type IdtyIndex = IdtyIndex;
-            type IdtyAttr = Identity;
             type CheckCertAllowed = Wot;
+            type IdtyAttr = Identity;
+            type IdtyIndex = IdtyIndex;
             type MaxByIssuer = MaxByIssuer;
             type MinReceivedCertToBeAbleToIssueCert = MinReceivedCertToBeAbleToIssueCert;
             type OnNewcert = Wot;
             type OnRemovedCert = Wot;
             type RuntimeEvent = RuntimeEvent;
-            type WeightInfo = common_runtime::weights::pallet_certification::WeightInfo<Runtime>;
             type ValidityPeriod = ValidityPeriod;
+            type WeightInfo = weights::pallet_certification::WeightInfo<Runtime>;
         }
-        parameter_types! {
-            pub const MinAccessibleReferees: Perbill = Perbill::from_percent(80);
-        }
+
         impl pallet_distance::Config for Runtime {
+            type CheckRequestDistanceEvaluation = Wot;
             type Currency = Balances;
+            type EvaluationPeriod = frame_support::traits::ConstU32<7>;
             type EvaluationPrice = frame_support::traits::ConstU64<1000>;
-            type MaxRefereeDistance = frame_support::traits::ConstU32<5>;
+            type MaxRefereeDistance = MaxRefereeDistance;
             type MinAccessibleReferees = MinAccessibleReferees;
-            type RuntimeEvent = RuntimeEvent;
-            type WeightInfo = common_runtime::weights::pallet_distance::WeightInfo<Runtime>;
+            type OnUnbalanced = HandleFees;
             type OnValidDistanceStatus = Wot;
-            type CheckRequestDistanceEvaluation = Wot;
+            type RuntimeEvent = RuntimeEvent;
+            type RuntimeHoldReason = RuntimeHoldReason;
+            type WeightInfo = weights::pallet_distance::WeightInfo<Runtime>;
         }
 
         // SMITH-MEMBERS
         impl pallet_smith_members::Config for Runtime {
-            type RuntimeEvent = RuntimeEvent;
+            type IdtyAttr = Identity;
+            type IdtyIdOfAuthorityId = sp_runtime::traits::ConvertInto;
             type IdtyIndex = IdtyIndex;
             type IsWoTMember = common_runtime::providers::IsWoTMemberProvider<Runtime>;
-            type IdtyIdOf = common_runtime::providers::IdentityIndexOf<Self>;
-            type MinCertForMembership = SmithWotMinCertForMembership;
             type MaxByIssuer = SmithMaxByIssuer;
-            type SmithInactivityMaxDuration = SmithInactivityMaxDuration;
-            type OnSmithDelete = OnSmithDeletedHandler<Runtime>;
-            type IdtyIdOfAuthorityId = sp_runtime::traits::ConvertInto;
             type MemberId = IdtyIndex;
-            type WeightInfo = common_runtime::weights::pallet_smith_members::WeightInfo<Runtime>;
-            // TODO: remove as it is only used for benchmarking
-            type OwnerKeyOf = Identity;
+            type MinCertForMembership = SmithWotMinCertForMembership;
+            type OnSmithDelete = OnSmithDeletedHandler<Runtime>;
+            type RuntimeEvent = RuntimeEvent;
+            type SmithInactivityMaxDuration = SmithInactivityMaxDuration;
+            type WeightInfo = weights::pallet_smith_members::WeightInfo<Runtime>;
         }
 
         pub struct TechnicalCommitteeDefaultVote;
@@ -564,22 +554,22 @@ type RuntimeFreezeReason = ();
         }
         parameter_types! {
             pub const TechnicalCommitteeMotionDuration: BlockNumber = 7 * DAYS;
-            pub MaxProposalWeight: Weight = Perbill::from_percent(50) * BlockWeights::get().max_block;
+            pub MaxWeight: Weight = Perbill::from_percent(50) * BlockWeights::get().max_block;
         }
         impl pallet_collective::Config<Instance2> for Runtime {
-            type RuntimeOrigin = RuntimeOrigin;
-            type Proposal = RuntimeCall;
-            type RuntimeEvent = RuntimeEvent;
-            type MotionDuration = TechnicalCommitteeMotionDuration;
-            type MaxProposals = frame_support::pallet_prelude::ConstU32<20>;
-            type MaxMembers = frame_support::pallet_prelude::ConstU32<100>;
-            type WeightInfo = common_runtime::weights::pallet_collective::WeightInfo<Runtime>;
-            type SetMembersOrigin = EnsureRoot<AccountId>;
-            type MaxProposalWeight = MaxProposalWeight;
             #[cfg(not(feature = "runtime-benchmarks"))]
             type DefaultVote = TechnicalCommitteeDefaultVote;
             #[cfg(feature = "runtime-benchmarks")]
-            type DefaultVote = pallet_collective::PrimeDefaultVote; // Overwrite with a  default vote that can return `true` sometimes as it is necessary for benchmarking
+            type DefaultVote = pallet_collective::PrimeDefaultVote;
+            type MaxMembers = frame_support::pallet_prelude::ConstU32<100>;
+            type MaxProposalWeight = MaxWeight;
+            type MaxProposals = frame_support::pallet_prelude::ConstU32<20>;
+            type MotionDuration = TechnicalCommitteeMotionDuration;
+            type Proposal = RuntimeCall;
+            type RuntimeEvent = RuntimeEvent;
+            type RuntimeOrigin = RuntimeOrigin;
+            type SetMembersOrigin = EnsureRoot<AccountId>;
+            type WeightInfo = weights::pallet_collective::WeightInfo<Runtime>;
         }
     };
 }
diff --git a/runtime/common/src/providers.rs b/runtime/common/src/providers.rs
index c947ce58856bd7dd997448a57bbfe9be65580f1d..829be1a07e64d033fd9f68b85c31db1f0612a670 100644
--- a/runtime/common/src/providers.rs
+++ b/runtime/common/src/providers.rs
@@ -97,7 +97,10 @@ macro_rules! impl_benchmark_setup_handler {
             <T as pallet_certification::Config>::IdtyIndex: From<u32>,
         {
             fn force_valid_distance_status(idty_id: &IdtyIndex) -> () {
-                let _ = pallet_distance::Pallet::<T>::do_valid_distance_status(*idty_id);
+                let _ = pallet_distance::Pallet::<T>::do_valid_distance_status(
+                    *idty_id,
+                    sp_runtime::Perbill::one(),
+                );
             }
 
             fn add_cert(issuer: &IdtyIndex, receiver: &IdtyIndex) {
diff --git a/runtime/common/src/weights/pallet_distance.rs b/runtime/common/src/weights/pallet_distance.rs
deleted file mode 100644
index 46dc9308d3b50efb65f72af04e95e6f1b4798e63..0000000000000000000000000000000000000000
--- a/runtime/common/src/weights/pallet_distance.rs
+++ /dev/null
@@ -1,180 +0,0 @@
-// Copyright 2021-2022 Axiom-Team
-//
-// This file is part of Duniter-v2S.
-//
-// Duniter-v2S is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Affero General Public License as published by
-// the Free Software Foundation, version 3 of the License.
-//
-// Duniter-v2S is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Affero General Public License for more details.
-//
-// You should have received a copy of the GNU Affero General Public License
-// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
-
-//! Autogenerated weights for `pallet_distance`
-//!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
-//! WORST CASE MAP SIZE: `1000000`
-//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
-//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
-
-// Executed Command:
-// target/release/duniter
-// benchmark
-// pallet
-// --chain=dev
-// --steps=50
-// --repeat=20
-// --pallet=*
-// --extrinsic=*
-// --wasm-execution=compiled
-// --heap-pages=4096
-// --header=./file_header.txt
-// --output=./runtime/common/src/weights/
-
-#![cfg_attr(rustfmt, rustfmt_skip)]
-#![allow(unused_parens)]
-#![allow(unused_imports)]
-#![allow(missing_docs)]
-
-use frame_support::{traits::Get, weights::Weight};
-use core::marker::PhantomData;
-
-/// Weight functions for `pallet_distance`.
-pub struct WeightInfo<T>(PhantomData<T>);
-impl<T: frame_system::Config> pallet_distance::WeightInfo for WeightInfo<T> {
-	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
-	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
-	/// Storage: `Identity::Identities` (r:1 w:0)
-	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
-	/// Storage: `Distance::PendingEvaluationRequest` (r:1 w:1)
-	/// Proof: `Distance::PendingEvaluationRequest` (`max_values`: None, `max_size`: None, mode: `Measured`)
-	/// Storage: `Membership::Membership` (r:1 w:0)
-	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
-	/// Storage: `Parameters::ParametersStorage` (r:1 w:0)
-	/// Proof: `Parameters::ParametersStorage` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
-	/// Storage: `Certification::StorageIdtyCertMeta` (r:1 w:0)
-	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
-	/// Storage: `Session::CurrentIndex` (r:1 w:0)
-	/// Proof: `Session::CurrentIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
-	/// Storage: `Distance::EvaluationPool2` (r:1 w:1)
-	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
-	/// Storage: `System::Account` (r:1 w:1)
-	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
-	fn request_distance_evaluation() -> Weight {
-		// Proof Size summary in bytes:
-		//  Measured:  `1596`
-		//  Estimated: `5061`
-		// Minimum execution time: 41_417_000 picoseconds.
-		Weight::from_parts(43_366_000, 0)
-			.saturating_add(Weight::from_parts(0, 5061))
-			.saturating_add(T::DbWeight::get().reads(9))
-			.saturating_add(T::DbWeight::get().writes(3))
-	}
-	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
-	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
-	/// Storage: `Identity::Identities` (r:2 w:0)
-	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
-	/// Storage: `Distance::PendingEvaluationRequest` (r:1 w:1)
-	/// Proof: `Distance::PendingEvaluationRequest` (`max_values`: None, `max_size`: None, mode: `Measured`)
-	/// Storage: `Membership::Membership` (r:1 w:0)
-	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
-	/// Storage: `Parameters::ParametersStorage` (r:1 w:0)
-	/// Proof: `Parameters::ParametersStorage` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
-	/// Storage: `Certification::StorageIdtyCertMeta` (r:1 w:0)
-	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
-	/// Storage: `Session::CurrentIndex` (r:1 w:0)
-	/// Proof: `Session::CurrentIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
-	/// Storage: `Distance::EvaluationPool2` (r:1 w:1)
-	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
-	/// Storage: `System::Account` (r:1 w:1)
-	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
-	fn request_distance_evaluation_for() -> Weight {
-		// Proof Size summary in bytes:
-		//  Measured:  `1625`
-		//  Estimated: `7565`
-		// Minimum execution time: 43_523_000 picoseconds.
-		Weight::from_parts(45_745_000, 0)
-			.saturating_add(Weight::from_parts(0, 7565))
-			.saturating_add(T::DbWeight::get().reads(10))
-			.saturating_add(T::DbWeight::get().writes(3))
-	}
-	/// Storage: `Distance::DidUpdate` (r:1 w:1)
-	/// Proof: `Distance::DidUpdate` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
-	/// Storage: `Authorship::Author` (r:1 w:1)
-	/// Proof: `Authorship::Author` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
-	/// Storage: `System::Digest` (r:1 w:0)
-	/// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
-	/// Storage: `Session::Validators` (r:1 w:0)
-	/// Proof: `Session::Validators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
-	/// Storage: `Session::CurrentIndex` (r:1 w:0)
-	/// Proof: `Session::CurrentIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
-	/// Storage: `Distance::EvaluationPool0` (r:1 w:1)
-	/// Proof: `Distance::EvaluationPool0` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
-	/// The range of component `i` is `[1, 600]`.
-	fn update_evaluation(i: u32, ) -> Weight {
-		// Proof Size summary in bytes:
-		//  Measured:  `773 + i * (10 ±0)`
-		//  Estimated: `2257 + i * (10 ±0)`
-		// Minimum execution time: 13_633_000 picoseconds.
-		Weight::from_parts(16_097_962, 0)
-			.saturating_add(Weight::from_parts(0, 2257))
-			// Standard Error: 139
-			.saturating_add(Weight::from_parts(103_266, 0).saturating_mul(i.into()))
-			.saturating_add(T::DbWeight::get().reads(6))
-			.saturating_add(T::DbWeight::get().writes(3))
-			.saturating_add(Weight::from_parts(0, 10).saturating_mul(i.into()))
-	}
-	/// Storage: `Session::CurrentIndex` (r:1 w:0)
-	/// Proof: `Session::CurrentIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
-	/// Storage: `Distance::EvaluationPool0` (r:1 w:1)
-	/// Proof: `Distance::EvaluationPool0` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
-	/// The range of component `i` is `[1, 600]`.
-	fn force_update_evaluation(i: u32, ) -> Weight {
-		// Proof Size summary in bytes:
-		//  Measured:  `612 + i * (10 ±0)`
-		//  Estimated: `2096 + i * (10 ±0)`
-		// Minimum execution time: 6_222_000 picoseconds.
-		Weight::from_parts(8_460_482, 0)
-			.saturating_add(Weight::from_parts(0, 2096))
-			// Standard Error: 296
-			.saturating_add(Weight::from_parts(104_396, 0).saturating_mul(i.into()))
-			.saturating_add(T::DbWeight::get().reads(2))
-			.saturating_add(T::DbWeight::get().writes(1))
-			.saturating_add(Weight::from_parts(0, 10).saturating_mul(i.into()))
-	}
-	/// Storage: `Identity::Identities` (r:1 w:0)
-	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
-	/// Storage: `Membership::Membership` (r:1 w:1)
-	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
-	/// Storage: `Membership::MembershipsExpireOn` (r:2 w:2)
-	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
-	/// Storage: `Parameters::ParametersStorage` (r:1 w:0)
-	/// Proof: `Parameters::ParametersStorage` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
-	fn force_valid_distance_status() -> Weight {
-		// Proof Size summary in bytes:
-		//  Measured:  `609`
-		//  Estimated: `6549`
-		// Minimum execution time: 24_403_000 picoseconds.
-		Weight::from_parts(25_562_000, 0)
-			.saturating_add(Weight::from_parts(0, 6549))
-			.saturating_add(T::DbWeight::get().reads(5))
-			.saturating_add(T::DbWeight::get().writes(3))
-	}
-	/// Storage: `Distance::DidUpdate` (r:1 w:1)
-	/// Proof: `Distance::DidUpdate` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
-	fn on_finalize() -> Weight {
-		// Proof Size summary in bytes:
-		//  Measured:  `170`
-		//  Estimated: `1655`
-		// Minimum execution time: 2_756_000 picoseconds.
-		Weight::from_parts(2_960_000, 0)
-			.saturating_add(Weight::from_parts(0, 1655))
-			.saturating_add(T::DbWeight::get().reads(1))
-			.saturating_add(T::DbWeight::get().writes(1))
-	}
-}
diff --git a/runtime/common/src/weights/pallet_treasury.rs b/runtime/common/src/weights/pallet_treasury.rs
deleted file mode 100644
index 22b365da01efcef7cf6b4eed5b525ffda67fa6dc..0000000000000000000000000000000000000000
--- a/runtime/common/src/weights/pallet_treasury.rs
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright 2021-2022 Axiom-Team
-//
-// This file is part of Duniter-v2S.
-//
-// Duniter-v2S is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Affero General Public License as published by
-// the Free Software Foundation, version 3 of the License.
-//
-// Duniter-v2S is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Affero General Public License for more details.
-//
-// You should have received a copy of the GNU Affero General Public License
-// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
-
-//! Autogenerated weights for `pallet_treasury`
-//!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
-//! WORST CASE MAP SIZE: `1000000`
-//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
-//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
-
-// Executed Command:
-// target/release/duniter
-// benchmark
-// pallet
-// --chain=dev
-// --steps=50
-// --repeat=20
-// --pallet=*
-// --extrinsic=*
-// --wasm-execution=compiled
-// --heap-pages=4096
-// --header=./file_header.txt
-// --output=./runtime/common/src/weights/
-
-#![cfg_attr(rustfmt, rustfmt_skip)]
-#![allow(unused_parens)]
-#![allow(unused_imports)]
-#![allow(missing_docs)]
-
-use frame_support::{traits::Get, weights::Weight};
-use core::marker::PhantomData;
-
-/// Weight functions for `pallet_treasury`.
-pub struct WeightInfo<T>(PhantomData<T>);
-impl<T: frame_system::Config> pallet_treasury::WeightInfo for WeightInfo<T> {
-	fn spend_local() -> Weight {
-		// Proof Size summary in bytes:
-		//  Measured:  `0`
-		//  Estimated: `0`
-		// Minimum execution time: 0_000 picoseconds.
-		Weight::from_parts(0, 0)
-			.saturating_add(Weight::from_parts(0, 0))
-	}
-	/// Storage: `Treasury::ProposalCount` (r:1 w:1)
-	/// Proof: `Treasury::ProposalCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
-	/// Storage: `Treasury::Proposals` (r:0 w:1)
-	/// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(92), added: 2567, mode: `MaxEncodedLen`)
-	fn propose_spend() -> Weight {
-		// Proof Size summary in bytes:
-		//  Measured:  `67`
-		//  Estimated: `1489`
-		// Minimum execution time: 16_971_000 picoseconds.
-		Weight::from_parts(17_608_000, 0)
-			.saturating_add(Weight::from_parts(0, 1489))
-			.saturating_add(T::DbWeight::get().reads(1))
-			.saturating_add(T::DbWeight::get().writes(2))
-	}
-	/// Storage: `Treasury::Proposals` (r:1 w:1)
-	/// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(92), added: 2567, mode: `MaxEncodedLen`)
-	/// Storage: `System::Account` (r:2 w:2)
-	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
-	fn reject_proposal() -> Weight {
-		// Proof Size summary in bytes:
-		//  Measured:  `272`
-		//  Estimated: `6126`
-		// Minimum execution time: 27_276_000 picoseconds.
-		Weight::from_parts(28_562_000, 0)
-			.saturating_add(Weight::from_parts(0, 6126))
-			.saturating_add(T::DbWeight::get().reads(3))
-			.saturating_add(T::DbWeight::get().writes(3))
-	}
-	/// Storage: `Treasury::Proposals` (r:1 w:0)
-	/// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(92), added: 2567, mode: `MaxEncodedLen`)
-	/// Storage: `Treasury::Approvals` (r:1 w:1)
-	/// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`)
-	/// The range of component `p` is `[0, 99]`.
-	fn approve_proposal(p: u32, ) -> Weight {
-		// Proof Size summary in bytes:
-		//  Measured:  `433 + p * (8 ±0)`
-		//  Estimated: `3557`
-		// Minimum execution time: 6_249_000 picoseconds.
-		Weight::from_parts(9_360_025, 0)
-			.saturating_add(Weight::from_parts(0, 3557))
-			// Standard Error: 1_119
-			.saturating_add(Weight::from_parts(45_823, 0).saturating_mul(p.into()))
-			.saturating_add(T::DbWeight::get().reads(2))
-			.saturating_add(T::DbWeight::get().writes(1))
-	}
-	/// Storage: `Treasury::Approvals` (r:1 w:1)
-	/// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`)
-	fn remove_approval() -> Weight {
-		// Proof Size summary in bytes:
-		//  Measured:  `90`
-		//  Estimated: `1887`
-		// Minimum execution time: 4_233_000 picoseconds.
-		Weight::from_parts(4_497_000, 0)
-			.saturating_add(Weight::from_parts(0, 1887))
-			.saturating_add(T::DbWeight::get().reads(1))
-			.saturating_add(T::DbWeight::get().writes(1))
-	}
-	/// Storage: `System::Account` (r:199 w:199)
-	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
-	/// Storage: `Treasury::Deactivated` (r:1 w:1)
-	/// Proof: `Treasury::Deactivated` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
-	/// Storage: `Treasury::Approvals` (r:1 w:1)
-	/// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`)
-	/// Storage: `Treasury::Proposals` (r:99 w:99)
-	/// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(92), added: 2567, mode: `MaxEncodedLen`)
-	/// The range of component `p` is `[0, 99]`.
-	fn on_initialize_proposals(p: u32, ) -> Weight {
-		// Proof Size summary in bytes:
-		//  Measured:  `0 + p * (195 ±0)`
-		//  Estimated: `3558 + p * (5136 ±0)`
-		// Minimum execution time: 11_467_000 picoseconds.
-		Weight::from_parts(20_940_373, 0)
-			.saturating_add(Weight::from_parts(0, 3558))
-			// Standard Error: 27_756
-			.saturating_add(Weight::from_parts(23_346_230, 0).saturating_mul(p.into()))
-			.saturating_add(T::DbWeight::get().reads(3))
-			.saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(p.into())))
-			.saturating_add(T::DbWeight::get().writes(3))
-			.saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(p.into())))
-			.saturating_add(Weight::from_parts(0, 5136).saturating_mul(p.into()))
-	}
-	fn spend() -> Weight {
-		// Proof Size summary in bytes:
-		//  Measured:  `0`
-		//  Estimated: `0`
-		// Minimum execution time: 0_000 picoseconds.
-		Weight::from_parts(0, 0)
-			.saturating_add(Weight::from_parts(0, 0))
-	}
-	/// Storage: `Treasury::Spends` (r:1 w:1)
-	/// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(61), added: 2536, mode: `MaxEncodedLen`)
-	/// Storage: `System::Account` (r:2 w:2)
-	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
-	fn payout() -> Weight {
-		// Proof Size summary in bytes:
-		//  Measured:  `179`
-		//  Estimated: `6126`
-		// Minimum execution time: 39_353_000 picoseconds.
-		Weight::from_parts(40_007_000, 0)
-			.saturating_add(Weight::from_parts(0, 6126))
-			.saturating_add(T::DbWeight::get().reads(3))
-			.saturating_add(T::DbWeight::get().writes(3))
-	}
-	/// Storage: `Treasury::Spends` (r:1 w:1)
-	/// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(61), added: 2536, mode: `MaxEncodedLen`)
-	fn check_status() -> Weight {
-		// Proof Size summary in bytes:
-		//  Measured:  `116`
-		//  Estimated: `3526`
-		// Minimum execution time: 8_674_000 picoseconds.
-		Weight::from_parts(9_085_000, 0)
-			.saturating_add(Weight::from_parts(0, 3526))
-			.saturating_add(T::DbWeight::get().reads(1))
-			.saturating_add(T::DbWeight::get().writes(1))
-	}
-	/// Storage: `Treasury::Spends` (r:1 w:1)
-	/// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(61), added: 2536, mode: `MaxEncodedLen`)
-	fn void_spend() -> Weight {
-		// Proof Size summary in bytes:
-		//  Measured:  `116`
-		//  Estimated: `3526`
-		// Minimum execution time: 7_806_000 picoseconds.
-		Weight::from_parts(8_262_000, 0)
-			.saturating_add(Weight::from_parts(0, 3526))
-			.saturating_add(T::DbWeight::get().reads(1))
-			.saturating_add(T::DbWeight::get().writes(1))
-	}
-}
diff --git a/runtime/g1/Cargo.toml b/runtime/g1/Cargo.toml
index 76c98358b332ebbdd5e5289daf76d18bf2a39775..61b21bbb3c7808acc997dadb625ac4345ca79bb7 100644
--- a/runtime/g1/Cargo.toml
+++ b/runtime/g1/Cargo.toml
@@ -60,6 +60,7 @@ std = [
 	"frame-system-benchmarking/std",
 	"frame-system-rpc-runtime-api/std",
 	"frame-system/std",
+	"frame-try-runtime/std",
 	"log/std",
 	"node-primitives/std",
 	"pallet-atomic-swap/std",
@@ -114,16 +115,17 @@ std = [
 	"sp-runtime/std",
 	"sp-session/std",
 	"sp-staking/std",
-	"sp-std/std",
 	"sp-transaction-pool/std",
 	"sp-version/std",
 	"substrate-wasm-builder",
+	"sp-weights/std",
 ]
 try-runtime = [
 	"common-runtime/try-runtime",
 	"frame-executive/try-runtime",
 	"frame-support/try-runtime",
 	"frame-system/try-runtime",
+	"frame-try-runtime/try-runtime",
 	"pallet-atomic-swap/try-runtime",
 	"pallet-authority-discovery/try-runtime",
 	"pallet-authority-members/try-runtime",
@@ -178,6 +180,7 @@ frame-benchmarking = { workspace = true }
 frame-system-benchmarking = { workspace = true }
 frame-system = { workspace = true }
 frame-system-rpc-runtime-api = { workspace = true }
+frame-try-runtime = { workspace = true, optional = true }
 hex-literal = { workspace = true, optional = true }
 log = { workspace = true }
 pallet-atomic-swap = { workspace = true }
@@ -229,8 +232,8 @@ sp-membership = { workspace = true }
 sp-offchain = { workspace = true }
 sp-runtime = { workspace = true }
 sp-session = { workspace = true }
-sp-std = { workspace = true }
 sp-transaction-pool = { workspace = true }
 sp-version = { workspace = true }
 node-primitives = { workspace = true }
 sp-genesis-builder = { workspace = true }
+sp-weights = { workspace = true }
diff --git a/runtime/g1/src/lib.rs b/runtime/g1/src/lib.rs
index 64b716370645ae389873c616ceaecb720be7f6de..c2b192a2403bec3e99bacba4861cb9b39973d2ce 100644
--- a/runtime/g1/src/lib.rs
+++ b/runtime/g1/src/lib.rs
@@ -27,43 +27,48 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
 extern crate frame_benchmarking;
 
 pub mod parameters;
+pub mod weights;
 
 pub use self::parameters::*;
+use common_runtime::IdtyNameValidatorImpl;
 pub use common_runtime::{
     constants::*, entities::*, handlers::*, AccountId, Address, Balance, BlockNumber,
     FullIdentificationOfImpl, GetCurrentEpochIndex, Hash, Header, IdtyIndex, Index, Signature,
 };
+use frame_support::{
+    traits::{fungible::Balanced, Contains, Imbalance},
+    PalletId,
+};
+pub use frame_system::Call as SystemCall;
+use frame_system::EnsureRoot;
 pub use pallet_balances::Call as BalancesCall;
+#[cfg(feature = "runtime-benchmarks")]
+pub use pallet_collective::RawOrigin;
+use pallet_grandpa::{
+    fg_primitives, AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList,
+};
 pub use pallet_identity::{IdtyStatus, IdtyValue};
 pub use pallet_im_online::sr25519::AuthorityId as ImOnlineId;
 use pallet_session::historical as session_historical;
 pub use pallet_timestamp::Call as TimestampCall;
-use pallet_transaction_payment::CurrencyAdapter;
+use pallet_transaction_payment::FungibleAdapter;
 pub use pallet_universal_dividend;
-#[cfg(any(feature = "std", test))]
-pub use sp_runtime::BuildStorage;
-pub use sp_runtime::{KeyTypeId, Perbill, Permill};
-
-use common_runtime::IdtyNameValidatorImpl;
-use frame_support::traits::Contains;
-use frame_support::PalletId;
-use frame_system::EnsureRoot;
-use pallet_grandpa::fg_primitives;
-use pallet_grandpa::{AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList};
+use scale_info::prelude::{vec, vec::Vec};
 use sp_api::impl_runtime_apis;
 use sp_core::OpaqueMetadata;
-use sp_runtime::traits::{
-    AccountIdLookup, BlakeTwo256, Block as BlockT, NumberFor, One, OpaqueKeys,
-};
+#[cfg(any(feature = "std", test))]
+pub use sp_runtime::BuildStorage;
 use sp_runtime::{
     create_runtime_str, generic, impl_opaque_keys,
+    traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, NumberFor, OpaqueKeys},
     transaction_validity::{TransactionSource, TransactionValidity},
-    ApplyExtrinsicResult,
+    ApplyExtrinsicResult, Perquintill,
 };
-use sp_std::prelude::*;
+pub use sp_runtime::{KeyTypeId, Perbill, Permill};
 #[cfg(feature = "std")]
 use sp_version::NativeVersion;
 use sp_version::RuntimeVersion;
+pub use weights::paritydb_weights::constants::ParityDbWeight as DbWeight;
 
 // A few exports that help ease life for downstream crates.
 use frame_support::instances::Instance2;
@@ -71,9 +76,7 @@ pub use frame_support::{
     construct_runtime, parameter_types,
     traits::{EqualPrivilegeOnly, KeyOwnerProofSystem, Randomness},
     weights::{
-        constants::{
-            BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND,
-        },
+        constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight},
         Weight, WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial,
     },
     StorageValue,
@@ -171,12 +174,7 @@ mod benches {
 pub struct BaseCallFilter;
 impl Contains<RuntimeCall> for BaseCallFilter {
     fn contains(call: &RuntimeCall) -> bool {
-        !matches!(
-            call,
-            RuntimeCall::System(
-                frame_system::Call::remark { .. } | frame_system::Call::remark_with_event { .. }
-            ) | RuntimeCall::Session(_)
-        )
+        !matches!(call, RuntimeCall::Session(_))
     }
 }
 
@@ -233,8 +231,10 @@ impl frame_support::traits::InstanceFilter<RuntimeCall> for ProxyType {
     }
 }
 
+#[cfg(feature = "runtime-benchmarks")]
+type WorstOrigin = RawOrigin<AccountId, TechnicalCommitteeInstance>;
 // Configure pallets to include in runtime.
-common_runtime::pallets_config! {}
+common_runtime::pallets_config!();
 
 // Create the runtime by composing the pallets that were previously configured.
 construct_runtime!(
diff --git a/runtime/g1/src/parameters.rs b/runtime/g1/src/parameters.rs
index e19e471fe1d55d022df9ed201712fe0bcfeec544..ee768989c40f93e4dcf939b08a1ddc48df4462fa 100644
--- a/runtime/g1/src/parameters.rs
+++ b/runtime/g1/src/parameters.rs
@@ -15,18 +15,14 @@
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
 use crate::*;
-use common_runtime::constants::*;
-use common_runtime::{Balance, BlockNumber, Moment};
-use frame_support::parameter_types;
-use frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND;
-use sp_arithmetic::Perbill;
+use common_runtime::{constants::*, Moment};
+use frame_support::{parameter_types, weights::constants::WEIGHT_REF_TIME_PER_SECOND};
 use sp_runtime::transaction_validity::TransactionPriority;
 
 parameter_types! {
     pub const BlockHashCount: BlockNumber = 2400;
     /// We allow for 2 seconds of compute with a 6 second average block time.
-    pub BlockWeights: frame_system::limits::BlockWeights = block_weights((Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND, 0) * 2)
-        .set_proof_size(5 * 1024 * 1024), NORMAL_DISPATCH_RATIO);
+    pub BlockWeights: frame_system::limits::BlockWeights = frame_system::limits::BlockWeights::with_sensible_defaults(Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND * 2u64, u64::MAX), NORMAL_DISPATCH_RATIO);
     pub BlockLength: frame_system::limits::BlockLength = frame_system::limits::BlockLength
         ::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO);
     pub const SS58Prefix: u16 = 4450;
@@ -51,6 +47,12 @@ parameter_types! {
     pub const MinimumPeriod: u64 = SLOT_DURATION / 2;
 }
 
+// Distance
+parameter_types! {
+    pub const MinAccessibleReferees: Perbill = Perbill::from_percent(80);
+    pub const MaxRefereeDistance: u32 = 5;
+}
+
 // Babe
 pub const EPOCH_DURATION_IN_SLOTS: BlockNumber = 4 * HOURS;
 parameter_types! {
@@ -61,7 +63,7 @@ parameter_types! {
 
 // ImOnline
 parameter_types! {
-    pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value();
+    pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::MAX;
     pub const MaxPeerInHeartbeats: u32 = 10_000;
     pub const MaxPeerDataEncodingSize: u32 = 1_000;
 }
@@ -71,6 +73,15 @@ parameter_types! {
 /*********/
 
 // Balances
+// Why? Pallet treasury benchmarks are broken because the spend
+// value is hardcoded 100 in benchmark and the account is not provided enough funds
+// to exist if ED > 100.
+#[cfg(feature = "runtime-benchmarks")]
+frame_support::parameter_types! {
+    pub const ExistentialDeposit: Balance = 100;
+    pub const MaxLocks: u32 = 50;
+}
+#[cfg(not(feature = "runtime-benchmarks"))]
 frame_support::parameter_types! {
     pub const ExistentialDeposit: Balance = 200;
     pub const MaxLocks: u32 = 50;
diff --git a/runtime/common/src/weights.rs b/runtime/g1/src/weights.rs
similarity index 100%
rename from runtime/common/src/weights.rs
rename to runtime/g1/src/weights.rs
diff --git a/runtime/g1/src/weights/block_weights.rs b/runtime/g1/src/weights/block_weights.rs
new file mode 100644
index 0000000000000000000000000000000000000000..26de13e24044335419dca1b1badc6073be079502
--- /dev/null
+++ b/runtime/g1/src/weights/block_weights.rs
@@ -0,0 +1,64 @@
+
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28 (Y/M/D)
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//!
+//! SHORT-NAME: `block`, LONG-NAME: `BlockExecution`, RUNTIME: `Ğ1 Local Testnet`
+//! WARMUPS: `10`, REPEAT: `100`
+//! WEIGHT-PATH: `./runtime/g1/src/weights/`
+//! WEIGHT-METRIC: `Average`, WEIGHT-MUL: `1.0`, WEIGHT-ADD: `0`
+
+// Executed Command:
+//   target/release/duniter
+//   benchmark
+//   overhead
+//   --chain=dev
+//   --wasm-execution=compiled
+//   --weight-path=./runtime/g1/src/weights/
+//   --warmup=10
+//   --repeat=100
+
+use sp_core::parameter_types;
+use sp_weights::{constants::WEIGHT_REF_TIME_PER_NANOS, Weight};
+
+parameter_types! {
+	/// Time to execute an empty block.
+	/// Calculated by multiplying the *Average* with `1.0` and adding `0`.
+	///
+	/// Stats nanoseconds:
+	///   Min, Max: 129_468, 175_220
+	///   Average:  138_503
+	///   Median:   135_758
+	///   Std-Dev:  7207.66
+	///
+	/// Percentiles nanoseconds:
+	///   99th: 160_953
+	///   95th: 153_494
+	///   75th: 138_856
+	pub const BlockExecutionWeight: Weight =
+		Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS.saturating_mul(138_503), 0);
+}
+
+#[cfg(test)]
+mod test_weights {
+	use sp_weights::constants;
+
+	/// Checks that the weight exists and is sane.
+	// NOTE: If this test fails but you are sure that the generated values are fine,
+	// you can delete it.
+	#[test]
+	fn sane() {
+		let w = super::BlockExecutionWeight::get();
+
+		// At least 100 µs.
+		assert!(
+			w.ref_time() >= 100u64 * constants::WEIGHT_REF_TIME_PER_MICROS,
+			"Weight should be at least 100 µs."
+		);
+		// At most 50 ms.
+		assert!(
+			w.ref_time() <= 50u64 * constants::WEIGHT_REF_TIME_PER_MILLIS,
+			"Weight should be at most 50 ms."
+		);
+	}
+}
diff --git a/runtime/g1/src/weights/extrinsic_weights.rs b/runtime/g1/src/weights/extrinsic_weights.rs
new file mode 100644
index 0000000000000000000000000000000000000000..ffb86ba6bd49875ec2b855d84ae9cec7d4c932c3
--- /dev/null
+++ b/runtime/g1/src/weights/extrinsic_weights.rs
@@ -0,0 +1,64 @@
+
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28 (Y/M/D)
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//!
+//! SHORT-NAME: `extrinsic`, LONG-NAME: `ExtrinsicBase`, RUNTIME: `Ğ1 Local Testnet`
+//! WARMUPS: `10`, REPEAT: `100`
+//! WEIGHT-PATH: `./runtime/g1/src/weights/`
+//! WEIGHT-METRIC: `Average`, WEIGHT-MUL: `1.0`, WEIGHT-ADD: `0`
+
+// Executed Command:
+//   target/release/duniter
+//   benchmark
+//   overhead
+//   --chain=dev
+//   --wasm-execution=compiled
+//   --weight-path=./runtime/g1/src/weights/
+//   --warmup=10
+//   --repeat=100
+
+use sp_core::parameter_types;
+use sp_weights::{constants::WEIGHT_REF_TIME_PER_NANOS, Weight};
+
+parameter_types! {
+	/// Time to execute a NO-OP extrinsic, for example `System::remark`.
+	/// Calculated by multiplying the *Average* with `1.0` and adding `0`.
+	///
+	/// Stats nanoseconds:
+	///   Min, Max: 88_837, 96_248
+	///   Average:  89_181
+	///   Median:   89_030
+	///   Std-Dev:  771.44
+	///
+	/// Percentiles nanoseconds:
+	///   99th: 91_250
+	///   95th: 89_630
+	///   75th: 89_118
+	pub const ExtrinsicBaseWeight: Weight =
+		Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS.saturating_mul(89_181), 0);
+}
+
+#[cfg(test)]
+mod test_weights {
+	use sp_weights::constants;
+
+	/// Checks that the weight exists and is sane.
+	// NOTE: If this test fails but you are sure that the generated values are fine,
+	// you can delete it.
+	#[test]
+	fn sane() {
+		let w = super::ExtrinsicBaseWeight::get();
+
+		// At least 10 µs.
+		assert!(
+			w.ref_time() >= 10u64 * constants::WEIGHT_REF_TIME_PER_MICROS,
+			"Weight should be at least 10 µs."
+		);
+		// At most 1 ms.
+		assert!(
+			w.ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS,
+			"Weight should be at most 1 ms."
+		);
+	}
+}
diff --git a/runtime/common/src/weights/frame_benchmarking_baseline.rs b/runtime/g1/src/weights/frame_benchmarking_baseline.rs
similarity index 79%
rename from runtime/common/src/weights/frame_benchmarking_baseline.rs
rename to runtime/g1/src/weights/frame_benchmarking_baseline.rs
index 403ac14e5349557ca976b07ccc835d6a34b94d24..8a8288a6863aef1a91cdadd31350331a567e80c3 100644
--- a/runtime/common/src/weights/frame_benchmarking_baseline.rs
+++ b/runtime/g1/src/weights/frame_benchmarking_baseline.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `frame_benchmarking::baseline`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/g1/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -52,8 +52,8 @@ impl<T: frame_system::Config> frame_benchmarking::baseline::WeightInfo for Weigh
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 122_000 picoseconds.
-		Weight::from_parts(155_897, 0)
+		// Minimum execution time: 88_000 picoseconds.
+		Weight::from_parts(139_092, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 	/// The range of component `i` is `[0, 1000000]`.
@@ -61,8 +61,8 @@ impl<T: frame_system::Config> frame_benchmarking::baseline::WeightInfo for Weigh
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 122_000 picoseconds.
-		Weight::from_parts(153_956, 0)
+		// Minimum execution time: 88_000 picoseconds.
+		Weight::from_parts(140_655, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 	/// The range of component `i` is `[0, 1000000]`.
@@ -70,8 +70,8 @@ impl<T: frame_system::Config> frame_benchmarking::baseline::WeightInfo for Weigh
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 124_000 picoseconds.
-		Weight::from_parts(153_907, 0)
+		// Minimum execution time: 89_000 picoseconds.
+		Weight::from_parts(141_340, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 	/// The range of component `i` is `[0, 1000000]`.
@@ -79,16 +79,16 @@ impl<T: frame_system::Config> frame_benchmarking::baseline::WeightInfo for Weigh
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 123_000 picoseconds.
-		Weight::from_parts(154_592, 0)
+		// Minimum execution time: 89_000 picoseconds.
+		Weight::from_parts(140_451, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 	fn hashing() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 21_202_188_000 picoseconds.
-		Weight::from_parts(21_259_205_000, 0)
+		// Minimum execution time: 19_737_124_000 picoseconds.
+		Weight::from_parts(19_774_281_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 	/// The range of component `i` is `[0, 100]`.
@@ -96,10 +96,10 @@ impl<T: frame_system::Config> frame_benchmarking::baseline::WeightInfo for Weigh
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 142_000 picoseconds.
-		Weight::from_parts(28_060_861, 0)
+		// Minimum execution time: 97_000 picoseconds.
+		Weight::from_parts(130_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
-			// Standard Error: 11_132
-			.saturating_add(Weight::from_parts(30_550_214, 0).saturating_mul(i.into()))
+			// Standard Error: 13_189
+			.saturating_add(Weight::from_parts(34_360_531, 0).saturating_mul(i.into()))
 	}
 }
diff --git a/runtime/common/src/weights/frame_system.rs b/runtime/g1/src/weights/frame_system.rs
similarity index 80%
rename from runtime/common/src/weights/frame_system.rs
rename to runtime/g1/src/weights/frame_system.rs
index 1468b8922a57bd2298e6841362fc6362a49e0df1..80308a3d8a52df1baaa700d089565e3196b5ad6e 100644
--- a/runtime/common/src/weights/frame_system.rs
+++ b/runtime/g1/src/weights/frame_system.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `frame_system`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/g1/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -52,22 +52,22 @@ impl<T: frame_system::Config> frame_system::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_466_000 picoseconds.
-		Weight::from_parts(1_452_227, 0)
+		// Minimum execution time: 1_813_000 picoseconds.
+		Weight::from_parts(1_917_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 			// Standard Error: 0
-			.saturating_add(Weight::from_parts(244, 0).saturating_mul(b.into()))
+			.saturating_add(Weight::from_parts(256, 0).saturating_mul(b.into()))
 	}
 	/// The range of component `b` is `[0, 3932160]`.
 	fn remark_with_event(b: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 4_132_000 picoseconds.
-		Weight::from_parts(4_287_000, 0)
+		// Minimum execution time: 4_949_000 picoseconds.
+		Weight::from_parts(4_989_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 			// Standard Error: 0
-			.saturating_add(Weight::from_parts(1_008, 0).saturating_mul(b.into()))
+			.saturating_add(Weight::from_parts(1_040, 0).saturating_mul(b.into()))
 	}
 	/// Storage: `System::Digest` (r:1 w:1)
 	/// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
@@ -77,8 +77,8 @@ impl<T: frame_system::Config> frame_system::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `1485`
-		// Minimum execution time: 2_582_000 picoseconds.
-		Weight::from_parts(2_896_000, 0)
+		// Minimum execution time: 3_322_000 picoseconds.
+		Weight::from_parts(3_585_000, 0)
 			.saturating_add(Weight::from_parts(0, 1485))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -91,8 +91,8 @@ impl<T: frame_system::Config> frame_system::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `1485`
-		// Minimum execution time: 77_846_699_000 picoseconds.
-		Weight::from_parts(78_440_655_000, 0)
+		// Minimum execution time: 77_755_928_000 picoseconds.
+		Weight::from_parts(78_851_658_000, 0)
 			.saturating_add(Weight::from_parts(0, 1485))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -104,11 +104,11 @@ impl<T: frame_system::Config> frame_system::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_510_000 picoseconds.
-		Weight::from_parts(1_613_000, 0)
+		// Minimum execution time: 1_891_000 picoseconds.
+		Weight::from_parts(1_978_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
-			// Standard Error: 514
-			.saturating_add(Weight::from_parts(608_791, 0).saturating_mul(i.into()))
+			// Standard Error: 516
+			.saturating_add(Weight::from_parts(564_917, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
@@ -118,11 +118,11 @@ impl<T: frame_system::Config> frame_system::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_502_000 picoseconds.
-		Weight::from_parts(1_628_000, 0)
+		// Minimum execution time: 1_851_000 picoseconds.
+		Weight::from_parts(1_964_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
-			// Standard Error: 597
-			.saturating_add(Weight::from_parts(459_711, 0).saturating_mul(i.into()))
+			// Standard Error: 635
+			.saturating_add(Weight::from_parts(453_107, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
@@ -132,11 +132,11 @@ impl<T: frame_system::Config> frame_system::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `77 + p * (69 ±0)`
 		//  Estimated: `76 + p * (70 ±0)`
-		// Minimum execution time: 2_837_000 picoseconds.
-		Weight::from_parts(2_914_000, 0)
+		// Minimum execution time: 3_325_000 picoseconds.
+		Weight::from_parts(3_537_000, 0)
 			.saturating_add(Weight::from_parts(0, 76))
-			// Standard Error: 705
-			.saturating_add(Weight::from_parts(906_626, 0).saturating_mul(p.into()))
+			// Standard Error: 702
+			.saturating_add(Weight::from_parts(1_072_851, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into())))
 			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into())))
 			.saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into()))
@@ -147,8 +147,8 @@ impl<T: frame_system::Config> frame_system::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 9_106_000 picoseconds.
-		Weight::from_parts(9_766_000, 0)
+		// Minimum execution time: 8_974_000 picoseconds.
+		Weight::from_parts(10_559_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -162,8 +162,8 @@ impl<T: frame_system::Config> frame_system::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `22`
 		//  Estimated: `1518`
-		// Minimum execution time: 81_518_691_000 picoseconds.
-		Weight::from_parts(82_510_356_000, 0)
+		// Minimum execution time: 81_652_777_000 picoseconds.
+		Weight::from_parts(82_830_549_000, 0)
 			.saturating_add(Weight::from_parts(0, 1518))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(3))
diff --git a/runtime/common/src/weights/pallet_authority_members.rs b/runtime/g1/src/weights/pallet_authority_members.rs
similarity index 87%
rename from runtime/common/src/weights/pallet_authority_members.rs
rename to runtime/g1/src/weights/pallet_authority_members.rs
index c2eaef1ead7f73c38247642be34b1bd691d480c5..f83e64493f4685cec38a9593646a79f462f8be93 100644
--- a/runtime/common/src/weights/pallet_authority_members.rs
+++ b/runtime/g1/src/weights/pallet_authority_members.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_authority_members`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/g1/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -61,11 +61,11 @@ impl<T: frame_system::Config> pallet_authority_members::WeightInfo for WeightInf
 	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 	fn go_offline() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `750`
-		//  Estimated: `4215`
-		// Minimum execution time: 19_137_000 picoseconds.
-		Weight::from_parts(19_687_000, 0)
-			.saturating_add(Weight::from_parts(0, 4215))
+		//  Measured:  `933`
+		//  Estimated: `4398`
+		// Minimum execution time: 25_662_000 picoseconds.
+		Weight::from_parts(26_455_000, 0)
+			.saturating_add(Weight::from_parts(0, 4398))
 			.saturating_add(T::DbWeight::get().reads(6))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -87,11 +87,11 @@ impl<T: frame_system::Config> pallet_authority_members::WeightInfo for WeightInf
 	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 	fn go_online() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1141`
-		//  Estimated: `4606`
-		// Minimum execution time: 24_381_000 picoseconds.
-		Weight::from_parts(25_720_000, 0)
-			.saturating_add(Weight::from_parts(0, 4606))
+		//  Measured:  `1389`
+		//  Estimated: `4854`
+		// Minimum execution time: 34_895_000 picoseconds.
+		Weight::from_parts(36_387_000, 0)
+			.saturating_add(Weight::from_parts(0, 4854))
 			.saturating_add(T::DbWeight::get().reads(8))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -109,11 +109,11 @@ impl<T: frame_system::Config> pallet_authority_members::WeightInfo for WeightInf
 	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn set_session_keys() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1511`
-		//  Estimated: `12401`
-		// Minimum execution time: 31_532_000 picoseconds.
-		Weight::from_parts(32_707_000, 0)
-			.saturating_add(Weight::from_parts(0, 12401))
+		//  Measured:  `1838`
+		//  Estimated: `12728`
+		// Minimum execution time: 45_607_000 picoseconds.
+		Weight::from_parts(47_059_000, 0)
+			.saturating_add(Weight::from_parts(0, 12728))
 			.saturating_add(T::DbWeight::get().reads(8))
 			.saturating_add(T::DbWeight::get().writes(2))
 	}
@@ -133,11 +133,11 @@ impl<T: frame_system::Config> pallet_authority_members::WeightInfo for WeightInf
 	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn remove_member() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `716`
-		//  Estimated: `4181`
-		// Minimum execution time: 31_417_000 picoseconds.
-		Weight::from_parts(33_503_000, 0)
-			.saturating_add(Weight::from_parts(0, 4181))
+		//  Measured:  `847`
+		//  Estimated: `4312`
+		// Minimum execution time: 38_928_000 picoseconds.
+		Weight::from_parts(41_019_000, 0)
+			.saturating_add(Weight::from_parts(0, 4312))
 			.saturating_add(T::DbWeight::get().reads(6))
 			.saturating_add(T::DbWeight::get().writes(10))
 	}
@@ -147,8 +147,8 @@ impl<T: frame_system::Config> pallet_authority_members::WeightInfo for WeightInf
 		// Proof Size summary in bytes:
 		//  Measured:  `199`
 		//  Estimated: `1684`
-		// Minimum execution time: 6_793_000 picoseconds.
-		Weight::from_parts(7_479_000, 0)
+		// Minimum execution time: 9_188_000 picoseconds.
+		Weight::from_parts(9_497_000, 0)
 			.saturating_add(Weight::from_parts(0, 1684))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
diff --git a/runtime/common/src/weights/pallet_babe.rs b/runtime/g1/src/weights/pallet_babe.rs
similarity index 97%
rename from runtime/common/src/weights/pallet_babe.rs
rename to runtime/g1/src/weights/pallet_babe.rs
index caa37df090cc508af9b16853df12c04eefcff5c2..86185992a9c13eb63302b1206cf37cb05b47f576 100644
--- a/runtime/common/src/weights/pallet_babe.rs
+++ b/runtime/g1/src/weights/pallet_babe.rs
@@ -24,7 +24,7 @@ use frame_support::{
         Weight,
     },
 };
-use sp_std::marker::PhantomData;
+use scale_info::prelude::marker::PhantomData;
 
 /// Weight functions for `pallet_babe`.
 pub struct WeightInfo<T>(PhantomData<T>);
diff --git a/runtime/common/src/weights/pallet_balances.rs b/runtime/g1/src/weights/pallet_balances.rs
similarity index 70%
rename from runtime/common/src/weights/pallet_balances.rs
rename to runtime/g1/src/weights/pallet_balances.rs
index 5c7254998564d7f4c5a860400b8896e9c6eae42c..0c2f4ba2fa86fe961ab5145b2b567230d47ad41d 100644
--- a/runtime/common/src/weights/pallet_balances.rs
+++ b/runtime/g1/src/weights/pallet_balances.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_balances`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/g1/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -53,8 +53,8 @@ impl<T: frame_system::Config> pallet_balances::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `63`
 		//  Estimated: `6126`
-		// Minimum execution time: 44_332_000 picoseconds.
-		Weight::from_parts(45_368_000, 0)
+		// Minimum execution time: 50_937_000 picoseconds.
+		Weight::from_parts(52_205_000, 0)
 			.saturating_add(Weight::from_parts(0, 6126))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -65,8 +65,8 @@ impl<T: frame_system::Config> pallet_balances::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `3558`
-		// Minimum execution time: 29_062_000 picoseconds.
-		Weight::from_parts(30_291_000, 0)
+		// Minimum execution time: 31_621_000 picoseconds.
+		Weight::from_parts(32_543_000, 0)
 			.saturating_add(Weight::from_parts(0, 3558))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -75,10 +75,10 @@ impl<T: frame_system::Config> pallet_balances::WeightInfo for WeightInfo<T> {
 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
 	fn force_set_balance_creating() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `100`
+		//  Measured:  `134`
 		//  Estimated: `3558`
-		// Minimum execution time: 9_584_000 picoseconds.
-		Weight::from_parts(9_916_000, 0)
+		// Minimum execution time: 11_260_000 picoseconds.
+		Weight::from_parts(11_974_000, 0)
 			.saturating_add(Weight::from_parts(0, 3558))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -87,10 +87,10 @@ impl<T: frame_system::Config> pallet_balances::WeightInfo for WeightInfo<T> {
 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
 	fn force_set_balance_killing() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `100`
+		//  Measured:  `134`
 		//  Estimated: `3558`
-		// Minimum execution time: 13_637_000 picoseconds.
-		Weight::from_parts(13_912_000, 0)
+		// Minimum execution time: 17_113_000 picoseconds.
+		Weight::from_parts(18_224_000, 0)
 			.saturating_add(Weight::from_parts(0, 3558))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -101,8 +101,8 @@ impl<T: frame_system::Config> pallet_balances::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `126`
 		//  Estimated: `8694`
-		// Minimum execution time: 42_442_000 picoseconds.
-		Weight::from_parts(44_029_000, 0)
+		// Minimum execution time: 53_051_000 picoseconds.
+		Weight::from_parts(54_448_000, 0)
 			.saturating_add(Weight::from_parts(0, 8694))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(3))
@@ -113,8 +113,8 @@ impl<T: frame_system::Config> pallet_balances::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `3558`
-		// Minimum execution time: 34_474_000 picoseconds.
-		Weight::from_parts(35_659_000, 0)
+		// Minimum execution time: 38_410_000 picoseconds.
+		Weight::from_parts(39_213_000, 0)
 			.saturating_add(Weight::from_parts(0, 3558))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -123,12 +123,40 @@ impl<T: frame_system::Config> pallet_balances::WeightInfo for WeightInfo<T> {
 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
 	fn force_unreserve() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `100`
+		//  Measured:  `134`
 		//  Estimated: `3558`
-		// Minimum execution time: 12_185_000 picoseconds.
-		Weight::from_parts(12_713_000, 0)
+		// Minimum execution time: 14_264_000 picoseconds.
+		Weight::from_parts(17_888_000, 0)
 			.saturating_add(Weight::from_parts(0, 3558))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
+	fn force_adjust_total_issuance() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 5_363_000 picoseconds.
+		Weight::from_parts(5_692_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn burn_allow_death() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `63`
+		//  Estimated: `3558`
+		// Minimum execution time: 36_395_000 picoseconds.
+		Weight::from_parts(37_277_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	fn burn_keep_alive() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 16_496_000 picoseconds.
+		Weight::from_parts(16_731_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
 }
diff --git a/runtime/g1/src/weights/pallet_certification.rs b/runtime/g1/src/weights/pallet_certification.rs
new file mode 100644
index 0000000000000000000000000000000000000000..57c10010ecfa398cc93964ee49984c525e8a0b1e
--- /dev/null
+++ b/runtime/g1/src/weights/pallet_certification.rs
@@ -0,0 +1,191 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_certification`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/g1/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_certification`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T> {
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:2 w:2)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:2 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsRemovableOn` (r:1 w:1)
+	/// Proof: `Certification::CertsRemovableOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn add_cert() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `996`
+		//  Estimated: `6936`
+		// Minimum execution time: 40_358_000 picoseconds.
+		Weight::from_parts(41_870_000, 0)
+			.saturating_add(Weight::from_parts(0, 6936))
+			.saturating_add(T::DbWeight::get().reads(7))
+			.saturating_add(T::DbWeight::get().writes(4))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:1 w:1)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:2 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsRemovableOn` (r:1 w:1)
+	/// Proof: `Certification::CertsRemovableOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn renew_cert() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1019`
+		//  Estimated: `6959`
+		// Minimum execution time: 36_424_000 picoseconds.
+		Weight::from_parts(37_857_000, 0)
+			.saturating_add(Weight::from_parts(0, 6959))
+			.saturating_add(T::DbWeight::get().reads(6))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:2 w:2)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::CounterForMembership` (r:1 w:1)
+	/// Proof: `Membership::CounterForMembership` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `Membership::MembershipsExpireOn` (r:1 w:1)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `UniversalDividend::CurrentUdIndex` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUdIndex` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn del_cert() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `2259`
+		//  Estimated: `15624`
+		// Minimum execution time: 125_422_000 picoseconds.
+		Weight::from_parts(128_454_000, 0)
+			.saturating_add(Weight::from_parts(0, 15624))
+			.saturating_add(T::DbWeight::get().reads(20))
+			.saturating_add(T::DbWeight::get().writes(23))
+	}
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:1000 w:1000)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:0)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[2, 1000]`.
+	fn remove_all_certs_received_by(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `554 + i * (35 ±0)`
+		//  Estimated: `4018 + i * (2511 ±0)`
+		// Minimum execution time: 30_310_000 picoseconds.
+		Weight::from_parts(31_181_000, 0)
+			.saturating_add(Weight::from_parts(0, 4018))
+			// Standard Error: 25_824
+			.saturating_add(Weight::from_parts(9_275_904, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into())))
+			.saturating_add(T::DbWeight::get().writes(1))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
+			.saturating_add(Weight::from_parts(0, 2511).saturating_mul(i.into()))
+	}
+	/// Storage: `Certification::CertsRemovableOn` (r:1 w:0)
+	/// Proof: `Certification::CertsRemovableOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn on_initialize() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `138`
+		//  Estimated: `3603`
+		// Minimum execution time: 3_454_000 picoseconds.
+		Weight::from_parts(3_743_000, 0)
+			.saturating_add(Weight::from_parts(0, 3603))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_remove_cert_noop() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `275`
+		//  Estimated: `3740`
+		// Minimum execution time: 5_312_000 picoseconds.
+		Weight::from_parts(5_608_000, 0)
+			.saturating_add(Weight::from_parts(0, 3740))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:2 w:2)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:0)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_remove_cert() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `711`
+		//  Estimated: `6651`
+		// Minimum execution time: 26_213_000 picoseconds.
+		Weight::from_parts(27_502_000, 0)
+			.saturating_add(Weight::from_parts(0, 6651))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+}
diff --git a/runtime/g1/src/weights/pallet_collective.rs b/runtime/g1/src/weights/pallet_collective.rs
new file mode 100644
index 0000000000000000000000000000000000000000..06df9662591d4686e3c5016e855d8c225305d67d
--- /dev/null
+++ b/runtime/g1/src/weights/pallet_collective.rs
@@ -0,0 +1,302 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_collective`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/g1/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_collective`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_collective::WeightInfo for WeightInfo<T> {
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Proposals` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Voting` (r:20 w:20)
+	/// Proof: `TechnicalCommittee::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Prime` (r:0 w:1)
+	/// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// The range of component `m` is `[0, 100]`.
+	/// The range of component `n` is `[0, 100]`.
+	/// The range of component `p` is `[0, 20]`.
+	fn set_members(m: u32, _n: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0 + m * (672 ±0) + p * (3191 ±0)`
+		//  Estimated: `10019 + m * (416 ±4) + p * (4183 ±23)`
+		// Minimum execution time: 12_382_000 picoseconds.
+		Weight::from_parts(12_732_000, 0)
+			.saturating_add(Weight::from_parts(0, 10019))
+			// Standard Error: 10_026
+			.saturating_add(Weight::from_parts(744_546, 0).saturating_mul(m.into()))
+			// Standard Error: 49_561
+			.saturating_add(Weight::from_parts(7_099_142, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into())))
+			.saturating_add(T::DbWeight::get().writes(2))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into())))
+			.saturating_add(Weight::from_parts(0, 416).saturating_mul(m.into()))
+			.saturating_add(Weight::from_parts(0, 4183).saturating_mul(p.into()))
+	}
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// The range of component `b` is `[2, 1024]`.
+	/// The range of component `m` is `[1, 100]`.
+	fn execute(b: u32, m: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `32 + m * (32 ±0)`
+		//  Estimated: `1518 + m * (32 ±0)`
+		// Minimum execution time: 11_673_000 picoseconds.
+		Weight::from_parts(10_820_054, 0)
+			.saturating_add(Weight::from_parts(0, 1518))
+			// Standard Error: 34
+			.saturating_add(Weight::from_parts(1_534, 0).saturating_mul(b.into()))
+			// Standard Error: 351
+			.saturating_add(Weight::from_parts(15_212, 0).saturating_mul(m.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into()))
+	}
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::ProposalOf` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `b` is `[2, 1024]`.
+	/// The range of component `m` is `[1, 100]`.
+	fn propose_execute(b: u32, m: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `32 + m * (32 ±0)`
+		//  Estimated: `3498 + m * (32 ±0)`
+		// Minimum execution time: 13_621_000 picoseconds.
+		Weight::from_parts(13_411_958, 0)
+			.saturating_add(Weight::from_parts(0, 3498))
+			// Standard Error: 37
+			.saturating_add(Weight::from_parts(1_296, 0).saturating_mul(b.into()))
+			// Standard Error: 391
+			.saturating_add(Weight::from_parts(21_066, 0).saturating_mul(m.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into()))
+	}
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::ProposalOf` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Proposals` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::ProposalCount` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::ProposalCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Voting` (r:0 w:1)
+	/// Proof: `TechnicalCommittee::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `b` is `[2, 1024]`.
+	/// The range of component `m` is `[2, 100]`.
+	/// The range of component `p` is `[1, 20]`.
+	fn propose_proposed(b: u32, m: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `24 + m * (32 ±0) + p * (55 ±0)`
+		//  Estimated: `3461 + m * (32 ±0) + p * (54 ±0)`
+		// Minimum execution time: 19_756_000 picoseconds.
+		Weight::from_parts(19_613_903, 0)
+			.saturating_add(Weight::from_parts(0, 3461))
+			// Standard Error: 78
+			.saturating_add(Weight::from_parts(2_330, 0).saturating_mul(b.into()))
+			// Standard Error: 819
+			.saturating_add(Weight::from_parts(19_531, 0).saturating_mul(m.into()))
+			// Standard Error: 4_092
+			.saturating_add(Weight::from_parts(298_153, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().writes(4))
+			.saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into()))
+			.saturating_add(Weight::from_parts(0, 54).saturating_mul(p.into()))
+	}
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Voting` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `m` is `[5, 100]`.
+	fn vote(m: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `573 + m * (64 ±0)`
+		//  Estimated: `4037 + m * (64 ±0)`
+		// Minimum execution time: 18_127_000 picoseconds.
+		Weight::from_parts(19_291_184, 0)
+			.saturating_add(Weight::from_parts(0, 4037))
+			// Standard Error: 655
+			.saturating_add(Weight::from_parts(39_248, 0).saturating_mul(m.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+			.saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into()))
+	}
+	/// Storage: `TechnicalCommittee::Voting` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Proposals` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::ProposalOf` (r:0 w:1)
+	/// Proof: `TechnicalCommittee::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `m` is `[4, 100]`.
+	/// The range of component `p` is `[1, 20]`.
+	fn close_early_disapproved(m: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `117 + m * (64 ±0) + p * (55 ±0)`
+		//  Estimated: `3591 + m * (64 ±0) + p * (55 ±0)`
+		// Minimum execution time: 22_740_000 picoseconds.
+		Weight::from_parts(21_235_980, 0)
+			.saturating_add(Weight::from_parts(0, 3591))
+			// Standard Error: 620
+			.saturating_add(Weight::from_parts(32_285, 0).saturating_mul(m.into()))
+			// Standard Error: 3_062
+			.saturating_add(Weight::from_parts(258_736, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into()))
+			.saturating_add(Weight::from_parts(0, 55).saturating_mul(p.into()))
+	}
+	/// Storage: `TechnicalCommittee::Voting` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::ProposalOf` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Proposals` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// The range of component `b` is `[2, 1024]`.
+	/// The range of component `m` is `[4, 100]`.
+	/// The range of component `p` is `[1, 20]`.
+	fn close_early_approved(b: u32, m: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `62 + b * (1 ±0) + m * (64 ±0) + p * (78 ±0)`
+		//  Estimated: `3619 + b * (1 ±0) + m * (63 ±0) + p * (74 ±0)`
+		// Minimum execution time: 32_430_000 picoseconds.
+		Weight::from_parts(31_069_476, 0)
+			.saturating_add(Weight::from_parts(0, 3619))
+			// Standard Error: 104
+			.saturating_add(Weight::from_parts(2_472, 0).saturating_mul(b.into()))
+			// Standard Error: 1_109
+			.saturating_add(Weight::from_parts(14_064, 0).saturating_mul(m.into()))
+			// Standard Error: 5_473
+			.saturating_add(Weight::from_parts(380_339, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into()))
+			.saturating_add(Weight::from_parts(0, 63).saturating_mul(m.into()))
+			.saturating_add(Weight::from_parts(0, 74).saturating_mul(p.into()))
+	}
+	/// Storage: `TechnicalCommittee::Voting` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Prime` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Proposals` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::ProposalOf` (r:0 w:1)
+	/// Proof: `TechnicalCommittee::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `m` is `[4, 100]`.
+	/// The range of component `p` is `[1, 20]`.
+	fn close_disapproved(m: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `137 + m * (64 ±0) + p * (55 ±0)`
+		//  Estimated: `3611 + m * (64 ±0) + p * (55 ±0)`
+		// Minimum execution time: 25_360_000 picoseconds.
+		Weight::from_parts(24_270_048, 0)
+			.saturating_add(Weight::from_parts(0, 3611))
+			// Standard Error: 652
+			.saturating_add(Weight::from_parts(33_478, 0).saturating_mul(m.into()))
+			// Standard Error: 3_221
+			.saturating_add(Weight::from_parts(268_958, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into()))
+			.saturating_add(Weight::from_parts(0, 55).saturating_mul(p.into()))
+	}
+	/// Storage: `TechnicalCommittee::Voting` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Prime` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::ProposalOf` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Proposals` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// The range of component `b` is `[2, 1024]`.
+	/// The range of component `m` is `[4, 100]`.
+	/// The range of component `p` is `[1, 20]`.
+	fn close_approved(b: u32, m: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `82 + b * (1 ±0) + m * (64 ±0) + p * (78 ±0)`
+		//  Estimated: `3639 + b * (1 ±0) + m * (63 ±0) + p * (74 ±0)`
+		// Minimum execution time: 34_381_000 picoseconds.
+		Weight::from_parts(32_892_529, 0)
+			.saturating_add(Weight::from_parts(0, 3639))
+			// Standard Error: 108
+			.saturating_add(Weight::from_parts(2_395, 0).saturating_mul(b.into()))
+			// Standard Error: 1_142
+			.saturating_add(Weight::from_parts(15_903, 0).saturating_mul(m.into()))
+			// Standard Error: 5_635
+			.saturating_add(Weight::from_parts(402_980, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(5))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into()))
+			.saturating_add(Weight::from_parts(0, 63).saturating_mul(m.into()))
+			.saturating_add(Weight::from_parts(0, 74).saturating_mul(p.into()))
+	}
+	/// Storage: `TechnicalCommittee::Proposals` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Voting` (r:0 w:1)
+	/// Proof: `TechnicalCommittee::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::ProposalOf` (r:0 w:1)
+	/// Proof: `TechnicalCommittee::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `p` is `[1, 20]`.
+	fn disapprove_proposal(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `189 + p * (32 ±0)`
+		//  Estimated: `1674 + p * (32 ±0)`
+		// Minimum execution time: 11_616_000 picoseconds.
+		Weight::from_parts(12_471_861, 0)
+			.saturating_add(Weight::from_parts(0, 1674))
+			// Standard Error: 2_027
+			.saturating_add(Weight::from_parts(154_684, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(Weight::from_parts(0, 32).saturating_mul(p.into()))
+	}
+}
diff --git a/runtime/g1/src/weights/pallet_distance.rs b/runtime/g1/src/weights/pallet_distance.rs
new file mode 100644
index 0000000000000000000000000000000000000000..1436bc9e3ec81086effb3960e699940d79d56f14
--- /dev/null
+++ b/runtime/g1/src/weights/pallet_distance.rs
@@ -0,0 +1,252 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_distance`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/g1/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_distance`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_distance::WeightInfo for WeightInfo<T> {
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::PendingEvaluationRequest` (r:1 w:1)
+	/// Proof: `Distance::PendingEvaluationRequest` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:0)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:1 w:0)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::CurrentPoolIndex` (r:1 w:0)
+	/// Proof: `Distance::CurrentPoolIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationPool2` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Balances::Holds` (r:1 w:1)
+	/// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`)
+	fn request_distance_evaluation() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1140`
+		//  Estimated: `4605`
+		// Minimum execution time: 65_909_000 picoseconds.
+		Weight::from_parts(67_747_000, 0)
+			.saturating_add(Weight::from_parts(0, 4605))
+			.saturating_add(T::DbWeight::get().reads(9))
+			.saturating_add(T::DbWeight::get().writes(4))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:2 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::PendingEvaluationRequest` (r:1 w:1)
+	/// Proof: `Distance::PendingEvaluationRequest` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:0)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:1 w:0)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::CurrentPoolIndex` (r:1 w:0)
+	/// Proof: `Distance::CurrentPoolIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationPool2` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Balances::Holds` (r:1 w:1)
+	/// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`)
+	fn request_distance_evaluation_for() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1169`
+		//  Estimated: `7109`
+		// Minimum execution time: 68_501_000 picoseconds.
+		Weight::from_parts(71_844_000, 0)
+			.saturating_add(Weight::from_parts(0, 7109))
+			.saturating_add(T::DbWeight::get().reads(10))
+			.saturating_add(T::DbWeight::get().writes(4))
+	}
+	/// Storage: `Distance::DidUpdate` (r:1 w:1)
+	/// Proof: `Distance::DidUpdate` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Authorship::Author` (r:1 w:1)
+	/// Proof: `Authorship::Author` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	/// Storage: `System::Digest` (r:1 w:0)
+	/// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::Validators` (r:1 w:0)
+	/// Proof: `Session::Validators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::CurrentPoolIndex` (r:1 w:0)
+	/// Proof: `Distance::CurrentPoolIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationPool0` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool0` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[1, 1300]`.
+	fn update_evaluation(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `401 + i * (10 ±0)`
+		//  Estimated: `1886 + i * (10 ±0)`
+		// Minimum execution time: 18_151_000 picoseconds.
+		Weight::from_parts(20_247_312, 0)
+			.saturating_add(Weight::from_parts(0, 1886))
+			// Standard Error: 66
+			.saturating_add(Weight::from_parts(104_133, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(6))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(Weight::from_parts(0, 10).saturating_mul(i.into()))
+	}
+	/// Storage: `Distance::CurrentPoolIndex` (r:1 w:0)
+	/// Proof: `Distance::CurrentPoolIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationPool0` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool0` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[1, 1300]`.
+	fn force_update_evaluation(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `139 + i * (10 ±0)`
+		//  Estimated: `1624 + i * (10 ±0)`
+		// Minimum execution time: 6_919_000 picoseconds.
+		Weight::from_parts(8_985_780, 0)
+			.saturating_add(Weight::from_parts(0, 1624))
+			// Standard Error: 55
+			.saturating_add(Weight::from_parts(101_965, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+			.saturating_add(Weight::from_parts(0, 10).saturating_mul(i.into()))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::MembershipsExpireOn` (r:2 w:2)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn force_valid_distance_status() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `572`
+		//  Estimated: `6512`
+		// Minimum execution time: 29_384_000 picoseconds.
+		Weight::from_parts(31_096_000, 0)
+			.saturating_add(Weight::from_parts(0, 6512))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+	fn on_initialize_overhead() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 91_000 picoseconds.
+		Weight::from_parts(126_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `System::ParentHash` (r:1 w:0)
+	/// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	/// Storage: `Distance::EvaluationPool2` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::PendingEvaluationRequest` (r:1 w:1)
+	/// Proof: `Distance::PendingEvaluationRequest` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Balances::Holds` (r:1 w:1)
+	/// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`)
+	/// Storage: `Identity::Identities` (r:1 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::MembershipsExpireOn` (r:2 w:2)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationBlock` (r:0 w:1)
+	/// Proof: `Distance::EvaluationBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn do_evaluation_success() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `984`
+		//  Estimated: `6924`
+		// Minimum execution time: 63_680_000 picoseconds.
+		Weight::from_parts(65_817_000, 0)
+			.saturating_add(Weight::from_parts(0, 6924))
+			.saturating_add(T::DbWeight::get().reads(9))
+			.saturating_add(T::DbWeight::get().writes(8))
+	}
+	/// Storage: `System::ParentHash` (r:1 w:0)
+	/// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	/// Storage: `Distance::EvaluationPool2` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::PendingEvaluationRequest` (r:1 w:1)
+	/// Proof: `Distance::PendingEvaluationRequest` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Balances::Holds` (r:1 w:1)
+	/// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:2)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Distance::EvaluationBlock` (r:0 w:1)
+	/// Proof: `Distance::EvaluationBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn do_evaluation_failure() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `475`
+		//  Estimated: `6126`
+		// Minimum execution time: 45_205_000 picoseconds.
+		Weight::from_parts(46_762_000, 0)
+			.saturating_add(Weight::from_parts(0, 6126))
+			.saturating_add(T::DbWeight::get().reads(6))
+			.saturating_add(T::DbWeight::get().writes(6))
+	}
+	/// Storage: `System::ParentHash` (r:1 w:0)
+	/// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	/// Storage: `Distance::EvaluationPool2` (r:1 w:0)
+	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationBlock` (r:0 w:1)
+	/// Proof: `Distance::EvaluationBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn do_evaluation_overhead() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `109`
+		//  Estimated: `1594`
+		// Minimum execution time: 4_030_000 picoseconds.
+		Weight::from_parts(4_294_000, 0)
+			.saturating_add(Weight::from_parts(0, 1594))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Distance::DidUpdate` (r:1 w:1)
+	/// Proof: `Distance::DidUpdate` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn on_finalize() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `133`
+		//  Estimated: `1618`
+		// Minimum execution time: 3_720_000 picoseconds.
+		Weight::from_parts(4_046_000, 0)
+			.saturating_add(Weight::from_parts(0, 1618))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/common/src/weights/pallet_duniter_account.rs b/runtime/g1/src/weights/pallet_duniter_account.rs
similarity index 90%
rename from runtime/common/src/weights/pallet_duniter_account.rs
rename to runtime/g1/src/weights/pallet_duniter_account.rs
index 00f2696bc36fb22cd479162e1821adf12f70b6e0..6aa071c0b78829e999e02c496fc0693cfc87ed1f 100644
--- a/runtime/common/src/weights/pallet_duniter_account.rs
+++ b/runtime/g1/src/weights/pallet_duniter_account.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_duniter_account`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/g1/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -53,8 +53,8 @@ impl<T: frame_system::Config> pallet_duniter_account::WeightInfo for WeightInfo<
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `3558`
-		// Minimum execution time: 3_497_000 picoseconds.
-		Weight::from_parts(3_730_000, 0)
+		// Minimum execution time: 4_319_000 picoseconds.
+		Weight::from_parts(4_586_000, 0)
 			.saturating_add(Weight::from_parts(0, 3558))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
diff --git a/runtime/common/src/weights/pallet_grandpa.rs b/runtime/g1/src/weights/pallet_grandpa.rs
similarity index 97%
rename from runtime/common/src/weights/pallet_grandpa.rs
rename to runtime/g1/src/weights/pallet_grandpa.rs
index 3c6528f7ff9e2b8abdcedde415ad299aec208a0f..6dae5b20f670e3859762926b0168234d44dc0d27 100644
--- a/runtime/common/src/weights/pallet_grandpa.rs
+++ b/runtime/g1/src/weights/pallet_grandpa.rs
@@ -24,7 +24,7 @@ use frame_support::{
         Weight,
     },
 };
-use sp_std::marker::PhantomData;
+use scale_info::prelude::marker::PhantomData;
 
 /// Weight functions for `pallet_grandpa`.
 pub struct WeightInfo<T>(PhantomData<T>);
diff --git a/runtime/g1/src/weights/pallet_identity.rs b/runtime/g1/src/weights/pallet_identity.rs
new file mode 100644
index 0000000000000000000000000000000000000000..839efbc0499554108258c9808e2b6b5b780e7a08
--- /dev/null
+++ b/runtime/g1/src/weights/pallet_identity.rs
@@ -0,0 +1,404 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_identity`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/g1/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_identity`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
+	/// Storage: `Identity::IdentityIndexOf` (r:2 w:1)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:2 w:2)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:2 w:2)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Identity::NextIdtyIndex` (r:1 w:1)
+	/// Proof: `Identity::NextIdtyIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:1 w:1)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::CounterForIdentities` (r:1 w:1)
+	/// Proof: `Identity::CounterForIdentities` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `Certification::CertsRemovableOn` (r:1 w:1)
+	/// Proof: `Certification::CertsRemovableOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Quota::IdtyQuota` (r:0 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	fn create_identity() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1099`
+		//  Estimated: `7039`
+		// Minimum execution time: 70_675_000 picoseconds.
+		Weight::from_parts(73_034_000, 0)
+			.saturating_add(Weight::from_parts(0, 7039))
+			.saturating_add(T::DbWeight::get().reads(12))
+			.saturating_add(T::DbWeight::get().writes(12))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentitiesNames` (r:1 w:1)
+	/// Proof: `Identity::IdentitiesNames` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn confirm_identity() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `822`
+		//  Estimated: `6762`
+		// Minimum execution time: 35_097_000 picoseconds.
+		Weight::from_parts(36_265_000, 0)
+			.saturating_add(Weight::from_parts(0, 6762))
+			.saturating_add(T::DbWeight::get().reads(5))
+			.saturating_add(T::DbWeight::get().writes(4))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:2 w:2)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:0)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `System::BlockHash` (r:1 w:0)
+	/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:2)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn change_owner_key() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `964`
+		//  Estimated: `6904`
+		// Minimum execution time: 83_073_000 picoseconds.
+		Weight::from_parts(86_517_000, 0)
+			.saturating_add(Weight::from_parts(0, 6904))
+			.saturating_add(T::DbWeight::get().reads(7))
+			.saturating_add(T::DbWeight::get().writes(5))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::BlockHash` (r:1 w:0)
+	/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Quota::IdtyQuota` (r:0 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	fn revoke_identity() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `731`
+		//  Estimated: `6671`
+		// Minimum execution time: 70_008_000 picoseconds.
+		Weight::from_parts(71_653_000, 0)
+			.saturating_add(Weight::from_parts(0, 6671))
+			.saturating_add(T::DbWeight::get().reads(5))
+			.saturating_add(T::DbWeight::get().writes(5))
+	}
+	/// Storage: `Identity::IdentitiesNames` (r:0 w:999)
+	/// Proof: `Identity::IdentitiesNames` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[2, 1000]`.
+	fn prune_item_identities_names(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 3_952_000 picoseconds.
+		Weight::from_parts(4_158_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 950
+			.saturating_add(Weight::from_parts(1_204_551, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().writes(1))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
+	}
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn fix_sufficients() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `104`
+		//  Estimated: `3558`
+		// Minimum execution time: 7_415_000 picoseconds.
+		Weight::from_parts(7_948_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::BlockHash` (r:1 w:0)
+	/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn link_account() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `436`
+		//  Estimated: `3901`
+		// Minimum execution time: 54_824_000 picoseconds.
+		Weight::from_parts(55_745_000, 0)
+			.saturating_add(Weight::from_parts(0, 3901))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	fn on_initialize() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 110_000 picoseconds.
+		Weight::from_parts(133_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_revoke_identity_noop() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `360`
+		//  Estimated: `3825`
+		// Minimum execution time: 4_839_000 picoseconds.
+		Weight::from_parts(5_289_000, 0)
+			.saturating_add(Weight::from_parts(0, 3825))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::CounterForMembership` (r:1 w:1)
+	/// Proof: `Membership::CounterForMembership` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `Membership::MembershipsExpireOn` (r:1 w:1)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `UniversalDividend::CurrentUdIndex` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUdIndex` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Quota::IdtyQuota` (r:0 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_revoke_identity() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1930`
+		//  Estimated: `15295`
+		// Minimum execution time: 108_040_000 picoseconds.
+		Weight::from_parts(112_523_000, 0)
+			.saturating_add(Weight::from_parts(0, 15295))
+			.saturating_add(T::DbWeight::get().reads(18))
+			.saturating_add(T::DbWeight::get().writes(22))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_remove_identity_noop() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `360`
+		//  Estimated: `3825`
+		// Minimum execution time: 4_888_000 picoseconds.
+		Weight::from_parts(5_194_000, 0)
+			.saturating_add(Weight::from_parts(0, 3825))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::CounterForIdentities` (r:1 w:1)
+	/// Proof: `Identity::CounterForIdentities` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:2)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::CounterForMembership` (r:1 w:1)
+	/// Proof: `Membership::CounterForMembership` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `Membership::MembershipsExpireOn` (r:1 w:1)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:6 w:6)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityIndexOf` (r:0 w:1)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Quota::IdtyQuota` (r:0 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_remove_identity() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `2355`
+		//  Estimated: `18195`
+		// Minimum execution time: 155_924_000 picoseconds.
+		Weight::from_parts(159_186_000, 0)
+			.saturating_add(Weight::from_parts(0, 18195))
+			.saturating_add(T::DbWeight::get().reads(24))
+			.saturating_add(T::DbWeight::get().writes(30))
+	}
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::CounterForMembership` (r:1 w:1)
+	/// Proof: `Membership::CounterForMembership` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `Membership::MembershipsExpireOn` (r:1 w:1)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `UniversalDividend::CurrentUdIndex` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUdIndex` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:6 w:6)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Quota::IdtyQuota` (r:0 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_remove_identity_handler() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `2372`
+		//  Estimated: `18212`
+		// Minimum execution time: 153_164_000 picoseconds.
+		Weight::from_parts(157_508_000, 0)
+			.saturating_add(Weight::from_parts(0, 18212))
+			.saturating_add(T::DbWeight::get().reads(25))
+			.saturating_add(T::DbWeight::get().writes(29))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn membership_removed() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `441`
+		//  Estimated: `6381`
+		// Minimum execution time: 16_781_000 picoseconds.
+		Weight::from_parts(17_373_000, 0)
+			.saturating_add(Weight::from_parts(0, 6381))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+	/// Storage: `Identity::IdentityChangeSchedule` (r:1 w:0)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn prune_identities_noop() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `165`
+		//  Estimated: `3630`
+		// Minimum execution time: 3_586_000 picoseconds.
+		Weight::from_parts(3_936_000, 0)
+			.saturating_add(Weight::from_parts(0, 3630))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Identity::IdentityChangeSchedule` (r:1 w:1)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn prune_identities_none() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `363`
+		//  Estimated: `3828`
+		// Minimum execution time: 8_263_000 picoseconds.
+		Weight::from_parts(8_759_000, 0)
+			.saturating_add(Weight::from_parts(0, 3828))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Identity::IdentityChangeSchedule` (r:1 w:1)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::CounterForIdentities` (r:1 w:1)
+	/// Proof: `Identity::CounterForIdentities` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:0)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityIndexOf` (r:0 w:1)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Quota::IdtyQuota` (r:0 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	fn prune_identities_err() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `952`
+		//  Estimated: `4417`
+		// Minimum execution time: 38_427_000 picoseconds.
+		Weight::from_parts(39_945_000, 0)
+			.saturating_add(Weight::from_parts(0, 4417))
+			.saturating_add(T::DbWeight::get().reads(6))
+			.saturating_add(T::DbWeight::get().writes(7))
+	}
+}
diff --git a/runtime/g1/src/weights/pallet_im_online.rs b/runtime/g1/src/weights/pallet_im_online.rs
new file mode 100644
index 0000000000000000000000000000000000000000..02c43969c6b40802c9d02cabbf74e0f063fa964a
--- /dev/null
+++ b/runtime/g1/src/weights/pallet_im_online.rs
@@ -0,0 +1,74 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_im_online`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/g1/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_im_online`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_im_online::WeightInfo for WeightInfo<T> {
+	/// Storage: `Session::Validators` (r:1 w:0)
+	/// Proof: `Session::Validators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::CurrentIndex` (r:1 w:0)
+	/// Proof: `Session::CurrentIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `ImOnline::Keys` (r:1 w:0)
+	/// Proof: `ImOnline::Keys` (`max_values`: Some(1), `max_size`: Some(32002), added: 32497, mode: `MaxEncodedLen`)
+	/// Storage: `ImOnline::ReceivedHeartbeats` (r:1 w:1)
+	/// Proof: `ImOnline::ReceivedHeartbeats` (`max_values`: None, `max_size`: Some(25), added: 2500, mode: `MaxEncodedLen`)
+	/// Storage: `ImOnline::AuthoredBlocks` (r:1 w:0)
+	/// Proof: `ImOnline::AuthoredBlocks` (`max_values`: None, `max_size`: Some(56), added: 2531, mode: `MaxEncodedLen`)
+	/// The range of component `k` is `[1, 1000]`.
+	fn validate_unsigned_and_then_heartbeat(k: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `525 + k * (32 ±0)`
+		//  Estimated: `33487 + k * (1761 ±0)`
+		// Minimum execution time: 56_656_000 picoseconds.
+		Weight::from_parts(68_340_368, 0)
+			.saturating_add(Weight::from_parts(0, 33487))
+			// Standard Error: 459
+			.saturating_add(Weight::from_parts(34_630, 0).saturating_mul(k.into()))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().writes(1))
+			.saturating_add(Weight::from_parts(0, 1761).saturating_mul(k.into()))
+	}
+}
diff --git a/runtime/common/src/weights/pallet_membership.rs b/runtime/g1/src/weights/pallet_membership.rs
similarity index 84%
rename from runtime/common/src/weights/pallet_membership.rs
rename to runtime/g1/src/weights/pallet_membership.rs
index dda4365f3ca97cb5620fae0ca7eddf8ecfe989c8..739fe67c9b0be0ce8b32bbf70d0a7785ded79381 100644
--- a/runtime/common/src/weights/pallet_membership.rs
+++ b/runtime/g1/src/weights/pallet_membership.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_membership`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/g1/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -51,8 +51,8 @@ impl<T: frame_system::Config> pallet_membership::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 164_000 picoseconds.
-		Weight::from_parts(180_000, 0)
+		// Minimum execution time: 89_000 picoseconds.
+		Weight::from_parts(133_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 	/// Storage: `Membership::MembershipsExpireOn` (r:2 w:2)
@@ -63,9 +63,11 @@ impl<T: frame_system::Config> pallet_membership::WeightInfo for WeightInfo<T> {
 	/// Proof: `Membership::CounterForMembership` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
 	/// Storage: `Identity::Identities` (r:3 w:3)
 	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	/// Storage: `UniversalDividend::CurrentUdIndex` (r:1 w:0)
 	/// Proof: `UniversalDividend::CurrentUdIndex` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
-	/// Storage: `SmithMembers::Smiths` (r:3 w:3)
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
 	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	/// Storage: `AuthorityMembers::Members` (r:3 w:3)
 	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
@@ -79,24 +81,22 @@ impl<T: frame_system::Config> pallet_membership::WeightInfo for WeightInfo<T> {
 	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	/// Storage: `System::Account` (r:3 w:3)
 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
-	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
-	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	/// Storage: `Session::KeyOwner` (r:0 w:12)
 	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	/// The range of component `i` is `[0, 3]`.
 	fn expire_memberships(i: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `138 + i * (804 ±0)`
-		//  Estimated: `9744 + i * (2687 ±0)`
-		// Minimum execution time: 4_154_000 picoseconds.
-		Weight::from_parts(10_550_258, 0)
-			.saturating_add(Weight::from_parts(0, 9744))
-			// Standard Error: 417_990
-			.saturating_add(Weight::from_parts(62_126_193, 0).saturating_mul(i.into()))
+		//  Measured:  `139 + i * (992 ±0)`
+		//  Estimated: `15059 + i * (2695 ±1)`
+		// Minimum execution time: 5_469_000 picoseconds.
+		Weight::from_parts(14_862_527, 0)
+			.saturating_add(Weight::from_parts(0, 15059))
+			// Standard Error: 644_477
+			.saturating_add(Weight::from_parts(80_115_649, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().reads(3))
-			.saturating_add(T::DbWeight::get().reads((10_u64).saturating_mul(i.into())))
+			.saturating_add(T::DbWeight::get().reads((11_u64).saturating_mul(i.into())))
 			.saturating_add(T::DbWeight::get().writes(3))
-			.saturating_add(T::DbWeight::get().writes((14_u64).saturating_mul(i.into())))
-			.saturating_add(Weight::from_parts(0, 2687).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().writes((15_u64).saturating_mul(i.into())))
+			.saturating_add(Weight::from_parts(0, 2695).saturating_mul(i.into()))
 	}
 }
diff --git a/runtime/common/src/weights/pallet_multisig.rs b/runtime/g1/src/weights/pallet_multisig.rs
similarity index 77%
rename from runtime/common/src/weights/pallet_multisig.rs
rename to runtime/g1/src/weights/pallet_multisig.rs
index 809c0922c59c89f9e28264cd90a37fab1b7408be..7ff5350b78dbeb1d084be8e9d258ea41497d9ede 100644
--- a/runtime/common/src/weights/pallet_multisig.rs
+++ b/runtime/g1/src/weights/pallet_multisig.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_multisig`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/g1/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -52,11 +52,11 @@ impl<T: frame_system::Config> pallet_multisig::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 4_978_000 picoseconds.
-		Weight::from_parts(5_382_909, 0)
+		// Minimum execution time: 5_424_000 picoseconds.
+		Weight::from_parts(5_777_452, 0)
 			.saturating_add(Weight::from_parts(0, 0))
-			// Standard Error: 2
-			.saturating_add(Weight::from_parts(334, 0).saturating_mul(z.into()))
+			// Standard Error: 1
+			.saturating_add(Weight::from_parts(320, 0).saturating_mul(z.into()))
 	}
 	/// Storage: `Multisig::Multisigs` (r:1 w:1)
 	/// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(457), added: 2932, mode: `MaxEncodedLen`)
@@ -66,13 +66,13 @@ impl<T: frame_system::Config> pallet_multisig::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `125 + s * (5 ±0)`
 		//  Estimated: `3922`
-		// Minimum execution time: 23_491_000 picoseconds.
-		Weight::from_parts(24_049_148, 0)
+		// Minimum execution time: 27_690_000 picoseconds.
+		Weight::from_parts(27_849_803, 0)
 			.saturating_add(Weight::from_parts(0, 3922))
-			// Standard Error: 5_895
-			.saturating_add(Weight::from_parts(80_169, 0).saturating_mul(s.into()))
+			// Standard Error: 6_103
+			.saturating_add(Weight::from_parts(130_702, 0).saturating_mul(s.into()))
 			// Standard Error: 5
-			.saturating_add(Weight::from_parts(1_030, 0).saturating_mul(z.into()))
+			.saturating_add(Weight::from_parts(1_060, 0).saturating_mul(z.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -84,11 +84,11 @@ impl<T: frame_system::Config> pallet_multisig::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `240`
 		//  Estimated: `3922`
-		// Minimum execution time: 13_765_000 picoseconds.
-		Weight::from_parts(13_706_792, 0)
+		// Minimum execution time: 15_572_000 picoseconds.
+		Weight::from_parts(15_882_913, 0)
 			.saturating_add(Weight::from_parts(0, 3922))
-			// Standard Error: 4_132
-			.saturating_add(Weight::from_parts(68_237, 0).saturating_mul(s.into()))
+			// Standard Error: 4_653
+			.saturating_add(Weight::from_parts(53_568, 0).saturating_mul(s.into()))
 			// Standard Error: 3
 			.saturating_add(Weight::from_parts(1_057, 0).saturating_mul(z.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
@@ -104,13 +104,13 @@ impl<T: frame_system::Config> pallet_multisig::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `259 + s * (37 ±0)`
 		//  Estimated: `3922`
-		// Minimum execution time: 26_519_000 picoseconds.
-		Weight::from_parts(26_370_537, 0)
+		// Minimum execution time: 30_395_000 picoseconds.
+		Weight::from_parts(30_782_695, 0)
 			.saturating_add(Weight::from_parts(0, 3922))
-			// Standard Error: 7_852
-			.saturating_add(Weight::from_parts(161_224, 0).saturating_mul(s.into()))
-			// Standard Error: 6
-			.saturating_add(Weight::from_parts(1_053, 0).saturating_mul(z.into()))
+			// Standard Error: 6_729
+			.saturating_add(Weight::from_parts(89_383, 0).saturating_mul(s.into()))
+			// Standard Error: 5
+			.saturating_add(Weight::from_parts(1_061, 0).saturating_mul(z.into()))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(2))
 	}
@@ -121,11 +121,11 @@ impl<T: frame_system::Config> pallet_multisig::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `130 + s * (5 ±0)`
 		//  Estimated: `3922`
-		// Minimum execution time: 20_919_000 picoseconds.
-		Weight::from_parts(22_650_151, 0)
+		// Minimum execution time: 25_593_000 picoseconds.
+		Weight::from_parts(26_830_662, 0)
 			.saturating_add(Weight::from_parts(0, 3922))
-			// Standard Error: 8_934
-			.saturating_add(Weight::from_parts(124_461, 0).saturating_mul(s.into()))
+			// Standard Error: 6_016
+			.saturating_add(Weight::from_parts(149_247, 0).saturating_mul(s.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -136,11 +136,11 @@ impl<T: frame_system::Config> pallet_multisig::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `240`
 		//  Estimated: `3922`
-		// Minimum execution time: 11_643_000 picoseconds.
-		Weight::from_parts(12_253_092, 0)
+		// Minimum execution time: 13_839_000 picoseconds.
+		Weight::from_parts(14_512_232, 0)
 			.saturating_add(Weight::from_parts(0, 3922))
-			// Standard Error: 3_568
-			.saturating_add(Weight::from_parts(135_819, 0).saturating_mul(s.into()))
+			// Standard Error: 3_561
+			.saturating_add(Weight::from_parts(108_424, 0).saturating_mul(s.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -151,11 +151,11 @@ impl<T: frame_system::Config> pallet_multisig::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `328 + s * (5 ±0)`
 		//  Estimated: `3922`
-		// Minimum execution time: 22_091_000 picoseconds.
-		Weight::from_parts(23_574_254, 0)
+		// Minimum execution time: 26_261_000 picoseconds.
+		Weight::from_parts(27_699_529, 0)
 			.saturating_add(Weight::from_parts(0, 3922))
-			// Standard Error: 6_372
-			.saturating_add(Weight::from_parts(112_181, 0).saturating_mul(s.into()))
+			// Standard Error: 7_715
+			.saturating_add(Weight::from_parts(158_650, 0).saturating_mul(s.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
diff --git a/runtime/common/src/weights/pallet_oneshot_account.rs b/runtime/g1/src/weights/pallet_oneshot_account.rs
similarity index 89%
rename from runtime/common/src/weights/pallet_oneshot_account.rs
rename to runtime/g1/src/weights/pallet_oneshot_account.rs
index f233263ca5561059dd5ed0835c1e6bc3ef4bc242..1fef60baed235c62fc3071d4be6a93a378597630 100644
--- a/runtime/common/src/weights/pallet_oneshot_account.rs
+++ b/runtime/g1/src/weights/pallet_oneshot_account.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_oneshot_account`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/g1/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -53,8 +53,8 @@ impl<T: frame_system::Config> pallet_oneshot_account::WeightInfo for WeightInfo<
 		// Proof Size summary in bytes:
 		//  Measured:  `42`
 		//  Estimated: `3507`
-		// Minimum execution time: 15_595_000 picoseconds.
-		Weight::from_parts(16_111_000, 0)
+		// Minimum execution time: 22_993_000 picoseconds.
+		Weight::from_parts(23_422_000, 0)
 			.saturating_add(Weight::from_parts(0, 3507))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -69,8 +69,8 @@ impl<T: frame_system::Config> pallet_oneshot_account::WeightInfo for WeightInfo<
 		// Proof Size summary in bytes:
 		//  Measured:  `241`
 		//  Estimated: `3706`
-		// Minimum execution time: 21_406_000 picoseconds.
-		Weight::from_parts(22_593_000, 0)
+		// Minimum execution time: 30_691_000 picoseconds.
+		Weight::from_parts(32_073_000, 0)
 			.saturating_add(Weight::from_parts(0, 3706))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -85,8 +85,8 @@ impl<T: frame_system::Config> pallet_oneshot_account::WeightInfo for WeightInfo<
 		// Proof Size summary in bytes:
 		//  Measured:  `301`
 		//  Estimated: `6126`
-		// Minimum execution time: 29_605_000 picoseconds.
-		Weight::from_parts(30_459_000, 0)
+		// Minimum execution time: 45_556_000 picoseconds.
+		Weight::from_parts(47_130_000, 0)
 			.saturating_add(Weight::from_parts(0, 6126))
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(3))
diff --git a/runtime/common/src/weights/pallet_preimage.rs b/runtime/g1/src/weights/pallet_preimage.rs
similarity index 87%
rename from runtime/common/src/weights/pallet_preimage.rs
rename to runtime/g1/src/weights/pallet_preimage.rs
index 463f391dd6f088b56031818be1d7bf5c8a8327aa..71708213db5655daeb95e9decb8b26ffa3cff378 100644
--- a/runtime/common/src/weights/pallet_preimage.rs
+++ b/runtime/g1/src/weights/pallet_preimage.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_preimage`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/g1/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -58,11 +58,11 @@ impl<T: frame_system::Config> pallet_preimage::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `42`
 		//  Estimated: `3548`
-		// Minimum execution time: 11_051_000 picoseconds.
-		Weight::from_parts(11_230_000, 0)
+		// Minimum execution time: 12_361_000 picoseconds.
+		Weight::from_parts(12_680_000, 0)
 			.saturating_add(Weight::from_parts(0, 3548))
-			// Standard Error: 1
-			.saturating_add(Weight::from_parts(1_276, 0).saturating_mul(s.into()))
+			// Standard Error: 2
+			.saturating_add(Weight::from_parts(1_323, 0).saturating_mul(s.into()))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(2))
 	}
@@ -77,11 +77,11 @@ impl<T: frame_system::Config> pallet_preimage::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `106`
 		//  Estimated: `3548`
-		// Minimum execution time: 13_018_000 picoseconds.
-		Weight::from_parts(13_243_000, 0)
+		// Minimum execution time: 15_234_000 picoseconds.
+		Weight::from_parts(15_561_000, 0)
 			.saturating_add(Weight::from_parts(0, 3548))
 			// Standard Error: 1
-			.saturating_add(Weight::from_parts(1_281, 0).saturating_mul(s.into()))
+			.saturating_add(Weight::from_parts(1_319, 0).saturating_mul(s.into()))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(2))
 	}
@@ -96,11 +96,11 @@ impl<T: frame_system::Config> pallet_preimage::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `106`
 		//  Estimated: `3548`
-		// Minimum execution time: 11_672_000 picoseconds.
-		Weight::from_parts(11_777_000, 0)
+		// Minimum execution time: 13_574_000 picoseconds.
+		Weight::from_parts(13_916_000, 0)
 			.saturating_add(Weight::from_parts(0, 3548))
 			// Standard Error: 1
-			.saturating_add(Weight::from_parts(1_278, 0).saturating_mul(s.into()))
+			.saturating_add(Weight::from_parts(1_401, 0).saturating_mul(s.into()))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(2))
 	}
@@ -114,8 +114,8 @@ impl<T: frame_system::Config> pallet_preimage::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `172`
 		//  Estimated: `3548`
-		// Minimum execution time: 23_631_000 picoseconds.
-		Weight::from_parts(25_860_000, 0)
+		// Minimum execution time: 23_820_000 picoseconds.
+		Weight::from_parts(26_783_000, 0)
 			.saturating_add(Weight::from_parts(0, 3548))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -130,8 +130,8 @@ impl<T: frame_system::Config> pallet_preimage::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `144`
 		//  Estimated: `3548`
-		// Minimum execution time: 22_985_000 picoseconds.
-		Weight::from_parts(25_660_000, 0)
+		// Minimum execution time: 23_704_000 picoseconds.
+		Weight::from_parts(24_838_000, 0)
 			.saturating_add(Weight::from_parts(0, 3548))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -144,8 +144,8 @@ impl<T: frame_system::Config> pallet_preimage::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `172`
 		//  Estimated: `3548`
-		// Minimum execution time: 21_615_000 picoseconds.
-		Weight::from_parts(23_521_000, 0)
+		// Minimum execution time: 20_991_000 picoseconds.
+		Weight::from_parts(22_482_000, 0)
 			.saturating_add(Weight::from_parts(0, 3548))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -158,8 +158,8 @@ impl<T: frame_system::Config> pallet_preimage::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `144`
 		//  Estimated: `3548`
-		// Minimum execution time: 13_134_000 picoseconds.
-		Weight::from_parts(15_067_000, 0)
+		// Minimum execution time: 13_636_000 picoseconds.
+		Weight::from_parts(15_511_000, 0)
 			.saturating_add(Weight::from_parts(0, 3548))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -172,8 +172,8 @@ impl<T: frame_system::Config> pallet_preimage::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `42`
 		//  Estimated: `3548`
-		// Minimum execution time: 9_217_000 picoseconds.
-		Weight::from_parts(10_352_000, 0)
+		// Minimum execution time: 10_511_000 picoseconds.
+		Weight::from_parts(11_283_000, 0)
 			.saturating_add(Weight::from_parts(0, 3548))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -186,8 +186,8 @@ impl<T: frame_system::Config> pallet_preimage::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `106`
 		//  Estimated: `3548`
-		// Minimum execution time: 6_997_000 picoseconds.
-		Weight::from_parts(7_663_000, 0)
+		// Minimum execution time: 8_689_000 picoseconds.
+		Weight::from_parts(10_141_000, 0)
 			.saturating_add(Weight::from_parts(0, 3548))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -202,8 +202,8 @@ impl<T: frame_system::Config> pallet_preimage::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `144`
 		//  Estimated: `3548`
-		// Minimum execution time: 20_216_000 picoseconds.
-		Weight::from_parts(23_210_000, 0)
+		// Minimum execution time: 21_074_000 picoseconds.
+		Weight::from_parts(22_966_000, 0)
 			.saturating_add(Weight::from_parts(0, 3548))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -216,8 +216,8 @@ impl<T: frame_system::Config> pallet_preimage::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `106`
 		//  Estimated: `3548`
-		// Minimum execution time: 6_998_000 picoseconds.
-		Weight::from_parts(7_393_000, 0)
+		// Minimum execution time: 8_531_000 picoseconds.
+		Weight::from_parts(9_066_000, 0)
 			.saturating_add(Weight::from_parts(0, 3548))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -230,8 +230,8 @@ impl<T: frame_system::Config> pallet_preimage::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `106`
 		//  Estimated: `3548`
-		// Minimum execution time: 6_933_000 picoseconds.
-		Weight::from_parts(7_518_000, 0)
+		// Minimum execution time: 8_532_000 picoseconds.
+		Weight::from_parts(9_859_000, 0)
 			.saturating_add(Weight::from_parts(0, 3548))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -247,11 +247,11 @@ impl<T: frame_system::Config> pallet_preimage::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0 + n * (179 ±0)`
 		//  Estimated: `990 + n * (2568 ±0)`
-		// Minimum execution time: 16_410_000 picoseconds.
-		Weight::from_parts(16_989_000, 0)
+		// Minimum execution time: 20_047_000 picoseconds.
+		Weight::from_parts(20_165_000, 0)
 			.saturating_add(Weight::from_parts(0, 990))
-			// Standard Error: 24_570
-			.saturating_add(Weight::from_parts(13_639_875, 0).saturating_mul(n.into()))
+			// Standard Error: 18_007
+			.saturating_add(Weight::from_parts(15_343_181, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(n.into())))
 			.saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(n.into())))
 			.saturating_add(Weight::from_parts(0, 2568).saturating_mul(n.into()))
diff --git a/runtime/common/src/weights/pallet_provide_randomness.rs b/runtime/g1/src/weights/pallet_provide_randomness.rs
similarity index 91%
rename from runtime/common/src/weights/pallet_provide_randomness.rs
rename to runtime/g1/src/weights/pallet_provide_randomness.rs
index f61b52623f927d06b4ec5404fa6fde08189071b9..1050568bc61b792602cac9d9b30000a33814d355 100644
--- a/runtime/common/src/weights/pallet_provide_randomness.rs
+++ b/runtime/g1/src/weights/pallet_provide_randomness.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_provide_randomness`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/g1/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -65,8 +65,8 @@ impl<T: frame_system::Config> pallet_provide_randomness::WeightInfo for WeightIn
 		// Proof Size summary in bytes:
 		//  Measured:  `298`
 		//  Estimated: `3763`
-		// Minimum execution time: 31_535_000 picoseconds.
-		Weight::from_parts(33_673_000, 0)
+		// Minimum execution time: 45_929_000 picoseconds.
+		Weight::from_parts(47_776_000, 0)
 			.saturating_add(Weight::from_parts(0, 3763))
 			.saturating_add(T::DbWeight::get().reads(7))
 			.saturating_add(T::DbWeight::get().writes(5))
@@ -86,11 +86,11 @@ impl<T: frame_system::Config> pallet_provide_randomness::WeightInfo for WeightIn
 		// Proof Size summary in bytes:
 		//  Measured:  `341 + i * (59 ±0)`
 		//  Estimated: `1827 + i * (2535 ±0)`
-		// Minimum execution time: 14_676_000 picoseconds.
-		Weight::from_parts(12_354_555, 0)
+		// Minimum execution time: 20_758_000 picoseconds.
+		Weight::from_parts(19_224_520, 0)
 			.saturating_add(Weight::from_parts(0, 1827))
-			// Standard Error: 5_734
-			.saturating_add(Weight::from_parts(4_864_658, 0).saturating_mul(i.into()))
+			// Standard Error: 5_498
+			.saturating_add(Weight::from_parts(5_750_488, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into())))
 			.saturating_add(T::DbWeight::get().writes(3))
@@ -118,11 +118,11 @@ impl<T: frame_system::Config> pallet_provide_randomness::WeightInfo for WeightIn
 		// Proof Size summary in bytes:
 		//  Measured:  `351 + i * (59 ±0)`
 		//  Estimated: `3817 + i * (2535 ±0)`
-		// Minimum execution time: 16_332_000 picoseconds.
-		Weight::from_parts(14_537_373, 0)
+		// Minimum execution time: 21_726_000 picoseconds.
+		Weight::from_parts(19_393_776, 0)
 			.saturating_add(Weight::from_parts(0, 3817))
-			// Standard Error: 7_399
-			.saturating_add(Weight::from_parts(5_157_639, 0).saturating_mul(i.into()))
+			// Standard Error: 8_077
+			.saturating_add(Weight::from_parts(6_132_986, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().reads(7))
 			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into())))
 			.saturating_add(T::DbWeight::get().writes(3))
diff --git a/runtime/g1/src/weights/pallet_proxy.rs b/runtime/g1/src/weights/pallet_proxy.rs
new file mode 100644
index 0000000000000000000000000000000000000000..74913c823c1886701f223fa7cee17c1866e9892c
--- /dev/null
+++ b/runtime/g1/src/weights/pallet_proxy.rs
@@ -0,0 +1,223 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_proxy`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/g1/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_proxy`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_proxy::WeightInfo for WeightInfo<T> {
+	/// Storage: `Proxy::Proxies` (r:1 w:0)
+	/// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
+	/// The range of component `p` is `[1, 31]`.
+	fn proxy(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `157 + p * (37 ±0)`
+		//  Estimated: `4698`
+		// Minimum execution time: 14_107_000 picoseconds.
+		Weight::from_parts(15_066_872, 0)
+			.saturating_add(Weight::from_parts(0, 4698))
+			// Standard Error: 1_348
+			.saturating_add(Weight::from_parts(23_202, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Proxy::Proxies` (r:1 w:0)
+	/// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
+	/// Storage: `Proxy::Announcements` (r:1 w:1)
+	/// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2225), added: 4700, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// The range of component `a` is `[0, 31]`.
+	/// The range of component `p` is `[1, 31]`.
+	fn proxy_announced(a: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `399 + a * (68 ±0) + p * (37 ±0)`
+		//  Estimated: `5690`
+		// Minimum execution time: 32_820_000 picoseconds.
+		Weight::from_parts(33_018_940, 0)
+			.saturating_add(Weight::from_parts(0, 5690))
+			// Standard Error: 1_839
+			.saturating_add(Weight::from_parts(149_359, 0).saturating_mul(a.into()))
+			// Standard Error: 1_900
+			.saturating_add(Weight::from_parts(42_139, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Proxy::Announcements` (r:1 w:1)
+	/// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2225), added: 4700, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// The range of component `a` is `[0, 31]`.
+	/// The range of component `p` is `[1, 31]`.
+	fn remove_announcement(a: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `322 + a * (68 ±0)`
+		//  Estimated: `5690`
+		// Minimum execution time: 22_480_000 picoseconds.
+		Weight::from_parts(22_941_444, 0)
+			.saturating_add(Weight::from_parts(0, 5690))
+			// Standard Error: 1_578
+			.saturating_add(Weight::from_parts(150_046, 0).saturating_mul(a.into()))
+			// Standard Error: 1_631
+			.saturating_add(Weight::from_parts(12_486, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Proxy::Announcements` (r:1 w:1)
+	/// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2225), added: 4700, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// The range of component `a` is `[0, 31]`.
+	/// The range of component `p` is `[1, 31]`.
+	fn reject_announcement(a: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `322 + a * (68 ±0)`
+		//  Estimated: `5690`
+		// Minimum execution time: 22_213_000 picoseconds.
+		Weight::from_parts(22_689_575, 0)
+			.saturating_add(Weight::from_parts(0, 5690))
+			// Standard Error: 1_525
+			.saturating_add(Weight::from_parts(149_745, 0).saturating_mul(a.into()))
+			// Standard Error: 1_575
+			.saturating_add(Weight::from_parts(16_228, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Proxy::Proxies` (r:1 w:0)
+	/// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
+	/// Storage: `Proxy::Announcements` (r:1 w:1)
+	/// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2225), added: 4700, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// The range of component `a` is `[0, 31]`.
+	/// The range of component `p` is `[1, 31]`.
+	fn announce(a: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `331 + a * (68 ±0) + p * (37 ±0)`
+		//  Estimated: `5690`
+		// Minimum execution time: 29_779_000 picoseconds.
+		Weight::from_parts(30_195_878, 0)
+			.saturating_add(Weight::from_parts(0, 5690))
+			// Standard Error: 1_849
+			.saturating_add(Weight::from_parts(137_520, 0).saturating_mul(a.into()))
+			// Standard Error: 1_910
+			.saturating_add(Weight::from_parts(43_697, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Proxy::Proxies` (r:1 w:1)
+	/// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
+	/// The range of component `p` is `[1, 31]`.
+	fn add_proxy(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `157 + p * (37 ±0)`
+		//  Estimated: `4698`
+		// Minimum execution time: 20_918_000 picoseconds.
+		Weight::from_parts(22_355_562, 0)
+			.saturating_add(Weight::from_parts(0, 4698))
+			// Standard Error: 1_772
+			.saturating_add(Weight::from_parts(48_016, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Proxy::Proxies` (r:1 w:1)
+	/// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
+	/// The range of component `p` is `[1, 31]`.
+	fn remove_proxy(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `157 + p * (37 ±0)`
+		//  Estimated: `4698`
+		// Minimum execution time: 21_589_000 picoseconds.
+		Weight::from_parts(22_684_377, 0)
+			.saturating_add(Weight::from_parts(0, 4698))
+			// Standard Error: 1_886
+			.saturating_add(Weight::from_parts(35_794, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Proxy::Proxies` (r:1 w:1)
+	/// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
+	/// The range of component `p` is `[1, 31]`.
+	fn remove_proxies(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `157 + p * (37 ±0)`
+		//  Estimated: `4698`
+		// Minimum execution time: 19_354_000 picoseconds.
+		Weight::from_parts(20_501_657, 0)
+			.saturating_add(Weight::from_parts(0, 4698))
+			// Standard Error: 1_393
+			.saturating_add(Weight::from_parts(37_242, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Proxy::Proxies` (r:1 w:1)
+	/// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
+	/// The range of component `p` is `[1, 31]`.
+	fn create_pure(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `177`
+		//  Estimated: `4698`
+		// Minimum execution time: 22_440_000 picoseconds.
+		Weight::from_parts(23_674_079, 0)
+			.saturating_add(Weight::from_parts(0, 4698))
+			// Standard Error: 1_490
+			.saturating_add(Weight::from_parts(7_580, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Proxy::Proxies` (r:1 w:1)
+	/// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
+	/// The range of component `p` is `[0, 30]`.
+	fn kill_pure(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `194 + p * (37 ±0)`
+		//  Estimated: `4698`
+		// Minimum execution time: 20_218_000 picoseconds.
+		Weight::from_parts(21_163_230, 0)
+			.saturating_add(Weight::from_parts(0, 4698))
+			// Standard Error: 1_397
+			.saturating_add(Weight::from_parts(28_501, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/g1/src/weights/pallet_quota.rs b/runtime/g1/src/weights/pallet_quota.rs
new file mode 100644
index 0000000000000000000000000000000000000000..7c4f1e12952585c15756ebd3e0fd2e6495bf5cf0
--- /dev/null
+++ b/runtime/g1/src/weights/pallet_quota.rs
@@ -0,0 +1,133 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_quota`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
+//! DATE: 2024-09-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/g1/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_quota`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_quota::WeightInfo for WeightInfo<T> {
+	/// Storage: `Quota::RefundQueue` (r:1 w:1)
+	/// Proof: `Quota::RefundQueue` (`max_values`: Some(1), `max_size`: Some(11266), added: 11761, mode: `MaxEncodedLen`)
+	fn queue_refund() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `11288`
+		//  Estimated: `12751`
+		// Minimum execution time: 7_428_000 picoseconds.
+		Weight::from_parts(7_638_000, 0)
+			.saturating_add(Weight::from_parts(0, 12751))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Quota::IdtyQuota` (r:1 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	fn spend_quota() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `172`
+		//  Estimated: `3489`
+		// Minimum execution time: 4_605_000 picoseconds.
+		Weight::from_parts(4_837_000, 0)
+			.saturating_add(Weight::from_parts(0, 3489))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Quota::IdtyQuota` (r:1 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn try_refund() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `235`
+		//  Estimated: `6126`
+		// Minimum execution time: 21_279_000 picoseconds.
+		Weight::from_parts(22_358_000, 0)
+			.saturating_add(Weight::from_parts(0, 6126))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Quota::IdtyQuota` (r:1 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn do_refund() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `235`
+		//  Estimated: `6126`
+		// Minimum execution time: 21_615_000 picoseconds.
+		Weight::from_parts(22_109_000, 0)
+			.saturating_add(Weight::from_parts(0, 6126))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Quota::RefundQueue` (r:1 w:1)
+	/// Proof: `Quota::RefundQueue` (`max_values`: Some(1), `max_size`: Some(11266), added: 11761, mode: `MaxEncodedLen`)
+	fn on_process_refund_queue() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `43`
+		//  Estimated: `12751`
+		// Minimum execution time: 1_793_000 picoseconds.
+		Weight::from_parts(1_903_000, 0)
+			.saturating_add(Weight::from_parts(0, 12751))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Quota::RefundQueue` (r:1 w:1)
+	/// Proof: `Quota::RefundQueue` (`max_values`: Some(1), `max_size`: Some(11266), added: 11761, mode: `MaxEncodedLen`)
+	/// Storage: `Quota::IdtyQuota` (r:1 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// The range of component `i` is `[1, 256]`.
+	fn on_process_refund_queue_elements(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `260 + i * (44 ±0)`
+		//  Estimated: `12751`
+		// Minimum execution time: 24_541_000 picoseconds.
+		Weight::from_parts(53_007_671, 0)
+			.saturating_add(Weight::from_parts(0, 12751))
+			// Standard Error: 28_238
+			.saturating_add(Weight::from_parts(1_213_374, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+}
diff --git a/runtime/common/src/weights/pallet_scheduler.rs b/runtime/g1/src/weights/pallet_scheduler.rs
similarity index 52%
rename from runtime/common/src/weights/pallet_scheduler.rs
rename to runtime/g1/src/weights/pallet_scheduler.rs
index 39515edc59fde30596951aba4acce084c03640b4..91bd8a921b8f46f980fc6cfba504d101ef8d5d23 100644
--- a/runtime/common/src/weights/pallet_scheduler.rs
+++ b/runtime/g1/src/weights/pallet_scheduler.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_scheduler`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/g1/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -53,8 +53,8 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `30`
 		//  Estimated: `1489`
-		// Minimum execution time: 2_232_000 picoseconds.
-		Weight::from_parts(2_370_000, 0)
+		// Minimum execution time: 3_221_000 picoseconds.
+		Weight::from_parts(3_410_000, 0)
 			.saturating_add(Weight::from_parts(0, 1489))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -66,11 +66,11 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `77 + s * (177 ±0)`
 		//  Estimated: `13928`
-		// Minimum execution time: 2_703_000 picoseconds.
-		Weight::from_parts(5_285_209, 0)
+		// Minimum execution time: 3_186_000 picoseconds.
+		Weight::from_parts(6_703_378, 0)
 			.saturating_add(Weight::from_parts(0, 13928))
-			// Standard Error: 1_467
-			.saturating_add(Weight::from_parts(297_347, 0).saturating_mul(s.into()))
+			// Standard Error: 1_917
+			.saturating_add(Weight::from_parts(287_784, 0).saturating_mul(s.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -78,12 +78,12 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 2_310_000 picoseconds.
-		Weight::from_parts(2_533_000, 0)
+		// Minimum execution time: 2_896_000 picoseconds.
+		Weight::from_parts(3_020_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 	/// Storage: `Preimage::PreimageFor` (r:1 w:1)
-	/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `Measured`)
+	/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`)
 	/// Storage: `Preimage::StatusFor` (r:1 w:0)
 	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
 	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
@@ -92,15 +92,14 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
 	fn service_task_fetched(s: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `179 + s * (1 ±0)`
-		//  Estimated: `3644 + s * (1 ±0)`
-		// Minimum execution time: 13_770_000 picoseconds.
-		Weight::from_parts(14_217_000, 0)
-			.saturating_add(Weight::from_parts(0, 3644))
+		//  Estimated: `4197809`
+		// Minimum execution time: 17_455_000 picoseconds.
+		Weight::from_parts(17_816_000, 0)
+			.saturating_add(Weight::from_parts(0, 4197809))
 			// Standard Error: 3
-			.saturating_add(Weight::from_parts(931, 0).saturating_mul(s.into()))
+			.saturating_add(Weight::from_parts(962, 0).saturating_mul(s.into()))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(2))
-			.saturating_add(Weight::from_parts(0, 1).saturating_mul(s.into()))
 	}
 	/// Storage: `Scheduler::Lookup` (r:0 w:1)
 	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
@@ -108,8 +107,8 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 3_484_000 picoseconds.
-		Weight::from_parts(3_664_000, 0)
+		// Minimum execution time: 4_236_000 picoseconds.
+		Weight::from_parts(4_400_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -117,24 +116,24 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 2_273_000 picoseconds.
-		Weight::from_parts(2_502_000, 0)
+		// Minimum execution time: 2_853_000 picoseconds.
+		Weight::from_parts(3_104_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 	fn execute_dispatch_signed() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_612_000 picoseconds.
-		Weight::from_parts(1_733_000, 0)
+		// Minimum execution time: 1_872_000 picoseconds.
+		Weight::from_parts(2_329_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 	fn execute_dispatch_unsigned() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_511_000 picoseconds.
-		Weight::from_parts(1_645_000, 0)
+		// Minimum execution time: 1_873_000 picoseconds.
+		Weight::from_parts(2_026_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 	/// Storage: `Scheduler::Agenda` (r:1 w:1)
@@ -144,16 +143,18 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `77 + s * (177 ±0)`
 		//  Estimated: `13928`
-		// Minimum execution time: 7_228_000 picoseconds.
-		Weight::from_parts(10_120_396, 0)
+		// Minimum execution time: 8_897_000 picoseconds.
+		Weight::from_parts(12_502_767, 0)
 			.saturating_add(Weight::from_parts(0, 13928))
-			// Standard Error: 1_562
-			.saturating_add(Weight::from_parts(311_196, 0).saturating_mul(s.into()))
+			// Standard Error: 1_951
+			.saturating_add(Weight::from_parts(298_828, 0).saturating_mul(s.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
 	/// Storage: `Scheduler::Agenda` (r:1 w:1)
 	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
 	/// Storage: `Scheduler::Lookup` (r:0 w:1)
 	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
 	/// The range of component `s` is `[1, 50]`.
@@ -161,13 +162,13 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `77 + s * (177 ±0)`
 		//  Estimated: `13928`
-		// Minimum execution time: 10_928_000 picoseconds.
-		Weight::from_parts(11_364_895, 0)
+		// Minimum execution time: 14_007_000 picoseconds.
+		Weight::from_parts(14_896_806, 0)
 			.saturating_add(Weight::from_parts(0, 13928))
-			// Standard Error: 1_293
-			.saturating_add(Weight::from_parts(483_700, 0).saturating_mul(s.into()))
+			// Standard Error: 1_602
+			.saturating_add(Weight::from_parts(457_263, 0).saturating_mul(s.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
-			.saturating_add(T::DbWeight::get().writes(2))
+			.saturating_add(T::DbWeight::get().writes(3))
 	}
 	/// Storage: `Scheduler::Lookup` (r:1 w:1)
 	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
@@ -178,11 +179,11 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `254 + s * (185 ±0)`
 		//  Estimated: `13928`
-		// Minimum execution time: 10_429_000 picoseconds.
-		Weight::from_parts(14_514_582, 0)
+		// Minimum execution time: 11_616_000 picoseconds.
+		Weight::from_parts(17_089_098, 0)
 			.saturating_add(Weight::from_parts(0, 13928))
-			// Standard Error: 6_410
-			.saturating_add(Weight::from_parts(336_583, 0).saturating_mul(s.into()))
+			// Standard Error: 4_345
+			.saturating_add(Weight::from_parts(350_760, 0).saturating_mul(s.into()))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(2))
 	}
@@ -190,17 +191,96 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
 	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
 	/// Storage: `Scheduler::Agenda` (r:1 w:1)
 	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
 	/// The range of component `s` is `[1, 50]`.
 	fn cancel_named(s: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `280 + s * (185 ±0)`
 		//  Estimated: `13928`
-		// Minimum execution time: 12_953_000 picoseconds.
-		Weight::from_parts(14_518_850, 0)
+		// Minimum execution time: 16_395_000 picoseconds.
+		Weight::from_parts(19_167_295, 0)
 			.saturating_add(Weight::from_parts(0, 13928))
-			// Standard Error: 1_923
-			.saturating_add(Weight::from_parts(499_073, 0).saturating_mul(s.into()))
+			// Standard Error: 2_411
+			.saturating_add(Weight::from_parts(490_476, 0).saturating_mul(s.into()))
 			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+	/// Storage: `Scheduler::Agenda` (r:1 w:1)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[1, 50]`.
+	fn schedule_retry(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `117`
+		//  Estimated: `13928`
+		// Minimum execution time: 8_469_000 picoseconds.
+		Weight::from_parts(9_181_472, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			// Standard Error: 581
+			.saturating_add(Weight::from_parts(27_665, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(2))
 	}
+	/// Storage: `Scheduler::Agenda` (r:1 w:0)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	fn set_retry() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `8927`
+		//  Estimated: `13928`
+		// Minimum execution time: 21_115_000 picoseconds.
+		Weight::from_parts(21_839_000, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Scheduler::Lookup` (r:1 w:0)
+	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Agenda` (r:1 w:0)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	fn set_retry_named() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `9605`
+		//  Estimated: `13928`
+		// Minimum execution time: 28_611_000 picoseconds.
+		Weight::from_parts(29_620_000, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Scheduler::Agenda` (r:1 w:0)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	fn cancel_retry() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `8939`
+		//  Estimated: `13928`
+		// Minimum execution time: 20_545_000 picoseconds.
+		Weight::from_parts(21_110_000, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Scheduler::Lookup` (r:1 w:0)
+	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Agenda` (r:1 w:0)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	fn cancel_retry_named() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `9617`
+		//  Estimated: `13928`
+		// Minimum execution time: 27_773_000 picoseconds.
+		Weight::from_parts(28_783_000, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
 }
diff --git a/runtime/common/src/weights/pallet_session.rs b/runtime/g1/src/weights/pallet_session.rs
similarity index 83%
rename from runtime/common/src/weights/pallet_session.rs
rename to runtime/g1/src/weights/pallet_session.rs
index 6a50fc75a025cdda45455ade655eb3a4cce6c1b7..3e589ddac52849f4d829108bb54db560d0dffa04 100644
--- a/runtime/common/src/weights/pallet_session.rs
+++ b/runtime/g1/src/weights/pallet_session.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_session`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/g1/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -53,11 +53,11 @@ impl<T: frame_system::Config> pallet_session::WeightInfo for WeightInfo<T> {
 	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn set_keys() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `723`
-		//  Estimated: `11613`
-		// Minimum execution time: 23_354_000 picoseconds.
-		Weight::from_parts(24_163_000, 0)
-			.saturating_add(Weight::from_parts(0, 11613))
+		//  Measured:  `810`
+		//  Estimated: `11700`
+		// Minimum execution time: 28_285_000 picoseconds.
+		Weight::from_parts(30_211_000, 0)
+			.saturating_add(Weight::from_parts(0, 11700))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(5))
 	}
@@ -67,11 +67,11 @@ impl<T: frame_system::Config> pallet_session::WeightInfo for WeightInfo<T> {
 	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn purge_keys() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `412`
-		//  Estimated: `3877`
-		// Minimum execution time: 13_795_000 picoseconds.
-		Weight::from_parts(14_645_000, 0)
-			.saturating_add(Weight::from_parts(0, 3877))
+		//  Measured:  `477`
+		//  Estimated: `3942`
+		// Minimum execution time: 17_013_000 picoseconds.
+		Weight::from_parts(17_708_000, 0)
+			.saturating_add(Weight::from_parts(0, 3942))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(5))
 	}
diff --git a/runtime/g1/src/weights/pallet_smith_members.rs b/runtime/g1/src/weights/pallet_smith_members.rs
new file mode 100644
index 0000000000000000000000000000000000000000..04aec5f18f6e6551c66a93bcba1f498ca7ab30ed
--- /dev/null
+++ b/runtime/g1/src/weights/pallet_smith_members.rs
@@ -0,0 +1,139 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_smith_members`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/g1/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_smith_members`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_smith_members::WeightInfo for WeightInfo<T> {
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::Smiths` (r:2 w:1)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:0)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::CurrentSession` (r:1 w:0)
+	/// Proof: `SmithMembers::CurrentSession` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::ExpiresOn` (r:1 w:1)
+	/// Proof: `SmithMembers::ExpiresOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn invite_smith() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `834`
+		//  Estimated: `6774`
+		// Minimum execution time: 32_588_000 picoseconds.
+		Weight::from_parts(33_329_000, 0)
+			.saturating_add(Weight::from_parts(0, 6774))
+			.saturating_add(T::DbWeight::get().reads(6))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::Smiths` (r:1 w:1)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn accept_invitation() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `599`
+		//  Estimated: `4064`
+		// Minimum execution time: 17_937_000 picoseconds.
+		Weight::from_parts(18_612_000, 0)
+			.saturating_add(Weight::from_parts(0, 4064))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::Smiths` (r:2 w:2)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::CurrentSession` (r:1 w:0)
+	/// Proof: `SmithMembers::CurrentSession` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::ExpiresOn` (r:1 w:1)
+	/// Proof: `SmithMembers::ExpiresOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn certify_smith() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `644`
+		//  Estimated: `6584`
+		// Minimum execution time: 27_762_000 picoseconds.
+		Weight::from_parts(28_638_000, 0)
+			.saturating_add(Weight::from_parts(0, 6584))
+			.saturating_add(T::DbWeight::get().reads(5))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn on_removed_wot_member() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1204`
+		//  Estimated: `14569`
+		// Minimum execution time: 68_924_000 picoseconds.
+		Weight::from_parts(73_214_000, 0)
+			.saturating_add(Weight::from_parts(0, 14569))
+			.saturating_add(T::DbWeight::get().reads(11))
+			.saturating_add(T::DbWeight::get().writes(15))
+	}
+	/// Storage: `SmithMembers::Smiths` (r:1 w:0)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn on_removed_wot_member_empty() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `253`
+		//  Estimated: `3718`
+		// Minimum execution time: 3_854_000 picoseconds.
+		Weight::from_parts(4_173_000, 0)
+			.saturating_add(Weight::from_parts(0, 3718))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+}
diff --git a/runtime/common/src/weights/pallet_sudo.rs b/runtime/g1/src/weights/pallet_sudo.rs
similarity index 86%
rename from runtime/common/src/weights/pallet_sudo.rs
rename to runtime/g1/src/weights/pallet_sudo.rs
index 682edad417e907be9d8d8ee470042f5d3a653fed..f6706d7984f089de7eb9dd504b177c6c5a8355e1 100644
--- a/runtime/common/src/weights/pallet_sudo.rs
+++ b/runtime/g1/src/weights/pallet_sudo.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_sudo`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/g1/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -53,8 +53,8 @@ impl<T: frame_system::Config> pallet_sudo::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `165`
 		//  Estimated: `1517`
-		// Minimum execution time: 6_849_000 picoseconds.
-		Weight::from_parts(7_482_000, 0)
+		// Minimum execution time: 9_039_000 picoseconds.
+		Weight::from_parts(9_530_000, 0)
 			.saturating_add(Weight::from_parts(0, 1517))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -65,8 +65,8 @@ impl<T: frame_system::Config> pallet_sudo::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `165`
 		//  Estimated: `1517`
-		// Minimum execution time: 7_184_000 picoseconds.
-		Weight::from_parts(7_604_000, 0)
+		// Minimum execution time: 9_819_000 picoseconds.
+		Weight::from_parts(10_161_000, 0)
 			.saturating_add(Weight::from_parts(0, 1517))
 			.saturating_add(T::DbWeight::get().reads(1))
 	}
@@ -76,8 +76,8 @@ impl<T: frame_system::Config> pallet_sudo::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `165`
 		//  Estimated: `1517`
-		// Minimum execution time: 7_135_000 picoseconds.
-		Weight::from_parts(7_482_000, 0)
+		// Minimum execution time: 9_943_000 picoseconds.
+		Weight::from_parts(10_321_000, 0)
 			.saturating_add(Weight::from_parts(0, 1517))
 			.saturating_add(T::DbWeight::get().reads(1))
 	}
@@ -87,8 +87,8 @@ impl<T: frame_system::Config> pallet_sudo::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `165`
 		//  Estimated: `1517`
-		// Minimum execution time: 6_189_000 picoseconds.
-		Weight::from_parts(6_603_000, 0)
+		// Minimum execution time: 8_325_000 picoseconds.
+		Weight::from_parts(8_883_000, 0)
 			.saturating_add(Weight::from_parts(0, 1517))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
diff --git a/runtime/g1/src/weights/pallet_timestamp.rs b/runtime/g1/src/weights/pallet_timestamp.rs
new file mode 100644
index 0000000000000000000000000000000000000000..96440e1d0d8427a7d16351b59f3f52825ec47639
--- /dev/null
+++ b/runtime/g1/src/weights/pallet_timestamp.rs
@@ -0,0 +1,74 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_timestamp`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/g1/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_timestamp`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_timestamp::WeightInfo for WeightInfo<T> {
+	/// Storage: `Timestamp::Now` (r:1 w:1)
+	/// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `Babe::CurrentSlot` (r:1 w:0)
+	/// Proof: `Babe::CurrentSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `UniversalDividend::NextUd` (r:1 w:1)
+	/// Proof: `UniversalDividend::NextUd` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	fn set() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `268`
+		//  Estimated: `1493`
+		// Minimum execution time: 11_710_000 picoseconds.
+		Weight::from_parts(12_366_000, 0)
+			.saturating_add(Weight::from_parts(0, 1493))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	fn on_finalize() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `57`
+		//  Estimated: `0`
+		// Minimum execution time: 3_490_000 picoseconds.
+		Weight::from_parts(3_811_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+}
diff --git a/runtime/g1/src/weights/pallet_treasury.rs b/runtime/g1/src/weights/pallet_treasury.rs
new file mode 100644
index 0000000000000000000000000000000000000000..4dc101cb8a1dbc55adc6d34af6e43542b83972e1
--- /dev/null
+++ b/runtime/g1/src/weights/pallet_treasury.rs
@@ -0,0 +1,129 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_treasury`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/g1/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_treasury`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_treasury::WeightInfo for WeightInfo<T> {
+	fn spend_local() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 0_000 picoseconds.
+		Weight::from_parts(0, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `Treasury::Approvals` (r:1 w:0)
+	/// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`)
+	fn remove_approval() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `6`
+		//  Estimated: `1887`
+		// Minimum execution time: 3_338_000 picoseconds.
+		Weight::from_parts(3_696_000, 0)
+			.saturating_add(Weight::from_parts(0, 1887))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `System::Account` (r:1 w:0)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Treasury::Deactivated` (r:1 w:1)
+	/// Proof: `Treasury::Deactivated` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `Treasury::Approvals` (r:1 w:1)
+	/// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`)
+	/// The range of component `p` is `[0, 99]`.
+	fn on_initialize_proposals(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `82 + p * (1 ±0)`
+		//  Estimated: `3558`
+		// Minimum execution time: 15_544_000 picoseconds.
+		Weight::from_parts(16_586_598, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			// Standard Error: 652
+			.saturating_add(Weight::from_parts(34_361, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	fn spend() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 0_000 picoseconds.
+		Weight::from_parts(0, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `Treasury::Spends` (r:1 w:0)
+	/// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(61), added: 2536, mode: `MaxEncodedLen`)
+	fn payout() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `6`
+		//  Estimated: `3526`
+		// Minimum execution time: 4_737_000 picoseconds.
+		Weight::from_parts(6_080_000, 0)
+			.saturating_add(Weight::from_parts(0, 3526))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Treasury::Spends` (r:1 w:0)
+	/// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(61), added: 2536, mode: `MaxEncodedLen`)
+	fn check_status() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `6`
+		//  Estimated: `3526`
+		// Minimum execution time: 4_559_000 picoseconds.
+		Weight::from_parts(4_757_000, 0)
+			.saturating_add(Weight::from_parts(0, 3526))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Treasury::Spends` (r:1 w:0)
+	/// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(61), added: 2536, mode: `MaxEncodedLen`)
+	fn void_spend() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `6`
+		//  Estimated: `3526`
+		// Minimum execution time: 4_051_000 picoseconds.
+		Weight::from_parts(4_414_000, 0)
+			.saturating_add(Weight::from_parts(0, 3526))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+}
diff --git a/runtime/g1/src/weights/pallet_universal_dividend.rs b/runtime/g1/src/weights/pallet_universal_dividend.rs
new file mode 100644
index 0000000000000000000000000000000000000000..42e477446cf583232dd83df3f429e3a7f3f54908
--- /dev/null
+++ b/runtime/g1/src/weights/pallet_universal_dividend.rs
@@ -0,0 +1,120 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_universal_dividend`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/g1/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_universal_dividend`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_universal_dividend::WeightInfo for WeightInfo<T> {
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `UniversalDividend::CurrentUdIndex` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUdIndex` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
+	/// Storage: `UniversalDividend::PastReevals` (r:1 w:0)
+	/// Proof: `UniversalDividend::PastReevals` (`max_values`: Some(1), `max_size`: Some(1602), added: 2097, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// The range of component `i` is `[1, 160]`.
+	fn claim_uds(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `709`
+		//  Estimated: `4174`
+		// Minimum execution time: 36_436_000 picoseconds.
+		Weight::from_parts(38_389_932, 0)
+			.saturating_add(Weight::from_parts(0, 4174))
+			// Standard Error: 407
+			.saturating_add(Weight::from_parts(316, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(5))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `UniversalDividend::CurrentUd` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUd` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:2)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn transfer_ud() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `156`
+		//  Estimated: `6126`
+		// Minimum execution time: 56_411_000 picoseconds.
+		Weight::from_parts(57_616_000, 0)
+			.saturating_add(Weight::from_parts(0, 6126))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `UniversalDividend::CurrentUd` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUd` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn transfer_ud_keep_alive() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `93`
+		//  Estimated: `3558`
+		// Minimum execution time: 34_875_000 picoseconds.
+		Weight::from_parts(35_945_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `UniversalDividend::CurrentUdIndex` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUdIndex` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
+	/// Storage: `UniversalDividend::PastReevals` (r:1 w:0)
+	/// Proof: `UniversalDividend::PastReevals` (`max_values`: Some(1), `max_size`: Some(1602), added: 2097, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// The range of component `i` is `[1, 160]`.
+	fn on_removed_member(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `181`
+		//  Estimated: `3558`
+		// Minimum execution time: 20_319_000 picoseconds.
+		Weight::from_parts(21_541_050, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			// Standard Error: 362
+			.saturating_add(Weight::from_parts(119, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/common/src/weights/pallet_upgrade_origin.rs b/runtime/g1/src/weights/pallet_upgrade_origin.rs
similarity index 89%
rename from runtime/common/src/weights/pallet_upgrade_origin.rs
rename to runtime/g1/src/weights/pallet_upgrade_origin.rs
index 84d6dd584d02b082fc8593fe539834f7055d606c..d7abb94adf876c5f9120dc2ca87acfd21766dc63 100644
--- a/runtime/common/src/weights/pallet_upgrade_origin.rs
+++ b/runtime/g1/src/weights/pallet_upgrade_origin.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_upgrade_origin`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/g1/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -51,8 +51,8 @@ impl<T: frame_system::Config> pallet_upgrade_origin::WeightInfo for WeightInfo<T
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 4_788_000 picoseconds.
-		Weight::from_parts(5_082_000, 0)
+		// Minimum execution time: 5_781_000 picoseconds.
+		Weight::from_parts(6_004_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 }
diff --git a/runtime/common/src/weights/pallet_utility.rs b/runtime/g1/src/weights/pallet_utility.rs
similarity index 75%
rename from runtime/common/src/weights/pallet_utility.rs
rename to runtime/g1/src/weights/pallet_utility.rs
index a8f75d976bbd7a1d6605df18292bf09d89dd3073..51a27afd16b560f2422c793e5af0a9cec14fca51 100644
--- a/runtime/common/src/weights/pallet_utility.rs
+++ b/runtime/g1/src/weights/pallet_utility.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_utility`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/g1/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -52,18 +52,18 @@ impl<T: frame_system::Config> pallet_utility::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 3_581_000 picoseconds.
-		Weight::from_parts(7_374_359, 0)
+		// Minimum execution time: 4_443_000 picoseconds.
+		Weight::from_parts(11_691_812, 0)
 			.saturating_add(Weight::from_parts(0, 0))
-			// Standard Error: 1_632
-			.saturating_add(Weight::from_parts(2_118_997, 0).saturating_mul(c.into()))
+			// Standard Error: 975
+			.saturating_add(Weight::from_parts(2_271_470, 0).saturating_mul(c.into()))
 	}
 	fn as_derivative() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 3_024_000 picoseconds.
-		Weight::from_parts(3_208_000, 0)
+		// Minimum execution time: 3_680_000 picoseconds.
+		Weight::from_parts(3_997_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 	/// The range of component `c` is `[0, 1000]`.
@@ -71,18 +71,18 @@ impl<T: frame_system::Config> pallet_utility::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 3_473_000 picoseconds.
-		Weight::from_parts(8_353_428, 0)
+		// Minimum execution time: 4_464_000 picoseconds.
+		Weight::from_parts(7_360_289, 0)
 			.saturating_add(Weight::from_parts(0, 0))
-			// Standard Error: 996
-			.saturating_add(Weight::from_parts(2_259_350, 0).saturating_mul(c.into()))
+			// Standard Error: 1_069
+			.saturating_add(Weight::from_parts(2_442_339, 0).saturating_mul(c.into()))
 	}
 	fn dispatch_as() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 4_885_000 picoseconds.
-		Weight::from_parts(5_109_000, 0)
+		// Minimum execution time: 6_074_000 picoseconds.
+		Weight::from_parts(6_363_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 	/// The range of component `c` is `[0, 1000]`.
@@ -90,10 +90,10 @@ impl<T: frame_system::Config> pallet_utility::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 3_429_000 picoseconds.
-		Weight::from_parts(7_728_963, 0)
+		// Minimum execution time: 4_684_000 picoseconds.
+		Weight::from_parts(9_159_803, 0)
 			.saturating_add(Weight::from_parts(0, 0))
-			// Standard Error: 2_171
-			.saturating_add(Weight::from_parts(2_117_531, 0).saturating_mul(c.into()))
+			// Standard Error: 935
+			.saturating_add(Weight::from_parts(2_276_360, 0).saturating_mul(c.into()))
 	}
 }
diff --git a/runtime/g1/src/weights/paritydb_weights.rs b/runtime/g1/src/weights/paritydb_weights.rs
new file mode 100644
index 0000000000000000000000000000000000000000..b1427ac5ab8c4f8142111b74f0cc1c11b07a7171
--- /dev/null
+++ b/runtime/g1/src/weights/paritydb_weights.rs
@@ -0,0 +1,95 @@
+
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28 (Y/M/D)
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//!
+//! DATABASE: `ParityDb`, RUNTIME: `Ğ1 Local Testnet`
+//! BLOCK-NUM: `BlockId::Number(0)`
+//! SKIP-WRITE: `false`, SKIP-READ: `false`, WARMUPS: `1`
+//! STATE-VERSION: `V1`, STATE-CACHE-SIZE: ``
+//! WEIGHT-PATH: `./runtime/g1/src/weights/`
+//! METRIC: `Average`, WEIGHT-MUL: `2.0`, WEIGHT-ADD: `0`
+
+// Executed Command:
+//   target/release/duniter
+//   benchmark
+//   storage
+//   --chain=dev
+//   --mul=2
+//   --weight-path=./runtime/g1/src/weights/
+//   --state-version=1
+//   --database=paritydb
+
+/// Storage DB weights for the `Ğ1 Local Testnet` runtime and `ParityDb`.
+pub mod constants {
+	use frame_support::weights::constants;
+	use sp_core::parameter_types;
+	use sp_weights::RuntimeDbWeight;
+
+	parameter_types! {
+		/// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights
+		/// are available for brave runtime engineers who may want to try this out as default.
+		pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight {
+			/// Time to read one storage item.
+			/// Calculated by multiplying the *Average* of all values with `2.0` and adding `0`.
+			///
+			/// Stats nanoseconds:
+			///   Min, Max: 896, 1_118_224
+			///   Average:  8_595
+			///   Median:   1_325
+			///   Std-Dev:  88562.05
+			///
+			/// Percentiles nanoseconds:
+			///   99th: 10_223
+			///   95th: 2_718
+			///   75th: 1_606
+			read: 17_190 * constants::WEIGHT_REF_TIME_PER_NANOS,
+
+			/// Time to write one storage item.
+			/// Calculated by multiplying the *Average* of all values with `2.0` and adding `0`.
+			///
+			/// Stats nanoseconds:
+			///   Min, Max: 3_779, 6_930_852
+			///   Average:  53_733
+			///   Median:   9_966
+			///   Std-Dev:  548863.87
+			///
+			/// Percentiles nanoseconds:
+			///   99th: 24_839
+			///   95th: 14_850
+			///   75th: 11_965
+			write: 107_466 * constants::WEIGHT_REF_TIME_PER_NANOS,
+		};
+	}
+
+	#[cfg(test)]
+	mod test_db_weights {
+		use super::constants::ParityDbWeight as W;
+		use sp_weights::constants;
+
+		/// Checks that all weights exist and have sane values.
+		// NOTE: If this test fails but you are sure that the generated values are fine,
+		// you can delete it.
+		#[test]
+		fn bound() {
+			// At least 1 µs.
+			assert!(
+				W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS,
+				"Read weight should be at least 1 µs."
+			);
+			assert!(
+				W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS,
+				"Write weight should be at least 1 µs."
+			);
+			// At most 1 ms.
+			assert!(
+				W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS,
+				"Read weight should be at most 1 ms."
+			);
+			assert!(
+				W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS,
+				"Write weight should be at most 1 ms."
+			);
+		}
+	}
+}
diff --git a/runtime/gdev/Cargo.toml b/runtime/gdev/Cargo.toml
index ef804b7e94e0c75568108ba79655475c39aa64ea..3299b812d1622b27fc3fea94ee79aa01471c580d 100644
--- a/runtime/gdev/Cargo.toml
+++ b/runtime/gdev/Cargo.toml
@@ -60,6 +60,7 @@ std = [
 	"frame-system-benchmarking/std",
 	"frame-system-rpc-runtime-api/std",
 	"frame-system/std",
+	"frame-try-runtime/std",
 	"log/std",
 	"node-primitives/std",
 	"pallet-atomic-swap/std",
@@ -116,16 +117,17 @@ std = [
 	"sp-runtime/std",
 	"sp-session/std",
 	"sp-staking/std",
-	"sp-std/std",
 	"sp-transaction-pool/std",
 	"sp-version/std",
 	"substrate-wasm-builder",
+	"sp-weights/std",
 ]
 try-runtime = [
 	"common-runtime/try-runtime",
 	"frame-executive/try-runtime",
 	"frame-support/try-runtime",
 	"frame-system/try-runtime",
+	"frame-try-runtime/try-runtime",
 	"pallet-atomic-swap/try-runtime",
 	"pallet-authority-discovery/try-runtime",
 	"pallet-authority-members/try-runtime",
@@ -182,6 +184,7 @@ frame-support = { workspace = true }
 frame-system = { workspace = true }
 frame-system-benchmarking = { workspace = true, optional = true }
 frame-system-rpc-runtime-api = { workspace = true }
+frame-try-runtime = { workspace = true, optional = true }
 hex-literal = { workspace = true, optional = true }
 log = { workspace = true }
 node-primitives = { workspace = true }
@@ -237,6 +240,6 @@ sp-membership = { workspace = true }
 sp-offchain = { workspace = true }
 sp-runtime = { workspace = true }
 sp-session = { workspace = true }
-sp-std = { workspace = true }
 sp-transaction-pool = { workspace = true }
 sp-version = { workspace = true }
+sp-weights = { workspace = true }
diff --git a/runtime/gdev/src/lib.rs b/runtime/gdev/src/lib.rs
index 43902ada745d0e748d13e69fc3d881e448043610..a67e66c279bc66c2a0f29626866f9b7a04662bd5 100644
--- a/runtime/gdev/src/lib.rs
+++ b/runtime/gdev/src/lib.rs
@@ -27,44 +27,48 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
 extern crate frame_benchmarking;
 
 pub mod parameters;
+pub mod weights;
 
 pub use self::parameters::*;
+use common_runtime::IdtyNameValidatorImpl;
 pub use common_runtime::{
     constants::*, entities::*, handlers::*, AccountId, Address, Balance, BlockNumber,
     FullIdentificationOfImpl, GetCurrentEpochIndex, Hash, Header, IdtyIndex, Index, Signature,
 };
+use frame_support::{
+    traits::{fungible::Balanced, Contains, Imbalance},
+    PalletId,
+};
 pub use frame_system::Call as SystemCall;
+use frame_system::EnsureRoot;
 pub use pallet_balances::Call as BalancesCall;
+#[cfg(feature = "runtime-benchmarks")]
+pub use pallet_collective::RawOrigin;
 pub use pallet_duniter_test_parameters::Parameters as GenesisParameters;
+use pallet_grandpa::{
+    fg_primitives, AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList,
+};
 pub use pallet_im_online::sr25519::AuthorityId as ImOnlineId;
 use pallet_session::historical as session_historical;
 pub use pallet_timestamp::Call as TimestampCall;
-use pallet_transaction_payment::CurrencyAdapter;
+use pallet_transaction_payment::FungibleAdapter;
 pub use pallet_universal_dividend;
-#[cfg(any(feature = "std", test))]
-pub use sp_runtime::BuildStorage;
-pub use sp_runtime::{KeyTypeId, Perbill, Permill};
-
-use common_runtime::IdtyNameValidatorImpl;
-use frame_support::traits::Contains;
-use frame_support::PalletId;
-use frame_system::EnsureRoot;
-use pallet_grandpa::fg_primitives;
-use pallet_grandpa::{AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList};
+use scale_info::prelude::{vec, vec::Vec};
 use sp_api::impl_runtime_apis;
 use sp_core::OpaqueMetadata;
-use sp_runtime::traits::{
-    AccountIdLookup, BlakeTwo256, Block as BlockT, NumberFor, One, OpaqueKeys,
-};
+#[cfg(any(feature = "std", test))]
+pub use sp_runtime::BuildStorage;
 use sp_runtime::{
     create_runtime_str, generic, impl_opaque_keys,
+    traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, NumberFor, OpaqueKeys},
     transaction_validity::{TransactionSource, TransactionValidity},
-    ApplyExtrinsicResult,
+    ApplyExtrinsicResult, Perquintill,
 };
-use sp_std::prelude::*;
+pub use sp_runtime::{KeyTypeId, Perbill, Permill};
 #[cfg(feature = "std")]
 use sp_version::NativeVersion;
 use sp_version::RuntimeVersion;
+pub use weights::paritydb_weights::constants::ParityDbWeight as DbWeight;
 
 // A few exports that help ease life for downstream crates.
 use frame_support::instances::Instance2;
@@ -72,9 +76,7 @@ pub use frame_support::{
     construct_runtime, parameter_types,
     traits::{EqualPrivilegeOnly, KeyOwnerProofSystem, Randomness},
     weights::{
-        constants::{
-            BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND,
-        },
+        constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight},
         Weight, WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial,
     },
     StorageValue,
@@ -172,16 +174,9 @@ mod benches {
 }
 
 pub struct BaseCallFilter;
-
-// implement filter
 impl Contains<RuntimeCall> for BaseCallFilter {
     fn contains(call: &RuntimeCall) -> bool {
-        !matches!(
-            call,
-            // session calls can not be called directly
-            // it should be done through authority-members pallet
-            RuntimeCall::Session(_)
-        )
+        !matches!(call, RuntimeCall::Session(_))
     }
 }
 
@@ -245,38 +240,38 @@ impl frame_support::traits::InstanceFilter<RuntimeCall> for ProxyType {
     }
 }
 
-// Configure pallets to include in runtime.
-common_runtime::pallets_config! {
-    // Dynamic parameters
-    pub type EpochDuration = pallet_duniter_test_parameters::BabeEpochDuration<Runtime>;
-    pub type CertPeriod = pallet_duniter_test_parameters::CertPeriod<Runtime>;
-    pub type MaxByIssuer = pallet_duniter_test_parameters::CertMaxByIssuer<Runtime>;
-    pub type MinReceivedCertToBeAbleToIssueCert =
-        pallet_duniter_test_parameters::CertMinReceivedCertToIssueCert<Runtime>;
-    pub type ValidityPeriod = pallet_duniter_test_parameters::CertValidityPeriod<Runtime>;
-    pub type ConfirmPeriod = pallet_duniter_test_parameters::IdtyConfirmPeriod<Runtime>;
-    pub type IdtyCreationPeriod = pallet_duniter_test_parameters::IdtyCreationPeriod<Runtime>;
-    pub type MembershipPeriod = pallet_duniter_test_parameters::MembershipPeriod<Runtime>;
-    pub type MembershipRenewalPeriod = pallet_duniter_test_parameters::MembershipRenewalPeriod<Runtime>;
-    pub type UdCreationPeriod = pallet_duniter_test_parameters::UdCreationPeriod<Runtime>;
-    pub type UdReevalPeriod = pallet_duniter_test_parameters::UdReevalPeriod<Runtime>;
-    pub type WotFirstCertIssuableOn = pallet_duniter_test_parameters::WotFirstCertIssuableOn<Runtime>;
-    pub type WotMinCertForMembership = pallet_duniter_test_parameters::WotMinCertForMembership<Runtime>;
-    pub type WotMinCertForCreateIdtyRight =
-        pallet_duniter_test_parameters::WotMinCertForCreateIdtyRight<Runtime>;
-    pub type SmithMaxByIssuer = pallet_duniter_test_parameters::SmithCertMaxByIssuer<Runtime>;
-    pub type SmithWotMinCertForMembership =
-        pallet_duniter_test_parameters::SmithWotMinCertForMembership<Runtime>;
-    pub type SmithInactivityMaxDuration =
-        pallet_duniter_test_parameters::SmithInactivityMaxDuration<Runtime>;
+// Dynamic parameters
+pub type EpochDuration = pallet_duniter_test_parameters::BabeEpochDuration<Runtime>;
+pub type CertPeriod = pallet_duniter_test_parameters::CertPeriod<Runtime>;
+pub type MaxByIssuer = pallet_duniter_test_parameters::CertMaxByIssuer<Runtime>;
+pub type MinReceivedCertToBeAbleToIssueCert =
+    pallet_duniter_test_parameters::CertMinReceivedCertToIssueCert<Runtime>;
+pub type ValidityPeriod = pallet_duniter_test_parameters::CertValidityPeriod<Runtime>;
+pub type ConfirmPeriod = pallet_duniter_test_parameters::IdtyConfirmPeriod<Runtime>;
+pub type IdtyCreationPeriod = pallet_duniter_test_parameters::IdtyCreationPeriod<Runtime>;
+pub type MembershipPeriod = pallet_duniter_test_parameters::MembershipPeriod<Runtime>;
+pub type MembershipRenewalPeriod = pallet_duniter_test_parameters::MembershipRenewalPeriod<Runtime>;
+pub type UdCreationPeriod = pallet_duniter_test_parameters::UdCreationPeriod<Runtime>;
+pub type UdReevalPeriod = pallet_duniter_test_parameters::UdReevalPeriod<Runtime>;
+pub type WotFirstCertIssuableOn = pallet_duniter_test_parameters::WotFirstCertIssuableOn<Runtime>;
+pub type WotMinCertForMembership = pallet_duniter_test_parameters::WotMinCertForMembership<Runtime>;
+pub type WotMinCertForCreateIdtyRight =
+    pallet_duniter_test_parameters::WotMinCertForCreateIdtyRight<Runtime>;
+pub type SmithMaxByIssuer = pallet_duniter_test_parameters::SmithCertMaxByIssuer<Runtime>;
+pub type SmithWotMinCertForMembership =
+    pallet_duniter_test_parameters::SmithWotMinCertForMembership<Runtime>;
+pub type SmithInactivityMaxDuration =
+    pallet_duniter_test_parameters::SmithInactivityMaxDuration<Runtime>;
 
-    impl pallet_duniter_test_parameters::Config for Runtime {
-        type BlockNumber = u32;
-        type CertCount = u32;
-        type PeriodCount = Balance;
-        type SessionCount = u32;
-    }
+impl pallet_duniter_test_parameters::Config for Runtime {
+    type BlockNumber = u32;
+    type CertCount = u32;
+    type PeriodCount = Balance;
+    type SessionCount = u32;
 }
+#[cfg(feature = "runtime-benchmarks")]
+type WorstOrigin = RawOrigin<AccountId, TechnicalCommitteeInstance>;
+common_runtime::pallets_config!();
 
 // Create the runtime by composing the pallets that were previously configured.
 construct_runtime!(
diff --git a/runtime/gdev/src/parameters.rs b/runtime/gdev/src/parameters.rs
index 881e2550ad2999fd56ee7113d446dfdc46673d89..0b7083313bb62d7606d0af4fd06fa1e15085bf81 100644
--- a/runtime/gdev/src/parameters.rs
+++ b/runtime/gdev/src/parameters.rs
@@ -16,18 +16,15 @@
 
 use crate::*;
 use common_runtime::constants::*;
-use common_runtime::{Balance, BlockNumber};
-use frame_support::parameter_types;
-use frame_support::traits::EitherOfDiverse;
-use frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND;
-use sp_arithmetic::Perbill;
+use frame_support::{
+    parameter_types, traits::EitherOfDiverse, weights::constants::WEIGHT_REF_TIME_PER_SECOND,
+};
 use sp_runtime::transaction_validity::TransactionPriority;
 
 parameter_types! {
     pub const BlockHashCount: BlockNumber = 2400;
     /// We allow for 2 seconds of compute with a 6 second average block time.
-    pub BlockWeights: frame_system::limits::BlockWeights = block_weights((Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND, 0) * 2)
-        .set_proof_size(5 * 1024 * 1024), NORMAL_DISPATCH_RATIO);
+    pub BlockWeights: frame_system::limits::BlockWeights = frame_system::limits::BlockWeights::with_sensible_defaults(Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND * 2u64, u64::MAX), NORMAL_DISPATCH_RATIO);
     pub BlockLength: frame_system::limits::BlockLength = frame_system::limits::BlockLength
         ::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO);
     pub const SS58Prefix: u16 = 42;
@@ -52,6 +49,12 @@ parameter_types! {
     pub const MinimumPeriod: u64 = SLOT_DURATION / 2;
 }
 
+// Distance
+parameter_types! {
+    pub const MinAccessibleReferees: Perbill = Perbill::from_percent(80);
+    pub const MaxRefereeDistance: u32 = 5;
+}
+
 // Babe
 parameter_types! {
     pub const ExpectedBlockTime: u64 = MILLISECS_PER_BLOCK;
@@ -60,7 +63,7 @@ parameter_types! {
 
 // ImOnline
 parameter_types! {
-    pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value();
+    pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::MAX;
     pub const MaxPeerInHeartbeats: u32 = 10_000;
     pub const MaxPeerDataEncodingSize: u32 = 1_000;
 }
diff --git a/runtime/gdev/src/weights.rs b/runtime/gdev/src/weights.rs
new file mode 100644
index 0000000000000000000000000000000000000000..1bf51bdbb063859c33197a6251bf767ba1311442
--- /dev/null
+++ b/runtime/gdev/src/weights.rs
@@ -0,0 +1,52 @@
+// Copyright 2021 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(clippy::unnecessary_cast)]
+#![allow(unused_doc_comments)]
+
+pub mod block_weights;
+pub mod extrinsic_weights;
+pub mod frame_system;
+pub mod pallet_babe;
+pub mod pallet_balances;
+pub mod pallet_collective;
+pub mod pallet_distance;
+pub mod pallet_grandpa;
+pub mod pallet_im_online;
+pub mod pallet_multisig;
+pub mod pallet_proxy;
+pub mod pallet_session;
+pub mod pallet_scheduler;
+pub mod pallet_timestamp;
+pub mod pallet_treasury;
+pub mod pallet_universal_dividend;
+pub mod pallet_upgrade_origin;
+pub mod pallet_provide_randomness;
+pub mod pallet_identity;
+pub mod pallet_preimage;
+pub mod pallet_utility;
+pub mod pallet_duniter_account;
+pub mod pallet_quota;
+pub mod pallet_oneshot_account;
+pub mod pallet_certification;
+pub mod pallet_membership;
+pub mod pallet_smith_members;
+pub mod pallet_sudo;
+pub mod pallet_authority_members;
+pub mod paritydb_weights;
diff --git a/runtime/common/src/weights/block_weights.rs b/runtime/gdev/src/weights/block_weights.rs
similarity index 81%
rename from runtime/common/src/weights/block_weights.rs
rename to runtime/gdev/src/weights/block_weights.rs
index e099f3d77b6cfa7e7634abab7f8a4fe1b3f812f7..b3f70181b4711ee45ee7af2bf0f810143ebd93cb 100644
--- a/runtime/common/src/weights/block_weights.rs
+++ b/runtime/gdev/src/weights/block_weights.rs
@@ -1,11 +1,11 @@
 
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04 (Y/M/D)
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28 (Y/M/D)
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //!
 //! SHORT-NAME: `block`, LONG-NAME: `BlockExecution`, RUNTIME: `Ğdev Local Testnet`
 //! WARMUPS: `10`, REPEAT: `100`
-//! WEIGHT-PATH: `./runtime/common/src/weights/`
+//! WEIGHT-PATH: `./runtime/gdev/src/weights/`
 //! WEIGHT-METRIC: `Average`, WEIGHT-MUL: `1.0`, WEIGHT-ADD: `0`
 
 // Executed Command:
@@ -14,7 +14,7 @@
 //   overhead
 //   --chain=dev
 //   --wasm-execution=compiled
-//   --weight-path=./runtime/common/src/weights/
+//   --weight-path=./runtime/gdev/src/weights/
 //   --warmup=10
 //   --repeat=100
 
@@ -26,17 +26,17 @@ parameter_types! {
 	/// Calculated by multiplying the *Average* with `1.0` and adding `0`.
 	///
 	/// Stats nanoseconds:
-	///   Min, Max: 123_084, 150_596
-	///   Average:  130_621
-	///   Median:   129_744
-	///   Std-Dev:  4623.45
+	///   Min, Max: 126_813, 342_923
+	///   Average:  139_677
+	///   Median:   137_396
+	///   Std-Dev:  21189.71
 	///
 	/// Percentiles nanoseconds:
-	///   99th: 150_183
-	///   95th: 139_003
-	///   75th: 131_346
+	///   99th: 174_763
+	///   95th: 144_408
+	///   75th: 138_915
 	pub const BlockExecutionWeight: Weight =
-		Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS.saturating_mul(130_621), 0);
+		Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS.saturating_mul(139_677), 0);
 }
 
 #[cfg(test)]
diff --git a/runtime/common/src/weights/extrinsic_weights.rs b/runtime/gdev/src/weights/extrinsic_weights.rs
similarity index 78%
rename from runtime/common/src/weights/extrinsic_weights.rs
rename to runtime/gdev/src/weights/extrinsic_weights.rs
index 95d2aa2d371f30e09440891767c1d17e9196a3a8..57f1ddea78fa6dff24083f90e709bed2bc5767f4 100644
--- a/runtime/common/src/weights/extrinsic_weights.rs
+++ b/runtime/gdev/src/weights/extrinsic_weights.rs
@@ -1,11 +1,11 @@
 
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04 (Y/M/D)
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28 (Y/M/D)
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //!
 //! SHORT-NAME: `extrinsic`, LONG-NAME: `ExtrinsicBase`, RUNTIME: `Ğdev Local Testnet`
 //! WARMUPS: `10`, REPEAT: `100`
-//! WEIGHT-PATH: `./runtime/common/src/weights/`
+//! WEIGHT-PATH: `./runtime/gdev/src/weights/`
 //! WEIGHT-METRIC: `Average`, WEIGHT-MUL: `1.0`, WEIGHT-ADD: `0`
 
 // Executed Command:
@@ -14,7 +14,7 @@
 //   overhead
 //   --chain=dev
 //   --wasm-execution=compiled
-//   --weight-path=./runtime/common/src/weights/
+//   --weight-path=./runtime/gdev/src/weights/
 //   --warmup=10
 //   --repeat=100
 
@@ -26,17 +26,17 @@ parameter_types! {
 	/// Calculated by multiplying the *Average* with `1.0` and adding `0`.
 	///
 	/// Stats nanoseconds:
-	///   Min, Max: 77_859, 79_469
-	///   Average:  78_235
-	///   Median:   78_181
-	///   Std-Dev:  252.75
+	///   Min, Max: 90_407, 91_183
+	///   Average:  90_667
+	///   Median:   90_647
+	///   Std-Dev:  135.21
 	///
 	/// Percentiles nanoseconds:
-	///   99th: 79_293
-	///   95th: 78_565
-	///   75th: 78_341
+	///   99th: 91_161
+	///   95th: 90_893
+	///   75th: 90_734
 	pub const ExtrinsicBaseWeight: Weight =
-		Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS.saturating_mul(78_235), 0);
+		Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS.saturating_mul(90_667), 0);
 }
 
 #[cfg(test)]
diff --git a/runtime/gdev/src/weights/frame_benchmarking_baseline.rs b/runtime/gdev/src/weights/frame_benchmarking_baseline.rs
new file mode 100644
index 0000000000000000000000000000000000000000..931ec5c703dd6a608c5bc6eef004fb9aa7745ec1
--- /dev/null
+++ b/runtime/gdev/src/weights/frame_benchmarking_baseline.rs
@@ -0,0 +1,105 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `frame_benchmarking::baseline`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `frame_benchmarking::baseline`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> frame_benchmarking::baseline::WeightInfo for WeightInfo<T> {
+	/// The range of component `i` is `[0, 1000000]`.
+	fn addition(_i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 92_000 picoseconds.
+		Weight::from_parts(127_414, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// The range of component `i` is `[0, 1000000]`.
+	fn subtraction(_i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 85_000 picoseconds.
+		Weight::from_parts(131_130, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// The range of component `i` is `[0, 1000000]`.
+	fn multiplication(_i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 86_000 picoseconds.
+		Weight::from_parts(130_684, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// The range of component `i` is `[0, 1000000]`.
+	fn division(_i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 93_000 picoseconds.
+		Weight::from_parts(130_781, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	fn hashing() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 20_341_231_000 picoseconds.
+		Weight::from_parts(20_438_091_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// The range of component `i` is `[0, 100]`.
+	fn sr25519_verification(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 96_000 picoseconds.
+		Weight::from_parts(35_171_935, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 35_251
+			.saturating_add(Weight::from_parts(31_311_885, 0).saturating_mul(i.into()))
+	}
+}
diff --git a/runtime/gdev/src/weights/frame_system.rs b/runtime/gdev/src/weights/frame_system.rs
new file mode 100644
index 0000000000000000000000000000000000000000..85fb962d051d03a2093ec70c2e6aecd0ff9f9d6c
--- /dev/null
+++ b/runtime/gdev/src/weights/frame_system.rs
@@ -0,0 +1,171 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `frame_system`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `frame_system`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> frame_system::WeightInfo for WeightInfo<T> {
+	/// The range of component `b` is `[0, 3932160]`.
+	fn remark(b: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 1_980_000 picoseconds.
+		Weight::from_parts(1_732_823, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 0
+			.saturating_add(Weight::from_parts(254, 0).saturating_mul(b.into()))
+	}
+	/// The range of component `b` is `[0, 3932160]`.
+	fn remark_with_event(b: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 4_961_000 picoseconds.
+		Weight::from_parts(5_085_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 1
+			.saturating_add(Weight::from_parts(1_040, 0).saturating_mul(b.into()))
+	}
+	/// Storage: `System::Digest` (r:1 w:1)
+	/// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1)
+	/// Proof: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1)
+	fn set_heap_pages() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `1485`
+		// Minimum execution time: 3_446_000 picoseconds.
+		Weight::from_parts(3_637_000, 0)
+			.saturating_add(Weight::from_parts(0, 1485))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `System::Digest` (r:1 w:1)
+	/// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1)
+	/// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1)
+	fn set_code() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `1485`
+		// Minimum execution time: 77_511_333_000 picoseconds.
+		Weight::from_parts(78_141_458_000, 0)
+			.saturating_add(Weight::from_parts(0, 1485))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Skipped::Metadata` (r:0 w:0)
+	/// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[0, 1000]`.
+	fn set_storage(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 1_740_000 picoseconds.
+		Weight::from_parts(1_870_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 488
+			.saturating_add(Weight::from_parts(595_938, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
+	}
+	/// Storage: `Skipped::Metadata` (r:0 w:0)
+	/// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[0, 1000]`.
+	fn kill_storage(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 1_782_000 picoseconds.
+		Weight::from_parts(1_871_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 570
+			.saturating_add(Weight::from_parts(455_197, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
+	}
+	/// Storage: `Skipped::Metadata` (r:0 w:0)
+	/// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `p` is `[0, 1000]`.
+	fn kill_prefix(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `77 + p * (69 ±0)`
+		//  Estimated: `76 + p * (70 ±0)`
+		// Minimum execution time: 3_398_000 picoseconds.
+		Weight::from_parts(3_494_000, 0)
+			.saturating_add(Weight::from_parts(0, 76))
+			// Standard Error: 749
+			.saturating_add(Weight::from_parts(1_035_125, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into())))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into())))
+			.saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into()))
+	}
+	/// Storage: `System::AuthorizedUpgrade` (r:0 w:1)
+	/// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`)
+	fn authorize_upgrade() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 8_618_000 picoseconds.
+		Weight::from_parts(10_212_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `System::AuthorizedUpgrade` (r:1 w:1)
+	/// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`)
+	/// Storage: `System::Digest` (r:1 w:1)
+	/// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1)
+	/// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1)
+	fn apply_authorized_upgrade() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `22`
+		//  Estimated: `1518`
+		// Minimum execution time: 82_296_674_000 picoseconds.
+		Weight::from_parts(82_804_290_000, 0)
+			.saturating_add(Weight::from_parts(0, 1518))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+}
diff --git a/runtime/gdev/src/weights/pallet_authority_members.rs b/runtime/gdev/src/weights/pallet_authority_members.rs
new file mode 100644
index 0000000000000000000000000000000000000000..c054dcd6757ae4498368ccad2965498917235aa9
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_authority_members.rs
@@ -0,0 +1,156 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_authority_members`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_authority_members`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_authority_members::WeightInfo for WeightInfo<T> {
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::Smiths` (r:1 w:0)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:0)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:0)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:0)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn go_offline() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `933`
+		//  Estimated: `4398`
+		// Minimum execution time: 25_789_000 picoseconds.
+		Weight::from_parts(26_891_000, 0)
+			.saturating_add(Weight::from_parts(0, 4398))
+			.saturating_add(T::DbWeight::get().reads(6))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::Smiths` (r:1 w:0)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Blacklist` (r:1 w:0)
+	/// Proof: `AuthorityMembers::Blacklist` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:0)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:0)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:0)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:0)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn go_online() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1390`
+		//  Estimated: `4855`
+		// Minimum execution time: 34_142_000 picoseconds.
+		Weight::from_parts(35_952_000, 0)
+			.saturating_add(Weight::from_parts(0, 4855))
+			.saturating_add(T::DbWeight::get().reads(8))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::Smiths` (r:1 w:0)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:0)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::KeyOwner` (r:4 w:0)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:0 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn set_session_keys() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1839`
+		//  Estimated: `12729`
+		// Minimum execution time: 45_148_000 picoseconds.
+		Weight::from_parts(46_043_000, 0)
+			.saturating_add(Weight::from_parts(0, 12729))
+			.saturating_add(T::DbWeight::get().reads(8))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn remove_member() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `848`
+		//  Estimated: `4313`
+		// Minimum execution time: 39_618_000 picoseconds.
+		Weight::from_parts(42_080_000, 0)
+			.saturating_add(Weight::from_parts(0, 4313))
+			.saturating_add(T::DbWeight::get().reads(6))
+			.saturating_add(T::DbWeight::get().writes(10))
+	}
+	/// Storage: `AuthorityMembers::Blacklist` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Blacklist` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn remove_member_from_blacklist() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `199`
+		//  Estimated: `1684`
+		// Minimum execution time: 9_955_000 picoseconds.
+		Weight::from_parts(10_344_000, 0)
+			.saturating_add(Weight::from_parts(0, 1684))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/gdev/src/weights/pallet_babe.rs b/runtime/gdev/src/weights/pallet_babe.rs
new file mode 100644
index 0000000000000000000000000000000000000000..86185992a9c13eb63302b1206cf37cb05b47f576
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_babe.rs
@@ -0,0 +1,54 @@
+// Copyright 2021 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Manual weights for the GRANDPA Pallet in duniter runtimes
+//! This file was not auto-generated.
+
+use frame_support::{
+    traits::Get,
+    weights::{
+        constants::{WEIGHT_REF_TIME_PER_MICROS, WEIGHT_REF_TIME_PER_NANOS},
+        Weight,
+    },
+};
+use scale_info::prelude::marker::PhantomData;
+
+/// Weight functions for `pallet_babe`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_babe::WeightInfo for WeightInfo<T> {
+    fn plan_config_change() -> Weight {
+        T::DbWeight::get().writes(1)
+    }
+
+    fn report_equivocation(validator_count: u32, _p: u32) -> Weight {
+        // we take the validator set count from the membership proof to
+        // calculate the weight but we set a floor of 100 validators.
+        let validator_count = validator_count.max(100) as u64;
+
+        // checking membership proof
+        (Weight::from_parts(WEIGHT_REF_TIME_PER_MICROS, 0) * 35)
+            .saturating_add(
+                (Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS, 0) * 175)
+                    .saturating_mul(validator_count),
+            )
+            .saturating_add(T::DbWeight::get().reads(5))
+            // check equivocation proof
+            .saturating_add(Weight::from_parts(WEIGHT_REF_TIME_PER_MICROS, 0) * 110)
+            // report offence
+            .saturating_add(Weight::from_parts(WEIGHT_REF_TIME_PER_MICROS, 0) * 110)
+            .saturating_add(T::DbWeight::get().writes(3))
+    }
+}
diff --git a/runtime/gdev/src/weights/pallet_balances.rs b/runtime/gdev/src/weights/pallet_balances.rs
new file mode 100644
index 0000000000000000000000000000000000000000..023fe977dbb01db1b9414fb85f749d4c00b19a2f
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_balances.rs
@@ -0,0 +1,162 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_balances`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_balances`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_balances::WeightInfo for WeightInfo<T> {
+	/// Storage: `System::Account` (r:2 w:2)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn transfer_allow_death() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `63`
+		//  Estimated: `6126`
+		// Minimum execution time: 53_001_000 picoseconds.
+		Weight::from_parts(54_199_000, 0)
+			.saturating_add(Weight::from_parts(0, 6126))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn transfer_keep_alive() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `3558`
+		// Minimum execution time: 31_272_000 picoseconds.
+		Weight::from_parts(33_042_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn force_set_balance_creating() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `134`
+		//  Estimated: `3558`
+		// Minimum execution time: 11_337_000 picoseconds.
+		Weight::from_parts(11_774_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn force_set_balance_killing() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `134`
+		//  Estimated: `3558`
+		// Minimum execution time: 17_295_000 picoseconds.
+		Weight::from_parts(18_211_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `System::Account` (r:3 w:3)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn force_transfer() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `126`
+		//  Estimated: `8694`
+		// Minimum execution time: 51_846_000 picoseconds.
+		Weight::from_parts(53_291_000, 0)
+			.saturating_add(Weight::from_parts(0, 8694))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn transfer_all() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `3558`
+		// Minimum execution time: 39_410_000 picoseconds.
+		Weight::from_parts(41_330_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn force_unreserve() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `134`
+		//  Estimated: `3558`
+		// Minimum execution time: 14_981_000 picoseconds.
+		Weight::from_parts(15_905_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	fn force_adjust_total_issuance() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 5_622_000 picoseconds.
+		Weight::from_parts(5_939_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn burn_allow_death() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `63`
+		//  Estimated: `3558`
+		// Minimum execution time: 37_807_000 picoseconds.
+		Weight::from_parts(38_486_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	fn burn_keep_alive() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 16_793_000 picoseconds.
+		Weight::from_parts(17_644_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+}
diff --git a/runtime/common/src/weights/pallet_certification.rs b/runtime/gdev/src/weights/pallet_certification.rs
similarity index 83%
rename from runtime/common/src/weights/pallet_certification.rs
rename to runtime/gdev/src/weights/pallet_certification.rs
index b300963c4620ef2744ae7d576ce3d65bd18dea82..f8701d68c508ea000140108243ceefdb7756401c 100644
--- a/runtime/common/src/weights/pallet_certification.rs
+++ b/runtime/gdev/src/weights/pallet_certification.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_certification`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/gdev/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -61,11 +61,11 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T>
 	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn add_cert() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `956`
-		//  Estimated: `6896`
-		// Minimum execution time: 30_158_000 picoseconds.
-		Weight::from_parts(31_303_000, 0)
-			.saturating_add(Weight::from_parts(0, 6896))
+		//  Measured:  `1107`
+		//  Estimated: `7047`
+		// Minimum execution time: 39_882_000 picoseconds.
+		Weight::from_parts(41_659_000, 0)
+			.saturating_add(Weight::from_parts(0, 7047))
 			.saturating_add(T::DbWeight::get().reads(8))
 			.saturating_add(T::DbWeight::get().writes(4))
 	}
@@ -83,11 +83,11 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T>
 	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn renew_cert() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `980`
-		//  Estimated: `6920`
-		// Minimum execution time: 28_884_000 picoseconds.
-		Weight::from_parts(29_612_000, 0)
-			.saturating_add(Weight::from_parts(0, 6920))
+		//  Measured:  `1130`
+		//  Estimated: `7070`
+		// Minimum execution time: 40_022_000 picoseconds.
+		Weight::from_parts(41_986_000, 0)
+			.saturating_add(Weight::from_parts(0, 7070))
 			.saturating_add(T::DbWeight::get().reads(7))
 			.saturating_add(T::DbWeight::get().writes(3))
 	}
@@ -99,11 +99,11 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T>
 	/// Proof: `Parameters::ParametersStorage` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 	fn del_cert() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `444`
-		//  Estimated: `6384`
-		// Minimum execution time: 16_455_000 picoseconds.
-		Weight::from_parts(17_256_000, 0)
-			.saturating_add(Weight::from_parts(0, 6384))
+		//  Measured:  `528`
+		//  Estimated: `6468`
+		// Minimum execution time: 23_278_000 picoseconds.
+		Weight::from_parts(24_092_000, 0)
+			.saturating_add(Weight::from_parts(0, 6468))
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(3))
 	}
@@ -118,13 +118,13 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T>
 	/// The range of component `i` is `[2, 1000]`.
 	fn remove_all_certs_received_by(i: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `546 + i * (35 ±0)`
-		//  Estimated: `4017 + i * (2511 ±0)`
-		// Minimum execution time: 23_417_000 picoseconds.
-		Weight::from_parts(23_956_000, 0)
-			.saturating_add(Weight::from_parts(0, 4017))
-			// Standard Error: 22_385
-			.saturating_add(Weight::from_parts(8_489_500, 0).saturating_mul(i.into()))
+		//  Measured:  `665 + i * (35 ±0)`
+		//  Estimated: `4129 + i * (2511 ±0)`
+		// Minimum execution time: 35_508_000 picoseconds.
+		Weight::from_parts(36_566_000, 0)
+			.saturating_add(Weight::from_parts(0, 4129))
+			// Standard Error: 26_528
+			.saturating_add(Weight::from_parts(9_711_280, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into())))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -137,8 +137,8 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T>
 		// Proof Size summary in bytes:
 		//  Measured:  `139`
 		//  Estimated: `3604`
-		// Minimum execution time: 2_483_000 picoseconds.
-		Weight::from_parts(2_609_000, 0)
+		// Minimum execution time: 3_467_000 picoseconds.
+		Weight::from_parts(3_737_000, 0)
 			.saturating_add(Weight::from_parts(0, 3604))
 			.saturating_add(T::DbWeight::get().reads(1))
 	}
@@ -146,11 +146,11 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T>
 	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn do_remove_cert_noop() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `237`
-		//  Estimated: `3702`
-		// Minimum execution time: 3_474_000 picoseconds.
-		Weight::from_parts(3_649_000, 0)
-			.saturating_add(Weight::from_parts(0, 3702))
+		//  Measured:  `276`
+		//  Estimated: `3741`
+		// Minimum execution time: 5_305_000 picoseconds.
+		Weight::from_parts(5_639_000, 0)
+			.saturating_add(Weight::from_parts(0, 3741))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -164,11 +164,11 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T>
 	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn do_remove_cert() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `660`
-		//  Estimated: `6600`
-		// Minimum execution time: 19_307_000 picoseconds.
-		Weight::from_parts(20_020_000, 0)
-			.saturating_add(Weight::from_parts(0, 6600))
+		//  Measured:  `822`
+		//  Estimated: `6762`
+		// Minimum execution time: 29_162_000 picoseconds.
+		Weight::from_parts(30_857_000, 0)
+			.saturating_add(Weight::from_parts(0, 6762))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(3))
 	}
diff --git a/runtime/common/src/weights/pallet_collective.rs b/runtime/gdev/src/weights/pallet_collective.rs
similarity index 81%
rename from runtime/common/src/weights/pallet_collective.rs
rename to runtime/gdev/src/weights/pallet_collective.rs
index 0682dc4b50c749b1d0dd2fd4e03c1c345a1d2500..448338d959bbba72932d246db34d1ee5962c531c 100644
--- a/runtime/common/src/weights/pallet_collective.rs
+++ b/runtime/gdev/src/weights/pallet_collective.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_collective`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/gdev/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -62,13 +62,13 @@ impl<T: frame_system::Config> pallet_collective::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0 + m * (672 ±0) + p * (3191 ±0)`
 		//  Estimated: `10019 + m * (416 ±5) + p * (4183 ±27)`
-		// Minimum execution time: 11_299_000 picoseconds.
-		Weight::from_parts(11_509_000, 0)
+		// Minimum execution time: 12_506_000 picoseconds.
+		Weight::from_parts(12_877_000, 0)
 			.saturating_add(Weight::from_parts(0, 10019))
-			// Standard Error: 8_549
-			.saturating_add(Weight::from_parts(644_119, 0).saturating_mul(m.into()))
-			// Standard Error: 42_263
-			.saturating_add(Weight::from_parts(5_653_926, 0).saturating_mul(p.into()))
+			// Standard Error: 10_258
+			.saturating_add(Weight::from_parts(768_734, 0).saturating_mul(m.into()))
+			// Standard Error: 50_710
+			.saturating_add(Weight::from_parts(7_165_983, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into())))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -84,13 +84,13 @@ impl<T: frame_system::Config> pallet_collective::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `32 + m * (32 ±0)`
 		//  Estimated: `1518 + m * (32 ±0)`
-		// Minimum execution time: 9_634_000 picoseconds.
-		Weight::from_parts(9_182_276, 0)
+		// Minimum execution time: 11_312_000 picoseconds.
+		Weight::from_parts(11_053_545, 0)
 			.saturating_add(Weight::from_parts(0, 1518))
-			// Standard Error: 27
-			.saturating_add(Weight::from_parts(1_193, 0).saturating_mul(b.into()))
-			// Standard Error: 287
-			.saturating_add(Weight::from_parts(12_966, 0).saturating_mul(m.into()))
+			// Standard Error: 34
+			.saturating_add(Weight::from_parts(1_089, 0).saturating_mul(b.into()))
+			// Standard Error: 356
+			.saturating_add(Weight::from_parts(12_805, 0).saturating_mul(m.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into()))
 	}
@@ -104,13 +104,13 @@ impl<T: frame_system::Config> pallet_collective::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `32 + m * (32 ±0)`
 		//  Estimated: `3498 + m * (32 ±0)`
-		// Minimum execution time: 11_648_000 picoseconds.
-		Weight::from_parts(11_249_880, 0)
+		// Minimum execution time: 13_574_000 picoseconds.
+		Weight::from_parts(13_374_994, 0)
 			.saturating_add(Weight::from_parts(0, 3498))
-			// Standard Error: 36
-			.saturating_add(Weight::from_parts(1_155, 0).saturating_mul(b.into()))
-			// Standard Error: 374
-			.saturating_add(Weight::from_parts(19_049, 0).saturating_mul(m.into()))
+			// Standard Error: 42
+			.saturating_add(Weight::from_parts(1_149, 0).saturating_mul(b.into()))
+			// Standard Error: 442
+			.saturating_add(Weight::from_parts(19_034, 0).saturating_mul(m.into()))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into()))
 	}
@@ -131,15 +131,15 @@ impl<T: frame_system::Config> pallet_collective::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `24 + m * (32 ±0) + p * (55 ±0)`
 		//  Estimated: `3461 + m * (32 ±0) + p * (54 ±0)`
-		// Minimum execution time: 16_530_000 picoseconds.
-		Weight::from_parts(15_662_728, 0)
+		// Minimum execution time: 19_522_000 picoseconds.
+		Weight::from_parts(21_209_024, 0)
 			.saturating_add(Weight::from_parts(0, 3461))
-			// Standard Error: 63
-			.saturating_add(Weight::from_parts(2_178, 0).saturating_mul(b.into()))
-			// Standard Error: 661
-			.saturating_add(Weight::from_parts(17_907, 0).saturating_mul(m.into()))
-			// Standard Error: 3_307
-			.saturating_add(Weight::from_parts(259_014, 0).saturating_mul(p.into()))
+			// Standard Error: 195
+			.saturating_add(Weight::from_parts(2_357, 0).saturating_mul(b.into()))
+			// Standard Error: 2_039
+			.saturating_add(Weight::from_parts(18_305, 0).saturating_mul(m.into()))
+			// Standard Error: 10_188
+			.saturating_add(Weight::from_parts(233_956, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(4))
 			.saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into()))
@@ -154,11 +154,11 @@ impl<T: frame_system::Config> pallet_collective::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `573 + m * (64 ±0)`
 		//  Estimated: `4037 + m * (64 ±0)`
-		// Minimum execution time: 15_171_000 picoseconds.
-		Weight::from_parts(15_664_934, 0)
+		// Minimum execution time: 18_070_000 picoseconds.
+		Weight::from_parts(19_572_186, 0)
 			.saturating_add(Weight::from_parts(0, 4037))
-			// Standard Error: 548
-			.saturating_add(Weight::from_parts(35_118, 0).saturating_mul(m.into()))
+			// Standard Error: 802
+			.saturating_add(Weight::from_parts(35_411, 0).saturating_mul(m.into()))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(1))
 			.saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into()))
@@ -177,13 +177,13 @@ impl<T: frame_system::Config> pallet_collective::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `117 + m * (64 ±0) + p * (55 ±0)`
 		//  Estimated: `3591 + m * (64 ±0) + p * (55 ±0)`
-		// Minimum execution time: 18_725_000 picoseconds.
-		Weight::from_parts(17_295_145, 0)
+		// Minimum execution time: 22_453_000 picoseconds.
+		Weight::from_parts(21_029_526, 0)
 			.saturating_add(Weight::from_parts(0, 3591))
-			// Standard Error: 611
-			.saturating_add(Weight::from_parts(31_903, 0).saturating_mul(m.into()))
-			// Standard Error: 3_017
-			.saturating_add(Weight::from_parts(236_285, 0).saturating_mul(p.into()))
+			// Standard Error: 682
+			.saturating_add(Weight::from_parts(31_818, 0).saturating_mul(m.into()))
+			// Standard Error: 3_370
+			.saturating_add(Weight::from_parts(260_644, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(3))
 			.saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into()))
@@ -204,15 +204,15 @@ impl<T: frame_system::Config> pallet_collective::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `62 + b * (1 ±0) + m * (64 ±0) + p * (78 ±0)`
 		//  Estimated: `3619 + b * (1 ±0) + m * (63 ±0) + p * (74 ±0)`
-		// Minimum execution time: 27_086_000 picoseconds.
-		Weight::from_parts(25_836_642, 0)
+		// Minimum execution time: 31_756_000 picoseconds.
+		Weight::from_parts(29_026_627, 0)
 			.saturating_add(Weight::from_parts(0, 3619))
-			// Standard Error: 83
-			.saturating_add(Weight::from_parts(1_757, 0).saturating_mul(b.into()))
-			// Standard Error: 885
-			.saturating_add(Weight::from_parts(18_479, 0).saturating_mul(m.into()))
-			// Standard Error: 4_366
-			.saturating_add(Weight::from_parts(334_711, 0).saturating_mul(p.into()))
+			// Standard Error: 198
+			.saturating_add(Weight::from_parts(3_206, 0).saturating_mul(b.into()))
+			// Standard Error: 2_102
+			.saturating_add(Weight::from_parts(24_848, 0).saturating_mul(m.into()))
+			// Standard Error: 10_371
+			.saturating_add(Weight::from_parts(399_990, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(3))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into()))
@@ -235,13 +235,13 @@ impl<T: frame_system::Config> pallet_collective::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `137 + m * (64 ±0) + p * (55 ±0)`
 		//  Estimated: `3611 + m * (64 ±0) + p * (55 ±0)`
-		// Minimum execution time: 20_995_000 picoseconds.
-		Weight::from_parts(18_820_652, 0)
+		// Minimum execution time: 25_575_000 picoseconds.
+		Weight::from_parts(23_721_404, 0)
 			.saturating_add(Weight::from_parts(0, 3611))
-			// Standard Error: 615
-			.saturating_add(Weight::from_parts(38_431, 0).saturating_mul(m.into()))
-			// Standard Error: 3_037
-			.saturating_add(Weight::from_parts(252_565, 0).saturating_mul(p.into()))
+			// Standard Error: 734
+			.saturating_add(Weight::from_parts(36_722, 0).saturating_mul(m.into()))
+			// Standard Error: 3_624
+			.saturating_add(Weight::from_parts(281_541, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(3))
 			.saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into()))
@@ -264,15 +264,15 @@ impl<T: frame_system::Config> pallet_collective::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `82 + b * (1 ±0) + m * (64 ±0) + p * (78 ±0)`
 		//  Estimated: `3639 + b * (1 ±0) + m * (63 ±0) + p * (74 ±0)`
-		// Minimum execution time: 28_333_000 picoseconds.
-		Weight::from_parts(26_411_146, 0)
+		// Minimum execution time: 33_716_000 picoseconds.
+		Weight::from_parts(32_969_812, 0)
 			.saturating_add(Weight::from_parts(0, 3639))
-			// Standard Error: 88
-			.saturating_add(Weight::from_parts(2_323, 0).saturating_mul(b.into()))
-			// Standard Error: 935
-			.saturating_add(Weight::from_parts(21_833, 0).saturating_mul(m.into()))
-			// Standard Error: 4_613
-			.saturating_add(Weight::from_parts(354_718, 0).saturating_mul(p.into()))
+			// Standard Error: 109
+			.saturating_add(Weight::from_parts(2_264, 0).saturating_mul(b.into()))
+			// Standard Error: 1_152
+			.saturating_add(Weight::from_parts(14_586, 0).saturating_mul(m.into()))
+			// Standard Error: 5_685
+			.saturating_add(Weight::from_parts(405_020, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(3))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into()))
@@ -290,11 +290,11 @@ impl<T: frame_system::Config> pallet_collective::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `189 + p * (32 ±0)`
 		//  Estimated: `1674 + p * (32 ±0)`
-		// Minimum execution time: 9_381_000 picoseconds.
-		Weight::from_parts(10_496_418, 0)
+		// Minimum execution time: 11_462_000 picoseconds.
+		Weight::from_parts(12_450_213, 0)
 			.saturating_add(Weight::from_parts(0, 1674))
-			// Standard Error: 2_040
-			.saturating_add(Weight::from_parts(164_732, 0).saturating_mul(p.into()))
+			// Standard Error: 1_937
+			.saturating_add(Weight::from_parts(169_519, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(3))
 			.saturating_add(Weight::from_parts(0, 32).saturating_mul(p.into()))
diff --git a/runtime/gdev/src/weights/pallet_distance.rs b/runtime/gdev/src/weights/pallet_distance.rs
new file mode 100644
index 0000000000000000000000000000000000000000..2d021a36a7e6ca6d71b931657c1cbf264c47140c
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_distance.rs
@@ -0,0 +1,260 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_distance`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_distance`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_distance::WeightInfo for WeightInfo<T> {
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::PendingEvaluationRequest` (r:1 w:1)
+	/// Proof: `Distance::PendingEvaluationRequest` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:0)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Parameters::ParametersStorage` (r:1 w:0)
+	/// Proof: `Parameters::ParametersStorage` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:1 w:0)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::CurrentPoolIndex` (r:1 w:0)
+	/// Proof: `Distance::CurrentPoolIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationPool2` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Balances::Holds` (r:1 w:1)
+	/// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`)
+	fn request_distance_evaluation() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1251`
+		//  Estimated: `4716`
+		// Minimum execution time: 70_095_000 picoseconds.
+		Weight::from_parts(72_428_000, 0)
+			.saturating_add(Weight::from_parts(0, 4716))
+			.saturating_add(T::DbWeight::get().reads(10))
+			.saturating_add(T::DbWeight::get().writes(4))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:2 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::PendingEvaluationRequest` (r:1 w:1)
+	/// Proof: `Distance::PendingEvaluationRequest` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:0)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Parameters::ParametersStorage` (r:1 w:0)
+	/// Proof: `Parameters::ParametersStorage` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:1 w:0)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::CurrentPoolIndex` (r:1 w:0)
+	/// Proof: `Distance::CurrentPoolIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationPool2` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Balances::Holds` (r:1 w:1)
+	/// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`)
+	fn request_distance_evaluation_for() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1280`
+		//  Estimated: `7220`
+		// Minimum execution time: 72_960_000 picoseconds.
+		Weight::from_parts(75_007_000, 0)
+			.saturating_add(Weight::from_parts(0, 7220))
+			.saturating_add(T::DbWeight::get().reads(11))
+			.saturating_add(T::DbWeight::get().writes(4))
+	}
+	/// Storage: `Distance::DidUpdate` (r:1 w:1)
+	/// Proof: `Distance::DidUpdate` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Authorship::Author` (r:1 w:1)
+	/// Proof: `Authorship::Author` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	/// Storage: `System::Digest` (r:1 w:0)
+	/// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::Validators` (r:1 w:0)
+	/// Proof: `Session::Validators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::CurrentPoolIndex` (r:1 w:0)
+	/// Proof: `Distance::CurrentPoolIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationPool0` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool0` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[1, 1300]`.
+	fn update_evaluation(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `402 + i * (10 ±0)`
+		//  Estimated: `1887 + i * (10 ±0)`
+		// Minimum execution time: 18_073_000 picoseconds.
+		Weight::from_parts(21_116_016, 0)
+			.saturating_add(Weight::from_parts(0, 1887))
+			// Standard Error: 280
+			.saturating_add(Weight::from_parts(104_091, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(6))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(Weight::from_parts(0, 10).saturating_mul(i.into()))
+	}
+	/// Storage: `Distance::CurrentPoolIndex` (r:1 w:0)
+	/// Proof: `Distance::CurrentPoolIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationPool0` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool0` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[1, 1300]`.
+	fn force_update_evaluation(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `139 + i * (10 ±0)`
+		//  Estimated: `1624 + i * (10 ±0)`
+		// Minimum execution time: 6_891_000 picoseconds.
+		Weight::from_parts(7_846_688, 0)
+			.saturating_add(Weight::from_parts(0, 1624))
+			// Standard Error: 625
+			.saturating_add(Weight::from_parts(108_166, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+			.saturating_add(Weight::from_parts(0, 10).saturating_mul(i.into()))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::MembershipsExpireOn` (r:2 w:2)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Parameters::ParametersStorage` (r:1 w:0)
+	/// Proof: `Parameters::ParametersStorage` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn force_valid_distance_status() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `683`
+		//  Estimated: `6623`
+		// Minimum execution time: 32_529_000 picoseconds.
+		Weight::from_parts(33_752_000, 0)
+			.saturating_add(Weight::from_parts(0, 6623))
+			.saturating_add(T::DbWeight::get().reads(5))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+	fn on_initialize_overhead() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 111_000 picoseconds.
+		Weight::from_parts(143_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `System::ParentHash` (r:1 w:0)
+	/// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	/// Storage: `Distance::EvaluationPool2` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::PendingEvaluationRequest` (r:1 w:1)
+	/// Proof: `Distance::PendingEvaluationRequest` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Balances::Holds` (r:1 w:1)
+	/// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`)
+	/// Storage: `Identity::Identities` (r:1 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::MembershipsExpireOn` (r:2 w:2)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Parameters::ParametersStorage` (r:1 w:0)
+	/// Proof: `Parameters::ParametersStorage` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationBlock` (r:0 w:1)
+	/// Proof: `Distance::EvaluationBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn do_evaluation_success() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1095`
+		//  Estimated: `7035`
+		// Minimum execution time: 66_382_000 picoseconds.
+		Weight::from_parts(68_312_000, 0)
+			.saturating_add(Weight::from_parts(0, 7035))
+			.saturating_add(T::DbWeight::get().reads(10))
+			.saturating_add(T::DbWeight::get().writes(8))
+	}
+	/// Storage: `System::ParentHash` (r:1 w:0)
+	/// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	/// Storage: `Distance::EvaluationPool2` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::PendingEvaluationRequest` (r:1 w:1)
+	/// Proof: `Distance::PendingEvaluationRequest` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Balances::Holds` (r:1 w:1)
+	/// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:2)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Distance::EvaluationBlock` (r:0 w:1)
+	/// Proof: `Distance::EvaluationBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn do_evaluation_failure() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `475`
+		//  Estimated: `6126`
+		// Minimum execution time: 42_681_000 picoseconds.
+		Weight::from_parts(44_083_000, 0)
+			.saturating_add(Weight::from_parts(0, 6126))
+			.saturating_add(T::DbWeight::get().reads(6))
+			.saturating_add(T::DbWeight::get().writes(6))
+	}
+	/// Storage: `System::ParentHash` (r:1 w:0)
+	/// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	/// Storage: `Distance::EvaluationPool2` (r:1 w:0)
+	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationBlock` (r:0 w:1)
+	/// Proof: `Distance::EvaluationBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn do_evaluation_overhead() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `109`
+		//  Estimated: `1594`
+		// Minimum execution time: 3_728_000 picoseconds.
+		Weight::from_parts(3_939_000, 0)
+			.saturating_add(Weight::from_parts(0, 1594))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Distance::DidUpdate` (r:1 w:1)
+	/// Proof: `Distance::DidUpdate` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn on_finalize() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `133`
+		//  Estimated: `1618`
+		// Minimum execution time: 3_650_000 picoseconds.
+		Weight::from_parts(3_921_000, 0)
+			.saturating_add(Weight::from_parts(0, 1618))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/gdev/src/weights/pallet_duniter_account.rs b/runtime/gdev/src/weights/pallet_duniter_account.rs
new file mode 100644
index 0000000000000000000000000000000000000000..1c541f353a09a4ddbc4fd8597a262bdac8d7bb37
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_duniter_account.rs
@@ -0,0 +1,62 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_duniter_account`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_duniter_account`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_duniter_account::WeightInfo for WeightInfo<T> {
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn unlink_identity() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `3558`
+		// Minimum execution time: 4_403_000 picoseconds.
+		Weight::from_parts(4_572_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/gdev/src/weights/pallet_grandpa.rs b/runtime/gdev/src/weights/pallet_grandpa.rs
new file mode 100644
index 0000000000000000000000000000000000000000..6dae5b20f670e3859762926b0168234d44dc0d27
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_grandpa.rs
@@ -0,0 +1,55 @@
+// Copyright 2021 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Manual weights for the GRANDPA Pallet in duniter runtimes
+//! This file was not auto-generated.
+
+use frame_support::{
+    traits::Get,
+    weights::{
+        constants::{WEIGHT_REF_TIME_PER_MICROS, WEIGHT_REF_TIME_PER_NANOS},
+        Weight,
+    },
+};
+use scale_info::prelude::marker::PhantomData;
+
+/// Weight functions for `pallet_grandpa`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_grandpa::WeightInfo for WeightInfo<T> {
+    fn report_equivocation(validator_count: u32, _p: u32) -> Weight {
+        // we take the validator set count from the membership proof to
+        // calculate the weight but we set a floor of 100 validators.
+        let validator_count = validator_count.max(100) as u64;
+
+        // checking membership proof
+        (Weight::from_parts(WEIGHT_REF_TIME_PER_MICROS, 0) * 35)
+            .saturating_add(Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS, 0) * 175)
+            .saturating_mul(validator_count)
+            .saturating_add(T::DbWeight::get().reads(5))
+            // check equivocation proof
+            .saturating_add(Weight::from_parts(WEIGHT_REF_TIME_PER_MICROS, 0) * 95)
+            // report offence
+            .saturating_add(Weight::from_parts(WEIGHT_REF_TIME_PER_MICROS, 0) * 110)
+            .saturating_add(T::DbWeight::get().writes(3))
+            // fetching set id -> session index mappings
+            .saturating_add(T::DbWeight::get().reads(2))
+    }
+
+    fn note_stalled() -> Weight {
+        (Weight::from_parts(WEIGHT_REF_TIME_PER_MICROS, 0) * 3)
+            .saturating_add(T::DbWeight::get().writes(1))
+    }
+}
diff --git a/runtime/gdev/src/weights/pallet_identity.rs b/runtime/gdev/src/weights/pallet_identity.rs
new file mode 100644
index 0000000000000000000000000000000000000000..6e2a02f9686218ed05d2c097c4ada3f9aa7f1eb5
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_identity.rs
@@ -0,0 +1,410 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_identity`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_identity`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
+	/// Storage: `Identity::IdentityIndexOf` (r:2 w:1)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:2 w:2)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:2 w:2)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Parameters::ParametersStorage` (r:1 w:0)
+	/// Proof: `Parameters::ParametersStorage` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Identity::NextIdtyIndex` (r:1 w:1)
+	/// Proof: `Identity::NextIdtyIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:1 w:1)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::CounterForIdentities` (r:1 w:1)
+	/// Proof: `Identity::CounterForIdentities` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `Certification::CertsRemovableOn` (r:1 w:1)
+	/// Proof: `Certification::CertsRemovableOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Quota::IdtyQuota` (r:0 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	fn create_identity() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1210`
+		//  Estimated: `7150`
+		// Minimum execution time: 78_735_000 picoseconds.
+		Weight::from_parts(81_316_000, 0)
+			.saturating_add(Weight::from_parts(0, 7150))
+			.saturating_add(T::DbWeight::get().reads(13))
+			.saturating_add(T::DbWeight::get().writes(12))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentitiesNames` (r:1 w:1)
+	/// Proof: `Identity::IdentitiesNames` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn confirm_identity() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `822`
+		//  Estimated: `6762`
+		// Minimum execution time: 35_927_000 picoseconds.
+		Weight::from_parts(37_172_000, 0)
+			.saturating_add(Weight::from_parts(0, 6762))
+			.saturating_add(T::DbWeight::get().reads(5))
+			.saturating_add(T::DbWeight::get().writes(4))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:2 w:2)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:0)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `System::BlockHash` (r:1 w:0)
+	/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:2)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn change_owner_key() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `964`
+		//  Estimated: `6904`
+		// Minimum execution time: 84_868_000 picoseconds.
+		Weight::from_parts(86_664_000, 0)
+			.saturating_add(Weight::from_parts(0, 6904))
+			.saturating_add(T::DbWeight::get().reads(7))
+			.saturating_add(T::DbWeight::get().writes(5))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::BlockHash` (r:1 w:0)
+	/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Quota::IdtyQuota` (r:0 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	fn revoke_identity() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `731`
+		//  Estimated: `6671`
+		// Minimum execution time: 70_572_000 picoseconds.
+		Weight::from_parts(72_810_000, 0)
+			.saturating_add(Weight::from_parts(0, 6671))
+			.saturating_add(T::DbWeight::get().reads(5))
+			.saturating_add(T::DbWeight::get().writes(5))
+	}
+	/// Storage: `Identity::IdentitiesNames` (r:0 w:999)
+	/// Proof: `Identity::IdentitiesNames` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[2, 1000]`.
+	fn prune_item_identities_names(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 4_160_000 picoseconds.
+		Weight::from_parts(4_249_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 1_354
+			.saturating_add(Weight::from_parts(1_229_973, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().writes(1))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
+	}
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn fix_sufficients() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `104`
+		//  Estimated: `3558`
+		// Minimum execution time: 7_530_000 picoseconds.
+		Weight::from_parts(7_911_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::BlockHash` (r:1 w:0)
+	/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn link_account() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `436`
+		//  Estimated: `3901`
+		// Minimum execution time: 55_190_000 picoseconds.
+		Weight::from_parts(56_667_000, 0)
+			.saturating_add(Weight::from_parts(0, 3901))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	fn on_initialize() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 93_000 picoseconds.
+		Weight::from_parts(122_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_revoke_identity_noop() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `360`
+		//  Estimated: `3825`
+		// Minimum execution time: 5_155_000 picoseconds.
+		Weight::from_parts(5_460_000, 0)
+			.saturating_add(Weight::from_parts(0, 3825))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::CounterForMembership` (r:1 w:1)
+	/// Proof: `Membership::CounterForMembership` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `Membership::MembershipsExpireOn` (r:1 w:1)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `UniversalDividend::CurrentUdIndex` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUdIndex` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Quota::IdtyQuota` (r:0 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_revoke_identity() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1931`
+		//  Estimated: `15296`
+		// Minimum execution time: 114_415_000 picoseconds.
+		Weight::from_parts(121_569_000, 0)
+			.saturating_add(Weight::from_parts(0, 15296))
+			.saturating_add(T::DbWeight::get().reads(18))
+			.saturating_add(T::DbWeight::get().writes(22))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_remove_identity_noop() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `360`
+		//  Estimated: `3825`
+		// Minimum execution time: 5_061_000 picoseconds.
+		Weight::from_parts(5_471_000, 0)
+			.saturating_add(Weight::from_parts(0, 3825))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::CounterForIdentities` (r:1 w:1)
+	/// Proof: `Identity::CounterForIdentities` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:2)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::CounterForMembership` (r:1 w:1)
+	/// Proof: `Membership::CounterForMembership` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `Membership::MembershipsExpireOn` (r:1 w:1)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:6 w:6)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Parameters::ParametersStorage` (r:1 w:0)
+	/// Proof: `Parameters::ParametersStorage` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityIndexOf` (r:0 w:1)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Quota::IdtyQuota` (r:0 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_remove_identity() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `2466`
+		//  Estimated: `18306`
+		// Minimum execution time: 161_149_000 picoseconds.
+		Weight::from_parts(167_574_000, 0)
+			.saturating_add(Weight::from_parts(0, 18306))
+			.saturating_add(T::DbWeight::get().reads(25))
+			.saturating_add(T::DbWeight::get().writes(30))
+	}
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::CounterForMembership` (r:1 w:1)
+	/// Proof: `Membership::CounterForMembership` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `Membership::MembershipsExpireOn` (r:1 w:1)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `UniversalDividend::CurrentUdIndex` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUdIndex` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:6 w:6)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Parameters::ParametersStorage` (r:1 w:0)
+	/// Proof: `Parameters::ParametersStorage` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Quota::IdtyQuota` (r:0 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_remove_identity_handler() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `2483`
+		//  Estimated: `18323`
+		// Minimum execution time: 165_227_000 picoseconds.
+		Weight::from_parts(171_832_000, 0)
+			.saturating_add(Weight::from_parts(0, 18323))
+			.saturating_add(T::DbWeight::get().reads(26))
+			.saturating_add(T::DbWeight::get().writes(29))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn membership_removed() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `441`
+		//  Estimated: `6381`
+		// Minimum execution time: 17_441_000 picoseconds.
+		Weight::from_parts(17_881_000, 0)
+			.saturating_add(Weight::from_parts(0, 6381))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+	/// Storage: `Identity::IdentityChangeSchedule` (r:1 w:0)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn prune_identities_noop() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `165`
+		//  Estimated: `3630`
+		// Minimum execution time: 3_581_000 picoseconds.
+		Weight::from_parts(3_891_000, 0)
+			.saturating_add(Weight::from_parts(0, 3630))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Identity::IdentityChangeSchedule` (r:1 w:1)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn prune_identities_none() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `362`
+		//  Estimated: `3827`
+		// Minimum execution time: 8_191_000 picoseconds.
+		Weight::from_parts(8_541_000, 0)
+			.saturating_add(Weight::from_parts(0, 3827))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Identity::IdentityChangeSchedule` (r:1 w:1)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::CounterForIdentities` (r:1 w:1)
+	/// Proof: `Identity::CounterForIdentities` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:0)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityIndexOf` (r:0 w:1)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Quota::IdtyQuota` (r:0 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	fn prune_identities_err() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `952`
+		//  Estimated: `4417`
+		// Minimum execution time: 39_346_000 picoseconds.
+		Weight::from_parts(41_449_000, 0)
+			.saturating_add(Weight::from_parts(0, 4417))
+			.saturating_add(T::DbWeight::get().reads(6))
+			.saturating_add(T::DbWeight::get().writes(7))
+	}
+}
diff --git a/runtime/common/src/weights/pallet_im_online.rs b/runtime/gdev/src/weights/pallet_im_online.rs
similarity index 89%
rename from runtime/common/src/weights/pallet_im_online.rs
rename to runtime/gdev/src/weights/pallet_im_online.rs
index 8ae42d0cdac5b7844a7d6c5609a8e9cd6f0e80c6..af6bd0f7c7fc1a525924d3b25abda3e0f912a575 100644
--- a/runtime/common/src/weights/pallet_im_online.rs
+++ b/runtime/gdev/src/weights/pallet_im_online.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_im_online`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/gdev/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -62,13 +62,13 @@ impl<T: frame_system::Config> pallet_im_online::WeightInfo for WeightInfo<T> {
 	/// The range of component `k` is `[1, 1000]`.
 	fn validate_unsigned_and_then_heartbeat(k: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `603 + k * (32 ±0)`
+		//  Measured:  `636 + k * (32 ±0)`
 		//  Estimated: `33487 + k * (1761 ±0)`
-		// Minimum execution time: 52_323_000 picoseconds.
-		Weight::from_parts(67_471_180, 0)
+		// Minimum execution time: 58_835_000 picoseconds.
+		Weight::from_parts(77_663_203, 0)
 			.saturating_add(Weight::from_parts(0, 33487))
-			// Standard Error: 683
-			.saturating_add(Weight::from_parts(46_057, 0).saturating_mul(k.into()))
+			// Standard Error: 1_184
+			.saturating_add(Weight::from_parts(38_414, 0).saturating_mul(k.into()))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(1))
 			.saturating_add(Weight::from_parts(0, 1761).saturating_mul(k.into()))
diff --git a/runtime/gdev/src/weights/pallet_membership.rs b/runtime/gdev/src/weights/pallet_membership.rs
new file mode 100644
index 0000000000000000000000000000000000000000..10caff7d3638a51dec70fdadd98ed6356164c191
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_membership.rs
@@ -0,0 +1,102 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_membership`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_membership`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_membership::WeightInfo for WeightInfo<T> {
+	fn on_initialize() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 128_000 picoseconds.
+		Weight::from_parts(167_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `Membership::MembershipsExpireOn` (r:2 w:2)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:3 w:3)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::CounterForMembership` (r:1 w:1)
+	/// Proof: `Membership::CounterForMembership` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `Identity::Identities` (r:3 w:3)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `UniversalDividend::CurrentUdIndex` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUdIndex` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:3 w:3)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:3 w:3)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:3 w:3)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:12)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[0, 3]`.
+	fn expire_memberships(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `139 + i * (993 ±0)`
+		//  Estimated: `15060 + i * (2695 ±52)`
+		// Minimum execution time: 5_447_000 picoseconds.
+		Weight::from_parts(15_406_379, 0)
+			.saturating_add(Weight::from_parts(0, 15060))
+			// Standard Error: 672_121
+			.saturating_add(Weight::from_parts(79_899_261, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().reads((11_u64).saturating_mul(i.into())))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(T::DbWeight::get().writes((15_u64).saturating_mul(i.into())))
+			.saturating_add(Weight::from_parts(0, 2695).saturating_mul(i.into()))
+	}
+}
diff --git a/runtime/gdev/src/weights/pallet_multisig.rs b/runtime/gdev/src/weights/pallet_multisig.rs
new file mode 100644
index 0000000000000000000000000000000000000000..a1c133e675a44dca76b10f9a6204d0916be55a83
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_multisig.rs
@@ -0,0 +1,162 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_multisig`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_multisig`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_multisig::WeightInfo for WeightInfo<T> {
+	/// The range of component `z` is `[0, 10000]`.
+	fn as_multi_threshold_1(z: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 5_392_000 picoseconds.
+		Weight::from_parts(5_647_933, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 1
+			.saturating_add(Weight::from_parts(325, 0).saturating_mul(z.into()))
+	}
+	/// Storage: `Multisig::Multisigs` (r:1 w:1)
+	/// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(457), added: 2932, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[2, 10]`.
+	/// The range of component `z` is `[0, 10000]`.
+	fn as_multi_create(s: u32, z: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `125 + s * (5 ±0)`
+		//  Estimated: `3922`
+		// Minimum execution time: 27_599_000 picoseconds.
+		Weight::from_parts(27_226_841, 0)
+			.saturating_add(Weight::from_parts(0, 3922))
+			// Standard Error: 5_425
+			.saturating_add(Weight::from_parts(168_113, 0).saturating_mul(s.into()))
+			// Standard Error: 4
+			.saturating_add(Weight::from_parts(1_068, 0).saturating_mul(z.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Multisig::Multisigs` (r:1 w:1)
+	/// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(457), added: 2932, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[3, 10]`.
+	/// The range of component `z` is `[0, 10000]`.
+	fn as_multi_approve(s: u32, z: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `240`
+		//  Estimated: `3922`
+		// Minimum execution time: 15_589_000 picoseconds.
+		Weight::from_parts(15_198_549, 0)
+			.saturating_add(Weight::from_parts(0, 3922))
+			// Standard Error: 3_468
+			.saturating_add(Weight::from_parts(110_118, 0).saturating_mul(s.into()))
+			// Standard Error: 2
+			.saturating_add(Weight::from_parts(1_074, 0).saturating_mul(z.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Multisig::Multisigs` (r:1 w:1)
+	/// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(457), added: 2932, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[2, 10]`.
+	/// The range of component `z` is `[0, 10000]`.
+	fn as_multi_complete(s: u32, z: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `259 + s * (37 ±0)`
+		//  Estimated: `3922`
+		// Minimum execution time: 30_477_000 picoseconds.
+		Weight::from_parts(30_171_082, 0)
+			.saturating_add(Weight::from_parts(0, 3922))
+			// Standard Error: 5_508
+			.saturating_add(Weight::from_parts(149_890, 0).saturating_mul(s.into()))
+			// Standard Error: 4
+			.saturating_add(Weight::from_parts(1_067, 0).saturating_mul(z.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Multisig::Multisigs` (r:1 w:1)
+	/// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(457), added: 2932, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[2, 10]`.
+	fn approve_as_multi_create(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `130 + s * (5 ±0)`
+		//  Estimated: `3922`
+		// Minimum execution time: 25_336_000 picoseconds.
+		Weight::from_parts(26_527_402, 0)
+			.saturating_add(Weight::from_parts(0, 3922))
+			// Standard Error: 5_763
+			.saturating_add(Weight::from_parts(175_489, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Multisig::Multisigs` (r:1 w:1)
+	/// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(457), added: 2932, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[2, 10]`.
+	fn approve_as_multi_approve(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `240`
+		//  Estimated: `3922`
+		// Minimum execution time: 13_850_000 picoseconds.
+		Weight::from_parts(14_488_301, 0)
+			.saturating_add(Weight::from_parts(0, 3922))
+			// Standard Error: 3_043
+			.saturating_add(Weight::from_parts(118_437, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Multisig::Multisigs` (r:1 w:1)
+	/// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(457), added: 2932, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[2, 10]`.
+	fn cancel_as_multi(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `328 + s * (5 ±0)`
+		//  Estimated: `3922`
+		// Minimum execution time: 26_232_000 picoseconds.
+		Weight::from_parts(27_520_652, 0)
+			.saturating_add(Weight::from_parts(0, 3922))
+			// Standard Error: 5_473
+			.saturating_add(Weight::from_parts(159_868, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/gdev/src/weights/pallet_oneshot_account.rs b/runtime/gdev/src/weights/pallet_oneshot_account.rs
new file mode 100644
index 0000000000000000000000000000000000000000..f524bcb6cf5160340a962e8382bb58f6212df3dd
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_oneshot_account.rs
@@ -0,0 +1,94 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_oneshot_account`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_oneshot_account`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_oneshot_account::WeightInfo for WeightInfo<T> {
+	/// Storage: `OneshotAccount::OneshotAccounts` (r:1 w:1)
+	/// Proof: `OneshotAccount::OneshotAccounts` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn create_oneshot_account() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `42`
+		//  Estimated: `3507`
+		// Minimum execution time: 21_872_000 picoseconds.
+		Weight::from_parts(22_794_000, 0)
+			.saturating_add(Weight::from_parts(0, 3507))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `OneshotAccount::OneshotAccounts` (r:1 w:1)
+	/// Proof: `OneshotAccount::OneshotAccounts` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::BlockHash` (r:1 w:0)
+	/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn consume_oneshot_account() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `241`
+		//  Estimated: `3706`
+		// Minimum execution time: 31_153_000 picoseconds.
+		Weight::from_parts(32_328_000, 0)
+			.saturating_add(Weight::from_parts(0, 3706))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `OneshotAccount::OneshotAccounts` (r:1 w:1)
+	/// Proof: `OneshotAccount::OneshotAccounts` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::BlockHash` (r:1 w:0)
+	/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:2)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn consume_oneshot_account_with_remaining() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `301`
+		//  Estimated: `6126`
+		// Minimum execution time: 45_197_000 picoseconds.
+		Weight::from_parts(46_597_000, 0)
+			.saturating_add(Weight::from_parts(0, 6126))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+}
diff --git a/runtime/gdev/src/weights/pallet_preimage.rs b/runtime/gdev/src/weights/pallet_preimage.rs
new file mode 100644
index 0000000000000000000000000000000000000000..8f4a73e8945c6d854d5075ea8ee4867f8eaea31e
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_preimage.rs
@@ -0,0 +1,259 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_preimage`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_preimage`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_preimage::WeightInfo for WeightInfo<T> {
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::PreimageFor` (r:0 w:1)
+	/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[0, 4194304]`.
+	fn note_preimage(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `42`
+		//  Estimated: `3548`
+		// Minimum execution time: 11_975_000 picoseconds.
+		Weight::from_parts(12_301_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			// Standard Error: 2
+			.saturating_add(Weight::from_parts(1_320, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::PreimageFor` (r:0 w:1)
+	/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[0, 4194304]`.
+	fn note_requested_preimage(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `106`
+		//  Estimated: `3548`
+		// Minimum execution time: 15_575_000 picoseconds.
+		Weight::from_parts(15_766_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			// Standard Error: 2
+			.saturating_add(Weight::from_parts(1_320, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::PreimageFor` (r:0 w:1)
+	/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[0, 4194304]`.
+	fn note_no_deposit_preimage(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `106`
+		//  Estimated: `3548`
+		// Minimum execution time: 13_671_000 picoseconds.
+		Weight::from_parts(13_977_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			// Standard Error: 2
+			.saturating_add(Weight::from_parts(1_401, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::PreimageFor` (r:0 w:1)
+	/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`)
+	fn unnote_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `172`
+		//  Estimated: `3548`
+		// Minimum execution time: 21_830_000 picoseconds.
+		Weight::from_parts(23_909_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::PreimageFor` (r:0 w:1)
+	/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`)
+	fn unnote_no_deposit_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `144`
+		//  Estimated: `3548`
+		// Minimum execution time: 23_132_000 picoseconds.
+		Weight::from_parts(24_958_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	fn request_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `172`
+		//  Estimated: `3548`
+		// Minimum execution time: 20_944_000 picoseconds.
+		Weight::from_parts(22_633_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	fn request_no_deposit_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `144`
+		//  Estimated: `3548`
+		// Minimum execution time: 13_847_000 picoseconds.
+		Weight::from_parts(15_219_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	fn request_unnoted_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `42`
+		//  Estimated: `3548`
+		// Minimum execution time: 10_973_000 picoseconds.
+		Weight::from_parts(11_559_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	fn request_requested_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `106`
+		//  Estimated: `3548`
+		// Minimum execution time: 8_783_000 picoseconds.
+		Weight::from_parts(9_087_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::PreimageFor` (r:0 w:1)
+	/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`)
+	fn unrequest_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `144`
+		//  Estimated: `3548`
+		// Minimum execution time: 21_736_000 picoseconds.
+		Weight::from_parts(22_912_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	fn unrequest_unnoted_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `106`
+		//  Estimated: `3548`
+		// Minimum execution time: 8_816_000 picoseconds.
+		Weight::from_parts(9_270_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	fn unrequest_multi_referenced_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `106`
+		//  Estimated: `3548`
+		// Minimum execution time: 8_639_000 picoseconds.
+		Weight::from_parts(9_090_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1023 w:1023)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1023 w:1023)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:0 w:1023)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	/// The range of component `n` is `[1, 1024]`.
+	fn ensure_updated(n: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0 + n * (179 ±0)`
+		//  Estimated: `990 + n * (2568 ±0)`
+		// Minimum execution time: 19_835_000 picoseconds.
+		Weight::from_parts(20_285_000, 0)
+			.saturating_add(Weight::from_parts(0, 990))
+			// Standard Error: 17_437
+			.saturating_add(Weight::from_parts(15_200_439, 0).saturating_mul(n.into()))
+			.saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(n.into())))
+			.saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(n.into())))
+			.saturating_add(Weight::from_parts(0, 2568).saturating_mul(n.into()))
+	}
+}
diff --git a/runtime/gdev/src/weights/pallet_provide_randomness.rs b/runtime/gdev/src/weights/pallet_provide_randomness.rs
new file mode 100644
index 0000000000000000000000000000000000000000..449f35488f0678854d9444c36552a965448f78a2
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_provide_randomness.rs
@@ -0,0 +1,132 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_provide_randomness`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_provide_randomness`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_provide_randomness::WeightInfo for WeightInfo<T> {
+	/// Storage: `ProvideRandomness::CounterForRequestsIds` (r:1 w:1)
+	/// Proof: `ProvideRandomness::CounterForRequestsIds` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `ProvideRandomness::RequestIdProvider` (r:1 w:1)
+	/// Proof: `ProvideRandomness::RequestIdProvider` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `ProvideRandomness::RequestsIds` (r:1 w:1)
+	/// Proof: `ProvideRandomness::RequestsIds` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Babe::EpochIndex` (r:1 w:0)
+	/// Proof: `Babe::EpochIndex` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `ProvideRandomness::NexEpochHookIn` (r:1 w:0)
+	/// Proof: `ProvideRandomness::NexEpochHookIn` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `ProvideRandomness::RequestsReadyAtEpoch` (r:1 w:1)
+	/// Proof: `ProvideRandomness::RequestsReadyAtEpoch` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn request() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `298`
+		//  Estimated: `3763`
+		// Minimum execution time: 45_548_000 picoseconds.
+		Weight::from_parts(46_988_000, 0)
+			.saturating_add(Weight::from_parts(0, 3763))
+			.saturating_add(T::DbWeight::get().reads(7))
+			.saturating_add(T::DbWeight::get().writes(5))
+	}
+	/// Storage: `ProvideRandomness::RequestsReadyAtNextBlock` (r:1 w:1)
+	/// Proof: `ProvideRandomness::RequestsReadyAtNextBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Babe::AuthorVrfRandomness` (r:1 w:0)
+	/// Proof: `Babe::AuthorVrfRandomness` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`)
+	/// Storage: `ProvideRandomness::RequestsIds` (r:100 w:100)
+	/// Proof: `ProvideRandomness::RequestsIds` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `ProvideRandomness::CounterForRequestsIds` (r:1 w:1)
+	/// Proof: `ProvideRandomness::CounterForRequestsIds` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `ProvideRandomness::NexEpochHookIn` (r:1 w:1)
+	/// Proof: `ProvideRandomness::NexEpochHookIn` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[1, 100]`.
+	fn on_initialize(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `341 + i * (59 ±0)`
+		//  Estimated: `1827 + i * (2535 ±0)`
+		// Minimum execution time: 20_585_000 picoseconds.
+		Weight::from_parts(18_143_364, 0)
+			.saturating_add(Weight::from_parts(0, 1827))
+			// Standard Error: 8_255
+			.saturating_add(Weight::from_parts(5_670_675, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into())))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
+			.saturating_add(Weight::from_parts(0, 2535).saturating_mul(i.into()))
+	}
+	/// Storage: `ProvideRandomness::RequestsReadyAtNextBlock` (r:1 w:0)
+	/// Proof: `ProvideRandomness::RequestsReadyAtNextBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `ProvideRandomness::NexEpochHookIn` (r:1 w:1)
+	/// Proof: `ProvideRandomness::NexEpochHookIn` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Babe::EpochIndex` (r:1 w:0)
+	/// Proof: `Babe::EpochIndex` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `ProvideRandomness::RequestsReadyAtEpoch` (r:1 w:1)
+	/// Proof: `ProvideRandomness::RequestsReadyAtEpoch` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Babe::NextRandomness` (r:1 w:0)
+	/// Proof: `Babe::NextRandomness` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	/// Storage: `Babe::EpochStart` (r:1 w:0)
+	/// Proof: `Babe::EpochStart` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `ProvideRandomness::RequestsIds` (r:100 w:100)
+	/// Proof: `ProvideRandomness::RequestsIds` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `ProvideRandomness::CounterForRequestsIds` (r:1 w:1)
+	/// Proof: `ProvideRandomness::CounterForRequestsIds` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// The range of component `i` is `[1, 100]`.
+	fn on_initialize_epoch(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `351 + i * (59 ±0)`
+		//  Estimated: `3817 + i * (2535 ±0)`
+		// Minimum execution time: 22_350_000 picoseconds.
+		Weight::from_parts(27_706_024, 0)
+			.saturating_add(Weight::from_parts(0, 3817))
+			// Standard Error: 22_084
+			.saturating_add(Weight::from_parts(5_900_321, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(7))
+			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into())))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
+			.saturating_add(Weight::from_parts(0, 2535).saturating_mul(i.into()))
+	}
+}
diff --git a/runtime/common/src/weights/pallet_proxy.rs b/runtime/gdev/src/weights/pallet_proxy.rs
similarity index 77%
rename from runtime/common/src/weights/pallet_proxy.rs
rename to runtime/gdev/src/weights/pallet_proxy.rs
index 679b3f90b8be4fb560c2e34142702cfce8692002..ba0412d959b9645eac6b9babbd34a6855a737c90 100644
--- a/runtime/common/src/weights/pallet_proxy.rs
+++ b/runtime/gdev/src/weights/pallet_proxy.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_proxy`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/gdev/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -54,11 +54,11 @@ impl<T: frame_system::Config> pallet_proxy::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `157 + p * (37 ±0)`
 		//  Estimated: `4698`
-		// Minimum execution time: 11_368_000 picoseconds.
-		Weight::from_parts(12_404_289, 0)
+		// Minimum execution time: 13_664_000 picoseconds.
+		Weight::from_parts(14_671_983, 0)
 			.saturating_add(Weight::from_parts(0, 4698))
-			// Standard Error: 1_777
-			.saturating_add(Weight::from_parts(16_678, 0).saturating_mul(p.into()))
+			// Standard Error: 1_369
+			.saturating_add(Weight::from_parts(27_602, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
 	}
 	/// Storage: `Proxy::Proxies` (r:1 w:0)
@@ -73,13 +73,13 @@ impl<T: frame_system::Config> pallet_proxy::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `399 + a * (68 ±0) + p * (37 ±0)`
 		//  Estimated: `5690`
-		// Minimum execution time: 26_765_000 picoseconds.
-		Weight::from_parts(27_557_786, 0)
+		// Minimum execution time: 32_632_000 picoseconds.
+		Weight::from_parts(32_786_200, 0)
 			.saturating_add(Weight::from_parts(0, 5690))
-			// Standard Error: 2_067
-			.saturating_add(Weight::from_parts(133_536, 0).saturating_mul(a.into()))
-			// Standard Error: 2_136
-			.saturating_add(Weight::from_parts(32_786, 0).saturating_mul(p.into()))
+			// Standard Error: 2_038
+			.saturating_add(Weight::from_parts(150_050, 0).saturating_mul(a.into()))
+			// Standard Error: 2_106
+			.saturating_add(Weight::from_parts(37_299, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(2))
 	}
@@ -93,13 +93,13 @@ impl<T: frame_system::Config> pallet_proxy::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `322 + a * (68 ±0)`
 		//  Estimated: `5690`
-		// Minimum execution time: 17_933_000 picoseconds.
-		Weight::from_parts(18_740_744, 0)
+		// Minimum execution time: 22_197_000 picoseconds.
+		Weight::from_parts(22_952_900, 0)
 			.saturating_add(Weight::from_parts(0, 5690))
-			// Standard Error: 1_809
-			.saturating_add(Weight::from_parts(127_810, 0).saturating_mul(a.into()))
-			// Standard Error: 1_869
-			.saturating_add(Weight::from_parts(8_769, 0).saturating_mul(p.into()))
+			// Standard Error: 1_897
+			.saturating_add(Weight::from_parts(150_181, 0).saturating_mul(a.into()))
+			// Standard Error: 1_960
+			.saturating_add(Weight::from_parts(9_964, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(2))
 	}
@@ -113,13 +113,13 @@ impl<T: frame_system::Config> pallet_proxy::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `322 + a * (68 ±0)`
 		//  Estimated: `5690`
-		// Minimum execution time: 17_456_000 picoseconds.
-		Weight::from_parts(18_316_397, 0)
+		// Minimum execution time: 22_210_000 picoseconds.
+		Weight::from_parts(22_813_905, 0)
 			.saturating_add(Weight::from_parts(0, 5690))
-			// Standard Error: 1_829
-			.saturating_add(Weight::from_parts(136_230, 0).saturating_mul(a.into()))
-			// Standard Error: 1_890
-			.saturating_add(Weight::from_parts(7_976, 0).saturating_mul(p.into()))
+			// Standard Error: 1_669
+			.saturating_add(Weight::from_parts(148_213, 0).saturating_mul(a.into()))
+			// Standard Error: 1_724
+			.saturating_add(Weight::from_parts(8_674, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(2))
 	}
@@ -135,13 +135,13 @@ impl<T: frame_system::Config> pallet_proxy::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `331 + a * (68 ±0) + p * (37 ±0)`
 		//  Estimated: `5690`
-		// Minimum execution time: 24_340_000 picoseconds.
-		Weight::from_parts(24_038_296, 0)
+		// Minimum execution time: 29_935_000 picoseconds.
+		Weight::from_parts(29_957_912, 0)
 			.saturating_add(Weight::from_parts(0, 5690))
-			// Standard Error: 1_643
-			.saturating_add(Weight::from_parts(135_270, 0).saturating_mul(a.into()))
-			// Standard Error: 1_697
-			.saturating_add(Weight::from_parts(40_733, 0).saturating_mul(p.into()))
+			// Standard Error: 1_961
+			.saturating_add(Weight::from_parts(139_511, 0).saturating_mul(a.into()))
+			// Standard Error: 2_026
+			.saturating_add(Weight::from_parts(45_281, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(2))
 	}
@@ -152,11 +152,11 @@ impl<T: frame_system::Config> pallet_proxy::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `157 + p * (37 ±0)`
 		//  Estimated: `4698`
-		// Minimum execution time: 16_775_000 picoseconds.
-		Weight::from_parts(17_977_186, 0)
+		// Minimum execution time: 21_190_000 picoseconds.
+		Weight::from_parts(22_197_481, 0)
 			.saturating_add(Weight::from_parts(0, 4698))
-			// Standard Error: 1_714
-			.saturating_add(Weight::from_parts(26_419, 0).saturating_mul(p.into()))
+			// Standard Error: 1_507
+			.saturating_add(Weight::from_parts(43_705, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -167,11 +167,11 @@ impl<T: frame_system::Config> pallet_proxy::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `157 + p * (37 ±0)`
 		//  Estimated: `4698`
-		// Minimum execution time: 16_731_000 picoseconds.
-		Weight::from_parts(18_126_864, 0)
+		// Minimum execution time: 21_324_000 picoseconds.
+		Weight::from_parts(22_562_771, 0)
 			.saturating_add(Weight::from_parts(0, 4698))
-			// Standard Error: 2_461
-			.saturating_add(Weight::from_parts(34_851, 0).saturating_mul(p.into()))
+			// Standard Error: 2_012
+			.saturating_add(Weight::from_parts(33_822, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -182,11 +182,11 @@ impl<T: frame_system::Config> pallet_proxy::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `157 + p * (37 ±0)`
 		//  Estimated: `4698`
-		// Minimum execution time: 16_319_000 picoseconds.
-		Weight::from_parts(17_540_003, 0)
+		// Minimum execution time: 19_385_000 picoseconds.
+		Weight::from_parts(20_489_752, 0)
 			.saturating_add(Weight::from_parts(0, 4698))
-			// Standard Error: 1_751
-			.saturating_add(Weight::from_parts(19_700, 0).saturating_mul(p.into()))
+			// Standard Error: 1_608
+			.saturating_add(Weight::from_parts(30_735, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -197,8 +197,8 @@ impl<T: frame_system::Config> pallet_proxy::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `177`
 		//  Estimated: `4698`
-		// Minimum execution time: 17_960_000 picoseconds.
-		Weight::from_parts(19_731_703, 0)
+		// Minimum execution time: 22_224_000 picoseconds.
+		Weight::from_parts(23_863_439, 0)
 			.saturating_add(Weight::from_parts(0, 4698))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -210,11 +210,11 @@ impl<T: frame_system::Config> pallet_proxy::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `194 + p * (37 ±0)`
 		//  Estimated: `4698`
-		// Minimum execution time: 17_009_000 picoseconds.
-		Weight::from_parts(18_260_092, 0)
+		// Minimum execution time: 20_336_000 picoseconds.
+		Weight::from_parts(21_178_705, 0)
 			.saturating_add(Weight::from_parts(0, 4698))
-			// Standard Error: 1_917
-			.saturating_add(Weight::from_parts(21_418, 0).saturating_mul(p.into()))
+			// Standard Error: 1_498
+			.saturating_add(Weight::from_parts(27_225, 0).saturating_mul(p.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
diff --git a/runtime/gdev/src/weights/pallet_quota.rs b/runtime/gdev/src/weights/pallet_quota.rs
new file mode 100644
index 0000000000000000000000000000000000000000..856fd83fee30922019af873518168783d57ae657
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_quota.rs
@@ -0,0 +1,133 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_quota`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_quota`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_quota::WeightInfo for WeightInfo<T> {
+	/// Storage: `Quota::RefundQueue` (r:1 w:1)
+	/// Proof: `Quota::RefundQueue` (`max_values`: Some(1), `max_size`: Some(11266), added: 11761, mode: `MaxEncodedLen`)
+	fn queue_refund() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `11288`
+		//  Estimated: `12751`
+		// Minimum execution time: 8_779_000 picoseconds.
+		Weight::from_parts(9_127_000, 0)
+			.saturating_add(Weight::from_parts(0, 12751))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Quota::IdtyQuota` (r:1 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	fn spend_quota() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `172`
+		//  Estimated: `3489`
+		// Minimum execution time: 6_321_000 picoseconds.
+		Weight::from_parts(6_768_000, 0)
+			.saturating_add(Weight::from_parts(0, 3489))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Quota::IdtyQuota` (r:1 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn try_refund() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `235`
+		//  Estimated: `6126`
+		// Minimum execution time: 26_209_000 picoseconds.
+		Weight::from_parts(26_820_000, 0)
+			.saturating_add(Weight::from_parts(0, 6126))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Quota::IdtyQuota` (r:1 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn do_refund() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `235`
+		//  Estimated: `6126`
+		// Minimum execution time: 25_898_000 picoseconds.
+		Weight::from_parts(28_980_000, 0)
+			.saturating_add(Weight::from_parts(0, 6126))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Quota::RefundQueue` (r:1 w:1)
+	/// Proof: `Quota::RefundQueue` (`max_values`: Some(1), `max_size`: Some(11266), added: 11761, mode: `MaxEncodedLen`)
+	fn on_process_refund_queue() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `43`
+		//  Estimated: `12751`
+		// Minimum execution time: 2_549_000 picoseconds.
+		Weight::from_parts(2_713_000, 0)
+			.saturating_add(Weight::from_parts(0, 12751))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Quota::RefundQueue` (r:1 w:1)
+	/// Proof: `Quota::RefundQueue` (`max_values`: Some(1), `max_size`: Some(11266), added: 11761, mode: `MaxEncodedLen`)
+	/// Storage: `Quota::IdtyQuota` (r:1 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// The range of component `i` is `[1, 256]`.
+	fn on_process_refund_queue_elements(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `260 + i * (44 ±0)`
+		//  Estimated: `12751`
+		// Minimum execution time: 31_046_000 picoseconds.
+		Weight::from_parts(49_497_475, 0)
+			.saturating_add(Weight::from_parts(0, 12751))
+			// Standard Error: 3_317
+			.saturating_add(Weight::from_parts(1_254_267, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+}
diff --git a/runtime/gdev/src/weights/pallet_scheduler.rs b/runtime/gdev/src/weights/pallet_scheduler.rs
new file mode 100644
index 0000000000000000000000000000000000000000..33f7552f7280e667cfc09fbff4d2f7964aaf375a
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_scheduler.rs
@@ -0,0 +1,286 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_scheduler`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_scheduler`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
+	/// Storage: `Scheduler::IncompleteSince` (r:1 w:1)
+	/// Proof: `Scheduler::IncompleteSince` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	fn service_agendas_base() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `30`
+		//  Estimated: `1489`
+		// Minimum execution time: 3_201_000 picoseconds.
+		Weight::from_parts(3_463_000, 0)
+			.saturating_add(Weight::from_parts(0, 1489))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Scheduler::Agenda` (r:1 w:1)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[0, 50]`.
+	fn service_agenda_base(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `77 + s * (177 ±0)`
+		//  Estimated: `13928`
+		// Minimum execution time: 3_188_000 picoseconds.
+		Weight::from_parts(6_820_676, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			// Standard Error: 1_878
+			.saturating_add(Weight::from_parts(265_287, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	fn service_task_base() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 2_736_000 picoseconds.
+		Weight::from_parts(2_952_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `Preimage::PreimageFor` (r:1 w:1)
+	/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[128, 4194304]`.
+	fn service_task_fetched(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `179 + s * (1 ±0)`
+		//  Estimated: `4197809`
+		// Minimum execution time: 16_979_000 picoseconds.
+		Weight::from_parts(17_272_000, 0)
+			.saturating_add(Weight::from_parts(0, 4197809))
+			// Standard Error: 3
+			.saturating_add(Weight::from_parts(960, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Scheduler::Lookup` (r:0 w:1)
+	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
+	fn service_task_named() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 4_138_000 picoseconds.
+		Weight::from_parts(4_467_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	fn service_task_periodic() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 2_897_000 picoseconds.
+		Weight::from_parts(3_054_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	fn execute_dispatch_signed() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 1_952_000 picoseconds.
+		Weight::from_parts(2_062_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	fn execute_dispatch_unsigned() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 2_017_000 picoseconds.
+		Weight::from_parts(2_101_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `Scheduler::Agenda` (r:1 w:1)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[0, 49]`.
+	fn schedule(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `77 + s * (177 ±0)`
+		//  Estimated: `13928`
+		// Minimum execution time: 9_353_000 picoseconds.
+		Weight::from_parts(12_697_621, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			// Standard Error: 1_812
+			.saturating_add(Weight::from_parts(272_455, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Scheduler::Agenda` (r:1 w:1)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Lookup` (r:0 w:1)
+	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[1, 50]`.
+	fn cancel(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `77 + s * (177 ±0)`
+		//  Estimated: `13928`
+		// Minimum execution time: 14_047_000 picoseconds.
+		Weight::from_parts(14_921_174, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			// Standard Error: 1_356
+			.saturating_add(Weight::from_parts(424_884, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+	/// Storage: `Scheduler::Lookup` (r:1 w:1)
+	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Agenda` (r:1 w:1)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[0, 49]`.
+	fn schedule_named(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `254 + s * (185 ±0)`
+		//  Estimated: `13928`
+		// Minimum execution time: 11_520_000 picoseconds.
+		Weight::from_parts(17_269_692, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			// Standard Error: 4_328
+			.saturating_add(Weight::from_parts(328_602, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Scheduler::Lookup` (r:1 w:1)
+	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Agenda` (r:1 w:1)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[1, 50]`.
+	fn cancel_named(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `280 + s * (185 ±0)`
+		//  Estimated: `13928`
+		// Minimum execution time: 16_478_000 picoseconds.
+		Weight::from_parts(19_365_746, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			// Standard Error: 2_700
+			.saturating_add(Weight::from_parts(465_656, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+	/// Storage: `Scheduler::Agenda` (r:1 w:1)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[1, 50]`.
+	fn schedule_retry(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `117`
+		//  Estimated: `13928`
+		// Minimum execution time: 8_744_000 picoseconds.
+		Weight::from_parts(9_534_739, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			// Standard Error: 3_203
+			.saturating_add(Weight::from_parts(24_347, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Scheduler::Agenda` (r:1 w:0)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	fn set_retry() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `8927`
+		//  Estimated: `13928`
+		// Minimum execution time: 20_823_000 picoseconds.
+		Weight::from_parts(21_766_000, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Scheduler::Lookup` (r:1 w:0)
+	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Agenda` (r:1 w:0)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	fn set_retry_named() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `9605`
+		//  Estimated: `13928`
+		// Minimum execution time: 27_917_000 picoseconds.
+		Weight::from_parts(29_069_000, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Scheduler::Agenda` (r:1 w:0)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	fn cancel_retry() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `8939`
+		//  Estimated: `13928`
+		// Minimum execution time: 20_719_000 picoseconds.
+		Weight::from_parts(21_545_000, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Scheduler::Lookup` (r:1 w:0)
+	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Agenda` (r:1 w:0)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	fn cancel_retry_named() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `9617`
+		//  Estimated: `13928`
+		// Minimum execution time: 27_162_000 picoseconds.
+		Weight::from_parts(28_261_000, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/gdev/src/weights/pallet_session.rs b/runtime/gdev/src/weights/pallet_session.rs
new file mode 100644
index 0000000000000000000000000000000000000000..9a72bf6c5c2e9e959203a53c50e5d5a9ef3b9b69
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_session.rs
@@ -0,0 +1,78 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_session`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_session`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_session::WeightInfo for WeightInfo<T> {
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::KeyOwner` (r:4 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn set_keys() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `811`
+		//  Estimated: `11701`
+		// Minimum execution time: 28_909_000 picoseconds.
+		Weight::from_parts(30_535_000, 0)
+			.saturating_add(Weight::from_parts(0, 11701))
+			.saturating_add(T::DbWeight::get().reads(5))
+			.saturating_add(T::DbWeight::get().writes(5))
+	}
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn purge_keys() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `478`
+		//  Estimated: `3943`
+		// Minimum execution time: 18_010_000 picoseconds.
+		Weight::from_parts(18_755_000, 0)
+			.saturating_add(Weight::from_parts(0, 3943))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(5))
+	}
+}
diff --git a/runtime/common/src/weights/pallet_smith_members.rs b/runtime/gdev/src/weights/pallet_smith_members.rs
similarity index 59%
rename from runtime/common/src/weights/pallet_smith_members.rs
rename to runtime/gdev/src/weights/pallet_smith_members.rs
index 43aadea8d6edf17e0ba866ec598effd13c308c93..a72ebd8cc8f52edd8cf00a689cb1b699287e548b 100644
--- a/runtime/common/src/weights/pallet_smith_members.rs
+++ b/runtime/gdev/src/weights/pallet_smith_members.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_smith_members`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/gdev/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -61,11 +61,11 @@ impl<T: frame_system::Config> pallet_smith_members::WeightInfo for WeightInfo<T>
 	/// Proof: `SmithMembers::ExpiresOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn invite_smith() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `765`
-		//  Estimated: `6705`
-		// Minimum execution time: 24_603_000 picoseconds.
-		Weight::from_parts(26_004_000, 0)
-			.saturating_add(Weight::from_parts(0, 6705))
+		//  Measured:  `945`
+		//  Estimated: `6885`
+		// Minimum execution time: 35_064_000 picoseconds.
+		Weight::from_parts(36_770_000, 0)
+			.saturating_add(Weight::from_parts(0, 6885))
 			.saturating_add(T::DbWeight::get().reads(7))
 			.saturating_add(T::DbWeight::get().writes(2))
 	}
@@ -75,11 +75,11 @@ impl<T: frame_system::Config> pallet_smith_members::WeightInfo for WeightInfo<T>
 	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn accept_invitation() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `496`
-		//  Estimated: `3961`
-		// Minimum execution time: 13_956_000 picoseconds.
-		Weight::from_parts(14_691_000, 0)
-			.saturating_add(Weight::from_parts(0, 3961))
+		//  Measured:  `599`
+		//  Estimated: `4064`
+		// Minimum execution time: 18_184_000 picoseconds.
+		Weight::from_parts(19_095_000, 0)
+			.saturating_add(Weight::from_parts(0, 4064))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -95,12 +95,49 @@ impl<T: frame_system::Config> pallet_smith_members::WeightInfo for WeightInfo<T>
 	/// Proof: `SmithMembers::ExpiresOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn certify_smith() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `626`
-		//  Estimated: `6566`
-		// Minimum execution time: 25_044_000 picoseconds.
-		Weight::from_parts(25_893_000, 0)
-			.saturating_add(Weight::from_parts(0, 6566))
+		//  Measured:  `755`
+		//  Estimated: `6695`
+		// Minimum execution time: 32_411_000 picoseconds.
+		Weight::from_parts(33_316_000, 0)
+			.saturating_add(Weight::from_parts(0, 6695))
 			.saturating_add(T::DbWeight::get().reads(6))
 			.saturating_add(T::DbWeight::get().writes(3))
 	}
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn on_removed_wot_member() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1205`
+		//  Estimated: `14570`
+		// Minimum execution time: 71_744_000 picoseconds.
+		Weight::from_parts(75_504_000, 0)
+			.saturating_add(Weight::from_parts(0, 14570))
+			.saturating_add(T::DbWeight::get().reads(11))
+			.saturating_add(T::DbWeight::get().writes(15))
+	}
+	/// Storage: `SmithMembers::Smiths` (r:1 w:0)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn on_removed_wot_member_empty() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `253`
+		//  Estimated: `3718`
+		// Minimum execution time: 4_055_000 picoseconds.
+		Weight::from_parts(4_314_000, 0)
+			.saturating_add(Weight::from_parts(0, 3718))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
 }
diff --git a/runtime/gdev/src/weights/pallet_sudo.rs b/runtime/gdev/src/weights/pallet_sudo.rs
new file mode 100644
index 0000000000000000000000000000000000000000..dfa111d3bd2148a8f1204667875b01fcb08a8be0
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_sudo.rs
@@ -0,0 +1,96 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_sudo`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_sudo`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_sudo::WeightInfo for WeightInfo<T> {
+	/// Storage: `Sudo::Key` (r:1 w:1)
+	/// Proof: `Sudo::Key` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	fn set_key() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `165`
+		//  Estimated: `1517`
+		// Minimum execution time: 8_491_000 picoseconds.
+		Weight::from_parts(8_889_000, 0)
+			.saturating_add(Weight::from_parts(0, 1517))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Sudo::Key` (r:1 w:0)
+	/// Proof: `Sudo::Key` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	fn sudo() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `165`
+		//  Estimated: `1517`
+		// Minimum execution time: 9_063_000 picoseconds.
+		Weight::from_parts(9_371_000, 0)
+			.saturating_add(Weight::from_parts(0, 1517))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Sudo::Key` (r:1 w:0)
+	/// Proof: `Sudo::Key` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	fn sudo_as() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `165`
+		//  Estimated: `1517`
+		// Minimum execution time: 9_017_000 picoseconds.
+		Weight::from_parts(9_306_000, 0)
+			.saturating_add(Weight::from_parts(0, 1517))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Sudo::Key` (r:1 w:1)
+	/// Proof: `Sudo::Key` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	fn remove_key() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `165`
+		//  Estimated: `1517`
+		// Minimum execution time: 8_260_000 picoseconds.
+		Weight::from_parts(8_699_000, 0)
+			.saturating_add(Weight::from_parts(0, 1517))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/common/src/weights/pallet_timestamp.rs b/runtime/gdev/src/weights/pallet_timestamp.rs
similarity index 89%
rename from runtime/common/src/weights/pallet_timestamp.rs
rename to runtime/gdev/src/weights/pallet_timestamp.rs
index 6fbf6b198290b97a5c3dc55aa3ae8b1935b0b6a4..aa9de863c3fda56f9633b8f99129081f0bf12922 100644
--- a/runtime/common/src/weights/pallet_timestamp.rs
+++ b/runtime/gdev/src/weights/pallet_timestamp.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_timestamp`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/gdev/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -59,8 +59,8 @@ impl<T: frame_system::Config> pallet_timestamp::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `379`
 		//  Estimated: `1864`
-		// Minimum execution time: 10_564_000 picoseconds.
-		Weight::from_parts(11_021_000, 0)
+		// Minimum execution time: 15_793_000 picoseconds.
+		Weight::from_parts(16_426_000, 0)
 			.saturating_add(Weight::from_parts(0, 1864))
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -69,8 +69,8 @@ impl<T: frame_system::Config> pallet_timestamp::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `57`
 		//  Estimated: `0`
-		// Minimum execution time: 2_370_000 picoseconds.
-		Weight::from_parts(2_506_000, 0)
+		// Minimum execution time: 3_430_000 picoseconds.
+		Weight::from_parts(3_687_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 }
diff --git a/runtime/gdev/src/weights/pallet_treasury.rs b/runtime/gdev/src/weights/pallet_treasury.rs
new file mode 100644
index 0000000000000000000000000000000000000000..f2e9a37d50767e9e9c436a0a194e67c8356b7da5
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_treasury.rs
@@ -0,0 +1,129 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_treasury`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_treasury`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_treasury::WeightInfo for WeightInfo<T> {
+	fn spend_local() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 0_000 picoseconds.
+		Weight::from_parts(0, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `Treasury::Approvals` (r:1 w:0)
+	/// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`)
+	fn remove_approval() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `6`
+		//  Estimated: `1887`
+		// Minimum execution time: 3_335_000 picoseconds.
+		Weight::from_parts(3_622_000, 0)
+			.saturating_add(Weight::from_parts(0, 1887))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `System::Account` (r:1 w:0)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Treasury::Deactivated` (r:1 w:1)
+	/// Proof: `Treasury::Deactivated` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `Treasury::Approvals` (r:1 w:1)
+	/// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`)
+	/// The range of component `p` is `[0, 99]`.
+	fn on_initialize_proposals(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `82 + p * (1 ±0)`
+		//  Estimated: `3558`
+		// Minimum execution time: 14_880_000 picoseconds.
+		Weight::from_parts(16_520_043, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			// Standard Error: 615
+			.saturating_add(Weight::from_parts(31_130, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	fn spend() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 0_000 picoseconds.
+		Weight::from_parts(0, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `Treasury::Spends` (r:1 w:0)
+	/// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(61), added: 2536, mode: `MaxEncodedLen`)
+	fn payout() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `6`
+		//  Estimated: `3526`
+		// Minimum execution time: 4_759_000 picoseconds.
+		Weight::from_parts(5_028_000, 0)
+			.saturating_add(Weight::from_parts(0, 3526))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Treasury::Spends` (r:1 w:0)
+	/// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(61), added: 2536, mode: `MaxEncodedLen`)
+	fn check_status() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `6`
+		//  Estimated: `3526`
+		// Minimum execution time: 4_851_000 picoseconds.
+		Weight::from_parts(5_061_000, 0)
+			.saturating_add(Weight::from_parts(0, 3526))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Treasury::Spends` (r:1 w:0)
+	/// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(61), added: 2536, mode: `MaxEncodedLen`)
+	fn void_spend() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `6`
+		//  Estimated: `3526`
+		// Minimum execution time: 4_276_000 picoseconds.
+		Weight::from_parts(4_534_000, 0)
+			.saturating_add(Weight::from_parts(0, 3526))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+}
diff --git a/runtime/common/src/weights/pallet_universal_dividend.rs b/runtime/gdev/src/weights/pallet_universal_dividend.rs
similarity index 89%
rename from runtime/common/src/weights/pallet_universal_dividend.rs
rename to runtime/gdev/src/weights/pallet_universal_dividend.rs
index 4b55f1df54b2b22dcd86909a1987838b6a6d463a..1ad4c9b809c04edc909f13a362d22bfba1afd459 100644
--- a/runtime/common/src/weights/pallet_universal_dividend.rs
+++ b/runtime/gdev/src/weights/pallet_universal_dividend.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_universal_dividend`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/gdev/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -60,11 +60,11 @@ impl<T: frame_system::Config> pallet_universal_dividend::WeightInfo for WeightIn
 	/// The range of component `i` is `[1, 160]`.
 	fn claim_uds(_i: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `643`
-		//  Estimated: `4108`
-		// Minimum execution time: 25_256_000 picoseconds.
-		Weight::from_parts(27_602_699, 0)
-			.saturating_add(Weight::from_parts(0, 4108))
+		//  Measured:  `709`
+		//  Estimated: `4174`
+		// Minimum execution time: 35_492_000 picoseconds.
+		Weight::from_parts(38_037_828, 0)
+			.saturating_add(Weight::from_parts(0, 4174))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(2))
 	}
@@ -76,8 +76,8 @@ impl<T: frame_system::Config> pallet_universal_dividend::WeightInfo for WeightIn
 		// Proof Size summary in bytes:
 		//  Measured:  `156`
 		//  Estimated: `6126`
-		// Minimum execution time: 45_184_000 picoseconds.
-		Weight::from_parts(46_638_000, 0)
+		// Minimum execution time: 55_661_000 picoseconds.
+		Weight::from_parts(56_889_000, 0)
 			.saturating_add(Weight::from_parts(0, 6126))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -90,8 +90,8 @@ impl<T: frame_system::Config> pallet_universal_dividend::WeightInfo for WeightIn
 		// Proof Size summary in bytes:
 		//  Measured:  `93`
 		//  Estimated: `3558`
-		// Minimum execution time: 32_351_000 picoseconds.
-		Weight::from_parts(33_166_000, 0)
+		// Minimum execution time: 34_504_000 picoseconds.
+		Weight::from_parts(35_206_000, 0)
 			.saturating_add(Weight::from_parts(0, 3558))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -107,8 +107,8 @@ impl<T: frame_system::Config> pallet_universal_dividend::WeightInfo for WeightIn
 		// Proof Size summary in bytes:
 		//  Measured:  `181`
 		//  Estimated: `3558`
-		// Minimum execution time: 13_259_000 picoseconds.
-		Weight::from_parts(14_743_097, 0)
+		// Minimum execution time: 19_995_000 picoseconds.
+		Weight::from_parts(21_306_537, 0)
 			.saturating_add(Weight::from_parts(0, 3558))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(1))
diff --git a/runtime/gdev/src/weights/pallet_upgrade_origin.rs b/runtime/gdev/src/weights/pallet_upgrade_origin.rs
new file mode 100644
index 0000000000000000000000000000000000000000..3d266b33990db8671d1498c4e87a470c15ca880a
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_upgrade_origin.rs
@@ -0,0 +1,58 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_upgrade_origin`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_upgrade_origin`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_upgrade_origin::WeightInfo for WeightInfo<T> {
+	fn dispatch_as_root() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 5_728_000 picoseconds.
+		Weight::from_parts(6_163_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+}
diff --git a/runtime/gdev/src/weights/pallet_utility.rs b/runtime/gdev/src/weights/pallet_utility.rs
new file mode 100644
index 0000000000000000000000000000000000000000..e11dce62fdc70dd239c2b93a89a650da9a55d8be
--- /dev/null
+++ b/runtime/gdev/src/weights/pallet_utility.rs
@@ -0,0 +1,99 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_utility`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gdev/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_utility`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_utility::WeightInfo for WeightInfo<T> {
+	/// The range of component `c` is `[0, 1000]`.
+	fn batch(c: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 4_637_000 picoseconds.
+		Weight::from_parts(8_567_413, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 635
+			.saturating_add(Weight::from_parts(2_199_216, 0).saturating_mul(c.into()))
+	}
+	fn as_derivative() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 3_725_000 picoseconds.
+		Weight::from_parts(3_870_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// The range of component `c` is `[0, 1000]`.
+	fn batch_all(c: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 4_395_000 picoseconds.
+		Weight::from_parts(9_835_675, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 1_660
+			.saturating_add(Weight::from_parts(2_382_082, 0).saturating_mul(c.into()))
+	}
+	fn dispatch_as() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 5_920_000 picoseconds.
+		Weight::from_parts(6_104_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// The range of component `c` is `[0, 1000]`.
+	fn force_batch(c: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 4_459_000 picoseconds.
+		Weight::from_parts(9_375_208, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 1_152
+			.saturating_add(Weight::from_parts(2_210_099, 0).saturating_mul(c.into()))
+	}
+}
diff --git a/runtime/common/src/weights/paritydb_weights.rs b/runtime/gdev/src/weights/paritydb_weights.rs
similarity index 78%
rename from runtime/common/src/weights/paritydb_weights.rs
rename to runtime/gdev/src/weights/paritydb_weights.rs
index 816d3c4492b132367bc173bde73c9e48f678d468..acfd4222ea533e95b95c07af1038e944ed368939 100644
--- a/runtime/common/src/weights/paritydb_weights.rs
+++ b/runtime/gdev/src/weights/paritydb_weights.rs
@@ -1,13 +1,13 @@
 
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04 (Y/M/D)
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28 (Y/M/D)
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //!
 //! DATABASE: `ParityDb`, RUNTIME: `Ğdev Local Testnet`
 //! BLOCK-NUM: `BlockId::Number(0)`
 //! SKIP-WRITE: `false`, SKIP-READ: `false`, WARMUPS: `1`
 //! STATE-VERSION: `V1`, STATE-CACHE-SIZE: ``
-//! WEIGHT-PATH: `./runtime/common/src/weights/`
+//! WEIGHT-PATH: `./runtime/gdev/src/weights/`
 //! METRIC: `Average`, WEIGHT-MUL: `2.0`, WEIGHT-ADD: `0`
 
 // Executed Command:
@@ -16,8 +16,9 @@
 //   storage
 //   --chain=dev
 //   --mul=2
-//   --weight-path=./runtime/common/src/weights/
+//   --weight-path=./runtime/gdev/src/weights/
 //   --state-version=1
+//   --database=paritydb
 
 /// Storage DB weights for the `Ğdev Local Testnet` runtime and `ParityDb`.
 pub mod constants {
@@ -33,31 +34,31 @@ pub mod constants {
 			/// Calculated by multiplying the *Average* of all values with `2.0` and adding `0`.
 			///
 			/// Stats nanoseconds:
-			///   Min, Max: 1_030, 1_712_222
-			///   Average:  15_060
-			///   Median:   1_860
-			///   Std-Dev:  148855.15
+			///   Min, Max: 824, 1_204_864
+			///   Average:  8_936
+			///   Median:   1_282
+			///   Std-Dev:  94846.78
 			///
 			/// Percentiles nanoseconds:
-			///   99th: 13_285
-			///   95th: 2_804
-			///   75th: 2_239
-			read: 30_120 * constants::WEIGHT_REF_TIME_PER_NANOS,
+			///   99th: 10_233
+			///   95th: 2_325
+			///   75th: 1_465
+			read: 17_872 * constants::WEIGHT_REF_TIME_PER_NANOS,
 
 			/// Time to write one storage item.
 			/// Calculated by multiplying the *Average* of all values with `2.0` and adding `0`.
 			///
 			/// Stats nanoseconds:
-			///   Min, Max: 3_902, 6_736_518
-			///   Average:  60_761
-			///   Median:   9_435
-			///   Std-Dev:  585511.43
+			///   Min, Max: 3_779, 7_070_939
+			///   Average:  54_523
+			///   Median:   10_248
+			///   Std-Dev:  556457.72
 			///
 			/// Percentiles nanoseconds:
-			///   99th: 23_963
-			///   95th: 13_938
-			///   75th: 11_295
-			write: 121_522 * constants::WEIGHT_REF_TIME_PER_NANOS,
+			///   99th: 46_470
+			///   95th: 14_949
+			///   75th: 12_469
+			write: 109_046 * constants::WEIGHT_REF_TIME_PER_NANOS,
 		};
 	}
 
diff --git a/runtime/gdev/tests/balance_tests.rs b/runtime/gdev/tests/balance_tests.rs
index de2ac25c859473ec5cdba1842c30ae23b700e934..0d3955c5445073380e0871361fc7a603fcff2b1d 100644
--- a/runtime/gdev/tests/balance_tests.rs
+++ b/runtime/gdev/tests/balance_tests.rs
@@ -19,9 +19,11 @@
 mod common;
 
 use common::*;
-use frame_support::{assert_noop, assert_ok};
+use frame_support::{assert_noop, assert_ok, traits::StoredMap};
 use gdev_runtime::*;
+use sp_core::Encode;
 use sp_keyring::AccountKeyring;
+use sp_runtime::MultiAddress;
 
 /// test currency transfer
 /// (does not take fees into account because it's only calls, not extrinsics)
@@ -115,3 +117,46 @@ fn test_transfer_funds_unavailable() {
             );
         })
 }
+
+/// test balance transfer all with linked account not member
+#[test]
+fn test_transfer_all_linked_no_member() {
+    ExtBuilder::new(1, 3, 4)
+        .with_initial_balances(vec![(AccountKeyring::Alice.to_account_id(), 5_000)])
+        .build()
+        .execute_with(|| {
+            run_to_block(1);
+
+            let genesis_hash = System::block_hash(0);
+            let alice = AccountKeyring::Alice.to_account_id();
+            let ferdie = AccountKeyring::Ferdie.to_account_id();
+            let payload = (b"link", genesis_hash, 1u32, ferdie.clone()).encode();
+            let signature = AccountKeyring::Ferdie.sign(&payload);
+
+            assert_ok!(Balances::transfer_allow_death(
+                frame_system::RawOrigin::Signed(alice.clone()).into(),
+                MultiAddress::Id(ferdie.clone()),
+                1_000
+            ));
+            // Ferdie's account can be linked to Alice identity
+            assert_ok!(Identity::link_account(
+                frame_system::RawOrigin::Signed(alice).into(),
+                ferdie.clone(),
+                signature.into()
+            ));
+            assert_eq!(
+                frame_system::Pallet::<Runtime>::get(&ferdie).linked_idty,
+                Some(1)
+            );
+            assert_ok!(Balances::transfer_all(
+                frame_system::RawOrigin::Signed(ferdie.clone()).into(),
+                AccountKeyring::Bob.to_account_id().into(),
+                false
+            ),);
+            assert_eq!(Balances::free_balance(ferdie.clone()), 0);
+            // During reaping the account is unlinked
+            assert!(frame_system::Pallet::<Runtime>::get(&ferdie)
+                .linked_idty
+                .is_none());
+        })
+}
diff --git a/runtime/gdev/tests/common/mod.rs b/runtime/gdev/tests/common/mod.rs
index 95933e5250558e7b62f57f20be6a9584942ce5d6..ae5c557d7b761427cb6455464ba79c151eb6bab4 100644
--- a/runtime/gdev/tests/common/mod.rs
+++ b/runtime/gdev/tests/common/mod.rs
@@ -16,23 +16,22 @@
 
 #![allow(dead_code, unused_imports)]
 
-use common_runtime::constants::*;
-use common_runtime::*;
+use common_runtime::{constants::*, *};
 use frame_support::traits::{OnFinalize, OnInitialize};
-use gdev_runtime::opaque::SessionKeys;
-use gdev_runtime::*;
+use gdev_runtime::{opaque::SessionKeys, *};
 use pallet_authority_members::OnNewSession;
 use pallet_smith_members::SmithMeta;
 use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId;
-use sp_consensus_babe::{AuthorityId as BabeId, Slot};
-use sp_consensus_babe::{VrfInput, VrfProof};
+use sp_consensus_babe::{AuthorityId as BabeId, Slot, VrfInput, VrfProof};
 use sp_consensus_grandpa::AuthorityId as GrandpaId;
-use sp_core::crypto::IsWrappedBy;
-use sp_core::sr25519;
-use sp_core::{Encode, Pair, Public, H256};
+use sp_core::{crypto::IsWrappedBy, sr25519, Encode, Pair, Public, H256};
+use sp_keyring::AccountKeyring;
 use sp_membership::MembershipData;
-use sp_runtime::testing::{Digest, DigestItem};
-use sp_runtime::traits::{IdentifyAccount, Verify};
+use sp_runtime::{
+    generic::SignedPayload,
+    testing::{Digest, DigestItem},
+    traits::{Extrinsic, IdentifyAccount, Verify},
+};
 use std::collections::BTreeMap;
 
 pub type AccountPublic = <Signature as Verify>::Signer;
@@ -211,6 +210,7 @@ impl ExtBuilder {
                     )
                 })
                 .collect::<Vec<_>>(),
+            non_authority_keys: Vec::new(),
         }
         .assimilate_storage(&mut t)
         .unwrap();
@@ -345,6 +345,8 @@ pub fn run_to_block(n: u32) {
         // Set the new block number and author
         System::reset_events();
         System::set_block_number(System::block_number() + 1);
+        // Reset the block weight
+        System::set_block_consumed_resources(Weight::zero(), 0_usize);
 
         // Current slot is not incremented by BABE
         pallet_babe::CurrentSlot::<Runtime>::put(pallet_babe::CurrentSlot::<Runtime>::get() + 1);
@@ -478,3 +480,35 @@ fn session_keys(
         authority_discovery,
     }
 }
+
+/// get extrinsic for given call
+pub fn get_unchecked_extrinsic(
+    call: RuntimeCall,
+    era: u64,
+    block: u64,
+    signer: AccountKeyring,
+    tip: Balance,
+    nonce: u32,
+) -> gdev_runtime::UncheckedExtrinsic {
+    let extra: gdev_runtime::SignedExtra = (
+        frame_system::CheckNonZeroSender::<gdev_runtime::Runtime>::new(),
+        frame_system::CheckSpecVersion::<gdev_runtime::Runtime>::new(),
+        frame_system::CheckTxVersion::<gdev_runtime::Runtime>::new(),
+        frame_system::CheckGenesis::<gdev_runtime::Runtime>::new(),
+        frame_system::CheckMortality::<gdev_runtime::Runtime>::from(
+            sp_runtime::generic::Era::mortal(era, block),
+        ),
+        frame_system::CheckNonce::<gdev_runtime::Runtime>::from(nonce).into(),
+        frame_system::CheckWeight::<gdev_runtime::Runtime>::new(),
+        pallet_transaction_payment::ChargeTransactionPayment::<gdev_runtime::Runtime>::from(tip),
+    );
+    let payload = SignedPayload::new(call.clone(), extra.clone()).unwrap();
+    let origin = signer;
+    let sig = payload.using_encoded(|payload| origin.pair().sign(payload));
+
+    gdev_runtime::UncheckedExtrinsic::new(
+        call,
+        Some((origin.to_account_id().into(), sig.into(), extra)),
+    )
+    .unwrap()
+}
diff --git a/runtime/gdev/tests/fee_tests.rs b/runtime/gdev/tests/fee_tests.rs
new file mode 100644
index 0000000000000000000000000000000000000000..14c7f15e3e1e6cc3466913e4bfdeb9f4c0be7839
--- /dev/null
+++ b/runtime/gdev/tests/fee_tests.rs
@@ -0,0 +1,257 @@
+// Copyright 2021 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+#![cfg(not(feature = "constant-fees"))]
+
+mod common;
+
+use common::*;
+use frame_support::{assert_ok, pallet_prelude::DispatchClass};
+use gdev_runtime::*;
+use sp_keyring::AccountKeyring;
+
+/// This test checks that an almost empty block incurs no fees for an extrinsic.
+#[test]
+fn test_fees_empty() {
+    ExtBuilder::new(1, 3, 4)
+        .with_initial_balances(vec![
+            (AccountKeyring::Alice.to_account_id(), 10_000),
+            (AccountKeyring::Eve.to_account_id(), 10_000),
+        ])
+        .build()
+        .execute_with(|| {
+            let call = RuntimeCall::Balances(BalancesCall::transfer_allow_death {
+                dest: AccountKeyring::Eve.to_account_id().into(),
+                value: 500,
+            });
+
+            let xt = common::get_unchecked_extrinsic(
+                call,
+                4u64,
+                8u64,
+                AccountKeyring::Alice,
+                0u64,
+                0u32,
+            );
+            assert_ok!(Executive::apply_extrinsic(xt));
+            // The block is almost empty, so the extrinsic should incur no fee
+            assert_eq!(
+                Balances::free_balance(AccountKeyring::Alice.to_account_id()),
+                10_000 - 500
+            );
+        })
+}
+
+/// This test checks the fee behavior when the block is almost full.
+/// - Multiple extrinsics are applied successfully without incurring fees until the block is under target weight.
+/// - The last extrinsic incurs additional fees as the block reaches its target, verifying fee calculation under high load conditions.
+#[test]
+fn test_fees_weight() {
+    ExtBuilder::new(1, 3, 4)
+        .with_initial_balances(vec![
+            (AccountKeyring::Alice.to_account_id(), 10_000),
+            (AccountKeyring::Eve.to_account_id(), 10_000),
+        ])
+        .build()
+        .execute_with(|| {
+            let weights = BlockWeights::get();
+            let normal_max_weight = weights
+                .get(DispatchClass::Normal)
+                .max_total
+                .unwrap_or(weights.max_block);
+
+            // Ensure that the next extrinsic is below the limit.
+            System::set_block_consumed_resources(Weight::zero(), 0_usize);
+
+            let call = RuntimeCall::System(SystemCall::remark {
+                remark: vec![255u8; 1],
+            });
+            let xt = get_unchecked_extrinsic(call, 4u64, 8u64, AccountKeyring::Alice, 0u64, 0);
+            assert_ok!(Executive::apply_extrinsic(xt));
+            assert_eq!(
+                Balances::free_balance(AccountKeyring::Alice.to_account_id()),
+                10_000
+            );
+
+            // Ensure that the next extrinsic exceeds the limit.
+            System::set_block_consumed_resources(Target::get() * normal_max_weight, 0_usize);
+            // The block will reach the fee limit, so the next extrinsic should start incurring fees.
+            let call = RuntimeCall::System(SystemCall::remark {
+                remark: vec![255u8; 1],
+            });
+
+            let xt = get_unchecked_extrinsic(call, 4u64, 8u64, AccountKeyring::Alice, 0u64, 1u32);
+            assert_ok!(Executive::apply_extrinsic(xt));
+            assert_ne!(
+                Balances::free_balance(AccountKeyring::Alice.to_account_id()),
+                10_000
+            );
+        })
+}
+
+/// This test checks the fee behavior when the block is almost full.
+/// - Multiple extrinsics are applied successfully without incurring fees until the block is under target length.
+/// - The last extrinsic incurs additional fees as the block reaches its target, verifying fee calculation under high load conditions.
+#[test]
+fn test_fees_length() {
+    ExtBuilder::new(1, 3, 4)
+        .with_initial_balances(vec![
+            (AccountKeyring::Alice.to_account_id(), 10_000),
+            (AccountKeyring::Eve.to_account_id(), 10_000),
+        ])
+        .build()
+        .execute_with(|| {
+            let length = BlockLength::get();
+            let normal_max_length = *length.max.get(DispatchClass::Normal) as u64;
+
+            // Ensure that the next extrinsic is below the limit.
+            System::set_block_consumed_resources(Weight::zero(), 0usize);
+            let call = RuntimeCall::System(SystemCall::remark {
+                remark: vec![255u8; 100],
+            });
+            let xt = get_unchecked_extrinsic(call, 4u64, 8u64, AccountKeyring::Alice, 0u64, 0u32);
+            assert_ok!(Executive::apply_extrinsic(xt));
+            assert_eq!(
+                Balances::free_balance(AccountKeyring::Alice.to_account_id()),
+                10_000
+            );
+
+            // Ensure that the next extrinsic exceeds the extrinsic limit.
+            System::set_block_consumed_resources(Weight::zero(), 0usize);
+            let call = RuntimeCall::System(SystemCall::remark {
+                remark: vec![0u8; 147],
+            });
+            let xt = get_unchecked_extrinsic(call, 4u64, 8u64, AccountKeyring::Alice, 0u64, 1u32);
+            assert_ok!(Executive::apply_extrinsic(xt));
+            assert_ne!(
+                Balances::free_balance(AccountKeyring::Alice.to_account_id()),
+                10_000
+            );
+
+            // Ensure that the next extrinsic exceeds the block limit.
+            System::set_block_consumed_resources(
+                Weight::zero(),
+                (Target::get() * normal_max_length).try_into().unwrap(),
+            );
+            // The block will reach the fee limit, so the next extrinsic should start incurring fees.
+            let call = RuntimeCall::System(SystemCall::remark {
+                remark: vec![255u8; 1],
+            });
+
+            let xt = get_unchecked_extrinsic(call, 4u64, 8u64, AccountKeyring::Eve, 0u64, 0u32);
+            assert_ok!(Executive::apply_extrinsic(xt));
+            assert_ne!(
+                Balances::free_balance(AccountKeyring::Eve.to_account_id()),
+                10_000
+            );
+        })
+}
+
+/// This test checks the behavior of the fee multiplier based on block weight
+/// and previous block weight.
+#[test]
+fn test_fees_multiplier_weight() {
+    ExtBuilder::new(1, 3, 4)
+        .with_initial_balances(vec![
+            (AccountKeyring::Alice.to_account_id(), 10_000),
+            (AccountKeyring::Eve.to_account_id(), 10_000),
+        ])
+        .build()
+        .execute_with(|| {
+            let weights = BlockWeights::get();
+            let normal_max_weight = weights
+                .get(DispatchClass::Normal)
+                .max_total
+                .unwrap_or(weights.max_block);
+
+            assert_eq!(
+                pallet_transaction_payment::Pallet::<Runtime>::next_fee_multiplier(),
+                1.into()
+            );
+            // If the block weight is over the target and the previous block was also over the target,
+            // the fee multiplier is increased by one, up to the MaxMultiplier.
+            let mut current = 0u128;
+            for i in 1..20u128 {
+                System::set_block_consumed_resources(Target::get() * normal_max_weight, 0_usize);
+                run_to_block(i as u32);
+                current += 1;
+                assert_eq!(
+                    pallet_transaction_payment::Pallet::<Runtime>::next_fee_multiplier(),
+                    core::cmp::min(current.into(), MaxMultiplier::get())
+                );
+            }
+
+            // If the block weight is under the target and the previous block was also under the target,
+            // the fee multiplier is decreased by one, down to the one.
+            let mut current = 10u128;
+            for i in 20..50u32 {
+                run_to_block(i);
+                current = current.saturating_sub(1).max(1u128);
+                assert_eq!(
+                    pallet_transaction_payment::Pallet::<Runtime>::next_fee_multiplier(),
+                    current.into()
+                );
+            }
+        })
+}
+
+/// This test checks the behavior of the fee multiplier based on block length
+/// and previous block length.
+#[test]
+fn test_fees_multiplier_length() {
+    ExtBuilder::new(1, 3, 4)
+        .with_initial_balances(vec![
+            (AccountKeyring::Alice.to_account_id(), 10_000),
+            (AccountKeyring::Eve.to_account_id(), 10_000),
+        ])
+        .build()
+        .execute_with(|| {
+            let length = BlockLength::get();
+            let normal_max_length = *length.max.get(DispatchClass::Normal) as u64;
+
+            assert_eq!(
+                pallet_transaction_payment::Pallet::<Runtime>::next_fee_multiplier(),
+                1.into()
+            );
+            // If the block weight is over the target and the previous block was also over the target,
+            // the fee multiplier is increased by one, up to the MaxMultiplier.
+            let mut current = 0u128;
+            for i in 1..20u128 {
+                System::set_block_consumed_resources(
+                    Weight::zero(),
+                    (Target::get() * normal_max_length).try_into().unwrap(),
+                );
+                run_to_block(i as u32);
+                current += 1;
+                assert_eq!(
+                    pallet_transaction_payment::Pallet::<Runtime>::next_fee_multiplier(),
+                    core::cmp::min(current.into(), MaxMultiplier::get())
+                );
+            }
+
+            // If the block weight is under the target and the previous block was also under the target,
+            // the fee multiplier is decreased by one, down to the one.
+            let mut current = 10u128;
+            for i in 20..50u32 {
+                run_to_block(i);
+                current = current.saturating_sub(1).max(1u128);
+                assert_eq!(
+                    pallet_transaction_payment::Pallet::<Runtime>::next_fee_multiplier(),
+                    current.into()
+                );
+            }
+        })
+}
diff --git a/runtime/gdev/tests/integration_tests.rs b/runtime/gdev/tests/integration_tests.rs
index 3864d3a012d39f363b9c8c0b42c2b5279672804b..2d6b5d1577cc7b043c775cc5ca179e4e9e8f856b 100644
--- a/runtime/gdev/tests/integration_tests.rs
+++ b/runtime/gdev/tests/integration_tests.rs
@@ -17,15 +17,17 @@
 mod common;
 
 use common::*;
-use frame_support::traits::StoredMap;
-use frame_support::traits::{Get, PalletInfo, StorageInfo, StorageInfoTrait};
-use frame_support::{assert_err, assert_noop, assert_ok};
-use frame_support::{StorageHasher, Twox128};
+use frame_support::{
+    assert_err, assert_noop, assert_ok,
+    traits::{Get, PalletInfo, StorageInfo, StorageInfoTrait, StoredMap},
+    StorageHasher, Twox128,
+};
 use gdev_runtime::*;
 use pallet_identity::{RevocationPayload, REVOCATION_PAYLOAD_PREFIX};
 use pallet_membership::MembershipRemovalReason;
 use pallet_smith_members::{SmithMeta, SmithStatus};
-use sp_core::Encode;
+use scale_info::prelude::num::NonZeroU16;
+use sp_core::{Encode, Pair};
 use sp_keyring::AccountKeyring;
 use sp_runtime::MultiAddress;
 
@@ -359,8 +361,9 @@ fn test_validate_identity_when_claim() {
                 frame_system::RawOrigin::Signed(AccountKeyring::Eve.to_account_id()).into(),
             ));
 
-            // Pass 2 sessions
-            run_to_block(51);
+            // Pass 2nd evaluation period
+            let eval_period: u32 = <Runtime as pallet_distance::Config>::EvaluationPeriod::get();
+            run_to_block(2 * eval_period);
             // simulate an evaluation published by smith Alice
             assert_ok!(Distance::force_update_evaluation(
                 frame_system::RawOrigin::Root.into(),
@@ -369,9 +372,13 @@ fn test_validate_identity_when_claim() {
                     distances: vec![Perbill::one()],
                 }
             ));
-            run_to_block(75); // Pass 1 session
+            // Pass 3rd evaluation period
+            run_to_block(3 * eval_period);
             System::assert_has_event(RuntimeEvent::Distance(
-                pallet_distance::Event::EvaluatedValid { idty_index: 5 },
+                pallet_distance::Event::EvaluatedValid {
+                    idty_index: 5,
+                    distance: Perbill::one(),
+                },
             ));
 
             // eve can not claim her membership manually because it is done automatically
@@ -387,7 +394,8 @@ fn test_validate_identity_when_claim() {
             System::assert_has_event(RuntimeEvent::Membership(
                 pallet_membership::Event::MembershipAdded {
                     member: 5,
-                    expire_on: 75 + <Runtime as pallet_membership::Config>::MembershipPeriod::get(),
+                    expire_on: 3 * eval_period
+                        + <Runtime as pallet_membership::Config>::MembershipPeriod::get(),
                 },
             ));
         });
@@ -461,8 +469,9 @@ fn test_identity_creation_workflow() {
                 Some(AccountKeyring::Charlie.to_account_id(),)
             );
 
-            // Pass 2 sessions
-            run_to_block(51);
+            // Pass 2nd evaluation period
+            let eval_period: u32 = <Runtime as pallet_distance::Config>::EvaluationPeriod::get();
+            run_to_block(2 * eval_period);
             // simulate evaluation published by smith Alice
             assert_ok!(Distance::force_update_evaluation(
                 frame_system::RawOrigin::Root.into(),
@@ -471,28 +480,30 @@ fn test_identity_creation_workflow() {
                     distances: vec![Perbill::one()],
                 }
             ));
-            // Pass 1 session
-            run_to_block(75);
+            // Pass 3rd evaluation period
+            run_to_block(3 * eval_period);
 
             // eve should not even have to claim her membership
             System::assert_has_event(RuntimeEvent::Membership(
                 pallet_membership::Event::MembershipAdded {
                     member: 5,
-                    expire_on: 75 + <Runtime as pallet_membership::Config>::MembershipPeriod::get(),
+                    expire_on: 3 * eval_period
+                        + <Runtime as pallet_membership::Config>::MembershipPeriod::get(),
                 },
             ));
 
             // test state coherence
+            // block time is 6_000 ms
+            // ud creation period is 60_000 ms ~ 10 blocks
+            // first ud is at 24_000 ms ~ 4 blocks
+            // at current block this is UD number current_block/10 + 1
+            let first_eligible = ((3 * eval_period) / 10 + 1) as u16;
             assert_eq!(
                 Identity::identity(5),
                 Some(pallet_identity::IdtyValue {
                     data: IdtyData {
-                        // block time is 6_000 ms
-                        // ud creation period is 60_000 ms ~ 10 blocks
-                        // first ud is at 24_000 ms ~ 4 blocks
-                        // at block 75 this is UD number 8, so next is 9
                         first_eligible_ud: pallet_universal_dividend::FirstEligibleUd(Some(
-                            sp_std::num::NonZeroU16::new(9).unwrap()
+                            NonZeroU16::new(first_eligible).unwrap()
                         ))
                     },
                     next_creatable_identity_on: 0u32,
@@ -508,7 +519,7 @@ fn test_identity_creation_workflow() {
                 pallet_universal_dividend::Event::NewUdCreated {
                     amount: 1000,
                     index: 9,
-                    monetary_mass: 50_000, // 13_000 (initial) + 4 * 1000 * 8 (produced) + 5000
+                    monetary_mass: 49_000 + (10 - first_eligible as u64) * 1_000, // 13_000 (initial) + 4 * 1000 * 9 (produced) + (10-first_eligible)*1_000
                     members_count: 5,
                 },
             ));
@@ -517,8 +528,8 @@ fn test_identity_creation_workflow() {
             ));
             System::assert_has_event(RuntimeEvent::UniversalDividend(
                 pallet_universal_dividend::Event::UdsClaimed {
-                    count: 1,
-                    total: 1000,
+                    count: (10 - first_eligible),
+                    total: (10 - first_eligible as u64) * 1_000,
                     who: AccountKeyring::Eve.to_account_id(),
                 },
             ));
@@ -614,7 +625,9 @@ fn test_membership_renewal() {
                 frame_system::RawOrigin::Signed(AccountKeyring::Alice.to_account_id()).into(),
             ));
 
-            run_to_block(51); // Pass 2 sessions
+            // Pass 3rd evaluation period
+            let eval_period: u32 = <Runtime as pallet_distance::Config>::EvaluationPeriod::get();
+            run_to_block(3 * eval_period);
             assert_ok!(Distance::force_update_evaluation(
                 frame_system::RawOrigin::Root.into(),
                 AccountKeyring::Alice.to_account_id(),
@@ -622,16 +635,17 @@ fn test_membership_renewal() {
                     distances: vec![Perbill::one()],
                 }
             ));
-            // Pass 1 session, membership is renewed automatically
-            run_to_block(75);
+            // Pass to 4th evaluation period
+            run_to_block(4 * eval_period);
             System::assert_has_event(RuntimeEvent::Membership(
                 pallet_membership::Event::MembershipRenewed {
                     member: 1,
-                    expire_on: 75 + <Runtime as pallet_membership::Config>::MembershipPeriod::get(),
+                    expire_on: 4 * eval_period
+                        + <Runtime as pallet_membership::Config>::MembershipPeriod::get(),
                 },
             ));
 
-            run_to_block(76);
+            run_to_block(4 * eval_period + 1);
             // not possible to renew manually
             // can not ask renewal when period is not respected
             assert_noop!(
@@ -641,8 +655,10 @@ fn test_membership_renewal() {
                 pallet_duniter_wot::Error::<Runtime>::MembershipRenewalPeriodNotRespected,
             );
 
-            // should expire at block 175 = 75+100
-            run_to_block(175);
+            // should expire at block 3nd EvaluationPeriod + MembershipPeriod
+            run_to_block(
+                4 * eval_period + <Runtime as pallet_membership::Config>::MembershipPeriod::get(),
+            );
             System::assert_has_event(RuntimeEvent::Membership(
                 pallet_membership::Event::MembershipRemoved {
                     member: 1,
@@ -869,10 +885,10 @@ fn test_smith_certification() {
 
 fn create_dummy_session_keys() -> gdev_runtime::opaque::SessionKeys {
     gdev_runtime::opaque::SessionKeys {
-        grandpa: sp_core::ed25519::Public([0u8; 32]).into(),
-        babe: sp_core::sr25519::Public([0u8; 32]).into(),
-        im_online: sp_core::sr25519::Public([0u8; 32]).into(),
-        authority_discovery: sp_core::sr25519::Public([0u8; 32]).into(),
+        grandpa: sp_core::ed25519::Pair::generate().0.public().into(),
+        babe: sp_core::sr25519::Pair::generate().0.public().into(),
+        im_online: sp_core::sr25519::Pair::generate().0.public().into(),
+        authority_discovery: sp_core::sr25519::Pair::generate().0.public().into(),
     }
 }
 
@@ -1026,6 +1042,20 @@ fn test_create_new_idty() {
                 MultiAddress::Id(AccountKeyring::Eve.to_account_id()),
                 200
             ));
+            assert_noop!(
+                Identity::create_identity(
+                    frame_system::RawOrigin::Signed(AccountKeyring::Alice.to_account_id()).into(),
+                    AccountKeyring::Eve.to_account_id(),
+                ),
+                pallet_identity::Error::<Runtime>::InsufficientBalance
+            );
+
+            assert_ok!(Balances::transfer_allow_death(
+                frame_system::RawOrigin::Signed(AccountKeyring::Alice.to_account_id()).into(),
+                MultiAddress::Id(AccountKeyring::Eve.to_account_id()),
+                200
+            ));
+
             assert_ok!(Identity::create_identity(
                 frame_system::RawOrigin::Signed(AccountKeyring::Alice.to_account_id()).into(),
                 AccountKeyring::Eve.to_account_id(),
@@ -1050,7 +1080,22 @@ fn test_create_new_idty_without_founds() {
                 0
             );
 
-            // Should be able to create an identity without founds
+            // Should not be able to create an identity without founds
+            assert_noop!(
+                Identity::create_identity(
+                    frame_system::RawOrigin::Signed(AccountKeyring::Alice.to_account_id()).into(),
+                    AccountKeyring::Eve.to_account_id(),
+                ),
+                pallet_identity::Error::<Runtime>::AccountNotExist
+            );
+
+            // Deposit some founds on the account
+            assert_ok!(Balances::transfer_allow_death(
+                frame_system::RawOrigin::Signed(AccountKeyring::Alice.to_account_id()).into(),
+                MultiAddress::Id(AccountKeyring::Eve.to_account_id()),
+                500
+            ));
+
             assert_ok!(Identity::create_identity(
                 frame_system::RawOrigin::Signed(AccountKeyring::Alice.to_account_id()).into(),
                 AccountKeyring::Eve.to_account_id(),
@@ -1067,18 +1112,11 @@ fn test_create_new_idty_without_founds() {
             let events = System::events();
             assert_eq!(events.len(), 0);
 
-            // Deposit some founds on the identity account
-            assert_ok!(Balances::transfer_allow_death(
-                frame_system::RawOrigin::Signed(AccountKeyring::Alice.to_account_id()).into(),
-                MultiAddress::Id(AccountKeyring::Eve.to_account_id()),
-                200
-            ));
-
             // At next block, nothing should be preleved
             run_to_block(4);
             assert_eq!(
                 Balances::free_balance(AccountKeyring::Eve.to_account_id()),
-                200
+                500
             );
         });
 }
@@ -1156,6 +1194,7 @@ fn test_claim_memberhsip_after_few_uds() {
             (AccountKeyring::Alice.to_account_id(), 1_000),
             (AccountKeyring::Bob.to_account_id(), 1_000),
             (AccountKeyring::Charlie.to_account_id(), 1_000),
+            (AccountKeyring::Eve.to_account_id(), 1_000),
         ])
         .build()
         .execute_with(|| {
@@ -1304,7 +1343,7 @@ fn test_link_account() {
                 Identity::link_account(
                     frame_system::RawOrigin::Signed(alice.clone()).into(),
                     ferdie.clone(),
-                    signature.clone().into()
+                    signature.into()
                 ),
                 pallet_identity::Error::<gdev_runtime::Runtime>::AccountNotExist
             );
@@ -1323,6 +1362,31 @@ fn test_link_account() {
         })
 }
 
+/// test change owner key
+#[test]
+fn test_change_owner_key_validator_online() {
+    ExtBuilder::new(1, 3, 4).build().execute_with(|| {
+        let genesis_hash = System::block_hash(0);
+        let alice = AccountKeyring::Alice.to_account_id();
+        let ferdie = AccountKeyring::Ferdie.to_account_id();
+        let payload = (b"icok", genesis_hash, 1u32, alice.clone()).encode();
+        let signature = AccountKeyring::Alice.sign(&payload);
+
+        // Alice is an online validator
+        assert!(pallet_authority_members::OnlineAuthorities::<Runtime>::get().contains(&1));
+
+        // As an online validator she cannot change key
+        assert_noop!(
+            Identity::change_owner_key(
+                frame_system::RawOrigin::Signed(alice.clone()).into(),
+                ferdie.clone(),
+                signature.into()
+            ),
+            pallet_identity::Error::<gdev_runtime::Runtime>::OwnerKeyUsedAsValidator
+        );
+    })
+}
+
 /// test change owner key
 #[test]
 fn test_change_owner_key() {
@@ -1532,23 +1596,29 @@ fn test_unlink_identity() {
 /// test that the account of a newly created identity is linked to the identity
 #[test]
 fn test_new_account_linked() {
-    ExtBuilder::new(1, 3, 4).build().execute_with(|| {
-        let eve_account = AccountKeyring::Eve.to_account_id();
-        assert_eq!(
-            frame_system::Pallet::<Runtime>::get(&eve_account).linked_idty,
-            None
-        );
-        // Alice creates identity for Eve
-        assert_ok!(Identity::create_identity(
-            frame_system::RawOrigin::Signed(AccountKeyring::Alice.to_account_id()).into(),
-            eve_account.clone(),
-        ));
-        // then eve account should be linked to her identity
-        assert_eq!(
-            frame_system::Pallet::<Runtime>::get(&eve_account).linked_idty,
-            Some(5)
-        );
-    })
+    ExtBuilder::new(1, 3, 4)
+        .with_initial_balances(vec![
+            (AccountKeyring::Alice.to_account_id(), 1_000),
+            (AccountKeyring::Eve.to_account_id(), 1_000),
+        ])
+        .build()
+        .execute_with(|| {
+            let eve_account = AccountKeyring::Eve.to_account_id();
+            assert_eq!(
+                frame_system::Pallet::<Runtime>::get(&eve_account).linked_idty,
+                None
+            );
+            // Alice creates identity for Eve
+            assert_ok!(Identity::create_identity(
+                frame_system::RawOrigin::Signed(AccountKeyring::Alice.to_account_id()).into(),
+                eve_account.clone(),
+            ));
+            // then eve account should be linked to her identity
+            assert_eq!(
+                frame_system::Pallet::<Runtime>::get(&eve_account).linked_idty,
+                Some(5)
+            );
+        })
 }
 
 /// test killed account
diff --git a/runtime/gdev/tests/offences_tests.rs b/runtime/gdev/tests/offence_tests.rs
similarity index 93%
rename from runtime/gdev/tests/offences_tests.rs
rename to runtime/gdev/tests/offence_tests.rs
index 25f8f63aecab38a98b967f51ed963a0ae367d749..d305aa2f5344fe78ddb8caaa04b03c9b7b3e76cb 100644
--- a/runtime/gdev/tests/offences_tests.rs
+++ b/runtime/gdev/tests/offence_tests.rs
@@ -17,9 +17,10 @@
 mod common;
 
 use common::*;
-use frame_support::assert_ok;
-use frame_support::traits::ValidatorSet;
-use frame_support::traits::ValidatorSetWithIdentification;
+use frame_support::{
+    assert_ok,
+    traits::{ValidatorSet, ValidatorSetWithIdentification},
+};
 use gdev_runtime::*;
 use pallet_im_online as im_online;
 use pallet_im_online::UnresponsivenessOffence;
@@ -36,15 +37,14 @@ fn test_imonline_offence() {
         // Construct an offence where all validators (member: 1) are offenders
         let offenders = current_validators
             .into_iter()
-            .enumerate()
-            .filter_map(|(_, id)| {
+            .filter_map(|id| {
                 <<Runtime as im_online::Config>::ValidatorSet as ValidatorSetWithIdentification<
                     sp_runtime::AccountId32,
                 >>::IdentificationOf::convert(id.clone())
                 .map(|full_id| (id, full_id))
             })
             .collect::<Vec<IdentificationTuple<Runtime>>>();
-        let keys = ImOnline::keys();
+        let keys = pallet_im_online::Keys::<Runtime>::get();
         let validator_set_count = keys.len() as u32;
         let offence = UnresponsivenessOffence {
             session_index,
@@ -78,15 +78,14 @@ fn test_grandpa_offence() {
         // Construct an offence where all validators (member: 1) are offenders
         let mut offenders = current_validators
             .into_iter()
-            .enumerate()
-            .filter_map(|(_, id)| {
+            .filter_map(|id| {
                 <Runtime as pallet_session::historical::Config>::FullIdentificationOf::convert(
                     id.clone(),
                 )
                 .map(|full_id| (id, full_id))
             })
             .collect::<Vec<IdentificationTuple<Runtime>>>();
-        let keys = ImOnline::keys();
+        let keys = pallet_im_online::Keys::<Runtime>::get();
         let validator_set_count = keys.len() as u32;
         let time_slot = pallet_grandpa::TimeSlot {
             set_id: 0,
@@ -123,15 +122,14 @@ fn test_babe_offence() {
         // Construct an offence where all validators (member: 1) are offenders
         let mut offenders = current_validators
             .into_iter()
-            .enumerate()
-            .filter_map(|(_, id)| {
+            .filter_map(|id| {
                 <Runtime as pallet_session::historical::Config>::FullIdentificationOf::convert(
                     id.clone(),
                 )
                 .map(|full_id| (id, full_id))
             })
             .collect::<Vec<IdentificationTuple<Runtime>>>();
-        let keys = ImOnline::keys();
+        let keys = pallet_im_online::Keys::<Runtime>::get();
         let validator_set_count = keys.len() as u32;
         let offence = pallet_babe::EquivocationOffence {
             slot: 0u64.into(),
diff --git a/runtime/gdev/tests/xt_tests.rs b/runtime/gdev/tests/xt_tests.rs
index ab48fdaf73fbaf93be4e69a57a3b9f29bdebaa14..5bbb96acc988411a73cd0d421eee496a92ee703d 100644
--- a/runtime/gdev/tests/xt_tests.rs
+++ b/runtime/gdev/tests/xt_tests.rs
@@ -17,48 +17,18 @@
 // these integration tests aim to test fees and extrinsic-related externalities
 // they need constant-fees feature to work
 
+#![cfg(feature = "constant-fees")]
+
 mod common;
 
 use common::*;
-use frame_support::assert_ok;
-use frame_support::traits::OnIdle;
+use frame_support::{
+    assert_ok,
+    traits::{OnIdle, StoredMap},
+};
 use gdev_runtime::*;
 use sp_core::Encode;
-use sp_core::Pair;
 use sp_keyring::AccountKeyring;
-use sp_runtime::generic::SignedPayload;
-use sp_runtime::traits::Extrinsic;
-
-/// get extrinsic for given call
-fn get_unchecked_extrinsic(
-    call: RuntimeCall,
-    era: u64,
-    block: u64,
-    signer: AccountKeyring,
-    tip: Balance,
-) -> UncheckedExtrinsic {
-    let extra: gdev_runtime::SignedExtra = (
-        frame_system::CheckNonZeroSender::<gdev_runtime::Runtime>::new(),
-        frame_system::CheckSpecVersion::<gdev_runtime::Runtime>::new(),
-        frame_system::CheckTxVersion::<gdev_runtime::Runtime>::new(),
-        frame_system::CheckGenesis::<gdev_runtime::Runtime>::new(),
-        frame_system::CheckMortality::<gdev_runtime::Runtime>::from(
-            sp_runtime::generic::Era::mortal(era, block),
-        ),
-        frame_system::CheckNonce::<gdev_runtime::Runtime>::from(0u32).into(),
-        frame_system::CheckWeight::<gdev_runtime::Runtime>::new(),
-        pallet_transaction_payment::ChargeTransactionPayment::<gdev_runtime::Runtime>::from(tip),
-    );
-    let payload = SignedPayload::new(call.clone(), extra.clone()).unwrap();
-    let origin = signer;
-    let sig = payload.using_encoded(|payload| origin.pair().sign(payload));
-
-    UncheckedExtrinsic::new(
-        call,
-        Some((origin.to_account_id().into(), sig.into(), extra)),
-    )
-    .unwrap()
-}
 
 /// test currency transfer with extrinsic
 // the signer account should pay fees and a tip
@@ -78,7 +48,7 @@ fn test_transfer_xt() {
             });
 
             // 1 cĞD of tip
-            let xt = get_unchecked_extrinsic(call, 4u64, 8u64, AccountKeyring::Alice, 1u64);
+            let xt = get_unchecked_extrinsic(call, 4u64, 8u64, AccountKeyring::Alice, 1u64, 0);
             // let info = xt.get_dispatch_info();
             // println!("dispatch info:\n\t {:?}\n", info);
 
@@ -114,7 +84,7 @@ fn test_refund_queue() {
             });
 
             // 1 cĞD of tip
-            let xt = get_unchecked_extrinsic(call, 4u64, 8u64, AccountKeyring::Alice, 1u64);
+            let xt = get_unchecked_extrinsic(call, 4u64, 8u64, AccountKeyring::Alice, 1u64, 0);
             assert_ok!(Executive::apply_extrinsic(xt));
 
             // check that refund was added to the queue
@@ -147,7 +117,7 @@ fn test_refund_on_idle() {
             });
 
             // 1 cĞD of tip
-            let xt = get_unchecked_extrinsic(call, 4u64, 8u64, AccountKeyring::Alice, 1u64);
+            let xt = get_unchecked_extrinsic(call, 4u64, 8u64, AccountKeyring::Alice, 1u64, 0);
             assert_ok!(Executive::apply_extrinsic(xt));
 
             // call on_idle to activate refund
@@ -184,10 +154,56 @@ fn test_no_refund() {
                 dest: AccountKeyring::Alice.to_account_id().into(),
                 value: 500,
             });
-            let xt = get_unchecked_extrinsic(call, 4u64, 8u64, AccountKeyring::Eve, 1u64);
+            let xt = get_unchecked_extrinsic(call, 4u64, 8u64, AccountKeyring::Eve, 1u64, 0);
             assert_ok!(Executive::apply_extrinsic(xt));
             // check that refund queue is empty
             assert!(pallet_quota::RefundQueue::<Runtime>::get().is_empty());
             assert_eq!(Balances::free_balance(Treasury::account_id()), 100 + 3);
         })
 }
+
+/// test refund on_idle when linked account is reaped
+#[test]
+fn test_refund_reaped_linked_account() {
+    ExtBuilder::new(1, 3, 4)
+        .with_initial_balances(vec![
+            (AccountKeyring::Alice.to_account_id(), 10_000),
+            (AccountKeyring::Ferdie.to_account_id(), 10_000),
+        ])
+        .build()
+        .execute_with(|| {
+            let genesis_hash = System::block_hash(0);
+            let alice = AccountKeyring::Alice.to_account_id();
+            let ferdie = AccountKeyring::Ferdie.to_account_id();
+            let payload = (b"link", genesis_hash, 1u32, ferdie.clone()).encode();
+            let signature = AccountKeyring::Ferdie.sign(&payload);
+
+            // Ferdie's account can be linked to Alice identity
+            assert_ok!(Identity::link_account(
+                frame_system::RawOrigin::Signed(alice.clone()).into(),
+                ferdie.clone(),
+                signature.into()
+            ));
+            assert_eq!(
+                frame_system::Pallet::<Runtime>::get(&ferdie).linked_idty,
+                Some(1)
+            );
+
+            // transfer_all call to extrinsic
+            let call = RuntimeCall::Balances(BalancesCall::transfer_all {
+                dest: AccountKeyring::Alice.to_account_id().into(),
+                keep_alive: false,
+            });
+            let xt = get_unchecked_extrinsic(call, 4u64, 8u64, AccountKeyring::Ferdie, 0u64, 0);
+            assert_ok!(Executive::apply_extrinsic(xt));
+
+            assert_eq!(Balances::free_balance(ferdie.clone()), 0);
+            // During reaping the account is unlinked
+            assert!(frame_system::Pallet::<Runtime>::get(&ferdie)
+                .linked_idty
+                .is_none());
+
+            // since the account is reaped, it is not linked anymore and no refund is added to queue
+            assert!(pallet_quota::RefundQueue::<Runtime>::get().is_empty());
+        })
+}
diff --git a/runtime/gtest/Cargo.toml b/runtime/gtest/Cargo.toml
index 2b7cbbcc1edcc490efac4a91f96e4d980a7d180d..1b09c9ca1d9dea331c3f9bcf2923ca163cb25c55 100644
--- a/runtime/gtest/Cargo.toml
+++ b/runtime/gtest/Cargo.toml
@@ -59,7 +59,7 @@ std = [
 	"frame-system-benchmarking/std",
 	"frame-system-rpc-runtime-api/std",
 	"frame-system/std",
-	"frame-try-runtime?/std",
+	"frame-try-runtime/std",
 	"log/std",
 	"node-primitives/std",
 	"pallet-atomic-swap/std",
@@ -114,17 +114,17 @@ std = [
 	"sp-runtime/std",
 	"sp-session/std",
 	"sp-staking/std",
-	"sp-std/std",
 	"sp-transaction-pool/std",
 	"sp-version/std",
 	"substrate-wasm-builder",
+	"sp-weights/std",
 ]
 try-runtime = [
 	"common-runtime/try-runtime",
 	"frame-executive/try-runtime",
 	"frame-support/try-runtime",
 	"frame-system/try-runtime",
-	"frame-try-runtime?/try-runtime",
+	"frame-try-runtime/try-runtime",
 	"pallet-atomic-swap/try-runtime",
 	"pallet-authority-discovery/try-runtime",
 	"pallet-authority-members/try-runtime",
@@ -230,9 +230,9 @@ sp-membership = { workspace = true }
 sp-offchain = { workspace = true }
 sp-runtime = { workspace = true }
 sp-session = { workspace = true }
-sp-std = { workspace = true }
 sp-transaction-pool = { workspace = true }
 sp-version = { workspace = true }
 sp-genesis-builder = { workspace = true }
 node-primitives = { workspace = true }
 codec = { workspace = true, features = ["derive"] }
+sp-weights = { workspace = true }
diff --git a/runtime/gtest/src/lib.rs b/runtime/gtest/src/lib.rs
index 88e2ebb481ad5a2aa00542b8c5a7b5fe5dd2fb90..6be12db81e88fed8c40bef5608b14f70d5e58d1b 100644
--- a/runtime/gtest/src/lib.rs
+++ b/runtime/gtest/src/lib.rs
@@ -27,43 +27,47 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
 extern crate frame_benchmarking;
 
 pub mod parameters;
+pub mod weights;
 
 pub use self::parameters::*;
+use common_runtime::IdtyNameValidatorImpl;
 pub use common_runtime::{
     constants::*, entities::*, handlers::*, AccountId, Address, Balance, BlockNumber,
     FullIdentificationOfImpl, GetCurrentEpochIndex, Hash, Header, IdtyIndex, Index, Signature,
 };
+use frame_support::{
+    traits::{fungible::Balanced, Contains, Imbalance},
+    PalletId,
+};
 pub use frame_system::Call as SystemCall;
+use frame_system::EnsureRoot;
 pub use pallet_balances::Call as BalancesCall;
+#[cfg(feature = "runtime-benchmarks")]
+pub use pallet_collective::RawOrigin;
+use pallet_grandpa::{
+    fg_primitives, AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList,
+};
 pub use pallet_im_online::sr25519::AuthorityId as ImOnlineId;
 use pallet_session::historical as session_historical;
 pub use pallet_timestamp::Call as TimestampCall;
-use pallet_transaction_payment::CurrencyAdapter;
+use pallet_transaction_payment::FungibleAdapter;
 pub use pallet_universal_dividend;
-#[cfg(any(feature = "std", test))]
-pub use sp_runtime::BuildStorage;
-pub use sp_runtime::{KeyTypeId, Perbill, Permill};
-
-use common_runtime::IdtyNameValidatorImpl;
-use frame_support::traits::Contains;
-use frame_support::PalletId;
-use frame_system::EnsureRoot;
-use pallet_grandpa::fg_primitives;
-use pallet_grandpa::{AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList};
+use scale_info::prelude::{vec, vec::Vec};
 use sp_api::impl_runtime_apis;
 use sp_core::OpaqueMetadata;
-use sp_runtime::traits::{
-    AccountIdLookup, BlakeTwo256, Block as BlockT, NumberFor, One, OpaqueKeys,
-};
+#[cfg(any(feature = "std", test))]
+pub use sp_runtime::BuildStorage;
 use sp_runtime::{
     create_runtime_str, generic, impl_opaque_keys,
+    traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, NumberFor, OpaqueKeys},
     transaction_validity::{TransactionSource, TransactionValidity},
-    ApplyExtrinsicResult,
+    ApplyExtrinsicResult, Perquintill,
 };
-use sp_std::prelude::*;
+pub use sp_runtime::{KeyTypeId, Perbill, Permill};
 #[cfg(feature = "std")]
 use sp_version::NativeVersion;
 use sp_version::RuntimeVersion;
+pub use weights::paritydb_weights::constants::ParityDbWeight as DbWeight;
 
 // A few exports that help ease life for downstream crates.
 use frame_support::instances::Instance2;
@@ -71,9 +75,7 @@ pub use frame_support::{
     construct_runtime, parameter_types,
     traits::{EqualPrivilegeOnly, KeyOwnerProofSystem, Randomness},
     weights::{
-        constants::{
-            BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND,
-        },
+        constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight},
         Weight, WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial,
     },
     StorageValue,
@@ -170,9 +172,6 @@ mod benches {
 }
 
 pub struct BaseCallFilter;
-
-// implement filter
-// session pallet calls are filtered in order to use authority member instead
 impl Contains<RuntimeCall> for BaseCallFilter {
     fn contains(call: &RuntimeCall) -> bool {
         !matches!(call, RuntimeCall::Session(_))
@@ -240,7 +239,9 @@ impl frame_support::traits::InstanceFilter<RuntimeCall> for ProxyType {
 }
 
 // Configure pallets to include in runtime.
-common_runtime::pallets_config! {}
+#[cfg(feature = "runtime-benchmarks")]
+type WorstOrigin = RawOrigin<AccountId, TechnicalCommitteeInstance>;
+common_runtime::pallets_config!();
 
 // Create the runtime by composing the pallets that were previously configured.
 construct_runtime!(
diff --git a/runtime/gtest/src/parameters.rs b/runtime/gtest/src/parameters.rs
index 688d3a44617c2a0f6559ba2c5416862fb014576f..6295b34bc2d3f7f3b45cc2a9de1e147ba943335c 100644
--- a/runtime/gtest/src/parameters.rs
+++ b/runtime/gtest/src/parameters.rs
@@ -16,17 +16,13 @@
 
 use crate::*;
 use common_runtime::constants::*;
-use common_runtime::{Balance, BlockNumber};
-use frame_support::parameter_types;
-use frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND;
-use sp_arithmetic::Perbill;
+use frame_support::{parameter_types, weights::constants::WEIGHT_REF_TIME_PER_SECOND};
 use sp_runtime::transaction_validity::TransactionPriority;
 
 parameter_types! {
     pub const BlockHashCount: BlockNumber = 2400;
     /// We allow for 2 seconds of compute with a 6 second average block time.
-    pub BlockWeights: frame_system::limits::BlockWeights = block_weights((Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND, 0) * 2)
-        .set_proof_size(5 * 1024 * 1024), NORMAL_DISPATCH_RATIO);
+    pub BlockWeights: frame_system::limits::BlockWeights = frame_system::limits::BlockWeights::with_sensible_defaults(Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND * 2u64, u64::MAX), NORMAL_DISPATCH_RATIO);
     pub BlockLength: frame_system::limits::BlockLength = frame_system::limits::BlockLength
         ::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO);
     pub const SS58Prefix: u16 = 42;
@@ -51,6 +47,12 @@ parameter_types! {
     pub const MinimumPeriod: u64 = SLOT_DURATION / 2;
 }
 
+// Distance
+parameter_types! {
+    pub const MinAccessibleReferees: Perbill = Perbill::from_percent(80);
+    pub const MaxRefereeDistance: u32 = 5;
+}
+
 // Babe
 pub const EPOCH_DURATION_IN_SLOTS: BlockNumber = HOURS;
 parameter_types! {
@@ -61,7 +63,7 @@ parameter_types! {
 
 // ImOnline
 parameter_types! {
-    pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value();
+    pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::MAX;
     pub const MaxPeerInHeartbeats: u32 = 10_000;
     pub const MaxPeerDataEncodingSize: u32 = 1_000;
 }
diff --git a/runtime/gtest/src/weights.rs b/runtime/gtest/src/weights.rs
new file mode 100644
index 0000000000000000000000000000000000000000..1bf51bdbb063859c33197a6251bf767ba1311442
--- /dev/null
+++ b/runtime/gtest/src/weights.rs
@@ -0,0 +1,52 @@
+// Copyright 2021 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(clippy::unnecessary_cast)]
+#![allow(unused_doc_comments)]
+
+pub mod block_weights;
+pub mod extrinsic_weights;
+pub mod frame_system;
+pub mod pallet_babe;
+pub mod pallet_balances;
+pub mod pallet_collective;
+pub mod pallet_distance;
+pub mod pallet_grandpa;
+pub mod pallet_im_online;
+pub mod pallet_multisig;
+pub mod pallet_proxy;
+pub mod pallet_session;
+pub mod pallet_scheduler;
+pub mod pallet_timestamp;
+pub mod pallet_treasury;
+pub mod pallet_universal_dividend;
+pub mod pallet_upgrade_origin;
+pub mod pallet_provide_randomness;
+pub mod pallet_identity;
+pub mod pallet_preimage;
+pub mod pallet_utility;
+pub mod pallet_duniter_account;
+pub mod pallet_quota;
+pub mod pallet_oneshot_account;
+pub mod pallet_certification;
+pub mod pallet_membership;
+pub mod pallet_smith_members;
+pub mod pallet_sudo;
+pub mod pallet_authority_members;
+pub mod paritydb_weights;
diff --git a/runtime/gtest/src/weights/block_weights.rs b/runtime/gtest/src/weights/block_weights.rs
new file mode 100644
index 0000000000000000000000000000000000000000..6b9009a8ae9669f7030d307350f94aa249d4c37a
--- /dev/null
+++ b/runtime/gtest/src/weights/block_weights.rs
@@ -0,0 +1,64 @@
+
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28 (Y/M/D)
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//!
+//! SHORT-NAME: `block`, LONG-NAME: `BlockExecution`, RUNTIME: `ĞTest Local Testnet`
+//! WARMUPS: `10`, REPEAT: `100`
+//! WEIGHT-PATH: `./runtime/gtest/src/weights/`
+//! WEIGHT-METRIC: `Average`, WEIGHT-MUL: `1.0`, WEIGHT-ADD: `0`
+
+// Executed Command:
+//   target/release/duniter
+//   benchmark
+//   overhead
+//   --chain=dev
+//   --wasm-execution=compiled
+//   --weight-path=./runtime/gtest/src/weights/
+//   --warmup=10
+//   --repeat=100
+
+use sp_core::parameter_types;
+use sp_weights::{constants::WEIGHT_REF_TIME_PER_NANOS, Weight};
+
+parameter_types! {
+	/// Time to execute an empty block.
+	/// Calculated by multiplying the *Average* with `1.0` and adding `0`.
+	///
+	/// Stats nanoseconds:
+	///   Min, Max: 121_418, 209_960
+	///   Average:  130_915
+	///   Median:   128_222
+	///   Std-Dev:  10702.93
+	///
+	/// Percentiles nanoseconds:
+	///   99th: 171_308
+	///   95th: 145_322
+	///   75th: 129_769
+	pub const BlockExecutionWeight: Weight =
+		Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS.saturating_mul(130_915), 0);
+}
+
+#[cfg(test)]
+mod test_weights {
+	use sp_weights::constants;
+
+	/// Checks that the weight exists and is sane.
+	// NOTE: If this test fails but you are sure that the generated values are fine,
+	// you can delete it.
+	#[test]
+	fn sane() {
+		let w = super::BlockExecutionWeight::get();
+
+		// At least 100 µs.
+		assert!(
+			w.ref_time() >= 100u64 * constants::WEIGHT_REF_TIME_PER_MICROS,
+			"Weight should be at least 100 µs."
+		);
+		// At most 50 ms.
+		assert!(
+			w.ref_time() <= 50u64 * constants::WEIGHT_REF_TIME_PER_MILLIS,
+			"Weight should be at most 50 ms."
+		);
+	}
+}
diff --git a/runtime/gtest/src/weights/extrinsic_weights.rs b/runtime/gtest/src/weights/extrinsic_weights.rs
new file mode 100644
index 0000000000000000000000000000000000000000..e9175389adf03f7b398b8c6a6dfc1efc6818dd5b
--- /dev/null
+++ b/runtime/gtest/src/weights/extrinsic_weights.rs
@@ -0,0 +1,64 @@
+
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28 (Y/M/D)
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//!
+//! SHORT-NAME: `extrinsic`, LONG-NAME: `ExtrinsicBase`, RUNTIME: `ĞTest Local Testnet`
+//! WARMUPS: `10`, REPEAT: `100`
+//! WEIGHT-PATH: `./runtime/gtest/src/weights/`
+//! WEIGHT-METRIC: `Average`, WEIGHT-MUL: `1.0`, WEIGHT-ADD: `0`
+
+// Executed Command:
+//   target/release/duniter
+//   benchmark
+//   overhead
+//   --chain=dev
+//   --wasm-execution=compiled
+//   --weight-path=./runtime/gtest/src/weights/
+//   --warmup=10
+//   --repeat=100
+
+use sp_core::parameter_types;
+use sp_weights::{constants::WEIGHT_REF_TIME_PER_NANOS, Weight};
+
+parameter_types! {
+	/// Time to execute a NO-OP extrinsic, for example `System::remark`.
+	/// Calculated by multiplying the *Average* with `1.0` and adding `0`.
+	///
+	/// Stats nanoseconds:
+	///   Min, Max: 88_403, 89_281
+	///   Average:  88_644
+	///   Median:   88_628
+	///   Std-Dev:  144.84
+	///
+	/// Percentiles nanoseconds:
+	///   99th: 89_088
+	///   95th: 88_842
+	///   75th: 88_729
+	pub const ExtrinsicBaseWeight: Weight =
+		Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS.saturating_mul(88_644), 0);
+}
+
+#[cfg(test)]
+mod test_weights {
+	use sp_weights::constants;
+
+	/// Checks that the weight exists and is sane.
+	// NOTE: If this test fails but you are sure that the generated values are fine,
+	// you can delete it.
+	#[test]
+	fn sane() {
+		let w = super::ExtrinsicBaseWeight::get();
+
+		// At least 10 µs.
+		assert!(
+			w.ref_time() >= 10u64 * constants::WEIGHT_REF_TIME_PER_MICROS,
+			"Weight should be at least 10 µs."
+		);
+		// At most 1 ms.
+		assert!(
+			w.ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS,
+			"Weight should be at most 1 ms."
+		);
+	}
+}
diff --git a/runtime/gtest/src/weights/frame_benchmarking_baseline.rs b/runtime/gtest/src/weights/frame_benchmarking_baseline.rs
new file mode 100644
index 0000000000000000000000000000000000000000..64cf77de7602e5b950d3bfeeb72558a59107bdf0
--- /dev/null
+++ b/runtime/gtest/src/weights/frame_benchmarking_baseline.rs
@@ -0,0 +1,105 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `frame_benchmarking::baseline`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `frame_benchmarking::baseline`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> frame_benchmarking::baseline::WeightInfo for WeightInfo<T> {
+	/// The range of component `i` is `[0, 1000000]`.
+	fn addition(_i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 81_000 picoseconds.
+		Weight::from_parts(121_559, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// The range of component `i` is `[0, 1000000]`.
+	fn subtraction(_i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 82_000 picoseconds.
+		Weight::from_parts(124_213, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// The range of component `i` is `[0, 1000000]`.
+	fn multiplication(_i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 82_000 picoseconds.
+		Weight::from_parts(124_074, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// The range of component `i` is `[0, 1000000]`.
+	fn division(_i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 81_000 picoseconds.
+		Weight::from_parts(124_880, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	fn hashing() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 19_766_994_000 picoseconds.
+		Weight::from_parts(19_827_666_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// The range of component `i` is `[0, 100]`.
+	fn sr25519_verification(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 87_000 picoseconds.
+		Weight::from_parts(29_169_155, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 12_902
+			.saturating_add(Weight::from_parts(32_049_904, 0).saturating_mul(i.into()))
+	}
+}
diff --git a/runtime/gtest/src/weights/frame_system.rs b/runtime/gtest/src/weights/frame_system.rs
new file mode 100644
index 0000000000000000000000000000000000000000..2295a11d5f65e6bdadcc62c278a45a8bc2c259b2
--- /dev/null
+++ b/runtime/gtest/src/weights/frame_system.rs
@@ -0,0 +1,171 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `frame_system`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `frame_system`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> frame_system::WeightInfo for WeightInfo<T> {
+	/// The range of component `b` is `[0, 3932160]`.
+	fn remark(b: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 1_791_000 picoseconds.
+		Weight::from_parts(1_950_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 0
+			.saturating_add(Weight::from_parts(269, 0).saturating_mul(b.into()))
+	}
+	/// The range of component `b` is `[0, 3932160]`.
+	fn remark_with_event(b: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 5_043_000 picoseconds.
+		Weight::from_parts(5_179_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 1
+			.saturating_add(Weight::from_parts(1_097, 0).saturating_mul(b.into()))
+	}
+	/// Storage: `System::Digest` (r:1 w:1)
+	/// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1)
+	/// Proof: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1)
+	fn set_heap_pages() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `1485`
+		// Minimum execution time: 3_641_000 picoseconds.
+		Weight::from_parts(3_878_000, 0)
+			.saturating_add(Weight::from_parts(0, 1485))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `System::Digest` (r:1 w:1)
+	/// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1)
+	/// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1)
+	fn set_code() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `1485`
+		// Minimum execution time: 78_980_269_000 picoseconds.
+		Weight::from_parts(82_510_139_000, 0)
+			.saturating_add(Weight::from_parts(0, 1485))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Skipped::Metadata` (r:0 w:0)
+	/// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[0, 1000]`.
+	fn set_storage(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 1_877_000 picoseconds.
+		Weight::from_parts(2_034_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 560
+			.saturating_add(Weight::from_parts(571_898, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
+	}
+	/// Storage: `Skipped::Metadata` (r:0 w:0)
+	/// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[0, 1000]`.
+	fn kill_storage(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 1_666_000 picoseconds.
+		Weight::from_parts(1_825_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 746
+			.saturating_add(Weight::from_parts(476_340, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
+	}
+	/// Storage: `Skipped::Metadata` (r:0 w:0)
+	/// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `p` is `[0, 1000]`.
+	fn kill_prefix(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `77 + p * (69 ±0)`
+		//  Estimated: `76 + p * (70 ±0)`
+		// Minimum execution time: 3_379_000 picoseconds.
+		Weight::from_parts(3_563_000, 0)
+			.saturating_add(Weight::from_parts(0, 76))
+			// Standard Error: 986
+			.saturating_add(Weight::from_parts(1_048_114, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into())))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into())))
+			.saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into()))
+	}
+	/// Storage: `System::AuthorizedUpgrade` (r:0 w:1)
+	/// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`)
+	fn authorize_upgrade() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 9_487_000 picoseconds.
+		Weight::from_parts(11_272_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `System::AuthorizedUpgrade` (r:1 w:1)
+	/// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`)
+	/// Storage: `System::Digest` (r:1 w:1)
+	/// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1)
+	/// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1)
+	fn apply_authorized_upgrade() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `22`
+		//  Estimated: `1518`
+		// Minimum execution time: 82_314_090_000 picoseconds.
+		Weight::from_parts(83_524_781_000, 0)
+			.saturating_add(Weight::from_parts(0, 1518))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_authority_members.rs b/runtime/gtest/src/weights/pallet_authority_members.rs
new file mode 100644
index 0000000000000000000000000000000000000000..dda0da7934a32cf51fa1236f703e83df096bb8b2
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_authority_members.rs
@@ -0,0 +1,156 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_authority_members`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_authority_members`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_authority_members::WeightInfo for WeightInfo<T> {
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::Smiths` (r:1 w:0)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:0)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:0)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:0)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn go_offline() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `933`
+		//  Estimated: `4398`
+		// Minimum execution time: 25_506_000 picoseconds.
+		Weight::from_parts(26_743_000, 0)
+			.saturating_add(Weight::from_parts(0, 4398))
+			.saturating_add(T::DbWeight::get().reads(6))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::Smiths` (r:1 w:0)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Blacklist` (r:1 w:0)
+	/// Proof: `AuthorityMembers::Blacklist` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:0)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:0)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:0)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:0)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn go_online() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1389`
+		//  Estimated: `4854`
+		// Minimum execution time: 35_040_000 picoseconds.
+		Weight::from_parts(36_374_000, 0)
+			.saturating_add(Weight::from_parts(0, 4854))
+			.saturating_add(T::DbWeight::get().reads(8))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::Smiths` (r:1 w:0)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:0)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::KeyOwner` (r:4 w:0)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:0 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn set_session_keys() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1838`
+		//  Estimated: `12728`
+		// Minimum execution time: 46_278_000 picoseconds.
+		Weight::from_parts(47_799_000, 0)
+			.saturating_add(Weight::from_parts(0, 12728))
+			.saturating_add(T::DbWeight::get().reads(8))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn remove_member() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `847`
+		//  Estimated: `4312`
+		// Minimum execution time: 40_725_000 picoseconds.
+		Weight::from_parts(41_917_000, 0)
+			.saturating_add(Weight::from_parts(0, 4312))
+			.saturating_add(T::DbWeight::get().reads(6))
+			.saturating_add(T::DbWeight::get().writes(10))
+	}
+	/// Storage: `AuthorityMembers::Blacklist` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Blacklist` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn remove_member_from_blacklist() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `199`
+		//  Estimated: `1684`
+		// Minimum execution time: 9_427_000 picoseconds.
+		Weight::from_parts(9_727_000, 0)
+			.saturating_add(Weight::from_parts(0, 1684))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_babe.rs b/runtime/gtest/src/weights/pallet_babe.rs
new file mode 100644
index 0000000000000000000000000000000000000000..86185992a9c13eb63302b1206cf37cb05b47f576
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_babe.rs
@@ -0,0 +1,54 @@
+// Copyright 2021 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Manual weights for the GRANDPA Pallet in duniter runtimes
+//! This file was not auto-generated.
+
+use frame_support::{
+    traits::Get,
+    weights::{
+        constants::{WEIGHT_REF_TIME_PER_MICROS, WEIGHT_REF_TIME_PER_NANOS},
+        Weight,
+    },
+};
+use scale_info::prelude::marker::PhantomData;
+
+/// Weight functions for `pallet_babe`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_babe::WeightInfo for WeightInfo<T> {
+    fn plan_config_change() -> Weight {
+        T::DbWeight::get().writes(1)
+    }
+
+    fn report_equivocation(validator_count: u32, _p: u32) -> Weight {
+        // we take the validator set count from the membership proof to
+        // calculate the weight but we set a floor of 100 validators.
+        let validator_count = validator_count.max(100) as u64;
+
+        // checking membership proof
+        (Weight::from_parts(WEIGHT_REF_TIME_PER_MICROS, 0) * 35)
+            .saturating_add(
+                (Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS, 0) * 175)
+                    .saturating_mul(validator_count),
+            )
+            .saturating_add(T::DbWeight::get().reads(5))
+            // check equivocation proof
+            .saturating_add(Weight::from_parts(WEIGHT_REF_TIME_PER_MICROS, 0) * 110)
+            // report offence
+            .saturating_add(Weight::from_parts(WEIGHT_REF_TIME_PER_MICROS, 0) * 110)
+            .saturating_add(T::DbWeight::get().writes(3))
+    }
+}
diff --git a/runtime/gtest/src/weights/pallet_balances.rs b/runtime/gtest/src/weights/pallet_balances.rs
new file mode 100644
index 0000000000000000000000000000000000000000..2aa893c8b1b5406c3e17da32310fc522374b1b08
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_balances.rs
@@ -0,0 +1,162 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_balances`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_balances`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_balances::WeightInfo for WeightInfo<T> {
+	/// Storage: `System::Account` (r:2 w:2)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn transfer_allow_death() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `63`
+		//  Estimated: `6126`
+		// Minimum execution time: 51_390_000 picoseconds.
+		Weight::from_parts(52_727_000, 0)
+			.saturating_add(Weight::from_parts(0, 6126))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn transfer_keep_alive() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `3558`
+		// Minimum execution time: 31_503_000 picoseconds.
+		Weight::from_parts(32_601_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn force_set_balance_creating() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `134`
+		//  Estimated: `3558`
+		// Minimum execution time: 11_509_000 picoseconds.
+		Weight::from_parts(12_160_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn force_set_balance_killing() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `134`
+		//  Estimated: `3558`
+		// Minimum execution time: 17_688_000 picoseconds.
+		Weight::from_parts(18_197_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `System::Account` (r:3 w:3)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn force_transfer() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `126`
+		//  Estimated: `8694`
+		// Minimum execution time: 52_091_000 picoseconds.
+		Weight::from_parts(53_858_000, 0)
+			.saturating_add(Weight::from_parts(0, 8694))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn transfer_all() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `3558`
+		// Minimum execution time: 38_751_000 picoseconds.
+		Weight::from_parts(40_153_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn force_unreserve() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `134`
+		//  Estimated: `3558`
+		// Minimum execution time: 14_255_000 picoseconds.
+		Weight::from_parts(14_940_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	fn force_adjust_total_issuance() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 5_446_000 picoseconds.
+		Weight::from_parts(5_704_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn burn_allow_death() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `63`
+		//  Estimated: `3558`
+		// Minimum execution time: 35_659_000 picoseconds.
+		Weight::from_parts(37_184_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	fn burn_keep_alive() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 16_492_000 picoseconds.
+		Weight::from_parts(16_943_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_certification.rs b/runtime/gtest/src/weights/pallet_certification.rs
new file mode 100644
index 0000000000000000000000000000000000000000..bb03d17a8366fb87e09ae05a6d1425db1de0c218
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_certification.rs
@@ -0,0 +1,191 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_certification`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_certification`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T> {
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:2 w:2)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:2 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsRemovableOn` (r:1 w:1)
+	/// Proof: `Certification::CertsRemovableOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn add_cert() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `996`
+		//  Estimated: `6936`
+		// Minimum execution time: 39_745_000 picoseconds.
+		Weight::from_parts(41_542_000, 0)
+			.saturating_add(Weight::from_parts(0, 6936))
+			.saturating_add(T::DbWeight::get().reads(7))
+			.saturating_add(T::DbWeight::get().writes(4))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:1 w:1)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:2 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsRemovableOn` (r:1 w:1)
+	/// Proof: `Certification::CertsRemovableOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn renew_cert() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1019`
+		//  Estimated: `6959`
+		// Minimum execution time: 36_420_000 picoseconds.
+		Weight::from_parts(37_953_000, 0)
+			.saturating_add(Weight::from_parts(0, 6959))
+			.saturating_add(T::DbWeight::get().reads(6))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:2 w:2)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::CounterForMembership` (r:1 w:1)
+	/// Proof: `Membership::CounterForMembership` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `Membership::MembershipsExpireOn` (r:1 w:1)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `UniversalDividend::CurrentUdIndex` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUdIndex` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn del_cert() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `2259`
+		//  Estimated: `15624`
+		// Minimum execution time: 123_819_000 picoseconds.
+		Weight::from_parts(128_675_000, 0)
+			.saturating_add(Weight::from_parts(0, 15624))
+			.saturating_add(T::DbWeight::get().reads(20))
+			.saturating_add(T::DbWeight::get().writes(23))
+	}
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:1000 w:1000)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:0)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[2, 1000]`.
+	fn remove_all_certs_received_by(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `554 + i * (35 ±0)`
+		//  Estimated: `4018 + i * (2511 ±0)`
+		// Minimum execution time: 30_274_000 picoseconds.
+		Weight::from_parts(30_575_000, 0)
+			.saturating_add(Weight::from_parts(0, 4018))
+			// Standard Error: 25_287
+			.saturating_add(Weight::from_parts(9_157_343, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into())))
+			.saturating_add(T::DbWeight::get().writes(1))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
+			.saturating_add(Weight::from_parts(0, 2511).saturating_mul(i.into()))
+	}
+	/// Storage: `Certification::CertsRemovableOn` (r:1 w:0)
+	/// Proof: `Certification::CertsRemovableOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn on_initialize() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `138`
+		//  Estimated: `3603`
+		// Minimum execution time: 3_478_000 picoseconds.
+		Weight::from_parts(3_748_000, 0)
+			.saturating_add(Weight::from_parts(0, 3603))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_remove_cert_noop() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `275`
+		//  Estimated: `3740`
+		// Minimum execution time: 5_358_000 picoseconds.
+		Weight::from_parts(5_665_000, 0)
+			.saturating_add(Weight::from_parts(0, 3740))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:2 w:2)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:0)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_remove_cert() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `711`
+		//  Estimated: `6651`
+		// Minimum execution time: 26_707_000 picoseconds.
+		Weight::from_parts(27_498_000, 0)
+			.saturating_add(Weight::from_parts(0, 6651))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_collective.rs b/runtime/gtest/src/weights/pallet_collective.rs
new file mode 100644
index 0000000000000000000000000000000000000000..012dd241be2dee1688649e86f44407fb4fe65668
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_collective.rs
@@ -0,0 +1,302 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_collective`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_collective`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_collective::WeightInfo for WeightInfo<T> {
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Proposals` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Voting` (r:20 w:20)
+	/// Proof: `TechnicalCommittee::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Prime` (r:0 w:1)
+	/// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// The range of component `m` is `[0, 100]`.
+	/// The range of component `n` is `[0, 100]`.
+	/// The range of component `p` is `[0, 20]`.
+	fn set_members(m: u32, _n: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0 + m * (672 ±0) + p * (3191 ±0)`
+		//  Estimated: `10019 + m * (416 ±4) + p * (4183 ±23)`
+		// Minimum execution time: 12_376_000 picoseconds.
+		Weight::from_parts(12_643_000, 0)
+			.saturating_add(Weight::from_parts(0, 10019))
+			// Standard Error: 9_898
+			.saturating_add(Weight::from_parts(737_370, 0).saturating_mul(m.into()))
+			// Standard Error: 48_931
+			.saturating_add(Weight::from_parts(6_976_595, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into())))
+			.saturating_add(T::DbWeight::get().writes(2))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into())))
+			.saturating_add(Weight::from_parts(0, 416).saturating_mul(m.into()))
+			.saturating_add(Weight::from_parts(0, 4183).saturating_mul(p.into()))
+	}
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// The range of component `b` is `[2, 1024]`.
+	/// The range of component `m` is `[1, 100]`.
+	fn execute(b: u32, m: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `32 + m * (32 ±0)`
+		//  Estimated: `1518 + m * (32 ±0)`
+		// Minimum execution time: 11_272_000 picoseconds.
+		Weight::from_parts(10_600_255, 0)
+			.saturating_add(Weight::from_parts(0, 1518))
+			// Standard Error: 31
+			.saturating_add(Weight::from_parts(1_441, 0).saturating_mul(b.into()))
+			// Standard Error: 329
+			.saturating_add(Weight::from_parts(15_239, 0).saturating_mul(m.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into()))
+	}
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::ProposalOf` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `b` is `[2, 1024]`.
+	/// The range of component `m` is `[1, 100]`.
+	fn propose_execute(b: u32, m: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `32 + m * (32 ±0)`
+		//  Estimated: `3498 + m * (32 ±0)`
+		// Minimum execution time: 13_607_000 picoseconds.
+		Weight::from_parts(13_156_260, 0)
+			.saturating_add(Weight::from_parts(0, 3498))
+			// Standard Error: 45
+			.saturating_add(Weight::from_parts(1_432, 0).saturating_mul(b.into()))
+			// Standard Error: 465
+			.saturating_add(Weight::from_parts(20_427, 0).saturating_mul(m.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into()))
+	}
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::ProposalOf` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Proposals` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::ProposalCount` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::ProposalCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Voting` (r:0 w:1)
+	/// Proof: `TechnicalCommittee::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `b` is `[2, 1024]`.
+	/// The range of component `m` is `[2, 100]`.
+	/// The range of component `p` is `[1, 20]`.
+	fn propose_proposed(b: u32, m: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `24 + m * (32 ±0) + p * (55 ±0)`
+		//  Estimated: `3461 + m * (32 ±0) + p * (54 ±0)`
+		// Minimum execution time: 20_011_000 picoseconds.
+		Weight::from_parts(19_486_227, 0)
+			.saturating_add(Weight::from_parts(0, 3461))
+			// Standard Error: 82
+			.saturating_add(Weight::from_parts(2_598, 0).saturating_mul(b.into()))
+			// Standard Error: 857
+			.saturating_add(Weight::from_parts(19_157, 0).saturating_mul(m.into()))
+			// Standard Error: 4_282
+			.saturating_add(Weight::from_parts(309_826, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().writes(4))
+			.saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into()))
+			.saturating_add(Weight::from_parts(0, 54).saturating_mul(p.into()))
+	}
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Voting` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `m` is `[5, 100]`.
+	fn vote(m: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `573 + m * (64 ±0)`
+		//  Estimated: `4037 + m * (64 ±0)`
+		// Minimum execution time: 18_568_000 picoseconds.
+		Weight::from_parts(19_519_057, 0)
+			.saturating_add(Weight::from_parts(0, 4037))
+			// Standard Error: 726
+			.saturating_add(Weight::from_parts(38_988, 0).saturating_mul(m.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+			.saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into()))
+	}
+	/// Storage: `TechnicalCommittee::Voting` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Proposals` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::ProposalOf` (r:0 w:1)
+	/// Proof: `TechnicalCommittee::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `m` is `[4, 100]`.
+	/// The range of component `p` is `[1, 20]`.
+	fn close_early_disapproved(m: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `117 + m * (64 ±0) + p * (55 ±0)`
+		//  Estimated: `3591 + m * (64 ±0) + p * (55 ±0)`
+		// Minimum execution time: 22_878_000 picoseconds.
+		Weight::from_parts(21_767_323, 0)
+			.saturating_add(Weight::from_parts(0, 3591))
+			// Standard Error: 695
+			.saturating_add(Weight::from_parts(31_045, 0).saturating_mul(m.into()))
+			// Standard Error: 3_433
+			.saturating_add(Weight::from_parts(247_676, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into()))
+			.saturating_add(Weight::from_parts(0, 55).saturating_mul(p.into()))
+	}
+	/// Storage: `TechnicalCommittee::Voting` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::ProposalOf` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Proposals` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// The range of component `b` is `[2, 1024]`.
+	/// The range of component `m` is `[4, 100]`.
+	/// The range of component `p` is `[1, 20]`.
+	fn close_early_approved(b: u32, m: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `62 + b * (1 ±0) + m * (64 ±0) + p * (78 ±0)`
+		//  Estimated: `3619 + b * (1 ±0) + m * (63 ±0) + p * (74 ±0)`
+		// Minimum execution time: 31_879_000 picoseconds.
+		Weight::from_parts(30_485_161, 0)
+			.saturating_add(Weight::from_parts(0, 3619))
+			// Standard Error: 106
+			.saturating_add(Weight::from_parts(2_614, 0).saturating_mul(b.into()))
+			// Standard Error: 1_122
+			.saturating_add(Weight::from_parts(16_190, 0).saturating_mul(m.into()))
+			// Standard Error: 5_535
+			.saturating_add(Weight::from_parts(389_299, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into()))
+			.saturating_add(Weight::from_parts(0, 63).saturating_mul(m.into()))
+			.saturating_add(Weight::from_parts(0, 74).saturating_mul(p.into()))
+	}
+	/// Storage: `TechnicalCommittee::Voting` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Prime` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Proposals` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::ProposalOf` (r:0 w:1)
+	/// Proof: `TechnicalCommittee::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `m` is `[4, 100]`.
+	/// The range of component `p` is `[1, 20]`.
+	fn close_disapproved(m: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `137 + m * (64 ±0) + p * (55 ±0)`
+		//  Estimated: `3611 + m * (64 ±0) + p * (55 ±0)`
+		// Minimum execution time: 25_821_000 picoseconds.
+		Weight::from_parts(24_307_321, 0)
+			.saturating_add(Weight::from_parts(0, 3611))
+			// Standard Error: 716
+			.saturating_add(Weight::from_parts(36_140, 0).saturating_mul(m.into()))
+			// Standard Error: 3_536
+			.saturating_add(Weight::from_parts(259_384, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into()))
+			.saturating_add(Weight::from_parts(0, 55).saturating_mul(p.into()))
+	}
+	/// Storage: `TechnicalCommittee::Voting` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Members` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Prime` (r:1 w:0)
+	/// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::ProposalOf` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Proposals` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// The range of component `b` is `[2, 1024]`.
+	/// The range of component `m` is `[4, 100]`.
+	/// The range of component `p` is `[1, 20]`.
+	fn close_approved(b: u32, m: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `82 + b * (1 ±0) + m * (64 ±0) + p * (78 ±0)`
+		//  Estimated: `3639 + b * (1 ±0) + m * (63 ±0) + p * (74 ±0)`
+		// Minimum execution time: 34_024_000 picoseconds.
+		Weight::from_parts(32_357_560, 0)
+			.saturating_add(Weight::from_parts(0, 3639))
+			// Standard Error: 113
+			.saturating_add(Weight::from_parts(2_289, 0).saturating_mul(b.into()))
+			// Standard Error: 1_196
+			.saturating_add(Weight::from_parts(18_044, 0).saturating_mul(m.into()))
+			// Standard Error: 5_903
+			.saturating_add(Weight::from_parts(413_178, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(5))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into()))
+			.saturating_add(Weight::from_parts(0, 63).saturating_mul(m.into()))
+			.saturating_add(Weight::from_parts(0, 74).saturating_mul(p.into()))
+	}
+	/// Storage: `TechnicalCommittee::Proposals` (r:1 w:1)
+	/// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::Voting` (r:0 w:1)
+	/// Proof: `TechnicalCommittee::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `TechnicalCommittee::ProposalOf` (r:0 w:1)
+	/// Proof: `TechnicalCommittee::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `p` is `[1, 20]`.
+	fn disapprove_proposal(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `189 + p * (32 ±0)`
+		//  Estimated: `1674 + p * (32 ±0)`
+		// Minimum execution time: 11_437_000 picoseconds.
+		Weight::from_parts(12_439_422, 0)
+			.saturating_add(Weight::from_parts(0, 1674))
+			// Standard Error: 2_512
+			.saturating_add(Weight::from_parts(190_585, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(Weight::from_parts(0, 32).saturating_mul(p.into()))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_distance.rs b/runtime/gtest/src/weights/pallet_distance.rs
new file mode 100644
index 0000000000000000000000000000000000000000..7146b7c790553e926c9a5fb262fc6f378b8605ef
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_distance.rs
@@ -0,0 +1,252 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_distance`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_distance`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_distance::WeightInfo for WeightInfo<T> {
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::PendingEvaluationRequest` (r:1 w:1)
+	/// Proof: `Distance::PendingEvaluationRequest` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:0)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:1 w:0)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::CurrentPoolIndex` (r:1 w:0)
+	/// Proof: `Distance::CurrentPoolIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationPool2` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Balances::Holds` (r:1 w:1)
+	/// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`)
+	fn request_distance_evaluation() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1140`
+		//  Estimated: `4605`
+		// Minimum execution time: 65_498_000 picoseconds.
+		Weight::from_parts(66_940_000, 0)
+			.saturating_add(Weight::from_parts(0, 4605))
+			.saturating_add(T::DbWeight::get().reads(9))
+			.saturating_add(T::DbWeight::get().writes(4))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:2 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::PendingEvaluationRequest` (r:1 w:1)
+	/// Proof: `Distance::PendingEvaluationRequest` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:0)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:1 w:0)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::CurrentPoolIndex` (r:1 w:0)
+	/// Proof: `Distance::CurrentPoolIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationPool2` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Balances::Holds` (r:1 w:1)
+	/// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`)
+	fn request_distance_evaluation_for() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1169`
+		//  Estimated: `7109`
+		// Minimum execution time: 68_246_000 picoseconds.
+		Weight::from_parts(70_202_000, 0)
+			.saturating_add(Weight::from_parts(0, 7109))
+			.saturating_add(T::DbWeight::get().reads(10))
+			.saturating_add(T::DbWeight::get().writes(4))
+	}
+	/// Storage: `Distance::DidUpdate` (r:1 w:1)
+	/// Proof: `Distance::DidUpdate` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Authorship::Author` (r:1 w:1)
+	/// Proof: `Authorship::Author` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	/// Storage: `System::Digest` (r:1 w:0)
+	/// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::Validators` (r:1 w:0)
+	/// Proof: `Session::Validators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::CurrentPoolIndex` (r:1 w:0)
+	/// Proof: `Distance::CurrentPoolIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationPool0` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool0` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[1, 1300]`.
+	fn update_evaluation(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `401 + i * (10 ±0)`
+		//  Estimated: `1886 + i * (10 ±0)`
+		// Minimum execution time: 17_850_000 picoseconds.
+		Weight::from_parts(20_358_647, 0)
+			.saturating_add(Weight::from_parts(0, 1886))
+			// Standard Error: 76
+			.saturating_add(Weight::from_parts(110_327, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(6))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(Weight::from_parts(0, 10).saturating_mul(i.into()))
+	}
+	/// Storage: `Distance::CurrentPoolIndex` (r:1 w:0)
+	/// Proof: `Distance::CurrentPoolIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationPool0` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool0` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[1, 1300]`.
+	fn force_update_evaluation(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `139 + i * (10 ±0)`
+		//  Estimated: `1624 + i * (10 ±0)`
+		// Minimum execution time: 6_813_000 picoseconds.
+		Weight::from_parts(8_018_663, 0)
+			.saturating_add(Weight::from_parts(0, 1624))
+			// Standard Error: 349
+			.saturating_add(Weight::from_parts(112_557, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+			.saturating_add(Weight::from_parts(0, 10).saturating_mul(i.into()))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::MembershipsExpireOn` (r:2 w:2)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn force_valid_distance_status() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `572`
+		//  Estimated: `6512`
+		// Minimum execution time: 30_002_000 picoseconds.
+		Weight::from_parts(31_121_000, 0)
+			.saturating_add(Weight::from_parts(0, 6512))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+	fn on_initialize_overhead() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 98_000 picoseconds.
+		Weight::from_parts(120_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `System::ParentHash` (r:1 w:0)
+	/// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	/// Storage: `Distance::EvaluationPool2` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::PendingEvaluationRequest` (r:1 w:1)
+	/// Proof: `Distance::PendingEvaluationRequest` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Balances::Holds` (r:1 w:1)
+	/// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`)
+	/// Storage: `Identity::Identities` (r:1 w:0)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::MembershipsExpireOn` (r:2 w:2)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationBlock` (r:0 w:1)
+	/// Proof: `Distance::EvaluationBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn do_evaluation_success() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `984`
+		//  Estimated: `6924`
+		// Minimum execution time: 63_300_000 picoseconds.
+		Weight::from_parts(64_975_000, 0)
+			.saturating_add(Weight::from_parts(0, 6924))
+			.saturating_add(T::DbWeight::get().reads(9))
+			.saturating_add(T::DbWeight::get().writes(8))
+	}
+	/// Storage: `System::ParentHash` (r:1 w:0)
+	/// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	/// Storage: `Distance::EvaluationPool2` (r:1 w:1)
+	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::PendingEvaluationRequest` (r:1 w:1)
+	/// Proof: `Distance::PendingEvaluationRequest` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Balances::Holds` (r:1 w:1)
+	/// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:2)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Distance::EvaluationBlock` (r:0 w:1)
+	/// Proof: `Distance::EvaluationBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn do_evaluation_failure() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `475`
+		//  Estimated: `6126`
+		// Minimum execution time: 43_343_000 picoseconds.
+		Weight::from_parts(44_323_000, 0)
+			.saturating_add(Weight::from_parts(0, 6126))
+			.saturating_add(T::DbWeight::get().reads(6))
+			.saturating_add(T::DbWeight::get().writes(6))
+	}
+	/// Storage: `System::ParentHash` (r:1 w:0)
+	/// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	/// Storage: `Distance::EvaluationPool2` (r:1 w:0)
+	/// Proof: `Distance::EvaluationPool2` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Distance::EvaluationBlock` (r:0 w:1)
+	/// Proof: `Distance::EvaluationBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn do_evaluation_overhead() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `109`
+		//  Estimated: `1594`
+		// Minimum execution time: 3_570_000 picoseconds.
+		Weight::from_parts(3_800_000, 0)
+			.saturating_add(Weight::from_parts(0, 1594))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Distance::DidUpdate` (r:1 w:1)
+	/// Proof: `Distance::DidUpdate` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	fn on_finalize() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `133`
+		//  Estimated: `1618`
+		// Minimum execution time: 3_621_000 picoseconds.
+		Weight::from_parts(3_956_000, 0)
+			.saturating_add(Weight::from_parts(0, 1618))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_duniter_account.rs b/runtime/gtest/src/weights/pallet_duniter_account.rs
new file mode 100644
index 0000000000000000000000000000000000000000..6c9a41484b6ca75ae17c546e4272f873522952f2
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_duniter_account.rs
@@ -0,0 +1,62 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_duniter_account`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_duniter_account`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_duniter_account::WeightInfo for WeightInfo<T> {
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn unlink_identity() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `3558`
+		// Minimum execution time: 4_245_000 picoseconds.
+		Weight::from_parts(4_407_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_grandpa.rs b/runtime/gtest/src/weights/pallet_grandpa.rs
new file mode 100644
index 0000000000000000000000000000000000000000..6dae5b20f670e3859762926b0168234d44dc0d27
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_grandpa.rs
@@ -0,0 +1,55 @@
+// Copyright 2021 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Manual weights for the GRANDPA Pallet in duniter runtimes
+//! This file was not auto-generated.
+
+use frame_support::{
+    traits::Get,
+    weights::{
+        constants::{WEIGHT_REF_TIME_PER_MICROS, WEIGHT_REF_TIME_PER_NANOS},
+        Weight,
+    },
+};
+use scale_info::prelude::marker::PhantomData;
+
+/// Weight functions for `pallet_grandpa`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_grandpa::WeightInfo for WeightInfo<T> {
+    fn report_equivocation(validator_count: u32, _p: u32) -> Weight {
+        // we take the validator set count from the membership proof to
+        // calculate the weight but we set a floor of 100 validators.
+        let validator_count = validator_count.max(100) as u64;
+
+        // checking membership proof
+        (Weight::from_parts(WEIGHT_REF_TIME_PER_MICROS, 0) * 35)
+            .saturating_add(Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS, 0) * 175)
+            .saturating_mul(validator_count)
+            .saturating_add(T::DbWeight::get().reads(5))
+            // check equivocation proof
+            .saturating_add(Weight::from_parts(WEIGHT_REF_TIME_PER_MICROS, 0) * 95)
+            // report offence
+            .saturating_add(Weight::from_parts(WEIGHT_REF_TIME_PER_MICROS, 0) * 110)
+            .saturating_add(T::DbWeight::get().writes(3))
+            // fetching set id -> session index mappings
+            .saturating_add(T::DbWeight::get().reads(2))
+    }
+
+    fn note_stalled() -> Weight {
+        (Weight::from_parts(WEIGHT_REF_TIME_PER_MICROS, 0) * 3)
+            .saturating_add(T::DbWeight::get().writes(1))
+    }
+}
diff --git a/runtime/common/src/weights/pallet_identity.rs b/runtime/gtest/src/weights/pallet_identity.rs
similarity index 67%
rename from runtime/common/src/weights/pallet_identity.rs
rename to runtime/gtest/src/weights/pallet_identity.rs
index 84b2b5ffc6315a8b32a63dc8caf515403938df04..7476f6147c8c7fde50273c2ed4f85a4ead4b7dcc 100644
--- a/runtime/common/src/weights/pallet_identity.rs
+++ b/runtime/gtest/src/weights/pallet_identity.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_identity`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -34,7 +34,7 @@
 // --wasm-execution=compiled
 // --heap-pages=4096
 // --header=./file_header.txt
-// --output=./runtime/common/src/weights/
+// --output=./runtime/gtest/src/weights/
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -53,8 +53,6 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	/// Storage: `Certification::StorageIdtyCertMeta` (r:2 w:2)
 	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
-	/// Storage: `Parameters::ParametersStorage` (r:1 w:0)
-	/// Proof: `Parameters::ParametersStorage` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 	/// Storage: `System::Account` (r:1 w:1)
 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
 	/// Storage: `Identity::NextIdtyIndex` (r:1 w:1)
@@ -71,12 +69,12 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
 	fn create_identity() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1022`
-		//  Estimated: `6962`
-		// Minimum execution time: 59_993_000 picoseconds.
-		Weight::from_parts(62_040_000, 0)
-			.saturating_add(Weight::from_parts(0, 6962))
-			.saturating_add(T::DbWeight::get().reads(13))
+		//  Measured:  `1099`
+		//  Estimated: `7039`
+		// Minimum execution time: 70_942_000 picoseconds.
+		Weight::from_parts(73_952_000, 0)
+			.saturating_add(Weight::from_parts(0, 7039))
+			.saturating_add(T::DbWeight::get().reads(12))
 			.saturating_add(T::DbWeight::get().writes(12))
 	}
 	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
@@ -89,11 +87,11 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn confirm_identity() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `698`
-		//  Estimated: `6638`
-		// Minimum execution time: 27_699_000 picoseconds.
-		Weight::from_parts(28_361_000, 0)
-			.saturating_add(Weight::from_parts(0, 6638))
+		//  Measured:  `822`
+		//  Estimated: `6762`
+		// Minimum execution time: 36_149_000 picoseconds.
+		Weight::from_parts(37_423_000, 0)
+			.saturating_add(Weight::from_parts(0, 6762))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(4))
 	}
@@ -101,18 +99,20 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	/// Storage: `Identity::Identities` (r:1 w:1)
 	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:0)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 	/// Storage: `System::BlockHash` (r:1 w:0)
 	/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
 	/// Storage: `System::Account` (r:2 w:2)
 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
 	fn change_owner_key() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `723`
-		//  Estimated: `6663`
-		// Minimum execution time: 75_801_000 picoseconds.
-		Weight::from_parts(77_299_000, 0)
-			.saturating_add(Weight::from_parts(0, 6663))
-			.saturating_add(T::DbWeight::get().reads(6))
+		//  Measured:  `984`
+		//  Estimated: `6924`
+		// Minimum execution time: 84_837_000 picoseconds.
+		Weight::from_parts(86_771_000, 0)
+			.saturating_add(Weight::from_parts(0, 6924))
+			.saturating_add(T::DbWeight::get().reads(7))
 			.saturating_add(T::DbWeight::get().writes(5))
 	}
 	/// Storage: `Identity::Identities` (r:1 w:1)
@@ -127,11 +127,11 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
 	fn revoke_identity() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `664`
-		//  Estimated: `6604`
-		// Minimum execution time: 64_428_000 picoseconds.
-		Weight::from_parts(65_963_000, 0)
-			.saturating_add(Weight::from_parts(0, 6604))
+		//  Measured:  `731`
+		//  Estimated: `6671`
+		// Minimum execution time: 72_077_000 picoseconds.
+		Weight::from_parts(73_552_000, 0)
+			.saturating_add(Weight::from_parts(0, 6671))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(5))
 	}
@@ -142,11 +142,11 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 3_722_000 picoseconds.
-		Weight::from_parts(3_857_000, 0)
+		// Minimum execution time: 4_146_000 picoseconds.
+		Weight::from_parts(4_326_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
-			// Standard Error: 1_121
-			.saturating_add(Weight::from_parts(1_224_519, 0).saturating_mul(i.into()))
+			// Standard Error: 1_351
+			.saturating_add(Weight::from_parts(1_270_066, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().writes(1))
 			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
 	}
@@ -156,8 +156,8 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `104`
 		//  Estimated: `3558`
-		// Minimum execution time: 6_169_000 picoseconds.
-		Weight::from_parts(6_730_000, 0)
+		// Minimum execution time: 7_639_000 picoseconds.
+		Weight::from_parts(7_989_000, 0)
 			.saturating_add(Weight::from_parts(0, 3558))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -170,11 +170,11 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
 	fn link_account() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `403`
-		//  Estimated: `3868`
-		// Minimum execution time: 51_183_000 picoseconds.
-		Weight::from_parts(55_391_000, 0)
-			.saturating_add(Weight::from_parts(0, 3868))
+		//  Measured:  `436`
+		//  Estimated: `3901`
+		// Minimum execution time: 55_336_000 picoseconds.
+		Weight::from_parts(56_976_000, 0)
+			.saturating_add(Weight::from_parts(0, 3901))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -182,19 +182,19 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 154_000 picoseconds.
-		Weight::from_parts(175_000, 0)
+		// Minimum execution time: 87_000 picoseconds.
+		Weight::from_parts(119_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 	/// Storage: `Identity::Identities` (r:1 w:0)
 	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn do_revoke_identity_noop() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `302`
-		//  Estimated: `3767`
-		// Minimum execution time: 3_659_000 picoseconds.
-		Weight::from_parts(3_854_000, 0)
-			.saturating_add(Weight::from_parts(0, 3767))
+		//  Measured:  `360`
+		//  Estimated: `3825`
+		// Minimum execution time: 5_161_000 picoseconds.
+		Weight::from_parts(5_491_000, 0)
+			.saturating_add(Weight::from_parts(0, 3825))
 			.saturating_add(T::DbWeight::get().reads(1))
 	}
 	/// Storage: `Identity::Identities` (r:1 w:1)
@@ -209,7 +209,7 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	/// Storage: `UniversalDividend::CurrentUdIndex` (r:1 w:0)
 	/// Proof: `UniversalDividend::CurrentUdIndex` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
-	/// Storage: `SmithMembers::Smiths` (r:3 w:3)
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
 	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
 	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
@@ -229,23 +229,23 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn do_revoke_identity() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1555`
-		//  Estimated: `9970`
-		// Minimum execution time: 83_658_000 picoseconds.
-		Weight::from_parts(86_935_000, 0)
-			.saturating_add(Weight::from_parts(0, 9970))
-			.saturating_add(T::DbWeight::get().reads(16))
-			.saturating_add(T::DbWeight::get().writes(20))
+		//  Measured:  `1930`
+		//  Estimated: `15295`
+		// Minimum execution time: 111_529_000 picoseconds.
+		Weight::from_parts(115_730_000, 0)
+			.saturating_add(Weight::from_parts(0, 15295))
+			.saturating_add(T::DbWeight::get().reads(18))
+			.saturating_add(T::DbWeight::get().writes(22))
 	}
 	/// Storage: `Identity::Identities` (r:1 w:0)
 	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn do_remove_identity_noop() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `302`
-		//  Estimated: `3767`
-		// Minimum execution time: 3_550_000 picoseconds.
-		Weight::from_parts(3_691_000, 0)
-			.saturating_add(Weight::from_parts(0, 3767))
+		//  Measured:  `360`
+		//  Estimated: `3825`
+		// Minimum execution time: 5_161_000 picoseconds.
+		Weight::from_parts(5_453_000, 0)
+			.saturating_add(Weight::from_parts(0, 3825))
 			.saturating_add(T::DbWeight::get().reads(1))
 	}
 	/// Storage: `Identity::Identities` (r:1 w:1)
@@ -260,7 +260,7 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 	/// Proof: `Membership::CounterForMembership` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
 	/// Storage: `Membership::MembershipsExpireOn` (r:1 w:1)
 	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
-	/// Storage: `SmithMembers::Smiths` (r:3 w:3)
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
 	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
 	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
@@ -272,6 +272,10 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 	/// Storage: `Session::NextKeys` (r:1 w:1)
 	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:6 w:6)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	/// Storage: `Identity::IdentityIndexOf` (r:0 w:1)
 	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	/// Storage: `Quota::IdtyQuota` (r:0 w:1)
@@ -280,23 +284,81 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn do_remove_identity() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1498`
-		//  Estimated: `9913`
-		// Minimum execution time: 89_725_000 picoseconds.
-		Weight::from_parts(93_000_000, 0)
-			.saturating_add(Weight::from_parts(0, 9913))
-			.saturating_add(T::DbWeight::get().reads(15))
-			.saturating_add(T::DbWeight::get().writes(21))
+		//  Measured:  `2355`
+		//  Estimated: `18195`
+		// Minimum execution time: 159_027_000 picoseconds.
+		Weight::from_parts(164_390_000, 0)
+			.saturating_add(Weight::from_parts(0, 18195))
+			.saturating_add(T::DbWeight::get().reads(24))
+			.saturating_add(T::DbWeight::get().writes(30))
+	}
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::CounterForMembership` (r:1 w:1)
+	/// Proof: `Membership::CounterForMembership` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `Membership::MembershipsExpireOn` (r:1 w:1)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `UniversalDividend::CurrentUdIndex` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUdIndex` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:6 w:6)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Quota::IdtyQuota` (r:0 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_remove_identity_handler() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `2372`
+		//  Estimated: `18212`
+		// Minimum execution time: 155_290_000 picoseconds.
+		Weight::from_parts(160_593_000, 0)
+			.saturating_add(Weight::from_parts(0, 18212))
+			.saturating_add(T::DbWeight::get().reads(25))
+			.saturating_add(T::DbWeight::get().writes(29))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn membership_removed() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `441`
+		//  Estimated: `6381`
+		// Minimum execution time: 17_262_000 picoseconds.
+		Weight::from_parts(18_084_000, 0)
+			.saturating_add(Weight::from_parts(0, 6381))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(3))
 	}
 	/// Storage: `Identity::IdentityChangeSchedule` (r:1 w:0)
 	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn prune_identities_noop() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `157`
-		//  Estimated: `3622`
-		// Minimum execution time: 2_750_000 picoseconds.
-		Weight::from_parts(2_921_000, 0)
-			.saturating_add(Weight::from_parts(0, 3622))
+		//  Measured:  `165`
+		//  Estimated: `3630`
+		// Minimum execution time: 3_537_000 picoseconds.
+		Weight::from_parts(3_857_000, 0)
+			.saturating_add(Weight::from_parts(0, 3630))
 			.saturating_add(T::DbWeight::get().reads(1))
 	}
 	/// Storage: `Identity::IdentityChangeSchedule` (r:1 w:1)
@@ -305,11 +367,11 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn prune_identities_none() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `327`
-		//  Estimated: `3792`
-		// Minimum execution time: 6_322_000 picoseconds.
-		Weight::from_parts(6_501_000, 0)
-			.saturating_add(Weight::from_parts(0, 3792))
+		//  Measured:  `363`
+		//  Estimated: `3828`
+		// Minimum execution time: 7_992_000 picoseconds.
+		Weight::from_parts(8_540_000, 0)
+			.saturating_add(Weight::from_parts(0, 3828))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -331,11 +393,11 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
 	fn prune_identities_err() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `788`
-		//  Estimated: `4253`
-		// Minimum execution time: 33_151_000 picoseconds.
-		Weight::from_parts(34_375_000, 0)
-			.saturating_add(Weight::from_parts(0, 4253))
+		//  Measured:  `952`
+		//  Estimated: `4417`
+		// Minimum execution time: 39_299_000 picoseconds.
+		Weight::from_parts(40_659_000, 0)
+			.saturating_add(Weight::from_parts(0, 4417))
 			.saturating_add(T::DbWeight::get().reads(6))
 			.saturating_add(T::DbWeight::get().writes(7))
 	}
diff --git a/runtime/gtest/src/weights/pallet_im_online.rs b/runtime/gtest/src/weights/pallet_im_online.rs
new file mode 100644
index 0000000000000000000000000000000000000000..419068ac35bb8422c6695648f28ac7c5a050546b
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_im_online.rs
@@ -0,0 +1,74 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_im_online`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_im_online`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_im_online::WeightInfo for WeightInfo<T> {
+	/// Storage: `Session::Validators` (r:1 w:0)
+	/// Proof: `Session::Validators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::CurrentIndex` (r:1 w:0)
+	/// Proof: `Session::CurrentIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `ImOnline::Keys` (r:1 w:0)
+	/// Proof: `ImOnline::Keys` (`max_values`: Some(1), `max_size`: Some(32002), added: 32497, mode: `MaxEncodedLen`)
+	/// Storage: `ImOnline::ReceivedHeartbeats` (r:1 w:1)
+	/// Proof: `ImOnline::ReceivedHeartbeats` (`max_values`: None, `max_size`: Some(25), added: 2500, mode: `MaxEncodedLen`)
+	/// Storage: `ImOnline::AuthoredBlocks` (r:1 w:0)
+	/// Proof: `ImOnline::AuthoredBlocks` (`max_values`: None, `max_size`: Some(56), added: 2531, mode: `MaxEncodedLen`)
+	/// The range of component `k` is `[1, 1000]`.
+	fn validate_unsigned_and_then_heartbeat(k: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `525 + k * (32 ±0)`
+		//  Estimated: `33487 + k * (1761 ±0)`
+		// Minimum execution time: 54_766_000 picoseconds.
+		Weight::from_parts(60_122_996, 0)
+			.saturating_add(Weight::from_parts(0, 33487))
+			// Standard Error: 983
+			.saturating_add(Weight::from_parts(58_301, 0).saturating_mul(k.into()))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().writes(1))
+			.saturating_add(Weight::from_parts(0, 1761).saturating_mul(k.into()))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_membership.rs b/runtime/gtest/src/weights/pallet_membership.rs
new file mode 100644
index 0000000000000000000000000000000000000000..facf13502ff3777fc2233abf55b3263a13d288cb
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_membership.rs
@@ -0,0 +1,102 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_membership`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_membership`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_membership::WeightInfo for WeightInfo<T> {
+	fn on_initialize() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 84_000 picoseconds.
+		Weight::from_parts(118_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `Membership::MembershipsExpireOn` (r:2 w:2)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:3 w:3)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::CounterForMembership` (r:1 w:1)
+	/// Proof: `Membership::CounterForMembership` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `Identity::Identities` (r:3 w:3)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `UniversalDividend::CurrentUdIndex` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUdIndex` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:3 w:3)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:3 w:3)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:3 w:3)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:12)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[0, 3]`.
+	fn expire_memberships(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `139 + i * (992 ±0)`
+		//  Estimated: `15059 + i * (2695 ±0)`
+		// Minimum execution time: 5_415_000 picoseconds.
+		Weight::from_parts(15_365_773, 0)
+			.saturating_add(Weight::from_parts(0, 15059))
+			// Standard Error: 670_181
+			.saturating_add(Weight::from_parts(80_439_784, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().reads((11_u64).saturating_mul(i.into())))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(T::DbWeight::get().writes((15_u64).saturating_mul(i.into())))
+			.saturating_add(Weight::from_parts(0, 2695).saturating_mul(i.into()))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_multisig.rs b/runtime/gtest/src/weights/pallet_multisig.rs
new file mode 100644
index 0000000000000000000000000000000000000000..5ffd1b05dd100d1917dbe30d2ddb1957f0ece0bc
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_multisig.rs
@@ -0,0 +1,162 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_multisig`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_multisig`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_multisig::WeightInfo for WeightInfo<T> {
+	/// The range of component `z` is `[0, 10000]`.
+	fn as_multi_threshold_1(z: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 5_267_000 picoseconds.
+		Weight::from_parts(5_684_114, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 3
+			.saturating_add(Weight::from_parts(341, 0).saturating_mul(z.into()))
+	}
+	/// Storage: `Multisig::Multisigs` (r:1 w:1)
+	/// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(457), added: 2932, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[2, 10]`.
+	/// The range of component `z` is `[0, 10000]`.
+	fn as_multi_create(s: u32, z: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `125 + s * (5 ±0)`
+		//  Estimated: `3922`
+		// Minimum execution time: 26_846_000 picoseconds.
+		Weight::from_parts(25_885_066, 0)
+			.saturating_add(Weight::from_parts(0, 3922))
+			// Standard Error: 12_156
+			.saturating_add(Weight::from_parts(319_964, 0).saturating_mul(s.into()))
+			// Standard Error: 10
+			.saturating_add(Weight::from_parts(1_188, 0).saturating_mul(z.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Multisig::Multisigs` (r:1 w:1)
+	/// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(457), added: 2932, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[3, 10]`.
+	/// The range of component `z` is `[0, 10000]`.
+	fn as_multi_approve(s: u32, z: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `240`
+		//  Estimated: `3922`
+		// Minimum execution time: 15_901_000 picoseconds.
+		Weight::from_parts(14_520_732, 0)
+			.saturating_add(Weight::from_parts(0, 3922))
+			// Standard Error: 9_537
+			.saturating_add(Weight::from_parts(215_623, 0).saturating_mul(s.into()))
+			// Standard Error: 7
+			.saturating_add(Weight::from_parts(1_129, 0).saturating_mul(z.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Multisig::Multisigs` (r:1 w:1)
+	/// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(457), added: 2932, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[2, 10]`.
+	/// The range of component `z` is `[0, 10000]`.
+	fn as_multi_complete(s: u32, z: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `259 + s * (37 ±0)`
+		//  Estimated: `3922`
+		// Minimum execution time: 30_646_000 picoseconds.
+		Weight::from_parts(31_247_927, 0)
+			.saturating_add(Weight::from_parts(0, 3922))
+			// Standard Error: 17_061
+			.saturating_add(Weight::from_parts(55_714, 0).saturating_mul(s.into()))
+			// Standard Error: 14
+			.saturating_add(Weight::from_parts(1_136, 0).saturating_mul(z.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Multisig::Multisigs` (r:1 w:1)
+	/// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(457), added: 2932, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[2, 10]`.
+	fn approve_as_multi_create(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `130 + s * (5 ±0)`
+		//  Estimated: `3922`
+		// Minimum execution time: 24_999_000 picoseconds.
+		Weight::from_parts(27_208_681, 0)
+			.saturating_add(Weight::from_parts(0, 3922))
+			// Standard Error: 8_294
+			.saturating_add(Weight::from_parts(258_541, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Multisig::Multisigs` (r:1 w:1)
+	/// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(457), added: 2932, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[2, 10]`.
+	fn approve_as_multi_approve(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `240`
+		//  Estimated: `3922`
+		// Minimum execution time: 13_782_000 picoseconds.
+		Weight::from_parts(15_284_765, 0)
+			.saturating_add(Weight::from_parts(0, 3922))
+			// Standard Error: 7_355
+			.saturating_add(Weight::from_parts(41_174, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Multisig::Multisigs` (r:1 w:1)
+	/// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(457), added: 2932, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[2, 10]`.
+	fn cancel_as_multi(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `328 + s * (5 ±0)`
+		//  Estimated: `3922`
+		// Minimum execution time: 27_582_000 picoseconds.
+		Weight::from_parts(28_615_382, 0)
+			.saturating_add(Weight::from_parts(0, 3922))
+			// Standard Error: 7_910
+			.saturating_add(Weight::from_parts(239_904, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_oneshot_account.rs b/runtime/gtest/src/weights/pallet_oneshot_account.rs
new file mode 100644
index 0000000000000000000000000000000000000000..4d786600b1cd9c360f875355d1b79ce150b13245
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_oneshot_account.rs
@@ -0,0 +1,94 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_oneshot_account`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_oneshot_account`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_oneshot_account::WeightInfo for WeightInfo<T> {
+	/// Storage: `OneshotAccount::OneshotAccounts` (r:1 w:1)
+	/// Proof: `OneshotAccount::OneshotAccounts` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn create_oneshot_account() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `42`
+		//  Estimated: `3507`
+		// Minimum execution time: 21_832_000 picoseconds.
+		Weight::from_parts(22_728_000, 0)
+			.saturating_add(Weight::from_parts(0, 3507))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `OneshotAccount::OneshotAccounts` (r:1 w:1)
+	/// Proof: `OneshotAccount::OneshotAccounts` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::BlockHash` (r:1 w:0)
+	/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn consume_oneshot_account() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `241`
+		//  Estimated: `3706`
+		// Minimum execution time: 30_612_000 picoseconds.
+		Weight::from_parts(31_998_000, 0)
+			.saturating_add(Weight::from_parts(0, 3706))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `OneshotAccount::OneshotAccounts` (r:1 w:1)
+	/// Proof: `OneshotAccount::OneshotAccounts` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::BlockHash` (r:1 w:0)
+	/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:2)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn consume_oneshot_account_with_remaining() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `301`
+		//  Estimated: `6126`
+		// Minimum execution time: 44_470_000 picoseconds.
+		Weight::from_parts(45_865_000, 0)
+			.saturating_add(Weight::from_parts(0, 6126))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_preimage.rs b/runtime/gtest/src/weights/pallet_preimage.rs
new file mode 100644
index 0000000000000000000000000000000000000000..603cb2a21ef9a54839b2f78d9c5d4a1729fc9bda
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_preimage.rs
@@ -0,0 +1,259 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_preimage`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_preimage`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_preimage::WeightInfo for WeightInfo<T> {
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::PreimageFor` (r:0 w:1)
+	/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[0, 4194304]`.
+	fn note_preimage(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `42`
+		//  Estimated: `3548`
+		// Minimum execution time: 12_724_000 picoseconds.
+		Weight::from_parts(13_096_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			// Standard Error: 2
+			.saturating_add(Weight::from_parts(1_365, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::PreimageFor` (r:0 w:1)
+	/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[0, 4194304]`.
+	fn note_requested_preimage(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `106`
+		//  Estimated: `3548`
+		// Minimum execution time: 16_258_000 picoseconds.
+		Weight::from_parts(16_723_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			// Standard Error: 6
+			.saturating_add(Weight::from_parts(1_453, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::PreimageFor` (r:0 w:1)
+	/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[0, 4194304]`.
+	fn note_no_deposit_preimage(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `106`
+		//  Estimated: `3548`
+		// Minimum execution time: 14_500_000 picoseconds.
+		Weight::from_parts(14_812_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			// Standard Error: 2
+			.saturating_add(Weight::from_parts(1_425, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::PreimageFor` (r:0 w:1)
+	/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`)
+	fn unnote_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `172`
+		//  Estimated: `3548`
+		// Minimum execution time: 24_069_000 picoseconds.
+		Weight::from_parts(25_262_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::PreimageFor` (r:0 w:1)
+	/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`)
+	fn unnote_no_deposit_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `144`
+		//  Estimated: `3548`
+		// Minimum execution time: 25_719_000 picoseconds.
+		Weight::from_parts(27_437_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	fn request_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `172`
+		//  Estimated: `3548`
+		// Minimum execution time: 22_792_000 picoseconds.
+		Weight::from_parts(24_663_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	fn request_no_deposit_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `144`
+		//  Estimated: `3548`
+		// Minimum execution time: 14_688_000 picoseconds.
+		Weight::from_parts(16_328_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	fn request_unnoted_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `42`
+		//  Estimated: `3548`
+		// Minimum execution time: 11_006_000 picoseconds.
+		Weight::from_parts(12_822_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	fn request_requested_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `106`
+		//  Estimated: `3548`
+		// Minimum execution time: 8_902_000 picoseconds.
+		Weight::from_parts(9_526_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::PreimageFor` (r:0 w:1)
+	/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`)
+	fn unrequest_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `144`
+		//  Estimated: `3548`
+		// Minimum execution time: 22_648_000 picoseconds.
+		Weight::from_parts(25_051_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	fn unrequest_unnoted_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `106`
+		//  Estimated: `3548`
+		// Minimum execution time: 8_677_000 picoseconds.
+		Weight::from_parts(10_123_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	fn unrequest_multi_referenced_preimage() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `106`
+		//  Estimated: `3548`
+		// Minimum execution time: 8_494_000 picoseconds.
+		Weight::from_parts(9_416_000, 0)
+			.saturating_add(Weight::from_parts(0, 3548))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Preimage::StatusFor` (r:1023 w:1023)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1023 w:1023)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:0 w:1023)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	/// The range of component `n` is `[1, 1024]`.
+	fn ensure_updated(n: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0 + n * (179 ±0)`
+		//  Estimated: `990 + n * (2568 ±0)`
+		// Minimum execution time: 19_546_000 picoseconds.
+		Weight::from_parts(19_980_000, 0)
+			.saturating_add(Weight::from_parts(0, 990))
+			// Standard Error: 29_232
+			.saturating_add(Weight::from_parts(15_798_569, 0).saturating_mul(n.into()))
+			.saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(n.into())))
+			.saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(n.into())))
+			.saturating_add(Weight::from_parts(0, 2568).saturating_mul(n.into()))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_provide_randomness.rs b/runtime/gtest/src/weights/pallet_provide_randomness.rs
new file mode 100644
index 0000000000000000000000000000000000000000..7409013b980fd3137d746feeac49a1e88ffbaf97
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_provide_randomness.rs
@@ -0,0 +1,132 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_provide_randomness`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_provide_randomness`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_provide_randomness::WeightInfo for WeightInfo<T> {
+	/// Storage: `ProvideRandomness::CounterForRequestsIds` (r:1 w:1)
+	/// Proof: `ProvideRandomness::CounterForRequestsIds` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `ProvideRandomness::RequestIdProvider` (r:1 w:1)
+	/// Proof: `ProvideRandomness::RequestIdProvider` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `ProvideRandomness::RequestsIds` (r:1 w:1)
+	/// Proof: `ProvideRandomness::RequestsIds` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Babe::EpochIndex` (r:1 w:0)
+	/// Proof: `Babe::EpochIndex` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `ProvideRandomness::NexEpochHookIn` (r:1 w:0)
+	/// Proof: `ProvideRandomness::NexEpochHookIn` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `ProvideRandomness::RequestsReadyAtEpoch` (r:1 w:1)
+	/// Proof: `ProvideRandomness::RequestsReadyAtEpoch` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn request() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `298`
+		//  Estimated: `3763`
+		// Minimum execution time: 46_468_000 picoseconds.
+		Weight::from_parts(47_745_000, 0)
+			.saturating_add(Weight::from_parts(0, 3763))
+			.saturating_add(T::DbWeight::get().reads(7))
+			.saturating_add(T::DbWeight::get().writes(5))
+	}
+	/// Storage: `ProvideRandomness::RequestsReadyAtNextBlock` (r:1 w:1)
+	/// Proof: `ProvideRandomness::RequestsReadyAtNextBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Babe::AuthorVrfRandomness` (r:1 w:0)
+	/// Proof: `Babe::AuthorVrfRandomness` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`)
+	/// Storage: `ProvideRandomness::RequestsIds` (r:100 w:100)
+	/// Proof: `ProvideRandomness::RequestsIds` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `ProvideRandomness::CounterForRequestsIds` (r:1 w:1)
+	/// Proof: `ProvideRandomness::CounterForRequestsIds` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `ProvideRandomness::NexEpochHookIn` (r:1 w:1)
+	/// Proof: `ProvideRandomness::NexEpochHookIn` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[1, 100]`.
+	fn on_initialize(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `341 + i * (59 ±0)`
+		//  Estimated: `1827 + i * (2535 ±0)`
+		// Minimum execution time: 20_912_000 picoseconds.
+		Weight::from_parts(19_132_019, 0)
+			.saturating_add(Weight::from_parts(0, 1827))
+			// Standard Error: 4_824
+			.saturating_add(Weight::from_parts(5_617_957, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(4))
+			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into())))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
+			.saturating_add(Weight::from_parts(0, 2535).saturating_mul(i.into()))
+	}
+	/// Storage: `ProvideRandomness::RequestsReadyAtNextBlock` (r:1 w:0)
+	/// Proof: `ProvideRandomness::RequestsReadyAtNextBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `ProvideRandomness::NexEpochHookIn` (r:1 w:1)
+	/// Proof: `ProvideRandomness::NexEpochHookIn` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Babe::EpochIndex` (r:1 w:0)
+	/// Proof: `Babe::EpochIndex` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `ProvideRandomness::RequestsReadyAtEpoch` (r:1 w:1)
+	/// Proof: `ProvideRandomness::RequestsReadyAtEpoch` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Babe::NextRandomness` (r:1 w:0)
+	/// Proof: `Babe::NextRandomness` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	/// Storage: `Babe::EpochStart` (r:1 w:0)
+	/// Proof: `Babe::EpochStart` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `ProvideRandomness::RequestsIds` (r:100 w:100)
+	/// Proof: `ProvideRandomness::RequestsIds` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `ProvideRandomness::CounterForRequestsIds` (r:1 w:1)
+	/// Proof: `ProvideRandomness::CounterForRequestsIds` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// The range of component `i` is `[1, 100]`.
+	fn on_initialize_epoch(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `351 + i * (59 ±0)`
+		//  Estimated: `3817 + i * (2535 ±0)`
+		// Minimum execution time: 23_013_000 picoseconds.
+		Weight::from_parts(21_880_754, 0)
+			.saturating_add(Weight::from_parts(0, 3817))
+			// Standard Error: 6_890
+			.saturating_add(Weight::from_parts(5_931_426, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(7))
+			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into())))
+			.saturating_add(T::DbWeight::get().writes(3))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
+			.saturating_add(Weight::from_parts(0, 2535).saturating_mul(i.into()))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_proxy.rs b/runtime/gtest/src/weights/pallet_proxy.rs
new file mode 100644
index 0000000000000000000000000000000000000000..7c673c00a27b78b53e26d4cae061d3d04ec19db4
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_proxy.rs
@@ -0,0 +1,223 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_proxy`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_proxy`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_proxy::WeightInfo for WeightInfo<T> {
+	/// Storage: `Proxy::Proxies` (r:1 w:0)
+	/// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
+	/// The range of component `p` is `[1, 31]`.
+	fn proxy(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `157 + p * (37 ±0)`
+		//  Estimated: `4698`
+		// Minimum execution time: 13_710_000 picoseconds.
+		Weight::from_parts(15_287_032, 0)
+			.saturating_add(Weight::from_parts(0, 4698))
+			// Standard Error: 2_710
+			.saturating_add(Weight::from_parts(8_236, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Proxy::Proxies` (r:1 w:0)
+	/// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
+	/// Storage: `Proxy::Announcements` (r:1 w:1)
+	/// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2225), added: 4700, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// The range of component `a` is `[0, 31]`.
+	/// The range of component `p` is `[1, 31]`.
+	fn proxy_announced(a: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `399 + a * (68 ±0) + p * (37 ±0)`
+		//  Estimated: `5690`
+		// Minimum execution time: 32_726_000 picoseconds.
+		Weight::from_parts(33_365_088, 0)
+			.saturating_add(Weight::from_parts(0, 5690))
+			// Standard Error: 2_895
+			.saturating_add(Weight::from_parts(144_354, 0).saturating_mul(a.into()))
+			// Standard Error: 2_991
+			.saturating_add(Weight::from_parts(30_152, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Proxy::Announcements` (r:1 w:1)
+	/// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2225), added: 4700, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// The range of component `a` is `[0, 31]`.
+	/// The range of component `p` is `[1, 31]`.
+	fn remove_announcement(a: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `322 + a * (68 ±0)`
+		//  Estimated: `5690`
+		// Minimum execution time: 22_413_000 picoseconds.
+		Weight::from_parts(22_983_924, 0)
+			.saturating_add(Weight::from_parts(0, 5690))
+			// Standard Error: 1_604
+			.saturating_add(Weight::from_parts(154_154, 0).saturating_mul(a.into()))
+			// Standard Error: 1_657
+			.saturating_add(Weight::from_parts(13_201, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Proxy::Announcements` (r:1 w:1)
+	/// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2225), added: 4700, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// The range of component `a` is `[0, 31]`.
+	/// The range of component `p` is `[1, 31]`.
+	fn reject_announcement(a: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `322 + a * (68 ±0)`
+		//  Estimated: `5690`
+		// Minimum execution time: 22_094_000 picoseconds.
+		Weight::from_parts(22_965_053, 0)
+			.saturating_add(Weight::from_parts(0, 5690))
+			// Standard Error: 1_693
+			.saturating_add(Weight::from_parts(158_477, 0).saturating_mul(a.into()))
+			// Standard Error: 1_749
+			.saturating_add(Weight::from_parts(4_097, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Proxy::Proxies` (r:1 w:0)
+	/// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
+	/// Storage: `Proxy::Announcements` (r:1 w:1)
+	/// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2225), added: 4700, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// The range of component `a` is `[0, 31]`.
+	/// The range of component `p` is `[1, 31]`.
+	fn announce(a: u32, p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `331 + a * (68 ±0) + p * (37 ±0)`
+		//  Estimated: `5690`
+		// Minimum execution time: 29_825_000 picoseconds.
+		Weight::from_parts(30_033_262, 0)
+			.saturating_add(Weight::from_parts(0, 5690))
+			// Standard Error: 1_985
+			.saturating_add(Weight::from_parts(143_475, 0).saturating_mul(a.into()))
+			// Standard Error: 2_051
+			.saturating_add(Weight::from_parts(44_342, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Proxy::Proxies` (r:1 w:1)
+	/// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
+	/// The range of component `p` is `[1, 31]`.
+	fn add_proxy(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `157 + p * (37 ±0)`
+		//  Estimated: `4698`
+		// Minimum execution time: 21_216_000 picoseconds.
+		Weight::from_parts(22_204_435, 0)
+			.saturating_add(Weight::from_parts(0, 4698))
+			// Standard Error: 2_215
+			.saturating_add(Weight::from_parts(40_720, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Proxy::Proxies` (r:1 w:1)
+	/// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
+	/// The range of component `p` is `[1, 31]`.
+	fn remove_proxy(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `157 + p * (37 ±0)`
+		//  Estimated: `4698`
+		// Minimum execution time: 20_845_000 picoseconds.
+		Weight::from_parts(22_402_298, 0)
+			.saturating_add(Weight::from_parts(0, 4698))
+			// Standard Error: 2_097
+			.saturating_add(Weight::from_parts(40_366, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Proxy::Proxies` (r:1 w:1)
+	/// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
+	/// The range of component `p` is `[1, 31]`.
+	fn remove_proxies(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `157 + p * (37 ±0)`
+		//  Estimated: `4698`
+		// Minimum execution time: 19_314_000 picoseconds.
+		Weight::from_parts(20_557_819, 0)
+			.saturating_add(Weight::from_parts(0, 4698))
+			// Standard Error: 1_961
+			.saturating_add(Weight::from_parts(24_604, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Proxy::Proxies` (r:1 w:1)
+	/// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
+	/// The range of component `p` is `[1, 31]`.
+	fn create_pure(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `177`
+		//  Estimated: `4698`
+		// Minimum execution time: 21_998_000 picoseconds.
+		Weight::from_parts(23_614_152, 0)
+			.saturating_add(Weight::from_parts(0, 4698))
+			// Standard Error: 1_659
+			.saturating_add(Weight::from_parts(4_360, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Proxy::Proxies` (r:1 w:1)
+	/// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
+	/// The range of component `p` is `[0, 30]`.
+	fn kill_pure(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `194 + p * (37 ±0)`
+		//  Estimated: `4698`
+		// Minimum execution time: 19_894_000 picoseconds.
+		Weight::from_parts(21_021_613, 0)
+			.saturating_add(Weight::from_parts(0, 4698))
+			// Standard Error: 1_681
+			.saturating_add(Weight::from_parts(28_650, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/common/src/weights/pallet_quota.rs b/runtime/gtest/src/weights/pallet_quota.rs
similarity index 87%
rename from runtime/common/src/weights/pallet_quota.rs
rename to runtime/gtest/src/weights/pallet_quota.rs
index 39bef3af846e43b03ff5acc1d88eece6932dea42..a19434338f137940cad43be114192b8f6798ea03 100644
--- a/runtime/common/src/weights/pallet_quota.rs
+++ b/runtime/gtest/src/weights/pallet_quota.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_quota`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
+//! DATE: 2024-05-13, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -53,8 +53,8 @@ impl<T: frame_system::Config> pallet_quota::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `11288`
 		//  Estimated: `12751`
-		// Minimum execution time: 7_600_000 picoseconds.
-		Weight::from_parts(7_758_000, 0)
+		// Minimum execution time: 7_146_000 picoseconds.
+		Weight::from_parts(7_473_000, 0)
 			.saturating_add(Weight::from_parts(0, 12751))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -65,8 +65,8 @@ impl<T: frame_system::Config> pallet_quota::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `139`
 		//  Estimated: `3489`
-		// Minimum execution time: 4_705_000 picoseconds.
-		Weight::from_parts(4_974_000, 0)
+		// Minimum execution time: 4_469_000 picoseconds.
+		Weight::from_parts(4_731_000, 0)
 			.saturating_add(Weight::from_parts(0, 3489))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -79,8 +79,8 @@ impl<T: frame_system::Config> pallet_quota::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `202`
 		//  Estimated: `6126`
-		// Minimum execution time: 22_910_000 picoseconds.
-		Weight::from_parts(23_707_000, 0)
+		// Minimum execution time: 21_893_000 picoseconds.
+		Weight::from_parts(22_789_000, 0)
 			.saturating_add(Weight::from_parts(0, 6126))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -93,8 +93,8 @@ impl<T: frame_system::Config> pallet_quota::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `202`
 		//  Estimated: `6126`
-		// Minimum execution time: 21_986_000 picoseconds.
-		Weight::from_parts(23_378_000, 0)
+		// Minimum execution time: 21_581_000 picoseconds.
+		Weight::from_parts(22_465_000, 0)
 			.saturating_add(Weight::from_parts(0, 6126))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -105,8 +105,8 @@ impl<T: frame_system::Config> pallet_quota::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `43`
 		//  Estimated: `12751`
-		// Minimum execution time: 1_814_000 picoseconds.
-		Weight::from_parts(1_923_000, 0)
+		// Minimum execution time: 1_759_000 picoseconds.
+		Weight::from_parts(1_953_000, 0)
 			.saturating_add(Weight::from_parts(0, 12751))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -122,11 +122,11 @@ impl<T: frame_system::Config> pallet_quota::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `227 + i * (44 ±0)`
 		//  Estimated: `12751`
-		// Minimum execution time: 24_570_000 picoseconds.
-		Weight::from_parts(38_679_473, 0)
+		// Minimum execution time: 25_323_000 picoseconds.
+		Weight::from_parts(39_142_016, 0)
 			.saturating_add(Weight::from_parts(0, 12751))
-			// Standard Error: 1_905
-			.saturating_add(Weight::from_parts(1_219_186, 0).saturating_mul(i.into()))
+			// Standard Error: 2_270
+			.saturating_add(Weight::from_parts(1_181_628, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(3))
 	}
diff --git a/runtime/gtest/src/weights/pallet_scheduler.rs b/runtime/gtest/src/weights/pallet_scheduler.rs
new file mode 100644
index 0000000000000000000000000000000000000000..dfa675aae6e4573c7d72c729f95ce039cbca8ca6
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_scheduler.rs
@@ -0,0 +1,286 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_scheduler`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_scheduler`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
+	/// Storage: `Scheduler::IncompleteSince` (r:1 w:1)
+	/// Proof: `Scheduler::IncompleteSince` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	fn service_agendas_base() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `30`
+		//  Estimated: `1489`
+		// Minimum execution time: 3_463_000 picoseconds.
+		Weight::from_parts(3_671_000, 0)
+			.saturating_add(Weight::from_parts(0, 1489))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Scheduler::Agenda` (r:1 w:1)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[0, 50]`.
+	fn service_agenda_base(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `77 + s * (177 ±0)`
+		//  Estimated: `13928`
+		// Minimum execution time: 3_509_000 picoseconds.
+		Weight::from_parts(7_049_506, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			// Standard Error: 1_914
+			.saturating_add(Weight::from_parts(284_635, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	fn service_task_base() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 2_626_000 picoseconds.
+		Weight::from_parts(2_866_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `Preimage::PreimageFor` (r:1 w:1)
+	/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::StatusFor` (r:1 w:0)
+	/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(83), added: 2558, mode: `MaxEncodedLen`)
+	/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
+	/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[128, 4194304]`.
+	fn service_task_fetched(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `179 + s * (1 ±0)`
+		//  Estimated: `4197809`
+		// Minimum execution time: 17_064_000 picoseconds.
+		Weight::from_parts(17_408_000, 0)
+			.saturating_add(Weight::from_parts(0, 4197809))
+			// Standard Error: 3
+			.saturating_add(Weight::from_parts(1_005, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Scheduler::Lookup` (r:0 w:1)
+	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
+	fn service_task_named() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 4_188_000 picoseconds.
+		Weight::from_parts(4_405_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	fn service_task_periodic() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 2_692_000 picoseconds.
+		Weight::from_parts(2_909_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	fn execute_dispatch_signed() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 1_728_000 picoseconds.
+		Weight::from_parts(1_893_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	fn execute_dispatch_unsigned() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 1_791_000 picoseconds.
+		Weight::from_parts(1_968_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `Scheduler::Agenda` (r:1 w:1)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[0, 49]`.
+	fn schedule(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `77 + s * (177 ±0)`
+		//  Estimated: `13928`
+		// Minimum execution time: 8_797_000 picoseconds.
+		Weight::from_parts(13_159_595, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			// Standard Error: 3_051
+			.saturating_add(Weight::from_parts(296_131, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Scheduler::Agenda` (r:1 w:1)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Lookup` (r:0 w:1)
+	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[1, 50]`.
+	fn cancel(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `77 + s * (177 ±0)`
+		//  Estimated: `13928`
+		// Minimum execution time: 15_562_000 picoseconds.
+		Weight::from_parts(16_829_049, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			// Standard Error: 3_042
+			.saturating_add(Weight::from_parts(447_743, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+	/// Storage: `Scheduler::Lookup` (r:1 w:1)
+	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Agenda` (r:1 w:1)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[0, 49]`.
+	fn schedule_named(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `254 + s * (185 ±0)`
+		//  Estimated: `13928`
+		// Minimum execution time: 11_493_000 picoseconds.
+		Weight::from_parts(17_526_041, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			// Standard Error: 4_961
+			.saturating_add(Weight::from_parts(363_991, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Scheduler::Lookup` (r:1 w:1)
+	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Agenda` (r:1 w:1)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[1, 50]`.
+	fn cancel_named(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `280 + s * (185 ±0)`
+		//  Estimated: `13928`
+		// Minimum execution time: 16_069_000 picoseconds.
+		Weight::from_parts(19_363_902, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			// Standard Error: 3_274
+			.saturating_add(Weight::from_parts(514_442, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+	/// Storage: `Scheduler::Agenda` (r:1 w:1)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	/// The range of component `s` is `[1, 50]`.
+	fn schedule_retry(s: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `117`
+		//  Estimated: `13928`
+		// Minimum execution time: 8_660_000 picoseconds.
+		Weight::from_parts(9_215_947, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			// Standard Error: 2_872
+			.saturating_add(Weight::from_parts(46_735, 0).saturating_mul(s.into()))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Scheduler::Agenda` (r:1 w:0)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	fn set_retry() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `8927`
+		//  Estimated: `13928`
+		// Minimum execution time: 22_897_000 picoseconds.
+		Weight::from_parts(23_591_000, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Scheduler::Lookup` (r:1 w:0)
+	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Agenda` (r:1 w:0)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	fn set_retry_named() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `9605`
+		//  Estimated: `13928`
+		// Minimum execution time: 30_176_000 picoseconds.
+		Weight::from_parts(31_277_000, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Scheduler::Agenda` (r:1 w:0)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	fn cancel_retry() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `8939`
+		//  Estimated: `13928`
+		// Minimum execution time: 21_404_000 picoseconds.
+		Weight::from_parts(22_550_000, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Scheduler::Lookup` (r:1 w:0)
+	/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Agenda` (r:1 w:0)
+	/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(10463), added: 12938, mode: `MaxEncodedLen`)
+	/// Storage: `Scheduler::Retries` (r:0 w:1)
+	/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
+	fn cancel_retry_named() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `9617`
+		//  Estimated: `13928`
+		// Minimum execution time: 29_187_000 picoseconds.
+		Weight::from_parts(30_503_000, 0)
+			.saturating_add(Weight::from_parts(0, 13928))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_session.rs b/runtime/gtest/src/weights/pallet_session.rs
new file mode 100644
index 0000000000000000000000000000000000000000..a72fdfa3a1f65562537cb758bcbb1aee4381855c
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_session.rs
@@ -0,0 +1,78 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_session`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_session`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_session::WeightInfo for WeightInfo<T> {
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::KeyOwner` (r:4 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn set_keys() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `810`
+		//  Estimated: `11700`
+		// Minimum execution time: 29_037_000 picoseconds.
+		Weight::from_parts(30_485_000, 0)
+			.saturating_add(Weight::from_parts(0, 11700))
+			.saturating_add(T::DbWeight::get().reads(5))
+			.saturating_add(T::DbWeight::get().writes(5))
+	}
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn purge_keys() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `477`
+		//  Estimated: `3942`
+		// Minimum execution time: 17_184_000 picoseconds.
+		Weight::from_parts(18_010_000, 0)
+			.saturating_add(Weight::from_parts(0, 3942))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(5))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_smith_members.rs b/runtime/gtest/src/weights/pallet_smith_members.rs
new file mode 100644
index 0000000000000000000000000000000000000000..d9f404f12204bc79b7c04bc61b4aa6f0b7e80ea5
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_smith_members.rs
@@ -0,0 +1,139 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_smith_members`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_smith_members`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_smith_members::WeightInfo for WeightInfo<T> {
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::Smiths` (r:2 w:1)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:0)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::CurrentSession` (r:1 w:0)
+	/// Proof: `SmithMembers::CurrentSession` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::ExpiresOn` (r:1 w:1)
+	/// Proof: `SmithMembers::ExpiresOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn invite_smith() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `834`
+		//  Estimated: `6774`
+		// Minimum execution time: 32_989_000 picoseconds.
+		Weight::from_parts(33_693_000, 0)
+			.saturating_add(Weight::from_parts(0, 6774))
+			.saturating_add(T::DbWeight::get().reads(6))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::Smiths` (r:1 w:1)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn accept_invitation() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `599`
+		//  Estimated: `4064`
+		// Minimum execution time: 18_137_000 picoseconds.
+		Weight::from_parts(18_925_000, 0)
+			.saturating_add(Weight::from_parts(0, 4064))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::Smiths` (r:2 w:2)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::CurrentSession` (r:1 w:0)
+	/// Proof: `SmithMembers::CurrentSession` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `SmithMembers::ExpiresOn` (r:1 w:1)
+	/// Proof: `SmithMembers::ExpiresOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn certify_smith() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `644`
+		//  Estimated: `6584`
+		// Minimum execution time: 28_333_000 picoseconds.
+		Weight::from_parts(29_552_000, 0)
+			.saturating_add(Weight::from_parts(0, 6584))
+			.saturating_add(T::DbWeight::get().reads(5))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
+	/// Storage: `SmithMembers::Smiths` (r:5 w:5)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn on_removed_wot_member() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1204`
+		//  Estimated: `14569`
+		// Minimum execution time: 69_835_000 picoseconds.
+		Weight::from_parts(72_527_000, 0)
+			.saturating_add(Weight::from_parts(0, 14569))
+			.saturating_add(T::DbWeight::get().reads(11))
+			.saturating_add(T::DbWeight::get().writes(15))
+	}
+	/// Storage: `SmithMembers::Smiths` (r:1 w:0)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn on_removed_wot_member_empty() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `253`
+		//  Estimated: `3718`
+		// Minimum execution time: 4_036_000 picoseconds.
+		Weight::from_parts(4_297_000, 0)
+			.saturating_add(Weight::from_parts(0, 3718))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_sudo.rs b/runtime/gtest/src/weights/pallet_sudo.rs
new file mode 100644
index 0000000000000000000000000000000000000000..091a4492dfeb819ec8d883e823cc9ec65ba6abd1
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_sudo.rs
@@ -0,0 +1,96 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_sudo`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_sudo`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_sudo::WeightInfo for WeightInfo<T> {
+	/// Storage: `Sudo::Key` (r:1 w:1)
+	/// Proof: `Sudo::Key` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	fn set_key() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `165`
+		//  Estimated: `1517`
+		// Minimum execution time: 8_726_000 picoseconds.
+		Weight::from_parts(9_221_000, 0)
+			.saturating_add(Weight::from_parts(0, 1517))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `Sudo::Key` (r:1 w:0)
+	/// Proof: `Sudo::Key` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	fn sudo() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `165`
+		//  Estimated: `1517`
+		// Minimum execution time: 9_469_000 picoseconds.
+		Weight::from_parts(9_748_000, 0)
+			.saturating_add(Weight::from_parts(0, 1517))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Sudo::Key` (r:1 w:0)
+	/// Proof: `Sudo::Key` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	fn sudo_as() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `165`
+		//  Estimated: `1517`
+		// Minimum execution time: 9_524_000 picoseconds.
+		Weight::from_parts(9_868_000, 0)
+			.saturating_add(Weight::from_parts(0, 1517))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Sudo::Key` (r:1 w:1)
+	/// Proof: `Sudo::Key` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`)
+	fn remove_key() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `165`
+		//  Estimated: `1517`
+		// Minimum execution time: 8_336_000 picoseconds.
+		Weight::from_parts(8_814_000, 0)
+			.saturating_add(Weight::from_parts(0, 1517))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_timestamp.rs b/runtime/gtest/src/weights/pallet_timestamp.rs
new file mode 100644
index 0000000000000000000000000000000000000000..eee39fb0cfcf654987e1b7046812128066f78138
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_timestamp.rs
@@ -0,0 +1,74 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_timestamp`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_timestamp`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_timestamp::WeightInfo for WeightInfo<T> {
+	/// Storage: `Timestamp::Now` (r:1 w:1)
+	/// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `Babe::CurrentSlot` (r:1 w:0)
+	/// Proof: `Babe::CurrentSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `UniversalDividend::NextUd` (r:1 w:1)
+	/// Proof: `UniversalDividend::NextUd` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	fn set() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `268`
+		//  Estimated: `1493`
+		// Minimum execution time: 12_196_000 picoseconds.
+		Weight::from_parts(12_802_000, 0)
+			.saturating_add(Weight::from_parts(0, 1493))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	fn on_finalize() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `57`
+		//  Estimated: `0`
+		// Minimum execution time: 3_655_000 picoseconds.
+		Weight::from_parts(3_893_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_treasury.rs b/runtime/gtest/src/weights/pallet_treasury.rs
new file mode 100644
index 0000000000000000000000000000000000000000..ef635227ba7dc060107967dd751b31f526c78702
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_treasury.rs
@@ -0,0 +1,129 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_treasury`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_treasury`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_treasury::WeightInfo for WeightInfo<T> {
+	fn spend_local() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 0_000 picoseconds.
+		Weight::from_parts(0, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `Treasury::Approvals` (r:1 w:0)
+	/// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`)
+	fn remove_approval() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `6`
+		//  Estimated: `1887`
+		// Minimum execution time: 3_457_000 picoseconds.
+		Weight::from_parts(3_756_000, 0)
+			.saturating_add(Weight::from_parts(0, 1887))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `System::Account` (r:1 w:0)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Treasury::Deactivated` (r:1 w:1)
+	/// Proof: `Treasury::Deactivated` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `Treasury::Approvals` (r:1 w:1)
+	/// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`)
+	/// The range of component `p` is `[0, 99]`.
+	fn on_initialize_proposals(p: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `82 + p * (1 ±0)`
+		//  Estimated: `3558`
+		// Minimum execution time: 16_086_000 picoseconds.
+		Weight::from_parts(17_734_437, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			// Standard Error: 1_002
+			.saturating_add(Weight::from_parts(20_080, 0).saturating_mul(p.into()))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	fn spend() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 0_000 picoseconds.
+		Weight::from_parts(0, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// Storage: `Treasury::Spends` (r:1 w:0)
+	/// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(61), added: 2536, mode: `MaxEncodedLen`)
+	fn payout() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `6`
+		//  Estimated: `3526`
+		// Minimum execution time: 4_707_000 picoseconds.
+		Weight::from_parts(5_449_000, 0)
+			.saturating_add(Weight::from_parts(0, 3526))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Treasury::Spends` (r:1 w:0)
+	/// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(61), added: 2536, mode: `MaxEncodedLen`)
+	fn check_status() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `6`
+		//  Estimated: `3526`
+		// Minimum execution time: 4_567_000 picoseconds.
+		Weight::from_parts(4_834_000, 0)
+			.saturating_add(Weight::from_parts(0, 3526))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+	/// Storage: `Treasury::Spends` (r:1 w:0)
+	/// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(61), added: 2536, mode: `MaxEncodedLen`)
+	fn void_spend() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `6`
+		//  Estimated: `3526`
+		// Minimum execution time: 3_928_000 picoseconds.
+		Weight::from_parts(4_244_000, 0)
+			.saturating_add(Weight::from_parts(0, 3526))
+			.saturating_add(T::DbWeight::get().reads(1))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_universal_dividend.rs b/runtime/gtest/src/weights/pallet_universal_dividend.rs
new file mode 100644
index 0000000000000000000000000000000000000000..0ec9d472efdae7c1c6a8f246e7140f1e5703bbfc
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_universal_dividend.rs
@@ -0,0 +1,118 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_universal_dividend`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_universal_dividend`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_universal_dividend::WeightInfo for WeightInfo<T> {
+	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
+	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `UniversalDividend::CurrentUdIndex` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUdIndex` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
+	/// Storage: `UniversalDividend::PastReevals` (r:1 w:0)
+	/// Proof: `UniversalDividend::PastReevals` (`max_values`: Some(1), `max_size`: Some(1602), added: 2097, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// The range of component `i` is `[1, 160]`.
+	fn claim_uds(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `709`
+		//  Estimated: `4174`
+		// Minimum execution time: 36_468_000 picoseconds.
+		Weight::from_parts(38_417_396, 0)
+			.saturating_add(Weight::from_parts(0, 4174))
+			// Standard Error: 426
+			.saturating_add(Weight::from_parts(296, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(5))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `UniversalDividend::CurrentUd` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUd` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:2 w:2)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn transfer_ud() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `156`
+		//  Estimated: `6126`
+		// Minimum execution time: 55_112_000 picoseconds.
+		Weight::from_parts(56_941_000, 0)
+			.saturating_add(Weight::from_parts(0, 6126))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `UniversalDividend::CurrentUd` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUd` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	fn transfer_ud_keep_alive() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `93`
+		//  Estimated: `3558`
+		// Minimum execution time: 35_056_000 picoseconds.
+		Weight::from_parts(35_708_000, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+	/// Storage: `UniversalDividend::CurrentUdIndex` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUdIndex` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
+	/// Storage: `UniversalDividend::PastReevals` (r:1 w:0)
+	/// Proof: `UniversalDividend::PastReevals` (`max_values`: Some(1), `max_size`: Some(1602), added: 2097, mode: `MaxEncodedLen`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// The range of component `i` is `[1, 160]`.
+	fn on_removed_member(_i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `181`
+		//  Estimated: `3558`
+		// Minimum execution time: 20_041_000 picoseconds.
+		Weight::from_parts(21_282_567, 0)
+			.saturating_add(Weight::from_parts(0, 3558))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_upgrade_origin.rs b/runtime/gtest/src/weights/pallet_upgrade_origin.rs
new file mode 100644
index 0000000000000000000000000000000000000000..4ddc86d362f4513bcbbb60938759b969d3d2896b
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_upgrade_origin.rs
@@ -0,0 +1,58 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_upgrade_origin`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_upgrade_origin`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_upgrade_origin::WeightInfo for WeightInfo<T> {
+	fn dispatch_as_root() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 5_600_000 picoseconds.
+		Weight::from_parts(5_916_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+}
diff --git a/runtime/gtest/src/weights/pallet_utility.rs b/runtime/gtest/src/weights/pallet_utility.rs
new file mode 100644
index 0000000000000000000000000000000000000000..e11fbe310c19773f26f7f0efa8df2dba6a805a43
--- /dev/null
+++ b/runtime/gtest/src/weights/pallet_utility.rs
@@ -0,0 +1,99 @@
+// Copyright 2021-2022 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+//! Autogenerated weights for `pallet_utility`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
+
+// Executed Command:
+// target/release/duniter
+// benchmark
+// pallet
+// --chain=dev
+// --steps=50
+// --repeat=20
+// --pallet=*
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --header=./file_header.txt
+// --output=./runtime/gtest/src/weights/
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(missing_docs)]
+
+use frame_support::{traits::Get, weights::Weight};
+use core::marker::PhantomData;
+
+/// Weight functions for `pallet_utility`.
+pub struct WeightInfo<T>(PhantomData<T>);
+impl<T: frame_system::Config> pallet_utility::WeightInfo for WeightInfo<T> {
+	/// The range of component `c` is `[0, 1000]`.
+	fn batch(c: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 4_340_000 picoseconds.
+		Weight::from_parts(10_881_678, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 3_495
+			.saturating_add(Weight::from_parts(2_130_340, 0).saturating_mul(c.into()))
+	}
+	fn as_derivative() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 3_514_000 picoseconds.
+		Weight::from_parts(3_752_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// The range of component `c` is `[0, 1000]`.
+	fn batch_all(c: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 4_271_000 picoseconds.
+		Weight::from_parts(4_474_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 5_044
+			.saturating_add(Weight::from_parts(2_366_208, 0).saturating_mul(c.into()))
+	}
+	fn dispatch_as() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 6_168_000 picoseconds.
+		Weight::from_parts(6_294_000, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+	}
+	/// The range of component `c` is `[0, 1000]`.
+	fn force_batch(c: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 4_775_000 picoseconds.
+		Weight::from_parts(2_181_970, 0)
+			.saturating_add(Weight::from_parts(0, 0))
+			// Standard Error: 3_201
+			.saturating_add(Weight::from_parts(2_208_771, 0).saturating_mul(c.into()))
+	}
+}
diff --git a/runtime/gtest/src/weights/paritydb_weights.rs b/runtime/gtest/src/weights/paritydb_weights.rs
new file mode 100644
index 0000000000000000000000000000000000000000..768ed41d4d8288f37e50bc4f10a5c82f404e171b
--- /dev/null
+++ b/runtime/gtest/src/weights/paritydb_weights.rs
@@ -0,0 +1,95 @@
+
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0
+//! DATE: 2024-09-28 (Y/M/D)
+//! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
+//!
+//! DATABASE: `ParityDb`, RUNTIME: `ĞTest Local Testnet`
+//! BLOCK-NUM: `BlockId::Number(0)`
+//! SKIP-WRITE: `false`, SKIP-READ: `false`, WARMUPS: `1`
+//! STATE-VERSION: `V1`, STATE-CACHE-SIZE: ``
+//! WEIGHT-PATH: `./runtime/gtest/src/weights/`
+//! METRIC: `Average`, WEIGHT-MUL: `2.0`, WEIGHT-ADD: `0`
+
+// Executed Command:
+//   target/release/duniter
+//   benchmark
+//   storage
+//   --chain=dev
+//   --mul=2
+//   --weight-path=./runtime/gtest/src/weights/
+//   --state-version=1
+//   --database=paritydb
+
+/// Storage DB weights for the `ĞTest Local Testnet` runtime and `ParityDb`.
+pub mod constants {
+	use frame_support::weights::constants;
+	use sp_core::parameter_types;
+	use sp_weights::RuntimeDbWeight;
+
+	parameter_types! {
+		/// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights
+		/// are available for brave runtime engineers who may want to try this out as default.
+		pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight {
+			/// Time to read one storage item.
+			/// Calculated by multiplying the *Average* of all values with `2.0` and adding `0`.
+			///
+			/// Stats nanoseconds:
+			///   Min, Max: 789, 1_126_624
+			///   Average:  8_769
+			///   Median:   1_445
+			///   Std-Dev:  89219.22
+			///
+			/// Percentiles nanoseconds:
+			///   99th: 11_009
+			///   95th: 2_958
+			///   75th: 1_818
+			read: 17_538 * constants::WEIGHT_REF_TIME_PER_NANOS,
+
+			/// Time to write one storage item.
+			/// Calculated by multiplying the *Average* of all values with `2.0` and adding `0`.
+			///
+			/// Stats nanoseconds:
+			///   Min, Max: 4_023, 6_748_346
+			///   Average:  52_716
+			///   Median:   10_128
+			///   Std-Dev:  534378.34
+			///
+			/// Percentiles nanoseconds:
+			///   99th: 23_199
+			///   95th: 14_827
+			///   75th: 12_323
+			write: 105_432 * constants::WEIGHT_REF_TIME_PER_NANOS,
+		};
+	}
+
+	#[cfg(test)]
+	mod test_db_weights {
+		use super::constants::ParityDbWeight as W;
+		use sp_weights::constants;
+
+		/// Checks that all weights exist and have sane values.
+		// NOTE: If this test fails but you are sure that the generated values are fine,
+		// you can delete it.
+		#[test]
+		fn bound() {
+			// At least 1 µs.
+			assert!(
+				W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS,
+				"Read weight should be at least 1 µs."
+			);
+			assert!(
+				W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS,
+				"Write weight should be at least 1 µs."
+			);
+			// At most 1 ms.
+			assert!(
+				W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS,
+				"Read weight should be at most 1 ms."
+			);
+			assert!(
+				W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS,
+				"Write weight should be at most 1 ms."
+			);
+		}
+	}
+}
diff --git a/rust-toolchain.toml b/rust-toolchain.toml
index 259cec803ea4691f467d1a1f4c489c0102725d6b..4cde813dc4f7acd67e02d9f5548cff21df5cc354 100644
--- a/rust-toolchain.toml
+++ b/rust-toolchain.toml
@@ -1,5 +1,5 @@
 [toolchain]
-channel = "nightly-2024-02-08"
+channel = "nightly-2024-06-30"
 components = [ "rustfmt", "clippy", "rust-std", "cargo", "rust-src" ]
 targets = [ "wasm32-unknown-unknown" ]
 profile = "minimal"
diff --git a/rustfmt.toml b/rustfmt.toml
index b7ac0b7277d257f2401ec6ef04d6b8ef88ba6c5c..793ece8dbcdab0bd62adbc1a5e5b9f4100d1fce2 100644
--- a/rustfmt.toml
+++ b/rustfmt.toml
@@ -1 +1,3 @@
+imports_granularity = "Crate"
 reorder_impl_items = true
+error_on_unformatted = true
diff --git a/scripts/build-deb.sh b/scripts/build-deb.sh
new file mode 100755
index 0000000000000000000000000000000000000000..bbe52821b6b30a0879702589ea4700b78ee4b107
--- /dev/null
+++ b/scripts/build-deb.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+cd "$(dirname "$0")"
+docker buildx build -t build_deb --file ../docker/build-deb.Dockerfile ../
+id=$(docker create build_deb)
+docker cp $id:/app/debian/ ../target
diff --git a/scripts/run_all_benchmarks.sh b/scripts/run_all_benchmarks.sh
index 01ec0fe5deecb190c8a5412b78548505723839cd..0587e0d3237bdb6c93df15bc57e43f69dc983093 100755
--- a/scripts/run_all_benchmarks.sh
+++ b/scripts/run_all_benchmarks.sh
@@ -1,5 +1,8 @@
-cargo build --release --features runtime-benchmarks
-target/release/duniter benchmark storage --chain=dev --mul=2 --weight-path=./runtime/common/src/weights/ --state-version=1
-target/release/duniter benchmark overhead --chain=dev --wasm-execution=compiled --weight-path=./runtime/common/src/weights/ --warmup=10 --repeat=100
-target/release/duniter benchmark pallet --chain=dev --steps=50 --repeat=20 --pallet="*" --extrinsic="*" --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/common/src/weights/
-
+set -e
+for chain in g1 gtest gdev
+do
+  cargo build --release --no-default-features --features runtime-benchmarks,$chain
+  target/release/duniter benchmark storage --chain=dev --mul=2 --weight-path=./runtime/$chain/src/weights/ --state-version=1 --database=paritydb
+  target/release/duniter benchmark overhead --chain=dev --wasm-execution=compiled --weight-path=./runtime/$chain/src/weights/ --warmup=10 --repeat=100
+  target/release/duniter benchmark pallet --genesis-builder=spec-genesis --steps=50 --repeat=20 --pallet="*" --extrinsic="*" --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/$chain/src/weights/
+done
diff --git a/xtask/README.md b/xtask/README.md
index f9ee2d8980e7a608e5545c22b9a82011085c6864..c0f5fd5a895fc8d8f3524cb3c35750be7f9c3579 100644
--- a/xtask/README.md
+++ b/xtask/README.md
@@ -15,9 +15,11 @@ Usage: xtask <COMMAND>
 
 Commands:
   build                Build duniter binary
-  gen-calls-doc        Generate calls documentation
+  gen-doc              Generate documentation (calls and events)
   inject-runtime-code  Inject runtime code in raw specs
   release-runtime      Release a new runtime
+  update-raw-specs     Update raw specs locally with the files published on a Release
+  create-asset-link    Create asset in a release
   test                 Execute unit tests and integration tests End2tests are skipped
   help                 Print this message or the help of the given subcommand(s)
 
diff --git a/xtask/res/create_release.gql b/xtask/res/create_release.gql
index eb31aef63f847a521b198dabb1b392c6207ca932..2ba71180fd37442b413065d836201a7633139b44 100644
--- a/xtask/res/create_release.gql
+++ b/xtask/res/create_release.gql
@@ -1,12 +1,12 @@
-mutation CreateReleaseMutation($branch: String!, $description: String!, $milestone: String!, $links: [ReleaseAssetLinkInput!]!) {
+mutation CreateReleaseMutation($name: String!, $branch: String!, $description: String!, $milestone: String!, $links: [ReleaseAssetLinkInput!]!) {
   releaseCreate(input: {
     clientMutationId: "duniter-v2s-xtask"
     description: $description
     milestones: [$milestone]
-    name: $milestone
+    name: $name
     projectPath: "nodes/rust/duniter-v2s"
     ref: $branch
-    tagName: $milestone
+    tagName: $name
     assets: {
       links: $links
     }
diff --git a/xtask/res/templates/runtime-errors.po b/xtask/res/templates/runtime-errors.po
new file mode 100644
index 0000000000000000000000000000000000000000..b35e80ad382b1bec62aaf1744a1d9b83c5de83e1
--- /dev/null
+++ b/xtask/res/templates/runtime-errors.po
@@ -0,0 +1,7 @@
+{% for pallet in pallets -%}
+{% for error in pallet.errors -%}
+
+msgid "{{ pallet.name }}.{{ error.name }}"
+msgstr "{{ error.documentation }}"
+{% endfor -%}
+{% endfor -%}
diff --git a/xtask/src/gen_doc.rs b/xtask/src/gen_doc.rs
index 929361633264451c01a562110242448c48497c80..9e4adf51bf7166cdfa8081a4f68281edc2002479 100644
--- a/xtask/src/gen_doc.rs
+++ b/xtask/src/gen_doc.rs
@@ -19,16 +19,15 @@ use codec::Decode;
 use core::hash::Hash;
 use scale_info::form::PortableForm;
 use serde::Serialize;
-use std::collections::HashMap;
-use std::path::Path;
 use std::{
+    collections::HashMap,
     fs::File,
     io::{Read, Write},
+    path::Path,
+    process::Command,
 };
 use tera::Tera;
-use weightanalyzer::analyze_weight;
-use weightanalyzer::MaxBlockWeight;
-use weightanalyzer::WeightInfo;
+use weightanalyzer::{analyze_weight, MaxBlockWeight, WeightInfo};
 
 fn rename_key<K, V>(h: &mut HashMap<K, V>, old_key: &K, new_key: K)
 where
@@ -44,8 +43,9 @@ where
 const CALLS_DOC_FILEPATH: &str = "docs/api/runtime-calls.md";
 const EVENTS_DOC_FILEPATH: &str = "docs/api/runtime-events.md";
 const ERRORS_DOC_FILEPATH: &str = "docs/api/runtime-errors.md";
-const TEMPLATES_GLOB: &str = "xtask/res/templates/*.md";
-const WEIGHT_FILEPATH: &str = "runtime/common/src/weights/";
+const ERRORS_PO_FILEPATH: &str = "docs/api/runtime-errors.po";
+const TEMPLATES_GLOB: &str = "xtask/res/templates/*.{md,po}";
+const WEIGHT_FILEPATH: &str = "runtime/gdev/src/weights/";
 
 // define structs and implementations
 
@@ -55,6 +55,7 @@ type RuntimePallets = Vec<Pallet>;
 struct Pallet {
     index: u8,
     name: String,
+    type_name: String,
     calls: Vec<Call>,
     events: Vec<Event>,
     errors: Vec<ErroR>,
@@ -95,6 +96,7 @@ impl Pallet {
     fn new(
         index: u8,
         name: String,
+        type_name: String,
         call_scale_type_def: &Option<scale_info::TypeDef<PortableForm>>,
         event_scale_type_def: &Option<scale_info::TypeDef<PortableForm>>,
         error_scale_type_def: &Option<scale_info::TypeDef<PortableForm>>,
@@ -129,6 +131,7 @@ impl Pallet {
         Ok(Self {
             index,
             name,
+            type_name,
             calls,
             events,
             errors,
@@ -156,8 +159,8 @@ impl From<&scale_info::Variant<PortableForm>> for Call {
 impl From<&scale_info::Field<PortableForm>> for CallParam {
     fn from(field: &scale_info::Field<PortableForm>) -> Self {
         Self {
-            name: field.clone().name.unwrap_or_default(),
-            type_name: field.clone().type_name.unwrap_or_default(),
+            name: field.clone().name.unwrap_or_default().to_string(),
+            type_name: field.clone().type_name.unwrap_or_default().to_string(),
         }
     }
 }
@@ -175,8 +178,8 @@ impl From<&scale_info::Variant<PortableForm>> for Event {
 impl From<&scale_info::Field<PortableForm>> for EventParam {
     fn from(field: &scale_info::Field<PortableForm>) -> Self {
         Self {
-            name: field.clone().name.unwrap_or_default(),
-            type_name: field.clone().type_name.unwrap_or_default(),
+            name: field.clone().name.unwrap_or_default().to_string(),
+            type_name: field.clone().type_name.unwrap_or_default().to_string(),
         }
     }
 }
@@ -304,7 +307,35 @@ pub(super) fn gen_doc() -> Result<()> {
         })
     });
 
-    let (call_doc, event_doc, error_doc) = print_runtime(runtime);
+    let (call_doc, event_doc, error_doc, error_po) = print_runtime(runtime);
+
+    // Generate docs from rust code
+    Command::new("cargo")
+        .args([
+            "doc",
+            "--package=pallet-*",
+            "--package=*-runtime",
+            "--package=*distance*",
+            "--package=*membership*",
+            "--no-deps",
+            "--document-private-items",
+            "--features=runtime-benchmarks",
+            "--package=pallet-atomic-swap",
+            "--package=pallet-authority-discovery",
+            "--package=pallet-balances",
+            "--package=pallet-collective",
+            "--package=pallet-im-online",
+            "--package=pallet-preimage",
+            "--package=pallet-proxy",
+            "--package=pallet-scheduler",
+            "--package=pallet-session",
+            "--package=pallet-sudo",
+            "--package=pallet-timestamp",
+            "--package=pallet-treasury",
+            "--package=pallet-utility",
+        ])
+        .status()
+        .expect("cargo doc failed to execute");
 
     let mut file = File::create(CALLS_DOC_FILEPATH)
         .with_context(|| format!("Failed to create file '{}'", CALLS_DOC_FILEPATH))?;
@@ -318,6 +349,10 @@ pub(super) fn gen_doc() -> Result<()> {
         .with_context(|| format!("Failed to create file '{}'", ERRORS_DOC_FILEPATH))?;
     file.write_all(error_doc.as_bytes())
         .with_context(|| format!("Failed to write to file '{}'", ERRORS_DOC_FILEPATH))?;
+    let mut file = File::create(ERRORS_PO_FILEPATH)
+        .with_context(|| format!("Failed to create file '{}'", ERRORS_PO_FILEPATH))?;
+    file.write_all(error_po.as_bytes())
+        .with_context(|| format!("Failed to write to file '{}'", ERRORS_PO_FILEPATH))?;
 
     Ok(())
 }
@@ -339,7 +374,7 @@ fn get_max_weight_from_metadata_v15(
 
     let block_weights = scale_value::scale::decode_as_type(
         &mut &*block_weights.value,
-        block_weights.ty.id,
+        &block_weights.ty.id,
         &metadata_v15.types,
     )
     .expect("Can't decode max_weight")
@@ -363,10 +398,17 @@ fn get_from_metadata_v15(
     println!("Number of pallets: {}", metadata_v15.pallets.len());
     let mut pallets = Vec::new();
     for pallet in metadata_v15.pallets {
+        let mut type_name: String = Default::default();
         let calls_type_def = if let Some(calls) = pallet.calls {
             let Some(calls_type) = metadata_v15.types.resolve(calls.ty.id) else {
                 bail!("Invalid metadata")
             };
+            type_name = calls_type
+                .path
+                .segments
+                .first()
+                .expect("cannot decode pallet type")
+                .to_string();
             Some(calls_type.type_def.clone())
         } else {
             println!("{}: {} (0 calls)", pallet.index, pallet.name);
@@ -394,6 +436,7 @@ fn get_from_metadata_v15(
         let pallet = Pallet::new(
             pallet.index,
             pallet.name.clone(),
+            type_name,
             &calls_type_def,
             &events_type_def,
             &errors_type_def,
@@ -431,7 +474,7 @@ fn get_weights(max_weight: u128) -> Result<HashMap<String, HashMap<String, Weigh
 }
 
 /// use template to render markdown file with runtime calls documentation
-fn print_runtime(pallets: RuntimePallets) -> (String, String, String) {
+fn print_runtime(pallets: RuntimePallets) -> (String, String, String, String) {
     // init variables
     let mut user_calls_counter = 0;
     let user_calls_pallets: RuntimePallets = pallets
@@ -530,5 +573,9 @@ fn print_runtime(pallets: RuntimePallets) -> (String, String, String) {
         .render("runtime-errors.md", &context)
         .expect("template error");
 
-    (call_doc, event_doc, error_doc)
+    let error_po = tera
+        .render("runtime-errors.po", &context)
+        .expect("template error");
+
+    (call_doc, event_doc, error_doc, error_po)
 }
diff --git a/xtask/src/main.rs b/xtask/src/main.rs
index f84b3420bea65147a57282d7d7d7db286f5e56a6..07dd4e976bf2ea863422021b4c4f7745855cdb0f 100644
--- a/xtask/src/main.rs
+++ b/xtask/src/main.rs
@@ -21,9 +21,11 @@ mod release_runtime;
 
 use anyhow::{Context, Result};
 use clap::Parser;
-use std::io::{BufReader, BufWriter};
-use std::path::{Path, PathBuf};
-use std::process::Command;
+use std::{
+    io::{BufReader, BufWriter},
+    path::{Path, PathBuf},
+    process::Command,
+};
 
 const MIN_RUST_VERSION: &str = "1.58.0";
 
@@ -55,6 +57,7 @@ enum DuniterXTaskCommand {
     ReleaseNetwork { network: String, branch: String },
     /// Release a new runtime
     ReleaseRuntime {
+        name: String,
         network: String,
         branch: String,
         milestone: String,
@@ -104,10 +107,11 @@ async fn main() -> Result<()> {
             release_runtime::release_network(network, branch).await
         }
         DuniterXTaskCommand::ReleaseRuntime {
+            name,
             network,
             branch,
             milestone,
-        } => release_runtime::release_runtime(network, branch, milestone).await,
+        } => release_runtime::release_runtime(name, network, branch, milestone).await,
         DuniterXTaskCommand::PrintSpec { network } => release_runtime::print_spec(network).await,
         DuniterXTaskCommand::CreateAssetLink {
             tag,
diff --git a/xtask/src/release_runtime.rs b/xtask/src/release_runtime.rs
index 574867ea6fb1de543684700bccb461442eea042a..9f9d61548e0e51f47c14ca5b76519a2a2b133940 100644
--- a/xtask/src/release_runtime.rs
+++ b/xtask/src/release_runtime.rs
@@ -86,6 +86,7 @@ pub(super) async fn release_network(network: String, branch: String) -> Result<(
 }
 
 pub(super) async fn release_runtime(
+    name: String,
     network: String,
     branch: String,
     milestone: String,
@@ -129,8 +130,14 @@ pub(super) async fn release_runtime(
     println!("{}", release_notes);
     let gitlab_token =
         std::env::var("GITLAB_TOKEN").with_context(|| "missing env var GITLAB_TOKEN")?;
-    create_release::create_release(gitlab_token, branch, milestone, release_notes.to_string())
-        .await?;
+    create_release::create_release(
+        gitlab_token,
+        name,
+        branch,
+        milestone,
+        release_notes.to_string(),
+    )
+    .await?;
 
     Ok(())
 }
diff --git a/xtask/src/release_runtime/create_release.rs b/xtask/src/release_runtime/create_release.rs
index bece83eecc048f4c05fc2056f70775e712ac6500..ed5e26d3b8dd3444a29bca8ebd5e7909c607d5e7 100644
--- a/xtask/src/release_runtime/create_release.rs
+++ b/xtask/src/release_runtime/create_release.rs
@@ -27,12 +27,14 @@ pub struct CreateReleaseMutation;
 
 pub(super) async fn create_release(
     gitlab_token: String,
+    name: String,
     branch: String,
     milestone: String,
     release_notes: String,
 ) -> Result<()> {
     // this is the important line
     let request_body = CreateReleaseMutation::build_query(create_release_mutation::Variables {
+        name,
         branch,
         description: release_notes,
         milestone,