Skip to content

Commit aac9ef5

Browse files
committed
Merge branch 'main' into feat/relayer-api
2 parents 8a633f7 + a8caeb5 commit aac9ef5

11 files changed

Lines changed: 300 additions & 7 deletions

File tree

.github/workflows/release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -321,9 +321,9 @@ jobs:
321321
webhook: ${{ secrets.SLACK_INCIDENTS_WEBHOOK }}
322322
webhook-type: incoming-webhook
323323
payload: |
324-
text: ":red-siren: NPM package publish failed — see workflow run for details"
324+
text: ":alert: NPM package publish failed — see workflow run for details"
325325
blocks:
326326
- type: "section"
327327
text:
328328
type: "mrkdwn"
329-
text: ":red-siren: *NPM package publish failed*\n<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View workflow run #${{ github.run_number }}>"
329+
text: ":alert: *NPM package publish failed*\n<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View workflow run #${{ github.run_number }}>"

.husky/pre-commit

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,21 @@ if [ "$GITHUB_ACTIONS" != "true" ]; then
1818
echo "Please remove any secrets, credentials, or sensitive information before committing."
1919
exit 1
2020
fi
21+
22+
# Broad private key check on staged diff. May produce false positives — set SKIP_KEY_CHECK=1 to bypass if intentional.
23+
if [ "$SKIP_KEY_CHECK" != "1" ]; then
24+
STAGED_DIFF=$(git diff --cached | awk '/^\+\+\+ b\// { file=substr($0,7) } /^\+[^+]/ { print file ":" $0 }')
25+
EVM_MATCHES=$(echo "$STAGED_DIFF" | grep -E '\b(0x)?[0-9a-fA-F]{64}\b' || true)
26+
BASE58_MATCHES=$(echo "$STAGED_DIFF" | grep -E '\b[1-9A-HJ-NP-Za-km-z]{87,88}\b' || true)
27+
CLI_MATCHES=$(echo "$STAGED_DIFF" | grep -E '\[(\s*[0-9]{1,3}\s*,\s*){63}[0-9]{1,3}\s*\]' || true)
28+
ALL_MATCHES=$(printf '%s\n%s\n%s' "$EVM_MATCHES" "$BASE58_MATCHES" "$CLI_MATCHES" | sed '/^$/d')
29+
if [ -n "$ALL_MATCHES" ]; then
30+
echo "⚠️ Possible private key detected in staged changes."
31+
echo "$ALL_MATCHES"
32+
echo " If this is a non-sensitive value (e.g. tx hash), re-run with: SKIP_KEY_CHECK=1 git commit"
33+
exit 1
34+
fi
35+
fi
2136
fi
2237

2338
pnpm lint-staged --concurrent false

.registryrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
a0953ebb7ba67657cb61816d416a8d6780dae9a6
1+
1b6c789d66582d0a33e7880a45aa9f418d1502f5

rust/main/app-contexts/mainnet_config.json

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42215,6 +42215,136 @@
4221542215
}
4221642216
]
4221742217
},
42218+
{
42219+
"name": "USDT/oft",
42220+
"matchingList": [
42221+
{
42222+
"originDomain": 42161,
42223+
"senderAddress": [
42224+
"0x000000000000000000000000e4c1a1e54c232454311cf68610c3885fdd991c0e"
42225+
],
42226+
"destinationDomain": 1,
42227+
"recipientAddress": [
42228+
"0x0000000000000000000000007bb4fe8f406fb7b22487fa2e3bcbcb6a38cf29e6"
42229+
]
42230+
},
42231+
{
42232+
"originDomain": 42161,
42233+
"senderAddress": [
42234+
"0x000000000000000000000000e4c1a1e54c232454311cf68610c3885fdd991c0e"
42235+
],
42236+
"destinationDomain": 9745,
42237+
"recipientAddress": [
42238+
"0x00000000000000000000000093bffa2231fba5029997603fb68d9ac08024baa2"
42239+
]
42240+
},
42241+
{
42242+
"originDomain": 1,
42243+
"senderAddress": [
42244+
"0x0000000000000000000000007bb4fe8f406fb7b22487fa2e3bcbcb6a38cf29e6"
42245+
],
42246+
"destinationDomain": 42161,
42247+
"recipientAddress": [
42248+
"0x000000000000000000000000e4c1a1e54c232454311cf68610c3885fdd991c0e"
42249+
]
42250+
},
42251+
{
42252+
"originDomain": 1,
42253+
"senderAddress": [
42254+
"0x0000000000000000000000007bb4fe8f406fb7b22487fa2e3bcbcb6a38cf29e6"
42255+
],
42256+
"destinationDomain": 9745,
42257+
"recipientAddress": [
42258+
"0x00000000000000000000000093bffa2231fba5029997603fb68d9ac08024baa2"
42259+
]
42260+
},
42261+
{
42262+
"originDomain": 9745,
42263+
"senderAddress": [
42264+
"0x00000000000000000000000093bffa2231fba5029997603fb68d9ac08024baa2"
42265+
],
42266+
"destinationDomain": 42161,
42267+
"recipientAddress": [
42268+
"0x000000000000000000000000e4c1a1e54c232454311cf68610c3885fdd991c0e"
42269+
]
42270+
},
42271+
{
42272+
"originDomain": 9745,
42273+
"senderAddress": [
42274+
"0x00000000000000000000000093bffa2231fba5029997603fb68d9ac08024baa2"
42275+
],
42276+
"destinationDomain": 1,
42277+
"recipientAddress": [
42278+
"0x0000000000000000000000007bb4fe8f406fb7b22487fa2e3bcbcb6a38cf29e6"
42279+
]
42280+
}
42281+
]
42282+
},
42283+
{
42284+
"name": "USDT/oft-legacy",
42285+
"matchingList": [
42286+
{
42287+
"originDomain": 42161,
42288+
"senderAddress": [
42289+
"0x0000000000000000000000009323793fb9a071ce5fe839079925c0e39f37170f"
42290+
],
42291+
"destinationDomain": 1,
42292+
"recipientAddress": [
42293+
"0x000000000000000000000000c0da8ef1225145e0b720d8a33471fa6360b7e73b"
42294+
]
42295+
},
42296+
{
42297+
"originDomain": 42161,
42298+
"senderAddress": [
42299+
"0x0000000000000000000000009323793fb9a071ce5fe839079925c0e39f37170f"
42300+
],
42301+
"destinationDomain": 728126428,
42302+
"recipientAddress": [
42303+
"0x00000000000000000000000043bb7c9c64a05af94d67b52883a60756950058d7"
42304+
]
42305+
},
42306+
{
42307+
"originDomain": 1,
42308+
"senderAddress": [
42309+
"0x000000000000000000000000c0da8ef1225145e0b720d8a33471fa6360b7e73b"
42310+
],
42311+
"destinationDomain": 42161,
42312+
"recipientAddress": [
42313+
"0x0000000000000000000000009323793fb9a071ce5fe839079925c0e39f37170f"
42314+
]
42315+
},
42316+
{
42317+
"originDomain": 1,
42318+
"senderAddress": [
42319+
"0x000000000000000000000000c0da8ef1225145e0b720d8a33471fa6360b7e73b"
42320+
],
42321+
"destinationDomain": 728126428,
42322+
"recipientAddress": [
42323+
"0x00000000000000000000000043bb7c9c64a05af94d67b52883a60756950058d7"
42324+
]
42325+
},
42326+
{
42327+
"originDomain": 728126428,
42328+
"senderAddress": [
42329+
"0x00000000000000000000000043bb7c9c64a05af94d67b52883a60756950058d7"
42330+
],
42331+
"destinationDomain": 42161,
42332+
"recipientAddress": [
42333+
"0x0000000000000000000000009323793fb9a071ce5fe839079925c0e39f37170f"
42334+
]
42335+
},
42336+
{
42337+
"originDomain": 728126428,
42338+
"senderAddress": [
42339+
"0x00000000000000000000000043bb7c9c64a05af94d67b52883a60756950058d7"
42340+
],
42341+
"destinationDomain": 1,
42342+
"recipientAddress": [
42343+
"0x000000000000000000000000c0da8ef1225145e0b720d8a33471fa6360b7e73b"
42344+
]
42345+
}
42346+
]
42347+
},
4221842348
{
4221942349
"name": "RISE/bsc-ethereum",
4222042350
"matchingList": [
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk';
2+
3+
import {
4+
RouterConfigWithoutOwner,
5+
tokens,
6+
} from '../../../../../src/config/warp.js';
7+
import { awIcas } from '../../governance/ica/aw.js';
8+
import { awSafes } from '../../governance/safe/aw.js';
9+
10+
const deploymentChains = ['ethereum', 'arbitrum', 'tron'] as const;
11+
12+
export type DeploymentChain = (typeof deploymentChains)[number];
13+
14+
const lzEids: Record<DeploymentChain, number> = {
15+
ethereum: 30101,
16+
arbitrum: 30110,
17+
tron: 30420,
18+
};
19+
20+
const oftAddresses: Record<DeploymentChain, string> = {
21+
ethereum: '0x1F748c76dE468e9D11bd340fA9D5CBADf315dFB0',
22+
arbitrum: '0x77652D5aba086137b595875263FC200182919B92',
23+
tron: '0x3a08f76772e200653bb55c2a92998daca62e0e97',
24+
};
25+
26+
const ownersByChain: Record<DeploymentChain, string> = {
27+
ethereum: awSafes.ethereum,
28+
// arbitrum stays inline until awIcas.arbitrum is exported again in aw.ts
29+
arbitrum: '0xD2757Bbc28C80789Ed679f22Ac65597Cacf51A45',
30+
tron: awIcas.tron,
31+
};
32+
33+
export const getUSDTOftLegacyWarpConfig = async (
34+
routerConfig: ChainMap<RouterConfigWithoutOwner>,
35+
): Promise<ChainMap<HypTokenRouterConfig>> =>
36+
Object.fromEntries(
37+
deploymentChains.map((chain) => [
38+
chain,
39+
{
40+
...routerConfig[chain],
41+
owner: ownersByChain[chain],
42+
type: TokenType.collateralOft,
43+
token: tokens[chain].USDT,
44+
oft: oftAddresses[chain],
45+
decimals: 6,
46+
name: 'Tether USD',
47+
symbol: 'USDT',
48+
domainMappings: Object.fromEntries(
49+
Object.entries(lzEids).filter(([c]) => c !== chain),
50+
),
51+
extraOptions: '0x',
52+
},
53+
]),
54+
);
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk';
2+
3+
import {
4+
RouterConfigWithoutOwner,
5+
tokens,
6+
} from '../../../../../src/config/warp.js';
7+
import { awIcas } from '../../governance/ica/aw.js';
8+
import { awSafes } from '../../governance/safe/aw.js';
9+
10+
const deploymentChains = ['ethereum', 'arbitrum', 'plasma'] as const;
11+
12+
export type DeploymentChain = (typeof deploymentChains)[number];
13+
14+
const lzEids: Record<DeploymentChain, number> = {
15+
ethereum: 30101,
16+
arbitrum: 30110,
17+
plasma: 30383,
18+
};
19+
20+
const oftAddresses: Record<DeploymentChain, string> = {
21+
ethereum: '0x6C96dE32CEa08842dcc4058c14d3aaAD7Fa41dee',
22+
arbitrum: '0x14E4A1B13bf7F943c8ff7C51fb60FA964A298D92',
23+
plasma: '0x02ca37966753bDdDf11216B73B16C1dE756A7CF9',
24+
};
25+
26+
const ownersByChain: Record<DeploymentChain, string> = {
27+
ethereum: awSafes.ethereum,
28+
// arbitrum stays inline until awIcas.arbitrum is exported again in aw.ts
29+
arbitrum: '0xD2757Bbc28C80789Ed679f22Ac65597Cacf51A45',
30+
plasma: awIcas.plasma,
31+
};
32+
33+
export const getUSDTOftWarpConfig = async (
34+
routerConfig: ChainMap<RouterConfigWithoutOwner>,
35+
): Promise<ChainMap<HypTokenRouterConfig>> =>
36+
Object.fromEntries(
37+
deploymentChains.map((chain) => [
38+
chain,
39+
{
40+
...routerConfig[chain],
41+
owner: ownersByChain[chain],
42+
type: TokenType.collateralOft,
43+
token: tokens[chain].USDT,
44+
oft: oftAddresses[chain],
45+
decimals: 6,
46+
name: 'Tether USD',
47+
symbol: 'USDT',
48+
domainMappings: Object.fromEntries(
49+
Object.entries(lzEids).filter(([c]) => c !== chain),
50+
),
51+
extraOptions: '0x',
52+
},
53+
]),
54+
);

typescript/infra/config/environments/mainnet3/warp/warpIds.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ export enum WarpRouteIds {
151151

152152
// TODO: uncomment when USDTOft warp routes are in the registry
153153
// USDT OFT
154-
// USDTOft = 'USDT/oft',
155-
// USDTOftLegacy = 'USDT/oft-legacy',
154+
USDTOft = 'USDT/oft',
155+
USDTOftLegacy = 'USDT/oft-legacy',
156156

157157
// RISE routes
158158
BscEthereumRISE = 'RISE/bsc-ethereum',

typescript/infra/config/warp.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ import {
139139
import { WarpRouteIds } from './environments/mainnet3/warp/warpIds.js';
140140
import { getCCTPWarpConfig as getTestnetCCTPWarpConfig } from './environments/testnet4/warp/getCCTPConfig.js';
141141
import { DEFAULT_REGISTRY_URI } from './registry.js';
142+
import { getUSDTOftWarpConfig } from './environments/mainnet3/warp/configGetters/getUSDTOftWarpConfig.js';
143+
import { getUSDTOftLegacyWarpConfig } from './environments/mainnet3/warp/configGetters/getUSDTOftLegacyWarpConfig.js';
142144
import { getUSDTSTAGEWarpConfig } from './environments/mainnet3/warp/configGetters/getUSDTSTAGEWarpConfig.js';
143145

144146
type WarpConfigGetter = (
@@ -226,6 +228,8 @@ export const warpConfigGetterMap: Record<string, WarpConfigGetter> = {
226228
[WarpRouteIds.Eni1Piece]: getEni1PieceWarpConfig,
227229
[WarpRouteIds.ModeUSDTSTAGE]: getUSDTSTAGEWarpConfig,
228230
[WarpRouteIds.AleoUSDC]: getAleoUSDCWarpConfig,
231+
[WarpRouteIds.USDTOft]: getUSDTOftWarpConfig,
232+
[WarpRouteIds.USDTOftLegacy]: getUSDTOftLegacyWarpConfig,
229233
};
230234

231235
type StrategyConfigGetter = () => ChainSubmissionStrategy;

typescript/infra/helm/offchain-lookup-server/values-mainnet.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ image:
66
# Modify this tag to deploy a new revision.
77
# Images can be found here:
88
# https://github.com/orgs/hyperlane-xyz/packages/container/package/hyperlane-node-services
9-
tag: d0dbf1a-20260406-190037
9+
tag: dc8e560-20260417-072705
1010

1111
# In Google Cloud Secret Manager, all secrets need to have a certain prefix in order to be accessible by
1212
# the Cluster Secret Store. For testnet this prefix is "hyperlane-testnet4"

typescript/infra/helm/offchain-lookup-server/values-testnet.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ image:
66
# Modify this tag to deploy a new revision.
77
# Images can be found here:
88
# https://github.com/orgs/hyperlane-xyz/packages/container/package/hyperlane-node-services
9-
tag: d0dbf1a-20260406-190037
9+
tag: dc8e560-20260417-072705
1010

1111
# In Google Cloud Secret Manager, all secrets need to have a certain prefix in order to be accessible by
1212
# the Cluster Secret Store. For testnet this prefix is "hyperlane-testnet4"

0 commit comments

Comments
 (0)