@@ -28,6 +28,7 @@ namespace Testnet {
2828#include " ../blackhole/contract.h"
2929#include " ../l2tst1/contract_l1.h"
3030#include " ../l2tst1/contract_l2.h"
31+ #include " ../pbft/contract.h"
3132
3233template <uint32_t nMaxLen>
3334void DocAddTextLen (const char * szID, const void * szValue, uint32_t nLen)
@@ -224,6 +225,7 @@ void DocAddPerc(const char* sz, MultiPrecision::Float x, uint32_t nDigsAfterDot
224225 macro(Minter, Minter::s_SID) \
225226 macro(BlackHole, BlackHole::s_SID) \
226227 macro(L2Tst1_L2, L2Tst1_L2::s_SID) \
228+ macro(PBFT, PBFT::s_SID) \
227229
228230#define HandleContractsVer (macro ) \
229231 macro (Oracle2, Oracle2::s_pSID) \
@@ -455,6 +457,13 @@ struct ParserContext
455457 void OnState_DaoAccumulator_Pool (DaoAccumulator::Pool&, const char * szName);
456458 void OnState_DaoAccumulator_Users (DaoAccumulator::Pool&, uint8_t type, const char * szName);
457459
460+ void On_PBFT_Settings (const PBFT::Settings&);
461+ void On_PBFT_ValidatorAddr (const PBFT::Address&);
462+ void On_PBFT_DelegatorAddr (const PubKey&);
463+ void On_PBFT_Status (const char *, PBFT::State::Validator::Status);
464+ void On_PBFT_Stake (Amount);
465+ void On_PBFT_Commission (uint16_t , bool bIsTbl = false );
466+
458467};
459468
460469bool ParserContext::Parse ()
@@ -1000,6 +1009,198 @@ void ParserContext::OnMethod_VaultAnon()
10001009 }
10011010}
10021011
1012+ void ParserContext::OnState_PBFT ()
1013+ {
1014+ Env::Key_T<uint8_t > k;
1015+ _POD_ (k.m_Prefix .m_Cid ) = m_Cid;
1016+ k.m_KeyInContract = PBFT::State::Tag::s_Global;
1017+
1018+ PBFT::State::Global g;
1019+ if (!Env::VarReader::Read_T (k, g))
1020+ return ;
1021+
1022+ g.FlushRewardPending ();
1023+
1024+ DocAddAmount (" Total-non-jailed-stake" , g.m_TotakStakeNonJailed );
1025+
1026+ {
1027+ Env::DocGroup gr (" Settings" );
1028+ On_PBFT_Settings (g.m_Settings );
1029+ }
1030+
1031+
1032+ {
1033+ Env::DocGroup gr2 (" Validators" );
1034+
1035+ DocSetType (" table" );
1036+ Env::DocArray gr3 (" value" );
1037+
1038+ {
1039+ Env::DocArray gr4 (" " );
1040+ DocAddTableHeader (" Validator" );
1041+ DocAddTableHeader (" Status" );
1042+ DocAddTableHeader (" Commission" );
1043+ DocAddTableHeader (" Weight" );
1044+ }
1045+
1046+ Env::Key_T<PBFT::State::Validator::Key> vk0, vk1;
1047+ _POD_ (vk0.m_Prefix .m_Cid ) = m_Cid;
1048+ _POD_ (vk1.m_Prefix .m_Cid ) = m_Cid;
1049+ _POD_ (vk0.m_KeyInContract .m_Address ).SetZero ();
1050+ _POD_ (vk1.m_KeyInContract .m_Address ).SetObject (0xff );
1051+
1052+ for (Env::VarReader r (vk0, vk1); ; )
1053+ {
1054+ PBFT::State::ValidatorPlus vp;
1055+ if (!r.MoveNext_T (vk0, vp))
1056+ break ;
1057+
1058+ Env::DocArray gr4 (" " );
1059+
1060+ Env::DocAddBlob_T (" " , vk0.m_KeyInContract .m_Address );
1061+ On_PBFT_Status (" " , vp.m_Status );
1062+ On_PBFT_Commission (vp.m_Commission_cpc , true );
1063+
1064+ DocAddAmount (" " , vp.m_Weight );
1065+ }
1066+
1067+ }
1068+ }
1069+
1070+ void ParserContext::OnMethod_PBFT ()
1071+ {
1072+ switch (m_iMethod)
1073+ {
1074+ case PBFT::Method::Create::s_iMethod:
1075+ {
1076+ auto pArg = get_ArgsAs<PBFT::Method::Create>();
1077+ if (pArg)
1078+ {
1079+ GroupArgs gr;
1080+ On_PBFT_Settings (pArg->m_Settings );
1081+ }
1082+ }
1083+ break ;
1084+
1085+ case PBFT::Method::ValidatorStatusUpdate::s_iMethod:
1086+ OnMethod (" ValidatorStatusUpdate" );
1087+ {
1088+ auto pArg = get_ArgsAs<PBFT::Method::ValidatorStatusUpdate>();
1089+ if (pArg)
1090+ {
1091+ GroupArgs gr;
1092+ On_PBFT_ValidatorAddr (pArg->m_Address );
1093+ On_PBFT_Status (" Status" , pArg->m_Status );
1094+ }
1095+ }
1096+ break ;
1097+
1098+ case PBFT::Method::AddReward::s_iMethod:
1099+ OnMethod (" AddReward" );
1100+ break ;
1101+
1102+ case PBFT::Method::DelegatorUpdate::s_iMethod:
1103+ OnMethod (" DelegatorUpdate" );
1104+ {
1105+ auto pArg = get_ArgsAs<PBFT::Method::DelegatorUpdate>();
1106+ if (pArg)
1107+ {
1108+ GroupArgs gr;
1109+ }
1110+ }
1111+ break ;
1112+
1113+ case PBFT::Method::ValidatorRegister::s_iMethod:
1114+ OnMethod (" ValidatorRegister" );
1115+ {
1116+ auto pArg = get_ArgsAs<PBFT::Method::ValidatorRegister>();
1117+ if (pArg)
1118+ {
1119+ GroupArgs gr;
1120+
1121+ On_PBFT_ValidatorAddr (pArg->m_Validator );
1122+ On_PBFT_DelegatorAddr (pArg->m_Delegator );
1123+ On_PBFT_Stake (pArg->m_Stake );
1124+ On_PBFT_Commission (pArg->m_Commission_cpc );
1125+ }
1126+ }
1127+ break ;
1128+
1129+ case PBFT::Method::ValidatorUpdate::s_iMethod:
1130+ OnMethod (" ValidatorUpdate" );
1131+ {
1132+ auto pArg = get_ArgsAs<PBFT::Method::ValidatorUpdate>();
1133+ if (pArg)
1134+ {
1135+ GroupArgs gr;
1136+
1137+ On_PBFT_ValidatorAddr (pArg->m_Validator );
1138+ if (PBFT::State::ValidatorPlus::s_CommissionTagTomb == pArg->m_Commission_cpc )
1139+ Env::DocAddText (" Action" , " Tomb" );
1140+ else
1141+ On_PBFT_Commission (pArg->m_Commission_cpc );
1142+ }
1143+ }
1144+ break ;
1145+ }
1146+ }
1147+
1148+ void ParserContext::On_PBFT_Settings (const PBFT::Settings& stg)
1149+ {
1150+ DocAddAid (" Stake-Aid" , stg.m_aidStake );
1151+ Env::DocAddNum (" Unbond lock" , stg.m_hUnbondLock );
1152+ DocAddAmount (" Min stake" , stg.m_MinValidatorStake );
1153+ }
1154+
1155+ void ParserContext::On_PBFT_ValidatorAddr (const PBFT::Address& addr)
1156+ {
1157+ Env::DocAddBlob_T (" Address" , addr);
1158+ }
1159+
1160+ void ParserContext::On_PBFT_DelegatorAddr (const PubKey& addr)
1161+ {
1162+ Env::DocAddBlob_T (" Delegator" , addr);
1163+ }
1164+
1165+ void ParserContext::On_PBFT_Status (const char * szName, PBFT::State::Validator::Status status)
1166+ {
1167+ const char * szStatus = nullptr ;
1168+ switch (status)
1169+ {
1170+ case PBFT::State::Validator::Status::Active: szStatus = " Active" ; break ;
1171+ case PBFT::State::Validator::Status::Jailed: szStatus = " Jailed" ; break ;
1172+ case PBFT::State::Validator::Status::Suspended: szStatus = " Suspended" ; break ;
1173+ case PBFT::State::Validator::Status::Tombed: szStatus = " Tombed" ; break ;
1174+ case PBFT::State::Validator::Status::Slash: szStatus = " Slash" ; break ;
1175+
1176+ default :
1177+ Env::DocAddNum (szName, static_cast <uint32_t >(status));
1178+ return ;
1179+ }
1180+
1181+ Env::DocAddText (szName, szStatus);
1182+ }
1183+
1184+ void ParserContext::On_PBFT_Stake (Amount val)
1185+ {
1186+ DocAddAmount (" Stake" , val);
1187+ }
1188+
1189+ void ParserContext::On_PBFT_Commission (uint16_t commission_cpc, bool bIsTbl /* = false */ )
1190+ {
1191+ char szVal[Utils::String::Decimal::DigitsMax<uint16_t >::N + 2 ];
1192+ auto n1 = Utils::String::Decimal::Print (szVal, commission_cpc / 100 );
1193+
1194+ auto resid = commission_cpc % 100 ;
1195+ // if (resid)
1196+ {
1197+ szVal[n1++] = ' .' ;
1198+ Utils::String::Decimal::Print (szVal + n1, resid, 2 );
1199+ }
1200+
1201+ Env::DocAddText (bIsTbl ? " " : " Commission" , szVal);
1202+ }
1203+
10031204void ParserContext::OnState_VaultAnon ()
10041205{
10051206}
0 commit comments