github.com/stafiprotocol/go-substrate-rpc-client@v1.4.7/types/metadata.go (about) 1 // Go Substrate RPC Client (GSRPC) provides APIs and types around Polkadot and any Substrate-based chain RPC calls 2 // 3 // Copyright 2020 Stafi Protocol 4 // 5 // Licensed under the Apache License, Version 2.0 (the "License"); 6 // you may not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 17 package types 18 19 import ( 20 "fmt" 21 22 "github.com/stafiprotocol/go-substrate-rpc-client/pkg/scale" 23 ) 24 25 const MagicNumber uint32 = 0x6174656d 26 27 // Modelled after https://github.com/paritytech/substrate/blob/v1.0.0rc2/srml/metadata/src/lib.rs 28 29 type Metadata struct { 30 MagicNumber uint32 31 Version uint8 32 IsMetadataV4 bool 33 AsMetadataV4 MetadataV4 34 IsMetadataV7 bool 35 AsMetadataV7 MetadataV7 36 IsMetadataV8 bool 37 AsMetadataV8 MetadataV8 38 IsMetadataV9 bool 39 AsMetadataV9 MetadataV9 40 IsMetadataV10 bool 41 AsMetadataV10 MetadataV10 42 IsMetadataV11 bool 43 AsMetadataV11 MetadataV11 44 IsMetadataV12 bool 45 AsMetadataV12 MetadataV12 46 IsMetadataV13 bool 47 AsMetadataV13 MetadataV13 48 IsMetadataV14 bool 49 } 50 51 func NewMetadataV4() *Metadata { 52 return &Metadata{Version: 4, IsMetadataV4: true, AsMetadataV4: MetadataV4{make([]ModuleMetadataV4, 0)}} 53 } 54 55 func NewMetadataV7() *Metadata { 56 return &Metadata{Version: 7, IsMetadataV7: true, AsMetadataV7: MetadataV7{make([]ModuleMetadataV7, 0)}} 57 } 58 59 func NewMetadataV8() *Metadata { 60 return &Metadata{Version: 8, IsMetadataV8: true, AsMetadataV8: MetadataV8{make([]ModuleMetadataV8, 0)}} 61 } 62 63 func NewMetadataV9() *Metadata { 64 return &Metadata{Version: 9, IsMetadataV9: true, AsMetadataV9: MetadataV9{make([]ModuleMetadataV8, 0)}} 65 } 66 67 func NewMetadataV10() *Metadata { 68 return &Metadata{Version: 10, IsMetadataV10: true, AsMetadataV10: MetadataV10{make([]ModuleMetadataV10, 0)}} 69 } 70 71 func NewMetadataV11() *Metadata { 72 return &Metadata{ 73 Version: 11, 74 IsMetadataV11: true, 75 AsMetadataV11: MetadataV11{MetadataV10: MetadataV10{Modules: make([]ModuleMetadataV10, 0)}}, 76 } 77 } 78 79 func NewMetadataV12() *Metadata { 80 return &Metadata{ 81 Version: 12, 82 IsMetadataV12: true, 83 AsMetadataV12: MetadataV12{Modules: make([]ModuleMetadataV12, 0)}, 84 } 85 } 86 87 func NewMetadataV13() *Metadata { 88 return &Metadata{ 89 Version: 13, 90 IsMetadataV13: true, 91 AsMetadataV13: MetadataV13{Modules: make([]ModuleMetadataV13, 0)}, 92 } 93 } 94 95 func (m *Metadata) Decode(decoder scale.Decoder) error { 96 err := decoder.Decode(&m.MagicNumber) 97 if err != nil { 98 return err 99 } 100 101 if m.MagicNumber != MagicNumber { 102 return fmt.Errorf("magic number mismatch: expected %#x, found %#x", MagicNumber, m.MagicNumber) 103 } 104 105 err = decoder.Decode(&m.Version) 106 if err != nil { 107 return err 108 } 109 110 switch m.Version { 111 case 4: 112 m.IsMetadataV4 = true 113 err = decoder.Decode(&m.AsMetadataV4) 114 case 7: 115 m.IsMetadataV7 = true 116 err = decoder.Decode(&m.AsMetadataV7) 117 case 8: 118 m.IsMetadataV8 = true 119 err = decoder.Decode(&m.AsMetadataV8) 120 case 9: 121 m.IsMetadataV9 = true 122 err = decoder.Decode(&m.AsMetadataV9) 123 case 10: 124 m.IsMetadataV10 = true 125 err = decoder.Decode(&m.AsMetadataV10) 126 case 11: 127 m.IsMetadataV11 = true 128 err = decoder.Decode(&m.AsMetadataV11) 129 case 12: 130 m.IsMetadataV12 = true 131 err = decoder.Decode(&m.AsMetadataV12) 132 case 13: 133 m.IsMetadataV13 = true 134 err = decoder.Decode(&m.AsMetadataV13) 135 default: 136 return fmt.Errorf("decode unsupported metadata version %v", m.Version) 137 } 138 139 return err 140 } 141 142 func (m Metadata) Encode(encoder scale.Encoder) error { 143 err := encoder.Encode(m.MagicNumber) 144 if err != nil { 145 return err 146 } 147 148 err = encoder.Encode(m.Version) 149 if err != nil { 150 return err 151 } 152 153 switch m.Version { 154 case 4: 155 err = encoder.Encode(m.AsMetadataV4) 156 case 7: 157 err = encoder.Encode(m.AsMetadataV7) 158 case 8: 159 err = encoder.Encode(m.AsMetadataV8) 160 case 9: 161 err = encoder.Encode(m.AsMetadataV9) 162 case 10: 163 err = encoder.Encode(m.AsMetadataV10) 164 case 11: 165 err = encoder.Encode(m.AsMetadataV11) 166 case 12: 167 err = encoder.Encode(m.AsMetadataV12) 168 case 13: 169 err = encoder.Encode(m.AsMetadataV13) 170 default: 171 return fmt.Errorf("encode unsupported metadata version %v", m.Version) 172 } 173 174 return err 175 } 176 177 func (m *Metadata) FindCallIndex(call string) (CallIndex, error) { 178 switch { 179 case m.IsMetadataV4: 180 return m.AsMetadataV4.FindCallIndex(call) 181 case m.IsMetadataV7: 182 return m.AsMetadataV7.FindCallIndex(call) 183 case m.IsMetadataV8: 184 return m.AsMetadataV8.FindCallIndex(call) 185 case m.IsMetadataV9: 186 return m.AsMetadataV9.FindCallIndex(call) 187 case m.IsMetadataV10: 188 return m.AsMetadataV10.FindCallIndex(call) 189 case m.IsMetadataV11: 190 return m.AsMetadataV11.FindCallIndex(call) 191 case m.IsMetadataV12: 192 return m.AsMetadataV12.FindCallIndex(call) 193 case m.IsMetadataV13: 194 return m.AsMetadataV13.FindCallIndex(call) 195 default: 196 return CallIndex{}, fmt.Errorf("FindCallIndex unsupported metadata version") 197 } 198 } 199 200 func (m *Metadata) FindEventNamesForEventID(eventID EventID) (Text, Text, error) { 201 switch { 202 case m.IsMetadataV4: 203 return m.AsMetadataV4.FindEventNamesForEventID(eventID) 204 case m.IsMetadataV7: 205 return m.AsMetadataV7.FindEventNamesForEventID(eventID) 206 case m.IsMetadataV8: 207 return m.AsMetadataV8.FindEventNamesForEventID(eventID) 208 case m.IsMetadataV9: 209 return m.AsMetadataV9.FindEventNamesForEventID(eventID) 210 case m.IsMetadataV10: 211 return m.AsMetadataV10.FindEventNamesForEventID(eventID) 212 case m.IsMetadataV11: 213 return m.AsMetadataV11.FindEventNamesForEventID(eventID) 214 case m.IsMetadataV12: 215 return m.AsMetadataV12.FindEventNamesForEventID(eventID) 216 case m.IsMetadataV13: 217 return m.AsMetadataV13.FindEventNamesForEventID(eventID) 218 default: 219 return "", "", fmt.Errorf("FindEventNamesForEventID unsupported metadata version") 220 } 221 } 222 223 func (m *Metadata) FindStorageEntryMetadata(module string, fn string) (StorageEntryMetadata, error) { 224 switch { 225 case m.IsMetadataV4: 226 return m.AsMetadataV4.FindStorageEntryMetadata(module, fn) 227 case m.IsMetadataV7: 228 return m.AsMetadataV7.FindStorageEntryMetadata(module, fn) 229 case m.IsMetadataV8: 230 return m.AsMetadataV8.FindStorageEntryMetadata(module, fn) 231 case m.IsMetadataV9: 232 return m.AsMetadataV9.FindStorageEntryMetadata(module, fn) 233 case m.IsMetadataV10: 234 return m.AsMetadataV10.FindStorageEntryMetadata(module, fn) 235 case m.IsMetadataV11: 236 return m.AsMetadataV11.FindStorageEntryMetadata(module, fn) 237 case m.IsMetadataV12: 238 return m.AsMetadataV12.FindStorageEntryMetadata(module, fn) 239 case m.IsMetadataV13: 240 return m.AsMetadataV13.FindStorageEntryMetadata(module, fn) 241 default: 242 return nil, fmt.Errorf("FindStorageEntryMetadata unsupported metadata version") 243 } 244 } 245 246 func (m *Metadata) ExistsModuleMetadata(module string) bool { 247 switch { 248 case m.IsMetadataV4: 249 return m.AsMetadataV4.ExistsModuleMetadata(module) 250 case m.IsMetadataV7: 251 return m.AsMetadataV7.ExistsModuleMetadata(module) 252 case m.IsMetadataV8: 253 return m.AsMetadataV8.ExistsModuleMetadata(module) 254 case m.IsMetadataV9: 255 return m.AsMetadataV9.ExistsModuleMetadata(module) 256 case m.IsMetadataV10: 257 return m.AsMetadataV10.ExistsModuleMetadata(module) 258 case m.IsMetadataV11: 259 return m.AsMetadataV11.ExistsModuleMetadata(module) 260 case m.IsMetadataV12: 261 return m.AsMetadataV12.ExistsModuleMetadata(module) 262 case m.IsMetadataV13: 263 return m.AsMetadataV13.ExistsModuleMetadata(module) 264 default: 265 return false 266 } 267 } 268 269 func (m *Metadata) FindConstantValue(module string, constantName string) ([]byte, error) { 270 txtModule := Text(module) 271 txtConstantName := Text(constantName) 272 switch { 273 case m.IsMetadataV4: 274 return m.AsMetadataV4.FindConstantValue(txtModule, txtConstantName) 275 case m.IsMetadataV7: 276 return m.AsMetadataV7.FindConstantValue(txtModule, txtConstantName) 277 case m.IsMetadataV8: 278 return m.AsMetadataV8.FindConstantValue(txtModule, txtConstantName) 279 case m.IsMetadataV9: 280 return m.AsMetadataV9.FindConstantValue(txtModule, txtConstantName) 281 case m.IsMetadataV10: 282 return m.AsMetadataV10.FindConstantValue(txtModule, txtConstantName) 283 case m.IsMetadataV11: 284 return m.AsMetadataV11.FindConstantValue(txtModule, txtConstantName) 285 case m.IsMetadataV12: 286 return m.AsMetadataV12.FindConstantValue(txtModule, txtConstantName) 287 case m.IsMetadataV13: 288 return m.AsMetadataV13.FindConstantValue(txtModule, txtConstantName) 289 default: 290 return nil, fmt.Errorf("unsupported metadata version") 291 } 292 }