github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/engine/access/rest/request/signatures.go (about)

     1  package request
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/onflow/flow-go/engine/access/rest/models"
     7  	"github.com/onflow/flow-go/engine/access/rest/util"
     8  	"github.com/onflow/flow-go/model/flow"
     9  )
    10  
    11  type TransactionSignature flow.TransactionSignature
    12  
    13  func (s *TransactionSignature) Parse(
    14  	rawAddress string,
    15  	rawKeyIndex string,
    16  	rawSignature string,
    17  	chain flow.Chain,
    18  ) error {
    19  	address, err := ParseAddress(rawAddress, chain)
    20  	if err != nil {
    21  		return err
    22  	}
    23  
    24  	keyIndex, err := util.ToUint64(rawKeyIndex)
    25  	if err != nil {
    26  		return fmt.Errorf("invalid key index: %w", err)
    27  	}
    28  
    29  	var signature Signature
    30  	err = signature.Parse(rawSignature)
    31  	if err != nil {
    32  		return fmt.Errorf("invalid signature: %w", err)
    33  	}
    34  
    35  	*s = TransactionSignature(flow.TransactionSignature{
    36  		Address:   address,
    37  		KeyIndex:  keyIndex,
    38  		Signature: signature,
    39  	})
    40  
    41  	return nil
    42  }
    43  
    44  func (s TransactionSignature) Flow() flow.TransactionSignature {
    45  	return flow.TransactionSignature(s)
    46  }
    47  
    48  type TransactionSignatures []TransactionSignature
    49  
    50  func (t *TransactionSignatures) Parse(rawSigs []models.TransactionSignature, chain flow.Chain) error {
    51  	signatures := make([]TransactionSignature, len(rawSigs))
    52  	for i, sig := range rawSigs {
    53  		var signature TransactionSignature
    54  		err := signature.Parse(sig.Address, sig.KeyIndex, sig.Signature, chain)
    55  		if err != nil {
    56  			return err
    57  		}
    58  		signatures[i] = signature
    59  	}
    60  
    61  	*t = signatures
    62  	return nil
    63  }
    64  
    65  func (t TransactionSignatures) Flow() []flow.TransactionSignature {
    66  	sigs := make([]flow.TransactionSignature, len(t))
    67  	for i, sig := range t {
    68  		sigs[i] = sig.Flow()
    69  	}
    70  	return sigs
    71  }
    72  
    73  type Signature []byte
    74  
    75  func (s *Signature) Parse(raw string) error {
    76  	if raw == "" {
    77  		return fmt.Errorf("missing value")
    78  	}
    79  
    80  	signatureBytes, err := util.FromBase64(raw)
    81  	if err != nil {
    82  		return fmt.Errorf("invalid encoding")
    83  	}
    84  
    85  	*s = signatureBytes
    86  	return nil
    87  }
    88  
    89  func (s Signature) Flow() []byte {
    90  	return s
    91  }