diff --git a/action/protocol/execution/evm/evmstatedbadapter_test.go b/action/protocol/execution/evm/evmstatedbadapter_test.go index 1e5ed969d5..6d8a81eba4 100644 --- a/action/protocol/execution/evm/evmstatedbadapter_test.go +++ b/action/protocol/execution/evm/evmstatedbadapter_test.go @@ -9,6 +9,7 @@ import ( "bytes" "context" "math/big" + "strings" "testing" "github.com/ethereum/go-ethereum/common" @@ -947,19 +948,19 @@ func TestSortMap(t *testing.T) { caches := []string{} for i := 0; i < size; i++ { stateDB.RevertToSnapshot(sn) - s := "" + var s strings.Builder if stateDB.disableSortCachedContracts { for _, c := range stateDB.cachedContract { - s += string(c.SelfState().Root[:]) + s.WriteString(string(c.SelfState().Root[:])) } } else { for _, addr := range stateDB.cachedContractAddrs() { c := stateDB.cachedContract[addr] - s += string(c.SelfState().Root[:]) + s.WriteString(string(c.SelfState().Root[:])) } } - caches = append(caches, s) + caches = append(caches, s.String()) } return uniqueSlice(caches) } diff --git a/ioctl/client.go b/ioctl/client.go index 91bd3206aa..645c3eacb2 100644 --- a/ioctl/client.go +++ b/ioctl/client.go @@ -440,10 +440,11 @@ func (c *client) Insecure() bool { } func (m *ConfirmationMessage) String() string { - line := fmt.Sprintf("%s\nOptions:", m.Info) + var line strings.Builder + line.WriteString(fmt.Sprintf("%s\nOptions:", m.Info)) for _, option := range m.Options { - line += " " + option + line.WriteString(" " + option) } - line += "\nQuit for anything else." - return line + line.WriteString("\nQuit for anything else.") + return line.String() } diff --git a/ioctl/cmd/action/actionhash.go b/ioctl/cmd/action/actionhash.go index 50fc3cd607..5c3aa0badc 100644 --- a/ioctl/cmd/action/actionhash.go +++ b/ioctl/cmd/action/actionhash.go @@ -12,6 +12,7 @@ import ( "log" "math/big" "strconv" + "strings" "github.com/grpc-ecosystem/go-grpc-middleware/util/metautils" "github.com/iotexproject/go-pkgs/crypto" @@ -167,20 +168,21 @@ func printActionProto(act *iotextypes.Action) (string, error) { } //ioctl action should display IOTX unit instead Raul core := act.Core - result := fmt.Sprintf("\nversion: %d ", core.GetVersion()) + + var result strings.Builder + result.WriteString(fmt.Sprintf("\nversion: %d ", core.GetVersion()) + fmt.Sprintf("txType: %d ", core.GetTxType()) + fmt.Sprintf("nonce: %d ", core.GetNonce()) + fmt.Sprintf("gasLimit: %d ", core.GasLimit) + fmt.Sprintf("chainID: %d ", core.GetChainID()) + fmt.Sprintf("encoding: %d\n", act.GetEncoding()) + fmt.Sprintf("senderAddress: %s %s\n", senderAddress.String(), - Match(senderAddress.String(), "address")) + Match(senderAddress.String(), "address"))) if len(core.GasPrice) > 0 { gasPriceUnitIOTX, err := util.StringToIOTX(core.GasPrice) if err != nil { return "", output.NewError(output.ConfigError, "failed to convert string to IOTX", err) } - result += fmt.Sprintf("gasPrice: %s IOTX \n", gasPriceUnitIOTX) + result.WriteString(fmt.Sprintf("gasPrice: %s IOTX \n", gasPriceUnitIOTX)) } if len(core.GetGasFeeCap()) > 0 { feeCapIOTX, err := util.StringToIOTX(core.GetGasFeeCap()) @@ -191,28 +193,28 @@ func printActionProto(act *iotextypes.Action) (string, error) { if err != nil { return "", output.NewError(output.ConfigError, "failed to convert string to IOTX", err) } - result += fmt.Sprintf("gasFeeCap: %s IOTX ", feeCapIOTX) + - fmt.Sprintf("gasTipCap: %s IOTX \n", tipCapIOTX) + result.WriteString(fmt.Sprintf("gasFeeCap: %s IOTX ", feeCapIOTX) + + fmt.Sprintf("gasTipCap: %s IOTX \n", tipCapIOTX)) } if len(core.GetAccessList()) > 0 { - result += "accessList: <\n" + result.WriteString("accessList: <\n") for _, access := range core.GetAccessList() { - result += fmt.Sprintf(" address: %s %s\n", access.Address, - Match(access.Address, "address")) - result += " storageKeys: <\n" + result.WriteString(fmt.Sprintf(" address: %s %s\n", access.Address, + Match(access.Address, "address"))) + result.WriteString(" storageKeys: <\n") for _, key := range access.StorageKeys { - result += fmt.Sprintf(" %s\n", key) + result.WriteString(fmt.Sprintf(" %s\n", key)) } - result += " >\n" + result.WriteString(" >\n") } - result += ">\n" + result.WriteString(">\n") } if core.BlobTxData != nil { - result += fmt.Sprintf("blob hashes: <\n") + result.WriteString(fmt.Sprintf("blob hashes: <\n")) for _, hash := range core.BlobTxData.BlobHashes { - result += fmt.Sprintf(" %x\n", hash) + result.WriteString(fmt.Sprintf(" %x\n", hash)) } - result += ">\n" + result.WriteString(">\n") } switch { @@ -222,50 +224,50 @@ func printActionProto(act *iotextypes.Action) (string, error) { if err != nil { return "", output.NewError(output.ConvertError, "failed to convert string into IOTX amount", err) } - result += "transfer: <\n" + + result.WriteString("transfer: <\n" + fmt.Sprintf(" recipient: %s %s\n", transfer.Recipient, Match(transfer.Recipient, "address")) + - fmt.Sprintf(" amount: %s IOTX\n", amount) + fmt.Sprintf(" amount: %s IOTX\n", amount)) if len(transfer.Payload) != 0 { - result += fmt.Sprintf(" payload: %s\n", transfer.Payload) + result.WriteString(fmt.Sprintf(" payload: %s\n", transfer.Payload)) } - result += ">\n" + result.WriteString(">\n") case core.GetExecution() != nil: execution := core.GetExecution() - result += "execution: <\n" + + result.WriteString("execution: <\n" + fmt.Sprintf(" contract: %s %s\n", execution.Contract, - Match(execution.Contract, "address")) + Match(execution.Contract, "address"))) if execution.Amount != "0" { amount, err := util.StringToIOTX(execution.Amount) if err != nil { return "", output.NewError(output.ConvertError, "failed to convert string into IOTX amount", err) } - result += fmt.Sprintf(" amount: %s IOTX\n", amount) + result.WriteString(fmt.Sprintf(" amount: %s IOTX\n", amount)) } - result += fmt.Sprintf(" data: %x\n", execution.Data) + ">\n" + result.WriteString(fmt.Sprintf(" data: %x\n", execution.Data) + ">\n") case core.GetPutPollResult() != nil: putPollResult := core.GetPutPollResult() - result += "putPollResult: <\n" + + result.WriteString("putPollResult: <\n" + fmt.Sprintf(" height: %d\n", putPollResult.Height) + - " candidates: <\n" + " candidates: <\n") for _, candidate := range putPollResult.Candidates.Candidates { - result += " candidate: <\n" + - fmt.Sprintf(" address: %s\n", candidate.Address) + result.WriteString(" candidate: <\n" + + fmt.Sprintf(" address: %s\n", candidate.Address)) votes := big.NewInt(0).SetBytes(candidate.Votes) - result += fmt.Sprintf(" votes: %s\n", votes.String()) + + result.WriteString(fmt.Sprintf(" votes: %s\n", votes.String()) + fmt.Sprintf(" rewardAdress: %s\n", candidate.RewardAddress) + - " >\n" + " >\n") } - result += " >\n" + - ">\n" + result.WriteString(" >\n" + + ">\n") default: bs, _ := protoV1.Marshal(core) - result += string(bs) + result.WriteString(string(bs)) } - result += fmt.Sprintf("senderPubKey: %x\n", act.SenderPubKey) + - fmt.Sprintf("signature: %x\n", act.Signature) + result.WriteString(fmt.Sprintf("senderPubKey: %x\n", act.SenderPubKey) + + fmt.Sprintf("signature: %x\n", act.Signature)) - return result, nil + return result.String(), nil } func printReceiptProto(receipt *iotextypes.Receipt) string { @@ -310,23 +312,24 @@ func printReceiptProto(receipt *iotextypes.Receipt) string { } func printLogs(logs []*iotextypes.Log) string { - result := "logs:<\n" + var result strings.Builder + result.WriteString("logs:<\n") for _, l := range logs { - result += " <\n" + + result.WriteString(" <\n" + fmt.Sprintf(" contractAddress: %s\n", l.ContractAddress) + - " topics:<\n" + " topics:<\n") for _, topic := range l.Topics { - result += fmt.Sprintf(" %s\n", hex.EncodeToString(topic)) + result.WriteString(fmt.Sprintf(" %s\n", hex.EncodeToString(topic))) } - result += " >\n" + result.WriteString(" >\n") if len(l.Data) > 0 { - result += fmt.Sprintf(" data: %s\n", hex.EncodeToString(l.Data)) + result.WriteString(fmt.Sprintf(" data: %s\n", hex.EncodeToString(l.Data))) } - result += " >\n" + result.WriteString(" >\n") } - result += ">\n" - return result + result.WriteString(">\n") + return result.String() } // Match returns human readable expression diff --git a/ioctl/cmd/alias/aliasimport.go b/ioctl/cmd/alias/aliasimport.go index 8805672da6..0f7c055577 100644 --- a/ioctl/cmd/alias/aliasimport.go +++ b/ioctl/cmd/alias/aliasimport.go @@ -9,6 +9,7 @@ import ( "encoding/json" "fmt" "os" + "strings" "github.com/spf13/cobra" yaml "gopkg.in/yaml.v2" @@ -106,11 +107,12 @@ func aliasImport(cmd *cobra.Command, args []string) error { func (m *importMessage) String() string { if output.Format == "" { - line := fmt.Sprintf("%d/%d aliases imported\nExisted aliases:", m.ImportedNumber, m.TotalNumber) + var line strings.Builder + line.WriteString(fmt.Sprintf("%d/%d aliases imported\nExisted aliases:", m.ImportedNumber, m.TotalNumber)) for _, alias := range m.Unimported { - line += fmt.Sprint(" " + alias.Name) + line.WriteString(fmt.Sprint(" " + alias.Name)) } - return line + return line.String() } return output.FormatString(output.Result, m) } diff --git a/ioctl/newcmd/action/actionhash.go b/ioctl/newcmd/action/actionhash.go index 7db289dd26..d129e2431b 100644 --- a/ioctl/newcmd/action/actionhash.go +++ b/ioctl/newcmd/action/actionhash.go @@ -12,6 +12,7 @@ import ( "log" "math/big" "strconv" + "strings" "github.com/grpc-ecosystem/go-grpc-middleware/util/metautils" "github.com/iotexproject/go-pkgs/crypto" @@ -169,14 +170,15 @@ func printActionProto(client ioctl.Client, action *iotextypes.Action) (string, e if err != nil { return "", errors.Wrap(err, "failed to convert string to IOTX") } - result := fmt.Sprintf("\nversion: %d ", core.GetVersion()) + + var result strings.Builder + result.WriteString(fmt.Sprintf("\nversion: %d ", core.GetVersion()) + fmt.Sprintf("nonce: %d ", core.GetNonce()) + fmt.Sprintf("gasLimit: %d ", core.GasLimit) + fmt.Sprintf("gasPrice: %s IOTX ", gasPriceUnitIOTX) + fmt.Sprintf("chainID: %d ", core.GetChainID()) + fmt.Sprintf("encoding: %d\n", action.GetEncoding()) + fmt.Sprintf("senderAddress: %s %s\n", senderAddress.String(), - Match(client, senderAddress.String(), "address")) + Match(client, senderAddress.String(), "address"))) switch { case core.GetTransfer() != nil: transfer := core.GetTransfer() @@ -184,53 +186,53 @@ func printActionProto(client ioctl.Client, action *iotextypes.Action) (string, e if err != nil { return "", errors.Wrap(err, "failed to convert string into IOTX amount") } - result += "transfer: <\n" + + result.WriteString("transfer: <\n" + fmt.Sprintf(" recipient: %s %s\n", transfer.Recipient, Match(client, transfer.Recipient, "address")) + - fmt.Sprintf(" amount: %s IOTX\n", amount) + fmt.Sprintf(" amount: %s IOTX\n", amount)) if len(transfer.Payload) != 0 { - result += fmt.Sprintf(" payload: %s\n", transfer.Payload) + result.WriteString(fmt.Sprintf(" payload: %s\n", transfer.Payload)) } - result += ">\n" + result.WriteString(">\n") case core.GetExecution() != nil: execution := core.GetExecution() - result += "execution: <\n" + + result.WriteString("execution: <\n" + fmt.Sprintf(" contract: %s %s\n", execution.Contract, - Match(client, execution.Contract, "address")) + Match(client, execution.Contract, "address"))) if execution.Amount != "0" { amount, err := util.StringToIOTX(execution.Amount) if err != nil { return "", errors.Wrap(err, "failed to convert string into IOTX amount") } - result += fmt.Sprintf(" amount: %s IOTX\n", amount) + result.WriteString(fmt.Sprintf(" amount: %s IOTX\n", amount)) } - result += fmt.Sprintf(" data: %x\n", execution.Data) + ">\n" + result.WriteString(fmt.Sprintf(" data: %x\n", execution.Data) + ">\n") case core.GetPutPollResult() != nil: putPollResult := core.GetPutPollResult() - result += "putPollResult: <\n" + + result.WriteString("putPollResult: <\n" + fmt.Sprintf(" height: %d\n", putPollResult.Height) + - " candidates: <\n" + " candidates: <\n") for _, candidate := range putPollResult.Candidates.Candidates { - result += " candidate: <\n" + - fmt.Sprintf(" address: %s\n", candidate.Address) + result.WriteString(" candidate: <\n" + + fmt.Sprintf(" address: %s\n", candidate.Address)) votes := big.NewInt(0).SetBytes(candidate.Votes) - result += fmt.Sprintf(" votes: %s\n", votes.String()) + + result.WriteString(fmt.Sprintf(" votes: %s\n", votes.String()) + fmt.Sprintf(" rewardAdress: %s\n", candidate.RewardAddress) + - " >\n" + " >\n") } - result += " >\n" + - ">\n" + result.WriteString(" >\n" + + ">\n") default: bs, err := protoV1.Marshal(core) if err != nil { return "", errors.Wrap(err, "failed to marshal core") } - result += string(bs) + result.WriteString(string(bs)) } - result += fmt.Sprintf("senderPubKey: %x\n", action.SenderPubKey) + - fmt.Sprintf("signature: %x\n", action.Signature) + result.WriteString(fmt.Sprintf("senderPubKey: %x\n", action.SenderPubKey) + + fmt.Sprintf("signature: %x\n", action.Signature)) - return result, nil + return result.String(), nil } func printReceiptProto(client ioctl.Client, receipt *iotextypes.Receipt) string { @@ -256,23 +258,24 @@ func printReceiptProto(client ioctl.Client, receipt *iotextypes.Receipt) string } func printLogs(logs []*iotextypes.Log) string { - result := "logs:<\n" + var result strings.Builder + result.WriteString("logs:<\n") for _, l := range logs { - result += " <\n" + + result.WriteString(" <\n" + fmt.Sprintf(" contractAddress: %s\n", l.ContractAddress) + - " topics:<\n" + " topics:<\n") for _, topic := range l.Topics { - result += fmt.Sprintf(" %s\n", hex.EncodeToString(topic)) + result.WriteString(fmt.Sprintf(" %s\n", hex.EncodeToString(topic))) } - result += " >\n" + result.WriteString(" >\n") if len(l.Data) > 0 { - result += fmt.Sprintf(" data: %s\n", hex.EncodeToString(l.Data)) + result.WriteString(fmt.Sprintf(" data: %s\n", hex.EncodeToString(l.Data))) } - result += " >\n" + result.WriteString(" >\n") } - result += ">\n" - return result + result.WriteString(">\n") + return result.String() } // Match returns human readable expression diff --git a/ioctl/newcmd/alias/aliasimport.go b/ioctl/newcmd/alias/aliasimport.go index 504a9f4a27..9cb629c4a5 100644 --- a/ioctl/newcmd/alias/aliasimport.go +++ b/ioctl/newcmd/alias/aliasimport.go @@ -8,6 +8,7 @@ package alias import ( "encoding/json" "fmt" + "strings" "github.com/pkg/errors" "github.com/spf13/cobra" @@ -96,11 +97,12 @@ func NewAliasImport(c ioctl.Client) *cobra.Command { return errors.Wrapf(err, failToWriteToConfigFile) } - line := fmt.Sprintf("%d/%d aliases imported\nExisted aliases:", message.ImportedNumber, message.TotalNumber) + var line strings.Builder + line.WriteString(fmt.Sprintf("%d/%d aliases imported\nExisted aliases:", message.ImportedNumber, message.TotalNumber)) for _, alias := range message.Unimported { - line += fmt.Sprint(" " + alias.Name) + line.WriteString(fmt.Sprint(" " + alias.Name)) } - cmd.Println(line) + cmd.Println(line.String()) return nil }, } diff --git a/ioctl/output/format.go b/ioctl/output/format.go index 9244518af5..1281f5198c 100644 --- a/ioctl/output/format.go +++ b/ioctl/output/format.go @@ -9,6 +9,7 @@ import ( "encoding/json" "fmt" "log" + "strings" ) // Format is the target of output-format flag @@ -97,12 +98,13 @@ type ConfirmationMessage struct { func (m *ConfirmationMessage) String() string { if Format == "" { - line := fmt.Sprintf("%s\nOptions:", m.Info) + var line strings.Builder + line.WriteString(fmt.Sprintf("%s\nOptions:", m.Info)) for _, option := range m.Options { - line += " " + option + line.WriteString(" " + option) } - line += "\nQuit for anything else." - return line + line.WriteString("\nQuit for anything else.") + return line.String() } return FormatString(Confirmation, m) } diff --git a/tools/bot/server/bot/execution.go b/tools/bot/server/bot/execution.go index 3e8988ae78..8d62748427 100644 --- a/tools/bot/server/bot/execution.go +++ b/tools/bot/server/bot/execution.go @@ -117,36 +117,37 @@ func (s *Execution) exec(pri crypto.PrivateKey) (txhash string, err error) { err = errors.New("address len is not equal to amount len") return } - data := _multiSendSha3 + _multiSendOffset + var data strings.Builder + data.WriteString(_multiSendSha3 + _multiSendOffset) params2Offset := 32*3 + 1*32 + len(s.cfg.Execution.To.Address)*32 params := fmt.Sprintf("%x", params2Offset) - data += strings.Repeat("0", 64-len(params)) + params + data.WriteString(strings.Repeat("0", 64-len(params)) + params) params3Offset := params2Offset + 1*32 + len(s.cfg.Execution.To.Address)*32 params = fmt.Sprintf("%x", params3Offset) - data += strings.Repeat("0", 64-len(params)) + params + data.WriteString(strings.Repeat("0", 64-len(params)) + params) lenOfAddress := fmt.Sprintf("%x", len(s.cfg.Execution.To.Address)) - data += strings.Repeat("0", 64-len(lenOfAddress)) + lenOfAddress + data.WriteString(strings.Repeat("0", 64-len(lenOfAddress)) + lenOfAddress) for _, addr := range s.cfg.Execution.To.Address { a, errs := address.FromString(addr) if errs != nil { err = errs return } - data += _prefixZero + hex.EncodeToString(a.Bytes()) + data.WriteString(_prefixZero + hex.EncodeToString(a.Bytes())) } - data += strings.Repeat("0", 64-len(lenOfAddress)) + lenOfAddress + data.WriteString(strings.Repeat("0", 64-len(lenOfAddress)) + lenOfAddress) for _, amount := range s.cfg.Execution.To.Amount { amo, ok := new(big.Int).SetString(amount, 10) if !ok { err = errors.New("amount convert error") return } - data += strings.Repeat("0", 64-len(amo.Text(16))) + amo.Text(16) + data.WriteString(strings.Repeat("0", 64-len(amo.Text(16))) + amo.Text(16)) } - data += _fixPayLoad - dataBytes, err := hex.DecodeString(data) + data.WriteString(_fixPayLoad) + dataBytes, err := hex.DecodeString(data.String()) if err != nil { return }