aboutsummaryrefslogtreecommitdiffstats
path: root/ethchain
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-07-03 16:04:38 +0800
committerobscuren <geffobscura@gmail.com>2014-07-03 16:04:38 +0800
commit5b8dde96026b123147733bb5cdf88b7774725015 (patch)
treee4dee8139e908646a522abb317c8d27ec3c42808 /ethchain
parent81bc721c5cd0330547e18bfb710d68d60da4dd46 (diff)
downloaddexon-5b8dde96026b123147733bb5cdf88b7774725015.tar.gz
dexon-5b8dde96026b123147733bb5cdf88b7774725015.tar.zst
dexon-5b8dde96026b123147733bb5cdf88b7774725015.zip
Fixed CREATE op. Fixes #87
Diffstat (limited to 'ethchain')
-rw-r--r--ethchain/vm.go13
1 files changed, 6 insertions, 7 deletions
diff --git a/ethchain/vm.go b/ethchain/vm.go
index fa839b260..35443a6ba 100644
--- a/ethchain/vm.go
+++ b/ethchain/vm.go
@@ -35,7 +35,6 @@ func CalculateTxGas(initSize *big.Int) *big.Int {
}
type Vm struct {
- txPool *TxPool
// Stack for processing contracts
stack *Stack
// non-persistent key/value memory storage
@@ -628,11 +627,11 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
)
// Generate a new address
- addr := ethcrypto.CreateAddress(closure.caller.Address(), closure.caller.N())
- for i := int64(0); vm.state.GetStateObject(addr) != nil; i++ {
- t := new(big.Int).Set(closure.caller.N())
- addr = ethcrypto.CreateAddress(closure.caller.Address(), t.Add(t, big.NewInt(i)))
+ addr := ethcrypto.CreateAddress(closure.object.Address(), closure.object.Nonce)
+ for i := uint64(0); vm.state.GetStateObject(addr) != nil; i++ {
+ ethcrypto.CreateAddress(closure.object.Address(), closure.object.Nonce+i)
}
+ closure.object.Nonce++
vm.Printf(" (*) %x", addr).Endl()
@@ -643,7 +642,7 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
contract.AddAmount(value)
// Set the init script
- contract.initScript = ethutil.BigD(mem.Get(offset.Int64(), size.Int64())).Bytes()
+ contract.initScript = mem.Get(offset.Int64(), size.Int64())
// Transfer all remaining gas to the new
// contract so it may run the init script
gas := new(big.Int).Set(closure.Gas)
@@ -653,7 +652,7 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
c := NewClosure(closure, contract, contract.initScript, vm.state, gas, closure.Price)
// Call the closure and set the return value as
// main script.
- c.Script, err, _ = Call(vm, c, nil)
+ contract.script, err, _ = Call(vm, c, nil)
} else {
err = fmt.Errorf("Insufficient funds to transfer value. Req %v, has %v", value, closure.object.Amount)
}