Skip to content

Commit 534cda6

Browse files
committed
cloud_functions: add NTT specific types
1 parent 8cb6d0e commit 534cda6

File tree

8 files changed

+73
-55
lines changed

8 files changed

+73
-55
lines changed

cloud_functions/src/computeNTTRateLimits.ts

+11-10
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@ import {
77
getSolanaTokenDecimals,
88
NTTRateLimit,
99
getNetwork,
10+
NTTEvmChain,
11+
NTTChain,
12+
nttChains,
1013
} from '@wormhole-foundation/wormhole-monitor-common';
11-
import { EvmPlatform, EvmChains } from '@wormhole-foundation/sdk-evm';
14+
import { EvmPlatform } from '@wormhole-foundation/sdk-evm';
1215
import { SolanaPlatform } from '@wormhole-foundation/sdk-solana';
1316
import { EvmNtt } from '@wormhole-foundation/sdk-evm-ntt';
1417
import { SolanaNtt } from '@wormhole-foundation/sdk-solana-ntt';
15-
import { Network, Chain, contracts, rpc, chainToChainId } from '@wormhole-foundation/sdk-base';
18+
import { Network, contracts, rpc, chainToChainId } from '@wormhole-foundation/sdk-base';
1619
import { Storage } from '@google-cloud/storage';
1720

1821
const storage = new Storage();
@@ -29,11 +32,11 @@ const cloudStorageCache = cacheBucket.file(cacheFileName);
2932
async function computeNTTRateLimits_(
3033
network: Network,
3134
token: string,
32-
chain: Chain
35+
chain: NTTChain
3336
): Promise<NTTRateLimit> {
34-
let ntt: EvmNtt<Network, EvmChains> | SolanaNtt<Network, 'Solana'>;
37+
let ntt: EvmNtt<Network, NTTEvmChain> | SolanaNtt<Network, 'Solana'>;
3538
let tokenDecimals: number;
36-
const rpcEndpoint = rpc.rpcAddress(network, chain as Chain);
39+
const rpcEndpoint = rpc.rpcAddress(network, chain);
3740
const tokenAddress = NTT_TOKENS[network][token][chain]!;
3841
const managerContract = NTT_MANAGER_CONTRACT[network][token][chain]!;
3942
const transceiverContract = NTT_TRANSCEIVER_CONTRACT[network][token][chain]!;
@@ -52,7 +55,7 @@ async function computeNTTRateLimits_(
5255
});
5356
tokenDecimals = await getSolanaTokenDecimals(rpcEndpoint, tokenAddress);
5457
} else {
55-
const evmChain = chain as EvmChains;
58+
const evmChain = chain;
5659
const platform = new EvmPlatform(network);
5760
ntt = new EvmNtt(network, evmChain, platform.getRpc(evmChain), {
5861
ntt: {
@@ -120,10 +123,8 @@ export async function computeNTTRateLimits(req: any, res: any) {
120123

121124
const rateLimits = await Promise.all(
122125
Object.entries(managerContracts).map(async ([token, manager]) => {
123-
const inboundCapacityPromises = Object.entries(manager)
124-
.map(([chain, contract]) =>
125-
contract ? computeNTTRateLimits_(network, token, chain as Chain) : null
126-
)
126+
const inboundCapacityPromises = nttChains
127+
.map((chain) => (manager[chain] ? computeNTTRateLimits_(network, token, chain) : null))
127128
.filter(Boolean);
128129

129130
const inboundCapacity = await Promise.all(inboundCapacityPromises);

cloud_functions/src/computeTotalSupplyAndLocked.ts

+11-7
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ import {
99
getEvmTotalSupply,
1010
getNetwork,
1111
normalizeToDecimals,
12+
nttChains,
1213
} from '@wormhole-foundation/wormhole-monitor-common';
1314
import { PublicKey } from '@solana/web3.js';
14-
import { Network, rpc, Chain, chainToChainId } from '@wormhole-foundation/sdk-base';
15+
import { Network, rpc, chainToChainId } from '@wormhole-foundation/sdk-base';
1516
import { Storage } from '@google-cloud/storage';
1617

1718
const storage = new Storage();
@@ -38,21 +39,24 @@ async function fetchTotalSupplyAndLocked(network: Network): Promise<NTTTotalSupp
3839

3940
const evmTotalSupply: NTTTotalSupplyAndLockedData[] = [];
4041
let cumulativeEvmSupply = 0n;
41-
for (const [supportedChain] of Object.entries(NTT_TOKENS[network][token])) {
42+
for (const supportedChain of nttChains) {
43+
const tokenContract = NTT_TOKENS[network][token][supportedChain];
44+
const managerContract = NTT_MANAGER_CONTRACT[network][token][supportedChain];
45+
if (!tokenContract || !managerContract) continue;
4246
if (supportedChain === 'Solana') continue;
4347
const tokenSupply = await getEvmTotalSupply(
44-
rpc.rpcAddress(network, supportedChain as Chain),
45-
NTT_TOKENS[network][token][supportedChain as Chain]!
48+
rpc.rpcAddress(network, supportedChain),
49+
tokenContract
4650
);
4751

4852
const tokenDecimals = await getEvmTokenDecimals(
49-
rpc.rpcAddress(network, supportedChain as Chain),
50-
NTT_MANAGER_CONTRACT[network][token][supportedChain as Chain]!
53+
rpc.rpcAddress(network, supportedChain),
54+
managerContract
5155
);
5256

5357
evmTotalSupply.push({
5458
tokenName: token,
55-
chain: chainToChainId(supportedChain as Chain),
59+
chain: chainToChainId(supportedChain),
5660
totalSupply: {
5761
amount: tokenSupply.toString(),
5862
decimals: tokenDecimals,

common/src/nttConsts.ts

+32-13
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,47 @@
1-
import { Chain, Network, chains } from '@wormhole-foundation/sdk-base';
1+
import { Network, networks } from '@wormhole-foundation/sdk-base';
2+
import { EvmChains } from '@wormhole-foundation/sdk-evm';
23

34
// This data structure is used in dashboard
45
export type NTTContract = {
5-
[key in Network]: { [tokenName: string]: { [key in Chain]?: string } };
6+
[key in Network]: { [tokenName: string]: { [key in NTTChain]?: string } };
67
};
78

89
// This data structure is used in watchers
910
export type NTTContractArray = {
10-
[key in Network]: { [key in Chain]?: string[] };
11+
[key in Network]: { [key in NTTChain]?: string[] };
1112
};
1213

14+
export const nttChains = [
15+
'Ethereum',
16+
'Fantom',
17+
'Solana',
18+
'Arbitrum',
19+
'Optimism',
20+
'Base',
21+
'Sepolia',
22+
'ArbitrumSepolia',
23+
'BaseSepolia',
24+
'OptimismSepolia',
25+
'Holesky',
26+
] as const;
27+
1328
function convertNTTManagerContractToNTTContractArray(
1429
nttManagerContract: NTTContract
1530
): NTTContractArray {
1631
const nttContract: NTTContractArray = {} as NTTContractArray;
1732

18-
for (const network in nttManagerContract) {
19-
nttContract[network as Network] = {};
33+
for (const network of networks) {
34+
nttContract[network] = {};
2035

21-
for (const tokenName in nttManagerContract[network as Network]) {
22-
for (const chain in nttManagerContract[network as Network][tokenName]) {
23-
const tokenAddress = nttManagerContract[network as Network][tokenName][chain as Chain];
36+
for (const tokenName in nttManagerContract[network]) {
37+
for (const chain of nttChains) {
38+
const tokenAddress = nttManagerContract[network][tokenName][chain];
2439

2540
if (tokenAddress) {
26-
if (!nttContract[network as Network][chain as Chain]) {
27-
nttContract[network as Network][chain as Chain] = [];
41+
if (!nttContract[network][chain]) {
42+
nttContract[network][chain] = [];
2843
}
29-
nttContract[network as Network][chain as Chain]!.push(tokenAddress);
44+
nttContract[network][chain]!.push(tokenAddress);
3045
}
3146
}
3247
}
@@ -113,14 +128,18 @@ export const NTT_TOKENS: NTTContract = {
113128
Devnet: {},
114129
};
115130

131+
export type NTTChain = (typeof nttChains)[number];
132+
133+
export type NTTEvmChain = NTTChain & EvmChains;
134+
116135
export const NTT_MANAGER_CONTRACT_ARRAY =
117136
convertNTTManagerContractToNTTContractArray(NTT_MANAGER_CONTRACT);
118137

119-
export function NTT_SUPPORTED_CHAINS(network: Network, token: string): Chain[] {
138+
export function NTT_SUPPORTED_CHAINS(network: Network, token: string): NTTChain[] {
120139
const contractDetails = NTT_MANAGER_CONTRACT[network][token];
121140
if (!contractDetails) {
122141
return [];
123142
}
124143

125-
return chains.filter((chain) => chain in contractDetails);
144+
return nttChains.filter((chain) => chain in contractDetails);
126145
}

dashboard/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"@types/node": "^18.6.4",
1818
"@types/react": "^18.0.15",
1919
"@types/react-dom": "^18.0.6",
20-
"@wormhole-foundation/sdk-icons": "^0.6.6-beta.1",
20+
"@wormhole-foundation/sdk-icons": "^0.9.1",
2121
"buffer": "^6.0.3",
2222
"numeral": "^2.0.6",
2323
"react": "^18.2.0",

package-lock.json

+5-13
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

watcher/src/watchers/EVMWatcher.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export class EVMWatcher extends Watcher {
4040
this.lastTimestamp = 0;
4141
this.latestFinalizedBlockNumber = 0;
4242
this.finalizedBlockTag = finalizedBlockTag;
43-
if (chain === 'Acala' || chain === 'Karura') {
43+
if (chain === 'Acala' || chain === 'Karura' || chain === 'Berachain') {
4444
this.maximumBatchSize = 50;
4545
}
4646
}

watcher/src/watchers/NTTWatcher.ts

+8-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ import {
77
chainToChainId,
88
contracts,
99
} from '@wormhole-foundation/sdk-base';
10-
import { assertEnvironmentVariable } from '@wormhole-foundation/wormhole-monitor-common';
10+
import {
11+
assertEnvironmentVariable,
12+
NTTChain,
13+
NTTEvmChain,
14+
} from '@wormhole-foundation/wormhole-monitor-common';
1115
import axios from 'axios';
1216
import { BigNumber } from 'ethers';
1317
import knex, { Knex } from 'knex';
@@ -48,17 +52,15 @@ export type ErrorBlock = {
4852
};
4953

5054
export class NTTWatcher extends Watcher {
55+
chain: NTTChain;
5156
finalizedBlockTag: BlockTag;
5257
lastTimestamp: number;
5358
latestFinalizedBlockNumber: number;
5459
pg: Knex;
5560

56-
constructor(
57-
network: Network,
58-
chain: PlatformToChains<'Evm'>,
59-
finalizedBlockTag: BlockTag = 'latest'
60-
) {
61+
constructor(network: Network, chain: NTTEvmChain, finalizedBlockTag: BlockTag = 'latest') {
6162
super(network, chain, 'ntt');
63+
this.chain = chain;
6264
this.lastTimestamp = 0;
6365
this.latestFinalizedBlockNumber = 0;
6466
this.finalizedBlockTag = finalizedBlockTag;

watcher/src/watchers/__tests__/NearWatcher.test.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ describe('getNearProvider', () => {
4242

4343
test('with archive RPC', async () => {
4444
const provider = await getNearProvider('Mainnet', NEAR_ARCHIVE_RPC);
45-
// grab first block with activity from core contract
46-
expect(
47-
await provider.block({ blockId: 'Asie8hpJFKaipvw8jh1wPfBwwbjP6JUfsQdCuQvwr3Sz' })
48-
).toBeTruthy();
45+
const retval = await provider.block({
46+
blockId: '8NWwminTTAPwYzzqTeP8c3MEGXgTretBWpCSSvSqJXdv',
47+
});
48+
expect(retval).toBeTruthy();
4949
});
5050
});
5151

0 commit comments

Comments
 (0)