diff --git a/eth/tracers/internal/tracers/4byte_tracer.js b/eth/tracers/internal/tracers/4byte_tracer.js new file mode 100644 index 0000000000..f0d8462642 --- /dev/null +++ b/eth/tracers/internal/tracers/4byte_tracer.js @@ -0,0 +1,70 @@ +/** + + 4bytes searches for 4byte-identifiers, and collects them for post-processing. + It collects the methods identifiers along with the size of the supplied data, so that + a reversed signature can be matched against the size of the data. + +Example: + + > debug.traceTransaction( "0x214e597e35da083692f5386141e69f47e973b2c56e7a8073b1ea08fd7571e9de", {tracer: "4bytes"}) + { + 0x27dc297e-128: 1, + 0x38cc4831-0: 2, + 0x524f3889-96: 1, + 0xadf59f99-288: 1, + 0xc281d19e-0: 1 + } + +@author MH Swende + **/ +{ + ids : {}, + + // callType returns 'false' for non-calls, or the + // peek-index for the first param after 'value', i.e. meminstart + callType : function(opstr){ + switch(opstr){ + case "CALL": + case "CALLCODE": + //g,a,v, memin, meminsz, memout, memoutsz + return 3 //stack ptr to memin + case "DELEGATECALL": + case "STATICCALL": + //g,a,memin, meminsz, memout, memoutsz + return 2;//stack ptr to memin + } + return false; + }, + + // store save the given indentifier and datasize + store: function(id, size){ + var key = ""+id+"-"+size; + this.ids[key] = this.ids[key]+1 || 1; + }, + + // step is invoked for every opcode that the VM executes. + step: function(log, db) { + var ct = this.callType(log.op.toString()); + if (!ct) return; + // Skip any pre-compile invocations, those are just fancy opcodes + if (isPrecompiled(toAddress(log.stack.peek(1).Bytes()))) { + return + } + // Gather internal call details + var inSz = log.stack.peek(ct + 1).Int64(); + if (inSz >= 4) { + var inOff = log.stack.peek(ct).Int64(); + this.store(toHex(log.memory.slice(inOff, inOff + 4)), inSz-4); + } + }, + + // result is invoked when all the opcodes have been iterated over and returns + // the final result of the tracing. + result: function(ctx) { + //Save the outer calldata also + if(ctx.input.length > 4){ + this.store(toHex(ctx.input.slice(0,4)),ctx.input.length-4 ) + } + return this.ids; + }, +} diff --git a/eth/tracers/internal/tracers/assets.go b/eth/tracers/internal/tracers/assets.go index b15bb0e5c5..e438692a72 100644 --- a/eth/tracers/internal/tracers/assets.go +++ b/eth/tracers/internal/tracers/assets.go @@ -1,6 +1,9 @@ // Code generated by go-bindata. // sources: +// 4byte_tracer.js // call_tracer.js +// emvdis_tracer.js +// genesis_tracer.js // noop_tracer.js // opcount_tracer.js // DO NOT EDIT! @@ -70,6 +73,26 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } +var __4byte_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x55\xdd\x6e\xdb\x38\x13\xbd\x96\x9e\x62\x3e\xdf\xc4\x4a\x64\xc9\xf2\x4f\xfc\x13\xa4\xf8\xb2\x6d\xd0\x16\x68\xd1\x05\x12\xec\xcd\x62\x2f\x68\x72\x64\x71\x2d\x93\x02\x39\x72\xec\xa4\x7e\xf7\x05\x29\xb9\xb6\x93\x60\x81\xd5\x85\x2d\x91\x33\x87\x47\x67\xe6\x8c\xd2\xcb\xcb\x30\x84\xd1\x62\x47\x68\xc1\x22\x33\xbc\x40\x0b\xb9\x36\xcd\x5a\x4f\x0a\x54\x24\x73\x89\xc6\xc6\xc0\x94\x00\xae\xcb\x12\x39\x59\xa0\x02\xd7\x3e\xb0\xd2\x96\x7a\x95\xd1\x1c\xad\x95\x6a\x99\x84\xf0\x95\xce\xc2\x60\x8d\x54\x68\x61\xe1\x04\x0c\x58\xa9\xd5\x12\x9e\x24\x15\x3e\xc4\xca\x67\x04\x9d\x37\xf7\x75\x55\x95\x12\x05\x08\x46\x2c\x06\xab\x81\x0a\x46\x21\x30\x30\xb8\x41\x63\x51\x80\x95\x4b\xc5\xa8\x36\x08\x9c\x29\x58\x20\xac\x19\xf1\x02\x05\xb0\x25\x93\xca\xd2\x1b\x4c\x07\x95\x84\xe1\xfd\x96\xad\xab\x12\xe7\x61\x08\x00\xf0\x01\x04\x2e\xea\x65\x42\x86\x71\x7c\x34\x4c\x59\xc6\x49\x6a\xd5\x85\x4e\x7f\x3b\xc8\x46\x38\x9e\x4d\x70\x38\x16\xac\x3f\x1d\x5e\xcf\x06\xf9\x78\x38\xbd\xce\x46\x19\x5e\xcf\xf2\xd1\x04\x67\x93\xe1\x62\xc0\xc7\xd7\x38\x61\xd3\xfe\x64\xb8\xc8\x90\xf5\xa7\xb9\x98\x8c\x27\x19\xce\x04\x76\x62\x78\xf1\xc0\x66\x0e\x9d\x46\xe0\xce\x3e\xf2\xe7\xbe\xf8\x5f\x80\xfe\x76\x30\x11\x7c\x30\x9b\x60\x2f\x1b\x4c\xe7\x90\xc5\xbf\x36\x86\x53\xce\x47\xd3\x61\xd6\xeb\xcf\x61\x70\x5c\x1e\x0f\x46\xf9\x70\x3a\x9d\xf5\x66\xd7\x67\xe1\x4c\xe4\xe3\x59\x3e\x9b\xf5\x06\xd3\x73\x1c\x3e\x98\x66\x22\x9b\xa1\xc3\xc9\xfc\xea\x3e\x0c\xff\xcf\x6a\x2a\xb4\x81\xef\x5f\xe0\xe1\x09\x95\xc0\x10\x2e\x2f\xd3\xf0\x25\x0c\xa4\xb0\x30\x87\x97\x7d\x1c\x86\x41\x9a\x02\x67\x65\xf9\xb8\xab\x10\x0c\x52\x6d\x94\x85\x8b\x9c\x95\x16\x2f\x7c\xdd\x95\x56\x3d\x17\x60\x63\xd0\xc6\x89\xec\x53\x2a\xc4\x55\x4f\x2a\x81\x5b\x1f\xe4\xb4\xcf\xa5\xb1\x04\x15\x33\x6c\x0d\x2c\x27\x34\x70\xb1\x61\x65\x8d\x17\x31\xc8\x04\x13\x58\xe3\xda\xd5\x8c\x19\xf2\x04\x7f\x1d\x3a\x87\xbc\x56\x4d\x41\x74\x65\xc9\x44\x07\xdd\x00\xec\x93\x24\x5e\xbc\x59\x6e\xd2\x2d\x42\xe7\xe3\xdd\xb7\x6f\x9d\x79\x18\x04\xc1\xf1\xf9\xe3\x8f\x4f\xf7\x9d\xf9\x59\x70\x90\xa6\xcb\x98\xc5\x9b\xb8\x21\xd1\xfe\xd9\x67\x7f\xa3\x6b\x3a\xfc\xdb\xe7\xf3\xb4\x46\x0f\x18\x42\x9a\x5a\x62\x7c\x05\x15\x19\x20\xdd\xa4\xbf\x43\xe7\xd3\xfd\xb7\xfb\xcf\x77\x8f\xf7\x2d\xad\xb7\x01\x0f\x8f\x77\x8f\x5f\x3f\xbe\xb3\xed\xae\x86\xe4\x7f\x62\xe8\xae\x96\xe4\xe0\xe6\x5f\x49\xee\xc3\x57\xf1\xbe\xc4\x37\x4d\xaf\xb4\x7d\x60\x49\x1b\x04\xcb\x36\xe8\x0b\xba\x94\x1b\x54\xe0\x8a\xdc\xda\xd9\x4f\x06\x67\x31\x67\xb9\x30\xf0\xe1\x27\xd5\x93\x22\xf6\x66\x8c\x5e\xc2\x20\xd8\x30\x03\x2b\xdc\xc1\x2d\x74\x3a\x57\x52\x5c\x75\x7a\x9d\x2b\xb7\x79\x13\x06\x01\x15\xd2\x26\x52\xd8\x3f\x57\xb8\xfb\x0b\x6e\xe1\xec\xf9\x2a\x83\x9f\x3f\x21\xbb\x09\x83\x23\x2d\xac\x40\x5a\x90\x6a\xa3\x57\x28\x7c\xc3\xb9\x09\xb1\x03\x5d\x71\x2d\xd0\xcf\x0d\xcf\xf8\x8f\xef\x80\x5b\xe4\x35\xa1\x4d\x1c\x3f\xac\x4e\xe8\x95\x7a\x19\x83\x58\x44\x70\x6c\x24\x47\x92\xd3\x81\xc1\xa1\x23\x5d\x64\xa2\xab\x84\xf4\x03\x19\xa9\x96\xdd\x28\xba\xf9\x95\x22\x73\xe8\xfe\x8f\x53\xd4\xca\x78\xdc\x48\x53\x78\x58\xc9\x0a\x98\xda\x41\x65\xb0\xc7\xf5\xba\x92\x25\x7a\xd6\x9c\x39\x06\x36\x06\x2a\xb4\x45\x60\x06\xe1\xef\xda\x12\xe4\x4c\xf1\xc3\x5b\xd8\xb3\x23\xa4\xfd\xdd\x60\x0b\x21\xba\xa4\xef\x84\x30\x68\xad\xa7\xe6\xab\x9c\x38\x07\x76\xb3\x28\xf9\xcd\x8d\x9c\x6e\x14\x45\xa7\x2f\x76\xac\xf3\x3b\x0d\x90\xa6\xf0\x99\x51\x81\x06\xa4\x22\x34\x8a\x95\xde\x8c\x20\x90\x98\x2c\xed\x99\x3a\x52\x3d\x3c\xc3\x2d\xbc\x3a\x96\x13\x5c\x41\x16\x25\x5f\x15\x5d\x8f\xba\xaf\xd4\xf1\x29\x1f\x6e\x61\xf4\x9a\x50\x83\xf7\x23\xcf\xdf\x03\x7c\x07\xcc\x5d\xbe\x30\xbe\xd1\xba\xa4\xbf\xe0\xd6\x0b\xe0\xac\x60\x76\x89\x2d\x25\xc7\xae\x47\x8c\x5b\xe0\x2b\x18\x45\x51\xec\x59\xf7\x46\x27\x50\xfb\x63\x37\x19\xb4\x75\x49\xa7\xfd\xf4\x54\xa0\x02\x27\x80\x6b\xa1\xb6\x18\x50\x38\x17\x2c\xd0\x19\x80\xd0\x30\x42\x01\x7a\xd3\x5a\xa0\x1d\x93\x1e\xae\x99\x7c\x4e\xc3\x16\xb8\xfd\x12\xb9\x6f\x82\xff\x4c\x06\xcd\xfa\x49\x23\x72\xda\x3a\x69\x82\x20\x4d\x1f\x0e\x5e\xd3\xb5\x1b\x98\xae\x0c\xce\x5f\xc0\x4a\xab\xc3\x20\x90\xb9\x0b\x4e\xa4\xaa\x6a\x4a\x4a\x54\x4b\x2a\xe0\x03\x8c\xbc\xc1\x82\x37\xd2\x1c\x43\x1b\x65\xfa\xb1\x13\xe3\x35\x40\x6f\x04\x51\x18\x04\xfb\x30\x38\x8c\xb7\x83\xfd\x1a\xcb\xed\xc3\x7f\x02\x00\x00\xff\xff\x1b\x64\x99\x95\x2d\x08\x00\x00") + +func _4byte_tracerJsBytes() ([]byte, error) { + return bindataRead( + __4byte_tracerJs, + "4byte_tracer.js", + ) +} + +func _4byte_tracerJs() (*asset, error) { + bytes, err := _4byte_tracerJsBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "4byte_tracer.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + var _call_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x57\xcd\x6e\xdc\x48\x0e\x3e\xb7\x9e\x82\x93\x43\xdc\x8d\x74\xd4\x76\x92\xcd\xa1\x0d\xcd\xc2\xbb\x31\x76\x03\x78\xe3\x41\xc6\x33\x73\x08\x7c\xa8\x96\x28\x75\x8d\xa5\x2a\x6d\x15\xd5\x3f\x18\xf8\xdd\x17\x64\x95\x64\xb5\xec\x09\x16\xe3\x93\x9a\x45\xb2\xf8\xf3\xf1\x63\x79\xb5\x82\x5c\xd5\xf5\x9d\x53\x39\x3a\xd0\x1e\x14\x94\x5d\x5d\xc3\xa6\xb6\x7b\x03\xe4\x94\xf1\x2a\x27\x6d\xe5\x9b\x55\x68\xab\x08\xf0\xc0\xbf\xc8\x83\x32\x05\x38\x6c\xad\xe3\xef\xba\x4e\x56\x2b\xa0\x2d\x82\x36\x84\xce\xa8\x5a\x7c\x7b\x68\x54\x81\xb0\x39\x82\x1a\x3b\x5c\x82\xaa\xad\xa9\x60\xaf\x69\x0b\xca\x1c\xa1\xf3\x58\x76\x35\x68\x53\x5a\xd7\x28\x56\x49\x93\x3f\x92\xd9\x6a\x05\xda\xec\x6c\x2e\x12\x1f\x42\x34\xe8\x09\x0b\x28\x14\x29\xf0\xe4\xba\x9c\x3a\x87\x90\x5b\x43\x4a\x1b\x6d\x2a\x8e\x65\x12\x88\x35\x12\xb2\xf8\x0b\x51\xe1\x01\xf3\x8e\xdd\x4c\x23\x4b\x93\xd9\xe8\xc6\x35\x7c\xbb\x5f\x26\x4f\x76\xa4\xf2\x07\x8e\x82\xdd\xe7\x9d\x73\x68\x08\x1c\xe6\x9d\xf3\x7a\x87\xa2\x02\x41\xc7\x96\xa2\x73\xfd\xeb\x7f\xe2\x55\xc1\xf5\xe0\x64\xe4\xb8\x40\x9f\xa3\x29\xb0\x90\x2a\x3f\x78\xd8\x6f\x91\xb6\xe8\x60\x8f\x67\x3b\x84\xdf\x3b\x4f\x23\x9d\xd2\xd9\x06\x94\x01\xdb\x11\x37\x64\xd4\x23\x6d\xc8\x8a\x43\xc5\xdf\x06\x9d\xc4\x93\x26\xb3\xc1\x78\x0d\xa5\xaa\x3d\xc6\x7b\x3d\x61\xcb\xb9\x70\xba\x0f\xec\xd9\x3a\xc0\x1d\xba\x23\xd8\x36\xb7\x05\x86\x6e\x73\x16\x43\x12\xe8\xd3\x64\xc6\x76\x6b\x28\x3b\x23\xd7\xce\x6b\x5b\x2d\xa1\xd8\x2c\xe0\x8f\x64\xc6\x6e\x7f\x43\xb0\xa6\x3e\x42\xae\x1c\x82\xda\xd8\x8e\xc0\x1f\x3d\x61\x13\xdd\xfa\x25\x94\xca\x73\xf0\xba\x84\x3d\x42\xeb\xf0\x6d\xbe\x45\xae\x99\xc9\x31\x99\xcd\x76\xca\xb1\x85\x14\x33\x03\xf6\x9f\xda\x36\x25\xfb\xa5\x6b\x36\xe8\xe6\x0b\x78\x0d\xe7\x87\xf2\x7c\x01\x59\x26\x1f\x97\xc9\x6c\xa6\x4b\x98\x47\x9b\x10\x88\x78\xb1\x2d\x64\x30\xd8\xff\x4c\x4e\x9b\x6a\xbe\x60\xfd\xc7\x10\xeb\xe7\x52\xf0\xb4\x87\x06\x69\x6b\x8b\x11\xd6\xb8\x30\x1b\x64\x34\x15\xd6\xe0\x12\x54\x51\x00\xd9\xd0\xf7\xa1\xcb\xa7\x17\xc3\xeb\xd7\x7c\xe3\x0f\x19\xbc\xfa\x7a\x7d\xf7\xcb\xd7\x2f\xaf\x4e\x24\xbf\x5e\x7f\xbd\x7b\x15\x83\x5b\xad\xe0\xe7\x07\xdd\x0a\xf2\x25\x7f\xdb\xb4\xba\xc6\x31\xd6\x97\x40\x5b\xeb\x11\xb8\x8a\x02\x81\x52\x99\xbc\x6f\x8d\xef\x33\x24\x0b\x19\x90\xbd\x2a\x0a\x87\xde\x4b\xad\x24\xb2\xb4\x45\x7c\x98\x5f\x2c\xd2\x7f\x1c\x09\xfd\x7c\x21\x49\x4b\xb0\xda\xff\xe4\x30\xde\x57\xcc\xc9\x2e\x62\x48\x33\x87\xd4\x39\xc3\x9f\x8f\x31\xc4\x5b\x46\xe1\x5e\x7b\x84\x4a\x09\x20\xbd\x6d\x26\xe3\x0d\x05\x92\xd2\xf5\x10\x8f\x2d\x4b\xee\x19\x17\x3e\x83\xb3\x4f\xd7\x37\xd7\xff\xba\xba\xbb\xfe\xe7\xd5\xcd\xcd\x19\xfc\x1d\xce\x61\x0d\x17\x8b\xcb\xa4\xd7\xd6\xe6\x56\xf4\x27\x61\xbf\x83\x37\xec\x68\x91\x7e\x36\xf4\xf1\x43\x68\x58\xd4\xbf\x36\x05\x64\xd1\xee\xcd\xd4\xee\xfd\x33\xbb\x98\xc8\x95\xf7\xd8\x6c\x6a\x7c\x4e\x4f\x91\xbf\x84\xca\x3c\x59\x87\x32\x05\x5c\x9e\x1a\xb9\x0d\xfd\xcd\x11\x8c\xa1\x52\x74\x6c\x71\x0d\x00\x60\xdb\xa5\x08\x78\x26\x45\xc0\x01\xa9\x3c\xb7\x9d\xa1\x70\x42\x56\xe4\x00\x64\x83\x40\x9b\xb6\xa3\xb5\x08\xfe\x8d\x07\x69\x58\x83\x8d\x75\xc7\xd4\xd7\x3a\xc7\xb9\xa4\xb6\x0c\x99\x2e\x16\xc1\xa6\x52\xfe\x93\x2e\xcb\xb5\xb8\xaf\x94\x87\xb7\xf2\x95\x5b\x1f\x6f\xb1\x1d\xdd\xf2\xf9\xb4\x20\x1f\x26\x05\x19\xb4\x6f\xd0\x3c\xd7\xfe\xdb\x44\x5b\xa0\x30\xe0\x26\xe0\xf8\xb4\xa5\x3d\x74\x84\x67\x76\xaa\xee\x10\x32\x38\x3b\x3f\x9c\x3d\xef\xcd\xbb\x45\x7a\x87\x07\x9a\x5f\x7c\x0c\xed\x14\x8c\xd1\x56\xfb\x74\xa0\xc4\xb4\xed\xfc\x76\x2e\x23\x7c\x39\x9c\x3e\x11\x5f\x06\xe4\x3a\xe6\x87\x88\xd4\xd3\x31\x7e\x91\x2b\x99\x11\x4f\xd9\x70\x09\x0e\xc9\x69\xdc\x21\x68\x3a\xf3\xe2\x92\xf7\x85\xdd\x2b\x93\x63\x0a\xbf\x61\xf0\x68\x10\x65\xde\xe3\xae\x63\xaa\x12\xe2\xe5\x7d\xa5\xcd\x13\x0d\x28\x59\x05\x0e\xa1\x51\x47\xd8\x20\xb3\xe2\xc3\x11\xb8\x47\xc5\xd1\xa8\x46\xe7\x3e\xf8\x93\x3d\xe7\xb0\x52\x4e\xdc\x3a\xfc\x6f\x17\xb6\x18\x03\x4f\xe5\xd4\xa9\xba\x3e\x42\xa5\x77\x68\xc4\x7a\xfe\xee\xfd\xf9\x39\x78\xd2\x2d\x9a\x62\x09\x1f\xdf\xaf\x3e\x7e\x00\xd7\xd5\xb8\x48\x23\xe9\x9c\x56\x27\x76\x82\x0f\xb8\xf0\x05\xb6\xb4\x85\x1f\x61\x52\xe0\x1a\x4d\x45\xdb\xbe\x6b\xa7\x87\xdf\x5e\xd4\x85\xb7\x70\x71\x2f\x98\xcb\x7a\xf4\x85\xf6\x01\xd6\x1e\xff\xa2\x23\xce\xed\x12\x56\x2b\xb8\xbb\xfd\x74\x0b\xf3\x07\xe5\x54\xad\x36\xb8\x58\xc3\xb5\x6b\xd2\x34\x3d\xc5\xc7\x18\x01\xb2\xbe\x26\xfc\x6d\x00\x0f\xda\x13\x53\xb5\xb4\x44\x7b\x08\x00\xd1\xa6\x5a\x42\x6b\x5b\x21\xa5\xff\x83\xb8\x99\xb1\x02\x4d\xf7\xc0\x16\x5c\x3b\xde\x89\x14\xe1\x77\xf9\x1c\x7f\xa7\x35\xcf\xb2\xef\x16\x7d\xb5\x82\x9f\x46\x11\xd5\xca\x53\x04\x92\x29\xa0\xc2\xb0\x6e\x87\x07\x03\x38\xf4\x5d\x4d\x7e\xc2\x42\xd3\xb1\xb1\x6d\xcf\x75\x12\x70\xa5\xfc\x2f\x5e\xca\x15\x47\x71\xa3\xab\xf4\x0b\xee\x3f\x1b\x9a\xf7\x0a\x91\x42\xf8\xeb\x0d\xf4\x42\x26\x99\xc9\x98\x0e\xfa\xfc\xf7\x3d\x87\x13\xbb\x02\x6b\x24\x3c\xf1\x3c\x8a\xd0\x76\xd4\x76\x52\xd2\x97\x49\xb0\x57\x12\x2a\x1c\xfd\xe8\x63\x0d\x0c\xb6\x78\x7e\x55\x50\x7b\x49\x7c\x83\xe6\x69\x1d\xb4\x3c\x55\xfd\x3a\x1f\xed\xfc\x5a\x7b\x19\x75\xb2\x6d\x63\x3d\xf5\x65\xaf\xb1\xa4\xe7\x65\x0f\x7d\x0d\x4e\x05\x03\xa2\x95\xc1\xf9\xc9\x7c\x8d\x36\xfa\x94\xdf\x5e\xd8\xb8\x57\x6d\xab\xf8\x4d\x59\x1f\x41\x13\xec\xd5\xe8\xb9\x1b\xd8\x4b\x9b\xdf\x91\xe9\xc8\xc4\xe0\x5b\x87\x3b\x6d\x3b\x0f\xd6\x60\x1f\xc8\x64\x1c\x39\xae\xb7\x17\xf7\x41\x02\x59\x96\x41\x67\x0a\x2c\xb5\x19\x58\x63\x3a\xc0\x13\x0b\xf8\x76\xff\x67\x94\x7d\xaa\x3a\x49\xf0\x31\x99\x3d\xc6\xa7\x66\xc0\xf1\xf8\xb1\xb9\xdf\xa2\x19\x1e\xea\xf1\x51\x03\x5b\xb5\x43\xd8\x20\x1a\xd0\x84\x4e\x71\xda\x76\x87\x2e\xfe\xa3\xc1\xc5\xf2\xe2\x8e\x6d\x4a\xcd\x3b\x3c\x3a\x8e\xaf\x6d\xe6\x6a\x6d\xaa\x34\x99\x05\xf9\xe8\x95\x9a\xd3\x21\x64\xcb\x0d\x8d\x56\x71\x9f\x0f\xeb\x3c\xa7\x43\xca\x3f\x64\x4d\x0e\x3b\xfd\xe9\x75\xc5\xe7\x2c\x0e\x7b\x74\xb4\xda\xc7\x0a\x64\xc3\xb1\xac\x43\xd6\x88\x33\xc3\x67\x22\x1b\x06\x45\xd4\x2a\xe5\x83\x9b\x17\x46\x8b\x0e\xa7\x93\xd5\x1b\xf0\x74\xaf\xff\xdc\x80\x8f\x27\x46\x93\x57\x07\x2b\x8a\x28\x9c\x86\x71\x5c\x8f\x4f\x83\x28\x26\xaa\x9b\x51\x7d\x74\x23\xf5\x79\xbc\x1c\xef\xa1\x31\xca\x23\xdf\xff\x38\x0c\x42\xa8\xf6\x80\xa6\xa9\xc1\x98\x47\xf9\x06\x74\xce\x3a\xf8\xe1\x05\x9c\x46\x47\x41\x21\x83\x41\xb9\xf7\x10\x20\x12\xbb\x7b\x99\xcc\x1e\x93\xc7\xe4\x7f\x01\x00\x00\xff\xff\x91\x76\xe8\xd1\xe3\x0e\x00\x00") func call_tracerJsBytes() ([]byte, error) { @@ -90,6 +113,46 @@ func call_tracerJs() (*asset, error) { return a, nil } +var _emvdis_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x56\x4b\x6f\xdb\x38\x10\xbe\xfb\x57\x0c\x7c\xb2\x12\x57\x15\xf5\x8a\x2d\xaf\x17\x5b\xa4\xc6\x22\x45\x5f\x68\xdc\x93\xe1\x83\xe2\xd0\xb1\x10\x5b\x14\x28\x2a\x6d\x36\xf0\x7f\x5f\x0c\x67\xf4\x70\xec\x4d\xd0\xc5\xee\xa1\x9c\x58\x9c\xf9\xe6\xf1\x7d\x24\xfb\xf6\xec\xac\x37\xdf\x64\x25\x18\x9d\xae\xa4\x06\x2d\x4d\xa5\xf3\x12\xca\x6a\xbd\xce\x56\x32\x37\x90\xe5\x6b\xa5\x77\xa9\xc9\x54\x0e\x6b\xad\x76\x90\x92\x2f\x18\x05\xbd\x42\x6a\xdc\x05\xf9\xb0\xbb\xcd\xca\x37\xa5\x79\xdc\x4a\xb8\xcd\xca\xb4\x2c\xe5\xee\x66\xfb\xd8\xeb\xfd\x91\x56\x66\xa3\x34\x7c\xce\x56\xf7\xf0\x41\x6d\xf2\x52\xe5\x43\xf8\x94\x6a\x93\xe5\x70\xfd\x43\xe6\xb7\xb2\x77\x76\xf6\xb6\xd7\x7b\xea\x01\xf4\x4b\x93\xae\xee\xfb\x09\x2c\x9e\xfa\xaa\x28\xf1\x8f\xe5\x7e\x39\xc4\x9d\xbc\xa8\xca\x8d\xc4\x4f\x4f\x5e\x02\xde\x10\x44\x02\x62\x08\xbe\x5d\x03\xbb\x86\x76\x8d\xec\x1a\xdb\xf5\xc2\xae\x23\xbb\x8e\xed\x2a\x3c\x32\x14\x2d\xc8\x4d\x90\x9f\x20\x47\x41\x9e\x3e\x79\xfa\x9c\x87\x12\xf9\x94\xc9\xa7\x54\x3e\xe5\xf2\x09\x25\x20\x97\x90\x50\x42\x42\x89\x08\x25\x22\x94\x88\x5c\x22\x42\x89\xb8\xe0\xc8\xf6\x13\x11\x4a\x74\x41\xbf\x08\x25\x22\x94\x98\x5a\x8e\x29\x20\xe6\x16\x29\x20\xa6\xe2\x63\x0a\x88\x29\x60\x44\x01\x23\x4a\x3b\xf2\xe9\x57\x40\x86\x50\x46\x94\x76\x14\x93\xa1\xb4\x23\x42\x19\x11\xca\x98\x8a\x1f\x0b\xbb\x37\xa6\x7c\x63\xca\x37\xe6\xa9\xd6\x63\xe5\xb9\x7a\x3c\x58\xcf\x67\x1b\xb0\x0d\xd9\x46\x6c\x79\xf2\x1e\x8f\xde\xe3\xd9\x7b\x8c\xd7\xf0\xc4\x78\x82\xf1\x04\xe3\x09\xc6\x13\x8c\x57\x33\x59\x53\x59\x73\xc9\x64\x0a\x66\x53\x30\x9d\x82\xf9\x14\x4c\xa8\x60\x46\x05\x53\x2a\x98\x53\xe1\x33\x9e\x3f\x4a\xc0\x47\x3b\x4e\x20\x18\x82\x08\xbc\x04\x42\xb4\x22\x81\x08\xad\x9f\x40\x8c\x36\x48\xe0\x02\x6d\x98\xc0\x08\x6d\x94\xc0\x18\x2d\xe2\xa1\x6a\x03\x04\x44\xc4\x00\x2b\x44\xc8\x00\x4b\x44\xcc\x10\x6b\x44\xd0\x10\x8b\x44\xd4\x10\xab\x44\xd8\x10\xcb\x44\xdc\x30\xa4\x3a\xc2\x88\xea\x08\x63\xaa\x23\xbc\xa0\x3a\x50\x7d\x36\x60\x4c\x75\xa0\xfe\xb0\x0e\x14\x20\xd6\x61\x15\x88\x75\x58\x0d\x62\x1d\x56\x85\x08\x89\x3a\xb4\x75\x58\x25\x22\x28\x6a\xd1\xd6\x61\xd5\x88\xb0\x56\x8f\x88\xcb\x8a\x14\xb1\x60\xeb\xb3\x0d\xd8\x86\xd6\xfa\x21\x9f\xa2\x90\x8f\x51\xc8\xe7\x28\x0c\x78\x9f\xfd\xec\x21\xd8\xdb\x93\xae\x65\x59\x6d\x4d\x3f\x81\x75\x95\xaf\xf0\xda\x19\x38\xf0\xc4\x17\x13\x98\x4d\x56\xba\xf6\x96\x58\x78\x4b\x57\x15\xe5\x04\x28\xaa\x34\xb2\xe8\xc6\x6c\xd5\xdd\x10\x6e\x6f\x1c\xc0\x7b\x05\xe0\x21\xd5\xb0\xd6\xe9\x4e\xc2\xb4\x8b\xd1\xfe\xe9\x6e\x65\x7e\x67\x36\xf0\x06\xc4\x72\x62\x43\xb2\x35\x82\xb8\x52\xeb\x1a\x04\x08\x62\xd1\x97\x5a\x2b\xdd\x5f\xc2\x14\xd8\xc3\x35\xea\xda\xe8\x2c\xbf\x1b\x38\x14\xbc\x07\xb9\x2d\x65\x8d\x71\x2b\x0b\xb3\x81\x69\x37\x35\xe7\x6b\xa1\x55\x81\x37\x2d\x4c\x9b\x0f\x00\x7d\x85\x2d\x21\x80\x2a\x5c\xa3\x3e\x57\xbb\x1b\xa9\x07\xce\xb0\x75\xb0\xc0\x7d\x20\x27\xfb\xa3\xb3\xd9\x0c\x72\xb1\xac\xbf\xee\x27\xfc\x47\xb6\x1e\xd8\x5e\x70\x84\x75\xeb\xbf\x83\xe7\x74\xb2\xe3\xc8\x0a\x2d\x1f\x54\x01\x53\x68\x9c\x17\x47\x61\xed\xc4\xec\x84\x94\x1e\x60\x64\x06\x53\xf0\x26\x90\xc1\x6f\xd4\x34\xdf\xdf\x0b\x42\x74\x55\xb1\x9c\x40\x76\x7e\xee\x34\x81\xc0\xc9\x5c\x2a\xdb\x45\x7f\x3b\x3c\x1a\x57\x21\xe5\xfd\x20\x73\xdc\xb9\xfc\x69\x06\x22\x76\x9c\x3a\xe5\x9e\x6d\xf9\x23\x33\x2b\x8a\xb0\xd3\xaa\xf9\x68\x5b\x5a\xa5\xa5\x84\xfe\xe5\xbb\x8f\x1f\xfb\xc9\xd1\xa7\xcb\x2f\xef\x67\xcd\x67\x6a\x3e\xcb\x4b\x93\x6a\xc3\x2c\x77\xca\x08\x1c\xf7\x2a\x37\x71\x38\x70\x26\xcf\x03\xb2\xbf\xe4\xb1\x7f\x78\xc2\x9f\xe8\x5e\xf4\xef\xd2\xb2\x11\x52\x27\xc4\x7b\x21\xc4\xa8\x53\x11\xa2\x9d\xcd\x71\xc8\x43\xba\xad\xe4\xa9\x28\xdf\x71\x0f\x85\xdb\x8d\xca\xf2\xa2\x32\x4d\xd4\x4e\xee\x94\x7e\x74\xcb\x6d\xb6\x92\x03\x9e\xcd\xb0\x19\xd2\x39\x77\x7f\x02\xa6\x3d\x2d\x79\xb5\xdd\x1e\xef\xd3\xd1\x7e\xc1\x01\xff\x2b\x80\xbb\x8b\x8e\xce\x3a\x27\xc9\x2a\x85\x7c\x3b\xd9\x6f\xb4\x4c\xef\x27\x07\x3c\xbf\x9f\x7d\x9c\xfd\xf9\x6e\x3e\x3b\x21\x81\xeb\xf9\xbb\xf9\xd5\xe5\xc1\xc6\x2b\x22\xf0\x7f\x51\x04\xa7\x44\xd3\x36\x68\xfb\x83\x23\xf1\xfe\xb3\x5e\xfe\x85\x60\x7e\x49\x31\x2d\xf7\xff\x15\xf9\xaf\xb3\xff\x3f\xd3\xff\x6d\x36\xff\xfe\xed\xf3\x33\x7e\x55\x75\x82\xdb\x53\xc3\x64\xe7\xd3\xe4\x8a\x13\x01\x74\x51\xf2\xbb\x75\xe2\x08\xa9\xca\x0c\x6d\xfa\xf3\x1a\xf7\xe5\xf2\xaf\xe7\x5f\xbe\x3e\x57\xed\xf7\xab\xcb\xab\x83\x7b\xeb\xb5\xa4\xde\x10\xbc\x97\xd3\x7c\xf8\xfe\xe9\xeb\xfb\xd9\xf5\xbc\x03\x5a\x13\x51\xac\x9a\xcb\xa0\x58\x3d\xbf\x7f\xf9\xa9\x53\x85\x9b\x95\x5f\x91\x12\xa7\xfb\x98\xd4\x10\x5b\x99\x37\x18\x07\x8f\x1a\xbc\x01\xef\x67\x24\x9f\xa3\xb6\xaf\xcd\x31\xcd\xfc\xc6\xd6\x49\x5a\x49\x1c\xbc\xf1\x6d\xe3\xcd\x1b\x59\xc7\xf7\xf0\xdf\xbe\xf7\x77\x00\x00\x00\xff\xff\xbc\x1e\x80\x65\x04\x0d\x00\x00") + +func emvdis_tracerJsBytes() ([]byte, error) { + return bindataRead( + _emvdis_tracerJs, + "emvdis_tracer.js", + ) +} + +func emvdis_tracerJs() (*asset, error) { + bytes, err := emvdis_tracerJsBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "emvdis_tracer.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _genesis_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x57\xfb\x8f\xda\xc6\x13\xff\xdd\x7f\xc5\x7c\x4f\xfa\xca\x70\xf2\x81\x2f\xc9\x5d\x22\x4e\x57\x95\x7b\xb4\x17\x95\x1c\x55\xa1\xea\xe3\x84\xaa\xb5\x3d\xd8\x2b\xcc\x2e\xda\x1d\xf3\x68\xc4\xff\x5e\xed\x2e\x10\xdb\x98\x34\x91\x1a\xff\x02\x78\x3e\x33\xf3\x99\xd7\xee\xd0\x3d\x3f\xf7\xc6\x19\xd7\x40\x8a\xc5\xa8\x2e\x74\xac\xf8\x82\x40\x16\xb4\x28\x48\x83\x2e\xa6\x53\x1e\x73\x14\x04\x5c\x4c\xa5\x9a\x33\xe2\x52\x00\x49\x88\x15\x32\x42\x60\x90\xcb\x98\xe5\x1e\xae\x31\x2e\xac\x4c\x4e\x81\x32\x34\xf6\x84\x66\xb1\x79\xd5\xf1\xbc\xef\x59\x41\x99\x54\xf0\x81\x29\xe2\x02\x9e\x64\xae\x09\x46\x2b\x14\x09\x7a\xe7\xe7\x5d\xef\xa3\x07\x00\xd0\xed\x8e\x33\x84\x14\x05\x6a\xc3\x28\x63\x04\x2b\xf4\x15\x42\x54\xf0\x3c\xe1\x22\xb5\xa8\x85\x42\x4d\xc6\x77\x0f\x44\x91\xe7\x81\x67\xdf\xe6\x52\xce\x8a\x45\x3f\x8e\x65\x21\xa8\x07\xd3\x42\x58\xdf\x2d\x16\xc7\x41\x12\xb5\x9d\x03\xf3\x2c\x99\x02\x96\x24\x0a\x6e\x81\xe4\x13\xae\x0d\xa2\x7d\x73\x10\xf3\x69\x8b\x32\xae\x3b\x7b\x2f\x2f\x06\x3b\x69\x83\x42\x2a\x94\xb8\xf1\x0e\xc0\x06\x14\xdc\x02\x7c\x72\x64\x1e\x3f\x62\x39\x13\x31\xfa\x3d\x48\xa2\x4e\x8a\x74\xe7\x7e\x5b\xa7\x41\x15\x2a\xa4\x01\xc2\x1e\xf9\x2c\x4f\xe0\x62\x99\x58\x98\x63\xef\xc0\xf7\x32\x71\xd8\x3a\x58\x93\x54\x2c\xb5\xf8\x8f\xdb\x83\x68\xeb\xe2\xdd\x56\x72\x37\x72\xd0\x72\xee\x92\x44\x05\xc0\x45\x82\xeb\x00\x2a\x49\xec\x76\x9f\x25\xc8\x25\xaa\x95\xe2\x84\xa5\xe4\x41\xeb\x7f\x0d\x89\x79\x39\xf0\x98\xbc\x58\x73\x93\x76\x39\x4f\x5f\xa4\x01\xb7\xbb\xc4\x8c\x0c\xca\x71\x9b\xe1\xa6\x54\xba\x6d\x25\x28\x85\xba\xc8\xcb\x9d\x10\xd3\xda\x74\x02\x94\xa3\x80\x3e\x59\xef\xb0\x90\x5c\x50\x00\x2b\x04\x81\x98\x98\x06\x4f\x30\x29\x62\xb2\xbd\xec\x2f\x59\x5e\xa0\x0f\x53\x25\xe7\xe6\x45\xd9\x80\x2c\x08\x55\xb9\xdb\x03\x60\x22\x81\xb9\x5c\x22\x70\x82\x88\xc5\x33\x63\xcd\x98\x91\x8a\xa7\x5c\x54\x1a\xd1\x5a\x34\x8d\xd8\x4f\x12\x85\x5a\x1b\x92\x1d\xf3\xb2\x14\x96\xc1\x91\x3c\x42\x91\xac\x61\x96\x70\x0b\x46\x60\xc9\xde\x54\xfb\xb4\x32\x1d\x2d\xe3\xc0\x16\xb4\xd4\xce\x26\x17\x49\xe2\xf8\x5a\x0b\xc6\xa7\x36\x03\xaa\xa0\x15\x19\xe2\xa4\xdb\x47\xdc\xff\x8a\x58\x6e\x98\x55\x0a\xe8\x1a\xd3\x46\x31\x79\x39\x4c\xc0\xa4\x1e\xd1\x4e\xb7\x51\x99\xe4\x09\x55\xa7\xd6\x19\x15\x51\xcb\x7d\x0d\x60\x59\xca\xc3\x9e\x53\xa7\x9f\x24\xad\xfd\x0f\x07\x29\x47\x3a\xc2\x5d\x65\xec\xcc\x41\xab\xe0\x82\xae\xdf\xb4\x4f\xcc\x76\x35\x1e\x37\xa6\x93\x8b\x8b\x8a\xc9\x67\x49\x18\xd8\x2a\xbb\x9c\x5d\x30\x97\x6b\xd0\xc4\xf3\x1c\xe6\x6c\x03\x42\x12\x44\x08\x97\x61\xf8\x7f\x88\xa5\x52\x18\x53\x50\x26\xa5\xb9\xe1\xb2\x42\xc8\xd8\x12\x85\x4f\xb0\x33\x81\x09\x4c\xa5\xb2\xb6\x53\xa6\x3b\x25\x95\x27\x39\x47\x4d\xc8\x92\xc3\xbb\x58\x8a\x29\x4f\xe1\xb6\x76\x0c\x9d\x21\x5f\x5c\x5e\x85\x77\xb9\x8c\x67\x67\x3d\x78\x15\x86\x61\xd0\x00\x78\xf7\x6f\x80\xab\xcf\x00\xb2\x3d\x99\x3d\xa6\x0e\x48\x98\xfc\x41\xaa\xd9\x29\x71\xb4\xf9\x9b\x09\xe2\xc5\xdc\x01\xa0\xee\x64\x5b\x69\x9f\x28\x17\xc5\xdc\x35\xfc\x8b\x1f\x19\x0d\x51\xcc\x23\x54\xfe\xa4\x72\x18\x39\xd8\x77\xf0\xea\xcd\xf5\xeb\x30\x0c\xdb\xd5\xb4\x74\xbb\x30\x66\x22\x45\xc5\x05\xf6\x20\xe1\x9a\x45\x39\x56\x10\x2e\x9f\x2f\x95\xfc\x99\x93\x28\xac\x9f\x3a\x47\x0e\xaf\xdf\x5e\x35\x3a\x1c\x2d\x0a\xc5\x65\xa1\x4f\xbb\xb9\x6a\x74\x73\x04\x7b\xf7\x15\x6c\xde\xbc\x7e\x1b\x36\xb1\xb9\xdb\xe7\xbc\xd1\x4d\xad\x22\x27\x3d\xed\x2f\xec\xdb\xaa\x79\x3b\x28\xbd\x5d\x75\xc3\x75\x58\x7b\xce\xaa\xf5\x4f\xb8\xd9\x34\x8a\x9c\x36\x3d\x8b\x7e\xd5\x80\x99\xf3\x75\xc6\x74\xd6\x3b\x61\xf1\x6b\x9f\x9a\xf5\x58\x72\x11\x31\x6d\x29\x7f\x85\xf5\x9a\x15\xe2\x66\x0c\xd8\x7c\xd1\xdb\x59\xa9\xc9\x5d\x9b\x96\xd3\x52\x03\x2c\x98\x42\x41\x4f\x36\xce\xff\x3e\x48\x5c\x93\x62\x0f\x8c\x58\xef\x5b\xa4\x30\x65\x7a\xc0\xe7\x9c\x6c\x78\xee\xd8\xb4\x03\x9a\x32\xed\x4f\x3a\x77\x1b\x42\xdd\xaa\xaf\x28\x2c\xcf\x65\xdc\xab\x1e\xb9\xf5\xc2\x98\x7e\xec\xed\x3e\x83\xf2\x16\x73\xf8\xee\xd6\xb3\x7d\x2b\x56\xd7\x1b\x4d\xb8\x28\xed\x01\xb9\x4c\xed\xe5\x07\x1f\xbd\xcf\x2c\x2e\xc7\x93\x6b\xae\x47\x73\x08\xc7\x85\x32\x15\xda\x1f\xcf\xd5\xea\x97\x4d\x98\x63\x78\x7b\x53\x37\xb3\xdb\x00\x61\x65\xee\x85\x85\x24\x14\xc4\x59\x9e\x6f\xcc\xdd\xb0\x52\x52\xa4\x90\xa1\xaa\x65\xe0\x70\x3b\xd8\x5d\xc5\x6a\x72\x11\xe7\x45\x82\x96\x91\xbb\xaf\x35\xd6\xc8\x74\xbb\xc0\x72\x63\x70\xc5\x29\xb3\xc0\x39\x6a\xcd\x52\xac\xa3\x7e\x43\x98\xf2\xb5\x5b\xb8\xb9\x00\xdf\xad\x4e\xad\xb6\x7f\x1c\x5b\x75\x91\xc8\x65\xda\xd9\xa5\x21\xb0\xeb\xc4\xa1\x34\x9f\x52\xab\x57\x9c\xe2\xcc\x42\xe5\xa2\x43\x72\x44\x8a\x8b\xb4\xd5\xae\x25\x38\x66\x1a\xe1\xec\xf1\xf7\xf1\xfd\xf0\xe1\xf1\x7e\xf8\xf3\x1f\x67\xbd\xd3\xf2\xd1\xfb\x3f\x1f\x1b\xe5\x77\xfd\x41\xff\xf9\xbe\x2e\x83\xea\xda\x6f\xa8\x2c\x10\x67\xad\xb0\xdd\x19\xe3\x9a\x5a\x97\xd7\xed\x9b\x23\x85\x86\x70\xed\xce\x59\x89\x73\xff\x44\x0a\xd9\xec\xa6\x81\xd0\x7d\x7f\x30\x68\x64\x6a\x04\x26\x94\x46\xe1\xc3\xe3\xe0\xf1\xc7\xfe\xf8\xf1\xa4\xf6\x68\xdc\x1f\xbf\xbf\x6f\x10\x37\x84\xaa\x89\xc5\x33\x17\xf0\xe5\x37\x0f\xd8\x1f\x8d\xc6\xc3\x5f\x1e\xfd\x06\xd2\xfe\x68\x30\xec\x3f\xf8\xcd\x7c\x67\xb8\x39\xa6\xfb\xa5\xf5\xd9\xfd\x73\x29\xb7\xe3\x41\x31\x30\xa6\x8f\x63\xa8\xf1\xdf\x5f\x66\x5b\x6f\xeb\x75\xcf\xcf\x61\x3c\x7c\x18\x7a\xde\x07\xae\x35\x17\x29\xdc\x0d\x86\xf7\x3f\x3d\xff\xfa\xc1\x33\xcf\x48\xce\x31\x93\x2b\x48\x91\xc0\x77\x2b\xbd\x7f\xd8\xf6\xb8\x30\x73\xa6\xb0\x63\xff\xd5\xfe\x13\x00\x00\xff\xff\x29\xa1\x73\xf0\x5d\x0f\x00\x00") + +func genesis_tracerJsBytes() ([]byte, error) { + return bindataRead( + _genesis_tracerJs, + "genesis_tracer.js", + ) +} + +func genesis_tracerJs() (*asset, error) { + bytes, err := genesis_tracerJsBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "genesis_tracer.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + var _noop_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x4c\xcf\xc1\x6a\x23\x31\x10\x04\xd0\xb3\xf5\x15\x75\xdc\x05\xe3\xb9\xef\x27\x2c\xec\x69\x43\xee\x2d\x4d\x8d\x47\x8e\xa2\x9e\xb4\x7a\x26\x0e\xc6\xff\x1e\x46\x26\xe0\x9b\x68\xa8\x57\xa5\x61\x40\x55\x5d\x5e\x4c\x12\x0d\xb9\xe1\xb2\x36\x87\xcf\x44\x14\x63\xd4\x4a\x44\xcd\x85\xb6\x14\x71\x22\xe9\x48\x18\x3f\xd6\x6c\x1c\x31\x99\xbe\x43\xf0\x57\x36\xf9\x9f\x2c\x2f\x1e\x86\x01\x1a\x2f\x4c\x0e\x57\x44\x62\x6d\x12\x0b\x21\x0d\x02\x37\xa9\x4d\x92\x67\xad\xfb\x3b\xd1\x4e\xe1\x16\x0e\xc3\x80\xe6\x5c\xf6\xee\x5c\x37\x7d\xdb\x5d\x35\x70\xa3\x7d\x41\x97\xde\xe8\xb3\x3c\x46\xbd\xfe\x03\xaf\x4c\xab\xb3\x9d\xc2\x61\xcf\xfd\xc1\xb4\xd6\x8e\xfe\x2a\x7a\x3e\x62\x8c\xbf\x71\xc3\xfd\x18\xba\x6c\x6c\x6b\xf1\x67\xfb\x73\x66\x85\x94\xd2\xb9\x07\xdf\x30\xcb\x46\x44\xb2\x22\x3b\x4d\x9c\x23\x74\xa3\x41\xea\x08\xa3\xaf\x56\x5b\xe7\xf6\xcc\x94\xab\x94\x1f\x58\xa7\x7e\xdb\xbf\x93\xeb\xf9\x14\x0e\x8f\xfb\xd3\xa8\xe4\xd7\x3e\x28\xdc\xc3\x77\x00\x00\x00\xff\xff\x8f\x9c\x5f\x55\x6c\x01\x00\x00") func noop_tracerJsBytes() ([]byte, error) { @@ -182,7 +245,10 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ + "4byte_tracer.js": _4byte_tracerJs, "call_tracer.js": call_tracerJs, + "emvdis_tracer.js": emvdis_tracerJs, + "genesis_tracer.js": genesis_tracerJs, "noop_tracer.js": noop_tracerJs, "opcount_tracer.js": opcount_tracerJs, } @@ -228,7 +294,10 @@ type bintree struct { } var _bintree = &bintree{nil, map[string]*bintree{ + "4byte_tracer.js": {_4byte_tracerJs, map[string]*bintree{}}, "call_tracer.js": {call_tracerJs, map[string]*bintree{}}, + "emvdis_tracer.js": {emvdis_tracerJs, map[string]*bintree{}}, + "genesis_tracer.js": {genesis_tracerJs, map[string]*bintree{}}, "noop_tracer.js": {noop_tracerJs, map[string]*bintree{}}, "opcount_tracer.js": {opcount_tracerJs, map[string]*bintree{}}, }} diff --git a/eth/tracers/internal/tracers/emvdis_tracer.js b/eth/tracers/internal/tracers/emvdis_tracer.js new file mode 100644 index 0000000000..7d92c008e8 --- /dev/null +++ b/eth/tracers/internal/tracers/emvdis_tracer.js @@ -0,0 +1,74 @@ +/** +This tracer returns sufficent information from a trace to +perform evmdis-style disassembly + +@author Nick Johnson, Martin Swende +**/ + +{ + "stack": [{"ops": []}], + "npushes": {0: 0, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 32: 1, 48: 1, 49: 1, 50: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 0, 56: 1, 57: 0, 58: 1, 59: 1, 60: 0, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 80: 0, 81: 1, 82: 0, 83: 0, 84: 1, 85: 0, 86: 0, 87: 0, 88: 1, 89: 1, 90: 1, 91: 0, 96: 1, 97: 1, 98: 1, 99: 1, 100: 1, 101: 1, 102: 1, 103: 1, 104: 1, 105: 1, 106: 1, 107: 1, 108: 1, 109: 1, 110: 1, 111: 1, 112: 1, 113: 1, 114: 1, 115: 1, 116: 1, 117: 1, 118: 1, 119: 1, 120: 1, 121: 1, 122: 1, 123: 1, 124: 1, 125: 1, 126: 1, 127: 1, 128: 2, 129: 3, 130: 4, 131: 5, 132: 6, 133: 7, 134: 8, 135: 9, 136: 10, 137: 11, 138: 12, 139: 13, 140: 14, 141: 15, 142: 16, 143: 17, 144: 2, 145: 3, 146: 4, 147: 5, 148: 6, 149: 7, 150: 8, 151: 9, 152: 10, 153: 11, 154: 12, 155: 13, 156: 14, 157: 15, 158: 16, 159: 17, 160: 0, 161: 0, 162: 0, 163: 0, 164: 0, 240: 1, 241: 1, 242: 1, 243: 0, 244: 0, 255: 0}, + "result": function() { return this.stack[0].ops; }, + "step": function(log, db) { + var frame = this.stack[this.stack.length - 1]; + if(log.err) { + frame["error"] = log.err.toString(); + } else if(log.depth == this.stack.length) { + opinfo = { + "op": log.op.toNumber(), + "depth" : log.depth, + "result": [], + }; + if(frame.ops.length > 0) { + var prevop = frame.ops[frame.ops.length - 1]; + for(var i = 0; i < this.npushes[prevop.op]; i++) + prevop.result.push(log.stack.peek(i).Text(16)); + } + switch(log.op.toString()) { + case "CALL": + case "CALLCODE": + var instart = log.stack.peek(3).Int64(); + var insize = log.stack.peek(4).Int64(); + opinfo["gas"] = log.stack.peek(0).Int64(); + opinfo["to"] = log.stack.peek(1).Text(16); + opinfo["value"] = log.stack.peek(2).String(); + opinfo["input"] = log.memory.slice(instart, instart + insize); + opinfo["error"] = null; + opinfo["return"] = null; + opinfo["ops"] = []; + this.stack.push(opinfo); + break; + case "DELEGATECALL": + case "STATICCALL": + var instart = log.stack.peek(2).Int64(); + var insize = log.stack.peek(3).Int64(); + opinfo["op"] = log.op.toString(); + opinfo["gas"] = log.stack.peek(0).Int64(); + opinfo["to"] = log.stack.peek(1).Text(16); + opinfo["input"] = log.memory.slice(instart, instart + insize); + opinfo["error"] = null; + opinfo["return"] = null; + opinfo["ops"] = []; + this.stack.push(opinfo); + break; + case "RETURN": + var out = log.stack.peek(0).Int64(); + var outsize = log.stack.peek(1).Int64(); + frame.return = log.memory.slice(out, out + outsize); + break; + case "STOP": + case "SUICIDE": + frame.return = log.memory.slice(0, 0); + break; + case "JUMPDEST": + opinfo["pc"] = log.pc; + } + if(log.op.isPush()) { + opinfo["len"] = log.op.toNumber() - 0x5e; + } + frame.ops.push(opinfo); + } else { + this.stack = this.stack.slice(0, log.depth); + } + } +} diff --git a/eth/tracers/internal/tracers/genesis_tracer.js b/eth/tracers/internal/tracers/genesis_tracer.js new file mode 100644 index 0000000000..ccccb9d843 --- /dev/null +++ b/eth/tracers/internal/tracers/genesis_tracer.js @@ -0,0 +1,131 @@ +/** +This tracer-script outputs sufficient information to create a local +execution of the transaction. + +@author Martin Holst Swende +**/ +{ + //The genesis that we're building + prestate : null, + + lookupAccount: function(acc,db){ + var addr = toHex(acc); + if(this.prestate[addr]) return; + + this.prestate[addr] = { + 'balance': db.getBalance(acc), + 'nonce' : db.getNonce(acc), + 'code' : toHex(db.getCode(acc)), + 'storage' : {} + }; + }, + + lookupStorage: function(addr, index, db){ + //No overwrite + if (!this.prestate[addr]['storage'][index]){ + this.prestate[addr]['storage'][index] = db.getState(addr,key); + } + }, + + result: function(ctx,db) { + // At this point, we need to deduct the 'value' from the + // outer transaction, and move it back to the origin + var from = toAddress(ctx.from); + var to = toAddress(ctx.to); + var v = ctx.value; + this.lookupAccount(from, db); + + // Add back value to sender (bigints) + var from_bal = this.prestate[toHex(from)]['balance']; + var to_bal = this.prestate[toHex(to)]['balance']; + to_bal.Sub(to_bal, v); + from_bal.Add(from_bal, v); + + // Set back nonce (uint64) + this.prestate[toHex(from)]['nonce']--; + + //Note, the sender-account still may not be 100% correct, + // since we haven't accounted for the gas. + //Homestead + config = { + "eip150Block": 2000, + "eip158Block": 2000, + "eip155Block": 2000, + "homesteadBlock": 0, + "daoForkBlock": 0, + "byzantiumBlock" : 2000, + } + var blnum = ctx['blocknumber'] + if (blnum > 2463000){ + // Tangerine: disable + config["eip150Block"] = 0; + } + if (blnum > 2675000){ + // Spurious + config["eip155Block"] = 0; + config["eip158Block"] = 0; + } + if (blnum > 4370000){ + //Byzantium + config["byzantiumBlock"] = 0; + } + genesis ={ + nonce: "0x0000000000000000", + difficulty: "0x020000", + mixhash: "0x0000000000000000000000000000000000000000000000000000000000000000", + coinbase: "0x0000000000000000000000000000000000000000", + timestamp: "0x00", + number: "0x00", + parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000", + extraData: "0x0000000000000000000000000000000000000000000000000000000000000000", + gasLimit: toHex(ctx['gas'].Bytes()), + alloc: this.prestate, + config: config, + }; + + return genesis; + }, + + step: function(log, db) { + + if (!this.prestate){ + // Add the current account + this.prestate = {}; + // Balance will potentially be wrong here, + // since this will include the value sent + // along with the message + // We fix that in 'result()' + this.lookupAccount(log.account,db); + } + + switch(log.op.toString()){ + case "EXTCODECOPY": + case "EXTCODESIZE": + case "BALANCE": + var addr = log.peek(0).Text(16); + this.lookupAccount(addr,db); + break; + case "CALL": + case "CALLCODE": + case "DELEGATECALL": + case "STATICCALL": + var addr = log.stack.peek(1).Text(16); + this.lookupAccount(addr,db); + break; + case 'SSTORE': + case 'SLOAD': + var key = log.stack.peek(0).Text(16); + this.lookupStorage(log.account.Text(16), key,db); + break; + } + } +} +/** TODO + +Missing BLOCKNUM + + + + +Somehow get 'origin'-account in there. +**/