package main
import (
"crypto/hmac"
"crypto/sha256"
"crypto/sha512"
"encoding/base64"
"net/url"
"fmt"
"encoding/json"
"strings"
)
func getKrakenSignature(urlPath string, data interface{}, secret string) (string, error) {
var encodedData string
switch v := data.(type) {
case string:
var jsonData map[string]interface{}
if err := json.Unmarshal([]byte(v), &jsonData); err != nil {
return "", err
}
encodedData = jsonData["nonce"].(string) + v
case map[string]interface{}:
dataMap := url.Values{}
for key, value := range v {
dataMap.Set(key, fmt.Sprintf("%v", value))
}
encodedData = v["nonce"].(string) + dataMap.Encode()
default:
return "", fmt.Errorf("invalid data type")
}
sha := sha256.New()
sha.Write([]byte(encodedData))
shaSum := sha.Sum(nil)
message := append([]byte(urlPath), shaSum...)
secretDecoded, err := base64.StdEncoding.DecodeString(secret)
if err != nil {
return "", err
}
mac := hmac.New(sha512.New, secretDecoded)
mac.Write(message)
macSum := mac.Sum(nil)
sigDigest := base64.StdEncoding.EncodeToString(macSum)
return sigDigest, nil
}
func main() {
apiSecret := "kQH5HW/8p1uGOVjbgWA7FunAmGO8lsSUXNsu3eow76sz84Q18fWxnyRzBHCd3pd5nE9qa99HAZtuZuj6F1huXg=="
payload := map[string]interface{}{
"nonce": "1616492376594",
"ordertype": "limit",
"pair": "XBTUSD",
"price": 37500,
"type": "buy",
"volume": 1.25,
}
signature, err := getKrakenSignature("/0/private/AddOrder", payload, apiSecret)
if err != nil {
fmt.Println("Error generating signature:", err)
return
}
fmt.Printf("API-Sign: %s\n", signature)
}