1
- import { Action , DeployAction , EncodeAction , ReadAction , StartConditionalAction , TransactionAction } from '../actions'
2
- import { Contract , providers , utils } from 'ethers'
3
- import { AbiSymbol , Address , Bytecode , Name } from '../symbols'
1
+ import chalk from 'chalk'
2
+ import {
3
+ Action ,
4
+ DebugAction ,
5
+ DeployAction ,
6
+ EncodeAction ,
7
+ ReadAction ,
8
+ StartConditionalAction ,
9
+ TransactionAction ,
10
+ } from '../actions'
11
+ import { BigNumber , Contract , providers , utils } from 'ethers'
12
+ import { AbiSymbol , Address , ArtifactSymbol , Bytecode , Name } from '../symbols'
4
13
import { Future , resolveBytesLike } from '../values'
5
14
import { getDeployTx } from './getDeployTx'
6
15
import { sendTransaction , TransactionOptions } from './sendTransaction'
@@ -49,6 +58,8 @@ async function executeAction(action: Action, options: ExecuteOptions) {
49
58
return executeEncode ( action )
50
59
case 'CONDITIONAL_START' :
51
60
return executeConditionalStart ( action )
61
+ case 'DEBUG' :
62
+ return executeDebug ( action )
52
63
}
53
64
}
54
65
@@ -122,13 +133,21 @@ async function executeRead(action: ReadAction, options: ExecuteOptions) {
122
133
async function executeTransaction ( action : TransactionAction , globalOptions : ExecuteOptions ) {
123
134
const options = { ...globalOptions , ...action . options }
124
135
const params = action . params . map ( ( param ) => resolveValue ( param ) )
125
- const { txHash } = await sendTransaction ( `${ action . name } .${ action . method . name } ` , options , {
126
- to : resolveValue ( action . address ) ,
127
- data : new utils . Interface ( [ action . method ] ) . encodeFunctionData ( action . method . name , params ) ,
128
- } )
136
+ const { txHash } = await sendTransaction (
137
+ `${ action . name } .${ action . method . name } (${ printableTransactionParams ( params ) } )` ,
138
+ options ,
139
+ {
140
+ to : resolveValue ( action . address ) ,
141
+ data : new utils . Interface ( [ action . method ] ) . encodeFunctionData ( action . method . name , params ) ,
142
+ }
143
+ )
129
144
action . resolve ( resolveBytesLike ( txHash ) )
130
145
}
131
146
147
+ function printableTransactionParams ( params : unknown [ ] ) {
148
+ return params . map ( printableToString ) . join ( ', ' )
149
+ }
150
+
132
151
async function executeEncode ( action : EncodeAction ) {
133
152
const params = action . params . map ( ( param ) => resolveValue ( param ) )
134
153
const result = new utils . Interface ( [ action . method ] ) . encodeFunctionData ( action . method . name , params )
@@ -143,3 +162,28 @@ function resolveValue(value: unknown) {
143
162
}
144
163
return resolved
145
164
}
165
+
166
+ function executeDebug ( { messages } : DebugAction ) {
167
+ console . log ( chalk . yellow ( '🛠' , ...messages . map ( printableToString ) ) )
168
+ }
169
+
170
+ export function printableToString ( data : unknown ) : string | number | boolean | null | undefined {
171
+ const resolved = data instanceof Future ? Future . resolve ( data ) : data
172
+ if ( ! resolved || typeof resolved !== 'object' ) {
173
+ return resolved
174
+ }
175
+ if ( resolved instanceof BigNumber ) {
176
+ return resolved . toString ( )
177
+ }
178
+ if ( ArtifactSymbol in resolved && Address in resolved ) {
179
+ return `${ resolved [ ArtifactSymbol ] [ Name ] } #${ Future . resolve ( resolved [ Address ] ) } `
180
+ }
181
+ if ( Array . isArray ( resolved ) ) {
182
+ return JSON . stringify ( resolved . map ( printableToString ) )
183
+ }
184
+ return JSON . stringify (
185
+ Object . fromEntries ( Object . entries ( resolved ) . map ( ( [ key , value ] ) => [ key , printableToString ( value ) ] ) ) ,
186
+ null ,
187
+ 2
188
+ )
189
+ }
0 commit comments