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 }