Skip to content
Draft
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
3 changes: 2 additions & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,10 @@ jobs:
github-token: ${{ secrets.GITHUB_TOKEN }} # Adds a coverage summary comment to the PR.

- name: Verify minimum coverage
uses: zgosalvez/github-actions-report-lcov@v2
uses: zgosalvez/github-actions-report-lcov@v7
with:
coverage-files: ./lcov.info
genhtml-ignore-errors: inconsistent
minimum-coverage: 70 # Set coverage threshold.

lint:
Expand Down
12 changes: 6 additions & 6 deletions frontend/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ SEPOLIA_RPC_URL=yourSepoliaRpcUrl
BASE_RPC_URL=yourBaseRpcUrl
WALLET_CONNECT_PROJECT_ID=yourId

MAINNET_SUBGRAPH_URL=
OPTIMISM_SUBGRAPH_URL=
POLYGON_SUBGRAPH_URL=
BASE_SUBGRAPH_URL=
ARBITRUM_ONE_SUBGRAPH_URL=
SEPOLIA_SUBGRAPH_URL=
MAINNET_SUBGRAPH_URL=yourMainnetSubgraphUrl
OPTIMISM_SUBGRAPH_URL=yourOptimismSubgraphUrl
POLYGON_SUBGRAPH_URL=yourPolygonSubgraphUrl
BASE_SUBGRAPH_URL=yourBaseSubgraphUrl
ARBITRUM_ONE_SUBGRAPH_URL=yourArbitrumOneSubgraphUrl
SEPOLIA_SUBGRAPH_URL=yourSepoliaSubgraphUrl

LOG_LEVEL=DEBUG
MAINTENANCE_MODE_SEND=0
10 changes: 8 additions & 2 deletions frontend/src/store/wallet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,13 @@ import {
TokenInfoExtended,
} from 'components/models';
import { formatNameOrAddress, lookupEnsName, lookupCnsName } from 'src/utils/address';
import { ERC20_ABI, MAINNET_PROVIDER, MULTICALL_ABI, MULTICALL_ADDRESS } from 'src/utils/constants';
import {
ERC20_ABI,
MAINNET_PROVIDER,
MULTICALL_ABI,
MULTICALL_ADDRESS,
getUmbraChainConfig,
} from 'src/utils/constants';
import { BigNumber, Contract, ExternalProvider, Web3Provider, parseUnits } from 'src/utils/ethers';
import { UmbraApi } from 'src/utils/umbra-api';
import { getChainById } from 'src/utils/utils';
Expand Down Expand Up @@ -307,7 +313,7 @@ export default function useWalletStore() {
// - https://github.com/vuejs/vue-next/issues/3024
// - https://stackoverflow.com/questions/65693108/threejs-component-working-in-vuejs-2-but-not-3
// - https://vuejs.org/api/reactivity-advanced.html#markraw
umbra.value = markRaw(new Umbra(provider.value, newChainId));
umbra.value = markRaw(new Umbra(provider.value, getUmbraChainConfig(newChainId)));
stealthKeyRegistry.value = markRaw(new StealthKeyRegistry(signer.value));

// Setup to check if user is connected with Argent, since we need to handle a few things differently in that case.
Expand Down
63 changes: 63 additions & 0 deletions frontend/src/utils/constants.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { ChainConfig } from '@umbracash/umbra-js';
import { StaticJsonRpcProvider } from 'src/utils/ethers';

export const MAINNET_RPC_URL = String(process.env.MAINNET_RPC_URL);
Expand All @@ -8,9 +9,71 @@ export const OPTIMISM_RPC_URL = String(process.env.OPTIMISM_RPC_URL);
export const ARBITRUM_ONE_RPC_URL = String(process.env.ARBITRUM_ONE_RPC_URL);
export const SEPOLIA_RPC_URL = String(process.env.SEPOLIA_RPC_URL);
export const BASE_RPC_URL = String(process.env.BASE_RPC_URL);
export const MAINNET_SUBGRAPH_URL = String(process.env.MAINNET_SUBGRAPH_URL || '');
export const OPTIMISM_SUBGRAPH_URL = String(process.env.OPTIMISM_SUBGRAPH_URL || '');
export const POLYGON_SUBGRAPH_URL = String(process.env.POLYGON_SUBGRAPH_URL || '');
export const BASE_SUBGRAPH_URL = String(process.env.BASE_SUBGRAPH_URL || '');
export const ARBITRUM_ONE_SUBGRAPH_URL = String(process.env.ARBITRUM_ONE_SUBGRAPH_URL || '');
export const SEPOLIA_SUBGRAPH_URL = String(process.env.SEPOLIA_SUBGRAPH_URL || '');

console.log(`MAINNET_RPC_URL ${MAINNET_RPC_URL}`);

const UMBRA_ADDRESS = '0xFb2dc580Eed955B528407b4d36FfaFe3da685401';
const BATCH_SEND_ADDRESS = '0xDbD0f5EBAdA6632Dde7d47713ea200a7C2ff91EB';

const toOptionalSubgraphUrl = (value: string): string | false => {
return value.length > 0 ? value : false;
};

const umbraChainConfigs: Record<number, ChainConfig> = {
1: {
chainId: 1,
umbraAddress: UMBRA_ADDRESS,
batchSendAddress: BATCH_SEND_ADDRESS,
startBlock: 12343914,
subgraphUrl: toOptionalSubgraphUrl(MAINNET_SUBGRAPH_URL),
},
10: {
chainId: 10,
umbraAddress: UMBRA_ADDRESS,
batchSendAddress: BATCH_SEND_ADDRESS,
startBlock: 4069556,
subgraphUrl: toOptionalSubgraphUrl(OPTIMISM_SUBGRAPH_URL),
},
137: {
chainId: 137,
umbraAddress: UMBRA_ADDRESS,
batchSendAddress: BATCH_SEND_ADDRESS,
startBlock: 20717318,
subgraphUrl: toOptionalSubgraphUrl(POLYGON_SUBGRAPH_URL),
},
8453: {
chainId: 8453,
umbraAddress: UMBRA_ADDRESS,
batchSendAddress: BATCH_SEND_ADDRESS,
startBlock: 10761374,
subgraphUrl: toOptionalSubgraphUrl(BASE_SUBGRAPH_URL),
},
42161: {
chainId: 42161,
umbraAddress: UMBRA_ADDRESS,
batchSendAddress: BATCH_SEND_ADDRESS,
startBlock: 7285883,
subgraphUrl: toOptionalSubgraphUrl(ARBITRUM_ONE_SUBGRAPH_URL),
},
11155111: {
chainId: 11155111,
umbraAddress: UMBRA_ADDRESS,
batchSendAddress: BATCH_SEND_ADDRESS,
startBlock: 3590825,
subgraphUrl: toOptionalSubgraphUrl(SEPOLIA_SUBGRAPH_URL),
},
};

export const getUmbraChainConfig = (chainId: number): ChainConfig | number => {
return umbraChainConfigs[chainId] || chainId;
};

export const ETH_NETWORK_LOGO = 'data:image/png;base64,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'; // prettier-ignore

export const ERC20_ABI = [
Expand Down
6 changes: 6 additions & 0 deletions umbra-js/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,9 @@ POLYGON_RPC_URL=yourPolygonRpcUrl
ARBITRUM_ONE_RPC_URL=yourArbitrumOneRpcUrl
SEPOLIA_RPC_URL=yourSepoliaRpcUrl
BASE_RPC_URL=yourBaseRpcUrl
MAINNET_SUBGRAPH_URL=yourMainnetSubgraphUrl
OPTIMISM_SUBGRAPH_URL=yourOptimismSubgraphUrl
POLYGON_SUBGRAPH_URL=yourPolygonSubgraphUrl
BASE_SUBGRAPH_URL=yourBaseSubgraphUrl
ARBITRUM_ONE_SUBGRAPH_URL=yourArbitrumOneSubgraphUrl
SEPOLIA_SUBGRAPH_URL=yourSepoliaSubgraphUrl
110 changes: 82 additions & 28 deletions umbra-js/src/classes/Umbra.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import {
getBlockNumberUserRegistered,
assertSupportedAddress,
checkSupportedAddresses,
recursiveGraphFetch,
recursiveCompatibleGraphFetch,
} from '../utils/utils';
import { Umbra as UmbraContract, Umbra__factory, ERC20__factory } from '../typechain';
import { ETH_ADDRESS, UMBRA_BATCH_SEND_ABI } from '../utils/constants';
Expand All @@ -43,15 +43,33 @@ import { compressedPublicKeyFromX } from '../utils/sharedSecret';
// Mapping from chainId to contract information
const umbraAddress = '0xFb2dc580Eed955B528407b4d36FfaFe3da685401'; // same on all supported networks
const batchSendAddress = '0xDbD0f5EBAdA6632Dde7d47713ea200a7C2ff91EB'; // same on all supported networks
const subgraphs = {
1: String(process.env.MAINNET_SUBGRAPH_URL),
10: String(process.env.OPTIMISM_SUBGRAPH_URL),
137: String(process.env.POLYGON_SUBGRAPH_URL),
8453: String(process.env.BASE_SUBGRAPH_URL),
42161: String(process.env.ARBITRUM_ONE_SUBGRAPH_URL),
11155111: String(process.env.SEPOLIA_SUBGRAPH_URL),
const getOptionalEnv = (name: string): string | false => {
const value = process.env[name];
return value && value.length > 0 ? value : false;
};

const subgraphs: Record<number, string | false> = {
1: getOptionalEnv('MAINNET_SUBGRAPH_URL'),
10: getOptionalEnv('OPTIMISM_SUBGRAPH_URL'),
137: getOptionalEnv('POLYGON_SUBGRAPH_URL'),
8453: getOptionalEnv('BASE_SUBGRAPH_URL'),
42161: getOptionalEnv('ARBITRUM_ONE_SUBGRAPH_URL'),
11155111: getOptionalEnv('SEPOLIA_SUBGRAPH_URL'),
};

const normalizePonderAnnouncement = (item: Record<string, unknown>): SubgraphAnnouncement => ({
amount: String(item.amount),
block: String(item.blockNumber),
ciphertext: String(item.ciphertext),
from: String(item.from),
id: String(item.id),
pkx: String(item.pkx),
receiver: String(item.receiver),
timestamp: String(item.timestamp),
token: String(item.token),
txHash: String(item.txHash),
});

const chainConfigs: Record<number, ChainConfig> = {
1: { chainId: 1, umbraAddress, batchSendAddress, startBlock: 12343914, subgraphUrl: subgraphs[1] }, // Mainnet
10: { chainId: 10, umbraAddress, batchSendAddress, startBlock: 4069556, subgraphUrl: subgraphs[10] }, // Optimism
Expand Down Expand Up @@ -433,10 +451,25 @@ export class Umbra {
yield await filterSupportedAddresses(announcements);
}
} catch (err) {
console.error('Umbra subgraph announcement fetch failed; falling back to RPC logs.', {
chainId: this.chainConfig.chainId,
subgraphUrl: this.chainConfig.subgraphUrl,
startBlock,
endBlock,
error: err instanceof Error ? err.message : String(err),
});
if (err instanceof Error && err.stack) {
console.error(err.stack);
}
const announcements = await this.fetchAllAnnouncementFromLogs(startBlock, endBlock);
yield await filterSupportedAddresses(announcements);
}
} else {
console.warn('Umbra subgraph URL is not configured; falling back to RPC logs.', {
chainId: this.chainConfig.chainId,
startBlock,
endBlock,
});
const announcements = await this.fetchAllAnnouncementFromLogs(startBlock, endBlock);
yield await filterSupportedAddresses(announcements);
}
Expand Down Expand Up @@ -481,29 +514,50 @@ export class Umbra {
startBlock: string | number,
endBlock: string | number
): AsyncGenerator<SubgraphAnnouncement[]> {
if (!this.chainConfig.subgraphUrl) {
const subgraphUrl = this.chainConfig.subgraphUrl;
if (!subgraphUrl) {
throw new Error('Subgraph URL must be defined to fetch via subgraph');
}

// Query subgraph
for await (const subgraphAnnouncements of recursiveGraphFetch(
this.chainConfig.subgraphUrl,
'announcementEntities',
(filter: string) => `{
announcementEntities(${filter}) {
amount
block
ciphertext
from
id
pkx
receiver
timestamp
token
txHash
}
}`,
[],
for await (const subgraphAnnouncements of recursiveCompatibleGraphFetch(
subgraphUrl,
{
chainId: this.chainConfig.chainId,
legacy: {
key: 'announcementEntities',
query: (filter: string) => `{
announcementEntities(${filter}) {
amount
block
ciphertext
from
id
pkx
receiver
timestamp
token
txHash
}
}`,
},
ponder: {
key: 'announcements',
orderBy: 'blockNumber',
selection: `
amount
blockNumber
ciphertext
from
id
pkx
receiver
timestamp
token
txHash
`,
normalize: normalizePonderAnnouncement,
},
},
{
startBlock,
endBlock,
Expand Down
Loading
Loading