diff --git a/ethchain/vm.go b/ethchain/vm.go
index fc3c37dc163991940602b71c37ebd3503b7821b2..b9e8353fbe84f5a3ac638107e2a87db5e4ef4c44 100644
--- a/ethchain/vm.go
+++ b/ethchain/vm.go
@@ -433,9 +433,28 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
 
 			vm.Printf(" => %d", l)
 		case CALLDATACOPY:
-			panic("not implemented")
+			var (
+				size = int64(len(closure.Args))
+				mOff = stack.Pop().Int64()
+				cOff = stack.Pop().Int64()
+				l    = stack.Pop().Int64()
+			)
+
+			if cOff > size {
+				cOff = 0
+				l = 0
+			} else if cOff+l > size {
+				l = 0
+			}
+
+			code := closure.Args[cOff : cOff+l]
+
+			mem.Set(mOff, l, code)
 		case CODESIZE:
-			stack.Push(big.NewInt(int64(len(closure.Script))))
+			l := big.NewInt(int64(len(closure.Script)))
+			stack.Push(l)
+
+			vm.Printf(" => %d", l)
 		case CODECOPY:
 			var (
 				size = int64(len(closure.Script))