Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

goal: Allow --signer to send txns from rekeyed accounts #4175

Merged
merged 1 commit into from
Jun 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 23 additions & 16 deletions cmd/goal/account.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,8 +139,9 @@ func init() {
rewardsCmd.MarkFlagRequired("address")

// changeOnlineStatus flags
changeOnlineCmd.Flags().StringVarP(&accountAddress, "address", "a", "", "Account address to change (required if no -partkeyfile)")
changeOnlineCmd.Flags().StringVarP(&partKeyFile, "partkeyfile", "", "", "Participation key file (required if no -account)")
changeOnlineCmd.Flags().StringVarP(&accountAddress, "address", "a", "", "Account address to change (required if no --partkeyfile)")
changeOnlineCmd.Flags().StringVarP(&partKeyFile, "partkeyfile", "", "", "Participation key file (required if no --address)")
changeOnlineCmd.Flags().StringVarP(&signerAddress, "signer", "S", "", "Address of key to sign with, if different due to rekeying")
changeOnlineCmd.Flags().BoolVarP(&online, "online", "o", true, "Set this account to online or offline")
changeOnlineCmd.Flags().Uint64VarP(&transactionFee, "fee", "f", 0, "The Fee to set on the status change transaction (defaults to suggested fee)")
changeOnlineCmd.Flags().Uint64VarP(&firstValid, "firstRound", "", 0, "")
Expand Down Expand Up @@ -203,6 +204,7 @@ func init() {
// markNonparticipatingCmd flags
markNonparticipatingCmd.Flags().StringVarP(&accountAddress, "address", "a", "", "Account address to change")
markNonparticipatingCmd.MarkFlagRequired("address")
markNonparticipatingCmd.Flags().StringVarP(&signerAddress, "signer", "S", "", "Address of key to sign with, if different from address due to rekeying")
markNonparticipatingCmd.Flags().Uint64VarP(&transactionFee, "fee", "f", 0, "The Fee to set on the status change transaction (defaults to suggested fee)")
markNonparticipatingCmd.Flags().Uint64VarP(&firstValid, "firstRound", "", 0, "")
markNonparticipatingCmd.Flags().Uint64VarP(&firstValid, "firstvalid", "", 0, "FirstValid for the status change transaction (0 for current)")
Expand Down Expand Up @@ -783,13 +785,11 @@ var changeOnlineCmd = &cobra.Command{
checkTxValidityPeriodCmdFlags(cmd)

if accountAddress == "" && partKeyFile == "" {
fmt.Printf("Must specify one of --address or --partkeyfile\n")
os.Exit(1)
reportErrorf("Must specify one of --address or --partkeyfile\n")
}

if partKeyFile != "" && !online {
fmt.Printf("Going offline does not support --partkeyfile\n")
os.Exit(1)
reportErrorf("Going offline does not support --partkeyfile\n")
}

dataDir := ensureSingleDataDir()
Expand All @@ -805,14 +805,12 @@ var changeOnlineCmd = &cobra.Command{
if partKeyFile != "" {
partdb, err := db.MakeErasableAccessor(partKeyFile)
if err != nil {
fmt.Printf("Cannot open partkey %s: %v\n", partKeyFile, err)
os.Exit(1)
reportErrorf("Cannot open partkey %s: %v\n", partKeyFile, err)
}

partkey, err := algodAcct.RestoreParticipation(partdb)
if err != nil {
fmt.Printf("Cannot load partkey %s: %v\n", partKeyFile, err)
os.Exit(1)
reportErrorf("Cannot load partkey %s: %v\n", partKeyFile, err)
}

part = &partkey.Participation
Expand Down Expand Up @@ -858,9 +856,14 @@ func changeAccountOnlineStatus(

// Sign & broadcast the transaction
wh, pw := ensureWalletHandleMaybePassword(dataDir, wallet, true)
txid, err := client.SignAndBroadcastTransaction(wh, pw, utx)
signedTxn, err := client.SignTransactionWithWalletAndSigner(wh, pw, signerAddress, utx)
if err != nil {
return fmt.Errorf(errorSigningTX, err)
}

txid, err := client.BroadcastTransaction(signedTxn)
if err != nil {
return fmt.Errorf(errorOnlineTX, err)
return fmt.Errorf(errorBroadcastingTX, err)
}
fmt.Printf("Transaction id for status change transaction: %s\n", txid)

Expand Down Expand Up @@ -915,7 +918,7 @@ var installParticipationKeyCmd = &cobra.Command{
Args: validateNoPosArgsFn,
Run: func(cmd *cobra.Command, args []string) {
if !partKeyDeleteInput {
fmt.Println(
reportErrorf(
`The installpartkey command deletes the input participation file on
successful installation. Please acknowledge this by passing the
"--delete-input" flag to the installpartkey command. You can make
Expand All @@ -925,7 +928,6 @@ forward security. Storing old participation keys compromises overall
system security.

No --delete-input flag specified, exiting without installing key.`)
os.Exit(1)
}

dataDir := ensureSingleDataDir()
Expand Down Expand Up @@ -1447,9 +1449,14 @@ var markNonparticipatingCmd = &cobra.Command{

// Sign & broadcast the transaction
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
txid, err := client.SignAndBroadcastTransaction(wh, pw, utx)
signedTxn, err := client.SignTransactionWithWalletAndSigner(wh, pw, signerAddress, utx)
if err != nil {
reportErrorf(errorSigningTX, err)
}

txid, err := client.BroadcastTransaction(signedTxn)
if err != nil {
reportErrorf(errorOnlineTX, err)
reportErrorf(errorBroadcastingTX, err)
}
fmt.Printf("Transaction id for mark-nonparticipating transaction: %s\n", txid)

Expand Down
15 changes: 7 additions & 8 deletions cmd/goal/application.go
Original file line number Diff line number Diff line change
Expand Up @@ -478,7 +478,7 @@ var createAppCmd = &cobra.Command{
if outFilename == "" {
// Broadcast
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
signedTxn, err := client.SignTransactionWithWallet(wh, pw, tx)
signedTxn, err := client.SignTransactionWithWalletAndSigner(wh, pw, signerAddress, tx)
if err != nil {
reportErrorf(errorSigningTX, err)
}
Expand Down Expand Up @@ -553,7 +553,7 @@ var updateAppCmd = &cobra.Command{
// Broadcast or write transaction to file
if outFilename == "" {
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
signedTxn, err := client.SignTransactionWithWallet(wh, pw, tx)
signedTxn, err := client.SignTransactionWithWalletAndSigner(wh, pw, signerAddress, tx)
if err != nil {
reportErrorf(errorSigningTX, err)
}
Expand Down Expand Up @@ -623,7 +623,7 @@ var optInAppCmd = &cobra.Command{
// Broadcast or write transaction to file
if outFilename == "" {
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
signedTxn, err := client.SignTransactionWithWallet(wh, pw, tx)
signedTxn, err := client.SignTransactionWithWalletAndSigner(wh, pw, signerAddress, tx)
if err != nil {
reportErrorf(errorSigningTX, err)
}
Expand Down Expand Up @@ -693,7 +693,7 @@ var closeOutAppCmd = &cobra.Command{
// Broadcast or write transaction to file
if outFilename == "" {
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
signedTxn, err := client.SignTransactionWithWallet(wh, pw, tx)
signedTxn, err := client.SignTransactionWithWalletAndSigner(wh, pw, signerAddress, tx)
if err != nil {
reportErrorf(errorSigningTX, err)
}
Expand Down Expand Up @@ -763,7 +763,7 @@ var clearAppCmd = &cobra.Command{
// Broadcast or write transaction to file
if outFilename == "" {
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
signedTxn, err := client.SignTransactionWithWallet(wh, pw, tx)
signedTxn, err := client.SignTransactionWithWalletAndSigner(wh, pw, signerAddress, tx)
if err != nil {
reportErrorf(errorSigningTX, err)
}
Expand Down Expand Up @@ -833,7 +833,7 @@ var callAppCmd = &cobra.Command{
// Broadcast or write transaction to file
if outFilename == "" {
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
signedTxn, err := client.SignTransactionWithWallet(wh, pw, tx)
signedTxn, err := client.SignTransactionWithWalletAndSigner(wh, pw, signerAddress, tx)
if err != nil {
reportErrorf(errorSigningTX, err)
}
Expand Down Expand Up @@ -903,7 +903,7 @@ var deleteAppCmd = &cobra.Command{
// Broadcast or write transaction to file
if outFilename == "" {
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
signedTxn, err := client.SignTransactionWithWallet(wh, pw, tx)
signedTxn, err := client.SignTransactionWithWalletAndSigner(wh, pw, signerAddress, tx)
if err != nil {
reportErrorf(errorSigningTX, err)
}
Expand All @@ -927,7 +927,6 @@ var deleteAppCmd = &cobra.Command{
err = writeDryrunReqToFile(client, tx, outFilename)
} else {
err = writeTxnToFile(client, sign, dataDir, walletName, tx, outFilename)

}
if err != nil {
reportErrorf(err.Error())
Expand Down
12 changes: 6 additions & 6 deletions cmd/goal/asset.go
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ var createAssetCmd = &cobra.Command{

if outFilename == "" {
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
signedTxn, err := client.SignTransactionWithWallet(wh, pw, tx)
signedTxn, err := client.SignTransactionWithWalletAndSigner(wh, pw, signerAddress, tx)
if err != nil {
reportErrorf(errorSigningTX, err)
}
Expand Down Expand Up @@ -377,7 +377,7 @@ var destroyAssetCmd = &cobra.Command{

if outFilename == "" {
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
signedTxn, err := client.SignTransactionWithWallet(wh, pw, tx)
signedTxn, err := client.SignTransactionWithWalletAndSigner(wh, pw, signerAddress, tx)
if err != nil {
reportErrorf(errorSigningTX, err)
}
Expand Down Expand Up @@ -470,7 +470,7 @@ var configAssetCmd = &cobra.Command{

if outFilename == "" {
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
signedTxn, err := client.SignTransactionWithWallet(wh, pw, tx)
signedTxn, err := client.SignTransactionWithWalletAndSigner(wh, pw, signerAddress, tx)
if err != nil {
reportErrorf(errorSigningTX, err)
}
Expand Down Expand Up @@ -557,7 +557,7 @@ var sendAssetCmd = &cobra.Command{

if outFilename == "" {
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
signedTxn, err := client.SignTransactionWithWallet(wh, pw, tx)
signedTxn, err := client.SignTransactionWithWalletAndSigner(wh, pw, signerAddress, tx)
if err != nil {
reportErrorf(errorSigningTX, err)
}
Expand Down Expand Up @@ -626,7 +626,7 @@ var freezeAssetCmd = &cobra.Command{

if outFilename == "" {
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
signedTxn, err := client.SignTransactionWithWallet(wh, pw, tx)
signedTxn, err := client.SignTransactionWithWalletAndSigner(wh, pw, signerAddress, tx)
if err != nil {
reportErrorf(errorSigningTX, err)
}
Expand Down Expand Up @@ -715,7 +715,7 @@ var optinAssetCmd = &cobra.Command{

if outFilename == "" {
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
signedTxn, err := client.SignTransactionWithWallet(wh, pw, tx)
signedTxn, err := client.SignTransactionWithWalletAndSigner(wh, pw, signerAddress, tx)
if err != nil {
reportErrorf(errorSigningTX, err)
}
Expand Down
23 changes: 21 additions & 2 deletions cmd/goal/clerk.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,16 @@ func writeSignedTxnsToFile(stxns []transactions.SignedTxn, filename string) erro
}

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, basics.Address{})
var authAddr basics.Address
var err error
if signerAddress != "" {
authAddr, err = basics.UnmarshalChecksumAddress(signerAddress)
if err != nil {
reportErrorf("Signer invalid (%s): %v", signerAddress, err)
}
}

stxn, err := createSignedTransaction(client, signTx, dataDir, walletName, tx, authAddr)
if err != nil {
return err
}
Expand Down Expand Up @@ -433,7 +442,17 @@ var sendCmd = &cobra.Command{
}
} else {
signTx := sign || (outFilename == "")
stx, err = createSignedTransaction(client, signTx, dataDir, walletName, payment, basics.Address{})
var authAddr basics.Address
if signerAddress != "" {
if !signTx {
reportErrorf("Signer specified when txn won't be signed")
}
authAddr, err = basics.UnmarshalChecksumAddress(signerAddress)
if err != nil {
reportErrorf("Signer invalid (%s): %v", signerAddress, err)
}
}
stx, err = createSignedTransaction(client, signTx, dataDir, walletName, payment, authAddr)
if err != nil {
reportErrorf(errorSigningTX, err)
}
Expand Down
1 change: 1 addition & 0 deletions cmd/goal/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,5 @@ func addTxnFlags(cmd *cobra.Command) {
cmd.Flags().BoolVar(&dumpForDryrun, "dryrun-dump", false, "Dump in dryrun format acceptable by dryrun REST api")
cmd.Flags().Var(&dumpForDryrunFormat, "dryrun-dump-format", "Dryrun dump format: "+dumpForDryrunFormat.AllowedString())
cmd.Flags().StringSliceVar(&dumpForDryrunAccts, "dryrun-accounts", nil, "additional accounts to include into dryrun request obj")
cmd.Flags().StringVarP(&signerAddress, "signer", "S", "", "Address of key to sign with, if different from transaction \"from\" address due to rekeying")
}
3 changes: 2 additions & 1 deletion cmd/goal/interact.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ func init() {

appExecuteCmd.Flags().Uint64Var(&appIdx, "app-id", 0, "Application ID (if omitted, zero, which creates an application)")
appExecuteCmd.Flags().StringVarP(&account, "from", "f", "", "Account to execute interaction from")
appExecuteCmd.Flags().StringVarP(&signerAddress, "signer", "S", "", "Address of key to sign with, if different from \"from\" address due to rekeying")
appExecuteCmd.Flags().SetInterspersed(false)
appExecuteCmd.MarkFlagRequired("from")
}
Expand Down Expand Up @@ -611,7 +612,7 @@ var appExecuteCmd = &cobra.Command{

if outFilename == "" {
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
signedTxn, err := client.SignTransactionWithWallet(wh, pw, tx)
signedTxn, err := client.SignTransactionWithWalletAndSigner(wh, pw, signerAddress, tx)
if err != nil {
reportErrorf(errorSigningTX, err)
}
Expand Down
3 changes: 1 addition & 2 deletions cmd/goal/messages.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,7 @@ const (
errorNameAlreadyTaken = "The account name '%s' is already taken, please choose another."
errorNameDoesntExist = "An account named '%s' does not exist."
infoSetAccountToDefault = "Set account '%s' to be the default account"
errorSigningTX = "Couldn't sign tx with kmd: %s"
errorOnlineTX = "Couldn't sign tx: %s (for multisig accounts, write tx to file and sign manually)"
errorSigningTX = "Couldn't sign tx with kmd: %s (for multisig accounts, write tx to file and sign manually)"
errorConstructingTX = "Couldn't construct tx: %s"
errorBroadcastingTX = "Couldn't broadcast tx with algod: %s"
warnMultisigDuplicatesDetected = "Warning: one or more duplicate addresses detected in multisig account creation. This will effectively give the duplicated address(es) extra signature weight. Continuing multisig account creation."
Expand Down
Loading