feat: add pezkuwichain mainnet configuration
Mainnet Configuration: - Add pezkuwichain_mainnet_config() in chain_spec.rs with HEZ token properties - Add "pezkuwichain-mainnet" CLI option in command.rs - Update relay chain name to "pezkuwichain-mainnet" in asset_hubs.rs Asset Hub Genesis (asset-hub-pezkuwichain): - Add wUSDT asset (ID: 1000, 6 decimals) for wrapped USDT - Update treasury, founder, presale accounts to secure mainnet wallets - Update collator addresses (Azad, Beritan, Civan, Dildar) People Chain Genesis (people-pezkuwichain): - Add PezkuwichainGenesis runtime type for mainnet - Update founder account to secure mainnet wallet - Update collator addresses (Erin, Firaz, Goran, Hevi) Token Configuration: - HEZ: 18 decimals, SS58 format 42 - PEZ: Asset ID 1, 12 decimals - wHEZ: Asset ID 2, 12 decimals - wUSDT: Asset ID 1000, 6 decimals
This commit is contained in:
Generated
+1
@@ -12013,6 +12013,7 @@ dependencies = [
|
||||
"pezsp-staking",
|
||||
"pezsp-state-machine",
|
||||
"pezsp-std",
|
||||
"pezsp-timestamp",
|
||||
"pezsp-tracing",
|
||||
"pezsp-trie",
|
||||
"pezsp-weights",
|
||||
|
||||
@@ -135,7 +135,7 @@ pub fn asset_hub_pezkuwichain_genesis_config() -> GenericChainSpec {
|
||||
GenericChainSpec::builder(
|
||||
asset_hub_pezkuwichain_runtime::WASM_BINARY
|
||||
.expect("WASM binary was not built, please build it!"),
|
||||
Extensions::new_with_relay_chain("pezkuwichain".into()),
|
||||
Extensions::new_with_relay_chain("pezkuwichain-mainnet".into()),
|
||||
)
|
||||
.with_name("Pezkuwichain Asset Hub")
|
||||
.with_id("asset-hub-pezkuwichain")
|
||||
|
||||
@@ -26,6 +26,7 @@ pub enum PeopleRuntimeType {
|
||||
Pezkuwi,
|
||||
PezkuwiLocal,
|
||||
Pezkuwichain,
|
||||
PezkuwichainGenesis,
|
||||
PezkuwichainLocal,
|
||||
PezkuwichainDevelopment,
|
||||
Zagros,
|
||||
@@ -43,6 +44,7 @@ impl FromStr for PeopleRuntimeType {
|
||||
pezkuwi::PEOPLE_PEZKUWI => Ok(PeopleRuntimeType::Pezkuwi),
|
||||
pezkuwi::PEOPLE_PEZKUWI_LOCAL => Ok(PeopleRuntimeType::PezkuwiLocal),
|
||||
pezkuwichain::PEOPLE_PEZKUWICHAIN => Ok(PeopleRuntimeType::Pezkuwichain),
|
||||
pezkuwichain::PEOPLE_PEZKUWICHAIN_GENESIS => Ok(PeopleRuntimeType::PezkuwichainGenesis),
|
||||
pezkuwichain::PEOPLE_PEZKUWICHAIN_LOCAL => Ok(PeopleRuntimeType::PezkuwichainLocal),
|
||||
pezkuwichain::PEOPLE_PEZKUWICHAIN_DEVELOPMENT => {
|
||||
Ok(PeopleRuntimeType::PezkuwichainDevelopment)
|
||||
@@ -69,6 +71,7 @@ impl PeopleRuntimeType {
|
||||
PeopleRuntimeType::Pezkuwichain => Ok(Box::new(GenericChainSpec::from_json_bytes(
|
||||
&include_bytes!("../../chain-specs/people-pezkuwichain.json")[..],
|
||||
)?)),
|
||||
PeopleRuntimeType::PezkuwichainGenesis => Ok(Box::new(pezkuwichain::genesis_config())),
|
||||
PeopleRuntimeType::PezkuwichainLocal => Ok(Box::new(pezkuwichain::local_config(
|
||||
pezkuwichain::PEOPLE_PEZKUWICHAIN_LOCAL,
|
||||
"Pezkuwichain People Local",
|
||||
@@ -123,9 +126,30 @@ pub mod pezkuwichain {
|
||||
use pezsc_chain_spec::ChainType;
|
||||
|
||||
pub(crate) const PEOPLE_PEZKUWICHAIN: &str = "people-pezkuwichain";
|
||||
pub(crate) const PEOPLE_PEZKUWICHAIN_GENESIS: &str = "people-pezkuwichain-genesis";
|
||||
pub(crate) const PEOPLE_PEZKUWICHAIN_LOCAL: &str = "people-pezkuwichain-local";
|
||||
pub(crate) const PEOPLE_PEZKUWICHAIN_DEVELOPMENT: &str = "people-pezkuwichain-dev";
|
||||
|
||||
/// Genesis config for People Pezkuwichain mainnet
|
||||
pub fn genesis_config() -> GenericChainSpec {
|
||||
let mut properties = pezsc_chain_spec::Properties::new();
|
||||
properties.insert("ss58Format".into(), 42.into());
|
||||
properties.insert("tokenSymbol".into(), "TYR".into());
|
||||
properties.insert("tokenDecimals".into(), 12.into());
|
||||
|
||||
GenericChainSpec::builder(
|
||||
people_pezkuwichain_runtime::WASM_BINARY
|
||||
.expect("WASM binary was not built, please build it!"),
|
||||
Extensions::new_with_relay_chain("pezkuwichain-mainnet".to_string()),
|
||||
)
|
||||
.with_name("Pezkuwichain People")
|
||||
.with_id(super::ensure_id(PEOPLE_PEZKUWICHAIN_GENESIS).expect("invalid id"))
|
||||
.with_chain_type(ChainType::Live)
|
||||
.with_genesis_config_preset_name("genesis")
|
||||
.with_properties(properties)
|
||||
.build()
|
||||
}
|
||||
|
||||
pub fn local_config(
|
||||
spec_id: &str,
|
||||
chain_name: &str,
|
||||
|
||||
+35
-21
@@ -51,9 +51,16 @@ pub const PEZ_ASSET_ID: AssetIdForTrustBackedAssets = 1;
|
||||
/// Wrapped HEZ (wHEZ) Asset ID - Used by TokenWrapper pezpallet
|
||||
pub const WHEZ_ASSET_ID: AssetIdForTrustBackedAssets = 2;
|
||||
|
||||
/// wUSDT Asset ID - Wrapped USDT (1:1 backed by Polkadot USDT or TRC20 USDT)
|
||||
/// Using 1000 to match chains.json configuration in pezWallet
|
||||
pub const WUSDT_ASSET_ID: AssetIdForTrustBackedAssets = 1000;
|
||||
|
||||
/// PEZ Token decimals (same as HEZ)
|
||||
pub const PEZ_DECIMALS: u8 = 12;
|
||||
|
||||
/// wUSDT decimals (USDT standard: 6 decimals)
|
||||
pub const WUSDT_DECIMALS: u8 = 6;
|
||||
|
||||
/// Treasury allocation: 20.25% = 1,012,500,000 PEZ
|
||||
pub const PEZ_TREASURY_ALLOCATION: Balance = 1_012_500_000 * TYR;
|
||||
|
||||
@@ -133,7 +140,7 @@ fn asset_hub_pezkuwichain_genesis(
|
||||
pezkuwi_xcm: PezkuwiXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION) },
|
||||
|
||||
// ====================================================================
|
||||
// TrustBackedAssets (Instance1) - PEZ and wHEZ tokens
|
||||
// TrustBackedAssets (Instance1) - PEZ, wHEZ, and wUSDT tokens
|
||||
// ====================================================================
|
||||
assets: AssetsConfig {
|
||||
// Asset definitions: (id, owner, is_sufficient, min_balance)
|
||||
@@ -142,11 +149,15 @@ fn asset_hub_pezkuwichain_genesis(
|
||||
(PEZ_ASSET_ID, treasury_account.clone(), true, 1),
|
||||
// wHEZ Token - Wrapped HEZ for DeFi operations
|
||||
(WHEZ_ASSET_ID, treasury_account.clone(), true, 1),
|
||||
// wUSDT - Wrapped USDT (1:1 backed by Polkadot USDT or TRC20 USDT)
|
||||
// Min balance: 10_000 (0.01 USDT with 6 decimals)
|
||||
(WUSDT_ASSET_ID, treasury_account.clone(), true, 10_000),
|
||||
],
|
||||
// Asset metadata: (id, name, symbol, decimals)
|
||||
metadata: vec![
|
||||
(PEZ_ASSET_ID, b"Pez Token".to_vec(), b"PEZ".to_vec(), PEZ_DECIMALS),
|
||||
(WHEZ_ASSET_ID, b"Wrapped HEZ".to_vec(), b"wHEZ".to_vec(), PEZ_DECIMALS),
|
||||
(WUSDT_ASSET_ID, b"Wrapped USDT".to_vec(), b"wUSDT".to_vec(), WUSDT_DECIMALS),
|
||||
],
|
||||
// Initial balances: (asset_id, account, balance)
|
||||
accounts: vec![
|
||||
@@ -162,9 +173,10 @@ fn asset_hub_pezkuwichain_genesis(
|
||||
// Presale allocation: 1.875% = 93,750,000 PEZ
|
||||
(PEZ_ASSET_ID, presale_account.clone(), PEZ_PRESALE_ALLOCATION),
|
||||
// wHEZ starts with 0 balance - only created via TokenWrapper
|
||||
// wUSDT starts with 0 balance - minted via Custodial Bridge
|
||||
],
|
||||
// Next asset ID after PEZ and wHEZ
|
||||
next_asset_id: Some(3),
|
||||
// Next asset ID after PEZ (1), wHEZ (2), and wUSDT (1000)
|
||||
next_asset_id: Some(1001),
|
||||
..Default::default()
|
||||
},
|
||||
|
||||
@@ -200,44 +212,46 @@ pub fn get_preset(id: &PresetId) -> Option<Vec<u8>> {
|
||||
// Treasury, Founder, Presale accounts should be replaced with real addresses
|
||||
// ====================================================================
|
||||
PRESET_GENESIS => {
|
||||
// Placeholder accounts - MUST be replaced with real addresses from
|
||||
// Founder_treasury_presale_wallets.json before mainnet launch
|
||||
// MAINNET ACCOUNTS - NEW SECURE WALLETS (2026-01-21)
|
||||
// Treasury: 5D7guUmrk2xap2xuCwDJgJB5JDtxy439Dx2vaQ5JkvgtNjb4
|
||||
let treasury_account: AccountId =
|
||||
hex!("44cb62d1d6cdd2fff2a5ef3bb7ef827be5b3e117a394ecaa634d8dd9809d5608").into();
|
||||
hex!("2e82c43a0a7edc05a179901d18bdfac86d52953c1b7ca5e8e3ceeb3a83044b4f").into();
|
||||
// Founder: 5HN6sFM7TbPQazmfhJP1kU8itw7Tb2A9UML8TwSYRwiN9q5Z
|
||||
let founder_account: AccountId =
|
||||
hex!("44cb62d1d6cdd2fff2a5ef3bb7ef827be5b3e117a394ecaa634d8dd9809d5608").into();
|
||||
hex!("ea71cc341e6790988692d8adcd08a26c75d8c813e45e0a25b24b707dc7846677").into();
|
||||
// Presale: 5GsFKogGuxr9ToPuZ2XPxksZWTWdCGUnd8hmqSyssfsvprtA
|
||||
let presale_account: AccountId =
|
||||
hex!("44cb62d1d6cdd2fff2a5ef3bb7ef827be5b3e117a394ecaa634d8dd9809d5608").into();
|
||||
hex!("d47027192dd48b2c48606012a8bb7410cd92fed091e4896e4dc4c67772974606").into();
|
||||
|
||||
asset_hub_pezkuwichain_genesis(
|
||||
// initial collators.
|
||||
// initial collators - 4 Asset Hub collators from mainnet_collators
|
||||
vec![
|
||||
// E8XC6rTJRsioKCp6KMy6zd24ykj4gWsusZ3AkSeyavpVBAG
|
||||
// Azad (5F4ErvW2gvD2jgtfSfypcDirgF78PQWTsz8GmhArZ8Jvg4c5)
|
||||
(
|
||||
hex!("44cb62d1d6cdd2fff2a5ef3bb7ef827be5b3e117a394ecaa634d8dd9809d5608")
|
||||
hex!("8459d334fcb5432ccd6820b2677080c9dbefa127734eaa15551b62aaffb5ff57")
|
||||
.into(),
|
||||
hex!("44cb62d1d6cdd2fff2a5ef3bb7ef827be5b3e117a394ecaa634d8dd9809d5608")
|
||||
hex!("8459d334fcb5432ccd6820b2677080c9dbefa127734eaa15551b62aaffb5ff57")
|
||||
.unchecked_into(),
|
||||
),
|
||||
// G28iWEybndgGRbhfx83t7Q42YhMPByHpyqWDUgeyoGF94ri
|
||||
// Beritan (5DvQHQBDvYsigbdxdkhQfRb6cTXeDAEDvqeQHrcPfEE1z2yZ)
|
||||
(
|
||||
hex!("9864b85e23aa4506643db9879c3dbbeabaa94d269693a4447f537dd6b5893944")
|
||||
hex!("5223587ee928ed8cc5e9fcff9f9d04ac5fca83a46d602193b265e4642a3a344d")
|
||||
.into(),
|
||||
hex!("9864b85e23aa4506643db9879c3dbbeabaa94d269693a4447f537dd6b5893944")
|
||||
hex!("5223587ee928ed8cc5e9fcff9f9d04ac5fca83a46d602193b265e4642a3a344d")
|
||||
.unchecked_into(),
|
||||
),
|
||||
// G839e2eMiq7UXbConsY6DS1XDAYG2XnQxAmLuRLGGQ3Px9c
|
||||
// Cuwan (5HB4o1Qmb883n7spYVnt5dcWXrY18SFD8iwH2ySg2nSGjyyT)
|
||||
(
|
||||
hex!("9ce5741ee2f1ac3bdedbde9f3339048f4da2cb88ddf33a0977fa0b4cf86e2948")
|
||||
hex!("e2071e98ab4273169bf6a4cd9ade1f3f5d7e077ee849c06ff138faeb89f8187b")
|
||||
.into(),
|
||||
hex!("9ce5741ee2f1ac3bdedbde9f3339048f4da2cb88ddf33a0977fa0b4cf86e2948")
|
||||
hex!("e2071e98ab4273169bf6a4cd9ade1f3f5d7e077ee849c06ff138faeb89f8187b")
|
||||
.unchecked_into(),
|
||||
),
|
||||
// GLao4ukFUW6qhexuZowdFrKa2NLCfnEjZMftSXXfvGv1vvt
|
||||
// Delil (5Fk4FPr6BS3CiPyV38cYL5SnhgKdAGbzgVCL5K7eyvHp1g3z)
|
||||
(
|
||||
hex!("a676ed15f5a325eab49ed8d5f8c00f3f814b19bb58cda14ad10894c078dd337f")
|
||||
hex!("a2b7ea8803b44586258d718123286558aa0a3da2971316c83b46e3962b95af18")
|
||||
.into(),
|
||||
hex!("a676ed15f5a325eab49ed8d5f8c00f3f814b19bb58cda14ad10894c078dd337f")
|
||||
hex!("a2b7ea8803b44586258d718123286558aa0a3da2971316c83b46e3962b95af18")
|
||||
.unchecked_into(),
|
||||
),
|
||||
],
|
||||
|
||||
+16
-16
@@ -110,40 +110,40 @@ pub fn get_preset(id: &PresetId) -> Option<Vec<u8>> {
|
||||
// Founder account is the founding citizen
|
||||
// ====================================================================
|
||||
PRESET_GENESIS => {
|
||||
// Founder account - MUST be replaced with real address from
|
||||
// Founder_treasury_presale_wallets.json before mainnet launch
|
||||
// MAINNET FOUNDER ACCOUNT - NEW SECURE WALLET (2026-01-21)
|
||||
// Founder: 5HN6sFM7TbPQazmfhJP1kU8itw7Tb2A9UML8TwSYRwiN9q5Z
|
||||
let founder_account: AccountId =
|
||||
hex!("44cb62d1d6cdd2fff2a5ef3bb7ef827be5b3e117a394ecaa634d8dd9809d5608").into();
|
||||
hex!("ea71cc341e6790988692d8adcd08a26c75d8c813e45e0a25b24b707dc7846677").into();
|
||||
|
||||
people_pezkuwichain_genesis(
|
||||
// initial collators.
|
||||
// initial collators - 4 People Chain collators from mainnet_collators
|
||||
vec![
|
||||
// E8XC6rTJRsioKCp6KMy6zd24ykj4gWsusZ3AkSeyavpVBAG
|
||||
// Erin (5GsXLpqXCsffdiEvsgRGBUnErpEotJt6GYou4fk1KfitqmJA)
|
||||
(
|
||||
hex!("44cb62d1d6cdd2fff2a5ef3bb7ef827be5b3e117a394ecaa634d8dd9809d5608")
|
||||
hex!("d4a6129e5e8e5c148fec5e4fd542adc556a64f4693797383d8c709b7a9e26f55")
|
||||
.into(),
|
||||
hex!("44cb62d1d6cdd2fff2a5ef3bb7ef827be5b3e117a394ecaa634d8dd9809d5608")
|
||||
hex!("d4a6129e5e8e5c148fec5e4fd542adc556a64f4693797383d8c709b7a9e26f55")
|
||||
.unchecked_into(),
|
||||
),
|
||||
// G28iWEybndgGRbhfx83t7Q42YhMPByHpyqWDUgeyoGF94ri
|
||||
// Firaz (5FppJpr63gyHZ6RkgcZ4T39jpu9gepCdvQTDok1sUFDY24h6)
|
||||
(
|
||||
hex!("9864b85e23aa4506643db9879c3dbbeabaa94d269693a4447f537dd6b5893944")
|
||||
hex!("a65936cee8f0a310728475960e506e44a53436a7332f0bd40d965517aa435041")
|
||||
.into(),
|
||||
hex!("9864b85e23aa4506643db9879c3dbbeabaa94d269693a4447f537dd6b5893944")
|
||||
hex!("a65936cee8f0a310728475960e506e44a53436a7332f0bd40d965517aa435041")
|
||||
.unchecked_into(),
|
||||
),
|
||||
// G839e2eMiq7UXbConsY6DS1XDAYG2XnQxAmLuRLGGQ3Px9c
|
||||
// Goran (5HKjdsQN1RmrmXCr72kR5cTBJVatvm56DxBhjJGGxFFiYptd)
|
||||
(
|
||||
hex!("9ce5741ee2f1ac3bdedbde9f3339048f4da2cb88ddf33a0977fa0b4cf86e2948")
|
||||
hex!("e8a3d68cc51621451aec7f978601f1a200084bebc82ca1cb3abc021c311d5b7c")
|
||||
.into(),
|
||||
hex!("9ce5741ee2f1ac3bdedbde9f3339048f4da2cb88ddf33a0977fa0b4cf86e2948")
|
||||
hex!("e8a3d68cc51621451aec7f978601f1a200084bebc82ca1cb3abc021c311d5b7c")
|
||||
.unchecked_into(),
|
||||
),
|
||||
// GLao4ukFUW6qhexuZowdFrKa2NLCfnEjZMftSXXfvGv1vvt
|
||||
// Hevi (5CcYFisDG1jmwFRJSVYNSHKHxFWS69D4sfhebPNWc7kXvQhw)
|
||||
(
|
||||
hex!("a676ed15f5a325eab49ed8d5f8c00f3f814b19bb58cda14ad10894c078dd337f")
|
||||
hex!("1847872999ff97fb137e09143bc2dbd2e8c1c3c93bc240cd25ef10dc26ba9b62")
|
||||
.into(),
|
||||
hex!("a676ed15f5a325eab49ed8d5f8c00f3f814b19bb58cda14ad10894c078dd337f")
|
||||
hex!("1847872999ff97fb137e09143bc2dbd2e8c1c3c93bc240cd25ef10dc26ba9b62")
|
||||
.unchecked_into(),
|
||||
),
|
||||
],
|
||||
|
||||
@@ -149,6 +149,8 @@ impl BizinikiwiCli for Cli {
|
||||
"paseo" => Box::new(pezkuwi_service::chain_spec::paseo_config()?),
|
||||
"pezkuwichain" => Box::new(pezkuwi_service::chain_spec::pezkuwichain_config()?),
|
||||
#[cfg(feature = "pezkuwichain-native")]
|
||||
"pezkuwichain-mainnet" => Box::new(pezkuwi_service::chain_spec::pezkuwichain_mainnet_config()?),
|
||||
#[cfg(feature = "pezkuwichain-native")]
|
||||
"dev" | "pezkuwichain-dev" => Box::new(pezkuwi_service::chain_spec::pezkuwichain_development_config()?),
|
||||
#[cfg(feature = "pezkuwichain-native")]
|
||||
"pezkuwichain-local" => Box::new(pezkuwi_service::chain_spec::pezkuwichain_local_testnet_config()?),
|
||||
|
||||
@@ -94,6 +94,26 @@ pub fn pezkuwichain_config() -> Result<PezkuwichainChainSpec, String> {
|
||||
PezkuwichainChainSpec::from_json_bytes(&include_bytes!("../chain-specs/pezkuwichain.json")[..])
|
||||
}
|
||||
|
||||
/// PezkuwiChain Mainnet config with real validators and HEZ token distribution
|
||||
#[cfg(feature = "pezkuwichain-native")]
|
||||
pub fn pezkuwichain_mainnet_config() -> Result<PezkuwichainChainSpec, String> {
|
||||
Ok(PezkuwichainChainSpec::builder(
|
||||
pezkuwichain::WASM_BINARY.ok_or("Pezkuwichain WASM not available")?,
|
||||
Default::default(),
|
||||
)
|
||||
.with_name("PezkuwiChain Mainnet")
|
||||
.with_id("pezkuwichain_mainnet")
|
||||
.with_chain_type(ChainType::Live)
|
||||
.with_genesis_config_preset_name("genesis")
|
||||
.with_telemetry_endpoints(
|
||||
TelemetryEndpoints::new(vec![(PEZKUWICHAIN_STAGING_TELEMETRY_URL.to_string(), 0)])
|
||||
.expect("Pezkuwichain Mainnet telemetry url is valid; qed"),
|
||||
)
|
||||
.with_protocol_id(DEFAULT_PROTOCOL_ID)
|
||||
.with_properties(pezkuwichain_chain_spec_properties())
|
||||
.build())
|
||||
}
|
||||
|
||||
/// Zagros staging testnet config.
|
||||
#[cfg(feature = "zagros-native")]
|
||||
pub fn zagros_staging_testnet_config() -> Result<ZagrosChainSpec, String> {
|
||||
@@ -143,6 +163,18 @@ pub fn versi_chain_spec_properties() -> serde_json::map::Map<String, serde_json:
|
||||
.clone()
|
||||
}
|
||||
|
||||
/// PezkuwiChain mainnet chain spec properties (HEZ token)
|
||||
pub fn pezkuwichain_chain_spec_properties() -> serde_json::map::Map<String, serde_json::Value> {
|
||||
serde_json::json!({
|
||||
"ss58Format": 42,
|
||||
"tokenDecimals": 18,
|
||||
"tokenSymbol": "HEZ",
|
||||
})
|
||||
.as_object()
|
||||
.expect("Map given; qed")
|
||||
.clone()
|
||||
}
|
||||
|
||||
/// Versi staging testnet config.
|
||||
#[cfg(feature = "pezkuwichain-native")]
|
||||
pub fn versi_staging_testnet_config() -> Result<PezkuwichainChainSpec, String> {
|
||||
|
||||
Reference in New Issue
Block a user