From 37c874d80d4dc891d46dc65997ed1f4c972367b8 Mon Sep 17 00:00:00 2001 From: GG <863867759@qq.com> Date: Fri, 15 Dec 2023 13:44:59 +0800 Subject: [PATCH] feat: support resolve NameService. --- client/0_test.go | 5 +++++ client/client.go | 2 +- client/client_call.go | 16 +++++++++++++++ client/client_call_test.go | 34 ++++++++++++++++++++++++++----- client/client_call_unsafe_test.go | 4 ++-- client/method.go | 2 ++ move_types/account_address.go | 7 +++++-- types/common.go | 2 +- types/objects.go | 2 ++ types/types.go | 2 +- 10 files changed, 64 insertions(+), 12 deletions(-) diff --git a/client/0_test.go b/client/0_test.go index 7d5b1ab..20cd1c5 100644 --- a/client/0_test.go +++ b/client/0_test.go @@ -86,3 +86,8 @@ func (s SUI) Decimal() decimal.Decimal { func (s SUI) String() string { return strconv.FormatInt(s.Int64(), 10) } + +func SuiAddressNoErr(str string) *suiAddress { + s, _ := sui_types.NewAddressFromHex(str) + return s +} diff --git a/client/client.go b/client/client.go index 46c67ad..4a66a9a 100644 --- a/client/client.go +++ b/client/client.go @@ -97,7 +97,7 @@ func (c *Client) CallContext(ctx context.Context, result interface{}, method Met if len(respmsg.Result) == 0 { return ErrNoResult } - return json.Unmarshal(respmsg.Result, &result) + return json.Unmarshal(respmsg.Result, result) } // BatchCall sends all given requests as a single batch and waits for the server diff --git a/client/client_call.go b/client/client_call.go index 33fc008..f6907bd 100644 --- a/client/client_call.go +++ b/client/client_call.go @@ -2,6 +2,7 @@ package client import ( "context" + "errors" "strings" "github.com/coming-chat/go-sui/v2/lib" @@ -387,6 +388,21 @@ func (c *Client) QueryEvents( return &resp, c.CallContext(ctx, &resp, queryEvents, query, cursor, limit, descendingOrder) } +func (c *Client) ResolveNameServiceAddress(ctx context.Context, suiName string) (*suiAddress, error) { + var resp suiAddress + err := c.CallContext(ctx, &resp, resolveNameServiceAddress, suiName) + if err != nil && err.Error() == "nil address" { + return nil, errors.New("sui name not found") + } + return &resp, nil +} + +func (c *Client) ResolveNameServiceNames(ctx context.Context, + owner suiAddress, cursor *suiObjectID, limit *uint) (*types.SuiNamePage, error) { + var resp types.SuiNamePage + return &resp, c.CallContext(ctx, &resp, resolveNameServiceNames, owner, cursor, limit) +} + func (c *Client) GetDynamicFields( ctx context.Context, parentObjectId suiObjectID, cursor *suiObjectID, limit *uint, diff --git a/client/client_call_test.go b/client/client_call_test.go index 3ffaca4..bb7c462 100644 --- a/client/client_call_test.go +++ b/client/client_call_test.go @@ -229,8 +229,8 @@ func TestClient_GetAllCoins(t *testing.T) { } func TestClient_GetTransaction(t *testing.T) { - cli := TestnetClient(t) - digest := "B6WTZwFp1D6poMAQyWW8EGkq6iNLgqY1V64xJkgZDwVY" + cli := MainnetClient(t) + digest := "D1TM8Esaj3G9xFEDirqMWt9S7HjJXFrAGYBah1zixWTL" d, err := sui_types.NewDigest(digest) require.Nil(t, err) resp, err := cli.GetTransactionBlock( @@ -245,7 +245,7 @@ func TestClient_GetTransaction(t *testing.T) { require.NoError(t, err) t.Logf("%#v", resp) - require.Equal(t, int64(1997880), resp.Effects.Data.GasFee()) + require.Equal(t, int64(11178568), resp.Effects.Data.GasFee()) } func TestBatchCall_GetObject(t *testing.T) { @@ -491,8 +491,8 @@ func TestClient_TryGetPastObject(t *testing.T) { } func TestClient_GetEvents(t *testing.T) { - cli := ChainClient(t) - digest := "8WvqRRZ96u3UjY24WcjmZtUZyugXUagiQNkpRe97aKRR" + cli := MainnetClient(t) + digest := "D1TM8Esaj3G9xFEDirqMWt9S7HjJXFrAGYBah1zixWTL" d, err := sui_types.NewDigest(digest) require.Nil(t, err) res, err := cli.GetEvents(context.Background(), *d) @@ -585,6 +585,30 @@ func TestClient_QueryTransactionBlocks(t *testing.T) { } } +func TestClient_ResolveNameServiceAddress(t *testing.T) { + c := MainnetClient(t) + addr, err := c.ResolveNameServiceAddress(context.Background(), "2222.sui") + require.Nil(t, err) + require.Equal(t, addr.String(), "0x6174c5bd8ab9bf492e159a64e102de66429cfcde4fa883466db7b03af28b3ce9") + + addr, err = c.ResolveNameServiceAddress(context.Background(), "2222.suijjzzww") + require.ErrorContains(t, err, "not found") +} + +func TestClient_ResolveNameServiceNames(t *testing.T) { + c := MainnetClient(t) + owner := SuiAddressNoErr("0x57188743983628b3474648d8aa4a9ee8abebe8f6816243773d7e8ed4fd833a28") + namePage, err := c.ResolveNameServiceNames(context.Background(), *owner, nil, nil) + require.Nil(t, err) + require.NotEmpty(t, namePage.Data) + t.Log(namePage.Data) + + owner = SuiAddressNoErr("0x57188743983628b3474648d8aa4a9ee8abebe8f681") + namePage, err = c.ResolveNameServiceNames(context.Background(), *owner, nil, nil) + require.Nil(t, err) + require.Empty(t, namePage.Data) +} + func TestClient_QueryEvents(t *testing.T) { cli := ChainClient(t) limit := uint(10) diff --git a/client/client_call_unsafe_test.go b/client/client_call_unsafe_test.go index 938b8ec..6dd1c89 100644 --- a/client/client_call_unsafe_test.go +++ b/client/client_call_unsafe_test.go @@ -14,8 +14,8 @@ import ( ) func TestClient_TransferObject(t *testing.T) { - cli := ChainClient(t) - signer := M1Address(t) + cli := MainnetClient(t) + signer := SuiAddressNoErr("0x57188743983628b3474648d8aa4a9ee8abebe8f6816243773d7e8ed4fd833a28") recipient := signer coins, err := cli.GetCoins(context.Background(), *signer, nil, nil, 10) require.NoError(t, err) diff --git a/client/method.go b/client/method.go index a09e315..1a67ea8 100644 --- a/client/method.go +++ b/client/method.go @@ -70,6 +70,8 @@ const ( queryEvents SuiXMethod = "queryEvents" queryObjects SuiXMethod = "queryObjects" queryTransactionBlocks SuiXMethod = "queryTransactionBlocks" + resolveNameServiceAddress SuiXMethod = "resolveNameServiceAddress" + resolveNameServiceNames SuiXMethod = "resolveNameServiceNames" subscribeEvent SuiXMethod = "subscribeEvent" batchTransaction UnsafeMethod = "batchTransaction" mergeCoins UnsafeMethod = "mergeCoins" diff --git a/move_types/account_address.go b/move_types/account_address.go index 4fed1cb..6bd79fd 100644 --- a/move_types/account_address.go +++ b/move_types/account_address.go @@ -49,12 +49,15 @@ func (a AccountAddress) MarshalJSON() ([]byte, error) { } func (a *AccountAddress) UnmarshalJSON(data []byte) error { - str := "" + var str *string err := json.Unmarshal(data, &str) if err != nil { return err } - tmp, err := NewAccountAddressHex(str) + if str == nil { + return errors.New("nil address") + } + tmp, err := NewAccountAddressHex(*str) if err == nil { *a = *tmp } diff --git a/types/common.go b/types/common.go index 2db70c5..5831054 100644 --- a/types/common.go +++ b/types/common.go @@ -82,7 +82,7 @@ type ObjectOwner struct { *string } -type Page[T SuiTransactionBlockResponse | SuiEvent | Coin | SuiObjectResponse | DynamicFieldInfo, +type Page[T SuiTransactionBlockResponse | SuiEvent | Coin | SuiObjectResponse | DynamicFieldInfo | string, C sui_types.TransactionDigest | EventId | sui_types.ObjectID] struct { Data []T `json:"data"` NextCursor *C `json:"nextCursor,omitempty"` diff --git a/types/objects.go b/types/objects.go index a66cd31..4c7b155 100644 --- a/types/objects.go +++ b/types/objects.go @@ -224,3 +224,5 @@ func (s SuiPastObject) Tag() string { func (s SuiPastObject) Content() string { return "details" } + +type SuiNamePage = Page[string, sui_types.ObjectID] diff --git a/types/types.go b/types/types.go index caf1a60..8964bb5 100644 --- a/types/types.go +++ b/types/types.go @@ -13,7 +13,7 @@ const ( SuiCoinType = "0x2::sui::SUI" DevNetRpcUrl = "https://fullnode.devnet.sui.io" TestnetRpcUrl = "https://fullnode.testnet.sui.io" - MainnetRpcUrl = "https://sui-mainnet.coming.chat" + MainnetRpcUrl = "https://fullnode.mainnet.sui.io" ) // ShortString Returns the address with leading zeros trimmed, e.g. 0x2