Skip to content

Commit 4e5dfa7

Browse files
committed
fix: require 7702 support for sponsored gas
1 parent 4aafd62 commit 4e5dfa7

2 files changed

Lines changed: 38 additions & 6 deletions

File tree

app/util/transactions/hooks/delegation-7702-publish.test.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,34 @@ describe('Delegation 7702 Publish Hook', () => {
223223
});
224224
});
225225

226+
it('throws when atomic batch is not supported for a gas-sponsored transaction', async () => {
227+
await expect(
228+
hookClass.getHook()(
229+
{
230+
...TRANSACTION_META_MOCK,
231+
isGasFeeSponsored: true,
232+
},
233+
SIGNED_TX_MOCK,
234+
),
235+
).rejects.toThrow(
236+
'Gas Station 7702: Chain must support EIP-7702 for sponsored or gas included transaction',
237+
);
238+
});
239+
240+
it('throws when atomic batch is not supported for a gas-included transaction', async () => {
241+
await expect(
242+
hookClass.getHook()(
243+
{
244+
...TRANSACTION_META_MOCK,
245+
isGasFeeIncluded: true,
246+
},
247+
SIGNED_TX_MOCK,
248+
),
249+
).rejects.toThrow(
250+
'Gas Station 7702: Chain must support EIP-7702 for sponsored or gas included transaction',
251+
);
252+
});
253+
226254
it('no selected gas fee token', async () => {
227255
isAtomicBatchSupportedMock.mockResolvedValueOnce([
228256
{

app/util/transactions/hooks/delegation-7702-publish.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ export class Delegation7702PublishHook {
120120
transactionMeta;
121121

122122
const { from } = txParams;
123+
const isGaslessBridge = Boolean(transactionMeta.isGasFeeIncluded);
124+
const isSponsored = Boolean(transactionMeta.isGasFeeSponsored);
123125

124126
const atomicBatchSupport = await this.#isAtomicBatchSupported({
125127
address: from as Hex,
@@ -137,16 +139,19 @@ export class Delegation7702PublishHook {
137139

138140
if (!isChainSupported) {
139141
log('Skipping as EIP-7702 is not supported', { from, chainId });
142+
143+
if (isGaslessBridge || isSponsored) {
144+
throw new Error(
145+
'Chain must support EIP-7702 for sponsored or gas included transaction',
146+
);
147+
}
148+
140149
return EMPTY_RESULT;
141150
}
142151

143152
const { delegationAddress, upgradeContractAddress } =
144153
atomicBatchChainSupport;
145154

146-
const isGaslessBridge = transactionMeta.isGasFeeIncluded;
147-
148-
const isSponsored = Boolean(transactionMeta.isGasFeeSponsored);
149-
150155
if (
151156
(!selectedGasFeeToken || !gasFeeTokens?.length) &&
152157
!isGaslessBridge &&
@@ -173,8 +178,7 @@ export class Delegation7702PublishHook {
173178
parseInt(isE2ETest(chainId) ? SEPOLIA_CHAIN_ID : chainId, 16),
174179
);
175180
const delegationManagerAddress = delegationEnvironment.DelegationManager;
176-
const includeTransfer =
177-
!isGaslessBridge && !transactionMeta.isGasFeeSponsored;
181+
const includeTransfer = !isGaslessBridge && !isSponsored;
178182

179183
if (includeTransfer && (!gasFeeToken || gasFeeToken === undefined)) {
180184
throw new Error('Gas fee token not found');

0 commit comments

Comments
 (0)