code: func memoryGasCost(mem *Memory, newMemSize uint64) (uint64, error) {
  	if newMemSize == 0 {
  		return 0, nil
  	}
  	// The maximum that will fit in a uint64 is max_word_count - 1. Anything above
  	// that will result in an overflow. Additionally, a newMemSize which results in
  	// a newMemSizeWords larger than 0xFFFFFFFF will cause the square operation to
  	// overflow. The constant 0x1FFFFFFFE0 is the highest number that can be used
  	// without overflowing the gas calculation.
  	if newMemSize > 0x1FFFFFFFE0 {
  		return 0, errGasUintOverflow
  	}
  	newMemSizeWords := toWordSize(newMemSize)
  	newMemSize = newMemSizeWords * 32
  
  	if newMemSize > uint64(mem.Len()) {
  		square := newMemSizeWords * newMemSizeWords
  		linCoef := newMemSizeWords * params.MemoryGas
  		quadCoef := square / params.QuadCoeffDiv
  		newTotalFee := linCoef + quadCoef
  
  		fee := newTotalFee - mem.lastGasCost
  		mem.lastGasCost = newTotalFee
  
  		return fee, nil
  	}
  	return 0, nil
  }
docs: // memoryGasCost calculates the quadratic gas for memory expansion. It does so
  // only for the memory region that is expanded, not the total memory.