diff --git a/api/_bridges/sponsored-intent/utils/common.ts b/api/_bridges/sponsored-intent/utils/common.ts index 538573846..4a5ddd775 100644 --- a/api/_bridges/sponsored-intent/utils/common.ts +++ b/api/_bridges/sponsored-intent/utils/common.ts @@ -20,6 +20,7 @@ import { getFullRelayers, getTransferRestrictedRelayers, } from "../../../_relayer-address"; +import { signDigestWithSponsor } from "../../../_sponsorship-signature"; export function getHyperEvmChainId(destinationChainId: number) { return [CHAIN_IDs.HYPEREVM, CHAIN_IDs.HYPERCORE].includes(destinationChainId) @@ -60,7 +61,16 @@ export function getDepositMessage(params: { }) { const { outputToken, recipient } = params; if (isToHyperCore(outputToken.chainId)) { - return ethers.utils.defaultAbiCoder.encode(["address"], [recipient]); + const encodedRecipient = ethers.utils.defaultAbiCoder.encode( + ["address"], + [recipient] + ); + const hashedRecipient = ethers.utils.keccak256(encodedRecipient); + const signature = signDigestWithSponsor(hashedRecipient); + return ethers.utils.defaultAbiCoder.encode( + ["address", "bytes"], + [recipient, signature] + ); } return "0x"; } diff --git a/api/_bridges/sponsored-intent/utils/constants.ts b/api/_bridges/sponsored-intent/utils/constants.ts index b7ceca2ad..e6e1e22d0 100644 --- a/api/_bridges/sponsored-intent/utils/constants.ts +++ b/api/_bridges/sponsored-intent/utils/constants.ts @@ -9,8 +9,9 @@ export const USDH_FILL_DESTINATION_GAS_LIMIT_USD = 0.25; // 0.25 USD // TODO: Pull from @across-protocol/contracts once `HyperliquidDepositHandler` // deployments are available upstream. +// Taken from https://hyperevmscan.io/address/0x420D76Aa59A56953C920a1D1451b0B73147334F1 export const HYPERLIQUID_DEPOSIT_HANDLER_ADDRESS = - "0x861E127036B28D32f3777B4676F6bbb9e007d195"; + "0x420D76Aa59A56953C920a1D1451b0B73147334F1"; export const SUPPORTED_INPUT_TOKENS = [ TOKEN_SYMBOLS_MAP.USDC, diff --git a/api/_sponsorship-signature.ts b/api/_sponsorship-signature.ts index f79f33080..0b00ebbb1 100644 --- a/api/_sponsorship-signature.ts +++ b/api/_sponsorship-signature.ts @@ -23,7 +23,7 @@ export const getSponsorshipSigner = (): ethers.Wallet => { /** * Signs a raw digest with the sponsorship signer. - * This is used for CCTP signatures where the contract expects a signature on the unprefixed hash. + * This is used for sponsored signatures where the contract expects a signature on the unprefixed hash. * @param {string} digest The raw digest to sign. * @returns {string} The signature string. */ @@ -34,17 +34,3 @@ export const signDigestWithSponsor = (digest: string): string => { const signature = signer._signingKey().signDigest(digest); return utils.joinSignature(signature); }; - -/** - * Signs a message with the sponsorship signer. - * This adds the EIP-191 prefix to the message before signing. - * Use this when the contract expects `toEthSignedMessageHash().recover()`. - * @param {Uint8Array} message The message to sign. - * @returns {Promise} The signature string. - */ -export const signMessageWithSponsor = ( - message: Uint8Array -): Promise => { - const signer = getSponsorshipSigner(); - return signer.signMessage(message); -}; diff --git a/test/api/_bridges/sponsored-intent/common.test.ts b/test/api/_bridges/sponsored-intent/common.test.ts index 5995febee..fb0d58d86 100644 --- a/test/api/_bridges/sponsored-intent/common.test.ts +++ b/test/api/_bridges/sponsored-intent/common.test.ts @@ -17,6 +17,7 @@ import { HYPERLIQUID_DEPOSIT_HANDLER_ADDRESS, } from "../../../../api/_bridges/sponsored-intent/utils/constants"; import { USDC_ON_OPTIMISM, USDH_ON_HYPEREVM, USDH_ON_HYPERCORE } from "./utils"; +import { signDigestWithSponsor } from "../../../../api/_sponsorship-signature"; jest.mock("../../../../api/_balance"); jest.mock("../../../../api/_hypercore", () => ({ @@ -24,6 +25,9 @@ jest.mock("../../../../api/_hypercore", () => ({ accountExistsOnHyperCore: jest.fn(), })); jest.mock("../../../../api/_relayer-address"); +jest.mock("../../../../api/_sponsorship-signature", () => ({ + signDigestWithSponsor: jest.fn(), +})); describe("api/_bridges/sponsored-intent/utils/common", () => { beforeEach(() => { @@ -108,6 +112,12 @@ describe("api/_bridges/sponsored-intent/utils/common", () => { }); describe("getDepositMessage", () => { + beforeEach(() => { + (signDigestWithSponsor as jest.Mock).mockReturnValue( + "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + ); + }); + it("should return encoded address if to HyperCore", () => { const recipient = "0x0000000000000000000000000000000000000123"; const outputToken = USDH_ON_HYPERCORE;