code: func (c *Clique) FinalizeAndAssemble(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) {
  	// No block rewards in PoA, so the state remains as is and uncles are dropped
  	header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number))
  	header.UncleHash = types.CalcUncleHash(nil)
  
  	// Assemble and return the final block for sealing
  	return types.NewBlock(header, txs, nil, receipts), nil
  }
docs: // FinalizeAndAssemble implements consensus.Engine, ensuring no uncles are set,
  // nor block rewards given, and returns the final block.