mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
Add fee burning and blackhole address (#703)
* Fix tlbc crash * Burn specified fraction of fees * Add "blackhole" for burning TONs --------- Co-authored-by: SpyCheese <mikle98@yandex.ru>
This commit is contained in:
parent
d5cd548502
commit
ef64b92f08
12 changed files with 187 additions and 57 deletions
|
@ -1364,42 +1364,61 @@ std::ostream& operator<<(std::ostream& os, const CurrencyCollection& cc) {
|
|||
bool ValueFlow::set_zero() {
|
||||
return from_prev_blk.set_zero() && to_next_blk.set_zero() && imported.set_zero() && exported.set_zero() &&
|
||||
fees_collected.set_zero() && fees_imported.set_zero() && recovered.set_zero() && created.set_zero() &&
|
||||
minted.set_zero();
|
||||
minted.set_zero() && burned.set_zero();
|
||||
}
|
||||
|
||||
bool ValueFlow::validate() const {
|
||||
return is_valid() && from_prev_blk + imported + fees_imported + created + minted + recovered ==
|
||||
to_next_blk + exported + fees_collected;
|
||||
to_next_blk + exported + fees_collected + burned;
|
||||
}
|
||||
|
||||
bool ValueFlow::store(vm::CellBuilder& cb) const {
|
||||
vm::CellBuilder cb2;
|
||||
return cb.store_long_bool(block::gen::ValueFlow::cons_tag[0], 32) // value_flow ^[
|
||||
&& from_prev_blk.store(cb2) // from_prev_blk:CurrencyCollection
|
||||
&& to_next_blk.store(cb2) // to_next_blk:CurrencyCollection
|
||||
&& imported.store(cb2) // imported:CurrencyCollection
|
||||
&& exported.store(cb2) // exported:CurrencyCollection
|
||||
&& cb.store_ref_bool(cb2.finalize()) // ]
|
||||
&& fees_collected.store(cb) // fees_collected:CurrencyCollection
|
||||
&& fees_imported.store(cb2) // ^[ fees_imported:CurrencyCollection
|
||||
&& recovered.store(cb2) // recovered:CurrencyCollection
|
||||
&& created.store(cb2) // created:CurrencyCollection
|
||||
&& minted.store(cb2) // minted:CurrencyCollection
|
||||
&& cb.store_ref_bool(cb2.finalize()); // ] = ValueFlow;
|
||||
auto type = burned.is_zero() ? block::gen::ValueFlow::value_flow : block::gen::ValueFlow::value_flow_v2;
|
||||
return cb.store_long_bool(block::gen::ValueFlow::cons_tag[type], 32) // ^[
|
||||
&& from_prev_blk.store(cb2) // from_prev_blk:CurrencyCollection
|
||||
&& to_next_blk.store(cb2) // to_next_blk:CurrencyCollection
|
||||
&& imported.store(cb2) // imported:CurrencyCollection
|
||||
&& exported.store(cb2) // exported:CurrencyCollection
|
||||
&& cb.store_ref_bool(cb2.finalize()) // ]
|
||||
&& fees_collected.store(cb) // fees_collected:CurrencyCollection
|
||||
&& (burned.is_zero() || burned.store(cb)) // fees_burned:CurrencyCollection
|
||||
&& fees_imported.store(cb2) // ^[ fees_imported:CurrencyCollection
|
||||
&& recovered.store(cb2) // recovered:CurrencyCollection
|
||||
&& created.store(cb2) // created:CurrencyCollection
|
||||
&& minted.store(cb2) // minted:CurrencyCollection
|
||||
&& cb.store_ref_bool(cb2.finalize()); // ] = ValueFlow;
|
||||
}
|
||||
|
||||
bool ValueFlow::fetch(vm::CellSlice& cs) {
|
||||
block::gen::ValueFlow::Record f;
|
||||
if (!(tlb::unpack(cs, f) && from_prev_blk.validate_unpack(std::move(f.r1.from_prev_blk)) &&
|
||||
to_next_blk.validate_unpack(std::move(f.r1.to_next_blk)) &&
|
||||
imported.validate_unpack(std::move(f.r1.imported)) && exported.validate_unpack(std::move(f.r1.exported)) &&
|
||||
fees_collected.validate_unpack(std::move(f.fees_collected)) &&
|
||||
fees_imported.validate_unpack(std::move(f.r2.fees_imported)) &&
|
||||
recovered.validate_unpack(std::move(f.r2.recovered)) && created.validate_unpack(std::move(f.r2.created)) &&
|
||||
minted.validate_unpack(std::move(f.r2.minted)))) {
|
||||
if (cs.size() < 32) {
|
||||
return invalidate();
|
||||
}
|
||||
return true;
|
||||
auto tag = cs.prefetch_ulong(32);
|
||||
block::gen::ValueFlow::Record_value_flow f1;
|
||||
if (tag == block::gen::ValueFlow::cons_tag[block::gen::ValueFlow::value_flow] && tlb::unpack(cs, f1) &&
|
||||
from_prev_blk.validate_unpack(std::move(f1.r1.from_prev_blk)) &&
|
||||
to_next_blk.validate_unpack(std::move(f1.r1.to_next_blk)) &&
|
||||
imported.validate_unpack(std::move(f1.r1.imported)) && exported.validate_unpack(std::move(f1.r1.exported)) &&
|
||||
fees_collected.validate_unpack(std::move(f1.fees_collected)) && burned.set_zero() &&
|
||||
fees_imported.validate_unpack(std::move(f1.r2.fees_imported)) &&
|
||||
recovered.validate_unpack(std::move(f1.r2.recovered)) && created.validate_unpack(std::move(f1.r2.created)) &&
|
||||
minted.validate_unpack(std::move(f1.r2.minted))) {
|
||||
return true;
|
||||
}
|
||||
block::gen::ValueFlow::Record_value_flow_v2 f2;
|
||||
if (tag == block::gen::ValueFlow::cons_tag[block::gen::ValueFlow::value_flow_v2] && tlb::unpack(cs, f2) &&
|
||||
from_prev_blk.validate_unpack(std::move(f2.r1.from_prev_blk)) &&
|
||||
to_next_blk.validate_unpack(std::move(f2.r1.to_next_blk)) &&
|
||||
imported.validate_unpack(std::move(f2.r1.imported)) && exported.validate_unpack(std::move(f2.r1.exported)) &&
|
||||
fees_collected.validate_unpack(std::move(f2.fees_collected)) &&
|
||||
burned.validate_unpack(std::move(f2.burned)) &&
|
||||
fees_imported.validate_unpack(std::move(f2.r2.fees_imported)) &&
|
||||
recovered.validate_unpack(std::move(f2.r2.recovered)) && created.validate_unpack(std::move(f2.r2.created)) &&
|
||||
minted.validate_unpack(std::move(f2.r2.minted))) {
|
||||
return true;
|
||||
}
|
||||
return invalidate();
|
||||
}
|
||||
|
||||
bool ValueFlow::unpack(Ref<vm::CellSlice> csr) {
|
||||
|
@ -1424,7 +1443,8 @@ bool ValueFlow::show(std::ostream& os) const {
|
|||
show_one(os, " to_next_blk:", to_next_blk) && show_one(os, " imported:", imported) &&
|
||||
show_one(os, " exported:", exported) && show_one(os, " fees_collected:", fees_collected) &&
|
||||
show_one(os, " fees_imported:", fees_imported) && show_one(os, " recovered:", recovered) &&
|
||||
show_one(os, " created:", created) && show_one(os, " minted:", minted) && say(os, ")")) ||
|
||||
show_one(os, " created:", created) && show_one(os, " minted:", minted) &&
|
||||
(burned.is_zero() || show_one(os, " burned:", burned)) && say(os, ")")) ||
|
||||
(say(os, "...<invalid-value-flow>)") && false);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue