diff --git a/config/config.go b/config/config.go index 5890594..96f38bc 100644 --- a/config/config.go +++ b/config/config.go @@ -28,6 +28,7 @@ var ( custodialURLBase string dataURLBase string BearerToken string + aliasEnsURLBase string ) var ( @@ -53,6 +54,7 @@ func setBase() error { custodialURLBase = env.GetEnv("CUSTODIAL_URL_BASE", "http://localhost:5003") dataURLBase = env.GetEnv("DATA_URL_BASE", "http://localhost:5006") + aliasEnsURLBase = env.GetEnv("ALIAS_ENS_BASE", "http://localhost:5015") BearerToken = env.GetEnv("BEARER_TOKEN", "") _, err = url.Parse(custodialURLBase) diff --git a/models/alias_response.go b/models/alias_response.go index 295c9ef..0af8d6e 100644 --- a/models/alias_response.go +++ b/models/alias_response.go @@ -7,3 +7,13 @@ type RequestAliasResult struct { type AliasAddress struct { Address string } + +type AliasEnsResult struct { + Address string `json:"address"` + AutoChoose bool `json:"autoChoose"` + Name string `json:"name"` +} + +type AliasEnsAddressResult struct { + Address string `json:"address"` +} diff --git a/remote/http/service.go b/remote/http/service.go index 2346eef..43793f0 100644 --- a/remote/http/service.go +++ b/remote/http/service.go @@ -11,7 +11,9 @@ import ( "net/http" "net/url" "regexp" + "strings" + "git.defalsify.org/vise.git/logging" "git.grassecon.net/grassrootseconomics/sarafu-api/config" "git.grassecon.net/grassrootseconomics/sarafu-api/dev" "git.grassecon.net/grassrootseconomics/sarafu-api/models" @@ -22,6 +24,7 @@ import ( var ( aliasRegex = regexp.MustCompile("^\\+?[a-zA-Z0-9\\-_]+$") + logg = logging.NewVanilla().WithDomain("sarafu-api.devapi") ) type HTTPAccountService struct { @@ -59,6 +62,10 @@ func (as *HTTPAccountService) TrackAccountStatus(ctx context.Context, publicKey return &r, nil } +func (as *HTTPAccountService) ToFqdn(alias string) string { + return alias + ".sarafu.eth" +} + // CheckBalance retrieves the balance for a given public key from the custodial balance API endpoint. // Parameters: // - publicKey: The public key associated with the account whose balance needs to be checked. @@ -216,8 +223,10 @@ func (as *HTTPAccountService) CheckAliasAddress(ctx context.Context, alias strin if as.SS == nil { return nil, fmt.Errorf("The storage service cannot be nil") } + logg.InfoCtxf(ctx, "resolving alias before formatting", "alias", alias) svc := dev.NewDevAccountService(ctx, as.SS) if as.UseApi { + logg.InfoCtxf(ctx, "resolving alias to address", "alias", alias) return resolveAliasAddress(ctx, alias) } else { return svc.CheckAliasAddress(ctx, alias) @@ -225,18 +234,33 @@ func (as *HTTPAccountService) CheckAliasAddress(ctx context.Context, alias strin } func resolveAliasAddress(ctx context.Context, alias string) (*models.AliasAddress, error) { - var r models.AliasAddress + var ( + aliasEnsResult models.AliasEnsAddressResult + ) - ep, err := url.JoinPath(config.CheckAliasURL, alias) + ep, err := url.JoinPath(config.CheckAliasURL, "/resolve") if err != nil { return nil, err } - req, err := http.NewRequest("GET", ep, nil) + + u, err := url.Parse(ep) if err != nil { return nil, err } - _, err = doRequest(ctx, req, &r) - return &r, err + + query := u.Query() + query.Set("name", alias) + u.RawQuery = query.Encode() + + req, err := http.NewRequest("GET", u.String(), nil) + if err != nil { + return nil, err + } + _, err = doRequest(ctx, req, &aliasEnsResult) + if err != nil { + return nil, err + } + return &models.AliasAddress{Address: aliasEnsResult.Address}, err } func (as *HTTPAccountService) FetchTopPools(ctx context.Context) ([]dataserviceapi.PoolDetails, error) { @@ -450,8 +474,50 @@ func (as *HTTPAccountService) RequestAlias(ctx context.Context, publicKey string if as.SS == nil { return nil, fmt.Errorf("The storage service cannot be nil") } - svc := dev.NewDevAccountService(ctx, as.SS) - return svc.RequestAlias(ctx, publicKey, hint) + if as.UseApi { + if !strings.Contains(hint, ".") { + hint = as.ToFqdn(hint) + } + enr, err := requestEnsAlias(ctx, publicKey, hint) + if err != nil { + return nil, err + } + return &models.RequestAliasResult{Alias: enr.Name}, nil + } else { + svc := dev.NewDevAccountService(ctx, as.SS) + return svc.RequestAlias(ctx, publicKey, hint) + } +} + +func requestEnsAlias(ctx context.Context, publicKey string, hint string) (*models.AliasEnsResult, error) { + var r models.AliasEnsResult + + ep, err := url.JoinPath(config.CheckAliasURL, "/register") + if err != nil { + return nil, err + } + logg.InfoCtxf(ctx, "requesting alias", "endpoint", ep, "hint", hint) + //Payload with the address and hint to derive an ENS name + payload := map[string]string{ + "address": publicKey, + "hint": hint, + } + payloadBytes, err := json.Marshal(payload) + if err != nil { + return nil, err + } + req, err := http.NewRequest("POST", ep, bytes.NewBuffer(payloadBytes)) + if err != nil { + return nil, err + } + // Log the request body + logg.InfoCtxf(ctx, "request body", "payload", string(payloadBytes)) + _, err = doRequest(ctx, req, &r) + if err != nil { + return nil, err + } + logg.InfoCtxf(ctx, "alias successfully assigned", "alias", r.Name) + return &r, nil } // TODO: remove eth-custodial api dependency