Repository: algorand/indexer
Pull request #577 (2021-07-17 13:42:35)

non utf8 support for asset strings
<!--
Thanks for submitting a pull request! We appreciate the time and effort you spent to get this far.

If you haven't already, please make sure that you've reviewed the CONTRIBUTING guide:
https://github.com/algorand/go-algorand/blob/master/CONTRIBUTING.md#code-guidelines
-->

## Summary

If asset strings contain non-printable characters they are stored in a byte array.
Return `-b64` asset strings in most endpoints.

## Test Plan

New unit test

codecov-commenter: # [Codecov](https://codecov.io/gh/algorand/indexer/pull/577?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None) Report
> Merging [#577](https://codecov.io/gh/algorand/indexer/pull/577?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None) (d0bef76) into [develop](https://codecov.io/gh/algorand/indexer/commit/d45623b6c32f19657689229dca6fd0996cc74a65?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None) (d45623b) will **increase** coverage by `3.29%`.
> The diff coverage is `53.93%`.

[![Impacted file tree graph](https://codecov.io/gh/algorand/indexer/pull/577/graphs/tree.svg?width=650&height=150&src=pr&token=BSHI3PT6QP&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None)](https://codecov.io/gh/algorand/indexer/pull/577?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None)

```diff
@@             Coverage Diff             @@
##           develop     #577      +/-   ##
===========================================
+ Coverage    43.80%   47.10%   +3.29%     
===========================================
  Files           24       24              
  Lines         3801     3849      +48     
===========================================
+ Hits          1665     1813     +148     
+ Misses        1873     1759     -114     
- Partials       263      277      +14     
```


| [Impacted Files](https://codecov.io/gh/algorand/indexer/pull/577?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None) | Coverage Δ | |
|---|---|---|
| [api/handlers.go](https://codecov.io/gh/algorand/indexer/pull/577/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None#diff-YXBpL2hhbmRsZXJzLmdv) | `3.91% <0.00%> (+0.10%)` | :arrow_up: |
| [types/types.go](https://codecov.io/gh/algorand/indexer/pull/577/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None#diff-dHlwZXMvdHlwZXMuZ28=) | `0.00% <0.00%> (ø)` | |
| [idb/postgres/internal/encoding/encode.go](https://codecov.io/gh/algorand/indexer/pull/577/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None#diff-aWRiL3Bvc3RncmVzL2ludGVybmFsL2VuY29kaW5nL2VuY29kZS5nbw==) | `52.45% <15.62%> (-40.65%)` | :arrow_down: |
| [api/converter\_utils.go](https://codecov.io/gh/algorand/indexer/pull/577/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None#diff-YXBpL2NvbnZlcnRlcl91dGlscy5nbw==) | `86.15% <100.00%> (+0.12%)` | :arrow_up: |
| [idb/postgres/postgres.go](https://codecov.io/gh/algorand/indexer/pull/577/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None#diff-aWRiL3Bvc3RncmVzL3Bvc3RncmVzLmdv) | `43.22% <100.00%> (+6.85%)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/algorand/indexer/pull/577?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/algorand/indexer/pull/577?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None). Last update [d45623b...d0bef76](https://codecov.io/gh/algorand/indexer/pull/577?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None).

tolikzinovyev: Looks good overall. Left some comments in the code. Could you also add tests in `idb/postgres/internal/encoding` similar to https://github.com/algorand/indexer/tree/tolik/acct-rewrite4/idb/postgres/internal/encoding?
tolikzinovyev: LGTM. I will let @tsachiherman and @brianolson take a look as well.

Patch:
diff --git a/.travis.yml b/.travis.yml
index 70d7efb..9ccbc36 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -22,13 +22,10 @@ script:
 - make check
 - make integration
 - make test
-# e2e tests can't run without installing algod.
-#- make e2e
 #- ./test/perf.sh "$TEST_CONNECTION_STRING_1" && ./test/perf.sh "$TEST_CONNECTION_STRING_2"
 - make fakepackage
-# TODO: Remove mule stuff after getting 'make e2e' to run.
-- docker build -t e2e_tests -f docker/Dockerfile.mule .
-- docker run --rm -t e2e_tests mule/e2e.sh
+# e2elive.py runs with the docker-compose file in misc
+- make e2e
 
 after_success:
   - scripts/upload_coverage.sh || true
diff --git a/Makefile b/Makefile
index 0da8a3c..a0570af 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 SRCPATH		:= $(shell pwd)
 VERSION		:= $(shell $(SRCPATH)/mule/scripts/compute_build_number.sh)
 OS_TYPE		:= $(shell $(SRCPATH)/mule/scripts/ostype.sh)
-ARCH		:= $(shell $(SRCPATH)/mule/scripts/archtype.sh)
+ARCH			:= $(shell $(SRCPATH)/mule/scripts/archtype.sh)
 PKG_DIR		= $(SRCPATH)/tmp/node_pkgs/$(OS_TYPE)/$(ARCH)/$(VERSION)
 
 # TODO: ensure any additions here are mirrored in misc/release.py
@@ -11,6 +11,9 @@ GOLDFLAGS += -X github.com/algorand/indexer/version.CompileTime=$(shell date -u
 GOLDFLAGS += -X github.com/algorand/indexer/version.GitDecorateBase64=$(shell git log -n 1 --pretty="%D"|base64|tr -d ' \n')
 GOLDFLAGS += -X github.com/algorand/indexer/version.ReleaseVersion=$(shell cat .version)
 
+# Used for e2e test
+export GO_IMAGE = golang:$(shell go version | cut -d ' ' -f 3 | tail -c +3 )
+
 # This is the default target, build the indexer:
 cmd/algorand-indexer/algorand-indexer:	idb/postgres/setup_postgres_sql.go idb/postgres/reset_sql.go types/protocols_json.go
 	cd cmd/algorand-indexer && CGO_ENABLED=0 go build -ldflags="${GOLDFLAGS}"
@@ -57,10 +60,7 @@ integration: cmd/algorand-indexer/algorand-indexer
 	test/postgres_integration_test.sh
 
 e2e: cmd/algorand-indexer/algorand-indexer
-	docker kill some-postgres || docker rm some-postgres || true
-	docker run -it --rm --name some-postgres -e POSTGRES_PASSWORD=postgres -p 5432:5432 -d postgres
-	python3 misc/e2elive.py --connection-string 'host=localhost port=5432 dbname=postgres sslmode=disable user=postgres password=postgres' --indexer-bin cmd/algorand-indexer/algorand-indexer --indexer-port 9890
-	docker kill some-postgres || docker rm some-postgres
+	cd misc && docker-compose build --build-arg GO_IMAGE=${GO_IMAGE} && docker-compose up --exit-code-from e2e
 
 deploy:
 	mule/deploy.sh
diff --git a/api/converter_utils.go b/api/converter_utils.go
index a8de68a..c3bcd5e 100644
--- a/api/converter_utils.go
+++ b/api/converter_utils.go
@@ -16,6 +16,7 @@ import (
 	"github.com/algorand/indexer/api/generated/v2"
 	"github.com/algorand/indexer/idb"
 	"github.com/algorand/indexer/types"
+	"github.com/algorand/indexer/util"
 )
 
 //////////////////////////////////////////////////////////////////////
@@ -299,11 +300,14 @@ func txnRowToTransaction(row idb.TxnRow) (generated.Transaction, error) {
 			Freeze:        addrPtr(stxn.Txn.AssetParams.Freeze),
 			Manager:       addrPtr(stxn.Txn.AssetParams.Manager),
 			MetadataHash:  bytePtr(stxn.Txn.AssetParams.MetadataHash[:]),
-			Name:          strPtr(stxn.Txn.AssetParams.AssetName),
+			Name:          strPtr(util.PrintableUTF8OrEmpty(stxn.Txn.AssetParams.AssetName)),
+			NameB64:       bytePtr([]byte(stxn.Txn.AssetParams.AssetName)),
 			Reserve:       addrPtr(stxn.Txn.AssetParams.Reserve),
 			Total:         stxn.Txn.AssetParams.Total,
-			UnitName:      strPtr(stxn.Txn.AssetParams.UnitName),
-			Url:           strPtr(stxn.Txn.AssetParams.URL),
+			UnitName:      strPtr(util.PrintableUTF8OrEmpty(stxn.Txn.AssetParams.UnitName)),
+			UnitNameB64:   bytePtr([]byte(stxn.Txn.AssetParams.UnitName)),
+			Url:           strPtr(util.PrintableUTF8OrEmpty(stxn.Txn.AssetParams.URL)),
+			UrlB64:        bytePtr([]byte(stxn.Txn.AssetParams.URL)),
 		}
 		config := generated.TransactionAssetConfig{
 			AssetId: uint64Ptr(uint64(stxn.Txn.ConfigAsset)),
diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go
index 9768ee6..9d2daad 100644
--- a/api/generated/common/routes.go
+++ b/api/generated/common/routes.go
@@ -71,148 +71,149 @@ func RegisterHandlers(router interface {
 // Base64 encoded, gzipped, json marshaled Swagger object
 var swaggerSpec = []string{
 
-	"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",
-	"uKYAAA==",
+	"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",
 }
 
 // GetSwagger returns the Swagger specification corresponding to the generated code
diff --git a/api/generated/common/types.go b/api/generated/common/types.go
index b1d81cd..e958b84 100644
--- a/api/generated/common/types.go
+++ b/api/generated/common/types.go
@@ -261,20 +261,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"`
 
+	// Base64 encoded name of this asset, as supplied by the creator.
+	NameB64 *[]byte `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.
+	// Base64 encoded name of a unit of this asset, as supplied by the creator.
+	UnitNameB64 *[]byte `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"`
+
+	// Base64 encoded URL where more information about the asset can be retrieved.
+	UrlB64 *[]byte `json:"url-b64,omitempty"`
 }
 
 // Block defines model for Block.
diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go
index b1602d5..db91e80 100644
--- a/api/generated/v2/routes.go
+++ b/api/generated/v2/routes.go
@@ -1314,171 +1314,173 @@ func RegisterHandlers(router interface {
 // Base64 encoded, gzipped, json marshaled Swagger object
 var swaggerSpec = []string{
 
-	"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",
+	"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",
 }
 
 // GetSwagger returns the Swagger specification corresponding to the generated code
diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go
index d657bea..553742f 100644
--- a/api/generated/v2/types.go
+++ b/api/generated/v2/types.go
@@ -261,20 +261,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"`
 
+	// Base64 encoded name of this asset, as supplied by the creator.
+	NameB64 *[]byte `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.
+	// Base64 encoded name of a unit of this asset, as supplied by the creator.
+	UnitNameB64 *[]byte `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"`
+
+	// Base64 encoded URL where more information about the asset can be retrieved.
+	UrlB64 *[]byte `json:"url-b64,omitempty"`
 }
 
 // Block defines model for Block.
diff --git a/api/handlers.go b/api/handlers.go
index f39bd3c..92023f7 100644
--- a/api/handlers.go
+++ b/api/handlers.go
@@ -14,6 +14,7 @@ import (
 	"github.com/algorand/indexer/api/generated/common"
 	"github.com/algorand/indexer/api/generated/v2"
 	"github.com/algorand/indexer/idb"
+	"github.com/algorand/indexer/util"
 )
 
 // ServerImplementation implements the handler interface used by the generated route definitions.
@@ -508,9 +509,12 @@ func (si *ServerImplementation) fetchAssets(ctx context.Context, options idb.Ass
 			Deleted:          row.Deleted,
 			Params: generated.AssetParams{
 				Creator:       creator.String(),
-				Name:          strPtr(row.Params.AssetName),
-				UnitName:      strPtr(row.Params.UnitName),
-				Url:           strPtr(row.Params.URL),
+				Name:          strPtr(util.PrintableUTF8OrEmpty(row.Params.AssetName)),
+				UnitName:      strPtr(util.PrintableUTF8OrEmpty(row.Params.UnitName)),
+				Url:           strPtr(util.PrintableUTF8OrEmpty(row.Params.URL)),
+				NameB64:       bytePtr([]byte(row.Params.AssetName)),
+				UnitNameB64:   bytePtr([]byte(row.Params.UnitName)),
+				UrlB64:        bytePtr([]byte(row.Params.URL)),
 				Total:         row.Params.Total,
 				Decimals:      uint64(row.Params.Decimals),
 				DefaultFrozen: boolPtr(row.Params.DefaultFrozen),
@@ -522,6 +526,20 @@ func (si *ServerImplementation) fetchAssets(ctx context.Context, options idb.Ass
 			},
 		}
 
+		// In case the DB layer filled the name with non-printable utf8
+		if asset.Params.Name != nil {
+			name := util.PrintableUTF8OrEmpty(*asset.Params.Name)
+			asset.Params.Name = &name
+		}
+		if asset.Params.UnitName != nil {
+			unit := util.PrintableUTF8OrEmpty(*asset.Params.UnitName)
+			asset.Params.UnitName = &unit
+		}
+		if asset.Params.Url != nil {
+			url := util.PrintableUTF8OrEmpty(*asset.Params.Url)
+			asset.Params.Url = &url
+		}
+
 		assets = append(assets, asset)
 	}
 	return assets, round, nil
diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json
index 451d3da..0dffa96 100644
--- a/api/indexer.oas2.json
+++ b/api/indexer.oas2.json
@@ -1060,9 +1060,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": "Base64 encoded name of this asset, as supplied by the creator.",
+          "type": "string",
+          "format": "byte"
+        },
         "reserve": {
           "description": "\\[r\\] Address of account holding reserve (non-minted) units of this asset.",
           "type": "string"
@@ -1073,12 +1078,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": "Base64 encoded name of a unit of this asset, as supplied by the creator.",
+          "type": "string",
+          "format": "byte"
+        },
         "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": "Base64 encoded URL where more information about the asset can be retrieved.",
+          "type": "string",
+          "format": "byte"
         }
       }
     },
diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml
index 65f1813..41ebcb7 100644
--- a/api/indexer.oas3.yml
+++ b/api/indexer.oas3.yml
@@ -882,7 +882,13 @@
             "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": "Base64 encoded name of this asset, as supplied by the creator.",
+            "format": "byte",
+            "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$",
             "type": "string"
           },
           "reserve": {
@@ -895,11 +901,23 @@
             "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": "Base64 encoded name of a unit of this asset, as supplied by the creator.",
+            "format": "byte",
+            "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$",
             "type": "string"
           },
           "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": "Base64 encoded URL where more information about the asset can be retrieved.",
+            "format": "byte",
+            "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$",
             "type": "string"
           }
         },
diff --git a/idb/idb.go b/idb/idb.go
index 843d0f4..15f98ff 100644
--- a/idb/idb.go
+++ b/idb/idb.go
@@ -218,7 +218,7 @@ type AssetsQuery struct {
 type AssetRow struct {
 	AssetID      uint64
 	Creator      []byte
-	Params       types.AssetParams
+	Params       sdk_types.AssetParams
 	Error        error
 	CreatedRound *uint64
 	ClosedRound  *uint64
diff --git a/idb/postgres/internal/encoding/decode.go b/idb/postgres/internal/encoding/decode.go
index b5830b5..ba393e1 100644
--- a/idb/postgres/internal/encoding/decode.go
+++ b/idb/postgres/internal/encoding/decode.go
@@ -1,8 +1,82 @@
 package encoding
 
 import (
+	"github.com/algorand/indexer/types"
+
 	"github.com/algorand/go-algorand-sdk/encoding/json"
+	sdk_types "github.com/algorand/go-algorand-sdk/types"
 )
 
 // DecodeJSON decodes a json string.
 var DecodeJSON = json.Decode
+
+func unconvertAssetParams(params assetParams) sdk_types.AssetParams {
+	res := params.AssetParams
+	if len(res.AssetName) == 0 {
+		res.AssetName = string(params.AssetNameBytes)
+	}
+	if len(res.UnitName) == 0 {
+		res.UnitName = string(params.UnitNameBytes)
+	}
+	if len(res.URL) == 0 {
+		res.URL = string(params.URLBytes)
+	}
+	return res
+}
+
+// DecodeAssetParams converts the postgres assetParams object into AssetParams.
+func DecodeAssetParams(data []byte) (sdk_types.AssetParams, error) {
+	var params assetParams
+	err := DecodeJSON(data, &params)
+	if err != nil {
+		return sdk_types.AssetParams{}, err
+	}
+
+	return unconvertAssetParams(params), nil
+}
+
+func unconvertTransaction(txn transaction) types.Transaction {
+	res := txn.Transaction
+	res.AssetParams = unconvertAssetParams(txn.AssetParamsOverride)
+	return res
+}
+
+func unconvertSignedTxnWithAD(stxn signedTxnWithAD) types.SignedTxnWithAD {
+	res := stxn.SignedTxnWithAD
+	res.Txn = unconvertTransaction(stxn.TxnOverride)
+	return res
+}
+
+// DecodeSignedTxnWithAD converts the postgres signedTxnWithAD object into SignedTxnWithAD.
+func DecodeSignedTxnWithAD(data []byte) (types.SignedTxnWithAD, error) {
+	var stxn signedTxnWithAD
+	err := DecodeJSON(data, &stxn)
+	if err != nil {
+		return types.SignedTxnWithAD{}, err
+	}
+
+	return unconvertSignedTxnWithAD(stxn), nil
+}
+
+func unconvertAssetParamsArray(paramsArr []assetParams) []sdk_types.AssetParams {
+	if paramsArr == nil {
+		return nil
+	}
+
+	res := make([]sdk_types.AssetParams, 0, len(paramsArr))
+	for _, params := range paramsArr {
+		res = append(res, unconvertAssetParams(params))
+	}
+	return res
+}
+
+// DecodeAssetParamsArray converts an array of the postgres assetParams object into AssetParams.
+func DecodeAssetParamsArray(data []byte) ([]sdk_types.AssetParams, error) {
+	var paramsArr []assetParams
+	err := DecodeJSON(data, &paramsArr)
+	if err != nil {
+		return nil, err
+	}
+
+	return unconvertAssetParamsArray(paramsArr), nil
+}
diff --git a/idb/postgres/internal/encoding/encode.go b/idb/postgres/internal/encoding/encode.go
index e0c4fd7..690e2f2 100644
--- a/idb/postgres/internal/encoding/encode.go
+++ b/idb/postgres/internal/encoding/encode.go
@@ -3,9 +3,11 @@ package encoding
 import (
 	"encoding/base64"
 
+	sdk_types "github.com/algorand/go-algorand-sdk/types"
 	"github.com/algorand/go-codec/codec"
 
 	"github.com/algorand/indexer/types"
+	"github.com/algorand/indexer/util"
 )
 
 var jsonCodecHandle *codec.JsonHandle
@@ -18,6 +20,38 @@ func EncodeJSON(obj interface{}) []byte {
 	return buf
 }
 
+func convertAssetParams(params sdk_types.AssetParams) assetParams {
+	ret := assetParams{
+		AssetParams:    params,
+		AssetNameBytes: []byte(params.AssetName),
+		UnitNameBytes:  []byte(params.UnitName),
+		URLBytes:       []byte(params.URL),
+	}
+
+	ret.AssetName = util.PrintableUTF8OrEmpty(params.AssetName)
+	ret.UnitName = util.PrintableUTF8OrEmpty(params.UnitName)
+	ret.URL = util.PrintableUTF8OrEmpty(params.URL)
+
+	// If the string is printable, don't store the encoded version.
+	// This is a nice optimization, and required for backwards compatibility.
+	if len(ret.AssetName) > 0 {
+		ret.AssetNameBytes = nil
+	}
+	if len(ret.UnitName) > 0 {
+		ret.UnitNameBytes = nil
+	}
+	if len(ret.URL) > 0 {
+		ret.URLBytes = nil
+	}
+
+	return ret
+}
+
+// EncodeAssetParams returns a json string where all byte arrays are base64 encoded.
+func EncodeAssetParams(params sdk_types.AssetParams) []byte {
+	return EncodeJSON(convertAssetParams(params))
+}
+
 // Base64 encodes a byte array to a base64 string.
 func Base64(data []byte) string {
 	return base64.StdEncoding.EncodeToString(data)
@@ -53,9 +87,19 @@ func convertEvalDelta(evalDelta types.EvalDelta) types.EvalDelta {
 	return evalDelta
 }
 
-func convertSignedTxnWithAD(stxn types.SignedTxnWithAD) types.SignedTxnWithAD {
+func convertTransaction(txn types.Transaction) transaction {
+	return transaction{
+		Transaction:         txn,
+		AssetParamsOverride: convertAssetParams(txn.AssetParams),
+	}
+}
+
+func convertSignedTxnWithAD(stxn types.SignedTxnWithAD) signedTxnWithAD {
 	stxn.EvalDelta = convertEvalDelta(stxn.EvalDelta)
-	return stxn
+	return signedTxnWithAD{
+		SignedTxnWithAD: stxn,
+		TxnOverride:     convertTransaction(stxn.Txn),
+	}
 }
 
 // EncodeSignedTxnWithAD returns a json string where all byte arrays are base64 encoded.
diff --git a/idb/postgres/internal/encoding/types.go b/idb/postgres/internal/encoding/types.go
new file mode 100644
index 0000000..1fde235
--- /dev/null
+++ b/idb/postgres/internal/encoding/types.go
@@ -0,0 +1,24 @@
+package encoding
+
+import (
+	sdk_types "github.com/algorand/go-algorand-sdk/types"
+
+	"github.com/algorand/indexer/types"
+)
+
+type assetParams struct {
+	sdk_types.AssetParams
+	UnitNameBytes  []byte `codec:"un64,omitempty"`
+	AssetNameBytes []byte `codec:"an64,omitempty"`
+	URLBytes       []byte `codec:"au64,omitempty"`
+}
+
+type transaction struct {
+	types.Transaction
+	AssetParamsOverride assetParams `codec:"apar,omitempty"`
+}
+
+type signedTxnWithAD struct {
+	types.SignedTxnWithAD
+	TxnOverride transaction `codec:"txn,omitempty"`
+}
diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go
index 65955af..ca837dc 100644
--- a/idb/postgres/postgres.go
+++ b/idb/postgres/postgres.go
@@ -33,6 +33,7 @@ import (
 	"github.com/algorand/indexer/idb/migration"
 	"github.com/algorand/indexer/idb/postgres/internal/encoding"
 	"github.com/algorand/indexer/types"
+	"github.com/algorand/indexer/util"
 )
 
 type importState struct {
@@ -1041,9 +1042,9 @@ ON CONFLICT (addr, assetid) DO UPDATE SET amount = account_asset.amount + EXCLUD
 
 					// Asset Config
 					if au.Config != nil {
-						var outparams []byte
+						var params sdk_types.AssetParams
 						if au.Config.IsNew {
-							outparams = encoding.EncodeJSON(au.Config.Params)
+							params = au.Config.Params
 						} else {
 							row := getacfg.QueryRow(au.AssetID)
 							var paramjson []byte
@@ -1051,14 +1052,13 @@ ON CONFLICT (addr, assetid) DO UPDATE SET amount = account_asset.amount + EXCLUD
 							if err != nil {
 								return fmt.Errorf("get acfg %d, %v", au.AssetID, err)
 							}
-							var old sdk_types.AssetParams
-							err = encoding.DecodeJSON(paramjson, &old)
+							params, err = encoding.DecodeAssetParams(paramjson)
 							if err != nil {
 								return fmt.Errorf("bad acgf json %d, %v", au.AssetID, err)
 							}
-							np := types.MergeAssetConfig(old, au.Config.Params)
-							outparams = encoding.EncodeJSON(np)
+							params = types.MergeAssetConfig(params, au.Config.Params)
 						}
+						outparams := encoding.EncodeAssetParams(params)
 						_, err = setacfg.Exec(au.AssetID, au.Config.Creator[:], outparams, round)
 						if err != nil {
 							return fmt.Errorf("update asset, %v", err)
@@ -2016,8 +2016,7 @@ func (db *IndexerDb) yieldAccountsThread(req *getAccountsRequest) {
 				req.out <- idb.AccountRow{Error: err}
 				break
 			}
-			var assetParams []types.AssetParams
-			err = encoding.DecodeJSON(assetParamsStr, &assetParams)
+			assetParams, err := encoding.DecodeAssetParamsArray(assetParamsStr)
 			if err != nil {
 				err = fmt.Errorf("parsing json asset param string, %v", err)
 				req.out <- idb.AccountRow{Error: err}
@@ -2077,9 +2076,12 @@ func (db *IndexerDb) yieldAccountsThread(req *getAccountsRequest) {
 						Total:         ap.Total,
 						Decimals:      uint64(ap.Decimals),
 						DefaultFrozen: boolPtr(ap.DefaultFrozen),
-						UnitName:      stringPtr(ap.UnitName),
-						Name:          stringPtr(ap.AssetName),
-						Url:           stringPtr(ap.URL),
+						UnitName:      stringPtr(util.PrintableUTF8OrEmpty(ap.UnitName)),
+						UnitNameB64:   baPtr([]byte(ap.UnitName)),
+						Name:          stringPtr(util.PrintableUTF8OrEmpty(ap.AssetName)),
+						NameB64:       baPtr([]byte(ap.AssetName)),
+						Url:           stringPtr(util.PrintableUTF8OrEmpty(ap.URL)),
+						UrlB64:        baPtr([]byte(ap.URL)),
 						MetadataHash:  baPtr(ap.MetadataHash[:]),
 						Manager:       addrStr(ap.Manager),
 						Reserve:       addrStr(ap.Reserve),
@@ -2657,12 +2659,13 @@ func (db *IndexerDb) yieldAssetsThread(ctx context.Context, filter idb.AssetsQue
 			out <- idb.AssetRow{Error: err}
 			break
 		}
-		var params types.AssetParams
-		err = encoding.DecodeJSON(paramsJSONStr, &params)
+		params, err := encoding.DecodeAssetParams(paramsJSONStr)
 		if err != nil {
 			out <- idb.AssetRow{Error: err}
 			break
 		}
+		var creator types.Address
+		copy(creator[:], creatorAddr)
 		rec := idb.AssetRow{
 			AssetID:      index,
 			Creator:      creatorAddr,
diff --git a/misc/Dockerfile b/misc/Dockerfile
new file mode 100644
index 0000000..45cb5dc
--- /dev/null
+++ b/misc/Dockerfile
@@ -0,0 +1,29 @@
+ARG GO_IMAGE=golang:1.14.7
+FROM $GO_IMAGE
+
+RUN echo "Go image: $GO_IMAGE"
+
+# Misc dependencies
+ENV HOME /opt    
+ENV DEBIAN_FRONTEND noninteractive    
+RUN apt-get update && apt-get install -y apt-utils curl git git-core bsdmainutils python3 python3-pip make
+
+# Install algod nightly binaries to the path
+RUN mkdir -p /opt/algorand/{bin,data}
+ADD https://github.com/algorand/go-algorand/raw/1e1474216421da27008726c44ebe0a5ba2fb6a08/cmd/updater/update.sh /opt/algorand/bin/update.sh
+RUN chmod 755 /opt/algorand/bin/update.sh
+WORKDIR /opt/algorand/bin
+RUN ./update.sh -i -c nightly -p /opt/algorand/bin -d /opt/algorand/data -n
+RUN find /opt/algorand
+ENV PATH="/opt/algorand/bin:${PATH}"
+
+# Setup files for test
+run mkdir -p /opt/go/indexer
+COPY . /opt/go/indexer
+WORKDIR /opt/go/indexer
+RUN rm /opt/go/indexer/cmd/algorand-indexer/algorand-indexer
+RUN make
+RUN pip3 install -r misc/requirements.txt
+
+# Run test script
+ENTRYPOINT ["/bin/bash", "-c", "sleep 5 && python3 misc/e2elive.py --connection-string \"$CONNECTION_STRING\" --indexer-bin /opt/go/indexer/cmd/algorand-indexer/algorand-indexer --indexer-port 9890"]
diff --git a/misc/docker-compose.yml b/misc/docker-compose.yml
new file mode 100644
index 0000000..5a8a6eb
--- /dev/null
+++ b/misc/docker-compose.yml
@@ -0,0 +1,20 @@
+version: '3'    
+    
+services:    
+  e2e:    
+    build:    
+      context: ../.
+      dockerfile: ./misc/Dockerfile    
+    environment:
+      CONNECTION_STRING: "host=e2e-db port=5432 user=algorand password=algorand dbname=indexer_db sslmode=disable"
+
+  e2e-db:
+    image: "postgres:13-alpine"
+    ports:
+      - 5433:5432
+    environment:
+      POSTGRES_USER: algorand
+      POSTGRES_PASSWORD: algorand
+      POSTGRES_DB: indexer_db
+
+
diff --git a/types/types.go b/types/types.go
index d26c308..2177e69 100644
--- a/types/types.go
+++ b/types/types.go
@@ -907,14 +907,14 @@ const (
 )
 
 // MergeAssetConfig merges together two asset param objects.
-func MergeAssetConfig(old, new sdk_types.AssetParams) (out sdk_types.AssetParams) {
+func MergeAssetConfig(old, new AssetParams) (out AssetParams) {
 	// if asset is new, set.
 	// if new config is empty, set empty.
 	// else, update.
-	if old == (sdk_types.AssetParams{}) {
-		out = new
-	} else if new == (sdk_types.AssetParams{}) {
+	if old.IsZero() {
 		out = new
+	} else if new.IsZero() {
+		out = old
 	} else {
 		out = old
 		if !old.Manager.IsZero() {
diff --git a/util/util.go b/util/util.go
index dcc511e..52a366e 100644
--- a/util/util.go
+++ b/util/util.go
@@ -4,10 +4,26 @@ import (
 	"fmt"
 	"os"
 	"strings"
+	"unicode"
+	"unicode/utf8"
 
 	"github.com/algorand/go-codec/codec"
 )
 
+// 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
+}
+
 // KeysStringBool returns all of the keys in the map joined by a comma.
 func KeysStringBool(m map[string]bool) string {
 	keys := make([]string, 0, len(m))


Test patch:
diff --git a/api/test_resources/asset_config.response b/api/test_resources/asset_config.response
index 5832ec1..1004d19 100644
--- a/api/test_resources/asset_config.response
+++ b/api/test_resources/asset_config.response
@@ -1,2 +1,2 @@
-{"asset-config-transaction":{"asset-id":0,"params":{"clawback":"AJNNFQN7DSR7QEY766V7JDG35OPM53ZSNF7CU264AWOOUGSZBMLMSKCRIU","creator":"YX654HYIBKEQ5NGN35HX335XEIUNRFP57X7WNRYM72DH326HIMQGZ5UEQQ","decimals":0,"default-frozen":false,"freeze":"AJNNFQN7DSR7QEY766V7JDG35OPM53ZSNF7CU264AWOOUGSZBMLMSKCRIU","manager":"AJNNFQN7DSR7QEY766V7JDG35OPM53ZSNF7CU264AWOOUGSZBMLMSKCRIU","metadata-hash":"MTZlZmFhMzkyNGE2ZmQ5ZDNhNDgyNDc5OWE0YWM2NWQ=","name":"oknmb","reserve":"AJNNFQN7DSR7QEY766V7JDG35OPM53ZSNF7CU264AWOOUGSZBMLMSKCRIU","total":10000,"unit-name":"OKNMB","url":"http://okb.com"}},"close-rewards":0,"closing-amount":0,"confirmed-round":1,"created-asset-index":100,"fee":1000,"first-valid":3483142,"genesis-id":"mainnet-v1.0","id":"2G3MSXTIYVAHFFVVK35K4XYZQ4NBJEEIVC4PT3XCCHHRO5BEICNA","intra-round-offset":2,"last-valid":3484142,"receiver-rewards":0,"round-time":1586273976,"sender":"YX654HYIBKEQ5NGN35HX335XEIUNRFP57X7WNRYM72DH326HIMQGZ5UEQQ","sender-rewards":0,"signature":{"sig":"x1u65OjFwyiyMvjIfKKGSTRtqpK4aOeTIkPbGNMPpTAxX4iq6iMSi/Uz/ziwcFhPnLVwQq+5Nzdmzxqe5T3LBg=="},"tx-type":"acfg"}
+{"asset-config-transaction":{"asset-id":0,"params":{"clawback":"AJNNFQN7DSR7QEY766V7JDG35OPM53ZSNF7CU264AWOOUGSZBMLMSKCRIU","creator":"YX654HYIBKEQ5NGN35HX335XEIUNRFP57X7WNRYM72DH326HIMQGZ5UEQQ","decimals":0,"default-frozen":false,"freeze":"AJNNFQN7DSR7QEY766V7JDG35OPM53ZSNF7CU264AWOOUGSZBMLMSKCRIU","manager":"AJNNFQN7DSR7QEY766V7JDG35OPM53ZSNF7CU264AWOOUGSZBMLMSKCRIU","metadata-hash":"MTZlZmFhMzkyNGE2ZmQ5ZDNhNDgyNDc5OWE0YWM2NWQ=","name":"oknmb","name-b64":"b2tubWI=","reserve":"AJNNFQN7DSR7QEY766V7JDG35OPM53ZSNF7CU264AWOOUGSZBMLMSKCRIU","total":10000,"unit-name":"OKNMB","unit-name-b64":"T0tOTUI=","url":"http://okb.com","url-b64":"aHR0cDovL29rYi5jb20="}},"close-rewards":0,"closing-amount":0,"confirmed-round":1,"created-asset-index":100,"fee":1000,"first-valid":3483142,"genesis-id":"mainnet-v1.0","id":"2G3MSXTIYVAHFFVVK35K4XYZQ4NBJEEIVC4PT3XCCHHRO5BEICNA","intra-round-offset":2,"last-valid":3484142,"receiver-rewards":0,"round-time":1586273976,"sender":"YX654HYIBKEQ5NGN35HX335XEIUNRFP57X7WNRYM72DH326HIMQGZ5UEQQ","sender-rewards":0,"signature":{"sig":"x1u65OjFwyiyMvjIfKKGSTRtqpK4aOeTIkPbGNMPpTAxX4iq6iMSi/Uz/ziwcFhPnLVwQq+5Nzdmzxqe5T3LBg=="},"tx-type":"acfg"}
 
diff --git a/idb/postgres/internal/encoding/encoding_test.go b/idb/postgres/internal/encoding/encoding_test.go
index 60aa246..1ec5436 100644
--- a/idb/postgres/internal/encoding/encoding_test.go
+++ b/idb/postgres/internal/encoding/encoding_test.go
@@ -4,10 +4,12 @@ import (
 	"fmt"
 	"testing"
 
-	"github.com/algorand/go-algorand-sdk/encoding/msgpack"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 
+	"github.com/algorand/go-algorand-sdk/encoding/msgpack"
+	sdk_types "github.com/algorand/go-algorand-sdk/types"
+
 	"github.com/algorand/indexer/types"
 )
 
@@ -84,3 +86,114 @@ func TestJSONEncoding(t *testing.T) {
 
 	assert.Equal(t, x, xx)
 }
+
+// Test that encoding of Transaction is as expected and that decoding results in the same object.
+func TestTransactionEncoding(t *testing.T) {
+	i := byte(0)
+	newaddr := func() types.Address {
+		i++
+		var address types.Address
+		address[0] = i
+		return address
+	}
+
+	tests := []struct {
+		name     string
+		params   types.SignedTxnWithAD
+		expected string
+	}{
+		{
+			name: "simple",
+			params: types.SignedTxnWithAD{
+				SignedTxn: sdk_types.SignedTxn{
+					Txn: types.Transaction{
+						AssetConfigTxnFields: sdk_types.AssetConfigTxnFields{
+							AssetParams: sdk_types.AssetParams{
+								Total:     99999,
+								AssetName: "\r",
+								UnitName:  "💰",
+								URL:       "https://my.\000asset",
+								Manager:   newaddr(),
+								Reserve:   newaddr(),
+								Freeze:    newaddr(),
+								Clawback:  newaddr(),
+							},
+						},
+					},
+				},
+			},
+			expected: `{"txn":{"apar":{"an64":"DQ==","au64":"aHR0cHM6Ly9teS4AYXNzZXQ=","c":"BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","f":"AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","m":"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","r":"AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","t":99999,"un":"💰"}}}`,
+		},
+	}
+
+	for _, testcase := range tests {
+		testcase := testcase
+		t.Run(testcase.name, func(t *testing.T) {
+			t.Parallel()
+			buf := EncodeSignedTxnWithAD(testcase.params)
+			assert.Equal(t, testcase.expected, string(buf))
+
+			paramsNew, err := DecodeSignedTxnWithAD(buf)
+			require.NoError(t, err)
+			assert.Equal(t, testcase.params, paramsNew)
+		})
+	}
+}
+
+// Test that encoding of AssetParams is as expected and that decoding results in the
+// same object.
+func TestAssetParamsEncoding(t *testing.T) {
+	i := byte(0)
+	newaddr := func() types.Address {
+		i++
+		var address types.Address
+		address[0] = i
+		return address
+	}
+
+	tests := []struct {
+		name     string
+		params   sdk_types.AssetParams
+		expected string
+	}{
+		{
+			name: "simple",
+			params: sdk_types.AssetParams{
+				Total:    99999,
+				URL:      "https://my.asset",
+				Manager:  newaddr(),
+				Reserve:  newaddr(),
+				Freeze:   newaddr(),
+				Clawback: newaddr(),
+			},
+			expected: `{"au":"https://my.asset","c":"BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","f":"AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","m":"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","r":"AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","t":99999}`,
+		},
+		{
+			name: "embedded null / non-printable / emoji char",
+			params: sdk_types.AssetParams{
+				Total:     99999,
+				AssetName: "\r",
+				UnitName:  "💰",
+				URL:       "https://my.\000asset",
+				Manager:   newaddr(),
+				Reserve:   newaddr(),
+				Freeze:    newaddr(),
+				Clawback:  newaddr(),
+			},
+			expected: `{"an64":"DQ==","au64":"aHR0cHM6Ly9teS4AYXNzZXQ=","c":"CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","f":"BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","m":"BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","r":"BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","t":99999,"un":"💰"}`,
+		},
+	}
+
+	for _, testcase := range tests {
+		testcase := testcase
+		t.Run(testcase.name, func(t *testing.T) {
+			t.Parallel()
+			buf := EncodeAssetParams(testcase.params)
+			assert.Equal(t, testcase.expected, string(buf))
+
+			paramsNew, err := DecodeAssetParams(buf)
+			require.NoError(t, err)
+			assert.Equal(t, testcase.params, paramsNew)
+		})
+	}
+}
diff --git a/idb/postgres/postgres_integration_test.go b/idb/postgres/postgres_integration_test.go
index 6149294..1737b8e 100644
--- a/idb/postgres/postgres_integration_test.go
+++ b/idb/postgres/postgres_integration_test.go
@@ -1103,3 +1103,200 @@ func TestOpenDbAgain(t *testing.T) {
 	_, err = OpenPostgres(connStr, idb.IndexerDbOptions{}, nil)
 	require.NoError(t, err)
 }
+
+func requireNilOrEqual(t *testing.T, expected string, actual *string) {
+	if expected == "" {
+		require.Nil(t, actual)
+	} else {
+		require.NotNil(t, actual)
+		require.Equal(t, expected, *actual)
+	}
+}
+
+// TestNonDisplayableUTF8 make sure we're able to import cheeky assets.
+func TestNonDisplayableUTF8(t *testing.T) {
+	tests := []struct {
+		Name              string
+		AssetName         string
+		AssetUnit         string
+		AssetURL          string
+		ExpectedAssetName string
+		ExpectedAssetUnit string
+		ExpectedAssetURL  string
+	}{
+		{
+			Name:              "Normal",
+			AssetName:         "asset-name",
+			AssetUnit:         "au",
+			AssetURL:          "https://algorand.com",
+			ExpectedAssetName: "asset-name",
+			ExpectedAssetUnit: "au",
+			ExpectedAssetURL:  "https://algorand.com",
+		},
+		{
+			Name:              "Embedded Null",
+			AssetName:         "asset\000name",
+			AssetUnit:         "a\000u",
+			AssetURL:          "https:\000//algorand.com",
+			ExpectedAssetName: "",
+			ExpectedAssetUnit: "",
+			ExpectedAssetURL:  "",
+		},
+		{
+			Name:              "Invalid UTF8",
+			AssetName:         "asset\x8cname",
+			AssetUnit:         "a\x8cu",
+			AssetURL:          "https:\x8c//algorand.com",
+			ExpectedAssetName: "",
+			ExpectedAssetUnit: "",
+			ExpectedAssetURL:  "",
+		},
+		{
+			Name:              "Emoji",
+			AssetName:         "💩",
+			AssetUnit:         "💰",
+			AssetURL:          "🌐",
+			ExpectedAssetName: "💩",
+			ExpectedAssetUnit: "💰",
+			ExpectedAssetURL:  "🌐",
+		},
+	}
+
+	assetID := uint64(1)
+	round := test.Round
+	var creator types.Address
+
+	for _, testcase := range tests {
+		testcase := testcase
+		name := testcase.AssetName
+		unit := testcase.AssetUnit
+		url := testcase.AssetURL
+		creator[0] = byte(assetID)
+
+		t.Run(testcase.Name, func(t *testing.T) {
+			t.Parallel()
+			db, shutdownFunc := setupIdb(t, test.MakeGenesis())
+			defer shutdownFunc()
+
+			txn, txnRow := test.MakeAssetConfigOrPanic(
+				round, 0, assetID, math.MaxUint64, 0, false, unit, name, url, test.AccountA)
+
+			// Test 1: import/accounting should work.
+			importTxns(t, db, round, txn)
+			accountTxns(t, db, round, txnRow)
+
+			// Test 2: asset results properly serialized
+			assets, _ := db.Assets(context.Background(), idb.AssetsQuery{AssetID: assetID})
+			num := 0
+			for asset := range assets {
+				require.NoError(t, asset.Error)
+				require.Equal(t, name, asset.Params.AssetName)
+				require.Equal(t, unit, asset.Params.UnitName)
+				require.Equal(t, url, asset.Params.URL)
+				num++
+			}
+			require.Equal(t, 1, num)
+
+			// Test 3: transaction results properly serialized
+			transactions, _ := db.Transactions(context.Background(), idb.TransactionFilter{})
+			num = 0
+			for tx := range transactions {
+				require.NoError(t, tx.Error)
+				// Note: These are created from the TxnBytes, so they have the exact name with embedded null.
+				var txn sdk_types.SignedTxn
+				require.NoError(t, msgpack.Decode(tx.TxnBytes, &txn))
+				require.Equal(t, name, txn.Txn.AssetParams.AssetName)
+				require.Equal(t, unit, txn.Txn.AssetParams.UnitName)
+				require.Equal(t, url, txn.Txn.AssetParams.URL)
+				num++
+			}
+			require.Equal(t, 1, num)
+
+			// Test 4: account results should have the correct asset
+			accounts, _ := db.GetAccounts(context.Background(), idb.AccountQueryOptions{EqualToAddress: test.AccountA[:], IncludeAssetParams: true})
+			num = 0
+			for acct := range accounts {
+				require.NoError(t, acct.Error)
+				require.NotNil(t, acct.Account.CreatedAssets)
+				require.Len(t, *acct.Account.CreatedAssets, 1)
+
+				asset := (*acct.Account.CreatedAssets)[0]
+				if testcase.ExpectedAssetName == "" {
+					require.Nil(t, asset.Params.Name)
+				}
+				requireNilOrEqual(t, testcase.ExpectedAssetName, asset.Params.Name)
+				requireNilOrEqual(t, testcase.ExpectedAssetUnit, asset.Params.UnitName)
+				requireNilOrEqual(t, testcase.ExpectedAssetURL, asset.Params.Url)
+				require.Equal(t, []byte(name), *asset.Params.NameB64)
+				require.Equal(t, []byte(unit), *asset.Params.UnitNameB64)
+				require.Equal(t, []byte(url), *asset.Params.UrlB64)
+				num++
+			}
+			require.Equal(t, 1, num)
+		})
+	}
+}
+
+// TestReconfigAsset make sure we properly handle asset param merges.
+func TestReconfigAsset(t *testing.T) {
+	db, shutdownFunc := setupIdb(t, test.MakeGenesis())
+	defer shutdownFunc()
+
+	unit := "co\000in"
+	name := "algo"
+	url := "https://algorand.com"
+
+	assetID := uint64(1)
+	txn, txnRow := test.MakeAssetConfigOrPanic(
+		test.Round, 0, assetID, math.MaxUint64, 0, false, unit, name, url, test.AccountA)
+
+	txn2 := sdk_types.SignedTxnWithAD{
+		SignedTxn: sdk_types.SignedTxn{
+			Txn: sdk_types.Transaction{
+				Type: "acfg",
+				Header: sdk_types.Header{
+					Sender:     test.AccountA,
+					Fee:        sdk_types.MicroAlgos(1000),
+					FirstValid: sdk_types.Round(test.Round + 1),
+					LastValid:  sdk_types.Round(test.Round + 1),
+				},
+				AssetConfigTxnFields: sdk_types.AssetConfigTxnFields{
+					ConfigAsset: sdk_types.AssetIndex(assetID),
+					AssetParams: sdk_types.AssetParams{
+						Freeze:   test.AccountB,
+						Clawback: test.AccountC,
+					},
+				},
+			},
+		},
+	}
+
+	txnRow2 := idb.TxnRow{
+		Round:    uint64(txn2.Txn.FirstValid),
+		TxnBytes: msgpack.Encode(txn2),
+		AssetID:  assetID,
+	}
+
+	importTxns(t, db, test.Round, txn)
+	accountTxns(t, db, test.Round, txnRow)
+	importTxns(t, db, test.Round+1, &txn2)
+	accountTxns(t, db, test.Round+1, &txnRow2)
+
+	// Test 2: asset results properly serialized
+	assets, _ := db.Assets(context.Background(), idb.AssetsQuery{AssetID: assetID})
+	num := 0
+	for asset := range assets {
+		require.NoError(t, asset.Error)
+		require.Equal(t, name, asset.Params.AssetName)
+		require.Equal(t, unit, asset.Params.UnitName)
+		require.Equal(t, url, asset.Params.URL)
+
+		require.Equal(t, sdk_types.ZeroAddress, asset.Params.Manager, "Manager should have been cleared.")
+		require.Equal(t, sdk_types.ZeroAddress, asset.Params.Reserve, "Reserve should have been cleared.")
+		// These were updated
+		require.Equal(t, test.AccountB, asset.Params.Freeze)
+		require.Equal(t, test.AccountC, asset.Params.Clawback)
+		num++
+	}
+	require.Equal(t, 1, num)
+}
diff --git a/test/common.sh b/test/common.sh
index db2459a..5ca1aa8 100755
--- a/test/common.sh
+++ b/test/common.sh
@@ -709,4 +709,44 @@ function create_delete_tests() {
       "SELECT deleted,created_at FROM account WHERE addr=decode('B9rLS22e0UGxdXa9RZrmQh1IbaPU7yJHxAmjlrguoiE=','base64') OR addr=decode('//////////////////////////////////////////8=','base64')" \
       "f|0
 f|0"
+
+      rest_test "[rest] b64 transaction fields are serialized" \
+      "/v2/transactions/TV5RPJFA6YT2APADUOYKIEL3NFAXSVB5J4JO6TSG7BHK4Z5OJKSA?pretty" \
+      200 \
+      true \
+      '"decimals": 0' \
+      '"default-frozen": false' \
+      '"name": "bogocoin"' \
+      '"name-b64": "Ym9nb2NvaW4="' \
+      '"reserve": "EQJSQTOITX64CPGA5VRKBKLEJR57YXVNLTW5DKZMESIPTEOLRDNWQIJCGU"' \
+      '"total": 1000000000000' \
+      '"unit-name": "bogo"' \
+      '"unit-name-b64": "Ym9nbw=="' \
+      '"created-asset-index": 36'
+
+      rest_test "[rest] b64 asset fields are serialized" \
+      "/v2/assets/36?pretty" \
+      200 \
+      true \
+      '"decimals": 0' \
+      '"default-frozen": false' \
+      '"name": "bogocoin"' \
+      '"name-b64": "Ym9nb2NvaW4="' \
+      '"reserve": "EQJSQTOITX64CPGA5VRKBKLEJR57YXVNLTW5DKZMESIPTEOLRDNWQIJCGU"' \
+      '"total": 1000000000000' \
+      '"unit-name": "bogo"' \
+      '"unit-name-b64": "Ym9nbw=="'
+
+      rest_test "[rest] b64 account fields are serialized" \
+      "/v2/accounts/EQJSQTOITX64CPGA5VRKBKLEJR57YXVNLTW5DKZMESIPTEOLRDNWQIJCGU?pretty" \
+      200 \
+      true \
+      '"decimals": 0' \
+      '"default-frozen": false' \
+      '"name": "bogocoin"' \
+      '"name-b64": "Ym9nb2NvaW4="' \
+      '"reserve": "EQJSQTOITX64CPGA5VRKBKLEJR57YXVNLTW5DKZMESIPTEOLRDNWQIJCGU"' \
+      '"total": 1000000000000' \
+      '"unit-name": "bogo"' \
+      '"unit-name-b64": "Ym9nbw=="'
 }