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  }