Fixed CREATE op. Fixes #87
This commit is contained in:
parent
81bc721c5c
commit
5b8dde9602
|
@ -35,7 +35,6 @@ func CalculateTxGas(initSize *big.Int) *big.Int {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Vm struct {
|
type Vm struct {
|
||||||
txPool *TxPool
|
|
||||||
// Stack for processing contracts
|
// Stack for processing contracts
|
||||||
stack *Stack
|
stack *Stack
|
||||||
// non-persistent key/value memory storage
|
// non-persistent key/value memory storage
|
||||||
|
@ -628,11 +627,11 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
||||||
)
|
)
|
||||||
|
|
||||||
// Generate a new address
|
// Generate a new address
|
||||||
addr := ethcrypto.CreateAddress(closure.caller.Address(), closure.caller.N())
|
addr := ethcrypto.CreateAddress(closure.object.Address(), closure.object.Nonce)
|
||||||
for i := int64(0); vm.state.GetStateObject(addr) != nil; i++ {
|
for i := uint64(0); vm.state.GetStateObject(addr) != nil; i++ {
|
||||||
t := new(big.Int).Set(closure.caller.N())
|
ethcrypto.CreateAddress(closure.object.Address(), closure.object.Nonce+i)
|
||||||
addr = ethcrypto.CreateAddress(closure.caller.Address(), t.Add(t, big.NewInt(i)))
|
|
||||||
}
|
}
|
||||||
|
closure.object.Nonce++
|
||||||
|
|
||||||
vm.Printf(" (*) %x", addr).Endl()
|
vm.Printf(" (*) %x", addr).Endl()
|
||||||
|
|
||||||
|
@ -643,7 +642,7 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
||||||
contract.AddAmount(value)
|
contract.AddAmount(value)
|
||||||
|
|
||||||
// Set the init script
|
// 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
|
// Transfer all remaining gas to the new
|
||||||
// contract so it may run the init script
|
// contract so it may run the init script
|
||||||
gas := new(big.Int).Set(closure.Gas)
|
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)
|
c := NewClosure(closure, contract, contract.initScript, vm.state, gas, closure.Price)
|
||||||
// Call the closure and set the return value as
|
// Call the closure and set the return value as
|
||||||
// main script.
|
// main script.
|
||||||
c.Script, err, _ = Call(vm, c, nil)
|
contract.script, err, _ = Call(vm, c, nil)
|
||||||
} else {
|
} else {
|
||||||
err = fmt.Errorf("Insufficient funds to transfer value. Req %v, has %v", value, closure.object.Amount)
|
err = fmt.Errorf("Insufficient funds to transfer value. Req %v, has %v", value, closure.object.Amount)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue