Skip to content

Commit fcb2dc8

Browse files
committed
Shaders: Explorer/parser updated to include PBFT contract
1 parent c26fbd0 commit fcb2dc8

File tree

3 files changed

+203
-0
lines changed

3 files changed

+203
-0
lines changed

bvm/Shaders/Explorer/Parser.cpp

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3233
template <uint32_t nMaxLen>
3334
void 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

460469
bool 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+
10031204
void ParserContext::OnState_VaultAnon()
10041205
{
10051206
}

bvm/Shaders/Explorer/Parser.wasm

8.14 KB
Binary file not shown.

bvm/Shaders/pbft/contract.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ namespace PBFT
66
{
77
#pragma pack (push, 1)
88

9+
static const ShaderID s_SID = { 0x49,0xe6,0x78,0x74,0xd3,0x2e,0xe9,0xf7,0x62,0x2b,0x04,0x6b,0xef,0x68,0xb2,0xf5,0xe0,0x7a,0x5d,0x8c,0xe1,0x43,0x09,0x2d,0xca,0x85,0xa2,0xdd,0x61,0xd7,0x0b,0x50 };
10+
911
struct Settings
1012
{
1113
AssetID m_aidStake;

0 commit comments

Comments
 (0)