diff --git a/rpc/client.go b/rpc/client.go index d3ca8ce..7ec3221 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -45,10 +45,12 @@ type ClientPOS interface { // The response should be identical, regardless of the node queried, // as the information in question is objective and common to all nodes within a network. type ClientInformational interface { - // GetAccountBalance returns a purse's balance from a network. + // GetLatestBalance returns a purse's balance from a network. // The request takes in the formatted representation of a purse URef as a parameter. - // If the param stateRootHash is nil, the client will make an additional RPC call to retrieve the latest stateRootHash. - GetAccountBalance(ctx context.Context, stateRootHash *string, purseURef string) (StateGetBalanceResult, error) + // The client will make an additional RPC call to retrieve the latest stateRootHash. + GetLatestBalance(ctx context.Context, purseURef string) (StateGetBalanceResult, error) + // GetBalanceByStateRootHash returns a purse's balance and state root hash from a network. + GetBalanceByStateRootHash(ctx context.Context, purseURef string, stateRootHash string) (StateGetBalanceResult, error) // GetDeploy retrieves a Deploy from a network. It requires a deploy_hash to query the Deploy. GetDeploy(ctx context.Context, hash string) (InfoGetDeployResult, error) // GetDeployFinalizedApproval returns Deploy with the finalized approvals substituted. @@ -117,8 +119,25 @@ type ClientInformational interface { // GetPeers return a list of peers connected to the node on a Casper network. // The responses return information specific to the queried node, and as such, will vary. GetPeers(ctx context.Context) (InfoGetPeerResult, error) - // QueryBalance queries for balances under a given PurseIdentifier - QueryBalance(ctx context.Context, identifier PurseIdentifier) (QueryBalanceResult, error) + + // QueryLatestBalance queries for balances under a given PurseIdentifier + QueryLatestBalance(ctx context.Context, identifier PurseIdentifier) (QueryBalanceResult, error) + // QueryBalanceByBlockHeight query for balance information using a purse identifier and block height + QueryBalanceByBlockHeight(ctx context.Context, purseIdentifier PurseIdentifier, height uint64) (QueryBalanceResult, error) + // QueryBalanceByBlockHash query for balance information using a purse identifier and block hash + QueryBalanceByBlockHash(ctx context.Context, purseIdentifier PurseIdentifier, blockHash string) (QueryBalanceResult, error) + // QueryBalanceByStateRootHash query for full balance information using a purse identifier and state root hash + QueryBalanceByStateRootHash(ctx context.Context, purseIdentifier PurseIdentifier, stateRootHash string) (QueryBalanceResult, error) + + // QueryLatestBalanceDetails query for full balance information using a purse identifier + QueryLatestBalanceDetails(ctx context.Context, purseIdentifier PurseIdentifier) (QueryBalanceDetailsResult, error) + // QueryBalanceDetailsByBlockHeight query for full balance information using a purse identifier and block height + QueryBalanceDetailsByBlockHeight(ctx context.Context, purseIdentifier PurseIdentifier, height uint64) (QueryBalanceDetailsResult, error) + // QueryBalanceDetailsByBlockHash query for full balance information using a purse identifier and block hash + QueryBalanceDetailsByBlockHash(ctx context.Context, purseIdentifier PurseIdentifier, blockHash string) (QueryBalanceDetailsResult, error) + // QueryBalanceDetailsByStateRootHash query for full balance information using a purse identifier and state root hash + QueryBalanceDetailsByStateRootHash(ctx context.Context, purseIdentifier PurseIdentifier, stateRootHash string) (QueryBalanceDetailsResult, error) + // GetChainspec returns the raw bytes of the chainspec.toml, accounts.toml and global_state.toml files as read at node startup. GetChainspec(ctx context.Context) (InfoGetChainspecResult, error) } diff --git a/rpc/request.go b/rpc/request.go index 32b7045..90303a6 100644 --- a/rpc/request.go +++ b/rpc/request.go @@ -48,6 +48,7 @@ const ( MethodPutDeploy Method = "account_put_deploy" MethodSpeculativeExec Method = "speculative_exec" MethodQueryBalance Method = "query_balance" + MethodQueryBalanceDetails Method = "query_balance_details" MethodInfoGetChainspec Method = "info_get_chainspec" ) @@ -111,6 +112,12 @@ type BlockIdentifier struct { Height *uint64 `json:"Height,omitempty"` } +type GlobalStateIdentifier struct { + BlockHash *string `json:"BlockHash,omitempty"` + BlockHeight *uint64 `json:"BlockHeight,omitempty"` + StateRoot *string `json:"StateRootHash,omitempty"` +} + type ParamBlockIdentifier struct { BlockIdentifier *BlockIdentifier `json:"block_identifier"` } @@ -154,10 +161,41 @@ type SpeculativeExecParams struct { type PurseIdentifier struct { MainPurseUnderPublicKey *keypair.PublicKey `json:"main_purse_under_public_key,omitempty"` - MainPurseUnderAccountHash *string `json:"main_purse_under_account_hash,omitempty"` - PurseUref *string `json:"purse_uref,omitempty"` + MainPurseUnderAccountHash *key.AccountHash `json:"main_purse_under_account_hash,omitempty"` + MainPurseUnderEntityAddr *key.EntityAddr `json:"main_purse_under_entity_addr,omitempty"` + PurseUref *key.URef `json:"purse_uref,omitempty"` +} + +func NewPurseIdentifierFromPublicKey(pubKey keypair.PublicKey) PurseIdentifier { + return PurseIdentifier{ + MainPurseUnderPublicKey: &pubKey, + } +} + +func NewPurseIdentifierFromAccountHash(accountHash key.AccountHash) PurseIdentifier { + return PurseIdentifier{ + MainPurseUnderAccountHash: &accountHash, + } +} + +func NewPurseIdentifierFromEntityAddr(entityAddr key.EntityAddr) PurseIdentifier { + return PurseIdentifier{ + MainPurseUnderEntityAddr: &entityAddr, + } +} + +func NewPurseIdentifierFromUref(uref key.URef) PurseIdentifier { + return PurseIdentifier{ + PurseUref: &uref, + } } type QueryBalanceRequest struct { - PurseIdentifier PurseIdentifier `json:"purse_identifier"` + PurseIdentifier PurseIdentifier `json:"purse_identifier"` + StateIdentifier *GlobalStateIdentifier `json:"state_identifier,omitempty"` +} + +type QueryBalanceDetailsRequest struct { + PurseIdentifier PurseIdentifier `json:"purse_identifier"` + StateIdentifier *GlobalStateIdentifier `json:"state_identifier,omitempty"` } diff --git a/rpc/response.go b/rpc/response.go index 56913b4..11e8d0f 100644 --- a/rpc/response.go +++ b/rpc/response.go @@ -337,6 +337,27 @@ func (b QueryBalanceResult) GetRawJSON() json.RawMessage { return b.rawJSON } +type QueryBalanceDetailsResult struct { + APIVersion string `json:"api_version"` + TotalBalance clvalue.UInt512 `json:"total_balance"` + AvailableBalance clvalue.UInt512 `json:"available_balance"` + TotalBalanceProof string `json:"total_balance_proof"` + Holds []BalanceHoldWithProof `json:"holds"` + + rawJSON json.RawMessage +} + +func (b QueryBalanceDetailsResult) GetRawJSON() json.RawMessage { + return b.rawJSON +} + +// BalanceHoldWithProof The block time at which the hold was created. +type BalanceHoldWithProof struct { + //Time types.BlockTime `json:"time"` + Amount clvalue.UInt512 `json:"amount"` + Proof string `json:"proof"` +} + type InfoGetChainspecResult struct { ApiVersion string `json:"api_version"` ChainspecBytes struct { diff --git a/rpc/rpc_client.go b/rpc/rpc_client.go index 78fee0d..112a3e5 100644 --- a/rpc/rpc_client.go +++ b/rpc/rpc_client.go @@ -204,18 +204,29 @@ func (c *client) GetDictionaryItemByIdentifier(ctx context.Context, stateRootHas return result, nil } -func (c *client) GetAccountBalance(ctx context.Context, stateRootHash *string, purseURef string) (StateGetBalanceResult, error) { - if stateRootHash == nil { - latestHashResult, err := c.GetStateRootHashLatest(ctx) - if err != nil { - return StateGetBalanceResult{}, err - } - latestHashString := latestHashResult.StateRootHash.String() - stateRootHash = &latestHashString +func (c *client) GetLatestBalance(ctx context.Context, purseURef string) (StateGetBalanceResult, error) { + latestHashResult, err := c.GetStateRootHashLatest(ctx) + if err != nil { + return StateGetBalanceResult{}, err } + + var result StateGetBalanceResult + resp, err := c.processRequest(ctx, MethodGetStateBalance, map[string]string{ + "state_root_hash": latestHashResult.StateRootHash.String(), + "purse_uref": purseURef, + }, &result) + if err != nil { + return StateGetBalanceResult{}, err + } + + result.rawJSON = resp.Result + return result, nil +} + +func (c *client) GetBalanceByStateRootHash(ctx context.Context, purseURef string, stateRootHash string) (StateGetBalanceResult, error) { var result StateGetBalanceResult resp, err := c.processRequest(ctx, MethodGetStateBalance, map[string]string{ - "state_root_hash": *stateRootHash, + "state_root_hash": stateRootHash, "purse_uref": purseURef, }, &result) if err != nil { @@ -502,10 +513,10 @@ func (c *client) PutDeploy(ctx context.Context, deploy types.Deploy) (PutDeployR return result, nil } -func (c *client) QueryBalance(ctx context.Context, identifier PurseIdentifier) (QueryBalanceResult, error) { +func (c *client) QueryLatestBalance(ctx context.Context, identifier PurseIdentifier) (QueryBalanceResult, error) { var result QueryBalanceResult - resp, err := c.processRequest(ctx, MethodQueryBalance, QueryBalanceRequest{identifier}, &result) + resp, err := c.processRequest(ctx, MethodQueryBalance, QueryBalanceRequest{PurseIdentifier: identifier}, &result) if err != nil { return QueryBalanceResult{}, err } @@ -514,6 +525,102 @@ func (c *client) QueryBalance(ctx context.Context, identifier PurseIdentifier) ( return result, nil } +func (c *client) QueryBalanceByBlockHeight(ctx context.Context, purseIdentifier PurseIdentifier, height uint64) (QueryBalanceResult, error) { + var result QueryBalanceResult + + resp, err := c.processRequest(ctx, MethodQueryBalance, QueryBalanceRequest{PurseIdentifier: purseIdentifier, StateIdentifier: &GlobalStateIdentifier{ + BlockHeight: &height, + }}, &result) + if err != nil { + return QueryBalanceResult{}, err + } + + result.rawJSON = resp.Result + return result, nil +} + +func (c *client) QueryBalanceByBlockHash(ctx context.Context, purseIdentifier PurseIdentifier, blockHash string) (QueryBalanceResult, error) { + var result QueryBalanceResult + + resp, err := c.processRequest(ctx, MethodQueryBalance, QueryBalanceRequest{PurseIdentifier: purseIdentifier, StateIdentifier: &GlobalStateIdentifier{ + BlockHash: &blockHash, + }}, &result) + if err != nil { + return QueryBalanceResult{}, err + } + + result.rawJSON = resp.Result + return result, nil +} + +func (c *client) QueryBalanceByStateRootHash(ctx context.Context, purseIdentifier PurseIdentifier, stateRootHash string) (QueryBalanceResult, error) { + var result QueryBalanceResult + + resp, err := c.processRequest(ctx, MethodQueryBalance, QueryBalanceRequest{PurseIdentifier: purseIdentifier, StateIdentifier: &GlobalStateIdentifier{ + StateRoot: &stateRootHash, + }}, &result) + if err != nil { + return QueryBalanceResult{}, err + } + + result.rawJSON = resp.Result + return result, nil +} + +func (c *client) QueryLatestBalanceDetails(ctx context.Context, purseIdentifier PurseIdentifier) (QueryBalanceDetailsResult, error) { + var result QueryBalanceDetailsResult + + resp, err := c.processRequest(ctx, MethodQueryBalanceDetails, QueryBalanceDetailsRequest{PurseIdentifier: purseIdentifier}, &result) + if err != nil { + return QueryBalanceDetailsResult{}, err + } + + result.rawJSON = resp.Result + return result, nil +} + +func (c *client) QueryBalanceDetailsByStateRootHash(ctx context.Context, purseIdentifier PurseIdentifier, stateRootHash string) (QueryBalanceDetailsResult, error) { + var result QueryBalanceDetailsResult + + resp, err := c.processRequest(ctx, MethodQueryBalanceDetails, QueryBalanceDetailsRequest{purseIdentifier, &GlobalStateIdentifier{ + StateRoot: &stateRootHash, + }}, &result) + if err != nil { + return QueryBalanceDetailsResult{}, err + } + + result.rawJSON = resp.Result + return result, nil +} + +func (c *client) QueryBalanceDetailsByBlockHeight(ctx context.Context, purseIdentifier PurseIdentifier, height uint64) (QueryBalanceDetailsResult, error) { + var result QueryBalanceDetailsResult + + resp, err := c.processRequest(ctx, MethodQueryBalanceDetails, QueryBalanceDetailsRequest{purseIdentifier, &GlobalStateIdentifier{ + BlockHeight: &height, + }}, &result) + if err != nil { + return QueryBalanceDetailsResult{}, err + } + + result.rawJSON = resp.Result + return result, nil +} + +func (c *client) QueryBalanceDetailsByBlockHash(ctx context.Context, purseIdentifier PurseIdentifier, blockHash string) (QueryBalanceDetailsResult, error) { + var result QueryBalanceDetailsResult + + resp, err := c.processRequest(ctx, MethodQueryBalanceDetails, QueryBalanceDetailsRequest{purseIdentifier, &GlobalStateIdentifier{ + BlockHash: &blockHash, + }}, &result) + if err != nil { + return QueryBalanceDetailsResult{}, err + } + + result.rawJSON = resp.Result + return result, nil +} + func (c *client) GetChainspec(ctx context.Context) (InfoGetChainspecResult, error) { var result InfoGetChainspecResult diff --git a/tests/rpc/integration/rpc_client_test.go b/tests/rpc/integration/rpc_client_test.go index d1bb480..25ba8a8 100644 --- a/tests/rpc/integration/rpc_client_test.go +++ b/tests/rpc/integration/rpc_client_test.go @@ -14,6 +14,7 @@ import ( "github.com/make-software/casper-go-sdk/casper" "github.com/make-software/casper-go-sdk/rpc" + "github.com/make-software/casper-go-sdk/types/key" ) func GetRpcClient() rpc.Client { @@ -40,6 +41,48 @@ func Test_DefaultClient_GetAccountInfo_ByAccountKey(t *testing.T) { assert.Equal(t, "account-hash-bf06bdb1616050cea5862333d1f4787718f1011c95574ba92378419eefeeee59", res.Account.AccountHash.ToPrefixedString()) } +func Test_DefaultClient_QueryBalanceDetails(t *testing.T) { + pubKey, err := casper.NewPublicKey("0111bc2070a9af0f26f94b8549bffa5643ead0bc68eba3b1833039cfa2a9a8205d") + require.NoError(t, err) + + ctx := context.Background() + + res, err := GetRpcClient().GetBlockLatest(ctx) + require.NoError(t, err) + + accountHash := pubKey.AccountHash() + assertResponse := func(result rpc.QueryBalanceDetailsResult, err error) { + require.NoError(t, err) + assert.NotEmpty(t, result.AvailableBalance) + assert.NotEmpty(t, result.TotalBalance) + assert.NotEmpty(t, result.TotalBalanceProof) + assert.Empty(t, result.Holds) + } + + // latest call + assertResponse(GetRpcClient().QueryLatestBalanceDetails(ctx, rpc.NewPurseIdentifierFromAccountHash(accountHash))) + + // by BlockHeight and MainPurseUnderAccountHash + assertResponse(GetRpcClient().QueryBalanceDetailsByBlockHeight(ctx, + rpc.NewPurseIdentifierFromPublicKey(pubKey), + res.Block.Height, + )) + + // by BlockHash and MainPurseUnderEntityAddr + assertResponse(GetRpcClient().QueryBalanceDetailsByBlockHash(ctx, + rpc.NewPurseIdentifierFromAccountHash(accountHash), + res.Block.Hash.ToHex(), + )) + + // by StateRootHash and MainPurseUnderEntityAddr + assertResponse(GetRpcClient().QueryBalanceDetailsByStateRootHash(ctx, + rpc.NewPurseIdentifierFromEntityAddr(key.EntityAddr{ + Account: &accountHash.Hash, + }), + res.Block.StateRootHash.ToHex(), + )) +} + func Test_DefaultClient_QueryStateByStateHash(t *testing.T) { accountKey := "account-hash-bf06bdb1616050cea5862333d1f4787718f1011c95574ba92378419eefeeee59" res, err := GetRpcClient().QueryGlobalStateByStateHash(context.Background(), nil, accountKey, nil) diff --git a/tests/rpc/rpc_client_test.go b/tests/rpc/rpc_client_test.go index 83b806b..cbd5484 100644 --- a/tests/rpc/rpc_client_test.go +++ b/tests/rpc/rpc_client_test.go @@ -209,10 +209,10 @@ func Test_DefaultClient_GetStateBalance(t *testing.T) { defer server.Close() client := casper.NewRPCClient(casper.NewRPCHandler(server.URL, http.DefaultClient)) hash := "fb9c42717769d72442ff17a5ff1574b4bc1c83aedf5992b14e4d071423f86240" - result, err := client.GetAccountBalance( + result, err := client.GetBalanceByStateRootHash( context.Background(), - &hash, "uref-7b12008bb757ee32caefb3f7a1f77d9f659ee7a4e21ad4950c4e0294000492eb-007", + hash, ) require.NoError(t, err) assert.Equal(t, "93000000000", result.BalanceValue.String()) @@ -222,9 +222,8 @@ func Test_DefaultClient_GetStateBalance_WithEmptyStateRootHash(t *testing.T) { server := SetupServer(t, "../data/rpc_response/get_account_balance.json") defer server.Close() client := casper.NewRPCClient(casper.NewRPCHandler(server.URL, http.DefaultClient)) - result, err := client.GetAccountBalance( + result, err := client.GetLatestBalance( context.Background(), - nil, "uref-7b12008bb757ee32caefb3f7a1f77d9f659ee7a4e21ad4950c4e0294000492eb-007", ) require.NoError(t, err) @@ -453,7 +452,7 @@ func Test_DefaultClient_QueryBalance_byPublicKey(t *testing.T) { pubKey, err := casper.NewPublicKey("0115394d1f395a87dfed4ab62bbfbc91b573bbb2bffb2c8ebb9c240c51d95bcc4d") require.NoError(t, err) client := casper.NewRPCClient(casper.NewRPCHandler(server.URL, http.DefaultClient)) - result, err := client.QueryBalance(context.Background(), rpc.PurseIdentifier{ + result, err := client.QueryLatestBalance(context.Background(), rpc.PurseIdentifier{ MainPurseUnderPublicKey: &pubKey, }) require.NoError(t, err) diff --git a/types/key/account.go b/types/key/account.go index 4ee7b15..8cb924c 100644 --- a/types/key/account.go +++ b/types/key/account.go @@ -23,7 +23,7 @@ func NewAccountHash(source string) (AccountHash, error) { return AccountHash{}, err } - return AccountHash{Hash: hexBytes, originPrefix: originPrefix}, err + return AccountHash{Hash: hexBytes, originPrefix: originPrefix}, nil } func (h *AccountHash) UnmarshalJSON(data []byte) error { diff --git a/types/key/balance_hold_addr.go b/types/key/balance_hold_addr.go index e384921..7965afd 100644 --- a/types/key/balance_hold_addr.go +++ b/types/key/balance_hold_addr.go @@ -124,7 +124,7 @@ func (h *BalanceHoldAddr) UnmarshalJSON(data []byte) error { } func (h BalanceHoldAddr) MarshalJSON() ([]byte, error) { - return []byte(h.ToPrefixedString()), nil + return json.Marshal(h.ToPrefixedString()) } func (h BalanceHoldAddr) ToPrefixedString() string { diff --git a/types/key/bid_addr.go b/types/key/bid_addr.go index 77f6a87..59e9442 100644 --- a/types/key/bid_addr.go +++ b/types/key/bid_addr.go @@ -155,7 +155,7 @@ func (h *BidAddr) UnmarshalJSON(data []byte) error { } func (h BidAddr) MarshalJSON() ([]byte, error) { - return []byte(h.ToPrefixedString()), nil + return json.Marshal(h.ToPrefixedString()) } func (h BidAddr) ToPrefixedString() string { diff --git a/types/key/block_global_addr.go b/types/key/block_global_addr.go index ca61c68..9bc4a66 100644 --- a/types/key/block_global_addr.go +++ b/types/key/block_global_addr.go @@ -54,7 +54,7 @@ func (h *BlockGlobalAddr) UnmarshalJSON(data []byte) error { } func (h BlockGlobalAddr) MarshalJSON() ([]byte, error) { - return []byte(h.ToPrefixedString()), nil + return json.Marshal(h.ToPrefixedString()) } func (h BlockGlobalAddr) ToPrefixedString() string { diff --git a/types/key/byte_code.go b/types/key/byte_code.go index c9368d2..f0fea17 100644 --- a/types/key/byte_code.go +++ b/types/key/byte_code.go @@ -59,7 +59,7 @@ func (h ByteCode) IsEmpty() bool { } func (h ByteCode) MarshalJSON() ([]byte, error) { - return []byte(h.ToPrefixedString()), nil + return json.Marshal(h.ToPrefixedString()) } func (h ByteCode) ToPrefixedString() string { diff --git a/types/key/contract.go b/types/key/contract.go index 11eae0d..1b8062d 100644 --- a/types/key/contract.go +++ b/types/key/contract.go @@ -24,7 +24,7 @@ func (h *ContractHash) UnmarshalJSON(data []byte) error { } func (h ContractHash) MarshalJSON() ([]byte, error) { - return []byte(`"` + h.originPrefix + h.ToHex() + `"`), nil + return json.Marshal(h.originPrefix + h.ToHex()) } func (h ContractHash) ToPrefixedWasmString() string { diff --git a/types/key/contract_package.go b/types/key/contract_package.go index ff82231..30324a7 100644 --- a/types/key/contract_package.go +++ b/types/key/contract_package.go @@ -11,7 +11,7 @@ type ContractPackageHash struct { } func (h ContractPackageHash) MarshalJSON() ([]byte, error) { - return []byte(`"` + h.originPrefix + h.ToHex() + `"`), nil + return json.Marshal(h.originPrefix + h.ToHex()) } func (h ContractPackageHash) ToPrefixedString() string { diff --git a/types/key/entity_addr.go b/types/key/entity_addr.go index 14416ca..32db9ec 100644 --- a/types/key/entity_addr.go +++ b/types/key/entity_addr.go @@ -58,7 +58,7 @@ func (h *EntityAddr) UnmarshalJSON(data []byte) error { } func (h EntityAddr) MarshalJSON() ([]byte, error) { - return []byte(h.ToPrefixedString()), nil + return json.Marshal(h.ToPrefixedString()) } func (h EntityAddr) ToPrefixedString() string { diff --git a/types/key/entry_point_addr.go b/types/key/entry_point_addr.go index 84c9edc..c4a1ac6 100644 --- a/types/key/entry_point_addr.go +++ b/types/key/entry_point_addr.go @@ -72,7 +72,7 @@ func (h *EntryPointAddr) UnmarshalJSON(data []byte) error { } func (h EntryPointAddr) MarshalJSON() ([]byte, error) { - return []byte(h.ToPrefixedString()), nil + return json.Marshal(h.ToPrefixedString()) } func (h EntryPointAddr) ToPrefixedString() string { diff --git a/types/key/hash.go b/types/key/hash.go index 784ba1d..67f4522 100644 --- a/types/key/hash.go +++ b/types/key/hash.go @@ -53,7 +53,7 @@ func (h *Hash) UnmarshalText(text []byte) error { } func (h Hash) MarshalJSON() ([]byte, error) { - return []byte(`"` + h.ToHex() + `"`), nil + return json.Marshal(h.ToHex()) } func (h Hash) Bytes() []byte { diff --git a/types/key/message_addr.go b/types/key/message_addr.go index f4366b6..af5f531 100644 --- a/types/key/message_addr.go +++ b/types/key/message_addr.go @@ -67,7 +67,7 @@ func (h *MessageAddr) UnmarshalJSON(data []byte) error { } func (h MessageAddr) MarshalJSON() ([]byte, error) { - return []byte(h.ToPrefixedString()), nil + return json.Marshal(h.ToPrefixedString()) } func (h MessageAddr) ToPrefixedString() string { diff --git a/types/key/named_key_addr.go b/types/key/named_key_addr.go index 7ed4217..dc636e3 100644 --- a/types/key/named_key_addr.go +++ b/types/key/named_key_addr.go @@ -51,7 +51,7 @@ func (h *NamedKeyAddr) UnmarshalJSON(data []byte) error { } func (h NamedKeyAddr) MarshalJSON() ([]byte, error) { - return []byte(h.ToPrefixedString()), nil + return json.Marshal(h.ToPrefixedString()) } func (h NamedKeyAddr) ToPrefixedString() string { diff --git a/types/key/transfer.go b/types/key/transfer.go index 6cd8795..300999a 100644 --- a/types/key/transfer.go +++ b/types/key/transfer.go @@ -42,5 +42,5 @@ func (h TransferHash) ToPrefixedString() string { } func (h TransferHash) MarshalJSON() ([]byte, error) { - return []byte(`"` + h.originPrefix + h.ToHex() + `"`), nil + return json.Marshal(h.originPrefix + h.ToHex()) } diff --git a/types/key/uref.go b/types/key/uref.go index 51de88d..c8f62fe 100644 --- a/types/key/uref.go +++ b/types/key/uref.go @@ -70,8 +70,7 @@ func (v *URef) UnmarshalText(text []byte) error { } func (v URef) MarshalJSON() ([]byte, error) { - s := v.ToPrefixedString() - return []byte(`"` + s + `"`), nil + return json.Marshal(v.ToPrefixedString()) } func (v *URef) GobDecode(i []byte) error { diff --git a/types/keypair/public_key.go b/types/keypair/public_key.go index bb84115..955b82a 100644 --- a/types/keypair/public_key.go +++ b/types/keypair/public_key.go @@ -97,7 +97,8 @@ func (v PublicKey) AccountHash() key.AccountHash { blakeHash := blake2b.Sum256(bytesToHash) data, _ := key.NewByteHashFromBuffer(bytes.NewBuffer(blakeHash[:])) - return key.AccountHash{Hash: data} + accountHash, _ := key.NewAccountHash(key.PrefixNameAccount + data.ToHex()) + return accountHash } func (v PublicKey) Value() (driver.Value, error) {