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 5 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
27 changes: 15 additions & 12 deletions cmd/goal/clerk.go
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,6 @@
dataDir := datadir.EnsureSingleDataDir()
accountList := makeAccountsList(dataDir)

var fromAddressResolved string
var program []byte = nil
var programArgs [][]byte = nil
var lsig transactions.LogicSig
Expand All @@ -381,19 +380,19 @@
lsigFromArgs(&lsig)
}
if program != nil {
ph := logic.HashProgram(program)
pha := basics.Address(ph)
fromAddressResolved = pha.String()
if account == "" {
ph := logic.HashProgram(program)
pha := basics.Address(ph)
account = pha.String()

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

View check run for this annotation

Codecov / codecov/patch

cmd/goal/clerk.go#L383-L386

Added lines #L383 - L386 were not covered by tests
}
programArgs = getProgramArgs()
} else {
// Check if from was specified, else use default
if account == "" {
account = accountList.getDefaultAccount()
}

// Resolving friendly names
fromAddressResolved = accountList.getAddressByName(account)
}
fromAddressResolved := accountList.getAddressByName(account)

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

View check run for this annotation

Codecov / codecov/patch

cmd/goal/clerk.go#L395

Added line #L395 was not covered by tests
toAddressResolved := accountList.getAddressByName(toAddress)

// Parse notes and lease fields
Expand Down Expand Up @@ -440,6 +439,14 @@
payment.Fee = basics.MicroAlgos{Raw: fee}
}

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 446 in cmd/goal/clerk.go

View check run for this annotation

Codecov / codecov/patch

cmd/goal/clerk.go#L442-L446

Added lines #L442 - L446 were not covered by tests
}
}

var stx transactions.SignedTxn
if lsig.Logic != nil {

Expand Down Expand Up @@ -472,18 +479,14 @@
Logic: program,
Args: programArgs,
},
AuthAddr: authAddr,

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

View check run for this annotation

Codecov / codecov/patch

cmd/goal/clerk.go#L482

Added line #L482 was not covered by tests
}
} else {
signTx := sign || (outFilename == "")
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 {
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