code: func NewContract(caller ContractRef, object ContractRef, value *big.Int, gas uint64) *Contract {
  	c := &Contract{CallerAddress: caller.Address(), caller: caller, self: object}
  
  	if parent, ok := caller.(*Contract); ok {
  		// Reuse JUMPDEST analysis from parent context if available.
  		c.jumpdests = parent.jumpdests
  	} else {
  		c.jumpdests = make(map[common.Hash]bitvec)
  	}
  
  	// Gas should be a pointer so it can safely be reduced through the run
  	// This pointer will be off the state transition
  	c.Gas = gas
  	// ensures a value is set
  	c.value = value
  
  	return c
  }
docs: // NewContract returns a new contract environment for the execution of EVM.