package vm

import (
	. "github.com/tendermint/tendermint/common"
)

const (
	defaultDataStackCapacity = 10
)

type Account struct {
	Address     Word256
	Balance     uint64
	Code        []byte
	Nonce       uint64
	StorageRoot Word256
	Other       interface{} // For holding all other data.
}

func (acc *Account) String() string {
	return Fmt("VMAccount{%X B:%v C:%X N:%v S:%X}",
		acc.Address, acc.Balance, acc.Code, acc.Nonce, acc.StorageRoot)
}

type Log struct {
	Address Word256
	Topics  []Word256
	Data    []byte
	Height  uint64
}

type AppState interface {

	// Accounts
	GetAccount(addr Word256) *Account
	UpdateAccount(*Account)
	RemoveAccount(*Account)
	CreateAccount(*Account) *Account

	// Storage
	GetStorage(Word256, Word256) Word256
	SetStorage(Word256, Word256, Word256) // Setting to Zero is deleting.

	// Logs
	AddLog(*Log)
}

type Params struct {
	BlockHeight uint64
	BlockHash   Word256
	BlockTime   int64
	GasLimit    uint64
}