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