diff --git a/cmd/goal/clerk.go b/cmd/goal/clerk.go index cb41ff4e7e..0581703c0a 100644 --- a/cmd/goal/clerk.go +++ b/cmd/goal/clerk.go @@ -1163,6 +1163,10 @@ var dryrunRemoteCmd = &cobra.Command{ trace = *txnResult.LogicSigTrace } } + if txnResult.Cost != nil { + fmt.Fprintf(os.Stdout, "tx[%d] cost: %d\n", i, *txnResult.Cost) + } + fmt.Fprintf(os.Stdout, "tx[%d] messages:\n", i) for _, msg := range msgs { fmt.Fprintf(os.Stdout, "%s\n", msg) diff --git a/daemon/algod/api/algod.oas2.json b/daemon/algod/api/algod.oas2.json index fa39bf77a3..6aa5f510c2 100644 --- a/daemon/algod/api/algod.oas2.json +++ b/daemon/algod/api/algod.oas2.json @@ -1750,6 +1750,10 @@ "items": { "$ref": "#/definitions/LogItem" } + }, + "cost": { + "description": "Execution cost of app call transaction", + "type": "integer" } } }, diff --git a/daemon/algod/api/algod.oas3.yml b/daemon/algod/api/algod.oas3.yml index 46e157c138..5d3b1dc892 100644 --- a/daemon/algod/api/algod.oas3.yml +++ b/daemon/algod/api/algod.oas3.yml @@ -1247,6 +1247,10 @@ }, "type": "array" }, + "cost": { + "description": "Execution cost of app call transaction", + "type": "integer" + }, "disassembly": { "description": "Disassembled program line by line.", "items": { diff --git a/daemon/algod/api/server/v2/dryrun.go b/daemon/algod/api/server/v2/dryrun.go index 5a76d6fd2e..71dffc9c17 100644 --- a/daemon/algod/api/server/v2/dryrun.go +++ b/daemon/algod/api/server/v2/dryrun.go @@ -397,16 +397,32 @@ func doDryrunRequest(dr *DryrunRequest, response *generated.DryrunResponse) { return } proto := config.Consensus[protocol.ConsensusVersion(dr.ProtocolVersion)] + origEnableAppCostPooling := proto.EnableAppCostPooling + // Enable EnableAppCostPooling so that dryrun + // 1) can determine cost 2) reports actual cost for large programs that fail + proto.EnableAppCostPooling = true + + // allow a huge execution budget + maxCurrentBudget := uint64(proto.MaxAppProgramCost * 100) + pooledAppBudget := maxCurrentBudget + allowedBudget := uint64(0) + cumulativeCost := uint64(0) + for _, stxn := range dr.Txns { + if stxn.Txn.Type == protocol.ApplicationCallTx { + allowedBudget += uint64(proto.MaxAppProgramCost) + } + } response.Txns = make([]generated.DryrunTxnResult, len(dr.Txns)) for ti, stxn := range dr.Txns { pse := logic.MakePastSideEffects(len(dr.Txns)) ep := logic.EvalParams{ - Txn: &stxn, - Proto: &proto, - TxnGroup: dr.Txns, - GroupIndex: ti, - PastSideEffects: pse, + Txn: &stxn, + Proto: &proto, + TxnGroup: dr.Txns, + GroupIndex: ti, + PastSideEffects: pse, + PooledApplicationBudget: &pooledAppBudget, } var result generated.DryrunTxnResult if len(stxn.Lsig.Logic) > 0 { @@ -522,6 +538,23 @@ func doDryrunRequest(dr *DryrunRequest, response *generated.DryrunResponse) { result.LocalDeltas = &localDeltas } + // ensure the program has not exceeded execution budget + cost := maxCurrentBudget - pooledAppBudget + if pass { + if !origEnableAppCostPooling { + if cost > uint64(proto.MaxAppProgramCost) { + pass = false + err = fmt.Errorf("cost budget exceeded: budget is %d but program cost was %d", proto.MaxAppProgramCost, cost) + } + } else if cumulativeCost+cost > allowedBudget { + pass = false + err = fmt.Errorf("cost budget exceeded: budget is %d but program cost was %d", allowedBudget-cumulativeCost, cost) + } + } + result.Cost = &cost + maxCurrentBudget = pooledAppBudget + cumulativeCost += cost + var err3 error result.Logs, err3 = DeltaLogToLog(delta.Logs, appIdx) if err3 != nil { diff --git a/daemon/algod/api/server/v2/dryrun_test.go b/daemon/algod/api/server/v2/dryrun_test.go index c926934dd6..6bcf2c9051 100644 --- a/daemon/algod/api/server/v2/dryrun_test.go +++ b/daemon/algod/api/server/v2/dryrun_test.go @@ -34,6 +34,7 @@ import ( "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/data/transactions/logic" "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/test/partitiontest" ) func unB64(x string) []byte { @@ -126,7 +127,8 @@ func logResponse(t *testing.T, response *generated.DryrunResponse) { } } -var dryrunProtoVersion protocol.ConsensusVersion = "dryrunTestProto" +var dryrunProtoVersion protocol.ConsensusVersion = protocol.ConsensusFuture +var dryrunMakeLedgerProto protocol.ConsensusVersion = "dryrunMakeLedgerProto" func TestDryrunLogicSig(t *testing.T) { // {"txns":[{"lsig":{"l":"AiABASI="},"txn":{}}]} @@ -353,7 +355,7 @@ func init() { proto.MaxAppBytesValueLen = 64 proto.MaxAppSumKeyValueLens = 128 - config.Consensus[dryrunProtoVersion] = proto + config.Consensus[dryrunMakeLedgerProto] = proto } func checkLogicSigPass(t *testing.T, response *generated.DryrunResponse) { @@ -1201,3 +1203,117 @@ return assert.NotContains(t, encoded, "logs") } + +func TestDryrunCost(t *testing.T) { + partitiontest.PartitionTest(t) + t.Parallel() + + var tests = []struct { + msg string + numHashes int + }{ + {"REJECT", 12}, + {"PASS", 5}, + } + + for _, test := range tests { + t.Run(test.msg, func(t *testing.T) { + costs := make([]uint64, 2) + + ops, err := logic.AssembleString("#pragma version 5\nbyte 0x41\n" + strings.Repeat("keccak256\n", test.numHashes) + "pop\nint 1\n") + require.NoError(t, err) + approval := ops.Program + costs[0] = 3 + uint64(test.numHashes)*130 + + ops, err = logic.AssembleString("int 1") + require.NoError(t, err) + clst := ops.Program + + ops, err = logic.AssembleString("#pragma version 5 \nint 1 \nint 2 \npop") + require.NoError(t, err) + approv := ops.Program + costs[1] = 3 + + var appIdx basics.AppIndex = 1 + creator := randomAddress() + sender := randomAddress() + dr := DryrunRequest{ + Txns: []transactions.SignedTxn{ + { + Txn: transactions.Transaction{ + Header: transactions.Header{Sender: sender}, + Type: protocol.ApplicationCallTx, + ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ + ApplicationID: appIdx, + OnCompletion: transactions.OptInOC, + }, + }, + }, + { + Txn: transactions.Transaction{ + Header: transactions.Header{Sender: sender}, + Type: protocol.ApplicationCallTx, + ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ + ApplicationID: appIdx + 1, + OnCompletion: transactions.OptInOC, + }, + }, + }, + }, + Apps: []generated.Application{ + { + Id: uint64(appIdx), + Params: generated.ApplicationParams{ + Creator: creator.String(), + ApprovalProgram: approval, + ClearStateProgram: clst, + LocalStateSchema: &generated.ApplicationStateSchema{NumByteSlice: 1}, + }, + }, + { + Id: uint64(appIdx + 1), + Params: generated.ApplicationParams{ + Creator: creator.String(), + ApprovalProgram: approv, + ClearStateProgram: clst, + LocalStateSchema: &generated.ApplicationStateSchema{NumByteSlice: 1}, + }, + }, + }, + Accounts: []generated.Account{ + { + Address: sender.String(), + Status: "Online", + Amount: 10000000, + }, + }, + } + dr.ProtocolVersion = string(dryrunProtoVersion) + var response generated.DryrunResponse + doDryrunRequest(&dr, &response) + require.Empty(t, response.Error) + require.Equal(t, 2, len(response.Txns)) + + for i, txn := range response.Txns { + messages := *txn.AppCallMessages + require.GreaterOrEqual(t, len(messages), 1) + require.NotNil(t, *txn.Cost) + require.Equal(t, costs[i], *txn.Cost) + statusMatches := false + costExceedFound := false + for _, msg := range messages { + if strings.Contains(msg, "cost budget exceeded") { + costExceedFound = true + } + if msg == test.msg { + statusMatches = true + } + } + if test.msg == "REJECT" { + require.True(t, costExceedFound, "budget error not found in messages") + } + require.True(t, statusMatches, "expected status not found in messages") + } + }) + } +} diff --git a/daemon/algod/api/server/v2/generated/private/routes.go b/daemon/algod/api/server/v2/generated/private/routes.go index 6cebc1644a..b1265860b9 100644 --- a/daemon/algod/api/server/v2/generated/private/routes.go +++ b/daemon/algod/api/server/v2/generated/private/routes.go @@ -235,138 +235,139 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "AAA=", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/daemon/algod/api/server/v2/generated/private/types.go b/daemon/algod/api/server/v2/generated/private/types.go index b436e9c902..f1b7847c2c 100644 --- a/daemon/algod/api/server/v2/generated/private/types.go +++ b/daemon/algod/api/server/v2/generated/private/types.go @@ -299,6 +299,9 @@ type DryrunTxnResult struct { AppCallMessages *[]string `json:"app-call-messages,omitempty"` AppCallTrace *[]DryrunState `json:"app-call-trace,omitempty"` + // Execution cost of app call transaction + Cost *uint64 `json:"cost,omitempty"` + // Disassembled program line by line. Disassembly []string `json:"disassembly"` diff --git a/daemon/algod/api/server/v2/generated/routes.go b/daemon/algod/api/server/v2/generated/routes.go index 3b870f435d..1d4bd8824e 100644 --- a/daemon/algod/api/server/v2/generated/routes.go +++ b/daemon/algod/api/server/v2/generated/routes.go @@ -723,75 +723,75 @@ var swaggerSpec = []string{ "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", - "S8kuMdP/++v/HwAA//96ww9J5PoAAA==", + "ojIM3Oykg40xDsO4fSLltgDoH4O+TmS7a0ntybmJJBp68JKKmL75ClMiWQ3X5oagZUlSfEEayIuoRZMp", + "c3kqZnkk9u24/hjkWMYg29ka/41l7BhGifOI3zr/FXa8scK6NRcVSxPFFrfc5qb/ve6zT5F1t2RWncMZ", + "7nXsWL4y/C58vNhL4mI5Yv22EOOHhM+cj7ed+lVM+zAhB47eJpsk6Jtv08PpzMfIsweiCH9pns1TKxas", + "c2AoljAdDH2l2sW1a0o2JZezOchjI9hABJv73NYRixpGhoIPbOyB+dzrvZtC01MPceyNCPVRLX2A/upD", + "5khJmfN8NUetj1kXXNsPd94l7K7Z4O4iXMgqDhJbiT8bGwMzX4vFTpGGPi4ijL7cHB1xGUce6eSvz8XC", + "F43YIS/IxgXfMqR2J0bTJ4sI6wqDobacx4sWDdm3dx2dXki4Z1oKlJkb0lI/zGvX5eE68IhUCvrr3HkD", + "WrgdwP0uiG8YYR+5w/xLz3bhX/EnTKY7MlCLEP/Irn9iPhn7a9WKcPPGdv1vQ3Yca6sYMBl2cFqxPNu2", + "uS0DcJPEAk2cvzlT+WdJo/Gb5YX94+YyCtxEY+puAiImstbW5MFUgWl3B6uu6xax4WLWybSSTK8xWtHr", + "/Oy36CuQH4C7ihmuAFEd8+FCDmztO+eBWNStm3JlPwhbQqQwFxHUoTWmY3u1okWZgzsX3z6Y/QWefvMs", + "O3j6+C+zbw6eH6Tw7PmLgwP64hl9/OLpY3jyzfNnB/B4/vWL2ZPsybMns2dPnn39/EX69Nnj2bOvX/zl", + "ga8VZgFt6nD9HXPNJEdvT5IzA2yDE1qyv8LaZpcwZOzzVtAUTyIUlOWjQ//T//InbJKKIihv7H4dOXfU", + "aKl1qQ6n06urq0nYZbrA9MWJFlW6nPp5+tnv3p7UpnIb4oQ7aq2ghhRwUx0pHOG3X16dnpGjtyeThmBG", + "h6ODycHkMaaHKoHTko0OR0/xJzw9S9z3qSO20eGH6/FougSa66X7owAtWeo/qSu6WICcuAQe5qfLJ1Nv", + "aZt+cGE912bURSyO0yf1rC29/bwWY2s6wvubT+IZPJ1U7kXlmMxsxCJxeWR5hrZYG41mWFuNrJMsKKYe", + "VO0at2rBv/uCypvGMkzGEoTECtbXb3qGCxYGNZ19Hefn31xHdLP3nSJ0Tw4OPkLhuXFrFI+XW1awe3aP", + "ILavjHcGtDtcjyv8RHNDN1AXJR7hgh5/sQs64fh6zrAtYtny9Xj0/AveoRNuDg7NCbYMgub6rPBXfsHF", + "FfctjUiuioLKNQrcIG1HqFpdD7Lcdriqe/88zIchyHUapExouRhma09nY6LqwhulZMIoDljCO4NUAkUx", + "LyR65pqsqe5hONhKIz8d/R3t+D8d/d2mI46WNw6mt6m520z8B9CRrL7frZsSnRs5+udik+M/bEXoL0fm", + "3VXU7HNDf7G5oXdg2vvd3Wf+/mIzf3/ZKumqfmpACRc84ZhC5hJIYNba66h/aB31+cHTL3Y1pyAvWQrk", + "DIpSSCpZvia/8jo2624qeM1zKh5Ey23kP706N40WHajvQTq76YdWka9su/Gk7YFpVTuh8SLpQaYvF5c7", + "bh71U57ZmBrv5FZj/7gdrXU2i4Tdj3Hv6fskpqQHrpbv1ifHu+jlQ16lmG7ewtdGFb0ntD6qxeLWBew/", + "pgTowfEdzYgP3v3IvHk3Zvrs4NmngyDchTdCk+8x3O8js/SPaieIk1XAbDBl5PSDf567A4NxT9/brMUV", + "1tvIVMwJHbv3OC45f13my/ATywht9oE+1zAz7Mov+q/zY5yieZH8R+ERNmVmhC676N3zhT1fuBNf6BJU", + "wxFsBezpBwx1DtlB70hieZg/kaMkyFUqReGTZQkyB50ubc2Dri87wlZ8iPgwT9n0kPrO/KXjXcct6j8k", + "w7U4fy0+8N2xnB92/NG6T6/HoxRkhPh+9mFv5jObYzLQOvzf5wvAR3N1hff69Zx7Y8wUMQSqhY/9IWYX", + "bwTly2byvm8d0XI7a9IewXdBcI+pvXJxXvZ4uUV86YaPQFqShLxBdQgPuI9+/zOaPT6mRP7YC3ojOBBY", + "MYU5jC0t7t2NtbpQF8OrK+SEdU4GVIe20/GDXrHselqXyxtSKt66qm4blYpGUrMmqWXbvELLEqhUtxbS", + "291hZ50ZT47DpLuiDnUitCmaFwHF4OWGnsR/38WN+Of11u0rO+4rO96usuMnvTI3ATmWVXk/kexwjc96", + "n9af5T79RvAEpS1w7TW/Flo+390a3/G0ql/45+Jc2JqSQqKSEPIBNdlJvMKgK6HFVDCkc5iMnbBNqU6X", + "VTn9gP/BYNDrJuzS5kaYWjPbJnlra2iO7jWAYl/39Auoe/r5TXh3Ukc7q5VQ1kFo6K1H+m9Oi6830E/C", + "345Mds3VstKZuArimJu6LoMnyba415P0RmRgx23H8vdz/VBbZ195IDoHqOYR8TSPHptNO5uAgCkyAzTi", + "02qx1DbPWzSJZN0xoakl/MReB+ITNkETtpUrKokFW3MJNFuTGQAnYmYW3ewrLrJTmcZxwng6nwauUooU", + "lIIsCRO8bAKtjipHe6DegCcEHAGuZyFKkDmVtwTWsoTNgHYzm9Xg1lYfd+r7UO82/aYN7E4ebiOV0BRb", + "1QKjanJwhfciKNwRJ6iqso+8f36S225fVWIOkUgFZvv1jBX4zI1TLhSkgmcqOhiWD9l2bLFybrAWBTZt", + "pj8pn7JCr613MvQizIwcLz1t11DXOaqz+1hNC7Jo4kRYbZjrDazqucQ8VtvaJnXdNvIQloLx63w/urZI", + "UB1YJMxwkcVdsTxH32xc72gB0SBiEyCnvlWA3fDaPwAIUw2i6/pTbcoJEq4qLcrSnD+dVLzuN4SmU9v6", + "SP/atO0TlwsER76eCVChmu0gv7KYtam8llQRBwcp6IXT0BcuHrsPszmMiWI8dRV5hurUsQJOTavwCGw5", + "pF0lLzz+nZLOrcPRod8o0Q0SwZZdGFpwTK38QyiBN73lde0HH9Hs2VarA/WqUSvt39MrynQyF9JKzAST", + "RUc8qO3Z/5My7VKUuzuwFs5s6dJNW4bixgkS2akwmNXVEHTnyOx+P37CTPW9kDs5bBvbqhbELIxUXDP/", + "3A5rzXod84/n/dxrz3vtea8977Xnvfa815732vNee/7Y2vPnicAkSeL5tH9eE3tcQ0ZfpIb/Bb1f+ZQP", + "Thqlv1b58ZJgVHRzjjdGZmig+dSlj0UXejRZog3xDlPRpmY6xkmZU6xDs9L+oXE3T5fPgWhzIBleYxo8", + "fUJOfzx6/vjJb0+ef224j61+3Gr70BeHUHqdwyMXwVYnOPGhbMApJlvESDbqbz+pj3Kw2vyc5UCUQdYr", + "bH4Ml5AbVd76Oom5jPSvR2dA85cOOZYrgdLfiWzdIRyz/imiok0yjcOccSojCVH7hNJDshaYFNll+O3d", + "oK7vNWYiHifQ37BtezVQCyRK3pvoZWtcgMtl78bexUdm9tSjk7hkqp+VZROEyJFZw57+MJH03cKB7uBg", + "W6NVuPP3pUa9e8RHDx4e27GhyaxKAWtQO4pbJabRAnji2EIyE9naFw10uZlbXNYmzR1msjYjLbiU3+4Y", + "PFSPXLl/TP4dmnqiRQuCAh/gM9x+JsZp07Vu5Ju3p452NYk7x0x2h+tzjSDo4qGQZCFFVT6y5en4Gq/E", + "RUn52pvBjK6I5ShMBxvnfb+cuk7F3eOzu1dTCO8r+Gi/+7tFC7miypdSyGwthXgWw27G/+0Yb/JZb8t6", + "Z9cbzb0/kGm/v4l+l12gY236K0EmesUjGbA7+a73j6v+R4iEt1JcMnNxjnLYfhRWwxAmWyWDDFgWioZO", + "qg0vG9r89Bd6ddbKSr4bT10lTvG8s1a6BFsG2mtpkbwkRl5KQbOUKnw/4oqUfGSNVa9OInYHBBPzS/Uj", + "fY0An2xVLHHcnfTJdqS3mxATwCibSPPzapdNtOmRe67TwsbeFPBnMQV85w+fIpRIetU9nEHhoB3YFL3S", + "Kx7lUtOmfHk04i04EHW943v03fWGb7vwgsLC1gUBeUkoSXOGDgrBlZZVqs85RRNoWNC5797zht1hVeql", + "bxK3wkeM5G6oc06x2GRtGI2qVHOIldEB8BqbqhYLULrDiecA59y1YrwpbFmwVIrExn0acW04+sS2LOia", + "zLH4hSC/gxRkZm4RYc4SNCgqzfLc+RPNNETMzznVJAfD9H9iRqEzw3mbU+0jdwWrPBbiDytcRtmBGrU/", + "2K/4aMEt39uN0LxlP/to6PHnyfscLT3vID85dvnETo4xRUzjSezB/sncSwXjSZTIjMR3HvkubZGHrt4x", + "EtCjxifpdv2cG2VaC4KMnurbkUPXDdA7i/Z0dKimtREdb4Ff6/vYW9aFSMyVEetqjBZML6sZZl72b1yn", + "C1G/d51mFArB8Vs2pSWbqhLS6eXjLfrBHfgVibCrveT+8xjxuwXx6403Smxv7wfk8j2kb/1j52zdGqK0", + "z5C6z5C6z6G5z5C63919htR9/tB9/tD/qflDJxs1RJdzY2tGv9ZLY6zTS4mE1M5cM/CwWSv3X98tyfSE", + "kLOl4f/UyAC4BElzklJlFSNuI+UKtlhqoqo0BcgOz3nSgsRWsTcTP2z+a6+559XBwVMgB4+6fazdIuC8", + "/b6oquInW7HxW3I+Oh/1RpJQiEtwmcCweVahr9j22jrsv9Tj/ix7W1fQtTWuLGlZghFrqprPWcosynNh", + "LgML0Ynv4wK/gDTA2UQThGmbdBXxiXGRLjqHutfmMaW7L99vUPjmqEMu+6QmH0PBPgZNWa7q1wmR+xTe", + "bLqUdUVVc3RrruLTGYDyvzmHtZslZxcQxuBi9MEVlZlvES0B3KTZ9SWu+6aldv7RDFZeJegCPa9nZtpm", + "DDUXzl4pwL5ly2bxTHNh7qyJLfC0LbIdK0aZfg8UWk3tQUN9FeGag3Sx92jNyoWCRIsmU/MwHJtQ4VIu", + "3gYJajBJjQXO7paKlTbED4YlolWYolEYkdpZoGEq1EAn8RmSjf0fnnMTsl/a767aVm0V7NjgI+N6eh0M", + "M65J9AqFC3K9LhJDqp8TlyFhwBBtqy7bQI5b117udO9VZ8yz8/P35LXNlI2lRS9gPbVF7dIl5QtQNY7C", + "82KfDtnwniC+vIPGe633HC9umS/sAhYfHc7Bcs3jkZGtyUBh+pN+RHyXKi5YegEZMdwUGYAL1I9cdcjD", + "OinxnKGcWftXLlZYP5oQcsQJFKVeE8v/Oxb5zuT8gd40/ypUL9pyOxJcmQK7BHnHE++H2XzOFRh2cMep", + "7CCbJ9IrPnDY6VXk4r9rlsrIPb9z6w6IykJxH+aTvezey+697N7L7r3s3svuvez+rLK7Z9Dbm7w+hcnr", + "sxu9/kT5w/epwv9gCwoDgVu1QO7gCagrnsfuCs7G78v8H34IK/Sjhbauzf/u/fV7801eeuNtU3D+cDpF", + "nWcplJ6OrscfOsXow4+GldKFHcEZR0vJLjHT//vr/x8AAP//Iyp6IzX7AAA=", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/daemon/algod/api/server/v2/generated/types.go b/daemon/algod/api/server/v2/generated/types.go index 08c8d0f2ba..f36c3733a6 100644 --- a/daemon/algod/api/server/v2/generated/types.go +++ b/daemon/algod/api/server/v2/generated/types.go @@ -299,6 +299,9 @@ type DryrunTxnResult struct { AppCallMessages *[]string `json:"app-call-messages,omitempty"` AppCallTrace *[]DryrunState `json:"app-call-trace,omitempty"` + // Execution cost of app call transaction + Cost *uint64 `json:"cost,omitempty"` + // Disassembled program line by line. Disassembly []string `json:"disassembly"` diff --git a/test/e2e-go/cli/goal/expect/goalDryrunRestTest.exp b/test/e2e-go/cli/goal/expect/goalDryrunRestTest.exp index 0d580723a9..75d81faeba 100644 --- a/test/e2e-go/cli/goal/expect/goalDryrunRestTest.exp +++ b/test/e2e-go/cli/goal/expect/goalDryrunRestTest.exp @@ -4,13 +4,18 @@ log_user 1 proc TestGoalDryrun { DRREQ_FILE TEST_PRIMARY_NODE_DIR } { set PASSED 0 + set COST 0 set PROGRAM_TYPE "" spawn goal clerk dryrun-remote -d $TEST_PRIMARY_NODE_DIR -D $DRREQ_FILE -v expect { timeout { ::AlgorandGoal::Abort "goal clerk dryrun-remote timeout" } + "cost:" {set COST 1; exp_continue} -re {(ApprovalProgram)} {set PROGRAM_TYPE $expect_out(1,string); exp_continue} "PASS" {set PASSED 1; close} } + if { $COST == 0 } { + ::AlgorandGoal::Abort "Response does not have cost" + } if { $PASSED == 0 } { ::AlgorandGoal::Abort "Program did not pass" }