From bc47380923447c14a6302e0c92835eb360207af9 Mon Sep 17 00:00:00 2001 From: Idris Isah <58168886+eedygreen@users.noreply.github.com> Date: Tue, 3 Oct 2023 12:45:49 +0100 Subject: [PATCH 1/6] chore: update aws region (#221) --- .github/workflows/deploy_stage.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy_stage.yml b/.github/workflows/deploy_stage.yml index 77db9551..e4738abe 100644 --- a/.github/workflows/deploy_stage.yml +++ b/.github/workflows/deploy_stage.yml @@ -128,14 +128,14 @@ jobs: variables: | relayerId=${{ matrix.relayer_id }} awsAccountId=${{ env.AWS_STAGE }} - awsRegion=${{ secrets.DEVNET_REGION_2 }} + awsRegion=${{ secrets.AWS_REGION_2 }} awsEfs=${{ secrets.DEVNET_EFS_2 }} - name: configure aws credentials uses: aws-actions/configure-aws-credentials@v1 with: role-to-assume: arn:aws:iam::${{ env.AWS_STAGE }}:role/github-actions-${{ env.ENVIRONMENT }}-chainbridge - aws-region: ${{ secrets.DEVNET_REGION_2 }} + aws-region: ${{ secrets.AWS_REGION_2 }} role-session-name: GithubActions - name: deploy task definition From 67a5ae78dcb4cf5986b74c634bc3e341fd5e3cef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20Petruni=C4=87?= Date: Wed, 4 Oct 2023 12:26:42 +0200 Subject: [PATCH 2/6] feat: enable generic transaction batching (#217) Co-authored-by: mace --- app/app.go | 4 +- chains/evm/config.go | 2 +- chains/evm/config_test.go | 2 +- chains/evm/executor/executor.go | 192 ++++++++++++--------- chains/evm/listener/event-handler.go | 72 -------- chains/evm/listener/event-handler_test.go | 193 +--------------------- example/app/app.go | 4 +- 7 files changed, 124 insertions(+), 345 deletions(-) diff --git a/app/app.go b/app/app.go index fa5130df..bf65b503 100644 --- a/app/app.go +++ b/app/app.go @@ -203,12 +203,12 @@ func Run() error { tssListener := events.NewListener(client) eventHandlers := make([]coreListener.EventHandler, 0) l := log.With().Str("chain", fmt.Sprintf("%v", config.GeneralChainConfig.Name)).Uint8("domainID", *config.GeneralChainConfig.Id) - eventHandlers = append(eventHandlers, listener.NewDepositEventHandler(l, depositListener, depositHandler, bridgeAddress, *config.GeneralChainConfig.Id)) + eventHandlers = append(eventHandlers, coreListener.NewDepositEventHandler(depositListener, depositHandler, bridgeAddress, *config.GeneralChainConfig.Id)) eventHandlers = append(eventHandlers, listener.NewKeygenEventHandler(l, tssListener, coordinator, host, communication, keyshareStore, bridgeAddress, networkTopology.Threshold)) eventHandlers = append(eventHandlers, listener.NewRefreshEventHandler(l, topologyProvider, topologyStore, tssListener, coordinator, host, communication, connectionGate, keyshareStore, bridgeAddress)) eventHandlers = append(eventHandlers, listener.NewRetryEventHandler(l, tssListener, depositHandler, bridgeAddress, *config.GeneralChainConfig.Id, config.BlockConfirmations)) evmListener := coreListener.NewEVMListener(client, eventHandlers, blockstore, sygmaMetrics, *config.GeneralChainConfig.Id, config.BlockRetryInterval, config.BlockConfirmations, config.BlockInterval) - executor := executor.NewExecutor(host, communication, coordinator, mh, bridgeContract, keyshareStore, exitLock) + executor := executor.NewExecutor(host, communication, coordinator, mh, bridgeContract, keyshareStore, exitLock, config.GasLimit.Uint64()) chain := evm.NewEVMChain( client, evmListener, executor, blockstore, *config.GeneralChainConfig.Id, config.StartBlock, diff --git a/chains/evm/config.go b/chains/evm/config.go index 8075a17c..26e85b17 100644 --- a/chains/evm/config.go +++ b/chains/evm/config.go @@ -65,7 +65,7 @@ type RawEVMConfig struct { MaxGasPrice int64 `mapstructure:"maxGasPrice" default:"500000000000"` GasMultiplier float64 `mapstructure:"gasMultiplier" default:"1"` GasIncreasePercentage int64 `mapstructure:"gasIncreasePercentage" default:"15"` - GasLimit int64 `mapstructure:"gasLimit" default:"2000000"` + GasLimit int64 `mapstructure:"gasLimit" default:"15000000"` StartBlock int64 `mapstructure:"startBlock"` BlockConfirmations int64 `mapstructure:"blockConfirmations" default:"10"` BlockInterval int64 `mapstructure:"blockInterval" default:"5"` diff --git a/chains/evm/config_test.go b/chains/evm/config_test.go index 23c73fe8..5c728e1b 100644 --- a/chains/evm/config_test.go +++ b/chains/evm/config_test.go @@ -81,7 +81,7 @@ func (s *NewEVMConfigTestSuite) Test_ValidConfig() { Id: id, }, Bridge: "bridgeAddress", - GasLimit: big.NewInt(2000000), + GasLimit: big.NewInt(15000000), MaxGasPrice: big.NewInt(500000000000), GasMultiplier: big.NewFloat(1), GasIncreasePercentage: big.NewInt(15), diff --git a/chains/evm/executor/executor.go b/chains/evm/executor/executor.go index fb965442..64aad00c 100644 --- a/chains/evm/executor/executor.go +++ b/chains/evm/executor/executor.go @@ -28,6 +28,11 @@ import ( const TRANSFER_GAS_COST = 200000 +type Batch struct { + proposals []*chains.Proposal + gasLimit uint64 +} + var ( executionCheckPeriod = time.Minute signingTimeout = 30 * time.Minute @@ -44,13 +49,14 @@ type BridgeContract interface { } type Executor struct { - coordinator *tss.Coordinator - host host.Host - comm comm.Communication - fetcher signing.SaveDataFetcher - bridge BridgeContract - mh MessageHandler - exitLock *sync.RWMutex + coordinator *tss.Coordinator + host host.Host + comm comm.Communication + fetcher signing.SaveDataFetcher + bridge BridgeContract + mh MessageHandler + exitLock *sync.RWMutex + transactionMaxGas uint64 } func NewExecutor( @@ -61,15 +67,17 @@ func NewExecutor( bridgeContract BridgeContract, fetcher signing.SaveDataFetcher, exitLock *sync.RWMutex, + transactionMaxGas uint64, ) *Executor { return &Executor{ - host: host, - comm: comm, - coordinator: coordinator, - mh: mh, - bridge: bridgeContract, - fetcher: fetcher, - exitLock: exitLock, + host: host, + comm: comm, + coordinator: coordinator, + mh: mh, + bridge: bridgeContract, + fetcher: fetcher, + exitLock: exitLock, + transactionMaxGas: transactionMaxGas, } } @@ -78,63 +86,57 @@ func (e *Executor) Execute(msgs []*message.Message) error { e.exitLock.RLock() defer e.exitLock.RUnlock() - proposals := make([]*chains.Proposal, 0) - for _, m := range msgs { - prop, err := e.mh.HandleMessage(m) - if err != nil { - return err - } - evmProposal := chains.NewProposal(prop.Source, prop.Destination, prop.DepositNonce, prop.ResourceId, prop.Data, prop.Metadata) - isExecuted, err := e.bridge.IsProposalExecuted(evmProposal) - if err != nil { - return err - } - if isExecuted { - log.Info().Msgf("Prop %p already executed", prop) - continue - } - - proposals = append(proposals, evmProposal) - } - if len(proposals) == 0 { - return nil - } - - propHash, err := e.bridge.ProposalsHash(proposals) + batches, err := e.proposalBatches(msgs) if err != nil { return err } - sessionID := e.sessionID(propHash) - msg := big.NewInt(0) - msg.SetBytes(propHash) - signing, err := signing.NewSigning( - msg, - e.sessionID(propHash), - e.host, - e.comm, - e.fetcher) - if err != nil { - return err - } - - sigChn := make(chan interface{}) - executionContext, cancelExecution := context.WithCancel(context.Background()) - watchContext, cancelWatch := context.WithCancel(context.Background()) - pool := pool.New().WithErrors() - pool.Go(func() error { - err := e.coordinator.Execute(executionContext, signing, sigChn) - if err != nil { - cancelWatch() + p := pool.New().WithErrors() + for _, batch := range batches { + if len(batch.proposals) == 0 { + continue } - return err - }) - pool.Go(func() error { return e.watchExecution(watchContext, cancelExecution, proposals, sigChn, sessionID) }) - return pool.Wait() + b := batch + p.Go(func() error { + propHash, err := e.bridge.ProposalsHash(b.proposals) + if err != nil { + return err + } + + sessionID := e.sessionID(propHash) + msg := big.NewInt(0) + msg.SetBytes(propHash) + signing, err := signing.NewSigning( + msg, + e.sessionID(propHash), + e.host, + e.comm, + e.fetcher) + if err != nil { + return err + } + + sigChn := make(chan interface{}) + executionContext, cancelExecution := context.WithCancel(context.Background()) + watchContext, cancelWatch := context.WithCancel(context.Background()) + ep := pool.New().WithErrors() + ep.Go(func() error { + err := e.coordinator.Execute(executionContext, signing, sigChn) + if err != nil { + cancelWatch() + } + + return err + }) + ep.Go(func() error { return e.watchExecution(watchContext, cancelExecution, b, sigChn, sessionID) }) + return ep.Wait() + }) + } + return p.Wait() } -func (e *Executor) watchExecution(ctx context.Context, cancelExecution context.CancelFunc, proposals []*chains.Proposal, sigChn chan interface{}, sessionID string) error { +func (e *Executor) watchExecution(ctx context.Context, cancelExecution context.CancelFunc, batch *Batch, sigChn chan interface{}, sessionID string) error { ticker := time.NewTicker(executionCheckPeriod) timeout := time.NewTicker(signingTimeout) defer ticker.Stop() @@ -151,7 +153,7 @@ func (e *Executor) watchExecution(ctx context.Context, cancelExecution context.C } signatureData := sigResult.(*common.SignatureData) - hash, err := e.executeProposal(proposals, signatureData) + hash, err := e.executeBatch(batch, signatureData) if err != nil { _ = e.comm.Broadcast(e.host.Peerstore().Peers(), []byte{}, comm.TssFailMsg, sessionID) return err @@ -161,7 +163,7 @@ func (e *Executor) watchExecution(ctx context.Context, cancelExecution context.C } case <-ticker.C: { - if !e.areProposalsExecuted(proposals, sessionID) { + if !e.areProposalsExecuted(batch.proposals, sessionID) { continue } @@ -180,23 +182,61 @@ func (e *Executor) watchExecution(ctx context.Context, cancelExecution context.C } } -func (e *Executor) executeProposal(proposals []*chains.Proposal, signatureData *common.SignatureData) (*ethCommon.Hash, error) { +func (e *Executor) proposalBatches(msgs []*message.Message) ([]*Batch, error) { + batches := make([]*Batch, 1) + currentBatch := &Batch{ + proposals: make([]*chains.Proposal, 0), + gasLimit: 0, + } + batches[0] = currentBatch + + for _, m := range msgs { + prop, err := e.mh.HandleMessage(m) + if err != nil { + return nil, err + } + + evmProposal := chains.NewProposal(prop.Source, prop.Destination, prop.DepositNonce, prop.ResourceId, prop.Data, prop.Metadata) + isExecuted, err := e.bridge.IsProposalExecuted(evmProposal) + if err != nil { + return nil, err + } + if isExecuted { + log.Info().Msgf("Proposal %p already executed", prop) + continue + } + + var propGasLimit uint64 + l, ok := evmProposal.Metadata.Data["gasLimit"] + if ok { + propGasLimit = l.(uint64) + } else { + propGasLimit = uint64(TRANSFER_GAS_COST) + } + currentBatch.gasLimit += propGasLimit + if currentBatch.gasLimit >= e.transactionMaxGas { + currentBatch = &Batch{ + proposals: make([]*chains.Proposal, 0), + gasLimit: 0, + } + batches = append(batches, currentBatch) + } + + currentBatch.proposals = append(currentBatch.proposals, evmProposal) + } + + return batches, nil +} + +func (e *Executor) executeBatch(batch *Batch, signatureData *common.SignatureData) (*ethCommon.Hash, error) { sig := []byte{} sig = append(sig[:], ethCommon.LeftPadBytes(signatureData.R, 32)...) sig = append(sig[:], ethCommon.LeftPadBytes(signatureData.S, 32)...) sig = append(sig[:], signatureData.SignatureRecovery...) sig[len(sig)-1] += 27 // Transform V from 0/1 to 27/28 - var gasLimit uint64 - l, ok := proposals[0].Metadata.Data["gasLimit"] - if ok { - gasLimit = l.(uint64) - } else { - gasLimit = uint64(TRANSFER_GAS_COST * len(proposals)) - } - - hash, err := e.bridge.ExecuteProposals(proposals, sig, transactor.TransactOptions{ - GasLimit: gasLimit, + hash, err := e.bridge.ExecuteProposals(batch.proposals, sig, transactor.TransactOptions{ + GasLimit: batch.gasLimit, }) if err != nil { return nil, err diff --git a/chains/evm/listener/event-handler.go b/chains/evm/listener/event-handler.go index 7a80a537..9b838f00 100644 --- a/chains/evm/listener/event-handler.go +++ b/chains/evm/listener/event-handler.go @@ -36,78 +36,6 @@ type EventListener interface { FetchDepositEvent(event hubEvents.RetryEvent, bridgeAddress common.Address, blockConfirmations *big.Int) ([]events.Deposit, error) } -type DepositEventHandler struct { - log zerolog.Logger - eventListener listener.EventListener - depositHandler listener.DepositHandler - - bridgeAddress common.Address - domainID uint8 -} - -func NewDepositEventHandler( - logC zerolog.Context, - eventListener listener.EventListener, - depositHandler listener.DepositHandler, - bridgeAddress common.Address, - domainID uint8, -) *DepositEventHandler { - return &DepositEventHandler{ - log: logC.Logger(), - eventListener: eventListener, - depositHandler: depositHandler, - bridgeAddress: bridgeAddress, - domainID: domainID, - } -} - -func (eh *DepositEventHandler) HandleEvent( - startBlock *big.Int, - endBlock *big.Int, - msgChan chan []*message.Message, -) error { - deposits, err := eh.eventListener.FetchDeposits(context.Background(), eh.bridgeAddress, startBlock, endBlock) - if err != nil { - return fmt.Errorf("unable to fetch deposit events because of: %+v", err) - } - - domainDeposits := make(map[uint8][]*message.Message) - for _, d := range deposits { - func(d *events.Deposit) { - defer func() { - if r := recover(); r != nil { - eh.log.Error().Err(err).Msgf("panic occured while handling deposit %+v", d) - } - }() - - m, err := eh.depositHandler.HandleDeposit( - eh.domainID, d.DestinationDomainID, d.DepositNonce, d.ResourceID, d.Data, d.HandlerResponse, - ) - if err != nil { - eh.log.Error().Err(err).Str("start block", startBlock.String()).Str( - "end block", endBlock.String(), - ).Uint8("domainID", eh.domainID).Msgf("%v", err) - return - } - - eh.log.Info().Msgf("Resolved deposit message %+v in block range: %s-%s", m, startBlock.String(), endBlock.String()) - - if m.Type == PermissionlessGenericTransfer { - msgChan <- []*message.Message{m} - return - } - - domainDeposits[m.Destination] = append(domainDeposits[m.Destination], m) - }(d) - } - - for _, deposits := range domainDeposits { - msgChan <- deposits - } - - return nil -} - type RetryEventHandler struct { log zerolog.Logger eventListener EventListener diff --git a/chains/evm/listener/event-handler_test.go b/chains/evm/listener/event-handler_test.go index 8a82e249..33a228fd 100644 --- a/chains/evm/listener/event-handler_test.go +++ b/chains/evm/listener/event-handler_test.go @@ -5,10 +5,11 @@ package listener_test import ( "fmt" - "github.com/rs/zerolog/log" "math/big" "testing" + "github.com/rs/zerolog/log" + "github.com/ethereum/go-ethereum/common" "github.com/golang/mock/gomock" "github.com/stretchr/testify/suite" @@ -218,193 +219,3 @@ func (s *RetryEventHandlerTestSuite) Test_MultipleDeposits() { s.Nil(err) s.Equal(msgs, []*message.Message{{DepositNonce: 1}, {DepositNonce: 2}}) } - -type DepositHandlerTestSuite struct { - suite.Suite - depositEventHandler *listener.DepositEventHandler - mockDepositHandler *mock_coreListener.MockDepositHandler - mockEventListener *mock_coreListener.MockEventListener - domainID uint8 -} - -func TestRunDepositHandlerTestSuite(t *testing.T) { - suite.Run(t, new(DepositHandlerTestSuite)) -} - -func (s *DepositHandlerTestSuite) SetupTest() { - ctrl := gomock.NewController(s.T()) - s.domainID = 1 - s.mockEventListener = mock_coreListener.NewMockEventListener(ctrl) - s.mockDepositHandler = mock_coreListener.NewMockDepositHandler(ctrl) - s.depositEventHandler = listener.NewDepositEventHandler(log.With(), s.mockEventListener, s.mockDepositHandler, common.Address{}, s.domainID) -} - -func (s *DepositHandlerTestSuite) Test_FetchDepositFails() { - s.mockEventListener.EXPECT().FetchDeposits(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return([]*coreEvents.Deposit{}, fmt.Errorf("error")) - - msgChan := make(chan []*message.Message, 1) - err := s.depositEventHandler.HandleEvent(big.NewInt(0), big.NewInt(5), msgChan) - - s.NotNil(err) - s.Equal(len(msgChan), 0) -} - -func (s *DepositHandlerTestSuite) Test_HandleDepositFails_ExecutionContinue() { - d1 := &coreEvents.Deposit{ - DepositNonce: 1, - DestinationDomainID: 2, - ResourceID: types.ResourceID{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - d2 := &coreEvents.Deposit{ - DepositNonce: 2, - DestinationDomainID: 2, - ResourceID: types.ResourceID{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - deposits := []*coreEvents.Deposit{d1, d2} - s.mockEventListener.EXPECT().FetchDeposits(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(deposits, nil) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d1.DestinationDomainID, - d1.DepositNonce, - d1.ResourceID, - d1.Data, - d1.HandlerResponse, - ).Return(&message.Message{}, fmt.Errorf("error")) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d2.DestinationDomainID, - d2.DepositNonce, - d2.ResourceID, - d2.Data, - d2.HandlerResponse, - ).Return( - &message.Message{DepositNonce: 2}, - nil, - ) - - msgChan := make(chan []*message.Message, 2) - err := s.depositEventHandler.HandleEvent(big.NewInt(0), big.NewInt(5), msgChan) - msgs := <-msgChan - - s.Nil(err) - s.Equal(msgs, []*message.Message{{DepositNonce: 2}}) -} - -func (s *DepositHandlerTestSuite) Test_HandleDepositPanics_ExecutionContinues() { - d1 := &coreEvents.Deposit{ - DepositNonce: 1, - DestinationDomainID: 2, - ResourceID: types.ResourceID{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - d2 := &coreEvents.Deposit{ - DepositNonce: 2, - DestinationDomainID: 2, - ResourceID: types.ResourceID{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - deposits := []*coreEvents.Deposit{d1, d2} - s.mockEventListener.EXPECT().FetchDeposits(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(deposits, nil) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d1.DestinationDomainID, - d1.DepositNonce, - d1.ResourceID, - d1.Data, - d1.HandlerResponse, - ).Do(func(sourceID, destID, nonce, resourceID, calldata, handlerResponse interface{}) { - panic("error") - }) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d2.DestinationDomainID, - d2.DepositNonce, - d2.ResourceID, - d2.Data, - d2.HandlerResponse, - ).Return( - &message.Message{DepositNonce: 2}, - nil, - ) - - msgChan := make(chan []*message.Message, 2) - err := s.depositEventHandler.HandleEvent(big.NewInt(0), big.NewInt(5), msgChan) - msgs := <-msgChan - - s.Nil(err) - s.Equal(msgs, []*message.Message{{DepositNonce: 2}}) -} - -func (s *DepositHandlerTestSuite) Test_SuccessfulHandleDeposit() { - d1 := &coreEvents.Deposit{ - DepositNonce: 1, - DestinationDomainID: 2, - ResourceID: types.ResourceID{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - d2 := &coreEvents.Deposit{ - DepositNonce: 2, - DestinationDomainID: 2, - ResourceID: types.ResourceID{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - d3 := &coreEvents.Deposit{ - DepositNonce: 3, - DestinationDomainID: 3, - ResourceID: types.ResourceID{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - deposits := []*coreEvents.Deposit{d1, d2, d3} - s.mockEventListener.EXPECT().FetchDeposits(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(deposits, nil) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d1.DestinationDomainID, - d1.DepositNonce, - d1.ResourceID, - d1.Data, - d1.HandlerResponse, - ).Return( - &message.Message{DepositNonce: 1}, - nil, - ) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d2.DestinationDomainID, - d2.DepositNonce, - d2.ResourceID, - d2.Data, - d2.HandlerResponse, - ).Return( - &message.Message{DepositNonce: 2, Type: listener.PermissionlessGenericTransfer}, - nil, - ) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d3.DestinationDomainID, - d3.DepositNonce, - d3.ResourceID, - d3.Data, - d3.HandlerResponse, - ).Return( - &message.Message{DepositNonce: 3}, - nil, - ) - - msgChan := make(chan []*message.Message, 3) - err := s.depositEventHandler.HandleEvent(big.NewInt(0), big.NewInt(5), msgChan) - msgs1 := <-msgChan - msgs2 := <-msgChan - - s.Nil(err) - s.Equal(msgs1, []*message.Message{{DepositNonce: 2, Type: listener.PermissionlessGenericTransfer}}) - s.Equal(msgs2, []*message.Message{{DepositNonce: 1}, {DepositNonce: 3}}) -} diff --git a/example/app/app.go b/example/app/app.go index 8a460f40..f61316f1 100644 --- a/example/app/app.go +++ b/example/app/app.go @@ -178,12 +178,12 @@ func Run() error { tssListener := events.NewListener(client) eventHandlers := make([]coreListener.EventHandler, 0) l := log.With().Str("chain", fmt.Sprintf("%v", chainConfig["name"])).Uint8("domainID", *config.GeneralChainConfig.Id) - eventHandlers = append(eventHandlers, listener.NewDepositEventHandler(l, depositListener, depositHandler, bridgeAddress, *config.GeneralChainConfig.Id)) + eventHandlers = append(eventHandlers, coreListener.NewDepositEventHandler(depositListener, depositHandler, bridgeAddress, *config.GeneralChainConfig.Id)) eventHandlers = append(eventHandlers, listener.NewKeygenEventHandler(l, tssListener, coordinator, host, communication, keyshareStore, bridgeAddress, networkTopology.Threshold)) eventHandlers = append(eventHandlers, listener.NewRefreshEventHandler(l, nil, nil, tssListener, coordinator, host, communication, connectionGate, keyshareStore, bridgeAddress)) eventHandlers = append(eventHandlers, listener.NewRetryEventHandler(l, tssListener, depositHandler, bridgeAddress, *config.GeneralChainConfig.Id, config.BlockConfirmations)) evmListener := coreListener.NewEVMListener(client, eventHandlers, blockstore, sygmaMetrics, *config.GeneralChainConfig.Id, config.BlockRetryInterval, config.BlockConfirmations, config.BlockInterval) - executor := executor.NewExecutor(host, communication, coordinator, mh, bridgeContract, keyshareStore, exitLock) + executor := executor.NewExecutor(host, communication, coordinator, mh, bridgeContract, keyshareStore, exitLock, config.GasLimit.Uint64()) chain := evm.NewEVMChain( client, evmListener, executor, blockstore, *config.GeneralChainConfig.Id, config.StartBlock, From d46d870a720fd56c1d2ffed737cb24df0ddc3519 Mon Sep 17 00:00:00 2001 From: Idris Isah <58168886+eedygreen@users.noreply.github.com> Date: Wed, 4 Oct 2023 12:49:55 +0100 Subject: [PATCH 3/6] chore: testnet regional deployment (#222) --- .github/workflows/deploy_testnet.yml | 62 +++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy_testnet.yml b/.github/workflows/deploy_testnet.yml index 4d585b7c..b0b7ae62 100644 --- a/.github/workflows/deploy_testnet.yml +++ b/.github/workflows/deploy_testnet.yml @@ -7,9 +7,8 @@ on: release: types: - published - + env: - AWS_REGION: '${{ secrets.AWS_REGION }}' ENVIRONMENT: 'TESTNET' REGISTRY: 'ghcr.io' TAG: 'stable' @@ -55,13 +54,14 @@ jobs: push: true tags: ${{ env.REGISTRY }}/${{ github.repository }}:${{ github.ref_name }} + ######################## region 1 ######################## deploy: needs: push name: deploy runs-on: ubuntu-latest strategy: matrix: - relayer_id: [0, 1, 2] + relayer_id: [0, 1] permissions: contents: read @@ -86,14 +86,66 @@ jobs: variables: | relayerId=${{ matrix.relayer_id }} awsAccountId=${{ env.AWS_TESTNET }} - awsRegion=${{ env.AWS_REGION }} + awsRegion=${{ secrets.AWS_REGION }} awsEfs=${{ secrets.TESTNET_EFS_1 }} - name: configure aws credentials uses: aws-actions/configure-aws-credentials@v1 with: role-to-assume: arn:aws:iam::${{ env.AWS_TESTNET }}:role/github-actions-${{ env.ENVIRONMENT }}-chainbridge - aws-region: ${{ env.AWS_REGION }} + aws-region: ${{ secrets.AWS_REGION }} + role-session-name: GithubActions + + - name: deploy task definition + uses: aws-actions/amazon-ecs-deploy-task-definition@v1 + with: + task-definition: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' + service: 'relayer-${{ matrix.relayer_id }}-service-${{ env.ENVIRONMENT }}' + cluster: 'relayer-${{ env.ENVIRONMENT }}' + wait-for-service-stability: true + + ######################## region 2 ######################## + + ######################## region 3 ######################## + deploy_reg_3: + needs: push + name: deploy region 3 + runs-on: ubuntu-latest + strategy: + matrix: + relayer_id: [2] + + permissions: + contents: read + id-token: write + + steps: + - name: checkout the source code + uses: actions/checkout@v3 + + - name: checkout ecs repo + uses: actions/checkout@v3 + with: + repository: sygmaprotocol/devops + token: ${{ secrets.GHCR_TOKEN }} + + - name: render jinja2 templates to task definition json files + uses: cuchi/jinja2-action@v1.2.0 + with: + template: 'relayers/ecs/task_definition-${{ env.ENVIRONMENT }}.j2' + output_file: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' + data_format: json + variables: | + relayerId=${{ matrix.relayer_id }} + awsAccountId=${{ env.AWS_TESTNET }} + awsRegion=${{ secrets.AWS_REGION_3 }} + awsEfs=${{ secrets.TESTNET_EFS_3 }} + + - name: configure aws credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + role-to-assume: arn:aws:iam::${{ env.AWS_TESTNET }}:role/github-actions-${{ env.ENVIRONMENT }}-chainbridge + aws-region: ${{ secrets.AWS_REGION_3 }} role-session-name: GithubActions - name: deploy task definition From ae91338e07652f3c1a2b3a66356fd8f1e475cda2 Mon Sep 17 00:00:00 2001 From: Idris Isah <58168886+eedygreen@users.noreply.github.com> Date: Tue, 10 Oct 2023 10:45:04 +0100 Subject: [PATCH 4/6] chore: testing regional deployment (#224) --- .github/workflows/deploy_mainnet.yml | 77 +++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 7 deletions(-) diff --git a/.github/workflows/deploy_mainnet.yml b/.github/workflows/deploy_mainnet.yml index 68ad7aef..19cd7534 100644 --- a/.github/workflows/deploy_mainnet.yml +++ b/.github/workflows/deploy_mainnet.yml @@ -18,18 +18,81 @@ on: env: - AWS_REGION: '${{ secrets.AWS_REGION }}' ENVIRONMENT: 'MAINNET' REGISTRY: 'ghcr.io' AWS_MAINNET: '${{ secrets.AWS_MAINNET }}' jobs: - deploy: + ######################## region 1 ######################## + # deploy_region_1: + # name: deploy + # runs-on: ubuntu-latest + # strategy: + # matrix: + # relayer_id: [0, 1] + + # permissions: + # contents: read + # id-token: write + + # steps: + # - name: Authentication + # id: auth + # run: | + # if [ "${{ secrets.AUTH_TOKEN }}" != "${{ github.event.inputs.TOKEN }}" ]; then + # echo "Authentcation failed. Exiting..." + # exit 1 + # fi + # - name: Continue + # if: steps.auth.outcome == 'success' + # run: | + # echo 'Authentication Succeeded!!!' + + # - name: checkout the source code + # uses: actions/checkout@v3 + + # - name: checkout ecs repo + # uses: actions/checkout@v3 + # with: + # repository: sygmaprotocol/devops + # token: ${{ secrets.GHCR_TOKEN }} + + # - name: render jinja2 templates to task definition json files + # uses: cuchi/jinja2-action@v1.2.0 + # with: + # template: 'relayers/ecs/task_definition-${{ env.ENVIRONMENT }}.j2' + # output_file: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' + # data_format: json + # variables: | + # relayerId=${{ matrix.relayer_id }} + # awsAccountId=${{ env.AWS_MAINNET }} + # awsRegion=${{ secrets.AWS_REGION }} + # imageTag=${{ inputs.release_tag }} + # awsEnv=${{ env.ENVIRONMENT }} + # awsEfs=${{ secrets.MAINNET_EFS_1 }} + + # - name: configure aws credentials + # uses: aws-actions/configure-aws-credentials@v1 + # with: + # role-to-assume: arn:aws:iam::${{ env.AWS_MAINNET }}:role/github-actions-${{ env.ENVIRONMENT }}-chainbridge + # aws-region: ${{ secrets.AWS_REGION }} + # role-session-name: GithubActions + + # - name: deploy task definition + # uses: aws-actions/amazon-ecs-deploy-task-definition@v1 + # with: + # task-definition: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' + # service: 'relayer-${{ matrix.relayer_id }}-service-${{ env.ENVIRONMENT }}' + # cluster: 'relayer-${{ env.ENVIRONMENT }}' + # wait-for-service-stability: true + + ######################## region 3 ######################## + deploy_region_3: name: deploy runs-on: ubuntu-latest strategy: matrix: - relayer_id: [0, 1, 2] + relayer_id: [2] permissions: contents: read @@ -66,16 +129,16 @@ jobs: variables: | relayerId=${{ matrix.relayer_id }} awsAccountId=${{ env.AWS_MAINNET }} - awsRegion=${{ env.AWS_REGION }} + awsRegion=${{ secrets.AWS_REGION_3 }} imageTag=${{ inputs.release_tag }} awsEnv=${{ env.ENVIRONMENT }} - awsEfs=${{ secrets.MAINNET_EFS_1 }} + awsEfs=${{ secrets.MAINNET_EFS_3 }} - name: configure aws credentials uses: aws-actions/configure-aws-credentials@v1 with: role-to-assume: arn:aws:iam::${{ env.AWS_MAINNET }}:role/github-actions-${{ env.ENVIRONMENT }}-chainbridge - aws-region: ${{ env.AWS_REGION }} + aws-region: ${{ secrets.AWS_REGION_3 }} role-session-name: GithubActions - name: deploy task definition @@ -84,4 +147,4 @@ jobs: task-definition: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' service: 'relayer-${{ matrix.relayer_id }}-service-${{ env.ENVIRONMENT }}' cluster: 'relayer-${{ env.ENVIRONMENT }}' - wait-for-service-stability: true \ No newline at end of file + wait-for-service-stability: true \ No newline at end of file From fe2df979646002d2cd90800ef5bc7e2dbe613978 Mon Sep 17 00:00:00 2001 From: Idris Isah <58168886+eedygreen@users.noreply.github.com> Date: Tue, 10 Oct 2023 12:17:01 +0100 Subject: [PATCH 5/6] chore: enabled region_1 pipeline (#225) --- .github/workflows/deploy_mainnet.yml | 122 +++++++++++++-------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/.github/workflows/deploy_mainnet.yml b/.github/workflows/deploy_mainnet.yml index 19cd7534..325d0385 100644 --- a/.github/workflows/deploy_mainnet.yml +++ b/.github/workflows/deploy_mainnet.yml @@ -24,67 +24,67 @@ env: jobs: ######################## region 1 ######################## - # deploy_region_1: - # name: deploy - # runs-on: ubuntu-latest - # strategy: - # matrix: - # relayer_id: [0, 1] - - # permissions: - # contents: read - # id-token: write - - # steps: - # - name: Authentication - # id: auth - # run: | - # if [ "${{ secrets.AUTH_TOKEN }}" != "${{ github.event.inputs.TOKEN }}" ]; then - # echo "Authentcation failed. Exiting..." - # exit 1 - # fi - # - name: Continue - # if: steps.auth.outcome == 'success' - # run: | - # echo 'Authentication Succeeded!!!' - - # - name: checkout the source code - # uses: actions/checkout@v3 - - # - name: checkout ecs repo - # uses: actions/checkout@v3 - # with: - # repository: sygmaprotocol/devops - # token: ${{ secrets.GHCR_TOKEN }} - - # - name: render jinja2 templates to task definition json files - # uses: cuchi/jinja2-action@v1.2.0 - # with: - # template: 'relayers/ecs/task_definition-${{ env.ENVIRONMENT }}.j2' - # output_file: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' - # data_format: json - # variables: | - # relayerId=${{ matrix.relayer_id }} - # awsAccountId=${{ env.AWS_MAINNET }} - # awsRegion=${{ secrets.AWS_REGION }} - # imageTag=${{ inputs.release_tag }} - # awsEnv=${{ env.ENVIRONMENT }} - # awsEfs=${{ secrets.MAINNET_EFS_1 }} - - # - name: configure aws credentials - # uses: aws-actions/configure-aws-credentials@v1 - # with: - # role-to-assume: arn:aws:iam::${{ env.AWS_MAINNET }}:role/github-actions-${{ env.ENVIRONMENT }}-chainbridge - # aws-region: ${{ secrets.AWS_REGION }} - # role-session-name: GithubActions - - # - name: deploy task definition - # uses: aws-actions/amazon-ecs-deploy-task-definition@v1 - # with: - # task-definition: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' - # service: 'relayer-${{ matrix.relayer_id }}-service-${{ env.ENVIRONMENT }}' - # cluster: 'relayer-${{ env.ENVIRONMENT }}' - # wait-for-service-stability: true + deploy_region_1: + name: deploy + runs-on: ubuntu-latest + strategy: + matrix: + relayer_id: [0, 1] + + permissions: + contents: read + id-token: write + + steps: + - name: Authentication + id: auth + run: | + if [ "${{ secrets.AUTH_TOKEN }}" != "${{ github.event.inputs.TOKEN }}" ]; then + echo "Authentcation failed. Exiting..." + exit 1 + fi + - name: Continue + if: steps.auth.outcome == 'success' + run: | + echo 'Authentication Succeeded!!!' + + - name: checkout the source code + uses: actions/checkout@v3 + + - name: checkout ecs repo + uses: actions/checkout@v3 + with: + repository: sygmaprotocol/devops + token: ${{ secrets.GHCR_TOKEN }} + + - name: render jinja2 templates to task definition json files + uses: cuchi/jinja2-action@v1.2.0 + with: + template: 'relayers/ecs/task_definition-${{ env.ENVIRONMENT }}.j2' + output_file: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' + data_format: json + variables: | + relayerId=${{ matrix.relayer_id }} + awsAccountId=${{ env.AWS_MAINNET }} + awsRegion=${{ secrets.AWS_REGION }} + imageTag=${{ inputs.release_tag }} + awsEnv=${{ env.ENVIRONMENT }} + awsEfs=${{ secrets.MAINNET_EFS_1 }} + + - name: configure aws credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + role-to-assume: arn:aws:iam::${{ env.AWS_MAINNET }}:role/github-actions-${{ env.ENVIRONMENT }}-chainbridge + aws-region: ${{ secrets.AWS_REGION }} + role-session-name: GithubActions + + - name: deploy task definition + uses: aws-actions/amazon-ecs-deploy-task-definition@v1 + with: + task-definition: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' + service: 'relayer-${{ matrix.relayer_id }}-service-${{ env.ENVIRONMENT }}' + cluster: 'relayer-${{ env.ENVIRONMENT }}' + wait-for-service-stability: true ######################## region 3 ######################## deploy_region_3: From 17300a37be10ece48194021122f3f7ed47baca26 Mon Sep 17 00:00:00 2001 From: mace Date: Wed, 11 Oct 2023 12:47:14 +0200 Subject: [PATCH 6/6] chore(main): release 1.10.0 (#220) --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4e671f6..63f434aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [1.10.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.9.1...v1.10.0) (2023-10-10) + + +### Features + +* enable generic transaction batching ([#217](https://github.com/sygmaprotocol/sygma-relayer/issues/217)) ([67a5ae7](https://github.com/sygmaprotocol/sygma-relayer/commit/67a5ae78dcb4cf5986b74c634bc3e341fd5e3cef)) + + +### Miscellaneous + +* enabled region_1 pipeline ([#225](https://github.com/sygmaprotocol/sygma-relayer/issues/225)) ([fe2df97](https://github.com/sygmaprotocol/sygma-relayer/commit/fe2df979646002d2cd90800ef5bc7e2dbe613978)) +* multi region deployment ([#219](https://github.com/sygmaprotocol/sygma-relayer/issues/219)) ([6b42706](https://github.com/sygmaprotocol/sygma-relayer/commit/6b427066b21b7b647476fb98f9c1c9162cbc371e)) +* testing regional deployment ([#224](https://github.com/sygmaprotocol/sygma-relayer/issues/224)) ([ae91338](https://github.com/sygmaprotocol/sygma-relayer/commit/ae91338e07652f3c1a2b3a66356fd8f1e475cda2)) +* testnet regional deployment ([#222](https://github.com/sygmaprotocol/sygma-relayer/issues/222)) ([d46d870](https://github.com/sygmaprotocol/sygma-relayer/commit/d46d870a720fd56c1d2ffed737cb24df0ddc3519)) +* update aws region ([#221](https://github.com/sygmaprotocol/sygma-relayer/issues/221)) ([bc47380](https://github.com/sygmaprotocol/sygma-relayer/commit/bc47380923447c14a6302e0c92835eb360207af9)) + ## [1.9.1](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.9.0...v1.9.1) (2023-09-04)