@@ -2954,6 +2954,78 @@ namespace
29542954 Block::Pbft::Address m_pValidatorAddress[s_Validators];
29552955 };
29562956
2957+
2958+ struct PbftTreasuryBuilder
2959+ {
2960+ Treasury::Data::Group& m_Tg;
2961+ ContractID m_Cid;
2962+ Shaders::PBFT::Settings m_Settings;
2963+
2964+ PbftTreasuryBuilder (Treasury::Data::Group& tg)
2965+ :m_Tg(tg)
2966+ {
2967+ ZeroObject (m_Settings);
2968+ }
2969+
2970+ void Init ()
2971+ {
2972+ m_Tg.m_Aid = m_Settings.m_aidStake ;
2973+
2974+ auto pKrn = std::make_unique<beam::TxKernelContractCreate>();
2975+ MyManager::Compile (pKrn->m_Data , " pbft/contract.wasm" , beam::bvm2::Processor::Kind::Contract);
2976+
2977+ pKrn->m_Args .resize (sizeof (Shaders::PBFT::Method::Create));
2978+ auto & args = *(Shaders::PBFT::Method::Create*) &pKrn->m_Args .front ();
2979+ ZeroObject (args);
2980+
2981+ args.m_Settings .m_aidStake = ByteOrder::to_le (m_Settings.m_aidStake );
2982+ args.m_Settings .m_hUnbondLock = ByteOrder::to_le (m_Settings.m_hUnbondLock );
2983+ args.m_Settings .m_MinValidatorStake = ByteOrder::to_le (m_Settings.m_MinValidatorStake );
2984+
2985+ ECC::Scalar::Native sk;
2986+ sk.GenRandomNnz ();
2987+ ECC::Point::Native ptFunds (beam::Zero);
2988+ pKrn->Sign (&sk, 1 , ptFunds, nullptr );
2989+
2990+ bvm2::get_Cid (m_Cid, pKrn->m_Data , pKrn->m_Args );
2991+
2992+ m_Tg.m_Data .m_vKernels .push_back (std::move (pKrn));
2993+
2994+ sk = -sk;
2995+ m_Tg.m_Data .m_Offset = ECC::Scalar::Native (m_Tg.m_Data .m_Offset ) + sk;
2996+ }
2997+
2998+ void AddValidator (const Block::Pbft::Address& addr, const ECC::Point& pkDelegator, Amount stake)
2999+ {
3000+ auto pKrn = std::make_unique<beam::TxKernelContractInvoke>();
3001+ pKrn->m_Cid = m_Cid;
3002+
3003+ pKrn->m_Args .resize (sizeof (Shaders::PBFT::Method::ValidatorRegister));
3004+ auto & args = *(Shaders::PBFT::Method::ValidatorRegister*)&pKrn->m_Args .front ();
3005+ pKrn->m_iMethod = args.s_iMethod ;
3006+
3007+ ZeroObject (args);
3008+ args.m_Commission_cpc = 500 ;
3009+ args.m_Stake = ByteOrder::to_le (stake);
3010+ args.m_Validator = Cast::Down<ECC::uintBig>(addr);
3011+ args.m_Delegator = pkDelegator;
3012+
3013+ ECC::Point::Native ptFunds (Zero);
3014+ CoinID::Generator (m_Settings.m_aidStake ).AddValue (ptFunds, stake);
3015+
3016+ ECC::Scalar::Native sk;
3017+ sk.GenRandomNnz ();
3018+ pKrn->Sign (&sk, 1 , ptFunds, nullptr );
3019+
3020+ m_Tg.m_Data .m_vKernels .push_back (std::move (pKrn));
3021+
3022+ sk = -sk;
3023+ m_Tg.m_Data .m_Offset = ECC::Scalar::Native (m_Tg.m_Data .m_Offset ) + sk;
3024+
3025+ m_Tg.m_Value += MultiWord::From (stake);
3026+ }
3027+ };
3028+
29573029 void L2Params::RunInThread ()
29583030 {
29593031 Rules::Scope scopeRules (m_RulesL2);
@@ -2970,46 +3042,22 @@ namespace
29703042 // add PBFT and bridge L2 contract deployment
29713043 {
29723044 Treasury::Data td;
2973- auto & tg = td.m_vGroups .emplace_back ();
2974- tg.m_Value = Zero;
2975-
2976- {
2977- auto pKrn = std::make_unique<beam::TxKernelContractCreate>();
2978- MyManager::Compile (pKrn->m_Data , " pbft/contract.wasm" , beam::bvm2::Processor::Kind::Contract);
3045+ PbftTreasuryBuilder tb (td.m_vGroups .emplace_back ());
3046+ tb.m_Tg .m_Value = Zero;
3047+ tb.m_Tg .m_Data .m_Offset = Zero;
29793048
2980- Shaders::PBFT::Method::Create m;
2981- ZeroObject (m);
2982- m.m_Validators = s_Validators;
2983- m.m_Settings .m_aidStake = 7 ;
3049+ tb.m_Settings .m_aidStake = 7 ;
3050+ tb.m_Settings .m_hUnbondLock = 15 ;
3051+ tb.m_Settings .m_MinValidatorStake = Rules::Coin * 600 ;
29843052
2985- std::vector<Shaders::PBFT::State::Validator::Init> vVals;
2986- ECC::Scalar::Native sk;
3053+ tb.Init ();
29873054
2988- vVals.resize (s_Validators);
2989-
2990- for (uint32_t i = 0 ; i < s_Validators; i++)
2991- {
2992- vVals[i].m_Address = Cast::Down<ECC::uintBig>(m_pValidatorAddress[i]);
2993- vVals[i].m_Stake = Rules::Coin * 5000 ;
2994- }
2995-
2996- pKrn->m_Args .resize (sizeof (m) + sizeof (Shaders::PBFT::State::Validator::Init) * m.m_Validators );
2997- memcpy (&pKrn->m_Args .front (), &m, sizeof (m));
2998-
2999- if (m.m_Validators )
3000- memcpy (&pKrn->m_Args .front () + sizeof (m), &vVals.front (), sizeof (Shaders::PBFT::State::Validator::Init) * m.m_Validators );
3001-
3002- sk.GenRandomNnz ();
3003- ECC::Point::Native ptFunds (beam::Zero);
3004- pKrn->Sign (&sk, 1 , ptFunds, nullptr );
3005-
3006- tg.m_Data .m_vKernels .push_back (std::move (pKrn));
3007-
3008- sk = -sk;
3009- tg.m_Data .m_Offset = sk;
3055+ for (uint32_t i = 0 ; i < s_Validators; i++)
3056+ {
3057+ ECC::Point ptDelegator = Zero; // not used
3058+ tb.AddValidator (m_pValidatorAddress[i], ptDelegator, Rules::Coin * 5000 );
30103059 }
30113060
3012-
30133061 {
30143062 auto pKrn = std::make_unique<beam::TxKernelContractCreate>();
30153063 MyManager::Compile (pKrn->m_Data , " l2tst1/contract_l2.wasm" , MyManager::Kind::Contract);
@@ -3020,10 +3068,10 @@ namespace
30203068
30213069 pKrn->Sign (&sk, 1 , ptFunds, nullptr );
30223070
3023- tg .m_Data .m_vKernels .push_back (std::move (pKrn));
3071+ tb. m_Tg .m_Data .m_vKernels .push_back (std::move (pKrn));
30243072
30253073 sk = -sk;
3026- tg. m_Data .m_Offset = ECC::Scalar::Native (tg .m_Data .m_Offset ) + sk;
3074+ tb. m_Tg . m_Data .m_Offset = ECC::Scalar::Native (tb. m_Tg .m_Data .m_Offset ) + sk;
30273075 }
30283076
30293077 beam::Serializer ser;
0 commit comments