Skip to content

Commit

Permalink
nip60: make client better, fixes to receive flow, wallet helper methods.
Browse files Browse the repository at this point in the history
  • Loading branch information
fiatjaf committed Jan 28, 2025
1 parent c6747cd commit 9c4c652
Show file tree
Hide file tree
Showing 5 changed files with 130 additions and 231 deletions.
246 changes: 50 additions & 196 deletions nip60/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,40 +19,17 @@ import (
)

func GetMintInfo(ctx context.Context, mintURL string) (*nut06.MintInfo, error) {
resp, err := httpGet(ctx, mintURL+"/v1/info")
if err != nil {
return nil, err
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}

var mintInfo nut06.MintInfo
if err := json.Unmarshal(body, &mintInfo); err != nil {
return nil, fmt.Errorf("error reading response from mint: %v", err)
if err := httpGet(ctx, mintURL+"/v1/info", &mintInfo); err != nil {
return nil, err
}

return &mintInfo, nil
}

func GetActiveKeyset(ctx context.Context, mintURL string) (*nut01.Keyset, error) {
resp, err := httpGet(ctx, mintURL+"/v1/keys")
if err != nil {
return nil, err
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}

var keysetRes nut01.GetKeysResponse
if err := json.Unmarshal(body, &keysetRes); err != nil {
return nil, fmt.Errorf("error reading response from mint: %w", err)
if err := httpGet(ctx, mintURL+"/v1/keys", &keysetRes); err != nil {
return nil, err
}

for _, keyset := range keysetRes.Keysets {
Expand All @@ -65,42 +42,18 @@ func GetActiveKeyset(ctx context.Context, mintURL string) (*nut01.Keyset, error)
}

func GetAllKeysets(ctx context.Context, mintURL string) ([]nut02.Keyset, error) {
resp, err := httpGet(ctx, mintURL+"/v1/keysets")
if err != nil {
return nil, err
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}

var keysetsRes nut02.GetKeysetsResponse
if err := json.Unmarshal(body, &keysetsRes); err != nil {
return nil, fmt.Errorf("error reading response from mint: %v", err)
if err := httpGet(ctx, mintURL+"/v1/keysets", &keysetsRes); err != nil {
return nil, err
}

return keysetsRes.Keysets, nil
}

func GetKeysetById(ctx context.Context, mintURL, id string) (map[uint64]string, error) {
resp, err := httpGet(ctx, mintURL+"/v1/keys/"+id)
if err != nil {
return nil, err
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}

var keysetRes nut01.GetKeysResponse
if err := json.Unmarshal(body, &keysetRes); err != nil || len(keysetRes.Keysets) != 1 {
return nil, fmt.Errorf("error reading response from mint: %w", err)
if err := httpGet(ctx, mintURL+"/v1/keys/"+id, &keysetRes); err != nil {
return nil, err
}

return keysetRes.Keysets[0].Keys, nil
}

Expand All @@ -109,42 +62,18 @@ func PostMintQuoteBolt11(
mintURL string,
mintQuoteRequest nut04.PostMintQuoteBolt11Request,
) (*nut04.PostMintQuoteBolt11Response, error) {
resp, err := httpPost(ctx, mintURL+"/v1/mint/quote/bolt11", mintQuoteRequest)
if err != nil {
return nil, err
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}

var reqMintResponse nut04.PostMintQuoteBolt11Response
if err := json.Unmarshal(body, &reqMintResponse); err != nil {
return nil, fmt.Errorf("error reading response from mint: %w", err)
if err := httpPost(ctx, mintURL+"/v1/mint/quote/bolt11", mintQuoteRequest, &reqMintResponse); err != nil {
return nil, err
}

return &reqMintResponse, nil
}

func GetMintQuoteState(ctx context.Context, mintURL, quoteId string) (*nut04.PostMintQuoteBolt11Response, error) {
resp, err := httpGet(ctx, mintURL+"/v1/mint/quote/bolt11/"+quoteId)
if err != nil {
return nil, err
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}

var mintQuoteResponse nut04.PostMintQuoteBolt11Response
if err := json.Unmarshal(body, &mintQuoteResponse); err != nil {
return nil, fmt.Errorf("error reading response from mint: %w", err)
if err := httpGet(ctx, mintURL+"/v1/mint/quote/bolt11/"+quoteId, &mintQuoteResponse); err != nil {
return nil, err
}

return &mintQuoteResponse, nil
}

Expand All @@ -153,42 +82,18 @@ func PostMintBolt11(
mintURL string,
mintRequest nut04.PostMintBolt11Request,
) (*nut04.PostMintBolt11Response, error) {
resp, err := httpPost(ctx, mintURL+"/v1/mint/bolt11", mintRequest)
if err != nil {
return nil, err
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}

var reqMintResponse nut04.PostMintBolt11Response
if err := json.Unmarshal(body, &reqMintResponse); err != nil {
return nil, fmt.Errorf("error reading response from mint: %w", err)
if err := httpPost(ctx, mintURL+"/v1/mint/bolt11", mintRequest, &reqMintResponse); err != nil {
return nil, err
}

return &reqMintResponse, nil
}

func PostSwap(ctx context.Context, mintURL string, swapRequest nut03.PostSwapRequest) (*nut03.PostSwapResponse, error) {
resp, err := httpPost(ctx, mintURL+"/v1/swap", swapRequest)
if err != nil {
return nil, err
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}

var swapResponse nut03.PostSwapResponse
if err := json.Unmarshal(body, &swapResponse); err != nil {
return nil, fmt.Errorf("error reading response from mint: %w", err)
if err := httpPost(ctx, mintURL+"/v1/swap", swapRequest, &swapResponse); err != nil {
return nil, err
}

return &swapResponse, nil
}

Expand All @@ -197,42 +102,18 @@ func PostMeltQuoteBolt11(
mintURL string,
meltQuoteRequest nut05.PostMeltQuoteBolt11Request,
) (*nut05.PostMeltQuoteBolt11Response, error) {
resp, err := httpPost(ctx, mintURL+"/v1/melt/quote/bolt11", meltQuoteRequest)
if err != nil {
return nil, err
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}

var meltQuoteResponse nut05.PostMeltQuoteBolt11Response
if err := json.Unmarshal(body, &meltQuoteResponse); err != nil {
return nil, fmt.Errorf("error reading response from mint: %w", err)
if err := httpPost(ctx, mintURL+"/v1/melt/quote/bolt11", meltQuoteRequest, &meltQuoteResponse); err != nil {
return nil, err
}

return &meltQuoteResponse, nil
}

func GetMeltQuoteState(ctx context.Context, mintURL, quoteId string) (*nut05.PostMeltQuoteBolt11Response, error) {
resp, err := httpGet(ctx, mintURL+"/v1/melt/quote/bolt11/"+quoteId)
if err != nil {
return nil, err
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}

var meltQuoteResponse nut05.PostMeltQuoteBolt11Response
if err := json.Unmarshal(body, &meltQuoteResponse); err != nil {
return nil, fmt.Errorf("error reading response from mint: %w", err)
if err := httpGet(ctx, mintURL+"/v1/melt/quote/bolt11/"+quoteId, &meltQuoteResponse); err != nil {
return nil, err
}

return &meltQuoteResponse, nil
}

Expand All @@ -241,22 +122,10 @@ func PostMeltBolt11(
mintURL string,
meltRequest nut05.PostMeltBolt11Request,
) (*nut05.PostMeltQuoteBolt11Response, error) {
resp, err := httpPost(ctx, mintURL+"/v1/melt/bolt11", meltRequest)
if err != nil {
return nil, err
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}

var meltResponse nut05.PostMeltQuoteBolt11Response
if err := json.Unmarshal(body, &meltResponse); err != nil {
return nil, fmt.Errorf("error reading response from mint: %w", err)
if err := httpPost(ctx, mintURL+"/v1/melt/bolt11", meltRequest, &meltResponse); err != nil {
return nil, err
}

return &meltResponse, nil
}

Expand All @@ -265,22 +134,10 @@ func PostCheckProofState(
mintURL string,
stateRequest nut07.PostCheckStateRequest,
) (*nut07.PostCheckStateResponse, error) {
resp, err := httpPost(ctx, mintURL+"/v1/checkstate", stateRequest)
if err != nil {
return nil, err
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}

var stateResponse nut07.PostCheckStateResponse
if err := json.Unmarshal(body, &stateResponse); err != nil {
return nil, fmt.Errorf("error reading response from mint: %v", err)
if err := httpPost(ctx, mintURL+"/v1/checkstate", stateRequest, &stateResponse); err != nil {
return nil, err
}

return &stateResponse, nil
}

Expand All @@ -289,74 +146,71 @@ func PostRestore(
mintURL string,
restoreRequest nut09.PostRestoreRequest,
) (*nut09.PostRestoreResponse, error) {
resp, err := httpPost(ctx, mintURL+"/v1/restore", restoreRequest)
if err != nil {
return nil, err
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}

var restoreResponse nut09.PostRestoreResponse
if err := json.Unmarshal(body, &restoreResponse); err != nil {
return nil, fmt.Errorf("error reading response from mint: %v", err)
if err := httpPost(ctx, mintURL+"/v1/restore", restoreRequest, &restoreResponse); err != nil {
return nil, err
}

return &restoreResponse, nil
}

func httpGet(ctx context.Context, url string) (*http.Response, error) {
func httpGet(ctx context.Context, url string, dst any) error {
req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
if err != nil {
return nil, err
return err
}

resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
return err
}

return parse(resp)
return parse(resp, dst)
}

func httpPost(ctx context.Context, url string, data any) (*http.Response, error) {
func httpPost(ctx context.Context, url string, data any, dst any) error {
r, w := io.Pipe()
json.NewEncoder(w).Encode(data)
go func() {
json.NewEncoder(w).Encode(data)
w.Close()
}()

req, err := http.NewRequestWithContext(ctx, "POST", url, r)
if err != nil {
return nil, err
return err
}
req.Header.Set("Content-Type", "application/json")

resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
return err
}
defer resp.Body.Close()

return parse(resp)
return parse(resp, dst)
}

func parse(response *http.Response) (*http.Response, error) {
func parse(response *http.Response, dst any) error {
if response.StatusCode == 400 {
var errResponse cashu.Error
err := json.NewDecoder(response.Body).Decode(&errResponse)
if err != nil {
return nil, fmt.Errorf("could not decode error response from mint: %v", err)
return fmt.Errorf("could not decode error response from mint: %v", err)
}
return nil, errResponse
return errResponse
}

if response.StatusCode != 200 {
body, err := io.ReadAll(response.Body)
if err != nil {
return nil, err
return err
}
return nil, fmt.Errorf("%s", body)
return fmt.Errorf("%s", body)
}

err := json.NewDecoder(response.Body).Decode(dst)
if err != nil {
return fmt.Errorf("could not decode response from mint: %w", err)
}

return response, nil
return nil
}
Loading

0 comments on commit 9c4c652

Please sign in to comment.