Skip to content

Commit

Permalink
Merging 'main' branch (#712)
Browse files Browse the repository at this point in the history
* Adding script for bridge deployment automation. (#675)

* Adding script for bridge deployment automation.

Signed-off-by: Nikolay Nedkov <[email protected]>

* Replacing deprecated 'hedera.GeneratePrivateKey' function with 'hedera.PrivateKeyGenerateEd25519'.

Signed-off-by: Nikolay Nedkov <[email protected]>

* Adding script for extending bridge config for automated bridge setup/… (#686)

* Adding script for extending bridge config for automated bridge setup/deploy.

Signed-off-by: Nikolay Nedkov <[email protected]>

* Fixing import.

Signed-off-by: Nikolay Nedkov <[email protected]>

* Fixing comments.

Signed-off-by: Nikolay Nedkov <[email protected]>

* docs: update stale configuration.md (#688)

Signed-off-by: Antonio Mindov <[email protected]>

* Changing unit to Locale Format for Grafana Balances Panels. (#687)

Signed-off-by: Nikolay Nedkov <[email protected]>

Signed-off-by: Nikolay Nedkov <[email protected]>

* Added a rule for a health check alert (#630) (#689)

* Fix quote escape problem with Prometheus rules

Signed-off-by: Antonio Mindov <[email protected]>

* Adding fix. (#692)

Signed-off-by: Nikolay Nedkov <[email protected]>

Signed-off-by: Nikolay Nedkov <[email protected]>

* Use retry policy values multiplied by seconds (#700)

* Use retry policy values multiplied by seconds

Signed-off-by: Boris Lachev <[email protected]>

* Add tests

Signed-off-by: Boris Lachev <[email protected]>

Signed-off-by: Boris Lachev <[email protected]>

* Adding event handler on bridge config update in 'fee/calculator/servi… (#708)

* Adding event handler on bridge config update in 'fee/calculator/service.go'.

Signed-off-by: Nikolay Nedkov <[email protected]>

* Adding test for bridgeCfgUpdateEventHandler in fee calculator service.

Signed-off-by: Nikolay Nedkov <[email protected]>

Signed-off-by: Nikolay Nedkov <[email protected]>

* Adding gcp logging driver to docker-compose.yml (#693)

Signed-off-by: Nikolay Nedkov <[email protected]>

Signed-off-by: Nikolay Nedkov <[email protected]>

* Changinb to use public RPC urls in æextend-bridge-config.go' (#711)

Signed-off-by: Nikolay Nedkov <[email protected]>

Signed-off-by: Nikolay Nedkov <[email protected]>

Signed-off-by: Nikolay Nedkov <[email protected]>
Signed-off-by: Antonio Mindov <[email protected]>
Signed-off-by: Boris Lachev <[email protected]>
Co-authored-by: Antonio Mindov <[email protected]>
Co-authored-by: Boris Lachev <[email protected]>
  • Loading branch information
3 people authored Aug 19, 2022
1 parent d3458a6 commit 2527d28
Show file tree
Hide file tree
Showing 45 changed files with 1,786 additions and 634 deletions.
14 changes: 7 additions & 7 deletions .github/workflows/mainnet-deploy-to-vms.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,17 @@ jobs:
shell: bash
run: |
echo "TAG=${{ github.event.client_payload.tag }}" > .env && \
echo "${{ secrets.ENV_READ_ONLY }}" >> .env
echo '${{ secrets.ENV_READ_ONLY }}' >> .env
- name: Export application config
shell: bash
run: |
echo "${{ secrets.APP_MAINNET_DAVE_CONFIG }}" > ./node.yml && \
echo "${{ secrets.APP_MAINNET_BRIDGE_CONFIG }}" > ./bridge.yml && \
echo "${{ secrets.APP_MAINNET_ALERT_CONFIG }}" > ./monitoring/alertmanager/config.yml && \
echo "${{ secrets.APP_MAINNET_GRAFANA_CONFIG_ENV }}" > ./monitoring/grafana/config-overrides.env && \
echo "${{ secrets.APP_MAINNET_PROMETHEUS_CONFIG }}" > ./monitoring/prometheus/prometheus.yml && \
echo "${{ secrets.APP_MAINNET_PROMETHEUS_RULES_CONFIG }}" > ./monitoring/prometheus/rules.yml
echo '${{ secrets.APP_MAINNET_DAVE_CONFIG }}' > ./node.yml && \
echo '${{ secrets.APP_MAINNET_BRIDGE_CONFIG }}' > ./bridge.yml && \
echo '${{ secrets.APP_MAINNET_ALERT_CONFIG }}' > ./monitoring/alertmanager/config.yml && \
echo '${{ secrets.APP_MAINNET_GRAFANA_CONFIG_ENV }}' > ./monitoring/grafana/config-overrides.env && \
echo '${{ secrets.APP_MAINNET_PROMETHEUS_CONFIG }}' > ./monitoring/prometheus/prometheus.yml && \
echo '${{ secrets.APP_MAINNET_PROMETHEUS_RULES_CONFIG }}' > ./monitoring/prometheus/rules.yml
- name: Copy files
run: |
Expand Down
40 changes: 20 additions & 20 deletions .github/workflows/testnet-deploy-to-vms.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ jobs:
- name: Export docker .env
shell: bash
run: |
echo "TAG=${{ github.event.client_payload.tag }}" > .env && \
echo "${{ secrets.ENV_TESTNET }}" >> .env
echo 'TAG=${{ github.event.client_payload.tag }}' > .env && \
echo '${{ secrets.ENV_TESTNET }}' >> .env
- name: Export application config
shell: bash
run: |
echo "${{ secrets.APP_TESTNET_ALICE_CONFIG }}" > ./node.yml && \
echo "${{ secrets.APP_TESTNET_BRIDGE_CONFIG }}" > ./bridge.yml
echo '${{ secrets.APP_TESTNET_ALICE_CONFIG }}' > ./node.yml && \
echo '${{ secrets.APP_TESTNET_BRIDGE_CONFIG }}' > ./bridge.yml
- name: Copy files
run: |
Expand All @@ -58,14 +58,14 @@ jobs:
- name: Export docker .env
shell: bash
run: |
echo "TAG=${{ github.event.client_payload.tag }}" > .env && \
echo "${{ secrets.ENV_TESTNET }}" >> .env
echo 'TAG=${{ github.event.client_payload.tag }}' > .env && \
echo '${{ secrets.ENV_TESTNET }}' >> .env
- name: Export application config
shell: bash
run: |
echo "${{ secrets.APP_TESTNET_BOB_CONFIG }}" > ./node.yml && \
echo "${{ secrets.APP_TESTNET_BRIDGE_CONFIG }}" > ./bridge.yml
echo '${{ secrets.APP_TESTNET_BOB_CONFIG }}' > ./node.yml && \
echo '${{ secrets.APP_TESTNET_BRIDGE_CONFIG }}' > ./bridge.yml
- name: Copy files
run: |
Expand All @@ -92,14 +92,14 @@ jobs:
- name: Export docker .env
shell: bash
run: |
echo "TAG=${{ github.event.client_payload.tag }}" > .env && \
echo "${{ secrets.ENV_TESTNET }}" >> .env
echo 'TAG=${{ github.event.client_payload.tag }}' > .env && \
echo '${{ secrets.ENV_TESTNET }}' >> .env
- name: Export application config
shell: bash
run: |
echo "${{ secrets.APP_TESTNET_CAROL_CONFIG }}" > ./node.yml && \
echo "${{ secrets.APP_TESTNET_BRIDGE_CONFIG }}" > ./bridge.yml
echo '${{ secrets.APP_TESTNET_CAROL_CONFIG }}' > ./node.yml && \
echo '${{ secrets.APP_TESTNET_BRIDGE_CONFIG }}' > ./bridge.yml
- name: Copy files
run: |
Expand All @@ -126,18 +126,18 @@ jobs:
- name: Export docker .env
shell: bash
run: |
echo "TAG=${{ github.event.client_payload.tag }}" > .env && \
echo "${{ secrets.ENV_TESTNET }}" >> .env
echo 'TAG=${{ github.event.client_payload.tag }}' > .env && \
echo '${{ secrets.ENV_TESTNET }}' >> .env
- name: Export application config
shell: bash
run: |
echo "${{ secrets.APP_TESTNET_DAVE_CONFIG }}" > ./node.yml && \
echo "${{ secrets.APP_TESTNET_BRIDGE_CONFIG }}" > ./bridge.yml && \
echo "${{ secrets.APP_TESTNET_ALERT_CONFIG }}" > ./monitoring/alertmanager/config.yml && \
echo "${{ secrets.APP_TESTNET_GRAFANA_CONFIG_ENV }}" > ./monitoring/grafana/config-overrides.env && \
echo "${{ secrets.APP_TESTNET_PROMETHEUS_CONFIG }}" > ./monitoring/prometheus/prometheus.yml && \
echo "${{ secrets.APP_TESTNET_PROMETHEUS_RULES_CONFIG }}" > ./monitoring/prometheus/rules.yml
echo '${{ secrets.APP_TESTNET_DAVE_CONFIG }}' > ./node.yml && \
echo '${{ secrets.APP_TESTNET_BRIDGE_CONFIG }}' > ./bridge.yml && \
echo '${{ secrets.APP_TESTNET_ALERT_CONFIG }}' > ./monitoring/alertmanager/config.yml && \
echo '${{ secrets.APP_TESTNET_GRAFANA_CONFIG_ENV }}' > ./monitoring/grafana/config-overrides.env && \
echo '${{ secrets.APP_TESTNET_PROMETHEUS_CONFIG }}' > ./monitoring/prometheus/prometheus.yml && \
echo '${{ secrets.APP_TESTNET_PROMETHEUS_RULES_CONFIG }}' > ./monitoring/prometheus/rules.yml
- name: Copy files
run: |
Expand Down
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,6 @@ testscenario/
.DS_Store

# CodeCav
coverage.txt
coverage.txt

scripts/**/*.yml
6 changes: 4 additions & 2 deletions app/clients/hedera/mirror-node/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ type Client struct {
func NewClient(mirrorNode config.MirrorNode) *Client {
httpC := &http.Client{
Transport: http.DefaultTransport,
Timeout: time.Second * mirrorNode.RequestTimeout,
Timeout: time.Second * time.Duration(mirrorNode.RequestTimeout),
}

rp := mirrorNode.RetryPolicy
Expand All @@ -69,7 +69,9 @@ func NewClient(mirrorNode config.MirrorNode) *Client {
httpretry.WithRetryPolicy(httpHelper.RetryPolicy),
httpretry.WithBackoffPolicy(
httpretry.ExponentialBackoff(
rp.MinWait, rp.MaxWait, rp.MaxJitter)),
time.Duration(rp.MinWait)*time.Second,
time.Duration(rp.MaxWait)*time.Second,
time.Duration(rp.MaxJitter)*time.Second)),
)
return &Client{
mirrorAPIAddress: mirrorNode.ApiAddress,
Expand Down
62 changes: 32 additions & 30 deletions app/services/assets/assets.go
Original file line number Diff line number Diff line change
Expand Up @@ -276,18 +276,40 @@ func (a *Service) fetchHederaFungibleAssetInfo(
return assetInfo, err
}

assetInfoResponse, e := mirrorNode.GetToken(assetId)
if e != nil {
a.logger.Errorf("Hedera Mirror Node method GetToken for Asset [%s] - Error: [%s]", assetId, e)
} else {
assetInfo.Name = assetInfoResponse.Name
assetInfo.Symbol = assetInfoResponse.Symbol
parsedDecimals, _ := strconv.Atoi(assetInfoResponse.Decimals)
assetInfo.Decimals = uint8(parsedDecimals)
assetInfo.ReserveAmount, err = a.getHederaTokenReserveAmount(assetId, isNative, hederaTokenBalances, assetInfoResponse)
assetInfoResponse, err := mirrorNode.GetToken(assetId)
if err != nil {
a.logger.Errorf("Hedera Mirror Node method GetToken for Asset [%s] - Error: [%s]", assetId, err)
return nil, err
}

return assetInfo, err
assetInfo.Name = assetInfoResponse.Name
assetInfo.Symbol = assetInfoResponse.Symbol
parsedDecimals, _ := strconv.Atoi(assetInfoResponse.Decimals)
assetInfo.Decimals = uint8(parsedDecimals)
assetInfo.ReserveAmount, err = a.getHederaTokenReserveAmount(assetId, isNative, hederaTokenBalances, assetInfoResponse)

return assetInfo, nil
}

func (a *Service) fetchHederaNonFungibleAssetInfo(
assetId string,
mirrorNode client.MirrorNode,
isNative bool,
hederaTokenBalances map[string]int,
) (assetInfo *assetModel.NonFungibleAssetInfo, err error) {

assetInfo = &assetModel.NonFungibleAssetInfo{}
assetInfoResponse, err := mirrorNode.GetToken(assetId)
if err != nil {
a.logger.Errorf("Hedera Mirror Node method GetToken for Asset [%s] - Error: [%s]", assetId, err)
return nil, err
}

assetInfo.Name = assetInfoResponse.Name
assetInfo.Symbol = assetInfoResponse.Symbol
assetInfo.ReserveAmount, err = a.getHederaTokenReserveAmount(assetId, isNative, hederaTokenBalances, assetInfoResponse)

return assetInfo, nil
}

func (a *Service) loadFungibleAssetInfos(
Expand Down Expand Up @@ -324,26 +346,6 @@ func (a *Service) loadFungibleAssetInfos(
}
}

func (a *Service) fetchHederaNonFungibleAssetInfo(
assetId string,
mirrorNode client.MirrorNode,
isNative bool,
hederaTokenBalances map[string]int,
) (assetInfo *assetModel.NonFungibleAssetInfo, err error) {

assetInfo = &assetModel.NonFungibleAssetInfo{}
assetInfoResponse, e := mirrorNode.GetToken(assetId)
if e != nil {
a.logger.Errorf("Hedera Mirror Node method GetToken for Asset [%s] - Error: [%s]", assetId, e)
} else {
assetInfo.Name = assetInfoResponse.Name
assetInfo.Symbol = assetInfoResponse.Symbol
assetInfo.ReserveAmount, err = a.getHederaTokenReserveAmount(assetId, isNative, hederaTokenBalances, assetInfoResponse)
}

return assetInfo, err
}

func (a *Service) getHederaTokenReserveAmount(
assetId string,
isNative bool,
Expand Down
28 changes: 25 additions & 3 deletions app/services/fee/calculator/calculator.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@
package calculator

import (
"errors"
"fmt"
"github.com/gookit/event"
bridge_config_event "github.com/limechain/hedera-eth-bridge-validator/app/model/bridge-config-event"
"github.com/limechain/hedera-eth-bridge-validator/config"
"github.com/limechain/hedera-eth-bridge-validator/constants"
log "github.com/sirupsen/logrus"
Expand All @@ -33,10 +37,15 @@ func New(feePercentages map[string]int64) *Service {
log.Fatalf("[%s] Invalid fee percentage: [%d]", token, fee)
}
}

return &Service{
instance := &Service{
feePercentages: feePercentages,
logger: config.GetLoggerFor("Fee Service")}
logger: config.GetLoggerFor("Fee Service"),
}
event.On(constants.EventBridgeConfigUpdate, event.ListenerFunc(func(e event.Event) error {
return bridgeCfgUpdateEventHandler(e, instance)
}), constants.AssetServicePriority)

return instance
}

// CalculateFee calculates the fee and remainder of a given token and amount
Expand All @@ -51,3 +60,16 @@ func (s Service) CalculateFee(token string, amount int64) (fee, remainder int64)

return fee, remainder
}

func bridgeCfgUpdateEventHandler(e event.Event, instance *Service) error {
params, ok := e.Get(constants.BridgeConfigUpdateEventParamsKey).(*bridge_config_event.Params)
if !ok {
errMsg := fmt.Sprintf("failed to cast params from event [%s]", constants.EventBridgeConfigUpdate)
log.Errorf(errMsg)
return errors.New(errMsg)
}

instance.feePercentages = params.Bridge.Hedera.FeePercentages

return nil
}
21 changes: 21 additions & 0 deletions app/services/fee/calculator/calculator_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package calculator

import (
"github.com/gookit/event"
bridge_config_event "github.com/limechain/hedera-eth-bridge-validator/app/model/bridge-config-event"
"github.com/limechain/hedera-eth-bridge-validator/config"
"github.com/limechain/hedera-eth-bridge-validator/constants"
"github.com/stretchr/testify/assert"
"testing"
)
Expand Down Expand Up @@ -33,3 +36,21 @@ func Test_CalculateFee(t *testing.T) {
assert.Equal(t, expectedFee, fee)
assert.Equal(t, expectedRemainder, remainder)
}

func Test_bridgeCfgUpdateEventHandler(t *testing.T) {
service := New(feePercentages)

newFeePercentages := make(map[string]int64)
for tokenName, feeAmount := range service.feePercentages {
newFeePercentages[tokenName] = feeAmount + 1
}
event.MustFire(constants.EventBridgeConfigUpdate, event.M{constants.BridgeConfigUpdateEventParamsKey: &bridge_config_event.Params{
Bridge: &config.Bridge{
Hedera: &config.BridgeHedera{
FeePercentages: newFeePercentages,
},
},
}})

assert.Equal(t, newFeePercentages, service.feePercentages)
}
12 changes: 9 additions & 3 deletions bootstrap/clients.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package bootstrap

import (
"context"

"github.com/ethereum/go-ethereum/common"
"github.com/gookit/event"
coin_gecko "github.com/limechain/hedera-eth-bridge-validator/app/clients/coin-gecko"
Expand Down Expand Up @@ -51,7 +50,7 @@ type Clients struct {

// PrepareClients instantiates all the necessary clients for a validator node
func PrepareClients(clientsCfg config.Clients, bridgeEvmsCfgs map[uint64]config.BridgeEvm, networks map[uint64]*parser.Network) *Clients {
EvmClients := InitEVMClients(clientsCfg)
EvmClients := InitEVMClients(clientsCfg, networks)
instance := &Clients{
HederaNode: hedera.NewNodeClient(clientsCfg.Hedera),
MirrorNode: mirrornode.NewClient(clientsCfg.MirrorNode),
Expand Down Expand Up @@ -109,9 +108,13 @@ func bridgeCfgEventHandler(e event.Event, instance *Clients) error {
return nil
}

func InitEVMClients(clientsCfg config.Clients) map[uint64]client.EVM {
func InitEVMClients(clientsCfg config.Clients, networks map[uint64]*parser.Network) map[uint64]client.EVM {
EVMClients := make(map[uint64]client.EVM)
for configChainId, ec := range clientsCfg.Evm {
network, ok := networks[configChainId]
if !ok || network.RouterContractAddress == "" {
continue
}
EVMClients[configChainId] = evm.NewClient(ec, configChainId)
clientChainId, e := EVMClients[configChainId].ChainID(context.Background())
if e != nil {
Expand All @@ -128,6 +131,9 @@ func InitEVMClients(clientsCfg config.Clients) map[uint64]client.EVM {
func InitRouterClients(bridgeEVMsCfgs map[uint64]config.BridgeEvm, evmClients map[uint64]client.EVM) map[uint64]client.DiamondRouter {
routers := make(map[uint64]client.DiamondRouter)
for networkId, bridgeEVMsCfg := range bridgeEVMsCfgs {
if bridgeEVMsCfg.RouterContractAddress == "" {
continue
}
evmClient, ok := evmClients[networkId]
if !ok {
log.Fatalf("failed to initialize RouterClient because of missing EVM client for network id: [%d]", networkId)
Expand Down
6 changes: 4 additions & 2 deletions bootstrap/services.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package bootstrap

import (
"fmt"

"github.com/hashgraph/hedera-sdk-go/v2"
"github.com/limechain/hedera-eth-bridge-validator/app/domain/service"
"github.com/limechain/hedera-eth-bridge-validator/app/services/assets"
Expand Down Expand Up @@ -88,7 +87,10 @@ func PrepareServices(c *config.Config, parsedBridge *parser.Bridge, clients *Cli
for _, client := range clients.EvmClients {
chainId := client.GetChainID()
evmSigners[chainId] = evm.NewEVMSigner(client.GetPrivateKey())
contractServices[chainId] = contracts.NewService(client, c.Bridge.EVMs[chainId].RouterContractAddress, clients.RouterClients[chainId])
evmConfig, ok := c.Bridge.EVMs[chainId]
if ok && evmConfig.RouterContractAddress != "" {
contractServices[chainId] = contracts.NewService(client, evmConfig.RouterContractAddress, clients.RouterClients[chainId])
}
}

fees := calculator.New(c.Bridge.Hedera.FeePercentages)
Expand Down
Loading

0 comments on commit 2527d28

Please sign in to comment.