diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index 2712e322..f48b9618 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -2,9 +2,9 @@ name: golangci-lint on: push: - branches: [ main, development, feat/* ] + branches: [ main, feat/*, rc/* ] pull_request: - branches: [ main, development, feat/* ] + branches: [ main, feat/*, rc/* ] permissions: contents: read diff --git a/.github/workflows/pr-tests.yml b/.github/workflows/pr-tests.yml index 15bd4b72..668e7cec 100644 --- a/.github/workflows/pr-tests.yml +++ b/.github/workflows/pr-tests.yml @@ -2,9 +2,9 @@ name: Tests on: push: - branches: [ main, feat/* ] + branches: [ main, feat/*, rc/* ] pull_request: - branches: [ main, feat/* ] + branches: [ main, feat/*, rc/* ] jobs: test: diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..b852eac2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, build with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +opcode.trace + +.* +!/.gitignore +!/.github + +/vendor +/esdata +.env +*.log + diff --git a/aggregator/httpResponseGetter.go b/aggregator/httpResponseGetter.go index 1c210b24..ef48fcdb 100644 --- a/aggregator/httpResponseGetter.go +++ b/aggregator/httpResponseGetter.go @@ -3,7 +3,7 @@ package aggregator import ( "context" "encoding/json" - "io/ioutil" + "io" "net/http" ) @@ -35,7 +35,7 @@ func (getter *httpResponseGetter) Get(ctx context.Context, url string, response return err } - respBytes, err := ioutil.ReadAll(resp.Body) + respBytes, err := io.ReadAll(resp.Body) if err != nil { return nil } diff --git a/aggregator/notifees/mxNotifee.go b/aggregator/notifees/mxNotifee.go index e77ec68a..880f4e0c 100644 --- a/aggregator/notifees/mxNotifee.go +++ b/aggregator/notifees/mxNotifee.go @@ -101,10 +101,15 @@ func (en *mxNotifee) PriceChanged(ctx context.Context, priceChanges []*aggregato return err } + receiverAddressAsBech32, err := en.contractAddress.AddressAsBech32String() + if err != nil { + return err + } + gasLimit := en.baseGasLimit + uint64(len(priceChanges))*en.gasLimitForEach tx := &transaction.FrontendTransaction{ Value: zeroString, - Receiver: en.contractAddress.AddressAsBech32String(), + Receiver: receiverAddressAsBech32, GasPrice: networkConfigs.MinGasPrice, GasLimit: gasLimit, Data: txData, diff --git a/authentication/native/semiIntegrated_test.go b/authentication/native/semiIntegrated_test.go index 6b8631ba..c1fd12a8 100644 --- a/authentication/native/semiIntegrated_test.go +++ b/authentication/native/semiIntegrated_test.go @@ -11,7 +11,6 @@ import ( "github.com/multiversx/mx-chain-crypto-go/signing" "github.com/multiversx/mx-chain-crypto-go/signing/ed25519" "github.com/multiversx/mx-chain-go/testscommon" - logger "github.com/multiversx/mx-chain-logger-go" "github.com/multiversx/mx-sdk-go/authentication" "github.com/multiversx/mx-sdk-go/blockchain/cryptoProvider" "github.com/multiversx/mx-sdk-go/data" @@ -23,6 +22,7 @@ import ( ) var keyGen = signing.NewKeyGenerator(ed25519.NewEd25519()) +var hrp = "erd" func TestNativeserver_ClientServer(t *testing.T) { @@ -80,7 +80,7 @@ func createNativeClient(pem string, proxy workflows.ProxyHandler, tokenHandler a } func createNativeServer(httpClientWrapper authentication.HttpClientWrapper, tokenHandler authentication.AuthTokenHandler) *authServer { - converter, _ := pubkeyConverter.NewBech32PubkeyConverter(32, logger.GetOrCreate("testscommon")) + converter, _ := pubkeyConverter.NewBech32PubkeyConverter(32, hrp) serverArgs := ArgsNativeAuthServer{ HttpClientWrapper: httpClientWrapper, diff --git a/authentication/native/server_test.go b/authentication/native/server_test.go index 6dd243c7..6e19b331 100644 --- a/authentication/native/server_test.go +++ b/authentication/native/server_test.go @@ -171,7 +171,7 @@ func TestNativeserver_Validate(t *testing.T) { return buff, http.StatusOK, nil }, } - args.PubKeyConverter = &genesisMock.PubkeyConverterStub{ + args.PubKeyConverter = &testscommon.PubkeyConverterStub{ DecodeCalled: func(humanReadable string) ([]byte, error) { return nil, expectedErr }, @@ -204,7 +204,7 @@ func TestNativeserver_Validate(t *testing.T) { return nil, expectedErr }, } - args.PubKeyConverter = &genesisMock.PubkeyConverterStub{ + args.PubKeyConverter = &testscommon.PubkeyConverterStub{ DecodeCalled: func(humanReadable string) ([]byte, error) { return nil, nil }, @@ -363,7 +363,7 @@ func createMockArgsNativeAuthServer() ArgsNativeAuthServer { HttpClientWrapper: &testsCommon.HTTPClientWrapperStub{}, TokenHandler: &mock.AuthTokenHandlerStub{}, Signer: &testsCommon.SignerStub{}, - PubKeyConverter: &genesisMock.PubkeyConverterStub{}, + PubKeyConverter: &testscommon.PubkeyConverterStub{}, KeyGenerator: &genesisMock.KeyGeneratorStub{}, TimestampsCacher: &testscommon.CacherStub{}, } diff --git a/blockchain/addressGenerator.go b/blockchain/addressGenerator.go index 9f0ecb63..0e85f401 100644 --- a/blockchain/addressGenerator.go +++ b/blockchain/addressGenerator.go @@ -38,23 +38,24 @@ func NewAddressGenerator(coordinator *shardCoordinator) (*addressGenerator, erro builtInFuncs := &disabled.BuiltInFunctionContainer{} var argsHook = hooks.ArgBlockChainHook{ - Accounts: &disabled.Accounts{}, - PubkeyConv: core.AddressPublicKeyConverter, - StorageService: &disabled.StorageService{}, - BlockChain: &disabled.Blockchain{}, - ShardCoordinator: &disabled.ShardCoordinator{}, - Marshalizer: &marshal.JsonMarshalizer{}, - Uint64Converter: uint64ByteSlice.NewBigEndianConverter(), - BuiltInFunctions: builtInFuncs, - DataPool: &disabled.DataPool{}, - CompiledSCPool: storage.NewMapCacher(), - NilCompiledSCStore: true, - NFTStorageHandler: &disabled.SimpleESDTNFTStorageHandler{}, - EpochNotifier: &disabled.EpochNotifier{}, - GlobalSettingsHandler: &disabled.GlobalSettingsHandler{}, - EnableEpochsHandler: &disabled.EnableEpochsHandler{}, - GasSchedule: &disabled.GasScheduleNotifier{}, - Counter: &disabled.BlockChainHookCounter{}, + Accounts: &disabled.Accounts{}, + PubkeyConv: core.AddressPublicKeyConverter, + StorageService: &disabled.StorageService{}, + BlockChain: &disabled.Blockchain{}, + ShardCoordinator: &disabled.ShardCoordinator{}, + Marshalizer: &marshal.JsonMarshalizer{}, + Uint64Converter: uint64ByteSlice.NewBigEndianConverter(), + BuiltInFunctions: builtInFuncs, + DataPool: &disabled.DataPool{}, + CompiledSCPool: storage.NewMapCacher(), + NilCompiledSCStore: true, + NFTStorageHandler: &disabled.SimpleESDTNFTStorageHandler{}, + EpochNotifier: &disabled.EpochNotifier{}, + GlobalSettingsHandler: &disabled.GlobalSettingsHandler{}, + EnableEpochsHandler: &disabled.EnableEpochsHandler{}, + GasSchedule: &disabled.GasScheduleNotifier{}, + Counter: &disabled.BlockChainHookCounter{}, + MissingTrieNodesNotifier: &disabled.MissingTrieNodesNotifier{}, } blockchainHook, err := hooks.NewBlockChainHookImpl(argsHook) if err != nil { @@ -89,9 +90,9 @@ func (ag *addressGenerator) CompatibleDNSAddressFromUsername(username string) (c return ag.CompatibleDNSAddress(lastByte) } -// ComputeArwenScAddress will return the smart contract address that will be generated by the Arwen VM providing +// ComputeWasmVMScAddress will return the smart contract address that will be generated by the Wasm VM providing // the owner's address & nonce -func (ag *addressGenerator) ComputeArwenScAddress(address core.AddressHandler, nonce uint64) (core.AddressHandler, error) { +func (ag *addressGenerator) ComputeWasmVMScAddress(address core.AddressHandler, nonce uint64) (core.AddressHandler, error) { if check.IfNil(address) { return nil, ErrNilAddress } diff --git a/blockchain/addressGenerator_test.go b/blockchain/addressGenerator_test.go index a3ec89af..eb9fceaa 100644 --- a/blockchain/addressGenerator_test.go +++ b/blockchain/addressGenerator_test.go @@ -47,11 +47,14 @@ func TestGenerateSameDNSAddress(t *testing.T) { newDNS, err := ag.CompatibleDNSAddressFromUsername("laura.elrond") require.Nil(t, err) - fmt.Printf("Compatibile DNS address is %s\n", newDNS.AddressAsBech32String()) - assert.Equal(t, "erd1qqqqqqqqqqqqqpgqvrsdh798pvd4x09x0argyscxc9h7lzfhqz4sttlatg", newDNS.AddressAsBech32String()) + newDnsAsBech32, err := newDNS.AddressAsBech32String() + require.Nil(t, err) + + fmt.Printf("Compatibile DNS address is %s\n", newDnsAsBech32) + assert.Equal(t, "erd1qqqqqqqqqqqqqpgqvrsdh798pvd4x09x0argyscxc9h7lzfhqz4sttlatg", newDnsAsBech32) } -func TestAddressGenerator_ComputeArwenScAddress(t *testing.T) { +func TestAddressGenerator_ComputeWasmVMScAddress(t *testing.T) { t.Parallel() coord, err := NewShardCoordinator(3, 0) @@ -62,8 +65,11 @@ func TestAddressGenerator_ComputeArwenScAddress(t *testing.T) { owner, err := data.NewAddressFromBech32String("erd1dglncxk6sl9a3xumj78n6z2xux4ghp5c92cstv5zsn56tjgtdwpsk46qrs") require.Nil(t, err) - scAddress, err := ag.ComputeArwenScAddress(owner, 10) + scAddress, err := ag.ComputeWasmVMScAddress(owner, 10) + require.Nil(t, err) + + scAddressAsBech32, err := scAddress.AddressAsBech32String() require.Nil(t, err) - assert.Equal(t, "erd1qqqqqqqqqqqqqpgqxcy5fma93yhw44xcmt3zwrl0tlhaqmxrdwpsr2vh8p", scAddress.AddressAsBech32String()) + assert.Equal(t, "erd1qqqqqqqqqqqqqpgqxcy5fma93yhw44xcmt3zwrl0tlhaqmxrdwpsr2vh8p", scAddressAsBech32) } diff --git a/blockchain/cryptoProvider/cryptoComponentsHolder.go b/blockchain/cryptoProvider/cryptoComponentsHolder.go index db1fc123..17cb0e41 100644 --- a/blockchain/cryptoProvider/cryptoComponentsHolder.go +++ b/blockchain/cryptoProvider/cryptoComponentsHolder.go @@ -25,7 +25,10 @@ func NewCryptoComponentsHolder(keyGen crypto.KeyGenerator, skBytes []byte) (*cry return nil, err } addressHandler := data.NewAddressFromBytes(publicKeyBytes) - bech32Address := addressHandler.AddressAsBech32String() + bech32Address, err := addressHandler.AddressAsBech32String() + if err != nil { + return nil, err + } return &cryptoComponentsHolder{ privateKey: privateKey, diff --git a/blockchain/cryptoProvider/cryptoComponentsHolder_test.go b/blockchain/cryptoProvider/cryptoComponentsHolder_test.go index 3e93e86d..3be792f4 100644 --- a/blockchain/cryptoProvider/cryptoComponentsHolder_test.go +++ b/blockchain/cryptoProvider/cryptoComponentsHolder_test.go @@ -52,7 +52,11 @@ func TestNewCryptoComponentsHolder(t *testing.T) { privateKey := &testsCommon.PrivateKeyStub{ GeneratePublicCalled: func() crypto.PublicKey { - return &testsCommon.PublicKeyStub{} + return &testsCommon.PublicKeyStub{ + ToByteArrayCalled: func() ([]byte, error) { + return make([]byte, 32), nil + }, + } }, } keyGenInstance := &cryptoMocks.KeyGenStub{ @@ -82,7 +86,11 @@ func TestNewCryptoComponentsHolder(t *testing.T) { bech32Address := holder.GetBech32() addressHandler := holder.GetAddressHandler() - require.Equal(t, addressHandler.AddressAsBech32String(), bech32Address) + + addressAsBech32String, err := addressHandler.AddressAsBech32String() + require.Nil(t, err) + + require.Equal(t, addressAsBech32String, bech32Address) require.Equal(t, "erd1j84k44nsqsme8r6e5aawutx0z2cd6cyx3wprkzdh73x2cf0kqvksa3snnq", bech32Address) }) } diff --git a/blockchain/endpointProviders/baseEndpointProvider.go b/blockchain/endpointProviders/baseEndpointProvider.go index b9b4652a..1e1e6eea 100644 --- a/blockchain/endpointProviders/baseEndpointProvider.go +++ b/blockchain/endpointProviders/baseEndpointProvider.go @@ -23,6 +23,7 @@ const ( esdt = "address/%s/esdt/%s" nft = "address/%s/nft/%s/nonce/%d" nodeGetGuardianData = "address/%s/guardian-data" + isDataTrieMigrated = "address/%s/is-data-trie-migrated" ) type baseEndpointProvider struct{} @@ -126,3 +127,8 @@ func (base *baseEndpointProvider) GetRawStartOfEpochMetaBlock(epoch uint32) stri func (base *baseEndpointProvider) GetValidatorsInfo(epoch uint32) string { return fmt.Sprintf(rawStartOfEpochValidators, epoch) } + +// IsDataTrieMigrated returns true if the data trie of the given address is migrated +func (base *baseEndpointProvider) IsDataTrieMigrated(addressAsBech32 string) string { + return fmt.Sprintf(isDataTrieMigrated, addressAsBech32) +} diff --git a/blockchain/factory/interface.go b/blockchain/factory/interface.go index 57f3eb3b..be3db345 100644 --- a/blockchain/factory/interface.go +++ b/blockchain/factory/interface.go @@ -41,6 +41,7 @@ type EndpointProvider interface { GetProcessedTransactionStatus(hexHash string) string GetESDTTokenData(addressAsBech32 string, tokenIdentifier string) string GetNFTTokenData(addressAsBech32 string, tokenIdentifier string, nonce uint64) string + IsDataTrieMigrated(addressAsBech32 string) string IsInterfaceNil() bool } diff --git a/blockchain/interface.go b/blockchain/interface.go index 158c9a99..9323b865 100644 --- a/blockchain/interface.go +++ b/blockchain/interface.go @@ -54,6 +54,7 @@ type EndpointProvider interface { GetProcessedTransactionStatus(hexHash string) string GetESDTTokenData(addressAsBech32 string, tokenIdentifier string) string GetNFTTokenData(addressAsBech32 string, tokenIdentifier string, nonce uint64) string + IsDataTrieMigrated(addressAsBech32 string) string IsInterfaceNil() bool } diff --git a/blockchain/proxy.go b/blockchain/proxy.go index 2c15ec90..ca62293f 100644 --- a/blockchain/proxy.go +++ b/blockchain/proxy.go @@ -181,11 +181,16 @@ func (ep *proxy) GetDefaultTransactionArguments( return transaction.FrontendTransaction{}, "", err } + addressAsBech32String, err := address.AddressAsBech32String() + if err != nil { + return transaction.FrontendTransaction{}, "", err + } + return transaction.FrontendTransaction{ Nonce: account.Nonce, Value: "", Receiver: "", - Sender: address.AddressAsBech32String(), + Sender: addressAsBech32String, GasPrice: networkConfigs.MinGasPrice, GasLimit: networkConfigs.MinGasLimit, Data: nil, @@ -204,12 +209,18 @@ func (ep *proxy) GetAccount(ctx context.Context, address sdkCore.AddressHandler) if !address.IsValid() { return nil, ErrInvalidAddress } - err := ep.checkFinalState(ctx, address.AddressAsBech32String()) + + addressAsBech32, err := address.AddressAsBech32String() + if err != nil { + return nil, err + } + + err = ep.checkFinalState(ctx, addressAsBech32) if err != nil { return nil, err } - endpoint := ep.endpointProvider.GetAccount(address.AddressAsBech32String()) + endpoint := ep.endpointProvider.GetAccount(addressAsBech32) buff, code, err := ep.GetHTTP(ctx, endpoint) if err != nil || code != http.StatusOK { @@ -574,7 +585,12 @@ func (ep *proxy) GetESDTTokenData( return nil, ErrInvalidAddress } - endpoint := ep.endpointProvider.GetESDTTokenData(address.AddressAsBech32String(), tokenIdentifier) + addressAsBech32String, err := address.AddressAsBech32String() + if err != nil { + return nil, err + } + + endpoint := ep.endpointProvider.GetESDTTokenData(addressAsBech32String, tokenIdentifier) endpoint = sdkCore.BuildUrlWithAccountQueryOptions(endpoint, queryOptions) buff, code, err := ep.GetHTTP(ctx, endpoint) if err != nil || code != http.StatusOK { @@ -608,7 +624,12 @@ func (ep *proxy) GetNFTTokenData( return nil, ErrInvalidAddress } - endpoint := ep.endpointProvider.GetNFTTokenData(address.AddressAsBech32String(), tokenIdentifier, nonce) + addressAsBech32String, err := address.AddressAsBech32String() + if err != nil { + return nil, err + } + + endpoint := ep.endpointProvider.GetNFTTokenData(addressAsBech32String, tokenIdentifier, nonce) endpoint = sdkCore.BuildUrlWithAccountQueryOptions(endpoint, queryOptions) buff, code, err := ep.GetHTTP(ctx, endpoint) if err != nil || code != http.StatusOK { @@ -635,12 +656,17 @@ func (ep *proxy) GetGuardianData(ctx context.Context, address sdkCore.AddressHan if !address.IsValid() { return nil, ErrInvalidAddress } - err := ep.checkFinalState(ctx, address.AddressAsBech32String()) + bech32Address, err := address.AddressAsBech32String() + if err != nil { + return nil, err + } + + err = ep.checkFinalState(ctx, bech32Address) if err != nil { return nil, err } - endpoint := ep.endpointProvider.GetGuardianData(address.AddressAsBech32String()) + endpoint := ep.endpointProvider.GetGuardianData(bech32Address) buff, code, err := ep.GetHTTP(ctx, endpoint) if err != nil || code != http.StatusOK { return nil, createHTTPStatusError(code, err) @@ -658,6 +684,39 @@ func (ep *proxy) GetGuardianData(ctx context.Context, address sdkCore.AddressHan return response.Data.GuardianData, nil } +// IsDataTrieMigrated returns true if the data trie of the given account is migrated +func (ep *proxy) IsDataTrieMigrated(ctx context.Context, address sdkCore.AddressHandler) (bool, error) { + if check.IfNil(address) { + return false, ErrNilAddress + } + + bech32Address, err := address.AddressAsBech32String() + if err != nil { + return false, err + } + + buff, code, err := ep.GetHTTP(ctx, ep.endpointProvider.IsDataTrieMigrated(bech32Address)) + if err != nil || code != http.StatusOK { + return false, createHTTPStatusError(code, err) + } + + response := &data.IsDataTrieMigratedResponse{} + err = json.Unmarshal(buff, response) + if err != nil { + return false, err + } + if response.Error != "" { + return false, errors.New(response.Error) + } + + isMigrated, ok := response.Data["isMigrated"] + if !ok { + return false, errors.New("isMigrated key not found in response map") + } + + return isMigrated, nil +} + // IsInterfaceNil returns true if there is no value under the interface func (ep *proxy) IsInterfaceNil() bool { return ep == nil diff --git a/blockchain/proxy_test.go b/blockchain/proxy_test.go index 1206136c..3969ae5a 100644 --- a/blockchain/proxy_test.go +++ b/blockchain/proxy_test.go @@ -6,7 +6,7 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" + "io" "net/http" "strings" "sync/atomic" @@ -72,7 +72,7 @@ func createMockClientRespondingBytes(responseBytes []byte) *mockHTTPClient { return &mockHTTPClient{ doCalled: func(req *http.Request) (*http.Response, error) { return &http.Response{ - Body: ioutil.NopCloser(bytes.NewReader(responseBytes)), + Body: io.NopCloser(bytes.NewReader(responseBytes)), StatusCode: http.StatusOK, }, nil }, @@ -83,7 +83,7 @@ func createMockClientRespondingBytesWithStatus(responseBytes []byte, status int) return &mockHTTPClient{ doCalled: func(req *http.Request) (*http.Response, error) { return &http.Response{ - Body: ioutil.NopCloser(bytes.NewReader(responseBytes)), + Body: io.NopCloser(bytes.NewReader(responseBytes)), StatusCode: status, }, nil }, @@ -174,7 +174,7 @@ func handleRequestNetworkConfigAndStatus( buff, _ := json.Marshal(response) return &http.Response{ - Body: ioutil.NopCloser(bytes.NewReader(buff)), + Body: io.NopCloser(bytes.NewReader(buff)), StatusCode: http.StatusOK, }, handled, nil } @@ -248,7 +248,7 @@ func TestGetAccount(t *testing.T) { accountBytes, _ := json.Marshal(account) atomic.AddUint32(&numAccountQueries, 1) return &http.Response{ - Body: ioutil.NopCloser(bytes.NewReader(accountBytes)), + Body: io.NopCloser(bytes.NewReader(accountBytes)), StatusCode: http.StatusOK, }, nil }, @@ -450,7 +450,7 @@ func TestProxy_ExecuteVmQuery(t *testing.T) { } return &http.Response{ - Body: ioutil.NopCloser(bytes.NewReader(responseBytes)), + Body: io.NopCloser(bytes.NewReader(responseBytes)), StatusCode: http.StatusOK, }, nil }, @@ -829,7 +829,7 @@ func TestElrondProxy_GetESDTTokenData(t *testing.T) { assert.True(t, strings.HasSuffix(req.URL.String(), expectedSuffix)) return &http.Response{ - Body: ioutil.NopCloser(bytes.NewReader(responseBytes)), + Body: io.NopCloser(bytes.NewReader(responseBytes)), StatusCode: http.StatusOK, }, nil }, @@ -990,7 +990,7 @@ func TestElrondProxy_GetNFTTokenData(t *testing.T) { assert.True(t, strings.HasSuffix(req.URL.String(), expectedSuffix)) return &http.Response{ - Body: ioutil.NopCloser(bytes.NewReader(responseBytes)), + Body: io.NopCloser(bytes.NewReader(responseBytes)), StatusCode: http.StatusOK, }, nil }, @@ -1066,3 +1066,141 @@ func TestProxy_GetGuardianData(t *testing.T) { require.Equal(t, expectedGuardianData, response) }) } + +func TestProxy_IsDataTrieMigrated(t *testing.T) { + t.Parallel() + + expectedErr := errors.New("expected error") + validAddress := data.NewAddressFromBytes(bytes.Repeat([]byte("1"), 32)) + t.Run("nil address", func(t *testing.T) { + t.Parallel() + + httpClient := createMockClientRespondingBytes(make([]byte, 0)) + args := createMockArgsProxy(httpClient) + ep, _ := NewProxy(args) + + isMigrated, err := ep.IsDataTrieMigrated(context.Background(), nil) + assert.False(t, isMigrated) + assert.Equal(t, ErrNilAddress, err) + }) + t.Run("invalid bech32 address", func(t *testing.T) { + t.Parallel() + + httpClient := createMockClientRespondingBytes(make([]byte, 0)) + args := createMockArgsProxy(httpClient) + ep, _ := NewProxy(args) + + invalidAddress := data.NewAddressFromBytes([]byte("invalid")) + + isMigrated, err := ep.IsDataTrieMigrated(context.Background(), invalidAddress) + assert.False(t, isMigrated) + assert.True(t, strings.Contains(err.Error(), "wrong size when encoding address")) + }) + t.Run("http client errors", func(t *testing.T) { + t.Parallel() + + httpClient := createMockClientRespondingError(expectedErr) + args := createMockArgsProxy(httpClient) + ep, _ := NewProxy(args) + + isMigrated, err := ep.IsDataTrieMigrated(context.Background(), validAddress) + assert.False(t, isMigrated) + assert.ErrorIs(t, err, expectedErr) + }) + t.Run("invalid status", func(t *testing.T) { + t.Parallel() + + httpClient := createMockClientRespondingBytesWithStatus(make([]byte, 0), http.StatusNotFound) + args := createMockArgsProxy(httpClient) + ep, _ := NewProxy(args) + + isMigrated, err := ep.IsDataTrieMigrated(context.Background(), validAddress) + assert.False(t, isMigrated) + assert.ErrorIs(t, err, ErrHTTPStatusCodeIsNotOK) + }) + t.Run("invalid response bytes", func(t *testing.T) { + t.Parallel() + + httpClient := createMockClientRespondingBytes([]byte("invalid json")) + args := createMockArgsProxy(httpClient) + ep, _ := NewProxy(args) + + isMigrated, err := ep.IsDataTrieMigrated(context.Background(), validAddress) + assert.False(t, isMigrated) + assert.NotNil(t, err) + }) + t.Run("response returned error", func(t *testing.T) { + t.Parallel() + + response := &data.IsDataTrieMigratedResponse{ + Error: expectedErr.Error(), + } + responseBytes, _ := json.Marshal(response) + + httpClient := createMockClientRespondingBytes(responseBytes) + args := createMockArgsProxy(httpClient) + ep, _ := NewProxy(args) + + isMigrated, err := ep.IsDataTrieMigrated(context.Background(), validAddress) + assert.False(t, isMigrated) + assert.NotNil(t, err) + assert.Equal(t, expectedErr.Error(), err.Error()) + }) + t.Run("isMigrated key not found in map", func(t *testing.T) { + t.Parallel() + + responseMap := make(map[string]bool) + responseMap["random key"] = true + + response := &data.IsDataTrieMigratedResponse{ + Data: responseMap, + } + responseBytes, _ := json.Marshal(response) + + httpClient := createMockClientRespondingBytes(responseBytes) + args := createMockArgsProxy(httpClient) + ep, _ := NewProxy(args) + + isMigrated, err := ep.IsDataTrieMigrated(context.Background(), validAddress) + assert.False(t, isMigrated) + assert.Contains(t, err.Error(), "isMigrated key not found in response map") + }) + t.Run("migrated trie", func(t *testing.T) { + t.Parallel() + + responseMap := make(map[string]bool) + responseMap["isMigrated"] = true + + response := &data.IsDataTrieMigratedResponse{ + Data: responseMap, + } + responseBytes, _ := json.Marshal(response) + + httpClient := createMockClientRespondingBytes(responseBytes) + args := createMockArgsProxy(httpClient) + ep, _ := NewProxy(args) + + isMigrated, err := ep.IsDataTrieMigrated(context.Background(), validAddress) + assert.True(t, isMigrated) + assert.Nil(t, err) + }) + t.Run("not migrated trie", func(t *testing.T) { + t.Parallel() + + responseMap := make(map[string]bool) + responseMap["isMigrated"] = false + + response := &data.IsDataTrieMigratedResponse{ + Data: responseMap, + } + responseBytes, _ := json.Marshal(response) + + httpClient := createMockClientRespondingBytes(responseBytes) + args := createMockArgsProxy(httpClient) + ep, _ := NewProxy(args) + + isMigrated, err := ep.IsDataTrieMigrated(context.Background(), validAddress) + assert.False(t, isMigrated) + assert.Nil(t, err) + }) +} diff --git a/builders/relayedTxV1Builder_test.go b/builders/relayedTxV1Builder_test.go index 8c364947..d9c97449 100644 --- a/builders/relayedTxV1Builder_test.go +++ b/builders/relayedTxV1Builder_test.go @@ -80,9 +80,12 @@ func getAccount(t *testing.T, mnemonic string) (*data.Account, []byte) { address, err := wallet.GetAddressFromPrivateKey(privKey) require.NoError(t, err) + addressAsBech32String, err := address.AddressAsBech32String() + require.NoError(t, err) + account := &data.Account{ Nonce: 37, - Address: address.AddressAsBech32String(), + Address: addressAsBech32String, } return account, privKey diff --git a/builders/vmQueryBuilder.go b/builders/vmQueryBuilder.go index eed853d0..d35d454d 100644 --- a/builders/vmQueryBuilder.go +++ b/builders/vmQueryBuilder.go @@ -71,7 +71,13 @@ func (builder *vmQueryBuilder) CallerAddress(address core.AddressHandler) VMQuer return builder } - builder.callerAddr = address.AddressAsBech32String() + addressAsBech32String, err := address.AddressAsBech32String() + if err != nil { + builder.err = err + return builder + } + + builder.callerAddr = addressAsBech32String return builder } @@ -84,7 +90,13 @@ func (builder *vmQueryBuilder) Address(address core.AddressHandler) VMQueryBuild return builder } - builder.address = address.AddressAsBech32String() + addressAsBech32String, err := address.AddressAsBech32String() + if err != nil { + builder.err = err + return builder + } + + builder.address = addressAsBech32String return builder } diff --git a/builders/vmQueryBuilder_test.go b/builders/vmQueryBuilder_test.go index bb1dd9ad..79a44b96 100644 --- a/builders/vmQueryBuilder_test.go +++ b/builders/vmQueryBuilder_test.go @@ -46,7 +46,10 @@ func TestTxDataBuilder_Address(t *testing.T) { builder.Address(address) valueRequest, err := builder.ToVmValueRequest() assert.Nil(t, err) - assert.Equal(t, address.AddressAsBech32String(), valueRequest.Address) + + addressAsBech32String, err := address.AddressAsBech32String() + assert.Nil(t, err) + assert.Equal(t, addressAsBech32String, valueRequest.Address) }) } @@ -75,7 +78,9 @@ func TestTxDataBuilder_CallerAddress(t *testing.T) { builder.CallerAddress(address) valueRequest, err := builder.ToVmValueRequest() assert.Nil(t, err) - assert.Equal(t, address.AddressAsBech32String(), valueRequest.CallerAddr) + addressAsBech32String, err := address.AddressAsBech32String() + assert.Nil(t, err) + assert.Equal(t, addressAsBech32String, valueRequest.CallerAddr) }) } diff --git a/cmd/cli/main.go b/cmd/cli/main.go index fd9dbbbf..c48cce57 100644 --- a/cmd/cli/main.go +++ b/cmd/cli/main.go @@ -269,7 +269,11 @@ func setSenderOption(td *testData, options *selectedOptions) error { } if selectedAddress != nil { - options.tx.Sender = selectedAddress.AddressAsBech32String() + options.tx.Sender, err = selectedAddress.AddressAsBech32String() + if err != nil { + return err + } + options.senderCryptoHolder, err = cryptoProvider.NewCryptoComponentsHolder(keyGen, sk) if err != nil { return err @@ -284,11 +288,12 @@ func setReceiverOption(td *testData, options *selectedOptions) error { if err != nil { return err } + if selectedAddress != nil { - options.tx.Receiver = selectedAddress.AddressAsBech32String() + options.tx.Receiver, err = selectedAddress.AddressAsBech32String() } - return nil + return err } func setGuardianOption(td *testData, options *selectedOptions) error { @@ -311,7 +316,11 @@ func setGuardedTxByOption(td *testData, options *selectedOptions) error { } if selectedAddress != nil { - options.tx.GuardianAddr = selectedAddress.AddressAsBech32String() + options.tx.GuardianAddr, err = selectedAddress.AddressAsBech32String() + if err != nil { + return err + } + options.guardianCryptoHolder, err = cryptoProvider.NewCryptoComponentsHolder(keyGen, sk) if err != nil { return err @@ -404,7 +413,10 @@ func getDefaultOptions(td *testData, ep workflows.ProxyHandler, netConfigs *data return nil, err } tx.Value = "0" - tx.Receiver = td.addressBob.AddressAsBech32String() + tx.Receiver, err = td.addressBob.AddressAsBech32String() + if err != nil { + return nil, err + } aliceCryptoHolder, _ := cryptoProvider.NewCryptoComponentsHolder(keyGen, td.skAlice) bobCryptoHolder, _ := cryptoProvider.NewCryptoComponentsHolder(keyGen, td.skBob) @@ -505,7 +517,11 @@ func sendFundWalletsTxs(td *testData, proxy workflows.ProxyHandler, providedTx t for _, addressHandler := range receivers { tx := providedTx // copy - tx.Receiver = addressHandler.AddressAsBech32String() + tx.Receiver, err = addressHandler.AddressAsBech32String() + if err != nil { + return err + } + fundingWalletCryptoHolder, localErr := cryptoProvider.NewCryptoComponentsHolder(keyGen, td.skFunding) if localErr != nil { return localErr diff --git a/core/http/clientWrapper.go b/core/http/clientWrapper.go index 51758613..5893a104 100644 --- a/core/http/clientWrapper.go +++ b/core/http/clientWrapper.go @@ -4,7 +4,7 @@ import ( "bytes" "context" "fmt" - "io/ioutil" + "io" "net/http" "github.com/multiversx/mx-chain-core-go/core/check" @@ -57,7 +57,7 @@ func (wrapper *clientWrapper) GetHTTP(ctx context.Context, endpoint string) ([]b _ = response.Body.Close() }() - body, err := ioutil.ReadAll(response.Body) + body, err := io.ReadAll(response.Body) if err != nil { return nil, response.StatusCode, err } @@ -84,7 +84,7 @@ func (wrapper *clientWrapper) PostHTTP(ctx context.Context, endpoint string, dat _ = response.Body.Close() }() - buff, err := ioutil.ReadAll(response.Body) + buff, err := io.ReadAll(response.Body) return buff, response.StatusCode, err } diff --git a/core/interface.go b/core/interface.go index 9fa51acc..95f050ad 100644 --- a/core/interface.go +++ b/core/interface.go @@ -4,7 +4,7 @@ import crypto "github.com/multiversx/mx-chain-crypto-go" // AddressHandler will handle different implementations of an address type AddressHandler interface { - AddressAsBech32String() string + AddressAsBech32String() (string, error) AddressBytes() []byte AddressSlice() [32]byte IsValid() bool diff --git a/core/variables.go b/core/variables.go index 6758ddaf..ea395e57 100644 --- a/core/variables.go +++ b/core/variables.go @@ -1,11 +1,9 @@ package core import ( + "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/pubkeyConverter" - logger "github.com/multiversx/mx-chain-logger-go" ) -var log = logger.GetOrCreate("mx-sdk-go/core") - // AddressPublicKeyConverter represents the default address public key converter -var AddressPublicKeyConverter, _ = pubkeyConverter.NewBech32PubkeyConverter(AddressBytesLen, log) +var AddressPublicKeyConverter, _ = pubkeyConverter.NewBech32PubkeyConverter(AddressBytesLen, core.DefaultAddressPrefix) diff --git a/data/account.go b/data/account.go index 55fde40a..faa5eda8 100644 --- a/data/account.go +++ b/data/account.go @@ -16,6 +16,13 @@ type AccountResponse struct { Code string `json:"code"` } +// IsDataTrieMigratedResponse holds the IsDataTrieMigrated endpoint response +type IsDataTrieMigratedResponse struct { + Data map[string]bool `json:"data"` + Error string `json:"error"` + Code string `json:"code"` +} + // Account holds an Account's information type Account struct { Address string `json:"address"` diff --git a/data/address.go b/data/address.go index 8679825d..995bd92c 100644 --- a/data/address.go +++ b/data/address.go @@ -35,7 +35,7 @@ func NewAddressFromBech32String(bech32 string) (*address, error) { } // AddressAsBech32String returns the address as a bech32 string -func (a *address) AddressAsBech32String() string { +func (a *address) AddressAsBech32String() (string, error) { return core.AddressPublicKeyConverter.Encode(a.bytes) } @@ -59,7 +59,7 @@ func (a *address) IsValid() bool { // Pretty returns a short version of the bech32 address func (a *address) Pretty() string { - bech32Addr := a.AddressAsBech32String() + bech32Addr, _ := a.AddressAsBech32String() if len(bech32Addr) <= offsetPretty*2 { return bech32Addr } diff --git a/disabled/accounts.go b/disabled/accounts.go index 9c3566d0..a9561522 100644 --- a/disabled/accounts.go +++ b/disabled/accounts.go @@ -33,7 +33,7 @@ func (a *Accounts) GetStackDebugFirstEntry() []byte { } // SnapshotState does nothing -func (a *Accounts) SnapshotState(_ []byte) { +func (a *Accounts) SnapshotState(_ []byte, _ uint32) { } // GetTrie returns nil trie and nil error @@ -67,7 +67,7 @@ func (a *Accounts) SaveAccount(_ vmcommon.AccountHandler) error { } // GetAllLeaves returns nil -func (a *Accounts) GetAllLeaves(_ *common.TrieIteratorChannels, _ context.Context, _ []byte) error { +func (a *Accounts) GetAllLeaves(_ *common.TrieIteratorChannels, _ context.Context, _ []byte, _ common.TrieLeafParser) error { return nil } diff --git a/disabled/enableEpochsHandler.go b/disabled/enableEpochsHandler.go index 577a0f20..ec3bc45c 100644 --- a/disabled/enableEpochsHandler.go +++ b/disabled/enableEpochsHandler.go @@ -4,6 +4,56 @@ package disabled type EnableEpochsHandler struct { } +// NFTStopCreateEnabled returns false +func (eeh *EnableEpochsHandler) NFTStopCreateEnabled() bool { + return false +} + +// IsScToScEventLogEnabled returns false +func (eeh *EnableEpochsHandler) IsScToScEventLogEnabled() bool { + return false +} + +// IsDynamicGasCostForDataTrieStorageLoadEnabled returns false +func (eeh *EnableEpochsHandler) IsDynamicGasCostForDataTrieStorageLoadEnabled() bool { + return false +} + +// IsSCProcessorV2FlagEnabled returns false +func (eeh *EnableEpochsHandler) IsSCProcessorV2FlagEnabled() bool { + return false +} + +// IsKeepExecOrderOnCreatedSCRsEnabled returns false +func (eeh *EnableEpochsHandler) IsKeepExecOrderOnCreatedSCRsEnabled() bool { + return false +} + +// IsMultiClaimOnDelegationEnabled returns false +func (eeh *EnableEpochsHandler) IsMultiClaimOnDelegationEnabled() bool { + return false +} + +// IsChangeUsernameEnabled returns false +func (eeh *EnableEpochsHandler) IsChangeUsernameEnabled() bool { + return false +} + +// IsConsistentTokensValuesLengthCheckEnabled returns false +func (eeh *EnableEpochsHandler) IsConsistentTokensValuesLengthCheckEnabled() bool { + return false +} + +// IsAutoBalanceDataTriesEnabled returns false +func (eeh *EnableEpochsHandler) IsAutoBalanceDataTriesEnabled() bool { + return false +} + +// FixDelegationChangeOwnerOnAccountEnabled - +func (eeh *EnableEpochsHandler) FixDelegationChangeOwnerOnAccountEnabled() bool { + return false +} + // BlockGasAndFeesReCheckEnableEpoch returns 0 func (eeh *EnableEpochsHandler) BlockGasAndFeesReCheckEnableEpoch() uint32 { return 0 @@ -573,16 +623,26 @@ func (eeh *EnableEpochsHandler) IsGuardAccountEnabled() bool { return false } -// IsSetGuardianEnabled - +// IsSetGuardianEnabled returns false func (eeh *EnableEpochsHandler) IsSetGuardianEnabled() bool { return false } -// IsDeterministicSortOnValidatorsInfoFixEnabled - +// IsDeterministicSortOnValidatorsInfoFixEnabled returns false func (eeh *EnableEpochsHandler) IsDeterministicSortOnValidatorsInfoFixEnabled() bool { return false } +// IsChangeOwnerAddressCrossShardThroughSCEnabled returns false +func (eeh *EnableEpochsHandler) IsChangeOwnerAddressCrossShardThroughSCEnabled() bool { + return false +} + +// FixGasRemainingForSaveKeyValueBuiltinFunctionEnabled returns false +func (eeh *EnableEpochsHandler) FixGasRemainingForSaveKeyValueBuiltinFunctionEnabled() bool { + return false +} + // IsInterfaceNil returns true if there is no value under the interface func (eeh *EnableEpochsHandler) IsInterfaceNil() bool { return eeh == nil diff --git a/disabled/missingTrieNodesNotifier.go b/disabled/missingTrieNodesNotifier.go new file mode 100644 index 00000000..8bf5f5b0 --- /dev/null +++ b/disabled/missingTrieNodesNotifier.go @@ -0,0 +1,21 @@ +package disabled + +import "github.com/multiversx/mx-chain-go/common" + +// MissingTrieNodesNotifier is a disabled implementation of MissingTrieNodesNotifier interface +type MissingTrieNodesNotifier struct { +} + +// RegisterHandler returns nil +func (m *MissingTrieNodesNotifier) RegisterHandler(_ common.StateSyncNotifierSubscriber) error { + return nil +} + +// AsyncNotifyMissingTrieNode does nothing +func (m *MissingTrieNodesNotifier) AsyncNotifyMissingTrieNode(_ []byte) { +} + +// IsInterfaceNil returns true if there is no value under the interface +func (m *MissingTrieNodesNotifier) IsInterfaceNil() bool { + return m == nil +} diff --git a/examples/examplesTransaction/main.go b/examples/examplesTransaction/main.go index aeb7141f..6eda2fa1 100644 --- a/examples/examplesTransaction/main.go +++ b/examples/examplesTransaction/main.go @@ -67,8 +67,14 @@ func main() { return } - tx.Receiver = address.AddressAsBech32String() // send to self - tx.Value = "1000000000000000000" // 1EGLD + receiverAsBech32String, err := address.AddressAsBech32String() + if err != nil { + log.Error("unable to get receiver address as bech 32 string", "error", err) + return + } + + tx.Receiver = receiverAsBech32String // send to self + tx.Value = "1000000000000000000" // 1EGLD holder, _ := cryptoProvider.NewCryptoComponentsHolder(keyGen, privateKey) txBuilder, err := builders.NewTxBuilder(cryptoProvider.NewSigner()) diff --git a/examples/examplesWallet/main.go b/examples/examplesWallet/main.go index d6d87a9b..c767d40b 100644 --- a/examples/examplesWallet/main.go +++ b/examples/examplesWallet/main.go @@ -25,11 +25,17 @@ func main() { return } + address0AsBech32String, err := address0.AddressAsBech32String() + if err != nil { + log.Error("error getting address0 as bech32 string", "error", err) + return + } + log.Info("generated private/public key", "private key", privateKey0, "index", index0, "address as hex", address0.AddressBytes(), - "address as bech32", address0.AddressAsBech32String(), + "address as bech32", address0AsBech32String, ) // generating the private key from the same mnemonic using index 1 @@ -41,10 +47,16 @@ func main() { return } + address1AsBech32String, err := address1.AddressAsBech32String() + if err != nil { + log.Error("error getting address1 as bech32 string", "error", err) + return + } + log.Info("generated private/public key", "private key", privateKey1, "index", index1, "address as hex", address1.AddressBytes(), - "address as bech32", address1.AddressAsBech32String(), + "address as bech32", address1AsBech32String, ) } diff --git a/go.mod b/go.mod index de703214..bb3fcd19 100644 --- a/go.mod +++ b/go.mod @@ -1,26 +1,26 @@ module github.com/multiversx/mx-sdk-go -go 1.17 +go 1.20 require ( github.com/gin-contrib/cors v1.4.0 github.com/gin-gonic/gin v1.9.1 github.com/gorilla/websocket v1.5.0 - github.com/multiversx/mx-chain-core-go v1.1.37 - github.com/multiversx/mx-chain-crypto-go v1.2.6 - github.com/multiversx/mx-chain-go v1.5.12 - github.com/multiversx/mx-chain-logger-go v1.0.11 - github.com/multiversx/mx-chain-vm-common-go v1.3.42 + github.com/multiversx/mx-chain-core-go v1.2.18 + github.com/multiversx/mx-chain-crypto-go v1.2.9 + github.com/multiversx/mx-chain-go v1.6.7 + github.com/multiversx/mx-chain-logger-go v1.0.13 + github.com/multiversx/mx-chain-vm-common-go v1.5.9 github.com/pborman/uuid v1.2.1 github.com/stretchr/testify v1.8.4 github.com/tyler-smith/go-bip39 v1.1.0 github.com/urfave/cli v1.22.10 - golang.org/x/crypto v0.9.0 + golang.org/x/crypto v0.16.0 golang.org/x/oauth2 v0.5.0 ) require ( - github.com/beevik/ntp v0.3.0 // indirect + github.com/beevik/ntp v1.3.0 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/btcsuite/btcd/btcutil v1.1.3 // indirect @@ -60,7 +60,7 @@ require ( github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/golang-lru v0.6.0 // indirect github.com/hashicorp/golang-lru/v2 v2.0.2 // indirect - github.com/herumi/bls-go-binary v1.0.0 // indirect + github.com/herumi/bls-go-binary v1.28.2 // indirect github.com/huin/goupnp v1.2.0 // indirect github.com/ipfs/boxo v0.8.1 // indirect github.com/ipfs/go-cid v0.4.1 // indirect @@ -79,7 +79,7 @@ require ( github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect - github.com/libp2p/go-libp2p v0.28.1 // indirect + github.com/libp2p/go-libp2p v0.28.2 // indirect github.com/libp2p/go-libp2p-asn-util v0.3.0 // indirect github.com/libp2p/go-libp2p-kad-dht v0.23.0 // indirect github.com/libp2p/go-libp2p-kbucket v0.6.3 // indirect @@ -111,9 +111,8 @@ require ( github.com/multiformats/go-multistream v0.4.1 // indirect github.com/multiformats/go-varint v0.0.7 // indirect github.com/multiversx/concurrent-map v0.1.4 // indirect - github.com/multiversx/mx-chain-p2p-go v1.0.17 // indirect - github.com/multiversx/mx-chain-storage-go v1.0.7 // indirect - github.com/nxadm/tail v1.4.8 // indirect + github.com/multiversx/mx-chain-communication-go v1.0.12 // indirect + github.com/multiversx/mx-chain-storage-go v1.0.14 // indirect github.com/onsi/ginkgo/v2 v2.9.7 // indirect github.com/opencontainers/runtime-spec v1.0.2 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect @@ -128,8 +127,8 @@ require ( github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-19 v0.3.2 // indirect - github.com/quic-go/qtls-go1-20 v0.2.2 // indirect + github.com/quic-go/qtls-go1-19 v0.3.3 // indirect + github.com/quic-go/qtls-go1-20 v0.2.3 // indirect github.com/quic-go/quic-go v0.33.0 // indirect github.com/quic-go/webtransport-go v0.5.3 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect @@ -137,7 +136,7 @@ require ( github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tklauser/go-sysconf v0.3.4 // indirect github.com/tklauser/numcpus v0.2.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect @@ -151,19 +150,20 @@ require ( go.uber.org/atomic v1.11.0 // indirect go.uber.org/dig v1.17.0 // indirect go.uber.org/fx v1.19.2 // indirect + go.uber.org/goleak v1.2.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/arch v0.3.0 // indirect golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect golang.org/x/mod v0.10.0 // indirect - golang.org/x/net v0.10.0 // indirect + golang.org/x/net v0.19.0 // indirect golang.org/x/sync v0.2.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.9.1 // indirect gonum.org/v1/gonum v0.11.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.30.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.2.1 // indirect ) diff --git a/go.sum b/go.sum index 4b25f203..0e36f0f6 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,8 @@ git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGy github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/beevik/ntp v0.3.0 h1:xzVrPrE4ziasFXgBVBZJDP0Wg/KpMwk2KHJ4Ba8GrDw= -github.com/beevik/ntp v0.3.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= +github.com/beevik/ntp v1.3.0 h1:/w5VhpW5BGKS37vFm1p9oVk/t4HnnkKZAZIubHM6F7Q= +github.com/beevik/ntp v1.3.0/go.mod h1:vD6h1um4kzXpqmLTuu0cCLcC+NfvC0IC+ltmEDA8E78= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= @@ -53,6 +53,9 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -101,6 +104,7 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= @@ -132,6 +136,7 @@ github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91 github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= @@ -166,6 +171,7 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= @@ -187,6 +193,7 @@ github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 h1:hR7/MlvK23p6+lIw9SN1TigNLn9ZnF3W4SYRKq2gAHs= github.com/google/pprof v0.0.0-20230602150820-91b7bce49751/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= @@ -212,11 +219,12 @@ github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.2 h1:Dwmkdr5Nc/oBiXgJS3CDHNhJtIHkuZ3DZF5twqnfBdU= github.com/hashicorp/golang-lru/v2 v2.0.2/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/herumi/bls-go-binary v1.0.0 h1:PRPF6vPd35zyDy+tp86HwNnGdufCH2lZL0wZGxYvkRs= -github.com/herumi/bls-go-binary v1.0.0/go.mod h1:O4Vp1AfR4raRGwFeQpr9X/PQtncEicMoOe6BQt1oX0Y= +github.com/herumi/bls-go-binary v1.28.2 h1:F0AezsC0M1a9aZjk7g0l2hMb1F56Xtpfku97pDndNZE= +github.com/herumi/bls-go-binary v1.28.2/go.mod h1:O4Vp1AfR4raRGwFeQpr9X/PQtncEicMoOe6BQt1oX0Y= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY= github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ipfs/boxo v0.8.1 h1:3DkKBCK+3rdEB5t77WDShUXXhktYwH99mkAsgajsKrU= github.com/ipfs/boxo v0.8.1/go.mod h1:xJ2hVb4La5WyD7GvKYE0lq2g1rmQZoCD2K4WNrV6aZI= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= @@ -279,8 +287,8 @@ github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38y github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.28.1 h1:YurK+ZAI6cKfASLJBVFkpVBdl3wGhFi6fusOt725ii8= -github.com/libp2p/go-libp2p v0.28.1/go.mod h1:s3Xabc9LSwOcnv9UD4nORnXKTsWkPMkIMB/JIGXVnzk= +github.com/libp2p/go-libp2p v0.28.2 h1:lO/g0ccVru6nUVHyLE7C1VRr7B2AFp9cvHhf+l+Te6w= +github.com/libp2p/go-libp2p v0.28.2/go.mod h1:fOLgCNgLiWFdmtXyQBwmuCpukaYOA+yw4rnBiScDNmI= github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s= github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w= github.com/libp2p/go-libp2p-kad-dht v0.23.0 h1:sxE6LxLopp79eLeV695n7+c77V/Vn4AMF28AdM/XFqM= @@ -362,25 +370,26 @@ github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/n github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/multiversx/concurrent-map v0.1.4 h1:hdnbM8VE4b0KYJaGY5yJS2aNIW9TFFsUYwbO0993uPI= github.com/multiversx/concurrent-map v0.1.4/go.mod h1:8cWFRJDOrWHOTNSqgYCUvwT7c7eFQ4U2vKMOp4A/9+o= -github.com/multiversx/mx-chain-core-go v1.1.37 h1:2EYoUWjr+8zUYEt3TBMnQ+0UUZwDb71HA+KBwqDUpVQ= -github.com/multiversx/mx-chain-core-go v1.1.37/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= -github.com/multiversx/mx-chain-crypto-go v1.2.6 h1:yxsjAQGh62los+iYmORMfh3w9qen0xbYlmwU0juNSeg= -github.com/multiversx/mx-chain-crypto-go v1.2.6/go.mod h1:rOj0Rr19HTOYt9YTeym7RKxlHt91NXln3LVKjHKVmA0= -github.com/multiversx/mx-chain-es-indexer-go v1.3.20 h1:/82eDBsjlEm6dNgW44WQOBqKByRAWr3n6OWjYpi43vE= -github.com/multiversx/mx-chain-go v1.5.12 h1:DIgq+Gwu8lzpaSmusX12F9N9m6P7XA4ZsoBbtF5qhVs= -github.com/multiversx/mx-chain-go v1.5.12/go.mod h1:wD4sqoF8rkX+8qTrUMHL/xWr24r2Em9nGtwlExW78A0= -github.com/multiversx/mx-chain-logger-go v1.0.11 h1:DFsHa+sc5fKwhDR50I8uBM99RTDTEW68ESyr5ALRDwE= -github.com/multiversx/mx-chain-logger-go v1.0.11/go.mod h1:1srDkP0DQucWQ+rYfaq0BX2qLnULsUdRPADpYUTM6dA= -github.com/multiversx/mx-chain-p2p-go v1.0.17 h1:ijAwm/J4TqcDJvbWpGW9cQDNzfeaN/KfJYEVaTvM5c0= -github.com/multiversx/mx-chain-p2p-go v1.0.17/go.mod h1:Z7zPjv7adFUembS0XgxfecvvJTJOaGy09jT5JGqFyf0= -github.com/multiversx/mx-chain-storage-go v1.0.7 h1:UqLo/OLTD3IHiE/TB/SEdNRV1GG2f1R6vIP5ehHwCNw= -github.com/multiversx/mx-chain-storage-go v1.0.7/go.mod h1:gtKoV32Cg2Uy8deHzF8Ud0qAl0zv92FvWgPSYIP0Zmg= -github.com/multiversx/mx-chain-vm-common-go v1.3.42 h1:avhgUwi6f+wpHqaBk76j6islLzUlSRBXwisKoZnUXpk= -github.com/multiversx/mx-chain-vm-common-go v1.3.42/go.mod h1:r+aILrY07ue89PH+D+B+Pp0viO1U3kN98t1pXneSgkE= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54 h1:c+S0xhfOMtwWEJHMqoPf8plF3sLnz3euPj4Rd/wN2UQ= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55 h1:hmo/QQ/qY+WgsMQeBODIX+tEnM/XIf7izNs9+WbKg4Y= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81 h1:PoUugtvMIZOvsDB2FrQa54XDnRz4nFtBvPkn0PsvF3I= -github.com/multiversx/mx-components-big-int v0.1.1 h1:695mYPKYOrmGEGgRH4/pZruDoe3CPP1LHrBxKfvj5l4= +github.com/multiversx/mx-chain-communication-go v1.0.12 h1:67WOaf87gpwouydD1AAOHw5LMGZh7NfITrp/KqFY3Tw= +github.com/multiversx/mx-chain-communication-go v1.0.12/go.mod h1:+oaUowpq+SqrEmAsMPGwhz44g7L81loWb6AiNQU9Ms4= +github.com/multiversx/mx-chain-core-go v1.2.18 h1:fnub2eFL7XYOLrKKVZAPPsaM1TWEnaK5qqY3FLUv168= +github.com/multiversx/mx-chain-core-go v1.2.18/go.mod h1:BILOGHUOIG5dNNX8cgkzCNfDaVtoYrJRYcPnpxRMH84= +github.com/multiversx/mx-chain-crypto-go v1.2.9 h1:OEfF2kOQrtzUl273Z3DEcshjlTVUfPpJMd0R0SvTrlU= +github.com/multiversx/mx-chain-crypto-go v1.2.9/go.mod h1:fkaWKp1rbQN9wPKya5jeoRyC+c/SyN/NfggreyeBw+8= +github.com/multiversx/mx-chain-es-indexer-go v1.4.17 h1:XeUp+H6ZhHfOZiegpmH/Xo6t5c6xz2Rlx0j5k/dA2Ko= +github.com/multiversx/mx-chain-go v1.6.7 h1:kpIKm/slhyr+yEFMXs57CzUUzGuAMkLPfIW1ux0tkkY= +github.com/multiversx/mx-chain-go v1.6.7/go.mod h1:TEDnRLYgEKGq93x4Kv2BJODkGlVBKlhulYMegxUOyAE= +github.com/multiversx/mx-chain-logger-go v1.0.13 h1:eru/TETo0MkO4ZTnXsQDKf4PBRpAXmqjT02klNT/JnY= +github.com/multiversx/mx-chain-logger-go v1.0.13/go.mod h1:MZJhTAtZTJxT+yK2EHc4ZW3YOHUc1UdjCD0iahRNBZk= +github.com/multiversx/mx-chain-storage-go v1.0.14 h1:h0acoqPS3FKJ4S3cKBEriTU0OabSQnpxai5WKhi1YCs= +github.com/multiversx/mx-chain-storage-go v1.0.14/go.mod h1:sJ2q49tgjxNpMpsHysjABqCAB0FLBmDblbjBkQ8XfmA= +github.com/multiversx/mx-chain-vm-common-go v1.5.9 h1:PnGimbMScV5WXFjumzAmcAcnWrw5e9PQABuIcKKUgZw= +github.com/multiversx/mx-chain-vm-common-go v1.5.9/go.mod h1:sqkKMCnwkWl8DURdb9q7pctK8IANghdHY1KJLE0ox2c= +github.com/multiversx/mx-chain-vm-go v1.5.22 h1:MDMMMIu67CAyohnIBuizbFQUJJSzNgXiLKww99j1zyA= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.64 h1:3BEpSxEQibMMi4LXBjpo2y5vUa1LS7olDC2eDkmUfFQ= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.65 h1:H0Duuoz6lR6KapqLqMspWTojaVtQRiLA5lIm6XV9H04= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.92 h1:8ZcqnUQoIeM5k1F2IHvqbFzCumGwB4oVilWGuwurxpo= +github.com/multiversx/mx-components-big-int v1.0.0 h1:Wkr8lSzK2nDqixOrrBa47VNuqdhV1m/aJhaP1EMaiS8= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -390,13 +399,18 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.9.7 h1:06xGQy5www2oN160RtEZoTvnP2sPhEfePYmCDc2szss= github.com/onsi/ginkgo/v2 v2.9.7/go.mod h1:cxrmXWykAwTwhQsJOPfdIDiJ+l2RYq7U8hFU+M/1uw0= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU= github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= @@ -435,10 +449,10 @@ github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJf github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U= -github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= -github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E= -github.com/quic-go/qtls-go1-20 v0.2.2/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= +github.com/quic-go/qtls-go1-19 v0.3.3 h1:wznEHvJwd+2X3PqftRha0SUKmGsnb6dfArMhy9PeJVE= +github.com/quic-go/qtls-go1-19 v0.3.3/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= +github.com/quic-go/qtls-go1-20 v0.2.3 h1:m575dovXn1y2ATOb1XrRFcrv0F+EQmlowTkoraNkDPI= +github.com/quic-go/qtls-go1-20 v0.2.3/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= github.com/quic-go/quic-go v0.33.0 h1:ItNoTDN/Fm/zBlq769lLJc8ECe9gYaW40veHCCco7y0= github.com/quic-go/quic-go v0.33.0/go.mod h1:YMuhaAV9/jIu0XclDXwZPAsP/2Kgr5yMYhe9oxhhOFA= github.com/quic-go/webtransport-go v0.5.3 h1:5XMlzemqB4qmOlgIus5zB45AcZ2kCgCy2EptUrfOPWU= @@ -481,7 +495,7 @@ github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYED github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= -github.com/smartystreets/assertions v1.13.0 h1:Dx1kYM01xsSqKPno3aqLnrwac2LetPvN23diwyr69Qs= +github.com/smartystreets/assertions v1.13.1 h1:Ef7KhSmjZcK6AVf9YbJdvPYG9avaF0ZxudX+ThRdWfU= github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= @@ -494,17 +508,20 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/tidwall/gjson v1.14.0 h1:6aeJ0bzojgWLa82gDQHcx3S0Lr/O51I9bJ5nv6JFx5w= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -535,6 +552,7 @@ github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1: github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= @@ -553,7 +571,8 @@ go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU= go.uber.org/fx v1.19.2 h1:SyFgYQFr1Wl0AYstE8vyYIzP4bFz2URrScjwC4cwUvY= go.uber.org/fx v1.19.2/go.mod h1:43G1VcqSzbIv77y00p1DRAsyZS8WdzuYdhZXmEUkMyQ= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -579,8 +598,10 @@ golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= @@ -595,6 +616,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -618,8 +641,15 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -635,6 +665,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -649,6 +681,7 @@ golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -656,25 +689,42 @@ golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -692,15 +742,19 @@ golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.11.0 h1:f1IJhK4Km5tBJmaiJXtk/PkL4cdVX6J+tGiM187uT5E= gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= @@ -739,8 +793,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/interactors/errors.go b/interactors/errors.go index e58275ed..b5c52912 100644 --- a/interactors/errors.go +++ b/interactors/errors.go @@ -29,8 +29,8 @@ var ErrNilTransaction = errors.New("nil transaction") // ErrTxAlreadySent signals that a transaction was already sent var ErrTxAlreadySent = errors.New("transaction already sent") +// ErrTxWithSameNonceAndGasPriceAlreadySent signals that a transaction with the same nonce & gas price was already sent +var ErrTxWithSameNonceAndGasPriceAlreadySent = errors.New("transaction with the same nonce & gas price was already sent") + // ErrGapNonce signals that a gap nonce between the lowest nonce of the transactions from the cache and the blockchain nonce has been detected var ErrGapNonce = errors.New("gap nonce detected") - -// ErrNilAddressNonceHandlerCreator signals that a nil AddressNonceHandlerCreator was provided -var ErrNilAddressNonceHandlerCreator = errors.New("nil AddressNonceHandlerCreator") diff --git a/interactors/interface.go b/interactors/interface.go index 4b39b1b2..560ae1f8 100644 --- a/interactors/interface.go +++ b/interactors/interface.go @@ -56,9 +56,3 @@ type TransactionNonceHandlerV2 interface { Close() error IsInterfaceNil() bool } - -// AddressNonceHandlerCreator defines the component able to create AddressNonceHandler instances -type AddressNonceHandlerCreator interface { - Create(proxy Proxy, address core.AddressHandler) (AddressNonceHandler, error) - IsInterfaceNil() bool -} diff --git a/interactors/nonceHandlerV1/addressNonceHandler.go b/interactors/nonceHandlerV1/addressNonceHandler.go index 604951ff..f087412e 100644 --- a/interactors/nonceHandlerV1/addressNonceHandler.go +++ b/interactors/nonceHandlerV1/addressNonceHandler.go @@ -90,7 +90,12 @@ func (anh *addressNonceHandler) reSendTransactionsIfRequired(ctx context.Context return err } - log.Debug("resent transactions", "address", anh.address.AddressAsBech32String(), "total txs", len(resendableTxs), "received hashes", len(hashes)) + addressAsBech32String, err := anh.address.AddressAsBech32String() + if err != nil { + return err + } + + log.Debug("resent transactions", "address", addressAsBech32String, "total txs", len(resendableTxs), "received hashes", len(hashes)) return nil } diff --git a/interactors/nonceHandlerV1/nonceTransactionsHandler_test.go b/interactors/nonceHandlerV1/nonceTransactionsHandler_test.go index b9c8c3c6..f3459ed6 100644 --- a/interactors/nonceHandlerV1/nonceTransactionsHandler_test.go +++ b/interactors/nonceHandlerV1/nonceTransactionsHandler_test.go @@ -18,6 +18,8 @@ import ( "github.com/stretchr/testify/require" ) +var testAddressAsBech32String = "erd1zptg3eu7uw0qvzhnu009lwxupcn6ntjxptj5gaxt8curhxjqr9tsqpsnht" + func TestNewNonceTransactionHandlerV1(t *testing.T) { t.Parallel() @@ -40,13 +42,14 @@ func TestNewNonceTransactionHandlerV1(t *testing.T) { func TestNonceTransactionsHandlerV1_GetNonce(t *testing.T) { t.Parallel() - testAddress, _ := data.NewAddressFromBech32String("erd1zptg3eu7uw0qvzhnu009lwxupcn6ntjxptj5gaxt8curhxjqr9tsqpsnht") + testAddress, _ := data.NewAddressFromBech32String(testAddressAsBech32String) currentNonce := uint64(664) numCalls := 0 proxy := &testsCommon.ProxyStub{ GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - if address.AddressAsBech32String() != testAddress.AddressAsBech32String() { + addressAsBech32String, _ := address.AddressAsBech32String() + if addressAsBech32String != testAddressAsBech32String { return nil, errors.New("unexpected address") } @@ -79,7 +82,7 @@ func TestNonceTransactionsHandlerV1_GetNonce(t *testing.T) { func TestNonceTransactionsHandlerV1_SendMultipleTransactionsResendingEliminatingOne(t *testing.T) { t.Parallel() - testAddress, _ := data.NewAddressFromBech32String("erd1zptg3eu7uw0qvzhnu009lwxupcn6ntjxptj5gaxt8curhxjqr9tsqpsnht") + testAddress, _ := data.NewAddressFromBech32String(testAddressAsBech32String) currentNonce := uint64(664) mutSentTransactions := sync.Mutex{} @@ -87,7 +90,8 @@ func TestNonceTransactionsHandlerV1_SendMultipleTransactionsResendingEliminating sentTransactions := make(map[int][]*transaction.FrontendTransaction) proxy := &testsCommon.ProxyStub{ GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - if address.AddressAsBech32String() != testAddress.AddressAsBech32String() { + addressAsBech32String, _ := address.AddressAsBech32String() + if addressAsBech32String != testAddressAsBech32String { return nil, errors.New("unexpected address") } @@ -142,7 +146,7 @@ func TestNonceTransactionsHandlerV1_SendMultipleTransactionsResendingEliminating func TestNonceTransactionsHandlerV1_SendMultipleTransactionsResendingEliminatingAll(t *testing.T) { t.Parallel() - testAddress, _ := data.NewAddressFromBech32String("erd1zptg3eu7uw0qvzhnu009lwxupcn6ntjxptj5gaxt8curhxjqr9tsqpsnht") + testAddress, _ := data.NewAddressFromBech32String(testAddressAsBech32String) currentNonce := uint64(664) mutSentTransactions := sync.Mutex{} @@ -150,7 +154,8 @@ func TestNonceTransactionsHandlerV1_SendMultipleTransactionsResendingEliminating sentTransactions := make(map[int][]*transaction.FrontendTransaction) proxy := &testsCommon.ProxyStub{ GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - if address.AddressAsBech32String() != testAddress.AddressAsBech32String() { + addressAsBech32String, _ := address.AddressAsBech32String() + if addressAsBech32String != testAddressAsBech32String { return nil, errors.New("unexpected address") } @@ -192,7 +197,7 @@ func TestNonceTransactionsHandlerV1_SendMultipleTransactionsResendingEliminating func TestNonceTransactionsHandlerV1_SendTransactionResendingEliminatingAll(t *testing.T) { t.Parallel() - testAddress, _ := data.NewAddressFromBech32String("erd1zptg3eu7uw0qvzhnu009lwxupcn6ntjxptj5gaxt8curhxjqr9tsqpsnht") + testAddress, _ := data.NewAddressFromBech32String(testAddressAsBech32String) currentNonce := uint64(664) mutSentTransactions := sync.Mutex{} @@ -200,7 +205,8 @@ func TestNonceTransactionsHandlerV1_SendTransactionResendingEliminatingAll(t *te sentTransactions := make(map[int][]*transaction.FrontendTransaction) proxy := &testsCommon.ProxyStub{ GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - if address.AddressAsBech32String() != testAddress.AddressAsBech32String() { + addressAsBech32String, _ := address.AddressAsBech32String() + if addressAsBech32String != testAddressAsBech32String { return nil, errors.New("unexpected address") } @@ -242,13 +248,14 @@ func TestNonceTransactionsHandlerV1_SendTransactionResendingEliminatingAll(t *te func TestNonceTransactionsHandlerV1_SendTransactionErrors(t *testing.T) { t.Parallel() - testAddress, _ := data.NewAddressFromBech32String("erd1zptg3eu7uw0qvzhnu009lwxupcn6ntjxptj5gaxt8curhxjqr9tsqpsnht") + testAddress, _ := data.NewAddressFromBech32String(testAddressAsBech32String) currentNonce := uint64(664) var errSent error proxy := &testsCommon.ProxyStub{ GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - if address.AddressAsBech32String() != testAddress.AddressAsBech32String() { + addressAsBech32String, _ := address.AddressAsBech32String() + if addressAsBech32String != testAddressAsBech32String { return nil, errors.New("unexpected address") } @@ -278,12 +285,14 @@ func TestNonceTransactionsHandlerV1_SendTransactionErrors(t *testing.T) { func createMockTransactions(addr core.AddressHandler, numTxs int, startNonce uint64) []*transaction.FrontendTransaction { txs := make([]*transaction.FrontendTransaction, 0, numTxs) + + addrAsBech32String, _ := addr.AddressAsBech32String() for i := 0; i < numTxs; i++ { tx := &transaction.FrontendTransaction{ Nonce: startNonce, Value: "1", - Receiver: addr.AddressAsBech32String(), - Sender: addr.AddressAsBech32String(), + Receiver: addrAsBech32String, + Sender: addrAsBech32String, GasPrice: 100000, GasLimit: 50000, Data: nil, @@ -302,7 +311,7 @@ func createMockTransactions(addr core.AddressHandler, numTxs int, startNonce uin func TestNonceTransactionsHandlerV1_SendTransactionsWithGetNonce(t *testing.T) { t.Parallel() - testAddress, _ := data.NewAddressFromBech32String("erd1zptg3eu7uw0qvzhnu009lwxupcn6ntjxptj5gaxt8curhxjqr9tsqpsnht") + testAddress, _ := data.NewAddressFromBech32String(testAddressAsBech32String) currentNonce := uint64(664) mutSentTransactions := sync.Mutex{} @@ -310,7 +319,8 @@ func TestNonceTransactionsHandlerV1_SendTransactionsWithGetNonce(t *testing.T) { sentTransactions := make(map[int][]*transaction.FrontendTransaction) proxy := &testsCommon.ProxyStub{ GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - if address.AddressAsBech32String() != testAddress.AddressAsBech32String() { + addressAsBech32String, _ := address.AddressAsBech32String() + if addressAsBech32String != testAddressAsBech32String { return nil, errors.New("unexpected address") } @@ -350,13 +360,15 @@ func TestNonceTransactionsHandlerV1_SendTransactionsWithGetNonce(t *testing.T) { } func TestNonceTransactionsHandlerV1_SendDuplicateTransactions(t *testing.T) { - testAddress, _ := data.NewAddressFromBech32String("erd1zptg3eu7uw0qvzhnu009lwxupcn6ntjxptj5gaxt8curhxjqr9tsqpsnht") + + testAddress, _ := data.NewAddressFromBech32String(testAddressAsBech32String) currentNonce := uint64(664) numCalls := 0 proxy := &testsCommon.ProxyStub{ GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - if address.AddressAsBech32String() != testAddress.AddressAsBech32String() { + addressAsBech32String, _ := address.AddressAsBech32String() + if addressAsBech32String != testAddressAsBech32String { return nil, errors.New("unexpected address") } @@ -378,8 +390,8 @@ func TestNonceTransactionsHandlerV1_SendDuplicateTransactions(t *testing.T) { tx := &transaction.FrontendTransaction{ Nonce: nonce, Value: "1", - Receiver: testAddress.AddressAsBech32String(), - Sender: testAddress.AddressAsBech32String(), + Receiver: testAddressAsBech32String, + Sender: testAddressAsBech32String, GasPrice: 100000, GasLimit: 50000, Data: nil, @@ -411,6 +423,7 @@ func createMockTransactionsWithGetNonce( nth interactors.TransactionNonceHandlerV1, ) []*transaction.FrontendTransaction { txs := make([]*transaction.FrontendTransaction, 0, numTxs) + addrAsBech32String, _ := addr.AddressAsBech32String() for i := 0; i < numTxs; i++ { nonce, err := nth.GetNonce(context.Background(), addr) require.Nil(tb, err) @@ -418,8 +431,8 @@ func createMockTransactionsWithGetNonce( tx := &transaction.FrontendTransaction{ Nonce: nonce, Value: "1", - Receiver: addr.AddressAsBech32String(), - Sender: addr.AddressAsBech32String(), + Receiver: addrAsBech32String, + Sender: addrAsBech32String, GasPrice: 100000, GasLimit: 50000, Data: nil, @@ -437,12 +450,13 @@ func createMockTransactionsWithGetNonce( func TestNonceTransactionsHandlerV1_ForceNonceReFetch(t *testing.T) { t.Parallel() - testAddress, _ := data.NewAddressFromBech32String("erd1zptg3eu7uw0qvzhnu009lwxupcn6ntjxptj5gaxt8curhxjqr9tsqpsnht") + testAddress, _ := data.NewAddressFromBech32String(testAddressAsBech32String) currentNonce := uint64(664) proxy := &testsCommon.ProxyStub{ GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - if address.AddressAsBech32String() != testAddress.AddressAsBech32String() { + addressAsBech32String, _ := address.AddressAsBech32String() + if addressAsBech32String != testAddressAsBech32String { return nil, errors.New("unexpected address") } diff --git a/interactors/nonceHandlerV2/addressNonceHandler.go b/interactors/nonceHandlerV2/addressNonceHandler.go index a77a84fb..5b69ee37 100644 --- a/interactors/nonceHandlerV2/addressNonceHandler.go +++ b/interactors/nonceHandlerV2/addressNonceHandler.go @@ -1,7 +1,6 @@ package nonceHandlerV2 import ( - "bytes" "context" "sync" @@ -12,9 +11,6 @@ import ( "github.com/multiversx/mx-sdk-go/interactors" ) -//TODO EN-13182: create a baseAddressNonceHandler component that can remove the duplicate code as much as possible from the -// addressNonceHandler and singleTransactionAddressNonceHandler - // addressNonceHandler is the handler used for one address. It is able to handle the current // nonce as max(current_stored_nonce, account_nonce). After each call of the getNonce function // the current_stored_nonce is incremented. This will prevent "nonce too low in transaction" @@ -51,9 +47,9 @@ func NewAddressNonceHandler(proxy interactors.Proxy, address sdkCore.AddressHand // ApplyNonceAndGasPrice will apply the computed nonce to the given FrontendTransaction func (anh *addressNonceHandler) ApplyNonceAndGasPrice(ctx context.Context, tx *transaction.FrontendTransaction) error { - oldTx, alreadyExists := anh.isTxAlreadySent(tx) - if alreadyExists { - err := anh.handleTxAlreadyExists(oldTx, tx) + oldTx := anh.getOlderTxWithSameNonce(tx) + if oldTx != nil { + err := anh.handleTxWithSameNonce(oldTx, tx) if err != nil { return err } @@ -70,7 +66,7 @@ func (anh *addressNonceHandler) ApplyNonceAndGasPrice(ctx context.Context, tx *t return nil } -func (anh *addressNonceHandler) handleTxAlreadyExists(oldTx *transaction.FrontendTransaction, tx *transaction.FrontendTransaction) error { +func (anh *addressNonceHandler) handleTxWithSameNonce(oldTx *transaction.FrontendTransaction, tx *transaction.FrontendTransaction) error { if oldTx.GasPrice < tx.GasPrice { return nil } @@ -79,7 +75,7 @@ func (anh *addressNonceHandler) handleTxAlreadyExists(oldTx *transaction.Fronten return nil } - return interactors.ErrTxAlreadySent + return interactors.ErrTxWithSameNonceAndGasPriceAlreadySent } func (anh *addressNonceHandler) fetchGasPriceIfRequired(ctx context.Context, nonce uint64) { @@ -160,7 +156,12 @@ func (anh *addressNonceHandler) ReSendTransactionsIfRequired(ctx context.Context return err } - log.Debug("resent transactions", "address", anh.address.AddressAsBech32String(), "total txs", len(resendableTxs), "received hashes", len(hashes)) + addressAsBech32String, err := anh.address.AddressAsBech32String() + if err != nil { + return err + } + + log.Debug("resent transactions", "address", addressAsBech32String, "total txs", len(resendableTxs), "received hashes", len(hashes)) return nil } @@ -184,18 +185,11 @@ func (anh *addressNonceHandler) DropTransactions() { anh.mut.Unlock() } -func (anh *addressNonceHandler) isTxAlreadySent(tx *transaction.FrontendTransaction) (*transaction.FrontendTransaction, bool) { +func (anh *addressNonceHandler) getOlderTxWithSameNonce(tx *transaction.FrontendTransaction) *transaction.FrontendTransaction { anh.mut.RLock() defer anh.mut.RUnlock() - for _, oldTx := range anh.transactions { - isTheSameReceiverDataValue := oldTx.Receiver == tx.Receiver && - bytes.Equal(oldTx.Data, tx.Data) && - oldTx.Value == tx.Value - if isTheSameReceiverDataValue { - return oldTx, true - } - } - return nil, false + + return anh.transactions[tx.Nonce] } // IsInterfaceNil returns true if there is no value under the interface diff --git a/interactors/nonceHandlerV2/addressNonceHandlerCreator.go b/interactors/nonceHandlerV2/addressNonceHandlerCreator.go deleted file mode 100644 index a6f81b2d..00000000 --- a/interactors/nonceHandlerV2/addressNonceHandlerCreator.go +++ /dev/null @@ -1,19 +0,0 @@ -package nonceHandlerV2 - -import ( - "github.com/multiversx/mx-sdk-go/core" - "github.com/multiversx/mx-sdk-go/interactors" -) - -// AddressNonceHandlerCreator is used to create addressNonceHandler instances -type AddressNonceHandlerCreator struct{} - -// Create will create -func (anhc *AddressNonceHandlerCreator) Create(proxy interactors.Proxy, address core.AddressHandler) (interactors.AddressNonceHandler, error) { - return NewAddressNonceHandler(proxy, address) -} - -// IsInterfaceNil returns true if there is no value under the interface -func (anhc *AddressNonceHandlerCreator) IsInterfaceNil() bool { - return anhc == nil -} diff --git a/interactors/nonceHandlerV2/addressNonceHandlerCreator_test.go b/interactors/nonceHandlerV2/addressNonceHandlerCreator_test.go deleted file mode 100644 index 8583a9ad..00000000 --- a/interactors/nonceHandlerV2/addressNonceHandlerCreator_test.go +++ /dev/null @@ -1,27 +0,0 @@ -package nonceHandlerV2 - -import ( - "crypto/rand" - "fmt" - "testing" - - "github.com/multiversx/mx-sdk-go/data" - "github.com/multiversx/mx-sdk-go/testsCommon" - "github.com/stretchr/testify/require" -) - -func TestAddressNonceHandlerCreator_Create(t *testing.T) { - t.Parallel() - - creator := AddressNonceHandlerCreator{} - require.False(t, creator.IsInterfaceNil()) - pubkey := make([]byte, 32) - _, _ = rand.Read(pubkey) - addressHandler := data.NewAddressFromBytes(pubkey) - - create, err := creator.Create(&testsCommon.ProxyStub{}, addressHandler) - require.Nil(t, err) - require.NotNil(t, create) - require.Equal(t, "*nonceHandlerV2.addressNonceHandler", fmt.Sprintf("%T", create)) - -} diff --git a/interactors/nonceHandlerV2/addressNonceHandler_test.go b/interactors/nonceHandlerV2/addressNonceHandler_test.go index 560453c9..8b90bdfa 100644 --- a/interactors/nonceHandlerV2/addressNonceHandler_test.go +++ b/interactors/nonceHandlerV2/addressNonceHandler_test.go @@ -15,7 +15,8 @@ import ( "github.com/stretchr/testify/require" ) -var testAddress, _ = data.NewAddressFromBech32String("erd1zptg3eu7uw0qvzhnu009lwxupcn6ntjxptj5gaxt8curhxjqr9tsqpsnht") +var testAddressAsBech32String = "erd1zptg3eu7uw0qvzhnu009lwxupcn6ntjxptj5gaxt8curhxjqr9tsqpsnht" +var testAddress, _ = data.NewAddressFromBech32String(testAddressAsBech32String) var expectedErr = errors.New("expected error") func TestAddressNonceHandler_NewAddressNonceHandlerWithPrivateAccess(t *testing.T) { @@ -57,12 +58,15 @@ func TestAddressNonceHandler_ApplyNonceAndGasPrice(t *testing.T) { anh, err := NewAddressNonceHandlerWithPrivateAccess(&testsCommon.ProxyStub{}, testAddress) require.Nil(t, err) + err = anh.ApplyNonceAndGasPrice(context.Background(), &tx) + require.Nil(t, err) + _, err = anh.SendTransaction(context.Background(), &tx) require.Nil(t, err) anh.gasPrice = tx.GasPrice err = anh.ApplyNonceAndGasPrice(context.Background(), &tx) - require.Equal(t, interactors.ErrTxAlreadySent, err) + require.Equal(t, interactors.ErrTxWithSameNonceAndGasPriceAlreadySent, err) }) t.Run("tx already sent; oldTx.GasPrice < txArgs.GasPrice", func(t *testing.T) { t.Parallel() @@ -74,12 +78,18 @@ func TestAddressNonceHandler_ApplyNonceAndGasPrice(t *testing.T) { anh, err := NewAddressNonceHandlerWithPrivateAccess(&testsCommon.ProxyStub{}, testAddress) require.Nil(t, err) + err = anh.ApplyNonceAndGasPrice(context.Background(), &tx) + require.Nil(t, err) + _, err = anh.SendTransaction(context.Background(), &tx) require.Nil(t, err) anh.gasPrice = initialGasPrice err = anh.ApplyNonceAndGasPrice(context.Background(), &tx) require.Nil(t, err) + + _, err = anh.SendTransaction(context.Background(), &tx) + require.Nil(t, err) }) t.Run("oldTx.GasPrice == txArgs.GasPrice && oldTx.GasPrice < anh.gasPrice", func(t *testing.T) { t.Parallel() @@ -88,12 +98,40 @@ func TestAddressNonceHandler_ApplyNonceAndGasPrice(t *testing.T) { anh, err := NewAddressNonceHandlerWithPrivateAccess(&testsCommon.ProxyStub{}, testAddress) require.Nil(t, err) + err = anh.ApplyNonceAndGasPrice(context.Background(), &tx) + require.Nil(t, err) + _, err = anh.SendTransaction(context.Background(), &tx) require.Nil(t, err) anh.gasPrice = tx.GasPrice + 1 err = anh.ApplyNonceAndGasPrice(context.Background(), &tx) require.Nil(t, err) + + _, err = anh.SendTransaction(context.Background(), &tx) + require.Nil(t, err) + }) + t.Run("same transaction but with different nonce should work", func(t *testing.T) { + t.Parallel() + + tx1 := createDefaultTx() + tx2 := createDefaultTx() + tx2.Nonce++ + + anh, err := NewAddressNonceHandlerWithPrivateAccess(&testsCommon.ProxyStub{}, testAddress) + require.Nil(t, err) + + err = anh.ApplyNonceAndGasPrice(context.Background(), &tx1) + require.Nil(t, err) + + _, err = anh.SendTransaction(context.Background(), &tx1) + require.Nil(t, err) + + err = anh.ApplyNonceAndGasPrice(context.Background(), &tx2) + require.Nil(t, err) + + _, err = anh.SendTransaction(context.Background(), &tx2) + require.Nil(t, err) }) } @@ -353,8 +391,8 @@ func TestAddressNonceHandler_fetchGasPriceIfRequired(t *testing.T) { func createDefaultTx() transaction.FrontendTransaction { return transaction.FrontendTransaction{ Value: "1", - Receiver: testAddress.AddressAsBech32String(), - Sender: testAddress.AddressAsBech32String(), + Receiver: testAddressAsBech32String, + Sender: testAddressAsBech32String, GasPrice: 100000, GasLimit: 50000, Data: nil, diff --git a/interactors/nonceHandlerV2/nonceTransactionsHandler.go b/interactors/nonceHandlerV2/nonceTransactionsHandler.go index 52ece9ff..297fc78d 100644 --- a/interactors/nonceHandlerV2/nonceTransactionsHandler.go +++ b/interactors/nonceHandlerV2/nonceTransactionsHandler.go @@ -22,7 +22,6 @@ var log = logger.GetOrCreate("mx-sdk-go/interactors/nonceHandlerV2") type ArgsNonceTransactionsHandlerV2 struct { Proxy interactors.Proxy IntervalToResend time.Duration - Creator interactors.AddressNonceHandlerCreator } // nonceTransactionsHandlerV2 is the handler used for an unlimited number of addresses. @@ -36,7 +35,6 @@ type ArgsNonceTransactionsHandlerV2 struct { type nonceTransactionsHandlerV2 struct { proxy interactors.Proxy mutHandlers sync.RWMutex - creator interactors.AddressNonceHandlerCreator handlers map[string]interactors.AddressNonceHandler cancelFunc func() intervalToResend time.Duration @@ -51,15 +49,11 @@ func NewNonceTransactionHandlerV2(args ArgsNonceTransactionsHandlerV2) (*nonceTr if args.IntervalToResend < minimumIntervalToResend { return nil, fmt.Errorf("%w for intervalToResend in NewNonceTransactionHandlerV2", interactors.ErrInvalidValue) } - if check.IfNil(args.Creator) { - return nil, interactors.ErrNilAddressNonceHandlerCreator - } nth := &nonceTransactionsHandlerV2{ proxy: args.Proxy, handlers: make(map[string]interactors.AddressNonceHandler), intervalToResend: args.IntervalToResend, - creator: args.Creator, } ctx, cancelFunc := context.WithCancel(context.Background()) @@ -115,7 +109,8 @@ func (nth *nonceTransactionsHandlerV2) createAddressNonceHandler(address core.Ad if found { return anh, nil } - anh, err := nth.creator.Create(nth.proxy, address) + + anh, err := NewAddressNonceHandler(nth.proxy, address) if err != nil { return nil, err } @@ -130,7 +125,11 @@ func (nth *nonceTransactionsHandlerV2) SendTransaction(ctx context.Context, tx * return "", interactors.ErrNilTransaction } - addrAsBech32 := tx.Sender + // Work with a full copy of the provided transaction so the provided one can change without affecting this component. + // Abnormal and unpredictable behaviors due to the resending mechanism are prevented this way + txCopy := *tx + + addrAsBech32 := txCopy.Sender address, err := data.NewAddressFromBech32String(addrAsBech32) if err != nil { return "", fmt.Errorf("%w while creating address handler for string %s", err, addrAsBech32) @@ -141,7 +140,7 @@ func (nth *nonceTransactionsHandlerV2) SendTransaction(ctx context.Context, tx * return "", err } - sentHash, err := anh.SendTransaction(ctx, tx) + sentHash, err := anh.SendTransaction(ctx, &txCopy) if err != nil { return "", fmt.Errorf("%w while sending transaction for address %s", err, addrAsBech32) } diff --git a/interactors/nonceHandlerV2/nonceTransactionsHandler_test.go b/interactors/nonceHandlerV2/nonceTransactionsHandler_test.go index 89d34174..0023fa40 100644 --- a/interactors/nonceHandlerV2/nonceTransactionsHandler_test.go +++ b/interactors/nonceHandlerV2/nonceTransactionsHandler_test.go @@ -13,7 +13,6 @@ import ( "github.com/multiversx/mx-sdk-go/data" "github.com/multiversx/mx-sdk-go/interactors" "github.com/multiversx/mx-sdk-go/testsCommon" - testsInteractors "github.com/multiversx/mx-sdk-go/testsCommon/interactors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -30,15 +29,6 @@ func TestNewNonceTransactionHandlerV2(t *testing.T) { require.Nil(t, nth) assert.Equal(t, interactors.ErrNilProxy, err) }) - t.Run("nil AddressNonceHandlerCreator", func(t *testing.T) { - t.Parallel() - - args := createMockArgsNonceTransactionsHandlerV2() - args.Creator = nil - nth, err := NewNonceTransactionHandlerV2(args) - require.Nil(t, nth) - assert.Equal(t, interactors.ErrNilAddressNonceHandlerCreator, err) - }) t.Run("should work", func(t *testing.T) { t.Parallel() @@ -60,7 +50,8 @@ func TestNonceTransactionsHandlerV2_GetNonce(t *testing.T) { args := createMockArgsNonceTransactionsHandlerV2() args.Proxy = &testsCommon.ProxyStub{ GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - if address.AddressAsBech32String() != testAddress.AddressAsBech32String() { + addressAsBech32String, _ := address.AddressAsBech32String() + if addressAsBech32String != testAddressAsBech32String { return nil, errors.New("unexpected address") } @@ -102,7 +93,8 @@ func TestNonceTransactionsHandlerV2_SendMultipleTransactionsResendingEliminating args := createMockArgsNonceTransactionsHandlerV2() args.Proxy = &testsCommon.ProxyStub{ GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - if address.AddressAsBech32String() != testAddress.AddressAsBech32String() { + addressAsBech32String, _ := address.AddressAsBech32String() + if addressAsBech32String != testAddressAsBech32String { return nil, errors.New("unexpected address") } @@ -166,7 +158,8 @@ func TestNonceTransactionsHandlerV2_SendMultipleTransactionsResendingEliminating args := createMockArgsNonceTransactionsHandlerV2() args.Proxy = &testsCommon.ProxyStub{ GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - if address.AddressAsBech32String() != testAddress.AddressAsBech32String() { + addressAsBech32String, _ := address.AddressAsBech32String() + if addressAsBech32String != testAddressAsBech32String { return nil, errors.New("unexpected address") } @@ -216,7 +209,8 @@ func TestNonceTransactionsHandlerV2_SendTransactionResendingEliminatingAll(t *te args := createMockArgsNonceTransactionsHandlerV2() args.Proxy = &testsCommon.ProxyStub{ GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - if address.AddressAsBech32String() != testAddress.AddressAsBech32String() { + addressAsBech32String, _ := address.AddressAsBech32String() + if addressAsBech32String != testAddressAsBech32String { return nil, errors.New("unexpected address") } @@ -265,7 +259,8 @@ func TestNonceTransactionsHandlerV2_SendTransactionErrors(t *testing.T) { args := createMockArgsNonceTransactionsHandlerV2() args.Proxy = &testsCommon.ProxyStub{ GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - if address.AddressAsBech32String() != testAddress.AddressAsBech32String() { + addressAsBech32String, _ := address.AddressAsBech32String() + if addressAsBech32String != testAddressAsBech32String { return nil, errors.New("unexpected address") } @@ -295,12 +290,13 @@ func TestNonceTransactionsHandlerV2_SendTransactionErrors(t *testing.T) { func createMockTransactions(addr core.AddressHandler, numTxs int, startNonce uint64) []*transaction.FrontendTransaction { txs := make([]*transaction.FrontendTransaction, 0, numTxs) + addrAsBech32String, _ := addr.AddressAsBech32String() for i := 0; i < numTxs; i++ { tx := &transaction.FrontendTransaction{ Nonce: startNonce, Value: "1", - Receiver: addr.AddressAsBech32String(), - Sender: addr.AddressAsBech32String(), + Receiver: addrAsBech32String, + Sender: addrAsBech32String, GasPrice: 100000, GasLimit: 50000, Data: nil, @@ -328,7 +324,8 @@ func TestNonceTransactionsHandlerV2_SendTransactionsWithGetNonce(t *testing.T) { args := createMockArgsNonceTransactionsHandlerV2() args.Proxy = &testsCommon.ProxyStub{ GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - if address.AddressAsBech32String() != testAddress.AddressAsBech32String() { + addressAsBech32String, _ := address.AddressAsBech32String() + if addressAsBech32String != testAddressAsBech32String { return nil, errors.New("unexpected address") } @@ -368,14 +365,16 @@ func TestNonceTransactionsHandlerV2_SendTransactionsWithGetNonce(t *testing.T) { } func TestNonceTransactionsHandlerV2_SendDuplicateTransactions(t *testing.T) { - currentNonce := uint64(664) + initialNonce := uint64(664) + currentNonce := initialNonce numCalls := 0 args := createMockArgsNonceTransactionsHandlerV2() args.Proxy = &testsCommon.ProxyStub{ GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - if address.AddressAsBech32String() != testAddress.AddressAsBech32String() { + addressAsBech32String, _ := address.AddressAsBech32String() + if addressAsBech32String != testAddressAsBech32String { return nil, errors.New("unexpected address") } @@ -385,7 +384,7 @@ func TestNonceTransactionsHandlerV2_SendDuplicateTransactions(t *testing.T) { }, SendTransactionCalled: func(tx *transaction.FrontendTransaction) (string, error) { require.LessOrEqual(t, numCalls, 1) - currentNonce++ + atomic.AddUint64(¤tNonce, 1) return "", nil }, } @@ -393,8 +392,8 @@ func TestNonceTransactionsHandlerV2_SendDuplicateTransactions(t *testing.T) { tx := &transaction.FrontendTransaction{ Value: "1", - Receiver: testAddress.AddressAsBech32String(), - Sender: testAddress.AddressAsBech32String(), + Receiver: testAddressAsBech32String, + Sender: testAddressAsBech32String, GasPrice: 100000, GasLimit: 50000, Data: nil, @@ -411,15 +410,15 @@ func TestNonceTransactionsHandlerV2_SendDuplicateTransactions(t *testing.T) { require.True(t, ok) // after sending first tx, nonce shall increase - require.Equal(t, accWithPrivateAccess.computedNonce+1, currentNonce) + require.Equal(t, atomic.LoadUint64(¤tNonce), accWithPrivateAccess.computedNonce+1) // trying to apply nonce for the same tx, NonceTransactionHandler shall return ErrTxAlreadySent // and computedNonce shall not increase - tx.Nonce = 0 + tx.Nonce = initialNonce err = nth.ApplyNonceAndGasPrice(context.Background(), testAddress, tx) - require.Equal(t, err, interactors.ErrTxAlreadySent) - require.Equal(t, tx.Nonce, uint64(0)) - require.Equal(t, accWithPrivateAccess.computedNonce+1, currentNonce) + require.Equal(t, interactors.ErrTxWithSameNonceAndGasPriceAlreadySent, err) + require.Equal(t, initialNonce, tx.Nonce) + require.Equal(t, currentNonce, accWithPrivateAccess.computedNonce+1) } func createMockTransactionsWithGetNonce( @@ -429,14 +428,15 @@ func createMockTransactionsWithGetNonce( nth *nonceTransactionsHandlerV2, ) []*transaction.FrontendTransaction { txs := make([]*transaction.FrontendTransaction, 0, numTxs) + addrAsBech32String, _ := addr.AddressAsBech32String() for i := 0; i < numTxs; i++ { tx := &transaction.FrontendTransaction{} err := nth.ApplyNonceAndGasPrice(context.Background(), addr, tx) require.Nil(tb, err) tx.Value = "1" - tx.Receiver = addr.AddressAsBech32String() - tx.Sender = addr.AddressAsBech32String() + tx.Receiver = addrAsBech32String + tx.Sender = addrAsBech32String tx.GasLimit = 50000 tx.Data = nil tx.Signature = "sig" @@ -457,7 +457,8 @@ func TestNonceTransactionsHandlerV2_ForceNonceReFetch(t *testing.T) { args := createMockArgsNonceTransactionsHandlerV2() args.Proxy = &testsCommon.ProxyStub{ GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - if address.AddressAsBech32String() != testAddress.AddressAsBech32String() { + addressAsBech32String, _ := address.AddressAsBech32String() + if addressAsBech32String != testAddressAsBech32String { return nil, errors.New("unexpected address") } @@ -490,10 +491,5 @@ func createMockArgsNonceTransactionsHandlerV2() ArgsNonceTransactionsHandlerV2 { return ArgsNonceTransactionsHandlerV2{ Proxy: &testsCommon.ProxyStub{}, IntervalToResend: time.Second * 2, - Creator: &testsInteractors.AddressNonceHandlerCreatorStub{ - CreateCalled: func(proxy interactors.Proxy, address core.AddressHandler) (interactors.AddressNonceHandler, error) { - return NewAddressNonceHandler(proxy, address) - }, - }, } } diff --git a/interactors/nonceHandlerV2/singleTransactionAddressNonceHandler.go b/interactors/nonceHandlerV2/singleTransactionAddressNonceHandler.go deleted file mode 100644 index a0c2ff81..00000000 --- a/interactors/nonceHandlerV2/singleTransactionAddressNonceHandler.go +++ /dev/null @@ -1,120 +0,0 @@ -package nonceHandlerV2 - -import ( - "context" - "sync" - - "github.com/multiversx/mx-chain-core-go/core" - "github.com/multiversx/mx-chain-core-go/core/check" - "github.com/multiversx/mx-chain-core-go/data/transaction" - sdkCore "github.com/multiversx/mx-sdk-go/core" - "github.com/multiversx/mx-sdk-go/interactors" -) - -type singleTransactionAddressNonceHandler struct { - mut sync.RWMutex - address sdkCore.AddressHandler - transaction *transaction.FrontendTransaction - gasPrice uint64 - nonceUntilGasIncreased uint64 - proxy interactors.Proxy -} - -// NewSingleTransactionAddressNonceHandler returns a new instance of a singleTransactionAddressNonceHandler -func NewSingleTransactionAddressNonceHandler(proxy interactors.Proxy, address sdkCore.AddressHandler) (*singleTransactionAddressNonceHandler, error) { - if check.IfNil(proxy) { - return nil, interactors.ErrNilProxy - } - if check.IfNil(address) { - return nil, interactors.ErrNilAddress - } - return &singleTransactionAddressNonceHandler{ - address: address, - proxy: proxy, - }, nil -} - -// ApplyNonceAndGasPrice will apply the computed nonce to the given FrontendTransaction -func (anh *singleTransactionAddressNonceHandler) ApplyNonceAndGasPrice(ctx context.Context, tx *transaction.FrontendTransaction) error { - nonce, err := anh.getNonce(ctx) - if err != nil { - return err - } - tx.Nonce = nonce - - anh.fetchGasPriceIfRequired(ctx, nonce) - tx.GasPrice = core.MaxUint64(anh.gasPrice, tx.GasPrice) - return nil -} - -func (anh *singleTransactionAddressNonceHandler) fetchGasPriceIfRequired(ctx context.Context, nonce uint64) { - if nonce == anh.nonceUntilGasIncreased+1 || anh.gasPrice == 0 { - networkConfig, err := anh.proxy.GetNetworkConfig(ctx) - - anh.mut.Lock() - defer anh.mut.Unlock() - if err != nil { - log.Error("%w: while fetching network config", err) - anh.gasPrice = 0 - return - } - anh.gasPrice = networkConfig.MinGasPrice - } -} - -func (anh *singleTransactionAddressNonceHandler) getNonce(ctx context.Context) (uint64, error) { - account, err := anh.proxy.GetAccount(ctx, anh.address) - if err != nil { - return 0, err - } - - return account.Nonce, nil -} - -// ReSendTransactionsIfRequired will resend the cached transaction if it still has a nonce greater than the one fetched from the blockchain -func (anh *singleTransactionAddressNonceHandler) ReSendTransactionsIfRequired(ctx context.Context) error { - if anh.transaction == nil { - return nil - } - nonce, err := anh.getNonce(ctx) - if err != nil { - return err - } - - if anh.transaction.Nonce != nonce { - anh.transaction = nil - return nil - } - - hash, err := anh.proxy.SendTransaction(ctx, anh.transaction) - if err != nil { - return err - } - - log.Debug("resent transaction", "address", anh.address.AddressAsBech32String(), "hash", hash) - - return nil -} - -// SendTransaction will save and propagate a transaction to the network -func (anh *singleTransactionAddressNonceHandler) SendTransaction(ctx context.Context, tx *transaction.FrontendTransaction) (string, error) { - anh.mut.Lock() - anh.transaction = tx - anh.mut.Unlock() - - return anh.proxy.SendTransaction(ctx, tx) -} - -// DropTransactions will delete the cached transaction and will try to replace the current transaction from the pool using more gas price -func (anh *singleTransactionAddressNonceHandler) DropTransactions() { - anh.mut.Lock() - defer anh.mut.Unlock() - anh.gasPrice++ - anh.nonceUntilGasIncreased = anh.transaction.Nonce - anh.transaction = nil -} - -// IsInterfaceNil returns true if there is no value under the interface -func (anh *singleTransactionAddressNonceHandler) IsInterfaceNil() bool { - return anh == nil -} diff --git a/interactors/nonceHandlerV2/singleTransactionAddressNonceHandlerCreator.go b/interactors/nonceHandlerV2/singleTransactionAddressNonceHandlerCreator.go deleted file mode 100644 index 5f9b7b56..00000000 --- a/interactors/nonceHandlerV2/singleTransactionAddressNonceHandlerCreator.go +++ /dev/null @@ -1,19 +0,0 @@ -package nonceHandlerV2 - -import ( - "github.com/multiversx/mx-sdk-go/core" - "github.com/multiversx/mx-sdk-go/interactors" -) - -// SingleTransactionAddressNonceHandlerCreator is used to create singleTransactionAddressNonceHandler instances -type SingleTransactionAddressNonceHandlerCreator struct{} - -// Create will create -func (anhc *SingleTransactionAddressNonceHandlerCreator) Create(proxy interactors.Proxy, address core.AddressHandler) (interactors.AddressNonceHandler, error) { - return NewSingleTransactionAddressNonceHandler(proxy, address) -} - -// IsInterfaceNil returns true if there is no value under the interface -func (anhc *SingleTransactionAddressNonceHandlerCreator) IsInterfaceNil() bool { - return anhc == nil -} diff --git a/interactors/nonceHandlerV2/singleTransactionAddressNonceHandlerCreator_test.go b/interactors/nonceHandlerV2/singleTransactionAddressNonceHandlerCreator_test.go deleted file mode 100644 index 36e2f6e6..00000000 --- a/interactors/nonceHandlerV2/singleTransactionAddressNonceHandlerCreator_test.go +++ /dev/null @@ -1,27 +0,0 @@ -package nonceHandlerV2 - -import ( - "crypto/rand" - "fmt" - "testing" - - "github.com/multiversx/mx-sdk-go/data" - "github.com/multiversx/mx-sdk-go/testsCommon" - "github.com/stretchr/testify/require" -) - -func TestSingleTransactionAddressNonceHandlerCreator_Create(t *testing.T) { - t.Parallel() - - creator := SingleTransactionAddressNonceHandlerCreator{} - require.False(t, creator.IsInterfaceNil()) - pubkey := make([]byte, 32) - _, _ = rand.Read(pubkey) - addressHandler := data.NewAddressFromBytes(pubkey) - - create, err := creator.Create(&testsCommon.ProxyStub{}, addressHandler) - require.Nil(t, err) - require.NotNil(t, create) - require.Equal(t, "*nonceHandlerV2.singleTransactionAddressNonceHandler", fmt.Sprintf("%T", create)) - -} diff --git a/interactors/nonceHandlerV2/singleTransactionAddressNonceHandler_test.go b/interactors/nonceHandlerV2/singleTransactionAddressNonceHandler_test.go deleted file mode 100644 index 4e276ccd..00000000 --- a/interactors/nonceHandlerV2/singleTransactionAddressNonceHandler_test.go +++ /dev/null @@ -1,244 +0,0 @@ -package nonceHandlerV2 - -import ( - "context" - "crypto/rand" - "testing" - - "github.com/multiversx/mx-chain-core-go/data/transaction" - "github.com/multiversx/mx-sdk-go/core" - "github.com/multiversx/mx-sdk-go/data" - "github.com/multiversx/mx-sdk-go/interactors" - "github.com/multiversx/mx-sdk-go/testsCommon" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestSingleTransactionAddressNonceHandler_NewSingleTransactionAddressNonceHandler(t *testing.T) { - t.Parallel() - - t.Run("nil proxy", func(t *testing.T) { - t.Parallel() - - anh, err := NewSingleTransactionAddressNonceHandler(nil, nil) - assert.Nil(t, anh) - assert.Equal(t, interactors.ErrNilProxy, err) - }) - t.Run("nil addressHandler", func(t *testing.T) { - t.Parallel() - - anh, err := NewSingleTransactionAddressNonceHandler(&testsCommon.ProxyStub{}, nil) - assert.Nil(t, anh) - assert.Equal(t, interactors.ErrNilAddress, err) - }) - t.Run("should work", func(t *testing.T) { - t.Parallel() - - pubkey := make([]byte, 32) - _, _ = rand.Read(pubkey) - addressHandler := data.NewAddressFromBytes(pubkey) - - _, err := NewSingleTransactionAddressNonceHandler(&testsCommon.ProxyStub{}, addressHandler) - assert.Nil(t, err) - }) -} - -func TestSingleTransactionAddressNonceHandler_ApplyNonceAndGasPrice(t *testing.T) { - t.Parallel() - - t.Run("proxy returns error should error", func(t *testing.T) { - t.Parallel() - - proxy := &testsCommon.ProxyStub{ - GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - return nil, expectedErr - }, - } - - anh, _ := NewSingleTransactionAddressNonceHandler(proxy, testAddress) - - tx := createDefaultTx() - - err := anh.ApplyNonceAndGasPrice(context.Background(), &tx) - require.Equal(t, expectedErr, err) - }) - t.Run("should work", func(t *testing.T) { - t.Parallel() - - blockchainNonce := uint64(100) - proxy := &testsCommon.ProxyStub{ - GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - return &data.Account{Nonce: blockchainNonce}, nil - }, - } - - anh, _ := NewSingleTransactionAddressNonceHandler(proxy, testAddress) - - tx := createDefaultTx() - - err := anh.ApplyNonceAndGasPrice(context.Background(), &tx) - require.Nil(t, err) - require.Equal(t, blockchainNonce, tx.Nonce) - }) -} - -func TestSingleTransactionAddressNonceHandler_fetchGasPriceIfRequired(t *testing.T) { - t.Parallel() - - //proxy returns error should set invalid gasPrice(0) - proxy := &testsCommon.ProxyStub{ - GetNetworkConfigCalled: func() (*data.NetworkConfig, error) { - return nil, expectedErr - }, - } - anh, _ := NewSingleTransactionAddressNonceHandler(proxy, testAddress) - anh.gasPrice = 100000 - anh.nonceUntilGasIncreased = 100 - - anh.fetchGasPriceIfRequired(context.Background(), 101) - require.Equal(t, uint64(0), anh.gasPrice) -} - -func TestSingleTransactionAddressNonceHandler_DropTransactions(t *testing.T) { - t.Parallel() - - tx := createDefaultTx() - - blockchainNonce := uint64(100) - minGasPrice := uint64(10) - proxy := &testsCommon.ProxyStub{ - GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - return &data.Account{Nonce: blockchainNonce}, nil - }, - GetNetworkConfigCalled: func() (*data.NetworkConfig, error) { - return &data.NetworkConfig{MinGasPrice: minGasPrice}, nil - }, - } - - anh, _ := NewSingleTransactionAddressNonceHandler(proxy, testAddress) - - err := anh.ApplyNonceAndGasPrice(context.Background(), &tx) - require.Nil(t, err) - - _, err = anh.SendTransaction(context.Background(), &tx) - require.Nil(t, err) - - require.Equal(t, uint64(0), anh.nonceUntilGasIncreased) - require.Equal(t, minGasPrice, anh.gasPrice) - require.NotNil(t, anh.transaction) - - anh.DropTransactions() - - require.Equal(t, blockchainNonce, anh.nonceUntilGasIncreased) - require.Equal(t, minGasPrice+1, anh.gasPrice) - require.Nil(t, anh.transaction) -} - -func TestSingleTransactionAddressNonceHandler_SendTransaction(t *testing.T) { - t.Parallel() - - // proxy returns error should error - proxy := &testsCommon.ProxyStub{ - SendTransactionCalled: func(tx *transaction.FrontendTransaction) (string, error) { - return "", expectedErr - }, - } - - anh, _ := NewSingleTransactionAddressNonceHandler(proxy, testAddress) - - tx := createDefaultTx() - - _, err := anh.SendTransaction(context.Background(), &tx) - require.Equal(t, expectedErr, err) -} - -func TestSingleTransactionAddressNonceHandler_ReSendTransactionsIfRequired(t *testing.T) { - t.Parallel() - - t.Run("no transaction to resend shall exit early with no error", func(t *testing.T) { - t.Parallel() - - anh, _ := NewSingleTransactionAddressNonceHandler(&testsCommon.ProxyStub{}, testAddress) - err := anh.ReSendTransactionsIfRequired(context.Background()) - require.Nil(t, err) - }) - t.Run("proxy returns error shall error", func(t *testing.T) { - t.Parallel() - - proxy := &testsCommon.ProxyStub{ - GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - return nil, expectedErr - }, - } - - anh, _ := NewSingleTransactionAddressNonceHandler(proxy, testAddress) - tx := createDefaultTx() - - _, err := anh.SendTransaction(context.Background(), &tx) - require.Nil(t, err) - - err = anh.ReSendTransactionsIfRequired(context.Background()) - require.Equal(t, expectedErr, err) - }) - t.Run("proxy returns error shall error", func(t *testing.T) { - t.Parallel() - - blockchainNonce := uint64(100) - proxy := &testsCommon.ProxyStub{ - GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - return &data.Account{Nonce: blockchainNonce}, nil - }, - SendTransactionCalled: func(txs *transaction.FrontendTransaction) (string, error) { - return "", expectedErr - }, - } - anh, _ := NewSingleTransactionAddressNonceHandler(proxy, testAddress) - tx := createDefaultTx() - tx.Nonce = blockchainNonce - anh.transaction = &tx - - err := anh.ReSendTransactionsIfRequired(context.Background()) - require.Equal(t, expectedErr, err) - }) - t.Run("anh.transaction.Nonce != account.Nonce", func(t *testing.T) { - t.Parallel() - - blockchainNonce := uint64(100) - proxy := &testsCommon.ProxyStub{ - GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - return &data.Account{Nonce: blockchainNonce + 1}, nil - }, - SendTransactionCalled: func(txs *transaction.FrontendTransaction) (string, error) { - return "", expectedErr - }, - } - anh, _ := NewSingleTransactionAddressNonceHandler(proxy, testAddress) - tx := createDefaultTx() - tx.Nonce = blockchainNonce - anh.transaction = &tx - - err := anh.ReSendTransactionsIfRequired(context.Background()) - require.Nil(t, err) - require.Nil(t, anh.transaction) - }) - t.Run("should work", func(t *testing.T) { - t.Parallel() - - blockchainNonce := uint64(100) - proxy := &testsCommon.ProxyStub{ - GetAccountCalled: func(address core.AddressHandler) (*data.Account, error) { - return &data.Account{Nonce: blockchainNonce}, nil - }, - SendTransactionCalled: func(txs *transaction.FrontendTransaction) (string, error) { - return "hash", nil - }, - } - anh, _ := NewSingleTransactionAddressNonceHandler(proxy, testAddress) - tx := createDefaultTx() - tx.Nonce = blockchainNonce - anh.transaction = &tx - - err := anh.ReSendTransactionsIfRequired(context.Background()) - require.Nil(t, err) - }) -} diff --git a/interactors/wallet.go b/interactors/wallet.go index 8afb88cc..f8a82ecb 100644 --- a/interactors/wallet.go +++ b/interactors/wallet.go @@ -13,7 +13,6 @@ import ( "encoding/json" "encoding/pem" "io" - "io/ioutil" "os" "github.com/multiversx/mx-chain-crypto-go/signing" @@ -168,7 +167,7 @@ func (w *wallet) GetAddressFromPrivateKey(privateKeyBytes []byte) (core.AddressH // LoadPrivateKeyFromJsonFile loads a password encrypted private key from a .json file func (w *wallet) LoadPrivateKeyFromJsonFile(filename string, password string) ([]byte, error) { - buff, err := ioutil.ReadFile(filename) + buff, err := os.ReadFile(filename) if err != nil { return nil, err } @@ -244,8 +243,13 @@ func (w *wallet) secretKeyAfterChecks(key *encryptedKeyJSONV4, secretKey []byte) return nil, errGetAddr } + addressAsBech32String, err := address.AddressAsBech32String() + if err != nil { + return nil, err + } + isSameAccount := hex.EncodeToString(address.AddressBytes()) == key.Address && - address.AddressAsBech32String() == key.Bech32 + addressAsBech32String == key.Bech32 if !isSameAccount { return nil, ErrDifferentAccountRecovered } @@ -299,8 +303,13 @@ func (w *wallet) SavePrivateKeyToJsonFile(privateKey []byte, password string, fi return err } + addressAsBech32String, err := address.AddressAsBech32String() + if err != nil { + return err + } + keystoreJson := &encryptedKeyJSONV4{ - Bech32: address.AddressAsBech32String(), + Bech32: addressAsBech32String, Address: hex.EncodeToString(address.AddressBytes()), Version: keystoreVersion, Id: uuid.New(), @@ -321,12 +330,12 @@ func (w *wallet) SavePrivateKeyToJsonFile(privateKey []byte, password string, fi return err } - return ioutil.WriteFile(filename, buff, 0644) + return os.WriteFile(filename, buff, 0644) } // LoadPrivateKeyFromPemFile loads a private key from a .pem file func (w *wallet) LoadPrivateKeyFromPemFile(filename string) ([]byte, error) { - buff, err := ioutil.ReadFile(filename) + buff, err := os.ReadFile(filename) if err != nil { return nil, err } @@ -358,8 +367,14 @@ func (w *wallet) SavePrivateKeyToPemFile(privateKey []byte, filename string) err if len(privateKey) == addressLen { privateKey = append(privateKey, address.AddressBytes()...) } + + addressAsBech32String, err := address.AddressAsBech32String() + if err != nil { + return err + } + blk := pem.Block{ - Type: "PRIVATE KEY for " + address.AddressAsBech32String(), + Type: "PRIVATE KEY for " + addressAsBech32String, Bytes: []byte(hex.EncodeToString(privateKey)), } file, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY, 0600) diff --git a/interactors/wallet_test.go b/interactors/wallet_test.go index 886f3de4..dcec87c2 100644 --- a/interactors/wallet_test.go +++ b/interactors/wallet_test.go @@ -3,8 +3,8 @@ package interactors import ( "encoding/hex" "fmt" - "io/ioutil" "os" + "path" "testing" "github.com/multiversx/mx-sdk-go/data" @@ -62,7 +62,11 @@ func TestWallet_GetAddressFromMnemonicWalletIntegration(t *testing.T) { address, err := w.GetAddressFromPrivateKey(privKey) assert.Nil(t, err) expectedBech32Addr := "erd1h692scsz3um6e5qwzts4yjrewxqxwcwxzavl5n9q8sprussx8fqsu70jf5" - assert.Equal(t, expectedBech32Addr, address.AddressAsBech32String()) + + addressAsBech32String, err := address.AddressAsBech32String() + assert.Nil(t, err) + + assert.Equal(t, expectedBech32Addr, addressAsBech32String) } func TestWallet_GetAddressFromPrivateKey(t *testing.T) { @@ -76,7 +80,11 @@ func TestWallet_GetAddressFromPrivateKey(t *testing.T) { address, err := w.GetAddressFromPrivateKey(privKey) assert.Nil(t, err) expectedBech32Addr := "erd1mlh7q3fcgrjeq0et65vaaxcw6m5ky8jhu296pdxpk9g32zga6uhsemxx2a" - assert.Equal(t, expectedBech32Addr, address.AddressAsBech32String()) + + addressAsBech32String, err := address.AddressAsBech32String() + assert.Nil(t, err) + + assert.Equal(t, expectedBech32Addr, addressAsBech32String) } func TestWallet_LoadPrivateKeyFromJsonFile(t *testing.T) { @@ -103,13 +111,20 @@ func TestWallet_LoadPrivateKeyFromJsonFileWithKind(t *testing.T) { assert.Equal(t, expectedHexPrivKey, hex.EncodeToString(privkey)) address, _ := w.GetAddressFromPrivateKey(privkey) - require.Equal(t, "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", address.AddressAsBech32String()) + + addressAsBech32String, err := address.AddressAsBech32String() + assert.Nil(t, err) + + require.Equal(t, "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", addressAsBech32String) } func TestWallet_SavePrivateKeyToJsonFile(t *testing.T) { t.Parallel() - file, err := ioutil.TempFile("", "temp-*.json") + dir := t.TempDir() + fileName := path.Join(dir, "temp.json") + + file, err := os.Create(fileName) require.Nil(t, err) _ = file.Close() //close the file so the save can write in it @@ -143,13 +158,19 @@ func TestWallet_LoadPrivateKeyFromPemFile(t *testing.T) { require.Nil(t, err) expectedBech32Address := "erd1zptg3eu7uw0qvzhnu009lwxupcn6ntjxptj5gaxt8curhxjqr9tsqpsnht" - assert.Equal(t, expectedBech32Address, address.AddressAsBech32String()) + + addressAsBech32String, err := address.AddressAsBech32String() + require.Nil(t, err) + + assert.Equal(t, expectedBech32Address, addressAsBech32String) } func TestWallet_SavePrivateKeyToPemFile(t *testing.T) { t.Parallel() - file, err := ioutil.TempFile("", "temp-*.pem") + dir := t.TempDir() + fileName := path.Join(dir, "temp.json") + file, err := os.Create(fileName) require.Nil(t, err) _ = file.Close() //close the file so the save can write in it diff --git a/serde/deserializer_test.go b/serde/deserializer_test.go index df8ebc66..e301c211 100644 --- a/serde/deserializer_test.go +++ b/serde/deserializer_test.go @@ -1,8 +1,8 @@ package serde import ( - "io/ioutil" "math/big" + "os" "testing" "github.com/multiversx/mx-sdk-go/serde/testingMocks" @@ -18,7 +18,7 @@ const ( func TestDeserializer_CreateStruct_BasicTypes(t *testing.T) { t.Parallel() - data, err := ioutil.ReadFile(srcBasicTypes) + data, err := os.ReadFile(srcBasicTypes) assert.Nil(t, err) assert.NotNil(t, data) @@ -55,7 +55,7 @@ func TestDeserializer_CreateStruct_BasicTypes(t *testing.T) { func TestDeserializer_CreateStruct_NestedStructures(t *testing.T) { t.Parallel() - data, err := ioutil.ReadFile(srcNestedStructures) + data, err := os.ReadFile(srcNestedStructures) assert.Nil(t, err) assert.NotNil(t, data) @@ -88,7 +88,7 @@ func TestDeserializer_CreateStruct_NestedStructures(t *testing.T) { func Test_deserializer_CreatePrimitiveDataType(t *testing.T) { t.Parallel() - data, err := ioutil.ReadFile(srcPrimitive) + data, err := os.ReadFile(srcPrimitive) assert.Nil(t, err) assert.NotNil(t, data) diff --git a/testsCommon/interactors/addressNonceHandlerCreatorStub.go b/testsCommon/interactors/addressNonceHandlerCreatorStub.go deleted file mode 100644 index 87a7dc9e..00000000 --- a/testsCommon/interactors/addressNonceHandlerCreatorStub.go +++ /dev/null @@ -1,24 +0,0 @@ -package interactors - -import ( - "github.com/multiversx/mx-sdk-go/core" - "github.com/multiversx/mx-sdk-go/interactors" -) - -// AddressNonceHandlerCreatorStub - -type AddressNonceHandlerCreatorStub struct { - CreateCalled func(proxy interactors.Proxy, address core.AddressHandler) (interactors.AddressNonceHandler, error) -} - -// Create - -func (stub *AddressNonceHandlerCreatorStub) Create(proxy interactors.Proxy, address core.AddressHandler) (interactors.AddressNonceHandler, error) { - if stub.CreateCalled != nil { - return stub.CreateCalled(proxy, address) - } - return nil, nil -} - -// IsInterfaceNil - -func (stub *AddressNonceHandlerCreatorStub) IsInterfaceNil() bool { - return stub == nil -}