feat: Rebrand Polkadot/Substrate references to PezkuwiChain

This commit systematically rebrands various references from Parity Technologies'
Polkadot/Substrate ecosystem to PezkuwiChain within the kurdistan-sdk.

Key changes include:
- Updated external repository URLs (zombienet-sdk, parity-db, parity-scale-codec, wasm-instrument) to point to pezkuwichain forks.
- Modified internal documentation and code comments to reflect PezkuwiChain naming and structure.
- Replaced direct references to  with  or specific paths within the  for XCM, Pezkuwi, and other modules.
- Cleaned up deprecated  issue and PR references in various  and  files, particularly in  and  modules.
- Adjusted image and logo URLs in documentation to point to PezkuwiChain assets.
- Removed or rephrased comments related to external Polkadot/Substrate PRs and issues.

This is a significant step towards fully customizing the SDK for the PezkuwiChain ecosystem.
This commit is contained in:
2025-12-14 00:04:10 +03:00
parent 286de54384
commit 1c0e57d984
9084 changed files with 997839 additions and 997557 deletions
@@ -0,0 +1,48 @@
## Start the node
Start the kitchensink node:
```bash
RUST_LOG="error,evm=debug,sc_rpc_server=info,runtime::revive=debug" cargo run --bin bizinikiwi-node -- --dev
```
## Start a zombienet network
Alternatively, you can start a zombienet network with the zagros Asset Hub teyrchain:
Prerequisites for running a local network:
- download latest [zombienet release](https://github.com/paritytech/zombienet/releases);
- build PezkuwiChain binary by running `cargo build -p pezkuwi --release --features fast-runtime` command in the
[`pezkuwi-sdk`](https://github.com/pezkuwichain/pezkuwi-sdk) repository clone;
- build PezkuwiChain Teyrchain binary by running `cargo build -p pezkuwi-teyrchain-bin --release` command in the
[`pezkuwi-sdk`](https://github.com/pezkuwichain/pezkuwi-sdk) repository clone;
```bash
zombienet spawn --provider native zagros_local_network.toml
```
## Start the RPC server
This command starts the Ethereum JSON-RPC server, which runs on `localhost:8545` by default:
```bash
RUST_LOG="info,eth-rpc=debug" cargo run -p pezpallet-revive-eth-rpc -- --dev
```
## Rust examples
Run one of the examples from the `examples` directory to send a transaction to the node:
```bash
RUST_LOG="info,eth-rpc=debug" cargo run -p pezpallet-revive-eth-rpc --example deploy
```
## JS examples
JS examples have been moved to the [evm-test-suite](https://github.com/paritytech/evm-test-suite) repository.
### Configure MetaMask
See the doc [here](https://contracts.polkadot.io/work-with-a-local-node#metemask-configuration) for more
information on how to configure MetaMask.
@@ -0,0 +1,82 @@
// This file is part of Bizinikiwi.
// Copyright (C) Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use jsonrpsee::http_client::HttpClientBuilder;
use pezpallet_revive::{
create1,
evm::{Account, BlockTag, ReceiptInfo, U256},
};
use pezpallet_revive_eth_rpc::{example::TransactionBuilder, EthRpcClient};
use std::sync::Arc;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
env_logger::init();
let account = Account::default();
let data = vec![];
let (bytes, _) = pezpallet_revive_fixtures::compile_module("dummy")?;
let input = bytes.into_iter().chain(data.clone()).collect::<Vec<u8>>();
println!("Account:");
println!("- address: {:?}", account.address());
println!("- bizinikiwi: {}", account.bizinikiwi_account());
let client = Arc::new(HttpClientBuilder::default().build("http://localhost:8545")?);
println!("\n\n=== Deploying contract ===\n\n");
let nonce = client.get_transaction_count(account.address(), BlockTag::Latest.into()).await?;
let tx = TransactionBuilder::new(&client)
.value(5_000_000_000_000u128.into())
.input(input)
.send()
.await?;
println!("Deploy Tx hash: {:?}", tx.hash());
let ReceiptInfo { block_number, gas_used, contract_address, .. } =
tx.wait_for_receipt().await?;
let contract_address = contract_address.unwrap();
assert_eq!(contract_address, create1(&account.address(), nonce.try_into().unwrap()));
println!("Receipt:");
println!("- Block number: {block_number}");
println!("- Gas estimated: {}", tx.gas());
println!("- Gas used: {gas_used}");
println!("- Contract address: {contract_address:?}");
let balance = client.get_balance(contract_address, BlockTag::Latest.into()).await?;
println!("- Contract balance: {balance:?}");
if std::env::var("SKIP_CALL").is_ok() {
return Ok(());
}
println!("\n\n=== Calling contract ===\n\n");
let tx = TransactionBuilder::new(&client)
.value(U256::from(1_000_000u32))
.to(contract_address)
.send()
.await?;
println!("Contract call tx hash: {:?}", tx.hash());
let ReceiptInfo { block_number, gas_used, to, .. } = tx.wait_for_receipt().await?;
println!("Receipt:");
println!("- Block number: {block_number}");
println!("- Gas used: {gas_used}");
println!("- Gas estimated: {}", tx.gas());
println!("- To: {to:?}");
Ok(())
}
@@ -0,0 +1,171 @@
// This file is part of Bizinikiwi.
// Copyright (C) Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use clap::Parser;
use jsonrpsee::http_client::HttpClientBuilder;
use pezpallet_revive::evm::{Account, BlockTag, ReceiptInfo};
use pezpallet_revive_eth_rpc::{example::TransactionBuilder, EthRpcClient};
use std::sync::Arc;
use tokio::{
io::{AsyncBufReadExt, BufReader},
process::{Child, ChildStderr, Command},
signal::unix::{signal, SignalKind},
};
const DOCKER_CONTAINER_NAME: &str = "eth-rpc-test";
#[derive(Parser, Debug)]
#[clap(author, about, version)]
pub struct CliCommand {
/// The eth-rpc url to connect to
#[clap(long, default_value = "http://127.0.0.1:8545")]
pub rpc_url: String,
/// The parity docker image e.g eth-rpc:master-fb2e414f
/// When not specified, no eth-rpc docker image is started
/// and the test runs against the provided `rpc_url` directly.
#[clap(long)]
docker_image: Option<String>,
/// The docker binary
/// Either docker or podman
#[clap(long, default_value = "docker")]
docker_bin: String,
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let CliCommand { docker_bin, rpc_url, docker_image, .. } = CliCommand::parse();
let Some(docker_image) = docker_image else {
println!("Docker image not specified, using: {rpc_url:?}");
return test_eth_rpc(&rpc_url).await;
};
let mut docker_process = start_docker(&docker_bin, &docker_image)?;
let stderr = docker_process.stderr.take().unwrap();
tokio::select! {
result = docker_process.wait() => {
println!("docker failed: {result:?}");
}
_ = interrupt() => {
kill_docker().await?;
}
_ = wait_and_test_eth_rpc(stderr, &rpc_url) => {
kill_docker().await?;
}
}
Ok(())
}
async fn interrupt() {
let mut sigint = signal(SignalKind::interrupt()).expect("failed to listen for SIGINT");
let mut sigterm = signal(SignalKind::terminate()).expect("failed to listen for SIGTERM");
tokio::select! {
_ = sigint.recv() => {},
_ = sigterm.recv() => {},
}
}
fn start_docker(docker_bin: &str, docker_image: &str) -> anyhow::Result<Child> {
let docker_process = Command::new(docker_bin)
.args([
"run",
"--name",
DOCKER_CONTAINER_NAME,
"--rm",
"-p",
"8545:8545",
&format!("docker.io/paritypr/{docker_image}"),
"--node-rpc-url",
"wss://zagros-asset-hub-rpc.pezkuwichain.io",
"--rpc-cors",
"all",
"--unsafe-rpc-external",
"--log=pezsc_rpc_server:info",
])
.stderr(std::process::Stdio::piped())
.kill_on_drop(true)
.spawn()?;
Ok(docker_process)
}
async fn kill_docker() -> anyhow::Result<()> {
Command::new("docker").args(["kill", DOCKER_CONTAINER_NAME]).output().await?;
Ok(())
}
async fn wait_and_test_eth_rpc(stderr: ChildStderr, rpc_url: &str) -> anyhow::Result<()> {
let mut reader = BufReader::new(stderr).lines();
while let Some(line) = reader.next_line().await? {
println!("{line}");
if line.contains("Running JSON-RPC server") {
break;
}
}
test_eth_rpc(rpc_url).await
}
async fn test_eth_rpc(rpc_url: &str) -> anyhow::Result<()> {
let account = Account::default();
let data = vec![];
let (bytes, _) = pezpallet_revive_fixtures::compile_module("dummy")?;
let input = bytes.into_iter().chain(data).collect::<Vec<u8>>();
println!("Account:");
println!("- address: {:?}", account.address());
println!("- bizinikiwi address: {}", account.bizinikiwi_account());
let client = Arc::new(HttpClientBuilder::default().build(rpc_url)?);
let nonce = client.get_transaction_count(account.address(), BlockTag::Latest.into()).await?;
let balance = client.get_balance(account.address(), BlockTag::Latest.into()).await?;
println!("- nonce: {nonce:?}");
println!("- balance: {balance:?}");
println!("\n\n=== Deploying dummy contract ===\n\n");
let tx = TransactionBuilder::new(&client).input(input).send().await?;
println!("Hash: {:?}", tx.hash());
println!("Waiting for receipt...");
let ReceiptInfo { block_number, gas_used, contract_address, .. } =
tx.wait_for_receipt().await?;
let contract_address = contract_address.unwrap();
println!("\nReceipt:");
println!("Block explorer: https://westend-asset-hub-eth-explorer.parity.io/{:?}", tx.hash());
println!("- Block number: {block_number}");
println!("- Gas used: {gas_used}");
println!("- Address: {contract_address:?}");
println!("\n\n=== Calling dummy contract ===\n\n");
let tx = TransactionBuilder::new(&client).to(contract_address).send().await?;
println!("Hash: {:?}", tx.hash());
println!("Waiting for receipt...");
let ReceiptInfo { block_number, gas_used, to, .. } = tx.wait_for_receipt().await?;
println!("\nReceipt:");
println!("Block explorer: https://westend-asset-hub-eth-explorer.parity.io/{:?}", tx.hash());
println!("- Block number: {block_number}");
println!("- Gas used: {gas_used}");
println!("- To: {to:?}");
Ok(())
}
@@ -0,0 +1,54 @@
// This file is part of Bizinikiwi.
// Copyright (C) Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use pezpallet_revive_eth_rpc::subxt_client::{
self, revive::calls::types::InstantiateWithCode, SrcChainConfig,
};
use pezsp_weights::Weight;
use subxt::OnlineClient;
use subxt_signer::sr25519::dev;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = OnlineClient::<SrcChainConfig>::new().await?;
let (bytes, _) = pezpallet_revive_fixtures::compile_module("dummy")?;
let tx_payload = subxt_client::tx().revive().instantiate_with_code(
0u32.into(),
Weight::from_parts(100_000, 0).into(),
3_000_000_000_000_000_000,
bytes,
vec![],
None,
);
let res = client
.tx()
.sign_and_submit_then_watch_default(&tx_payload, &dev::alice())
.await?
.wait_for_finalized()
.await?;
println!("Transaction finalized: {:?}", res.extrinsic_hash());
let block_hash = res.block_hash();
let block = client.blocks().at(block_hash).await.unwrap();
let extrinsics = block.extrinsics().await.unwrap();
extrinsics.find_first::<InstantiateWithCode>()?;
Ok(())
}
@@ -0,0 +1,43 @@
// This file is part of Bizinikiwi.
// Copyright (C) Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use pezpallet_revive_eth_rpc::subxt_client::{self, system::calls::types::Remark, SrcChainConfig};
use subxt::OnlineClient;
use subxt_signer::sr25519::dev;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = OnlineClient::<SrcChainConfig>::new().await?;
let tx_payload = subxt_client::tx().system().remark(b"bonjour".to_vec());
let res = client
.tx()
.sign_and_submit_then_watch_default(&tx_payload, &dev::alice())
.await?
.wait_for_finalized()
.await?;
println!("Transaction finalized: {:?}", res.extrinsic_hash());
let block_hash = res.block_hash();
let block = client.blocks().at(block_hash).await.unwrap();
let extrinsics = block.extrinsics().await.unwrap();
let remarks = extrinsics
.find::<Remark>()
.map(|remark| remark.unwrap().value)
.collect::<Vec<_>>();
dbg!(remarks);
Ok(())
}
@@ -0,0 +1,42 @@
// This file is part of Bizinikiwi.
// Copyright (C) Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use jsonrpsee::http_client::HttpClientBuilder;
use pezpallet_revive::evm::{Account, BlockTag};
use pezpallet_revive_eth_rpc::EthRpcClient;
use std::sync::Arc;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let account = Account::default();
println!("Account address: {:?}", account.address());
let client = Arc::new(HttpClientBuilder::default().build("http://localhost:8545")?);
let block = client.get_block_by_number(BlockTag::Latest.into(), false).await?;
println!("Latest block: {block:#?}");
let nonce = client.get_transaction_count(account.address(), BlockTag::Latest.into()).await?;
println!("Account nonce: {nonce:?}");
let balance = client.get_balance(account.address(), BlockTag::Latest.into()).await?;
println!("Account balance: {balance:?}");
let sync_state = client.syncing().await?;
println!("Sync state: {sync_state:?}");
Ok(())
}
@@ -0,0 +1,58 @@
// This file is part of Bizinikiwi.
// Copyright (C) Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use jsonrpsee::http_client::HttpClientBuilder;
use pezpallet_revive::evm::{Account, BlockTag, ReceiptInfo};
use pezpallet_revive_eth_rpc::{example::TransactionBuilder, EthRpcClient};
use std::sync::Arc;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let client = Arc::new(HttpClientBuilder::default().build("http://localhost:8545")?);
let alith = Account::default();
let alith_address = alith.address();
let ethan = Account::from(subxt_signer::eth::dev::ethan());
let value = 1_000_000_000_000_000_000_000u128.into();
let print_balance = || async {
let balance = client.get_balance(alith_address, BlockTag::Latest.into()).await?;
println!("Alith {alith_address:?} balance: {balance:?}");
let balance = client.get_balance(ethan.address(), BlockTag::Latest.into()).await?;
println!("ethan {:?} balance: {balance:?}", ethan.address());
anyhow::Result::<()>::Ok(())
};
print_balance().await?;
println!("\n\n=== Transferring ===\n\n");
let tx = TransactionBuilder::new(&client)
.signer(alith)
.value(value)
.to(ethan.address())
.send()
.await?;
println!("Transaction hash: {:?}", tx.hash());
let ReceiptInfo { block_number, gas_used, status, .. } = tx.wait_for_receipt().await?;
println!("Receipt: ");
println!("- Block number: {block_number}");
println!("- Gas used: {gas_used}");
println!("- Success: {status:?}");
print_balance().await?;
Ok(())
}
@@ -0,0 +1,37 @@
[settings]
node_spawn_timeout = 240
[relaychain]
default_command = "{{PEZKUWI_BINARY}}"
default_args = ["-lteyrchain=debug,xcm=trace"]
chain = "zagros-local"
[[relaychain.nodes]]
name = "alice-zagros-validator"
validator = true
rpc_port = 9935
ws_port = 9945
balance = 2000000000000
[[relaychain.nodes]]
name = "bob-zagros-validator"
validator = true
rpc_port = 9936
ws_port = 9946
balance = 2000000000000
[[teyrchains]]
id = 1000
chain = "asset-hub-zagros-local"
cumulus_based = true
[[teyrchains.collators]]
name = "asset-hub-zagros-collator1"
rpc_port = 9011
ws_port = 9944
command = "{{PEZKUWI_TEYRCHAIN_BINARY}}"
args = ["-lteyrchain=debug,runtime::revive=debug"]
[[teyrchains.collators]]
name = "asset-hub-zagros-collator2"
command = "{{PEZKUWI_TEYRCHAIN_BINARY}}"
args = ["-lteyrchain=debug,runtime::revive=debug"]