package vm import ( "errors" "math/big" "github.com/ethereum/eth-go/ethstate" "github.com/ethereum/eth-go/ethutil" ) type Environment interface { State() *ethstate.State Origin() []byte BlockNumber() *big.Int PrevHash() []byte Coinbase() []byte Time() int64 Difficulty() *big.Int BlockHash() []byte GasLimit() *big.Int Transfer(from, to Account, amount *big.Int) error } type Object interface { GetStorage(key *big.Int) *ethutil.Value SetStorage(key *big.Int, value *ethutil.Value) } type Account interface { SubBalance(amount *big.Int) AddBalance(amount *big.Int) Balance() *big.Int } // generic transfer method func Transfer(from, to Account, amount *big.Int) error { if from.Balance().Cmp(amount) < 0 { return errors.New("Insufficient balance in account") } from.SubBalance(amount) to.AddBalance(amount) return nil }