diff --git a/internal/pos/eip712.go b/internal/pos/eip712.go index 125c6b5e..b19065b5 100644 --- a/internal/pos/eip712.go +++ b/internal/pos/eip712.go @@ -7,7 +7,6 @@ import ( "github.com/KenshiTech/unchained/config" "github.com/KenshiTech/unchained/ethereum/contracts" "github.com/KenshiTech/unchained/log" - "github.com/KenshiTech/unchained/pos/eip712" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -31,7 +30,7 @@ func (s *Repository) Slash(address [20]byte, to common.Address, amount *big.Int, NftIds: nftIds, } - signature, err := eip712.SignTransferRequest(s.evmSigner, &transfer) + signature, err := s.eip712Signer.SignTransferRequest(s.evmSigner, &transfer) if err != nil { log.Logger. diff --git a/internal/pos/eip712/sign.go b/internal/pos/eip712/sign.go index 9da7b298..dea10d08 100644 --- a/internal/pos/eip712/sign.go +++ b/internal/pos/eip712/sign.go @@ -11,17 +11,19 @@ import ( "github.com/ethereum/go-ethereum/signer/core/apitypes" ) -var domain apitypes.TypedDataDomain +type EIP712Signer struct { + domain apitypes.TypedDataDomain +} -func bytesToUnchainedSignature(b []byte) *contracts.UnchainedStakingSignature { +func (s *EIP712Signer) bytesToUnchainedSignature(signature []byte) *contracts.UnchainedStakingSignature { return &contracts.UnchainedStakingSignature{ - V: b[64], - R: [32]byte(b[:32]), - S: [32]byte(b[32:64]), + V: signature[64], + R: [32]byte(signature[:32]), + S: [32]byte(signature[32:64]), } } -func signEip712Message(evmSigner *ethereum.EvmSigner, data *apitypes.TypedData) (*contracts.UnchainedStakingSignature, error) { +func (s *EIP712Signer) signEip712Message(evmSigner *ethereum.EvmSigner, data *apitypes.TypedData) (*contracts.UnchainedStakingSignature, error) { domainSeparator, err := data.HashStruct("EIP712Domain", data.Domain.Map()) if err != nil { return nil, err @@ -44,14 +46,14 @@ func signEip712Message(evmSigner *ethereum.EvmSigner, data *apitypes.TypedData) signature[64] += 27 } - return bytesToUnchainedSignature(signature), nil + return s.bytesToUnchainedSignature(signature), nil } -func SignTransferRequest(evmSigner *ethereum.EvmSigner, request *contracts.UnchainedStakingEIP712Transfer) (*contracts.UnchainedStakingSignature, error) { +func (s *EIP712Signer) SignTransferRequest(evmSigner *ethereum.EvmSigner, request *contracts.UnchainedStakingEIP712Transfer) (*contracts.UnchainedStakingSignature, error) { data := &apitypes.TypedData{ Types: Types, PrimaryType: "Transfer", - Domain: domain, + Domain: s.domain, Message: map[string]interface{}{ "signer": evmSigner.Address, "from": request.From, @@ -62,14 +64,14 @@ func SignTransferRequest(evmSigner *ethereum.EvmSigner, request *contracts.Uncha }, } - return signEip712Message(evmSigner, data) + return s.signEip712Message(evmSigner, data) } -func SignSetParamsRequest(evmSigner *ethereum.EvmSigner, request *contracts.UnchainedStakingEIP712SetParams) (*contracts.UnchainedStakingSignature, error) { +func (s *EIP712Signer) SignSetParamsRequest(evmSigner *ethereum.EvmSigner, request *contracts.UnchainedStakingEIP712SetParams) (*contracts.UnchainedStakingSignature, error) { data := &apitypes.TypedData{ Types: Types, PrimaryType: "SetParams", - Domain: domain, + Domain: s.domain, Message: map[string]interface{}{ "requester": evmSigner.Address, "token": request.Token, @@ -81,14 +83,14 @@ func SignSetParamsRequest(evmSigner *ethereum.EvmSigner, request *contracts.Unch }, } - return signEip712Message(evmSigner, data) + return s.signEip712Message(evmSigner, data) } -func SignSetNftPriceRequest(evmSigner *ethereum.EvmSigner, request *contracts.UnchainedStakingEIP712SetNftPrice) (*contracts.UnchainedStakingSignature, error) { +func (s *EIP712Signer) SignSetNftPriceRequest(evmSigner *ethereum.EvmSigner, request *contracts.UnchainedStakingEIP712SetNftPrice) (*contracts.UnchainedStakingSignature, error) { data := &apitypes.TypedData{ Types: Types, PrimaryType: "SetNftPrice", - Domain: domain, + Domain: s.domain, Message: map[string]interface{}{ "requester": evmSigner.Address, "nftId": request.NftId, @@ -97,14 +99,16 @@ func SignSetNftPriceRequest(evmSigner *ethereum.EvmSigner, request *contracts.Un }, } - return signEip712Message(evmSigner, data) + return s.signEip712Message(evmSigner, data) } -func InitDomain(chainID *big.Int, verifyingContract string) { - domain = apitypes.TypedDataDomain{ - Name: "Unchained", - Version: "1.0.0", - ChainId: math.NewHexOrDecimal256(chainID.Int64()), - VerifyingContract: verifyingContract, +func New(chainID *big.Int, verifyingContract string) *EIP712Signer { + return &EIP712Signer{ + domain: apitypes.TypedDataDomain{ + Name: "Unchained", + Version: "1.0.0", + ChainId: math.NewHexOrDecimal256(chainID.Int64()), + VerifyingContract: verifyingContract, + }, } } diff --git a/internal/pos/pos.go b/internal/pos/pos.go index fa3ec49e..557abbf8 100644 --- a/internal/pos/pos.go +++ b/internal/pos/pos.go @@ -23,6 +23,7 @@ type Repository struct { lastUpdated *xsync.MapOf[[20]byte, *big.Int] base *big.Int evmSigner *ethereum.EvmSigner + eip712Signer *eip712.EIP712Signer } func (s *Repository) GetTotalVotingPower() (*big.Int, error) { @@ -151,7 +152,7 @@ func New( return s } - eip712.InitDomain(chainID, config.App.ProofOfStake.Address) + s.eip712Signer = eip712.New(chainID, config.App.ProofOfStake.Address) return s }