1717package types_test
1818
1919import (
20+ "encoding/binary"
21+ "github.com/centrifuge/go-substrate-rpc-client/v3/hash"
22+ "github.com/centrifuge/go-substrate-rpc-client/v3/xxhash"
23+ "strings"
2024 "testing"
2125
2226 . "github.com/centrifuge/go-substrate-rpc-client/v3/types"
@@ -27,10 +31,202 @@ const (
2731 AlicePubKey = "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"
2832)
2933
34+ func TestCreateStorageKeyArgValidationForPlainKey (t * testing.T ) {
35+ m := ExamplaryMetadataV13
36+
37+ _ , err := CreateStorageKey (m , "Timestamp" , "Now" )
38+ assert .NoError (t , err )
39+
40+ _ , err = CreateStorageKey (m , "Timestamp" , "Now" , nil )
41+ assert .NoError (t , err )
42+
43+ _ , err = CreateStorageKey (m , "Timestamp" , "Now" , nil , []byte {})
44+ assert .NoError (t , err )
45+
46+ _ , err = CreateStorageKey (m , "Timestamp" , "Now" , nil , []byte {0x01 })
47+ assert .EqualError (t , err , "non-nil arguments cannot be preceded by nil arguments" )
48+
49+ _ , err = CreateStorageKey (m , "Timestamp" , "Now" , []byte {0x01 })
50+ assert .EqualError (t , err , "Timestamp:Now is a plain key, therefore requires no argument. received: 1" )
51+
52+ expectedKeyBuilder := strings.Builder {}
53+ hexStr , err := Hex (xxhash .New128 ([]byte ("Timestamp" )).Sum (nil ))
54+ assert .NoError (t , err )
55+ expectedKeyBuilder .WriteString (hexStr )
56+ hexStr , err = Hex (xxhash .New128 ([]byte ("Now" )).Sum (nil ))
57+ assert .NoError (t , err )
58+ expectedKeyBuilder .WriteString (strings .TrimPrefix (hexStr , "0x" ))
59+
60+ key , err := CreateStorageKey (m , "Timestamp" , "Now" )
61+ assert .NoError (t , err )
62+ hex , err := Hex (key )
63+ assert .NoError (t , err )
64+ assert .Equal (t , expectedKeyBuilder .String (), hex )
65+ }
66+
67+ func TestCreateStorageKeyArgValidationForMapKey (t * testing.T ) {
68+ m := ExamplaryMetadataV13
69+
70+ _ , err := CreateStorageKey (m , "System" , "Account" )
71+ assert .EqualError (t , err , "System:Account is a map, therefore requires precisely one argument. " +
72+ "received: 0" )
73+
74+ _ , err = CreateStorageKey (m , "System" , "Account" , nil )
75+ assert .EqualError (t , err , "System:Account is a map, therefore requires precisely one argument. " +
76+ "received: 0" )
77+
78+ _ , err = CreateStorageKey (m , "System" , "Account" , nil , []byte {})
79+ assert .EqualError (t , err , "System:Account is a map, therefore requires precisely one argument. " +
80+ "received: 0" )
81+
82+ _ , err = CreateStorageKey (m , "System" , "Account" , nil , []byte {0x01 })
83+ assert .EqualError (t , err , "non-nil arguments cannot be preceded by nil arguments" )
84+
85+ accountIdSerialized := MustHexDecodeString (AlicePubKey )
86+
87+ // Build expected answer
88+ expectedKeyBuilder := strings.Builder {}
89+ hexStr , err := Hex (xxhash .New128 ([]byte ("System" )).Sum (nil ))
90+ assert .NoError (t , err )
91+ expectedKeyBuilder .WriteString (hexStr )
92+ hexStr , err = Hex (xxhash .New128 ([]byte ("Account" )).Sum (nil ))
93+ assert .NoError (t , err )
94+ expectedKeyBuilder .WriteString (strings .TrimPrefix (hexStr , "0x" ))
95+ accountIdHasher , err := hash .NewBlake2b128Concat (nil )
96+ assert .NoError (t , err )
97+ _ , err = accountIdHasher .Write (accountIdSerialized )
98+ assert .NoError (t , err )
99+ hexStr , err = Hex (accountIdHasher .Sum (nil ))
100+ assert .NoError (t , err )
101+ expectedKeyBuilder .WriteString (strings .TrimPrefix (hexStr , "0x" ))
102+
103+ key , err := CreateStorageKey (m , "System" , "Account" , accountIdSerialized )
104+ assert .NoError (t , err )
105+ hex , err := Hex (key )
106+ assert .NoError (t , err )
107+ assert .Equal (t , expectedKeyBuilder .String (), hex )
108+ }
109+
110+ func TestCreateStorageKeyArgValidationForDoubleMapKey (t * testing.T ) {
111+ m := ExamplaryMetadataV13
112+
113+ _ , err := CreateStorageKey (m , "Staking" , "ErasStakers" )
114+ assert .EqualError (t , err , "Staking:ErasStakers is a double map, therefore requires precisely two " +
115+ "arguments. received: 0" )
116+
117+ _ , err = CreateStorageKey (m , "Staking" , "ErasStakers" , nil )
118+ assert .EqualError (t , err , "Staking:ErasStakers is a double map, therefore requires precisely two " +
119+ "arguments. received: 0" )
120+
121+ _ , err = CreateStorageKey (m , "Staking" , "ErasStakers" , nil , []byte {})
122+ assert .EqualError (t , err , "Staking:ErasStakers is a double map, therefore requires precisely two " +
123+ "arguments. received: 0" )
124+
125+ _ , err = CreateStorageKey (m , "Staking" , "ErasStakers" , nil , []byte {0x01 })
126+ assert .EqualError (t , err , "non-nil arguments cannot be preceded by nil arguments" )
127+
128+ _ , err = CreateStorageKey (m , "Staking" , "ErasStakers" , []byte {0x01 })
129+ assert .EqualError (t , err , "Staking:ErasStakers is a double map, therefore requires precisely two " +
130+ "arguments. received: 1" )
131+
132+ // Serialize EraIndex and AccountId
133+ accountIdSerialized := MustHexDecodeString (AlicePubKey )
134+ var eraIndex uint32 = 3
135+ eraIndexSerialized := make ([]byte , 4 )
136+ binary .LittleEndian .PutUint32 (eraIndexSerialized , eraIndex )
137+
138+ // Build expected answer
139+ expectedKeyBuilder := strings.Builder {}
140+ hexStr , err := Hex (xxhash .New128 ([]byte ("Staking" )).Sum (nil ))
141+ assert .NoError (t , err )
142+ expectedKeyBuilder .WriteString (hexStr )
143+ hexStr , err = Hex (xxhash .New128 ([]byte ("ErasStakers" )).Sum (nil ))
144+ assert .NoError (t , err )
145+ expectedKeyBuilder .WriteString (strings .TrimPrefix (hexStr , "0x" ))
146+ hexStr , err = Hex (xxhash .New64Concat (eraIndexSerialized ).Sum (nil ))
147+ assert .NoError (t , err )
148+ expectedKeyBuilder .WriteString (strings .TrimPrefix (hexStr , "0x" ))
149+ hexStr , err = Hex (xxhash .New64Concat (accountIdSerialized ).Sum (nil ))
150+ assert .NoError (t , err )
151+ expectedKeyBuilder .WriteString (strings .TrimPrefix (hexStr , "0x" ))
152+
153+ key , err := CreateStorageKey (m , "Staking" , "ErasStakers" , eraIndexSerialized , accountIdSerialized )
154+ assert .NoError (t , err )
155+ hex , err := Hex (key )
156+ assert .NoError (t , err )
157+
158+ assert .Equal (t , expectedKeyBuilder .String (), hex )
159+ }
160+
161+ func TestCreateStorageKeyArgValidationForNMapKey (t * testing.T ) {
162+ m := ExamplaryMetadataV13
163+ //"Assets", "Approvals", "AssetId(u32)", "AccountId", "AccountId"
164+
165+ _ , err := CreateStorageKey (m , "Assets" , "Approvals" )
166+ assert .EqualError (t , err , "Assets:Approvals is a nmap, therefore requires that number of arguments " +
167+ "should exactly match number of hashers in metadata. Expected: 3, received: 0" )
168+
169+ _ , err = CreateStorageKey (m , "Assets" , "Approvals" , nil )
170+ assert .EqualError (t , err , "Assets:Approvals is a nmap, therefore requires that number of arguments " +
171+ "should exactly match number of hashers in metadata. Expected: 3, received: 0" )
172+
173+ _ , err = CreateStorageKey (m , "Assets" , "Approvals" , nil , []byte {})
174+ assert .EqualError (t , err , "Assets:Approvals is a nmap, therefore requires that number of arguments " +
175+ "should exactly match number of hashers in metadata. Expected: 3, received: 0" )
176+
177+ _ , err = CreateStorageKey (m , "Assets" , "Approvals" , nil , []byte {0x01 })
178+ assert .EqualError (t , err , "non-nil arguments cannot be preceded by nil arguments" )
179+
180+ _ , err = CreateStorageKey (m , "Assets" , "Approvals" , []byte {0x01 })
181+ assert .EqualError (t , err , "Assets:Approvals is a nmap, therefore requires that number of arguments " +
182+ "should exactly match number of hashers in metadata. Expected: 3, received: 1" )
183+
184+ // Serialize EraIndex and AccountId
185+ var assetId uint32 = 3
186+ assetIdSerialized := make ([]byte , 4 )
187+ binary .LittleEndian .PutUint32 (assetIdSerialized , assetId )
188+ // Will be used both as owner as well as delegate
189+ accountIdSerialized := MustHexDecodeString (AlicePubKey )
190+
191+ // Build expected answer
192+ expectedKeyBuilder := strings.Builder {}
193+ hexStr , err := Hex (xxhash .New128 ([]byte ("Assets" )).Sum (nil ))
194+ assert .NoError (t , err )
195+ expectedKeyBuilder .WriteString (hexStr )
196+ hexStr , err = Hex (xxhash .New128 ([]byte ("Approvals" )).Sum (nil ))
197+ assert .NoError (t , err )
198+ expectedKeyBuilder .WriteString (strings .TrimPrefix (hexStr , "0x" ))
199+ // Hashing serialized asset id
200+ assetIdHasher , err := hash .NewBlake2b128Concat (nil )
201+ assert .NoError (t , err )
202+ _ , err = assetIdHasher .Write (assetIdSerialized )
203+ assert .NoError (t , err )
204+ hexStr , err = Hex (assetIdHasher .Sum (nil ))
205+ expectedKeyBuilder .WriteString (strings .TrimPrefix (hexStr , "0x" ))
206+ // Hashing serialized account id
207+ accountIdHasher , err := hash .NewBlake2b128Concat (nil )
208+ assert .NoError (t , err )
209+ _ , err = accountIdHasher .Write (accountIdSerialized )
210+ assert .NoError (t , err )
211+ hexStr , err = Hex (accountIdHasher .Sum (nil ))
212+ // Writing it multiple times as both owner and delegate
213+ expectedKeyBuilder .WriteString (strings .TrimPrefix (hexStr , "0x" ))
214+ expectedKeyBuilder .WriteString (strings .TrimPrefix (hexStr , "0x" ))
215+
216+
217+ key , err := CreateStorageKey (m , "Assets" , "Approvals" , assetIdSerialized , accountIdSerialized ,
218+ accountIdSerialized )
219+ assert .NoError (t , err )
220+ hex , err := Hex (key )
221+ assert .NoError (t , err )
222+
223+ assert .Equal (t , expectedKeyBuilder .String (), hex )
224+ }
225+
30226func TestCreateStorageKeyPlainV13 (t * testing.T ) {
31227 m := ExamplaryMetadataV13
32228
33- key , err := CreateStorageKey (m , "Timestamp" , "Now" , nil )
229+ key , err := CreateStorageKey (m , "Timestamp" , "Now" )
34230 assert .NoError (t , err )
35231 hex , err := Hex (key )
36232 assert .NoError (t , err )
@@ -40,7 +236,7 @@ func TestCreateStorageKeyPlainV13(t *testing.T) {
40236func TestCreateStorageKeyPlainV10 (t * testing.T ) {
41237 m := ExamplaryMetadataV10
42238
43- key , err := CreateStorageKey (m , "Timestamp" , "Now" , nil )
239+ key , err := CreateStorageKey (m , "Timestamp" , "Now" )
44240 assert .NoError (t , err )
45241 hex , err := Hex (key )
46242 assert .NoError (t , err )
@@ -50,7 +246,7 @@ func TestCreateStorageKeyPlainV10(t *testing.T) {
50246func TestCreateStorageKeyPlainV9 (t * testing.T ) {
51247 m := ExamplaryMetadataV9
52248
53- key , err := CreateStorageKey (m , "Timestamp" , "Now" , nil )
249+ key , err := CreateStorageKey (m , "Timestamp" , "Now" )
54250 assert .NoError (t , err )
55251 hex , err := Hex (key )
56252 assert .NoError (t , err )
@@ -60,7 +256,7 @@ func TestCreateStorageKeyPlainV9(t *testing.T) {
60256func TestCreateStorageKeyPlainV4 (t * testing.T ) {
61257 m := ExamplaryMetadataV4
62258
63- key , err := CreateStorageKey (m , "Timestamp" , "Now" , nil )
259+ key , err := CreateStorageKey (m , "Timestamp" , "Now" )
64260 assert .NoError (t , err )
65261 hex , err := Hex (key )
66262 assert .NoError (t , err )
0 commit comments