Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions .github/workflows/oicd-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,15 +101,15 @@ jobs:
"NEXT_PUBLIC_DEFAULT_CHAIN_ID=1"
"NEXT_PUBLIC_COOKIES_WARNING_ENABLED=true"
"NEXT_PUBLIC_POLLING_INTERVAL=10000"
"NEXT_PUBLIC_RPC_MAINNET=https://rpc.eu-central-1.gateway.fm/v4/ethereum/non-archival/mainnet?apiKey=LXyRambFCpLn3HqgKKRluyfH8RHpf_qT.xOmQXGPVWlOlaDSK"
"NEXT_PUBLIC_RPC_GNOSIS=https://rpc.gnosischain.com"
"NEXT_PUBLIC_RPC_CHIADO=https://rpc.chiadochain.net"
"NEXT_PUBLIC_RPC_MAINNET=${{ secrets.DEV_RPC_MAINNET }}"
"NEXT_PUBLIC_RPC_GNOSIS=${{ secrets.DEV_RPC_GNOSIS }}"
"NEXT_PUBLIC_WALLET_CONNECT_DAPP_URL=${{ secrets.WALLET_CONNECT_URL }}"
"NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID=${{ secrets.WALLET_CONNECT_PROJECT_ID }}"
"NEXT_PUBLIC_SUBGRAPH_ENVIRONMENT=development"
"NEXT_PUBLIC_SUBGRAPH_ACCESS_ID=${{ secrets.GRAPH_ORG }}"
"NEXT_PUBLIC_SUBGRAPH_CHAINS_RESOURCE_IDS=100:${{ inputs.dev_subgraph_gc }},1:${{ inputs.dev_subgraph_mainnet }}"
"NEXT_PUBLIC_ALCHEMY_API_KEY=${{ secrets.DEV_NEXT_PUBLIC_ALCHEMY_API_KEY }}"
"NEXT_PUBLIC_ENVIO_INDEXER_URL=${{ secrets.DEV_ENVIO_INDEXER_URL }}"

- name: Build, tag, and push STAGING to Amazon ECR
if: startsWith(github.ref, 'refs/heads/staging')
Expand All @@ -130,15 +130,15 @@ jobs:
"NEXT_PUBLIC_DEFAULT_CHAIN_ID=1"
"NEXT_PUBLIC_COOKIES_WARNING_ENABLED=true"
"NEXT_PUBLIC_POLLING_INTERVAL=10000"
"NEXT_PUBLIC_RPC_MAINNET=https://rpc.eu-central-1.gateway.fm/v4/ethereum/non-archival/mainnet?apiKey=LXyRambFCpLn3HqgKKRluyfH8RHpf_qT.xOmQXGPVWlOlaDSK"
"NEXT_PUBLIC_RPC_GNOSIS=https://rpc.gnosischain.com"
"NEXT_PUBLIC_RPC_CHIADO=https://rpc.chiadochain.net"
"NEXT_PUBLIC_RPC_MAINNET=${{ secrets.PROD_RPC_MAINNET }}"
"NEXT_PUBLIC_RPC_GNOSIS=${{ secrets.PROD_RPC_MAINNET }}"
"NEXT_PUBLIC_WALLET_CONNECT_DAPP_URL=${{ secrets.WALLET_CONNECT_URL }}"
"NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID=${{ secrets.WALLET_CONNECT_PROJECT_ID }}"
"NEXT_PUBLIC_SUBGRAPH_ENVIRONMENT=production"
"NEXT_PUBLIC_SUBGRAPH_ACCESS_ID=${{ secrets.THEGRAPH_READ_API_KEY }}"
"NEXT_PUBLIC_SUBGRAPH_CHAINS_RESOURCE_IDS=100:2ths6FTZhCBggnyakh7PL5KH91zjRv8xPNfzaCRKogJ,1:9W7Ye5xFfefNYDxXD4StqAuj7TU8eLq5PLmuPUnhFbeQ"
"NEXT_PUBLIC_ALCHEMY_API_KEY=${{ secrets.DEV_NEXT_PUBLIC_ALCHEMY_API_KEY }}"
"NEXT_PUBLIC_ENVIO_INDEXER_URL=${{ secrets.PROD_ENVIO_INDEXER_URL }}"

Get_images_and_restart_deployments:
needs: Build_and_push_image_to_ECR
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/publish-ecr-image-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -94,12 +94,12 @@ jobs:
"NEXT_PUBLIC_DEFAULT_CHAIN_ID=1"
"NEXT_PUBLIC_COOKIES_WARNING_ENABLED=true"
"NEXT_PUBLIC_POLLING_INTERVAL=10000"
"NEXT_PUBLIC_RPC_MAINNET=https://rpc.eu-central-1.gateway.fm/v4/ethereum/non-archival/mainnet?apiKey=LXyRambFCpLn3HqgKKRluyfH8RHpf_qT.xOmQXGPVWlOlaDSK"
"NEXT_PUBLIC_RPC_GNOSIS=https://rpc.gnosischain.com"
"NEXT_PUBLIC_RPC_CHIADO=https://rpc.chiadochain.net"
"NEXT_PUBLIC_RPC_MAINNET=${{ secrets.PROD_RPC_MAINNET }}"
"NEXT_PUBLIC_RPC_GNOSIS=${{ secrets.PROD_RPC_MAINNET }}"
"NEXT_PUBLIC_WALLET_CONNECT_DAPP_URL=${{ secrets.WALLET_CONNECT_URL }}"
"NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID=${{ secrets.WALLET_CONNECT_PROJECT_ID }}"
"NEXT_PUBLIC_SUBGRAPH_ENVIRONMENT=production"
"NEXT_PUBLIC_SUBGRAPH_ACCESS_ID=${{ secrets.THEGRAPH_READ_API_KEY }}"
"NEXT_PUBLIC_SUBGRAPH_CHAINS_RESOURCE_IDS=100:2ths6FTZhCBggnyakh7PL5KH91zjRv8xPNfzaCRKogJ,1:9W7Ye5xFfefNYDxXD4StqAuj7TU8eLq5PLmuPUnhFbeQ"
"NEXT_PUBLIC_ALCHEMY_API_KEY=${{ secrets.PROD_NEXT_PUBLIC_ALCHEMY_API_KEY }}"
"NEXT_PUBLIC_ENVIO_INDEXER_URL=${{ secrets.PROD_ENVIO_INDEXER_URL }}"
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.local
2 changes: 2 additions & 0 deletions app/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,5 @@ NEXT_PUBLIC_SUBGRAPH_CHAINS_RESOURCE_IDS=
# dev: chainId:Tag | prod: chainId:subgraphId

NEXT_PUBLIC_ALCHEMY_API_KEY=

NEXT_PUBLIC_ENVIO_INDEXER_URL=
20 changes: 20 additions & 0 deletions app/src/constants/config/indexer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { GraphQLClient, RequestDocument, Variables } from 'graphql-request'

const DEFAULT_ENVIO_URL =
process.env.NEXT_PUBLIC_ENVIO_INDEXER_URL || 'http://localhost:8080/v1/graphql'

const BACKEND = (process.env.NEXT_PUBLIC_INDEXER_BACKEND || 'envio').toLowerCase() as
| 'envio'
| 'subgraph'

export const isEnvioBackend = () => BACKEND === 'envio'

export const getEnvioGraphqlClient = <Response = unknown, Vars extends Variables = Variables>() => {
const client = new GraphQLClient(DEFAULT_ENVIO_URL)
return async <R = Response, V extends Variables = Vars>(
query: RequestDocument,
variables?: V,
) => {
return client.request<R, V>(query, variables)
}
}
12 changes: 7 additions & 5 deletions app/src/hooks/useLookupBridgedToken.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import memoize from 'lodash/memoize'
import { useEffect, useMemo, useState } from 'react'

import { Chains, getNetworkConfig } from '@/src/constants/config/chains'
import { NATIVE_TOKEN_ADDRESS } from '@/src/constants/config/common'
import { useDaiToken } from '@/src/hooks/useDaiToken'
import { useBridgedTokens } from '@/src/providers/tokenListProvider'
import { formatNumber } from '@/src/utils/format'
Expand Down Expand Up @@ -76,17 +77,18 @@ export const useLookupBridgedToken = ({

const isMainnetToken = initiatorNetwork === 'mainnet'
tokenAddress = tokenAddress?.toLowerCase()
const isXdaiBridge = bridgeName === 'XDAI'
const isZeroToken = tokenAddress === constants.AddressZero
const isNativeInXdaiBridge = isXdaiBridge && isZeroToken
const isXdaiBridge = (bridgeName ?? '').toUpperCase() === 'XDAI'
const isNativeAddress =
tokenAddress === constants.AddressZero || isSameString(tokenAddress, NATIVE_TOKEN_ADDRESS)
const isNativeInXdaiBridge = isXdaiBridge && isNativeAddress
const [token, setToken] = useState<UniswapToken | undefined>()
const xDaiBridgedToken = isNativeInXdaiBridge ? mainnetDaiToken : gnosisXdaiToken

useEffect(() => {
// have to check if the component is still mounted before setting the state
let isMounted = true

if (!isXdaiBridge && !isZeroToken) {
if (!isXdaiBridge && !isNativeAddress) {
lookupToken(tokenAddress, isMainnetToken, tokenList)
.then((data) => {
if (isMounted) {
Expand Down Expand Up @@ -116,7 +118,7 @@ export const useLookupBridgedToken = ({
isMainnetToken,
isNativeInXdaiBridge,
isXdaiBridge,
isZeroToken,
isNativeAddress,
tokenAddress,
tokenList,
tokensByAddress,
Expand Down
2 changes: 1 addition & 1 deletion app/src/pagePartials/bridgeExplorer/validators/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ export const ValidatorsSkeleton: React.FC = () => (
export const Validators: React.FC = ({ ...restProps }) => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const { refetch } = useValidators(Bridges.amb)
const { refetch } = useValidators(BridgesConfig.amb)

/**
* Call refetch to bring the last validator's activity
Expand Down
65 changes: 38 additions & 27 deletions app/src/providers/validatorsProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,39 +37,50 @@ const fetcher = async () => {
const homeProvider = gnosis()
const validatorsData = await fetchHomeValidators()

const validatorsPromises = validatorsData
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
.filter((v) => getValidatorByAddress(v.address, v.bridgeType!))
.map(async (v) => {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const val = getValidatorByAddress(v.address, v.bridgeType!)
if (!val) throw new Error('Validator not found')

const validatorAddress =
v.address.toLowerCase() === TELEPATHY_VALIDATOR_ADDRESS.toLowerCase()
? TELEPATHY_VALIDATOR_ADDRESS_REPLACED
: v.address
const balanceHomeValue = await getBalance(validatorAddress, homeProvider)

return {
...val,
lastSeen: fromSubgraphTimestamp(v.lastActivity),
signed: v.signed.length,
executed: v.executed.length,
balanceHome: {
token: chainsConfig[Chains.gnosis].token,
chain: chainsConfig[Chains.gnosis].name,
value: balanceHomeValue,
},
}
})
const validatorsPromises = validatorsData.map(async (v) => {
const staticVal = v.bridgeType
? getValidatorByAddress(v.address, v.bridgeType as BridgesValues)
: undefined

// Telepathy replacement only for balance call
const balanceAddr =
v.address.toLowerCase() === TELEPATHY_VALIDATOR_ADDRESS.toLowerCase()
? TELEPATHY_VALIDATOR_ADDRESS_REPLACED
: v.address
const balanceHomeValue = await getBalance(balanceAddr, homeProvider)

const name = v.name || staticVal?.name || v.address
const shortName = staticVal?.shortName || name

const validator: Validator = {
address: v.address.toLowerCase(),
name,
bridgeType: (v.bridgeType || (staticVal?.bridgeType as any) || '') as any,
shortName,
status: undefined as any,
lastSeen: fromSubgraphTimestamp(v.lastActivity),
signed: Array.isArray(v.signed) ? v.signed.length : 0,
executed: Array.isArray(v.executed) ? v.executed.length : 0,
balanceHome: {
token: chainsConfig[Chains.gnosis].token,
chain: chainsConfig[Chains.gnosis].name,
value: balanceHomeValue,
},
scanUrl: undefined,
}

return validator
})

const validators = await Promise.all(validatorsPromises)

const res = cloneDeep(defaultValidators)

validators.forEach((v) => {
res[v.bridgeType.toUpperCase() as BridgesValues].push(v)
const key = (v.bridgeType || '').toUpperCase() as BridgesValues
if (res[key]) {
res[key].push(v)
}
})

return res
Expand Down
34 changes: 34 additions & 0 deletions app/src/queries/transactions.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import gql from 'graphql-tag'
import { RequestDocument } from 'graphql-request'

const TRANSACTION_FRAGMENT = gql`
fragment TransactionFragment on Transaction {
Expand Down Expand Up @@ -51,3 +52,36 @@ export const TRANSACTION_QUERY = gql`

${TRANSACTION_FRAGMENT}
`

export const ENVIO_TRANSACTIONS_QUERY = `
query EnvioTransactions($where: Transaction_bool_exp, $order_by: [Transaction_order_by!], $limit: Int, $offset: Int) {
Transaction(where: $where, order_by: $order_by, limit: $limit, offset: $offset) {
id
messageId
bridgeType
transactionHash
timestamp
initiatorNetwork
initiator
initiatorToken
initiatorAmount
receiverNetwork
receiver
receiverToken
receiverAmount
transactionStatus
execution {
id
transactionHash
timestamp
executorAddress
}
validations {
id
transactionHash
timestamp
validatorAddress
}
}
}
` as RequestDocument
27 changes: 27 additions & 0 deletions app/src/queries/validators.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import gql from 'graphql-tag'
import { RequestDocument } from 'graphql-request'

// @todo filter for signed/executed property does not work as expected
export const VALIDATORS_QUERY = gql`
Expand All @@ -18,3 +19,29 @@ export const VALIDATORS_QUERY = gql`
}
}
`

export const ENVIO_VALIDATORS_QUERY = `
query EnvioValidators {
Validator(where: { removed: { _eq: false } }) {
id
name
bridgeType
address
lastActivity
signed(order_by: { timestamp: desc }, limit: 10) { id }
executed(order_by: { timestamp: desc }, limit: 10) { id }
}
}
` as RequestDocument

export const ENVIO_VALIDATORS_ACTIVITY_QUERY = `
query EnvioValidatorsActivity($after: numeric!) {
Validator(where: { removed: { _eq: false } }) {
address
name
bridgeType
signed(where: { timestamp: { _gt: $after } }) { id }
executed(where: { timestamp: { _gt: $after } }) { id }
}
}
` as RequestDocument
Loading