From 550e284b5e857148dca06ec7b0e92c618760caa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Coffee=E2=98=95=EF=B8=8F?= Date: Thu, 22 May 2025 23:54:41 -0400 Subject: [PATCH 1/9] experimental: optimistic transactions --- .editorconfig | 2 +- .../src/actions/prepareTransaction.ts | 28 +++++-- .../sendOptimisticTransactionForSession..ts | 74 +++++++++++++++++++ .../src/actions/sendTransactionInternal.ts | 25 ++----- .../agw-client/src/actions/signTransaction.ts | 30 +++++--- .../src/actions/signTransactionForSession.ts | 11 ++- .../src/types/optimisticTransaction.ts | 40 ++++++++++ packages/agw-client/src/walletActions.ts | 7 +- .../sendTransactionInternal.test.ts | 6 +- 9 files changed, 182 insertions(+), 41 deletions(-) create mode 100644 packages/agw-client/src/actions/sendOptimisticTransactionForSession..ts create mode 100644 packages/agw-client/src/types/optimisticTransaction.ts diff --git a/.editorconfig b/.editorconfig index 1ed453a3..a148ba81 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,7 +4,7 @@ root = true end_of_line = lf insert_final_newline = true -[*.{js,json,yml}] +[*.{js,json,yml,ts}] charset = utf-8 indent_style = space indent_size = 2 diff --git a/packages/agw-client/src/actions/prepareTransaction.ts b/packages/agw-client/src/actions/prepareTransaction.ts index 939fe4de..950a227f 100644 --- a/packages/agw-client/src/actions/prepareTransaction.ts +++ b/packages/agw-client/src/actions/prepareTransaction.ts @@ -14,6 +14,7 @@ import { type GetTransactionRequestKzgParameter, type IsNever, keccak256, + maxUint256, type NonceManager, type Prettify, type PublicClient, @@ -62,6 +63,7 @@ import { import { InsufficientBalanceError } from '../errors/insufficientBalance.js'; import { AccountFactoryAbi } from '../exports/constants.js'; import type { Call } from '../types/call.js'; +import type { OptimisticTransactionParameters } from '../types/optimisticTransaction.js'; import { isSmartAccountDeployed, transformHexValues } from '../utils.js'; import { getInitializerCalldata } from '../utils.js'; @@ -110,6 +112,8 @@ export type PrepareTransactionRequestParameterType = | 'nonce' | 'sidecars' | 'type'; +export type BypassChecksParameterType = 'balance' | 'deployment'; + type ParameterTypeToParameters< parameterType extends PrepareTransactionRequestParameterType, > = parameterType extends 'fees' @@ -141,6 +145,8 @@ export type PrepareTransactionRequestRequest< * Whether the transaction is the first transaction of the account. */ isInitialTransaction?: boolean; + + optimistic?: OptimisticTransactionParameters; }; export type PrepareTransactionRequestParameters< @@ -302,10 +308,12 @@ export async function prepareTransactionRequest< const { gas, nonce, parameters: parameterNames = defaultParameters } = args; - const isDeployed = await isSmartAccountDeployed( - publicClient, - client.account.address, - ); + const isDeployed = + args.optimistic?.isDeployed !== undefined + ? args.optimistic.isDeployed + : args.optimistic !== undefined + ? true + : await isSmartAccountDeployed(publicClient, client.account.address); if (!isDeployed) { const initialCall = { @@ -344,10 +352,18 @@ export async function prepareTransactionRequest< // Prepare all async operations that can run in parallel const asyncOperations = []; - let userBalance: bigint | undefined; + let userBalance: bigint | undefined = + args.optimistic?.balance !== undefined + ? args.optimistic.balance + : args.optimistic !== undefined + ? maxUint256 + : undefined; // Get balance if the transaction is not sponsored or has a value - if (!isSponsored || (request.value !== undefined && request.value > 0n)) { + if ( + userBalance === undefined && + (!isSponsored || (request.value !== undefined && request.value > 0n)) + ) { asyncOperations.push( getBalance(publicClient, { address: initiatorAccount.address, diff --git a/packages/agw-client/src/actions/sendOptimisticTransactionForSession..ts b/packages/agw-client/src/actions/sendOptimisticTransactionForSession..ts new file mode 100644 index 00000000..c1e9d90d --- /dev/null +++ b/packages/agw-client/src/actions/sendOptimisticTransactionForSession..ts @@ -0,0 +1,74 @@ +import { + type Account, + BaseError, + type Client, + type Hex, + type PublicClient, + type SendTransactionRequest, + type Transport, + type WalletClient, +} from 'viem'; +import { + type ChainEIP712, + type SendEip712TransactionParameters, + type SendEip712TransactionReturnType, +} from 'viem/zksync'; + +import { SESSION_KEY_VALIDATOR_ADDRESS } from '../constants.js'; +import { + encodeSessionWithPeriodIds, + getPeriodIdsForTransaction, + type SessionConfig, +} from '../sessions.js'; +import type { CustomPaymasterHandler } from '../types/customPaymaster.js'; +import { sendTransactionInternal } from './sendTransactionInternal.js'; + +export async function sendOptimisticTransactionForSession< + chain extends ChainEIP712 | undefined = ChainEIP712 | undefined, + account extends Account | undefined = Account | undefined, + chainOverride extends ChainEIP712 | undefined = ChainEIP712 | undefined, + const request extends SendTransactionRequest< + chain, + chainOverride + > = SendTransactionRequest, +>( + client: Client, + signerClient: WalletClient, + publicClient: PublicClient, + parameters: SendEip712TransactionParameters< + chain, + account, + chainOverride, + request + >, + session: SessionConfig, + customPaymasterHandler: CustomPaymasterHandler | undefined = undefined, +): Promise { + const selector: Hex | undefined = parameters.data + ? `0x${parameters.data.slice(2, 10)}` + : undefined; + + if (!parameters.to) { + throw new BaseError('Transaction to field is not specified'); + } + + return sendTransactionInternal( + client, + signerClient, + publicClient, + parameters, + SESSION_KEY_VALIDATOR_ADDRESS, + { + [SESSION_KEY_VALIDATOR_ADDRESS]: encodeSessionWithPeriodIds( + session, + getPeriodIdsForTransaction({ + sessionConfig: session, + target: parameters.to, + selector, + timestamp: BigInt(Math.floor(Date.now() / 1000)), + }), + ), + }, + customPaymasterHandler, + ); +} diff --git a/packages/agw-client/src/actions/sendTransactionInternal.ts b/packages/agw-client/src/actions/sendTransactionInternal.ts index da078718..9114700b 100644 --- a/packages/agw-client/src/actions/sendTransactionInternal.ts +++ b/packages/agw-client/src/actions/sendTransactionInternal.ts @@ -10,9 +10,8 @@ import { type Transport, type WalletClient, } from 'viem'; -import { getChainId, sendRawTransaction } from 'viem/actions'; +import { sendRawTransaction } from 'viem/actions'; import { - assertCurrentChain, getAction, getTransactionError, type GetTransactionErrorParameters, @@ -28,6 +27,7 @@ import { INSUFFICIENT_BALANCE_SELECTOR } from '../constants.js'; import { AccountNotFoundError } from '../errors/account.js'; import { InsufficientBalanceError } from '../errors/insufficientBalance.js'; import type { CustomPaymasterHandler } from '../types/customPaymaster.js'; +import type { OptimisticTransactionParameters } from '../types/optimisticTransaction.js'; import { prepareTransactionRequest } from './prepareTransaction.js'; import { signTransaction } from './signTransaction.js'; @@ -49,6 +49,7 @@ export async function sendTransactionInternal< validator: Address, validationHookData: Record = {}, customPaymasterHandler: CustomPaymasterHandler | undefined = undefined, + optimisticData: OptimisticTransactionParameters | undefined = undefined, ): Promise { const { chain = client.chain } = parameters; @@ -69,32 +70,20 @@ export async function sendTransactionInternal< { ...parameters, parameters: ['gas', 'nonce', 'fees'], - isSponsored: - customPaymasterHandler !== undefined || - (parameters as any).paymaster !== undefined, + optimistic: optimisticData, } as any, ); - let chainId: number | undefined; - if (chain !== null) { - chainId = await getAction(signerClient, getChainId, 'getChainId')({}); - assertCurrentChain({ - currentChainId: chainId, - chain, - }); - } - const serializedTransaction = await signTransaction( client, signerClient, publicClient, - { - ...request, - chainId, - } as any, + request as any, validator, validationHookData, customPaymasterHandler, + false, + optimisticData, ); return await getAction( client, diff --git a/packages/agw-client/src/actions/signTransaction.ts b/packages/agw-client/src/actions/signTransaction.ts index c586f88b..1e083ab3 100644 --- a/packages/agw-client/src/actions/signTransaction.ts +++ b/packages/agw-client/src/actions/signTransaction.ts @@ -28,6 +28,7 @@ import { import { AccountNotFoundError } from '../errors/account.js'; import { assertSessionKeyPolicies } from '../sessionValidator.js'; import type { CustomPaymasterHandler } from '../types/customPaymaster.js'; +import type { OptimisticTransactionParameters } from '../types/optimisticTransaction.js'; import { VALID_CHAINS } from '../utils.js'; import { transformHexValues } from '../utils.js'; import { signPrivyTransaction } from './sendPrivyTransaction.js'; @@ -45,6 +46,7 @@ export async function signTransaction< validationHookData: Record = {}, customPaymasterHandler: CustomPaymasterHandler | undefined = undefined, isPrivyCrossApp = false, + optimisticData: OptimisticTransactionParameters | undefined = undefined, ): Promise { const chain = client.chain; @@ -63,6 +65,7 @@ export async function signTransaction< validator, validationHookData, customPaymasterHandler, + optimisticData, ); return chain.serializers.transaction( @@ -87,6 +90,7 @@ export async function signEip712TransactionInternal< validator: Address, validationHookData: Record = {}, customPaymasterHandler: CustomPaymasterHandler | undefined = undefined, + optimisticData: OptimisticTransactionParameters | undefined = undefined, ): Promise<{ transaction: UnionRequiredBy & { chainId: number; @@ -132,7 +136,9 @@ export async function signEip712TransactionInternal< if (!chain?.custom?.getEip712Domain) throw new BaseError('`getEip712Domain` not found on chain.'); - const chainId = await getAction(client, getChainId, 'getChainId')({}); + const chainId = optimisticData + ? chain.id + : await getAction(client, getChainId, 'getChainId')({}); if (chain !== null) assertCurrentChain({ currentChainId: chainId, @@ -175,16 +181,18 @@ export async function signEip712TransactionInternal< } else { const hookData: Hex[] = []; if (!useSignerAddress) { - const validationHooks = await getAction( - client, - readContract, - 'readContract', - )({ - address: client.account.address, - abi: AGWAccountAbi, - functionName: 'listHooks', - args: [true], - }); + const validationHooks = + optimisticData?.validationHooks ?? + (await getAction( + client, + readContract, + 'readContract', + )({ + address: client.account.address, + abi: AGWAccountAbi, + functionName: 'listHooks', + args: [true], + })); for (const hook of validationHooks) { hookData.push(validationHookData[hook] ?? '0x'); } diff --git a/packages/agw-client/src/actions/signTransactionForSession.ts b/packages/agw-client/src/actions/signTransactionForSession.ts index 7ca16961..8ee5d5ba 100644 --- a/packages/agw-client/src/actions/signTransactionForSession.ts +++ b/packages/agw-client/src/actions/signTransactionForSession.ts @@ -22,6 +22,7 @@ import { type SessionConfig, } from '../sessions.js'; import type { CustomPaymasterHandler } from '../types/customPaymaster.js'; +import type { OptimisticTransactionParameters } from '../types/optimisticTransaction.js'; import { isSmartAccountDeployed } from '../utils.js'; import { signTransaction } from './signTransaction.js'; @@ -51,7 +52,9 @@ export async function signTransactionForSession< client: Client, signerClient: WalletClient, publicClient: PublicClient, - parameters: SignEip712TransactionParameters, + parameters: SignEip712TransactionParameters & { + optimistic?: OptimisticTransactionParameters; + }, session: SessionConfig, customPaymasterHandler: CustomPaymasterHandler | undefined = undefined, ): Promise { @@ -71,11 +74,13 @@ export async function signTransactionForSession< throw new BaseError('Transaction to field is not specified'); } + const { optimistic, ...rest } = parameters; + return await signTransaction( client, signerClient, publicClient, - parameters, + rest as SignEip712TransactionParameters, SESSION_KEY_VALIDATOR_ADDRESS, { [SESSION_KEY_VALIDATOR_ADDRESS]: encodeSessionWithPeriodIds( @@ -89,5 +94,7 @@ export async function signTransactionForSession< ), }, customPaymasterHandler, + false, + optimistic, ); } diff --git a/packages/agw-client/src/types/optimisticTransaction.ts b/packages/agw-client/src/types/optimisticTransaction.ts new file mode 100644 index 00000000..02afccc6 --- /dev/null +++ b/packages/agw-client/src/types/optimisticTransaction.ts @@ -0,0 +1,40 @@ +import { + type Account, + type FormattedTransactionRequest, + type GetChainParameter, + type Hex, + maxUint256, + type UnionOmit, +} from 'viem'; +import type { GetAccountParameter } from 'viem/_types/types/account.js'; +import type { ChainEIP712 } from 'viem/chains'; + +import { SESSION_KEY_VALIDATOR_ADDRESS } from '../constants.js'; + +export interface OptimisticTransactionParameters { + balance: bigint; + isDeployed: boolean; + validationHooks: Hex[]; +} + +export const DefaultOptimisticTransactionParameters: OptimisticTransactionParameters = + { + balance: maxUint256, + isDeployed: true, + validationHooks: [SESSION_KEY_VALIDATOR_ADDRESS], + }; + +export type SignOptimisticEip712TransactionParameters< + chain extends ChainEIP712 | undefined = ChainEIP712 | undefined, + account extends Account | undefined = Account | undefined, + chainOverride extends ChainEIP712 | undefined = ChainEIP712 | undefined, +> = UnionOmit< + FormattedTransactionRequest< + chainOverride extends ChainEIP712 ? chainOverride : chain + >, + 'from' +> & + GetAccountParameter & + GetChainParameter & { + optimistic?: OptimisticTransactionParameters; + }; diff --git a/packages/agw-client/src/walletActions.ts b/packages/agw-client/src/walletActions.ts index 43d9b434..12e9963d 100644 --- a/packages/agw-client/src/walletActions.ts +++ b/packages/agw-client/src/walletActions.ts @@ -82,6 +82,7 @@ import { EOA_VALIDATOR_ADDRESS } from './constants.js'; import { type SessionClient, toSessionClient } from './sessionClient.js'; import type { SessionConfig, SessionStatus } from './sessions.js'; import type { CustomPaymasterHandler } from './types/customPaymaster.js'; +import type { SignOptimisticEip712TransactionParameters } from './types/optimisticTransaction.js'; import type { SendTransactionBatchParameters } from './types/sendTransactionBatch.js'; import type { SignTransactionBatchParameters } from './types/signTransactionBatch.js'; @@ -156,7 +157,11 @@ export type SessionClientActions< >, ) => Promise; signTransaction: ( - args: SignEip712TransactionParameters, + args: SignOptimisticEip712TransactionParameters< + chain, + account, + chainOverride + >, ) => Promise; writeContract: WalletActions['writeContract']; signTypedData: WalletActions['signTypedData']; diff --git a/packages/agw-client/test/src/actions/sendTransaction/sendTransactionInternal.test.ts b/packages/agw-client/test/src/actions/sendTransaction/sendTransactionInternal.test.ts index 44d182ec..01affcd3 100644 --- a/packages/agw-client/test/src/actions/sendTransaction/sendTransactionInternal.test.ts +++ b/packages/agw-client/test/src/actions/sendTransaction/sendTransactionInternal.test.ts @@ -176,11 +176,12 @@ describe('sendTransactionInternal', () => { data: isDeployed ? '0x1234' : '0xmockedEncodedData', paymaster: '0x5407B5040dec3D339A9247f3654E59EEccbb6391', paymasterInput: '0x', - chainId: abstractTestnet.id, }), EOA_VALIDATOR_ADDRESS, {}, undefined, + false, + undefined, ); // Validate that the sendRawTransaction call was made with the correct parameters @@ -198,7 +199,8 @@ describe('sendTransactionInternal', () => { ); }); -test('sendTransactionInternal with mismatched chain', async () => { +// skipped because the chain id check is moved into signTransaction +test.skip('sendTransactionInternal with mismatched chain', async () => { const invalidChain = mainnet; expect( async () => From 8a5ebd3c88df87c41ddfb1879575feaebfd6e21d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Coffee=E2=98=95=EF=B8=8F?= Date: Thu, 22 May 2025 23:55:56 -0400 Subject: [PATCH 2/9] remove unused added type --- packages/agw-client/src/actions/prepareTransaction.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/agw-client/src/actions/prepareTransaction.ts b/packages/agw-client/src/actions/prepareTransaction.ts index 950a227f..1332b266 100644 --- a/packages/agw-client/src/actions/prepareTransaction.ts +++ b/packages/agw-client/src/actions/prepareTransaction.ts @@ -112,8 +112,6 @@ export type PrepareTransactionRequestParameterType = | 'nonce' | 'sidecars' | 'type'; -export type BypassChecksParameterType = 'balance' | 'deployment'; - type ParameterTypeToParameters< parameterType extends PrepareTransactionRequestParameterType, > = parameterType extends 'fees' From 3684ef88e339cd3f175834edd0eaa48a3bae463f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Coffee=E2=98=95=EF=B8=8F?= Date: Thu, 22 May 2025 23:57:11 -0400 Subject: [PATCH 3/9] rm file --- .../sendOptimisticTransactionForSession..ts | 74 ------------------- 1 file changed, 74 deletions(-) delete mode 100644 packages/agw-client/src/actions/sendOptimisticTransactionForSession..ts diff --git a/packages/agw-client/src/actions/sendOptimisticTransactionForSession..ts b/packages/agw-client/src/actions/sendOptimisticTransactionForSession..ts deleted file mode 100644 index c1e9d90d..00000000 --- a/packages/agw-client/src/actions/sendOptimisticTransactionForSession..ts +++ /dev/null @@ -1,74 +0,0 @@ -import { - type Account, - BaseError, - type Client, - type Hex, - type PublicClient, - type SendTransactionRequest, - type Transport, - type WalletClient, -} from 'viem'; -import { - type ChainEIP712, - type SendEip712TransactionParameters, - type SendEip712TransactionReturnType, -} from 'viem/zksync'; - -import { SESSION_KEY_VALIDATOR_ADDRESS } from '../constants.js'; -import { - encodeSessionWithPeriodIds, - getPeriodIdsForTransaction, - type SessionConfig, -} from '../sessions.js'; -import type { CustomPaymasterHandler } from '../types/customPaymaster.js'; -import { sendTransactionInternal } from './sendTransactionInternal.js'; - -export async function sendOptimisticTransactionForSession< - chain extends ChainEIP712 | undefined = ChainEIP712 | undefined, - account extends Account | undefined = Account | undefined, - chainOverride extends ChainEIP712 | undefined = ChainEIP712 | undefined, - const request extends SendTransactionRequest< - chain, - chainOverride - > = SendTransactionRequest, ->( - client: Client, - signerClient: WalletClient, - publicClient: PublicClient, - parameters: SendEip712TransactionParameters< - chain, - account, - chainOverride, - request - >, - session: SessionConfig, - customPaymasterHandler: CustomPaymasterHandler | undefined = undefined, -): Promise { - const selector: Hex | undefined = parameters.data - ? `0x${parameters.data.slice(2, 10)}` - : undefined; - - if (!parameters.to) { - throw new BaseError('Transaction to field is not specified'); - } - - return sendTransactionInternal( - client, - signerClient, - publicClient, - parameters, - SESSION_KEY_VALIDATOR_ADDRESS, - { - [SESSION_KEY_VALIDATOR_ADDRESS]: encodeSessionWithPeriodIds( - session, - getPeriodIdsForTransaction({ - sessionConfig: session, - target: parameters.to, - selector, - timestamp: BigInt(Math.floor(Date.now() / 1000)), - }), - ), - }, - customPaymasterHandler, - ); -} From 5b3364261f3d9d563a92e00e9168d3a1987897f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Coffee=E2=98=95=EF=B8=8F?= Date: Fri, 23 May 2025 00:06:34 -0400 Subject: [PATCH 4/9] =?UTF-8?q?as=20any=20=F0=9F=99=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/agw-client/src/walletActions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/agw-client/src/walletActions.ts b/packages/agw-client/src/walletActions.ts index 12e9963d..1d10a68d 100644 --- a/packages/agw-client/src/walletActions.ts +++ b/packages/agw-client/src/walletActions.ts @@ -217,7 +217,7 @@ export function sessionWalletActions( client, signerClient, publicClient, - args, + args as any, session, paymasterHandler, ), From 5743064d735a8e59491523620c8ce267572f341a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Coffee=E2=98=95=EF=B8=8F?= Date: Fri, 23 May 2025 00:09:17 -0400 Subject: [PATCH 5/9] changeset --- .changeset/perfect-tools-buy.md | 5 +++++ .changeset/pre.json | 10 ++++++++++ 2 files changed, 15 insertions(+) create mode 100644 .changeset/perfect-tools-buy.md create mode 100644 .changeset/pre.json diff --git a/.changeset/perfect-tools-buy.md b/.changeset/perfect-tools-buy.md new file mode 100644 index 00000000..845ef572 --- /dev/null +++ b/.changeset/perfect-tools-buy.md @@ -0,0 +1,5 @@ +--- +'@abstract-foundation/agw-client': minor +--- + +feat: add optimistic transaction parameters to sign transaction for session to reduce rpc calls diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 00000000..dc84386c --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,10 @@ +{ + "mode": "pre", + "tag": "beta", + "initialVersions": { + "@abstract-foundation/agw-client": "1.8.2", + "@abstract-foundation/agw-react": "1.8.2", + "@abstract-foundation/web3-react-agw": "1.7.2" + }, + "changesets": [] +} From 7e9922ff41b7ad138dc663c6e0730808246db348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Coffee=E2=98=95=EF=B8=8F?= Date: Fri, 23 May 2025 11:24:10 -0400 Subject: [PATCH 6/9] remove redundant check for deployed contract --- .../agw-client/src/actions/signTransactionForSession.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/agw-client/src/actions/signTransactionForSession.ts b/packages/agw-client/src/actions/signTransactionForSession.ts index 8ee5d5ba..ae8a4ecb 100644 --- a/packages/agw-client/src/actions/signTransactionForSession.ts +++ b/packages/agw-client/src/actions/signTransactionForSession.ts @@ -58,14 +58,6 @@ export async function signTransactionForSession< session: SessionConfig, customPaymasterHandler: CustomPaymasterHandler | undefined = undefined, ): Promise { - const isDeployed = await isSmartAccountDeployed( - publicClient, - client.account.address, - ); - if (!isDeployed) { - throw new BaseError('Smart account not deployed'); - } - const selector: Hex | undefined = parameters.data ? `0x${parameters.data.slice(2, 10)}` : undefined; From 61d993dfad220a91ad7c94fbdfb6c21bd2cd3ca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Coffee=E2=98=95=EF=B8=8F?= Date: Fri, 23 May 2025 11:26:22 -0400 Subject: [PATCH 7/9] rm import --- packages/agw-client/src/actions/signTransactionForSession.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/agw-client/src/actions/signTransactionForSession.ts b/packages/agw-client/src/actions/signTransactionForSession.ts index ae8a4ecb..05625de4 100644 --- a/packages/agw-client/src/actions/signTransactionForSession.ts +++ b/packages/agw-client/src/actions/signTransactionForSession.ts @@ -23,7 +23,6 @@ import { } from '../sessions.js'; import type { CustomPaymasterHandler } from '../types/customPaymaster.js'; import type { OptimisticTransactionParameters } from '../types/optimisticTransaction.js'; -import { isSmartAccountDeployed } from '../utils.js'; import { signTransaction } from './signTransaction.js'; export interface SendTransactionForSessionParameters< From bd312a5d864767fdb69d2ab1c78de996ebb26a5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?coffee=20=E2=98=95=EF=B8=8F?= Date: Fri, 6 Jun 2025 10:16:06 -0400 Subject: [PATCH 8/9] exit pre --- .changeset/pre.json | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 .changeset/pre.json diff --git a/.changeset/pre.json b/.changeset/pre.json deleted file mode 100644 index dc84386c..00000000 --- a/.changeset/pre.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "mode": "pre", - "tag": "beta", - "initialVersions": { - "@abstract-foundation/agw-client": "1.8.2", - "@abstract-foundation/agw-react": "1.8.2", - "@abstract-foundation/web3-react-agw": "1.7.2" - }, - "changesets": [] -} From b0d30e87ccd46cb8d2b19f00d629f0f02510cc61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?coffee=20=E2=98=95=EF=B8=8F?= Date: Fri, 6 Jun 2025 10:25:25 -0400 Subject: [PATCH 9/9] add experimental export and jsdoc --- packages/agw-client/package.json | 8 ++++++++ packages/agw-client/src/exports/experimental.ts | 4 ++++ .../src/types/optimisticTransaction.ts | 16 ++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 packages/agw-client/src/exports/experimental.ts diff --git a/packages/agw-client/package.json b/packages/agw-client/package.json index 3a10a90f..fbafb00a 100644 --- a/packages/agw-client/package.json +++ b/packages/agw-client/package.json @@ -34,6 +34,11 @@ "import": "./dist/esm/exports/actions.js", "require": "./dist/cjs/exports/actions.js" }, + "./experimental": { + "types": "./dist/types/exports/experimental.d.ts", + "import": "./dist/esm/exports/experimental.js", + "require": "./dist/cjs/exports/experimental.js" + }, "./constants": { "types": "./dist/types/exports/constants.d.ts", "import": "./dist/esm/exports/constants.js", @@ -53,6 +58,9 @@ "constants": [ "./dist/types/exports/constants.d.ts" ], + "experimental": [ + "./dist/types/exports/experimental.d.ts" + ], "sessions": [ "./dist/types/exports/sessions.d.ts" ] diff --git a/packages/agw-client/src/exports/experimental.ts b/packages/agw-client/src/exports/experimental.ts new file mode 100644 index 00000000..8fd4ec61 --- /dev/null +++ b/packages/agw-client/src/exports/experimental.ts @@ -0,0 +1,4 @@ +export { + DefaultOptimisticTransactionParameters, + type OptimisticTransactionParameters, +} from '../types/optimisticTransaction.js'; diff --git a/packages/agw-client/src/types/optimisticTransaction.ts b/packages/agw-client/src/types/optimisticTransaction.ts index 02afccc6..7540efc1 100644 --- a/packages/agw-client/src/types/optimisticTransaction.ts +++ b/packages/agw-client/src/types/optimisticTransaction.ts @@ -11,12 +11,27 @@ import type { ChainEIP712 } from 'viem/chains'; import { SESSION_KEY_VALIDATOR_ADDRESS } from '../constants.js'; +/** + * Parameters for configuring an optimistic transaction (experimental) + * @property {bigint} balance - The current balance of the wallet used for the transaction + * @property {boolean} isDeployed - Deployment status of the account + * @property {Hex[]} validationHooks - Array of validation hooks installed in the wallet + */ export interface OptimisticTransactionParameters { + /** The current balance of the wallet used for the transaction */ balance: bigint; + /** Deployment status of the account */ isDeployed: boolean; + /** Array of validation hooks installed in the wallet */ validationHooks: Hex[]; } +/** + * Default parameters for an optimistic transaction. + * - balance: uint256 max + * - isDeployed: true + * - validationHooks: array with single item of session key validator + */ export const DefaultOptimisticTransactionParameters: OptimisticTransactionParameters = { balance: maxUint256, @@ -36,5 +51,6 @@ export type SignOptimisticEip712TransactionParameters< > & GetAccountParameter & GetChainParameter & { + /** @experimental This parameter is experimental and subject to change */ optimistic?: OptimisticTransactionParameters; };