From 2a57e48897e9e20a9841ce8e0e458a0b5c4ae4c3 Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Thu, 1 Jul 2021 19:03:30 +0300 Subject: [PATCH 1/2] cli/sc: add sysgas option to add some gas Sometimes on-chain invocations need a bit more GAS than expected after test invocations, so let the user compensate for that. 2.x has similar option since 483fefbb628123b7fe9ecb16f13062bf93d68156. --- cli/smartcontract/smart_contract.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/cli/smartcontract/smart_contract.go b/cli/smartcontract/smart_contract.go index 677a27d06..48ec47ee1 100644 --- a/cli/smartcontract/smart_contract.go +++ b/cli/smartcontract/smart_contract.go @@ -54,7 +54,11 @@ var ( } gasFlag = flags.Fixed8Flag{ Name: "gas, g", - Usage: "gas to add to the transaction", + Usage: "network fee to add to the transaction (prioritizing it)", + } + sysGasFlag = flags.Fixed8Flag{ + Name: "sysgas, e", + Usage: "system fee to add to transaction (compensating for execution)", } outFlag = cli.StringFlag{ Name: "out", @@ -99,6 +103,7 @@ func NewCommands() []cli.Command { walletFlag, addressFlag, gasFlag, + sysGasFlag, outFlag, forceFlag, } @@ -163,7 +168,7 @@ func NewCommands() []cli.Command { { Name: "deploy", Usage: "deploy a smart contract (.nef with description)", - UsageText: "neo-go contract deploy -r endpoint -w wallet [-a address] [-g gas] --in contract.nef --manifest contract.manifest.json [--out file] [--force] [data]", + UsageText: "neo-go contract deploy -r endpoint -w wallet [-a address] [-g gas] [-e sysgas] --in contract.nef --manifest contract.manifest.json [--out file] [--force] [data]", Description: `Deploys given contract into the chain. The gas parameter is for additional gas to be added as a network fee to prioritize the transaction. The data parameter is an optional parameter to be passed to '_deploy' method. @@ -174,7 +179,7 @@ func NewCommands() []cli.Command { { Name: "invokefunction", Usage: "invoke deployed contract on the blockchain", - UsageText: "neo-go contract invokefunction -r endpoint -w wallet [-a address] [-g gas] [--out file] [--force] scripthash [method] [arguments...] [--] [signers...]", + UsageText: "neo-go contract invokefunction -r endpoint -w wallet [-a address] [-g gas] [-e sysgas] [--out file] [--force] scripthash [method] [arguments...] [--] [signers...]", Description: `Executes given (as a script hash) deployed script with the given method, arguments and signers. Sender is included in the list of signers by default with None witness scope. If you'd like to change default sender's scope, @@ -562,7 +567,7 @@ func invokeInternal(ctx *cli.Context, signAndPush bool) error { func invokeWithArgs(ctx *cli.Context, signAndPush bool, script util.Uint160, operation string, params []smartcontract.Parameter, cosigners []transaction.Signer) (util.Uint160, error) { var ( err error - gas fixedn.Fixed8 + gas, sysgas fixedn.Fixed8 cosignersAccounts []client.SignerAccount resp *result.Invoke acc *wallet.Account @@ -571,6 +576,7 @@ func invokeWithArgs(ctx *cli.Context, signAndPush bool, script util.Uint160, ope ) if signAndPush { gas = flags.Fixed8FromContext(ctx, "gas") + sysgas = flags.Fixed8FromContext(ctx, "sysgas") acc, wall, err = getAccFromContext(ctx) if err != nil { return sender, err @@ -604,7 +610,7 @@ func invokeWithArgs(ctx *cli.Context, signAndPush bool, script util.Uint160, ope fmt.Fprintln(ctx.App.Writer, errText+". Sending transaction...") } if out := ctx.String("out"); out != "" { - tx, err := c.CreateTxFromScript(resp.Script, acc, resp.GasConsumed, int64(gas), cosignersAccounts) + tx, err := c.CreateTxFromScript(resp.Script, acc, resp.GasConsumed+int64(sysgas), int64(gas), cosignersAccounts) if err != nil { return sender, cli.NewExitError(fmt.Errorf("failed to create tx: %w", err), 1) } @@ -618,7 +624,7 @@ func invokeWithArgs(ctx *cli.Context, signAndPush bool, script util.Uint160, ope if len(resp.Script) == 0 { return sender, cli.NewExitError(errors.New("no script returned from the RPC node"), 1) } - txHash, err := c.SignAndPushInvocationTx(resp.Script, acc, resp.GasConsumed, gas, cosignersAccounts) + txHash, err := c.SignAndPushInvocationTx(resp.Script, acc, resp.GasConsumed+int64(sysgas), gas, cosignersAccounts) if err != nil { return sender, cli.NewExitError(fmt.Errorf("failed to push invocation tx: %w", err), 1) } From 41e0218555261494dc9dce92e355f1f89251bfd3 Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Fri, 2 Jul 2021 11:57:54 +0300 Subject: [PATCH 2/2] cli/wallet: add sysgas to transfer functions It might also be useful there. --- cli/wallet/nep11.go | 2 ++ cli/wallet/nep17.go | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/cli/wallet/nep11.go b/cli/wallet/nep11.go index d93d3253f..bb2e0ed5a 100644 --- a/cli/wallet/nep11.go +++ b/cli/wallet/nep11.go @@ -235,6 +235,7 @@ func transferNEP11(ctx *cli.Context) error { func signAndSendNEP11Transfer(ctx *cli.Context, c *client.Client, acc *wallet.Account, token, to util.Uint160, tokenID string, amount *big.Int, data interface{}, cosigners []client.SignerAccount) error { gas := flags.Fixed8FromContext(ctx, "gas") + sysgas := flags.Fixed8FromContext(ctx, "sysgas") var ( tx *transaction.Transaction @@ -254,6 +255,7 @@ func signAndSendNEP11Transfer(ctx *cli.Context, c *client.Client, acc *wallet.Ac if err != nil { return cli.NewExitError(err, 1) } + tx.SystemFee += int64(sysgas) if outFile := ctx.String("out"); outFile != "" { if err := paramcontext.InitAndSave(c.GetNetwork(), tx, acc, outFile); err != nil { diff --git a/cli/wallet/nep17.go b/cli/wallet/nep17.go index a7595b0f3..cbf60b974 100644 --- a/cli/wallet/nep17.go +++ b/cli/wallet/nep17.go @@ -25,8 +25,12 @@ var ( Usage: "Token to use (hash or name (for NEO/GAS or imported tokens))", } gasFlag = flags.Fixed8Flag{ - Name: "gas", - Usage: "Amount of GAS to attach to a tx", + Name: "gas, g", + Usage: "network fee to add to the transaction (prioritizing it)", + } + sysGasFlag = flags.Fixed8Flag{ + Name: "sysgas, e", + Usage: "system fee to add to transaction (compensating for execution)", } baseBalanceFlags = []cli.Flag{ walletPathFlag, @@ -50,6 +54,7 @@ var ( toAddrFlag, tokenFlag, gasFlag, + sysGasFlag, cli.StringFlag{ Name: "amount", Usage: "Amount of asset to send", @@ -60,6 +65,7 @@ var ( outFlag, fromAddrFlag, gasFlag, + sysGasFlag, }, options.RPC...) ) @@ -561,11 +567,13 @@ func transferNEP(ctx *cli.Context, standard string) error { func signAndSendNEP17Transfer(ctx *cli.Context, c *client.Client, acc *wallet.Account, recipients []client.TransferTarget, cosigners []client.SignerAccount) error { gas := flags.Fixed8FromContext(ctx, "gas") + sysgas := flags.Fixed8FromContext(ctx, "sysgas") tx, err := c.CreateNEP17MultiTransferTx(acc, int64(gas), recipients, cosigners) if err != nil { return cli.NewExitError(err, 1) } + tx.SystemFee += int64(sysgas) if outFile := ctx.String("out"); outFile != "" { if err := paramcontext.InitAndSave(c.GetNetwork(), tx, acc, outFile); err != nil {