Skip to content

Commit a2081df

Browse files
nambrot-agentNam's Office Computer
andauthored
fix(sdk): classify sealevel cross-collateral tokens (#8632)
Co-authored-by: Nam's Office Computer <namsofficecomputer@namss-mbp.mynetworksettings.com>
1 parent 4c91737 commit a2081df

3 files changed

Lines changed: 74 additions & 4 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@hyperlane-xyz/sdk': patch
3+
---
4+
5+
Sealevel cross-collateral tokens were classified as cross-collateral again when building WarpCore routes.

typescript/sdk/src/token/TokenMetadata.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
PROTOCOL_TO_HYP_NATIVE_STANDARD,
1717
PROTOCOL_TO_NATIVE_STANDARD,
1818
TOKEN_COLLATERALIZED_STANDARDS,
19+
TOKEN_CROSS_COLLATERAL_STANDARDS,
1920
TOKEN_HYP_STANDARDS,
2021
TOKEN_MULTI_CHAIN_STANDARDS,
2122
TOKEN_NFT_STANDARDS,
@@ -153,10 +154,7 @@ export class TokenMetadata implements ITokenMetadata {
153154
}
154155

155156
isCrossCollateralToken(): boolean {
156-
return (
157-
this.standard === TokenStandard.EvmHypCrossCollateralRouter ||
158-
this.standard === TokenStandard.TronHypCrossCollateralRouter
159-
);
157+
return TOKEN_CROSS_COLLATERAL_STANDARDS.has(this.standard);
160158
}
161159

162160
getConnections(): TokenConnection[] {

typescript/sdk/src/warp/WarpCore.test.ts

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,6 +1144,73 @@ describe('WarpCore', () => {
11441144
}
11451145
});
11461146

1147+
it('Treats Sealevel cross-collateral to EVM cross-collateral as transferRemoteTo route', async () => {
1148+
const sealevelCrossCollateral = new Token({
1149+
chainName: testSealevelChain.name,
1150+
standard: TokenStandard.SealevelHypCrossCollateral,
1151+
addressOrDenom: '4UMNyNWW75zo69hxoJaRX5iXNUa5FdRPZZa9vDVCiESg',
1152+
collateralAddressOrDenom: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
1153+
decimals: 6,
1154+
symbol: 'USDC',
1155+
name: 'USDC',
1156+
});
1157+
const evmCrossCollateral = new Token({
1158+
chainName: test2.name,
1159+
standard: TokenStandard.EvmHypCrossCollateralRouter,
1160+
addressOrDenom: '0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147',
1161+
collateralAddressOrDenom: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
1162+
decimals: 6,
1163+
symbol: 'USDC',
1164+
name: 'USDC',
1165+
});
1166+
sealevelCrossCollateral.addConnection({ token: evmCrossCollateral });
1167+
evmCrossCollateral.addConnection({ token: sealevelCrossCollateral });
1168+
1169+
const crossCollateralWarpCore = new WarpCore(multiProvider, [
1170+
sealevelCrossCollateral,
1171+
evmCrossCollateral,
1172+
]);
1173+
const quoteTransferRemoteToGas = sinon.stub().resolves({
1174+
igpQuote: { amount: 1n },
1175+
tokenFeeQuote: { amount: 0n },
1176+
});
1177+
const populateTransferRemoteToTx = sinon.stub().resolves({});
1178+
const populateTransferRemoteTx = sinon.stub().resolves({});
1179+
const originAdapterStub = sinon
1180+
.stub(sealevelCrossCollateral, 'getHypAdapter')
1181+
.returns({
1182+
quoteTransferRemoteToGas,
1183+
populateTransferRemoteToTx,
1184+
populateTransferRemoteTx,
1185+
isApproveRequired: sinon.stub().resolves(false),
1186+
isRevokeApprovalRequired: sinon.stub().resolves(false),
1187+
} as any);
1188+
1189+
try {
1190+
expect(
1191+
crossCollateralWarpCore.isCrossCollateralTransfer(
1192+
sealevelCrossCollateral,
1193+
evmCrossCollateral,
1194+
),
1195+
).to.equal(true);
1196+
1197+
const result = await crossCollateralWarpCore.getTransferRemoteTxs({
1198+
originTokenAmount: sealevelCrossCollateral.amount(TRANSFER_AMOUNT),
1199+
destination: test2.name,
1200+
sender: MOCK_ADDRESS,
1201+
recipient: MOCK_ADDRESS,
1202+
destinationToken: evmCrossCollateral,
1203+
});
1204+
1205+
expect(result).to.have.length(1);
1206+
expect(result[0].category).to.equal(WarpTxCategory.Transfer);
1207+
sinon.assert.calledOnce(populateTransferRemoteToTx);
1208+
sinon.assert.notCalled(populateTransferRemoteTx);
1209+
} finally {
1210+
originAdapterStub.restore();
1211+
}
1212+
});
1213+
11471214
it('Converts destination minimum transfer amount into origin decimals correctly', async () => {
11481215
const destinationAdapterStub = sinon
11491216
.stub(sealevelHypSynthetic, 'getAdapter')

0 commit comments

Comments
 (0)