diff --git a/cmd/goal/account.go b/cmd/goal/account.go index e508a71cec..ebda0935e8 100644 --- a/cmd/goal/account.go +++ b/cmd/goal/account.go @@ -591,22 +591,28 @@ func printAccountInfo(client libgoal.Client, address string, account v1.Account) } for _, id := range heldAssets { assetHolding := account.Assets[id] - assetParams, err := client.AssetInformation(id) + assetParams, err := client.AssetInformationV2(id) if err != nil { hasError = true fmt.Fprintf(errorReport, "Error: Unable to retrieve asset information for asset %d referred to by account %s: %v\n", id, address, err) fmt.Fprintf(report, "\tID %d, error\n", id) } - amount := assetDecimalsFmt(assetHolding.Amount, assetParams.Decimals) + amount := assetDecimalsFmt(assetHolding.Amount, uint32(assetParams.Params.Decimals)) - assetName := assetParams.AssetName + var assetName string + if assetParams.Params.Name != nil { + assetName = *assetParams.Params.Name + } if len(assetName) == 0 { assetName = "" } _, assetName = unicodePrintable(assetName) - unitName := assetParams.UnitName + var unitName string + if assetParams.Params.UnitName != nil { + unitName = *assetParams.Params.UnitName + } if len(unitName) == 0 { unitName = "units" } diff --git a/daemon/algod/api/algod.oas2.json b/daemon/algod/api/algod.oas2.json index 8382687ede..e40cba62ae 100644 --- a/daemon/algod/api/algod.oas2.json +++ b/daemon/algod/api/algod.oas2.json @@ -1416,9 +1416,14 @@ "format": "byte" }, "name": { - "description": "\\[an\\] Name of this asset, as supplied by the creator.", + "description": "\\[an\\] Name of this asset, as supplied by the creator. Included only when the asset name is composed of printable utf-8 characters.", "type": "string" }, + "name_b64": { + "description": "\\[an64\\] base64 encoded name of this asset, as supplied by the creator.", + "type": "string", + "x-algorand-format": "base64" + }, "reserve": { "description": "\\[r\\] Address of account holding reserve (non-minted) units of this asset.", "type": "string" @@ -1429,12 +1434,22 @@ "x-algorand-format": "uint64" }, "unit-name": { - "description": "\\[un\\] Name of a unit of this asset, as supplied by the creator.", + "description": "\\[un\\] Name of a unit of this asset, as supplied by the creator. Included only when the name of a unit of this asset is composed of printable utf-8 characters.", "type": "string" }, + "unit-name_b64": { + "description": "\\[un64\\] base64 encoded name of a unit of this asset, as supplied by the creator.", + "type": "string", + "x-algorand-format": "base64" + }, "url": { - "description": "\\[au\\] URL where more information about the asset can be retrieved.", + "description": "\\[au\\] URL where more information about the asset can be retrieved. Included only when the URL is composed of printable utf-8 characters.", "type": "string" + }, + "url_b64": { + "description": "\\[au64\\] base64 encoded URL where more information about the asset can be retrieved.", + "type": "string", + "x-algorand-format": "base64" } } }, diff --git a/daemon/algod/api/algod.oas3.yml b/daemon/algod/api/algod.oas3.yml index 661a79441c..8841f90672 100644 --- a/daemon/algod/api/algod.oas3.yml +++ b/daemon/algod/api/algod.oas3.yml @@ -1027,9 +1027,14 @@ "type": "string" }, "name": { - "description": "\\[an\\] Name of this asset, as supplied by the creator.", + "description": "\\[an\\] Name of this asset, as supplied by the creator. Included only when the asset name is composed of printable utf-8 characters.", "type": "string" }, + "name_b64": { + "description": "\\[an64\\] base64 encoded name of this asset, as supplied by the creator.", + "type": "string", + "x-algorand-format": "base64" + }, "reserve": { "description": "\\[r\\] Address of account holding reserve (non-minted) units of this asset.", "type": "string" @@ -1040,12 +1045,22 @@ "x-algorand-format": "uint64" }, "unit-name": { - "description": "\\[un\\] Name of a unit of this asset, as supplied by the creator.", + "description": "\\[un\\] Name of a unit of this asset, as supplied by the creator. Included only when the name of a unit of this asset is composed of printable utf-8 characters.", "type": "string" }, + "unit-name_b64": { + "description": "\\[un64\\] base64 encoded name of a unit of this asset, as supplied by the creator.", + "type": "string", + "x-algorand-format": "base64" + }, "url": { - "description": "\\[au\\] URL where more information about the asset can be retrieved.", + "description": "\\[au\\] URL where more information about the asset can be retrieved. Included only when the URL is composed of printable utf-8 characters.", "type": "string" + }, + "url_b64": { + "description": "\\[au64\\] base64 encoded URL where more information about the asset can be retrieved.", + "type": "string", + "x-algorand-format": "base64" } }, "required": [ diff --git a/daemon/algod/api/server/v1/handlers/handlers.go b/daemon/algod/api/server/v1/handlers/handlers.go index 1e3b0f634d..f956fb4174 100644 --- a/daemon/algod/api/server/v1/handlers/handlers.go +++ b/daemon/algod/api/server/v1/handlers/handlers.go @@ -24,8 +24,9 @@ import ( "io" "net/http" "strconv" - "strings" "time" + "unicode" + "unicode/utf8" "github.com/labstack/echo/v4" @@ -163,6 +164,20 @@ func participationKeysEncode(r basics.AccountData) *v1.Participation { return &apiParticipation } +// printableUTF8OrEmpty checks to see if the entire string is a UTF8 printable string. +// If this is the case, the string is returned as is. Otherwise, the empty string is returned. +func printableUTF8OrEmpty(in string) string { + // iterate throughout all the characters in the string to see if they are all printable. + // when range iterating on go strings, go decode each element as a utf8 rune. + for _, c := range in { + // is this a printable character, or invalid rune ? + if c == utf8.RuneError || !unicode.IsPrint(c) { + return "" + } + } + return in +} + func modelAssetParams(creator basics.Address, params basics.AssetParams) v1.AssetParams { paramsModel := v1.AssetParams{ Total: params.Total, @@ -170,9 +185,9 @@ func modelAssetParams(creator basics.Address, params basics.AssetParams) v1.Asse Decimals: params.Decimals, } - paramsModel.UnitName = strings.TrimRight(string(params.UnitName[:]), "\x00") - paramsModel.AssetName = strings.TrimRight(string(params.AssetName[:]), "\x00") - paramsModel.URL = strings.TrimRight(string(params.URL[:]), "\x00") + paramsModel.UnitName = printableUTF8OrEmpty(params.UnitName) + paramsModel.AssetName = printableUTF8OrEmpty(params.AssetName) + paramsModel.URL = printableUTF8OrEmpty(params.URL) if params.MetadataHash != [32]byte{} { paramsModel.MetadataHash = params.MetadataHash[:] } diff --git a/daemon/algod/api/server/v2/account.go b/daemon/algod/api/server/v2/account.go index 534f060202..f6459afa13 100644 --- a/daemon/algod/api/server/v2/account.go +++ b/daemon/algod/api/server/v2/account.go @@ -430,9 +430,12 @@ func AssetParamsToAsset(creator string, idx basics.AssetIndex, params *basics.As Total: params.Total, Decimals: uint64(params.Decimals), DefaultFrozen: &frozen, - Name: strOrNil(params.AssetName), - UnitName: strOrNil(params.UnitName), - Url: strOrNil(params.URL), + Name: strOrNil(printableUTF8OrEmpty(params.AssetName)), + NameB64: strOrNil(base64.StdEncoding.EncodeToString([]byte(params.AssetName))), + UnitName: strOrNil(printableUTF8OrEmpty(params.UnitName)), + UnitNameB64: strOrNil(base64.StdEncoding.EncodeToString([]byte(params.UnitName))), + Url: strOrNil(printableUTF8OrEmpty(params.URL)), + UrlB64: strOrNil(base64.StdEncoding.EncodeToString([]byte(params.URL))), Clawback: addrOrNil(params.Clawback), Freeze: addrOrNil(params.Freeze), Manager: addrOrNil(params.Manager), diff --git a/daemon/algod/api/server/v2/generated/private/routes.go b/daemon/algod/api/server/v2/generated/private/routes.go index d142d558c5..67e55190e6 100644 --- a/daemon/algod/api/server/v2/generated/private/routes.go +++ b/daemon/algod/api/server/v2/generated/private/routes.go @@ -235,135 +235,137 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/daemon/algod/api/server/v2/generated/private/types.go b/daemon/algod/api/server/v2/generated/private/types.go index 2184a38f99..e00d3730f8 100644 --- a/daemon/algod/api/server/v2/generated/private/types.go +++ b/daemon/algod/api/server/v2/generated/private/types.go @@ -217,20 +217,29 @@ type AssetParams struct { // \[am\] A commitment to some unspecified asset metadata. The format of this metadata is up to the application. MetadataHash *[]byte `json:"metadata-hash,omitempty"` - // \[an\] Name of this asset, as supplied by the creator. + // \[an\] Name of this asset, as supplied by the creator. Included only when the asset name is composed of printable utf-8 characters. Name *string `json:"name,omitempty"` + // \[an64\] base64 encoded name of this asset, as supplied by the creator. + NameB64 *string `json:"name_b64,omitempty"` + // \[r\] Address of account holding reserve (non-minted) units of this asset. Reserve *string `json:"reserve,omitempty"` // \[t\] The total number of units of this asset. Total uint64 `json:"total"` - // \[un\] Name of a unit of this asset, as supplied by the creator. + // \[un\] Name of a unit of this asset, as supplied by the creator. Included only when the name of a unit of this asset is composed of printable utf-8 characters. UnitName *string `json:"unit-name,omitempty"` - // \[au\] URL where more information about the asset can be retrieved. + // \[un64\] base64 encoded name of a unit of this asset, as supplied by the creator. + UnitNameB64 *string `json:"unit-name_b64,omitempty"` + + // \[au\] URL where more information about the asset can be retrieved. Included only when the URL is composed of printable utf-8 characters. Url *string `json:"url,omitempty"` + + // \[au64\] base64 encoded URL where more information about the asset can be retrieved. + UrlB64 *string `json:"url_b64,omitempty"` } // BuildVersion defines model for BuildVersion. diff --git a/daemon/algod/api/server/v2/generated/routes.go b/daemon/algod/api/server/v2/generated/routes.go index a1e72467a3..166e0a400b 100644 --- a/daemon/algod/api/server/v2/generated/routes.go +++ b/daemon/algod/api/server/v2/generated/routes.go @@ -616,179 +616,181 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "Sud2BOfgKyW7wGr1H67+fwAAAP//rYSwcWn0AAA=", + "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", + "/3J4yrYy9wAA", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/daemon/algod/api/server/v2/generated/types.go b/daemon/algod/api/server/v2/generated/types.go index 985e4ab755..420bf27326 100644 --- a/daemon/algod/api/server/v2/generated/types.go +++ b/daemon/algod/api/server/v2/generated/types.go @@ -217,20 +217,29 @@ type AssetParams struct { // \[am\] A commitment to some unspecified asset metadata. The format of this metadata is up to the application. MetadataHash *[]byte `json:"metadata-hash,omitempty"` - // \[an\] Name of this asset, as supplied by the creator. + // \[an\] Name of this asset, as supplied by the creator. Included only when the asset name is composed of printable utf-8 characters. Name *string `json:"name,omitempty"` + // \[an64\] base64 encoded name of this asset, as supplied by the creator. + NameB64 *string `json:"name_b64,omitempty"` + // \[r\] Address of account holding reserve (non-minted) units of this asset. Reserve *string `json:"reserve,omitempty"` // \[t\] The total number of units of this asset. Total uint64 `json:"total"` - // \[un\] Name of a unit of this asset, as supplied by the creator. + // \[un\] Name of a unit of this asset, as supplied by the creator. Included only when the name of a unit of this asset is composed of printable utf-8 characters. UnitName *string `json:"unit-name,omitempty"` - // \[au\] URL where more information about the asset can be retrieved. + // \[un64\] base64 encoded name of a unit of this asset, as supplied by the creator. + UnitNameB64 *string `json:"unit-name_b64,omitempty"` + + // \[au\] URL where more information about the asset can be retrieved. Included only when the URL is composed of printable utf-8 characters. Url *string `json:"url,omitempty"` + + // \[au64\] base64 encoded URL where more information about the asset can be retrieved. + UrlB64 *string `json:"url_b64,omitempty"` } // BuildVersion defines model for BuildVersion. diff --git a/daemon/algod/api/server/v2/utils.go b/daemon/algod/api/server/v2/utils.go index ef6f6712d3..6788890622 100644 --- a/daemon/algod/api/server/v2/utils.go +++ b/daemon/algod/api/server/v2/utils.go @@ -21,6 +21,8 @@ import ( "fmt" "net/http" "strings" + "unicode" + "unicode/utf8" "github.com/algorand/go-codec/codec" "github.com/labstack/echo/v4" @@ -263,3 +265,17 @@ func convertToDeltas(txn node.TxnWithStatus) (*[]generated.AccountStateDelta, *g return localStateDelta, stateDeltaToStateDelta(txn.ApplyData.EvalDelta.GlobalDelta) } + +// printableUTF8OrEmpty checks to see if the entire string is a UTF8 printable string. +// If this is the case, the string is returned as is. Otherwise, the empty string is returned. +func printableUTF8OrEmpty(in string) string { + // iterate throughout all the characters in the string to see if they are all printable. + // when range iterating on go strings, go decode each element as a utf8 rune. + for _, c := range in { + // is this a printable character, or invalid rune ? + if c == utf8.RuneError || !unicode.IsPrint(c) { + return "" + } + } + return in +} diff --git a/libgoal/libgoal.go b/libgoal/libgoal.go index 606c381502..b844ddf3f1 100644 --- a/libgoal/libgoal.go +++ b/libgoal/libgoal.go @@ -17,6 +17,7 @@ package libgoal import ( + "encoding/base64" "encoding/json" "fmt" "os" @@ -687,8 +688,40 @@ func (c *Client) AssetInformation(index uint64) (resp v1.AssetParams, err error) // AssetInformationV2 takes an asset's index and returns its information func (c *Client) AssetInformationV2(index uint64) (resp generatedV2.Asset, err error) { algod, err := c.ensureAlgodClient() - if err == nil { - resp, err = algod.AssetInformationV2(index) + if err != nil { + return + } + resp, err = algod.AssetInformationV2(index) + + nilString := func(p *string) string { + if p == nil { + return "" + } + return *p + } + if err != nil && len(nilString(resp.Params.NameB64)) > 0 && len(nilString(resp.Params.Name)) == 0 { + var nameBytes []byte + // the Name is not a UTF-8 printable, but now we can decode that from the base64 version. + nameBytes, err = base64.StdEncoding.DecodeString(nilString(resp.Params.NameB64)) + resp.Params.Name = new(string) + *resp.Params.Name = string(nameBytes) + } + if err != nil && len(nilString(resp.Params.UnitNameB64)) > 0 && len(nilString(resp.Params.UnitName)) == 0 { + var unitNameBytes []byte + // the UnitName is not a UTF-8 printable, but now we can decode that from the base64 version. + unitNameBytes, err = base64.StdEncoding.DecodeString(nilString(resp.Params.UnitNameB64)) + resp.Params.UnitName = new(string) + *resp.Params.UnitName = string(unitNameBytes) + } + if err != nil && len(nilString(resp.Params.UrlB64)) > 0 && len(nilString(resp.Params.Url)) == 0 { + var urlBytes []byte + // the URL is not a UTF-8 printable, but now we can decode that from the base64 version. + urlBytes, err = base64.StdEncoding.DecodeString(nilString(resp.Params.UrlB64)) + resp.Params.Name = new(string) + *resp.Params.Name = string(urlBytes) + } + if err != nil { + return generatedV2.Asset{}, err } return } diff --git a/test/e2e-go/features/transactions/asset_test.go b/test/e2e-go/features/transactions/asset_test.go index 4068bf03fa..9606d31304 100644 --- a/test/e2e-go/features/transactions/asset_test.go +++ b/test/e2e-go/features/transactions/asset_test.go @@ -423,7 +423,7 @@ func TestAssetInformation(t *testing.T) { a := require.New(fixtures.SynchronizedTest(t)) var fixture fixtures.RestClientFixture - fixture.Setup(t, filepath.Join("nettemplates", "TwoNodes50EachFuture.json")) + fixture.Setup(t, filepath.Join("nettemplates", "TwoNodes50EachV24.json")) defer fixture.Shutdown() client := fixture.LibGoalClient