diff --git a/vm/types.go b/vm/types.go index 93dea8fb1..dbe55137f 100644 --- a/vm/types.go +++ b/vm/types.go @@ -24,10 +24,10 @@ type Log struct { type AppState interface { // Accounts - GetAccount(Word) (*Account, error) + GetAccount(addr Word) (*Account, error) UpdateAccount(*Account) error DeleteAccount(*Account) error - CreateAccount(Word, uint64) (*Account, error) + CreateAccount(addr Word, balance uint64) (*Account, error) // Storage GetStorage(Word, Word) (Word, error) diff --git a/vm/vm.go b/vm/vm.go index 332448036..45b3d211e 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -109,7 +109,7 @@ func (vm *VM) Call(caller, callee *Account, code, input []byte, value uint64, ga case DIV: // 0x04 x, y := stack.Pop64(), stack.Pop64() if y == 0 { // TODO - stack.Push64(0) + stack.Push(Zero) fmt.Printf(" %v / %v = %v (TODO)\n", x, y, 0) } else { stack.Push64(x / y) @@ -119,7 +119,7 @@ func (vm *VM) Call(caller, callee *Account, code, input []byte, value uint64, ga case SDIV: // 0x05 x, y := int64(stack.Pop64()), int64(stack.Pop64()) if y == 0 { // TODO - stack.Push64(0) + stack.Push(Zero) fmt.Printf(" %v / %v = %v (TODO)\n", x, y, 0) } else { stack.Push64(uint64(x / y)) @@ -129,7 +129,7 @@ func (vm *VM) Call(caller, callee *Account, code, input []byte, value uint64, ga case MOD: // 0x06 x, y := stack.Pop64(), stack.Pop64() if y == 0 { // TODO - stack.Push64(0) + stack.Push(Zero) fmt.Printf(" %v %% %v = %v (TODO)\n", x, y, 0) } else { stack.Push64(x % y) @@ -139,7 +139,7 @@ func (vm *VM) Call(caller, callee *Account, code, input []byte, value uint64, ga case SMOD: // 0x07 x, y := int64(stack.Pop64()), int64(stack.Pop64()) if y == 0 { // TODO - stack.Push64(0) + stack.Push(Zero) fmt.Printf(" %v %% %v = %v (TODO)\n", x, y, 0) } else { stack.Push64(uint64(x % y)) @@ -149,7 +149,7 @@ func (vm *VM) Call(caller, callee *Account, code, input []byte, value uint64, ga case ADDMOD: // 0x08 x, y, z := stack.Pop64(), stack.Pop64(), stack.Pop64() if z == 0 { // TODO - stack.Push64(0) + stack.Push(Zero) fmt.Printf(" (%v + %v) %% %v = %v (TODO)\n", x, y, z, 0) } else { stack.Push64(x % y) @@ -159,7 +159,7 @@ func (vm *VM) Call(caller, callee *Account, code, input []byte, value uint64, ga case MULMOD: // 0x09 x, y, z := stack.Pop64(), stack.Pop64(), stack.Pop64() if z == 0 { // TODO - stack.Push64(0) + stack.Push(Zero) fmt.Printf(" (%v + %v) %% %v = %v (TODO)\n", x, y, z, 0) } else { stack.Push64(x % y) @@ -182,7 +182,7 @@ func (vm *VM) Call(caller, callee *Account, code, input []byte, value uint64, ga if x < y { stack.Push64(1) } else { - stack.Push64(0) + stack.Push(Zero) } fmt.Printf(" %v < %v = %v\n", x, y, x < y) @@ -191,7 +191,7 @@ func (vm *VM) Call(caller, callee *Account, code, input []byte, value uint64, ga if x > y { stack.Push64(1) } else { - stack.Push64(0) + stack.Push(Zero) } fmt.Printf(" %v > %v = %v\n", x, y, x > y) @@ -200,7 +200,7 @@ func (vm *VM) Call(caller, callee *Account, code, input []byte, value uint64, ga if x < y { stack.Push64(1) } else { - stack.Push64(0) + stack.Push(Zero) } fmt.Printf(" %v < %v = %v\n", x, y, x < y) @@ -209,7 +209,7 @@ func (vm *VM) Call(caller, callee *Account, code, input []byte, value uint64, ga if x > y { stack.Push64(1) } else { - stack.Push64(0) + stack.Push(Zero) } fmt.Printf(" %v > %v = %v\n", x, y, x > y) @@ -218,7 +218,7 @@ func (vm *VM) Call(caller, callee *Account, code, input []byte, value uint64, ga if x > y { stack.Push64(1) } else { - stack.Push64(0) + stack.Push(Zero) } fmt.Printf(" %v == %v = %v\n", x, y, x == y) @@ -227,7 +227,7 @@ func (vm *VM) Call(caller, callee *Account, code, input []byte, value uint64, ga if x == 0 { stack.Push64(1) } else { - stack.Push64(0) + stack.Push(Zero) } fmt.Printf(" %v == 0 = %v\n", x, x == 0) @@ -554,7 +554,7 @@ func (vm *VM) Call(caller, callee *Account, code, input []byte, value uint64, ga newAccount, err := vm.appState.CreateAccount(addr, value) if err != nil { - stack.Push64(0) + stack.Push(Zero) fmt.Printf(" (*) 0x0 %v\n", err) } else { // Run the input to get the contract code. @@ -562,7 +562,7 @@ func (vm *VM) Call(caller, callee *Account, code, input []byte, value uint64, ga ret, err_ := vm.Call(callee, newAccount, input, input, value, gas) if err_ != nil { caller.Balance += value // Return the balance - stack.Push64(0) + stack.Push(Zero) } else { newAccount.Code = ret // Set the code stack.Push(newAccount.Address) @@ -660,27 +660,13 @@ func (vm *VM) Call(caller, callee *Account, code, input []byte, value uint64, ga } pc++ - } -} - -/* -func (vm *VM) CallPrecompiled(p *PrecompiledAccount, callData []byte, context *Context) (ret []byte, err error) { - gas := p.Gas(len(callData)) - if context.UseGas(gas) { - ret = p.Call(callData) - fmt.Printf("NATIVE_FUNC => %X", ret) - vm.Endl() - - return context.Return(ret), nil - } else { - fmt.Printf("NATIVE_FUNC => failed").Endl() - - tmp := new(big.Int).Set(context.Gas) - panic(OOG(gas, tmp).Error()) + // If there is an error, return + if err != nil { + return nil, err + } } } -*/ func subslice(data []byte, offset, length uint64) ([]byte, bool) { size := uint64(len(data))