Skip to content

Commit 7e2cb85

Browse files
authored
Merge pull request #2 from Lbqds/allow_decode_constant
allow decode constant & refine repl
2 parents 5a589a1 + 77d549b commit 7e2cb85

File tree

2 files changed

+90
-5
lines changed

2 files changed

+90
-5
lines changed

codegen/README.md

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
## repl
2+
3+
repl used for convenience encode and decode, download abi-codegen-0.2.0 from [release page](https://github.com/Lbqds/eth-abi/releases)
4+
5+
usage:
6+
7+
```
8+
$ ./abi-codegen-0.2.0 -i
9+
```
10+
11+
start repl mode, and only have 3 command now:
12+
13+
```
14+
>>load absolute-path-abi-file
15+
```
16+
17+
```
18+
>>encode selector [params]
19+
```
20+
21+
```
22+
>>decode selector params
23+
```
24+
25+
for example([Token](https://github.com/Lbqds/eth-abi/tree/master/examples/src/main/scala/examples/token)):
26+
27+
```
28+
>>load /absolute-path/Token.abi
29+
```
30+
31+
output:
32+
33+
```
34+
load completed
35+
```
36+
37+
```
38+
>>encode approve 0x0C256268f13CACeF89e15c7512c5fCf3f6775680 100
39+
```
40+
41+
output:
42+
43+
```
44+
0000000000000000000000000c256268f13cacef89e15c7512c5fcf3f67756800000000000000000000000000000000000000000000000000000000000000064
45+
```
46+
47+
```
48+
decode totalSupply 0000000000000000000000000000000000000000000000000000000000000064
49+
```
50+
51+
output:
52+
53+
```
54+
(0000000000000000000000000000000000000000000000000000000000000064)
55+
```
56+
57+
ctrl-d to quit
58+
59+
thanks to [ammonite-terminal](https://github.com/lihaoyi/Ammonite/tree/master/terminal/src), you can use ctrl-r/h/b/f/a/e etc.
60+
61+
TODO: support tuple, event

codegen/src/main/scala/codegen/Repl.scala

+29-5
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ private[codegen] object Repl {
7979
override def execute(): String = {
8080
val abiDef =
8181
if (selector == ctorSelector) throw new InvalidCommandException("ctor have outputs")
82-
else defs.filter(_.isFunction).find(_.name.get == selector).get
82+
else defs.filter(d => d.isFunction || d.isConstant).find(_.name.get == selector).get
8383
if (abiDef.outputs.get.exists(_.isTupleTpe)) throw new InvalidCommandException("tuple type unsupported now")
8484
val types = abiDef.outputs.get.map(_.tpe.toString)
8585
def helper[T]: Option[T] = None
@@ -165,35 +165,59 @@ private[codegen] object Repl {
165165

166166
def execute(raw: String): Unit = {
167167
try {
168+
history = history :+ raw
168169
parseCmd(raw) match {
169170
case cmd: Load => ctx = cmd.execute()
170171
case cmd: EncodeArg => println(cmd.copy(defs = ctx).execute())
171172
case cmd: DecodeRet => println(cmd.copy(defs = ctx).execute())
172173
case cmd: Command => cmd.execute()
173174
}
174-
history = history :+ raw
175175
} catch {
176176
case NonFatal(exp) => println(exp)
177177
case e: Throwable => throw e
178178
}
179179
}
180180

181181
// TODO: remove unnecessary filters
182+
val historyFilter = new HistoryFilter(() => history.toVector, fansi.Attrs.Empty)
183+
val selection = GUILikeFilters.SelectionFilter(indent = 4)
182184
val filters = Filter.merge(
183185
UndoFilter(),
184186
ReadlineFilters.CutPasteFilter(),
185-
new HistoryFilter(() => history.toVector, fansi.Attrs.Empty),
186-
GUILikeFilters.SelectionFilter(indent = 4),
187+
historyFilter,
188+
selection,
187189
BasicFilters.tabFilter(4),
188190
GUILikeFilters.altFilter,
189191
GUILikeFilters.fnFilter,
190192
ReadlineFilters.navFilter,
191193
BasicFilters.all)
192194
val reader = new InputStreamReader(System.in)
193195
val writer = new OutputStreamWriter(System.out)
196+
197+
val transformer = (buffer: Vector[Char], cursor: Int) => {
198+
// underline all non-blank lines
199+
200+
def hl(b: Vector[Char]): Vector[Char] = b.flatMap{
201+
case ' ' => " "
202+
case '\n' => "\n"
203+
case c => Console.UNDERLINED + c + Console.RESET
204+
}
205+
// and highlight the selection
206+
val ansiBuffer = fansi.Str(hl(buffer))
207+
val (newBuffer, cursorOffset) = GUILikeFilters.SelectionFilter.mangleBuffer(
208+
selection, ansiBuffer, cursor, fansi.Reversed.On
209+
)
210+
val newNewBuffer = HistoryFilter.mangleBuffer(
211+
historyFilter, newBuffer, cursor,
212+
fansi.Color.Green
213+
)
214+
215+
(newNewBuffer, cursorOffset)
216+
}
217+
194218
@tailrec
195219
def loop(): Unit = {
196-
Terminal.readLine(">>", reader, writer, filters) match {
220+
Terminal.readLine(">>", reader, writer, filters, transformer) match {
197221
case Some(line) => execute(line); loop()
198222
case _ => println("\nBye!"); saveHistory(history)
199223
}

0 commit comments

Comments
 (0)