summaryrefslogtreecommitdiff
path: root/cmd/goal/clerk.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/goal/clerk.go')
-rw-r--r--cmd/goal/clerk.go86
1 files changed, 54 insertions, 32 deletions
diff --git a/cmd/goal/clerk.go b/cmd/goal/clerk.go
index 571c4d1a4..c5d69854a 100644
--- a/cmd/goal/clerk.go
+++ b/cmd/goal/clerk.go
@@ -131,6 +131,7 @@ func init() {
dryrunCmd.Flags().StringVarP(&protoVersion, "proto", "P", "", "consensus protocol version id string")
dryrunCmd.Flags().BoolVar(&dumpForDryrun, "dryrun-dump", false, "Dump in dryrun format acceptable by dryrun REST api instead of running")
dryrunCmd.Flags().Var(&dumpForDryrunFormat, "dryrun-dump-format", "Dryrun dump format: "+dumpForDryrunFormat.AllowedString())
+ dryrunCmd.Flags().StringSliceVar(&dumpForDryrunAccts, "dryrun-accounts", nil, "additional accounts to include into dryrun request obj")
dryrunCmd.Flags().StringVarP(&outFilename, "outfile", "o", "", "Filename for writing dryrun state object")
dryrunCmd.MarkFlagRequired("txfile")
@@ -193,34 +194,45 @@ func waitForCommit(client libgoal.Client, txid string, transactionLastValidRound
return
}
-func createSignedTransaction(client libgoal.Client, signTx bool, dataDir string, walletName string, tx transactions.Transaction) (stxn transactions.SignedTxn, err error) {
+func createSignedTransaction(client libgoal.Client, signTx bool, dataDir string, walletName string, tx transactions.Transaction, signer basics.Address) (stxn transactions.SignedTxn, err error) {
if signTx {
// Sign the transaction
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
- stxn, err = client.SignTransactionWithWallet(wh, pw, tx)
- if err != nil {
- return
- }
- } else {
- // Wrap in a transactions.SignedTxn with an empty sig.
- // This way protocol.Encode will encode the transaction type
- stxn, err = transactions.AssembleSignedTxn(tx, crypto.Signature{}, crypto.MultisigSig{})
- if err != nil {
- return
+ if signer.IsZero() {
+ stxn, err = client.SignTransactionWithWallet(wh, pw, tx)
+ } else {
+ stxn, err = client.SignTransactionWithWalletAndSigner(wh, pw, signer.String(), tx)
}
+ return
+ }
- stxn = populateBlankMultisig(client, dataDir, walletName, stxn)
+ // Wrap in a transactions.SignedTxn with an empty sig.
+ // This way protocol.Encode will encode the transaction type
+ stxn, err = transactions.AssembleSignedTxn(tx, crypto.Signature{}, crypto.MultisigSig{})
+ if err != nil {
+ return
}
+
+ stxn = populateBlankMultisig(client, dataDir, walletName, stxn)
return
}
+func writeSignedTxnsToFile(stxns []transactions.SignedTxn, filename string) error {
+ var outData []byte
+ for _, stxn := range stxns {
+ outData = append(outData, protocol.Encode(&stxn)...)
+ }
+
+ return writeFile(filename, outData, 0600)
+}
+
func writeTxnToFile(client libgoal.Client, signTx bool, dataDir string, walletName string, tx transactions.Transaction, filename string) error {
- stxn, err := createSignedTransaction(client, signTx, dataDir, walletName, tx)
+ stxn, err := createSignedTransaction(client, signTx, dataDir, walletName, tx, basics.Address{})
if err != nil {
return err
}
// Write the SignedTxn to the output file
- return writeFile(filename, protocol.Encode(&stxn), 0600)
+ return writeSignedTxnsToFile([]transactions.SignedTxn{stxn}, filename)
}
func getB64Args(args []string) [][]byte {
@@ -418,7 +430,7 @@ var sendCmd = &cobra.Command{
}
} else {
signTx := sign || (outFilename == "")
- stx, err = createSignedTransaction(client, signTx, dataDir, walletName, payment)
+ stx, err = createSignedTransaction(client, signTx, dataDir, walletName, payment, basics.Address{})
if err != nil {
reportErrorf(errorSigningTX, err)
}
@@ -484,18 +496,12 @@ var sendCmd = &cobra.Command{
}
} else {
if dumpForDryrun {
- // Write dryrun data to file
- proto, _ := getProto(protoVersion)
- data, err := libgoal.MakeDryrunStateBytes(client, stx, []transactions.SignedTxn{}, string(proto), dumpForDryrunFormat.String())
- if err != nil {
- reportErrorf(err.Error())
- }
- writeFile(outFilename, data, 0600)
+ err = writeDryrunReqToFile(client, stx, outFilename)
} else {
err = writeFile(outFilename, protocol.Encode(&stx), 0600)
- if err != nil {
- reportErrorf(err.Error())
- }
+ }
+ if err != nil {
+ reportErrorf(err.Error())
}
}
},
@@ -859,13 +865,12 @@ var groupCmd = &cobra.Command{
transactionIdx++
}
- var outData []byte
- for _, stxn := range stxns {
- stxn.Txn.Group = crypto.HashObj(group)
- outData = append(outData, protocol.Encode(&stxn)...)
+ groupHash := crypto.HashObj(group)
+ for i := range stxns {
+ stxns[i].Txn.Group = groupHash
}
- err = writeFile(outFilename, outData, 0600)
+ err = writeSignedTxnsToFile(stxns, outFilename)
if err != nil {
reportErrorf(fileWriteError, outFilename, err)
}
@@ -927,7 +932,7 @@ func assembleFile(fname string) (program []byte) {
}
ops, err := logic.AssembleString(string(text))
if err != nil {
- ops.ReportProblems(fname)
+ ops.ReportProblems(fname, os.Stderr)
reportErrorf("%s: %s", fname, err)
}
_, params := getProto(protoVersion)
@@ -1069,7 +1074,11 @@ var dryrunCmd = &cobra.Command{
// Write dryrun data to file
dataDir := ensureSingleDataDir()
client := ensureFullClient(dataDir)
- data, err := libgoal.MakeDryrunStateBytes(client, nil, txgroup, string(proto), dumpForDryrunFormat.String())
+ accts, err := unmarshalSlice(dumpForDryrunAccts)
+ if err != nil {
+ reportErrorf(err.Error())
+ }
+ data, err := libgoal.MakeDryrunStateBytes(client, nil, txgroup, accts, string(proto), dumpForDryrunFormat.String())
if err != nil {
reportErrorf(err.Error())
}
@@ -1182,3 +1191,16 @@ var dryrunRemoteCmd = &cobra.Command{
}
},
}
+
+// unmarshalSlice converts string addresses to basics.Address
+func unmarshalSlice(accts []string) ([]basics.Address, error) {
+ result := make([]basics.Address, 0, len(accts))
+ for _, acct := range accts {
+ addr, err := basics.UnmarshalChecksumAddress(acct)
+ if err != nil {
+ return nil, err
+ }
+ result = append(result, addr)
+ }
+ return result, nil
+}