@@ -83,26 +83,130 @@ using interfaces::GOV;
8383using interfaces::Handler;
8484using interfaces::LLMQ;
8585using interfaces::MakeHandler;
86+ using interfaces::MnEntry;
87+ using interfaces::MnEntryCPtr;
88+ using interfaces::MnList;
89+ using interfaces::MnListPtr;
8690using interfaces::Node;
8791using interfaces::WalletLoader;
8892
8993namespace node {
9094namespace {
95+ class MnEntryImpl : public MnEntry
96+ {
97+ private:
98+ CDeterministicMNCPtr m_dmn;
99+
100+ public:
101+ MnEntryImpl (const CDeterministicMNCPtr& dmn) :
102+ MnEntry{dmn},
103+ m_dmn{Assert (dmn)}
104+ {
105+ }
106+ ~MnEntryImpl () = default ;
107+
108+ bool isBanned () const override { return m_dmn->pdmnState ->IsBanned (); }
109+
110+ CService getNetInfoPrimary () const override { return m_dmn->pdmnState ->netInfo ->GetPrimary (); }
111+ MnType getType () const override { return m_dmn->nType ; }
112+ UniValue toJson () const override { return m_dmn->ToJson (); }
113+ const CKeyID& getKeyIdOwner () const override { return m_dmn->pdmnState ->keyIDOwner ; }
114+ const CKeyID& getKeyIdVoting () const override { return m_dmn->pdmnState ->keyIDVoting ; }
115+ const COutPoint& getCollateralOutpoint () const override { return m_dmn->collateralOutpoint ; }
116+ const CScript& getScriptPayout () const override { return m_dmn->pdmnState ->scriptPayout ; }
117+ const CScript& getScriptOperatorPayout () const override { return m_dmn->pdmnState ->scriptOperatorPayout ; }
118+ const int32_t & getLastPaidHeight () const override { return m_dmn->pdmnState ->nLastPaidHeight ; }
119+ const int32_t & getPoSePenalty () const override { return m_dmn->pdmnState ->nPoSePenalty ; }
120+ const int32_t & getRegisteredHeight () const override { return m_dmn->pdmnState ->nRegisteredHeight ; }
121+ const uint16_t & getOperatorReward () const override { return m_dmn->nOperatorReward ; }
122+ const uint256& getProTxHash () const override { return m_dmn->proTxHash ; }
123+ };
124+
125+ class MnListImpl : public MnList
126+ {
127+ private:
128+ CDeterministicMNList m_list;
129+
130+ public:
131+ MnListImpl (const CDeterministicMNList& mn_list) :
132+ MnList{mn_list},
133+ m_list{mn_list}
134+ {
135+ }
136+ ~MnListImpl () = default ;
137+
138+ int32_t getHeight () const override { return m_list.GetHeight (); }
139+ size_t getAllEvoCount () const override { return m_list.GetAllEvoCount (); }
140+ size_t getAllMNsCount () const override { return m_list.GetAllMNsCount (); }
141+ size_t getValidEvoCount () const override { return m_list.GetValidEvoCount (); }
142+ size_t getValidMNsCount () const override { return m_list.GetValidMNsCount (); }
143+ size_t getValidWeightedMNsCount () const override { return m_list.GetValidWeightedMNsCount (); }
144+ uint256 getBlockHash () const override { return m_list.GetBlockHash (); }
145+
146+ void forEachMN (bool only_valid, std::function<void (const MnEntry&)> cb) const override
147+ {
148+ m_list.ForEachMNShared (only_valid, [&cb](const auto & dmn) {
149+ cb (MnEntryImpl{dmn});
150+ });
151+ }
152+ MnEntryCPtr getMN (const uint256& hash) const override
153+ {
154+ const auto dmn{m_list.GetMN (hash)};
155+ return dmn ? std::make_unique<const MnEntryImpl>(dmn) : nullptr ;
156+ }
157+ MnEntryCPtr getMNByService (const CService& service) const override
158+ {
159+ const auto dmn{m_list.GetMNByService (service)};
160+ return dmn ? std::make_unique<const MnEntryImpl>(dmn) : nullptr ;
161+ }
162+ MnEntryCPtr getValidMN (const uint256& hash) const override
163+ {
164+ const auto dmn{m_list.GetValidMN (hash)};
165+ return dmn ? std::make_unique<const MnEntryImpl>(dmn) : nullptr ;
166+ }
167+ std::vector<MnEntryCPtr> getProjectedMNPayees (const CBlockIndex* pindex) const override
168+ {
169+ std::vector<MnEntryCPtr> ret;
170+ for (const auto & payee : m_list.GetProjectedMNPayees (pindex)) {
171+ ret.emplace_back (std::make_unique<const MnEntryImpl>(payee));
172+ }
173+ return ret;
174+ }
175+
176+ void copyContextTo (MnList& mn_list) const override
177+ {
178+ if (!m_context) return ;
179+ mn_list.setContext (m_context);
180+ }
181+ void setContext (NodeContext* context) override
182+ {
183+ m_context = context;
184+ }
185+
186+ private:
187+ // Note: Currently we do nothing with m_context but in the future, if we have a hard fork
188+ // that requires checking for deployment information in deterministic masternode logic,
189+ // we will need NodeContext::chainman. This has been kept around to retain those code
190+ // paths.
191+ [[maybe_unused]] NodeContext* m_context{nullptr };
192+ };
193+
91194class EVOImpl : public EVO
92195{
93196private:
94197 ChainstateManager& chainman () { return *Assert (m_context->chainman ); }
95198 NodeContext& context () { return *Assert (m_context); }
96199
97200public:
98- std::pair<CDeterministicMNList , const CBlockIndex*> getListAtChainTip () override
201+ std::pair<MnListPtr , const CBlockIndex*> getListAtChainTip () override
99202 {
100203 const CBlockIndex *tip = WITH_LOCK (::cs_main, return chainman ().ActiveChain ().Tip ());
101- CDeterministicMNList mnList{};
204+ MnListImpl mnList{CDeterministicMNList{} };
102205 if (tip != nullptr && context ().dmnman != nullptr ) {
103206 mnList = context ().dmnman ->GetListForBlock (tip);
104207 }
105- return {std::move (mnList), tip};
208+ mnList.setContext (m_context);
209+ return {std::make_shared<MnListImpl>(mnList), tip};
106210 }
107211 void setContext (NodeContext* context) override
108212 {
@@ -1215,4 +1319,5 @@ class ChainImpl : public Chain
12151319namespace interfaces {
12161320std::unique_ptr<Node> MakeNode (node::NodeContext& context) { return std::make_unique<node::NodeImpl>(context); }
12171321std::unique_ptr<Chain> MakeChain (node::NodeContext& node) { return std::make_unique<node::ChainImpl>(node); }
1322+ MnListPtr MakeMNList (const CDeterministicMNList& mn_list) { return std::make_shared<node::MnListImpl>(mn_list); }
12181323} // namespace interfaces
0 commit comments