diff --git a/clients/horizonclient/CHANGELOG.md b/clients/horizonclient/CHANGELOG.md index fc47bb2510..9db3a0fdb3 100644 --- a/clients/horizonclient/CHANGELOG.md +++ b/clients/horizonclient/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## Unreleased + +* The restriction that `Fund` can only be called on the DefaultTestNetClient has +been removed. Any horizonclient.Client may now call Fund. Horizon instances not +supporting Fund will error with a resource not found error. + ## [v7.1.1](https://github.com/stellar/go/releases/tag/horizonclient-v7.1.1) - 2021-06-25 * Added transaction and operation result codes to the horizonclient.Error string for easy glancing at string only errors for underlying cause. diff --git a/clients/horizonclient/client.go b/clients/horizonclient/client.go index 3d0c9c56b2..5f9accc61b 100644 --- a/clients/horizonclient/client.go +++ b/clients/horizonclient/client.go @@ -575,11 +575,11 @@ func (c *Client) Trades(request TradeRequest) (tds hProtocol.TradesPage, err err // Fund creates a new account funded from friendbot. It only works on test networks. See // https://www.stellar.org/developers/guides/get-started/create-account.html for more information. func (c *Client) Fund(addr string) (tx hProtocol.Transaction, err error) { - if !c.isTestNet { - return tx, errors.New("can't fund account from friendbot on production network") - } friendbotURL := fmt.Sprintf("%sfriendbot?addr=%s", c.fixHorizonURL(), addr) err = c.sendGetRequest(friendbotURL, &tx) + if IsNotFoundError(err) { + return tx, errors.Wrap(err, "funding is only available on test networks and may not be supported by "+c.fixHorizonURL()) + } return } diff --git a/clients/horizonclient/client_fund_test.go b/clients/horizonclient/client_fund_test.go index dfcbad8981..528ba26f17 100644 --- a/clients/horizonclient/client_fund_test.go +++ b/clients/horizonclient/client_fund_test.go @@ -25,7 +25,6 @@ func TestFund(t *testing.T) { client := &Client{ HorizonURL: "https://localhost/", HTTP: hmock, - isTestNet: true, } hmock.On( @@ -37,3 +36,26 @@ func TestFund(t *testing.T) { assert.NoError(t, err) assert.Equal(t, int32(8269), tx.Ledger) } + +func TestFund_notSupported(t *testing.T) { + friendbotFundResponse := `{ + "type": "https://stellar.org/horizon-errors/not_found", + "title": "Resource Missing", + "status": 404, + "detail": "The resource at the url requested was not found. This usually occurs for one of two reasons: The url requested is not valid, or no data in our database could be found with the parameters provided." +}` + + hmock := httptest.NewClient() + client := &Client{ + HorizonURL: "https://localhost/", + HTTP: hmock, + } + + hmock.On( + "GET", + "https://localhost/friendbot?addr=GBLPP2W3X3PJQXYMC7EFWM5G2QCZL7HTCTFNMONS4ITGAYJ3GNNZIQ4V", + ).ReturnString(404, friendbotFundResponse) + + _, err := client.Fund("GBLPP2W3X3PJQXYMC7EFWM5G2QCZL7HTCTFNMONS4ITGAYJ3GNNZIQ4V") + assert.EqualError(t, err, "funding is only available on test networks and may not be supported by https://localhost/: horizon error: \"Resource Missing\" - check horizon.Error.Problem for more information") +} diff --git a/clients/horizonclient/main.go b/clients/horizonclient/main.go index c81572dd71..f3f51313af 100644 --- a/clients/horizonclient/main.go +++ b/clients/horizonclient/main.go @@ -141,7 +141,6 @@ type Client struct { // AppVersion is the version of the application using the horizonclient package AppVersion string horizonTimeout time.Duration - isTestNet bool // clock is a Clock returning the current time. clock *clock.Clock @@ -215,7 +214,6 @@ var DefaultTestNetClient = &Client{ HorizonURL: "https://horizon-testnet.stellar.org/", HTTP: http.DefaultClient, horizonTimeout: HorizonTimeout, - isTestNet: true, } // DefaultPublicNetClient is a default client to connect to public network.