/*
* Copyright (c) [2016] [ <ether.camp> ]
* This file is part of the ethereumJ library.
*
* The ethereumJ library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The ethereumJ library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the ethereumJ library. If not, see <http://www.gnu.org/licenses/>.
*/
package org.ethereum.vm.trace;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.ethereum.vm.DataWord;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.ethereum.util.ByteUtil.toHexString;
public class OpActions {
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class Action {
public enum Name {
pop,
push,
swap,
extend,
write,
put,
remove,
clear;
}
private Name name;
private Map<String, Object> params;
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
public Map<String, Object> getParams() {
return params;
}
public void setParams(Map<String, Object> params) {
this.params = params;
}
Action addParam(String name, Object value) {
if (value != null) {
if (params == null) {
params = new HashMap<>();
}
params.put(name, value.toString());
}
return this;
}
}
private List<Action> stack = new ArrayList<>();
private List<Action> memory = new ArrayList<>();
private List<Action> storage = new ArrayList<>();
public List<Action> getStack() {
return stack;
}
public void setStack(List<Action> stack) {
this.stack = stack;
}
public List<Action> getMemory() {
return memory;
}
public void setMemory(List<Action> memory) {
this.memory = memory;
}
public List<Action> getStorage() {
return storage;
}
public void setStorage(List<Action> storage) {
this.storage = storage;
}
private static Action addAction(List<Action> container, Action.Name name) {
Action action = new Action();
action.setName(name);
container.add(action);
return action;
}
public Action addStackPop() {
return addAction(stack, Action.Name.pop);
}
public Action addStackPush(DataWord value) {
return addAction(stack, Action.Name.push)
.addParam("value", value);
}
public Action addStackSwap(int from, int to) {
return addAction(stack, Action.Name.swap)
.addParam("from", from)
.addParam("to", to);
}
public Action addMemoryExtend(long delta) {
return addAction(memory, Action.Name.extend)
.addParam("delta", delta);
}
public Action addMemoryWrite(int address, byte[] data, int size) {
return addAction(memory, Action.Name.write)
.addParam("address", address)
.addParam("data", toHexString(data).substring(0, size));
}
public Action addStoragePut(DataWord key, DataWord value) {
return addAction(storage, Action.Name.put)
.addParam("key", key)
.addParam("value", value);
}
public Action addStorageRemove(DataWord key) {
return addAction(storage, Action.Name.remove)
.addParam("key", key);
}
public Action addStorageClear() {
return addAction(storage, Action.Name.clear);
}
}