diff --git a/core/client/init_node.go b/core/client/init_node.go index 444b33834..b83f7fb26 100644 --- a/core/client/init_node.go +++ b/core/client/init_node.go @@ -165,6 +165,7 @@ func Init(ctx context.Context, cfg conf.Config) error { } }() + SetSdkInitialized(true) return nil } diff --git a/core/client/set.go b/core/client/set.go index 1c72c0625..763ea5cf4 100644 --- a/core/client/set.go +++ b/core/client/set.go @@ -33,7 +33,7 @@ type Client struct { authUrl string nonce int64 txnFee uint64 - sign SignFunc + sign SignFunc //nolint:unused } func init() { diff --git a/core/conf/config_test.go b/core/conf/config_test.go index 8762195bd..364efad39 100644 --- a/core/conf/config_test.go +++ b/core/conf/config_test.go @@ -13,6 +13,7 @@ func TestLoadConfig(t *testing.T) { reader := &mocks.Reader{} reader.On("GetString", "block_worker").Return("http://127.0.0.1:9091/dns") reader.On("GetString", "zauth_server").Return("http://127.0.0.1:8090/") + reader.On("GetString", "ethereum_node_url").Return("https://127.0.0.1:8545") reader.On("GetInt", "min_submit").Return(0) reader.On("GetInt", "min_confirmation").Return(0) reader.On("GetInt", "max_txn_query").Return(0) @@ -43,6 +44,7 @@ func TestLoadConfig(t *testing.T) { reader := &mocks.Reader{} reader.On("GetString", "block_worker").Return("") reader.On("GetString", "zauth_server").Return("") + reader.On("GetString", "ethereum_node_url").Return("") reader.On("GetInt", "min_submit").Return(0) reader.On("GetInt", "min_confirmation").Return(0) reader.On("GetInt", "max_txn_query").Return(0) @@ -88,6 +90,7 @@ func TestLoadConfig(t *testing.T) { reader := &mocks.Reader{} reader.On("GetString", "block_worker").Return("https://127.0.0.1:9091/dns") reader.On("GetString", "zauth_server").Return("http://127.0.0.1:8090/") + reader.On("GetString", "ethereum_node_url").Return("https://127.0.0.1:8545") reader.On("GetInt", "min_submit").Return(101) reader.On("GetInt", "min_confirmation").Return(0) reader.On("GetInt", "max_txn_query").Return(0) @@ -123,6 +126,7 @@ func TestLoadConfig(t *testing.T) { reader := &mocks.Reader{} reader.On("GetString", "block_worker").Return("https://127.0.0.1:9091/dns") reader.On("GetString", "zauth_server").Return("http://127.0.0.1:8090/") + reader.On("GetString", "ethereum_node_url").Return("https://127.0.0.1:8545") reader.On("GetInt", "min_submit").Return(0) reader.On("GetInt", "min_confirmation").Return(101) reader.On("GetInt", "max_txn_query").Return(0) diff --git a/core/imageutil/thumbnailer.go b/core/imageutil/thumbnailer.go index 4d9dae350..130a5f47c 100644 --- a/core/imageutil/thumbnailer.go +++ b/core/imageutil/thumbnailer.go @@ -4,8 +4,11 @@ package imageutil import ( "bytes" "fmt" + "github.com/disintegration/gift" "image" + "image/gif" _ "image/gif" + "image/jpeg" _ "image/jpeg" "image/png" _ "image/png" @@ -37,39 +40,42 @@ type SubImager interface { // - vp8l // - webp func CreateThumbnail(buf []byte, width, height int) ([]byte, error) { - // image.Decode requires that you import the right image package. - // Ignored return value is image format name. - img, _, err := image.Decode(bytes.NewReader(buf)) + // Decode the image from the buffer + img, format, err := image.Decode(bytes.NewReader(buf)) if err != nil { return nil, err } - // I've hard-coded a crop rectangle, start (0,0), end (100, 100). - img, err = cropImage(img, image.Rect(0, 0, width, height)) - if err != nil { - return nil, err - } + // Resize the image using Lanczos resampling - fd := &bytes.Buffer{} + g := gift.New( + gift.Resize(width, height, gift.LanczosResampling), + ) + thumbnail := image.NewRGBA(g.Bounds(img.Bounds())) + g.Draw(thumbnail, img) + //thumbnail := resize.Resize(uint(width), uint(height), img, resize.Lanczos3) - err = png.Encode(fd, img) - if err != nil { - return nil, err - } + // Create a buffer to hold the new resized image + var outBuffer bytes.Buffer - return fd.Bytes(), nil -} - -// cropImage takes an image and crops it to the specified rectangle. -func cropImage(img image.Image, crop image.Rectangle) (image.Image, error) { + // Encode the image back into the original format + switch format { + case "jpeg", "jpg": + err = jpeg.Encode(&outBuffer, thumbnail, nil) + case "png": + err = png.Encode(&outBuffer, thumbnail) + case "gif": + err = gif.Encode(&outBuffer, thumbnail, nil) + case "bmp", "ccitt", "riff", "tiff", "vector", "vp8", "vp8l", "webp": + err = jpeg.Encode(&outBuffer, thumbnail, nil) // Use JPEG as fallback since WebP/GIF encoding is less common in Go + default: + err = fmt.Errorf("unsupported image format") + } - // img is an Image interface. This checks if the underlying value has a - // method called SubImage. If it does, then we can use SubImage to crop the - // image. - simg, ok := img.(SubImager) - if !ok { - return nil, fmt.Errorf("image does not support cropping") + if err != nil { + return nil, err } - return simg.SubImage(crop), nil + // Return the resized image buffer + return outBuffer.Bytes(), nil } diff --git a/go.mod b/go.mod index 23e1cebfa..1e13857c3 100644 --- a/go.mod +++ b/go.mod @@ -29,9 +29,9 @@ require ( github.com/uptrace/bunrouter v1.0.20 go.dedis.ch/kyber/v3 v3.1.0 go.uber.org/zap v1.24.0 - golang.org/x/crypto v0.21.0 - golang.org/x/image v0.14.0 - golang.org/x/sync v0.7.0 + golang.org/x/crypto v0.33.0 + golang.org/x/image v0.24.0 + golang.org/x/sync v0.11.0 gopkg.in/cheggaaa/pb.v1 v1.0.28 gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/yaml.v2 v2.4.0 @@ -39,6 +39,7 @@ require ( ) require ( + github.com/disintegration/gift v1.2.1 github.com/hack-pad/go-webworkers v0.1.0 github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d github.com/minio/sha256-simd v1.0.1 @@ -67,6 +68,7 @@ require ( github.com/go-stack/stack v1.8.1 // indirect github.com/golang-jwt/jwt/v4 v4.3.0 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/go-bexpr v0.1.10 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -107,8 +109,8 @@ require ( github.com/x448/float16 v0.8.4 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect go.dedis.ch/fixbuf v1.0.3 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect @@ -123,7 +125,7 @@ require ( github.com/yusufpapurcu/wmi v1.2.2 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.9.0 // indirect - golang.org/x/net v0.23.0 // indirect + golang.org/x/net v0.35.0 // indirect golang.org/x/time v0.3.0 // indirect ) diff --git a/go.sum b/go.sum index 91dc05e8c..4d88a5cce 100644 --- a/go.sum +++ b/go.sum @@ -143,6 +143,8 @@ github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/disintegration/gift v1.2.1 h1:Y005a1X4Z7Uc+0gLpSAsKhWi4qLtsdEcMIbbdvdZ6pc= +github.com/disintegration/gift v1.2.1/go.mod h1:Jh2i7f7Q2BM7Ezno3PhfezbR1xpUg9dUg3/RlKGr4HI= github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= @@ -242,8 +244,8 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -579,8 +581,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -599,8 +601,8 @@ golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N0 golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= -golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= +golang.org/x/image v0.24.0 h1:AN7zRgVsbvmTfNyqIbbOraYL8mSwcKncEj8ofjgzcMQ= +golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -659,8 +661,8 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -681,8 +683,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -734,8 +736,8 @@ golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -743,8 +745,8 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/mobilesdk/sdk/sdk.go b/mobilesdk/sdk/sdk.go index f319cf968..608aef81a 100644 --- a/mobilesdk/sdk/sdk.go +++ b/mobilesdk/sdk/sdk.go @@ -11,6 +11,9 @@ import ( "strconv" "strings" + "github.com/0chain/gosdk/core/imageutil" + coreTransaction "github.com/0chain/gosdk/core/transaction" + "context" "github.com/0chain/gosdk/core/sys" @@ -28,8 +31,6 @@ import ( "github.com/0chain/gosdk/zcncore" ) -var nonce = int64(0) - type Autorizer interface { Auth(msg string) (string, error) } @@ -72,8 +73,51 @@ func Init(chainConfigJson string) error { cfg := conf.Config{} err := json.Unmarshal([]byte(chainConfigJson), &cfg) if err != nil { - return err + return errors.WithMessage(err, "failed to unmarshal chain config") + } + l.Logger.Info("InitSDK chain config") + l.Logger.Info(cfg) + zcncore.RegisterKMSZauthServer(cfg.ZauthServer) + + sys.SignWithAuth = func(hash, signatureScheme string, keys []sys.KeyPair) (string, error) { + fmt.Println("SignWithAuth pubkey:", keys[0]) + sig, err := sys.Sign(hash, signatureScheme, keys) + if err != nil { + return "", fmt.Errorf("failed to sign with split key: %v", err) + } + + data, err := json.Marshal(client.AuthMessage{ + Hash: hash, + Signature: sig, + ClientID: client.GetClient().ClientID, + }) + if err != nil { + return "", err + } + + if sys.AuthCommon == nil { + return "", errors.New("authCommon is not set") + } + + rsp, err := sys.AuthCommon(string(data)) + if err != nil { + return "", err + } + + var sigpk struct { + Sig string `json:"sig"` + } + + err = json.Unmarshal([]byte(rsp), &sigpk) + if err != nil { + return "", err + } + + return sigpk.Sig, nil } + + fmt.Println("Init SignWithAuth:", sys.SignWithAuth) + return client.Init(context.Background(), cfg) } @@ -115,7 +159,7 @@ func InitStorageSDK(clientJson string, configJson string) (*StorageSDK, error) { l.Logger.Error(err) return nil, err } - err = Init(configObj.BlockWorker) + err = Init(configJson) if err != nil { l.Logger.Error(err) return nil, err @@ -361,6 +405,11 @@ func (s *StorageSDK) GetVersion() string { return version.VERSIONSTR } +// GetVersion getting current version for gomobile lib +func GetVersion() string { + return version.VERSIONSTR +} + // UpdateAllocation update allocation settings with new expiry and size // - size: size of space reserved on blobbers // - extend: extend allocation @@ -388,6 +437,21 @@ func (s *StorageSDK) GetBlobbersList() (string, error) { return string(retBytes), nil } +// GetStorageConfig get storage config +// configType: storage_sc_config, miners_sc_globals, miner_sc_configs +func GetConfig(configType string) ([]byte, error) { + configBytes, err := coreTransaction.GetConfig(configType) + if err != nil { + return nil, err + } + + retBytes, err := json.Marshal(configBytes) + if err != nil { + return nil, err + } + return retBytes, nil +} + // GetAllocations return back list of allocations for the wallet // Extracted from main method, bcz of class fields func GetAllocations() (string, error) { @@ -402,9 +466,27 @@ func GetAllocations() (string, error) { return string(retBytes), nil } +func GetAllocationsOfClient(clientID string) (string, error) { + allocs, err := sdk.GetAllocationsForClient(clientID) + if err != nil { + return "", err + } + + retBytes, err := json.Marshal(allocs) + if err != nil { + return "", err + } + + return string(retBytes), nil +} + // RedeeemFreeStorage given a free storage ticket, create a new free allocation // - ticket: free storage ticket func (s *StorageSDK) RedeemFreeStorage(ticket string) (string, error) { + if ticket == "" || len(ticket) == 0 { + return "", errors.New("invalid_free_marker: free marker is required") + } + recipientPublicKey, marker, lock, err := decodeTicket(ticket) if err != nil { return "", err @@ -458,3 +540,15 @@ func decodeTicket(ticket string) (string, string, uint64, error) { func RegisterAuthorizer(auth Autorizer) { sys.Authorize = auth.Auth } + +func CreateThumbnail(fileData []byte, height, width int) ([]byte, error) { + if len(fileData) == 0 { + return nil, errors.New("empty image data") + } + + if height == 0 || width == 0 { + return nil, errors.New("invalid height or width") + } + + return imageutil.CreateThumbnail(fileData, width, height) +} diff --git a/mobilesdk/sdk/sign.go b/mobilesdk/sdk/sign.go index 5cef0dadc..332dc7c93 100644 --- a/mobilesdk/sdk/sign.go +++ b/mobilesdk/sdk/sign.go @@ -3,10 +3,10 @@ package sdk import ( "errors" + _ "github.com/0chain/gosdk/core/client" //import it to initialize sys.Sign "github.com/0chain/gosdk/core/encryption" "github.com/0chain/gosdk/core/sys" "github.com/0chain/gosdk/core/zcncrypto" - _ "github.com/0chain/gosdk/core/client" //import it to initialize sys.Sign ) var ErrInvalidSignatureScheme = errors.New("invalid_signature_scheme") @@ -16,6 +16,10 @@ var ErrInvalidSignatureScheme = errors.New("invalid_signature_scheme") // - signatureScheme: signature scheme to use for signing // - data: data to sign using the private key func SignRequest(privateKey, signatureScheme string, data string) (string, error) { + if privateKey == "" || signatureScheme == "" || data == "" { + return "", errors.New("invalid input") + } + hash := encryption.Hash(data) return sys.Sign(hash, signatureScheme, []sys.KeyPair{{ PrivateKey: privateKey, diff --git a/mobilesdk/zbox/util.go b/mobilesdk/zbox/util.go index 52ae76bf3..8b33c02d1 100644 --- a/mobilesdk/zbox/util.go +++ b/mobilesdk/zbox/util.go @@ -1,6 +1,9 @@ package zbox import ( + "fmt" + "github.com/0chain/gosdk/core/client" + "github.com/0chain/gosdk/zboxcore/sdk" "regexp" "strconv" ) @@ -14,3 +17,14 @@ func GetNumber(value string) int { } return -1 } + +func Sign(clientId string) (string, error) { + if len(clientId) == 0 { + return "", fmt.Errorf("null client ID for signing") + } + return client.Sign(clientId) +} + +func GetClientEncryptedPublicKey() (string, error) { + return sdk.GetClientEncryptedPublicKey() +} diff --git a/mobilesdk/zcn/execute_transactions.go b/mobilesdk/zcn/execute_transactions.go new file mode 100644 index 000000000..32a94c25b --- /dev/null +++ b/mobilesdk/zcn/execute_transactions.go @@ -0,0 +1,244 @@ +package zcn + +import ( + "encoding/json" + "errors" + "github.com/0chain/gosdk/zboxcore/sdk" + "github.com/0chain/gosdk/zcncore" +) + +// MinerStakePoolLock locks the stake pool for the miner. +// # Inputs +// - providerId: provider id +// - lock: lock amount +func MinerStakePoolLock(providerId string, lock int64, fee int64) ([]byte, error) { + if tokenValidation(lock) != nil { + return nil, tokenValidation(lock) + } + + if tokenValidation(fee) != nil { + return nil, tokenValidation(fee) + } + + _, _, _, txn, err := sdk.StakePoolLockWithTransaction(sdk.ProviderMiner, providerId, uint64(lock), uint64(fee)) + + if err != nil { + return nil, errors.New("Error in MinerSCLock: " + err.Error()) + } + + byteTxn, err := json.Marshal(txn) + if err != nil { + return nil, errors.New("Error in Encoding txn: " + err.Error()) + } + return byteTxn, nil +} + +// MinerStakePoolUnlock unlocks the stake pool for the miner. +// # Inputs +// - providerId: provider id +func MinerStakePoolUnlock(providerId, clientID string, fee int64) ([]byte, error) { + if tokenValidation(fee) != nil { + return nil, tokenValidation(fee) + } + + _, _, _, txn, err := sdk.StakePoolUnlockWithTransaction(sdk.ProviderMiner, providerId, clientID, uint64(fee)) + + if err != nil { + return nil, errors.New("Error in MinerSCUnlock: " + err.Error()) + } + byteTxn, err := json.Marshal(txn) + if err != nil { + return nil, errors.New("Error in Encoding txn: " + err.Error()) + } + return byteTxn, nil +} + +// MinerCollectReward collects the reward from the miner smart contract. +// # Inputs +// - providerId: provider id +func MinerCollectReward(providerId string, fee int64) ([]byte, error) { + if tokenValidation(fee) != nil { + return nil, tokenValidation(fee) + } + + _, _, _, txn, err := sdk.CollectRewardsWithTransaction(providerId, sdk.ProviderMiner, uint64(fee)) + + if err != nil { + return nil, errors.New("Error in MinerSCCollectReward: " + err.Error()) + } + byteTxn, err := json.Marshal(txn) + if err != nil { + return nil, errors.New("Error in Encoding txn: " + err.Error()) + } + return byteTxn, nil +} + +// BlobberStakePoolLock locks the stake pool for the blobber. +// # Inputs +// - providerId: provider id +// - lock: lock amount +func BlobberStakePoolLock(providerId string, lock int64, fee int64) ([]byte, error) { + if tokenValidation(lock) != nil { + return nil, tokenValidation(lock) + } + + if tokenValidation(fee) != nil { + return nil, tokenValidation(fee) + } + + _, _, _, txn, err := sdk.StakePoolLockWithTransaction(sdk.ProviderBlobber, providerId, uint64(lock), uint64(fee)) + + if err != nil { + return nil, errors.New("Error in BlobberSCLock: " + err.Error()) + } + + byteTxn, err := json.Marshal(txn) + if err != nil { + return nil, errors.New("Error in Encoding txn: " + err.Error()) + } + return byteTxn, nil +} + +// BlobberStakePoolUnlock unlocks the stake pool for the blobber. +// # Inputs +// - providerId: provider id +func BlobberStakePoolUnlock(providerId, clientID string, fee int64) ([]byte, error) { + if tokenValidation(fee) != nil { + return nil, tokenValidation(fee) + } + + _, _, _, txn, err := sdk.StakePoolUnlockWithTransaction(sdk.ProviderBlobber, providerId, clientID, uint64(fee)) + + if err != nil { + return nil, errors.New("Error in BlobberSCUnlock: " + err.Error()) + } + byteTxn, err := json.Marshal(txn) + if err != nil { + return nil, errors.New("Error in Encoding txn: " + err.Error()) + } + return byteTxn, nil +} + +// BlobberCollectReward locks the stake pool for the blobber. +// # Inputs +// - providerId: provider id +func BlobberCollectReward(providerId string, fee int64) ([]byte, error) { + _, _, _, txn, err := sdk.CollectRewardsWithTransaction(providerId, sdk.ProviderBlobber, uint64(fee)) + + if err != nil { + return nil, errors.New("Error in BlobberSCCollectReward: " + err.Error()) + } + byteTxn, err := json.Marshal(txn) + if err != nil { + return nil, errors.New("Error in Encoding txn: " + err.Error()) + } + return byteTxn, nil +} + +// SharderStakePoolLock locks the stake pool for the sharder. +// # Inputs +// - providerId: provider id +// - lock: lock amount +func SharderStakePoolLock(providerId string, lock int64, fee int64) ([]byte, error) { + if tokenValidation(lock) != nil { + return nil, tokenValidation(lock) + } + + if tokenValidation(fee) != nil { + return nil, tokenValidation(fee) + } + + _, _, _, txn, err := sdk.StakePoolLockWithTransaction(sdk.ProviderSharder, providerId, uint64(lock), uint64(fee)) + + if err != nil { + return nil, errors.New("Error in SharderSCLock: " + err.Error()) + } + + byteTxn, err := json.Marshal(txn) + if err != nil { + return nil, errors.New("Error in Encoding txn: " + err.Error()) + } + return byteTxn, nil +} + +// SharderStakePoolUnlock unlocks the stake pool for the sharder. +// # Inputs +// - providerId: provider id +func SharderStakePoolUnlock(providerId, clientID string, fee int64) ([]byte, error) { + if tokenValidation(fee) != nil { + return nil, tokenValidation(fee) + } + + _, _, _, txn, err := sdk.StakePoolUnlockWithTransaction(sdk.ProviderSharder, providerId, clientID, uint64(fee)) + + if err != nil { + return nil, errors.New("Error in SharderSCUnlock: " + err.Error()) + } + byteTxn, err := json.Marshal(txn) + if err != nil { + return nil, errors.New("Error in Encoding txn: " + err.Error()) + } + return byteTxn, nil +} + +func SharderCollectReward(providerId string, fee int64) ([]byte, error) { + if tokenValidation(fee) != nil { + return nil, tokenValidation(fee) + } + + _, _, _, txn, err := sdk.CollectRewardsWithTransaction(providerId, sdk.ProviderSharder, uint64(fee)) + + if err != nil { + return nil, errors.New("Error in SharderSCCollectReward: " + err.Error()) + } + byteTxn, err := json.Marshal(txn) + if err != nil { + return nil, errors.New("Error in Encoding txn: " + err.Error()) + } + return byteTxn, nil +} + +func SendZCN(senderClientId string, tokens int64, fee int64, description string) ([]byte, error) { + if tokenValidation(tokens) != nil { + return nil, tokenValidation(tokens) + + } + + if tokenValidation(fee) != nil { + return nil, tokenValidation(fee) + } + + _, _, _, txn, err := zcncore.SendWithCustomFee(senderClientId, uint64(tokens), uint64(fee), description) + + if err != nil { + return nil, errors.New("Error in SendZCN: " + err.Error()) + } + byteTxn, err := json.Marshal(txn) + if err != nil { + return nil, errors.New("Error in Encoding txn: " + err.Error()) + } + return byteTxn, nil + +} + +// VerifyTransaction verifies the transaction. +// # Inputs +// - hash: hash of the transaction +func VerifyTransaction(hash string) ([]byte, error) { + txn, err := zcncore.VerifyTransaction(hash) + if err != nil { + return nil, errors.New("Error in VerifyTransaction: " + err.Error()) + } + byteTxn, err := json.Marshal(txn) + if err != nil { + return nil, errors.New("Error in Encoding txn: " + err.Error()) + } + return byteTxn, nil +} + +func tokenValidation(tokens int64) error { + if tokens <= 0 { + return errors.New("negative or zero tokens not allowed") + } + return nil +} diff --git a/wasmsdk/sdk.go b/wasmsdk/sdk.go index c0b78a2b6..35e6ecbf7 100644 --- a/wasmsdk/sdk.go +++ b/wasmsdk/sdk.go @@ -156,7 +156,7 @@ func makeSCRestAPICall(scAddress, relativePath, paramsJson string) (string, erro // - fee is the transaction fee // - desc is the description of the transaction func send(toClientID string, tokens uint64, fee uint64, desc string) (string, error) { - _, _, _, txn, err := zcncore.Send(toClientID, tokens, desc) + _, _, _, txn, err := zcncore.SendWithCustomFee(toClientID, tokens, fee, desc) if err != nil { return "", err } diff --git a/zboxcore/sdk/blobber_operations.go b/zboxcore/sdk/blobber_operations.go index fa15777d9..d84ae57d7 100644 --- a/zboxcore/sdk/blobber_operations.go +++ b/zboxcore/sdk/blobber_operations.go @@ -211,16 +211,21 @@ func GetUpdateAllocTicket(allocationID, userID, operationType string, roundExpir // - value: value to lock // - fee: transaction fee func StakePoolLock(providerType ProviderType, providerID string, value, fee uint64) (hash string, nonce int64, err error) { + hash, _, nonce, _, err = StakePoolLockWithTransaction(providerType, providerID, value, fee) + return +} + +func StakePoolLockWithTransaction(providerType ProviderType, providerID string, value, fee uint64) (hash, out string, nonce int64, txn *transaction.Transaction, err error) { if !client.IsSDKInitialized() { - return "", 0, sdkNotInitialized + return "", "", 0, nil, sdkNotInitialized } if providerType == 0 { - return "", 0, errors.New("stake_pool_lock", "provider is required") + return "", "", 0, nil, errors.New("stake_pool_lock", "provider is required") } if providerID == "" { - return "", 0, errors.New("stake_pool_lock", "provider_id is required") + return "", "", 0, nil, errors.New("stake_pool_lock", "provider_id is required") } spr := stakePoolRequest{ @@ -244,10 +249,10 @@ func StakePoolLock(providerType ProviderType, providerID string, value, fee uint scAddress = ZCNSC_SCADDRESS sn.Name = transaction.ZCNSC_LOCK default: - return "", 0, errors.Newf("stake_pool_lock", "unsupported provider type: %v", providerType) + return "", "", 0, nil, errors.Newf("stake_pool_lock", "unsupported provider type: %v", providerType) } - hash, _, nonce, _, err = transaction.SmartContractTxnValueFeeWithRetry(scAddress, sn, value, fee, true) + hash, out, nonce, txn, err = transaction.SmartContractTxnValueFeeWithRetry(scAddress, sn, value, fee, true) return } @@ -260,17 +265,31 @@ func StakePoolLock(providerType ProviderType, providerID string, value, fee uint // - providerType: provider type // - providerID: provider ID // - fee: transaction fee -func StakePoolUnlock(providerType ProviderType, providerID, clientID string, fee uint64) (unstake int64, nonce int64, err error) { +func StakePoolUnlock(providerType ProviderType, providerID string, clientID string, fee uint64) (unstake int64, nonce int64, err error) { + var out string + if _, out, nonce, _, err = StakePoolUnlockWithTransaction(providerType, providerID, clientID, fee); err != nil { + return // an error + } + + var spuu stakePoolLock + if err = json.Unmarshal([]byte(out), &spuu); err != nil { + return + } + + return spuu.Amount, nonce, nil +} + +func StakePoolUnlockWithTransaction(providerType ProviderType, providerID string, clientID string, fee uint64) (hash, out string, nonce int64, txn *transaction.Transaction, err error) { if !client.IsSDKInitialized() { - return 0, 0, sdkNotInitialized + return "", "", 0, nil, sdkNotInitialized } if providerType == 0 { - return 0, 0, errors.New("stake_pool_lock", "provider is required") + return "", "", 0, nil, errors.New("stake_pool_lock", "provider is required") } if providerID == "" { - return 0, 0, errors.New("stake_pool_lock", "provider_id is required") + return "", "", 0, nil, errors.New("stake_pool_lock", "provider_id is required") } spr := stakePoolRequest{ @@ -295,20 +314,10 @@ func StakePoolUnlock(providerType ProviderType, providerID, clientID string, fee scAddress = ZCNSC_SCADDRESS sn.Name = transaction.ZCNSC_UNLOCK default: - return 0, 0, errors.Newf("stake_pool_unlock", "unsupported provider type: %v", providerType) - } - - var out string - if _, out, nonce, _, err = transaction.SmartContractTxnValueFeeWithRetry(scAddress, sn, 0, fee, true); err != nil { - return // an error + return "", "", 0, nil, errors.Newf("stake_pool_unlock", "unsupported provider type: %v", providerType) } - var spuu stakePoolLock - if err = json.Unmarshal([]byte(out), &spuu); err != nil { - return - } - - return spuu.Amount, nonce, nil + return transaction.SmartContractTxnValueFeeWithRetry(scAddress, sn, 0, fee, true) } // WritePoolLock locks given number of tokes for given duration in read pool. diff --git a/zboxcore/sdk/deleteworker.go b/zboxcore/sdk/deleteworker.go index 243e88c5b..c47f870b7 100644 --- a/zboxcore/sdk/deleteworker.go +++ b/zboxcore/sdk/deleteworker.go @@ -5,7 +5,6 @@ import ( "encoding/hex" "fmt" "io" - "io/ioutil" "net/http" "net/url" "strings" @@ -108,7 +107,7 @@ func (req *DeleteRequest) deleteBlobberFile( return } if resp.StatusCode == http.StatusBadRequest { - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) if err != nil { logger.Logger.Error("Failed to read response body", err) } @@ -139,7 +138,7 @@ func (req *DeleteRequest) deleteBlobberFile( return } - respBody, err = ioutil.ReadAll(resp.Body) + respBody, err = io.ReadAll(resp.Body) if err != nil { l.Logger.Error(blobber.Baseurl, "Response: ", string(respBody)) return diff --git a/zboxcore/sdk/sdk.go b/zboxcore/sdk/sdk.go index 40fdb954b..b052ec044 100644 --- a/zboxcore/sdk/sdk.go +++ b/zboxcore/sdk/sdk.go @@ -126,11 +126,13 @@ type StakePoolRewardsInfo struct { // StakePoolDelegatePoolInfo represents delegate pool of a stake pool info. type StakePoolDelegatePoolInfo struct { - ID common.Key `json:"id"` // blobber ID - Balance common.Balance `json:"balance"` // current balance - DelegateID common.Key `json:"delegate_id"` // wallet - Rewards common.Balance `json:"rewards"` // current - UnStake bool `json:"unstake"` // want to unstake + ID common.Key `json:"id"` // blobber ID + Balance common.Balance `json:"balance"` // current balance + DelegateID common.Key `json:"delegate_id"` // wallet + Rewards common.Balance `json:"rewards"` // current + UnStake bool `json:"unstake"` // want to unstake + ProviderID string `json:"provider_id"` // provider ID + ProviderType ProviderType `json:"provider_type"` // provider type TotalReward common.Balance `json:"total_reward"` TotalPenalty common.Balance `json:"total_penalty"` @@ -469,6 +471,19 @@ func getBlobbersInternal(active, stakable bool, limit, offset int) (bs []*Blobbe return wrap.Nodes, nil } +func GetBlobbersPaged(active, stakable bool, limit, offset int) ([]*Blobber, error) { + if !client.IsSDKInitialized() { + return nil, sdkNotInitialized + } + + blobbers, err := getBlobbersInternal(active, stakable, limit, offset) + if err != nil { + return nil, err + } + + return blobbers, nil +} + // GetBlobbers returns list of blobbers. // - active: if true then only active blobbers are returned // - stakable: if true then only stakable blobbers are returned @@ -1106,8 +1121,13 @@ func ShutdownProvider(providerType ProviderType, providerID string) (string, int // - providerId is the id of the provider. // - providerType is the type of the provider. func CollectRewards(providerId string, providerType ProviderType) (string, int64, error) { + hash, _, n, _, err := CollectRewardsWithTransaction(providerId, providerType, 0) + return hash, n, err +} + +func CollectRewardsWithTransaction(providerId string, providerType ProviderType, fee uint64) (hash, out string, nonce int64, txn *transaction.Transaction, err error) { if !client.IsSDKInitialized() { - return "", 0, sdkNotInitialized + return "", "", 0, nil, sdkNotInitialized } var input = map[string]interface{}{ @@ -1131,11 +1151,14 @@ func CollectRewards(providerId string, providerType ProviderType) (string, int64 // scAddress = ZCNSC_SCADDRESS // sn.Name = transaction.ZCNSC_COLLECT_REWARD default: - return "", 0, fmt.Errorf("collect rewards provider type %v not implimented", providerType) + return "", "", 0, nil, fmt.Errorf("collect rewards provider type %v not implimented", providerType) } - hash, _, n, _, err := transaction.SmartContractTxn(scAddress, sn, true) - return hash, n, err + if fee == 0 { + return transaction.SmartContractTxn(scAddress, sn, true) + } else { + return transaction.SmartContractTxnValueFee(scAddress, sn, 0, fee, true) + } } // TransferAllocation transfers the ownership of an allocation to a new owner. (txn: `storagesc.update_allocation_request`) diff --git a/zcncore/execute_transactions.go b/zcncore/execute_transactions.go index 5a75ddde8..f898298ed 100644 --- a/zcncore/execute_transactions.go +++ b/zcncore/execute_transactions.go @@ -202,17 +202,28 @@ type SendTxnData struct { Note string `json:"note"` } -func Send(toClientID string, tokens uint64, desc string, client ...string) (hash, out string, nonce int64, txn *transaction.Transaction, err error) { +func SendWithCustomFee(toClientID string, tokens uint64, fee uint64, desc string, client ...string) (hash, out string, nonce int64, txn *transaction.Transaction, err error) { if len(client) == 0 { client = append(client, "") client = append(client, toClientID) } else { client = append(client, toClientID) } - return transaction.SmartContractTxnValue(MinerSmartContractAddress, transaction.SmartContractTxnData{ - Name: "transfer", - InputArgs: SendTxnData{Note: desc}, - }, tokens, true, client...) + + if fee == 0 { + return transaction.SmartContractTxnValue(MinerSmartContractAddress, transaction.SmartContractTxnData{ + Name: "transfer", + InputArgs: SendTxnData{Note: desc}, + }, tokens, true, client...) + } else { + return transaction.SmartContractTxnValueFee(MinerSmartContractAddress, transaction.SmartContractTxnData{ + Name: "transfer", + InputArgs: SendTxnData{Note: desc}, + }, tokens, fee, false, client...) + } +} +func Send(toClientID string, tokens uint64, desc string, client ...string) (hash, out string, nonce int64, txn *transaction.Transaction, err error) { + return SendWithCustomFee(toClientID, tokens, 0, desc, client...) } func Faucet(tokens uint64, input string, client ...string) (hash, out string, nonce int64, txn *transaction.Transaction, err error) { @@ -222,6 +233,10 @@ func Faucet(tokens uint64, input string, client ...string) (hash, out string, no }, tokens, true, client...) } +func VerifyTransaction(hash string) (txn *transaction.Transaction, err error) { + return transaction.VerifyTransaction(hash) +} + func DeleteMiner(id string) (hash, out string, nonce int64, txn *transaction.Transaction, err error) { return transaction.SmartContractTxn(MinerSmartContractAddress, transaction.SmartContractTxnData{ Name: "delete_miner", diff --git a/zcncore/get_data.go b/zcncore/get_data.go index d5a7eeaba..a27aaeb99 100644 --- a/zcncore/get_data.go +++ b/zcncore/get_data.go @@ -12,8 +12,10 @@ import ( "github.com/0chain/gosdk/core/client" "github.com/0chain/gosdk/core/sys" "github.com/0chain/gosdk/core/tokenrate" + "github.com/0chain/gosdk/core/transaction" "github.com/0chain/gosdk/core/util" "github.com/0chain/gosdk/core/zcncrypto" + "github.com/0chain/gosdk/zboxcore/sdk" ) type GetClientResponse struct { @@ -196,10 +198,6 @@ func (p Params) Query() string { return "?" + params.Encode() } -func withParams(uri string, params Params) string { //nolint:unused - return uri + params.Query() -} - // GetBlobberSnapshots obtains list of allocations of a blobber. // Blobber snapshots are historical records of the blobber instance to track its change over time and serve graph requests, // which are requests that need multiple data points, distributed over an interval of time, usually to plot them on a @@ -272,6 +270,73 @@ func GetSharders(active, stakable bool, limit, offset int) ([]byte, error) { }) } +func GetBlobbers(active, stakable bool, limit, offset int) ([]byte, error) { + if err := CheckConfig(); err != nil { + return nil, err + } + + blobbers, err := sdk.GetBlobbersPaged(active, stakable, limit, offset) + + if err != nil { + return nil, err + } + + blobbersBytes, err := json.Marshal(blobbers) + if err != nil { + return nil, err + } + + return blobbersBytes, nil +} + +func GetBlobberByID(id string) ([]byte, error) { + if err := CheckConfig(); err != nil { + return nil, err + } + + if id == "" || len(id) == 0 { + return nil, errors.New("blobber id is required") + } + + blobber, err := sdk.GetBlobber(id) + + if err != nil { + return nil, errors.New("error while getting blobber: " + err.Error()) + } + + blobberBytes, err := json.Marshal(blobber) + + if err != nil { + return nil, errors.New("error while marshalling blobber: " + err.Error()) + } + + return blobberBytes, nil +} + +func GetValidatorByID(id string) ([]byte, error) { + if err := CheckConfig(); err != nil { + return nil, err + } + + if id == "" || len(id) == 0 { + return nil, errors.New("validator id is required") + } + + validator, err := sdk.GetValidator(id) + + if err != nil { + return nil, errors.New("error while getting validator: " + err.Error()) + } + + validatorBytes, err := json.Marshal(validator) + + if err != nil { + return nil, errors.New("error while marshalling validator: " + err.Error()) + } + + return validatorBytes, nil +} + // GetLatestFinalizedMagicBlock gets latest finalized magic block // - numSharders: number of sharders // - timeout: request timeout @@ -375,6 +440,105 @@ func GetUserLockedTotal(clientID string) (int64, error) { } } +// GetStakePoolUserInfo get stake pool user info for all blobbers/miners/sharders. +// # Inputs +// - clientID wallet id +func GetStakePoolUserInfo(clientID string) ([]byte, error) { + err := CheckConfig() + if err != nil { + return nil, err + } + + limit, offset := 20, 0 + spUserInfo, err := sdk.GetStakePoolUserInfo(clientID, offset, limit) + if err != nil { + return nil, err + } + + var spUserInfoResponse []*sdk.StakePoolDelegatePoolInfo + + var spUserInfoSl []*sdk.StakePoolUserInfo + spUserInfoSl = append(spUserInfoSl, spUserInfo) + for { + // if the length of the slice is less than the limit, then we have reached the end + if len(spUserInfoSl) < limit { + break + } + + // get the next set of stake pool user info + offset += limit + spUserInfo, err = sdk.GetStakePoolUserInfo(clientID, limit, offset) + if err != nil { + break + } + spUserInfoSl = append(spUserInfoSl, spUserInfo) + } + + res, err := GetMinerSCUserInfo(clientID) + if err != nil { + return nil, errors.New("error while getting miner smart contract user info: " + err.Error()) + } + + var minerSCUserInfo *sdk.StakePoolUserInfo + err = json.Unmarshal(res, &minerSCUserInfo) + if err != nil { + return nil, errors.New("error while unmarshalling miner smart contract user info: " + err.Error()) + } + + spUserInfoSl = append(spUserInfoSl, minerSCUserInfo) + + for _, pool := range spUserInfoSl { + for _, sp := range pool.Pools { + spUserInfoResponse = append(spUserInfoResponse, sp...) + } + } + response := map[string]interface{}{ + "pools": spUserInfoResponse, + } + + spUserInfoBytes, err := json.Marshal(response) + if err != nil { + return nil, errors.New("error while marshalling stake pool user info: " + err.Error()) + } + + return spUserInfoBytes, nil +} + +func GetTransactions(toClientId, fromClientId, order string, limit, offset int64) ([]byte, error) { + if err := CheckConfig(); err != nil { + return nil, err + } + + const GET_TRANSACTIONS = `/transactions` + + return client.MakeSCRestAPICall(StorageSmartContractAddress, GET_TRANSACTIONS, Params{ + "to_client_id": toClientId, + "client_id": fromClientId, + "order": order, + "limit": strconv.FormatInt(limit, 10), + "offset": strconv.FormatInt(offset, 10), + }) +} + +func GetFeesTable(reqPercentage float32) ([]byte, error) { + nodeClient, err := client.GetNode() + if err != nil { + return nil, err + } + fees, err := transaction.GetFeesTable(nodeClient.GetStableMiners(), reqPercentage) + + if err != nil { + return nil, err + } + + feesBytes, err := json.Marshal(fees) + if err != nil { + return nil, err + } + + return feesBytes, nil +} + func IsHardforkActivated(name string) (bool, error) { res, err := client.MakeSCRestAPICall(MinerSmartContractAddress, GET_HARDFORK, Params{ "name": name, diff --git a/zcncore/wallet_base.go b/zcncore/wallet_base.go index d8b689ac8..195d1f84d 100644 --- a/zcncore/wallet_base.go +++ b/zcncore/wallet_base.go @@ -8,6 +8,8 @@ import ( "strings" "time" + "github.com/0chain/gosdk/core/sys" + "github.com/0chain/gosdk/constants" "github.com/0chain/gosdk/core/common" "github.com/0chain/gosdk/core/util" @@ -426,3 +428,15 @@ func SetupAuth(authHost, clientID, clientKey, publicKey, privateKey, localPublic }() return nil } + +func RegisterKMSZauthServer(serverAddr string) { + logging.Info("Registering KMS ZAuth server: ", serverAddr) + sys.SetAuthorize(client.ZauthSignTxn(serverAddr)) + sys.SetAuthCommon(client.ZauthAuthCommon(serverAddr)) +} + +func SetWalletMode(mode bool) { + client.SetWalletMode(mode) + + fmt.Println("gosdk setWalletMode: ", "is split:", mode) +} diff --git a/zcncore/wallet_mobile.go b/zcncore/wallet_mobile.go index 7fd9b0564..7ced61df2 100644 --- a/zcncore/wallet_mobile.go +++ b/zcncore/wallet_mobile.go @@ -6,6 +6,7 @@ package zcncore import ( "github.com/0chain/gosdk/core/client" "github.com/0chain/gosdk/core/zcncrypto" + "strconv" ) // Wallet interface to gather all wallet related functions @@ -37,3 +38,7 @@ func GetWalletBalance(id string) (int64, error) { } return int64(response.Balance), nil } + +func ConvertToValueMobile(token float64) string { + return strconv.FormatUint(ConvertToValue(token), 10) +} diff --git a/znft/example/go.mod b/znft/example/go.mod index 8eebd1585..3fb0297aa 100644 --- a/znft/example/go.mod +++ b/znft/example/go.mod @@ -23,8 +23,8 @@ require ( github.com/tklauser/numcpus v0.6.0 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.27.0 // indirect - golang.org/x/sys v0.25.0 // indirect + golang.org/x/crypto v0.30.0 // indirect + golang.org/x/sys v0.28.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/znft/example/go.sum b/znft/example/go.sum index bb384aa82..fb61fa574 100644 --- a/znft/example/go.sum +++ b/znft/example/go.sum @@ -138,6 +138,8 @@ golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58 golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.30.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -165,6 +167,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=