Skip to content

Commit

Permalink
Executor using only TransferProposal
Browse files Browse the repository at this point in the history
  • Loading branch information
mj52951 committed Jan 16, 2024
1 parent 074a474 commit da73e26
Show file tree
Hide file tree
Showing 7 changed files with 96 additions and 74 deletions.
22 changes: 20 additions & 2 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,8 +179,26 @@ func Run() error {
mh := coreMessage.NewMessageHandler()
for _, handler := range config.Handlers {

depositHandler.RegisterDepositHandler(handler.Address, &depositHandlers.PermissionlessGenericDepositHandler{})
mh.RegisterMessageHandler("transfer", &executor.TransferMessageHandler{})
mh.RegisterMessageHandler("Transfer", &executor.TransferMessageHandler{})

switch handler.Type {
case "erc20":
{
depositHandler.RegisterDepositHandler(handler.Address, &depositHandlers.Erc20DepositHandler{})
}
case "permissionedGeneric":
{
depositHandler.RegisterDepositHandler(handler.Address, &depositHandlers.GenericDepositHandler{})
}
case "permissionlessGeneric":
{
depositHandler.RegisterDepositHandler(handler.Address, &depositHandlers.PermissionlessGenericDepositHandler{})
}
case "erc721":
{
depositHandler.RegisterDepositHandler(handler.Address, &depositHandlers.Erc721DepositHandler{})
}
}
}
depositListener := events.NewListener(client)
tssListener := events.NewListener(client)
Expand Down
43 changes: 16 additions & 27 deletions chains/evm/calls/contracts/bridge/bridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import (
"github.com/sygmaprotocol/sygma-core/chains/evm/client"
"github.com/sygmaprotocol/sygma-core/chains/evm/contracts"
"github.com/sygmaprotocol/sygma-core/chains/evm/transactor"
"github.com/sygmaprotocol/sygma-core/relayer/proposal"
)

const bridgeVersion = "3.1.0"
Expand Down Expand Up @@ -185,34 +184,34 @@ func (c *BridgeContract) PermissionlessGenericDeposit(
}

func (c *BridgeContract) ExecuteProposal(
proposal *chains.Proposal,
proposal *chains.TransferProposal,
signature []byte,
opts transactor.TransactOptions,
) (*common.Hash, error) {
log.Debug().
Str("depositNonce", strconv.FormatUint(proposal.DepositNonce, 10)).
Str("resourceID", hexutil.Encode(proposal.ResourceID[:])).
Str("depositNonce", strconv.FormatUint(proposal.Data.DepositNonce, 10)).
Str("resourceID", hexutil.Encode(proposal.Data.ResourceId[:])).
Msgf("Execute proposal")
return c.ExecuteTransaction(
"executeProposal",
opts,
proposal.OriginDomainID, proposal.DepositNonce, proposal.Data, proposal.ResourceID, signature,
proposal.Source, proposal.Data.DepositNonce, proposal.Data, proposal.Data.ResourceId, signature,
)
}

func (c *BridgeContract) ExecuteProposals(
proposals []*proposal.Proposal,
proposals []*chains.TransferProposal,
signature []byte,
opts transactor.TransactOptions,
) (*common.Hash, error) {
bridgeProposals := make([]proposal.Proposal, 0)
bridgeProposals := make([]chains.TransferProposal, 0)
for _, prop := range proposals {
bridgeProposals = append(bridgeProposals, proposal.Proposal{
bridgeProposals = append(bridgeProposals, chains.TransferProposal{
Source: prop.Source,
Data: chains.TransferProposalData{
DepositNonce: prop.Data.(chains.TransferProposalData).DepositNonce,
ResourceId: prop.Data.(chains.TransferProposalData).ResourceId,
Data: prop.Data.(chains.TransferProposalData).Data,
DepositNonce: prop.Data.DepositNonce,
ResourceId: prop.Data.ResourceId,
Data: prop.Data.Data,
},
})
}
Expand All @@ -225,31 +224,21 @@ func (c *BridgeContract) ExecuteProposals(
)
}

func (c *BridgeContract) ProposalsHash(proposals []*proposal.Proposal) ([]byte, error) {
func (c *BridgeContract) ProposalsHash(proposals []*chains.TransferProposal) ([]byte, error) {
chainID, err := c.client.ChainID(context.Background())
if err != nil {
return []byte{}, err
}
return chains.ProposalsHash(proposals, chainID.Int64(), c.ContractAddress().Hex(), bridgeVersion)
}

func (c *BridgeContract) IsProposalExecuted(p *proposal.Proposal) (bool, error) {
transferProposal := &chains.TransferProposal{
Source: p.Source,
Destination: p.Destination,
Data: chains.TransferProposalData{
DepositNonce: p.Data.(chains.TransferProposalData).DepositNonce,
ResourceId: p.Data.(chains.TransferProposalData).ResourceId,
Metadata: p.Data.(chains.TransferProposalData).Metadata,
Data: p.Data.(chains.TransferProposalData).Data,
},
Type: p.Type,
}
func (c *BridgeContract) IsProposalExecuted(p *chains.TransferProposal) (bool, error) {

log.Debug().
Str("depositNonce", strconv.FormatUint(transferProposal.Data.DepositNonce, 10)).
Str("resourceID", hexutil.Encode(transferProposal.Data.ResourceId[:])).
Str("depositNonce", strconv.FormatUint(p.Data.DepositNonce, 10)).
Str("resourceID", hexutil.Encode(p.Data.ResourceId[:])).
Msg("Getting is proposal executed")
res, err := c.CallContract("isProposalExecuted", p.Source, big.NewInt(int64(p.Data.(chains.TransferProposalData).DepositNonce)))
res, err := c.CallContract("isProposalExecuted", p.Source, big.NewInt(int64(p.Data.DepositNonce)))
if err != nil {
return false, err
}
Expand Down
22 changes: 11 additions & 11 deletions chains/evm/executor/executor.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,17 @@ import (
"github.com/libp2p/go-libp2p/core/host"
"github.com/rs/zerolog/log"

"github.com/ChainSafe/sygma-relayer/chains"
"github.com/ChainSafe/sygma-relayer/comm"
"github.com/ChainSafe/sygma-relayer/tss"
"github.com/ChainSafe/sygma-relayer/tss/signing"
"github.com/sygmaprotocol/sygma-core/chains/evm/transactor"
"github.com/sygmaprotocol/sygma-core/relayer/proposal"
)

const TRANSFER_GAS_COST = 200000

type Batch struct {
proposals []*proposal.Proposal
proposals []*chains.TransferProposal
gasLimit uint64
}

Expand All @@ -37,9 +37,9 @@ var (
)

type BridgeContract interface {
IsProposalExecuted(p *proposal.Proposal) (bool, error)
ExecuteProposals(proposals []*proposal.Proposal, signature []byte, opts transactor.TransactOptions) (*ethCommon.Hash, error)
ProposalsHash(proposals []*proposal.Proposal) ([]byte, error)
IsProposalExecuted(p *chains.TransferProposal) (bool, error)
ExecuteProposals(proposals []*chains.TransferProposal, signature []byte, opts transactor.TransactOptions) (*ethCommon.Hash, error)
ProposalsHash(proposals []*chains.TransferProposal) ([]byte, error)
}

type Executor struct {
Expand Down Expand Up @@ -73,7 +73,7 @@ func NewExecutor(
}

// Execute starts a signing process and executes proposals when signature is generated
func (e *Executor) Execute(proposals []*proposal.Proposal) error {
func (e *Executor) Execute(proposals []*chains.TransferProposal) error {
e.exitLock.RLock()
defer e.exitLock.RUnlock()

Expand Down Expand Up @@ -173,10 +173,10 @@ func (e *Executor) watchExecution(ctx context.Context, cancelExecution context.C
}
}

func (e *Executor) proposalBatches(proposals []*proposal.Proposal) ([]*Batch, error) {
func (e *Executor) proposalBatches(proposals []*chains.TransferProposal) ([]*Batch, error) {
batches := make([]*Batch, 1)
currentBatch := &Batch{
proposals: make([]*proposal.Proposal, 0),
proposals: make([]*chains.TransferProposal, 0),
gasLimit: 0,
}
batches[0] = currentBatch
Expand All @@ -193,7 +193,7 @@ func (e *Executor) proposalBatches(proposals []*proposal.Proposal) ([]*Batch, er
}

var propGasLimit uint64
l, ok := prop.Data.(TransferMessageData).Metadata["gasLimit"]
l, ok := prop.Data.Metadata["gasLimit"]
if ok {
propGasLimit = l.(uint64)
} else {
Expand All @@ -202,7 +202,7 @@ func (e *Executor) proposalBatches(proposals []*proposal.Proposal) ([]*Batch, er
currentBatch.gasLimit += propGasLimit
if currentBatch.gasLimit >= e.transactionMaxGas {
currentBatch = &Batch{
proposals: make([]*proposal.Proposal, 0),
proposals: make([]*chains.TransferProposal, 0),
gasLimit: 0,
}
batches = append(batches, currentBatch)
Expand Down Expand Up @@ -231,7 +231,7 @@ func (e *Executor) executeBatch(batch *Batch, signatureData *common.SignatureDat
return hash, err
}

func (e *Executor) areProposalsExecuted(proposals []*proposal.Proposal, sessionID string) bool {
func (e *Executor) areProposalsExecuted(proposals []*chains.TransferProposal, sessionID string) bool {
for _, prop := range proposals {
isExecuted, err := e.bridge.IsProposalExecuted(prop)
if err != nil || !isExecuted {
Expand Down
32 changes: 24 additions & 8 deletions chains/evm/executor/message-handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,12 @@ func PermissionlessGenericMessageHandler(msg *TransferMessage) (*proposal.Propos
data.Write(depositor)

data.Write(executionData)
return chains.NewTransferProposal(msg.Source, msg.Destination, msg.Data.DepositNonce,
msg.Data.ResourceId, msg.Data.Metadata, data.Bytes(), chains.TransferProposalType), nil
return chains.NewProposal(msg.Source, msg.Destination, chains.TransferProposalData{
DepositNonce: msg.Data.DepositNonce,
ResourceId: msg.Data.ResourceId,
Metadata: msg.Data.Metadata,
Data: data.Bytes(),
}, chains.TransferProposalType), nil
}

func ERC20MessageHandler(msg *TransferMessage) (*proposal.Proposal, error) {
Expand All @@ -119,8 +123,12 @@ func ERC20MessageHandler(msg *TransferMessage) (*proposal.Proposal, error) {
data = append(data, common.LeftPadBytes(recipientLen, 32)...) // length of recipient (uint256)
data = append(data, recipient...) // recipient ([]byte)

return chains.NewTransferProposal(msg.Source, msg.Destination, msg.Data.DepositNonce,
msg.Data.ResourceId, msg.Data.Metadata, data, chains.TransferProposalType), nil
return chains.NewProposal(msg.Source, msg.Destination, chains.TransferProposalData{
DepositNonce: msg.Data.DepositNonce,
ResourceId: msg.Data.ResourceId,
Metadata: msg.Data.Metadata,
Data: data,
}, chains.TransferProposalType), nil
}

func ERC721MessageHandler(msg *TransferMessage) (*proposal.Proposal, error) {
Expand Down Expand Up @@ -148,8 +156,12 @@ func ERC721MessageHandler(msg *TransferMessage) (*proposal.Proposal, error) {
metadataLen := big.NewInt(int64(len(metadata))).Bytes()
data.Write(common.LeftPadBytes(metadataLen, 32))
data.Write(metadata)
return chains.NewTransferProposal(msg.Source, msg.Destination, msg.Data.DepositNonce,
msg.Data.ResourceId, msg.Data.Metadata, data.Bytes(), chains.TransferProposalType), nil
return chains.NewProposal(msg.Source, msg.Destination, chains.TransferProposalData{
DepositNonce: msg.Data.DepositNonce,
ResourceId: msg.Data.ResourceId,
Metadata: msg.Data.Metadata,
Data: data.Bytes(),
}, chains.TransferProposalType), nil
}

func GenericMessageHandler(msg *TransferMessage) (*proposal.Proposal, error) {
Expand All @@ -164,6 +176,10 @@ func GenericMessageHandler(msg *TransferMessage) (*proposal.Proposal, error) {
metadataLen := big.NewInt(int64(len(metadata))).Bytes()
data.Write(common.LeftPadBytes(metadataLen, 32)) // length of metadata (uint256)
data.Write(metadata)
return chains.NewTransferProposal(msg.Source, msg.Destination, msg.Data.DepositNonce,
msg.Data.ResourceId, msg.Data.Metadata, data.Bytes(), chains.TransferProposalType), nil
return chains.NewProposal(msg.Source, msg.Destination, chains.TransferProposalData{
DepositNonce: msg.Data.DepositNonce,
ResourceId: msg.Data.ResourceId,
Metadata: msg.Data.Metadata,
Data: data.Bytes(),
}, chains.TransferProposalType), nil
}
12 changes: 7 additions & 5 deletions chains/evm/executor/message-handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -399,13 +399,15 @@ func (s *PermissionlessGenericHandlerTestSuite) Test_HandleMessage() {
prop, err := mh.HandleMessage(message)

expectedData, _ := hex.DecodeString("0000000000000000000000000000000000000000000000000000000000030d4000001402091eeff969b33a5ce8a729dae325879bf76f90145c1f5961696bad2e73f73417f07ef55c62a2dc5b307868617368")
expected := chains.NewTransferProposal(
expected := chains.NewProposal(
message.Source,
message.Destination,
message.Data.(executor.TransferMessageData).DepositNonce,
message.Data.(executor.TransferMessageData).ResourceId,
message.Data.(executor.TransferMessageData).Metadata,
expectedData,
chains.TransferProposalData{
DepositNonce: message.Data.(executor.TransferMessageData).DepositNonce,
ResourceId: message.Data.(executor.TransferMessageData).ResourceId,
Metadata: message.Data.(executor.TransferMessageData).Metadata,
Data: expectedData,
},
chains.TransferProposalType,
)
s.Nil(err)
Expand Down
36 changes: 17 additions & 19 deletions chains/proposal.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,6 @@ const (
TransferMessageType coreMessage.MessageType = "Transfer"
)

func NewProposal(source, destination uint8, depositNonce uint64, resourceId types.ResourceID, data []byte, metadata message.Metadata) *Proposal {
return &Proposal{
OriginDomainID: source,
DepositNonce: depositNonce,
ResourceID: resourceId,
Destination: destination,
Data: data,
Metadata: metadata,
}
}

type TransferProposal struct {
Source uint8
Destination uint8
Expand All @@ -48,19 +37,28 @@ type TransferProposalData struct {
}

func NewTransferProposal(source, destination uint8, depositNonce uint64,
resourceId [32]byte, metadata map[string]interface{}, data []byte, propType proposal.ProposalType) *proposal.Proposal {
resourceId [32]byte, metadata map[string]interface{}, data []byte, propType proposal.ProposalType) *TransferProposal {

transferProposal := TransferProposalData{
transferProposalData := TransferProposalData{
DepositNonce: depositNonce,
ResourceId: resourceId,
Metadata: metadata,
Data: data,
}

return &TransferProposal{
Source: source,
Destination: destination,
Data: transferProposalData,
Type: propType,
}
}

func NewProposal(source uint8, destination uint8, data interface{}, propType proposal.ProposalType) *proposal.Proposal {
return &proposal.Proposal{
Source: source,
Destination: destination,
Data: transferProposal,
Data: data,
Type: propType,
}
}
Expand All @@ -74,18 +72,18 @@ type Proposal struct {
Metadata message.Metadata
}

func ProposalsHash(proposals []*proposal.Proposal, chainID int64, verifContract string, bridgeVersion string) ([]byte, error) {
func ProposalsHash(proposals []*TransferProposal, chainID int64, verifContract string, bridgeVersion string) ([]byte, error) {

formattedProps := make([]interface{}, len(proposals))
for i, prop := range proposals {
transferProposal := &TransferProposal{
Source: prop.Source,
Destination: prop.Destination,
Data: TransferProposalData{
DepositNonce: prop.Data.(TransferProposalData).DepositNonce,
ResourceId: prop.Data.(TransferProposalData).ResourceId,
Metadata: prop.Data.(TransferProposalData).Metadata,
Data: prop.Data.(TransferProposalData).Data,
DepositNonce: prop.Data.DepositNonce,
ResourceId: prop.Data.ResourceId,
Metadata: prop.Data.Metadata,
Data: prop.Data.Data,
},
Type: prop.Type,
}
Expand Down
3 changes: 1 addition & 2 deletions chains/proposal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ package chains

import (
"github.com/stretchr/testify/suite"
"github.com/sygmaprotocol/sygma-core/relayer/proposal"
)

const bridgeVersion = "3.1.0"
Expand All @@ -17,7 +16,7 @@ type ProposalTestSuite struct {

func (s *ProposalTestSuite) Test_ProposalsHash() {
data := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 243, 16, 122, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 1, 1, 0, 212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125}
prop := []*proposal.Proposal{NewTransferProposal(1, 2, 3, [32]byte{3}, nil, data, TransferProposalType)}
prop := []*TransferProposal{NewTransferProposal(1, 2, 3, [32]byte{3}, nil, data, TransferProposalType)}
correctRes := []byte{253, 216, 81, 25, 46, 239, 181, 138, 51, 225, 165, 111, 156, 95, 27, 239, 160, 87, 89, 84, 50, 22, 97, 185, 132, 200, 201, 210, 204, 99, 94, 131}

res, err := ProposalsHash(prop, 5, verifyingContract, bridgeVersion)
Expand Down

0 comments on commit da73e26

Please sign in to comment.