diff --git a/Cargo.lock b/Cargo.lock index 1032babc..e706ac86 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12013,6 +12013,7 @@ dependencies = [ "pezsp-staking", "pezsp-state-machine", "pezsp-std", + "pezsp-timestamp", "pezsp-tracing", "pezsp-trie", "pezsp-weights", diff --git a/pezcumulus/pezkuwi-teyrchain/src/chain_spec/asset_hubs.rs b/pezcumulus/pezkuwi-teyrchain/src/chain_spec/asset_hubs.rs index 4674818d..bf0b231c 100644 --- a/pezcumulus/pezkuwi-teyrchain/src/chain_spec/asset_hubs.rs +++ b/pezcumulus/pezkuwi-teyrchain/src/chain_spec/asset_hubs.rs @@ -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") diff --git a/pezcumulus/pezkuwi-teyrchain/src/chain_spec/people.rs b/pezcumulus/pezkuwi-teyrchain/src/chain_spec/people.rs index a8bee89a..9243159b 100644 --- a/pezcumulus/pezkuwi-teyrchain/src/chain_spec/people.rs +++ b/pezcumulus/pezkuwi-teyrchain/src/chain_spec/people.rs @@ -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, diff --git a/pezcumulus/teyrchains/runtimes/assets/asset-hub-pezkuwichain/src/genesis_config_presets.rs b/pezcumulus/teyrchains/runtimes/assets/asset-hub-pezkuwichain/src/genesis_config_presets.rs index 1119ef81..690083ba 100644 --- a/pezcumulus/teyrchains/runtimes/assets/asset-hub-pezkuwichain/src/genesis_config_presets.rs +++ b/pezcumulus/teyrchains/runtimes/assets/asset-hub-pezkuwichain/src/genesis_config_presets.rs @@ -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> { // 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(), ), ], diff --git a/pezcumulus/teyrchains/runtimes/people/people-pezkuwichain/src/genesis_config_presets.rs b/pezcumulus/teyrchains/runtimes/people/people-pezkuwichain/src/genesis_config_presets.rs index 16e9bf5a..e0ddcd3c 100644 --- a/pezcumulus/teyrchains/runtimes/people/people-pezkuwichain/src/genesis_config_presets.rs +++ b/pezcumulus/teyrchains/runtimes/people/people-pezkuwichain/src/genesis_config_presets.rs @@ -110,40 +110,40 @@ pub fn get_preset(id: &PresetId) -> Option> { // 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(), ), ], diff --git a/pezkuwi/cli/src/command.rs b/pezkuwi/cli/src/command.rs index 9e12a538..20b305fd 100644 --- a/pezkuwi/cli/src/command.rs +++ b/pezkuwi/cli/src/command.rs @@ -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()?), diff --git a/pezkuwi/node/service/src/chain_spec.rs b/pezkuwi/node/service/src/chain_spec.rs index 8f80d67d..ce1a3a57 100644 --- a/pezkuwi/node/service/src/chain_spec.rs +++ b/pezkuwi/node/service/src/chain_spec.rs @@ -94,6 +94,26 @@ pub fn pezkuwichain_config() -> Result { 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 { + 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 { @@ -143,6 +163,18 @@ pub fn versi_chain_spec_properties() -> serde_json::map::Map serde_json::map::Map { + 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 {