UNPKG

@tatumio/transaction-simulator

Version:

Transaction Simulation Extension

2 lines (1 loc) 4.19 kB
export declare const TRACER = "\n{\n simResult: null,\n lookupAccount: function(addr, db) {\n var acc = toHex(addr);\n if (this.simResult.stateDiff[acc] === undefined) {\n this.simResult.stateDiff[acc] = {\n balance: {\n \"*\": {\n from: \"0x0\",\n to: \"0x\" + db.getBalance(addr).toString(16)\n }\n },\n code: toHex(db.getCode(addr)),\n storage: {}\n };\n }\n },\n lookupStorage: function(addr, key, db) {\n var acc = toHex(addr);\n var idx = toHex(key);\n if (this.simResult.stateDiff[acc] === undefined) {\n this.lookupAccount(addr, db);\n }\n if (this.simResult.stateDiff[acc].storage[idx] === undefined) {\n this.simResult.stateDiff[acc].storage[idx] = {\n \"*\": {\n from: toHex(db.getState(addr, key)),\n to: \"something\"\n },\n _info: {\n originalAddr: addr,\n originalKey: key\n }\n };\n }\n },\n result: function(ctx, db) {\n if (this.simResult === null) {\n this.simResult = {\n trace: [{}],\n stateDiff: {}\n };\n }\n this.lookupAccount(ctx.to, db);\n this.lookupAccount(ctx.from, db);\n var fromBal = bigInt(this.simResult.stateDiff[toHex(ctx.from)].balance[\"*\"].to.slice(2), 16);\n var toBal = bigInt(this.simResult.stateDiff[toHex(ctx.to)].balance[\"*\"].to.slice(2), 16);\n this.simResult.stateDiff[toHex(ctx.to)].balance[\"*\"].from = \"0x\" + toBal.subtract(ctx.value).toString(16);\n this.simResult.stateDiff[toHex(ctx.from)].balance[\"*\"].from = \"0x\" + fromBal.add(ctx.value).add(ctx.gasUsed * ctx.gasPrice).toString(16);\n\n for (var acc in this.simResult.stateDiff) {\n for (var idx in this.simResult.stateDiff[acc].storage) {\n var originalAddr = this.simResult.stateDiff[acc].storage[idx]._info.originalAddr;\n var originalKey = this.simResult.stateDiff[acc].storage[idx]._info.originalKey;\n this.simResult.stateDiff[acc].storage[idx][\"*\"].to = toHex(db.getState(originalAddr, originalKey));\n }\n }\n if (ctx.type == \"CREATE\") {\n delete this.simResult.stateDiff[toHex(ctx.to)];\n }\n return this.simResult;\n },\n step: function(log, db) {\n if (this.simResult === null) {\n this.simResult = {\n trace: [{}],\n stateDiff: {}\n };\n this.lookupAccount(log.contract.getAddress(), db);\n }\n switch (log.op.toString()) {\n case \"EXTCODECOPY\":\n case \"EXTCODESIZE\":\n case \"EXTCODEHASH\":\n case \"BALANCE\":\n this.lookupAccount(toAddress(log.stack.peek(0).toString(16)), db);\n break;\n case \"CREATE\":\n var from = log.contract.getAddress();\n this.lookupAccount(toContract(from, db.getNonce(from)), db);\n break;\n case \"CREATE2\":\n var from = log.contract.getAddress();\n var offset = log.stack.peek(1).valueOf();\n var size = log.stack.peek(2).valueOf();\n var end = offset + size;\n this.lookupAccount(toContract2(from, log.stack.peek(3).toString(16), log.memory.slice(offset, end)), db);\n break;\n case \"CALL\":\n case \"CALLCODE\":\n case \"DELEGATECALL\":\n case \"STATICCALL\":\n this.lookupAccount(toAddress(log.stack.peek(1).toString(16)), db);\n break;\n case \"SSTORE\":\n case \"SLOAD\":\n this.lookupStorage(log.contract.getAddress(), toWord(log.stack.peek(0).toString(16)), db);\n break;\n }\n },\n fault: function(log, db) {}\n}\n";