Skip to content
  1. Mar 24, 2022
    • Sergei Shulepov's avatar
      paras: `include_pvf_check_statement` rt bench (#4938) · c8fda4f1
      Sergei Shulepov authored
      
      
      * paras: `include_pvf_check_statement` rt bench
      
      Resolves #4933
      
      This PR adds a benchmark for the `include_pvf_check_statement`
      dispatchable. This is a necessary step to make it work without
      modifications. That enables us to proceed with testing on Versi.
      
      This introduces 5 new benchmarks. Those measure performance of the
      `include_pvf_check_statement` under 2 different conditions:
      
      1. regular vote submission. That's the common case.
      2. submission of the last vote. That happens only once and leads to a
         heavy finalization stage.
      
      There are 2 different types of finalization (one for onboarding, one for
      upgrading) and there are two outcomes: accepted and rejected. Those 4
      are similar but I decided to cover them all and assign the maximum of
      all 4. This is to avoid a situation when one of those paths becomes more
      heavier than others and opens up an attack venue.
      
      The regular vote submission weight is drastically different from the
      submission last vote weight. That's why in case during runtime
      finalization was not executed the weight consumed value will be lowered
      down to the regular vote submission.
      
      The finalization weight is proportional to the number of "causes", i.e.
      the events that caused the PVF pre-checking vote in the first place, and
      here we assume that the maximum number of causes is 100.
      
      Theoretically, there is nothing that prevents an adversary to
      register/upgrade to more than 100 parachains. In that case, the consumed
      weight will be lower than the actual time consumed by the finalization
      process. That can enable a DoS vector.
      
      However, practically, it is not very possible. Right now it is very
      expensive to call `schedule_para_initialize` because it requires a very
      large lock up of funds. Moreover, finalizing a vote with 100 causes
      leads to around 31ms time spent. Finalizing more will require more time.
      However, finalizing with 200 causes will cause ≈62ms delay. This is not
      that bad since even though we had a full block and the adversary tried
      to finalize 200 causes it won't be able to even exceed the operational
      extrinsic boundary of 250ms and even if so it won't make big difference.
      
      That said, this should be addressed later on, esp. when we enable
      parathreads, which will make creating causes easier. One of potential
      solutions will be shifting the logic of finalization into
      `on_initialize`/`on_finalize`. Another is to create a maximum number of
      causes and then reject upgrades or onboardings if that was reached.
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=polkadot-dev --steps=50 --repeat=20 --pallet=runtime_parachains::paras --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/polkadot/src/weights/runtime_parachains_paras.rs
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=kusama-dev --steps=50 --repeat=20 --pallet=runtime_parachains::paras --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/kusama/src/weights/runtime_parachains_paras.rs
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=westend-dev --steps=50 --repeat=20 --pallet=runtime_parachains::paras --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/westend/src/weights/runtime_parachains_paras.rs
      
      * cargo run --quiet --profile=production --features runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=runtime_parachains::paras --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/runtime_parachains_paras.rs
      
      * Fix import error
      
      Co-authored-by: default avatarParity Bot <[email protected]>
      Co-authored-by: default avatarRobert Klotzner <[email protected]>
      Co-authored-by: default avatarLldenaurois <[email protected]>
      c8fda4f1
    • Alexander Samusev's avatar
    • Keith Yeung's avatar
      Companion for paritytech/substrate#10242 (#4862) · 7cf80108
      Keith Yeung authored
      
      
      * Rename to BagError
      
      * update lockfile for {"substrate"}
      
      Co-authored-by: default avatarShawn Tabrizi <[email protected]>
      Co-authored-by: parity-processbot <>
      7cf80108
    • Alexander Samusev's avatar
      [ci] Add short benchmarks to the pipeline (#5188) · dea0cc42
      Alexander Samusev authored
      
      
      * [ci] Add short benchmarks to the pipeline
      
      * fix bench
      
      * divide build and bench
      
      * debug
      
      * debug
      
      * remove build from bench script
      
      * run benches on ci runners
      
      * return full pipeline
      
      * fix pipeline
      
      * Update scripts/run_short_benches_for_runtime.sh
      
      Co-authored-by: default avatarMara Robin B. <[email protected]>
      
      * change short benchmark script
      
      * allow short bench fail
      
      Co-authored-by: default avatarMara Robin B. <[email protected]>
      Co-authored-by: parity-processbot <>
      dea0cc42
  2. Mar 23, 2022
  3. Mar 22, 2022
    • Bruno Galvao's avatar
      add weights that need to be generated for rococo (#5052) · f8b979b7
      Bruno Galvao authored
      
      
      * add weights that need to be generated for rococo
      
      * remove frame_system
      
      * touch balances weight file
      
      * add empty im-online weight file
      
      * add empty pallet indices weight file
      
      * add empty pallet multisig weight file
      
      * add empty pallet proxy weight file
      
      * add empty pallet session weight file
      
      * add empty pallet timestamp weight file
      
      * add empty pallet utility weight file
      
      * add empty para pallets weight files
      
      * remove utility for now
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=pallet-balances --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=pallet-im-online --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=pallet-multisig --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=pallet-proxy --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=pallet-timestamp --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=runtime_common::auctions --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/runtime_common_auctions.rs
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=pallet-indices --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=runtime_common::paras_registrar --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/runtime_common_paras_registrar.rs
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=runtime_common::slots --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/runtime_common_slots.rs
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=runtime_parachains::configuration --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/runtime_parachains_configuration.rs
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=runtime_parachains::hrmp --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/runtime_parachains_hrmp.rs
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=runtime_parachains::initializer --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/runtime_parachains_initializer.rs
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=runtime_parachains::paras --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/runtime_parachains_paras.rs
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=runtime_parachains::ump --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/runtime_parachains_ump.rs
      
      * update ump for weights sink_process_upward_message -> process_upward_message (#5103)
      
      * update ump for weights sink_process_upward_message -> process_upward_message
      
      * update autogen files
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=runtime_parachains::ump --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/runtime_parachains_ump.rs
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=runtime_parachains::disputes --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/runtime_parachains_disputes.rs
      
      * add frame_system weights for Rococo
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=frame_system --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/
      
      * add pallet-utility runtime benchmarks
      
      * add utility benchmark
      
      * add utility pallet
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=rococo-dev --steps=50 --repeat=20 --pallet=pallet-utility --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/rococo/src/weights/
      
      * fix cargo format issues
      
      * add pallet_session weights
      
      - since pallet session benchmarking is coupled with pallet staking, for the time being we will use the weights from westend
      
      https://github.com/paritytech/polkadot/pull/5052#issuecomment-1072903719
      
      * remove newline
      
      * use some of the new weights
      
      * add pallet-utility/std
      
      * add collective and membership benchmarks
      
      * add WeightInfo
      
      * copy weights from Polkadot for now, needs to be updated with relevant weights
      
      * add weights
      
      * copy weights from Polkadot pallet session
      
      * remove newline
      
      Co-authored-by: default avatarParity Bot <[email protected]>
      Co-authored-by: default avatarDan Shields <[email protected]>
      Co-authored-by: default avatarShawn Tabrizi <[email protected]>
      f8b979b7
    • cheme's avatar
      update parity-db (#5175) · 183b52e7
      cheme authored
      183b52e7
    • Chevdor's avatar
      Fix changelog (#5155) · 168dc6e5
      Chevdor authored
      * Pass git ref explicitely
      
      * Include a db migration section to the changelog
      168dc6e5
  4. Mar 21, 2022
    • Mara Broda's avatar
    • Bernhard Schuster's avatar
      miniscule: fix edition fmt (#5167) · 0e34a808
      Bernhard Schuster authored
      * miniscule: fix edition fmt
      
      * fix: rust analyzer might enable this and hence cause red squiggles
      
      Reduce the visual overload.
      
      * fix/spellcheck/quirk: allow 124_123 numbers
      0e34a808
    • Bernhard Schuster's avatar
      approval dist imrpo (#5161) · 189dfdc0
      Bernhard Schuster authored
      
      
      * minor approval voting refactor
      
      * ignore recently outdated ones
      
      * check in another branch
      
      * don't be a doofus
      
      * add newline
      
      * remove a superflous check
      
      * fix missing ,
      
      * consistency
      
      * Update node/network/approval-distribution/src/lib.rs
      
      Co-authored-by: default avatarAndronik <[email protected]>
      
      * fixup
      
      Co-authored-by: default avatarAndronik <[email protected]>
      189dfdc0
    • Svyatoslav Nikolsky's avatar
      Update bridges subtree (#5165) · 8e01ba9c
      Svyatoslav Nikolsky authored
      * Squashed 'bridges/' changes from 1602249f0a..f220d2fcca
      
      f220d2fcca Polkadot staging update (#1356)
      02fd3d497c fix parse_transaction on Rialto+Millau (#1360)
      bc191fd9a2 update parity-scale-codec to 3.1.2 (#1359)
      a37226e79c update chain versions (#1358)
      ff5d539fcb Update Substrate/Polkadot/Cumulus references (#1353)
      1581f60cd5 Support dedicated lanes for pallets (#962)
      0a7ccf5c57 ignore more "increase" alerts that are sometimes signalling NoData at startup (#1351)
      31165127cc added no_stack_overflow_when_decoding_nested_call_during_dispatch test (#1349)
      7000619eb8 replace From<>InboundLaneApi with direct storage reads (#1348)
      515df10ccc added alerts for relay balances (#1347)
      b56f6a87de Mortal conversion rate updater transactions (#1257)
      20f2f331ec edition = "2021" (#1346)
      99147d4f75 update regex to 1.5.5 (#1345)
      686191f379 use DecodeLimit when decoding incoming calls (#1344)
      a70c276006 get rid of '[No Data] Messages from Millau to Rialto are not being delivered' warnings (#1342)
      01f29b8ac1 fix conversion rate metric in dashboards (#1341)
      51c3bf351f Increase rate from metric when estimating fee (#1340)
      3bb9c4f68f fix generator scripts to be consistent with updatedrelay output (#1339)
      0475a1667b fixed mess with conversion rates (#1338)
      d8fdd7d716 synchronize relay cli changes and token swap generator script (#1337)
      6e928137a5 fix conversion rate override in token swap (#1336)
      62d4a4811d override conversion rate in tokens swap generator (#1335)
      ed9e1c839c fi typo in generator script (#1334)
      3254b5af7a Override conversion rate when computing message fee (#1261)
      66df68b5b8 Revert "Revert "override conversion rate in estimate-message-fee RPC (#1189)" (#1275)" (#1333)
      0ca6fc6ef8 fix clippy issues (#1332)
      5414b2fffb Reinitialize bridge relay subcommand (#1331)
      a63d95ba7d removed extra *_RUNTIME_VERSION consts from relay code (#1330)
      59fb18a310 fix typo in alert expression (#1329)
      a6267a47ee Using-same-fork metric for finality and complex relay (#1327)
      88d684d37e use mortal transactions in transaction resubmitter (#1326)
      8ff88b6844 impl Decode for SignedExtensions (otherwise transaction resubmitter panicks) (#1325)
      1ed09854f0 Encode and estimate Rococo/Wococo/Kusama/Polkadot messages (#1322)
      ddb4517e13 Add some tests to check integrity of chain constants + bridge configuration (#1316)
      bdeedb7ab9 Fix issues from cargo deny (#1311)
      d3d79d01e0 expose fee multiplier metrics in messages relay (#1312)
      c8b3f0ea16 Endow relayer account at target chain in message benchmarks (#1310)
      f51ecd92b6 fix benchmarks before using it in Polkadot/Kusama/Rococo runtimes (#1309)
      6935c619ad increase relay balance guard limits for Polkadot<>Kusama bridge (#1308)
      7e31834c66 Fix mandatory headers scanning in on-demand relay (#1306)
      92ddc3ea7a Polkadot-staging update (#1305)
      3787193a31 fix session length of Rococo and Wococo (#1304)
      eb468d29c0 Revert nightly docker pin (#1301)
      e2d4c073e1 Use raw balance value if tokenDecimals property is missing (#1299)
      108f4b29d1 Fix ss58 prefixes of Polkadot, Kusama and Westend used by relay (#1298)
      64fbd2705e bump chain spec versions (#1297)
      5707777b86 Bump Substrate/Polkadot/Cumulus refs (#1295)
      29eecdf1fa Merge pull request #1294 from paritytech/polkadot-staging-update
      1f0c05368e Relay balance metrics (#1291)
      6356bb90b3 when messages pallet is halted, relay shall not submit messages delivery/confirmation transactions (#1289)
      800dc2df8d when GRANDPA pallet is halted, relay shall not submit finality transactions (#1288)
      3dd8e4f936 disable BEEFY allerts for Rialto (#1285)
      f58fed7380 support version mode cli options in send-message subcommand (#1284)
      3aac448da3 reuse polkadot-service code (#1273)
      2bdbb651e1 replace latest_confirmed_nonce runtime APIs with direct storage reads (#1282)
      5f9c6d241f move "common" code of messages pallet benchmarks helpers to the common library (#1281)
      173d2d8229 Merge pull request #1280 from paritytech/polkadot-staging-update
      8b9c4ec16d do not start spec_version guard when version mode is set to auto (#1278)
      e98d682de2 removed extra messages benchmarks (#1279)
      c730e25b61 Move benchmarks from Rialto to Millau (#1277)
      54146416e7 Merge pull request #1276 from paritytech/polkadot-staging-update
      df70118174 Merge branch 'master' into polkadot-staging-update
      ed7def64c4 Revert "override conversion rate in estimate-message-fee RPC (#1189)" (#1275)
      38c6c3a49f Use "production" floating tag when uilding docker image from version git tags (#1272)
      ded9ff6dbb Replace InboundLaneApi::latest_received_nonce with direct storage read (#1269)
      f704a741ee Polkadot staging update (#1270)
      8c65f0d7ab verify that GRANDPA pallet is not initialized before submitting initialization transaction (#1267)
      e7e83d8944 remove OutboundLaneApi::latest_received_nonce (#1262)
      9f4b34acf1 bump rococo version (#1263)
      82c08c5a87 read latest_generated_nonce directly from storage (#1260)
      50ffb5dd08 override conversion rate in estimate-message-fee RPC (#1189)
      467ca5ef59 move storage keys computation to primitivs (#1254)
      4f9884066b remporary use pinned bridges-ci image in Dockerfile (#1258)
      edfcb74e00 Change submit transaction spec_version and transaction_version query from chain (#1248)
      4009d970d0 pin bridges-ci image (#1256)
      65e51b5e1c decrease startup sleep to 5s for relays and to 120s for generators + remove curl (#1251)
      3bc74355d9 Add missing RPC APIs to rialto parachain node (#1250)
      80c9429284 Bump relay version to 1.0.0 (#1249)
      9ead06af2a runtimes: fix call_size() test (#1245)
      4fc8a29357 Use same endowed accounts set on dev/local chains (#1244)
      fed54371c2 Refactor message relay helpers (#1234)
      a15b4faae7 post-merge build fix (#1243)
      52232d8d54 Fix transactions mortality (#1196)
      c07bba931f Expose prometheus BEEFY metrics and add them to grafana dashboard (#1242)
      f927775bd5 Refactor finality relay helpers (#1220)
      7bf76f14a8 Update Rococo/Wococo version + prepare relay for Rococo<>Wococo bridge (#1241)
      e860fecd04 Enable offchain indexing for Rialto/Millau nodes (#1239)
      04d4d1c6b4 Enable Beefy debug logs in test deployment (#1237)
      cd771f1089 Fix storage parameter name computation (#1238)
      816ddd2dd2 Integrate BEEFY with Rialto & Millau runtimes (#1227)
      d94b62b1ac update dependencies (#1229)
      98eb9ee13d Add mut support (#1232)
      ffef6f89f9 fixed set_operational in GRANDPA pallet (#1226)
      bd2f8bfbd7 Add CODEOWNERS file (#1219)
      6b5cf2b591 Unify metric names (#1209)
      d1541e797e remove abandoned exchange relay (#1217)
      39140d0b34 Remove unused `relays/headers` (#1216)
      9bc071d42b Remove unused PoA<>Substrate bridge (#1210)
      877e8d01e3 Fix UI deployment. (#1211)
      6cd5775ebe Add `AtLeast32BitUnsigned` for MessageLance::SourceChainBalance (#1207)
      
      git-subtree-dir: bridges
      git-subtree-split: f220d2fccabbf141101d19456ecb4e3576a1d797
      
      * fix compilation warnings
      8e01ba9c
  5. Mar 19, 2022
  6. Mar 18, 2022
  7. Mar 17, 2022
  8. Mar 16, 2022
    • Georges's avatar
      Companion to Moving `NposSolution` to frame #11031 (#5112) · 1c443c65
      Georges authored
      * using `frame_npos_elections_solution_type`
      
      * forget to commit one change
      
      * substrate pallet renaming
      
      * `Support` moved to frame in substrate
      
      * update lockfile for {"substrate"}
      
      Co-authored-by: parity-processbot <>
      1c443c65
    • Tsvetomir Dimitrov's avatar
      Additional tracing in provisioner (#5125) · f35f5ae9
      Tsvetomir Dimitrov authored
      * Additional tracing in provisioner
      
      Add debug logs for `fn send_inherent_data`.
      
      * Code review feedback
      
      * Code review feedback
      
      * Code review feedback
      
      * Fix unit tests
      f35f5ae9
    • Mara Broda's avatar
      update weights (#5097) · 8ba34ef1
      Mara Broda authored
      
      
      * westend: update weights
      
      * kusama: update weights
      
      * polkadot: update weights
      
      * westend: update weights (production profile)
      
      * kusama: update weights (production profile)
      
      * polkadot: update weights (production profile)
      
      * kusama: update weights (production profile pt 2)
      
      * westend: update weights (production profile pt 2)
      
      * fixup
      
      * fixup
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=polkadot-dev --steps=50 --repeat=20 --pallet=frame_system --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/polkadot/src/weights/
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=kusama-dev --steps=50 --repeat=20 --pallet=frame_system --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/kusama/src/weights/
      
      * cargo run --quiet --profile=production  --features=runtime-benchmarks -- benchmark --chain=westend-dev --steps=50 --repeat=20 --pallet=frame_system --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/westend/src/weights/
      
      Co-authored-by: default avatarParity Bot <[email protected]>
      8ba34ef1