Compare commits
	
		
			2 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 510e96a7d2 | |||
| c056b96545 | 
							
								
								
									
										59
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										59
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @ -1,6 +1,6 @@ | ||||
| # This file is automatically @generated by Cargo. | ||||
| # It is not intended for manual editing. | ||||
| version = 4 | ||||
| version = 3 | ||||
| 
 | ||||
| [[package]] | ||||
| name = "Inflector" | ||||
| @ -1186,7 +1186,7 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "casper-runtime" | ||||
| version = "3.5.31" | ||||
| version = "3.5.19" | ||||
| dependencies = [ | ||||
|  "casper-runtime-constants", | ||||
|  "frame-benchmarking", | ||||
| @ -1203,7 +1203,6 @@ dependencies = [ | ||||
|  "ghost-networks", | ||||
|  "ghost-runtime-common", | ||||
|  "ghost-slow-clap", | ||||
|  "ghost-sudo", | ||||
|  "log", | ||||
|  "pallet-alliance", | ||||
|  "pallet-authority-discovery", | ||||
| @ -3505,7 +3504,7 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-claims" | ||||
| version = "0.2.4" | ||||
| version = "0.2.2" | ||||
| dependencies = [ | ||||
|  "frame-benchmarking", | ||||
|  "frame-support", | ||||
| @ -3529,7 +3528,7 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-cli" | ||||
| version = "0.8.2" | ||||
| version = "0.7.180" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "clap 4.5.4", | ||||
| @ -3561,7 +3560,7 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-client-cli" | ||||
| version = "0.1.4" | ||||
| version = "0.1.3" | ||||
| dependencies = [ | ||||
|  "array-bytes", | ||||
|  "clap 4.5.4", | ||||
| @ -3585,7 +3584,7 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-machine-primitives" | ||||
| version = "0.8.2" | ||||
| version = "0.7.180" | ||||
| dependencies = [ | ||||
|  "lazy_static", | ||||
|  "sc-sysinfo", | ||||
| @ -3594,7 +3593,7 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-metrics" | ||||
| version = "0.8.2" | ||||
| version = "0.7.180" | ||||
| dependencies = [ | ||||
|  "assert_cmd", | ||||
|  "bs58 0.5.1", | ||||
| @ -3617,7 +3616,7 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-miner" | ||||
| version = "1.5.1" | ||||
| version = "1.5.0" | ||||
| dependencies = [ | ||||
|  "anyhow", | ||||
|  "assert_cmd", | ||||
| @ -3649,17 +3648,14 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-networks" | ||||
| version = "0.1.16" | ||||
| version = "0.7.180" | ||||
| dependencies = [ | ||||
|  "frame-benchmarking", | ||||
|  "frame-support", | ||||
|  "frame-system", | ||||
|  "ghost-core-primitives", | ||||
|  "ghost-traits", | ||||
|  "num-traits", | ||||
|  "pallet-balances", | ||||
|  "pallet-staking", | ||||
|  "pallet-staking-reward-curve", | ||||
|  "parity-scale-codec", | ||||
|  "scale-info", | ||||
|  "sp-io 30.0.0", | ||||
| @ -3669,7 +3665,7 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-node" | ||||
| version = "0.8.2" | ||||
| version = "0.7.180" | ||||
| dependencies = [ | ||||
|  "assert_cmd", | ||||
|  "color-eyre", | ||||
| @ -3685,7 +3681,7 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-remote-ext-tests-bags-list" | ||||
| version = "1.0.1" | ||||
| version = "1.0.0" | ||||
| dependencies = [ | ||||
|  "casper-runtime", | ||||
|  "casper-runtime-constants", | ||||
| @ -3700,7 +3696,7 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-rpc" | ||||
| version = "0.8.2" | ||||
| version = "0.7.180" | ||||
| dependencies = [ | ||||
|  "ghost-core-primitives", | ||||
|  "jsonrpsee", | ||||
| @ -3729,7 +3725,7 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-runtime-common" | ||||
| version = "0.4.3" | ||||
| version = "0.4.2" | ||||
| dependencies = [ | ||||
|  "frame-support", | ||||
|  "frame-system", | ||||
| @ -3752,7 +3748,7 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-service" | ||||
| version = "0.8.2" | ||||
| version = "0.7.180" | ||||
| dependencies = [ | ||||
|  "assert_matches", | ||||
|  "async-trait", | ||||
| @ -3836,7 +3832,7 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-slow-clap" | ||||
| version = "0.3.40" | ||||
| version = "0.3.14" | ||||
| dependencies = [ | ||||
|  "frame-benchmarking", | ||||
|  "frame-support", | ||||
| @ -3845,8 +3841,6 @@ dependencies = [ | ||||
|  "log", | ||||
|  "pallet-balances", | ||||
|  "pallet-session", | ||||
|  "pallet-staking", | ||||
|  "pallet-staking-reward-curve", | ||||
|  "parity-scale-codec", | ||||
|  "scale-info", | ||||
|  "serde", | ||||
| @ -3861,7 +3855,7 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-staging-chain-spec-builder" | ||||
| version = "1.6.2" | ||||
| version = "1.6.1" | ||||
| dependencies = [ | ||||
|  "clap 4.5.4", | ||||
|  "log", | ||||
| @ -3870,24 +3864,9 @@ dependencies = [ | ||||
|  "sp-tracing 16.0.0 (git+https://github.com/paritytech/polkadot-sdk.git?tag=polkadot-v1.12.0)", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-sudo" | ||||
| version = "0.0.2" | ||||
| dependencies = [ | ||||
|  "docify", | ||||
|  "frame-benchmarking", | ||||
|  "frame-support", | ||||
|  "frame-system", | ||||
|  "parity-scale-codec", | ||||
|  "scale-info", | ||||
|  "sp-io 30.0.0", | ||||
|  "sp-runtime 31.0.1", | ||||
|  "sp-std 14.0.0 (git+https://github.com/paritytech/polkadot-sdk.git?tag=polkadot-v1.12.0)", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-traits" | ||||
| version = "0.3.23" | ||||
| version = "0.3.19" | ||||
| dependencies = [ | ||||
|  "frame-support", | ||||
|  "sp-runtime 31.0.1", | ||||
| @ -3895,7 +3874,7 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghost-voter-bags" | ||||
| version = "0.3.7" | ||||
| version = "0.3.6" | ||||
| dependencies = [ | ||||
|  "casper-runtime", | ||||
|  "clap 4.5.4", | ||||
| @ -3905,7 +3884,7 @@ dependencies = [ | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ghostkey" | ||||
| version = "0.3.16" | ||||
| version = "0.3.15" | ||||
| dependencies = [ | ||||
|  "clap 4.5.4", | ||||
|  "ghost-client-cli", | ||||
|  | ||||
							
								
								
									
										31
									
								
								Cargo.toml
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								Cargo.toml
									
									
									
									
									
								
							| @ -17,7 +17,7 @@ homepage.workspace = true | ||||
| [workspace.package] | ||||
| license = "GPL-3.0-only" | ||||
| authors = ["571nky", "57r37ch", "f4750"] | ||||
| version = "0.8.2" | ||||
| version = "0.7.180" | ||||
| edition = "2021" | ||||
| homepage = "https://ghostchain.io" | ||||
| repository = "https://git.ghostchain.io/ghostchain/ghost-node" | ||||
| @ -69,7 +69,6 @@ bs58 = { version = "0.5.0" } | ||||
| prometheus-parse = { version = "0.2.2" } | ||||
| rustc-hex = { version = "2.1.0", default-features = false } | ||||
| log = { version = "0.4", default-features = false } | ||||
| num-traits = { version = "0.2.17", default-features = false } | ||||
| libsecp256k1 = { version = "0.7", default-features = false } | ||||
| bip39 = { package = "parity-bip39", version = "2.0.1" } | ||||
| sha3 = { version = "0.10", default-features = false } | ||||
| @ -230,7 +229,6 @@ ghost-traits = { path = "pallets/traits", default-features = false } | ||||
| ghost-networks = { path = "pallets/networks", default-features = false } | ||||
| ghost-claims = { path = "pallets/claims", default-features = false } | ||||
| ghost-slow-clap = { path = "pallets/slow-clap", default-features = false } | ||||
| ghost-sudo = { path = "pallets/sudo", default-features = false } | ||||
| ghost-runtime-constants = { package = "ghost-runtime-constants", path = "runtime/ghost/constants", default-features = false } | ||||
| casper-runtime = { path = "runtime/casper", default-features = false } | ||||
| casper-runtime-constants = { package = "casper-runtime-constants", path = "runtime/casper/constants", default-features = false } | ||||
| @ -260,25 +258,24 @@ substrate-build-script-utils = { workspace = true } | ||||
| resolver = "2" | ||||
| 
 | ||||
| members = [ | ||||
|     "core-primitives", | ||||
| 	"core-primitives", | ||||
|     "cli", | ||||
|     "rpc", | ||||
|     "service", | ||||
| 	"rpc", | ||||
| 	"service", | ||||
|     "metrics", | ||||
|     "client/cli", | ||||
|     "primitives/machine", | ||||
|     "runtime/common", | ||||
|     "runtime/casper", | ||||
|     "runtime/casper/constants", | ||||
|     "pallets/networks", | ||||
|     "pallets/claims", | ||||
|     "pallets/slow-clap", | ||||
|     "pallets/sudo", | ||||
|     "utils/bags-list", | ||||
|     "utils/chain-spec-builder", | ||||
|     "utils/generate-bags", | ||||
| 	"runtime/common", | ||||
| 	"runtime/casper", | ||||
| 	"runtime/casper/constants", | ||||
| 	"pallets/networks", | ||||
| 	"pallets/claims", | ||||
| 	"pallets/slow-clap", | ||||
| 	"utils/bags-list", | ||||
| 	"utils/chain-spec-builder", | ||||
| 	"utils/generate-bags", | ||||
|     "utils/ghostkey", | ||||
|     "utils/staking-miner", | ||||
| 	"utils/staking-miner", | ||||
| ] | ||||
| 
 | ||||
| [badges] | ||||
|  | ||||
							
								
								
									
										0
									
								
								LICENSE.md
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								LICENSE.md
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
								
								
									
										132
									
								
								README.md
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										132
									
								
								README.md
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -56,12 +56,6 @@ an SSH server. | ||||
| sudo apt install openssh-server | ||||
| ``` | ||||
| 
 | ||||
| Start SSH Service using _systemctl_. | ||||
| 
 | ||||
| ```bash | ||||
| sudo systemctl start ssh | ||||
| ``` | ||||
| 
 | ||||
| Enable SSH Service to Start on Boot: To ensure that the SSH service automatically | ||||
| starts after a reboot, you need to enable it using _systemctl_. | ||||
| 
 | ||||
| @ -150,8 +144,23 @@ rustup default stable | ||||
| rustup update | ||||
| ``` | ||||
| 
 | ||||
| Add the nightly release and the nightly WebAssembly (wasm) targets | ||||
| to your development environment by running the following commands: | ||||
| ```bash | ||||
| rustup target add wasm32-unknown-unknown --toolchain stable | ||||
| rustup update nightly | ||||
| ``` | ||||
| 
 | ||||
| ```bash | ||||
| rustup target add wasm32-unknown-unknown --toolchain nightly | ||||
| ``` | ||||
| 
 | ||||
| ```bash | ||||
| rustup target add wasm32-unknown-unknown --toolchain stable-x86_64-unknown-linux-gnu | ||||
| ``` | ||||
| 
 | ||||
| **_IF error try_** | ||||
| ```bash | ||||
| rustup target add wasm32-unknown-unknown --toolchain default | ||||
| ``` | ||||
| 
 | ||||
| Verify the configuration of your development environment by running | ||||
| @ -160,6 +169,10 @@ the following command: | ||||
| rustup show | ||||
| ``` | ||||
| 
 | ||||
| ```bash | ||||
| rustup +nightly show | ||||
| ``` | ||||
| 
 | ||||
| You should see something like this: | ||||
| 
 | ||||
|  | ||||
| @ -170,6 +183,13 @@ Now run: | ||||
| rustup component add rust-src --toolchain stable | ||||
| ``` | ||||
| 
 | ||||
| **_IF error try_** | ||||
| ```bash | ||||
| rustup component add rust-src --toolchain default | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ## Install GHOST | ||||
| 
 | ||||
| Check if Git is already installed: | ||||
| @ -180,7 +200,7 @@ git --version | ||||
| 
 | ||||
| Make a GHOST Directory and go to it: | ||||
| ```bash | ||||
| mkdir ~/ghost && cd ~/ghost | ||||
| mkdir ghost && cd ghost | ||||
| ``` | ||||
| 
 | ||||
| Clone GHOST Node Git: | ||||
| @ -195,7 +215,7 @@ cd ghost-node | ||||
| 
 | ||||
| Compile the node template by running the following command: | ||||
| ```bash | ||||
| ./scripts/starter.sh --release | ||||
| cargo build --release | ||||
| ``` | ||||
| 
 | ||||
| The build can take up to 20 minutes depending on the specifications of your machine. | ||||
| @ -203,6 +223,7 @@ The build can take up to 20 minutes depending on the specifications of your mach | ||||
|  | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| # Boot Node Qualification | ||||
| 
 | ||||
| ## Boot Node Qualification Test | ||||
| @ -288,7 +309,7 @@ Only `port 30333` should be opened. | ||||
| 
 | ||||
| Press _CTRL+C_ to stop the node. | ||||
| 
 | ||||
| # Launching GHOST TestNet | ||||
| # Launching GHOST TestNet 2.0 | ||||
| 
 | ||||
| Switch to main GIT branch: | ||||
| ```bash | ||||
| @ -316,7 +337,66 @@ To generate the node key use the following command: | ||||
| ./target/release/ghost key generate-node-key --bin --file=/etc/ghost/node-key | ||||
| ``` | ||||
| 
 | ||||
| Feel free to backup the file on a separate storage device. | ||||
| Generate Wallet Key file with the following command: | ||||
| ```bash | ||||
| ./target/release/ghost key generate | grep "Secret seed" | awk '{$1=$2=""; sub(/^[ \t]+/, ""); print}' > /etc/ghost/wallet-key | ||||
| ``` | ||||
| 
 | ||||
| Display the wallet-key on the screen by using cat command: | ||||
| ```bash | ||||
| ./target/release/ghost key inspect $(cat /etc/ghost/wallet-key) | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| Feel free to back the file on a separate storage device. | ||||
| 
 | ||||
| Generate Stash Key file with the following command: | ||||
| ```bash | ||||
| ./target/release/ghost key generate | grep "Secret seed" | awk '{$1=$2=""; sub(/^[ \t]+/, ""); print}' > /etc/ghost/stash-key | ||||
| ``` | ||||
| 
 | ||||
| Display the stash-key on the screen by using cat command: | ||||
| ```bash | ||||
| ./target/release/ghost key inspect $(cat /etc/ghost/stash-key) | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| Generate Session Key file with the following command: | ||||
| ```bash | ||||
| ./target/release/ghost key generate | grep "Secret seed" | awk '{$1=$2=""; sub(/^[ \t]+/, ""); print}' > /etc/ghost/session-key | ||||
| ``` | ||||
| You have generates 4 types of Session Keys: | ||||
| 
 | ||||
| 1. Session Key – AUDI | ||||
| 2. Session Key – BABE | ||||
| 3. Session Key – SLOW | ||||
| 4. Session Key – GRAN | ||||
| 
 | ||||
| Now let's display them! | ||||
| 
 | ||||
| Display the session-key//audi on the screen by using cat command: | ||||
| ```bash | ||||
| ./target/release/ghost key inspect "$(cat /etc/ghost/session-key)//audi" | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| Display the session-key//babe on the screen by using cat command: | ||||
| ```bash | ||||
| ./target/release/ghost key inspect "$(cat /etc/ghost/session-key)//babe" | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| Display the session-key//slow on the screen by using cat command: | ||||
| ```bash | ||||
| ./target/release/ghost key inspect "$(cat /etc/ghost/session-key)//slow" | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| Display the session-key//gran on the screen by using cat command: | ||||
| ```bash | ||||
| ./target/release/ghost key inspect "$(cat /etc/ghost/session-key)//gran" --scheme=ed25519 | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ## Build and start the ghost-node | ||||
| 
 | ||||
| @ -346,8 +426,9 @@ sha256sum /etc/ghost/casper.json | ||||
| 
 | ||||
| You should see: | ||||
| ``` | ||||
| 9da6045ed6d4fd844e3939573b31c013d0e564e542029330faa6d978cb4a915a | ||||
| 6c1bab2e9c04043814b5e5e72984b00ac60150bd48cb16068495f1b49fbc5008 | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| Create running `ghost-node` service that starts on system boot using `--unit-file` flag. | ||||
| And we must set up the `ghost-node` launch command by setting arguments using | ||||
| @ -372,7 +453,10 @@ To choose default options press Enter here: | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| If you want to validate from this node press Enter: | ||||
| Currently, you have to qualify to become a validator node through [GHOST Whales](https://ghostchain.io/whales-apply). | ||||
| If you were NOT included in the [ghosties file](https://git.ghostchain.io/ghostchain/ghost-node/src/branch/main/service/ghosties) then you cannot be a validator node, | ||||
| and you can only be a full node so for `disable validator mode? [y/N]` type `y`. | ||||
| If you were included in the ghosties file you can press Enter: | ||||
| ``` | ||||
| disable validator mode? [y/N]: y | ||||
| ``` | ||||
| @ -397,7 +481,7 @@ Official **Boot Node** addresses: | ||||
| /dns/bootnode70.chain.ghostchain.io/tcp/30333/p2p/12D3KooWP3h5dSdqcpvsCr7fp1jyfqDj291QDZ68a4gY6VQ8T1nW | ||||
| ``` | ||||
| 
 | ||||
| A full list of available **Boot Nodes** can be found on [the guide page](https://blog.ghostchain.io/launching-ghost-testnet-3-1/#Boot_Node). | ||||
| A full list of available **Boot Nodes** can be found on [the guide page](https://blog.ghostchain.io/launching-ghost-testnet-2-0/#Boot_Node). | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| @ -413,10 +497,21 @@ Type `y` and press _Enter_ for create dedicated user for running `ghost-node`: | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| **DO NOT start and DO NOT enable** `ghost-node.service` (press _Enter_): | ||||
| **DO NOT start and enable** `ghost-node.service` press _Enter_: | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| Now you can check whether or not the keys on your GHOST Node match those | ||||
| in the [ghosties file](https://git.ghostchain.io/ghostchain/ghost-node/src/branch/main/service/ghosties) on GHOST Git. | ||||
| If you are running a **Validator Node** and if you have followed | ||||
| the Generating Keys Part you will see all `[+]`. | ||||
| If you are a running a **Full Node** you will see errors: | ||||
| 
 | ||||
| (Press _Enter_ for prompts) | ||||
| ```bash | ||||
| ./scripts/starter.sh --check-keys | ||||
| ``` | ||||
| 
 | ||||
| Full Node: | ||||
| 
 | ||||
|  | ||||
| @ -430,7 +525,7 @@ Start `ghost-node`: | ||||
| sudo systemctl start ghost-node | ||||
| ``` | ||||
| 
 | ||||
| Wait ~60 seconds! | ||||
| Wait 60 seconds! | ||||
| 
 | ||||
| Check node is started: | ||||
| ```bash | ||||
| @ -440,6 +535,11 @@ sudo systemctl status ghost-node | ||||
| 
 | ||||
| For exit press _CTRL+C_ | ||||
| 
 | ||||
| In order to insert keys run the following flags `--check-keys` `--insert-keys`: | ||||
| ```bash | ||||
| ./scripts/starter.sh --check-keys --insert-keys | ||||
| ``` | ||||
| 
 | ||||
| Restart `ghost-node`: | ||||
| ```bash | ||||
| sudo systemctl restart ghost-node | ||||
|  | ||||
							
								
								
									
										14
									
								
								cli/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										14
									
								
								cli/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -52,14 +52,14 @@ substrate-build-script-utils = { workspace = true } | ||||
| default = ["cli", "db", "full-node"] | ||||
| db = ["service/db"] | ||||
| cli = [ | ||||
|     "clap", | ||||
| 	"clap", | ||||
|     "frame-benchmarking-cli", | ||||
|     "sc-cli", | ||||
|     "sc-service", | ||||
|     "sc-tracing", | ||||
|     "service", | ||||
|     "ghost-client-cli", | ||||
|     "ghost-machine-primitives", | ||||
| 	"sc-cli", | ||||
| 	"sc-service", | ||||
| 	"sc-tracing", | ||||
| 	"service", | ||||
| 	"ghost-client-cli", | ||||
| 	"ghost-machine-primitives", | ||||
| ] | ||||
| runtime-benchmarks = [ | ||||
|     "frame-benchmarking-cli?/runtime-benchmarks", | ||||
|  | ||||
							
								
								
									
										2
									
								
								cli/build.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										2
									
								
								cli/build.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -1,4 +1,4 @@ | ||||
| fn main() { | ||||
| fn main () { | ||||
|     if let Ok(profile) = std::env::var("PROFILE") { | ||||
|         println!("cargo:rustc-cfg=build_type=\"{}\"", profile); | ||||
|     } | ||||
|  | ||||
							
								
								
									
										2
									
								
								cli/src/cli.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										2
									
								
								cli/src/cli.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -84,7 +84,7 @@ pub struct RunCmd { | ||||
|     #[arg(long)] | ||||
|     pub no_hardware_benchmarks: bool, | ||||
| 
 | ||||
|     /// Enable the block authoring backoff that is triggered when finality is
 | ||||
|     /// Enable the block authoring backoff that is triggered when finality is 
 | ||||
|     /// lagging.
 | ||||
|     #[arg(long)] | ||||
|     pub force_authoring_backoff: bool, | ||||
|  | ||||
							
								
								
									
										191
									
								
								cli/src/command.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										191
									
								
								cli/src/command.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -1,13 +1,14 @@ | ||||
| use crate::cli::{Cli, Subcommand}; | ||||
| use frame_benchmarking_cli::{BenchmarkCmd, ExtrinsicFactory}; | ||||
| use futures::future::TryFutureExt; | ||||
| use keyring::Sr25519Keyring; | ||||
| use sc_cli::SubstrateCli; | ||||
| use service::{ | ||||
|     self, | ||||
|     benchmarking::{benchmark_inherent_data, RemarkBuilder, TransferKeepAliveBuilder}, | ||||
|     IdentifyVariant, | ||||
|     self, IdentifyVariant, | ||||
|     benchmarking::{ | ||||
|         benchmark_inherent_data, RemarkBuilder, TransferKeepAliveBuilder | ||||
|     }, | ||||
| }; | ||||
| use keyring::Sr25519Keyring; | ||||
| 
 | ||||
| pub use crate::{error::Error, service::BlockId}; | ||||
| #[cfg(feature = "pyroscope")] | ||||
| @ -67,35 +68,28 @@ impl SubstrateCli for Cli { | ||||
|             #[cfg(feature = "casper-native")] | ||||
|             "casper" => Box::new(service::chain_spec::casper_config()?), | ||||
|             #[cfg(feature = "casper-native")] | ||||
|             "casper-dev" | "dev" | "development" => { | ||||
|                 Box::new(service::chain_spec::casper_development_config()?) | ||||
|             } | ||||
|             "casper-dev" | "dev" | "development" => Box::new(service::chain_spec::casper_development_config()?), | ||||
|             #[cfg(feature = "casper-native")] | ||||
|             "casper-local" | "local" => { | ||||
|                 Box::new(service::chain_spec::casper_local_testnet_config()?) | ||||
|             } | ||||
|             "casper-local" | "local" => Box::new(service::chain_spec::casper_local_testnet_config()?), | ||||
|             #[cfg(feature = "casper-native")] | ||||
|             "casper-staging" | "staging" => { | ||||
|                 Box::new(service::chain_spec::casper_staging_testnet_config()?) | ||||
|             } | ||||
|             "casper-staging" | "staging" => Box::new(service::chain_spec::casper_staging_testnet_config()?), | ||||
|             #[cfg(not(feature = "casper-native"))] | ||||
|             name if name.starts_with("casper-") && !name.ends_with(".json") => Err(format!( | ||||
|                 "`{}` only supported with `casper-native` feature enabled.", | ||||
|                 name | ||||
|             ))?, | ||||
|             name if name.starts_with("casper-") && !name.ends_with(".json") => | ||||
|                 Err(format!("`{}` only supported with `casper-native` feature enabled.", name))?, | ||||
|             #[cfg(feature = "casper-native")] | ||||
|             path => { | ||||
|                 let path = std::path::PathBuf::from(path); | ||||
| 
 | ||||
|                 let chain_spec = Box::new(service::GenericChainSpec::from_json_file(path.clone())?) | ||||
|                     as Box<dyn service::ChainSpec>; | ||||
|                 let chain_spec = Box::new( | ||||
|                    service::GenericChainSpec::from_json_file(path.clone())? | ||||
|                 ) as Box<dyn service::ChainSpec>; | ||||
| 
 | ||||
|                 if chain_spec.is_casper() { | ||||
|                     Box::new(service::CasperChainSpec::from_json_file(path)?) | ||||
|                    Box::new(service::CasperChainSpec::from_json_file(path)?) | ||||
|                 } else { | ||||
|                     chain_spec | ||||
|                    chain_spec | ||||
|                 } | ||||
|             } | ||||
|             }, | ||||
|         }) | ||||
|     } | ||||
| } | ||||
| @ -115,7 +109,10 @@ fn set_ss58_version(spec: &Box<dyn service::ChainSpec>) { | ||||
|     sp_core::crypto::set_default_ss58_version(ss58_version); | ||||
| } | ||||
| 
 | ||||
| fn run_node_inner<F>(cli: Cli, logger_hook: F) -> Result<()> | ||||
| fn run_node_inner<F>( | ||||
|     cli: Cli, | ||||
|     logger_hook: F, | ||||
| ) -> Result<()> 
 | ||||
| where | ||||
|     F: FnOnce(&mut sc_cli::LoggerBuilder, &sc_service::Configuration), | ||||
| { | ||||
| @ -131,8 +128,7 @@ where | ||||
|             .then_some(config.database.path().map(|database_path| { | ||||
|                 let _ = std::fs::create_dir_all(&database_path); | ||||
|                 sc_sysinfo::gather_hwbench(Some(database_path)) | ||||
|             })) | ||||
|             .flatten(); | ||||
|             })).flatten(); | ||||
| 
 | ||||
|         let database_source = config.database.clone(); | ||||
|         let task_manager = service::build_full( | ||||
| @ -142,8 +138,7 @@ where | ||||
|                 telemetry_worker_handle: None, | ||||
|                 hwbench, | ||||
|             }, | ||||
|         ) | ||||
|         .map(|full| full.task_manager)?; | ||||
|         ).map(|full| full.task_manager)?; | ||||
| 
 | ||||
|         if let Some(path) = database_source.path() { | ||||
|             sc_storage_monitor::StorageMonitorService::try_spawn( | ||||
| @ -172,9 +167,7 @@ pub fn run() -> Result<()> { | ||||
|         let agent = pyro::Pyroscope::builder( | ||||
|             "http://".to_owned() + address.to_string().as_str(), | ||||
|             "ghost".to_owned(), | ||||
|         ) | ||||
|         .backend(pprof_backend(PprofConfig::new().sample_rate(113))) | ||||
|         .build()?; | ||||
|         ).backend(pprof_backend(PprofConfig::new().sample_rate(113))).build()?; | ||||
| 
 | ||||
|         Some(agent.start()?) | ||||
|     } else { | ||||
| @ -183,7 +176,7 @@ pub fn run() -> Result<()> { | ||||
| 
 | ||||
|     #[cfg(not(feature = "pyroscope"))] | ||||
|     if cli.run.pyroscope_server.is_some() { | ||||
|         return Err(Error::PyroscopeNotCompiledIn); | ||||
|         return Err(Error::PyroscopeNotCompiledIn) | ||||
|     } | ||||
| 
 | ||||
|     match &cli.subcommand { | ||||
| @ -191,7 +184,7 @@ pub fn run() -> Result<()> { | ||||
|         Some(Subcommand::BuildSpec(cmd)) => { | ||||
|             let runner = cli.create_runner(cmd).map_err(Error::SubstrateCli)?; | ||||
|             Ok(runner.sync_run(|config| cmd.run(config.chain_spec, config.network))?) | ||||
|         } | ||||
|         }, | ||||
|         Some(Subcommand::CheckBlock(cmd)) => { | ||||
|             let runner = cli.create_runner(cmd).map_err(Error::SubstrateCli)?; | ||||
|             let chain_spec = &runner.config().chain_spec; | ||||
| @ -199,13 +192,11 @@ pub fn run() -> Result<()> { | ||||
|             set_ss58_version(chain_spec); | ||||
| 
 | ||||
|             runner.async_run(|mut config| { | ||||
|                 let (client, _, import_queue, task_manager) = service::new_chain_ops(&mut config)?; | ||||
|                 Ok(( | ||||
|                     cmd.run(client, import_queue).map_err(Error::SubstrateCli), | ||||
|                     task_manager, | ||||
|                 )) | ||||
|                 let (client, _, import_queue, task_manager) = | ||||
|                     service::new_chain_ops(&mut config)?; | ||||
|                 Ok((cmd.run(client, import_queue).map_err(Error::SubstrateCli), task_manager)) | ||||
|             }) | ||||
|         } | ||||
|         }, | ||||
|         Some(Subcommand::ExportBlocks(cmd)) => { | ||||
|             let runner = cli.create_runner(cmd).map_err(Error::SubstrateCli)?; | ||||
|             let chain_spec = &runner.config().chain_spec; | ||||
| @ -213,14 +204,11 @@ pub fn run() -> Result<()> { | ||||
|             set_ss58_version(chain_spec); | ||||
| 
 | ||||
|             Ok(runner.async_run(|mut config| { | ||||
|                 let (client, _, _, task_manager) = service::new_chain_ops(&mut config)?; | ||||
|                 Ok(( | ||||
|                     cmd.run(client, config.database) | ||||
|                         .map_err(Error::SubstrateCli), | ||||
|                     task_manager, | ||||
|                 )) | ||||
|                 let ( client, _, _, task_manager ) = 
 | ||||
|                     service::new_chain_ops(&mut config)?; | ||||
|                 Ok((cmd.run(client, config.database).map_err(Error::SubstrateCli), task_manager)) | ||||
|             })?) | ||||
|         } | ||||
|         }, | ||||
|         Some(Subcommand::ExportState(cmd)) => { | ||||
|             let runner = cli.create_runner(cmd).map_err(Error::SubstrateCli)?; | ||||
|             let chain_spec = &runner.config().chain_spec; | ||||
| @ -228,14 +216,11 @@ pub fn run() -> Result<()> { | ||||
|             set_ss58_version(chain_spec); | ||||
| 
 | ||||
|             Ok(runner.async_run(|mut config| { | ||||
|                 let (client, _, _, task_manager) = service::new_chain_ops(&mut config)?; | ||||
|                 Ok(( | ||||
|                     cmd.run(client, config.chain_spec) | ||||
|                         .map_err(Error::SubstrateCli), | ||||
|                     task_manager, | ||||
|                 )) | ||||
|                 let ( client, _, _, task_manager ) = 
 | ||||
|                     service::new_chain_ops(&mut config)?; | ||||
|                 Ok((cmd.run(client, config.chain_spec).map_err(Error::SubstrateCli), task_manager)) | ||||
|             })?) | ||||
|         } | ||||
|         }, | ||||
|         Some(Subcommand::ImportBlocks(cmd)) => { | ||||
|             let runner = cli.create_runner(cmd).map_err(Error::SubstrateCli)?; | ||||
|             let chain_spec = &runner.config().chain_spec; | ||||
| @ -243,17 +228,15 @@ pub fn run() -> Result<()> { | ||||
|             set_ss58_version(chain_spec); | ||||
| 
 | ||||
|             Ok(runner.async_run(|mut config| { | ||||
|                 let (client, _, import_queue, task_manager) = service::new_chain_ops(&mut config)?; | ||||
|                 Ok(( | ||||
|                     cmd.run(client, import_queue).map_err(Error::SubstrateCli), | ||||
|                     task_manager, | ||||
|                 )) | ||||
|                 let ( client, _, import_queue, task_manager ) = 
 | ||||
|                     service::new_chain_ops(&mut config)?; | ||||
|                 Ok((cmd.run(client, import_queue).map_err(Error::SubstrateCli), task_manager)) | ||||
|             })?) | ||||
|         } | ||||
|         }, | ||||
|         Some(Subcommand::PurgeChain(cmd)) => { | ||||
|             let runner = cli.create_runner(cmd).map_err(Error::SubstrateCli)?; | ||||
|             Ok(runner.sync_run(|config| cmd.run(config.database))?) | ||||
|         } | ||||
|         }, | ||||
|         Some(Subcommand::Revert(cmd)) => { | ||||
|             let runner = cli.create_runner(cmd).map_err(Error::SubstrateCli)?; | ||||
|             let chain_spec = &runner.config().chain_spec; | ||||
| @ -261,59 +244,62 @@ pub fn run() -> Result<()> { | ||||
|             set_ss58_version(chain_spec); | ||||
| 
 | ||||
|             Ok(runner.async_run(|mut config| { | ||||
|                 let (client, backend, _, task_manager) = service::new_chain_ops(&mut config)?; | ||||
|                 let (client, backend, _, task_manager) = 
 | ||||
|                     service::new_chain_ops(&mut config)?; | ||||
| 
 | ||||
|                 let aux_revert = Box::new(|client, backend, blocks| { | ||||
|                     service::revert_backend(client, backend, blocks).map_err(|err| match err { | ||||
|                         service::Error::Blockchain(err) => err.into(), | ||||
|                         err => sc_cli::Error::Application(err.into()), | ||||
|                     service::revert_backend(client, backend, blocks).map_err(|err| { | ||||
|                         match err { | ||||
|                             service::Error::Blockchain(err) => err.into(), | ||||
|                             err => sc_cli::Error::Application(err.into()), | ||||
|                         } | ||||
|                     }) | ||||
|                 }); | ||||
| 
 | ||||
|                 Ok(( | ||||
|                     cmd.run(client, backend, Some(aux_revert)) | ||||
|                         .map_err(Error::SubstrateCli), | ||||
|                     task_manager, | ||||
|                     cmd.run(client, backend, Some(aux_revert)).map_err(Error::SubstrateCli), | ||||
|                     task_manager | ||||
|                 )) | ||||
|             })?) | ||||
|         } | ||||
|         }, | ||||
|         Some(Subcommand::Benchmark(cmd)) => { | ||||
|             let runner = cli.create_runner(cmd).map_err(Error::SubstrateCli)?; | ||||
|             let chain_spec = &runner.config().chain_spec; | ||||
| 
 | ||||
|             match cmd { | ||||
|                 #[cfg(not(feature = "runtime-benchmarks"))] | ||||
|                 BenchmarkCmd::Storage(_) => { | ||||
|                 BenchmarkCmd::Storage(_) => 
 | ||||
|                     return Err(sc_cli::Error::Input( | ||||
|                         "Compile with `--feature=runtime-benchmarks \ | ||||
|                         to enable storage benchmarks." | ||||
|                             .into(), | ||||
|                     ) | ||||
|                     .into()) | ||||
|                 } | ||||
|                         to enable storage benchmarks.".into()
 | ||||
|                     ).into()), | ||||
|                 #[cfg(feature = "runtime-benchmarks")] | ||||
|                 BenchmarkCmd::Storage(cmd) => runner.sync_run(|mut config| { | ||||
|                     let (client, backend, _, _) = service::new_chain_ops(&mut config)?; | ||||
|                     let (client, backend, _, _,) = 
 | ||||
|                         service::new_chain_ops(&mut config)?; | ||||
|                     let db = backend.expose_db(); | ||||
|                     let storage = backend.expose_storage(); | ||||
| 
 | ||||
|                     cmd.run(config, client.clone(), db, storage) | ||||
|                         .map_err(Error::SubstrateCli) | ||||
|                     cmd.run(config, client.clone(), db, storage).map_err(Error::SubstrateCli) | ||||
|                 }), | ||||
|                 BenchmarkCmd::Block(cmd) => runner.sync_run(|mut config| { | ||||
|                     let (client, _, _, _) = service::new_chain_ops(&mut config)?; | ||||
|                     let (client, _, _, _,) = 
 | ||||
|                         service::new_chain_ops(&mut config)?; | ||||
|                     cmd.run(client.clone()).map_err(Error::SubstrateCli) | ||||
|                 }), | ||||
|                 // These commands are very similar and can be handled in nearly the same way
 | ||||
|                 BenchmarkCmd::Extrinsic(_) | BenchmarkCmd::Overhead(_) => { | ||||
|                 BenchmarkCmd::Extrinsic(_) | BenchmarkCmd::Overhead(_) => | ||||
|                     runner.sync_run(|mut config| { | ||||
|                         let (client, _, _, _) = service::new_chain_ops(&mut config)?; | ||||
|                         let (client, _, _, _) = 
 | ||||
|                             service::new_chain_ops(&mut config)?; | ||||
| 
 | ||||
|                         let inherent_data = benchmark_inherent_data() | ||||
|                             .map_err(|e| format!("generating inherent data: {:?}", e))?; | ||||
| 
 | ||||
|                         let remark_builder = | ||||
|                             RemarkBuilder::new(client.clone(), config.chain_spec.identify_chain()); | ||||
|                         let remark_builder = RemarkBuilder::new( | ||||
|                             client.clone(), 
 | ||||
|                             config.chain_spec.identify_chain(), | ||||
|                         ); | ||||
| 
 | ||||
|                         match cmd { | ||||
|                             BenchmarkCmd::Extrinsic(cmd) => { | ||||
| @ -330,20 +316,17 @@ pub fn run() -> Result<()> { | ||||
| 
 | ||||
|                                 cmd.run(client.clone(), inherent_data, Vec::new(), &ext_factory) | ||||
|                                     .map_err(Error::SubstrateCli) | ||||
|                             } | ||||
|                             BenchmarkCmd::Overhead(cmd) => cmd | ||||
|                                 .run( | ||||
|                                     config, | ||||
|                                     client.clone(), | ||||
|                                     inherent_data, | ||||
|                                     Vec::new(), | ||||
|                                     &remark_builder, | ||||
|                                 ) | ||||
|                                 .map_err(Error::SubstrateCli), | ||||
|                             }, | ||||
|                             BenchmarkCmd::Overhead(cmd) => cmd.run( | ||||
|                                 config, | ||||
|                                 client.clone(), | ||||
|                                 inherent_data, | ||||
|                                 Vec::new(), | ||||
|                                 &remark_builder, | ||||
|                             ).map_err(Error::SubstrateCli), | ||||
|                             _ => unreachable!("Ensured by the outside match; qed"), | ||||
|                         } | ||||
|                     }) | ||||
|                 } | ||||
|                     }), | ||||
|                 BenchmarkCmd::Pallet(cmd) => { | ||||
|                     set_ss58_version(chain_spec); | ||||
| 
 | ||||
| @ -351,36 +334,30 @@ pub fn run() -> Result<()> { | ||||
|                         runner.sync_run(|config| { | ||||
|                             cmd.run_with_spec::<sp_runtime::traits::HashingFor<service::Block>, ()>( | ||||
|                                 Some(config.chain_spec), | ||||
|                             ) | ||||
|                             .map_err(|e| Error::SubstrateCli(e)) | ||||
|                             ).map_err(|e| Error::SubstrateCli(e)) | ||||
|                         }) | ||||
|                     } else { | ||||
|                         Err(sc_cli::Error::Input( | ||||
|                             "Benchmarking wasn't enabled when building the node. \ | ||||
|                             You can enable it with `--features=runtime-benchmarks`." | ||||
|                                 .into(), | ||||
|                         ) | ||||
|                         .into()) | ||||
|                             You can enable it with `--features=runtime-benchmarks`.".into()
 | ||||
|                         ).into()) | ||||
|                     } | ||||
|                 } | ||||
|                 }, | ||||
|                 BenchmarkCmd::Machine(cmd) => runner.sync_run(|config| { | ||||
|                     cmd.run( | ||||
|                         &config, | ||||
|                         ghost_machine_primitives::GHOST_NODE_REFERENCE_HARDWARE.clone(), | ||||
|                     ) | ||||
|                     .map_err(Error::SubstrateCli) | ||||
|                     cmd.run(&config, ghost_machine_primitives::GHOST_NODE_REFERENCE_HARDWARE.clone()) | ||||
|                         .map_err(Error::SubstrateCli) | ||||
|                 }), | ||||
|                 // Note: this allows to implement additional new benchmark
 | ||||
|                 // commands.
 | ||||
|                 #[allow(unreachable_patterns)] | ||||
|                 _ => Err(Error::CommandNotImplemented), | ||||
|             } | ||||
|         } | ||||
|         }, | ||||
|         Some(Subcommand::Key(cmd)) => Ok(cmd.run(&cli)?), | ||||
|         Some(Subcommand::ChainInfo(cmd)) => { | ||||
|             let runner = cli.create_runner(cmd)?; | ||||
|             Ok(runner.sync_run(|config| cmd.run::<service::Block>(&config))?) | ||||
|         } | ||||
|         }, | ||||
|     }?; | ||||
| 
 | ||||
|     #[cfg(feature = "pyroscope")] | ||||
|  | ||||
							
								
								
									
										0
									
								
								cli/src/error.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								cli/src/error.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
								
								
									
										4
									
								
								cli/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										4
									
								
								cli/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -6,7 +6,9 @@ mod command; | ||||
| mod error; | ||||
| 
 | ||||
| #[cfg(feature = "service")] | ||||
| pub use service::{self, Block, CoreApi, IdentifyVariant, ProvideRuntimeApi, TFullClient}; | ||||
| pub use service::{ | ||||
|     self, Block, CoreApi, IdentifyVariant, ProvideRuntimeApi, TFullClient, | ||||
| }; | ||||
| 
 | ||||
| #[cfg(feature = "cli")] | ||||
| pub use cli::*; | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| [package] | ||||
| name = "ghost-client-cli" | ||||
| version = "0.1.4" | ||||
| version = "0.1.3" | ||||
| description = "Ghost CLI interface" | ||||
| license.workspace = true | ||||
| authors.workspace = true | ||||
|  | ||||
| @ -3,10 +3,13 @@ | ||||
| use bip39::Mnemonic; | ||||
| use clap::Parser; | ||||
| use itertools::Itertools; | ||||
| use sc_cli::{with_crypto_scheme, CryptoSchemeFlag, Error, KeystoreParams, OutputTypeFlag}; | ||||
| use sc_cli::{ | ||||
|     with_crypto_scheme, KeystoreParams, OutputTypeFlag, 
 | ||||
|     CryptoSchemeFlag, Error, | ||||
| }; | ||||
| 
 | ||||
| use crate::commands::utils::print_from_uri; | ||||
| use crate::params::NetworkSchemeFlag; | ||||
| use crate::commands::utils::print_from_uri; | ||||
| 
 | ||||
| /// The `generate` command
 | ||||
| #[derive(Debug, Clone, Parser)] | ||||
| @ -14,58 +17,58 @@ use crate::params::NetworkSchemeFlag; | ||||
| pub struct GenerateCmd { | ||||
|     /// The number of words in the phrase to generate. One of 12 (default),
 | ||||
|     /// 15, 18, 21 and 24.
 | ||||
|     #[arg(short = 'w', long, value_name = "WORDS")] | ||||
|     words: Option<usize>, | ||||
| 	#[arg(short = 'w', long, value_name = "WORDS")] | ||||
| 	words: Option<usize>, | ||||
| 
 | ||||
|     #[allow(missing_docs)] | ||||
|     #[clap(flatten)] | ||||
|     pub keystore_params: KeystoreParams, | ||||
| 	#[allow(missing_docs)] | ||||
| 	#[clap(flatten)] | ||||
| 	pub keystore_params: KeystoreParams, | ||||
| 
 | ||||
|     #[allow(missing_docs)] | ||||
|     #[clap(flatten)] | ||||
|     pub network_scheme: NetworkSchemeFlag, | ||||
| 	#[allow(missing_docs)] | ||||
| 	#[clap(flatten)] | ||||
| 	pub network_scheme: NetworkSchemeFlag, | ||||
| 
 | ||||
|     #[allow(missing_docs)] | ||||
|     #[clap(flatten)] | ||||
|     pub output_scheme: OutputTypeFlag, | ||||
| 	#[allow(missing_docs)] | ||||
| 	#[clap(flatten)] | ||||
| 	pub output_scheme: OutputTypeFlag, | ||||
| 
 | ||||
|     #[allow(missing_docs)] | ||||
|     #[clap(flatten)] | ||||
|     pub crypto_scheme: CryptoSchemeFlag, | ||||
| 	#[allow(missing_docs)] | ||||
| 	#[clap(flatten)] | ||||
| 	pub crypto_scheme: CryptoSchemeFlag, | ||||
| } | ||||
| 
 | ||||
| impl GenerateCmd { | ||||
|     /// Run the command
 | ||||
|     pub fn run(&self) -> Result<(), Error> { | ||||
|         let words = match self.words { | ||||
| 	/// Run the command
 | ||||
| 	pub fn run(&self) -> Result<(), Error> { | ||||
| 		let words = match self.words { | ||||
|             Some(words_count) if [12, 15, 18, 21, 24].contains(&words_count) => Ok(words_count), | ||||
|             Some(_) => Err(Error::Input( | ||||
|                 "Invalid number of words given for phrase: must be 12/15/18/21/24".into(), | ||||
|             )), | ||||
|             None => Ok(12), | ||||
|         }?; | ||||
|         let mnemonic = Mnemonic::generate(words) | ||||
| 		}?; | ||||
| 		let mnemonic = Mnemonic::generate(words) | ||||
|             .map_err(|e| Error::Input(format!("Mnemonic generation failed: {e}").into()))?; | ||||
|         let password = self.keystore_params.read_password()?; | ||||
|         let output = self.output_scheme.output_type; | ||||
| 		let password = self.keystore_params.read_password()?; | ||||
| 		let output = self.output_scheme.output_type; | ||||
| 
 | ||||
|         let phrase = mnemonic.words().join(" "); | ||||
| 
 | ||||
|         with_crypto_scheme!( | ||||
|             self.crypto_scheme.scheme, | ||||
|             print_from_uri(&phrase, password, self.network_scheme.network, output) | ||||
|         ); | ||||
|         Ok(()) | ||||
|     } | ||||
| 		with_crypto_scheme!( | ||||
| 			self.crypto_scheme.scheme, | ||||
| 			print_from_uri(&phrase, password, self.network_scheme.network, output) | ||||
| 		); | ||||
| 		Ok(()) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
| 	use super::*; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn generate() { | ||||
|         let generate = GenerateCmd::parse_from(&["generate", "--password", "12345"]); | ||||
|         assert!(generate.run().is_ok()) | ||||
|     } | ||||
| 	#[test] | ||||
| 	fn generate() { | ||||
| 		let generate = GenerateCmd::parse_from(&["generate", "--password", "12345"]); | ||||
| 		assert!(generate.run().is_ok()) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -1,101 +1,102 @@ | ||||
| //! Implementation of the `inspect` subcommand
 | ||||
| 
 | ||||
| use crate::commands::utils::{print_from_public, print_from_uri}; | ||||
| use crate::params::NetworkSchemeFlag; | ||||
| use clap::Parser; | ||||
| use sc_cli::{ | ||||
|     utils::read_uri, with_crypto_scheme, CryptoSchemeFlag, Error, KeystoreParams, OutputTypeFlag, | ||||
| }; | ||||
| use sp_core::crypto::{ExposeSecret, SecretString, SecretUri, Ss58Codec}; | ||||
| use std::str::FromStr; | ||||
| use sc_cli::{ | ||||
|     with_crypto_scheme, KeystoreParams, OutputTypeFlag, CryptoSchemeFlag, Error, | ||||
|     utils::read_uri, | ||||
| }; | ||||
| use crate::params::NetworkSchemeFlag; | ||||
| use crate::commands::utils::{print_from_public, print_from_uri}; | ||||
| 
 | ||||
| /// The `inspect` command
 | ||||
| #[derive(Debug, Parser)] | ||||
| #[command(
 | ||||
|     name = "inspect", | ||||
|     about = "Gets a public key and a SS58 address from the provided Secret URI" | ||||
| 	name = "inspect", | ||||
| 	about = "Gets a public key and a SS58 address from the provided Secret URI" | ||||
| )] | ||||
| pub struct InspectKeyCmd { | ||||
|     /// A Key URI to be inspected. May be a secret seed, secret URI
 | ||||
|     /// (with derivation paths and password), SS58, public URI or a hex encoded public key.
 | ||||
|     ///
 | ||||
|     /// If it is a hex encoded public key, `--public` needs to be given as argument.
 | ||||
|     ///
 | ||||
|     /// If the given value is a file, the file content will be used
 | ||||
|     /// as URI.
 | ||||
|     ///
 | ||||
|     /// If omitted, you will be prompted for the URI.
 | ||||
|     uri: Option<String>, | ||||
| 	/// A Key URI to be inspected. May be a secret seed, secret URI
 | ||||
| 	/// (with derivation paths and password), SS58, public URI or a hex encoded public key.
 | ||||
| 	///
 | ||||
| 	/// If it is a hex encoded public key, `--public` needs to be given as argument.
 | ||||
| 	///
 | ||||
| 	/// If the given value is a file, the file content will be used
 | ||||
| 	/// as URI.
 | ||||
| 	///
 | ||||
| 	/// If omitted, you will be prompted for the URI.
 | ||||
| 	uri: Option<String>, | ||||
| 
 | ||||
|     /// Is the given `uri` a hex encoded public key?
 | ||||
|     #[arg(long)] | ||||
|     public: bool, | ||||
| 	/// Is the given `uri` a hex encoded public key?
 | ||||
| 	#[arg(long)] | ||||
| 	public: bool, | ||||
| 
 | ||||
|     #[allow(missing_docs)] | ||||
|     #[clap(flatten)] | ||||
|     pub keystore_params: KeystoreParams, | ||||
| 	#[allow(missing_docs)] | ||||
| 	#[clap(flatten)] | ||||
| 	pub keystore_params: KeystoreParams, | ||||
| 
 | ||||
|     #[allow(missing_docs)] | ||||
|     #[clap(flatten)] | ||||
|     pub network_scheme: NetworkSchemeFlag, | ||||
| 	#[allow(missing_docs)] | ||||
| 	#[clap(flatten)] | ||||
| 	pub network_scheme: NetworkSchemeFlag, | ||||
| 
 | ||||
|     #[allow(missing_docs)] | ||||
|     #[clap(flatten)] | ||||
|     pub output_scheme: OutputTypeFlag, | ||||
| 	#[allow(missing_docs)] | ||||
| 	#[clap(flatten)] | ||||
| 	pub output_scheme: OutputTypeFlag, | ||||
| 
 | ||||
|     #[allow(missing_docs)] | ||||
|     #[clap(flatten)] | ||||
|     pub crypto_scheme: CryptoSchemeFlag, | ||||
| 	#[allow(missing_docs)] | ||||
| 	#[clap(flatten)] | ||||
| 	pub crypto_scheme: CryptoSchemeFlag, | ||||
| 
 | ||||
|     /// Expect that `--uri` has the given public key/account-id.
 | ||||
|     ///
 | ||||
|     /// If `--uri` has any derivations, the public key is checked against the base `uri`, i.e. the
 | ||||
|     /// `uri` without any derivation applied. However, if `uri` has a password or there is one
 | ||||
|     /// given by `--password`, it will be used to decrypt `uri` before comparing the public
 | ||||
|     /// key/account-id.
 | ||||
|     ///
 | ||||
|     /// If there is no derivation in `--uri`, the public key will be checked against the public key
 | ||||
|     /// of `--uri` directly.
 | ||||
|     #[arg(long, conflicts_with = "public")] | ||||
|     pub expect_public: Option<String>, | ||||
| 	/// Expect that `--uri` has the given public key/account-id.
 | ||||
| 	///
 | ||||
| 	/// If `--uri` has any derivations, the public key is checked against the base `uri`, i.e. the
 | ||||
| 	/// `uri` without any derivation applied. However, if `uri` has a password or there is one
 | ||||
| 	/// given by `--password`, it will be used to decrypt `uri` before comparing the public
 | ||||
| 	/// key/account-id.
 | ||||
| 	///
 | ||||
| 	/// If there is no derivation in `--uri`, the public key will be checked against the public key
 | ||||
| 	/// of `--uri` directly.
 | ||||
| 	#[arg(long, conflicts_with = "public")] | ||||
| 	pub expect_public: Option<String>, | ||||
| } | ||||
| 
 | ||||
| impl InspectKeyCmd { | ||||
|     /// Run the command
 | ||||
|     pub fn run(&self) -> Result<(), Error> { | ||||
|         let uri = read_uri(self.uri.as_ref())?; | ||||
|         let password = self.keystore_params.read_password()?; | ||||
| 	/// Run the command
 | ||||
| 	pub fn run(&self) -> Result<(), Error> { | ||||
| 		let uri = read_uri(self.uri.as_ref())?; | ||||
| 		let password = self.keystore_params.read_password()?; | ||||
| 
 | ||||
|         if self.public { | ||||
|             with_crypto_scheme!( | ||||
|                 self.crypto_scheme.scheme, | ||||
|                 print_from_public( | ||||
|                     &uri, | ||||
|                     self.network_scheme.network, | ||||
|                     self.output_scheme.output_type, | ||||
|                 ) | ||||
|             )?; | ||||
|         } else { | ||||
|             if let Some(ref expect_public) = self.expect_public { | ||||
|                 with_crypto_scheme!( | ||||
|                     self.crypto_scheme.scheme, | ||||
|                     expect_public_from_phrase(expect_public, &uri, password.as_ref()) | ||||
|                 )?; | ||||
|             } | ||||
| 		if self.public { | ||||
| 			with_crypto_scheme!( | ||||
| 				self.crypto_scheme.scheme, | ||||
| 				print_from_public( | ||||
| 					&uri, | ||||
| 					self.network_scheme.network, | ||||
| 					self.output_scheme.output_type, | ||||
| 				) | ||||
| 			)?; | ||||
| 		} else { | ||||
| 			if let Some(ref expect_public) = self.expect_public { | ||||
| 				with_crypto_scheme!( | ||||
| 					self.crypto_scheme.scheme, | ||||
| 					expect_public_from_phrase(expect_public, &uri, password.as_ref()) | ||||
| 				)?; | ||||
| 			} | ||||
| 
 | ||||
|             with_crypto_scheme!( | ||||
|                 self.crypto_scheme.scheme, | ||||
|                 print_from_uri( | ||||
|                     &uri, | ||||
|                     password, | ||||
|                     self.network_scheme.network, | ||||
|                     self.output_scheme.output_type, | ||||
|                 ) | ||||
|             ); | ||||
|         } | ||||
| 			with_crypto_scheme!( | ||||
| 				self.crypto_scheme.scheme, | ||||
| 				print_from_uri( | ||||
| 					&uri, | ||||
| 					password, | ||||
| 					self.network_scheme.network, | ||||
| 					self.output_scheme.output_type, | ||||
| 				) | ||||
| 			); | ||||
| 		} | ||||
| 
 | ||||
|         Ok(()) | ||||
|     } | ||||
| 		Ok(()) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /// Checks that `expect_public` is the public key of `suri`.
 | ||||
| @ -105,156 +106,148 @@ impl InspectKeyCmd { | ||||
| ///
 | ||||
| /// Returns an error if the public key does not match.
 | ||||
| fn expect_public_from_phrase<Pair: sp_core::Pair>( | ||||
|     expect_public: &str, | ||||
|     suri: &str, | ||||
|     password: Option<&SecretString>, | ||||
| 	expect_public: &str, | ||||
| 	suri: &str, | ||||
| 	password: Option<&SecretString>, | ||||
| ) -> Result<(), Error> { | ||||
|     let secret_uri = SecretUri::from_str(suri).map_err(|e| format!("{:?}", e))?; | ||||
|     let expected_public = if let Some(public) = expect_public.strip_prefix("0x") { | ||||
|         let hex_public = array_bytes::hex2bytes(public) | ||||
|             .map_err(|_| format!("Invalid expected public key hex: `{}`", expect_public))?; | ||||
|         Pair::Public::try_from(&hex_public) | ||||
|             .map_err(|_| format!("Invalid expected public key: `{}`", expect_public))? | ||||
|     } else { | ||||
|         Pair::Public::from_string_with_version(expect_public) | ||||
|             .map_err(|_| format!("Invalid expected account id: `{}`", expect_public))? | ||||
|             .0 | ||||
|     }; | ||||
| 	let secret_uri = SecretUri::from_str(suri).map_err(|e| format!("{:?}", e))?; | ||||
| 	let expected_public = if let Some(public) = expect_public.strip_prefix("0x") { | ||||
| 		let hex_public = array_bytes::hex2bytes(public) | ||||
| 			.map_err(|_| format!("Invalid expected public key hex: `{}`", expect_public))?; | ||||
| 		Pair::Public::try_from(&hex_public) | ||||
| 			.map_err(|_| format!("Invalid expected public key: `{}`", expect_public))? | ||||
| 	} else { | ||||
| 		Pair::Public::from_string_with_version(expect_public) | ||||
| 			.map_err(|_| format!("Invalid expected account id: `{}`", expect_public))? | ||||
| 			.0 | ||||
| 	}; | ||||
| 
 | ||||
|     let pair = Pair::from_string_with_seed( | ||||
|         secret_uri.phrase.expose_secret().as_str(), | ||||
|         password | ||||
|             .or_else(|| secret_uri.password.as_ref()) | ||||
|             .map(|p| p.expose_secret().as_str()), | ||||
|     ) | ||||
|     .map_err(|_| format!("Invalid secret uri: {}", suri))? | ||||
|     .0; | ||||
| 	let pair = Pair::from_string_with_seed( | ||||
| 		secret_uri.phrase.expose_secret().as_str(), | ||||
| 		password | ||||
| 			.or_else(|| secret_uri.password.as_ref()) | ||||
| 			.map(|p| p.expose_secret().as_str()), | ||||
| 	) | ||||
| 	.map_err(|_| format!("Invalid secret uri: {}", suri))? | ||||
| 	.0; | ||||
| 
 | ||||
|     if pair.public() == expected_public { | ||||
|         Ok(()) | ||||
|     } else { | ||||
|         Err(format!("Expected public ({}) key does not match.", expect_public).into()) | ||||
|     } | ||||
| 	if pair.public() == expected_public { | ||||
| 		Ok(()) | ||||
| 	} else { | ||||
| 		Err(format!("Expected public ({}) key does not match.", expect_public).into()) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
|     use sp_core::crypto::{ByteArray, Pair}; | ||||
|     use sp_runtime::traits::IdentifyAccount; | ||||
| 	use super::*; | ||||
| 	use sp_core::crypto::{ByteArray, Pair}; | ||||
| 	use sp_runtime::traits::IdentifyAccount; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn inspect() { | ||||
|         let words = | ||||
|             "remember fiber forum demise paper uniform squirrel feel access exclude casual effort"; | ||||
|         let seed = "0xad1fb77243b536b90cfe5f0d351ab1b1ac40e3890b41dc64f766ee56340cfca5"; | ||||
| 	#[test] | ||||
| 	fn inspect() { | ||||
| 		let words = | ||||
| 			"remember fiber forum demise paper uniform squirrel feel access exclude casual effort"; | ||||
| 		let seed = "0xad1fb77243b536b90cfe5f0d351ab1b1ac40e3890b41dc64f766ee56340cfca5"; | ||||
| 
 | ||||
|         let inspect = InspectKeyCmd::parse_from(&["inspect-key", words, "--password", "12345"]); | ||||
|         assert!(inspect.run().is_ok()); | ||||
| 		let inspect = InspectKeyCmd::parse_from(&["inspect-key", words, "--password", "12345"]); | ||||
| 		assert!(inspect.run().is_ok()); | ||||
| 
 | ||||
|         let inspect = InspectKeyCmd::parse_from(&["inspect-key", seed]); | ||||
|         assert!(inspect.run().is_ok()); | ||||
|     } | ||||
| 		let inspect = InspectKeyCmd::parse_from(&["inspect-key", seed]); | ||||
| 		assert!(inspect.run().is_ok()); | ||||
| 	} | ||||
| 
 | ||||
|     #[test] | ||||
|     fn inspect_public_key() { | ||||
|         let public = "0x12e76e0ae8ce41b6516cce52b3f23a08dcb4cfeed53c6ee8f5eb9f7367341069"; | ||||
| 	#[test] | ||||
| 	fn inspect_public_key() { | ||||
| 		let public = "0x12e76e0ae8ce41b6516cce52b3f23a08dcb4cfeed53c6ee8f5eb9f7367341069"; | ||||
| 
 | ||||
|         let inspect = InspectKeyCmd::parse_from(&["inspect-key", "--public", public]); | ||||
|         assert!(inspect.run().is_ok()); | ||||
|     } | ||||
| 		let inspect = InspectKeyCmd::parse_from(&["inspect-key", "--public", public]); | ||||
| 		assert!(inspect.run().is_ok()); | ||||
| 	} | ||||
| 
 | ||||
|     #[test] | ||||
|     fn inspect_with_expected_public_key() { | ||||
|         let check_cmd = |seed, expected_public, success| { | ||||
|             let inspect = InspectKeyCmd::parse_from(&[ | ||||
|                 "inspect-key", | ||||
|                 "--expect-public", | ||||
|                 expected_public, | ||||
|                 seed, | ||||
|             ]); | ||||
|             let res = inspect.run(); | ||||
| 	#[test] | ||||
| 	fn inspect_with_expected_public_key() { | ||||
| 		let check_cmd = |seed, expected_public, success| { | ||||
| 			let inspect = InspectKeyCmd::parse_from(&[ | ||||
| 				"inspect-key", | ||||
| 				"--expect-public", | ||||
| 				expected_public, | ||||
| 				seed, | ||||
| 			]); | ||||
| 			let res = inspect.run(); | ||||
| 
 | ||||
|             if success { | ||||
|                 assert!(res.is_ok()); | ||||
|             } else { | ||||
|                 assert!(res.unwrap_err().to_string().contains(&format!( | ||||
|                     "Expected public ({}) key does not match.", | ||||
|                     expected_public | ||||
|                 ))); | ||||
|             } | ||||
|         }; | ||||
| 			if success { | ||||
| 				assert!(res.is_ok()); | ||||
| 			} else { | ||||
| 				assert!(res.unwrap_err().to_string().contains(&format!( | ||||
| 					"Expected public ({}) key does not match.", | ||||
| 					expected_public | ||||
| 				))); | ||||
| 			} | ||||
| 		}; | ||||
| 
 | ||||
|         let seed = | ||||
|             "remember fiber forum demise paper uniform squirrel feel access exclude casual effort"; | ||||
|         let invalid_public = "0x12e76e0ae8ce41b6516cce52b3f23a08dcb4cfeed53c6ee8f5eb9f7367341069"; | ||||
|         let valid_public = sp_core::sr25519::Pair::from_string_with_seed(seed, None) | ||||
|             .expect("Valid") | ||||
|             .0 | ||||
|             .public(); | ||||
|         let valid_public_hex = array_bytes::bytes2hex("0x", valid_public.as_slice()); | ||||
|         let valid_accountid = format!("{}", valid_public.into_account()); | ||||
| 		let seed = | ||||
| 			"remember fiber forum demise paper uniform squirrel feel access exclude casual effort"; | ||||
| 		let invalid_public = "0x12e76e0ae8ce41b6516cce52b3f23a08dcb4cfeed53c6ee8f5eb9f7367341069"; | ||||
| 		let valid_public = sp_core::sr25519::Pair::from_string_with_seed(seed, None) | ||||
| 			.expect("Valid") | ||||
| 			.0 | ||||
| 			.public(); | ||||
| 		let valid_public_hex = array_bytes::bytes2hex("0x", valid_public.as_slice()); | ||||
| 		let valid_accountid = format!("{}", valid_public.into_account()); | ||||
| 
 | ||||
|         // It should fail with the invalid public key
 | ||||
|         check_cmd(seed, invalid_public, false); | ||||
| 		// It should fail with the invalid public key
 | ||||
| 		check_cmd(seed, invalid_public, false); | ||||
| 
 | ||||
|         // It should work with the valid public key & account id
 | ||||
|         check_cmd(seed, &valid_public_hex, true); | ||||
|         check_cmd(seed, &valid_accountid, true); | ||||
| 		// It should work with the valid public key & account id
 | ||||
| 		check_cmd(seed, &valid_public_hex, true); | ||||
| 		check_cmd(seed, &valid_accountid, true); | ||||
| 
 | ||||
|         let password = "test12245"; | ||||
|         let seed_with_password = format!("{}///{}", seed, password); | ||||
|         let valid_public_with_password = | ||||
|             sp_core::sr25519::Pair::from_string_with_seed(&seed_with_password, Some(password)) | ||||
|                 .expect("Valid") | ||||
|                 .0 | ||||
|                 .public(); | ||||
|         let valid_public_hex_with_password = | ||||
|             array_bytes::bytes2hex("0x", valid_public_with_password.as_slice()); | ||||
|         let valid_accountid_with_password = | ||||
|             format!("{}", &valid_public_with_password.into_account()); | ||||
| 		let password = "test12245"; | ||||
| 		let seed_with_password = format!("{}///{}", seed, password); | ||||
| 		let valid_public_with_password = | ||||
| 			sp_core::sr25519::Pair::from_string_with_seed(&seed_with_password, Some(password)) | ||||
| 				.expect("Valid") | ||||
| 				.0 | ||||
| 				.public(); | ||||
| 		let valid_public_hex_with_password = | ||||
| 			array_bytes::bytes2hex("0x", valid_public_with_password.as_slice()); | ||||
| 		let valid_accountid_with_password = | ||||
| 			format!("{}", &valid_public_with_password.into_account()); | ||||
| 
 | ||||
|         // Only the public key that corresponds to the seed with password should be accepted.
 | ||||
|         check_cmd(&seed_with_password, &valid_public_hex, false); | ||||
|         check_cmd(&seed_with_password, &valid_accountid, false); | ||||
| 		// Only the public key that corresponds to the seed with password should be accepted.
 | ||||
| 		check_cmd(&seed_with_password, &valid_public_hex, false); | ||||
| 		check_cmd(&seed_with_password, &valid_accountid, false); | ||||
| 
 | ||||
|         check_cmd(&seed_with_password, &valid_public_hex_with_password, true); | ||||
|         check_cmd(&seed_with_password, &valid_accountid_with_password, true); | ||||
| 		check_cmd(&seed_with_password, &valid_public_hex_with_password, true); | ||||
| 		check_cmd(&seed_with_password, &valid_accountid_with_password, true); | ||||
| 
 | ||||
|         let seed_with_password_and_derivation = format!("{}//test//account///{}", seed, password); | ||||
| 		let seed_with_password_and_derivation = format!("{}//test//account///{}", seed, password); | ||||
| 
 | ||||
|         let valid_public_with_password_and_derivation = | ||||
|             sp_core::sr25519::Pair::from_string_with_seed( | ||||
|                 &seed_with_password_and_derivation, | ||||
|                 Some(password), | ||||
|             ) | ||||
|             .expect("Valid") | ||||
|             .0 | ||||
|             .public(); | ||||
|         let valid_public_hex_with_password_and_derivation = | ||||
|             array_bytes::bytes2hex("0x", valid_public_with_password_and_derivation.as_slice()); | ||||
| 		let valid_public_with_password_and_derivation = | ||||
| 			sp_core::sr25519::Pair::from_string_with_seed( | ||||
| 				&seed_with_password_and_derivation, | ||||
| 				Some(password), | ||||
| 			) | ||||
| 			.expect("Valid") | ||||
| 			.0 | ||||
| 			.public(); | ||||
| 		let valid_public_hex_with_password_and_derivation = | ||||
| 			array_bytes::bytes2hex("0x", valid_public_with_password_and_derivation.as_slice()); | ||||
| 
 | ||||
|         // They should still be valid, because we check the base secret key.
 | ||||
|         check_cmd( | ||||
|             &seed_with_password_and_derivation, | ||||
|             &valid_public_hex_with_password, | ||||
|             true, | ||||
|         ); | ||||
|         check_cmd( | ||||
|             &seed_with_password_and_derivation, | ||||
|             &valid_accountid_with_password, | ||||
|             true, | ||||
|         ); | ||||
| 		// They should still be valid, because we check the base secret key.
 | ||||
| 		check_cmd(&seed_with_password_and_derivation, &valid_public_hex_with_password, true); | ||||
| 		check_cmd(&seed_with_password_and_derivation, &valid_accountid_with_password, true); | ||||
| 
 | ||||
|         // And these should be invalid.
 | ||||
|         check_cmd(&seed_with_password_and_derivation, &valid_public_hex, false); | ||||
|         check_cmd(&seed_with_password_and_derivation, &valid_accountid, false); | ||||
| 		// And these should be invalid.
 | ||||
| 		check_cmd(&seed_with_password_and_derivation, &valid_public_hex, false); | ||||
| 		check_cmd(&seed_with_password_and_derivation, &valid_accountid, false); | ||||
| 
 | ||||
|         // The public of the derived account should fail.
 | ||||
|         check_cmd( | ||||
|             &seed_with_password_and_derivation, | ||||
|             &valid_public_hex_with_password_and_derivation, | ||||
|             false, | ||||
|         ); | ||||
|     } | ||||
| 		// The public of the derived account should fail.
 | ||||
| 		check_cmd( | ||||
| 			&seed_with_password_and_derivation, | ||||
| 			&valid_public_hex_with_password_and_derivation, | ||||
| 			false, | ||||
| 		); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -1,37 +1,40 @@ | ||||
| //! Key related CLI utilities
 | ||||
| 
 | ||||
| use super::{generate::GenerateCmd, inspect_key::InspectKeyCmd}; | ||||
| use sc_cli::{Error, GenerateKeyCmdCommon, InsertKeyCmd, InspectNodeKeyCmd, SubstrateCli}; | ||||
| use sc_cli::{ | ||||
|     GenerateKeyCmdCommon, InsertKeyCmd, InspectNodeKeyCmd, Error, 
 | ||||
|     SubstrateCli, | ||||
| }; | ||||
| 
 | ||||
| /// Key utilities for the cli.
 | ||||
| #[derive(Debug, clap::Subcommand)] | ||||
| pub enum KeySubcommand { | ||||
|     /// Generate a random node key, write it to a file or stdout and write the
 | ||||
|     /// corresponding peer-id to stderr
 | ||||
|     GenerateNodeKey(GenerateKeyCmdCommon), | ||||
| 	/// Generate a random node key, write it to a file or stdout and write the
 | ||||
| 	/// corresponding peer-id to stderr
 | ||||
| 	GenerateNodeKey(GenerateKeyCmdCommon), | ||||
| 
 | ||||
|     /// Generate a Substrate-based random account
 | ||||
|     Generate(GenerateCmd), | ||||
| 	/// Generate a Substrate-based random account
 | ||||
| 	Generate(GenerateCmd), | ||||
| 
 | ||||
|     /// Gets a public key and a SS58 address from the provided Secret URI
 | ||||
|     Inspect(InspectKeyCmd), | ||||
| 	/// Gets a public key and a SS58 address from the provided Secret URI
 | ||||
| 	Inspect(InspectKeyCmd), | ||||
| 
 | ||||
|     /// Load a node key from a file or stdin and print the corresponding peer-id
 | ||||
|     InspectNodeKey(InspectNodeKeyCmd), | ||||
| 	/// Load a node key from a file or stdin and print the corresponding peer-id
 | ||||
| 	InspectNodeKey(InspectNodeKeyCmd), | ||||
| 
 | ||||
|     /// Insert a key to the keystore of a node.
 | ||||
|     Insert(InsertKeyCmd), | ||||
| 	/// Insert a key to the keystore of a node.
 | ||||
| 	Insert(InsertKeyCmd), | ||||
| } | ||||
| 
 | ||||
| impl KeySubcommand { | ||||
|     /// run the key subcommands
 | ||||
|     pub fn run<C: SubstrateCli>(&self, cli: &C) -> Result<(), Error> { | ||||
|         match self { | ||||
|             KeySubcommand::GenerateNodeKey(cmd) => cmd.run(), | ||||
|             KeySubcommand::Generate(cmd) => cmd.run(), | ||||
|             KeySubcommand::Inspect(cmd) => cmd.run(), | ||||
|             KeySubcommand::Insert(cmd) => cmd.run(cli), | ||||
|             KeySubcommand::InspectNodeKey(cmd) => cmd.run(), | ||||
|         } | ||||
|     } | ||||
| 	/// run the key subcommands
 | ||||
| 	pub fn run<C: SubstrateCli>(&self, cli: &C) -> Result<(), Error> { | ||||
| 		match self { | ||||
| 			KeySubcommand::GenerateNodeKey(cmd) => cmd.run(), | ||||
| 			KeySubcommand::Generate(cmd) => cmd.run(), | ||||
| 			KeySubcommand::Inspect(cmd) => cmd.run(), | ||||
| 			KeySubcommand::Insert(cmd) => cmd.run(cli), | ||||
| 			KeySubcommand::InspectNodeKey(cmd) => cmd.run(), | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -1,13 +1,11 @@ | ||||
| mod generate; | ||||
| mod inspect_key; | ||||
| mod key; | ||||
| mod utils; | ||||
| mod generate; | ||||
| mod vanity; | ||||
| mod inspect_key; | ||||
| mod utils; | ||||
| 
 | ||||
| pub use self::{ | ||||
|     key::KeySubcommand, vanity::VanityCmd, inspect_key::InspectKeyCmd, | ||||
|     generate::GenerateCmd, | ||||
|     inspect_key::InspectKeyCmd, | ||||
|     key::KeySubcommand, | ||||
|     utils::{print_from_public, print_from_uri, unwrap_or_default_ss58_name}, | ||||
|     vanity::VanityCmd, | ||||
|     utils::{unwrap_or_default_ss58_name, print_from_uri, print_from_public}, | ||||
| }; | ||||
|  | ||||
| @ -1,206 +1,194 @@ | ||||
| use sc_cli::{ | ||||
|     utils::{PublicFor, SeedFor}, | ||||
|     OutputType, | ||||
| }; | ||||
| use serde_json::json; | ||||
| use sc_cli::{ | ||||
|     OutputType, | ||||
|     utils::{PublicFor, SeedFor}, | ||||
| }; | ||||
| use sp_runtime::{traits::IdentifyAccount, MultiSigner}; | ||||
| use sp_core::{ | ||||
|     crypto::{ | ||||
|         unwrap_or_default_ss58_version, ExposeSecret, SecretString, Ss58AddressFormat, Ss58Codec, | ||||
|         unwrap_or_default_ss58_version, | ||||
|         Ss58Codec, ExposeSecret, Ss58AddressFormat, SecretString, | ||||
|     }, | ||||
|     hexdisplay::HexDisplay, | ||||
| }; | ||||
| use sp_runtime::{traits::IdentifyAccount, MultiSigner}; | ||||
| 
 | ||||
| pub fn print_from_uri<Pair>( | ||||
|     uri: &str, | ||||
|     password: Option<SecretString>, | ||||
|     network_override: Option<Ss58AddressFormat>, | ||||
|     output: OutputType, | ||||
| 	uri: &str, | ||||
| 	password: Option<SecretString>, | ||||
| 	network_override: Option<Ss58AddressFormat>, | ||||
| 	output: OutputType, | ||||
| ) where | ||||
|     Pair: sp_core::Pair, | ||||
|     Pair::Public: Into<MultiSigner>, | ||||
| 	Pair: sp_core::Pair, | ||||
| 	Pair::Public: Into<MultiSigner>, | ||||
| { | ||||
|     let password = password.as_ref().map(|s| s.expose_secret().as_str()); | ||||
|     let network_id = unwrap_or_default_ss58_name(network_override); | ||||
| 	let password = password.as_ref().map(|s| s.expose_secret().as_str()); | ||||
| 	let network_id = unwrap_or_default_ss58_name(network_override); | ||||
| 
 | ||||
|     if let Ok((pair, seed)) = Pair::from_phrase(uri, password) { | ||||
|         let public_key = pair.public(); | ||||
|         let network_override = unwrap_or_default_ss58_version(network_override); | ||||
| 	if let Ok((pair, seed)) = Pair::from_phrase(uri, password) { | ||||
| 		let public_key = pair.public(); | ||||
| 		let network_override = unwrap_or_default_ss58_version(network_override); | ||||
| 
 | ||||
|         match output { | ||||
|             OutputType::Json => { | ||||
|                 let json = json!({ | ||||
|                     "secretPhrase": uri, | ||||
|                     "networkId": network_id, | ||||
|                     "secretSeed": format_seed::<Pair>(seed), | ||||
|                     "publicKey": format_public_key::<Pair>(public_key.clone()), | ||||
|                     "ss58PublicKey": public_key.to_ss58check_with_version(network_override), | ||||
|                     "accountId": format_account_id::<Pair>(public_key), | ||||
|                     "ss58Address": pair.public().into().into_account().to_ss58check_with_version(network_override), | ||||
|                 }); | ||||
|                 println!( | ||||
|                     "{}", | ||||
|                     serde_json::to_string_pretty(&json).expect("Json pretty print failed") | ||||
|                 ); | ||||
|             } | ||||
|             OutputType::Text => { | ||||
|                 println!( | ||||
|                     "Secret phrase:       {}\n  \ | ||||
| 		match output { | ||||
| 			OutputType::Json => { | ||||
| 				let json = json!({ | ||||
| 					"secretPhrase": uri, | ||||
| 					"networkId": network_id, | ||||
| 					"secretSeed": format_seed::<Pair>(seed), | ||||
| 					"publicKey": format_public_key::<Pair>(public_key.clone()), | ||||
| 					"ss58PublicKey": public_key.to_ss58check_with_version(network_override), | ||||
| 					"accountId": format_account_id::<Pair>(public_key), | ||||
| 					"ss58Address": pair.public().into().into_account().to_ss58check_with_version(network_override), | ||||
| 				}); | ||||
| 				println!( | ||||
| 					"{}", | ||||
| 					serde_json::to_string_pretty(&json).expect("Json pretty print failed") | ||||
| 				); | ||||
| 			}, | ||||
| 			OutputType::Text => { | ||||
| 				println!( | ||||
| 					"Secret phrase:       {}\n  \ | ||||
| 					Network ID:        {}\n  \ | ||||
| 					Secret seed:       {}\n  \ | ||||
| 					Public key (hex):  {}\n  \ | ||||
| 					Account ID:        {}\n  \ | ||||
| 					Public key (SS58): {}\n  \ | ||||
| 					SS58 Address:      {}",
 | ||||
|                     uri, | ||||
|                     network_id, | ||||
|                     format_seed::<Pair>(seed), | ||||
|                     format_public_key::<Pair>(public_key.clone()), | ||||
|                     format_account_id::<Pair>(public_key.clone()), | ||||
|                     public_key.to_ss58check_with_version(network_override), | ||||
|                     pair.public() | ||||
|                         .into() | ||||
|                         .into_account() | ||||
|                         .to_ss58check_with_version(network_override), | ||||
|                 ); | ||||
|             } | ||||
|         } | ||||
|     } else if let Ok((pair, seed)) = Pair::from_string_with_seed(uri, password) { | ||||
|         let public_key = pair.public(); | ||||
|         let network_override = unwrap_or_default_ss58_version(network_override); | ||||
| 					uri, | ||||
| 					network_id, | ||||
| 					format_seed::<Pair>(seed), | ||||
| 					format_public_key::<Pair>(public_key.clone()), | ||||
| 					format_account_id::<Pair>(public_key.clone()), | ||||
| 					public_key.to_ss58check_with_version(network_override), | ||||
| 					pair.public().into().into_account().to_ss58check_with_version(network_override), | ||||
| 				); | ||||
| 			}, | ||||
| 		} | ||||
| 	} else if let Ok((pair, seed)) = Pair::from_string_with_seed(uri, password) { | ||||
| 		let public_key = pair.public(); | ||||
| 		let network_override = unwrap_or_default_ss58_version(network_override); | ||||
| 
 | ||||
|         match output { | ||||
|             OutputType::Json => { | ||||
|                 let json = json!({ | ||||
|                     "secretKeyUri": uri, | ||||
|                     "networkId": network_id, | ||||
|                     "secretSeed": if let Some(seed) = seed { format_seed::<Pair>(seed) } else { "n/a".into() }, | ||||
|                     "publicKey": format_public_key::<Pair>(public_key.clone()), | ||||
|                     "ss58PublicKey": public_key.to_ss58check_with_version(network_override), | ||||
|                     "accountId": format_account_id::<Pair>(public_key), | ||||
|                     "ss58Address": pair.public().into().into_account().to_ss58check_with_version(network_override), | ||||
|                 }); | ||||
|                 println!( | ||||
|                     "{}", | ||||
|                     serde_json::to_string_pretty(&json).expect("Json pretty print failed") | ||||
|                 ); | ||||
|             } | ||||
|             OutputType::Text => { | ||||
|                 println!( | ||||
|                     "Secret Key URI `{}` is account:\n  \ | ||||
| 		match output { | ||||
| 			OutputType::Json => { | ||||
| 				let json = json!({ | ||||
| 					"secretKeyUri": uri, | ||||
| 					"networkId": network_id, | ||||
| 					"secretSeed": if let Some(seed) = seed { format_seed::<Pair>(seed) } else { "n/a".into() }, | ||||
| 					"publicKey": format_public_key::<Pair>(public_key.clone()), | ||||
| 					"ss58PublicKey": public_key.to_ss58check_with_version(network_override), | ||||
| 					"accountId": format_account_id::<Pair>(public_key), | ||||
| 					"ss58Address": pair.public().into().into_account().to_ss58check_with_version(network_override), | ||||
| 				}); | ||||
| 				println!( | ||||
| 					"{}", | ||||
| 					serde_json::to_string_pretty(&json).expect("Json pretty print failed") | ||||
| 				); | ||||
| 			}, | ||||
| 			OutputType::Text => { | ||||
| 				println!( | ||||
| 					"Secret Key URI `{}` is account:\n  \ | ||||
| 					Network ID:        {}\n  \ | ||||
| 					Secret seed:       {}\n  \ | ||||
| 					Public key (hex):  {}\n  \ | ||||
| 					Account ID:        {}\n  \ | ||||
| 					Public key (SS58): {}\n  \ | ||||
| 					SS58 Address:      {}",
 | ||||
|                     uri, | ||||
|                     network_id, | ||||
|                     if let Some(seed) = seed { | ||||
|                         format_seed::<Pair>(seed) | ||||
|                     } else { | ||||
|                         "n/a".into() | ||||
|                     }, | ||||
|                     format_public_key::<Pair>(public_key.clone()), | ||||
|                     format_account_id::<Pair>(public_key.clone()), | ||||
|                     public_key.to_ss58check_with_version(network_override), | ||||
|                     pair.public() | ||||
|                         .into() | ||||
|                         .into_account() | ||||
|                         .to_ss58check_with_version(network_override), | ||||
|                 ); | ||||
|             } | ||||
|         } | ||||
|     } else if let Ok((public_key, network)) = Pair::Public::from_string_with_version(uri) { | ||||
|         let network_override = network_override.unwrap_or(network); | ||||
| 					uri, | ||||
| 					network_id, | ||||
| 					if let Some(seed) = seed { format_seed::<Pair>(seed) } else { "n/a".into() }, | ||||
| 					format_public_key::<Pair>(public_key.clone()), | ||||
| 					format_account_id::<Pair>(public_key.clone()), | ||||
| 					public_key.to_ss58check_with_version(network_override), | ||||
| 					pair.public().into().into_account().to_ss58check_with_version(network_override), | ||||
| 				); | ||||
| 			}, | ||||
| 		} | ||||
| 	} else if let Ok((public_key, network)) = Pair::Public::from_string_with_version(uri) { | ||||
| 		let network_override = network_override.unwrap_or(network); | ||||
| 
 | ||||
|         match output { | ||||
|             OutputType::Json => { | ||||
|                 let json = json!({ | ||||
|                     "publicKeyUri": uri, | ||||
|                     "networkId": String::from(network_override), | ||||
|                     "publicKey": format_public_key::<Pair>(public_key.clone()), | ||||
|                     "accountId": format_account_id::<Pair>(public_key.clone()), | ||||
|                     "ss58PublicKey": public_key.to_ss58check_with_version(network_override), | ||||
|                     "ss58Address": public_key.to_ss58check_with_version(network_override), | ||||
|                 }); | ||||
| 		match output { | ||||
| 			OutputType::Json => { | ||||
| 				let json = json!({ | ||||
| 					"publicKeyUri": uri, | ||||
| 					"networkId": String::from(network_override), | ||||
| 					"publicKey": format_public_key::<Pair>(public_key.clone()), | ||||
| 					"accountId": format_account_id::<Pair>(public_key.clone()), | ||||
| 					"ss58PublicKey": public_key.to_ss58check_with_version(network_override), | ||||
| 					"ss58Address": public_key.to_ss58check_with_version(network_override), | ||||
| 				}); | ||||
| 
 | ||||
|                 println!( | ||||
|                     "{}", | ||||
|                     serde_json::to_string_pretty(&json).expect("Json pretty print failed") | ||||
|                 ); | ||||
|             } | ||||
|             OutputType::Text => { | ||||
|                 println!( | ||||
|                     "Public Key URI `{}` is account:\n  \ | ||||
| 				println!( | ||||
| 					"{}", | ||||
| 					serde_json::to_string_pretty(&json).expect("Json pretty print failed") | ||||
| 				); | ||||
| 			}, | ||||
| 			OutputType::Text => { | ||||
| 				println!( | ||||
| 					"Public Key URI `{}` is account:\n  \ | ||||
| 					 Network ID/Version: {}\n  \ | ||||
| 					 Public key (hex):   {}\n  \ | ||||
| 					 Account ID:         {}\n  \ | ||||
| 					 Public key (SS58):  {}\n  \ | ||||
| 					 SS58 Address:       {}",
 | ||||
|                     uri, | ||||
|                     String::from(network_override), | ||||
|                     format_public_key::<Pair>(public_key.clone()), | ||||
|                     format_account_id::<Pair>(public_key.clone()), | ||||
|                     public_key.to_ss58check_with_version(network_override), | ||||
|                     public_key.to_ss58check_with_version(network_override), | ||||
|                 ); | ||||
|             } | ||||
|         } | ||||
|     } else { | ||||
|         println!("Invalid phrase/URI given"); | ||||
|     } | ||||
| 					uri, | ||||
| 					String::from(network_override), | ||||
| 					format_public_key::<Pair>(public_key.clone()), | ||||
| 					format_account_id::<Pair>(public_key.clone()), | ||||
| 					public_key.to_ss58check_with_version(network_override), | ||||
| 					public_key.to_ss58check_with_version(network_override), | ||||
| 				); | ||||
| 			}, | ||||
| 		} | ||||
| 	} else { | ||||
| 		println!("Invalid phrase/URI given"); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /// Try to parse given `public` as hex encoded public key and print relevant information.
 | ||||
| pub fn print_from_public<Pair>( | ||||
|     public_str: &str, | ||||
|     network_override: Option<Ss58AddressFormat>, | ||||
|     output: OutputType, | ||||
| 	public_str: &str, | ||||
| 	network_override: Option<Ss58AddressFormat>, | ||||
| 	output: OutputType, | ||||
| ) -> Result<(), sc_cli::Error> | ||||
| where | ||||
|     Pair: sp_core::Pair, | ||||
|     Pair::Public: Into<MultiSigner>, | ||||
| 	Pair: sp_core::Pair, | ||||
| 	Pair::Public: Into<MultiSigner>, | ||||
| { | ||||
|     let public = array_bytes::hex2bytes(public_str)?; | ||||
| 	let public = array_bytes::hex2bytes(public_str)?; | ||||
| 
 | ||||
|     let public_key = Pair::Public::try_from(&public) | ||||
|         .map_err(|_| "Failed to construct public key from given hex")?; | ||||
| 	let public_key = Pair::Public::try_from(&public) | ||||
| 		.map_err(|_| "Failed to construct public key from given hex")?; | ||||
| 
 | ||||
|     let network_override = unwrap_or_default_ss58_version(network_override); | ||||
| 	let network_override = unwrap_or_default_ss58_version(network_override); | ||||
| 
 | ||||
|     match output { | ||||
|         OutputType::Json => { | ||||
|             let json = json!({ | ||||
|                 "networkId": String::from(network_override), | ||||
|                 "publicKey": format_public_key::<Pair>(public_key.clone()), | ||||
|                 "accountId": format_account_id::<Pair>(public_key.clone()), | ||||
|                 "ss58PublicKey": public_key.to_ss58check_with_version(network_override), | ||||
|                 "ss58Address": public_key.to_ss58check_with_version(network_override), | ||||
|             }); | ||||
| 	match output { | ||||
| 		OutputType::Json => { | ||||
| 			let json = json!({ | ||||
| 				"networkId": String::from(network_override), | ||||
| 				"publicKey": format_public_key::<Pair>(public_key.clone()), | ||||
| 				"accountId": format_account_id::<Pair>(public_key.clone()), | ||||
| 				"ss58PublicKey": public_key.to_ss58check_with_version(network_override), | ||||
| 				"ss58Address": public_key.to_ss58check_with_version(network_override), | ||||
| 			}); | ||||
| 
 | ||||
|             println!( | ||||
|                 "{}", | ||||
|                 serde_json::to_string_pretty(&json).expect("Json pretty print failed") | ||||
|             ); | ||||
|         } | ||||
|         OutputType::Text => { | ||||
|             println!( | ||||
|                 "Network ID/Version: {}\n  \ | ||||
| 			println!("{}", serde_json::to_string_pretty(&json).expect("Json pretty print failed")); | ||||
| 		}, | ||||
| 		OutputType::Text => { | ||||
| 			println!( | ||||
| 				"Network ID/Version: {}\n  \ | ||||
| 				 Public key (hex):   {}\n  \ | ||||
| 				 Account ID:         {}\n  \ | ||||
| 				 Public key (SS58):  {}\n  \ | ||||
| 				 SS58 Address:       {}",
 | ||||
|                 String::from(network_override), | ||||
|                 format_public_key::<Pair>(public_key.clone()), | ||||
|                 format_account_id::<Pair>(public_key.clone()), | ||||
|                 public_key.to_ss58check_with_version(network_override), | ||||
|                 public_key.to_ss58check_with_version(network_override), | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
| 				String::from(network_override), | ||||
| 				format_public_key::<Pair>(public_key.clone()), | ||||
| 				format_account_id::<Pair>(public_key.clone()), | ||||
| 				public_key.to_ss58check_with_version(network_override), | ||||
| 				public_key.to_ss58check_with_version(network_override), | ||||
| 			); | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
|     Ok(()) | ||||
| 	Ok(()) | ||||
| } | ||||
| 
 | ||||
| pub fn unwrap_or_default_ss58_name(x: Option<Ss58AddressFormat>) -> String { | ||||
| @ -228,8 +216,5 @@ fn format_account_id<P: sp_core::Pair>(public_key: PublicFor<P>) -> String | ||||
| where | ||||
|     PublicFor<P>: Into<MultiSigner>, | ||||
| { | ||||
|     format!( | ||||
|         "0x{}", | ||||
|         HexDisplay::from(&public_key.into().into_account().as_ref()) | ||||
|     ) | ||||
|     format!("0x{}", HexDisplay::from(&public_key.into().into_account().as_ref())) | ||||
| } | ||||
|  | ||||
| @ -2,218 +2,213 @@ | ||||
| 
 | ||||
| use clap::Parser; | ||||
| use rand::{rngs::OsRng, RngCore}; | ||||
| use sc_cli::{utils::format_seed, with_crypto_scheme, CryptoSchemeFlag, Error, OutputTypeFlag}; | ||||
| use sp_core::crypto::{unwrap_or_default_ss58_version, Ss58AddressFormat, Ss58Codec}; | ||||
| use sp_core::crypto::{ | ||||
|     unwrap_or_default_ss58_version, Ss58AddressFormat, Ss58Codec, | ||||
| }; | ||||
| use sp_runtime::traits::IdentifyAccount; | ||||
| use sc_cli::{ | ||||
|     with_crypto_scheme, Error, OutputTypeFlag, CryptoSchemeFlag, | ||||
|     utils::format_seed, | ||||
| }; | ||||
| 
 | ||||
| use crate::commands::utils::print_from_uri; | ||||
| use crate::params::NetworkSchemeFlag; | ||||
| 
 | ||||
| /// The `vanity` command
 | ||||
| #[derive(Debug, Clone, Parser)] | ||||
| #[command(
 | ||||
|     name = "vanity", | ||||
|     about = "Generate a seed that provides a vanity address" | ||||
| )] | ||||
| #[command(name = "vanity", about = "Generate a seed that provides a vanity address")] | ||||
| pub struct VanityCmd { | ||||
|     /// Desired pattern
 | ||||
|     #[arg(long, value_parser = assert_non_empty_string)] | ||||
|     pattern: String, | ||||
| 	/// Desired pattern
 | ||||
| 	#[arg(long, value_parser = assert_non_empty_string)] | ||||
| 	pattern: String, | ||||
| 
 | ||||
|     #[allow(missing_docs)] | ||||
|     #[clap(flatten)] | ||||
|     network_scheme: NetworkSchemeFlag, | ||||
| 	#[allow(missing_docs)] | ||||
| 	#[clap(flatten)] | ||||
| 	network_scheme: NetworkSchemeFlag, | ||||
| 
 | ||||
|     #[allow(missing_docs)] | ||||
|     #[clap(flatten)] | ||||
|     output_scheme: OutputTypeFlag, | ||||
| 	#[allow(missing_docs)] | ||||
| 	#[clap(flatten)] | ||||
| 	output_scheme: OutputTypeFlag, | ||||
| 
 | ||||
|     #[allow(missing_docs)] | ||||
|     #[clap(flatten)] | ||||
|     crypto_scheme: CryptoSchemeFlag, | ||||
| 	#[allow(missing_docs)] | ||||
| 	#[clap(flatten)] | ||||
| 	crypto_scheme: CryptoSchemeFlag, | ||||
| } | ||||
| 
 | ||||
| impl VanityCmd { | ||||
|     /// Run the command
 | ||||
|     pub fn run(&self) -> Result<(), Error> { | ||||
|         let formated_seed = with_crypto_scheme!( | ||||
|             self.crypto_scheme.scheme, | ||||
|             generate_key( | ||||
|                 &self.pattern, | ||||
|                 unwrap_or_default_ss58_version(self.network_scheme.network) | ||||
|             ), | ||||
|         )?; | ||||
| 	/// Run the command
 | ||||
| 	pub fn run(&self) -> Result<(), Error> { | ||||
| 		let formated_seed = with_crypto_scheme!( | ||||
| 			self.crypto_scheme.scheme, | ||||
| 			generate_key( | ||||
| 				&self.pattern, | ||||
| 				unwrap_or_default_ss58_version(self.network_scheme.network) | ||||
| 			), | ||||
| 		)?; | ||||
| 
 | ||||
|         with_crypto_scheme!( | ||||
|             self.crypto_scheme.scheme, | ||||
|             print_from_uri( | ||||
|                 &formated_seed, | ||||
|                 None, | ||||
|                 self.network_scheme.network, | ||||
|                 self.output_scheme.output_type, | ||||
|             ), | ||||
|         ); | ||||
|         Ok(()) | ||||
|     } | ||||
| 		with_crypto_scheme!( | ||||
| 			self.crypto_scheme.scheme, | ||||
| 			print_from_uri( | ||||
| 				&formated_seed, | ||||
| 				None, | ||||
| 				self.network_scheme.network, | ||||
| 				self.output_scheme.output_type, | ||||
| 			), | ||||
| 		); | ||||
| 		Ok(()) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /// genertae a key based on given pattern
 | ||||
| fn generate_key<Pair>( | ||||
|     desired: &str, | ||||
|     network_override: Ss58AddressFormat, | ||||
| 	desired: &str, | ||||
| 	network_override: Ss58AddressFormat, | ||||
| ) -> Result<String, &'static str> | ||||
| where | ||||
|     Pair: sp_core::Pair, | ||||
|     Pair::Public: IdentifyAccount, | ||||
|     <Pair::Public as IdentifyAccount>::AccountId: Ss58Codec, | ||||
| 	Pair: sp_core::Pair, | ||||
| 	Pair::Public: IdentifyAccount, | ||||
| 	<Pair::Public as IdentifyAccount>::AccountId: Ss58Codec, | ||||
| { | ||||
|     println!("Generating key containing pattern '{}'", desired); | ||||
| 	println!("Generating key containing pattern '{}'", desired); | ||||
| 
 | ||||
|     let top = 45 + (desired.len() * 48); | ||||
|     let mut best = 0; | ||||
|     let mut seed = Pair::Seed::default(); | ||||
|     let mut done = 0; | ||||
| 	let top = 45 + (desired.len() * 48); | ||||
| 	let mut best = 0; | ||||
| 	let mut seed = Pair::Seed::default(); | ||||
| 	let mut done = 0; | ||||
| 
 | ||||
|     loop { | ||||
|         if done % 100000 == 0 { | ||||
|             OsRng.fill_bytes(seed.as_mut()); | ||||
|         } else { | ||||
|             next_seed(seed.as_mut()); | ||||
|         } | ||||
| 	loop { | ||||
| 		if done % 100000 == 0 { | ||||
| 			OsRng.fill_bytes(seed.as_mut()); | ||||
| 		} else { | ||||
| 			next_seed(seed.as_mut()); | ||||
| 		} | ||||
| 
 | ||||
|         let p = Pair::from_seed(&seed); | ||||
|         let ss58 = p | ||||
|             .public() | ||||
|             .into_account() | ||||
|             .to_ss58check_with_version(network_override); | ||||
| 		let p = Pair::from_seed(&seed); | ||||
| 		let ss58 = p.public().into_account().to_ss58check_with_version(network_override); | ||||
|         println!("{:?}", ss58); | ||||
|         let score = calculate_score(desired, &ss58); | ||||
|         if score > best || desired.len() < 2 { | ||||
|             best = score; | ||||
|             if best >= top { | ||||
|                 println!("best: {} == top: {}", best, top); | ||||
|                 return Ok(format_seed::<Pair>(seed.clone())); | ||||
|             } | ||||
|         } | ||||
|         done += 1; | ||||
| 		let score = calculate_score(desired, &ss58); | ||||
| 		if score > best || desired.len() < 2 { | ||||
| 			best = score; | ||||
| 			if best >= top { | ||||
| 				println!("best: {} == top: {}", best, top); | ||||
| 				return Ok(format_seed::<Pair>(seed.clone())) | ||||
| 			} | ||||
| 		} | ||||
| 		done += 1; | ||||
| 
 | ||||
|         if done % good_waypoint(done) == 0 { | ||||
|             println!("{} keys searched; best is {}/{} complete", done, best, top); | ||||
|         } | ||||
|     } | ||||
| 		if done % good_waypoint(done) == 0 { | ||||
| 			println!("{} keys searched; best is {}/{} complete", done, best, top); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn good_waypoint(done: u64) -> u64 { | ||||
|     match done { | ||||
|         0..=1_000_000 => 100_000, | ||||
|         1_000_001..=10_000_000 => 1_000_000, | ||||
|         10_000_001..=100_000_000 => 10_000_000, | ||||
|         100_000_001.. => 100_000_000, | ||||
|     } | ||||
| 	match done { | ||||
| 		0..=1_000_000 => 100_000, | ||||
| 		1_000_001..=10_000_000 => 1_000_000, | ||||
| 		10_000_001..=100_000_000 => 10_000_000, | ||||
| 		100_000_001.. => 100_000_000, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn next_seed(seed: &mut [u8]) { | ||||
|     for s in seed { | ||||
|         match s { | ||||
|             255 => { | ||||
|                 *s = 0; | ||||
|             } | ||||
|             _ => { | ||||
|                 *s += 1; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 	for s in seed { | ||||
| 		match s { | ||||
| 			255 => { | ||||
| 				*s = 0; | ||||
| 			}, | ||||
| 			_ => { | ||||
| 				*s += 1; | ||||
| 				break
 | ||||
| 			}, | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /// Calculate the score of a key based on the desired
 | ||||
| /// input.
 | ||||
| fn calculate_score(_desired: &str, key: &str) -> usize { | ||||
|     for truncate in 0.._desired.len() { | ||||
|         let snip_size = _desired.len() - truncate; | ||||
|         let truncated = &_desired[0..snip_size]; | ||||
|         if let Some(pos) = key.find(truncated) { | ||||
|             return (47 - pos) + (snip_size * 48); | ||||
|         } | ||||
|     } | ||||
|     0 | ||||
| 	for truncate in 0.._desired.len() { | ||||
| 		let snip_size = _desired.len() - truncate; | ||||
| 		let truncated = &_desired[0..snip_size]; | ||||
| 		if let Some(pos) = key.find(truncated) { | ||||
| 			return (47 - pos) + (snip_size * 48) | ||||
| 		} | ||||
| 	} | ||||
| 	0 | ||||
| } | ||||
| 
 | ||||
| /// checks that `pattern` is non-empty
 | ||||
| fn assert_non_empty_string(pattern: &str) -> Result<String, &'static str> { | ||||
|     if pattern.is_empty() { | ||||
|         Err("Pattern must not be empty") | ||||
|     } else { | ||||
|         Ok(pattern.to_string()) | ||||
|     } | ||||
| 	if pattern.is_empty() { | ||||
| 		Err("Pattern must not be empty") | ||||
| 	} else { | ||||
| 		Ok(pattern.to_string()) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
|     use sp_core::{ | ||||
|         crypto::{default_ss58_version, Ss58AddressFormatRegistry, Ss58Codec}, | ||||
|         sr25519, Pair, | ||||
|     }; | ||||
| 	use super::*; | ||||
| 	use sp_core::{ | ||||
| 		crypto::{default_ss58_version, Ss58AddressFormatRegistry, Ss58Codec}, | ||||
| 		sr25519, Pair, | ||||
| 	}; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn vanity() { | ||||
|         let vanity = VanityCmd::parse_from(&["vanity", "--pattern", "j"]); | ||||
|         assert!(vanity.run().is_ok()); | ||||
|     } | ||||
| 	#[test] | ||||
| 	fn vanity() { | ||||
| 		let vanity = VanityCmd::parse_from(&["vanity", "--pattern", "j"]); | ||||
| 		assert!(vanity.run().is_ok()); | ||||
| 	} | ||||
| 
 | ||||
|     #[test] | ||||
|     fn test_generation_with_single_char() { | ||||
|         let seed = generate_key::<sr25519::Pair>("ab", default_ss58_version()).unwrap(); | ||||
|         assert!( | ||||
|             sr25519::Pair::from_seed_slice(&array_bytes::hex2bytes_unchecked(&seed)) | ||||
|                 .unwrap() | ||||
|                 .public() | ||||
|                 .to_ss58check() | ||||
|                 .contains("ab") | ||||
|         ); | ||||
|     } | ||||
| 	#[test] | ||||
| 	fn test_generation_with_single_char() { | ||||
| 		let seed = generate_key::<sr25519::Pair>("ab", default_ss58_version()).unwrap(); | ||||
| 		assert!(sr25519::Pair::from_seed_slice(&array_bytes::hex2bytes_unchecked(&seed)) | ||||
| 			.unwrap() | ||||
| 			.public() | ||||
| 			.to_ss58check() | ||||
| 			.contains("ab")); | ||||
| 	} | ||||
| 
 | ||||
|     #[test] | ||||
|     fn generate_key_respects_network_override() { | ||||
|         let seed = | ||||
|             generate_key::<sr25519::Pair>("ab", Ss58AddressFormatRegistry::PolkadotAccount.into()) | ||||
|                 .unwrap(); | ||||
|         assert!( | ||||
|             sr25519::Pair::from_seed_slice(&array_bytes::hex2bytes_unchecked(&seed)) | ||||
|                 .unwrap() | ||||
|                 .public() | ||||
|                 .to_ss58check_with_version(Ss58AddressFormatRegistry::PolkadotAccount.into()) | ||||
|                 .contains("ab") | ||||
|         ); | ||||
|     } | ||||
| 	#[test] | ||||
| 	fn generate_key_respects_network_override() { | ||||
| 		let seed = | ||||
| 			generate_key::<sr25519::Pair>("ab", Ss58AddressFormatRegistry::PolkadotAccount.into()) | ||||
| 				.unwrap(); | ||||
| 		assert!(sr25519::Pair::from_seed_slice(&array_bytes::hex2bytes_unchecked(&seed)) | ||||
| 			.unwrap() | ||||
| 			.public() | ||||
| 			.to_ss58check_with_version(Ss58AddressFormatRegistry::PolkadotAccount.into()) | ||||
| 			.contains("ab")); | ||||
| 	} | ||||
| 
 | ||||
|     #[test] | ||||
|     fn test_score_1_char_100() { | ||||
|         let score = calculate_score("j", "sYrjWiZkEP1PQe2kKEZiC1Bi9L8yFSsB5RPEkzEPd5NThsB5H"); | ||||
|         assert_eq!(score, 96); | ||||
|     } | ||||
| 	#[test] | ||||
| 	fn test_score_1_char_100() { | ||||
| 		let score = calculate_score("j", "sYrjWiZkEP1PQe2kKEZiC1Bi9L8yFSsB5RPEkzEPd5NThsB5H"); | ||||
| 		assert_eq!(score, 96); | ||||
| 	} | ||||
| 
 | ||||
|     #[test] | ||||
|     fn test_score_100() { | ||||
|         let score = calculate_score("ghst", "sYsghstuhYd9p6unUC3kPxjD2gv2zRCztYQaEDCMJpYrPTqTG"); | ||||
|         assert_eq!(score, 246); | ||||
|     } | ||||
| 	#[test] | ||||
| 	fn test_score_100() { | ||||
| 		let score = calculate_score("ghst", "sYsghstuhYd9p6unUC3kPxjD2gv2zRCztYQaEDCMJpYrPTqTG"); | ||||
| 		assert_eq!(score, 246); | ||||
| 	} | ||||
| 
 | ||||
|     #[test] | ||||
|     fn test_score_50_2() { | ||||
|         // 50% for the position + 50% for the size
 | ||||
|         assert_eq!( | ||||
|             calculate_score("ghst", "sYsghXXuhYd9p6unUC3kPxjD2gv2zRCztYQaEDCMJpYrPTqTG"), | ||||
|             146 | ||||
|         ); | ||||
|     } | ||||
| 	#[test] | ||||
| 	fn test_score_50_2() { | ||||
| 		// 50% for the position + 50% for the size
 | ||||
| 		assert_eq!( | ||||
| 			calculate_score("ghst", "sYsghXXuhYd9p6unUC3kPxjD2gv2zRCztYQaEDCMJpYrPTqTG"), | ||||
| 			146 | ||||
| 		); | ||||
| 	} | ||||
| 
 | ||||
|     #[test] | ||||
|     fn test_score_0() { | ||||
|         assert_eq!( | ||||
|             calculate_score("ghst", "sYrjWiZkEP1PQe2kKEZiC1Bi9L8yFSsB5RPEkzEPd5NThsB5H"), | ||||
|             0 | ||||
|         ); | ||||
|     } | ||||
| 	#[test] | ||||
| 	fn test_score_0() { | ||||
| 		assert_eq!( | ||||
| 			calculate_score("ghst", "sYrjWiZkEP1PQe2kKEZiC1Bi9L8yFSsB5RPEkzEPd5NThsB5H"), | ||||
| 			0 | ||||
| 		); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| pub mod commands; | ||||
| pub mod params; | ||||
| pub mod commands; | ||||
| 
 | ||||
| pub use commands::KeySubcommand; | ||||
| pub use commands::VanityCmd; | ||||
|  | ||||
| @ -21,25 +21,19 @@ pub struct InnerSs58AddressFormat(Ss58AddressFormat); | ||||
| impl InnerSs58AddressFormat { | ||||
|     #[inline] | ||||
|     pub fn custom(prefix: u16) -> Self { | ||||
|         Self { | ||||
|             0: Ss58AddressFormat::custom(prefix), | ||||
|         } | ||||
|         Self { 0: Ss58AddressFormat::custom(prefix) } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl std::fmt::Display for InnerSs58AddressFormat { | ||||
|     fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { | ||||
|         write!( | ||||
|             f, | ||||
|             "{} network", | ||||
|             ALL_POSSIBLE_IDS | ||||
|                 .binary_search(&u16::from(self.0)) | ||||
|                 .expect("always be found") | ||||
|         ) | ||||
|         write!(f, "{} network", ALL_POSSIBLE_IDS | ||||
|             .binary_search(&u16::from(self.0)) | ||||
|             .expect("always be found")) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<'a> TryFrom<&'a str> for InnerSs58AddressFormat { | ||||
| impl<'a>TryFrom<&'a str> for InnerSs58AddressFormat { | ||||
|     type Error = ParseError; | ||||
| 
 | ||||
|     fn try_from(x: &'a str) -> Result<Self, Self::Error> { | ||||
| @ -50,13 +44,13 @@ impl<'a> TryFrom<&'a str> for InnerSs58AddressFormat { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub fn parse_s58_prefix_address_format(x: &str) -> Result<Ss58AddressFormat, String> { | ||||
| pub fn parse_s58_prefix_address_format(x: &str,) -> Result<Ss58AddressFormat, String> { | ||||
|     match InnerSs58AddressFormat::try_from(x) { | ||||
|         Ok(format_registry) => Ok(format_registry.0.into()), | ||||
|         Err(_) => Err(format!( | ||||
|             "Unable to parse variant. Known variants: {:?}", | ||||
|             &ALL_POSSIBLE_NAMES | ||||
|         )), | ||||
|         )) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										6
									
								
								core-primitives/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										6
									
								
								core-primitives/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -15,7 +15,7 @@ sp-runtime = { workspace = true } | ||||
| [features] | ||||
| default = ["std"] | ||||
| std = [ | ||||
|     "sp-core/std", | ||||
|     "sp-runtime/std", | ||||
|     "sp-std/std", | ||||
| 	"sp-core/std", | ||||
| 	"sp-runtime/std", | ||||
| 	"sp-std/std", | ||||
| ] | ||||
|  | ||||
							
								
								
									
										0
									
								
								core-primitives/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								core-primitives/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
								
								
									
										0
									
								
								file_header.txt
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								file_header.txt
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
								
								
									
										
											BIN
										
									
								
								images/img_29.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								images/img_29.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 8.1 KiB | 
| @ -14,7 +14,7 @@ pub fn logger_hook() -> impl FnOnce(&mut sc_cli::LoggerBuilder, &sc_service::Con | ||||
|     |_logger_builder, _config| {} | ||||
| } | ||||
| 
 | ||||
| /// This module exports Prometheus types an:d defines
 | ||||
| /// This module exports Prometheus types an:d defines 
 | ||||
| /// the [`Metrics`](metrics::Metrics) trait.
 | ||||
| pub mod metrics { | ||||
|     pub use prometheus_endpoint as prometheus; | ||||
|  | ||||
| @ -22,11 +22,7 @@ impl Metronome { | ||||
|     /// Create a new metronome source with a defined cycle duration.
 | ||||
|     pub fn new(cycle: Duration) -> Self { | ||||
|         let period = cycle.into(); | ||||
|         Self { | ||||
|             period, | ||||
|             delay: Delay::new(period), | ||||
|             state: MetronomeState::Snooze, | ||||
|         } | ||||
|         Self { period, delay: Delay::new(period), state: MetronomeState::Snooze } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -40,14 +36,14 @@ impl futures::Stream for Metronome { | ||||
|                     let val = self.period; | ||||
|                     self.delay.reset(val); | ||||
|                     self.state = MetronomeState::Snooze; | ||||
|                 } | ||||
|                 }, | ||||
|                 MetronomeState::Snooze => { | ||||
|                     if !Pin::new(&mut self.delay).poll(cx).is_ready() { | ||||
|                         break; | ||||
|                         break
 | ||||
|                     } | ||||
|                     self.state = MetronomeState::SetAlarm; | ||||
|                     return Poll::Ready(Some(())); | ||||
|                 } | ||||
|                     return Poll::Ready(Some(())) | ||||
|                 }, | ||||
|             } | ||||
|         } | ||||
|         Poll::Pending | ||||
|  | ||||
| @ -2,16 +2,19 @@ | ||||
| 
 | ||||
| use codec::Decode; | ||||
| use core_primitives::{ | ||||
|     metrics_definitions::{CounterDefinition, CounterVecDefinition, HistogramDefinition}, | ||||
|     metrics_definitions::{ | ||||
|         CounterDefinition, CounterVecDefinition, HistogramDefinition, | ||||
|     }, | ||||
|     RuntimeMetricLabelValues, RuntimeMetricOp, RuntimeMetricUpdate, | ||||
| }; | ||||
| use prometheus_endpoint::{ | ||||
|     register, Counter, CounterVec, Histogram, HistogramOpts, Opts, PrometheusError, Registry, U64, | ||||
|     register, Counter, CounterVec, Histogram, HistogramOpts, Opts, Registry, | ||||
|     PrometheusError, U64, | ||||
| }; | ||||
| use std::{ | ||||
|     collections::hash_map::HashMap, | ||||
|     sync::{Arc, Mutex, MutexGuard}, | ||||
| }; | ||||
| } | ||||
| 
 | ||||
| #[derive(Clone, Debug)] | ||||
| pub struct Metrics { | ||||
| @ -29,15 +32,13 @@ impl RuntimeMetricsProvider { | ||||
| 
 | ||||
|     pub fn register_countervec(&self, countervec: CounterVecDefinition) { | ||||
|         self.with_counter_vecs_lock_held(|mut hashmap| { | ||||
|             hashmap | ||||
|                 .entry(countervec.name.to_owned()) | ||||
|                 .or_insert(register( | ||||
|                     CounterVec::new( | ||||
|                         Opts::new(countervec.name, countervec.description), | ||||
|                         countervec.labels, | ||||
|                     )?, | ||||
|                     &self.0, | ||||
|                 )?); | ||||
|             hashmap.entry(countervec.name.to_owned()).or_insert(register( | ||||
|                 CounterVec::new( | ||||
|                     Opts::new(countervec.name, countervec.description), | ||||
|                     countervec.labels, | ||||
|                 )?, | ||||
|                 &self.0, | ||||
|             )?); | ||||
|             Ok(()) | ||||
|         }) | ||||
|     } | ||||
| @ -45,7 +46,10 @@ impl RuntimeMetricsProvider { | ||||
|     pub fn register_counter(&self, counter: CounterDefinition) { | ||||
|         self.with_counters_lock_held(|mut hashmap| { | ||||
|             hashmap.entry(counter.name.to_owned()).or_insert(register( | ||||
|                 Counter::new(counter.name, counter.description)?, | ||||
|                 Counter::new( | ||||
|                     counter.name, 
 | ||||
|                     counter.description, | ||||
|                 )?, 
 | ||||
|                 &self.0, | ||||
|             )?); | ||||
|             Ok(()) | ||||
| @ -56,7 +60,8 @@ impl RuntimeMetricsProvider { | ||||
|         self.with_histograms_lock_held(|mut hashmap| { | ||||
|             hashmap.entry(hist.name.to_owned()).or_insert(register( | ||||
|                 Histogram::with_opts( | ||||
|                     HistogramOpts::new(hist.name, hist.description).buckets(hist.buckets.to_vec()), | ||||
|                     HistogramOpts::new(hist.name, hist.description) | ||||
|                         .buckets(hist.buckets.to_vec()), | ||||
|                 )?, | ||||
|                 &self.0, | ||||
|             )?); | ||||
| @ -64,21 +69,23 @@ impl RuntimeMetricsProvider { | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
|     pub fn inc_counter_vec_by(&self, name: &str, value: u64, labels: &RuntimeMetricsProvider) { | ||||
|     pub fn inc_counter_vec_by( | ||||
|         &self, 
 | ||||
|         name: &str, 
 | ||||
|         value: u64, 
 | ||||
|         labels: &RuntimeMetricsProvider, | ||||
|     ) { | ||||
|         self.with_counter_vecs_lock_held(|mut hashmap| { | ||||
|             hashmap.entry(name.to_owned()).and_modify(|counter_vec| { | ||||
|                 counter_vec | ||||
|                     .with_label_values(&labels.as_str_vec()) | ||||
|                     .inc_by(value) | ||||
|                 counter_vec.with_label_values(&labels.as_str_vec()).inc_by(value) | ||||
|             }); | ||||
|             Ok(()) | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
|     
 | ||||
|     pub fn inc_counter_by(&self, name: &str, value: u64) { | ||||
|         self.with_counters_lock_held(|mut hashmap| { | ||||
|             hashmap | ||||
|                 .entry(name.to_owned()) | ||||
|             hashmap.entry(name.to_owned()) | ||||
|                 .and_modify(|counter_vec| counter_vec.inc_by(value)); | ||||
|             Ok(()) | ||||
|         }) | ||||
| @ -86,9 +93,8 @@ impl RuntimeMetricsProvider { | ||||
| 
 | ||||
|     pub fn observe_histogram(&self, name: &str, value: u128) { | ||||
|         self.with_histograms_lock_held(|mut hashmap| { | ||||
|             hashmap | ||||
|                 .entry(name.to_owned()) | ||||
|                 .and_modify(|histogram| histogram.observe(value as f64 / 1_000_000_000.0)); | ||||
|             hashmap.entry(name.to_owned()) | ||||
|                 and_modify(|histogram| histogram.observe(value as f64 / 1_000_000_000.0)); | ||||
|             Ok(()) | ||||
|         }) | ||||
|     } | ||||
| @ -97,36 +103,21 @@ impl RuntimeMetricsProvider { | ||||
|     where | ||||
|         F: FnOnce(MutexGuard<'_, HashMap<String, Counter<U64>>>) -> Result<(), PrometheusError>, | ||||
|     { | ||||
|         let _ = self | ||||
|             .1 | ||||
|             .counters | ||||
|             .lock() | ||||
|             .map(do_something) | ||||
|             .or_else(|error| Err(error)); | ||||
|         let _ = self.1.counters.lock().map(do_something).or_else(|error| Err(error)); | ||||
|     } | ||||
| 
 | ||||
|     fn with_counter_vecs_lock_held<F>(&self, do_something: F) | ||||
|     where | ||||
|         F: FnOnce(MutexGuard<'_, HashMap<String, CounterVec<U64>>>) -> Result<(), PrometheusError>, | ||||
|     { | ||||
|         let _ = self | ||||
|             .1 | ||||
|             .counter_vecs | ||||
|             .lock() | ||||
|             .map(do_something) | ||||
|             .or_else(|error| Err(error)); | ||||
|         let _ = self.1.counter_vecs.lock().map(do_something).or_else(|error| Err(error)); | ||||
|     } | ||||
| 
 | ||||
|     fn with_histograms_lock_held<F>(&self, do_something: F) | ||||
|     where | ||||
|         F: FnOnce(MutexGuard<'_, HashMap<String, Histogram>>) -> Result<(), PrometheusError>, | ||||
|     { | ||||
|         let _ = self | ||||
|             .1 | ||||
|             .histograms | ||||
|             .lock() | ||||
|             .map(do_something) | ||||
|             .or_else(|error| Err(error)); | ||||
|         let _ = self.1.histograms.lock().map(do_something).or_else(|error| Err(error)); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -140,7 +131,7 @@ impl sc_tracing::TraceHandler for RuntimeMetricsProvider { | ||||
|             .unwrap_or(&String::default()) | ||||
|             .ne("metrics") | ||||
|         { | ||||
|             return; | ||||
|             return | ||||
|         } | ||||
| 
 | ||||
|         if let Some(update_op_bs58) = event.values.string_values.get("params") { | ||||
| @ -150,7 +141,7 @@ impl sc_tracing::TraceHandler for RuntimeMetricsProvider { | ||||
|                     .as_slice(), | ||||
|             ) { | ||||
|                 Ok(update_op) => self.parse_metric_update(update_op), | ||||
|                 Err(_) => {} | ||||
|                 Err(_) => {}, | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @ -159,15 +150,12 @@ impl sc_tracing::TraceHandler for RuntimeMetricsProvider { | ||||
| impl RuntimeMetricsProvider { | ||||
|     fn parse_metric_update(&self, update: RuntimeMetricUpdate) { | ||||
|         match update.op { | ||||
|             RuntimeMetricOp::IncrementCounterVec(value, ref labels) => { | ||||
|                 self.inc_counter_vec_by(update.metric_name(), value, labels) | ||||
|             } | ||||
|             RuntimeMetricOp::IncrementCounter(value) => { | ||||
|                 self.inc_counter_by(update.metric_name(), value) | ||||
|             } | ||||
|             RuntimeMetricOp::ObserveHistogram(value) => { | ||||
|                 self.observe_histogram(update.metric_name(), value) | ||||
|             } | ||||
|             RuntimeMetricOp::IncrementCounterVec(value, ref labels) => 
 | ||||
|                 self.inc_counter_vec_by(update.metric_name(), value, labels), | ||||
|             RuntimeMetricOp::IncrementCounter(value) => 
 | ||||
|                 self.inc_counter_by(update.metric_name(), value), | ||||
|             RuntimeMetricOp::ObserveHistogram(value) => 
 | ||||
|                 self.observe_histogram(update.metric_name(), value), | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -190,7 +178,7 @@ impl RuntimeMetricsProvider { | ||||
| pub fn logger_hook() -> impl FnOnce(&mut sc_cli::LoggerBuilder, &sc_service::Configuration) -> () { | ||||
|     |logger_builder, config| { | ||||
|         if config.prometheus_registry().is_none() { | ||||
|             return; | ||||
|             return | ||||
|         } | ||||
| 
 | ||||
|         let registry = config.prometheus_registry().cloned().unwrap(); | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| use ghost_test_service::{node_config, run_validator_node, test_prometheus_config}; | ||||
| use hyper::{Client, Uri}; | ||||
| use ghost_test_service::{node_config, run_validator_node, test_prometheus_config}; | ||||
| use keyring::AccountKeyring::*; | ||||
| use std::collections::HashMap; | ||||
| 
 | ||||
| @ -7,13 +7,8 @@ const DEFAULT_PROMETHEUS_PORT: u16 = 9616; | ||||
| 
 | ||||
| #[tokio::test(flavor = "multi_thread")] | ||||
| async fn runtime_can_publish_metrics() { | ||||
|     let mut alice_config = node_config( | ||||
|         || {}, | ||||
|         tokio::runtime::Handle::current(), | ||||
|         Alice, | ||||
|         Vec::new(), | ||||
|         true, | ||||
|     ); | ||||
|     let mut alice_config = | ||||
|         node_config(|| {}, tokio::runtime::Handle::current(), Alice, Vec::new(), true); | ||||
| 
 | ||||
|     // Enable prometheus metrics for Alice.
 | ||||
|     alice_config.prometheus_config = Some(test_prometheus_config(DEFAULT_PROMETHEUS_PORT)); | ||||
| @ -31,13 +26,8 @@ async fn runtime_can_publish_metrics() { | ||||
|     // Start validator Alice
 | ||||
|     let alice = run_validator_node(alice_config, None); | ||||
| 
 | ||||
|     let bob_config = node_config( | ||||
|         || {}, | ||||
|         tokio::runtime::Handle::current(), | ||||
|         Bob, | ||||
|         vec![alice.addr.clone()], | ||||
|         true, | ||||
|     ); | ||||
|     let bob_config = | ||||
|         node_config(|| {}, tokio::runtime::Handle::current(), Bob, vec![alice.addr.clone()], true); | ||||
| 
 | ||||
|     // Start validator Bob
 | ||||
|     let _bob = run_validator_node(bob_config, None); | ||||
| @ -58,25 +48,19 @@ async fn scrape_prometheus_metrics(metrics_uri: &str) -> HashMap<String, u64> { | ||||
|         .expect("GET request failed"); | ||||
| 
 | ||||
|     let body = String::from_utf8( | ||||
|         hyper::body::to_bytes(res) | ||||
|             .await | ||||
|             .expect("can't get body as bytes") | ||||
|             .to_vec(), | ||||
|     ) | ||||
|     .expect("body is not an UTF8 string"); | ||||
|         hyper::body::to_bytes(res).await.expect("can't get body as bytes").to_vec(), | ||||
|     ).expect("body is not an UTF8 string"); | ||||
| 
 | ||||
|     let lines: Vec<_> = body.lines().map(|s| Ok(s.to_owned())).collect(); | ||||
|     prometheus_parse::Scrape::parse(lines.into_iter()) | ||||
|         .expect("Scraper failed to parse Prometheus metrics") | ||||
|         .samples | ||||
|         .into_iter() | ||||
|         .filter_map( | ||||
|             |prometheus_parse::Sample { metric, value, .. }| match value { | ||||
|                 prometheus_parse::Value::Counter(value) => Some((metric, value as u64)), | ||||
|                 prometheus_parse::Value::Gauge(value) => Some((metric, value as u64)), | ||||
|                 prometheus_parse::Value::Untyped(value) => Some((metric, value as u64)), | ||||
|                 _ => None, | ||||
|             }, | ||||
|         ) | ||||
|         .filter_map(|prometheus_parse::Sample { metric, value, .. }| match value { | ||||
|             prometheus_parse::Value::Counter(value) => Some((metric, value as u64)), | ||||
|             prometheus_parse::Value::Gauge(value) => Some((metric, value as u64)), | ||||
|             prometheus_parse::Value::Untyped(value) => Some((metric, value as u64)), | ||||
|             _ => None, | ||||
|         }) | ||||
|         .collect() | ||||
| } | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| [package] | ||||
| name = "ghost-claims" | ||||
| version = "0.2.4" | ||||
| version = "0.2.2" | ||||
| description = "Ghost balance and rank claims based on EVM actions" | ||||
| license.workspace = true | ||||
| authors.workspace = true | ||||
| @ -37,17 +37,17 @@ serde_json = { workspace = true, default-features = true } | ||||
| [features] | ||||
| default = ["std"] | ||||
| std = [ | ||||
|     "frame-benchmarking?/std", | ||||
| 	"frame-benchmarking?/std", | ||||
|     "serde/std", | ||||
|     "codec/std", | ||||
| 	"codec/std", | ||||
|     "scale-info/std", | ||||
|     "libsecp256k1/std", | ||||
|     "frame-support/std", | ||||
|     "frame-system/std", | ||||
|     "sp-core/std", | ||||
|     "sp-runtime/std", | ||||
|     "sp-io/std", | ||||
|     "sp-std/std", | ||||
| 	"libsecp256k1/std", | ||||
| 	"frame-support/std", | ||||
| 	"frame-system/std", | ||||
| 	"sp-core/std", | ||||
| 	"sp-runtime/std", | ||||
| 	"sp-io/std", | ||||
| 	"sp-std/std", | ||||
|     "pallet-ranked-collective/std", | ||||
|     "pallet-vesting/std", | ||||
|     "pallet-balances/std", | ||||
| @ -56,19 +56,19 @@ std = [ | ||||
| runtime-benchmarks = [ | ||||
|     "libsecp256k1/hmac", | ||||
|     "libsecp256k1/static-context", | ||||
|     "frame-benchmarking/runtime-benchmarks", | ||||
|     "frame-support/runtime-benchmarks", | ||||
|     "frame-system/runtime-benchmarks", | ||||
|     "pallet-ranked-collective/runtime-benchmarks", | ||||
|     "pallet-vesting/runtime-benchmarks", | ||||
|     "pallet-balances/runtime-benchmarks", | ||||
|     "sp-runtime/runtime-benchmarks", | ||||
| 	"frame-benchmarking/runtime-benchmarks", | ||||
| 	"frame-support/runtime-benchmarks", | ||||
| 	"frame-system/runtime-benchmarks", | ||||
| 	"pallet-ranked-collective/runtime-benchmarks", | ||||
| 	"pallet-vesting/runtime-benchmarks", | ||||
| 	"pallet-balances/runtime-benchmarks", | ||||
| 	"sp-runtime/runtime-benchmarks", | ||||
| ] | ||||
| try-runtime = [ | ||||
|     "frame-support/try-runtime", | ||||
|     "frame-system/try-runtime", | ||||
|     "pallet-ranked-collective/try-runtime", | ||||
|     "pallet-vesting/try-runtime", | ||||
|     "pallet-balances/try-runtime", | ||||
|     "sp-runtime/try-runtime", | ||||
| 	"frame-support/try-runtime", | ||||
| 	"frame-system/try-runtime", | ||||
| 	"pallet-ranked-collective/try-runtime", | ||||
| 	"pallet-vesting/try-runtime", | ||||
| 	"pallet-balances/try-runtime", | ||||
| 	"sp-runtime/try-runtime", | ||||
| ] | ||||
|  | ||||
| @ -6,14 +6,14 @@ use frame_benchmarking::v2::*; | ||||
| #[instance_benchmarks] | ||||
| mod benchmarks { | ||||
|     use super::*; | ||||
|     use frame_support::dispatch::RawOrigin; | ||||
|     use pallet_ranked_collective::Pallet as Club; | ||||
|     use frame_support::dispatch::RawOrigin; | ||||
| 
 | ||||
|     #[benchmark] | ||||
|     fn claim() { | ||||
|         let i = 1337u32; | ||||
|         let ethereum_secret_key = | ||||
|             libsecp256k1::SecretKey::parse(&keccak_256(&i.to_le_bytes())).unwrap(); | ||||
|         let ethereum_secret_key = libsecp256k1::SecretKey::parse( | ||||
|             &keccak_256(&i.to_le_bytes())).unwrap(); | ||||
|         let eth_address = crate::secp_utils::eth(ðereum_secret_key); | ||||
| 
 | ||||
|         let balance = CurrencyOf::<T, I>::minimum_balance(); | ||||
| @ -22,30 +22,23 @@ mod benchmarks { | ||||
|         Total::<T, I>::put(balance); | ||||
| 
 | ||||
|         let pseudo_rank = 5u16; | ||||
|         let _ = Club::<T, I>::do_add_member_to_rank(pseudo_account.clone(), pseudo_rank, false); | ||||
|         let _ = Club::<T, I>::do_add_member_to_rank( | ||||
|             pseudo_account.clone(), 
 | ||||
|             pseudo_rank, 
 | ||||
|             false, | ||||
|         ); | ||||
| 
 | ||||
|         let user_account: T::AccountId = account("user", i, 0); | ||||
|         let signature = | ||||
|             crate::secp_utils::sig::<T, I>(ðereum_secret_key, &user_account.encode()); | ||||
| 
 | ||||
|         let signature = crate::secp_utils::sig::<T, I>(ðereum_secret_key, &user_account.encode()); | ||||
|     
 | ||||
|         let prev_balance = CurrencyOf::<T, I>::free_balance(&user_account); | ||||
|         let prev_rank = Club::<T, I>::rank_of(&user_account); | ||||
| 
 | ||||
|         #[extrinsic_call] | ||||
|         claim( | ||||
|             RawOrigin::Signed(user_account.clone()), | ||||
|             eth_address, | ||||
|             signature, | ||||
|         ); | ||||
|         claim(RawOrigin::Signed(user_account.clone()), eth_address, signature); | ||||
| 
 | ||||
|         assert_eq!( | ||||
|             CurrencyOf::<T, I>::free_balance(&user_account), | ||||
|             prev_balance + balance | ||||
|         ); | ||||
|         assert_eq!( | ||||
|             CurrencyOf::<T, I>::free_balance(&pseudo_account), | ||||
|             balance - balance | ||||
|         ); | ||||
|         assert_eq!(CurrencyOf::<T, I>::free_balance(&user_account), prev_balance + balance); | ||||
|         assert_eq!(CurrencyOf::<T, I>::free_balance(&pseudo_account), balance - balance); | ||||
| 
 | ||||
|         let rank = match prev_rank { | ||||
|             Some(current_rank) if pseudo_rank <= current_rank => Some(current_rank), | ||||
| @ -55,5 +48,9 @@ mod benchmarks { | ||||
|         assert_eq!(Club::<T, I>::rank_of(&pseudo_account), None); | ||||
|     } | ||||
| 
 | ||||
|     impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test,); | ||||
|     impl_benchmark_test_suite!( | ||||
|         Pallet, | ||||
|         crate::mock::new_test_ext(), | ||||
|         crate::mock::Test, | ||||
|     ); | ||||
| } | ||||
|  | ||||
| @ -1,33 +1,31 @@ | ||||
| #![cfg_attr(not(feature = "std"), no_std)] | ||||
| 
 | ||||
| use frame_support::{ | ||||
|     ensure, | ||||
|     pallet_prelude::*, | ||||
|     ensure, pallet_prelude::*, | ||||
|     traits::{ | ||||
|         Currency, ExistenceRequirement, Get, RankedMembers, RankedMembersSwapHandler, | ||||
|         VestingSchedule, | ||||
|         Currency, ExistenceRequirement, Get, RankedMembers, 
 | ||||
|         RankedMembersSwapHandler, VestingSchedule, | ||||
|     }, | ||||
|     DefaultNoBound, | ||||
| }; | ||||
| use frame_system::pallet_prelude::*; | ||||
| pub use pallet::*; | ||||
| use serde::{self, Deserialize, Deserializer, Serialize, Serializer}; | ||||
| pub use pallet::*; | ||||
| 
 | ||||
| use sp_io::{crypto::secp256k1_ecdsa_recover, hashing::keccak_256}; | ||||
| use sp_runtime::traits::{BlockNumberProvider, CheckedDiv, CheckedSub}; | ||||
| use sp_runtime::traits::{CheckedSub, CheckedDiv, BlockNumberProvider}; | ||||
| use sp_std::prelude::*; | ||||
| 
 | ||||
| extern crate alloc; | ||||
| #[cfg(not(feature = "std"))] | ||||
| use alloc::{format, string::String}; | ||||
| 
 | ||||
| mod weights; | ||||
| pub mod weights; | ||||
| pub use crate::weights::WeightInfo; | ||||
| 
 | ||||
| mod benchmarking; | ||||
| mod mock; | ||||
| mod secp_utils; | ||||
| mod tests; | ||||
| mod mock; | ||||
| mod benchmarking; | ||||
| mod secp_utils; | ||||
| 
 | ||||
| /// An ethereum address (i.e. 20 bytes, used to represent an Ethereum account).
 | ||||
| ///
 | ||||
| @ -57,7 +55,7 @@ impl<'de> Deserialize<'de> for EthereumAddress { | ||||
|             Err(serde::de::Error::custom( | ||||
|                 "Bad length of Ethereum address (should be 42 including `0x`)", | ||||
|             ))?; | ||||
|         } | ||||
|         } 
 | ||||
|         let raw: Vec<u8> = rustc_hex::FromHex::from_hex(s) | ||||
|             .map_err(|e| serde::de::Error::custom(format!("{:?}", e)))?; | ||||
|         let mut r = Self::default(); | ||||
| @ -82,14 +80,15 @@ impl sp_std::fmt::Debug for EcdsaSignature { | ||||
| } | ||||
| 
 | ||||
| type CurrencyOf<T, I> = <<T as Config<I>>::VestingSchedule as VestingSchedule< | ||||
|     <T as frame_system::Config>::AccountId, | ||||
|     <T as frame_system::Config>::AccountId | ||||
| >>::Currency; | ||||
| 
 | ||||
| type BalanceOf<T, I> = | ||||
|     <CurrencyOf<T, I> as Currency<<T as frame_system::Config>::AccountId>>::Balance; | ||||
| type BalanceOf<T, I> = <CurrencyOf<T, I> as Currency< | ||||
|     <T as frame_system::Config>::AccountId> | ||||
| >::Balance; | ||||
| 
 | ||||
| type RankOf<T, I> = <pallet_ranked_collective::Pallet<T, I> as RankedMembers>::Rank; | ||||
| type AccountIdOf<T, I> = <pallet_ranked_collective::Pallet<T, I> as RankedMembers>::AccountId; | ||||
| type RankOf<T, I> = <pallet_ranked_collective::Pallet::<T, I> as RankedMembers>::Rank; | ||||
| type AccountIdOf<T, I> = <pallet_ranked_collective::Pallet::<T, I> as RankedMembers>::AccountId; | ||||
| 
 | ||||
| #[frame_support::pallet] | ||||
| pub mod pallet { | ||||
| @ -100,11 +99,8 @@ pub mod pallet { | ||||
|     pub struct Pallet<T, I = ()>(_); | ||||
| 
 | ||||
|     #[pallet::config] | ||||
|     pub trait Config<I: 'static = ()>: | ||||
|         frame_system::Config + pallet_ranked_collective::Config<I> | ||||
|     { | ||||
|         type RuntimeEvent: From<Event<Self, I>> | ||||
|             + IsType<<Self as frame_system::Config>::RuntimeEvent>; | ||||
|     pub trait Config<I: 'static = ()>: frame_system::Config + pallet_ranked_collective::Config<I> { | ||||
|         type RuntimeEvent: From<Event<Self, I>> + IsType<<Self as frame_system::Config>::RuntimeEvent>; | ||||
| 
 | ||||
|         type VestingSchedule: VestingSchedule<Self::AccountId, Moment = BlockNumberFor<Self>>; | ||||
|         type BlockNumberProvider: BlockNumberProvider<BlockNumber = BlockNumberFor<Self>>; | ||||
| @ -121,13 +117,13 @@ pub mod pallet { | ||||
| 
 | ||||
|         type WeightInfo: WeightInfo; | ||||
|     } | ||||
| 
 | ||||
|     
 | ||||
|     #[pallet::event] | ||||
|     #[pallet::generate_deposit(pub(super) fn deposit_event)] | ||||
|     pub enum Event<T: Config<I>, I: 'static = ()> { | ||||
|         Claimed { | ||||
|             receiver: T::AccountId, | ||||
|             donor: T::AccountId, | ||||
|             receiver: T::AccountId, 
 | ||||
|             donor: T::AccountId, 
 | ||||
|             amount: BalanceOf<T, I>, | ||||
|             rank: Option<RankOf<T, I>>, | ||||
|         }, | ||||
| @ -162,16 +158,12 @@ pub mod pallet { | ||||
|                 .map(|(account_id, rank)| { | ||||
|                     assert!( | ||||
|                         pallet_ranked_collective::Pallet::<T, I>::do_add_member_to_rank( | ||||
|                             account_id.clone(), | ||||
|                             *rank, | ||||
|                             false | ||||
|                         ) | ||||
|                         .is_ok(), | ||||
|                         "error during adding and promotion" | ||||
|                             account_id.clone(), *rank, false).is_ok(), | ||||
|                             "error during adding and promotion" | ||||
|                     ); | ||||
|                     account_id | ||||
|                 }) | ||||
|                 .collect(); | ||||
|             .collect(); | ||||
| 
 | ||||
|             assert!( | ||||
|                 self.members_and_ranks.len() == cult_accounts.len(), | ||||
| @ -193,13 +185,13 @@ pub mod pallet { | ||||
|         ) -> DispatchResult { | ||||
|             let who = ensure_signed(origin)?; | ||||
|             let data = who.using_encoded(to_ascii_hex); | ||||
|             let recovered_address = Self::recover_ethereum_address(ðereum_signature, &data) | ||||
|                 .ok_or(Error::<T, I>::InvalidEthereumSignature)?; | ||||
|             let recovered_address = Self::recover_ethereum_address( | ||||
|                 ðereum_signature, | ||||
|                 &data, | ||||
|             ).ok_or(Error::<T, I>::InvalidEthereumSignature)?; | ||||
| 
 | ||||
|             ensure!( | ||||
|                 recovered_address == ethereum_address, | ||||
|                 Error::<T, I>::InvalidEthereumAddress | ||||
|             ); | ||||
|             ensure!(recovered_address == ethereum_address, 
 | ||||
|                 Error::<T, I>::InvalidEthereumAddress); | ||||
| 
 | ||||
|             Self::do_claim(who, ethereum_address) | ||||
|         } | ||||
| @ -207,37 +199,37 @@ pub mod pallet { | ||||
| } | ||||
| 
 | ||||
| fn to_ascii_hex(data: &[u8]) -> Vec<u8> { | ||||
|     let mut r = Vec::with_capacity(data.len() * 2); | ||||
|     let mut push_nibble = |n| r.push(if n < 10 { b'0' + n } else { b'a' - 10 + n }); | ||||
|     for &b in data.iter() { | ||||
|         push_nibble(b / 16); | ||||
|         push_nibble(b % 16); | ||||
|     } | ||||
|     r | ||||
| 	let mut r = Vec::with_capacity(data.len() * 2); | ||||
| 	let mut push_nibble = |n| r.push(if n < 10 { b'0' + n } else { b'a' - 10 + n }); | ||||
| 	for &b in data.iter() { | ||||
| 		push_nibble(b / 16); | ||||
| 		push_nibble(b % 16); | ||||
| 	} | ||||
| 	r | ||||
| } | ||||
| 
 | ||||
| impl<T: Config<I>, I: 'static> Pallet<T, I> { | ||||
|     fn ethereum_signable_message(what: &[u8]) -> Vec<u8> { | ||||
|         let prefix = T::Prefix::get(); | ||||
|         let mut l = prefix.len() + what.len(); | ||||
|         let mut rev = Vec::new(); | ||||
|         while l > 0 { | ||||
|             rev.push(b'0' + (l % 10) as u8); | ||||
|             l /= 10; | ||||
|         } | ||||
|         let mut v = b"\x19Ethereum Signed Message:\n".to_vec(); | ||||
|         v.extend(rev.into_iter().rev()); | ||||
|         v.extend_from_slice(prefix); | ||||
|         v.extend_from_slice(what); | ||||
|         v | ||||
| 		let mut l = prefix.len() + what.len(); | ||||
| 		let mut rev = Vec::new(); | ||||
| 		while l > 0 { | ||||
| 			rev.push(b'0' + (l % 10) as u8); | ||||
| 			l /= 10; | ||||
| 		} | ||||
| 		let mut v = b"\x19Ethereum Signed Message:\n".to_vec(); | ||||
| 		v.extend(rev.into_iter().rev()); | ||||
| 		v.extend_from_slice(prefix); | ||||
| 		v.extend_from_slice(what); | ||||
| 		v | ||||
|     } | ||||
| 
 | ||||
|     fn recover_ethereum_address(s: &EcdsaSignature, what: &[u8]) -> Option<EthereumAddress> { | ||||
|         let msg = keccak_256(&Self::ethereum_signable_message(what)); | ||||
|         let mut res = EthereumAddress::default(); | ||||
|         res.0 | ||||
|             .copy_from_slice(&keccak_256(&secp256k1_ecdsa_recover(&s.0, &msg).ok()?[..])[12..]); | ||||
|         Some(res) | ||||
| 		let mut res = EthereumAddress::default(); | ||||
| 		res.0 | ||||
| 			.copy_from_slice(&keccak_256(&secp256k1_ecdsa_recover(&s.0, &msg).ok()?[..])[12..]); | ||||
| 		Some(res) | ||||
|     } | ||||
| 
 | ||||
|     fn into_account_id(address: EthereumAddress) -> Result<T::AccountId, codec::Error> { | ||||
| @ -250,24 +242,21 @@ impl<T: Config<I>, I: 'static> Pallet<T, I> { | ||||
|     } | ||||
| 
 | ||||
|     fn do_claim(receiver: T::AccountId, ethereum_address: EthereumAddress) -> DispatchResult { | ||||
|         let donor = Self::into_account_id(ethereum_address) | ||||
|             .ok() | ||||
|         let donor = Self::into_account_id(ethereum_address).ok() | ||||
|             .ok_or(Error::<T, I>::AddressDecodingFailed)?; | ||||
| 
 | ||||
|         let balance_due = CurrencyOf::<T, I>::free_balance(&donor); | ||||
|         ensure!( | ||||
|             balance_due >= CurrencyOf::<T, I>::minimum_balance(), | ||||
|             Error::<T, I>::NoBalanceToClaim | ||||
|         ); | ||||
|         ensure!(balance_due >= CurrencyOf::<T, I>::minimum_balance(), 
 | ||||
|             Error::<T, I>::NoBalanceToClaim); | ||||
| 
 | ||||
|         let new_total = Total::<T, I>::get() | ||||
|             .checked_sub(&balance_due) | ||||
|             .ok_or(Error::<T, I>::PotUnderflow)?; | ||||
| 
 | ||||
|         CurrencyOf::<T, I>::transfer( | ||||
|             &donor, | ||||
|             &receiver, | ||||
|             balance_due, | ||||
|             &donor, 
 | ||||
|             &receiver, 
 | ||||
|             balance_due, 
 | ||||
|             ExistenceRequirement::AllowDeath, | ||||
|         )?; | ||||
| 
 | ||||
| @ -283,40 +272,28 @@ impl<T: Config<I>, I: 'static> Pallet<T, I> { | ||||
|                 .ok_or(Error::<T, I>::ArithmeticError)?; | ||||
| 
 | ||||
|             T::VestingSchedule::add_vesting_schedule( | ||||
|                 &receiver, | ||||
|                 &receiver, 
 | ||||
|                 vesting_balance, | ||||
|                 per_block_balance, | ||||
|                 T::BlockNumberProvider::current_block_number(), | ||||
|             )?; | ||||
|         } | ||||
| 
 | ||||
|         let rank = if let Some(rank) = | ||||
|             <pallet_ranked_collective::Pallet<T, I> as RankedMembers>::rank_of(&donor) | ||||
|         { | ||||
|         let rank = if let Some(rank) = <pallet_ranked_collective::Pallet::<T, I> as RankedMembers>::rank_of(&donor) { | ||||
|             pallet_ranked_collective::Pallet::<T, I>::do_remove_member_from_rank(&donor, rank)?; | ||||
|             let new_rank = | ||||
|                 match <pallet_ranked_collective::Pallet<T, I> as RankedMembers>::rank_of(&receiver) | ||||
|                 { | ||||
|                     Some(current_rank) if current_rank >= rank => current_rank, | ||||
|                     Some(current_rank) if current_rank < rank => { | ||||
|                         for _ in 0..rank - current_rank { | ||||
|                             pallet_ranked_collective::Pallet::<T, I>::do_promote_member( | ||||
|                                 receiver.clone(), | ||||
|                                 None, | ||||
|                                 false, | ||||
|                             )?; | ||||
|                         } | ||||
|                         rank | ||||
|             let new_rank = match <pallet_ranked_collective::Pallet::<T, I> as RankedMembers>::rank_of(&receiver) { | ||||
|                 Some(current_rank) if current_rank >= rank => current_rank, | ||||
|                 Some(current_rank) if current_rank < rank => { | ||||
|                     for _ in 0..rank - current_rank { | ||||
|                         pallet_ranked_collective::Pallet::<T, I>::do_promote_member(receiver.clone(), None, false)?; | ||||
|                     } | ||||
|                     _ => { | ||||
|                         pallet_ranked_collective::Pallet::<T, I>::do_add_member_to_rank( | ||||
|                             receiver.clone(), | ||||
|                             rank, | ||||
|                             false, | ||||
|                         )?; | ||||
|                         rank | ||||
|                     } | ||||
|                 }; | ||||
|                     rank | ||||
|                 }, | ||||
|                 _ => { | ||||
|                     pallet_ranked_collective::Pallet::<T, I>::do_add_member_to_rank(receiver.clone(), rank, false)?; | ||||
|                     rank | ||||
|                 }, | ||||
|             }; | ||||
|             <T as pallet::Config<I>>::MemberSwappedHandler::swapped(&donor, &receiver, new_rank); | ||||
|             Some(new_rank) | ||||
|         } else { | ||||
| @ -325,7 +302,7 @@ impl<T: Config<I>, I: 'static> Pallet<T, I> { | ||||
| 
 | ||||
|         Total::<T, I>::put(new_total); | ||||
|         Self::deposit_event(Event::<T, I>::Claimed { | ||||
|             receiver, | ||||
|             receiver, 
 | ||||
|             donor, | ||||
|             amount: balance_due, | ||||
|             rank, | ||||
|  | ||||
| @ -4,113 +4,51 @@ use super::*; | ||||
| 
 | ||||
| pub use crate as ghost_claims; | ||||
| use frame_support::{ | ||||
|     derive_impl, parameter_types, | ||||
|     traits::{ConstU16, ConstU64, PollStatus, Polling, WithdrawReasons}, | ||||
|     parameter_types, derive_impl, | ||||
|     traits::{PollStatus, Polling, WithdrawReasons, ConstU16, ConstU64}, | ||||
| }; | ||||
| use frame_system::EnsureRootWithSuccess; | ||||
| pub use pallet_ranked_collective::{Rank, TallyOf}; | ||||
| use sp_runtime::{traits::Convert, BuildStorage}; | ||||
| use sp_runtime::{BuildStorage, traits::Convert}; | ||||
| pub use pallet_ranked_collective::{TallyOf, Rank}; | ||||
| 
 | ||||
| pub mod eth_keys { | ||||
|     use crate::{mock::Test, EcdsaSignature, EthereumAddress}; | ||||
|     use codec::Encode; | ||||
|     use crate::{ | ||||
|         mock::Test, | ||||
|         EcdsaSignature, EthereumAddress, | ||||
|     }; | ||||
|     use hex_literal::hex; | ||||
|     use codec::Encode; | ||||
| 
 | ||||
|     pub fn total_claims() -> u64 { | ||||
|         10 + 100 + 1000 | ||||
|     } | ||||
|     pub fn alice_account_id() -> <Test as frame_system::Config>::AccountId { | ||||
|         69 | ||||
|     } | ||||
|     pub fn bob_account_id() -> <Test as frame_system::Config>::AccountId { | ||||
|         1337 | ||||
|     } | ||||
|     pub fn total_claims() -> u64 { 10 + 100 + 1000 } | ||||
|     pub fn alice_account_id() -> <Test as frame_system::Config>::AccountId { 69 } | ||||
|     pub fn bob_account_id() -> <Test as frame_system::Config>::AccountId { 1337 } | ||||
| 
 | ||||
|     pub fn first_eth_public_known() -> EthereumAddress { | ||||
|         EthereumAddress(hex!("1A69d2D5568D1878023EeB121a73d33B9116A760")) | ||||
|     } | ||||
|     pub fn second_eth_public_known() -> EthereumAddress { | ||||
|         EthereumAddress(hex!("2f86cfBED3fbc1eCf2989B9aE5fc019a837A9C12")) | ||||
|     } | ||||
|     pub fn third_eth_public_known() -> EthereumAddress { | ||||
|         EthereumAddress(hex!("e83f67361Ac74D42A48E2DAfb6706eb047D8218D")) | ||||
|     } | ||||
|     pub fn fourth_eth_public_known() -> EthereumAddress { | ||||
|         EthereumAddress(hex!("827ee4ad9b259b6fa1390ed60921508c78befd63")) | ||||
|     } | ||||
|     pub fn first_eth_public_known()  -> EthereumAddress { EthereumAddress(hex!("1A69d2D5568D1878023EeB121a73d33B9116A760")) } | ||||
|     pub fn second_eth_public_known() -> EthereumAddress { EthereumAddress(hex!("2f86cfBED3fbc1eCf2989B9aE5fc019a837A9C12")) } | ||||
|     pub fn third_eth_public_known()  -> EthereumAddress { EthereumAddress(hex!("e83f67361Ac74D42A48E2DAfb6706eb047D8218D")) } | ||||
|     pub fn fourth_eth_public_known() -> EthereumAddress { EthereumAddress(hex!("827ee4ad9b259b6fa1390ed60921508c78befd63")) } | ||||
| 
 | ||||
|     fn first_eth_private_key() -> libsecp256k1::SecretKey { | ||||
|         libsecp256k1::SecretKey::parse(&hex!( | ||||
|             "01c928771aea942a1e7ac06adf2b73dfbc9a25d9eaa516e3673116af7f345198" | ||||
|         )) | ||||
|         .unwrap() | ||||
|     } | ||||
|     fn second_eth_private_key() -> libsecp256k1::SecretKey { | ||||
|         libsecp256k1::SecretKey::parse(&hex!( | ||||
|             "b19a435901872f817185f7234a1484eae837613f9d10cf21927a23c2d8cb9139" | ||||
|         )) | ||||
|         .unwrap() | ||||
|     } | ||||
|     fn third_eth_private_key() -> libsecp256k1::SecretKey { | ||||
|         libsecp256k1::SecretKey::parse(&hex!( | ||||
|             "d3baf57b74d65719b2dc33f5a464176022d0cc5edbca002234229f3e733875fc" | ||||
|         )) | ||||
|         .unwrap() | ||||
|     } | ||||
|     fn fourth_eth_private_key() -> libsecp256k1::SecretKey { | ||||
|         libsecp256k1::SecretKey::parse(&hex!( | ||||
|             "c4683d566436af6b58b4a59c8f501319226e85b21869bf93d5eeb4596d4791d4" | ||||
|         )) | ||||
|         .unwrap() | ||||
|     } | ||||
|     fn wrong_eth_private_key() -> libsecp256k1::SecretKey { | ||||
|         libsecp256k1::SecretKey::parse(&hex!( | ||||
|             "deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" | ||||
|         )) | ||||
|         .unwrap() | ||||
|     } | ||||
|     fn first_eth_private_key()  -> libsecp256k1::SecretKey { libsecp256k1::SecretKey::parse(&hex!("01c928771aea942a1e7ac06adf2b73dfbc9a25d9eaa516e3673116af7f345198")).unwrap() } | ||||
|     fn second_eth_private_key() -> libsecp256k1::SecretKey { libsecp256k1::SecretKey::parse(&hex!("b19a435901872f817185f7234a1484eae837613f9d10cf21927a23c2d8cb9139")).unwrap() } | ||||
|     fn third_eth_private_key()  -> libsecp256k1::SecretKey { libsecp256k1::SecretKey::parse(&hex!("d3baf57b74d65719b2dc33f5a464176022d0cc5edbca002234229f3e733875fc")).unwrap() } | ||||
|     fn fourth_eth_private_key() -> libsecp256k1::SecretKey { libsecp256k1::SecretKey::parse(&hex!("c4683d566436af6b58b4a59c8f501319226e85b21869bf93d5eeb4596d4791d4")).unwrap() } | ||||
|     fn wrong_eth_private_key()  -> libsecp256k1::SecretKey { libsecp256k1::SecretKey::parse(&hex!("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef")).unwrap() } | ||||
| 
 | ||||
|     pub fn first_eth_public_key() -> EthereumAddress { | ||||
|         crate::secp_utils::eth(&first_eth_private_key()) | ||||
|     } | ||||
|     pub fn second_eth_public_key() -> EthereumAddress { | ||||
|         crate::secp_utils::eth(&second_eth_private_key()) | ||||
|     } | ||||
|     pub fn third_eth_public_key() -> EthereumAddress { | ||||
|         crate::secp_utils::eth(&third_eth_private_key()) | ||||
|     } | ||||
|     pub fn fourth_eth_public_key() -> EthereumAddress { | ||||
|         crate::secp_utils::eth(&fourth_eth_private_key()) | ||||
|     } | ||||
|     pub fn first_eth_public_key()  -> EthereumAddress { crate::secp_utils::eth(&first_eth_private_key())  } | ||||
|     pub fn second_eth_public_key() -> EthereumAddress { crate::secp_utils::eth(&second_eth_private_key()) } | ||||
|     pub fn third_eth_public_key()  -> EthereumAddress { crate::secp_utils::eth(&third_eth_private_key())  } | ||||
|     pub fn fourth_eth_public_key() -> EthereumAddress { crate::secp_utils::eth(&fourth_eth_private_key()) } | ||||
| 
 | ||||
|     pub fn first_account_id() -> <Test as frame_system::Config>::AccountId { | ||||
|         crate::secp_utils::into_account_id::<Test, ()>(first_eth_public_key()) | ||||
|     } | ||||
|     pub fn second_account_id() -> <Test as frame_system::Config>::AccountId { | ||||
|         crate::secp_utils::into_account_id::<Test, ()>(second_eth_public_key()) | ||||
|     } | ||||
|     pub fn third_account_id() -> <Test as frame_system::Config>::AccountId { | ||||
|         crate::secp_utils::into_account_id::<Test, ()>(third_eth_public_key()) | ||||
|     } | ||||
|     pub fn fourth_account_id() -> <Test as frame_system::Config>::AccountId { | ||||
|         crate::secp_utils::into_account_id::<Test, ()>(fourth_eth_public_key()) | ||||
|     } | ||||
|     pub fn first_account_id()  -> <Test as frame_system::Config>::AccountId { crate::secp_utils::into_account_id::<Test, ()>(first_eth_public_key())  } | ||||
|     pub fn second_account_id() -> <Test as frame_system::Config>::AccountId { crate::secp_utils::into_account_id::<Test, ()>(second_eth_public_key()) } | ||||
|     pub fn third_account_id()  -> <Test as frame_system::Config>::AccountId { crate::secp_utils::into_account_id::<Test, ()>(third_eth_public_key())  } | ||||
|     pub fn fourth_account_id() -> <Test as frame_system::Config>::AccountId { crate::secp_utils::into_account_id::<Test, ()>(fourth_eth_public_key()) } | ||||
| 
 | ||||
|     pub fn first_signature() -> EcdsaSignature { | ||||
|         crate::secp_utils::sig::<Test, ()>(&first_eth_private_key(), &alice_account_id().encode()) | ||||
|     } | ||||
|     pub fn second_signature() -> EcdsaSignature { | ||||
|         crate::secp_utils::sig::<Test, ()>(&second_eth_private_key(), &alice_account_id().encode()) | ||||
|     } | ||||
|     pub fn third_signature() -> EcdsaSignature { | ||||
|         crate::secp_utils::sig::<Test, ()>(&third_eth_private_key(), &alice_account_id().encode()) | ||||
|     } | ||||
|     pub fn fourth_signature() -> EcdsaSignature { | ||||
|         crate::secp_utils::sig::<Test, ()>(&fourth_eth_private_key(), &bob_account_id().encode()) | ||||
|     } | ||||
|     pub fn wrong_signature() -> EcdsaSignature { | ||||
|         crate::secp_utils::sig::<Test, ()>(&wrong_eth_private_key(), &alice_account_id().encode()) | ||||
|     } | ||||
|     pub fn first_signature()  -> EcdsaSignature { crate::secp_utils::sig::<Test, ()>(&first_eth_private_key(),  &alice_account_id().encode()) } | ||||
|     pub fn second_signature() -> EcdsaSignature { crate::secp_utils::sig::<Test, ()>(&second_eth_private_key(), &alice_account_id().encode()) } | ||||
|     pub fn third_signature()  -> EcdsaSignature { crate::secp_utils::sig::<Test, ()>(&third_eth_private_key(),  &alice_account_id().encode()) } | ||||
|     pub fn fourth_signature() -> EcdsaSignature { crate::secp_utils::sig::<Test, ()>(&fourth_eth_private_key(), &bob_account_id().encode())   } | ||||
|     pub fn wrong_signature()  -> EcdsaSignature { crate::secp_utils::sig::<Test, ()>(&wrong_eth_private_key(),  &alice_account_id().encode()) } | ||||
| } | ||||
| 
 | ||||
| #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] | ||||
| @ -128,9 +66,10 @@ impl pallet_balances::Config for Test { | ||||
|     type AccountStore = System; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| parameter_types! { | ||||
|     pub const MinVestedTransfer: u64 = 1; | ||||
|     pub UnvestedFundsAllowedWithdrawReasons: WithdrawReasons = | ||||
|     pub UnvestedFundsAllowedWithdrawReasons: WithdrawReasons = 
 | ||||
|         WithdrawReasons::except(WithdrawReasons::TRANSFER | WithdrawReasons::RESERVE); | ||||
| } | ||||
| 
 | ||||
| @ -140,8 +79,9 @@ impl pallet_vesting::Config for Test { | ||||
|     type BlockNumberToBalance = sp_runtime::traits::ConvertInto; | ||||
|     type MinVestedTransfer = MinVestedTransfer; | ||||
|     type WeightInfo = (); | ||||
|     type UnvestedFundsAllowedWithdrawReasons = UnvestedFundsAllowedWithdrawReasons; | ||||
| 
 | ||||
|     type UnvestedFundsAllowedWithdrawReasons = 
 | ||||
|         UnvestedFundsAllowedWithdrawReasons; | ||||
|     
 | ||||
|     type BlockNumberProvider = System; | ||||
|     const MAX_VESTING_SCHEDULES: u32 = 28; | ||||
| } | ||||
| @ -208,7 +148,7 @@ impl pallet_ranked_collective::Config for Test { | ||||
|     type PromoteOrigin = EnsureRootWithSuccess<Self::AccountId, ConstU16<65535>>; | ||||
|     type DemoteOrigin = EnsureRootWithSuccess<Self::AccountId, ConstU16<65535>>; | ||||
|     type ExchangeOrigin = EnsureRootWithSuccess<Self::AccountId, ConstU16<65535>>; | ||||
| 
 | ||||
|     
 | ||||
|     type Polls = TestPolls; | ||||
|     type MemberSwappedHandler = (); | ||||
|     type MinRankOfClass = MinRankOfClass<MinRankOfClassDelta>; | ||||
| @ -260,8 +200,8 @@ pub fn new_test_ext() -> sp_io::TestExternalities { | ||||
|             (crate::mock::eth_keys::third_account_id(), 1000), | ||||
|         ], | ||||
|     } | ||||
|     .assimilate_storage(&mut t) | ||||
|     .unwrap(); | ||||
|         .assimilate_storage(&mut t) | ||||
|         .unwrap(); | ||||
| 
 | ||||
|     ghost_claims::GenesisConfig::<Test> { | ||||
|         total: crate::mock::eth_keys::total_claims(), | ||||
| @ -270,8 +210,8 @@ pub fn new_test_ext() -> sp_io::TestExternalities { | ||||
|             (crate::mock::eth_keys::third_account_id(), 3), | ||||
|         ], | ||||
|     } | ||||
|     .assimilate_storage(&mut t) | ||||
|     .unwrap(); | ||||
|         .assimilate_storage(&mut t) | ||||
|         .unwrap(); | ||||
| 
 | ||||
|     let mut ext = sp_io::TestExternalities::new(t); | ||||
|     ext.execute_with(|| { | ||||
|  | ||||
| @ -8,8 +8,7 @@ pub fn public(secret: &libsecp256k1::SecretKey) -> libsecp256k1::PublicKey { | ||||
| 
 | ||||
| pub fn eth(secret: &libsecp256k1::SecretKey) -> EthereumAddress { | ||||
|     let mut res = EthereumAddress::default(); | ||||
|     res.0 | ||||
|         .copy_from_slice(&keccak_256(&public(secret).serialize()[1..65])[12..]); | ||||
|     res.0.copy_from_slice(&keccak_256(&public(secret).serialize()[1..65])[12..]); | ||||
|     res | ||||
| } | ||||
| 
 | ||||
| @ -19,14 +18,17 @@ pub fn into_account_id<T: Config<I>, I: 'static>(address: EthereumAddress) -> T: | ||||
| } | ||||
| 
 | ||||
| pub fn sig<T: Config<I>, I: 'static>( | ||||
|     secret: &libsecp256k1::SecretKey, | ||||
|     secret: &libsecp256k1::SecretKey, 
 | ||||
|     what: &[u8], | ||||
| ) -> EcdsaSignature { | ||||
|     let msg = keccak_256(&super::Pallet::<T, I>::ethereum_signable_message( | ||||
|         &crate::to_ascii_hex(what)[..], | ||||
|             &crate::to_ascii_hex(what)[..], | ||||
|     )); | ||||
| 
 | ||||
|     let (sig, recovery_id) = libsecp256k1::sign(&libsecp256k1::Message::parse(&msg), secret); | ||||
|     let (sig, recovery_id) = libsecp256k1::sign( | ||||
|         &libsecp256k1::Message::parse(&msg), | ||||
|         secret, | ||||
|     ); | ||||
| 
 | ||||
|     let mut r = [0u8; 65]; | ||||
|     r[0..64].copy_from_slice(&sig.serialize()[..]); | ||||
|  | ||||
| @ -1,19 +1,21 @@ | ||||
| #![cfg(test)] | ||||
| 
 | ||||
| use super::*; | ||||
| use frame_support::{assert_err, assert_ok}; | ||||
| use hex_literal::hex; | ||||
| use mock::{ | ||||
|     new_test_ext, ghost_claims, | ||||
|     Test, System, Balances, Club, Vesting, Claims, RuntimeOrigin, RuntimeEvent, | ||||
|     eth_keys::{ | ||||
|         alice_account_id, bob_account_id, first_account_id, first_eth_public_key, | ||||
|         first_eth_public_known, first_signature, fourth_account_id, fourth_eth_public_key, | ||||
|         fourth_eth_public_known, fourth_signature, second_account_id, second_eth_public_key, | ||||
|         second_eth_public_known, second_signature, third_account_id, third_eth_public_key, | ||||
|         third_eth_public_known, third_signature, total_claims, wrong_signature, | ||||
|     }, | ||||
|     ghost_claims, new_test_ext, Balances, Claims, Club, RuntimeEvent, RuntimeOrigin, System, Test, | ||||
|     Vesting, | ||||
|         alice_account_id, total_claims, first_eth_public_known, 
 | ||||
|         first_eth_public_key, first_account_id, first_signature, 
 | ||||
|         second_eth_public_known, second_eth_public_key, second_account_id, 
 | ||||
|         second_signature, third_eth_public_known, third_eth_public_key, 
 | ||||
|         third_account_id, third_signature, fourth_eth_public_known, 
 | ||||
|         fourth_eth_public_key, fourth_account_id, fourth_signature, 
 | ||||
|         wrong_signature, bob_account_id, | ||||
|     } | ||||
| }; | ||||
| use hex_literal::hex; | ||||
| use frame_support::{assert_err, assert_ok}; | ||||
| use super::*; | ||||
| 
 | ||||
| #[test] | ||||
| fn serde_works() { | ||||
| @ -39,12 +41,12 @@ fn basic_setup_works() { | ||||
|         assert_eq!(Balances::usable_balance(&first_account_id()), 10); | ||||
|         assert_eq!(Balances::usable_balance(&second_account_id()), 100); | ||||
|         assert_eq!(Balances::usable_balance(&third_account_id()), 1000); | ||||
| 
 | ||||
|         
 | ||||
|         assert_eq!(Club::rank_of(&alice_account_id()), None); | ||||
|         assert_eq!(Club::rank_of(&first_account_id()), None); | ||||
|         assert_eq!(Club::rank_of(&second_account_id()), Some(1)); | ||||
|         assert_eq!(Club::rank_of(&third_account_id()), Some(3)); | ||||
| 
 | ||||
|         
 | ||||
|         assert_eq!(Vesting::vesting_balance(&alice_account_id()), None); | ||||
|         assert_eq!(ghost_claims::Total::<Test, ()>::get(), total_claims()); | ||||
|     }); | ||||
| @ -54,10 +56,9 @@ fn basic_setup_works() { | ||||
| fn small_claiming_works() { | ||||
|     new_test_ext().execute_with(|| { | ||||
|         assert_ok!(Claims::claim( | ||||
|             RuntimeOrigin::signed(alice_account_id()), | ||||
|             first_eth_public_key(), | ||||
|             first_signature() | ||||
|         )); | ||||
|                 RuntimeOrigin::signed(alice_account_id()), | ||||
|                 first_eth_public_key(), | ||||
|                 first_signature())); | ||||
| 
 | ||||
|         assert_eq!(Balances::usable_balance(&alice_account_id()), 10); | ||||
|         assert_eq!(Balances::usable_balance(&first_account_id()), 0); | ||||
| @ -76,9 +77,9 @@ fn small_claiming_works() { | ||||
| fn medium_claiming_works() { | ||||
|     new_test_ext().execute_with(|| { | ||||
|         assert_ok!(Claims::claim( | ||||
|             RuntimeOrigin::signed(alice_account_id()), | ||||
|             second_eth_public_key(), | ||||
|             second_signature(), | ||||
|                 RuntimeOrigin::signed(alice_account_id()), | ||||
|                 second_eth_public_key(), | ||||
|                 second_signature(), | ||||
|         )); | ||||
| 
 | ||||
|         assert_eq!(Balances::usable_balance(&alice_account_id()), 100); | ||||
| @ -98,9 +99,9 @@ fn medium_claiming_works() { | ||||
| fn big_claiming_works() { | ||||
|     new_test_ext().execute_with(|| { | ||||
|         assert_ok!(Claims::claim( | ||||
|             RuntimeOrigin::signed(alice_account_id()), | ||||
|             third_eth_public_key(), | ||||
|             third_signature(), | ||||
|                 RuntimeOrigin::signed(alice_account_id()), | ||||
|                 third_eth_public_key(), | ||||
|                 third_signature(), | ||||
|         )); | ||||
| 
 | ||||
|         assert_eq!(Balances::usable_balance(&alice_account_id()), 200); | ||||
| @ -112,15 +113,11 @@ fn big_claiming_works() { | ||||
|         assert_eq!(Club::rank_of(&third_account_id()), None); | ||||
| 
 | ||||
|         assert_eq!(Vesting::vesting_balance(&alice_account_id()), Some(800)); | ||||
|         assert_eq!( | ||||
|             ghost_claims::Total::<Test, ()>::get(), | ||||
|             total_claims() - 1000 | ||||
|         ); | ||||
|         assert_eq!(ghost_claims::Total::<Test, ()>::get(), total_claims() - 1000); | ||||
|         assert_ok!(Balances::transfer_allow_death( | ||||
|             RuntimeOrigin::signed(alice_account_id()), | ||||
|             bob_account_id(), | ||||
|             200 | ||||
|         )); | ||||
|                 RuntimeOrigin::signed(alice_account_id()), | ||||
|                 bob_account_id(), | ||||
|                 200)); | ||||
|     }) | ||||
| } | ||||
| 
 | ||||
| @ -128,19 +125,19 @@ fn big_claiming_works() { | ||||
| fn multiple_accounts_claiming_works() { | ||||
|     new_test_ext().execute_with(|| { | ||||
|         assert_ok!(Claims::claim( | ||||
|             RuntimeOrigin::signed(alice_account_id()), | ||||
|             first_eth_public_key(), | ||||
|             first_signature(), | ||||
|                 RuntimeOrigin::signed(alice_account_id()), | ||||
|                 first_eth_public_key(), | ||||
|                 first_signature(), | ||||
|         )); | ||||
|         assert_ok!(Claims::claim( | ||||
|             RuntimeOrigin::signed(alice_account_id()), | ||||
|             second_eth_public_key(), | ||||
|             second_signature(), | ||||
|                 RuntimeOrigin::signed(alice_account_id()), | ||||
|                 second_eth_public_key(), | ||||
|                 second_signature(), | ||||
|         )); | ||||
|         assert_ok!(Claims::claim( | ||||
|             RuntimeOrigin::signed(alice_account_id()), | ||||
|             third_eth_public_key(), | ||||
|             third_signature(), | ||||
|                 RuntimeOrigin::signed(alice_account_id()), | ||||
|                 third_eth_public_key(), | ||||
|                 third_signature(), | ||||
|         )); | ||||
| 
 | ||||
|         assert_eq!(Balances::usable_balance(&alice_account_id()), 310); | ||||
| @ -160,19 +157,19 @@ fn multiple_accounts_claiming_works() { | ||||
| fn multiple_accounts_reverese_claiming_works() { | ||||
|     new_test_ext().execute_with(|| { | ||||
|         assert_ok!(Claims::claim( | ||||
|             RuntimeOrigin::signed(alice_account_id()), | ||||
|             third_eth_public_key(), | ||||
|             third_signature(), | ||||
|                 RuntimeOrigin::signed(alice_account_id()), | ||||
|                 third_eth_public_key(), | ||||
|                 third_signature(), | ||||
|         )); | ||||
|         assert_ok!(Claims::claim( | ||||
|             RuntimeOrigin::signed(alice_account_id()), | ||||
|             second_eth_public_key(), | ||||
|             second_signature(), | ||||
|                 RuntimeOrigin::signed(alice_account_id()), | ||||
|                 second_eth_public_key(), | ||||
|                 second_signature(), | ||||
|         )); | ||||
|         assert_ok!(Claims::claim( | ||||
|             RuntimeOrigin::signed(alice_account_id()), | ||||
|             first_eth_public_key(), | ||||
|             first_signature(), | ||||
|                 RuntimeOrigin::signed(alice_account_id()), | ||||
|                 first_eth_public_key(), | ||||
|                 first_signature(), | ||||
|         )); | ||||
| 
 | ||||
|         assert_eq!(Balances::usable_balance(&alice_account_id()), 310); | ||||
| @ -191,14 +188,11 @@ fn multiple_accounts_reverese_claiming_works() { | ||||
| #[test] | ||||
| fn cannot_claim_with_bad_signature() { | ||||
|     new_test_ext().execute_with(|| { | ||||
|         assert_err!( | ||||
|             Claims::claim( | ||||
|         assert_err!(Claims::claim( | ||||
|                 RuntimeOrigin::signed(alice_account_id()), | ||||
|                 first_eth_public_key(), | ||||
|                 wrong_signature() | ||||
|             ), | ||||
|             crate::Error::<Test>::InvalidEthereumAddress | ||||
|         ); | ||||
|                 wrong_signature()), | ||||
|                 crate::Error::<Test>::InvalidEthereumAddress); | ||||
| 
 | ||||
|         assert_eq!(Balances::usable_balance(&alice_account_id()), 0); | ||||
|         assert_eq!(Balances::usable_balance(&first_account_id()), 10); | ||||
| @ -218,14 +212,11 @@ fn cannot_claim_with_bad_signature() { | ||||
| #[test] | ||||
| fn cannot_claim_with_wrong_address() { | ||||
|     new_test_ext().execute_with(|| { | ||||
|         assert_err!( | ||||
|             Claims::claim( | ||||
|         assert_err!(Claims::claim( | ||||
|                 RuntimeOrigin::signed(bob_account_id()), | ||||
|                 first_eth_public_key(), | ||||
|                 first_signature() | ||||
|             ), | ||||
|             crate::Error::<Test>::InvalidEthereumAddress | ||||
|         ); | ||||
|                 first_signature()), | ||||
|                 crate::Error::<Test>::InvalidEthereumAddress); | ||||
| 
 | ||||
|         assert_eq!(Balances::usable_balance(&bob_account_id()), 0); | ||||
|         assert_eq!(Balances::usable_balance(&alice_account_id()), 0); | ||||
| @ -246,14 +237,11 @@ fn cannot_claim_with_wrong_address() { | ||||
| #[test] | ||||
| fn cannot_claim_nothing() { | ||||
|     new_test_ext().execute_with(|| { | ||||
|         assert_err!( | ||||
|             Claims::claim( | ||||
|         assert_err!(Claims::claim( | ||||
|                 RuntimeOrigin::signed(bob_account_id()), | ||||
|                 fourth_eth_public_key(), | ||||
|                 fourth_signature() | ||||
|             ), | ||||
|             crate::Error::<Test>::NoBalanceToClaim | ||||
|         ); | ||||
|                 fourth_signature()), | ||||
|             crate::Error::<Test>::NoBalanceToClaim); | ||||
|         assert_eq!(Balances::usable_balance(&bob_account_id()), 0); | ||||
|         assert_eq!(Balances::usable_balance(&fourth_account_id()), 0); | ||||
|         assert_eq!(Vesting::vesting_balance(&bob_account_id()), None); | ||||
| @ -271,15 +259,16 @@ fn event_emitted_during_claim() { | ||||
|         System::reset_events(); | ||||
|         assert_eq!(System::event_count(), 0); | ||||
|         assert_ok!(Claims::claim( | ||||
|             RuntimeOrigin::signed(alice_account_id()), | ||||
|             third_eth_public_key(), | ||||
|             third_signature(), | ||||
|                 RuntimeOrigin::signed(alice_account_id()), | ||||
|                 third_eth_public_key(), | ||||
|                 third_signature(), | ||||
|         )); | ||||
|         System::assert_has_event(RuntimeEvent::Claims(crate::Event::Claimed { | ||||
|             receiver: alice_account_id(), | ||||
|             donor: account, | ||||
|             amount, | ||||
|             rank, | ||||
|         })); | ||||
|         System::assert_has_event(RuntimeEvent::Claims( | ||||
|                 crate::Event::Claimed { | ||||
|                     receiver: alice_account_id(), | ||||
|                     donor: account, | ||||
|                     amount, | ||||
|                     rank, | ||||
|                 })); | ||||
|     }) | ||||
| } | ||||
|  | ||||
| @ -1,104 +1,9 @@ | ||||
| // This file is part of Ghost Network.
 | ||||
| use frame_support::weights::Weight; | ||||
| 
 | ||||
| // Ghost Network is free software: you can redistribute it and/or modify
 | ||||
| // it under the terms of the GNU General Public License as published by
 | ||||
| // the Free Software Foundation, either version 3 of the License, or
 | ||||
| // (at your option) any later version.
 | ||||
| 
 | ||||
| // Ghost Network 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 General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| // along with Ghost Network.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| //! Autogenerated weights for `ghost_claims`
 | ||||
| //!
 | ||||
| //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
 | ||||
| //! DATE: 2024-08-02, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 | ||||
| //! WORST CASE MAP SIZE: `1000000`
 | ||||
| //! HOSTNAME: `ghostown`, CPU: `Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz`
 | ||||
| //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("casper-dev")`, DB CACHE: 1024
 | ||||
| 
 | ||||
| // Executed Command:
 | ||||
| // ./target/release/ghost
 | ||||
| // benchmark
 | ||||
| // pallet
 | ||||
| // --chain=casper-dev
 | ||||
| // --steps=50
 | ||||
| // --repeat=20
 | ||||
| // --pallet=ghost_claims
 | ||||
| // --extrinsic=*
 | ||||
| // --wasm-execution=compiled
 | ||||
| // --heap-pages=4096
 | ||||
| // --header=./file_header.txt
 | ||||
| // --output=./runtime/casper/src/weights/ghost_claims.rs
 | ||||
| 
 | ||||
| #![cfg_attr(rustfmt, rustfmt_skip)] | ||||
| #![allow(unused_parens)] | ||||
| #![allow(unused_imports)] | ||||
| #![allow(missing_docs)] | ||||
| 
 | ||||
| use frame_support::{ | ||||
|     traits::Get, 
 | ||||
|     weights::{Weight, constants::RocksDbWeight}, | ||||
| }; | ||||
| use core::marker::PhantomData; | ||||
| 
 | ||||
| /// Weight functions needed for `ghost_claims`.
 | ||||
| pub trait WeightInfo { | ||||
| 	fn claim() -> Weight; | ||||
| } | ||||
| 
 | ||||
| /// Weight for ghost_claims using the Substrate node and recommended hardware.
 | ||||
| pub struct SubstrateWeight<T>(PhantomData<T>); | ||||
| impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> { | ||||
| 	/// Storage: `System::Account` (r:2 w:2)
 | ||||
| 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
 | ||||
| 	/// Storage: `GhostClaims::Total` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostClaims::Total` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `CultCollective::Members` (r:2 w:2)
 | ||||
| 	/// Proof: `CultCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`)
 | ||||
| 	/// Storage: `CultCollective::MemberCount` (r:6 w:6)
 | ||||
| 	/// Proof: `CultCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`)
 | ||||
| 	/// Storage: `CultCollective::IdToIndex` (r:6 w:12)
 | ||||
| 	/// Proof: `CultCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`)
 | ||||
| 	/// Storage: `CultCollective::IndexToId` (r:0 w:6)
 | ||||
| 	/// Proof: `CultCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`)
 | ||||
| 	fn claim() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `896`
 | ||||
| 		//  Estimated: `16164`
 | ||||
| 		// Minimum execution time: 754_086_000 picoseconds.
 | ||||
| 		Weight::from_parts(756_147_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 16164)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(17)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(29)) | ||||
| 	} | ||||
|     fn claim() -> Weight; | ||||
| } | ||||
| 
 | ||||
| impl WeightInfo for () { | ||||
| 	/// Storage: `System::Account` (r:2 w:2)
 | ||||
| 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
 | ||||
| 	/// Storage: `GhostClaims::Total` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostClaims::Total` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `CultCollective::Members` (r:2 w:2)
 | ||||
| 	/// Proof: `CultCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`)
 | ||||
| 	/// Storage: `CultCollective::MemberCount` (r:6 w:6)
 | ||||
| 	/// Proof: `CultCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`)
 | ||||
| 	/// Storage: `CultCollective::IdToIndex` (r:6 w:12)
 | ||||
| 	/// Proof: `CultCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`)
 | ||||
| 	/// Storage: `CultCollective::IndexToId` (r:0 w:6)
 | ||||
| 	/// Proof: `CultCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`)
 | ||||
| 	fn claim() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `896`
 | ||||
| 		//  Estimated: `16164`
 | ||||
| 		// Minimum execution time: 754_086_000 picoseconds.
 | ||||
| 		Weight::from_parts(756_147_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 16164)) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(17)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(29)) | ||||
| 	} | ||||
|     fn claim() -> Weight { Weight::zero() } | ||||
| } | ||||
|  | ||||
							
								
								
									
										44
									
								
								pallets/networks/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										44
									
								
								pallets/networks/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -1,8 +1,8 @@ | ||||
| [package] | ||||
| name = "ghost-networks" | ||||
| version = "0.1.16" | ||||
| license.workspace = true | ||||
| authors.workspace = true | ||||
| version.workspace = true | ||||
| edition.workspace = true | ||||
| homepage.workspace = true | ||||
| repository.workspace = true | ||||
| @ -10,48 +10,40 @@ repository.workspace = true | ||||
| [dependencies] | ||||
| scale-info = { workspace = true, features = ["derive"] } | ||||
| codec = { workspace = true, features = ["max-encoded-len"] } | ||||
| num-traits = { workspace = true } | ||||
| 
 | ||||
| frame-benchmarking = { workspace = true, optional = true } | ||||
| frame-support = { workspace = true } | ||||
| frame-system = { workspace = true } | ||||
| pallet-staking = { workspace = true } | ||||
| sp-runtime = { workspace = true } | ||||
| sp-std = { workspace = true } | ||||
| ghost-traits = { workspace = true } | ||||
| 
 | ||||
| [dev-dependencies] | ||||
| primitives = { workspace = true } | ||||
| sp-io = { workspace = true } | ||||
| pallet-balances = { workspace = true } | ||||
| pallet-staking-reward-curve = { workspace = true } | ||||
| sp-io = { workspace = true } | ||||
| 
 | ||||
| [features] | ||||
| default = ["std"] | ||||
| std = [ | ||||
|     "scale-info/std", | ||||
|     "codec/std", | ||||
|     "num-traits/std", | ||||
|     "frame-support/std", | ||||
|     "frame-system/std", | ||||
|     "frame-benchmarking?/std", | ||||
|     "sp-runtime/std", | ||||
|     "sp-std/std", | ||||
|     "sp-io/std", | ||||
|     "ghost-traits/std", | ||||
|     "pallet-staking/std", | ||||
|     "pallet-balances/std", | ||||
| 	"scale-info/std", | ||||
| 	"codec/std", | ||||
| 	"frame-support/std", | ||||
| 	"frame-system/std", | ||||
| 	"frame-benchmarking?/std", | ||||
| 	"sp-runtime/std", | ||||
| 	"sp-std/std", | ||||
| 	"sp-io/std", | ||||
| 	"ghost-traits/std", | ||||
| 	"pallet-balances/std", | ||||
| ] | ||||
| runtime-benchmarks = [ | ||||
|     "frame-benchmarking/runtime-benchmarks", | ||||
|     "frame-support/runtime-benchmarks", | ||||
|     "frame-system/runtime-benchmarks", | ||||
|     "sp-runtime/runtime-benchmarks", | ||||
|     "pallet-staking/runtime-benchmarks", | ||||
| 	"frame-benchmarking/runtime-benchmarks", | ||||
| 	"frame-support/runtime-benchmarks", | ||||
| 	"frame-system/runtime-benchmarks", | ||||
| 	"sp-runtime/runtime-benchmarks", | ||||
| ] | ||||
| try-runtime = [ | ||||
|     "frame-support/try-runtime", | ||||
|     "frame-system/try-runtime", | ||||
|     "pallet-staking/try-runtime", | ||||
|     "pallet-balances/try-runtime", | ||||
| 	"frame-support/try-runtime", | ||||
| 	"frame-system/try-runtime", | ||||
| ] | ||||
|  | ||||
							
								
								
									
										88
									
								
								pallets/networks/src/benchmarking.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										88
									
								
								pallets/networks/src/benchmarking.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -8,44 +8,31 @@ use sp_runtime::Saturating; | ||||
| 
 | ||||
| const MAX_NAME_LEN: u32 = 20; | ||||
| const MAX_ENDPOINT_LEN: u32 = 150; | ||||
| const MAX_ENDPOINT_NUMBER: u32 = 20; | ||||
| 
 | ||||
| fn assert_last_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) { | ||||
|     frame_system::Pallet::<T>::assert_last_event(generic_event.into()); | ||||
| } | ||||
| 
 | ||||
| fn prepare_network<T: Config>( | ||||
|     n: u32, | ||||
|     m: u32, | ||||
|     k: u32, | ||||
|     n: u32, m: u32, | ||||
| ) -> (<T as module::Config>::NetworkId, NetworkData) { | ||||
|     let chain_id: <T as module::Config>::NetworkId = Default::default(); | ||||
|     let chain_id = chain_id.saturating_add((n + m).into()); | ||||
| 
 | ||||
|     let mut gatekeeper = b"0x".to_vec(); | ||||
|     for i in 0..40 { | ||||
|         gatekeeper.push(i); | ||||
|     } | ||||
|     for i in 0..40 { gatekeeper.push(i); } | ||||
| 
 | ||||
|     let mut topic_name = b"0x".to_vec(); | ||||
|     for i in 0..64 { | ||||
|         topic_name.push(i); | ||||
|     } | ||||
| 
 | ||||
|     let mut default_endpoints = sp_std::vec![]; | ||||
|     for _ in 0..(k as usize) { | ||||
|         default_endpoints.push(sp_std::vec![0x69; m as usize]); | ||||
|     } | ||||
|     for i in 0..64 { topic_name.push(i); } | ||||
| 
 | ||||
|     let network = NetworkData { | ||||
|         chain_name: sp_std::vec![0x69; n as usize], | ||||
|         default_endpoints, | ||||
|         default_endpoint: sp_std::vec![0x69; m as usize], | ||||
|         gatekeeper, | ||||
|         topic_name, | ||||
|         finality_delay: Some(69), | ||||
|         release_delay: Some(69), | ||||
|         network_type: NetworkType::Evm, | ||||
|         finality_delay: 69, | ||||
|         rate_limit_delay: 69, | ||||
|         block_distance: 69, | ||||
|         incoming_fee: 0, | ||||
|         outgoing_fee: 0, | ||||
|     }; | ||||
| @ -63,11 +50,8 @@ fn create_network<T: Config>( | ||||
|             let authority = T::RegisterOrigin::try_successful_origin() | ||||
|                 .map_err(|_| BenchmarkError::Weightless)?; | ||||
|             GhostNetworks::<T>::register_network( | ||||
|                 authority.clone(), | ||||
|                 chain_id.clone(), | ||||
|                 network.clone(), | ||||
|             ) | ||||
|             .map_err(|_| BenchmarkError::Weightless)?; | ||||
|                 authority.clone(), chain_id.clone(), network.clone() | ||||
|             ).map_err(|_| BenchmarkError::Weightless)?; | ||||
|             network | ||||
|         } | ||||
|     }; | ||||
| @ -79,9 +63,8 @@ benchmarks! { | ||||
|     register_network { | ||||
|         let i in 1 .. MAX_NAME_LEN; | ||||
|         let j in 1 .. MAX_ENDPOINT_LEN; | ||||
|         let k in 1 .. MAX_ENDPOINT_NUMBER; | ||||
| 
 | ||||
|         let (chain_id, network) = prepare_network::<T>(i, j, k); | ||||
|         let (chain_id, network) = prepare_network::<T>(i, j); | ||||
|         let authority = T::RegisterOrigin::try_successful_origin() | ||||
|             .map_err(|_| BenchmarkError::Weightless)?; | ||||
|         let prev_network = GhostNetworks::<T>::networks(chain_id.clone()); | ||||
| @ -96,7 +79,7 @@ benchmarks! { | ||||
|     update_network_name { | ||||
|         let n in 1 .. MAX_NAME_LEN; | ||||
|         let name = sp_std::vec![0x42; n as usize]; | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1, 1); | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1); | ||||
|         let authority = T::UpdateOrigin::try_successful_origin() | ||||
|             .map_err(|_| BenchmarkError::Weightless)?; | ||||
|         let prev_network = create_network::<T>(chain_id.clone(), network.clone())?; | ||||
| @ -110,25 +93,22 @@ benchmarks! { | ||||
| 
 | ||||
|     update_network_endpoint { | ||||
|         let n in 1 .. MAX_ENDPOINT_LEN; | ||||
|         let index_to_update = 0u32; | ||||
|         let endpoint = sp_std::vec![0x42; n as usize]; | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1, 1); | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1); | ||||
|         let authority = T::UpdateOrigin::try_successful_origin() | ||||
|             .map_err(|_| BenchmarkError::Weightless)?; | ||||
|         let prev_network = create_network::<T>(chain_id.clone(), network.clone())?; | ||||
|     }: _<T::RuntimeOrigin>(authority, chain_id.clone(), Some(index_to_update), Some(endpoint.clone())) | ||||
|     }: _<T::RuntimeOrigin>(authority, chain_id.clone(), endpoint.clone()) | ||||
|     verify { | ||||
|         assert_last_event::<T>(Event::NetworkEndpointUpdated { | ||||
|             chain_id: chain_id.clone(), | ||||
|             index: index_to_update, | ||||
|             endpoint, | ||||
|             chain_id: chain_id.clone(), default_endpoint: endpoint, | ||||
|         }.into()); | ||||
|         assert_ne!(GhostNetworks::<T>::networks(chain_id.clone()), prev_network); | ||||
|     } | ||||
| 
 | ||||
|     update_network_finality_delay { | ||||
|         let delay = 1337; | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1, 1); | ||||
|         let delay = Some(1337); | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1); | ||||
|         let authority = T::UpdateOrigin::try_successful_origin() | ||||
|             .map_err(|_| BenchmarkError::Weightless)?; | ||||
|         let prev_network = create_network::<T>(chain_id.clone(), network.clone())?; | ||||
| @ -140,37 +120,23 @@ benchmarks! { | ||||
|         assert_ne!(GhostNetworks::<T>::networks(chain_id.clone()), prev_network); | ||||
|     } | ||||
| 
 | ||||
|     update_network_rate_limit_delay { | ||||
|         let rate_limit = 1337; | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1, 1); | ||||
|     update_network_release_delay { | ||||
|         let delay = Some(1337); | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1); | ||||
|         let authority = T::UpdateOrigin::try_successful_origin() | ||||
|             .map_err(|_| BenchmarkError::Weightless)?; | ||||
|         let prev_network = create_network::<T>(chain_id.clone(), network.clone())?; | ||||
|     }: _<T::RuntimeOrigin>(authority, chain_id.clone(), rate_limit) | ||||
|     }: _<T::RuntimeOrigin>(authority, chain_id.clone(), delay) | ||||
|     verify { | ||||
|         assert_last_event::<T>(Event::NetworkRateLimitDelayUpdated { | ||||
|             chain_id: chain_id.clone(), rate_limit_delay: rate_limit, | ||||
|         }.into()); | ||||
|         assert_ne!(GhostNetworks::<T>::networks(chain_id.clone()), prev_network); | ||||
|     } | ||||
| 
 | ||||
|     update_network_block_distance { | ||||
|         let block_distance = 1337; | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1, 1); | ||||
|         let authority = T::UpdateOrigin::try_successful_origin() | ||||
|             .map_err(|_| BenchmarkError::Weightless)?; | ||||
|         let prev_network = create_network::<T>(chain_id.clone(), network.clone())?; | ||||
|     }: _<T::RuntimeOrigin>(authority, chain_id.clone(), block_distance) | ||||
|     verify { | ||||
|         assert_last_event::<T>(Event::NetworkBlockDistanceUpdated { | ||||
|             chain_id: chain_id.clone(), block_distance, | ||||
|         assert_last_event::<T>(Event::NetworkReleaseDelayUpdated { | ||||
|             chain_id: chain_id.clone(), release_delay: delay, | ||||
|         }.into()); | ||||
|         assert_ne!(GhostNetworks::<T>::networks(chain_id.clone()), prev_network); | ||||
|     } | ||||
| 
 | ||||
|     update_network_type { | ||||
|         let network_type = NetworkType::Utxo; | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1, 1); | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1); | ||||
|         let authority = T::UpdateOrigin::try_successful_origin() | ||||
|             .map_err(|_| BenchmarkError::Weightless)?; | ||||
|         let prev_network = create_network::<T>(chain_id.clone(), network.clone())?; | ||||
| @ -185,7 +151,7 @@ benchmarks! { | ||||
|     update_network_gatekeeper { | ||||
|         let mut gatekeeper = b"0x".to_vec(); | ||||
|         for i in 0..40 { gatekeeper.push(i + 1); } | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1, 1); | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1); | ||||
|         let authority = T::UpdateOrigin::try_successful_origin() | ||||
|             .map_err(|_| BenchmarkError::Weightless)?; | ||||
|         let prev_network = create_network::<T>(chain_id.clone(), network.clone())?; | ||||
| @ -199,7 +165,7 @@ benchmarks! { | ||||
| 
 | ||||
|     update_network_topic_name { | ||||
|         let topic_name = b"0x9876543219876543219876543219876543219876543219876543219876543219".to_vec(); | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1, 1); | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1); | ||||
|         let authority = T::UpdateOrigin::try_successful_origin() | ||||
|             .map_err(|_| BenchmarkError::Weightless)?; | ||||
|         let prev_network = create_network::<T>(chain_id.clone(), network.clone())?; | ||||
| @ -213,7 +179,7 @@ benchmarks! { | ||||
| 
 | ||||
|     update_incoming_network_fee { | ||||
|         let incoming_fee = 1337; | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1, 1); | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1); | ||||
|         let authority = T::UpdateOrigin::try_successful_origin() | ||||
|             .map_err(|_| BenchmarkError::Weightless)?; | ||||
|         let prev_network = create_network::<T>(chain_id.clone(), network.clone())?; | ||||
| @ -227,7 +193,7 @@ benchmarks! { | ||||
| 
 | ||||
|     update_outgoing_network_fee { | ||||
|         let outgoing_fee = 1337; | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1, 1); | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1); | ||||
|         let authority = T::UpdateOrigin::try_successful_origin() | ||||
|             .map_err(|_| BenchmarkError::Weightless)?; | ||||
|         let prev_network = create_network::<T>(chain_id.clone(), network.clone())?; | ||||
| @ -240,7 +206,7 @@ benchmarks! { | ||||
|     } | ||||
| 
 | ||||
|     remove_network { | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1, 1); | ||||
|         let (chain_id, network) = prepare_network::<T>(1, 1); | ||||
|         let authority = T::RemoveOrigin::try_successful_origin() | ||||
|             .map_err(|_| BenchmarkError::Weightless)?; | ||||
|         let prev_network = create_network::<T>(chain_id.clone(), network.clone())?; | ||||
|  | ||||
							
								
								
									
										488
									
								
								pallets/networks/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										488
									
								
								pallets/networks/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -4,29 +4,25 @@ | ||||
| 
 | ||||
| use frame_support::{ | ||||
|     pallet_prelude::*, | ||||
|     storage::PrefixIterator, | ||||
|     traits::{tokens::fungible::Inspect, EnsureOrigin}, | ||||
|     storage::PrefixIterator, traits::EnsureOrigin, | ||||
| }; | ||||
| use frame_system::pallet_prelude::*; | ||||
| use scale_info::TypeInfo; | ||||
| 
 | ||||
| use sp_runtime::{ | ||||
|     curve::PiecewiseLinear, | ||||
|     traits::{AtLeast32BitUnsigned, CheckedAdd, CheckedSub, Member}, | ||||
|     traits::{AtLeast32BitUnsigned, Member}, | ||||
|     DispatchResult, | ||||
| }; | ||||
| use sp_std::{convert::TryInto, prelude::*}; | ||||
| use sp_std::prelude::*; | ||||
| 
 | ||||
| pub use ghost_traits::networks::{ | ||||
|     NetworkDataBasicHandler, NetworkDataInspectHandler, NetworkDataMutateHandler, | ||||
|     NetworkDataBasicHandler, NetworkDataInspectHandler, 
 | ||||
|     NetworkDataMutateHandler, | ||||
| }; | ||||
| 
 | ||||
| mod math; | ||||
| mod weights; | ||||
| 
 | ||||
| pub use crate::weights::WeightInfo; | ||||
| use math::MulDiv; | ||||
| pub use module::*; | ||||
| pub use crate::weights::WeightInfo; | ||||
| 
 | ||||
| #[cfg(any(feature = "runtime-benchmarks", test))] | ||||
| mod benchmarking; | ||||
| @ -35,9 +31,6 @@ mod mock; | ||||
| #[cfg(all(feature = "std", test))] | ||||
| mod tests; | ||||
| 
 | ||||
| pub type BalanceOf<T> = | ||||
|     <<T as Config>::Currency as Inspect<<T as frame_system::Config>::AccountId>>::Balance; | ||||
| 
 | ||||
| #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] | ||||
| pub enum NetworkType { | ||||
|     Evm = 0, | ||||
| @ -46,78 +39,22 @@ pub enum NetworkType { | ||||
| } | ||||
| 
 | ||||
| impl Default for NetworkType { | ||||
|     fn default() -> Self { | ||||
|         NetworkType::Evm | ||||
|     } | ||||
|     fn default() -> Self { NetworkType::Evm } | ||||
| } | ||||
| 
 | ||||
| #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] | ||||
| pub struct NetworkData { | ||||
|     pub chain_name: Vec<u8>, | ||||
|     pub default_endpoints: Vec<Vec<u8>>, | ||||
|     pub default_endpoint: Vec<u8>, | ||||
|     pub gatekeeper: Vec<u8>, | ||||
|     pub topic_name: Vec<u8>, | ||||
|     pub finality_delay: Option<u64>, | ||||
|     pub release_delay: Option<u64>, | ||||
|     pub network_type: NetworkType, | ||||
|     pub finality_delay: u64, | ||||
|     pub rate_limit_delay: u64, | ||||
|     pub block_distance: u64, | ||||
|     pub incoming_fee: u32, | ||||
|     pub outgoing_fee: u32, | ||||
| } | ||||
| 
 | ||||
| #[derive(Default, Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] | ||||
| pub struct BridgeAdjustment<Balance> { | ||||
|     pub bridged_out: Balance, | ||||
|     pub bridged_in: Balance, | ||||
| } | ||||
| 
 | ||||
| pub struct BridgedInflationCurve<RewardCurve, T>(core::marker::PhantomData<(RewardCurve, T)>); | ||||
| impl<Balance, RewardCurve, T> pallet_staking::EraPayout<Balance> | ||||
|     for BridgedInflationCurve<RewardCurve, T> | ||||
| where | ||||
|     Balance: Default | ||||
|         + Copy | ||||
|         + From<BalanceOf<T>> | ||||
|         + AtLeast32BitUnsigned | ||||
|         + num_traits::ops::wrapping::WrappingAdd | ||||
|         + num_traits::ops::overflowing::OverflowingAdd | ||||
|         + sp_std::ops::AddAssign | ||||
|         + sp_std::ops::Not<Output = Balance> | ||||
|         + sp_std::ops::Shl<Output = Balance> | ||||
|         + sp_std::ops::Shr<Output = Balance> | ||||
|         + sp_std::ops::BitAnd<Balance, Output = Balance>, | ||||
|     RewardCurve: Get<&'static PiecewiseLinear<'static>>, | ||||
|     T: Config, | ||||
| { | ||||
|     fn era_payout( | ||||
|         total_staked: Balance, | ||||
|         total_issuance: Balance, | ||||
|         _era_duration_in_millis: u64, | ||||
|     ) -> (Balance, Balance) { | ||||
|         let reward_curve = RewardCurve::get(); | ||||
|         let bridged_imbalance = BridgedImbalance::<T>::get(); | ||||
|         let accumulated_commission = AccumulatedCommission::<T>::get(); | ||||
| 
 | ||||
|         let accumulated_commission: Balance = accumulated_commission.into(); | ||||
|         let adjusted_issuance: Balance = total_issuance | ||||
|             .saturating_add(bridged_imbalance.bridged_out.into()) | ||||
|             .saturating_sub(bridged_imbalance.bridged_in.into()); | ||||
| 
 | ||||
|         NullifyNeeded::<T>::set(true); | ||||
| 
 | ||||
|         let estimated_reward = | ||||
|             reward_curve.calculate_for_fraction_times_denominator(total_staked, adjusted_issuance); | ||||
|         let payout = MulDiv::<Balance>::calculate( | ||||
|             estimated_reward, | ||||
|             accumulated_commission, | ||||
|             adjusted_issuance, | ||||
|         ); | ||||
|         let rest_payout = accumulated_commission.saturating_sub(payout); | ||||
| 
 | ||||
|         (payout, rest_payout) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[frame_support::pallet] | ||||
| pub mod module { | ||||
|     use super::*; | ||||
| @ -126,9 +63,6 @@ pub mod module { | ||||
|     pub trait Config: frame_system::Config { | ||||
|         type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>; | ||||
| 
 | ||||
|         /// The type used for the internal balance storage.
 | ||||
|         type Currency: Inspect<Self::AccountId>; | ||||
| 
 | ||||
|         /// The type used as a unique network id.
 | ||||
|         type NetworkId: Parameter | ||||
|             + Member | ||||
| @ -140,7 +74,7 @@ pub mod module { | ||||
|             + TypeInfo | ||||
|             + MaybeSerializeDeserialize | ||||
|             + MaxEncodedLen; | ||||
| 
 | ||||
|         
 | ||||
|         /// The origin required to register new network.
 | ||||
|         type RegisterOrigin: EnsureOrigin<Self::RuntimeOrigin>; | ||||
|         /// The origin required to update network information.
 | ||||
| @ -167,87 +101,24 @@ pub mod module { | ||||
|     #[pallet::event] | ||||
|     #[pallet::generate_deposit(pub(crate) fn deposit_event)] | ||||
|     pub enum Event<T: Config> { | ||||
|         NetworkRegistered { | ||||
|             chain_id: T::NetworkId, | ||||
|             network: NetworkData, | ||||
|         }, | ||||
|         NetworkNameUpdated { | ||||
|             chain_id: T::NetworkId, | ||||
|             chain_name: Vec<u8>, | ||||
|         }, | ||||
|         NetworkEndpointUpdated { | ||||
|             chain_id: T::NetworkId, | ||||
|             index: u32, | ||||
|             endpoint: Vec<u8>, | ||||
|         }, | ||||
|         NetworkEndpointRemoved { | ||||
|             chain_id: T::NetworkId, | ||||
|             index: u32, | ||||
|         }, | ||||
|         NetworkEndpointAdded { | ||||
|             chain_id: T::NetworkId, | ||||
|             endpoint: Vec<u8>, | ||||
|         }, | ||||
|         NetworkFinalityDelayUpdated { | ||||
|             chain_id: T::NetworkId, | ||||
|             finality_delay: u64, | ||||
|         }, | ||||
|         NetworkRateLimitDelayUpdated { | ||||
|             chain_id: T::NetworkId, | ||||
|             rate_limit_delay: u64, | ||||
|         }, | ||||
|         NetworkBlockDistanceUpdated { | ||||
|             chain_id: T::NetworkId, | ||||
|             block_distance: u64, | ||||
|         }, | ||||
|         NetworkTypeUpdated { | ||||
|             chain_id: T::NetworkId, | ||||
|             network_type: NetworkType, | ||||
|         }, | ||||
|         NetworkGatekeeperUpdated { | ||||
|             chain_id: T::NetworkId, | ||||
|             gatekeeper: Vec<u8>, | ||||
|         }, | ||||
|         NetworkTopicNameUpdated { | ||||
|             chain_id: T::NetworkId, | ||||
|             topic_name: Vec<u8>, | ||||
|         }, | ||||
|         NetworkIncomingFeeUpdated { | ||||
|             chain_id: T::NetworkId, | ||||
|             incoming_fee: u32, | ||||
|         }, | ||||
|         NetworkOutgoingFeeUpdated { | ||||
|             chain_id: T::NetworkId, | ||||
|             outgoing_fee: u32, | ||||
|         }, | ||||
|         NetworkRemoved { | ||||
|             chain_id: T::NetworkId, | ||||
|         }, | ||||
|         NetworkRegistered { chain_id: T::NetworkId, network: NetworkData }, | ||||
|         NetworkNameUpdated { chain_id: T::NetworkId, chain_name: Vec<u8> }, | ||||
|         NetworkEndpointUpdated { chain_id: T::NetworkId, default_endpoint: Vec<u8> }, | ||||
|         NetworkFinalityDelayUpdated { chain_id: T::NetworkId, finality_delay: Option<u64> }, | ||||
|         NetworkReleaseDelayUpdated { chain_id: T::NetworkId, release_delay: Option<u64> }, | ||||
|         NetworkTypeUpdated { chain_id: T::NetworkId, network_type: NetworkType }, | ||||
|         NetworkGatekeeperUpdated { chain_id: T::NetworkId, gatekeeper: Vec<u8> }, | ||||
|         NetworkTopicNameUpdated { chain_id: T::NetworkId, topic_name: Vec<u8> }, | ||||
|         NetworkIncomingFeeUpdated { chain_id: T::NetworkId, incoming_fee: u32 }, | ||||
|         NetworkOutgoingFeeUpdated { chain_id: T::NetworkId, outgoing_fee: u32 }, | ||||
|         NetworkRemoved { chain_id: T::NetworkId }, | ||||
|     } | ||||
| 
 | ||||
|     #[pallet::storage] | ||||
|     #[pallet::getter(fn nullify_needed)] | ||||
|     pub type NullifyNeeded<T: Config> = StorageValue<_, bool, ValueQuery>; | ||||
| 
 | ||||
|     #[pallet::storage] | ||||
|     #[pallet::getter(fn bridged_imbalance)] | ||||
|     pub type BridgedImbalance<T: Config> = | ||||
|         StorageValue<_, BridgeAdjustment<BalanceOf<T>>, ValueQuery>; | ||||
| 
 | ||||
|     #[pallet::storage] | ||||
|     #[pallet::getter(fn accumulated_commission)] | ||||
|     pub type AccumulatedCommission<T: Config> = StorageValue<_, BalanceOf<T>, ValueQuery>; | ||||
| 
 | ||||
|     #[pallet::storage] | ||||
|     #[pallet::getter(fn networks)] | ||||
|     pub type Networks<T: Config> = | ||||
|         StorageMap<_, Twox64Concat, T::NetworkId, NetworkData, OptionQuery>; | ||||
| 
 | ||||
|     #[pallet::storage] | ||||
|     #[pallet::getter(fn gatekeeper_amount)] | ||||
|     pub type GatekeeperAmount<T: Config> = | ||||
|         StorageMap<_, Twox64Concat, T::NetworkId, BalanceOf<T>, ValueQuery>; | ||||
| 
 | ||||
|     #[pallet::genesis_config] | ||||
|     pub struct GenesisConfig<T: Config> { | ||||
|         pub networks: Vec<(T::NetworkId, Vec<u8>)>, | ||||
| @ -255,7 +126,7 @@ pub mod module { | ||||
| 
 | ||||
|     impl<T: Config> Default for GenesisConfig<T> { | ||||
|         fn default() -> Self { | ||||
|             Self { networks: vec![] } | ||||
|             Self { networks: vec![] } 
 | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -263,13 +134,12 @@ pub mod module { | ||||
|     impl<T: Config> BuildGenesisConfig for GenesisConfig<T> { | ||||
|         fn build(&self) { | ||||
|             if !self.networks.is_empty() { | ||||
|                 self.networks | ||||
|                     .iter() | ||||
|                     .for_each(|(chain_id, network_metadata)| { | ||||
|                         let network = NetworkData::decode(&mut &network_metadata[..]) | ||||
|                             .expect("Error decoding NetworkData"); | ||||
|                         Pallet::<T>::do_register_network(chain_id.clone(), network) | ||||
|                             .expect("Error registering network"); | ||||
|                 self.networks.iter().for_each(|(chain_id, network_metadata)| { | ||||
|                     let network = | ||||
|                         NetworkData::decode(&mut &network_metadata[..]) | ||||
|                         .expect("Error decoding NetworkData"); | ||||
|                     Pallet::<T>::do_register_network(chain_id.clone(), network) | ||||
|                         .expect("Error registering network"); | ||||
|                     }); | ||||
|             } | ||||
|         } | ||||
| @ -280,30 +150,14 @@ pub mod module { | ||||
|     pub struct Pallet<T>(PhantomData<T>); | ||||
| 
 | ||||
|     #[pallet::hooks] | ||||
|     impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> { | ||||
|         fn on_initialize(_: BlockNumberFor<T>) -> Weight { | ||||
|             T::DbWeight::get().reads_writes(1, 1) | ||||
|         } | ||||
| 
 | ||||
|         fn on_finalize(_: BlockNumberFor<T>) { | ||||
|             if Self::nullify_needed() { | ||||
|                 Self::nullify_commission(); | ||||
|                 NullifyNeeded::<T>::put(false); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {} | ||||
| 
 | ||||
|     #[pallet::call] | ||||
|     impl<T: Config> Pallet<T> { | ||||
|         #[pallet::call_index(0)] | ||||
|         #[pallet::weight(T::WeightInfo::register_network(
 | ||||
|             network.chain_name.len() as u32, | ||||
|             network.default_endpoints | ||||
|                 .iter() | ||||
|                 .map(|endpoint| endpoint.len()) | ||||
|                 .max() | ||||
|                 .unwrap_or_default() as u32, | ||||
|             network.default_endpoints.len() as u32, | ||||
|             network.default_endpoint.len() as u32, | ||||
|         ))] | ||||
|         pub fn register_network( | ||||
|             origin: OriginFor<T>, | ||||
| @ -324,24 +178,26 @@ pub mod module { | ||||
|             chain_name: Vec<u8>, | ||||
|         ) -> DispatchResult { | ||||
|             T::UpdateOrigin::ensure_origin_or_root(origin)?; | ||||
|             Self::do_update_network_name(chain_id, chain_name) | ||||
|             Self::do_update_network_name( | ||||
|                 chain_id, | ||||
|                 chain_name, | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         #[pallet::call_index(2)] | ||||
|         #[pallet::weight(T::WeightInfo::update_network_endpoint(
 | ||||
|             maybe_endpoint | ||||
|                 .as_ref() | ||||
|                 .map(|endpoint| endpoint.len()) | ||||
|                 .unwrap_or_default() as u32 | ||||
|             default_endpoint.len() as u32 | ||||
|         ))] | ||||
|         pub fn update_network_endpoint( | ||||
|             origin: OriginFor<T>, | ||||
|             chain_id: T::NetworkId, | ||||
|             maybe_index: Option<u32>, | ||||
|             maybe_endpoint: Option<Vec<u8>>, | ||||
|             default_endpoint: Vec<u8>, | ||||
|         ) -> DispatchResult { | ||||
|             T::UpdateOrigin::ensure_origin_or_root(origin)?; | ||||
|             Self::do_update_network_endpoint(chain_id, maybe_index, maybe_endpoint) | ||||
|             Self::do_update_network_endpoint( | ||||
|                 chain_id, | ||||
|                 default_endpoint, | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         #[pallet::call_index(3)] | ||||
| @ -349,35 +205,30 @@ pub mod module { | ||||
|         pub fn update_network_finality_delay( | ||||
|             origin: OriginFor<T>, | ||||
|             chain_id: T::NetworkId, | ||||
|             finality_delay: u64, | ||||
|             finality_delay: Option<u64>, | ||||
|         ) -> DispatchResult { | ||||
|             T::UpdateOrigin::ensure_origin_or_root(origin)?; | ||||
|             Self::do_update_network_finality_delay(chain_id, finality_delay) | ||||
|             Self::do_update_network_finality_delay( | ||||
|                 chain_id, | ||||
|                 finality_delay, | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         #[pallet::call_index(4)] | ||||
|         #[pallet::weight(T::WeightInfo::update_network_rate_limit_delay())] | ||||
|         pub fn update_network_rate_limit_delay( | ||||
|         #[pallet::weight(T::WeightInfo::update_network_release_delay())] | ||||
|         pub fn update_network_release_delay( | ||||
|             origin: OriginFor<T>, | ||||
|             chain_id: T::NetworkId, | ||||
|             rate_limit_delay: u64, | ||||
|             release_delay: Option<u64>, | ||||
|         ) -> DispatchResult { | ||||
|             T::UpdateOrigin::ensure_origin_or_root(origin)?; | ||||
|             Self::do_update_network_rate_limit_delay(chain_id, rate_limit_delay) | ||||
|             Self::do_update_network_release_delay( | ||||
|                 chain_id, | ||||
|                 release_delay, | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         #[pallet::call_index(5)] | ||||
|         #[pallet::weight(T::WeightInfo::update_network_block_distance())] | ||||
|         pub fn update_network_block_distance( | ||||
|             origin: OriginFor<T>, | ||||
|             chain_id: T::NetworkId, | ||||
|             block_distance: u64, | ||||
|         ) -> DispatchResult { | ||||
|             T::UpdateOrigin::ensure_origin_or_root(origin)?; | ||||
|             Self::do_update_network_block_distance(chain_id, block_distance) | ||||
|         } | ||||
| 
 | ||||
|         #[pallet::call_index(6)] | ||||
|         #[pallet::weight(T::WeightInfo::update_network_type())] | ||||
|         pub fn update_network_type( | ||||
|             origin: OriginFor<T>, | ||||
| @ -385,10 +236,13 @@ pub mod module { | ||||
|             network_type: NetworkType, | ||||
|         ) -> DispatchResult { | ||||
|             T::UpdateOrigin::ensure_origin_or_root(origin)?; | ||||
|             Self::do_update_network_type(chain_id, network_type) | ||||
|             Self::do_update_network_type( | ||||
|                 chain_id, | ||||
|                 network_type, | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         #[pallet::call_index(7)] | ||||
|         #[pallet::call_index(6)] | ||||
|         #[pallet::weight(T::WeightInfo::update_network_gatekeeper())] | ||||
|         pub fn update_network_gatekeeper( | ||||
|             origin: OriginFor<T>, | ||||
| @ -396,10 +250,13 @@ pub mod module { | ||||
|             gatekeeper: Vec<u8>, | ||||
|         ) -> DispatchResult { | ||||
|             T::UpdateOrigin::ensure_origin_or_root(origin)?; | ||||
|             Self::do_update_network_gatekeeper(chain_id, gatekeeper) | ||||
|             Self::do_update_network_gatekeeper( | ||||
|                 chain_id, | ||||
|                 gatekeeper, | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         #[pallet::call_index(8)] | ||||
|         #[pallet::call_index(7)] | ||||
|         #[pallet::weight(T::WeightInfo::update_network_topic_name())] | ||||
|         pub fn update_network_topic_name( | ||||
|             origin: OriginFor<T>, | ||||
| @ -407,10 +264,13 @@ pub mod module { | ||||
|             topic_name: Vec<u8>, | ||||
|         ) -> DispatchResult { | ||||
|             T::UpdateOrigin::ensure_origin_or_root(origin)?; | ||||
|             Self::do_update_network_topic_name(chain_id, topic_name) | ||||
|             Self::do_update_network_topic_name( | ||||
|                 chain_id, | ||||
|                 topic_name, | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         #[pallet::call_index(9)] | ||||
|         #[pallet::call_index(8)] | ||||
|         #[pallet::weight(T::WeightInfo::update_incoming_network_fee())] | ||||
|         pub fn update_incoming_network_fee( | ||||
|             origin: OriginFor<T>, | ||||
| @ -418,10 +278,13 @@ pub mod module { | ||||
|             incoming_fee: u32, | ||||
|         ) -> DispatchResult { | ||||
|             T::UpdateOrigin::ensure_origin_or_root(origin)?; | ||||
|             Self::do_update_incoming_network_fee(chain_id, incoming_fee) | ||||
|             Self::do_update_incoming_network_fee( | ||||
|                 chain_id, | ||||
|                 incoming_fee, | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         #[pallet::call_index(10)] | ||||
|         #[pallet::call_index(9)] | ||||
|         #[pallet::weight(T::WeightInfo::update_outgoing_network_fee())] | ||||
|         pub fn update_outgoing_network_fee( | ||||
|             origin: OriginFor<T>, | ||||
| @ -429,12 +292,18 @@ pub mod module { | ||||
|             outgoing_fee: u32, | ||||
|         ) -> DispatchResult { | ||||
|             T::UpdateOrigin::ensure_origin_or_root(origin)?; | ||||
|             Self::do_update_outgoing_network_fee(chain_id, outgoing_fee) | ||||
|             Self::do_update_outgoing_network_fee( | ||||
|                 chain_id, | ||||
|                 outgoing_fee, | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         #[pallet::call_index(11)] | ||||
|         #[pallet::call_index(10)] | ||||
|         #[pallet::weight(T::WeightInfo::remove_network())] | ||||
|         pub fn remove_network(origin: OriginFor<T>, chain_id: T::NetworkId) -> DispatchResult { | ||||
|         pub fn remove_network( | ||||
|             origin: OriginFor<T>, | ||||
|             chain_id: T::NetworkId, | ||||
|         ) -> DispatchResult { | ||||
|             T::RemoveOrigin::ensure_origin_or_root(origin)?; | ||||
|             Self::do_remove_network(chain_id) | ||||
|         } | ||||
| @ -443,12 +312,12 @@ pub mod module { | ||||
| 
 | ||||
| impl<T: Config> Pallet<T> { | ||||
|     /// Register a new network.
 | ||||
|     pub fn do_register_network(chain_id: T::NetworkId, network: NetworkData) -> DispatchResult { | ||||
|     pub fn do_register_network( | ||||
|         chain_id: T::NetworkId, | ||||
|         network: NetworkData, | ||||
|     ) -> DispatchResult { | ||||
|         Networks::<T>::try_mutate(&chain_id, |maybe_network| -> DispatchResult { | ||||
|             ensure!( | ||||
|                 maybe_network.is_none(), | ||||
|                 Error::<T>::NetworkAlreadyRegistered | ||||
|             ); | ||||
|             ensure!(maybe_network.is_none(), Error::<T>::NetworkAlreadyRegistered); | ||||
|             *maybe_network = Some(network.clone()); | ||||
|             Ok(()) | ||||
|         })?; | ||||
| @ -470,7 +339,10 @@ impl<T: Config> Pallet<T> { | ||||
|     } | ||||
| 
 | ||||
|     /// Update existent network name.
 | ||||
|     pub fn do_update_network_name(chain_id: T::NetworkId, chain_name: Vec<u8>) -> DispatchResult { | ||||
|     pub fn do_update_network_name( | ||||
|         chain_id: T::NetworkId, | ||||
|         chain_name: Vec<u8>, | ||||
|     ) -> DispatchResult { | ||||
|         Networks::<T>::try_mutate(&chain_id, |maybe_network| -> DispatchResult { | ||||
|             ensure!(maybe_network.is_some(), Error::<T>::NetworkDoesNotExist); | ||||
|             let net = maybe_network.as_mut().unwrap(); | ||||
| @ -489,45 +361,26 @@ impl<T: Config> Pallet<T> { | ||||
|     /// Update existent network default endpoint.
 | ||||
|     pub fn do_update_network_endpoint( | ||||
|         chain_id: T::NetworkId, | ||||
|         maybe_index: Option<u32>, | ||||
|         maybe_endpoint: Option<Vec<u8>>, | ||||
|         default_endpoint: Vec<u8>, | ||||
|     ) -> DispatchResult { | ||||
|         Networks::<T>::try_mutate(&chain_id, |maybe_network| -> DispatchResult { | ||||
|             ensure!(maybe_network.is_some(), Error::<T>::NetworkDoesNotExist); | ||||
|             let updated_network = maybe_network.as_mut().unwrap(); | ||||
|             match (maybe_index, maybe_endpoint) { | ||||
|                 (Some(index), Some(endpoint)) => { | ||||
|                     if let Some(previous_endpoint) = | ||||
|                         updated_network.default_endpoints.get_mut(index as usize) | ||||
|                     { | ||||
|                         *previous_endpoint = endpoint.clone(); | ||||
|                         Self::deposit_event(Event::<T>::NetworkEndpointUpdated { | ||||
|                             chain_id, | ||||
|                             index, | ||||
|                             endpoint, | ||||
|                         }); | ||||
|                     } | ||||
|                 } | ||||
|                 (None, Some(endpoint)) => { | ||||
|                     updated_network.default_endpoints.push(endpoint.clone()); | ||||
|                     Self::deposit_event(Event::<T>::NetworkEndpointAdded { chain_id, endpoint }); | ||||
|                 } | ||||
|                 (Some(index), None) => { | ||||
|                     updated_network.default_endpoints.remove(index as usize); | ||||
|                     Self::deposit_event(Event::<T>::NetworkEndpointRemoved { chain_id, index }); | ||||
|                 } | ||||
|                 (None, None) => {} | ||||
|             } | ||||
|             *maybe_network = Some(updated_network.clone()); | ||||
|             let net = maybe_network.as_mut().unwrap(); | ||||
|             net.default_endpoint = default_endpoint.clone(); | ||||
|             *maybe_network = Some(net.clone()); | ||||
|             Ok(()) | ||||
|         })?; | ||||
|         Self::deposit_event(Event::<T>::NetworkEndpointUpdated { | ||||
|             chain_id, | ||||
|             default_endpoint, | ||||
|         }); | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     /// Update existent network default finality delay.
 | ||||
|     /// Update existent network default endpoint.
 | ||||
|     pub fn do_update_network_finality_delay( | ||||
|         chain_id: T::NetworkId, | ||||
|         finality_delay: u64, | ||||
|         finality_delay: Option<u64>, | ||||
|     ) -> DispatchResult { | ||||
|         Networks::<T>::try_mutate(&chain_id, |maybe_network| -> DispatchResult { | ||||
|             ensure!(maybe_network.is_some(), Error::<T>::NetworkDoesNotExist); | ||||
| @ -543,40 +396,21 @@ impl<T: Config> Pallet<T> { | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     /// Update existent network default rate limit delay.
 | ||||
|     pub fn do_update_network_rate_limit_delay( | ||||
|     /// Update existent network default endpoint.
 | ||||
|     pub fn do_update_network_release_delay( | ||||
|         chain_id: T::NetworkId, | ||||
|         rate_limit_delay: u64, | ||||
|         release_delay: Option<u64>, | ||||
|     ) -> DispatchResult { | ||||
|         Networks::<T>::try_mutate(&chain_id, |maybe_network| -> DispatchResult { | ||||
|             ensure!(maybe_network.is_some(), Error::<T>::NetworkDoesNotExist); | ||||
|             let net = maybe_network.as_mut().unwrap(); | ||||
|             net.rate_limit_delay = rate_limit_delay; | ||||
|             net.release_delay = release_delay; | ||||
|             *maybe_network = Some(net.clone()); | ||||
|             Ok(()) | ||||
|         })?; | ||||
|         Self::deposit_event(Event::<T>::NetworkRateLimitDelayUpdated { | ||||
|         Self::deposit_event(Event::<T>::NetworkReleaseDelayUpdated { | ||||
|             chain_id, | ||||
|             rate_limit_delay, | ||||
|         }); | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     /// Update existent network default max distance between blocks.
 | ||||
|     pub fn do_update_network_block_distance( | ||||
|         chain_id: T::NetworkId, | ||||
|         block_distance: u64, | ||||
|     ) -> DispatchResult { | ||||
|         Networks::<T>::try_mutate(&chain_id, |maybe_network| -> DispatchResult { | ||||
|             ensure!(maybe_network.is_some(), Error::<T>::NetworkDoesNotExist); | ||||
|             let net = maybe_network.as_mut().unwrap(); | ||||
|             net.block_distance = block_distance; | ||||
|             *maybe_network = Some(net.clone()); | ||||
|             Ok(()) | ||||
|         })?; | ||||
|         Self::deposit_event(Event::<T>::NetworkBlockDistanceUpdated { | ||||
|             chain_id, | ||||
|             block_distance, | ||||
|             release_delay, | ||||
|         }); | ||||
|         Ok(()) | ||||
|     } | ||||
| @ -605,10 +439,8 @@ impl<T: Config> Pallet<T> { | ||||
|         chain_id: T::NetworkId, | ||||
|         gatekeeper: Vec<u8>, | ||||
|     ) -> DispatchResult { | ||||
|         ensure!( | ||||
|             gatekeeper.len() == 42 && gatekeeper[0] == 48 && gatekeeper[1] == 120, | ||||
|             Error::<T>::WrongGatekeeperAddress | ||||
|         ); | ||||
|         ensure!(gatekeeper.len() == 42 && gatekeeper[0] == 48 && gatekeeper[1] == 120, 
 | ||||
|             Error::<T>::WrongGatekeeperAddress); | ||||
|         Networks::<T>::try_mutate(&chain_id, |maybe_network| -> DispatchResult { | ||||
|             ensure!(maybe_network.is_some(), Error::<T>::NetworkDoesNotExist); | ||||
|             let net = maybe_network.as_mut().unwrap(); | ||||
| @ -628,10 +460,8 @@ impl<T: Config> Pallet<T> { | ||||
|         chain_id: T::NetworkId, | ||||
|         topic_name: Vec<u8>, | ||||
|     ) -> DispatchResult { | ||||
|         ensure!( | ||||
|             topic_name.len() == 66 && topic_name[0] == 48 && topic_name[1] == 120, | ||||
|             Error::<T>::WrongTopicName | ||||
|         ); | ||||
|         ensure!(topic_name.len() == 66 && topic_name[0] == 48 && topic_name[1] == 120, 
 | ||||
|             Error::<T>::WrongTopicName); | ||||
|         Networks::<T>::try_mutate(&chain_id, |maybe_network| -> DispatchResult { | ||||
|             ensure!(maybe_network.is_some(), Error::<T>::NetworkDoesNotExist); | ||||
|             let net = maybe_network.as_mut().unwrap(); | ||||
| @ -695,13 +525,9 @@ impl<T: Config> NetworkDataInspectHandler<NetworkData> for Pallet<T> { | ||||
|     fn iter() -> PrefixIterator<(Self::NetworkId, NetworkData)> { | ||||
|         Networks::<T>::iter() | ||||
|     } | ||||
| 
 | ||||
|     fn is_nullification_period() -> bool { | ||||
|         NullifyNeeded::<T>::get() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<T: Config> NetworkDataMutateHandler<NetworkData, BalanceOf<T>> for Pallet<T> { | ||||
| impl<T: Config> NetworkDataMutateHandler<NetworkData> for Pallet<T> { | ||||
|     fn register(chain_id: Self::NetworkId, network: NetworkData) -> DispatchResult { | ||||
|         Self::do_register_network(chain_id, network) | ||||
|     } | ||||
| @ -709,94 +535,4 @@ impl<T: Config> NetworkDataMutateHandler<NetworkData, BalanceOf<T>> for Pallet<T | ||||
|     fn remove(chain_id: Self::NetworkId) -> DispatchResult { | ||||
|         Self::do_remove_network(chain_id) | ||||
|     } | ||||
| 
 | ||||
|     fn increase_gatekeeper_amount( | ||||
|         network_id: &T::NetworkId, | ||||
|         amount: &BalanceOf<T>, | ||||
|     ) -> Result<BalanceOf<T>, ()> { | ||||
|         let new_gatekeeper_amount = | ||||
|             GatekeeperAmount::<T>::mutate(network_id, |gatekeeper_amount| match gatekeeper_amount | ||||
|                 .checked_add(amount) | ||||
|             { | ||||
|                 Some(value) => { | ||||
|                     *gatekeeper_amount = value; | ||||
|                     Ok(value) | ||||
|                 } | ||||
|                 None => Err(()), | ||||
|             })?; | ||||
| 
 | ||||
|         Ok(new_gatekeeper_amount) | ||||
|     } | ||||
| 
 | ||||
|     fn decrease_gatekeeper_amount( | ||||
|         network_id: &T::NetworkId, | ||||
|         amount: &BalanceOf<T>, | ||||
|     ) -> Result<BalanceOf<T>, ()> { | ||||
|         let new_gatekeeper_amount = | ||||
|             GatekeeperAmount::<T>::mutate(network_id, |gatekeeper_amount| match gatekeeper_amount | ||||
|                 .checked_sub(amount) | ||||
|             { | ||||
|                 Some(value) => { | ||||
|                     *gatekeeper_amount = value; | ||||
|                     Ok(value) | ||||
|                 } | ||||
|                 None => Err(()), | ||||
|             })?; | ||||
| 
 | ||||
|         Ok(new_gatekeeper_amount) | ||||
|     } | ||||
| 
 | ||||
|     fn accumulate_outgoing_imbalance(amount: &BalanceOf<T>) -> Result<BalanceOf<T>, ()> { | ||||
|         let new_bridged_out_amount = BridgedImbalance::<T>::mutate(|bridged_imbalance| { | ||||
|             match bridged_imbalance.bridged_out.checked_add(amount) { | ||||
|                 Some(value) => { | ||||
|                     (*bridged_imbalance).bridged_out = value; | ||||
|                     Ok(value) | ||||
|                 } | ||||
|                 None => Err(()), | ||||
|             } | ||||
|         })?; | ||||
| 
 | ||||
|         Ok(new_bridged_out_amount) | ||||
|     } | ||||
| 
 | ||||
|     fn accumulate_incoming_imbalance(amount: &BalanceOf<T>) -> Result<BalanceOf<T>, ()> { | ||||
|         let new_bridged_in_amount = BridgedImbalance::<T>::mutate(|bridged_imbalance| { | ||||
|             match bridged_imbalance.bridged_in.checked_add(amount) { | ||||
|                 Some(value) => { | ||||
|                     (*bridged_imbalance).bridged_in = value; | ||||
|                     Ok(value) | ||||
|                 } | ||||
|                 None => Err(()), | ||||
|             } | ||||
|         })?; | ||||
| 
 | ||||
|         Ok(new_bridged_in_amount) | ||||
|     } | ||||
| 
 | ||||
|     fn accumulate_commission(commission: &BalanceOf<T>) -> Result<BalanceOf<T>, ()> { | ||||
|         AccumulatedCommission::<T>::mutate(|accumulated| { | ||||
|             match accumulated.checked_add(commission) { | ||||
|                 Some(value) => { | ||||
|                     *accumulated = value; | ||||
|                     Ok(value) | ||||
|                 } | ||||
|                 None => Err(()), | ||||
|             } | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
|     fn nullify_commission() { | ||||
|         AccumulatedCommission::<T>::set(Default::default()); | ||||
|         BridgedImbalance::<T>::set(Default::default()); | ||||
|     } | ||||
| 
 | ||||
|     fn trigger_nullification() { | ||||
|         if NullifyNeeded::<T>::get() { | ||||
|             Self::nullify_commission(); | ||||
|             NullifyNeeded::<T>::put(false); | ||||
|         } else { | ||||
|             NullifyNeeded::<T>::put(true); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,135 +0,0 @@ | ||||
| use crate::AtLeast32BitUnsigned; | ||||
| 
 | ||||
| pub struct MulDiv<Balance>(core::marker::PhantomData<Balance>); | ||||
| impl<Balance> MulDiv<Balance> | ||||
| where | ||||
|     Balance: Copy | ||||
|         + AtLeast32BitUnsigned | ||||
|         + num_traits::ops::wrapping::WrappingAdd | ||||
|         + num_traits::ops::overflowing::OverflowingAdd | ||||
|         + sp_std::ops::AddAssign | ||||
|         + sp_std::ops::Not<Output = Balance> | ||||
|         + sp_std::ops::Shl<Output = Balance> | ||||
|         + sp_std::ops::Shr<Output = Balance> | ||||
|         + sp_std::ops::BitAnd<Balance, Output = Balance>, | ||||
| { | ||||
| 
 | ||||
|     fn zero(&self) -> Balance { | ||||
|         0u32.into() | ||||
|     } | ||||
| 
 | ||||
|     fn one(&self) -> Balance { | ||||
|         1u32.into() | ||||
|     } | ||||
| 
 | ||||
|     fn bit_shift(&self) -> Balance { | ||||
|         let u32_shift: u32 = core::mem::size_of::<Balance>() | ||||
|             .saturating_mul(4) | ||||
|             .try_into() | ||||
|             .unwrap_or_default(); | ||||
|         u32_shift.into() | ||||
|     } | ||||
| 
 | ||||
|     fn least_significant_bits(&self, a: Balance) -> Balance { | ||||
|         a & ((self.one() << self.bit_shift()) - self.one()) | ||||
|     } | ||||
| 
 | ||||
|     fn most_significant_bits(&self, a: Balance) -> Balance { | ||||
|         a >> self.bit_shift() | ||||
|     } | ||||
| 
 | ||||
|     fn two_complement(&self, a: Balance) -> Balance { | ||||
|         (!a).wrapping_add(&self.one()) | ||||
|     } | ||||
| 
 | ||||
|     fn adjusted_ratio(&self, a: Balance) -> Balance { | ||||
|         (self.two_complement(a) / a).wrapping_add(&self.one()) | ||||
|     } | ||||
| 
 | ||||
|     fn modulo(&self, a: Balance) -> Balance { | ||||
|         self.two_complement(a) % a | ||||
|     } | ||||
| 
 | ||||
|     fn overflow_resistant_addition( | ||||
|         &self, | ||||
|         a0: Balance, | ||||
|         a1: Balance, | ||||
|         b0: Balance, | ||||
|         b1: Balance, | ||||
|     ) -> (Balance, Balance) { | ||||
|         let (r0, overflow) = a0.overflowing_add(&b0); | ||||
|         let overflow: Balance = overflow.then(|| 1u32).unwrap_or_default().into(); | ||||
|         let r1 = a1.wrapping_add(&b1).wrapping_add(&overflow); | ||||
|         (r0, r1) | ||||
|     } | ||||
| 
 | ||||
|     fn overflow_resistant_multiplication(&self, a: Balance, b: Balance) -> (Balance, Balance) { | ||||
|         let (a0, a1) = ( | ||||
|             self.least_significant_bits(a), | ||||
|             self.most_significant_bits(a), | ||||
|         ); | ||||
|         let (b0, b1) = ( | ||||
|             self.least_significant_bits(b), | ||||
|             self.most_significant_bits(b), | ||||
|         ); | ||||
|         let (x, y) = (a1 * b0, b1 * a0); | ||||
| 
 | ||||
|         let (r0, r1) = (a0 * b0, a1 * b1); | ||||
|         let (r0, r1) = self.overflow_resistant_addition( | ||||
|             r0, | ||||
|             r1, | ||||
|             self.least_significant_bits(x) << self.bit_shift(), | ||||
|             self.most_significant_bits(x), | ||||
|         ); | ||||
|         let (r0, r1) = self.overflow_resistant_addition( | ||||
|             r0, | ||||
|             r1, | ||||
|             self.least_significant_bits(y) << self.bit_shift(), | ||||
|             self.most_significant_bits(y), | ||||
|         ); | ||||
| 
 | ||||
|         (r0, r1) | ||||
|     } | ||||
| 
 | ||||
|     fn overflow_resistant_division( | ||||
|         &self, | ||||
|         mut a0: Balance, | ||||
|         mut a1: Balance, | ||||
|         b: Balance, | ||||
|     ) -> (Balance, Balance) { | ||||
|         if b == self.one() { | ||||
|             return (a0, a1); | ||||
|         } | ||||
| 
 | ||||
|         let zero: Balance = 0u32.into(); | ||||
|         let (q, r) = (self.adjusted_ratio(b), self.modulo(b)); | ||||
|         let (mut x0, mut x1) = (zero, zero); | ||||
| 
 | ||||
|         while a1 != zero { | ||||
|             let (t0, t1) = self.overflow_resistant_multiplication(a1, q); | ||||
|             let (new_x0, new_x1) = self.overflow_resistant_addition(x0, x1, t0, t1); | ||||
|             x0 = new_x0; | ||||
|             x1 = new_x1; | ||||
| 
 | ||||
|             let (t0, t1) = self.overflow_resistant_multiplication(a1, r); | ||||
|             let (new_a0, new_a1) = self.overflow_resistant_addition(t0, t1, a0, zero); | ||||
|             a0 = new_a0; | ||||
|             a1 = new_a1; | ||||
|         } | ||||
| 
 | ||||
|         self.overflow_resistant_addition(x0, x1, a0 / b, zero) | ||||
|     } | ||||
| 
 | ||||
|     fn mul_div(&self, a: Balance, b: Balance, c: Balance) -> Balance { | ||||
|         let (t0, t1) = self.overflow_resistant_multiplication(a, b); | ||||
|         self.overflow_resistant_division(t0, t1, c).0 | ||||
|     } | ||||
| 
 | ||||
|     pub fn calculate(a: Balance, b: Balance, c: Balance) -> Balance { | ||||
|         let inner = MulDiv(core::marker::PhantomData); | ||||
|         if c == inner.zero() { | ||||
|             return c; | ||||
|         } | ||||
|         inner.mul_div(a, b, c) | ||||
|     } | ||||
| } | ||||
							
								
								
									
										43
									
								
								pallets/networks/src/mock.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										43
									
								
								pallets/networks/src/mock.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -1,24 +1,19 @@ | ||||
| use crate::{self as ghost_networks}; | ||||
| use frame_support::{ | ||||
|     construct_runtime, ord_parameter_types, parameter_types, | ||||
|     traits::{ConstU128, ConstU32, Everything}, | ||||
| }; | ||||
| use crate as ghost_networks; | ||||
| use frame_system::EnsureSignedBy; | ||||
| use frame_support::{ | ||||
|     construct_runtime, ord_parameter_types, parameter_types, traits::{ConstU128, ConstU32, Everything} | ||||
| }; | ||||
| pub use primitives::{ | ||||
|     AccountId, Balance, BlockNumber, FreezeIdentifier, Hash, Nonce, ReserveIdentifier, | ||||
|     AccountId, Balance, Nonce, BlockNumber, Hash, | ||||
|     ReserveIdentifier, FreezeIdentifier, | ||||
| }; | ||||
| use sp_runtime::{ | ||||
|     curve::PiecewiseLinear, | ||||
|     traits::{AccountIdLookup, BlakeTwo256}, | ||||
|     traits::{BlakeTwo256, AccountIdLookup}, | ||||
|     BuildStorage, | ||||
| }; | ||||
| 
 | ||||
| parameter_types! { | ||||
|     pub const BlockHashCount: BlockNumber = 250; | ||||
|     pub static SlashDeferDuration: u32 = 0; | ||||
|     pub static Period: BlockNumber = 5; | ||||
|     pub static Offset: BlockNumber = 0; | ||||
|     pub static MaxControllersInDeprecationBatch: u32 = 5_000; | ||||
| } | ||||
| 
 | ||||
| impl frame_system::Config for Test { | ||||
| @ -69,21 +64,6 @@ impl pallet_balances::Config for Test { | ||||
|     type MaxFreezes = ConstU32<50>; | ||||
| } | ||||
| 
 | ||||
| pallet_staking_reward_curve::build! { | ||||
|     const REWARD_CURVE: PiecewiseLinear<'static> = curve!( | ||||
|         min_inflation: 0_006_900, | ||||
|         max_inflation: 1_000_000, | ||||
|         ideal_stake: 0_690_000, | ||||
|         falloff: 0_050_000, | ||||
|         max_piece_count: 100, | ||||
|         test_precision: 0_005_000, | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
| parameter_types! { | ||||
|     pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; | ||||
| } | ||||
| 
 | ||||
| ord_parameter_types! { | ||||
|     pub const RegistererAccount: AccountId = AccountId::from([1u8; 32]); | ||||
|     pub const UpdaterAccount: AccountId = AccountId::from([2u8; 32]); | ||||
| @ -93,15 +73,14 @@ ord_parameter_types! { | ||||
| 
 | ||||
| impl ghost_networks::Config for Test { | ||||
|     type RuntimeEvent = RuntimeEvent; | ||||
|     type Currency = Balances; | ||||
|     type NetworkId = u32; | ||||
|     type RegisterOrigin = EnsureSignedBy<RegistererAccount, AccountId>; | ||||
|     type UpdateOrigin = EnsureSignedBy<UpdaterAccount, AccountId>; | ||||
|     type RemoveOrigin = EnsureSignedBy<RemoverAccount, AccountId>; | ||||
|     type RegisterOrigin = EnsureSignedBy::<RegistererAccount, AccountId>; | ||||
|     type UpdateOrigin = EnsureSignedBy::<UpdaterAccount, AccountId>; | ||||
|     type RemoveOrigin = EnsureSignedBy::<RemoverAccount, AccountId>; | ||||
|     type WeightInfo = crate::weights::SubstrateWeight<Test>; | ||||
| } | ||||
| 
 | ||||
| type Block = frame_system::mocking::MockBlock<Test>; | ||||
| type Block = frame_system::mocking::MockBlockU32<Test>; | ||||
| 
 | ||||
| construct_runtime!( | ||||
|     pub enum Test { | ||||
|  | ||||
							
								
								
									
										2260
									
								
								pallets/networks/src/tests.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										2260
									
								
								pallets/networks/src/tests.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										399
									
								
								pallets/networks/src/weights.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										399
									
								
								pallets/networks/src/weights.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -7,7 +7,7 @@ | ||||
| 
 | ||||
| // Ghost Network 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
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| // GNU General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| @ -15,14 +15,14 @@ | ||||
| 
 | ||||
| //! Autogenerated weights for `ghost_networks`
 | ||||
| //!
 | ||||
| //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
 | ||||
| //! DATE: 2025-06-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 | ||||
| //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
 | ||||
| //! DATE: 2023-11-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 | ||||
| //! WORST CASE MAP SIZE: `1000000`
 | ||||
| //! HOSTNAME: `ghostown`, CPU: `Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz`
 | ||||
| //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("casper-dev")`, DB CACHE: 1024
 | ||||
| //! HOSTNAME: `ghost`, CPU: `Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz`
 | ||||
| //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("casper-dev"), DB CACHE: 1024
 | ||||
| 
 | ||||
| // Executed Command:
 | ||||
| // ./target/release/ghost
 | ||||
| // ./target/production/ghost
 | ||||
| // benchmark
 | ||||
| // pallet
 | ||||
| // --chain=casper-dev
 | ||||
| @ -30,8 +30,8 @@ | ||||
| // --repeat=20
 | ||||
| // --pallet=ghost_networks
 | ||||
| // --extrinsic=*
 | ||||
| // --execution=wasm
 | ||||
| // --wasm-execution=compiled
 | ||||
| // --heap-pages=4096
 | ||||
| // --header=./file_header.txt
 | ||||
| // --output=./runtime/casper/src/weights/ghost_networks.rs
 | ||||
| 
 | ||||
| @ -49,12 +49,11 @@ use sp_std::marker::PhantomData; | ||||
| 
 | ||||
| /// Weight functions needed for ghost_networks
 | ||||
| pub trait WeightInfo { | ||||
| 	fn register_network(i: u32, j: u32, k: u32, ) -> Weight; | ||||
| 	fn register_network(n: u32, m: u32, ) -> Weight; | ||||
| 	fn update_network_name(n: u32, ) -> Weight; | ||||
| 	fn update_network_endpoint(n: u32, ) -> Weight; | ||||
| 	fn update_network_finality_delay() -> Weight; | ||||
|     fn update_network_rate_limit_delay() -> Weight; | ||||
| 	fn update_network_block_distance() -> Weight; | ||||
| 	fn update_network_release_delay() -> Weight; | ||||
| 	fn update_network_type() -> Weight; | ||||
| 	fn update_network_gatekeeper() -> Weight; | ||||
| 	fn update_network_topic_name() -> Weight; | ||||
| @ -66,316 +65,260 @@ pub trait WeightInfo { | ||||
| /// Weight for ghost_networks using the Substrate node and recommended hardware.
 | ||||
| pub struct SubstrateWeight<T>(PhantomData<T>); | ||||
| impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> { | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// The range of component `i` is `[1, 20]`.
 | ||||
| 	/// The range of component `j` is `[1, 150]`.
 | ||||
| 	/// The range of component `k` is `[1, 20]`.
 | ||||
| 	fn register_network(_i: u32, _j: u32, k: u32, ) -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `109`
 | ||||
| 		//  Estimated: `3574`
 | ||||
| 		// Minimum execution time: 46_023_000 picoseconds.
 | ||||
| 		Weight::from_parts(97_871_287, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3574)) | ||||
| 			// Standard Error: 94_524
 | ||||
| 			.saturating_add(Weight::from_parts(940_486, 0).saturating_mul(k.into())) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	/// The range of component `n` is `[1, 20]`.
 | ||||
| 	fn update_network_name(n: u32, ) -> Weight { | ||||
| 	/// The range of component `m` is `[1, 150]`.
 | ||||
| 	fn register_network(_n: u32, _m: u32, ) -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 49_906_000 picoseconds.
 | ||||
| 		Weight::from_parts(55_537_587, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 			// Standard Error: 87_704
 | ||||
| 			.saturating_add(Weight::from_parts(92_366, 0).saturating_mul(n.into())) | ||||
| 		//  Measured:  `76`
 | ||||
| 		//  Estimated: `2551`
 | ||||
| 		// Minimum execution time: 32_086 nanoseconds.
 | ||||
| 		Weight::from_parts(33_092_855, 2551) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	/// The range of component `n` is `[1, 20]`.
 | ||||
| 	fn update_network_name(_n: u32, ) -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 34_496 nanoseconds.
 | ||||
| 		Weight::from_parts(35_728_230, 2616) | ||||
| 			// Standard Error: 2_591
 | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	/// The range of component `n` is `[1, 150]`.
 | ||||
| 	fn update_network_endpoint(n: u32, ) -> Weight { | ||||
| 	fn update_network_endpoint(_n: u32, ) -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 50_556_000 picoseconds.
 | ||||
| 		Weight::from_parts(57_726_674, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 			// Standard Error: 12_261
 | ||||
| 			.saturating_add(Weight::from_parts(274, 0).saturating_mul(n.into())) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 34_666 nanoseconds.
 | ||||
| 		Weight::from_parts(35_959_961, 2616) | ||||
| 			// Standard Error: 381
 | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	fn update_network_finality_delay() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 49_406_000 picoseconds.
 | ||||
| 		Weight::from_parts(51_256_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 33_860 nanoseconds.
 | ||||
| 		Weight::from_parts(34_995_000, 2616) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	fn update_network_rate_limit_delay() -> Weight { | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	fn update_network_release_delay() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 49_572_000 picoseconds.
 | ||||
| 		Weight::from_parts(52_584_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 33_860 nanoseconds.
 | ||||
| 		Weight::from_parts(34_995_000, 2616) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	fn update_network_block_distance() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 48_880_000 picoseconds.
 | ||||
| 		Weight::from_parts(50_596_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	fn update_network_type() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 48_282_000 picoseconds.
 | ||||
| 		Weight::from_parts(49_137_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 34_976 nanoseconds.
 | ||||
| 		Weight::from_parts(36_182_000, 2616) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	fn update_network_gatekeeper() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 50_853_000 picoseconds.
 | ||||
| 		Weight::from_parts(51_982_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 34_768 nanoseconds.
 | ||||
| 		Weight::from_parts(35_580_000, 2616) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	fn update_network_topic_name() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 50_343_000 picoseconds.
 | ||||
| 		Weight::from_parts(52_380_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 34_768 nanoseconds.
 | ||||
| 		Weight::from_parts(35_580_000, 2616) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
|     } | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	fn update_incoming_network_fee() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 49_393_000 picoseconds.
 | ||||
| 		Weight::from_parts(80_966_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 34_768 nanoseconds.
 | ||||
| 		Weight::from_parts(35_580_000, 2616) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
|     } | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	fn update_outgoing_network_fee() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 49_579_000 picoseconds.
 | ||||
| 		Weight::from_parts(51_126_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 34_768 nanoseconds.
 | ||||
| 		Weight::from_parts(35_580_000, 2616) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
|     } | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	fn remove_network() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 44_634_000 picoseconds.
 | ||||
| 		Weight::from_parts(45_815_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 33_336 nanoseconds.
 | ||||
| 		Weight::from_parts(34_609_000, 2616) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| impl WeightInfo for () { | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// The range of component `i` is `[1, 20]`.
 | ||||
| 	/// The range of component `j` is `[1, 150]`.
 | ||||
| 	/// The range of component `k` is `[1, 20]`.
 | ||||
| 	fn register_network(_i: u32, _j: u32, k: u32, ) -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `109`
 | ||||
| 		//  Estimated: `3574`
 | ||||
| 		// Minimum execution time: 46_023_000 picoseconds.
 | ||||
| 		Weight::from_parts(97_871_287, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3574)) | ||||
| 			// Standard Error: 94_524
 | ||||
| 			.saturating_add(Weight::from_parts(940_486, 0).saturating_mul(k.into())) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	/// The range of component `n` is `[1, 20]`.
 | ||||
| 	fn update_network_name(n: u32, ) -> Weight { | ||||
| 	/// The range of component `m` is `[1, 150]`.
 | ||||
| 	fn register_network(_n: u32, _m: u32, ) -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 49_906_000 picoseconds.
 | ||||
| 		Weight::from_parts(55_537_587, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 			// Standard Error: 87_704
 | ||||
| 			.saturating_add(Weight::from_parts(92_366, 0).saturating_mul(n.into())) | ||||
| 		//  Measured:  `76`
 | ||||
| 		//  Estimated: `2551`
 | ||||
| 		// Minimum execution time: 32_086 nanoseconds.
 | ||||
| 		Weight::from_parts(33_092_855, 2551) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	/// The range of component `n` is `[1, 20]`.
 | ||||
| 	fn update_network_name(_n: u32, ) -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 34_496 nanoseconds.
 | ||||
| 		Weight::from_parts(35_728_230, 2616) | ||||
| 			// Standard Error: 2_591
 | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	/// The range of component `n` is `[1, 150]`.
 | ||||
| 	fn update_network_endpoint(n: u32, ) -> Weight { | ||||
| 	fn update_network_endpoint(_n: u32, ) -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 50_556_000 picoseconds.
 | ||||
| 		Weight::from_parts(57_726_674, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 			// Standard Error: 12_261
 | ||||
| 			.saturating_add(Weight::from_parts(274, 0).saturating_mul(n.into())) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 34_666 nanoseconds.
 | ||||
| 		Weight::from_parts(35_959_961, 2616) | ||||
| 			// Standard Error: 381
 | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	fn update_network_finality_delay() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 49_406_000 picoseconds.
 | ||||
| 		Weight::from_parts(51_256_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 33_860 nanoseconds.
 | ||||
| 		Weight::from_parts(34_995_000, 2616) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	fn update_network_rate_limit_delay() -> Weight { | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	fn update_network_release_delay() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 49_572_000 picoseconds.
 | ||||
| 		Weight::from_parts(52_584_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 33_860 nanoseconds.
 | ||||
| 		Weight::from_parts(34_995_000, 2616) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	fn update_network_block_distance() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 48_880_000 picoseconds.
 | ||||
| 		Weight::from_parts(50_596_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	fn update_network_type() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 48_282_000 picoseconds.
 | ||||
| 		Weight::from_parts(49_137_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 34_976 nanoseconds.
 | ||||
| 		Weight::from_parts(36_182_000, 2616) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	fn update_network_gatekeeper() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 50_853_000 picoseconds.
 | ||||
| 		Weight::from_parts(51_982_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 34_768 nanoseconds.
 | ||||
| 		Weight::from_parts(35_580_000, 2616) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	fn update_network_topic_name() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 50_343_000 picoseconds.
 | ||||
| 		Weight::from_parts(52_380_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 34_768 nanoseconds.
 | ||||
| 		Weight::from_parts(35_580_000, 2616) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
|     } | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	fn update_incoming_network_fee() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 49_393_000 picoseconds.
 | ||||
| 		Weight::from_parts(80_966_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 34_768 nanoseconds.
 | ||||
| 		Weight::from_parts(35_580_000, 2616) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
|     } | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	fn update_outgoing_network_fee() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 49_579_000 picoseconds.
 | ||||
| 		Weight::from_parts(51_126_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 34_768 nanoseconds.
 | ||||
| 		Weight::from_parts(35_580_000, 2616) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
|     } | ||||
| 	/// Storage: GhostNetworks Networks (r:1 w:1)
 | ||||
| 	/// Proof Skipped: GhostNetworks Networks (max_values: None, max_size: None, mode: Measured)
 | ||||
| 	fn remove_network() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 44_634_000 picoseconds.
 | ||||
| 		Weight::from_parts(45_815_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `141`
 | ||||
| 		//  Estimated: `2616`
 | ||||
| 		// Minimum execution time: 33_336 nanoseconds.
 | ||||
| 		Weight::from_parts(34_609_000, 2616) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(1)) | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										9
									
								
								pallets/slow-clap/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										9
									
								
								pallets/slow-clap/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -1,6 +1,6 @@ | ||||
| [package] | ||||
| name = "ghost-slow-clap" | ||||
| version = "0.3.40" | ||||
| version = "0.3.14" | ||||
| description = "Applause protocol for the EVM bridge" | ||||
| license.workspace = true | ||||
| authors.workspace = true | ||||
| @ -27,13 +27,11 @@ sp-staking = { workspace = true } | ||||
| sp-io = { workspace = true } | ||||
| sp-std = { workspace = true } | ||||
| 
 | ||||
| pallet-balances = { workspace = true } | ||||
| ghost-networks = { workspace = true } | ||||
| 
 | ||||
| [dev-dependencies] | ||||
| pallet-balances = { workspace = true } | ||||
| pallet-session = { workspace = true } | ||||
| pallet-staking = { workspace = true } | ||||
| pallet-staking-reward-curve = { workspace = true } | ||||
| pallet-session = { workspace = true, default-features = true } | ||||
| 
 | ||||
| [features] | ||||
| default = ["std"] | ||||
| @ -51,7 +49,6 @@ std = [ | ||||
|     "sp-io/std", | ||||
|     "sp-std/std", | ||||
|     "pallet-session/std", | ||||
|     "pallet-staking/std", | ||||
|     "pallet-balances/std", | ||||
|     "ghost-networks/std", | ||||
| ] | ||||
|  | ||||
| @ -3,8 +3,13 @@ | ||||
| use super::*; | ||||
| use frame_benchmarking::v1::*; | ||||
| 
 | ||||
| use frame_support::traits::fungible::Inspect; | ||||
| use frame_system::RawOrigin; | ||||
| use frame_support::traits::fungible::{Inspect, Mutate}; | ||||
| 
 | ||||
| use crate::Pallet as SlowClap; | ||||
| 
 | ||||
| const MAX_CLAPS: u32 = 100; | ||||
| const MAX_COMPANIONS: u32 = 20; | ||||
| 
 | ||||
| pub fn create_account<T: Config>() -> T::AccountId { | ||||
|     let account_bytes = Vec::from([1u8; 32]); | ||||
| @ -12,89 +17,184 @@ pub fn create_account<T: Config>() -> T::AccountId { | ||||
|         .expect("32 bytes always construct an AccountId32") | ||||
| } | ||||
| 
 | ||||
| benchmarks! { | ||||
|     slow_clap { | ||||
| pub fn create_companions<T: Config>( | ||||
|     total: usize, | ||||
|     network_id: NetworkIdOf<T>, | ||||
|     user_account: T::AccountId, | ||||
|     fee: H256, | ||||
|     receiver: H160, | ||||
| ) -> Result<CompanionId, &'static str> { | ||||
|     T::NetworkDataHandler::register(network_id.into(), NetworkData { | ||||
|         chain_name: "Ethereum".into(), | ||||
|         default_endpoint:  | ||||
|             "https://base-mainnet.core.chainstack.com/2fc1de7f08c0465f6a28e3c355e0cb14/".into(), | ||||
|             finality_delay: Some(0), | ||||
|             release_delay: Some(0), | ||||
|             network_type: Default::default(), | ||||
|             gatekeeper: b"0x1234567891234567891234567891234567891234".to_vec(), | ||||
|             topic_name: b"0x12345678912345678912345678912345678912345678912345678912345678".to_vec(), | ||||
|             incoming_fee: 0, | ||||
|             outgoing_fee: 0, | ||||
|     }).map_err(|_| BenchmarkError::Weightless)?; | ||||
| 
 | ||||
|     let mut last_companion_id = 0; | ||||
|     for _ in 0..total { | ||||
|         let minimum_balance = <<T as pallet::Config>::Currency>::minimum_balance(); | ||||
|         let receiver = create_account::<T>(); | ||||
|         let amount = minimum_balance + minimum_balance; | ||||
|         let network_id = NetworkIdOf::<T>::default(); | ||||
|         let session_index = T::ValidatorSet::session_index(); | ||||
| 
 | ||||
|         let authorities = vec![T::AuthorityId::generate_pair(None)]; | ||||
|         let bounded_authorities = WeakBoundedVec::<_, T::MaxAuthorities>::try_from(authorities.clone()) | ||||
|             .map_err(|()| "more than the maximum number of keys provided")?; | ||||
|         Authorities::<T>::set(&session_index, bounded_authorities); | ||||
| 
 | ||||
|         let clap = Clap { | ||||
|             session_index: 0, | ||||
|             authority_index: 0, | ||||
|             transaction_hash: H256::repeat_byte(1u8), | ||||
|             block_number: 69, | ||||
|             removed: false, | ||||
|             network_id, | ||||
|             receiver: receiver.clone(), | ||||
|             amount, | ||||
|         let balance = minimum_balance + minimum_balance; | ||||
|         let companion = Companion::<NetworkIdOf::<T>, BalanceOf::<T>> { 
 | ||||
|             network_id: network_id.into(), receiver, 
 | ||||
|             fee, amount: balance, | ||||
|         }; | ||||
| 
 | ||||
|         let authority_id = authorities | ||||
|             .get(0usize) | ||||
|             .expect("first authority should exist"); | ||||
|         let encoded_clap = clap.encode(); | ||||
|         let signature = authority_id.sign(&encoded_clap) | ||||
|             .ok_or("couldn't make signature")?; | ||||
|         let _ = <<T as pallet::Config>::Currency>::mint_into(&user_account, balance); | ||||
|         let companion_id = SlowClap::<T>::current_companion_id(); | ||||
|         let _ = SlowClap::<T>::propose_companion( | ||||
|             RawOrigin::Signed(user_account.clone()).into(), 
 | ||||
|             network_id, 
 | ||||
|             companion, | ||||
|         )?; | ||||
|         last_companion_id = companion_id; | ||||
|     } | ||||
|     Ok(last_companion_id) | ||||
| } | ||||
| 
 | ||||
|     }: _(RawOrigin::None, clap, signature) | ||||
|     verify { | ||||
|         assert_eq!(<<T as pallet::Config>::Currency>::total_balance(&receiver), amount); | ||||
| pub fn create_claps<T: Config>(i: u32, j: u32) -> Result< | ||||
|     ( | ||||
|         Vec<crate::Clap<T::AccountId, NetworkIdOf<T>, BalanceOf<T>>>, | ||||
|         <T::AuthorityId as RuntimeAppPublic>::Signature, | ||||
|     ), 
 | ||||
|     &'static str, | ||||
| > { | ||||
|     let minimum_balance = <<T as pallet::Config>::Currency>::minimum_balance(); | ||||
|     let amount = minimum_balance + minimum_balance; | ||||
|     let total_amount = amount.saturating_mul(j.into()); | ||||
|     let network_id = NetworkIdOf::<T>::default(); | ||||
| 
 | ||||
|     let mut claps = Vec::new(); | ||||
|     let mut companions = BTreeMap::new(); | ||||
| 
 | ||||
|     let authorities = vec![T::AuthorityId::generate_pair(None)]; | ||||
|     let bounded_authorities = 
 | ||||
|         WeakBoundedVec::<_, T::MaxAuthorities>::try_from(authorities.clone()) | ||||
|             .map_err(|()| "more than the maximum number of keys provided")?; | ||||
|     Authorities::<T>::put(bounded_authorities); | ||||
| 
 | ||||
|     for index in 0..j { 
 | ||||
|         companions.insert( | ||||
|             index.into(), 
 | ||||
|             amount, | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     self_applause { | ||||
|         let session_index = T::ValidatorSet::session_index(); | ||||
|         let authorities = vec![T::AuthorityId::generate_pair(None)]; | ||||
|         let bounded_authorities = WeakBoundedVec::<_, T::MaxAuthorities>::try_from(authorities.clone()) | ||||
|             .map_err(|()| "more than the maximum number of keys provided")?; | ||||
|         Authorities::<T>::set(&session_index, bounded_authorities); | ||||
| 
 | ||||
|         let minimum_balance = <<T as pallet::Config>::Currency>::minimum_balance(); | ||||
|         let receiver = create_account::<T>(); | ||||
|         let receiver_clone = receiver.clone(); | ||||
|         let amount = minimum_balance + minimum_balance; | ||||
|         let network_id = NetworkIdOf::<T>::default(); | ||||
|         let transaction_hash = H256::repeat_byte(1u8); | ||||
| 
 | ||||
|         let unique_transaction_hash = <Pallet<T>>::generate_unique_hash( | ||||
|             &receiver, | ||||
|             &amount, | ||||
|             &network_id, | ||||
|         ); | ||||
|         let storage_key = (session_index, &transaction_hash, &unique_transaction_hash); | ||||
| 
 | ||||
|         <Pallet::<T>>::trigger_nullification_for_benchmark(); | ||||
|         let clap = Clap { | ||||
|             session_index, | ||||
|     for _ in 0..i { | ||||
|         claps.push(Clap { | ||||
|             session_index: 1, | ||||
|             authority_index: 0, | ||||
|             transaction_hash, | ||||
|             block_number: 69, | ||||
|             removed: false, | ||||
|             network_id, | ||||
|             receiver: receiver.clone(), | ||||
|             amount, | ||||
|         }; | ||||
|             transaction_hash: H256::repeat_byte(1u8), | ||||
|             block_number: 69, | ||||
|             removed: true, | ||||
|             receiver: create_account::<T>(), | ||||
|             amount: total_amount, | ||||
|             companions: companions.clone(), | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|         let authority_id = authorities | ||||
|             .get(0usize) | ||||
|             .expect("first authority should exist"); | ||||
|         let encoded_clap = clap.encode(); | ||||
|         let signature = authority_id.sign(&encoded_clap).unwrap(); | ||||
|         <Pallet<T>>::slow_clap(RawOrigin::None.into(), clap, signature)?; | ||||
|         <Pallet::<T>>::trigger_nullification_for_benchmark(); | ||||
|     let authority_id = authorities | ||||
|         .get(0usize) | ||||
|         .expect("first authority should exist"); | ||||
|     let encoded_claps = claps.encode(); | ||||
|     let signature = authority_id.sign(&encoded_claps) | ||||
|         .ok_or("couldn't make signature")?; | ||||
| 
 | ||||
|         assert_eq!(<<T as pallet::Config>::Currency>::total_balance(&receiver), Default::default()); | ||||
|         assert_eq!(ApplausesForTransaction::<T>::get(&storage_key), false); | ||||
|     }: _(RawOrigin::Signed(receiver_clone), network_id, session_index, transaction_hash, receiver_clone.clone(), amount) | ||||
|     Ok((claps, signature)) | ||||
| } | ||||
| 
 | ||||
| benchmarks! { | ||||
|     slow_clap { | ||||
|         let k in 1 .. MAX_CLAPS; | ||||
|         let j in 1 .. MAX_COMPANIONS; | ||||
| 
 | ||||
|         let receiver = H160::repeat_byte(69u8); | ||||
|         let fee = H256::repeat_byte(0u8); | ||||
|         let user_account: T::AccountId = whitelisted_caller(); | ||||
|         let network_id = <<T as pallet::Config>::NetworkDataHandler as NetworkDataBasicHandler>::NetworkId::default(); | ||||
|         
 | ||||
|         let (claps, signature) = create_claps::<T>(k, j)?; | ||||
|         let _ = create_companions::<T>(j as usize, network_id, user_account, fee, receiver)?; | ||||
|     }: _(RawOrigin::None, claps, signature) | ||||
|     verify { | ||||
|         assert_eq!(<<T as pallet::Config>::Currency>::total_balance(&receiver), amount); | ||||
|         assert_eq!(ApplausesForTransaction::<T>::get(&storage_key), true); | ||||
|         let minimum_balance = <<T as pallet::Config>::Currency>::minimum_balance(); | ||||
|         let total_amount = (minimum_balance + minimum_balance).saturating_mul(j.into()); | ||||
|     } | ||||
| 
 | ||||
|     propose_companion { | ||||
|         let receiver = H160::repeat_byte(69u8); | ||||
|         let fee = H256::repeat_byte(0u8); | ||||
|         let user_account: T::AccountId = whitelisted_caller(); | ||||
|         let network_id = <<T as pallet::Config>::NetworkDataHandler as NetworkDataBasicHandler>::NetworkId::default(); | ||||
|         // T::NetworkDataHandler::register(network_id.into(), NetworkData {
 | ||||
|         //     chain_name: "Ethereum".into(),
 | ||||
|         //     // https://nd-422-757-666.p2pify.com/0a9d79d93fb2f4a4b1e04695da2b77a7/
 | ||||
|         //     default_endpoint: 
 | ||||
|         //         "https://base-mainnet.core.chainstack.com/2fc1de7f08c0465f6a28e3c355e0cb14/".into(),
 | ||||
|         //     finality_delay: Some(50),
 | ||||
|         //     release_delay: Some(100),
 | ||||
|         //     network_type: Default::default(),
 | ||||
|         //     gatekeeper: b"0x1234567891234567891234567891234567891234".to_vec(),
 | ||||
|         //     topic_name: b"0x12345678912345678912345678912345678912345678912345678912345678".to_vec(),
 | ||||
|         //     incoming_fee: 0,
 | ||||
|         //     outgoing_fee: 0,
 | ||||
|         // }).map_err(|_| BenchmarkError::Weightless)?;
 | ||||
|         let companion_id = create_companions::<T>(1, network_id, user_account.clone(), fee, receiver)?; | ||||
|         let companion_id = SlowClap::<T>::current_companion_id(); | ||||
|         let minimum_balance = <<T as pallet::Config>::Currency>::minimum_balance(); | ||||
|         let balance = minimum_balance + minimum_balance; | ||||
|         let companion = Companion::<NetworkIdOf::<T>, BalanceOf::<T>> { 
 | ||||
|             network_id: network_id.into(), receiver, 
 | ||||
|             fee, amount: balance, | ||||
|         }; | ||||
|         let _ = <<T as pallet::Config>::Currency>::mint_into(&user_account, balance); | ||||
|         assert_eq!(SlowClap::<T>::current_companion_id(), companion_id); | ||||
|     }: _(RawOrigin::Signed(user_account), network_id.into(), companion) | ||||
|     verify { | ||||
|         assert_eq!(SlowClap::<T>::current_companion_id(), companion_id + 1); | ||||
|     } | ||||
| 
 | ||||
|     release_companion { | ||||
|         let receiver = H160::repeat_byte(69u8); | ||||
|         let fee = H256::repeat_byte(0u8); | ||||
|         let user_account: T::AccountId = whitelisted_caller(); | ||||
|         let network_id = <<T as pallet::Config>::NetworkDataHandler as NetworkDataBasicHandler>::NetworkId::default(); | ||||
|         let companion_id = create_companions::<T>(1, network_id, user_account.clone(), fee, receiver)?; | ||||
|         assert_eq!(SlowClap::<T>::release_blocks(companion_id), BlockNumberFor::<T>::default()); | ||||
|     }: _(RawOrigin::Signed(user_account), network_id.into(), companion_id) | ||||
|     verify { | ||||
|         assert_ne!(SlowClap::<T>::release_blocks(companion_id), BlockNumberFor::<T>::default()); | ||||
|     } | ||||
| 
 | ||||
|     kill_companion { | ||||
|         let receiver = H160::repeat_byte(69u8); | ||||
|         let fee = H256::repeat_byte(0u8); | ||||
|         let user_account: T::AccountId = whitelisted_caller(); | ||||
|         let network_id = <<T as pallet::Config>::NetworkDataHandler as NetworkDataBasicHandler>::NetworkId::default(); | ||||
|         let companion_id = create_companions::<T>(1, network_id, user_account.clone(), fee, receiver)?; | ||||
|         SlowClap::<T>::release_companion( | ||||
|             RawOrigin::Signed(user_account.clone()).into(), 
 | ||||
|             network_id, 
 | ||||
|             companion_id, | ||||
|         )?; | ||||
|         let block_shift = | ||||
|             <<T as pallet::Config>::NetworkDataHandler as NetworkDataInspectHandler<NetworkData>>::get(&network_id) | ||||
|             .unwrap() | ||||
|             .release_delay | ||||
|             .unwrap(); | ||||
|         frame_system::Pallet::<T>::set_block_number((block_shift + 1).saturated_into()); | ||||
|     }: _(RawOrigin::Signed(user_account), network_id.into(), companion_id) | ||||
|     verify { | ||||
|         assert_eq!(SlowClap::<T>::companions(network_id, companion_id), None); | ||||
|         assert_eq!(SlowClap::<T>::companion_details(companion_id), None); | ||||
|         assert_eq!(SlowClap::<T>::current_companion_id(), companion_id + 1); | ||||
|     } | ||||
| 
 | ||||
|     impl_benchmark_test_suite!( | ||||
|  | ||||
| @ -1,57 +0,0 @@ | ||||
| use crate::{Deserialize, Deserializer, Vec, H256}; | ||||
| 
 | ||||
| pub fn de_string_to_bytes<'de, D>(de: D) -> Result<Option<Vec<u8>>, D::Error> | ||||
| where | ||||
|     D: Deserializer<'de>, | ||||
| { | ||||
|     let s: &str = Deserialize::deserialize(de)?; | ||||
|     Ok(Some(s.as_bytes().to_vec())) | ||||
| } | ||||
| 
 | ||||
| pub fn de_string_to_u64<'de, D>(de: D) -> Result<Option<u64>, D::Error> | ||||
| where | ||||
|     D: Deserializer<'de>, | ||||
| { | ||||
|     let s: &str = Deserialize::deserialize(de)?; | ||||
|     let s = if s.starts_with("0x") { &s[2..] } else { &s }; | ||||
|     Ok(u64::from_str_radix(s, 16).ok()) | ||||
| } | ||||
| 
 | ||||
| pub fn de_string_to_u64_pure<'de, D>(de: D) -> Result<u64, D::Error> | ||||
| where | ||||
|     D: Deserializer<'de>, | ||||
| { | ||||
|     let s: &str = Deserialize::deserialize(de)?; | ||||
|     let s = if s.starts_with("0x") { &s[2..] } else { &s }; | ||||
|     Ok(u64::from_str_radix(s, 16).unwrap_or_default()) | ||||
| } | ||||
| 
 | ||||
| pub fn de_string_to_h256<'de, D>(de: D) -> Result<Option<H256>, D::Error> | ||||
| where | ||||
|     D: Deserializer<'de>, | ||||
| { | ||||
|     let s: &str = Deserialize::deserialize(de)?; | ||||
|     let start_index = if s.starts_with("0x") { 2 } else { 0 }; | ||||
|     let h256: Vec<_> = (start_index..s.len()) | ||||
|         .step_by(2) | ||||
|         .map(|i| u8::from_str_radix(&s[i..i + 2], 16).expect("valid u8 symbol; qed")) | ||||
|         .collect(); | ||||
|     Ok(Some(H256::from_slice(&h256))) | ||||
| } | ||||
| 
 | ||||
| pub fn de_string_to_vec_of_bytes<'de, D>(de: D) -> Result<Vec<Vec<u8>>, D::Error> | ||||
| where | ||||
|     D: Deserializer<'de>, | ||||
| { | ||||
|     let strings: Vec<&str> = Deserialize::deserialize(de)?; | ||||
|     Ok(strings | ||||
|         .iter() | ||||
|         .map(|s| { | ||||
|             let start_index = if s.starts_with("0x") { 2 } else { 0 }; | ||||
|             (start_index..s.len()) | ||||
|                 .step_by(2) | ||||
|                 .map(|i| u8::from_str_radix(&s[i..i + 2], 16).expect("valid u8 symbol; qed")) | ||||
|                 .collect::<Vec<u8>>() | ||||
|         }) | ||||
|         .collect::<Vec<Vec<u8>>>()) | ||||
| } | ||||
| @ -1,49 +0,0 @@ | ||||
| use crate::{ | ||||
|     deserialisations::{ | ||||
|         de_string_to_bytes, de_string_to_h256, de_string_to_u64, de_string_to_u64_pure, | ||||
|         de_string_to_vec_of_bytes, | ||||
|     }, | ||||
|     Decode, Deserialize, Encode, RuntimeDebug, Vec, H256, | ||||
| }; | ||||
| 
 | ||||
| const NUMBER_OF_TOPICS: usize = 3; | ||||
| 
 | ||||
| #[derive(RuntimeDebug, Clone, PartialEq, Deserialize, Encode, Decode)] | ||||
| pub struct EvmResponse { | ||||
|     #[serde(default)] | ||||
|     id: Option<u32>, | ||||
|     #[serde(default, deserialize_with = "de_string_to_bytes")] | ||||
|     jsonrpc: Option<Vec<u8>>, | ||||
|     #[serde(default, deserialize_with = "de_string_to_bytes")] | ||||
|     pub error: Option<Vec<u8>>, | ||||
|     #[serde(default)] | ||||
|     pub result: Option<EvmResponseType>, | ||||
| } | ||||
| 
 | ||||
| #[derive(RuntimeDebug, Clone, PartialEq, Deserialize, Encode, Decode)] | ||||
| #[serde(untagged)] | ||||
| pub enum EvmResponseType { | ||||
|     #[serde(deserialize_with = "de_string_to_u64_pure")] | ||||
|     BlockNumber(u64), | ||||
|     TransactionLogs(Vec<Log>), | ||||
| } | ||||
| 
 | ||||
| #[derive(RuntimeDebug, Clone, Eq, PartialEq, Ord, PartialOrd, Deserialize, Encode, Decode)] | ||||
| #[serde(rename_all = "camelCase")] | ||||
| pub struct Log { | ||||
|     #[serde(default, deserialize_with = "de_string_to_h256")] | ||||
|     pub transaction_hash: Option<H256>, | ||||
|     #[serde(default, deserialize_with = "de_string_to_u64")] | ||||
|     pub block_number: Option<u64>, | ||||
|     #[serde(default, deserialize_with = "de_string_to_vec_of_bytes")] | ||||
|     pub topics: Vec<Vec<u8>>, | ||||
|     pub removed: bool, | ||||
| } | ||||
| 
 | ||||
| impl Log { | ||||
|     pub fn is_sufficient(&self) -> bool { | ||||
|         self.transaction_hash.is_some() | ||||
|             && self.block_number.is_some() | ||||
|             && self.topics.len() == NUMBER_OF_TOPICS | ||||
|     } | ||||
| } | ||||
							
								
								
									
										1573
									
								
								pallets/slow-clap/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										1573
									
								
								pallets/slow-clap/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -4,22 +4,20 @@ use frame_support::{ | ||||
|     derive_impl, parameter_types, | ||||
|     traits::{ConstU32, ConstU64}, | ||||
|     weights::Weight, | ||||
|     PalletId, | ||||
| }; | ||||
| use frame_system::EnsureRoot; | ||||
| use pallet_session::historical as pallet_session_historical; | ||||
| use sp_runtime::{ | ||||
|     curve::PiecewiseLinear, | ||||
|     testing::{TestXt, UintAuthorityId}, | ||||
|     traits::ConvertInto, | ||||
|     Permill, | ||||
|     BuildStorage, Permill, | ||||
| }; | ||||
| use sp_staking::{ | ||||
|     offence::{OffenceError, ReportOffence}, | ||||
|     SessionIndex, | ||||
| }; | ||||
| 
 | ||||
| use sp_runtime::BuildStorage; | ||||
| 
 | ||||
| use crate as slow_clap; | ||||
| use crate::Config; | ||||
| 
 | ||||
| @ -38,8 +36,8 @@ frame_support::construct_runtime!( | ||||
| 
 | ||||
| parameter_types! { | ||||
|     pub static Validators: Option<Vec<u64>> = Some(vec![ | ||||
|         1, | ||||
|         2, | ||||
|         1, 
 | ||||
|         2, 
 | ||||
|         3, | ||||
|     ]); | ||||
| } | ||||
| @ -55,10 +53,13 @@ impl pallet_session::SessionManager<u64> for TestSessionManager { | ||||
| 
 | ||||
| impl pallet_session::historical::SessionManager<u64, u64> for TestSessionManager { | ||||
|     fn new_session(_new_index: SessionIndex) -> Option<Vec<(u64, u64)>> { | ||||
|         Validators::mutate(|l| { | ||||
|             l.take() | ||||
|                 .map(|validators| validators.iter().map(|v| (*v, *v)).collect()) | ||||
|         }) | ||||
|         Validators::mutate(|l| l | ||||
|             .take() | ||||
|             .map(|validators| validators | ||||
|                 .iter() | ||||
|                 .map(|v| (*v, *v)) | ||||
|                 .collect()) | ||||
|         ) | ||||
|     } | ||||
|     fn end_session(_: SessionIndex) {} | ||||
|     fn start_session(_: SessionIndex) {} | ||||
| @ -83,21 +84,24 @@ impl ReportOffence<u64, IdentificationTuple, Offence> for OffenceHandler { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub fn alice_account_id() -> <Runtime as frame_system::Config>::AccountId { 69 } | ||||
| pub fn eve_account_id() -> <Runtime as frame_system::Config>::AccountId { 1337 } | ||||
| 
 | ||||
| pub fn new_test_ext() -> sp_io::TestExternalities { | ||||
|     let t = frame_system::GenesisConfig::<Runtime>::default() | ||||
|     let mut t = frame_system::GenesisConfig::<Runtime>::default() | ||||
|         .build_storage() | ||||
|         .unwrap(); | ||||
| 
 | ||||
|     pallet_balances::GenesisConfig::<Runtime> { | ||||
|         balances: vec![ (alice_account_id(), 100) ], | ||||
|     } | ||||
|         .assimilate_storage(&mut t) | ||||
|         .unwrap(); | ||||
| 
 | ||||
|     let mut result = sp_io::TestExternalities::new(t); | ||||
| 
 | ||||
|     result.execute_with(|| { | ||||
|         for i in 1..=3 { | ||||
|             System::inc_providers(&i); | ||||
|             assert_eq!( | ||||
|                 Session::set_keys(RuntimeOrigin::signed(i), i.into(), vec![],), | ||||
|                 Ok(()) | ||||
|             ); | ||||
|         } | ||||
|         System::set_block_number(1); | ||||
|     }); | ||||
| 
 | ||||
|     result | ||||
| @ -148,7 +152,7 @@ impl frame_support::traits::EstimateNextSessionRotation<u64> for TestNextSession | ||||
|     } | ||||
| 
 | ||||
|     fn estimate_current_session_progress(now: u64) -> (Option<Permill>, Weight) { | ||||
|         let (estimate, weight) = | ||||
|         let (estimate, weight) = 
 | ||||
|             pallet_session::PeriodicSessions::<Period, Offset>::estimate_current_session_progress( | ||||
|                 now, | ||||
|             ); | ||||
| @ -163,7 +167,6 @@ impl frame_support::traits::EstimateNextSessionRotation<u64> for TestNextSession | ||||
| 
 | ||||
| impl ghost_networks::Config for Runtime { | ||||
|     type RuntimeEvent = RuntimeEvent; | ||||
|     type Currency = Balances; | ||||
|     type NetworkId = u32; | ||||
|     type RegisterOrigin = EnsureRoot<Self::AccountId>; | ||||
|     type UpdateOrigin = EnsureRoot<Self::AccountId>; | ||||
| @ -171,21 +174,9 @@ impl ghost_networks::Config for Runtime { | ||||
|     type WeightInfo = (); | ||||
| } | ||||
| 
 | ||||
| pallet_staking_reward_curve::build! { | ||||
|     const REWARD_CURVE: PiecewiseLinear<'static> = curve!( | ||||
|         min_inflation: 0_006_000, | ||||
|         max_inflation: 1_000_000, | ||||
|         ideal_stake: 0_690_000, | ||||
|         falloff: 0_050_000, | ||||
|         max_piece_count: 100, | ||||
|         test_precision: 0_005_000, | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
| parameter_types! { | ||||
|     pub static ExistentialDeposit: u64 = 2; | ||||
|     pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; | ||||
|     pub const HistoryDepth: u32 = 10; | ||||
|     pub const TreasuryPalletId: PalletId = PalletId(*b"mck/test"); | ||||
| } | ||||
| 
 | ||||
| #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] | ||||
| @ -208,16 +199,23 @@ impl Config for Runtime { | ||||
|     type ReportUnresponsiveness = OffenceHandler; | ||||
| 
 | ||||
|     type MaxAuthorities = ConstU32<5>; | ||||
|     type ApplauseThreshold = ConstU32<50>; | ||||
|     type OffenceThreshold = ConstU32<75>; | ||||
|     type MaxNumberOfClaps = ConstU32<100>; | ||||
|     type ApplauseThreshold = ConstU32<0>; | ||||
|     type MaxAuthorityInfoInSession = ConstU32<5_000>; | ||||
|     type OffenceThreshold = ConstU32<40>; | ||||
|     type UnsignedPriority = ConstU64<{ 1 << 20 }>; | ||||
|     type HistoryDepth = HistoryDepth; | ||||
|     type TreasuryPalletId = TreasuryPalletId; | ||||
| 
 | ||||
|     type WeightInfo = (); | ||||
| } | ||||
| 
 | ||||
| pub type Extrinsic = TestXt<RuntimeCall, ()>; | ||||
| 
 | ||||
| // impl frame_system::offchain::SigningTypes for Runtime {
 | ||||
| //     type Public = <Signature as Verify>::Signer;
 | ||||
| //     type Signature = Signature;
 | ||||
| // }
 | ||||
| 
 | ||||
| impl<LocalCall> frame_system::offchain::SendTransactionTypes<LocalCall> for Runtime | ||||
| where | ||||
|     RuntimeCall: From<LocalCall>, | ||||
| @ -226,36 +224,30 @@ where | ||||
|     type Extrinsic = Extrinsic; | ||||
| } | ||||
| 
 | ||||
| pub fn advance_session() { | ||||
|     let now = System::block_number().max(1); | ||||
|     System::set_block_number(now + 1); | ||||
|     Session::rotate_session(); | ||||
|     let session_index = Session::current_index(); | ||||
| // impl<LocalCall> frame_system::offchain::CreateSignedTransaction<LocalCall> for Runtime 
 | ||||
| // where
 | ||||
| //     RuntimeCall: From<LocalCall>,
 | ||||
| // {
 | ||||
| //     fn create_transaction<C: frame_system::offchain::AppCrypto<Self::Public, Self::Signature>>(
 | ||||
| //             call: Self::OverarchingCall,
 | ||||
| //             _public: Self::Public,
 | ||||
| //             _account: Self::AccountId,
 | ||||
| //             nonce: Self::Nonce,
 | ||||
| //         ) -> Option<(RuntimeCall, <Extrinsic as ExtrinsicT>::SignaturePayload)> {
 | ||||
| //         Some((call, (nonce.into(), ())))
 | ||||
| //     }
 | ||||
| // }
 | ||||
| 
 | ||||
|     let authorities = Session::validators() | ||||
|         .into_iter() | ||||
|         .map(UintAuthorityId) | ||||
|         .collect(); | ||||
| 
 | ||||
|     SlowClap::set_test_authorities(session_index, authorities); | ||||
|     assert_eq!(session_index, (now / Period::get()) as u32); | ||||
| } | ||||
| 
 | ||||
| pub fn advance_session_with_authority(authority: u64) { | ||||
|     let now = System::block_number().max(1); | ||||
|     System::set_block_number(now + 1); | ||||
|     Session::rotate_session(); | ||||
| 
 | ||||
|     let session_index = Session::current_index(); | ||||
| 
 | ||||
|     SlowClap::set_test_authorities( | ||||
|         session_index, | ||||
|         vec![ | ||||
|             UintAuthorityId::from(authority), | ||||
|             UintAuthorityId::from(69), | ||||
|             UintAuthorityId::from(420), | ||||
|             UintAuthorityId::from(1337), | ||||
|         ], | ||||
|     ); | ||||
|     assert_eq!(session_index, (now / Period::get()) as u32); | ||||
| } | ||||
| // pub fn advance_session() {
 | ||||
| //     let now = System::block_number().max(1);
 | ||||
| //     System::set_block_number(now + 1);
 | ||||
| //     Session::rotate_session();
 | ||||
| //
 | ||||
| //     let authorities = Session::validators()
 | ||||
| //         .into_iter()
 | ||||
| //         .map(UintAuthorityId)
 | ||||
| //         .collect();
 | ||||
| //
 | ||||
| //     SlowClap::set_authorities(authorities);
 | ||||
| //     assert_eq!(Session::current_index(), (now / Period::get()) as u32);
 | ||||
| // }
 | ||||
|  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,176 +1,18 @@ | ||||
| // This file is part of Ghost Network.
 | ||||
| 
 | ||||
| // Ghost Network is free software: you can redistribute it and/or modify
 | ||||
| // it under the terms of the GNU General Public License as published by
 | ||||
| // the Free Software Foundation, either version 3 of the License, or
 | ||||
| // (at your option) any later version.
 | ||||
| 
 | ||||
| // Ghost Network 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 General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| // along with Ghost Network.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| //! Autogenerated weights for `ghost_slow_clap`
 | ||||
| //!
 | ||||
| //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
 | ||||
| //! DATE: 2025-06-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 | ||||
| //! WORST CASE MAP SIZE: `1000000`
 | ||||
| //! HOSTNAME: `ghostown`, CPU: `Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz`
 | ||||
| //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("casper-dev")`, DB CACHE: 1024
 | ||||
| 
 | ||||
| // Executed Command:
 | ||||
| // ./target/release/ghost
 | ||||
| // benchmark
 | ||||
| // pallet
 | ||||
| // --chain=casper-dev
 | ||||
| // --steps=50
 | ||||
| // --repeat=20
 | ||||
| // --pallet=ghost_slow_clap
 | ||||
| // --extrinsic=*
 | ||||
| // --wasm-execution=compiled
 | ||||
| // --heap-pages=4096
 | ||||
| // --header=./file_header.txt
 | ||||
| // --output=./runtime/casper/src/weights/ghost_slow_clap.rs
 | ||||
| 
 | ||||
| #![cfg_attr(rustfmt, rustfmt_skip)] | ||||
| #![allow(unused_parens)] | ||||
| #![allow(unused_imports)] | ||||
| #![allow(missing_docs)] | ||||
| 
 | ||||
| use frame_support::{ | ||||
|     traits::Get, | ||||
|     weights::{Weight, constants::RocksDbWeight} | ||||
| }; | ||||
| use core::marker::PhantomData; | ||||
| use frame_support::weights::Weight; | ||||
| 
 | ||||
| pub trait WeightInfo { | ||||
|     fn slow_clap() -> Weight; | ||||
|     fn self_applause()-> Weight; | ||||
| } | ||||
| 
 | ||||
| /// Weight functions for `ghost_slow_clap`.
 | ||||
| pub struct SubstrateWeight<T>(PhantomData<T>); | ||||
| impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> { | ||||
| 	/// Storage: `GhostSlowClaps::Authorities` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSlowClaps::Authorities` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::ReceivedClaps` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::ReceivedClaps` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::ClapsInSession` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::ClapsInSession` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::ApplausesForTransaction` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::ApplausesForTransaction` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::NullifyNeeded` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostNetworks::NullifyNeeded` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::GatekeeperAmount` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::GatekeeperAmount` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::BridgedImbalance` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::BridgedImbalance` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::AccumulatedCommission` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::AccumulatedCommission` (`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(128), added: 2603, mode: `MaxEncodedLen`)
 | ||||
| 	fn slow_clap() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `355`
 | ||||
| 		//  Estimated: `3820`
 | ||||
| 		// Minimum execution time: 213_817_000 picoseconds.
 | ||||
| 		Weight::from_parts(216_977_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3820)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(10)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(7)) | ||||
| 	} | ||||
| 	/// Storage: `GhostSlowClaps::ReceivedClaps` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSlowClaps::ReceivedClaps` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::Authorities` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSlowClaps::Authorities` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::ApplausesForTransaction` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::ApplausesForTransaction` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::NullifyNeeded` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostNetworks::NullifyNeeded` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::GatekeeperAmount` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::GatekeeperAmount` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::BridgedImbalance` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::BridgedImbalance` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::AccumulatedCommission` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::AccumulatedCommission` (`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(128), added: 2603, mode: `MaxEncodedLen`)
 | ||||
| 	fn self_applause() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `655`
 | ||||
| 		//  Estimated: `4120`
 | ||||
| 		// Minimum execution time: 210_676_000 picoseconds.
 | ||||
| 		Weight::from_parts(212_905_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 4120)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(9)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(5)) | ||||
| 	} | ||||
|     fn slow_clap(claps_len: u32, companions_len: u32) -> Weight; | ||||
|     fn propose_companion() -> Weight; | ||||
|     fn release_companion() -> Weight; | ||||
|     fn kill_companion() -> Weight; | ||||
| } | ||||
| 
 | ||||
| impl WeightInfo for () { | ||||
| 	/// Storage: `GhostSlowClaps::Authorities` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSlowClaps::Authorities` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::ReceivedClaps` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::ReceivedClaps` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::ClapsInSession` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::ClapsInSession` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::ApplausesForTransaction` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::ApplausesForTransaction` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::NullifyNeeded` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostNetworks::NullifyNeeded` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::GatekeeperAmount` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::GatekeeperAmount` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::BridgedImbalance` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::BridgedImbalance` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::AccumulatedCommission` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::AccumulatedCommission` (`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(128), added: 2603, mode: `MaxEncodedLen`)
 | ||||
| 	fn slow_clap() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `355`
 | ||||
| 		//  Estimated: `3820`
 | ||||
| 		// Minimum execution time: 213_817_000 picoseconds.
 | ||||
| 		Weight::from_parts(216_977_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3820)) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(10)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(7)) | ||||
| 	} | ||||
| 	/// Storage: `GhostSlowClaps::ReceivedClaps` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSlowClaps::ReceivedClaps` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::Authorities` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSlowClaps::Authorities` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::ApplausesForTransaction` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::ApplausesForTransaction` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::NullifyNeeded` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostNetworks::NullifyNeeded` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::GatekeeperAmount` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::GatekeeperAmount` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::BridgedImbalance` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::BridgedImbalance` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::AccumulatedCommission` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::AccumulatedCommission` (`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(128), added: 2603, mode: `MaxEncodedLen`)
 | ||||
| 	fn self_applause() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `655`
 | ||||
| 		//  Estimated: `4120`
 | ||||
| 		// Minimum execution time: 210_676_000 picoseconds.
 | ||||
| 		Weight::from_parts(212_905_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 4120)) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(9)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(5)) | ||||
| 	} | ||||
|     fn slow_clap( | ||||
|         _claps_len: u32, 
 | ||||
|         _companions_len: u32, | ||||
|     ) -> Weight { Weight::zero() } | ||||
|     fn propose_companion() -> Weight { Weight::zero() } | ||||
|     fn release_companion() -> Weight { Weight::zero() } | ||||
|     fn kill_companion() -> Weight { Weight::zero() } | ||||
| } | ||||
|  | ||||
| @ -1,45 +0,0 @@ | ||||
| [package] | ||||
| name = "ghost-sudo" | ||||
| version = "0.0.2" | ||||
| description = "Port of the sudo pallet because of dependencies issue" | ||||
| license.workspace = true | ||||
| authors.workspace = true | ||||
| edition.workspace = true | ||||
| homepage.workspace = true | ||||
| repository.workspace = true | ||||
| 
 | ||||
| [dependencies] | ||||
| docify = "0.2.8" | ||||
| codec = { workspace = true, features = ["derive"] } | ||||
| frame-benchmarking = { workspace = true, optional = true } | ||||
| scale-info = { workspace = true, features = ["derive"] } | ||||
| frame-support = { workspace = true } | ||||
| frame-system = { workspace = true } | ||||
| 
 | ||||
| sp-io = { workspace = true } | ||||
| sp-runtime = { workspace = true } | ||||
| sp-std = { workspace = true } | ||||
| 
 | ||||
| [features] | ||||
| default = ["std"] | ||||
| std = [ | ||||
| 	"codec/std", | ||||
| 	"frame-benchmarking?/std", | ||||
| 	"frame-support/std", | ||||
| 	"frame-system/std", | ||||
| 	"scale-info/std", | ||||
| 	"sp-io/std", | ||||
| 	"sp-runtime/std", | ||||
| 	"sp-std/std", | ||||
| ] | ||||
| runtime-benchmarks = [ | ||||
| 	"frame-benchmarking/runtime-benchmarks", | ||||
| 	"frame-support/runtime-benchmarks", | ||||
| 	"frame-system/runtime-benchmarks", | ||||
| 	"sp-runtime/runtime-benchmarks", | ||||
| ] | ||||
| try-runtime = [ | ||||
| 	"frame-support/try-runtime", | ||||
| 	"frame-system/try-runtime", | ||||
| 	"sp-runtime/try-runtime", | ||||
| ] | ||||
| @ -1,77 +0,0 @@ | ||||
| use super::*; | ||||
| use crate::Pallet; | ||||
| use frame_benchmarking::v2::*; | ||||
| use frame_system::RawOrigin; | ||||
| 
 | ||||
| fn assert_last_event<T: Config>(generic_event: crate::Event<T>) { | ||||
|     let re: <T as Config>::RuntimeEvent = generic_event.into(); | ||||
|     frame_system::Pallet::<T>::assert_last_event(re.into()); | ||||
| } | ||||
| 
 | ||||
| #[benchmarks(where <T as Config>::RuntimeCall: From<frame_system::Call<T>>)] | ||||
| mod benchmarks { | ||||
|     use super::*; | ||||
| 
 | ||||
|     #[benchmark] | ||||
|     fn set_key() { | ||||
|         let caller: T::AccountId = whitelisted_caller(); | ||||
|         Key::<T>::put(&caller); | ||||
| 
 | ||||
|         let new_sudoer: T::AccountId = account("sudoer", 0, 0); | ||||
|         let new_sudoer_lookup = T::Lookup::unlookup(new_sudoer.clone()); | ||||
| 
 | ||||
|         #[extrinsic_call] | ||||
|         _(RawOrigin::Signed(caller.clone()), new_sudoer_lookup); | ||||
| 
 | ||||
|         assert_last_event::<T>(Event::KeyChanged { | ||||
|             old: Some(caller), | ||||
|             new: new_sudoer, | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     #[benchmark] | ||||
|     fn sudo() { | ||||
|         let caller: T::AccountId = whitelisted_caller(); | ||||
|         Key::<T>::put(&caller); | ||||
| 
 | ||||
|         let call = frame_system::Call::remark { remark: vec![] }.into(); | ||||
| 
 | ||||
|         #[extrinsic_call] | ||||
|         _(RawOrigin::Signed(caller), Box::new(call)); | ||||
| 
 | ||||
|         assert_last_event::<T>(Event::Sudid { | ||||
|             sudo_result: Ok(()), | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
|     #[benchmark] | ||||
|     fn sudo_as() { | ||||
|         let caller: T::AccountId = whitelisted_caller(); | ||||
|         Key::<T>::put(caller.clone()); | ||||
| 
 | ||||
|         let call = frame_system::Call::remark { remark: vec![] }.into(); | ||||
| 
 | ||||
|         let who: T::AccountId = account("as", 0, 0); | ||||
|         let who_lookup = T::Lookup::unlookup(who); | ||||
| 
 | ||||
|         #[extrinsic_call] | ||||
|         _(RawOrigin::Signed(caller), who_lookup, Box::new(call)); | ||||
| 
 | ||||
|         assert_last_event::<T>(Event::SudoAsDone { | ||||
|             sudo_result: Ok(()), | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
|     #[benchmark] | ||||
|     fn remove_key() { | ||||
|         let caller: T::AccountId = whitelisted_caller(); | ||||
|         Key::<T>::put(&caller); | ||||
| 
 | ||||
|         #[extrinsic_call] | ||||
|         _(RawOrigin::Signed(caller.clone())); | ||||
| 
 | ||||
|         assert_last_event::<T>(Event::KeyRemoved {}); | ||||
|     } | ||||
| 
 | ||||
|     impl_benchmark_test_suite!(Pallet, crate::mock::new_bench_ext(), crate::mock::Test); | ||||
| } | ||||
| @ -1,82 +0,0 @@ | ||||
| use crate::{Config, Key}; | ||||
| use codec::{Decode, Encode}; | ||||
| use frame_support::{dispatch::DispatchInfo, ensure}; | ||||
| use scale_info::TypeInfo; | ||||
| use sp_runtime::{ | ||||
|     traits::{DispatchInfoOf, Dispatchable, SignedExtension}, | ||||
|     transaction_validity::{ | ||||
|         InvalidTransaction, TransactionPriority, TransactionValidity, TransactionValidityError, | ||||
|         UnknownTransaction, ValidTransaction, | ||||
|     }, | ||||
| }; | ||||
| use sp_std::{fmt, marker::PhantomData}; | ||||
| 
 | ||||
| #[derive(Clone, Eq, PartialEq, Encode, Decode, TypeInfo)] | ||||
| #[scale_info(skip_type_params(T))] | ||||
| pub struct CheckOnlySudoAccount<T: Config + Send + Sync>(PhantomData<T>); | ||||
| 
 | ||||
| impl<T: Config + Send + Sync> Default for CheckOnlySudoAccount<T> { | ||||
|     fn default() -> Self { | ||||
|         Self(Default::default()) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<T: Config + Send + Sync> fmt::Debug for CheckOnlySudoAccount<T> { | ||||
|     #[cfg(feature = "std")] | ||||
|     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||||
|         write!(f, "CheckOnlySudoAccount") | ||||
|     } | ||||
| 
 | ||||
|     #[cfg(not(feature = "std"))] | ||||
|     fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result { | ||||
|         Ok(()) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<T: Config + Send + Sync> CheckOnlySudoAccount<T> { | ||||
|     /// Creates new `SignedExtension` to check sudo key.
 | ||||
|     pub fn new() -> Self { | ||||
|         Self::default() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<T: Config + Send + Sync> SignedExtension for CheckOnlySudoAccount<T> | ||||
| where | ||||
|     <T as Config>::RuntimeCall: Dispatchable<Info = DispatchInfo>, | ||||
| { | ||||
|     const IDENTIFIER: &'static str = "CheckOnlySudoAccount"; | ||||
|     type AccountId = T::AccountId; | ||||
|     type Call = <T as Config>::RuntimeCall; | ||||
|     type AdditionalSigned = (); | ||||
|     type Pre = (); | ||||
| 
 | ||||
|     fn additional_signed(&self) -> Result<Self::AdditionalSigned, TransactionValidityError> { | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     fn validate( | ||||
|         &self, | ||||
|         who: &Self::AccountId, | ||||
|         _call: &Self::Call, | ||||
|         info: &DispatchInfoOf<Self::Call>, | ||||
|         _len: usize, | ||||
|     ) -> TransactionValidity { | ||||
|         let sudo_key: T::AccountId = Key::<T>::get().ok_or(UnknownTransaction::CannotLookup)?; | ||||
|         ensure!(*who == sudo_key, InvalidTransaction::BadSigner); | ||||
| 
 | ||||
|         Ok(ValidTransaction { | ||||
|             priority: info.weight.ref_time() as TransactionPriority, | ||||
|             ..Default::default() | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
|     fn pre_dispatch( | ||||
|         self, | ||||
|         who: &Self::AccountId, | ||||
|         call: &Self::Call, | ||||
|         info: &DispatchInfoOf<Self::Call>, | ||||
|         len: usize, | ||||
|     ) -> Result<Self::Pre, TransactionValidityError> { | ||||
|         self.validate(who, call, info, len).map(|_| ()) | ||||
|     } | ||||
| } | ||||
| @ -1,212 +0,0 @@ | ||||
| #![cfg_attr(not(feature = "std"), no_std)] | ||||
| 
 | ||||
| use sp_runtime::{traits::StaticLookup, DispatchResult}; | ||||
| use sp_std::prelude::*; | ||||
| 
 | ||||
| use frame_support::{dispatch::GetDispatchInfo, traits::UnfilteredDispatchable}; | ||||
| 
 | ||||
| mod extension; | ||||
| #[cfg(test)] | ||||
| mod mock; | ||||
| #[cfg(test)] | ||||
| mod tests; | ||||
| 
 | ||||
| #[cfg(feature = "runtime-benchmarks")] | ||||
| mod benchmarking; | ||||
| pub mod weights; | ||||
| pub use weights::WeightInfo; | ||||
| 
 | ||||
| pub use extension::CheckOnlySudoAccount; | ||||
| pub use pallet::*; | ||||
| 
 | ||||
| type AccountIdLookupOf<T> = <<T as frame_system::Config>::Lookup as StaticLookup>::Source; | ||||
| 
 | ||||
| #[frame_support::pallet] | ||||
| pub mod pallet { | ||||
|     use super::{DispatchResult, *}; | ||||
|     use frame_support::pallet_prelude::*; | ||||
|     use frame_system::{pallet_prelude::*, RawOrigin}; | ||||
| 
 | ||||
|     pub mod config_preludes { | ||||
|         use super::*; | ||||
|         use frame_support::derive_impl; | ||||
| 
 | ||||
|         pub struct TestDefaultConfig; | ||||
| 
 | ||||
|         #[derive_impl(frame_system::config_preludes::TestDefaultConfig, no_aggregated_types)] | ||||
|         impl frame_system::DefaultConfig for TestDefaultConfig {} | ||||
| 
 | ||||
|         #[frame_support::register_default_impl(TestDefaultConfig)] | ||||
|         impl DefaultConfig for TestDefaultConfig { | ||||
|             type WeightInfo = (); | ||||
|             #[inject_runtime_type] | ||||
|             type RuntimeEvent = (); | ||||
|             #[inject_runtime_type] | ||||
|             type RuntimeCall = (); | ||||
|         } | ||||
|     } | ||||
|     #[pallet::config(with_default)] | ||||
|     pub trait Config: frame_system::Config { | ||||
|         #[pallet::no_default_bounds] | ||||
|         type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>; | ||||
| 
 | ||||
|         #[pallet::no_default_bounds] | ||||
|         type RuntimeCall: Parameter | ||||
|             + UnfilteredDispatchable<RuntimeOrigin = Self::RuntimeOrigin> | ||||
|             + GetDispatchInfo; | ||||
| 
 | ||||
|         type WeightInfo: WeightInfo; | ||||
|     } | ||||
| 
 | ||||
|     #[pallet::pallet] | ||||
|     pub struct Pallet<T>(_); | ||||
| 
 | ||||
|     #[pallet::call] | ||||
|     impl<T: Config> Pallet<T> { | ||||
|         #[pallet::call_index(0)] | ||||
|         #[pallet::weight({
 | ||||
| 			let dispatch_info = call.get_dispatch_info(); | ||||
| 			( | ||||
| 				T::WeightInfo::sudo().saturating_add(dispatch_info.weight), | ||||
| 				dispatch_info.class | ||||
| 			) | ||||
| 		})] | ||||
|         pub fn sudo( | ||||
|             origin: OriginFor<T>, | ||||
|             call: Box<<T as Config>::RuntimeCall>, | ||||
|         ) -> DispatchResultWithPostInfo { | ||||
|             Self::ensure_sudo(origin)?; | ||||
| 
 | ||||
|             let res = call.dispatch_bypass_filter(RawOrigin::Root.into()); | ||||
|             Self::deposit_event(Event::Sudid { | ||||
|                 sudo_result: res.map(|_| ()).map_err(|e| e.error), | ||||
|             }); | ||||
| 
 | ||||
|             Ok(Pays::No.into()) | ||||
|         } | ||||
| 
 | ||||
|         #[pallet::call_index(1)] | ||||
|         #[pallet::weight((*weight, call.get_dispatch_info().class))] | ||||
|         pub fn sudo_unchecked_weight( | ||||
|             origin: OriginFor<T>, | ||||
|             call: Box<<T as Config>::RuntimeCall>, | ||||
|             weight: Weight, | ||||
|         ) -> DispatchResultWithPostInfo { | ||||
|             Self::ensure_sudo(origin)?; | ||||
|             let _ = weight; | ||||
| 
 | ||||
|             let res = call.dispatch_bypass_filter(RawOrigin::Root.into()); | ||||
|             Self::deposit_event(Event::Sudid { | ||||
|                 sudo_result: res.map(|_| ()).map_err(|e| e.error), | ||||
|             }); | ||||
| 
 | ||||
|             Ok(Pays::No.into()) | ||||
|         } | ||||
| 
 | ||||
|         #[pallet::call_index(2)] | ||||
|         #[pallet::weight(T::WeightInfo::set_key())] | ||||
|         pub fn set_key( | ||||
|             origin: OriginFor<T>, | ||||
|             new: AccountIdLookupOf<T>, | ||||
|         ) -> DispatchResultWithPostInfo { | ||||
|             Self::ensure_sudo(origin)?; | ||||
| 
 | ||||
|             let new = T::Lookup::lookup(new)?; | ||||
|             Self::deposit_event(Event::KeyChanged { | ||||
|                 old: Key::<T>::get(), | ||||
|                 new: new.clone(), | ||||
|             }); | ||||
|             Key::<T>::put(new); | ||||
| 
 | ||||
|             Ok(Pays::No.into()) | ||||
|         } | ||||
| 
 | ||||
|         #[pallet::call_index(3)] | ||||
|         #[pallet::weight({
 | ||||
| 			let dispatch_info = call.get_dispatch_info(); | ||||
| 			( | ||||
| 				T::WeightInfo::sudo_as().saturating_add(dispatch_info.weight), | ||||
| 				dispatch_info.class, | ||||
| 			) | ||||
| 		})] | ||||
|         pub fn sudo_as( | ||||
|             origin: OriginFor<T>, | ||||
|             who: AccountIdLookupOf<T>, | ||||
|             call: Box<<T as Config>::RuntimeCall>, | ||||
|         ) -> DispatchResultWithPostInfo { | ||||
|             Self::ensure_sudo(origin)?; | ||||
| 
 | ||||
|             let who = T::Lookup::lookup(who)?; | ||||
|             let res = call.dispatch_bypass_filter(RawOrigin::Signed(who).into()); | ||||
|             Self::deposit_event(Event::SudoAsDone { | ||||
|                 sudo_result: res.map(|_| ()).map_err(|e| e.error), | ||||
|             }); | ||||
| 
 | ||||
|             Ok(Pays::No.into()) | ||||
|         } | ||||
| 
 | ||||
|         #[pallet::call_index(4)] | ||||
|         #[pallet::weight(T::WeightInfo::remove_key())] | ||||
|         pub fn remove_key(origin: OriginFor<T>) -> DispatchResultWithPostInfo { | ||||
|             Self::ensure_sudo(origin)?; | ||||
| 
 | ||||
|             Self::deposit_event(Event::KeyRemoved {}); | ||||
|             Key::<T>::kill(); | ||||
| 
 | ||||
|             Ok(Pays::No.into()) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     #[pallet::event] | ||||
|     #[pallet::generate_deposit(pub(super) fn deposit_event)] | ||||
|     pub enum Event<T: Config> { | ||||
|         Sudid { | ||||
|             sudo_result: DispatchResult, | ||||
|         }, | ||||
|         KeyChanged { | ||||
|             old: Option<T::AccountId>, | ||||
|             new: T::AccountId, | ||||
|         }, | ||||
|         KeyRemoved, | ||||
|         SudoAsDone { | ||||
|             sudo_result: DispatchResult, | ||||
|         }, | ||||
|     } | ||||
| 
 | ||||
|     #[pallet::error] | ||||
|     pub enum Error<T> { | ||||
|         RequireSudo, | ||||
|     } | ||||
| 
 | ||||
|     #[pallet::storage] | ||||
|     pub(super) type Key<T: Config> = StorageValue<_, T::AccountId, OptionQuery>; | ||||
| 
 | ||||
|     #[pallet::genesis_config] | ||||
|     #[derive(frame_support::DefaultNoBound)] | ||||
|     pub struct GenesisConfig<T: Config> { | ||||
|         pub key: Option<T::AccountId>, | ||||
|     } | ||||
| 
 | ||||
|     #[pallet::genesis_build] | ||||
|     impl<T: Config> BuildGenesisConfig for GenesisConfig<T> { | ||||
|         fn build(&self) { | ||||
|             Key::<T>::set(self.key.clone()); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     impl<T: Config> Pallet<T> { | ||||
|         pub(crate) fn ensure_sudo(origin: OriginFor<T>) -> DispatchResult { | ||||
|             let sender = ensure_signed_or_root(origin)?; | ||||
| 
 | ||||
|             if let Some(sender) = sender { | ||||
|                 if Key::<T>::get().map_or(false, |k| k == sender) { | ||||
|                     Ok(()) | ||||
|                 } else { | ||||
|                     Err(Error::<T>::RequireSudo.into()) | ||||
|                 } | ||||
|             } else { | ||||
|                 Ok(()) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,127 +0,0 @@ | ||||
| use super::*; | ||||
| use crate as sudo; | ||||
| use frame_support::derive_impl; | ||||
| use sp_io; | ||||
| use sp_runtime::BuildStorage; | ||||
| 
 | ||||
| #[frame_support::pallet] | ||||
| pub mod logger { | ||||
|     use frame_support::pallet_prelude::*; | ||||
|     use frame_system::pallet_prelude::*; | ||||
| 
 | ||||
|     #[pallet::config] | ||||
|     pub trait Config: frame_system::Config { | ||||
|         type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>; | ||||
|     } | ||||
| 
 | ||||
|     #[pallet::pallet] | ||||
|     pub struct Pallet<T>(_); | ||||
| 
 | ||||
|     #[pallet::call] | ||||
|     impl<T: Config> Pallet<T> { | ||||
|         #[pallet::call_index(0)] | ||||
|         #[pallet::weight(*weight)] | ||||
|         pub fn privileged_i32_log( | ||||
|             origin: OriginFor<T>, | ||||
|             i: i32, | ||||
|             weight: Weight, | ||||
|         ) -> DispatchResultWithPostInfo { | ||||
|             ensure_root(origin)?; | ||||
|             <I32Log<T>>::try_append(i).map_err(|_| "could not append")?; | ||||
|             Self::deposit_event(Event::AppendI32 { value: i, weight }); | ||||
|             Ok(().into()) | ||||
|         } | ||||
| 
 | ||||
|         #[pallet::call_index(1)] | ||||
|         #[pallet::weight(*weight)] | ||||
|         pub fn non_privileged_log( | ||||
|             origin: OriginFor<T>, | ||||
|             i: i32, | ||||
|             weight: Weight, | ||||
|         ) -> DispatchResultWithPostInfo { | ||||
|             let sender = ensure_signed(origin)?; | ||||
|             <I32Log<T>>::try_append(i).map_err(|_| "could not append")?; | ||||
|             <AccountLog<T>>::try_append(sender.clone()).map_err(|_| "could not append")?; | ||||
|             Self::deposit_event(Event::AppendI32AndAccount { | ||||
|                 sender, | ||||
|                 value: i, | ||||
|                 weight, | ||||
|             }); | ||||
|             Ok(().into()) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     #[pallet::event] | ||||
|     #[pallet::generate_deposit(pub(super) fn deposit_event)] | ||||
|     pub enum Event<T: Config> { | ||||
|         AppendI32 { | ||||
|             value: i32, | ||||
|             weight: Weight, | ||||
|         }, | ||||
|         AppendI32AndAccount { | ||||
|             sender: T::AccountId, | ||||
|             value: i32, | ||||
|             weight: Weight, | ||||
|         }, | ||||
|     } | ||||
| 
 | ||||
|     #[pallet::storage] | ||||
|     #[pallet::getter(fn account_log)] | ||||
|     pub(super) type AccountLog<T: Config> = | ||||
|         StorageValue<_, BoundedVec<T::AccountId, ConstU32<1_000>>, ValueQuery>; | ||||
| 
 | ||||
|     #[pallet::storage] | ||||
|     #[pallet::getter(fn i32_log)] | ||||
|     pub(super) type I32Log<T> = StorageValue<_, BoundedVec<i32, ConstU32<1_000>>, ValueQuery>; | ||||
| } | ||||
| 
 | ||||
| type Block = frame_system::mocking::MockBlock<Test>; | ||||
| 
 | ||||
| frame_support::construct_runtime!( | ||||
|     pub enum Test | ||||
|     { | ||||
|         System: frame_system, | ||||
|         Sudo: sudo, | ||||
|         Logger: logger, | ||||
|     } | ||||
| ); | ||||
| 
 | ||||
| #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] | ||||
| impl frame_system::Config for Test { | ||||
|     type Block = Block; | ||||
| } | ||||
| 
 | ||||
| impl logger::Config for Test { | ||||
|     type RuntimeEvent = RuntimeEvent; | ||||
| } | ||||
| 
 | ||||
| impl Config for Test { | ||||
|     type RuntimeEvent = RuntimeEvent; | ||||
|     type RuntimeCall = RuntimeCall; | ||||
|     type WeightInfo = (); | ||||
| } | ||||
| 
 | ||||
| pub type SudoCall = sudo::Call<Test>; | ||||
| pub type LoggerCall = logger::Call<Test>; | ||||
| 
 | ||||
| pub fn new_test_ext(root_key: u64) -> sp_io::TestExternalities { | ||||
|     let mut t = frame_system::GenesisConfig::<Test>::default() | ||||
|         .build_storage() | ||||
|         .unwrap(); | ||||
|     sudo::GenesisConfig::<Test> { | ||||
|         key: Some(root_key), | ||||
|     } | ||||
|     .assimilate_storage(&mut t) | ||||
|     .unwrap(); | ||||
|     let mut ext: sp_io::TestExternalities = t.into(); | ||||
|     ext.execute_with(|| System::set_block_number(1)); | ||||
|     ext | ||||
| } | ||||
| 
 | ||||
| #[cfg(feature = "runtime-benchmarks")] | ||||
| pub fn new_bench_ext() -> sp_io::TestExternalities { | ||||
|     frame_system::GenesisConfig::<Test>::default() | ||||
|         .build_storage() | ||||
|         .unwrap() | ||||
|         .into() | ||||
| } | ||||
| @ -1,217 +0,0 @@ | ||||
| use super::*; | ||||
| use frame_support::{assert_noop, assert_ok, weights::Weight}; | ||||
| use mock::{ | ||||
|     new_test_ext, Logger, LoggerCall, RuntimeCall, RuntimeEvent as TestEvent, RuntimeOrigin, Sudo, | ||||
|     SudoCall, System, Test, | ||||
| }; | ||||
| 
 | ||||
| #[test] | ||||
| fn test_setup_works() { | ||||
|     new_test_ext(1).execute_with(|| { | ||||
|         assert_eq!(Key::<Test>::get(), Some(1u64)); | ||||
|         assert!(Logger::i32_log().is_empty()); | ||||
|         assert!(Logger::account_log().is_empty()); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| #[docify::export] | ||||
| #[test] | ||||
| fn sudo_basics() { | ||||
|     new_test_ext(1).execute_with(|| { | ||||
|         let call = Box::new(RuntimeCall::Logger(LoggerCall::privileged_i32_log { | ||||
|             i: 42, | ||||
|             weight: Weight::from_parts(1_000, 0), | ||||
|         })); | ||||
|         assert_ok!(Sudo::sudo(RuntimeOrigin::signed(1), call)); | ||||
|         assert_eq!(Logger::i32_log(), vec![42i32]); | ||||
| 
 | ||||
|         let call = Box::new(RuntimeCall::Logger(LoggerCall::privileged_i32_log { | ||||
|             i: 42, | ||||
|             weight: Weight::from_parts(1_000, 0), | ||||
|         })); | ||||
|         assert_noop!( | ||||
|             Sudo::sudo(RuntimeOrigin::signed(2), call), | ||||
|             Error::<Test>::RequireSudo | ||||
|         ); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| #[test] | ||||
| fn sudo_emits_events_correctly() { | ||||
|     new_test_ext(1).execute_with(|| { | ||||
|         let call = Box::new(RuntimeCall::Logger(LoggerCall::privileged_i32_log { | ||||
|             i: 42, | ||||
|             weight: Weight::from_parts(1, 0), | ||||
|         })); | ||||
|         assert_ok!(Sudo::sudo(RuntimeOrigin::signed(1), call)); | ||||
|         System::assert_has_event(TestEvent::Sudo(Event::Sudid { | ||||
|             sudo_result: Ok(()), | ||||
|         })); | ||||
|     }) | ||||
| } | ||||
| 
 | ||||
| #[test] | ||||
| fn sudo_unchecked_weight_basics() { | ||||
|     new_test_ext(1).execute_with(|| { | ||||
|         let call = Box::new(RuntimeCall::Logger(LoggerCall::privileged_i32_log { | ||||
|             i: 42, | ||||
|             weight: Weight::from_parts(1_000, 0), | ||||
|         })); | ||||
|         assert_ok!(Sudo::sudo_unchecked_weight( | ||||
|             RuntimeOrigin::signed(1), | ||||
|             call, | ||||
|             Weight::from_parts(1_000, 0) | ||||
|         )); | ||||
|         assert_eq!(Logger::i32_log(), vec![42i32]); | ||||
| 
 | ||||
|         let call = Box::new(RuntimeCall::Logger(LoggerCall::privileged_i32_log { | ||||
|             i: 42, | ||||
|             weight: Weight::from_parts(1_000, 0), | ||||
|         })); | ||||
|         assert_noop!( | ||||
|             Sudo::sudo_unchecked_weight( | ||||
|                 RuntimeOrigin::signed(2), | ||||
|                 call, | ||||
|                 Weight::from_parts(1_000, 0) | ||||
|             ), | ||||
|             Error::<Test>::RequireSudo, | ||||
|         ); | ||||
|         assert_eq!(Logger::i32_log(), vec![42i32]); | ||||
| 
 | ||||
|         let call = Box::new(RuntimeCall::Logger(LoggerCall::privileged_i32_log { | ||||
|             i: 42, | ||||
|             weight: Weight::from_parts(1, 0), | ||||
|         })); | ||||
|         let sudo_unchecked_weight_call = SudoCall::sudo_unchecked_weight { | ||||
|             call, | ||||
|             weight: Weight::from_parts(1_000, 0), | ||||
|         }; | ||||
|         let info = sudo_unchecked_weight_call.get_dispatch_info(); | ||||
|         assert_eq!(info.weight, Weight::from_parts(1_000, 0)); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| #[test] | ||||
| fn sudo_unchecked_weight_emits_events_correctly() { | ||||
|     new_test_ext(1).execute_with(|| { | ||||
|         let call = Box::new(RuntimeCall::Logger(LoggerCall::privileged_i32_log { | ||||
|             i: 42, | ||||
|             weight: Weight::from_parts(1, 0), | ||||
|         })); | ||||
|         assert_ok!(Sudo::sudo_unchecked_weight( | ||||
|             RuntimeOrigin::signed(1), | ||||
|             call, | ||||
|             Weight::from_parts(1_000, 0) | ||||
|         )); | ||||
|         System::assert_has_event(TestEvent::Sudo(Event::Sudid { | ||||
|             sudo_result: Ok(()), | ||||
|         })); | ||||
|     }) | ||||
| } | ||||
| 
 | ||||
| #[docify::export] | ||||
| #[test] | ||||
| fn set_key_basics() { | ||||
|     new_test_ext(1).execute_with(|| { | ||||
|         assert_ok!(Sudo::set_key(RuntimeOrigin::signed(1), 2)); | ||||
|         assert_eq!(Key::<Test>::get(), Some(2u64)); | ||||
|     }); | ||||
| 
 | ||||
|     new_test_ext(1).execute_with(|| { | ||||
|         assert_noop!( | ||||
|             Sudo::set_key(RuntimeOrigin::signed(2), 3), | ||||
|             Error::<Test>::RequireSudo | ||||
|         ); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| #[test] | ||||
| fn set_key_emits_events_correctly() { | ||||
|     new_test_ext(1).execute_with(|| { | ||||
|         assert_ok!(Sudo::set_key(RuntimeOrigin::signed(1), 2)); | ||||
|         System::assert_has_event(TestEvent::Sudo(Event::KeyChanged { | ||||
|             old: Some(1), | ||||
|             new: 2, | ||||
|         })); | ||||
|         assert_ok!(Sudo::set_key(RuntimeOrigin::signed(2), 4)); | ||||
|         System::assert_has_event(TestEvent::Sudo(Event::KeyChanged { | ||||
|             old: Some(2), | ||||
|             new: 4, | ||||
|         })); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| #[test] | ||||
| fn remove_key_works() { | ||||
|     new_test_ext(1).execute_with(|| { | ||||
|         assert_ok!(Sudo::remove_key(RuntimeOrigin::signed(1))); | ||||
|         assert!(Key::<Test>::get().is_none()); | ||||
|         System::assert_has_event(TestEvent::Sudo(Event::KeyRemoved {})); | ||||
| 
 | ||||
|         assert_noop!( | ||||
|             Sudo::remove_key(RuntimeOrigin::signed(1)), | ||||
|             Error::<Test>::RequireSudo | ||||
|         ); | ||||
|         assert_noop!( | ||||
|             Sudo::set_key(RuntimeOrigin::signed(1), 1), | ||||
|             Error::<Test>::RequireSudo | ||||
|         ); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| #[test] | ||||
| fn using_root_origin_works() { | ||||
|     new_test_ext(1).execute_with(|| { | ||||
|         assert_ok!(Sudo::remove_key(RuntimeOrigin::root())); | ||||
|         assert!(Key::<Test>::get().is_none()); | ||||
|         System::assert_has_event(TestEvent::Sudo(Event::KeyRemoved {})); | ||||
| 
 | ||||
|         assert_ok!(Sudo::set_key(RuntimeOrigin::root(), 1)); | ||||
|         assert_eq!(Some(1), Key::<Test>::get()); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| #[test] | ||||
| fn sudo_as_basics() { | ||||
|     new_test_ext(1).execute_with(|| { | ||||
|         let call = Box::new(RuntimeCall::Logger(LoggerCall::privileged_i32_log { | ||||
|             i: 42, | ||||
|             weight: Weight::from_parts(1_000, 0), | ||||
|         })); | ||||
|         assert_ok!(Sudo::sudo_as(RuntimeOrigin::signed(1), 2, call)); | ||||
|         assert!(Logger::i32_log().is_empty()); | ||||
|         assert!(Logger::account_log().is_empty()); | ||||
| 
 | ||||
|         let call = Box::new(RuntimeCall::Logger(LoggerCall::non_privileged_log { | ||||
|             i: 42, | ||||
|             weight: Weight::from_parts(1, 0), | ||||
|         })); | ||||
|         assert_noop!( | ||||
|             Sudo::sudo_as(RuntimeOrigin::signed(3), 2, call), | ||||
|             Error::<Test>::RequireSudo | ||||
|         ); | ||||
| 
 | ||||
|         let call = Box::new(RuntimeCall::Logger(LoggerCall::non_privileged_log { | ||||
|             i: 42, | ||||
|             weight: Weight::from_parts(1, 0), | ||||
|         })); | ||||
|         assert_ok!(Sudo::sudo_as(RuntimeOrigin::signed(1), 2, call)); | ||||
|         assert_eq!(Logger::i32_log(), vec![42i32]); | ||||
|         assert_eq!(Logger::account_log(), vec![2]); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| #[docify::export] | ||||
| #[test] | ||||
| fn sudo_as_emits_events_correctly() { | ||||
|     new_test_ext(1).execute_with(|| { | ||||
|         let call = Box::new(RuntimeCall::Logger(LoggerCall::non_privileged_log { | ||||
|             i: 42, | ||||
|             weight: Weight::from_parts(1, 0), | ||||
|         })); | ||||
|         assert_ok!(Sudo::sudo_as(RuntimeOrigin::signed(1), 2, call)); | ||||
|         System::assert_has_event(TestEvent::Sudo(Event::SudoAsDone { | ||||
|             sudo_result: Ok(()), | ||||
|         })); | ||||
|     }); | ||||
| } | ||||
| @ -1,156 +0,0 @@ | ||||
| // This file is part of Ghost Network.
 | ||||
| 
 | ||||
| // Ghost Network is free software: you can redistribute it and/or modify
 | ||||
| // it under the terms of the GNU General Public License as published by
 | ||||
| // the Free Software Foundation, either version 3 of the License, or
 | ||||
| // (at your option) any later version.
 | ||||
| 
 | ||||
| // Ghost Network 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 General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| // along with Ghost Network.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| //! Autogenerated weights for `ghost_sudo`
 | ||||
| //!
 | ||||
| //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
 | ||||
| //! DATE: 2025-07-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 | ||||
| //! WORST CASE MAP SIZE: `1000000`
 | ||||
| //! HOSTNAME: `ghostown`, CPU: `Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz`
 | ||||
| //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("casper-dev")`, DB CACHE: 1024
 | ||||
| 
 | ||||
| // Executed Command:
 | ||||
| // ./target/release/ghost
 | ||||
| // benchmark
 | ||||
| // pallet
 | ||||
| // --chain=casper-dev
 | ||||
| // --steps=50
 | ||||
| // --repeat=20
 | ||||
| // --pallet=ghost-sudo
 | ||||
| // --extrinsic=*
 | ||||
| // --wasm-execution=compiled
 | ||||
| // --heap-pages=4096
 | ||||
| // --header=./file_header.txt
 | ||||
| // --output=./runtime/casper/src/weights/ghost_sudo.rs
 | ||||
| 
 | ||||
| #![cfg_attr(rustfmt, rustfmt_skip)] | ||||
| #![allow(unused_parens)] | ||||
| #![allow(unused_imports)] | ||||
| #![allow(missing_docs)] | ||||
| 
 | ||||
| use frame_support::{ | ||||
|     traits::Get, 
 | ||||
|     weights::{Weight, constants::RocksDbWeight}, | ||||
| }; | ||||
| use core::marker::PhantomData; | ||||
| 
 | ||||
| /// Weight functions needed for `pallet_sudo`.
 | ||||
| pub trait WeightInfo { | ||||
| 	fn set_key() -> Weight; | ||||
| 	fn sudo() -> Weight; | ||||
| 	fn sudo_as() -> Weight; | ||||
| 	fn remove_key() -> Weight; | ||||
| } | ||||
| 
 | ||||
| /// Weight functions for `ghost_sudo`.
 | ||||
| pub struct SubstrateWeight<T>(PhantomData<T>); | ||||
| impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> { | ||||
| 	/// Storage: `GhostSudo::Key` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSudo::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: 40_014_000 picoseconds.
 | ||||
| 		Weight::from_parts(40_856_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 1517)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostSudo::Key` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSudo::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: 44_086_000 picoseconds.
 | ||||
| 		Weight::from_parts(45_920_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 1517)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostSudo::Key` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSudo::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: 44_106_000 picoseconds.
 | ||||
| 		Weight::from_parts(44_650_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 1517)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostSudo::Key` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSudo::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: 36_416_000 picoseconds.
 | ||||
| 		Weight::from_parts(37_373_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 1517)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // For backwards compatibility and tests.
 | ||||
| impl WeightInfo for () { | ||||
| 	/// Storage: `GhostSudo::Key` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSudo::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: 40_014_000 picoseconds.
 | ||||
| 		Weight::from_parts(40_856_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 1517)) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostSudo::Key` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSudo::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: 44_086_000 picoseconds.
 | ||||
| 		Weight::from_parts(45_920_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 1517)) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostSudo::Key` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSudo::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: 44_106_000 picoseconds.
 | ||||
| 		Weight::from_parts(44_650_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 1517)) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostSudo::Key` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSudo::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: 36_416_000 picoseconds.
 | ||||
| 		Weight::from_parts(37_373_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 1517)) | ||||
| 			.saturating_add(RocksDbWeight::get().reads(1)) | ||||
| 			.saturating_add(RocksDbWeight::get().writes(1)) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										6
									
								
								pallets/traits/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										6
									
								
								pallets/traits/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -1,6 +1,6 @@ | ||||
| [package] | ||||
| name = "ghost-traits" | ||||
| version = "0.3.23" | ||||
| version = "0.3.19" | ||||
| license.workspace = true | ||||
| authors.workspace = true | ||||
| edition.workspace = true | ||||
| @ -14,6 +14,6 @@ sp-runtime = { workspace = true } | ||||
| [features] | ||||
| default = ["std"] | ||||
| std = [ | ||||
|     "frame-support/std", | ||||
|     "sp-runtime/std", | ||||
| 	"frame-support/std", | ||||
| 	"sp-runtime/std", | ||||
| ] | ||||
|  | ||||
							
								
								
									
										0
									
								
								pallets/traits/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								pallets/traits/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
								
								
									
										26
									
								
								pallets/traits/src/networks.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										26
									
								
								pallets/traits/src/networks.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -1,7 +1,10 @@ | ||||
| use frame_support::{pallet_prelude::*, storage::PrefixIterator}; | ||||
| use frame_support::{ | ||||
|     pallet_prelude::*, | ||||
|     storage::PrefixIterator, | ||||
| }; | ||||
| use sp_runtime::{ | ||||
|     traits::{AtLeast32BitUnsigned, Member}, | ||||
|     DispatchResult, | ||||
|     traits::{AtLeast32BitUnsigned, Member}, | ||||
| }; | ||||
| 
 | ||||
| pub trait NetworkDataBasicHandler { | ||||
| @ -18,26 +21,9 @@ pub trait NetworkDataBasicHandler { | ||||
| pub trait NetworkDataInspectHandler<Network>: NetworkDataBasicHandler { | ||||
|     fn get(n: &Self::NetworkId) -> Option<Network>; | ||||
|     fn iter() -> PrefixIterator<(Self::NetworkId, Network)>; | ||||
|     fn is_nullification_period() -> bool; | ||||
| } | ||||
| 
 | ||||
| pub trait NetworkDataMutateHandler<Network, Balance>: NetworkDataInspectHandler<Network> { | ||||
| pub trait NetworkDataMutateHandler<Network>: NetworkDataInspectHandler<Network> { | ||||
|     fn register(chain_id: Self::NetworkId, network: Network) -> DispatchResult; | ||||
|     fn remove(chain_id: Self::NetworkId) -> DispatchResult; | ||||
| 
 | ||||
|     fn increase_gatekeeper_amount( | ||||
|         chain_id: &Self::NetworkId, | ||||
|         amount: &Balance, | ||||
|     ) -> Result<Balance, ()>; | ||||
|     fn decrease_gatekeeper_amount( | ||||
|         chain_id: &Self::NetworkId, | ||||
|         amount: &Balance, | ||||
|     ) -> Result<Balance, ()>; | ||||
| 
 | ||||
|     fn accumulate_outgoing_imbalance(amount: &Balance) -> Result<Balance, ()>; | ||||
|     fn accumulate_incoming_imbalance(amount: &Balance) -> Result<Balance, ()>; | ||||
| 
 | ||||
|     fn accumulate_commission(commission: &Balance) -> Result<Balance, ()>; | ||||
|     fn nullify_commission(); | ||||
|     fn trigger_nullification(); | ||||
| } | ||||
|  | ||||
							
								
								
									
										0
									
								
								rpc/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								rpc/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
								
								
									
										56
									
								
								rpc/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										56
									
								
								rpc/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -1,15 +1,17 @@ | ||||
| use std::sync::Arc; | ||||
| 
 | ||||
| use babe_primitives::BabeApi; | ||||
| use block_builder_api::BlockBuilder; | ||||
| use consensus_common::SelectChain; | ||||
| use grandpa::FinalityProofProvider; | ||||
| use jsonrpsee::RpcModule; | ||||
| use primitives::{AccountId, Balance, Block, BlockNumber, Hash, Nonce}; | ||||
| use primitives::{ | ||||
|     AccountId, Balance, Block, BlockNumber, Hash, Nonce, | ||||
| }; | ||||
| use sc_client_api::AuxStore; | ||||
| use grandpa::FinalityProofProvider; | ||||
| pub use sc_rpc::{DenyUnsafe, SubscriptionTaskExecutor}; | ||||
| use sp_api::ProvideRuntimeApi; | ||||
| use block_builder_api::BlockBuilder; | ||||
| use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata}; | ||||
| use consensus_common::SelectChain; | ||||
| use babe_primitives::BabeApi; | ||||
| use sp_keystore::KeystorePtr; | ||||
| use tx_pool_api::TransactionPool; | ||||
| 
 | ||||
| @ -59,16 +61,7 @@ pub struct FullDeps<C, P, SC, B> { | ||||
| } | ||||
| 
 | ||||
| pub fn create_full_rpc<C, P, SC, B>( | ||||
|     FullDeps { | ||||
|         client, | ||||
|         pool, | ||||
|         select_chain, | ||||
|         chain_spec, | ||||
|         deny_unsafe, | ||||
|         babe, | ||||
|         grandpa, | ||||
|         backend, | ||||
|     }: FullDeps<C, P, SC, B>, | ||||
|     FullDeps { client, pool, select_chain, chain_spec, deny_unsafe, babe, grandpa, backend } : FullDeps<C, P, SC, B>, | ||||
| ) -> Result<RpcExtension, Box<dyn std::error::Error + Send + Sync>> | ||||
| where | ||||
|     C: ProvideRuntimeApi<Block> | ||||
| @ -87,19 +80,20 @@ where | ||||
|     B: sc_client_api::Backend<Block> + Send + Sync + 'static, | ||||
|     B::State: sc_client_api::StateBackend<sp_runtime::traits::HashingFor<Block>>, | ||||
| { | ||||
|     use babe_rpc::{Babe, BabeApiServer}; | ||||
|     use frame_rpc_system::{System, SystemApiServer}; | ||||
|     use pallet_transaction_payment_rpc::{ | ||||
|         TransactionPayment, TransactionPaymentApiServer, | ||||
|     }; | ||||
|     use babe_rpc::{Babe, BabeApiServer}; | ||||
|     use grandpa_rpc::{Grandpa, GrandpaApiServer}; | ||||
|     use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; | ||||
|     use sc_rpc_spec_v2::chain_spec::{ChainSpec, ChainSpecApiServer}; | ||||
|     use sc_sync_state_rpc::{SyncState, SyncStateApiServer}; | ||||
|     use substrate_state_trie_migration_rpc::{StateMigration, StateMigrationApiServer}; | ||||
|     use substrate_state_trie_migration_rpc::{ | ||||
|         StateMigration, StateMigrationApiServer, | ||||
|     }; | ||||
| 
 | ||||
|     let mut io = RpcModule::new(()); | ||||
|     let BabeDeps { | ||||
|         babe_worker_handle, | ||||
|         keystore, | ||||
|     } = babe; | ||||
|     let BabeDeps { babe_worker_handle, keystore } = babe; | ||||
|     let GrandpaDeps { | ||||
|         shared_voter_state, | ||||
|         shared_authority_set, | ||||
| @ -109,13 +103,10 @@ where | ||||
|     } = grandpa; | ||||
| 
 | ||||
|     let chain_name = chain_spec.name().to_string(); | ||||
|     let genesis_hash = client | ||||
|         .hash(0) | ||||
|         .ok() | ||||
|         .flatten() | ||||
|         .expect("Genesis block exists; qed;"); | ||||
|     let genesis_hash = client.hash(0).ok().flatten().expect("Genesis block exists; qed;"); | ||||
|     let properties = chain_spec.properties(); | ||||
| 
 | ||||
| 
 | ||||
|     io.merge(ChainSpec::new(chain_name, genesis_hash, properties).into_rpc())?; | ||||
|     io.merge(StateMigration::new(client.clone(), backend.clone(), deny_unsafe).into_rpc())?; | ||||
|     io.merge(System::new(client.clone(), pool.clone(), deny_unsafe).into_rpc())?; | ||||
| @ -128,8 +119,7 @@ where | ||||
|             keystore, | ||||
|             select_chain, | ||||
|             deny_unsafe, | ||||
|         ) | ||||
|         .into_rpc(), | ||||
|         ).into_rpc() | ||||
|     )?; | ||||
| 
 | ||||
|     io.merge( | ||||
| @ -139,8 +129,7 @@ where | ||||
|             shared_voter_state, | ||||
|             justification_stream, | ||||
|             finality_provider, | ||||
|         ) | ||||
|         .into_rpc(), | ||||
|         ).into_rpc(), | ||||
|     )?; | ||||
| 
 | ||||
|     io.merge( | ||||
| @ -148,9 +137,8 @@ where | ||||
|             chain_spec, | ||||
|             client.clone(), | ||||
|             shared_authority_set, | ||||
|             babe_worker_handle, | ||||
|         )? | ||||
|         .into_rpc(), | ||||
|             babe_worker_handle | ||||
|         )?.into_rpc(), | ||||
|     )?; | ||||
| 
 | ||||
|     Ok(io) | ||||
|  | ||||
							
								
								
									
										6
									
								
								runtime/casper/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										6
									
								
								runtime/casper/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -1,6 +1,6 @@ | ||||
| [package] | ||||
| name = "casper-runtime" | ||||
| version = "3.5.31" | ||||
| version = "3.5.19" | ||||
| build = "build.rs" | ||||
| description = "Runtime of the Casper Network" | ||||
| edition.workspace = true | ||||
| @ -87,7 +87,6 @@ pallet-whitelist = { workspace = true } | ||||
| ghost-networks = { workspace = true } | ||||
| ghost-claims = { workspace = true } | ||||
| ghost-slow-clap = { workspace = true } | ||||
| ghost-sudo = { workspace = true } | ||||
| casper-runtime-constants = { workspace = true } | ||||
| runtime-common = { workspace = true } | ||||
| primitives = { workspace = true } | ||||
| @ -206,7 +205,6 @@ std = [ | ||||
|     "ghost-networks/std", | ||||
|     "ghost-claims/std", | ||||
|     "ghost-slow-clap/std", | ||||
|     "ghost-sudo/std", | ||||
|     "casper-runtime-constants/std", | ||||
|     "runtime-common/std", | ||||
|     "primitives/std", | ||||
| @ -254,7 +252,6 @@ runtime-benchmarks = [ | ||||
|     "ghost-networks/runtime-benchmarks", | ||||
|     "ghost-claims/runtime-benchmarks", | ||||
|     "ghost-slow-clap/runtime-benchmarks", | ||||
|     "ghost-sudo/runtime-benchmarks", | ||||
|     "runtime-common/runtime-benchmarks", | ||||
| ] | ||||
| try-runtime = [ | ||||
| @ -300,6 +297,5 @@ try-runtime = [ | ||||
|     "ghost-networks/try-runtime", | ||||
|     "ghost-claims/try-runtime", | ||||
|     "ghost-slow-clap/try-runtime", | ||||
|     "ghost-sudo/try-runtime", | ||||
|     "runtime-common/try-runtime", | ||||
| ] | ||||
|  | ||||
							
								
								
									
										0
									
								
								runtime/casper/build.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								runtime/casper/build.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
								
								
									
										3
									
								
								runtime/casper/constants/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										3
									
								
								runtime/casper/constants/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -28,6 +28,3 @@ std = [ | ||||
| 	"sp-runtime/std", | ||||
| 	"sp-weights/std", | ||||
| ] | ||||
| 
 | ||||
| # Set timing constants (e.g session period) to faster versions to speed up testing. | ||||
| fast-runtime = [] | ||||
|  | ||||
							
								
								
									
										10
									
								
								runtime/casper/constants/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										10
									
								
								runtime/casper/constants/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -10,15 +10,15 @@ pub mod currency { | ||||
| 
 | ||||
|     /// Constant values used within runtime.
 | ||||
|     pub const FTSO: Balance = 1_000_000_000; // 10^9
 | ||||
|     pub const STNK: Balance = 1_000 * FTSO; // 10^12
 | ||||
|     pub const STRH: Balance = 1_000 * STNK; // 10^15
 | ||||
|     pub const CSPR: Balance = 1_000 * STRH; // 10^18
 | ||||
|     pub const STNK: Balance = 1_000 * FTSO;  // 10^12
 | ||||
|     pub const STRH: Balance = 1_000 * STNK;  // 10^15
 | ||||
|     pub const CSPR: Balance = 1_000 * STRH;  // 10^18
 | ||||
| 
 | ||||
|     /// The existential deposit.
 | ||||
|     pub const EXISTENTIAL_DEPOSIT: Balance = STNK; | ||||
| 
 | ||||
|     pub const fn deposit(items: u32, bytes: u32) -> Balance { | ||||
|         (items as Balance) * 200 * STRH + (bytes as Balance) * 1000 * STNK | ||||
|         (items as Balance) * 200 * STRH + (bytes as Balance) * 1000  * STNK | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -86,7 +86,7 @@ pub mod fee { | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::{ | ||||
|         currency::{CSPR, STNK, STRH}, | ||||
|         currency::{STNK, STRH, CSPR}, | ||||
|         fee::WeightToFee, | ||||
|     }; | ||||
|     use crate::weights::ExtrinsicBaseWeight; | ||||
|  | ||||
| @ -37,43 +37,43 @@ 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: 64_363_191, 66_078_314
 | ||||
|     ///   Average:  64_551_214
 | ||||
|     ///   Median:   64_500_078
 | ||||
|     ///   Std-Dev:  229678.99
 | ||||
|     ///
 | ||||
|     /// Percentiles nanoseconds:
 | ||||
|     ///   99th: 65_668_012
 | ||||
|     ///   95th: 64_888_421
 | ||||
|     ///   75th: 64_563_448
 | ||||
|     pub const BlockExecutionWeight: Weight = | ||||
|         Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS.saturating_mul(64_551_214), 0); | ||||
| 	/// Time to execute an empty block.
 | ||||
| 	/// Calculated by multiplying the *Average* with `1.0` and adding `0`.
 | ||||
| 	///
 | ||||
| 	/// Stats nanoseconds:
 | ||||
| 	///   Min, Max: 64_363_191, 66_078_314
 | ||||
| 	///   Average:  64_551_214
 | ||||
| 	///   Median:   64_500_078
 | ||||
| 	///   Std-Dev:  229678.99
 | ||||
| 	///
 | ||||
| 	/// Percentiles nanoseconds:
 | ||||
| 	///   99th: 65_668_012
 | ||||
| 	///   95th: 64_888_421
 | ||||
| 	///   75th: 64_563_448
 | ||||
| 	pub const BlockExecutionWeight: Weight = | ||||
| 		Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS.saturating_mul(64_551_214), 0); | ||||
| } | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod test_weights { | ||||
|     use sp_weights::constants; | ||||
| 	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(); | ||||
| 	/// 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." | ||||
|         ); | ||||
|     } | ||||
| 		// 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." | ||||
| 		); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -37,43 +37,43 @@ 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: 402_868, 1_292_427
 | ||||
|     ///   Average:  565_926
 | ||||
|     ///   Median:   414_626
 | ||||
|     ///   Std-Dev:  283192.19
 | ||||
|     ///
 | ||||
|     /// Percentiles nanoseconds:
 | ||||
|     ///   99th: 1_251_123
 | ||||
|     ///   95th: 1_196_903
 | ||||
|     ///   75th: 491_329
 | ||||
|     pub const ExtrinsicBaseWeight: Weight = | ||||
|         Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS.saturating_mul(565_926), 0); | ||||
| 	/// 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: 402_868, 1_292_427
 | ||||
| 	///   Average:  565_926
 | ||||
| 	///   Median:   414_626
 | ||||
| 	///   Std-Dev:  283192.19
 | ||||
| 	///
 | ||||
| 	/// Percentiles nanoseconds:
 | ||||
| 	///   99th: 1_251_123
 | ||||
| 	///   95th: 1_196_903
 | ||||
| 	///   75th: 491_329
 | ||||
| 	pub const ExtrinsicBaseWeight: Weight = | ||||
| 		Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS.saturating_mul(565_926), 0); | ||||
| } | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod test_weights { | ||||
|     use sp_weights::constants; | ||||
| 	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(); | ||||
| 	/// 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." | ||||
|         ); | ||||
|     } | ||||
| 		// 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." | ||||
| 		); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -1,9 +1,9 @@ | ||||
| pub mod block_weights; | ||||
| pub mod extrinsic_weights; | ||||
| pub mod paritydb_weights; | ||||
| pub mod rocksdb_weights; | ||||
| pub mod paritydb_weights; | ||||
| 
 | ||||
| pub use block_weights::BlockExecutionWeight; | ||||
| pub use extrinsic_weights::ExtrinsicBaseWeight; | ||||
| pub use paritydb_weights::constants::ParityDbWeight; | ||||
| pub use rocksdb_weights::constants::RocksDbWeight; | ||||
| pub use paritydb_weights::constants::ParityDbWeight; | ||||
|  | ||||
| @ -37,47 +37,47 @@ | ||||
| 
 | ||||
| /// Storage DB weights for the `Development` runtime and `ParityDb`.
 | ||||
| pub mod constants { | ||||
|     use frame_support::weights::constants; | ||||
|     use sp_core::parameter_types; | ||||
|     use sp_weights::RuntimeDbWeight; | ||||
| 	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 { | ||||
|             read: 40_820 * constants::WEIGHT_REF_TIME_PER_NANOS, | ||||
|             write: 293_659 * constants::WEIGHT_REF_TIME_PER_NANOS, | ||||
|         }; | ||||
|     } | ||||
| 	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 { | ||||
| 			read: 40_820 * constants::WEIGHT_REF_TIME_PER_NANOS, | ||||
| 			write: 293_659 * constants::WEIGHT_REF_TIME_PER_NANOS, | ||||
| 		}; | ||||
| 	} | ||||
| 
 | ||||
|     #[cfg(test)] | ||||
|     mod test_db_weights { | ||||
|         use super::constants::ParityDbWeight as W; | ||||
|         use sp_weights::constants; | ||||
| 	#[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." | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
| 		/// 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." | ||||
| 			); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -36,47 +36,47 @@ | ||||
| 
 | ||||
| /// Storage DB weights for the `Development` runtime and `RocksDb`.
 | ||||
| pub mod constants { | ||||
|     use frame_support::weights::constants; | ||||
|     use sp_core::parameter_types; | ||||
|     use sp_weights::RuntimeDbWeight; | ||||
| 	use frame_support::weights::constants; | ||||
| 	use sp_core::parameter_types; | ||||
| 	use sp_weights::RuntimeDbWeight; | ||||
| 
 | ||||
|     parameter_types! { | ||||
|         /// By default, Substrate uses `RocksDB`, so this will be the weight used throughout
 | ||||
|         /// the runtime.
 | ||||
|         pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { | ||||
|             read: 31_627 * constants::WEIGHT_REF_TIME_PER_NANOS, | ||||
|             write: 412_279 * constants::WEIGHT_REF_TIME_PER_NANOS, | ||||
|         }; | ||||
|     } | ||||
| 	parameter_types! { | ||||
| 		/// By default, Substrate uses `RocksDB`, so this will be the weight used throughout
 | ||||
| 		/// the runtime.
 | ||||
| 		pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { | ||||
| 			read: 31_627 * constants::WEIGHT_REF_TIME_PER_NANOS, | ||||
| 			write: 412_279 * constants::WEIGHT_REF_TIME_PER_NANOS, | ||||
| 		}; | ||||
| 	} | ||||
| 
 | ||||
|     #[cfg(test)] | ||||
|     mod test_db_weights { | ||||
|         use super::constants::RocksDbWeight as W; | ||||
|         use sp_weights::constants; | ||||
| 	#[cfg(test)] | ||||
| 	mod test_db_weights { | ||||
| 		use super::constants::RocksDbWeight 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." | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
| 		/// 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." | ||||
| 			); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| 
 | ||||
| //! Autogenerated bag thresholds.
 | ||||
| //!
 | ||||
| //! Generated on 2024-06-30T17:36:29.986756974+00:00
 | ||||
| @ -18,204 +19,204 @@ pub const CONSTANT_RATIO: f64 = 1.1717610304252650; | ||||
| 
 | ||||
| /// Upper thresholds delimiting the bag list.
 | ||||
| pub const THRESHOLDS: [u64; 200] = [ | ||||
|     368_934, | ||||
|     432_302, | ||||
|     506_555, | ||||
|     593_561, | ||||
|     695_512, | ||||
|     814_974, | ||||
|     954_955, | ||||
|     1_118_979, | ||||
|     1_311_176, | ||||
|     1_536_385, | ||||
|     1_800_276, | ||||
|     2_109_493, | ||||
|     2_471_822, | ||||
|     2_896_385, | ||||
|     3_393_871, | ||||
|     3_976_806, | ||||
|     4_659_866, | ||||
|     5_460_249, | ||||
|     6_398_107, | ||||
|     7_497_052, | ||||
|     8_784_753, | ||||
|     10_293_631, | ||||
|     12_061_676, | ||||
|     14_133_402, | ||||
|     16_560_970, | ||||
|     19_405_499, | ||||
|     22_738_608, | ||||
|     26_644_215, | ||||
|     31_220_653, | ||||
|     36_583_145, | ||||
|     42_866_704, | ||||
|     50_229_533, | ||||
|     58_857_009, | ||||
|     68_966_350, | ||||
|     80_812_081, | ||||
|     94_692_447, | ||||
|     110_956_919, | ||||
|     130_014_994, | ||||
|     152_346_503, | ||||
|     178_513_695, | ||||
|     209_175_391, | ||||
|     245_103_572, | ||||
|     287_202_814, | ||||
|     336_533_065, | ||||
|     394_336_331, | ||||
|     462_067_946, | ||||
|     541_433_213, | ||||
|     634_430_340, | ||||
|     743_400_749, | ||||
|     871_088_028, | ||||
|     1_020_707_005, | ||||
|     1_196_024_692, | ||||
|     1_401_455_126, | ||||
|     1_642_170_503, | ||||
|     1_924_231_401, | ||||
|     2_254_739_369, | ||||
|     2_642_015_726, | ||||
|     3_095_811_069, | ||||
|     3_627_550_768, | ||||
|     4_250_622_626, | ||||
|     4_980_713_948, | ||||
|     5_836_206_508, | ||||
|     6_838_639_352, | ||||
|     8_013_251_094, | ||||
|     9_389_615_359, | ||||
|     11_002_385_368, | ||||
|     12_892_166_416, | ||||
|     15_106_538_204, | ||||
|     17_701_252_772, | ||||
|     20_741_638_188, | ||||
|     24_304_243_336, | ||||
|     28_478_765_215, | ||||
|     33_370_307_274, | ||||
|     39_102_025_637, | ||||
|     45_818_229_852, | ||||
|     53_688_016_224, | ||||
|     62_909_525_212, | ||||
|     73_714_930_086, | ||||
|     86_376_282_435, | ||||
|     101_212_361_710, | ||||
|     118_596_701_249, | ||||
|     138_966_992_861, | ||||
|     162_836_106_750, | ||||
|     190_805_004_236, | ||||
|     223_577_868_374, | ||||
|     261_979_833_426, | ||||
|     306_977_759_566, | ||||
|     359_704_575_867, | ||||
|     421_487_804_467, | ||||
|     493_882_984_074, | ||||
|     578_712_834_328, | ||||
|     678_113_147_073, | ||||
|     794_586_559_959, | ||||
|     931_065_566_260, | ||||
|     1_090_986_347_314, | ||||
|     1_278_375_286_509, | ||||
|     1_497_950_342_990, | ||||
|     1_755_239_837_428, | ||||
|     2_056_721_640_548, | ||||
|     2_409_986_268_826, | ||||
|     2_823_927_993_670, | ||||
|     3_308_968_775_710, | ||||
|     3_877_320_662_271, | ||||
|     4_543_293_254_512, | ||||
|     5_323_653_985_431, | ||||
|     6_238_050_279_596, | ||||
|     7_309_504_223_464, | ||||
|     8_564_992_200_784, | ||||
|     10_036_124_086_775, | ||||
|     11_759_939_101_395, | ||||
|     13_779_838_359_189, | ||||
|     16_146_677_594_857, | ||||
|     18_920_047_576_494, | ||||
|     22_169_774_443_928, | ||||
|     25_977_677_746_713, | ||||
|     30_439_630_444_544, | ||||
|     35_667_972_735_463, | ||||
|     41_794_340_485_686, | ||||
|     48_972_979_473_452, | ||||
|     57_384_628_890_807, | ||||
|     67_241_071_879_663, | ||||
|     78_790_467_672_613, | ||||
|     92_323_599_587_750, | ||||
|     108_181_196_185_512, | ||||
|     126_762_509_914_973, | ||||
|     148_535_369_237_262, | ||||
|     174_047_957_312_051, | ||||
|     203_942_613_803_381, | ||||
|     238_972_007_297_872, | ||||
|     280_018_085_514_148, | ||||
|     328_114_280_419_768, | ||||
|     384_471_527_321_912, | ||||
|     450_508_753_023_899, | ||||
|     527_888_600_658_885, | ||||
|     618_559_290_657_806, | ||||
|     724_803_671_800_312, | ||||
|     849_296_697_324_749, | ||||
|     995_172_773_194_022, | ||||
|     1_166_104_674_168_996, | ||||
|     1_366_396_014_587_981, | ||||
|     1_601_089_602_022_588, | ||||
|     1_876_094_401_869_165, | ||||
|     2_198_334_309_509_284, | ||||
|     2_575_922_475_729_812, | ||||
|     3_018_365_574_456_765, | ||||
|     3_536_803_155_725_606, | ||||
|     4_144_288_110_164_365, | ||||
|     4_856_115_306_345_371, | ||||
|     5_690_206_675_227_153, | ||||
|     6_667_562_437_096_890, | ||||
|     7_812_789_831_717_443, | ||||
|     9_154_722_663_709_264, | ||||
|     10_727_147_261_685_494, | ||||
|     12_569_653_128_876_154, | ||||
|     14_728_629_702_380_078, | ||||
|     17_258_434_316_813_044, | ||||
|     20_222_760_778_595_608, | ||||
|     23_696_243_007_970_824, | ||||
|     27_766_334_124_227_376, | ||||
|     32_535_508_284_536_868, | ||||
|     38_123_840_712_898_664, | ||||
|     44_672_030_877_514_808, | ||||
|     52_344_944_932_226_008, | ||||
|     61_335_766_611_338_904, | ||||
|     71_870_861_086_426_040, | ||||
|     84_215_474_244_181_664, | ||||
|     98_680_410_878_114_672, | ||||
|     115_629_859_933_328_176, | ||||
|     135_490_563_823_405_696, | ||||
|     158_762_562_678_613_984, | ||||
|     186_031_784_037_248_448, | ||||
|     217_984_794_955_336_608, | ||||
|     255_426_087_953_905_344, | ||||
|     299_298_336_018_362_496, | ||||
|     350_706_126_617_443_648, | ||||
|     410_943_772_301_709_248, | ||||
|     481_527_898_079_096_320, | ||||
|     564_235_626_031_673_920, | ||||
|     661_149_318_561_518_720, | ||||
|     774_709_006_782_606_976, | ||||
|     907_773_824_067_321_216, | ||||
|     1_063_693_991_482_207_616, | ||||
|     1_246_395_167_516_354_560, | ||||
|     1_460_477_285_806_034_432, | ||||
|     1_711_330_369_328_773_120, | ||||
|     2_005_270_236_962_732_544, | ||||
|     2_349_697_519_144_566_784, | ||||
|     2_753_283_986_220_526_592, | ||||
|     3_226_190_880_747_145_216, | ||||
|     3_780_324_750_772_868_096, | ||||
|     4_429_637_225_307_749_376, | ||||
|     5_190_476_279_536_719_872, | ||||
|     6_081_997_833_707_842_560, | ||||
|     7_126_648_048_669_730_816, | ||||
|     8_350_728_460_987_448_320, | ||||
|     9_785_058_186_248_239_104, | ||||
|     11_465_749_863_089_412_096, | ||||
|     13_435_118_874_171_990_016, | ||||
|     15_742_748_735_885_697_024, | ||||
|     18_446_744_073_709_551_615, | ||||
| 	                   368_934, | ||||
| 	                   432_302, | ||||
| 	                   506_555, | ||||
| 	                   593_561, | ||||
| 	                   695_512, | ||||
| 	                   814_974, | ||||
| 	                   954_955, | ||||
| 	                 1_118_979, | ||||
| 	                 1_311_176, | ||||
| 	                 1_536_385, | ||||
| 	                 1_800_276, | ||||
| 	                 2_109_493, | ||||
| 	                 2_471_822, | ||||
| 	                 2_896_385, | ||||
| 	                 3_393_871, | ||||
| 	                 3_976_806, | ||||
| 	                 4_659_866, | ||||
| 	                 5_460_249, | ||||
| 	                 6_398_107, | ||||
| 	                 7_497_052, | ||||
| 	                 8_784_753, | ||||
| 	                10_293_631, | ||||
| 	                12_061_676, | ||||
| 	                14_133_402, | ||||
| 	                16_560_970, | ||||
| 	                19_405_499, | ||||
| 	                22_738_608, | ||||
| 	                26_644_215, | ||||
| 	                31_220_653, | ||||
| 	                36_583_145, | ||||
| 	                42_866_704, | ||||
| 	                50_229_533, | ||||
| 	                58_857_009, | ||||
| 	                68_966_350, | ||||
| 	                80_812_081, | ||||
| 	                94_692_447, | ||||
| 	               110_956_919, | ||||
| 	               130_014_994, | ||||
| 	               152_346_503, | ||||
| 	               178_513_695, | ||||
| 	               209_175_391, | ||||
| 	               245_103_572, | ||||
| 	               287_202_814, | ||||
| 	               336_533_065, | ||||
| 	               394_336_331, | ||||
| 	               462_067_946, | ||||
| 	               541_433_213, | ||||
| 	               634_430_340, | ||||
| 	               743_400_749, | ||||
| 	               871_088_028, | ||||
| 	             1_020_707_005, | ||||
| 	             1_196_024_692, | ||||
| 	             1_401_455_126, | ||||
| 	             1_642_170_503, | ||||
| 	             1_924_231_401, | ||||
| 	             2_254_739_369, | ||||
| 	             2_642_015_726, | ||||
| 	             3_095_811_069, | ||||
| 	             3_627_550_768, | ||||
| 	             4_250_622_626, | ||||
| 	             4_980_713_948, | ||||
| 	             5_836_206_508, | ||||
| 	             6_838_639_352, | ||||
| 	             8_013_251_094, | ||||
| 	             9_389_615_359, | ||||
| 	            11_002_385_368, | ||||
| 	            12_892_166_416, | ||||
| 	            15_106_538_204, | ||||
| 	            17_701_252_772, | ||||
| 	            20_741_638_188, | ||||
| 	            24_304_243_336, | ||||
| 	            28_478_765_215, | ||||
| 	            33_370_307_274, | ||||
| 	            39_102_025_637, | ||||
| 	            45_818_229_852, | ||||
| 	            53_688_016_224, | ||||
| 	            62_909_525_212, | ||||
| 	            73_714_930_086, | ||||
| 	            86_376_282_435, | ||||
| 	           101_212_361_710, | ||||
| 	           118_596_701_249, | ||||
| 	           138_966_992_861, | ||||
| 	           162_836_106_750, | ||||
| 	           190_805_004_236, | ||||
| 	           223_577_868_374, | ||||
| 	           261_979_833_426, | ||||
| 	           306_977_759_566, | ||||
| 	           359_704_575_867, | ||||
| 	           421_487_804_467, | ||||
| 	           493_882_984_074, | ||||
| 	           578_712_834_328, | ||||
| 	           678_113_147_073, | ||||
| 	           794_586_559_959, | ||||
| 	           931_065_566_260, | ||||
| 	         1_090_986_347_314, | ||||
| 	         1_278_375_286_509, | ||||
| 	         1_497_950_342_990, | ||||
| 	         1_755_239_837_428, | ||||
| 	         2_056_721_640_548, | ||||
| 	         2_409_986_268_826, | ||||
| 	         2_823_927_993_670, | ||||
| 	         3_308_968_775_710, | ||||
| 	         3_877_320_662_271, | ||||
| 	         4_543_293_254_512, | ||||
| 	         5_323_653_985_431, | ||||
| 	         6_238_050_279_596, | ||||
| 	         7_309_504_223_464, | ||||
| 	         8_564_992_200_784, | ||||
| 	        10_036_124_086_775, | ||||
| 	        11_759_939_101_395, | ||||
| 	        13_779_838_359_189, | ||||
| 	        16_146_677_594_857, | ||||
| 	        18_920_047_576_494, | ||||
| 	        22_169_774_443_928, | ||||
| 	        25_977_677_746_713, | ||||
| 	        30_439_630_444_544, | ||||
| 	        35_667_972_735_463, | ||||
| 	        41_794_340_485_686, | ||||
| 	        48_972_979_473_452, | ||||
| 	        57_384_628_890_807, | ||||
| 	        67_241_071_879_663, | ||||
| 	        78_790_467_672_613, | ||||
| 	        92_323_599_587_750, | ||||
| 	       108_181_196_185_512, | ||||
| 	       126_762_509_914_973, | ||||
| 	       148_535_369_237_262, | ||||
| 	       174_047_957_312_051, | ||||
| 	       203_942_613_803_381, | ||||
| 	       238_972_007_297_872, | ||||
| 	       280_018_085_514_148, | ||||
| 	       328_114_280_419_768, | ||||
| 	       384_471_527_321_912, | ||||
| 	       450_508_753_023_899, | ||||
| 	       527_888_600_658_885, | ||||
| 	       618_559_290_657_806, | ||||
| 	       724_803_671_800_312, | ||||
| 	       849_296_697_324_749, | ||||
| 	       995_172_773_194_022, | ||||
| 	     1_166_104_674_168_996, | ||||
| 	     1_366_396_014_587_981, | ||||
| 	     1_601_089_602_022_588, | ||||
| 	     1_876_094_401_869_165, | ||||
| 	     2_198_334_309_509_284, | ||||
| 	     2_575_922_475_729_812, | ||||
| 	     3_018_365_574_456_765, | ||||
| 	     3_536_803_155_725_606, | ||||
| 	     4_144_288_110_164_365, | ||||
| 	     4_856_115_306_345_371, | ||||
| 	     5_690_206_675_227_153, | ||||
| 	     6_667_562_437_096_890, | ||||
| 	     7_812_789_831_717_443, | ||||
| 	     9_154_722_663_709_264, | ||||
| 	    10_727_147_261_685_494, | ||||
| 	    12_569_653_128_876_154, | ||||
| 	    14_728_629_702_380_078, | ||||
| 	    17_258_434_316_813_044, | ||||
| 	    20_222_760_778_595_608, | ||||
| 	    23_696_243_007_970_824, | ||||
| 	    27_766_334_124_227_376, | ||||
| 	    32_535_508_284_536_868, | ||||
| 	    38_123_840_712_898_664, | ||||
| 	    44_672_030_877_514_808, | ||||
| 	    52_344_944_932_226_008, | ||||
| 	    61_335_766_611_338_904, | ||||
| 	    71_870_861_086_426_040, | ||||
| 	    84_215_474_244_181_664, | ||||
| 	    98_680_410_878_114_672, | ||||
| 	   115_629_859_933_328_176, | ||||
| 	   135_490_563_823_405_696, | ||||
| 	   158_762_562_678_613_984, | ||||
| 	   186_031_784_037_248_448, | ||||
| 	   217_984_794_955_336_608, | ||||
| 	   255_426_087_953_905_344, | ||||
| 	   299_298_336_018_362_496, | ||||
| 	   350_706_126_617_443_648, | ||||
| 	   410_943_772_301_709_248, | ||||
| 	   481_527_898_079_096_320, | ||||
| 	   564_235_626_031_673_920, | ||||
| 	   661_149_318_561_518_720, | ||||
| 	   774_709_006_782_606_976, | ||||
| 	   907_773_824_067_321_216, | ||||
| 	 1_063_693_991_482_207_616, | ||||
| 	 1_246_395_167_516_354_560, | ||||
| 	 1_460_477_285_806_034_432, | ||||
| 	 1_711_330_369_328_773_120, | ||||
| 	 2_005_270_236_962_732_544, | ||||
| 	 2_349_697_519_144_566_784, | ||||
| 	 2_753_283_986_220_526_592, | ||||
| 	 3_226_190_880_747_145_216, | ||||
| 	 3_780_324_750_772_868_096, | ||||
| 	 4_429_637_225_307_749_376, | ||||
| 	 5_190_476_279_536_719_872, | ||||
| 	 6_081_997_833_707_842_560, | ||||
| 	 7_126_648_048_669_730_816, | ||||
| 	 8_350_728_460_987_448_320, | ||||
| 	 9_785_058_186_248_239_104, | ||||
| 	11_465_749_863_089_412_096, | ||||
| 	13_435_118_874_171_990_016, | ||||
| 	15_742_748_735_885_697_024, | ||||
| 	18_446_744_073_709_551_615, | ||||
| ]; | ||||
|  | ||||
							
								
								
									
										56
									
								
								runtime/casper/src/cult/mod.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										56
									
								
								runtime/casper/src/cult/mod.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -2,34 +2,25 @@ use super::*; | ||||
| use frame_support::{ | ||||
|     parameter_types, | ||||
|     traits::{ | ||||
|         tokens::pay::PayFromAccount, EitherOf, EitherOfDiverse, MapSuccess, OriginTrait, | ||||
|         TryWithMorphedArg, | ||||
|         EitherOf, EitherOfDiverse, MapSuccess, OriginTrait, TryWithMorphedArg, | ||||
|         tokens::pay::PayFromAccount, | ||||
|     }, | ||||
| }; | ||||
| use frame_system::EnsureRootWithSuccess; | ||||
| use pallet_ranked_collective::EnsureOfRank; | ||||
| use sp_core::{ConstU128, ConstU32}; | ||||
| use sp_runtime::traits::{ConstU16, TakeFirst}; | ||||
| use pallet_ranked_collective::EnsureOfRank; | ||||
| 
 | ||||
| use crate::{ | ||||
|     AccountId, | ||||
|     Balance, | ||||
|     Balances, | ||||
|     Preimage, | ||||
|     Runtime, | ||||
|     // weights,
 | ||||
|     RuntimeCall, | ||||
|     RuntimeEvent, | ||||
|     Scheduler, | ||||
|     TreasuryAccount, | ||||
|     CSPR, | ||||
|     DAYS, | ||||
|     // weights, 
 | ||||
|     RuntimeCall, RuntimeEvent, Scheduler, DAYS, CSPR, AccountId, Balance, 
 | ||||
|     TreasuryAccount, Balances, Preimage, Runtime, 
 | ||||
| }; | ||||
| 
 | ||||
| mod origins; | ||||
| pub use origins::{ | ||||
|     pallet_cult_origins, CultTreasurySpender, Degens, EnsureCanPromoteTo, EnsureCanRetainAt, | ||||
|     EnsureCult, Geniuses, Ghosts, Skeletons, ToVoice, Zombies, | ||||
|     pallet_cult_origins, Geniuses, Degens, Zombies, Skeletons, Ghosts, | ||||
|     EnsureCanRetainAt, EnsureCanPromoteTo, EnsureCult, ToVoice, CultTreasurySpender, | ||||
| }; | ||||
| 
 | ||||
| mod tracks; | ||||
| @ -54,10 +45,14 @@ parameter_types! { | ||||
| impl pallet_whitelist::Config for Runtime { | ||||
|     type RuntimeCall = RuntimeCall; | ||||
|     type RuntimeEvent = RuntimeEvent; | ||||
|     type WhitelistOrigin = | ||||
|         EitherOfDiverse<EnsureRootWithSuccess<Self::AccountId, ConstU16<65535>>, Skeletons>; | ||||
|     type DispatchWhitelistedOrigin = | ||||
|         EitherOf<EnsureRootWithSuccess<Self::AccountId, ConstU16<65535>>, Geniuses>; | ||||
|     type WhitelistOrigin = EitherOfDiverse< | ||||
|         EnsureRootWithSuccess<Self::AccountId, ConstU16<65535>>, | ||||
|         Skeletons, | ||||
|     >; | ||||
|     type DispatchWhitelistedOrigin = EitherOf< | ||||
|         EnsureRootWithSuccess<Self::AccountId, ConstU16<65535>>, | ||||
|         Geniuses, | ||||
|     >; | ||||
|     type Preimages = Preimage; | ||||
|     type WeightInfo = weights::pallet_whitelist::WeightInfo<Runtime>; | ||||
| } | ||||
| @ -70,13 +65,13 @@ parameter_types! { | ||||
| 
 | ||||
| pub type CultReferendaInstance = pallet_referenda::Instance1; | ||||
| impl pallet_referenda::Config<CultReferendaInstance> for Runtime { | ||||
|     type WeightInfo = weights::pallet_referenda::WeightInfo<Runtime>; | ||||
|     type WeightInfo = (); | ||||
|     type RuntimeCall = RuntimeCall; | ||||
|     type RuntimeEvent = RuntimeEvent; | ||||
|     type Scheduler = Scheduler; | ||||
|     type Currency = Balances; | ||||
|     type SubmitOrigin = EitherOf< | ||||
|         pallet_ranked_collective::EnsureMember<Runtime, CultCollectiveInstance, 3>, | ||||
|         pallet_ranked_collective::EnsureMember<Runtime, CultCollectiveInstance, 3>, 
 | ||||
|         MapSuccess< | ||||
|             TryWithMorphedArg< | ||||
|                 RuntimeOrigin, | ||||
| @ -86,7 +81,7 @@ impl pallet_referenda::Config<CultReferendaInstance> for Runtime { | ||||
|                 (AccountId, u16), | ||||
|             >, | ||||
|             TakeFirst, | ||||
|         >, | ||||
|         > 
 | ||||
|     >; | ||||
|     type CancelOrigin = Skeletons; | ||||
|     type KillOrigin = Ghosts; | ||||
| @ -105,7 +100,7 @@ pub type CultCollectiveInstance = pallet_ranked_collective::Instance1; | ||||
| impl pallet_ranked_collective::Config<CultCollectiveInstance> for Runtime { | ||||
|     type WeightInfo = weights::pallet_ranked_collective::WeightInfo<Runtime>; | ||||
|     type RuntimeEvent = RuntimeEvent; | ||||
| 
 | ||||
|     
 | ||||
|     #[cfg(not(feature = "runtime-benchmarks"))] | ||||
|     type PromoteOrigin = frame_system::EnsureNever<pallet_ranked_collective::Rank>; | ||||
|     #[cfg(feature = "runtime-benchmarks")] | ||||
| @ -128,7 +123,7 @@ impl pallet_ranked_collective::Config<CultCollectiveInstance> for Runtime { | ||||
|     type MinRankOfClass = tracks::MinRankOfClass; | ||||
|     type MemberSwappedHandler = (crate::CultCore, crate::CultSalary); | ||||
|     type VoteWeight = pallet_ranked_collective::Geometric; | ||||
| 
 | ||||
|     
 | ||||
|     #[cfg(feature = "runtime-benchmarks")] | ||||
|     type BenchmarkSetup = (crate::CultCore, crate::CultSalary); | ||||
| } | ||||
| @ -140,13 +135,10 @@ impl pallet_core_fellowship::Config<CultCoreInstance> for Runtime { | ||||
|     type Members = pallet_ranked_collective::Pallet<Runtime, CultCollectiveInstance>; | ||||
|     type Balance = Balance; | ||||
| 
 | ||||
|     type ParamsOrigin = | ||||
|         EitherOf<EnsureRootWithSuccess<Self::AccountId, ConstU16<65535>>, Skeletons>; | ||||
|     type ParamsOrigin = EitherOf<EnsureRootWithSuccess<Self::AccountId, ConstU16<65535>>, Skeletons>; | ||||
|     type InductOrigin = EitherOf<EnsureRootWithSuccess<Self::AccountId, ConstU16<65535>>, Zombies>; | ||||
|     type ApproveOrigin = | ||||
|         EitherOf<EnsureRootWithSuccess<Self::AccountId, ConstU16<65535>>, EnsureCanRetainAt>; | ||||
|     type PromoteOrigin = | ||||
|         EitherOf<EnsureRootWithSuccess<Self::AccountId, ConstU16<65535>>, EnsureCanPromoteTo>; | ||||
|     type ApproveOrigin = EitherOf<EnsureRootWithSuccess<Self::AccountId, ConstU16<65535>>, EnsureCanRetainAt>; | ||||
|     type PromoteOrigin = EitherOf<EnsureRootWithSuccess<Self::AccountId, ConstU16<65535>>, EnsureCanPromoteTo>; | ||||
| 
 | ||||
|     type EvidenceSize = ConstU32<65536>; | ||||
| } | ||||
|  | ||||
							
								
								
									
										4
									
								
								runtime/casper/src/cult/origins.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										4
									
								
								runtime/casper/src/cult/origins.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -5,8 +5,8 @@ pub use pallet_cult_origins::*; | ||||
| 
 | ||||
| #[frame_support::pallet] | ||||
| pub mod pallet_cult_origins { | ||||
|     use super::ranks; | ||||
|     use crate::{Balance, CSPR}; | ||||
|     use super::ranks; | ||||
|     use frame_support::pallet_prelude::*; | ||||
|     use pallet_ranked_collective::Rank; | ||||
| 
 | ||||
| @ -114,7 +114,7 @@ pub mod pallet_cult_origins { | ||||
|                 } | ||||
|                 #[cfg(feature = "runtime-benchmarks")] | ||||
|                 fn try_successful_origin() -> Result<O, ()> { | ||||
|                     // By convention the more privileged origins go later,
 | ||||
|                     // By convention the more privileged origins go later, 
 | ||||
|                     // so for greatest chance of success, we want the last one.
 | ||||
|                     let _result: Result<O, ()> = Err(()); | ||||
|                     $( | ||||
|  | ||||
							
								
								
									
										5
									
								
								runtime/casper/src/cult/tracks.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										5
									
								
								runtime/casper/src/cult/tracks.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -1,4 +1,4 @@ | ||||
| use crate::{Balance, BlockNumber, RuntimeOrigin, CSPR, DAYS, HOURS, MINUTES}; | ||||
| use crate::{Balance, BlockNumber, RuntimeOrigin, DAYS, CSPR, HOURS, MINUTES}; | ||||
| use pallet_ranked_collective::Rank; | ||||
| use sp_runtime::{traits::Convert, Perbill}; | ||||
| 
 | ||||
| @ -255,6 +255,7 @@ const TRACKS_DATA: [(u16, pallet_referenda::TrackInfo<Balance, BlockNumber>); 15 | ||||
|             min_support: RETAIN_MIN_SUPPORT, | ||||
|         }, | ||||
|     ), | ||||
| 
 | ||||
|     ( | ||||
|         constants::PROMOTE_TO_GENIUSES, | ||||
|         pallet_referenda::TrackInfo { | ||||
| @ -346,7 +347,7 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo { | ||||
|             // It is important that this is NOT availiable in production!
 | ||||
|             let root: Self::RuntimeOrigin = frame_system::RawOrigin::Root.into(); | ||||
|             if &root == id { | ||||
|                 return Ok(tracks::GHOSTS); | ||||
|                 return Ok(tracks::GHOSTS) | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | ||||
| @ -3,24 +3,24 @@ use pallet_staking::Forcing; | ||||
| use sp_staking::StakerStatus; | ||||
| 
 | ||||
| use crate::{opaque::SessionKeys, BABE_GENESIS_EPOCH_CONFIG}; | ||||
| use casper_runtime_constants::currency::CSPR; | ||||
| use primitives::{AccountId, AccountPublic}; | ||||
| use casper_runtime_constants::currency::CSPR; | ||||
| 
 | ||||
| use ghost_slow_clap::sr25519::AuthorityId as SlowClapId; | ||||
| use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; | ||||
| use babe_primitives::AuthorityId as BabeId; | ||||
| use ghost_slow_clap::sr25519::AuthorityId as SlowClapId; | ||||
| use grandpa_primitives::AuthorityId as GrandpaId; | ||||
| 
 | ||||
| use sp_core::{sr25519, Pair, Public}; | ||||
| use sp_runtime::{traits::IdentifyAccount, Perbill}; | ||||
| #[cfg(not(feature = "std"))] | ||||
| use sp_std::alloc::format; | ||||
| use sp_std::prelude::*; | ||||
| use sp_std::vec::Vec; | ||||
| use sp_std::prelude::*; | ||||
| use sp_core::{sr25519, Pair, Public}; | ||||
| use sp_runtime::{Perbill, traits::IdentifyAccount}; | ||||
| 
 | ||||
| #[derive(Encode, Clone)] | ||||
| struct PreparedNetworkData { | ||||
|     chain_name: Vec<u8>, | ||||
| struct PreparedNetworkData { 
 | ||||
|     chain_name: Vec<u8>, 
 | ||||
|     default_endpoint: Vec<u8>, | ||||
|     finality_delay: Option<u64>, | ||||
|     release_delay: Option<u64>, | ||||
| @ -84,69 +84,40 @@ fn casper_testnet_accounts() -> Vec<AccountId> { | ||||
| fn casper_testnet_evm_accounts() -> Vec<(AccountId, u128, u8)> { | ||||
|     vec![ | ||||
|         // 01c928771aea942a1e7ac06adf2b73dfbc9a25d9eaa516e3673116af7f345198
 | ||||
|         ( | ||||
|             get_account_id_from_seed::<sr25519::Public>("1A69d2D5568D1878023EeB121a73d33B9116A760"), | ||||
|             1337 * CSPR, | ||||
|             1, | ||||
|         ), | ||||
|         (get_account_id_from_seed::<sr25519::Public>("1A69d2D5568D1878023EeB121a73d33B9116A760"), 1337 * CSPR, 1), 
 | ||||
|         // b19a435901872f817185f7234a1484eae837613f9d10cf21927a23c2d8cb9139
 | ||||
|         ( | ||||
|             get_account_id_from_seed::<sr25519::Public>("2f86cfBED3fbc1eCf2989B9aE5fc019a837A9C12"), | ||||
|             1337 * CSPR, | ||||
|             2, | ||||
|         ), | ||||
|         (get_account_id_from_seed::<sr25519::Public>("2f86cfBED3fbc1eCf2989B9aE5fc019a837A9C12"), 1337 * CSPR, 2), 
 | ||||
|         // d3baf57b74d65719b2dc33f5a464176022d0cc5edbca002234229f3e733875fc
 | ||||
|         ( | ||||
|             get_account_id_from_seed::<sr25519::Public>("e83f67361Ac74D42A48E2DAfb6706eb047D8218D"), | ||||
|             69 * CSPR, | ||||
|             3, | ||||
|         ), | ||||
|         (get_account_id_from_seed::<sr25519::Public>("e83f67361Ac74D42A48E2DAfb6706eb047D8218D"), 69   * CSPR, 3), 
 | ||||
|         // c4683d566436af6b58b4a59c8f501319226e85b21869bf93d5eeb4596d4791d4
 | ||||
|         ( | ||||
|             get_account_id_from_seed::<sr25519::Public>("827ee4ad9b259b6fa1390ed60921508c78befd63"), | ||||
|             69 * CSPR, | ||||
|             4, | ||||
|         ), | ||||
|         (get_account_id_from_seed::<sr25519::Public>("827ee4ad9b259b6fa1390ed60921508c78befd63"), 69   * CSPR, 4), 
 | ||||
|     ] | ||||
| } | ||||
| 
 | ||||
| fn casper_testnet_evm_networks() -> Vec<(u32, Vec<u8>)> { | ||||
|     vec![ | ||||
|         ( | ||||
|             1, | ||||
|             PreparedNetworkData { | ||||
|                 chain_name: "ethereum-mainnet".into(), | ||||
|                 default_endpoint: | ||||
|                     "https://nd-422-757-666.p2pify.com/0a9d79d93fb2f4a4b1e04695da2b77a7/".into(), | ||||
|                 finality_delay: Some(40), | ||||
|                 release_delay: Some(80), | ||||
|                 network_type: Default::default(), | ||||
|                 gatekeeper: "0x4d224452801aced8b2f0aebe155379bb5d594381".into(), | ||||
|                 topic_name: "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" | ||||
|                     .into(), | ||||
|                 incoming_fee: 0, | ||||
|                 outgoing_fee: 0, | ||||
|             } | ||||
|             .encode(), | ||||
|         ), | ||||
|         ( | ||||
|             56, | ||||
|             PreparedNetworkData { | ||||
|                 chain_name: "bnb-mainnet".into(), | ||||
|                 default_endpoint: | ||||
|                     "https://bsc-mainnet.core.chainstack.com/35848e183f3e3303c8cfeacbea831cab/" | ||||
|                         .into(), | ||||
|                 finality_delay: Some(20), | ||||
|                 release_delay: Some(40), | ||||
|                 network_type: Default::default(), | ||||
|                 gatekeeper: "0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82".into(), | ||||
|                 topic_name: "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" | ||||
|                     .into(), | ||||
|                 incoming_fee: 0, | ||||
|                 outgoing_fee: 0, | ||||
|             } | ||||
|             .encode(), | ||||
|         ), | ||||
|         (1, PreparedNetworkData { 
 | ||||
|             chain_name: "ethereum-mainnet".into(), 
 | ||||
|             default_endpoint: "https://nd-422-757-666.p2pify.com/0a9d79d93fb2f4a4b1e04695da2b77a7/".into(), | ||||
|             finality_delay: Some(40), | ||||
|             release_delay: Some(80), | ||||
|             network_type: Default::default(), | ||||
|             gatekeeper: "0x4d224452801aced8b2f0aebe155379bb5d594381".into(), | ||||
|             topic_name: "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef".into(), | ||||
|             incoming_fee: 0, | ||||
|             outgoing_fee: 0, | ||||
|         }.encode()), | ||||
|         (56, PreparedNetworkData { 
 | ||||
|             chain_name: "bnb-mainnet".into(), 
 | ||||
|             default_endpoint: "https://bsc-mainnet.core.chainstack.com/35848e183f3e3303c8cfeacbea831cab/".into(), | ||||
|             finality_delay: Some(20), | ||||
|             release_delay: Some(40), | ||||
|             network_type: Default::default(), | ||||
|             gatekeeper: "0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82".into(), | ||||
|             topic_name: "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef".into(), | ||||
|             incoming_fee: 0, | ||||
|             outgoing_fee: 0, | ||||
|         }.encode()) | ||||
|     ] | ||||
| } | ||||
| 
 | ||||
| @ -156,12 +127,7 @@ fn casper_session_keys( | ||||
|     authority_discovery: AuthorityDiscoveryId, | ||||
|     slow_clap: SlowClapId, | ||||
| ) -> SessionKeys { | ||||
|     SessionKeys { | ||||
|         babe, | ||||
|         grandpa, | ||||
|         authority_discovery, | ||||
|         slow_clap, | ||||
|     } | ||||
|     SessionKeys { babe, grandpa, authority_discovery, slow_clap } | ||||
| } | ||||
| 
 | ||||
| fn testnet_config_genesis( | ||||
| @ -177,7 +143,8 @@ fn testnet_config_genesis( | ||||
|     ghost_accounts: Option<Vec<(AccountId, u128, u8)>>, | ||||
|     evm_networks: Option<Vec<(u32, Vec<u8>)>>, | ||||
| ) -> serde_json::Value { | ||||
|     let endowed_accounts: Vec<AccountId> = endowed_accounts.unwrap_or_else(casper_testnet_accounts); | ||||
|     let endowed_accounts: Vec<AccountId> = 
 | ||||
|         endowed_accounts.unwrap_or_else(casper_testnet_accounts); | ||||
| 
 | ||||
|     let ghost_accounts: Vec<(AccountId, u128, u8)> = | ||||
|         ghost_accounts.unwrap_or_else(casper_testnet_evm_accounts); | ||||
| @ -251,9 +218,7 @@ fn testnet_config_genesis( | ||||
| fn casper_development_config_genesis() -> serde_json::Value { | ||||
|     testnet_config_genesis( | ||||
|         vec![get_authority_keys_from_seed("Alice")], | ||||
|         None, | ||||
|         None, | ||||
|         None, | ||||
|         None, None, None, | ||||
|     ) | ||||
| } | ||||
| 
 | ||||
| @ -261,12 +226,10 @@ fn casper_development_config_genesis() -> serde_json::Value { | ||||
| fn casper_local_config_genesis() -> serde_json::Value { | ||||
|     testnet_config_genesis( | ||||
|         vec![ | ||||
|             get_authority_keys_from_seed("Alice"), | ||||
|             get_authority_keys_from_seed("Alice"), 
 | ||||
|             get_authority_keys_from_seed("Bob"), | ||||
|         ], | ||||
|         None, | ||||
|         None, | ||||
|         None, | ||||
|         None, None, None, | ||||
|     ) | ||||
| } | ||||
| 
 | ||||
| @ -277,17 +240,15 @@ pub fn get_preset(id: &sp_genesis_builder::PresetId) -> Option<sp_std::vec::Vec< | ||||
|         Ok("local_testnet") => casper_local_config_genesis(), | ||||
|         _ => return None, | ||||
|     }; | ||||
|     Some( | ||||
|         serde_json::to_string(&patch) | ||||
|             .expect("serialization to json is expected to work; qed") | ||||
|             .into_bytes(), | ||||
|     ) | ||||
|     Some(serde_json::to_string(&patch) | ||||
|         .expect("serialization to json is expected to work; qed") | ||||
|         .into_bytes()) | ||||
| } | ||||
| 
 | ||||
| /// Returns a list of identifiers for available builtin `RuntimeGenesisConfig` presets.
 | ||||
| pub fn preset_names() -> Vec<sp_genesis_builder::PresetId> { | ||||
|     Vec::from([ | ||||
|         sp_genesis_builder::PresetId::from("local_testnet"), | ||||
|         sp_genesis_builder::PresetId::from("development"), | ||||
|         sp_genesis_builder::PresetId::from("local_testnet"), 
 | ||||
|         sp_genesis_builder::PresetId::from("development"), 
 | ||||
|     ]) | ||||
| } | ||||
|  | ||||
| @ -1,5 +1,8 @@ | ||||
| use super::*; | ||||
| use frame_support::{dispatch::DispatchResultWithPostInfo, traits::PrivilegeCmp}; | ||||
| use frame_support::{ | ||||
|     dispatch::DispatchResultWithPostInfo, | ||||
|     traits::PrivilegeCmp, | ||||
| }; | ||||
| use pallet_alliance::{ProposalIndex, ProposalProvider}; | ||||
| use sp_runtime::DispatchError; | ||||
| use sp_std::{cmp::Ordering, marker::PhantomData}; | ||||
| @ -11,8 +14,7 @@ type HashOf<T> = <T as frame_system::Config>::Hash; | ||||
| /// Proposal provider for alliance pallet.
 | ||||
| /// Adapter from collective pallet to alliance proposal provider trait.
 | ||||
| pub struct AllianceProposalProvider<T, I = ()>(PhantomData<(T, I)>); | ||||
| impl<T, I> ProposalProvider<AccountIdOf<T>, HashOf<T>, ProposalOf<T, I>> | ||||
|     for AllianceProposalProvider<T, I> | ||||
| impl <T, I> ProposalProvider<AccountIdOf<T>, HashOf<T>, ProposalOf<T, I>> for AllianceProposalProvider<T, I> | ||||
| where | ||||
|     T: pallet_collective::Config<I> + frame_system::Config, | ||||
|     I: 'static, | ||||
| @ -23,12 +25,7 @@ where | ||||
|         proposal: Box<ProposalOf<T, I>>, | ||||
|         length_bound: u32, | ||||
|     ) -> Result<(u32, u32), DispatchError> { | ||||
|         pallet_collective::Pallet::<T, I>::do_propose_proposed( | ||||
|             who, | ||||
|             threshold, | ||||
|             proposal, | ||||
|             length_bound, | ||||
|         ) | ||||
|         pallet_collective::Pallet::<T, I>::do_propose_proposed(who, threshold, proposal, length_bound) | ||||
|     } | ||||
| 
 | ||||
|     fn vote_proposal( | ||||
| @ -64,7 +61,7 @@ pub struct EqualOrGreatestRootCmp; | ||||
| impl PrivilegeCmp<OriginCaller> for EqualOrGreatestRootCmp { | ||||
|     fn cmp_privilege(left: &OriginCaller, right: &OriginCaller) -> Option<Ordering> { | ||||
|         if left == right { | ||||
|             return Some(Ordering::Equal); | ||||
|             return Some(Ordering::Equal) | ||||
|         } | ||||
| 
 | ||||
|         match (left, right) { | ||||
|  | ||||
							
								
								
									
										853
									
								
								runtime/casper/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										853
									
								
								runtime/casper/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -7,7 +7,7 @@ | ||||
| 
 | ||||
| // Ghost Network 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
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| // GNU General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| @ -16,7 +16,7 @@ | ||||
| //! Autogenerated weights for `ghost_networks`
 | ||||
| //!
 | ||||
| //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
 | ||||
| //! DATE: 2025-07-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 | ||||
| //! DATE: 2024-08-01, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 | ||||
| //! WORST CASE MAP SIZE: `1000000`
 | ||||
| //! HOSTNAME: `ghostown`, CPU: `Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz`
 | ||||
| //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("casper-dev")`, DB CACHE: 1024
 | ||||
| @ -28,7 +28,7 @@ | ||||
| // --chain=casper-dev
 | ||||
| // --steps=50
 | ||||
| // --repeat=20
 | ||||
| // --pallet=ghost-networks
 | ||||
| // --pallet=ghost_networks
 | ||||
| // --extrinsic=*
 | ||||
| // --wasm-execution=compiled
 | ||||
| // --heap-pages=4096
 | ||||
| @ -50,31 +50,30 @@ impl<T: frame_system::Config> ghost_networks::WeightInfo for WeightInfo<T> { | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// The range of component `i` is `[1, 20]`.
 | ||||
| 	/// The range of component `j` is `[1, 150]`.
 | ||||
| 	/// The range of component `k` is `[1, 20]`.
 | ||||
| 	fn register_network(_i: u32, _j: u32, k: u32, ) -> Weight { | ||||
| 	fn register_network(i: u32, j: u32, ) -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `109`
 | ||||
| 		//  Estimated: `3574`
 | ||||
| 		// Minimum execution time: 46_023_000 picoseconds.
 | ||||
| 		Weight::from_parts(97_871_287, 0) | ||||
| 		// Minimum execution time: 44_464_000 picoseconds.
 | ||||
| 		Weight::from_parts(44_802_179, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3574)) | ||||
| 			// Standard Error: 94_524
 | ||||
| 			.saturating_add(Weight::from_parts(940_486, 0).saturating_mul(k.into())) | ||||
| 			// Standard Error: 11_381
 | ||||
| 			.saturating_add(Weight::from_parts(42_872, 0).saturating_mul(i.into())) | ||||
| 			// Standard Error: 1_492
 | ||||
| 			.saturating_add(Weight::from_parts(8_794, 0).saturating_mul(j.into())) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// The range of component `n` is `[1, 20]`.
 | ||||
| 	fn update_network_name(n: u32, ) -> Weight { | ||||
| 	fn update_network_name(_n: u32, ) -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 49_906_000 picoseconds.
 | ||||
| 		Weight::from_parts(55_537_587, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 			// Standard Error: 87_704
 | ||||
| 			.saturating_add(Weight::from_parts(92_366, 0).saturating_mul(n.into())) | ||||
| 		//  Measured:  `295`
 | ||||
| 		//  Estimated: `3760`
 | ||||
| 		// Minimum execution time: 50_224_000 picoseconds.
 | ||||
| 		Weight::from_parts(54_405_362, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3760)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| @ -83,13 +82,13 @@ impl<T: frame_system::Config> ghost_networks::WeightInfo for WeightInfo<T> { | ||||
| 	/// The range of component `n` is `[1, 150]`.
 | ||||
| 	fn update_network_endpoint(n: u32, ) -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 50_556_000 picoseconds.
 | ||||
| 		Weight::from_parts(57_726_674, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 			// Standard Error: 12_261
 | ||||
| 			.saturating_add(Weight::from_parts(274, 0).saturating_mul(n.into())) | ||||
| 		//  Measured:  `295`
 | ||||
| 		//  Estimated: `3760`
 | ||||
| 		// Minimum execution time: 50_598_000 picoseconds.
 | ||||
| 		Weight::from_parts(54_951_352, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3760)) | ||||
| 			// Standard Error: 10_596
 | ||||
| 			.saturating_add(Weight::from_parts(11_691, 0).saturating_mul(n.into())) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| @ -97,35 +96,23 @@ impl<T: frame_system::Config> ghost_networks::WeightInfo for WeightInfo<T> { | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	fn update_network_finality_delay() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 49_406_000 picoseconds.
 | ||||
| 		Weight::from_parts(51_256_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `295`
 | ||||
| 		//  Estimated: `3760`
 | ||||
| 		// Minimum execution time: 49_089_000 picoseconds.
 | ||||
| 		Weight::from_parts(50_797_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3760)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	fn update_network_rate_limit_delay() -> Weight { | ||||
| 	fn update_network_release_delay() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 49_572_000 picoseconds.
 | ||||
| 		Weight::from_parts(52_584_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	fn update_network_block_distance() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 48_880_000 picoseconds.
 | ||||
| 		Weight::from_parts(50_596_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `295`
 | ||||
| 		//  Estimated: `3760`
 | ||||
| 		// Minimum execution time: 49_606_000 picoseconds.
 | ||||
| 		Weight::from_parts(50_371_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3760)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| @ -133,11 +120,11 @@ impl<T: frame_system::Config> ghost_networks::WeightInfo for WeightInfo<T> { | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	fn update_network_type() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 48_282_000 picoseconds.
 | ||||
| 		Weight::from_parts(49_137_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `295`
 | ||||
| 		//  Estimated: `3760`
 | ||||
| 		// Minimum execution time: 48_135_000 picoseconds.
 | ||||
| 		Weight::from_parts(48_619_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3760)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| @ -145,11 +132,11 @@ impl<T: frame_system::Config> ghost_networks::WeightInfo for WeightInfo<T> { | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	fn update_network_gatekeeper() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 50_853_000 picoseconds.
 | ||||
| 		Weight::from_parts(51_982_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `295`
 | ||||
| 		//  Estimated: `3760`
 | ||||
| 		// Minimum execution time: 50_027_000 picoseconds.
 | ||||
| 		Weight::from_parts(51_212_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3760)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| @ -157,11 +144,11 @@ impl<T: frame_system::Config> ghost_networks::WeightInfo for WeightInfo<T> { | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	fn update_network_topic_name() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 50_343_000 picoseconds.
 | ||||
| 		Weight::from_parts(52_380_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `295`
 | ||||
| 		//  Estimated: `3760`
 | ||||
| 		// Minimum execution time: 50_686_000 picoseconds.
 | ||||
| 		Weight::from_parts(52_276_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3760)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| @ -169,11 +156,11 @@ impl<T: frame_system::Config> ghost_networks::WeightInfo for WeightInfo<T> { | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	fn update_incoming_network_fee() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 49_393_000 picoseconds.
 | ||||
| 		Weight::from_parts(80_966_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `295`
 | ||||
| 		//  Estimated: `3760`
 | ||||
| 		// Minimum execution time: 48_485_000 picoseconds.
 | ||||
| 		Weight::from_parts(49_672_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3760)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| @ -181,11 +168,11 @@ impl<T: frame_system::Config> ghost_networks::WeightInfo for WeightInfo<T> { | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	fn update_outgoing_network_fee() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 49_579_000 picoseconds.
 | ||||
| 		Weight::from_parts(51_126_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `295`
 | ||||
| 		//  Estimated: `3760`
 | ||||
| 		// Minimum execution time: 48_926_000 picoseconds.
 | ||||
| 		Weight::from_parts(49_482_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3760)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| @ -193,11 +180,11 @@ impl<T: frame_system::Config> ghost_networks::WeightInfo for WeightInfo<T> { | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	fn remove_network() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `302`
 | ||||
| 		//  Estimated: `3767`
 | ||||
| 		// Minimum execution time: 44_634_000 picoseconds.
 | ||||
| 		Weight::from_parts(45_815_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3767)) | ||||
| 		//  Measured:  `295`
 | ||||
| 		//  Estimated: `3760`
 | ||||
| 		// Minimum execution time: 45_163_000 picoseconds.
 | ||||
| 		Weight::from_parts(45_822_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3760)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
|  | ||||
| @ -7,7 +7,7 @@ | ||||
| 
 | ||||
| // Ghost Network 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
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| // GNU General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| @ -16,7 +16,7 @@ | ||||
| //! Autogenerated weights for `ghost_slow_clap`
 | ||||
| //!
 | ||||
| //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
 | ||||
| //! DATE: 2025-06-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 | ||||
| //! DATE: 2024-08-02, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 | ||||
| //! WORST CASE MAP SIZE: `1000000`
 | ||||
| //! HOSTNAME: `ghostown`, CPU: `Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz`
 | ||||
| //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("casper-dev")`, DB CACHE: 1024
 | ||||
| @ -47,61 +47,79 @@ use core::marker::PhantomData; | ||||
| pub struct WeightInfo<T>(PhantomData<T>); | ||||
| impl<T: frame_system::Config> ghost_slow_clap::WeightInfo for WeightInfo<T> { | ||||
| 	/// Storage: `GhostSlowClaps::Authorities` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSlowClaps::Authorities` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::ReceivedClaps` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::ReceivedClaps` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::ClapsInSession` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::ClapsInSession` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::ApplausesForTransaction` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::Authorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::AuthorityInfoInSession` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSlowClaps::AuthorityInfoInSession` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::ApplausesForTransaction` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSlowClaps::ApplausesForTransaction` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::NullifyNeeded` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostNetworks::NullifyNeeded` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::GatekeeperAmount` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::GatekeeperAmount` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::BridgedImbalance` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::BridgedImbalance` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::AccumulatedCommission` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::AccumulatedCommission` (`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(128), added: 2603, mode: `MaxEncodedLen`)
 | ||||
| 	fn slow_clap() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `355`
 | ||||
| 		//  Estimated: `3820`
 | ||||
| 		// Minimum execution time: 213_817_000 picoseconds.
 | ||||
| 		Weight::from_parts(216_977_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3820)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(10)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(7)) | ||||
| 	} | ||||
| 	/// Storage: `GhostSlowClaps::ReceivedClaps` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSlowClaps::ReceivedClaps` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::Authorities` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSlowClaps::Authorities` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::ApplausesForTransaction` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::ApplausesForTransaction` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::NullifyNeeded` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostNetworks::NullifyNeeded` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 | ||||
| 	/// The range of component `k` is `[1, 100]`.
 | ||||
| 	/// The range of component `j` is `[1, 20]`.
 | ||||
| 	fn slow_clap(k: u32, j: u32, ) -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `372 + j * (19 ±0)`
 | ||||
| 		//  Estimated: `3853 + j * (19 ±0)`
 | ||||
| 		// Minimum execution time: 95_459_000 picoseconds.
 | ||||
| 		Weight::from_parts(96_224_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3853)) | ||||
| 			// Standard Error: 152_014
 | ||||
| 			.saturating_add(Weight::from_parts(32_092_278, 0).saturating_mul(k.into())) | ||||
| 			// Standard Error: 761_228
 | ||||
| 			.saturating_add(Weight::from_parts(22_412_712, 0).saturating_mul(j.into())) | ||||
| 			.saturating_add(T::DbWeight::get().reads(4)) | ||||
| 			.saturating_add(Weight::from_parts(0, 19).saturating_mul(j.into())) | ||||
| 	} | ||||
| 	/// Storage: `GhostSlowClaps::CurrentCompanionId` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::CurrentCompanionId` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::GatekeeperAmount` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::GatekeeperAmount` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::BridgedImbalance` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::BridgedImbalance` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::AccumulatedCommission` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostNetworks::AccumulatedCommission` (`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(128), added: 2603, mode: `MaxEncodedLen`)
 | ||||
| 	fn self_applause() -> Weight { | ||||
| 	/// Storage: `GhostSlowClaps::Companions` (r:0 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::Companions` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::CompanionDetails` (r:0 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::CompanionDetails` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	fn propose_companion() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `655`
 | ||||
| 		//  Estimated: `4120`
 | ||||
| 		// Minimum execution time: 210_676_000 picoseconds.
 | ||||
| 		Weight::from_parts(212_905_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 4120)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(9)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(5)) | ||||
| 		//  Measured:  `634`
 | ||||
| 		//  Estimated: `4099`
 | ||||
| 		// Minimum execution time: 167_770_000 picoseconds.
 | ||||
| 		Weight::from_parts(168_826_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 4099)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(2)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(3)) | ||||
| 	} | ||||
| 	/// Storage: `GhostSlowClaps::Companions` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSlowClaps::Companions` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostNetworks::Networks` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::CompanionDetails` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSlowClaps::CompanionDetails` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::ReleaseBlocks` (r:0 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::ReleaseBlocks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	fn release_companion() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `839`
 | ||||
| 		//  Estimated: `4304`
 | ||||
| 		// Minimum execution time: 82_884_000 picoseconds.
 | ||||
| 		Weight::from_parts(84_135_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 4304)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(3)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostSlowClaps::ReleaseBlocks` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSlowClaps::ReleaseBlocks` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::Companions` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::Companions` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	/// Storage: `GhostSlowClaps::CompanionDetails` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSlowClaps::CompanionDetails` (`max_values`: None, `max_size`: None, mode: `Measured`)
 | ||||
| 	fn kill_companion() -> Weight { | ||||
| 		// Proof Size summary in bytes:
 | ||||
| 		//  Measured:  `514`
 | ||||
| 		//  Estimated: `3979`
 | ||||
| 		// Minimum execution time: 152_418_000 picoseconds.
 | ||||
| 		Weight::from_parts(153_436_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 3979)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(3)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(2)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -1,95 +0,0 @@ | ||||
| // This file is part of Ghost Network.
 | ||||
| 
 | ||||
| // Ghost Network is free software: you can redistribute it and/or modify
 | ||||
| // it under the terms of the GNU General Public License as published by
 | ||||
| // the Free Software Foundation, either version 3 of the License, or
 | ||||
| // (at your option) any later version.
 | ||||
| 
 | ||||
| // Ghost Network 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 General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| // along with Ghost Network.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| //! Autogenerated weights for `ghost_sudo`
 | ||||
| //!
 | ||||
| //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
 | ||||
| //! DATE: 2025-07-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 | ||||
| //! WORST CASE MAP SIZE: `1000000`
 | ||||
| //! HOSTNAME: `ghostown`, CPU: `Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz`
 | ||||
| //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("casper-dev")`, DB CACHE: 1024
 | ||||
| 
 | ||||
| // Executed Command:
 | ||||
| // ./target/release/ghost
 | ||||
| // benchmark
 | ||||
| // pallet
 | ||||
| // --chain=casper-dev
 | ||||
| // --steps=50
 | ||||
| // --repeat=20
 | ||||
| // --pallet=ghost-sudo
 | ||||
| // --extrinsic=*
 | ||||
| // --wasm-execution=compiled
 | ||||
| // --heap-pages=4096
 | ||||
| // --header=./file_header.txt
 | ||||
| // --output=./runtime/casper/src/weights/ghost_sudo.rs
 | ||||
| 
 | ||||
| #![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 `ghost_sudo`.
 | ||||
| pub struct WeightInfo<T>(PhantomData<T>); | ||||
| impl<T: frame_system::Config> ghost_sudo::WeightInfo for WeightInfo<T> { | ||||
| 	/// Storage: `GhostSudo::Key` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSudo::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: 40_014_000 picoseconds.
 | ||||
| 		Weight::from_parts(40_856_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 1517)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostSudo::Key` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSudo::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: 44_086_000 picoseconds.
 | ||||
| 		Weight::from_parts(45_920_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 1517)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostSudo::Key` (r:1 w:0)
 | ||||
| 	/// Proof: `GhostSudo::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: 44_106_000 picoseconds.
 | ||||
| 		Weight::from_parts(44_650_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 1517)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 	} | ||||
| 	/// Storage: `GhostSudo::Key` (r:1 w:1)
 | ||||
| 	/// Proof: `GhostSudo::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: 36_416_000 picoseconds.
 | ||||
| 		Weight::from_parts(37_373_000, 0) | ||||
| 			.saturating_add(Weight::from_parts(0, 1517)) | ||||
| 			.saturating_add(T::DbWeight::get().reads(1)) | ||||
| 			.saturating_add(T::DbWeight::get().writes(1)) | ||||
| 	} | ||||
| } | ||||
| @ -3,7 +3,6 @@ pub mod frame_system; | ||||
| pub mod ghost_claims; | ||||
| pub mod ghost_networks; | ||||
| pub mod ghost_slow_clap; | ||||
| pub mod ghost_sudo; | ||||
| pub mod pallet_alliance; | ||||
| pub mod pallet_bags_list; | ||||
| pub mod pallet_balances; | ||||
| @ -18,7 +17,7 @@ pub mod pallet_nomination_pools; | ||||
| pub mod pallet_preimage; | ||||
| pub mod pallet_proxy; | ||||
| pub mod pallet_ranked_collective; | ||||
| pub mod pallet_referenda; | ||||
| // pub mod pallet_referenda;
 | ||||
| pub mod pallet_salary; | ||||
| pub mod pallet_scheduler; | ||||
| pub mod pallet_session; | ||||
|  | ||||
							
								
								
									
										50
									
								
								runtime/common/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										50
									
								
								runtime/common/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -1,6 +1,6 @@ | ||||
| [package] | ||||
| name = "ghost-runtime-common" | ||||
| version = "0.4.3" | ||||
| version = "0.4.2" | ||||
| authors.workspace = true | ||||
| edition.workspace = true | ||||
| homepage.workspace = true | ||||
| @ -31,21 +31,21 @@ primitives = { workspace = true } | ||||
| default = ["std"] | ||||
| no_std = [] | ||||
| std = [ | ||||
|     "sp-core/std", | ||||
|     "sp-std/std", | ||||
|     "sp-io/std", | ||||
| 	"sp-core/std", | ||||
| 	"sp-std/std", | ||||
| 	"sp-io/std", | ||||
|     "sp-runtime/std", | ||||
|     "sp-staking/std", | ||||
|     "frame-support/std", | ||||
| 	"frame-support/std", | ||||
|     "frame-system/std", | ||||
|     "pallet-authorship/std", | ||||
|     "pallet-balances/std", | ||||
|     "pallet-staking/std", | ||||
|     "pallet-staking-reward-fn/std", | ||||
|     "pallet-timestamp/std", | ||||
|     "pallet-transaction-payment/std", | ||||
|     "pallet-treasury/std", | ||||
|     "pallet-election-provider-multi-phase/std", | ||||
| 	"pallet-authorship/std", | ||||
| 	"pallet-balances/std", | ||||
| 	"pallet-staking/std", | ||||
| 	"pallet-staking-reward-fn/std", | ||||
| 	"pallet-timestamp/std", | ||||
| 	"pallet-transaction-payment/std", | ||||
| 	"pallet-treasury/std", | ||||
| 	"pallet-election-provider-multi-phase/std", | ||||
|     "primitives/std", | ||||
| ] | ||||
| runtime-benchmarks = [ | ||||
| @ -53,21 +53,21 @@ runtime-benchmarks = [ | ||||
|     "sp-staking/runtime-benchmarks", | ||||
|     "frame-support/runtime-benchmarks", | ||||
|     "frame-system/runtime-benchmarks", | ||||
|     "pallet-balances/runtime-benchmarks", | ||||
|     "pallet-staking/runtime-benchmarks", | ||||
|     "pallet-timestamp/runtime-benchmarks", | ||||
|     "pallet-treasury/runtime-benchmarks", | ||||
|     "pallet-election-provider-multi-phase/runtime-benchmarks", | ||||
| 	"pallet-balances/runtime-benchmarks", | ||||
| 	"pallet-staking/runtime-benchmarks", | ||||
| 	"pallet-timestamp/runtime-benchmarks", | ||||
| 	"pallet-treasury/runtime-benchmarks", | ||||
| 	"pallet-election-provider-multi-phase/runtime-benchmarks", | ||||
| ] | ||||
| try-runtime = [ | ||||
|     "sp-runtime/try-runtime", | ||||
|     "frame-support/try-runtime", | ||||
|     "frame-system/try-runtime", | ||||
|     "pallet-authorship/try-runtime", | ||||
|     "pallet-balances/try-runtime", | ||||
|     "pallet-staking/try-runtime", | ||||
|     "pallet-timestamp/try-runtime", | ||||
|     "pallet-transaction-payment/try-runtime", | ||||
|     "pallet-treasury/try-runtime", | ||||
|     "pallet-election-provider-multi-phase/try-runtime", | ||||
| 	"pallet-authorship/try-runtime", | ||||
| 	"pallet-balances/try-runtime", | ||||
| 	"pallet-staking/try-runtime", | ||||
| 	"pallet-timestamp/try-runtime", | ||||
| 	"pallet-transaction-payment/try-runtime", | ||||
| 	"pallet-treasury/try-runtime", | ||||
| 	"pallet-election-provider-multi-phase/try-runtime", | ||||
| ] | ||||
|  | ||||
| @ -1,13 +1,11 @@ | ||||
| use frame_support::traits::tokens::{Pay, PaymentStatus}; | ||||
| use pallet_treasury::ArgumentsFactory; | ||||
| use primitives::{AccountId, Balance}; | ||||
| use pallet_treasury::ArgumentsFactory; | ||||
| use sp_core::crypto::FromEntropy; | ||||
| use frame_support::traits::tokens::{Pay, PaymentStatus}; | ||||
| 
 | ||||
| pub struct BenchmarkTreasuryHelper; | ||||
| impl ArgumentsFactory<(), AccountId> for BenchmarkTreasuryHelper { | ||||
|     fn create_asset_kind(_seed: u32) -> () { | ||||
|         () | ||||
|     } | ||||
|     fn create_asset_kind(_seed: u32) -> () { () } | ||||
|     fn create_beneficiary(seed: [u8; 32]) -> AccountId { | ||||
|         AccountId::from_entropy(&mut seed.as_slice()).unwrap() | ||||
|     } | ||||
| @ -21,16 +19,8 @@ impl Pay for BenchmarkTreasuryPaymaster { | ||||
|     type AssetKind = (); | ||||
|     type Error = (); | ||||
| 
 | ||||
|     fn pay( | ||||
|         _: &Self::Beneficiary, | ||||
|         _: Self::AssetKind, | ||||
|         _: Self::Balance, | ||||
|     ) -> Result<Self::Id, Self::Error> { | ||||
|         Ok(()) | ||||
|     } | ||||
|     fn check_payment(_: Self::Id) -> PaymentStatus { | ||||
|         PaymentStatus::Success | ||||
|     } | ||||
|     fn pay(_: &Self::Beneficiary, _: Self::AssetKind, _: Self::Balance) -> Result<Self::Id, Self::Error> { Ok(()) } | ||||
|     fn check_payment(_: Self::Id) -> PaymentStatus { PaymentStatus::Success } | ||||
|     fn ensure_successful(_: &Self::Beneficiary, _: Self::AssetKind, _: Self::Balance) {} | ||||
|     fn ensure_concluded(_: Self::Id) {} | ||||
| } | ||||
|  | ||||
| @ -4,7 +4,7 @@ macro_rules! impl_elections_weights { | ||||
|         parameter_types! { | ||||
|             /// A limit for off-chain phragmen unsigned solution submission.
 | ||||
|             ///
 | ||||
|             /// We want to keep it as high as possible, but can't risk having
 | ||||
|             /// We want to keep it as high as possible, but can't risk having 
 | ||||
|             /// it reject, so we always substract the base block execution weight.
 | ||||
|             pub OffchainSolutionWeightLimit: Weight = BlockWeights::get() | ||||
|                 .get(DispatchClass::Normal) | ||||
| @ -23,8 +23,8 @@ macro_rules! impl_elections_weights { | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| /// The number configured here could always be more than the maximum limits of
 | ||||
| /// staking pallet to ensure election snapshot will not run out of memory. For
 | ||||
| /// The number configured here could always be more than the maximum limits of 
 | ||||
| /// staking pallet to ensure election snapshot will not run out of memory. For 
 | ||||
| /// now, we set them to smaller values since the staking is bounded and the weight
 | ||||
| /// pipeline takes for this single pallet.
 | ||||
| pub struct BenchmarkConfig; | ||||
|  | ||||
							
								
								
									
										47
									
								
								runtime/common/src/impls.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										47
									
								
								runtime/common/src/impls.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -51,13 +51,13 @@ mod tests { | ||||
|     use super::*; | ||||
|     use frame_support::{ | ||||
|         derive_impl, | ||||
|         dispatch::DispatchClass, | ||||
|         parameter_types, | ||||
|         dispatch::DispatchClass, 
 | ||||
|         parameter_types, 
 | ||||
|         traits::{ | ||||
|             tokens::{PayFromAccount, UnityAssetBalanceConversion}, | ||||
|             ConstU32, FindAuthor, | ||||
|             ConstU32, FindAuthor | ||||
|         }, | ||||
|         weights::Weight, | ||||
|         weights::Weight, 
 | ||||
|         PalletId, | ||||
|     }; | ||||
|     use frame_system::limits; | ||||
| @ -65,14 +65,14 @@ mod tests { | ||||
|     use sp_core::{ConstU64, H256}; | ||||
|     use sp_runtime::{ | ||||
|         traits::{BlakeTwo256, IdentityLookup}, | ||||
|         BuildStorage, Perbill, | ||||
|         Perbill, BuildStorage, | ||||
|     }; | ||||
| 
 | ||||
|     type Block = frame_system::mocking::MockingBlock<Test>; | ||||
|     const TEST_ACCOUNT: AccountId = AccountId::new([1; 32]); | ||||
| 
 | ||||
|     frame_support::construct_runtime!( | ||||
|         pub enum Test | ||||
|         pub enum Test 
 | ||||
|         { | ||||
|             System: frame_system, | ||||
|             Authorship: pallet_authorship, | ||||
| @ -172,10 +172,7 @@ mod tests { | ||||
| 
 | ||||
|     pub struct OneAuthor; | ||||
|     impl FindAuthor<AccountId> for OneAuthor { | ||||
|         fn find_author<'a, I>(_: I) -> Option<AccountId> | ||||
|         where | ||||
|             I: 'a, | ||||
|         { | ||||
|         fn find_author<'a, I>(_: I) -> Option<AccountId> where I: 'a { | ||||
|             Some(TEST_ACCOUNT) | ||||
|         } | ||||
|     } | ||||
| @ -188,9 +185,7 @@ mod tests { | ||||
|     } | ||||
| 
 | ||||
|     pub fn new_test_ext() -> sp_io::TestExternalities { | ||||
|         let mut t = frame_system::GenesisConfig::default() | ||||
|             .build_storage::<Test>() | ||||
|             .unwrap(); | ||||
|         let mut t = frame_system::GenesisConfig::default().build_storage::<Test>().unwrap(); | ||||
|         // We use default for brevity, but you can configure as desired if needed.
 | ||||
|         pallet_balances::GenesisConfig::<Test>::default() | ||||
|             .assimilate_storage(&mut t) | ||||
| @ -201,14 +196,8 @@ mod tests { | ||||
|     #[test] | ||||
|     fn test_fees_and_tips_split() { | ||||
|         new_test_ext().execute_with(|| { | ||||
|             let fee = | ||||
|                 <paller_balances::Pallet<Test> as frame_support::traits::fungible::Balanced< | ||||
|                     AccountId, | ||||
|                 >>::issue(10); | ||||
|             let tip = | ||||
|                 <paller_balances::Pallet<Test> as frame_support::traits::fungible::Balanced< | ||||
|                     AccountId, | ||||
|                 >>::issue(20); | ||||
|             let fee = <paller_balances::Pallet<Test> as frame_support::traits::fungible::Balanced<AccountId>>::issue(10); | ||||
|             let tip = <paller_balances::Pallet<Test> as frame_support::traits::fungible::Balanced<AccountId>>::issue(20); | ||||
| 
 | ||||
|             assert_eq!(Balances::free_balance(Treasury::account_id()), 0); | ||||
|             assert_eq!(Balances::free_balance(TEST_ACCOUNT), 0); | ||||
| @ -253,23 +242,11 @@ mod tests { | ||||
|     #[test] | ||||
|     fn era_payout_should_give_sensible_results() { | ||||
|         assert_eq!( | ||||
|             era_payout( | ||||
|                 75, | ||||
|                 100, | ||||
|                 Perquintill::from_percent(10), | ||||
|                 Perquintill::one(), | ||||
|                 0, | ||||
|             ), | ||||
|             era_payout(75, 100, Perquintill::from_percent(10), Perquintill::one(), 0, ), | ||||
|             (10, 0) | ||||
|         ); | ||||
|         assert_eq!( | ||||
|             era_payout( | ||||
|                 80, | ||||
|                 100, | ||||
|                 Perquintill::from_percent(10), | ||||
|                 Perquintill::one(), | ||||
|                 0, | ||||
|             ), | ||||
|             era_payout(80, 100, Perquintill::from_percent(10), Perquintill::one(), 0, ), | ||||
|             (6, 4) | ||||
|         ); | ||||
|     } | ||||
|  | ||||
							
								
								
									
										15
									
								
								runtime/common/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										15
									
								
								runtime/common/src/lib.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -1,7 +1,7 @@ | ||||
| #![cfg_attr(not(feature = "std"), no_std)] | ||||
| 
 | ||||
| pub mod elections; | ||||
| pub mod impls; | ||||
| pub mod elections; | ||||
| 
 | ||||
| #[cfg(feature = "try-runtime")] | ||||
| pub mod elections; | ||||
| @ -10,8 +10,7 @@ pub mod elections; | ||||
| pub mod benchmarking; | ||||
| 
 | ||||
| use frame_support::{ | ||||
|     parameter_types, | ||||
|     traits::ConstU32, | ||||
|     parameter_types, traits::ConstU32, | ||||
|     weights::{constants::WEIGHT_REF_TIME_PER_SECOND, Weight}, | ||||
| }; | ||||
| use frame_system::limits; | ||||
| @ -22,7 +21,7 @@ use static_assertions::const_assert; | ||||
| pub use pallet_balances::Call as BalancesCall; | ||||
| #[cfg(feature = "std")] | ||||
| pub use pallet_staking::StakerStatus; | ||||
| pub use pallet_timestamp::Call as TimestampCall; | ||||
| pub use pallet_timestamp::{Call as TimestampCall}; | ||||
| use pallet_transaction_payment::{Multiplier, TargetedFeeAdjustment}; | ||||
| pub use sp_runtime::traits::Bounded; | ||||
| #[cfg(any(feature = "std", test))] | ||||
| @ -93,8 +92,8 @@ macro_rules! impl_runtime_weights { | ||||
|         use frame_system::limits; | ||||
|         use pallet_transaction_payment::{Multiplier, TargetedFeeAdjustment}; | ||||
|         pub use runtime_common::{ | ||||
|             impl_elections_weights, AVERAGE_ON_INITIALIZE_RATIO, MAXIMUM_BLOCK_WEIGHT, | ||||
|             NORMAL_DISPATCH_RATIO, | ||||
|             impl_elections_weights, AVERAGE_ON_INITIALIZE_RATIO, 
 | ||||
|             MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, | ||||
|         }; | ||||
|         use sp_runtime::{FixedPointNumber, Perquintill}; | ||||
| 
 | ||||
| @ -102,7 +101,8 @@ macro_rules! impl_runtime_weights { | ||||
| 
 | ||||
|         // Expose the weight from the runtime constants module.
 | ||||
|         pub use $runtime::weights::{ | ||||
|             BlockExecutionWeight, ExtrinsicBaseWeight, ParityDbWeight, RocksDbWeight, | ||||
|             BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, | ||||
|             ParityDbWeight, | ||||
|         }; | ||||
| 
 | ||||
|         parameter_types! { | ||||
| @ -129,6 +129,7 @@ macro_rules! impl_runtime_weights { | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /// The type used for currency conversion.
 | ||||
| ///
 | ||||
| /// This must be only be used as long as the balance type is `u128`.
 | ||||
|  | ||||
| @ -4,7 +4,7 @@ use frame_support::{ | ||||
| }; | ||||
| use pallet_fast_unstake::{Pallet as FastUnstake, *}; | ||||
| use pallet_staking::*; | ||||
| use sp_std::{collections::btree_set::BTreeSet, prelude::*}; | ||||
| use sp_std::{collections::btree_set::BTreeSet, prelude:*}; | ||||
| 
 | ||||
| /// Register all inactive nominators for fast unstake, and progress until they
 | ||||
| /// have all benn processed.
 | ||||
| @ -16,9 +16,7 @@ where | ||||
|     let mut unstaked_err = 0; | ||||
|     let mut unstaked_slashed = 0; | ||||
| 
 | ||||
|     let all_stakers = Ledger::<T>::iter() | ||||
|         .map(|(ctrl, l)| (ctrl, l.stash)) | ||||
|         .collect::<BTreeSet<_>>(); | ||||
|     let all_stakers = Ledger::<T>::iter().map(|(ctrl, l)| (ctrl, l.stash)).collect::<BTreeSet<_>>(); | ||||
|     let mut all_exposed = BTreeSet::new(); | ||||
|     ErasStakers::<T>::iter().for_each(|(_, val, expo)| { | ||||
|         all_exposed.insert(val); | ||||
| @ -57,7 +55,7 @@ where | ||||
|         let weight = <T as frame_system::Config>::BlockWeights::get().max_block; | ||||
|         let consumed = FastUnstake::<T>::on_idle(now, weight); | ||||
|         log::debug!( | ||||
|             target: "runtime::test", | ||||
|             target: "runtime::test", 
 | ||||
|             "consumed {:?} ({})", | ||||
|             consumed, | ||||
|             consumed.ref_time() as f32 / weight.ref_time() as f32, | ||||
| @ -72,16 +70,15 @@ where | ||||
|                 maybe_fast_unstake_event | ||||
|             }) | ||||
|             .for_each(|e: pallet_fast_unstake::Event<T>| match e { | ||||
|                 pallet_fast_unstake::Event::<T>::Unstaked { result, .. } => { | ||||
|                 pallet_fast_unstake::Event<T>::Unstaked { result, .. } => 
 | ||||
|                     if result.is_ok() { | ||||
|                         unstaked_ok += 1; | ||||
|                     } else { | ||||
|                         unstaked_err += 1; | ||||
|                     } | ||||
|                 } | ||||
|                     }, | ||||
|                 pallet_fast_unstake::Event::<T>::Slashed { .. } => unstaked_slashed += 1, | ||||
|                 pallet_fast_unstake::Event::<T>::InternalError { .. } => unreachable!(), | ||||
|                 _ => {} | ||||
|                 _ => {}, | ||||
|             }); | ||||
| 
 | ||||
|         if now % 100u32.into() == sp_runtime::traits::Zero::zero() { | ||||
|  | ||||
							
								
								
									
										0
									
								
								runtime/common/src/weights/block_weights.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								runtime/common/src/weights/block_weights.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
								
								
									
										0
									
								
								runtime/common/src/weights/extrinsic.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								runtime/common/src/weights/extrinsic.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
								
								
									
										0
									
								
								runtime/common/src/weights/mod.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								runtime/common/src/weights/mod.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -1,7 +1,6 @@ | ||||
| [Unit] | ||||
| Description=Ghost Node | ||||
| After=network-online.target | ||||
| Requires=network-online.target | ||||
| After=network.target | ||||
| Documentation=https://git.ghostchain.io/ghostchain/ghost-node | ||||
| 
 | ||||
| [Service] | ||||
|  | ||||
| @ -1,2 +0,0 @@ | ||||
| SCRIPT_DIR=$(dirname "$0") | ||||
| bash "$SCRIPT_DIR/patches/patch-1.sh" | ||||
| @ -1,32 +0,0 @@ | ||||
| DEFAULT_SERVICE_NAME="ghost-node.service" | ||||
| 
 | ||||
| check_unit_file_validity() { | ||||
|     SERVICE_NAME=$1 | ||||
|     if [[ "$SERVICE_NAME" != *.service ]]; then | ||||
|         SERVICE_NAME="${SERVICE_NAME}.service" | ||||
|     fi | ||||
| 
 | ||||
|     SERVICE_FULL_PATH="/etc/systemd/system/$SERVICE_NAME" | ||||
|     if [[ -e "$SERVICE_FULL_PATH" ]]; then | ||||
|         NETWORK_ONLINE_EXISTS=$(grep -Fx "After=network-online.target" "$SERVICE_FULL_PATH") | ||||
|         NETWORK_EXISTS=$(grep -Fx "After=network.target"  "$SERVICE_FULL_PATH") | ||||
| 
 | ||||
|         if [[ -z "$NETWORK_ONLINE_EXISTS" && -n "$NETWORK_EXISTS" ]] | ||||
|         then | ||||
|             echo "[-] WARNING: missing network-online.target dependency in $SERVICE_FULL_PATH, trying to replace" | ||||
|             sudo sed -i "s/After=network.target/After=network-online.target\nRequires=network-online.target/g" "$SERVICE_FULL_PATH" | ||||
|         else | ||||
|             echo "[+] INFO: network-online.target is set correctly for $SERVICE_FULL_PATH" | ||||
|         fi | ||||
|     else | ||||
|         echo "[-] No serivce found at $SERVICE_FULL_PATH" | ||||
|     fi | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| check_unit_file_validity $DEFAULT_SERVICE_NAME | ||||
| read -p "[?] Enter names for the node service, separated by commas (default: ghost-node): " -a SERVICE_NAMES | ||||
| for NAME in "${SERVICE_NAMES[@]}"; do | ||||
|     check_unit_file_validity $NAME  | ||||
| done | ||||
| sudo systemctl daemon-reload | ||||
| @ -2,13 +2,11 @@ | ||||
| 
 | ||||
| set -Ee | ||||
| 
 | ||||
| HARD_RESET=false | ||||
| CHECK_KEYS=false | ||||
| INSERT_KEYS=false | ||||
| UNIT_FILE=false | ||||
| SKIP_BUILD=false | ||||
| SET_ENVIRONMENT=false | ||||
| VALIDATE=false | ||||
| EXECUTABLE_PATH="/usr/bin/" | ||||
| SPECIFICATION_PATH="/etc/ghost/" | ||||
| BASE_PATH="/var/lib/ghost" | ||||
| @ -80,30 +78,6 @@ extract_seed() { | ||||
|     echo $seed | ||||
| } | ||||
| 
 | ||||
| downgrade_compiler_if_needed() { | ||||
|     echo "[+] fetching the latest ghost-node source code" | ||||
|     git switch main | ||||
|     git pull origin main | ||||
|      | ||||
|     # 1.86.0 works fine, tested with: | ||||
|     # 1.87.0 throws errors during compilation | ||||
|     # 1.88.0 throws errors during compilation | ||||
|     LATEST_TESTED_VERSION=86 | ||||
|     cargo_version=$(cargo --version | cut -d'.' -f2) | ||||
|     if [ "$cargo_version" -gt "$LATEST_TESTED_VERSION" ]; then  | ||||
|         echo "[+] downgrading rustc compiler version to 1.86.0" | ||||
|         rustup default 1.86.0 | ||||
|         toolchain_name=$(rustup show | grep default | head -n 1 | cut -d' ' -f1) | ||||
|         rustup target add wasm32-unknown-unknown --toolchain $toolchain_name | ||||
|         rustup component add rust-src --toolchain $toolchain_name | ||||
|         cd $PROJECT_FOLDER | ||||
|         echo "[+] clean build cache..." | ||||
|         cargo clean | ||||
|     else | ||||
|         echo "[+] rustc compiler version is compatible" | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| help() { | ||||
|     echo -e "Ghost Node Build automation tool. Helper for Ghost Node environment preparation.\n" | ||||
|     echo -e "With no OPTION nothing will happen, possible OPTION:\n" | ||||
| @ -114,14 +88,12 @@ help() { | ||||
|     echo -e "-k, --check-keys\n\tCheck if your keys are already included in 'ghosties' file." | ||||
|     echo -e "-y, --insert-keys\n\tInsert session keys to the keystore via JSON RPC." | ||||
|     echo -e "-r, --release\n\tCompile node with '--release' flag." | ||||
|     echo -e "-v, --validate\n\tManipulate '--validate' flag in CLI_ARGS." | ||||
|     echo -e "-p, --profile\n\tCompile node with '--profile [PROFILE]' flag." | ||||
|     echo -e "-f, --features\n\tCompilation features '--features=\"FEATURE1,FEATURE2\"'" | ||||
|     echo -e "-e, --executable-path\n\tPath to the executable ('/usr/lib/' is default)." | ||||
|     echo -e "-s, --base-path\n\tPath to the folder with chain database ('/var/lib/ghost' is default)." | ||||
|     echo -e "-c, --specification-path\n\tPath to specification ('/etc/ghost' is default)." | ||||
|     echo -e "-n, --specification-name\n\tSpecification name to be used ('casper' is default)." | ||||
|     echo -e "--hard-reset-i-know-what-im-doing\n\tWill completely remove ledger along with associated session keys." | ||||
|     echo -e "-h, --help\n\tPrints help information." | ||||
| } | ||||
| 
 | ||||
| @ -161,9 +133,6 @@ while [ $# -gt 0 ]; do | ||||
|             RELEASE="--release" | ||||
|             TARGET="release" | ||||
|             ;; | ||||
|         --validate|-v) | ||||
|             VALIDATE=true | ||||
|             ;; | ||||
|         --profile*|-p*) | ||||
|             if [[ "$1" != *=* ]]; then shift; fi | ||||
|             RELEASE="--profile=${1#*=}" | ||||
| @ -189,9 +158,6 @@ while [ $# -gt 0 ]; do | ||||
|             if [[ "$1" != *=* ]]; then shift; fi | ||||
|             SPECIFICATION_NAME="${1#*=}" | ||||
|             ;; | ||||
|         --hard-reset-i-know-what-im-doing) | ||||
|             HARD_RESET=true | ||||
|             ;; | ||||
|         --help|-h) | ||||
|             help | ||||
|             exit 0 | ||||
| @ -204,51 +170,6 @@ while [ $# -gt 0 ]; do | ||||
|     shift | ||||
| done | ||||
| 
 | ||||
| if [[ $HARD_RESET = true ]]; then | ||||
|     echo -e "\n" | ||||
|     echo "WARNING!!! THIS ACTION WILL COMPLETELY PURGE THE LEDGER AND REBUILD THE NODE USING THE LATEST" | ||||
|     echo "REPOSITORY VERSION. NOTE THAT THE VALIDATION PROCESS WILL BE LOST BECAUSE SESSION OF KEYS." | ||||
|     echo "THERE ARE TWO SCENARIOS IN WHICH YOU MIGHT NEED TO PROCEED:" | ||||
|     echo -e "\t- A new version of the network hsa been released, and a restart is neccessary" | ||||
|     echo -e "\t- There is a critical issue, and you require a hard reset of the node in a single command" | ||||
|     echo -e "\n" | ||||
|     if prompt "[?] do you understand all risks?"; then | ||||
|         echo "[+] you were warned, I hope you know what you're doing" | ||||
|     else | ||||
|         echo "[-] aborting hard reset" | ||||
|         exit 1 | ||||
|     fi | ||||
| 
 | ||||
|     downgrade_compiler_if_needed | ||||
| 
 | ||||
|     echo "[+] trying to stop current ghost-node" | ||||
|     sudo systemctl stop ghost-node | ||||
|     echo "[+] trying to remove locally stored ledger" | ||||
|     sudo rm -rf "$BASE_PATH/chains/casper_staging_testnet" | ||||
| 
 | ||||
|     cd $PROJECT_FOLDER | ||||
|     git pull origin main | ||||
|     echo "[+] starting build in 3 seconds..." | ||||
|     sleep 3 | ||||
|     cargo build --release | ||||
| 
 | ||||
|     printf "[?] are you ready to continue?" | ||||
|     read anything | ||||
| 
 | ||||
|     cd $PROJECT_FOLDER | ||||
|     echo "[+] trying to copy executable to '$EXECUTABLE_PATH'" | ||||
|     sudo cp target/$TARGET/ghost $EXECUTABLE_PATH | ||||
|     cp service/chain-specs/$SPECIFICATION_NAME.json $SPECIFICATION_PATH | ||||
| 
 | ||||
|     echo "[+] ghost executable copied in '$EXECUTABLE_PATH' from '$TARGET'" | ||||
|     echo "[+] specification '$SPECIFICATION_NAME.json' copied to '$SPECIFICATION_PATH'" | ||||
| 
 | ||||
|     echo "[+] starting ghost-node" | ||||
|     sudo systemctl start ghost-node | ||||
| 
 | ||||
|     exit 0 | ||||
| fi | ||||
| 
 | ||||
| if [[ $SET_ENVIRONMENT = true ]]; then | ||||
|     echo -e "\n" | ||||
|     echo "WARNING!!! THIS IS HIGHLY EXPERIMENTAL FLAG, USE IT ONLY ON YOUR" | ||||
| @ -327,46 +248,21 @@ if [[ $SET_ENVIRONMENT = true ]]; then | ||||
| 
 | ||||
|     if prompt "[?] setup the rust environment (e.g. WASM support)?"; then | ||||
|         rustup default stable | ||||
|         downgrade_compiler_if_needed | ||||
|         rustup update | ||||
|         rustup target add wasm32-unknown-unknown | ||||
|         rustup component add rust-src | ||||
|     fi | ||||
| fi | ||||
| 
 | ||||
| if [[ ! -z $RELEASE ]]; then | ||||
|     downgrade_compiler_if_needed | ||||
|     if prompt "[?] 'cargo build $RELEASE $FEATURES' is what you want?"; then  | ||||
|         cd $PROJECT_FOLDER | ||||
|         echo "[+] starting build in 3 seconds..." | ||||
|         echo "[+] Starting build in 3 seconds..." | ||||
|         sleep 3 | ||||
|         cargo build $RELEASE $FEATURES | ||||
|     fi | ||||
| fi | ||||
| 
 | ||||
| if [[ $VALIDATE = true ]]; then | ||||
|     cli_args=$(cat /etc/default/ghost) | ||||
|     if prompt "[?] turn on validator mode?"; then | ||||
|         if [[ $cli_args == *"--validator"* ]]; then | ||||
|             echo "[+] '--validator' flag already exists in CLI_ARGS, check /etc/default/ghost" | ||||
|         else | ||||
|             cli_args="${cli_args%?} --validator\"" | ||||
|             echo "[+] '--validator' flag inserted to CLI_ARGS, check /etc/default/ghost" | ||||
|         fi | ||||
|     else | ||||
|         cli_args=${cli_args// --validator/} | ||||
|         echo "[+] '--validator' flag removed" | ||||
|     fi | ||||
| 
 | ||||
|     echo "[+] trying to store CLI updated arguments to '/etc/default/ghost'" | ||||
|     echo "$cli_args" | sudo tee /etc/default/ghost > /dev/null | ||||
|     echo "[+] updated CLI arguments stored in '/etc/default/ghost'" | ||||
| 
 | ||||
|     if prompt "[?] do you want to restart 'ghost-node.service' now?"; then | ||||
|         sudo systemctl status ghost-node.service | ||||
|         echo "[+] 'ghost-node.service' succefully restarted, new CLI_ARGS applied" | ||||
|     else | ||||
|         echo "[+] don't forget to restart ghost node service manually" | ||||
|     fi | ||||
| fi | ||||
| 
 | ||||
| if [[ $MAKE_GLOBAL = true ]]; then | ||||
|     cd $PROJECT_FOLDER | ||||
|     echo "[+] trying to copy executable to '$EXECUTABLE_PATH'" | ||||
| @ -420,6 +316,7 @@ if [[ $ARGUMENTS = true ]]; then | ||||
|         CLI_ARGS+=("--public-addr=$public_addr") | ||||
|     fi | ||||
| 
 | ||||
| 
 | ||||
|     # default for now | ||||
|     CLI_ARGS+=("--telemetry-url='wss://telemetry.ghostchain.io/submit/ 9'") | ||||
|     CLI_ARGS+=("--base-path=$BASE_PATH") | ||||
|  | ||||
							
								
								
									
										20
									
								
								service/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										20
									
								
								service/Cargo.toml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -107,16 +107,16 @@ default = ["db", "full-node"] | ||||
| db = ["sc-service/rocksdb"] | ||||
| full-node = ["kvdb-rocksdb", "parity-db"] | ||||
| runtime-benchmarks = [ | ||||
|     "frame-benchmarking-cli/runtime-benchmarks", | ||||
|     "frame-benchmarking/runtime-benchmarks", | ||||
|     "frame-support/runtime-benchmarks", | ||||
|     "frame-system/runtime-benchmarks", | ||||
|     "pallet-babe/runtime-benchmarks", | ||||
|     "pallet-staking/runtime-benchmarks", | ||||
|     "casper-runtime?/runtime-benchmarks", | ||||
|     "sc-client-db/runtime-benchmarks", | ||||
|     "sc-service/runtime-benchmarks", | ||||
|     "sp-runtime/runtime-benchmarks", | ||||
| 	"frame-benchmarking-cli/runtime-benchmarks", | ||||
| 	"frame-benchmarking/runtime-benchmarks", | ||||
| 	"frame-support/runtime-benchmarks", | ||||
| 	"frame-system/runtime-benchmarks", | ||||
| 	"pallet-babe/runtime-benchmarks", | ||||
| 	"pallet-staking/runtime-benchmarks", | ||||
| 	"casper-runtime?/runtime-benchmarks", | ||||
| 	"sc-client-db/runtime-benchmarks", | ||||
| 	"sc-service/runtime-benchmarks", | ||||
| 	"sp-runtime/runtime-benchmarks", | ||||
| ] | ||||
| try-runtime = [ | ||||
|     "frame-support/try-runtime", | ||||
|  | ||||
							
								
								
									
										444
									
								
								service/chain-specs/casper-tmp.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										444
									
								
								service/chain-specs/casper-tmp.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -1,4 +1,3 @@ | ||||
| 
 | ||||
| ### TEMPLATE ### | ||||
| Local identity             : ./PATH_TO_GHOST/ghost key inspect-node-key --bin --file PATH_TO_NODE_KEY | ||||
| Public key (hex) wallet    : ./PATH_TO_GHOST/ghost key inspect $(cat PATH_TO_WALLET_KEY) | ||||
| @ -109,32 +108,12 @@ Public key (hex) for babe  : 0x8006e3f6e3d92c4c5f2e2f001452e4993e6d5c2b1136f2ae6 | ||||
| Public key (hex) for slow  : 0xaaa41b6ade4c30b5792aa6e5604c444e424900ddf649b23eed4bd0d7f5d3a34f  | ||||
| Public key (hex) for gran  : 0x86ee138c9e7e67c1c2e157c0ba888761a122d8b9aa6a8653e886ac329e34255d  | ||||
| 
 | ||||
| ### Osiris-3 ### | ||||
| Local identity             : 12D3KooWSDL7dwYgExExi7vuxzMJFyLrsyx4oLJCejv9Q2gste93 | ||||
| Public key (hex) wallet    : 0x64f685baa838323c0ef8c45259a3036b3e2bc54edf6553ce323e25b5e37a3721 | ||||
| ### Kitsune_3 ### | ||||
| Local identity             : 12D3KooWJMiF7LUmDZ17NJRi9yHusHG4hrLGxoPv6sS7K2Vpn9P2 | ||||
| Public key (hex) wallet    : 0x385a826ba8113391c26d03c8bf3d911ce8f20a523ba19da996926e401226e921 | ||||
| =============================================================================================== | ||||
| Public key (hex) for stash : 0x40eef1c6c8d8242ccbd3f03144bd4ea1a7374cbd8219e2849d3a3ee78f1da045 | ||||
| Public key (hex) for audi  : 0x8c3e730f6e6ecfb96581091e71556175384f077bee31b0199f13321df018427d | ||||
| Public key (hex) for babe  : 0x3a145fb664353e473f1937058c881b14ed150285f3cec1aff348c5209d56d96d | ||||
| Public key (hex) for slow  : 0xceb294227950d177b63e6c1d10a66131f5da3792428b03f5b83be84a33db215f | ||||
| Public key (hex) for gran  : 0x0c0891a518270014530061bd217606269686abdf3c1d237a3c6a3db308fc2d0d | ||||
| 
 | ||||
| ### Ogenkido ### | ||||
| Local identity              : 12D3KooW9zt8De3STX4TC8mALfDn8oJw1Qw6dBhRwu2aTabroBBr | ||||
| Public key (hex) wallet     : 0xa0a87a75dba18037aa2e7b8036ce951e8d8356104758e15c9f44e2fd7d1bbc41 | ||||
| =============================================================================================== | ||||
| Public key (hex) for stash  : 0x422e16b0c58f03af378d1638fe56127f337abf1d1a4a740c3371714616abd43d | ||||
| Public key (hex) for audi   : 0x52fe2b63b03a0d439923967278442418a2d1f0d250bcab26f85f12ea212cbd3e | ||||
| Public key (hex) for babe   : 0x78f612068566eb6cc5cb5d9f1fda92c5dc3e3888eb61eb1af27af6855365ba3c | ||||
| Public key (hex) for slow   : 0x027dd852bf20bef53545afd1e08bf8760abb6b1af1df6c17e73f4cf88210ee46 | ||||
| Public key (hex) for gran   : 0xdba3613933d60ca248ee024deac42bc9c8c2d9fe8734b6052cd9a148978cbedb | ||||
| 
 | ||||
| ### Youconnect  ### | ||||
| Local identity             : 12D3KooWJXBYA7cUQLLenEfT7hmCjBJ6fyikDy8YhNz4aLfwbBC8 | ||||
| Public key (hex) wallet    : 0x6e4429a8fa85cfe2a60488af446d57e719207831b2579b937325645e110bb666 | ||||
| =============================================================================================== | ||||
| Public key (hex) for stash : 0x3a6626211a2dd35683fd7cb5f2f343d75f2b698d6c48c2d6eb1cdbe116e32315 | ||||
| Public key (hex) for audi  : 0x86676ad3cd2d970b86dee2f25d4318f9bba40455111f16300e114e7f00c58706 | ||||
| Public key (hex) for babe  : 0x6c0aec49974aaff08ff962a2d8d7857227d027ed27a272cbc4acaa1ee937db0f | ||||
| Public key (hex) for slow  : 0x009712519ba7dad1c682c871b94573ccaba8b7d530f7194fb16bf553fd7ae67d | ||||
| Public key (hex) for gran  : 0x935becdfb2e0d4fcd46ba82e680cfc447180de6b85ec42d17f1396a520b0c04f | ||||
| Public key (hex) for stash: 0xba821401516b2429cd25e506c1af11b23808d039d1319d6b2eb7a9222d922179 | ||||
| Public key (hex) for audi  : 0x8a71ce9314f6ce6187212224da37d803ff953c0bea6e9b52259909957fe46e66 | ||||
| Public key (hex) for babe  : 0xc84a00e50fb4b50fe945889dbd4a2c24210fcc36edd976fc49c0fd322f3f6d07 | ||||
| Public key (hex) for slow  : 0x6af821ab5387304a9d91eee066b1b240d91d048b338a34550fad743dee9a6d29 | ||||
| Public key (hex) for gran  : 0xb3793f1e62cbe7c3df68a0e53ff436253bedde15d3e927c418201033992c2707 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| use keyring::Sr25519Keyring; | ||||
| use primitives::AccountId; | ||||
| use sc_client_api::UsageProvider; | ||||
| use sp_runtime::OpaqueExtrinsic; | ||||
| use keyring::Sr25519Keyring; | ||||
| 
 | ||||
| use crate::*; | ||||
| 
 | ||||
| @ -21,41 +21,27 @@ macro_rules! identify_chain { | ||||
|                 { | ||||
|                     use ghost_runtime as runtime; | ||||
|                     let call = $generic_code; | ||||
|                     Ok(ghost_sign_call( | ||||
|                         call, | ||||
|                         $nonce, | ||||
|                         $current_block, | ||||
|                         $period, | ||||
|                         $genesis, | ||||
|                         $signer, | ||||
|                     )) | ||||
|                     Ok(ghost_sign_call(call, $nonce, $current_block, $period, $genesis, $signer)) | ||||
|                 } | ||||
| 
 | ||||
|                 #[cfg(not(feature = "ghost-native"))] | ||||
|                 { | ||||
|                     Err("`ghost-native` feature not enabled") | ||||
|                 } | ||||
|             } | ||||
|             }, | ||||
|             Chain::Casper => { | ||||
|                 #[cfg(feature = "casper-native")] | ||||
|                 { | ||||
|                     use casper_runtime as runtime; | ||||
|                     let call = $generic_code; | ||||
|                     Ok(casper_sign_call( | ||||
|                         call, | ||||
|                         $nonce, | ||||
|                         $current_block, | ||||
|                         $period, | ||||
|                         $genesis, | ||||
|                         $signer, | ||||
|                     )) | ||||
|                     Ok(casper_sign_call(call, $nonce, $current_block, $period, $genesis, $signer)) | ||||
|                 } | ||||
| 
 | ||||
|                 #[cfg(not(feature = "casper-native"))] | ||||
|                 { | ||||
|                     Err("`casper-native` feature not enabled") | ||||
|                 } | ||||
|             } | ||||
|             }, | ||||
|             Chain::Unknown => { | ||||
|                 let _ = $nonce; | ||||
|                 let _ = $current_block; | ||||
| @ -64,7 +50,7 @@ macro_rules! identify_chain { | ||||
|                 let _ = $signer; | ||||
| 
 | ||||
|                 Err("Unknown chain") | ||||
|             } | ||||
|             }, | ||||
|         } | ||||
|     }; | ||||
| } | ||||
| @ -119,11 +105,7 @@ pub struct TransferKeepAliveBuilder { | ||||
| 
 | ||||
| impl TransferKeepAliveBuilder { | ||||
|     pub fn new(client: Arc<FullClient>, dest: AccountId, chain: Chain) -> Self { | ||||
|         Self { | ||||
|             client, | ||||
|             dest, | ||||
|             chain, | ||||
|         } | ||||
|         Self { client, dest, chain } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -177,9 +159,10 @@ fn casper_sign_call( | ||||
|         frame_system::CheckSpecVersion::<casper_runtime::Runtime>::new(), | ||||
|         frame_system::CheckTxVersion::<casper_runtime::Runtime>::new(), | ||||
|         frame_system::CheckGenesis::<casper_runtime::Runtime>::new(), | ||||
|         frame_system::CheckMortality::<casper_runtime::Runtime>::from( | ||||
|             sp_runtime::generic::Era::mortal(period, current_block), | ||||
|         ), | ||||
|         frame_system::CheckMortality::<casper_runtime::Runtime>::from(sp_runtime::generic::Era::mortal( | ||||
|             period, | ||||
|             current_block, | ||||
|         )), | ||||
|         frame_system::CheckNonce::<casper_runtime::Runtime>::from(nonce), | ||||
|         frame_system::CheckWeight::<casper_runtime::Runtime>::new(), | ||||
|         pallet_transaction_payment::ChargeTransactionPayment::<casper_runtime::Runtime>::from(0), | ||||
| @ -206,8 +189,7 @@ fn casper_sign_call( | ||||
|         sp_runtime::AccountId32::from(acc.public()).into(), | ||||
|         primitives::Signature::Sr25519(signature), | ||||
|         extra, | ||||
|     ) | ||||
|     .into() | ||||
|     ).into() | ||||
| } | ||||
| 
 | ||||
| pub fn benchmark_inherent_data() -> std::result::Result<inherents::InherentData, inherents::Error> { | ||||
|  | ||||
							
								
								
									
										269
									
								
								service/src/chain_spec.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										269
									
								
								service/src/chain_spec.rs
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -2,18 +2,18 @@ | ||||
| 
 | ||||
| use codec::Encode; | ||||
| 
 | ||||
| use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; | ||||
| use babe_primitives::AuthorityId as BabeId; | ||||
| use ghost_slow_clap::sr25519::AuthorityId as SlowClapId; | ||||
| use primitives::{AccountId, AccountPublic}; | ||||
| use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; | ||||
| use grandpa_primitives::AuthorityId as GrandpaId; | ||||
| use babe_primitives::AuthorityId as BabeId; | ||||
| #[cfg(feature = "casper-native")] | ||||
| use pallet_staking::Forcing; | ||||
| use primitives::{AccountId, AccountPublic}; | ||||
| 
 | ||||
| #[cfg(feature = "casper-native")] | ||||
| use casper_runtime as casper; | ||||
| #[cfg(feature = "casper-native")] | ||||
| use casper_runtime_constants::currency::{CSPR, STRH}; | ||||
| use casper_runtime_constants::currency::CSPR; | ||||
| use sc_chain_spec::ChainSpecExtension; | ||||
| #[cfg(feature = "casper-native")] | ||||
| use sc_chain_spec::ChainType; | ||||
| @ -58,7 +58,7 @@ pub type CasperChainSpec = sc_service::GenericChainSpec<(), Extensions>; | ||||
| pub type CasperChainSpec = GenericChainSpec; | ||||
| 
 | ||||
| pub fn casper_config() -> Result<CasperChainSpec, String> { | ||||
|     CasperChainSpec::from_json_bytes(&include_bytes!("../chain-specs/casper.json")[..]) | ||||
|    CasperChainSpec::from_json_bytes(&include_bytes!("../chain-specs/casper.json")[..]) | ||||
| } | ||||
| 
 | ||||
| #[cfg(feature = "casper-native")] | ||||
| @ -76,6 +76,7 @@ fn casper_session_keys( | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub fn casper_chain_spec_properties() -> serde_json::map::Map<String, serde_json::Value> { | ||||
|     serde_json::json!({ | ||||
|         "ss58Format": 1996, | ||||
| @ -160,59 +161,42 @@ fn casper_testnet_accounts() -> Vec<AccountId> { | ||||
| fn casper_testnet_evm_accounts() -> Vec<(AccountId, u128, u8)> { | ||||
|     vec![ | ||||
|         // 01c928771aea942a1e7ac06adf2b73dfbc9a25d9eaa516e3673116af7f345198
 | ||||
|         ( | ||||
|             get_account_id_from_seed::<sr25519::Public>("1A69d2D5568D1878023EeB121a73d33B9116A760"), | ||||
|             1337 * CSPR, | ||||
|             1, | ||||
|         ), | ||||
|         (get_account_id_from_seed::<sr25519::Public>("1A69d2D5568D1878023EeB121a73d33B9116A760"), 1337 * CSPR, 1), 
 | ||||
|         // b19a435901872f817185f7234a1484eae837613f9d10cf21927a23c2d8cb9139
 | ||||
|         ( | ||||
|             get_account_id_from_seed::<sr25519::Public>("2f86cfBED3fbc1eCf2989B9aE5fc019a837A9C12"), | ||||
|             1337 * CSPR, | ||||
|             2, | ||||
|         ), | ||||
|         (get_account_id_from_seed::<sr25519::Public>("2f86cfBED3fbc1eCf2989B9aE5fc019a837A9C12"), 1337 * CSPR, 2), 
 | ||||
|         // d3baf57b74d65719b2dc33f5a464176022d0cc5edbca002234229f3e733875fc
 | ||||
|         ( | ||||
|             get_account_id_from_seed::<sr25519::Public>("e83f67361Ac74D42A48E2DAfb6706eb047D8218D"), | ||||
|             69 * CSPR, | ||||
|             3, | ||||
|         ), | ||||
|         (get_account_id_from_seed::<sr25519::Public>("e83f67361Ac74D42A48E2DAfb6706eb047D8218D"), 69   * CSPR, 3), 
 | ||||
|         // c4683d566436af6b58b4a59c8f501319226e85b21869bf93d5eeb4596d4791d4
 | ||||
|         ( | ||||
|             get_account_id_from_seed::<sr25519::Public>("827ee4ad9b259b6fa1390ed60921508c78befd63"), | ||||
|             69 * CSPR, | ||||
|             4, | ||||
|         ), | ||||
|         (get_account_id_from_seed::<sr25519::Public>("827ee4ad9b259b6fa1390ed60921508c78befd63"), 69   * CSPR, 4), 
 | ||||
|     ] | ||||
| } | ||||
| 
 | ||||
| #[cfg(feature = "casper-native")] | ||||
| fn casper_testnet_evm_networks() -> Vec<(u32, Vec<u8>)> { | ||||
|     vec![( | ||||
|         11155111, | ||||
|         ghost_networks::NetworkData { | ||||
|             chain_name: "sepolia-ethereum-testnet".into(), | ||||
|             default_endpoints: vec![ | ||||
|                 "https://sepolia.drpc.org".into(), | ||||
|                 "https://sepolia.gateway.tenderly.co".into(), | ||||
|                 "https://api.zan.top/eth-sepolia".into(), | ||||
|                 "https://rpc.sepolia.ethpandaops.io".into(), | ||||
|                 "https://ethereum-sepolia-rpc.publicnode.com".into(), | ||||
|                 "https://1rpc.io/sepolia".into(), | ||||
|                 "https://0xrpc.io/sep".into(), | ||||
|                 "https://eth-sepolia.api.onfinality.io/public".into(), | ||||
|             ], | ||||
|             finality_delay: 69u64, | ||||
|             rate_limit_delay: 5_000u64, | ||||
|             block_distance: 20u64, | ||||
|     vec![ | ||||
|         (1, ghost_networks::NetworkData { 
 | ||||
|             chain_name: "ethereum-mainnet".into(), 
 | ||||
|             default_endpoint: "https://nd-422-757-666.p2pify.com/0a9d79d93fb2f4a4b1e04695da2b77a7/".into(), | ||||
|             finality_delay: Some(40u64), | ||||
|             release_delay: Some(80u64), | ||||
|             network_type: ghost_networks::NetworkType::Evm, | ||||
|             gatekeeper: "0xc85129A097773B7F8970a7364c928C05f265E6A1".into(), | ||||
|             topic_name: "0x7ab52ec05c331e6257a3d705d6bea6e4c27277351764ad139209e06b203811a6".into(), | ||||
|             incoming_fee: 69_000_000u32, | ||||
|             gatekeeper: "0x4d224452801aced8b2f0aebe155379bb5d594381".into(), | ||||
|             topic_name: "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef".into(), | ||||
|             incoming_fee: 0u32, | ||||
|             outgoing_fee: 0u32, | ||||
|         } | ||||
|         .encode(), | ||||
|     )] | ||||
|         }.encode()), | ||||
|         (56, ghost_networks::NetworkData { 
 | ||||
|             chain_name: "bnb-mainnet".into(), 
 | ||||
|             default_endpoint: "https://bsc-mainnet.core.chainstack.com/35848e183f3e3303c8cfeacbea831cab/".into(), | ||||
|             finality_delay: Some(20u64), | ||||
|             release_delay: Some(40u64), | ||||
|             network_type: ghost_networks::NetworkType::Evm, | ||||
|             gatekeeper: "0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82".into(), | ||||
|             topic_name: "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef".into(), | ||||
|             incoming_fee: 0u32, | ||||
|             outgoing_fee: 0u32, | ||||
|         }.encode()) | ||||
|     ] | ||||
| } | ||||
| 
 | ||||
| /// Helper function to create casper `GenesisConfig` for testing
 | ||||
| @ -230,11 +214,14 @@ pub fn testnet_config_genesis( | ||||
|     ghost_accounts: Option<Vec<(AccountId, u128, u8)>>, | ||||
|     evm_networks: Option<Vec<(u32, Vec<u8>)>>, | ||||
| ) -> serde_json::Value { | ||||
|     let endowed_accounts: Vec<AccountId> = endowed_accounts.unwrap_or_else(casper_testnet_accounts); | ||||
|     let endowed_accounts: Vec<AccountId> = endowed_accounts | ||||
|         .unwrap_or_else(casper_testnet_accounts); | ||||
| 
 | ||||
|     let ghost_accounts: Vec<(AccountId, u128, u8)> = ghost_accounts.unwrap_or_default(); | ||||
|     let ghost_accounts: Vec<(AccountId, u128, u8)> = ghost_accounts | ||||
|         .unwrap_or_default(); | ||||
| 
 | ||||
|     let evm_networks: Vec<(u32, Vec<u8>)> = evm_networks.unwrap_or_default(); | ||||
|     let evm_networks: Vec<(u32, Vec<u8>)> = evm_networks | ||||
|         .unwrap_or_default(); | ||||
| 
 | ||||
|     const ENDOWMENT: u128 = 1_000 * CSPR; | ||||
|     const STASH: u128 = 500 * CSPR; | ||||
| @ -283,11 +270,6 @@ pub fn testnet_config_genesis( | ||||
|         "babe": { | ||||
|             "epochConfig": Some(casper::BABE_GENESIS_EPOCH_CONFIG), | ||||
|         }, | ||||
|         "ghostSudo": { | ||||
|             "key": endowed_accounts | ||||
|                 .first() | ||||
|                 .cloned(), | ||||
|         }, | ||||
|         "ghostNetworks": { | ||||
|             "networks": evm_networks, | ||||
|         }, | ||||
| @ -313,12 +295,25 @@ fn casper_staging_config_genesis() -> serde_json::Value { | ||||
|         hex!["328d3b7c3046ef7700937d99fb2e98ce2591682c2b5dcf3f562e4da157650237"].into(), | ||||
|         // sfEwRjyvEQcpRQ1qbCZum27nEkTggKEt7DtqxwyYQULt9UuUN
 | ||||
|         hex!["3666e4e19f87bb8680495f31864ce1f1c69d4178002cc01911aef2cc7313f203"].into(), | ||||
|         // sfHcJxw5cgkvukZZyxcNUMCdbm9e7773orByLrGgAREka81TK
 | ||||
|         hex!["ac871e8bab00dd56ba3a1c0bd289357203dcaf10010b0b04ad7472870cd22a3c"].into(), | ||||
|         // sfFD7KSRi2aSREJWc9X75sVTN4a5pbPM5VSSJefmPvMuiVbPr
 | ||||
|         hex!["425ccd7bda4f5c76788ba23bc0381d7a2e496179c93301208c57501c80a4232a"].into(), | ||||
|         // sfH29zyFYtoFj6fSXskAEXG5XyyMCa5YycahJkYMwSUz8CcEU
 | ||||
|         hex!["927a98dcf8f721103005f168476c24b91d7d10d580f457006a908e10e62c7729"].into(), | ||||
|         // sfHcRoUmrL8GDmWxUcPcZEWVfJbnaXyjWuaBxu5pNtdW5nERK
 | ||||
|         hex!["ac9e227e30a63ce6eeb55cfbb1fb832aa7e1d3fad2bcb3f663de4a91d744fd50"].into(), | ||||
|         // sfFJuDxqSc3skWaNUQgqmtCDYvcRj9c56urEky7ByD26aXQEW
 | ||||
|         hex!["46c78fcacffd80abc9cca4917ef8369a37e21a1691ca11e7a3b53f80be745313"].into(), | ||||
|         // sfKNNbANdBuBpA4n1sXwPBhV57HBgV2y3R3YjHz1S1uWKfKAy
 | ||||
|         hex!["fa5e5a295ec74c3dda81118d9240db1552b28f831838465ae0712e97e78a6728"].into(), | ||||
|         // sfFAdZQQVdbCTA7eWomTrJXe5L8ZcwZRfkyyRkMQZftDqbcMg
 | ||||
|         hex!["4078ddb1ba1388f768fe6aa40ba9124a72692ecbcc83dc088fa86c735e4dc128"].into(), | ||||
|         // sfFqT8fmF15Ddshio5rnucmqzMxtUoHZVh7qSALSdAaM7Y6zb
 | ||||
|         hex!["5e1456904c40192cd3a18183df7dffea90d97739830a902cabb702ecdae4f649"].into(), | ||||
|     ]; | ||||
| 
 | ||||
| 
 | ||||
|     let initial_authorities: Vec<( | ||||
|         AccountId, | ||||
|         AccountId, | ||||
| @ -333,17 +328,13 @@ fn casper_staging_config_genesis() -> serde_json::Value { | ||||
|             // sfFXZmnDVnkQ781J2gbqUpi7K5KgMWMdM4eeii74xxGgKYnNN
 | ||||
|             hex!["507045c82be367f95408466cd054ca39bfa52697a3ef22809af14cf9de304f02"].into(), | ||||
|             // sfJeojACBa7WiH6tBwikBKAMU2oKmseEBD1GYUYATvfWuLcPa
 | ||||
|             hex!["daaaaab6a6e574099e24ae9bb75b543610edef9d374fa85a378edb573b47615f"] | ||||
|                 .unchecked_into(), | ||||
|             hex!["daaaaab6a6e574099e24ae9bb75b543610edef9d374fa85a378edb573b47615f"].unchecked_into(), | ||||
|             // sfFdtzNxJdeEkgHxvk144rJKxf7wcYvgX5tqfgZRutW9YvAKE
 | ||||
|             hex!["55446f9a7aa99ced06b317c80ce90d56b84e56526775683af2525969e8da0b64"] | ||||
|                 .unchecked_into(), | ||||
|             hex!["55446f9a7aa99ced06b317c80ce90d56b84e56526775683af2525969e8da0b64"].unchecked_into(), | ||||
|             // sfE8gsMYAjAJHk5gyYZN7AW6pfmJ7V9H7xxWto24nmhzCUXaQ
 | ||||
|             hex!["12c14850562021eb99f58f90ab624fb6cfaf3ac9228a92f8b60115fe6a6af15a"] | ||||
|                 .unchecked_into(), | ||||
|             hex!["12c14850562021eb99f58f90ab624fb6cfaf3ac9228a92f8b60115fe6a6af15a"].unchecked_into(), | ||||
|             // sfE3GKSrKZzrZpdapJ2VGRpPor45T4D4i8QBZNumSNGqGv7PX
 | ||||
|             hex!["0e9e698c7b2bf5ce3861cb4bc4ddf9e200237c282025b093ada850d764d12a35"] | ||||
|                 .unchecked_into(), | ||||
|             hex!["0e9e698c7b2bf5ce3861cb4bc4ddf9e200237c282025b093ada850d764d12a35"].unchecked_into(), | ||||
|         ), | ||||
|         ( | ||||
|             // sfHLqWNC4hMKHhwvPWmWcxZsDPhCTQKgh1Ap7pm3qML5GBTBa
 | ||||
| @ -351,17 +342,27 @@ fn casper_staging_config_genesis() -> serde_json::Value { | ||||
|             // sfHLqWNC4hMKHhwvPWmWcxZsDPhCTQKgh1Ap7pm3qML5GBTBa
 | ||||
|             hex!["a0ba0196e6ee7e6b5b0553035c5cb5c04e9725001b5732839d0529cbc00c9600"].into(), | ||||
|             // sfGA6tPPF8dAc8QpMCMjxitG3j8sXPhkdpm5bwz4UsXAApUiw
 | ||||
|             hex!["6c4dd88b43e2011cf9a6a73d53446336ac9e04cdd4ca23587df63187ac455e49"] | ||||
|                 .unchecked_into(), | ||||
|             hex!["6c4dd88b43e2011cf9a6a73d53446336ac9e04cdd4ca23587df63187ac455e49"].unchecked_into(), | ||||
|             // sfGxQZXFUQH1AXv82rpjiJHFs7YsdEuVGdyvKiS2Tajpvw6Se
 | ||||
|             hex!["8f9ea20bf4a807a8e710f7559dece86e94672b5b361de157bdaa5c1f37849f8d"] | ||||
|                 .unchecked_into(), | ||||
|             hex!["8f9ea20bf4a807a8e710f7559dece86e94672b5b361de157bdaa5c1f37849f8d"].unchecked_into(), | ||||
|             // sfGz2enFUR22cQ5ey61MdtPqbCeEWZA1wsCFFSLGaK7vKnv8C
 | ||||
|             hex!["90db5ed339a559ed157995a48d781f44c7df972dfba4bc855e4b59fa46438e17"] | ||||
|                 .unchecked_into(), | ||||
|             hex!["90db5ed339a559ed157995a48d781f44c7df972dfba4bc855e4b59fa46438e17"].unchecked_into(), | ||||
|             // sfEtwe5BoroNjkdLsvnjnMemUKiw8MS1X4YW8bepbbGvhS4LZ
 | ||||
|             hex!["3481cdcbcf37a4669c29a78cf9ceb39383a10ef0a18b36b92d149fdd0c24ae00"] | ||||
|                 .unchecked_into(), | ||||
|             hex!["3481cdcbcf37a4669c29a78cf9ceb39383a10ef0a18b36b92d149fdd0c24ae00"].unchecked_into(), | ||||
|         ), | ||||
|         ( | ||||
|             // sfGq75CrCrkcfqNzyyidu3D4jW3AoJSzL5tKKuv1UbS16ezzy
 | ||||
|             hex!["8a0d0b66e827bf20e79f9a499317e73925ce4f422371067edfab690e43857f13"].into(), | ||||
|             // sfGq75CrCrkcfqNzyyidu3D4jW3AoJSzL5tKKuv1UbS16ezzy
 | ||||
|             hex!["8a0d0b66e827bf20e79f9a499317e73925ce4f422371067edfab690e43857f13"].into(), | ||||
|             // sfJo2ogBpssRAU9ZPTvuXFZEdmJw9pKsPydLjXe8DypRScjzT
 | ||||
|             hex!["e0f0a776ecc9fa5e1f22e2fa001fe3fba5aea52b9444bc894b45589d42132475"].unchecked_into(), | ||||
|             // sfHq3EVT1sqY7o5ki3zA6LEdRDfdFc29YaZN3w2Thhz6JD5ZF
 | ||||
|             hex!["b63c5a0cf342b9b04931bc8ed74d7d0165ab99ab5f8a4514797d4b299a4501fe"].unchecked_into(), | ||||
|             // sfEj3wrDy9EDLCAodyEdQEYxJpNnM8Etaj3RJ5bCBRzdaDced
 | ||||
|             hex!["2cf69452e9f2a8457119139408884941ed50f590c0fc0f2b044c4d82c69e4245"].unchecked_into(), | ||||
|             // sfE32RmBp1xX4KRTphVGLUJBxLGPN3Dzg9BwCJktxMf3iEwck
 | ||||
|             hex!["0e6fa6934f9e99fa84874f2ed9318825a0d5443a0ced984acfbd24ece72ba55e"].unchecked_into(), | ||||
|         ), | ||||
|         ( | ||||
|             // sfG9iWUS7AKBzvqdz3uDZv7f1t79vvSTYL1VxzYPHjhmLnQVn
 | ||||
| @ -369,17 +370,13 @@ fn casper_staging_config_genesis() -> serde_json::Value { | ||||
|             // sfG9iWUS7AKBzvqdz3uDZv7f1t79vvSTYL1VxzYPHjhmLnQVn
 | ||||
|             hex!["6c0283f4c688f0e75ad546c790bbd5961c1a6931543aa589f368f8272c44b758"].into(), | ||||
|             // sfGMUYXSjHgwGBpbGiHFoqT1DdJwZdHk49H5ViaQM7HUnayvZ
 | ||||
|             hex!["74fa7381a7a74b316afb6793a00387eed9d95d46a69866cbb316b5d9c918af0e"] | ||||
|                 .unchecked_into(), | ||||
|             hex!["74fa7381a7a74b316afb6793a00387eed9d95d46a69866cbb316b5d9c918af0e"].unchecked_into(), | ||||
|             // sfEWYhczV6PbmeNXZTcA4LvhpzvCfNMatYoSNKvDphmNaQzqB
 | ||||
|             hex!["236d2fa03f4ed8cb65de7e514d7540159b328f1c170dd402b094ad7fbf547218"] | ||||
|                 .unchecked_into(), | ||||
|             hex!["236d2fa03f4ed8cb65de7e514d7540159b328f1c170dd402b094ad7fbf547218"].unchecked_into(), | ||||
|             // sfDirg32ityDvrjxh4822unhP4qm4S9yTqN99gesN322swn7h
 | ||||
|             hex!["00946618c353e4c6546b87f9ca1089b846b0ea4658ee8e6d9d1200c24cb5ee27"] | ||||
|                 .unchecked_into(), | ||||
|             hex!["00946618c353e4c6546b87f9ca1089b846b0ea4658ee8e6d9d1200c24cb5ee27"].unchecked_into(), | ||||
|             // sfFZgp1Z5diFAZ16swuQD5GojGCsMMFVR19uWnCrppMLuYjRv
 | ||||
|             hex!["520e74f8c5853ec8577932327ad3247656db25b74c79ad09adb431b271002401"] | ||||
|                 .unchecked_into(), | ||||
|             hex!["520e74f8c5853ec8577932327ad3247656db25b74c79ad09adb431b271002401"].unchecked_into(), | ||||
|         ), | ||||
|         ( | ||||
|             // sfHjtrXFzRmxwjE4rjVxFJXpvVv7furjdymZS7PQRFiANpodz
 | ||||
| @ -387,20 +384,87 @@ fn casper_staging_config_genesis() -> serde_json::Value { | ||||
|             // sfHjtrXFzRmxwjE4rjVxFJXpvVv7furjdymZS7PQRFiANpodz
 | ||||
|             hex!["b24feb55b2cac4b365a9245c2a97525b01bd1a594d2d42b91f6bc38c9c2e6517"].into(), | ||||
|             // sfF5XWwvNPjZEsBz1HWs5Ys5zcE85UHnN1BV8TBBectqFQZRm
 | ||||
|             hex!["3c944c704cae203619b9e7a5a4b6742736da6a8e76c762291bebdc7652cfec2f"] | ||||
|                 .unchecked_into(), | ||||
|             hex!["3c944c704cae203619b9e7a5a4b6742736da6a8e76c762291bebdc7652cfec2f"].unchecked_into(), | ||||
|             // sfDx3gj4wFHg3cK6bopnypHQ6TxW1VgyPsYVbXKhRHtLDLxQb
 | ||||
|             hex!["0aa3a88f6b777c95c3dfe7e997b76798413f16aa325f34824cae0c9102b281d5"] | ||||
|                 .unchecked_into(), | ||||
|             hex!["0aa3a88f6b777c95c3dfe7e997b76798413f16aa325f34824cae0c9102b281d5"].unchecked_into(), | ||||
|             // sfHXZbnZV3YWwnH28q2xumm7stvuC8LweYYxPNuHGonnX7QHL
 | ||||
|             hex!["a8e828d10cf7b74481b6e746e5532d4740ea8014a0d3d856540a59847f8a6b76"] | ||||
|                 .unchecked_into(), | ||||
|             hex!["a8e828d10cf7b74481b6e746e5532d4740ea8014a0d3d856540a59847f8a6b76"].unchecked_into(), | ||||
|             // sfEaHBrBgeMhRTA3WHE9Nbyvn3h7xkhYKi7go4yo81L88o9zJ
 | ||||
|             hex!["2645f1f6820dd3a917eebbdab033088d8862477c1c14759b218685f9a0893377"] | ||||
|                 .unchecked_into(), | ||||
|             hex!["2645f1f6820dd3a917eebbdab033088d8862477c1c14759b218685f9a0893377"].unchecked_into(), | ||||
|         ), | ||||
|         ( | ||||
|             // sfFFYKBEwmJAQEJR73Q4Gfs1sH1c8wyuBGnHc1UdzWucAYrKC
 | ||||
|             hex!["44376f8fa786be1f16fcb45232cfb07300cea845b2fc6e30dde61952de3e5e33"].into(), | ||||
|             // sfFFYKBEwmJAQEJR73Q4Gfs1sH1c8wyuBGnHc1UdzWucAYrKC
 | ||||
|             hex!["44376f8fa786be1f16fcb45232cfb07300cea845b2fc6e30dde61952de3e5e33"].into(), | ||||
|             // sfK4K5bS7M6bHeKHoGec9bw1PMngNyzhTx9YZq6hkqibos4LJ
 | ||||
|             hex!["ec981eb1ef1ddbc8ded2db16198cb03667b4b39a8ea58f28ad469ddfaf256161"].unchecked_into(), | ||||
|             // sfECakKMW2xf5dK8Ut55tnwadoKTNGKdRLh5E7dYRmV6sW812
 | ||||
|             hex!["15b9a867891cf449584b108e512d60b945b1a065bec1703c4c5709ee5093c03d"].unchecked_into(), | ||||
|             // sfErEin4Ljy11VGnYtTYJZ9LLcDP4fvsKV6f9LXYRwRXtrNqa
 | ||||
|             hex!["3271915dc67eba8ad2759a30c2537702f4fbf45647cba565e3a464ab75b91f05"].unchecked_into(), | ||||
|             // sfGD5sHSa1h8NGpUD29ZogBJW6fatg8Sg6Pzg9Q7RPUm24Mkr
 | ||||
|             hex!["6e9426dc78fba9eeb264dcab98be86daf3d8cf510ecfb2acddec370295ff8176"].unchecked_into(), | ||||
|         ), | ||||
|         ( | ||||
|             // sfFPZZNrhDuY9MKJCBHyBCkgJecgDqPJBPSjA37be4czdX6t3
 | ||||
|             hex!["4a5596e97c602e7846d54fae81dcdc5a553b7422231e32f9567ac30a6b7c743a"].into(), | ||||
|             // sfFPZZNrhDuY9MKJCBHyBCkgJecgDqPJBPSjA37be4czdX6t3
 | ||||
|             hex!["4a5596e97c602e7846d54fae81dcdc5a553b7422231e32f9567ac30a6b7c743a"].into(), | ||||
|             // sfJP8aW6eSUs14AfUG6ZDFFjtyJxDed5Ubk1CFh7dNmL69rbx
 | ||||
|             hex!["ceb63298b1b7a1277fddf6eee735dbbf9921fd5ebaac0132eee1963e22cf5935"].unchecked_into(), | ||||
|             // sfH6jAeHqDpwtYGv9KJWNJ8aom8ivSvVztRSwAHw4bXd1isoP
 | ||||
|             hex!["95f73a6271b517f2016fa91411bdeeb990158066c95f106a79697446ba9f78b4"].unchecked_into(), | ||||
|             // sfEXSdKyx6uQBzgR3a7oH53XSCLrjUM2B7fbcvUvm21b5J6Uf
 | ||||
|             hex!["241bfc05caa2d3e53e671df7261599c13f069a37f6cc4be10b5d49502c3a1e1c"].unchecked_into(), | ||||
|             // sfGXqJTwJTkh3bwhECju7XCdgvJXYJZUtYSEJ2PbfpXGak42s
 | ||||
|             hex!["7ce0c80ee65fb00e229d8c8fa5484144eca3d45d733165fbffcdb4de24c14951"].unchecked_into(), | ||||
|         ), | ||||
|         ( | ||||
|             // sfESE7VifnknxVe71z3zsqC3xiirXyzHurKjdQoD537WpwJjW
 | ||||
|             hex!["2021a16182e3af39a79d20021a1b8755d589c04292d361d6b387411f7e975602"].into(), | ||||
|             // sfESE7VifnknxVe71z3zsqC3xiirXyzHurKjdQoD537WpwJjW
 | ||||
|             hex!["2021a16182e3af39a79d20021a1b8755d589c04292d361d6b387411f7e975602"].into(), | ||||
|             // sfFzQmYYckD8XLV7XGU1pJAyt1K3foCpPumpKBqdb5sJGHXrc
 | ||||
|             hex!["64e9968f3af2e1a86ee8d4be9ad77a1d66f50138527988bf93ede25baaf2e671"].unchecked_into(), | ||||
|             // sfFHjCLzWetvQJQzNwxeWcrkHmnPS1mVz7gT63yiRdvxFZ9T8
 | ||||
|             hex!["45e28f333bf0d4a9956ae20341cd07db8d471c4b482ed15d5cf7edd70201670d"].unchecked_into(), | ||||
|             // sfHJAk4HiVuMjXqaXoFEKTCF6938Lta7qd9w3zbyyuWCs1T5L
 | ||||
|             hex!["9eb1063afcaf568e7a62458ef33237a41ca500c89e084f7a5dd75bf5d89b105a"].unchecked_into(), | ||||
|             // sfEm2SME5H6GiezhYokZWmrZLMTUNFbLV7xwgKrMXz3NwppKb
 | ||||
|             hex!["2e77fde21162d1f21ca371846d70c3b75931329074101ee668e614336d25c120"].unchecked_into(), | ||||
|         ), | ||||
|         ( | ||||
|             // sfHpvEbP79MrDMVw4GhTvgLSU987ZSJ21VAsDWiJdgjG3ijse
 | ||||
|             hex!["b624cb291f7464773f3b449ee2252165f3934ace08b1e10611a53e174766fc73"].into(), | ||||
|             // sfHpvEbP79MrDMVw4GhTvgLSU987ZSJ21VAsDWiJdgjG3ijse
 | ||||
|             hex!["b624cb291f7464773f3b449ee2252165f3934ace08b1e10611a53e174766fc73"].into(), | ||||
|             // sfJHYLgjoHotvKi46URmtaVoG4p54SPE2ASTrauym99WxFcAn
 | ||||
|             hex!["ca72b6ea2c83f9e429479bf51c324ea90cbf01e08d2850ced2590c8796cfe222"].unchecked_into(), | ||||
|             // sfFVPqgCsDQe3k4qhGmUH4UoZaxsGb9majPgoH3WaYCZjFhTf
 | ||||
|             hex!["4ec8584ca9da16d8c60e1770e98fbca8bec648e13c69601e3dfdc1330bf1f999"].unchecked_into(), | ||||
|             // sfJ6nxM1SvcdbV2Gmf8WKkPKeX6rRYaEmSj7V9r64799acqHV
 | ||||
|             hex!["c2403683be24a92ae8489e28fb502e2bab16d815c4f6c865c50ffb34430a8d7c"].unchecked_into(), | ||||
|             // sfK1sQY3GL8waX2htW9EaBo9MjWGuy4VGeiUfP4NCq5tCjt37
 | ||||
|             hex!["eabb3463e300f357b9886683d5a240a395f6bd41182057f03b0e9697a8b3465e"].unchecked_into(), | ||||
|         ), | ||||
|         ( | ||||
|             // sfJeU4TBQyuGxfsCqNDPax1TcfAseEmBDPqx5YEm7kXUvnnPa
 | ||||
|             hex!["da6875e9df9a7894e065ef5befcde567dec4dc2c0b73a6ad5514dcca26a90702"].into(), | ||||
|             // sfJeU4TBQyuGxfsCqNDPax1TcfAseEmBDPqx5YEm7kXUvnnPa
 | ||||
|             hex!["da6875e9df9a7894e065ef5befcde567dec4dc2c0b73a6ad5514dcca26a90702"].into(), | ||||
|             // sfGbxmQAD2jbktjRkq6NsJxHKHWnkdtvoR14fFPAX85t148ej
 | ||||
|             hex!["8006e3f6e3d92c4c5f2e2f001452e4993e6d5c2b1136f2ae6060c6e9c9523b4a"].unchecked_into(), | ||||
|             // sfGm1jJagueW5dCng6xKCDx3FX2JohtsYMuNjf2tJGXN5ePUL
 | ||||
|             hex!["86ee138c9e7e67c1c2e157c0ba888761a122d8b9aa6a8653e886ac329e34255d"].unchecked_into(), | ||||
|             // sfEB68auUQmSCK8M3Zr7WuzRSipj9sQ5ykfDmvLmT8FDY5bg6
 | ||||
|             hex!["1496150847d512e0491899eba72ee36f76b882ae29fccf18201fd9fbd5bfd300"].unchecked_into(), | ||||
|             // sfHZqUptNXpRNGPHKn2Tfv8K1RjFGJ9XCdSw41nPAw9ZXM37T
 | ||||
|             hex!["aaa41b6ade4c30b5792aa6e5604c444e424900ddf649b23eed4bd0d7f5d3a34f"].unchecked_into(), | ||||
|         ), | ||||
|     ]; | ||||
| 
 | ||||
| 
 | ||||
|     let ghost_accounts: Vec<(AccountId, u128, u8)> = casper_testnet_evm_accounts(); | ||||
|     let evm_networks = casper_testnet_evm_networks(); | ||||
| 
 | ||||
| @ -433,32 +497,29 @@ fn casper_staging_config_genesis() -> serde_json::Value { | ||||
|                 .collect::<Vec<_>>(), | ||||
|         }, | ||||
|         "staking": { | ||||
|             "validatorCount": 500, | ||||
|             "validatorCount": 10, | ||||
|             "minimumValidatorCount": 3, | ||||
|             "stakers": initial_authorities | ||||
|                 .iter() | ||||
|                 .map(|x| { | ||||
|                     ( | ||||
|                         x.0.clone(), | ||||
|                         x.0.clone(), | ||||
|                         STASH, | ||||
|                         x.0.clone(), 
 | ||||
|                         x.0.clone(), 
 | ||||
|                         STASH, 
 | ||||
|                         casper::StakerStatus::<AccountId>::Validator, | ||||
|                     ) | ||||
|                 }) | ||||
|                 .collect::<Vec<_>>(), | ||||
|             "invulnerables": initial_authorities | ||||
|                 .iter() | ||||
|                 .map(|x| x.0.clone()) | ||||
|                 .collect::<Vec<_>>(), | ||||
|             "forceEra": Forcing::NotForcing, | ||||
|             "slashRewardFraction": Perbill::from_percent(10), | ||||
|             "minNominatorBond": 6_900 * STRH, | ||||
|             "minValidatorBond": 6_900 * STRH, | ||||
|             "slashRewardFraction": Perbill::from_percent(10) | ||||
|         }, | ||||
|         "babe": { | ||||
|             "epochConfig": Some(casper::BABE_GENESIS_EPOCH_CONFIG), | ||||
|         }, | ||||
|         "ghostSudo": { | ||||
|             "key": endowed_accounts | ||||
|                 .first() | ||||
|                 .cloned(), | ||||
|         }, | ||||
|         "ghostNetworks": { | ||||
|             "networks": evm_networks, | ||||
|         }, | ||||
| @ -478,9 +539,7 @@ fn casper_staging_config_genesis() -> serde_json::Value { | ||||
| fn casper_development_config_genesis() -> serde_json::Value { | ||||
|     testnet_config_genesis( | ||||
|         vec![get_authority_keys_from_seed("Alice")], | ||||
|         None, | ||||
|         None, | ||||
|         None, | ||||
|         None, None, None, | ||||
|     ) | ||||
| } | ||||
| 
 | ||||
| @ -488,11 +547,11 @@ fn casper_development_config_genesis() -> serde_json::Value { | ||||
| fn casper_local_config_genesis() -> serde_json::Value { | ||||
|     testnet_config_genesis( | ||||
|         vec![ | ||||
|             get_authority_keys_from_seed("Alice"), | ||||
|             get_authority_keys_from_seed("Alice"), 
 | ||||
|             get_authority_keys_from_seed("Bob"), | ||||
|         ], | ||||
|         Some(casper_testnet_accounts()), | ||||
|         Some(casper_testnet_evm_accounts()), | ||||
|         Some(casper_testnet_evm_accounts()), 
 | ||||
|         Some(casper_testnet_evm_networks()), | ||||
|     ) | ||||
| } | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user