github.com/diadata-org/diadata@v1.4.593/pkg/utils/randomnessEIP712Signer.go (about)

     1  package utils
     2  
     3  import (
     4  	"bytes"
     5  	"strconv"
     6  
     7  	"github.com/ethereum/go-ethereum/common"
     8  	"github.com/ethereum/go-ethereum/common/hexutil"
     9  	"github.com/ethereum/go-ethereum/common/math"
    10  	"github.com/ethereum/go-ethereum/crypto"
    11  )
    12  
    13  type RandomnessSigner struct {
    14  	privateKey string
    15  	domain     TypedDataDomain
    16  	types      Types
    17  }
    18  
    19  func NewRandomnessSigner(privateKey string) *RandomnessSigner {
    20  	domain := TypedDataDomain{
    21  		Name:              "DiaData",
    22  		Version:           "1.0.0",
    23  		ChainId:           math.NewHexOrDecimal256(1),
    24  		VerifyingContract: common.HexToAddress("0x0000000000000000000000000000000000000000").Hex(),
    25  	}
    26  
    27  	types := Types{
    28  		"Message": []Type{
    29  			{Name: "randomness", Type: "string"},
    30  			{Name: "round", Type: "string"},
    31  		},
    32  		"EIP712Domain": []Type{
    33  			{Name: "name", Type: "string"},
    34  			{Name: "version", Type: "string"},
    35  			{Name: "chainId", Type: "uint256"},
    36  			{Name: "verifyingContract", Type: "address"},
    37  		},
    38  	}
    39  	return &RandomnessSigner{privateKey: privateKey, domain: domain, types: types}
    40  }
    41  
    42  func (aqs *RandomnessSigner) Sign(randomness string, round int) (string, error) {
    43  
    44  	message := map[string]interface{}{
    45  		"randomness": randomness,
    46  		"round":      strconv.Itoa(round),
    47  	}
    48  
    49  	typedData := TypedData{
    50  		Types:       aqs.types,
    51  		PrimaryType: "Message",
    52  		Domain:      aqs.domain,
    53  		Message:     message,
    54  	}
    55  
    56  	typedDataHash, _, err := TypedDataAndHash(typedData)
    57  	if err != nil {
    58  		return "", err
    59  	}
    60  
    61  	pk, err := hexToPrivateKey(aqs.privateKey)
    62  	if err != nil {
    63  		return "", err
    64  	}
    65  	signature, err := crypto.Sign(typedDataHash, pk)
    66  	if err != nil {
    67  		return "", err
    68  
    69  	}
    70  
    71  	var buf bytes.Buffer
    72  	buf.Write(signature)
    73  	// buf.WriteByte(1) // recovery ID
    74  	sigData := hexutil.Encode(buf.Bytes())
    75  	// fmt.Println("sigdata", sigData)
    76  
    77  	return sigData, nil
    78  }