11import { input , select } from "@inquirer/prompts" ;
2- import { Contract , FunctionFragment , getDefaultProvider , isAddress , isHexString , parseUnits , toBigInt } from "ethers" ;
2+ import {
3+ Contract ,
4+ FunctionFragment ,
5+ getDefaultProvider ,
6+ isAddress ,
7+ isHexString ,
8+ parseUnits ,
9+ toBigInt ,
10+ ZeroAddress ,
11+ } from "ethers" ;
312import { TransactionType , encodeMulti , MetaTransaction , OperationType , encodeSingle } from "ethers-multisend" ;
413import { spawnSync } from "child_process" ;
514import { writeFileSync } from "fs" ;
@@ -23,13 +32,13 @@ const trial =
2332}
2433} ;
2534
26- const address = ( config :{ message :string ; default ?:string } ) =>
35+ const inputAddress = ( config :{ message :string ; default ?:string } ) =>
2736input ( {
2837 ...config ,
2938validate :trial ( ( value ) => isAddress ( value ) , "Invalid address" ) ,
3039} ) ;
3140
32- const number = ( config :{ message :string ; min :number ; default ?:string } ) =>
41+ const inputNumber = ( config :{ message :string ; min :number ; default ?:string } ) =>
3342input ( {
3443 ...config ,
3544validate :trial ( ( value ) => {
@@ -51,13 +60,13 @@ const number = (config: { message: string; min: number; default?: string }) =>
5160console . log ( `\n --- Safe Transaction Options ---\n` ) ;
5261
5362const nbTxs = parseInt (
54- await number ( {
63+ await inputNumber ( {
5564message :"How many transactions do you want to batch?" ,
5665default :"1" ,
5766min :1 ,
5867} )
5968) ;
60- const gasToken = await address ( {
69+ const gasToken = await inputAddress ( {
6170message :`With which ERC20 token do you want to pay gas? (default: ETH)` ,
6271default :"0x0000000000000000000000000000000000000000" ,
6372} ) ;
@@ -84,7 +93,7 @@ const number = (config: { message: string; min: number; default?: string }) =>
8493
8594switch ( txType ) {
8695case TransactionType . callContract :
87- to = await address ( { message :prefix + `Contract address` } ) ;
96+ to = await inputAddress ( { message :prefix + `Contract address` } ) ;
8897
8998const functionSelector = await input ( {
9099message :prefix + `Function selector` ,
@@ -115,7 +124,7 @@ const number = (config: { message: string; min: number; default?: string }) =>
115124if ( ! isHexString ( data ) )
116125throw Error ( `An error happened when encoding calldata:\n${ data } \n${ subprocess . stderr . toString ( ) . trim ( ) } ` ) ;
117126
118- value = await number ( {
127+ value = await inputNumber ( {
119128message :prefix + `Value (ETH)` ,
120129default :"0" ,
121130min :0 ,
@@ -151,7 +160,7 @@ const number = (config: { message: string; min: number; default?: string }) =>
151160} , "Invalid ERC20 address" ) ,
152161} ) ;
153162
154- to = await address ( { message :prefix + `Recipient address` } ) ;
163+ to = await inputAddress ( { message :prefix + `Recipient address` } ) ;
155164const amount = parseUnits (
156165await input ( {
157166message :prefix + `Amount` ,
@@ -165,12 +174,12 @@ const number = (config: { message: string; min: number; default?: string }) =>
165174break ;
166175
167176case TransactionType . transferCollectible :
168- const collectible = await address ( {
177+ const collectible = await inputAddress ( {
169178message :prefix + `Collectible address` ,
170179} ) ;
171180
172- const from = await address ( { message :prefix + `From address` , default :process . env . SAFE } ) ;
173- to = await address ( { message :prefix + `Recipient address` } ) ;
181+ const from = await inputAddress ( { message :prefix + `From address` , default :process . env . SAFE } ) ;
182+ to = await inputAddress ( { message :prefix + `Recipient address` } ) ;
174183
175184const tokenId = await input ( {
176185message :prefix + `Token ID` ,
@@ -182,13 +191,13 @@ const number = (config: { message: string; min: number; default?: string }) =>
182191break ;
183192
184193case TransactionType . raw :
185- to = await address ( { message :prefix + `Target address` } ) ;
194+ to = await inputAddress ( { message :prefix + `Target address` } ) ;
186195data = await input ( {
187196message :prefix + `Calldata` ,
188197validate :trial ( ( value ) => isHexString ( value ) , "Invalid calldata" ) ,
189198} ) ;
190199
191- value = await number ( {
200+ value = await inputNumber ( {
192201message :prefix + `Value (ETH)` ,
193202default :"0" ,
194203min :0 ,
@@ -210,11 +219,12 @@ const number = (config: { message: string; min: number; default?: string }) =>
210219JSON . stringify (
211220{
212221 ...tx ,
222+ value :toBigInt ( tx . value ) . toString ( ) ,
213223safeTxGas :0 ,
214224baseGas :0 ,
215225gasPrice :0 ,
216226 gasToken,
217- refundReceiver :"0x0000000000000000000000000000000000000000" ,
227+ refundReceiver :ZeroAddress ,
218228} ,
219229undefined ,
2202304