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

cmd: Improve logicsig with signer support for goal clerk send #6180

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
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
14 changes: 13 additions & 1 deletion cmd/goal/clerk.go
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,11 @@
if program != nil {
ph := logic.HashProgram(program)
pha := basics.Address(ph)
fromAddressResolved = pha.String()
if account == "" {
fromAddressResolved = pha.String()
} else {
fromAddressResolved = accountList.getAddressByName(account)

Check warning on line 389 in cmd/goal/clerk.go

View check run for this annotation

Codecov / codecov/patch

cmd/goal/clerk.go#L386-L389

Added lines #L386 - L389 were not covered by tests
}
Comment on lines +386 to +390
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The else of the program != nil test has some similar logic. It seems like each arm could assign to account if account is currently empty (in the lsig case, by hashing and such, in the non-lsig case by looking up the default), and then after the if/else we can unconditionally do fromAddressResolved = accountList.getAddressByName(account), just like the assignment to toAddressResolved is done unconditionally.

programArgs = getProgramArgs()
} else {
// Check if from was specified, else use default
Expand Down Expand Up @@ -473,6 +477,14 @@
Args: programArgs,
},
}
var authAddr basics.Address
if signerAddress != "" {
authAddr, err = basics.UnmarshalChecksumAddress(signerAddress)
if err != nil {
reportErrorf("Signer invalid (%s): %v", signerAddress, err)

Check warning on line 484 in cmd/goal/clerk.go

View check run for this annotation

Codecov / codecov/patch

cmd/goal/clerk.go#L480-L484

Added lines #L480 - L484 were not covered by tests
}
stx.AuthAddr = basics.Address(authAddr)

Check warning on line 486 in cmd/goal/clerk.go

View check run for this annotation

Codecov / codecov/patch

cmd/goal/clerk.go#L486

Added line #L486 was not covered by tests
}
Comment on lines +480 to +487
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here again, I'm hoping we can remove some conditional logic, rather than add code to the program != nil case. But here I'm less confident.

Here it seems like the code that set authAddr could be unconditionally run before the whole if/else if/else. Then the authAddr could be used here and below.

} else {
signTx := sign || (outFilename == "")
var authAddr basics.Address
Expand Down
77 changes: 77 additions & 0 deletions test/e2e-go/cli/goal/expect/goalLogicSigTest.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#!/usr/bin/expect -f
set err 0
log_user 1

if { [catch {
source goalExpectCommon.exp
set TEST_ALGO_DIR [lindex $argv 0]
set TEST_DATA_DIR [lindex $argv 1]

puts "TEST_ALGO_DIR: $TEST_ALGO_DIR"
puts "TEST_DATA_DIR: $TEST_DATA_DIR"

set TIME_STAMP [clock seconds]

set TEST_ROOT_DIR $TEST_ALGO_DIR/root
set TEST_PRIMARY_NODE_DIR $TEST_ROOT_DIR/Primary/
set NETWORK_NAME test_net_expect_$TIME_STAMP
set NETWORK_TEMPLATE "$TEST_DATA_DIR/nettemplates/TwoNodes50Each.json"

# Create network
::AlgorandGoal::CreateNetwork $NETWORK_NAME $NETWORK_TEMPLATE $TEST_ALGO_DIR $TEST_ROOT_DIR

# Start network
::AlgorandGoal::StartNetwork $NETWORK_NAME $NETWORK_TEMPLATE $TEST_ROOT_DIR

set PRIMARY_NODE_ADDRESS [ ::AlgorandGoal::GetAlgodNetworkAddress $TEST_PRIMARY_NODE_DIR ]
puts "Primary Node Address: $PRIMARY_NODE_ADDRESS"

set PRIMARY_WALLET_NAME unencrypted-default-wallet

# Determine primary account
set PRIMARY_ACCOUNT_ADDRESS [::AlgorandGoal::GetHighestFundedAccountForWallet $PRIMARY_WALLET_NAME $TEST_PRIMARY_NODE_DIR]

# rekey address to logic sig
set TEAL_PROGS_DIR "$TEST_DATA_DIR/../scripts/e2e_subs/tealprogs"
set TEAL_SOURCE "$TEST_ROOT_DIR/int1.teal"
exec cp "$TEAL_PROGS_DIR/int1.teal" $TEAL_SOURCE
set CONTRACT_ADDRESS [::AlgorandGoal::TealCompile $TEAL_SOURCE]
spawn goal clerk send -a 0 --fee 1000 -f $PRIMARY_ACCOUNT_ADDRESS -t $PRIMARY_ACCOUNT_ADDRESS --rekey-to $CONTRACT_ADDRESS -d $TEST_PRIMARY_NODE_DIR
expect {
timeout { close; ::AlgorandGoal::Abort "goal clerk send timeout" }
-re {Transaction ([A-Z0-9]+) expired before it could be included in a block} {
break;
close;
}
-re {Transaction ([A-Z0-9]+) kicked out of local node pool} {
# this is a legit possible case, so just keep iterating if we hit this one.
close;
}
-re {Couldn't broadcast tx with algod: HTTP 400 Bad Request: TransactionPool.Remember: txn dead: round ([0-9]+) outside of ([0-9]+)--([0-9]+)} {
# this is a legit possible case, so just keep iterating if we hit this one.
close;
}
eof { ::AlgorandGoal::CheckEOF "Failed to send a rekey transaction" }
}

# create transaction with logic sig and signer
set TXN_WITH_SIGNER "$TEST_ROOT_DIR/txn_with_signer.txn"
spawn goal clerk send --from-program $TEAL_SOURCE --from $PRIMARY_ACCOUNT_ADDRESS --to $PRIMARY_ACCOUNT_ADDRESS --rekey-to $PRIMARY_ACCOUNT_ADDRESS -S $CONTRACT_ADDRESS --amount 1 -d $TEST_PRIMARY_NODE_DIR -o $TXN_WITH_SIGNER
expect {
timeout { ::AlgorandGoal::Abort "Timed out Teal transaction create" }
eof { catch wait result; if { [lindex $result 3] != 0 } { ::AlgorandGoal::Abort "failed to create teal transaction: error code [lindex $result 3]"} }
}
set RAW_TRANSACTION_ID [::AlgorandGoal::RawSend $TXN_WITH_SIGNER $TEST_PRIMARY_NODE_DIR]
puts "send transaction in $RAW_TRANSACTION_ID"
puts "TxnWithSigner Test Successful"

# Shutdown the network
::AlgorandGoal::StopNetwork $NETWORK_NAME $TEST_ROOT_DIR

puts "Goal LogicSig with Signer Test Successful"

exit 0

} EXCEPTION ] } {
::AlgorandGoal::Abort "ERROR in goalLogicSigTest: $EXCEPTION"
}
2 changes: 2 additions & 0 deletions test/scripts/e2e_subs/tealprogs/int1.teal
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#pragma version 10
pushint 1
Loading