diff --git a/package.json b/package.json index 63452e6f37..5c72387c12 100644 --- a/package.json +++ b/package.json @@ -169,7 +169,7 @@ { "name": "import * from 'viem/chains'", "path": "./src/_esm/chains/index.js", - "limit": "39 kB", + "limit": "39.04 kB", "import": "*" }, { diff --git a/src/accounts/utils/signTransaction.test.ts b/src/accounts/utils/signTransaction.test.ts index ae1586751f..774493b6cc 100644 --- a/src/accounts/utils/signTransaction.test.ts +++ b/src/accounts/utils/signTransaction.test.ts @@ -333,7 +333,7 @@ describe('with custom EIP2718 serializer', () => { test('default', async () => { const exampleSerializer: SerializeTransactionFn = vi.fn( - (transaction) => { + async (transaction) => { const { chainId, nonce, diff --git a/src/accounts/utils/signTransaction.ts b/src/accounts/utils/signTransaction.ts index 3fc45ba228..6a8cabc77e 100644 --- a/src/accounts/utils/signTransaction.ts +++ b/src/accounts/utils/signTransaction.ts @@ -62,11 +62,11 @@ export async function signTransaction< })() const signature = await sign({ - hash: keccak256(serializer(signableTransaction)), + hash: keccak256(await serializer(signableTransaction)), privateKey, }) - return serializer(transaction, signature) as SignTransactionReturnType< - serializer, - transaction - > + return (await serializer( + transaction, + signature, + )) as SignTransactionReturnType } diff --git a/src/actions/wallet/sendTransaction.test.ts b/src/actions/wallet/sendTransaction.test.ts index 8c0e0c9676..209a19bd3d 100644 --- a/src/actions/wallet/sendTransaction.test.ts +++ b/src/actions/wallet/sendTransaction.test.ts @@ -138,7 +138,7 @@ test('sends transaction (w/ serializer)', async () => { }) const serializer = vi.fn( - ( + async ( txn: TransactionSerializable & { additionalField?: Hex }, @@ -238,7 +238,7 @@ test('client chain mismatch', async () => { Current Chain ID: 1 Expected Chain ID: 42220 – Celo - + Request Arguments: from: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 to: 0x70997970c51812dc3a010c7d01b50e0d17dc79c8 @@ -366,12 +366,12 @@ describe('args: gasPrice', () => { This error could arise when the account does not have enough funds to: - pay for the total gas fee, - pay for the value to send. - + The cost of the transaction is calculated as \`gas * gas fee + value\`, where: - \`gas\` is the amount of gas needed for transaction to execute, - \`gas fee\` is the gas fee, - \`value\` is the amount of ether to send to the recipient. - + Request Arguments: from: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 to: 0x70997970c51812dc3a010c7d01b50e0d17dc79c8 @@ -440,12 +440,12 @@ describe('args: maxFeePerGas', () => { This error could arise when the account does not have enough funds to: - pay for the total gas fee, - pay for the value to send. - + The cost of the transaction is calculated as \`gas * gas fee + value\`, where: - \`gas\` is the amount of gas needed for transaction to execute, - \`gas fee\` is the gas fee, - \`value\` is the amount of ether to send to the recipient. - + Request Arguments: from: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 to: 0x70997970c51812dc3a010c7d01b50e0d17dc79c8 @@ -594,7 +594,7 @@ describe('args: chain', async () => { Current Chain ID: 1 Expected Chain ID: 10 – OP Mainnet - + Request Arguments: chain: OP Mainnet (id: 10) from: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 @@ -811,12 +811,12 @@ describe('local account', () => { This error could arise when the account does not have enough funds to: - pay for the total gas fee, - pay for the value to send. - + The cost of the transaction is calculated as \`gas * gas fee + value\`, where: - \`gas\` is the amount of gas needed for transaction to execute, - \`gas fee\` is the gas fee, - \`value\` is the amount of ether to send to the recipient. - + Request Arguments: from: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 to: 0x70997970c51812dc3a010c7d01b50e0d17dc79c8 @@ -1323,12 +1323,12 @@ describe('errors', () => { This error could arise when the account does not have enough funds to: - pay for the total gas fee, - pay for the value to send. - + The cost of the transaction is calculated as \`gas * gas fee + value\`, where: - \`gas\` is the amount of gas needed for transaction to execute, - \`gas fee\` is the gas fee, - \`value\` is the amount of ether to send to the recipient. - + Request Arguments: from: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 to: 0x70997970c51812dc3a010c7d01b50e0d17dc79c8 diff --git a/src/celo/parsers.test.ts b/src/celo/parsers.test.ts index 0b55ca73a2..39a80234fb 100644 --- a/src/celo/parsers.test.ts +++ b/src/celo/parsers.test.ts @@ -39,8 +39,8 @@ const transaction = { value: parseEther('1'), } -test('should return same result as standard parser when not CIP42 or CIP64', () => { - const serialized = serializeTransaction_(transaction) +test('should return same result as standard parser when not CIP42 or CIP64', async () => { + const serialized = await serializeTransaction_(transaction) expect(parseTransaction(serialized)).toEqual(parseTransaction_(serialized)) }) @@ -206,7 +206,7 @@ describe('should parse a CIP64 transaction', () => { type: 'cip64', } as TransactionSerializableCIP64 - test('when type is not specified, but the fields match CIP64', () => { + test('when type is not specified, but the fields match CIP64', async () => { const transactionWithoutType = { ...transaction, feeCurrency: '0x765de816845861e75a25fca122bb6898b8b1282a', @@ -214,7 +214,7 @@ describe('should parse a CIP64 transaction', () => { chainId: 42270, } as TransactionSerializableCIP64 - const serialized = serializeTransaction(transactionWithoutType) + const serialized = await serializeTransaction(transactionWithoutType) expect(parseTransaction(serialized)).toMatchInlineSnapshot(` { @@ -231,7 +231,7 @@ describe('should parse a CIP64 transaction', () => { `) }) - test('with access list', () => { + test('with access list', async () => { const transactionWithAccessList: TransactionSerializableCIP64 = { ...transactionCip64, accessList: [ @@ -245,7 +245,7 @@ describe('should parse a CIP64 transaction', () => { ], } - const serialized = serializeTransaction(transactionWithAccessList) + const serialized = await serializeTransaction(transactionWithAccessList) expect(parseTransaction(serialized)).toMatchInlineSnapshot(` { @@ -270,13 +270,13 @@ describe('should parse a CIP64 transaction', () => { } `) }) - test('with data as 0x', () => { + test('with data as 0x', async () => { const transactionWithData: TransactionSerializableCIP64 = { ...transactionCip64, data: '0x', } - const serialized = serializeTransaction(transactionWithData) + const serialized = await serializeTransaction(transactionWithData) expect(parseTransaction(serialized)).toMatchInlineSnapshot(` { @@ -292,13 +292,13 @@ describe('should parse a CIP64 transaction', () => { } `) }) - test('with data', () => { + test('with data', async () => { const transactionWithData: TransactionSerializableCIP64 = { ...transactionCip64, data: '0x1234', } - const serialized = serializeTransaction(transactionWithData) + const serialized = await serializeTransaction(transactionWithData) expect(parseTransaction(serialized)).toMatchInlineSnapshot(` { diff --git a/src/celo/serializers.test.ts b/src/celo/serializers.test.ts index 7ec8bcad28..c926da4a80 100644 --- a/src/celo/serializers.test.ts +++ b/src/celo/serializers.test.ts @@ -43,9 +43,9 @@ const baseCip64 = { } as TransactionSerializableCIP64 describe('cip64', () => { - test('should be able to serialize a cip64 transaction', () => { + test('should be able to serialize a cip64 transaction', async () => { // sanity checks the serialized value, but then rely on the parser - const serialized = serializeTransaction(baseCip64) + const serialized = await serializeTransaction(baseCip64) const reparsed = parseTransaction(serialized) const reserialized = serializeTransaction(reparsed) expect(serialized).toEqual( @@ -55,7 +55,7 @@ describe('cip64', () => { expect(serialized).toEqual(reserialized) }) - test('args: accessList', () => { + test('args: accessList', async () => { const transaction: TransactionSerializableCIP64 = { ...baseCip64, accessList: [ @@ -69,109 +69,109 @@ describe('cip64', () => { ], } - expect(parseTransaction(serializeTransaction(transaction))).toEqual({ + expect(parseTransaction(await serializeTransaction(transaction))).toEqual({ ...transaction, type: 'cip64', }) }) - test('args: data', () => { + test('args: data', async () => { const transaction: TransactionSerializableCIP64 = { ...baseCip64, data: '0x1234', } - expect(parseTransaction(serializeTransaction(transaction))).toEqual({ + expect(parseTransaction(await serializeTransaction(transaction))).toEqual({ ...transaction, type: 'cip64', }) }) - test('args: gas', () => { + test('args: gas', async () => { const transaction: TransactionSerializableCIP64 = { ...baseCip64, gas: 69420n, } - expect(parseTransaction(serializeTransaction(transaction))).toEqual({ + expect(parseTransaction(await serializeTransaction(transaction))).toEqual({ ...transaction, type: 'cip64', }) }) - test('args: gas (absent)', () => { + test('args: gas (absent)', async () => { const transaction: TransactionSerializableCIP64 = { ...baseCip64, gas: undefined, } - expect(parseTransaction(serializeTransaction(transaction))).toEqual({ + expect(parseTransaction(await serializeTransaction(transaction))).toEqual({ ...transaction, type: 'cip64', }) }) - test('args: maxFeePerGas (absent)', () => { + test('args: maxFeePerGas (absent)', async () => { const transaction: TransactionSerializableCIP64 = { ...baseCip64, type: 'cip64', maxFeePerGas: undefined, } - expect(parseTransaction(serializeTransaction(transaction))).toEqual({ + expect(parseTransaction(await serializeTransaction(transaction))).toEqual({ ...transaction, type: 'cip64', }) }) - test('args: maxPriorityFeePerGas (absent)', () => { + test('args: maxPriorityFeePerGas (absent)', async () => { const transaction: TransactionSerializableCIP64 = { ...baseCip64, type: 'cip64', maxPriorityFeePerGas: undefined, } - expect(parseTransaction(serializeTransaction(transaction))).toEqual({ + expect(parseTransaction(await serializeTransaction(transaction))).toEqual({ ...transaction, type: 'cip64', }) }) - test('args: nonce (absent)', () => { + test('args: nonce (absent)', async () => { const transaction: TransactionSerializableCIP64 = { ...baseCip64, nonce: undefined, } - expect(parseTransaction(serializeTransaction(transaction))).toEqual({ + expect(parseTransaction(await serializeTransaction(transaction))).toEqual({ ...transaction, type: 'cip64', }) }) - test('args: to (absent)', () => { + test('args: to (absent)', async () => { const transaction: TransactionSerializableCIP64 = { ...baseCip64, to: undefined, } - expect(parseTransaction(serializeTransaction(transaction))).toEqual({ + expect(parseTransaction(await serializeTransaction(transaction))).toEqual({ ...transaction, type: 'cip64', }) }) - test('args: value (absent)', () => { + test('args: value (absent)', async () => { const transaction: TransactionSerializableCIP64 = { ...baseCip64, value: undefined, } - expect(parseTransaction(serializeTransaction(transaction))).toEqual({ + expect(parseTransaction(await serializeTransaction(transaction))).toEqual({ ...transaction, type: 'cip64', }) }) - test('type is undefined but has cip64 fields (feeCurrency, but not gateway*)', () => { + test('type is undefined but has cip64 fields (feeCurrency, but not gateway*)', async () => { const transaction: TransactionSerializableCIP64 = { ...baseCip64, feeCurrency: '0xd8763cba276a3738e6de85b4b3bf5fded6d6ca73', type: undefined, } - expect(parseTransaction(serializeTransaction(transaction))).toEqual({ + expect(parseTransaction(await serializeTransaction(transaction))).toEqual({ ...transaction, type: 'cip64', }) @@ -223,13 +223,15 @@ describe('cip64', () => { expect(parseTransaction(tx1)).toEqual({ ...baseCip64, type: 'cip64' }) }) - test('CIP-42 transaction should be discarded and sent as CIP-64', () => { + test('CIP-42 transaction should be discarded and sent as CIP-64', async () => { const transaction: TransactionSerializableCIP42 = { ...baseCip42, type: 'cip42', } - expect(parseTransaction(serializeTransaction(transaction as any))).toEqual({ + expect( + parseTransaction(await serializeTransaction(transaction as any)), + ).toEqual({ ...transaction, gatewayFee: undefined, gatewayFeeRecipient: undefined, @@ -331,8 +333,8 @@ describe('not cip42', () => { value: parseEther('1'), } - test('it calls the standard serializeTransaction', () => { - const serialized = serializeTransaction(transaction) + test('it calls the standard serializeTransaction', async () => { + const serialized = await serializeTransaction(transaction) expect(serialized).toEqual( '0x02ed0180847735940084773594008094f39fd6e51aad88f6f4ce6ab8827279cfffb92266880de0b6b3a764000080c0', ) @@ -348,7 +350,7 @@ describe('not cip42', () => { }) describe('op-stack based transactions', () => { - test('serializes deposit transactions', () => { + test('serializes deposit transactions', async () => { const opDepositTransaction = { from: '0x977f82a600a1414e583f7f13623f1ac5d58b1c0b', sourceHash: @@ -356,7 +358,7 @@ describe('op-stack based transactions', () => { type: 'deposit', } as const satisfies TransactionSerializableDeposit - const serialized = serializeTransaction(opDepositTransaction) + const serialized = await serializeTransaction(opDepositTransaction) expect(serialized.startsWith('0x7e')).toBe(true) expect(serialized).toEqual( '0x7ef83ca018040f35752170c3339ddcd850f185c9cc46bdef4d6e1f2ab323f4d3d710431994977f82a600a1414e583f7f13623f1ac5d58b1c0b808080808080', diff --git a/src/celo/serializers.ts b/src/celo/serializers.ts index b65d058bfa..adee5e97ac 100644 --- a/src/celo/serializers.ts +++ b/src/celo/serializers.ts @@ -20,7 +20,7 @@ import type { } from './types.js' import { isCIP64, isEmpty, isPresent } from './utils.js' -export function serializeTransaction( +export async function serializeTransaction( transaction: CeloTransactionSerializable, signature?: Signature | undefined, ) { diff --git a/src/op-stack/actions/depositTransaction.test.ts b/src/op-stack/actions/depositTransaction.test.ts index 0709c8aa2f..e346120bf0 100644 --- a/src/op-stack/actions/depositTransaction.test.ts +++ b/src/op-stack/actions/depositTransaction.test.ts @@ -277,18 +277,18 @@ test('error: insufficient funds', async () => { This error could arise when the account does not have enough funds to: - pay for the total gas fee, - pay for the value to send. - + The cost of the transaction is calculated as \`gas * gas fee + value\`, where: - \`gas\` is the amount of gas needed for transaction to execute, - \`gas fee\` is the gas fee, - \`value\` is the amount of ether to send to the recipient. - + Estimate Gas Arguments: from: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 to: 0x49048044D57e1C92A77f79988d21Fa8fAF74E97e value: 20000 ETH data: 0xe9e05c42000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000043c33c19375648000000000000000000000000000000000000000000000000000000000000000005208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000 - + Contract Call: address: 0x0000000000000000000000000000000000000000 function: depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) @@ -317,13 +317,13 @@ test('error: small gas', async () => { URL: http://localhost Request body: {"method":"eth_estimateGas","params":[{"data":"0xe9e05c42000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000","from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","gas":"0x45","to":"0x49048044D57e1C92A77f79988d21Fa8fAF74E97e"}]} - + Estimate Gas Arguments: from: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 to: 0x49048044D57e1C92A77f79988d21Fa8fAF74E97e data: 0xe9e05c42000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000 gas: 69 - + Contract Call: address: 0x0000000000000000000000000000000000000000 function: depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) @@ -365,7 +365,7 @@ test.skip( hash, }) - const [l2Hash] = getL2TransactionHashes(receipt) + const [l2Hash] = await getL2TransactionHashes(receipt) await waitForTransactionReceipt(client_opSepolia, { hash: l2Hash, diff --git a/src/op-stack/actions/estimateL1Fee.ts b/src/op-stack/actions/estimateL1Fee.ts index 169ea1b272..4e9c7cb68e 100644 --- a/src/op-stack/actions/estimateL1Fee.ts +++ b/src/op-stack/actions/estimateL1Fee.ts @@ -108,7 +108,7 @@ export async function estimateL1Fee< assertRequest(request as AssertRequestParameters) - const transaction = serializeTransaction({ + const transaction = await serializeTransaction({ ...request, type: 'eip1559', } as TransactionSerializable) diff --git a/src/op-stack/actions/estimateL1Gas.ts b/src/op-stack/actions/estimateL1Gas.ts index 879f676282..14c520a478 100644 --- a/src/op-stack/actions/estimateL1Gas.ts +++ b/src/op-stack/actions/estimateL1Gas.ts @@ -108,7 +108,7 @@ export async function estimateL1Gas< assertRequest(request as AssertRequestParameters) - const transaction = serializeTransaction({ + const transaction = await serializeTransaction({ ...request, type: 'eip1559', } as TransactionSerializable) diff --git a/src/op-stack/parsers.test.ts b/src/op-stack/parsers.test.ts index 71eeb18423..b44585ddd2 100644 --- a/src/op-stack/parsers.test.ts +++ b/src/op-stack/parsers.test.ts @@ -13,68 +13,68 @@ describe('deposit', () => { type: 'deposit', } as const satisfies TransactionSerializableDeposit - test('default', () => { - const serialized = serializeTransaction(baseTransaction) + test('default', async () => { + const serialized = await serializeTransaction(baseTransaction) const transaction = parseTransaction(serialized) expect(transaction).toEqual(baseTransaction) }) - test('args: data', () => { + test('args: data', async () => { const tx = { ...baseTransaction, data: '0xdeadbeef', } as const satisfies TransactionSerializableDeposit - const serialized = serializeTransaction(tx) + const serialized = await serializeTransaction(tx) const transaction = parseTransaction(serialized) expect(transaction).toEqual(tx) }) - test('args: gas', () => { + test('args: gas', async () => { const tx = { ...baseTransaction, gas: 69420n, } as const satisfies TransactionSerializableDeposit - const serialized = serializeTransaction(tx) + const serialized = await serializeTransaction(tx) const transaction = parseTransaction(serialized) expect(transaction).toEqual(tx) }) - test('args: isSystemTx', () => { + test('args: isSystemTx', async () => { const tx = { ...baseTransaction, isSystemTx: true, } as const satisfies TransactionSerializableDeposit - const serialized = serializeTransaction(tx) + const serialized = await serializeTransaction(tx) const transaction = parseTransaction(serialized) expect(transaction).toEqual(tx) }) - test('args: mint', () => { + test('args: mint', async () => { const tx = { ...baseTransaction, mint: 69420n, } as const satisfies TransactionSerializableDeposit - const serialized = serializeTransaction(tx) + const serialized = await serializeTransaction(tx) const transaction = parseTransaction(serialized) expect(transaction).toEqual(tx) }) - test('args: to', () => { + test('args: to', async () => { const tx = { ...baseTransaction, to: '0xaabbccddeeff00112233445566778899aabbccdd', } as const satisfies TransactionSerializableDeposit - const serialized = serializeTransaction(tx) + const serialized = await serializeTransaction(tx) const transaction = parseTransaction(serialized) expect(transaction).toEqual(tx) }) - test('args: value', () => { + test('args: value', async () => { const tx = { ...baseTransaction, value: 69420n, } as const satisfies TransactionSerializableDeposit - const serialized = serializeTransaction(tx) + const serialized = await serializeTransaction(tx) const transaction = parseTransaction(serialized) expect(transaction).toEqual(tx) }) @@ -107,7 +107,7 @@ describe('eip1559', () => { value: parseEther('1'), } as const - const serialized = serializeTransaction(transaction) + const serialized = await serializeTransaction(transaction) expect(parseTransaction(serialized)).toEqual(transaction) }) }) diff --git a/src/op-stack/serializers.test.ts b/src/op-stack/serializers.test.ts index 2cd676042d..527caea22d 100644 --- a/src/op-stack/serializers.test.ts +++ b/src/op-stack/serializers.test.ts @@ -21,67 +21,67 @@ describe('deposit', async () => { type: 'deposit', } as const satisfies TransactionSerializableDeposit - test('default', () => { - const serialized = serializeTransaction(baseTransaction) + test('default', async () => { + const serialized = await serializeTransaction(baseTransaction) expect(parseTransaction(serialized)).toEqual(baseTransaction) }) - test('args: data', () => { + test('args: data', async () => { const tx = { ...baseTransaction, data: '0xdeadbeef', } as const satisfies TransactionSerializableDeposit - const serialized = serializeTransaction(tx) + const serialized = await serializeTransaction(tx) expect(parseTransaction(serialized)).toEqual(tx) }) - test('args: gas', () => { + test('args: gas', async () => { const tx = { ...baseTransaction, gas: 69420n, } as const satisfies TransactionSerializableDeposit - const serialized = serializeTransaction(tx) + const serialized = await serializeTransaction(tx) expect(parseTransaction(serialized)).toEqual(tx) }) - test('args: isSystemTx', () => { + test('args: isSystemTx', async () => { const tx = { ...baseTransaction, isSystemTx: true, } as const satisfies TransactionSerializableDeposit - const serialized = serializeTransaction(tx) + const serialized = await serializeTransaction(tx) expect(parseTransaction(serialized)).toEqual(tx) }) - test('args: mint', () => { + test('args: mint', async () => { const tx = { ...baseTransaction, mint: 69420n, } as const satisfies TransactionSerializableDeposit - const serialized = serializeTransaction(tx) + const serialized = await serializeTransaction(tx) expect(parseTransaction(serialized)).toEqual(tx) }) - test('args: to', () => { + test('args: to', async () => { const tx = { ...baseTransaction, to: '0xaabbccddeeff00112233445566778899aabbccdd', } as const satisfies TransactionSerializableDeposit - const serialized = serializeTransaction(tx) + const serialized = await serializeTransaction(tx) expect(parseTransaction(serialized)).toEqual(tx) }) - test('args: value', () => { + test('args: value', async () => { const tx = { ...baseTransaction, value: 69420n, } as const satisfies TransactionSerializableDeposit - const serialized = serializeTransaction(tx) + const serialized = await serializeTransaction(tx) expect(parseTransaction(serialized)).toEqual(tx) }) - test('args: no type', () => { - const serialized = serializeTransaction({ + test('args: no type', async () => { + const serialized = await serializeTransaction({ ...baseTransaction, type: undefined, } as any) @@ -90,12 +90,14 @@ describe('deposit', async () => { ) }) - test('error: invalid to', () => { + test('error: invalid to', async () => { const tx = { ...baseTransaction, to: '0xaabbccddeeff00112233445566778899aabbccd', } as const satisfies TransactionSerializableDeposit - expect(() => serializeTransaction(tx)).toThrowErrorMatchingInlineSnapshot( + expect( + async () => await serializeTransaction(tx), + ).toThrowErrorMatchingInlineSnapshot( ` [InvalidAddressError: Address "0xaabbccddeeff00112233445566778899aabbccd" is invalid. @@ -107,12 +109,14 @@ describe('deposit', async () => { ) }) - test('error: invalid from', () => { + test('error: invalid from', async () => { const tx = { ...baseTransaction, from: '0xaabbccddeeff00112233445566778899aabbccd', } as const satisfies TransactionSerializableDeposit - expect(() => serializeTransaction(tx)).toThrowErrorMatchingInlineSnapshot( + expect( + async () => await serializeTransaction(tx), + ).toThrowErrorMatchingInlineSnapshot( ` [InvalidAddressError: Address "0xaabbccddeeff00112233445566778899aabbccd" is invalid. @@ -137,7 +141,7 @@ describe('deposit', async () => { }) expect( keccak256( - serializeTransaction({ + await serializeTransaction({ ...tx_1, data: tx_1.input, sourceHash: tx_1.sourceHash!, @@ -153,7 +157,7 @@ describe('deposit', async () => { }) expect( keccak256( - serializeTransaction({ + await serializeTransaction({ ...tx_2, data: tx_2.input, sourceHash: tx_2.sourceHash!, @@ -169,7 +173,7 @@ describe('deposit', async () => { }) expect( keccak256( - serializeTransaction({ + await serializeTransaction({ ...tx_3, data: tx_3.input, sourceHash: tx_3.sourceHash!, @@ -185,7 +189,7 @@ describe('deposit', async () => { }) expect( keccak256( - serializeTransaction({ + await serializeTransaction({ ...tx_4, data: tx_4.input, sourceHash: tx_4.sourceHash!, @@ -208,7 +212,7 @@ describe('eip1559', async () => { value: parseEther('1'), } as const - const serialized = serializeTransaction(transaction) + const serialized = await serializeTransaction(transaction) expect(parseTransaction(serialized)).toEqual(transaction) }) }) diff --git a/src/op-stack/serializers.ts b/src/op-stack/serializers.ts index 026a0c8cdb..5342a9e9cf 100644 --- a/src/op-stack/serializers.ts +++ b/src/op-stack/serializers.ts @@ -26,12 +26,12 @@ export type SerializeTransactionErrorType = | SerializeTransactionErrorType_ | ErrorType -export function serializeTransaction( +export async function serializeTransaction( transaction: OpStackTransactionSerializable, signature?: Signature, ) { if (isDeposit(transaction)) return serializeTransactionDeposit(transaction) - return serializeTransaction_( + return await serializeTransaction_( transaction as TransactionSerializable, signature, ) diff --git a/src/op-stack/utils/getL2TransactionHash.test.ts b/src/op-stack/utils/getL2TransactionHash.test.ts index ae71e9b3d6..8b368771ad 100644 --- a/src/op-stack/utils/getL2TransactionHash.test.ts +++ b/src/op-stack/utils/getL2TransactionHash.test.ts @@ -19,7 +19,7 @@ test('default', async () => { logIndex: 109, } as const - const l2Hash = getL2TransactionHash({ log: log as any }) + const l2Hash = await getL2TransactionHash({ log: log as any }) expect(l2Hash).toEqual( '0x0a60b983815ed475c5919609025204a479654d93afc610feca7d99ae0befc329', @@ -33,7 +33,7 @@ test('e2e', async () => { const [log] = extractTransactionDepositedLogs(receipt) - const l2Hash = getL2TransactionHash({ log }) + const l2Hash = await getL2TransactionHash({ log }) expect(l2Hash).toEqual( '0x173cecf8eb5ec89d653bdd4714e4c81697ff7e9285ebf02c562e46b19dfdf424', diff --git a/src/op-stack/utils/getL2TransactionHash.ts b/src/op-stack/utils/getL2TransactionHash.ts index b660dbe979..2d3bdb9473 100644 --- a/src/op-stack/utils/getL2TransactionHash.ts +++ b/src/op-stack/utils/getL2TransactionHash.ts @@ -26,7 +26,9 @@ export type GetL2TransactionHashReturnType = Hex export type GetL2TransactionHashErrorType = ErrorType -export function getL2TransactionHash({ log }: GetL2TransactionHashParameters) { +export async function getL2TransactionHash({ + log, +}: GetL2TransactionHashParameters) { const sourceHash = getSourceHash({ domain: 'userDeposit', l1BlockHash: log.blockHash, @@ -37,7 +39,7 @@ export function getL2TransactionHash({ log }: GetL2TransactionHashParameters) { ) return keccak256( - serializeTransaction({ + await serializeTransaction({ from: log.args.from, to: isCreation ? undefined : log.args.to, sourceHash, diff --git a/src/op-stack/utils/getL2TransactionHashes.test.ts b/src/op-stack/utils/getL2TransactionHashes.test.ts index a3cdba2f78..898e78cc5c 100644 --- a/src/op-stack/utils/getL2TransactionHashes.test.ts +++ b/src/op-stack/utils/getL2TransactionHashes.test.ts @@ -7,7 +7,7 @@ test('default', async () => { hash: '0x11fcc5e645f504064fd4e45120f6543115149449dfb44b7887000f3ed18b738a', }) - const l2Hashes = getL2TransactionHashes(receipt) + const l2Hashes = await getL2TransactionHashes(receipt) expect(l2Hashes).toMatchInlineSnapshot(` [ diff --git a/src/op-stack/utils/getL2TransactionHashes.ts b/src/op-stack/utils/getL2TransactionHashes.ts index 60599ffee3..cd002dca49 100644 --- a/src/op-stack/utils/getL2TransactionHashes.ts +++ b/src/op-stack/utils/getL2TransactionHashes.ts @@ -13,9 +13,9 @@ export type GetL2TransactionHashesReturnType = Hex[] export type GetL2TransactionHashesErrorType = ErrorType -export function getL2TransactionHashes({ +export async function getL2TransactionHashes({ logs, -}: GetL2TransactionHashesParameters): GetL2TransactionHashesReturnType { +}: GetL2TransactionHashesParameters): Promise { const extractedLogs = extractTransactionDepositedLogs({ logs }) - return extractedLogs.map((log) => getL2TransactionHash({ log })) + return Promise.all(extractedLogs.map((log) => getL2TransactionHash({ log }))) } diff --git a/src/utils/signature/recoverTransactionAddress.test.ts b/src/utils/signature/recoverTransactionAddress.test.ts index 90281ca843..725fe61cd2 100644 --- a/src/utils/signature/recoverTransactionAddress.test.ts +++ b/src/utils/signature/recoverTransactionAddress.test.ts @@ -47,7 +47,7 @@ test('default', async () => { }) test('signature (hex)', async () => { - const serializedTransaction = serializeTransaction(transaction) + const serializedTransaction = await serializeTransaction(transaction) const signature = await sign({ hash: keccak256(serializedTransaction), privateKey: accounts[0].privateKey, @@ -60,7 +60,7 @@ test('signature (hex)', async () => { }) test('signature (bytes)', async () => { - const serializedTransaction = serializeTransaction(transaction) + const serializedTransaction = await serializeTransaction(transaction) const signature = await sign({ hash: keccak256(serializedTransaction), privateKey: accounts[0].privateKey, @@ -81,7 +81,7 @@ test('4844 tx', async () => { sidecars, } satisfies TransactionSerializableEIP4844 - const signableTransaction = serializeTransaction({ + const signableTransaction = await serializeTransaction({ ...transaction4844, sidecars: false, }) @@ -89,7 +89,10 @@ test('4844 tx', async () => { hash: keccak256(signableTransaction), privateKey: accounts[0].privateKey, }) - const serializedTransaction = serializeTransaction(transaction4844, signature) + const serializedTransaction = await serializeTransaction( + transaction4844, + signature, + ) const address = await recoverTransactionAddress({ serializedTransaction, @@ -127,7 +130,7 @@ test('via `getTransaction`', async () => { blockNumber: anvilMainnet.forkBlockNumber - 10n, index: 0, }) - const serializedTransaction = serializeTransaction({ + const serializedTransaction = await serializeTransaction({ ...transaction, data: transaction.input, }) diff --git a/src/utils/signature/recoverTransactionAddress.ts b/src/utils/signature/recoverTransactionAddress.ts index d64d60b679..741fa10c5f 100644 --- a/src/utils/signature/recoverTransactionAddress.ts +++ b/src/utils/signature/recoverTransactionAddress.ts @@ -42,7 +42,7 @@ export async function recoverTransactionAddress( yParity: transaction.yParity!, } - const serialized = serializeTransaction({ + const serialized = await serializeTransaction({ ...transaction, r: undefined, s: undefined, diff --git a/src/utils/transaction/parseTransaction.bench.ts b/src/utils/transaction/parseTransaction.bench.ts index 38e84a9dc5..b8e2f2ea48 100644 --- a/src/utils/transaction/parseTransaction.bench.ts +++ b/src/utils/transaction/parseTransaction.bench.ts @@ -15,15 +15,15 @@ const base = { value: parseEther('1'), } satisfies TransactionSerializableBase -const legacy = serializeTransaction( +const legacy = await serializeTransaction( { ...base, gasPrice: 1n }, { r: '0x1', s: '0x2', yParity: 1 }, ) -const eip1559 = serializeTransaction( +const eip1559 = await serializeTransaction( { ...base, chainId: 1, maxFeePerGas: 1n }, { r: '0x1', s: '0x2', yParity: 1 }, ) -const eip2930 = serializeTransaction( +const eip2930 = await serializeTransaction( { ...base, chainId: 1, gasPrice: 1n, accessList: [] }, { r: '0x1', s: '0x2', yParity: 1 }, ) diff --git a/src/utils/transaction/parseTransaction.test.ts b/src/utils/transaction/parseTransaction.test.ts index 108717a625..5e6659f019 100644 --- a/src/utils/transaction/parseTransaction.test.ts +++ b/src/utils/transaction/parseTransaction.test.ts @@ -57,37 +57,37 @@ describe('eip7702', () => { chainId: 1, } as const satisfies TransactionSerializableEIP7702 - test('default', () => { - const serialized = serializeTransaction(baseEip7702) + test('default', async () => { + const serialized = await serializeTransaction(baseEip7702) const transaction = parseTransaction(serialized) assertType(transaction) expect(transaction).toEqual({ ...baseEip7702, type: 'eip7702' }) }) - test('args: fees', () => { + test('args: fees', async () => { const args = { ...baseEip7702, maxFeePerGas: parseGwei('2'), maxPriorityFeePerGas: parseGwei('1'), } - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) const transaction = parseTransaction(serialized) assertType(transaction) expect(transaction).toEqual({ ...args, type: 'eip7702' }) }) - test('args: gas', () => { + test('args: gas', async () => { const args = { ...baseEip7702, gas: 69n, } - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) const transaction = parseTransaction(serialized) assertType(transaction) expect(transaction).toEqual({ ...args, type: 'eip7702' }) }) - test('args: accessList', () => { + test('args: accessList', async () => { const args = { ...baseEip7702, accessList: [ @@ -100,18 +100,18 @@ describe('eip7702', () => { }, ], } as const satisfies TransactionSerializableEIP7702 - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) const transaction = parseTransaction(serialized) assertType(transaction) expect(transaction).toEqual({ ...args, type: 'eip7702' }) }) - test('args: data', () => { + test('args: data', async () => { const args = { ...baseEip7702, data: '0x1234', } satisfies TransactionSerializableEIP7702 - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) const transaction = parseTransaction(serialized) assertType(transaction) expect(transaction).toEqual({ ...args, type: 'eip7702' }) @@ -119,10 +119,10 @@ describe('eip7702', () => { test('signed', async () => { const signature = await sign({ - hash: keccak256(serializeTransaction(baseEip7702)), + hash: keccak256(await serializeTransaction(baseEip7702)), privateKey: accounts[0].privateKey, }) - const serialized = serializeTransaction(baseEip7702, signature) + const serialized = await serializeTransaction(baseEip7702, signature) expect(parseTransaction(serialized)).toEqual({ ...baseEip7702, ...signature, @@ -254,38 +254,38 @@ describe('eip4844', () => { chainId: 1, } as const satisfies TransactionSerializableEIP4844 - test('default', () => { - const serialized = serializeTransaction(baseEip4844) + test('default', async () => { + const serialized = await serializeTransaction(baseEip4844) const transaction = parseTransaction(serialized) assertType(transaction) expect(transaction).toEqual({ ...baseEip4844, type: 'eip4844' }) }) - test('args: fees', () => { + test('args: fees', async () => { const args = { ...baseEip4844, maxFeePerBlobGas: parseGwei('2'), maxFeePerGas: parseGwei('2'), maxPriorityFeePerGas: parseGwei('1'), } - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) const transaction = parseTransaction(serialized) assertType(transaction) expect(transaction).toEqual({ ...args, type: 'eip4844' }) }) - test('args: gas', () => { + test('args: gas', async () => { const args = { ...baseEip4844, gas: 69n, } - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) const transaction = parseTransaction(serialized) assertType(transaction) expect(transaction).toEqual({ ...args, type: 'eip4844' }) }) - test('args: accessList', () => { + test('args: accessList', async () => { const args = { ...baseEip4844, accessList: [ @@ -298,24 +298,24 @@ describe('eip4844', () => { }, ], } as const satisfies TransactionSerializableEIP4844 - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) const transaction = parseTransaction(serialized) assertType(transaction) expect(transaction).toEqual({ ...args, type: 'eip4844' }) }) - test('args: data', () => { + test('args: data', async () => { const args = { ...baseEip4844, data: '0x1234', } satisfies TransactionSerializableEIP4844 - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) const transaction = parseTransaction(serialized) assertType(transaction) expect(transaction).toEqual({ ...args, type: 'eip4844' }) }) - test('args: sidecar', () => { + test('args: sidecar', async () => { const args = { ...baseEip4844, sidecars: [ @@ -331,7 +331,7 @@ describe('eip4844', () => { }, ], } as const satisfies TransactionSerializableEIP4844 - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) const transaction = parseTransaction(serialized) assertType(transaction) expect(transaction).toEqual({ ...args, type: 'eip4844' }) @@ -339,10 +339,10 @@ describe('eip4844', () => { test('signed', async () => { const signature = await sign({ - hash: keccak256(serializeTransaction(baseEip4844)), + hash: keccak256(await serializeTransaction(baseEip4844)), privateKey: accounts[0].privateKey, }) - const serialized = serializeTransaction(baseEip4844, signature) + const serialized = await serializeTransaction(baseEip4844, signature) expect(parseTransaction(serialized)).toEqual({ ...baseEip4844, ...signature, @@ -475,32 +475,32 @@ describe('eip1559', () => { maxPriorityFeePerGas: parseGwei('2'), } - test('default', () => { - const serialized = serializeTransaction(baseEip1559) + test('default', async () => { + const serialized = await serializeTransaction(baseEip1559) const transaction = parseTransaction(serialized) assertType(transaction) expect(transaction).toEqual({ ...baseEip1559, type: 'eip1559' }) }) - test('minimal', () => { + test('minimal', async () => { const args = { chainId: 1, maxFeePerGas: 1n, } - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'eip1559' }) }) - test('args: gas', () => { + test('args: gas', async () => { const args = { ...baseEip1559, gas: 21001n, } - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'eip1559' }) }) - test('args: accessList', () => { + test('args: accessList', async () => { const args = { ...baseEip1559, accessList: [ @@ -513,25 +513,25 @@ describe('eip1559', () => { }, ], } satisfies TransactionSerializableEIP1559 - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'eip1559' }) }) - test('args: data', () => { + test('args: data', async () => { const args = { ...baseEip1559, data: '0x1234', } satisfies TransactionSerializableEIP1559 - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'eip1559' }) }) test('signed', async () => { const signature = await sign({ - hash: keccak256(serializeTransaction(baseEip1559)), + hash: keccak256(await serializeTransaction(baseEip1559)), privateKey: accounts[0].privateKey, }) - const serialized = serializeTransaction(baseEip1559, signature) + const serialized = await serializeTransaction(baseEip1559, signature) expect(parseTransaction(serialized)).toEqual({ ...baseEip1559, ...signature, @@ -759,14 +759,14 @@ describe('eip2930', () => { gasPrice: parseGwei('2'), } as TransactionSerializableEIP2930 - test('default', () => { - const serialized = serializeTransaction(baseEip2930) + test('default', async () => { + const serialized = await serializeTransaction(baseEip2930) const transaction = parseTransaction(serialized) assertType(transaction) expect(transaction).toEqual({ ...baseEip2930, type: 'eip2930' }) }) - test('minimal', () => { + test('minimal', async () => { const args = { chainId: 1, gasPrice: 1n, @@ -779,43 +779,43 @@ describe('eip2930', () => { }, ], } satisfies TransactionSerializableEIP2930 - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'eip2930' }) }) - test('args: gas', () => { + test('args: gas', async () => { const args = { ...baseEip2930, gas: 21001n, } satisfies TransactionSerializableEIP2930 - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'eip2930' }) }) - test('args: data', () => { + test('args: data', async () => { const args = { ...baseEip2930, data: '0x1234', } satisfies TransactionSerializableEIP2930 - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'eip2930' }) }) - test('args: data', () => { + test('args: data', async () => { const args = { ...baseEip2930, data: '0x1234', } satisfies TransactionSerializableEIP2930 - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'eip2930' }) }) test('signed', async () => { const signature = await sign({ - hash: keccak256(serializeTransaction(baseEip2930)), + hash: keccak256(await serializeTransaction(baseEip2930)), privateKey: accounts[0].privateKey, }) - const serialized = serializeTransaction(baseEip2930, signature) + const serialized = await serializeTransaction(baseEip2930, signature) expect(parseTransaction(serialized)).toEqual({ ...baseEip2930, ...signature, @@ -884,46 +884,46 @@ describe('legacy', () => { gasPrice: parseGwei('2'), } - test('default', () => { - const serialized = serializeTransaction(baseLegacy) + test('default', async () => { + const serialized = await serializeTransaction(baseLegacy) const transaction = parseTransaction(serialized) assertType(transaction) expect(transaction).toEqual({ ...baseLegacy, type: 'legacy' }) }) - test('args: gas', () => { + test('args: gas', async () => { const args = { ...baseLegacy, gas: 21001n, } - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'legacy' }) }) - test('args: data', () => { + test('args: data', async () => { const args = { ...baseLegacy, data: '0x1234', } satisfies TransactionSerializableLegacy - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'legacy' }) }) - test('args: chainId', () => { + test('args: chainId', async () => { const args = { ...baseLegacy, chainId: 69, } satisfies TransactionSerializableLegacy - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'legacy' }) }) test('signed', async () => { const signature = await sign({ - hash: keccak256(serializeTransaction(baseLegacy)), + hash: keccak256(await serializeTransaction(baseLegacy)), privateKey: accounts[0].privateKey, }) - const serialized = serializeTransaction(baseLegacy, signature) + const serialized = await serializeTransaction(baseLegacy, signature) expect(parseTransaction(serialized)).toEqual({ ...baseLegacy, ...signature, @@ -938,10 +938,10 @@ describe('legacy', () => { chainId: 69, } const signature = await sign({ - hash: keccak256(serializeTransaction(args)), + hash: keccak256(await serializeTransaction(args)), privateKey: accounts[0].privateKey, }) - const serialized = serializeTransaction(args, signature) + const serialized = await serializeTransaction(args, signature) expect(parseTransaction(serialized)).toEqual({ ...args, ...signature, @@ -1146,10 +1146,10 @@ describe('errors', () => { }) }) -test('toTransactionArray', () => { +test('toTransactionArray', async () => { expect( toTransactionArray( - serializeTransaction({ + await serializeTransaction({ ...base, chainId: 1, maxFeePerGas: 1n, diff --git a/src/utils/transaction/serializeTransaction.bench.ts b/src/utils/transaction/serializeTransaction.bench.ts index c0d7de3266..eee4f70438 100644 --- a/src/utils/transaction/serializeTransaction.bench.ts +++ b/src/utils/transaction/serializeTransaction.bench.ts @@ -15,8 +15,8 @@ const base = { } satisfies TransactionSerializableBase describe('Serialize Transaction (Legacy)', () => { - bench('viem: `serializeTransaction`', () => { - serializeTransaction( + bench('viem: `serializeTransaction`', async () => { + await serializeTransaction( { ...base, gasPrice: 1n }, { r: '0x1', s: '0x2', v: 28n }, ) @@ -33,8 +33,8 @@ describe('Serialize Transaction (Legacy)', () => { }) describe('Serialize Transaction (EIP1559)', () => { - bench('viem: `serializeTransaction`', () => { - serializeTransaction( + bench('viem: `serializeTransaction`', async () => { + await serializeTransaction( { ...base, chainId: 1, maxFeePerGas: 1n }, { r: '0x1', s: '0x2', v: 28n }, ) @@ -52,8 +52,8 @@ describe('Serialize Transaction (EIP1559)', () => { }) describe('Serialize Transaction (EIP2930)', () => { - bench('viem: `serializeTransaction`', () => { - serializeTransaction( + bench('viem: `serializeTransaction`', async () => { + await serializeTransaction( { ...base, chainId: 1, gasPrice: 1n, accessList: [] }, { r: '0x1', s: '0x2', v: 28n }, ) diff --git a/src/utils/transaction/serializeTransaction.test.ts b/src/utils/transaction/serializeTransaction.test.ts index 2dcb5943b1..0b5fc1af6c 100644 --- a/src/utils/transaction/serializeTransaction.test.ts +++ b/src/utils/transaction/serializeTransaction.test.ts @@ -61,8 +61,8 @@ describe('eip7702', () => { chainId: 1, } as const satisfies TransactionSerializableEIP7702 - test('default', () => { - const serialized = serializeTransaction(baseEip7702) + test('default', async () => { + const serialized = await serializeTransaction(baseEip7702) assertType(serialized) expect(serialized).toMatchInlineSnapshot( `"0x04f8e3018203118080809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c0f8baf85c0194fba3912ca04dd458c843e2ee08967fc04f3579c28201a480a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fef85a0a9400000000000000000000000000000000000000004501a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe"`, @@ -73,9 +73,9 @@ describe('eip7702', () => { }) }) - test('signature', () => { + test('signature', async () => { expect( - serializeTransaction(baseEip7702, { + await serializeTransaction(baseEip7702, { r: '0x60fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', s: '0x60fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', yParity: 1, @@ -84,7 +84,7 @@ describe('eip7702', () => { `"0x04f90126018203118080809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c0f8baf85c0194fba3912ca04dd458c843e2ee08967fc04f3579c28201a480a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fef85a0a9400000000000000000000000000000000000000004501a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe01a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe"`, ) expect( - serializeTransaction( + await serializeTransaction( baseEip7702, { @@ -97,7 +97,7 @@ describe('eip7702', () => { `"0x04f90126018203118080809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c0f8baf85c0194fba3912ca04dd458c843e2ee08967fc04f3579c28201a480a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fef85a0a9400000000000000000000000000000000000000004501a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe80a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe"`, ) expect( - serializeTransaction( + await serializeTransaction( baseEip7702, { @@ -110,7 +110,7 @@ describe('eip7702', () => { `"0x04f90126018203118080809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c0f8baf85c0194fba3912ca04dd458c843e2ee08967fc04f3579c28201a480a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fef85a0a9400000000000000000000000000000000000000004501a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe80a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe"`, ) expect( - serializeTransaction( + await serializeTransaction( baseEip7702, { @@ -134,8 +134,8 @@ describe('eip4844', () => { chainId: 1, } as const satisfies TransactionSerializableEIP4844 - test('default', () => { - const serialized = serializeTransaction(baseEip4844) + test('default', async () => { + const serialized = await serializeTransaction(baseEip4844) assertType(serialized) expect(serialized).toEqual( '0x03f84a018203118080809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c080e1a001adbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', @@ -146,9 +146,9 @@ describe('eip4844', () => { }) }) - test('signature', () => { + test('signature', async () => { expect( - serializeTransaction(baseEip4844, { + await serializeTransaction(baseEip4844, { r: '0x60fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', s: '0x60fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', yParity: 1, @@ -157,7 +157,7 @@ describe('eip4844', () => { '0x03f88d018203118080809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c080e1a001adbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef01a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', ) expect( - serializeTransaction( + await serializeTransaction( baseEip4844, { @@ -170,7 +170,7 @@ describe('eip4844', () => { '0x03f88d018203118080809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c080e1a001adbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef80a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', ) expect( - serializeTransaction( + await serializeTransaction( baseEip4844, { @@ -183,7 +183,7 @@ describe('eip4844', () => { '0x03f88d018203118080809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c080e1a001adbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef80a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', ) expect( - serializeTransaction( + await serializeTransaction( baseEip4844, { @@ -197,7 +197,7 @@ describe('eip4844', () => { ) }) - test('network wrapper (blobVersionedHashes + sidecars)', () => { + test('network wrapper (blobVersionedHashes + sidecars)', async () => { const sidecars = toBlobSidecars({ data: stringToHex('abcd'), kzg }) const blobVersionedHashes = sidecarsToVersionedHashes({ sidecars }) const transaction = { @@ -205,7 +205,7 @@ describe('eip4844', () => { blobVersionedHashes, sidecars, } satisfies TransactionSerializableEIP4844 - const serialized = serializeTransaction(transaction) + const serialized = await serializeTransaction(transaction) assertType(serialized) expect(serialized).toMatchSnapshot() expect(parseTransaction(serialized)).toEqual({ @@ -214,7 +214,7 @@ describe('eip4844', () => { }) }) - test('network wrapper (blobs + blobVersionedHashes + sidecars)', () => { + test('network wrapper (blobs + blobVersionedHashes + sidecars)', async () => { const sidecars = toBlobSidecars({ data: stringToHex('abcd'), kzg }) const blobVersionedHashes = sidecarsToVersionedHashes({ sidecars }) const transaction = { @@ -222,7 +222,7 @@ describe('eip4844', () => { blobVersionedHashes, sidecars, } satisfies TransactionSerializableEIP4844 - const serialized = serializeTransaction({ + const serialized = await serializeTransaction({ ...transaction, blobs: toBlobs({ data: stringToHex('abcd') }), } as unknown as TransactionSerializableEIP4844) @@ -233,7 +233,7 @@ describe('eip4844', () => { }) }) - test('network wrapper (blobs + kzg)', () => { + test('network wrapper (blobs + kzg)', async () => { const transaction = { ...baseEip4844, blobVersionedHashes: undefined, @@ -241,7 +241,7 @@ describe('eip4844', () => { blobs: toBlobs({ data: stringToHex(blobData) }), kzg, } satisfies TransactionSerializableEIP4844 - const serialized = serializeTransaction(transaction) + const serialized = await serializeTransaction(transaction) assertType(serialized) expect(serialized).toMatchSnapshot() }) @@ -255,8 +255,8 @@ describe('eip1559', () => { maxPriorityFeePerGas: parseGwei('2'), } - test('default', () => { - const serialized = serializeTransaction(baseEip1559) + test('default', async () => { + const serialized = await serializeTransaction(baseEip1559) assertType(serialized) expect(serialized).toEqual( '0x02ef0182031184773594008477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c0', @@ -267,7 +267,7 @@ describe('eip1559', () => { }) }) - test('default (all zeros)', () => { + test('default (all zeros)', async () => { const baseEip1559Zero = { to: accounts[1].address, nonce: 0, @@ -277,7 +277,7 @@ describe('eip1559', () => { value: 0n, } satisfies TransactionSerializableEIP1559 - const serialized = serializeTransaction(baseEip1559Zero) + const serialized = await serializeTransaction(baseEip1559Zero) expect(serialized).toEqual( '0x02dd01808080809470997970c51812dc3a010c7d01b50e0d17dc79c88080c0', @@ -289,39 +289,39 @@ describe('eip1559', () => { }) }) - test('minimal (w/ maxFeePerGas)', () => { + test('minimal (w/ maxFeePerGas)', async () => { const args = { chainId: 1, maxFeePerGas: 1n, } - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(serialized).toEqual('0x02c90180800180808080c0') expect(parseTransaction(serialized)).toEqual({ ...args, type: 'eip1559' }) }) - test('minimal (w/ type)', () => { + test('minimal (w/ type)', async () => { const args = { chainId: 1, type: 'eip1559', } as const - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(serialized).toEqual('0x02c90180808080808080c0') expect(parseTransaction(serialized)).toEqual(args) }) - test('args: gas', () => { + test('args: gas', async () => { const args = { ...baseEip1559, gas: 21001n, } - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(serialized).toEqual( '0x02f101820311847735940084773594008252099470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c0', ) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'eip1559' }) }) - test('args: accessList', () => { + test('args: accessList', async () => { const args = { ...baseEip1559, accessList: [ @@ -334,19 +334,19 @@ describe('eip1559', () => { }, ], } satisfies TransactionSerializableEIP1559 - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(serialized).toEqual( '0x02f88b0182031184773594008477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080f85bf859940000000000000000000000000000000000000000f842a00000000000000000000000000000000000000000000000000000000000000001a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', ) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'eip1559' }) }) - test('args: data', () => { + test('args: data', async () => { const args = { ...baseEip1559, data: '0x1234', } satisfies TransactionSerializableEIP1559 - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(serialized).toEqual( '0x02f10182031184773594008477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a7640000821234c0', ) @@ -355,10 +355,10 @@ describe('eip1559', () => { test('signed', async () => { const signature = await sign({ - hash: keccak256(serializeTransaction(baseEip1559)), + hash: keccak256(await serializeTransaction(baseEip1559)), privateKey: accounts[0].privateKey, }) - const serialized = serializeTransaction(baseEip1559, signature) + const serialized = await serializeTransaction(baseEip1559, signature) expect(serialized).toEqual( '0x02f8720182031184773594008477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c001a0ce18214ff9d06ecaacb61811f9d6dc2be922e8cebddeaf6df0b30d5c498f6d33a05f0487c6dbbf2139f7c705d8054dbb16ecac8ae6256ce2c4c6f2e7ef35b3a496', ) @@ -370,9 +370,9 @@ describe('eip1559', () => { }) }) - test('signature', () => { + test('signature', async () => { expect( - serializeTransaction( + await serializeTransaction( baseEip1559, { @@ -385,7 +385,7 @@ describe('eip1559', () => { '0x02f8720182031184773594008477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c001a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', ) expect( - serializeTransaction( + await serializeTransaction( baseEip1559, { @@ -398,7 +398,7 @@ describe('eip1559', () => { '0x02f8720182031184773594008477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c080a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', ) expect( - serializeTransaction( + await serializeTransaction( baseEip1559, { @@ -411,7 +411,7 @@ describe('eip1559', () => { '0x02f8720182031184773594008477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c080a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', ) expect( - serializeTransaction( + await serializeTransaction( baseEip1559, { @@ -425,21 +425,22 @@ describe('eip1559', () => { ) }) - describe('errors', () => { + describe('errors', async () => { test('invalid access list (invalid address)', () => { - expect(() => - serializeTransaction({ - ...baseEip1559, - accessList: [ - { - address: - '0x0000000000000000000000000000000000000000000000000000000000000001', - storageKeys: [ - '0x0000000000000000000000000000000000000000000000000000000000000001', - ], - }, - ], - }), + expect( + async () => + await serializeTransaction({ + ...baseEip1559, + accessList: [ + { + address: + '0x0000000000000000000000000000000000000000000000000000000000000001', + storageKeys: [ + '0x0000000000000000000000000000000000000000000000000000000000000001', + ], + }, + ], + }), ).toThrowErrorMatchingInlineSnapshot(` [InvalidAddressError: Address "0x0000000000000000000000000000000000000000000000000000000000000001" is invalid. @@ -450,20 +451,21 @@ describe('eip1559', () => { `) }) - test('invalid access list (invalid storage key)', () => { - expect(() => - serializeTransaction({ - ...baseEip1559, - accessList: [ - { - address: - '0x0000000000000000000000000000000000000000000000000000000000000001', - storageKeys: [ - '0x00000000000000000000000000000000000000000000000000000000000001', - ], - }, - ], - }), + test('invalid access list (invalid storage key)', async () => { + expect( + async () => + await serializeTransaction({ + ...baseEip1559, + accessList: [ + { + address: + '0x0000000000000000000000000000000000000000000000000000000000000001', + storageKeys: [ + '0x00000000000000000000000000000000000000000000000000000000000001', + ], + }, + ], + }), ).toThrowErrorMatchingInlineSnapshot(` [InvalidStorageKeySizeError: Size for storage key "0x00000000000000000000000000000000000000000000000000000000000001" is invalid. Expected 32 bytes. Got 31 bytes. @@ -488,8 +490,8 @@ describe('eip2930', () => { gasPrice: parseGwei('2'), } satisfies TransactionSerializableEIP2930 - test('default', () => { - const serialized = serializeTransaction(baseEip2930) + test('default', async () => { + const serialized = await serializeTransaction(baseEip2930) assertType(serialized) expect(serialized).toEqual( '0x01f863018203118477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080f838f7941234512345123451234512345123451234512345e1a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', @@ -500,7 +502,7 @@ describe('eip2930', () => { }) }) - test('default (all zeros)', () => { + test('default (all zeros)', async () => { const baseEip2930Zero = { to: accounts[1].address, nonce: 0, @@ -510,7 +512,7 @@ describe('eip2930', () => { accessList: [], } satisfies TransactionSerializableEIP2930 - const serialized = serializeTransaction(baseEip2930Zero) + const serialized = await serializeTransaction(baseEip2930Zero) expect(serialized).toEqual( '0x01dc018080809470997970c51812dc3a010c7d01b50e0d17dc79c88080c0', @@ -523,7 +525,7 @@ describe('eip2930', () => { }) }) - test('minimal (w/ accessList & gasPrice)', () => { + test('minimal (w/ accessList & gasPrice)', async () => { const args = { chainId: 1, accessList: [ @@ -536,41 +538,41 @@ describe('eip2930', () => { ], gasPrice: parseGwei('2'), } satisfies TransactionSerializableEIP2930 - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(serialized).toEqual( '0x01f8450180847735940080808080f838f7940000000000000000000000000000000000000000e1a00000000000000000000000000000000000000000000000000000000000000001', ) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'eip2930' }) }) - test('minimal (w/ type)', () => { + test('minimal (w/ type)', async () => { const args = { chainId: 1, type: 'eip2930', } satisfies TransactionSerializableEIP2930 - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(serialized).toEqual('0x01c801808080808080c0') expect(parseTransaction(serialized)).toEqual({ ...args, type: 'eip2930' }) }) - test('args: gas', () => { + test('args: gas', async () => { const args = { ...baseEip2930, gas: 21001n, } - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(serialized).toEqual( '0x01f8650182031184773594008252099470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080f838f7941234512345123451234512345123451234512345e1a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', ) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'eip2930' }) }) - test('args: data', () => { + test('args: data', async () => { const args = { ...baseEip2930, data: '0x1234', } satisfies TransactionSerializableEIP2930 - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(serialized).toEqual( '0x01f865018203118477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a7640000821234f838f7941234512345123451234512345123451234512345e1a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', ) @@ -579,10 +581,10 @@ describe('eip2930', () => { test('signed', async () => { const signature = await sign({ - hash: keccak256(serializeTransaction(baseEip2930)), + hash: keccak256(await serializeTransaction(baseEip2930)), privateKey: accounts[0].privateKey, }) - const serialized = serializeTransaction(baseEip2930, signature) + const serialized = await serializeTransaction(baseEip2930, signature) expect(serialized).toEqual( '0x01f8a6018203118477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080f838f7941234512345123451234512345123451234512345e1a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe01a0dc7b3483c0b183823f07d77247c60678d861080acdc4fb8b9fd131770b475c40a040f16567391132746735aff4d5a3fa5ae42ff3d5d538e341870e0259dc40741a', ) @@ -594,9 +596,9 @@ describe('eip2930', () => { }) }) - test('signature', () => { + test('signature', async () => { expect( - serializeTransaction( + await serializeTransaction( baseEip2930, { @@ -609,7 +611,7 @@ describe('eip2930', () => { '0x01f8a6018203118477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080f838f7941234512345123451234512345123451234512345e1a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe01a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', ) expect( - serializeTransaction( + await serializeTransaction( baseEip2930, { @@ -622,7 +624,7 @@ describe('eip2930', () => { '0x01f8a6018203118477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080f838f7941234512345123451234512345123451234512345e1a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe80a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', ) expect( - serializeTransaction( + await serializeTransaction( baseEip2930, { @@ -635,7 +637,7 @@ describe('eip2930', () => { '0x01f8a6018203118477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080f838f7941234512345123451234512345123451234512345e1a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe80a060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', ) expect( - serializeTransaction( + await serializeTransaction( baseEip2930, { @@ -651,18 +653,19 @@ describe('eip2930', () => { describe('errors', () => { test('invalid access list (invalid address)', () => { - expect(() => - serializeTransaction({ - ...baseEip2930, - accessList: [ - { - address: '0x0', - storageKeys: [ - '0x0000000000000000000000000000000000000000000000000000000000000001', - ], - }, - ], - }), + expect( + async () => + await serializeTransaction({ + ...baseEip2930, + accessList: [ + { + address: '0x0', + storageKeys: [ + '0x0000000000000000000000000000000000000000000000000000000000000001', + ], + }, + ], + }), ).toThrowErrorMatchingInlineSnapshot(` [InvalidAddressError: Address "0x0" is invalid. @@ -674,7 +677,7 @@ describe('eip2930', () => { }) test('invalid access list (invalid storage key)', () => { - expect(() => + expect(async () => serializeTransaction({ ...baseEip2930, accessList: [ @@ -701,8 +704,8 @@ describe('legacy', () => { gasPrice: parseGwei('2'), } - test('default', () => { - const serialized = serializeTransaction(baseLegacy) + test('default', async () => { + const serialized = await serializeTransaction(baseLegacy) assertType(serialized) expect(serialized).toEqual( '0xe88203118477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080', @@ -713,7 +716,7 @@ describe('legacy', () => { }) }) - test('default (all zeros)', () => { + test('default (all zeros)', async () => { const baseLegacyZero = { to: accounts[1].address, nonce: 0, @@ -721,7 +724,7 @@ describe('legacy', () => { gasPrice: 0n, } satisfies TransactionSerializableLegacy - const serialized = serializeTransaction(baseLegacyZero) + const serialized = await serializeTransaction(baseLegacyZero) expect(serialized).toEqual( '0xda8080809470997970c51812dc3a010c7d01b50e0d17dc79c88080', @@ -733,54 +736,54 @@ describe('legacy', () => { }) }) - test('minimal (w/ gasPrice)', () => { + test('minimal (w/ gasPrice)', async () => { const args = { gasPrice: parseGwei('2'), } satisfies TransactionSerializableLegacy - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(serialized).toEqual('0xca80847735940080808080') expect(parseTransaction(serialized)).toEqual({ ...args, type: 'legacy' }) }) - test('minimal (w/ type)', () => { + test('minimal (w/ type)', async () => { const args = { type: 'legacy', } satisfies TransactionSerializableLegacy - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(serialized).toEqual('0xc6808080808080') expect(parseTransaction(serialized)).toEqual({ ...args, type: 'legacy' }) }) - test('args: gas', () => { + test('args: gas', async () => { const args = { ...baseLegacy, gas: 21001n, } - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(serialized).toEqual( '0xea82031184773594008252099470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080', ) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'legacy' }) }) - test('args: data', () => { + test('args: data', async () => { const args = { ...baseLegacy, data: '0x1234', } satisfies TransactionSerializableLegacy - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(serialized).toEqual( '0xea8203118477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a7640000821234', ) expect(parseTransaction(serialized)).toEqual({ ...args, type: 'legacy' }) }) - test('args: chainId', () => { + test('args: chainId', async () => { const args = { ...baseLegacy, chainId: 69, } satisfies TransactionSerializableLegacy - const serialized = serializeTransaction(args) + const serialized = await serializeTransaction(args) expect(serialized).toEqual( '0xeb8203118477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080458080', ) @@ -789,10 +792,10 @@ describe('legacy', () => { test('signed', async () => { const signature = await sign({ - hash: keccak256(serializeTransaction(baseLegacy)), + hash: keccak256(await serializeTransaction(baseLegacy)), privateKey: accounts[0].privateKey, }) - const serialized = serializeTransaction(baseLegacy, signature) + const serialized = await serializeTransaction(baseLegacy, signature) expect(serialized).toEqual( '0xf86b8203118477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a7640000801ca06cb0e8d21e5baf998fb9a05f47acd83692dc148f90b81b332a152f020da0ae98a0344e49bacb1ef7af7c2ffed9e88d3f0ae0aa4945c9da0a660a03717dd5621f98', ) @@ -804,9 +807,9 @@ describe('legacy', () => { }) }) - test('signature', () => { + test('signature', async () => { expect( - serializeTransaction( + await serializeTransaction( baseLegacy, { @@ -819,7 +822,7 @@ describe('legacy', () => { '0xf86b8203118477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a7640000801ca060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fea060fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', ) expect( - serializeTransaction( + await serializeTransaction( baseLegacy, { @@ -839,10 +842,10 @@ describe('legacy', () => { chainId: 69, } const signature = await sign({ - hash: keccak256(serializeTransaction(args)), + hash: keccak256(await serializeTransaction(args)), privateKey: accounts[0].privateKey, }) - const serialized = serializeTransaction(args, signature) + const serialized = await serializeTransaction(args, signature) expect(serialized).toEqual( '0xf86c8203118477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a76400008081ada02f43314322cf4c5dd645b028aa0b0dadff0fb73c41a6f0620ff1dfb11601ac30a066f37a65e139fa4b6df33a42ab5ccaeaa7a109382e7430caefd1deee63962626', ) @@ -856,17 +859,18 @@ describe('legacy', () => { }) describe('errors', () => { - test('invalid v', () => { - expect(() => - serializeTransaction( - baseLegacy, - - { - r: '0x60fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', - s: '0x60fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', - v: 29n, - }, - ), + test('invalid v', async () => { + expect( + async () => + await serializeTransaction( + baseLegacy, + + { + r: '0x60fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', + s: '0x60fdd29ff912ce880cd3edaf9f932dc61d3dae823ea77e0323f94adb9f6a72fe', + v: 29n, + }, + ), ).toThrowErrorMatchingInlineSnapshot(` [InvalidLegacyVError: Invalid \`v\` value "29". Expected 27 or 28. @@ -877,8 +881,9 @@ describe('legacy', () => { }) test('cannot infer type from transaction object', () => { - expect(() => - serializeTransaction({ chainId: 1, data: '0x1234', nonce: 69 }), + expect( + async () => + await serializeTransaction({ chainId: 1, data: '0x1234', nonce: 69 }), ).toThrowErrorMatchingInlineSnapshot(` [InvalidSerializableTransactionError: Cannot infer a transaction type from provided transaction. @@ -902,9 +907,9 @@ test('cannot infer type from transaction object', () => { }) describe('github', () => { - test('https://github.com/wevm/viem/issues/1433', () => { + test('https://github.com/wevm/viem/issues/1433', async () => { expect( - serializeTransaction( + await serializeTransaction( { blockHash: null, blockNumber: null, @@ -936,7 +941,7 @@ describe('github', () => { ) expect( - serializeTransaction( + await serializeTransaction( { blockHash: null, blockNumber: null, @@ -968,7 +973,7 @@ describe('github', () => { ) expect( - serializeTransaction( + await serializeTransaction( { blockHash: null, blockNumber: null, @@ -1000,7 +1005,7 @@ describe('github', () => { ) expect( - serializeTransaction( + await serializeTransaction( { blockHash: null, blockNumber: null, @@ -1053,7 +1058,7 @@ describe('github', () => { typeHex: '0x0', } as const - const serialized = serializeTransaction({ ...tx, data: tx.input }, tx) + const serialized = await serializeTransaction({ ...tx, data: tx.input }, tx) expect(keccak256(serialized)).toEqual( '0x6ed21df69b02678dfb290ef2a43d490303562eb387f70795766b37bfa9d09bd2', @@ -1061,7 +1066,7 @@ describe('github', () => { }) test('https://github.com/wevm/viem/issues/2394', async () => { - const serialized = serializeTransaction( + const serialized = await serializeTransaction( { chainId: 17000, gas: BigInt('0x52080'), diff --git a/src/utils/transaction/serializeTransaction.ts b/src/utils/transaction/serializeTransaction.ts index a8aa0baf07..219aa8e0a8 100644 --- a/src/utils/transaction/serializeTransaction.ts +++ b/src/utils/transaction/serializeTransaction.ts @@ -97,14 +97,14 @@ export type SerializeTransactionErrorType = | SerializeTransactionLegacyErrorType | ErrorType -export function serializeTransaction< +export async function serializeTransaction< const transaction extends TransactionSerializable, /// _transactionType extends TransactionType = GetTransactionType, >( transaction: transaction, signature?: Signature | undefined, -): SerializedTransactionReturnType { +): Promise> { const type = getTransactionType(transaction) as GetTransactionType if (type === 'eip1559') diff --git a/src/zksync/accounts/toMultisigSmartAccount.test.ts b/src/zksync/accounts/toMultisigSmartAccount.test.ts index 873f6595d5..00c364aec5 100644 --- a/src/zksync/accounts/toMultisigSmartAccount.test.ts +++ b/src/zksync/accounts/toMultisigSmartAccount.test.ts @@ -27,7 +27,7 @@ test('default', () => { }) test('sign', async () => { - const account = toMultisigSmartAccount({ + const account = await toMultisigSmartAccount({ address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', privateKeys: [accounts[0].privateKey, accounts[1].privateKey], }) @@ -41,7 +41,7 @@ test('sign', async () => { }) test('sign message', async () => { - const account = toMultisigSmartAccount({ + const account = await toMultisigSmartAccount({ address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', privateKeys: [accounts[0].privateKey, accounts[1].privateKey], }) @@ -53,7 +53,7 @@ test('sign message', async () => { }) test('sign transaction', async () => { - const account = toMultisigSmartAccount({ + const account = await toMultisigSmartAccount({ address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', privateKeys: [accounts[0].privateKey, accounts[1].privateKey], }) @@ -71,7 +71,7 @@ test('sign transaction', async () => { }) test('sign typed data', async () => { - const account = toMultisigSmartAccount({ + const account = await toMultisigSmartAccount({ address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', privateKeys: [accounts[0].privateKey, accounts[1].privateKey], }) diff --git a/src/zksync/accounts/toMultisigSmartAccount.ts b/src/zksync/accounts/toMultisigSmartAccount.ts index 4a1d329497..0d5eeb0722 100644 --- a/src/zksync/accounts/toMultisigSmartAccount.ts +++ b/src/zksync/accounts/toMultisigSmartAccount.ts @@ -17,9 +17,9 @@ export type ToMultisigSmartAccountParameters = { * Creates a [ZKsync Smart Account](https://docs.zksync.io/build/developer-reference/account-abstraction/building-smart-accounts) * from a Contract Address and an array of Private Keys belonging to the owners. */ -export function toMultisigSmartAccount( +export async function toMultisigSmartAccount( parameters: ToMultisigSmartAccountParameters, -): ZksyncSmartAccount { +): Promise { const { address, privateKeys } = parameters return toSmartAccount({ diff --git a/src/zksync/accounts/toSinglesigSmartAccount.test.ts b/src/zksync/accounts/toSinglesigSmartAccount.test.ts index ff020eb48a..43e5789e43 100644 --- a/src/zksync/accounts/toSinglesigSmartAccount.test.ts +++ b/src/zksync/accounts/toSinglesigSmartAccount.test.ts @@ -5,9 +5,9 @@ import { accounts, typedData } from '~test/src/constants.js' import { parseEther, parseGwei } from '../../utils/index.js' import { toSinglesigSmartAccount } from './toSinglesigSmartAccount.js' -test('default', () => { +test('default', async () => { expect( - toSinglesigSmartAccount({ + await toSinglesigSmartAccount({ address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', privateKey: accounts[0].privateKey, }), @@ -27,7 +27,7 @@ test('default', () => { }) test('sign', async () => { - const account = toSinglesigSmartAccount({ + const account = await toSinglesigSmartAccount({ address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', privateKey: accounts[0].privateKey, }) @@ -41,7 +41,7 @@ test('sign', async () => { }) test('sign message', async () => { - const account = toSinglesigSmartAccount({ + const account = await toSinglesigSmartAccount({ address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', privateKey: accounts[0].privateKey, }) @@ -53,7 +53,7 @@ test('sign message', async () => { }) test('sign transaction', async () => { - const account = toSinglesigSmartAccount({ + const account = await toSinglesigSmartAccount({ address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', privateKey: accounts[0].privateKey, }) @@ -71,7 +71,7 @@ test('sign transaction', async () => { }) test('sign typed data', async () => { - const account = toSinglesigSmartAccount({ + const account = await toSinglesigSmartAccount({ address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', privateKey: accounts[0].privateKey, }) diff --git a/src/zksync/accounts/toSinglesigSmartAccount.ts b/src/zksync/accounts/toSinglesigSmartAccount.ts index 9c053727ee..4051e52cd4 100644 --- a/src/zksync/accounts/toSinglesigSmartAccount.ts +++ b/src/zksync/accounts/toSinglesigSmartAccount.ts @@ -16,9 +16,9 @@ export type ToSinglesigSmartAccountParameters = { * Creates a [ZKsync Smart Account](https://docs.zksync.io/build/developer-reference/account-abstraction/building-smart-accounts) * from a Contract Address and a Private Key belonging to the owner. */ -export function toSinglesigSmartAccount( +export async function toSinglesigSmartAccount( parameters: ToSinglesigSmartAccountParameters, -): ZksyncSmartAccount { +): Promise { const { address, privateKey } = parameters return toSmartAccount({ diff --git a/src/zksync/accounts/toSmartAccount.test.ts b/src/zksync/accounts/toSmartAccount.test.ts index 23cc09bc3d..2a57af86ec 100644 --- a/src/zksync/accounts/toSmartAccount.test.ts +++ b/src/zksync/accounts/toSmartAccount.test.ts @@ -16,9 +16,9 @@ async function sign({ hash }: { hash: Hex }) { ) } -test('default', () => { +test('default', async () => { expect( - toSmartAccount({ + await toSmartAccount({ address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', sign, }), @@ -38,7 +38,7 @@ test('default', () => { }) test('sign', async () => { - const account = toSmartAccount({ + const account = await toSmartAccount({ address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', sign, }) @@ -52,7 +52,7 @@ test('sign', async () => { }) test('sign message', async () => { - const account = toSmartAccount({ + const account = await toSmartAccount({ address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', sign, }) @@ -64,7 +64,7 @@ test('sign message', async () => { }) test('sign transaction', async () => { - const account = toSmartAccount({ + const account = await toSmartAccount({ address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', sign, }) @@ -82,7 +82,7 @@ test('sign transaction', async () => { }) test('sign typed data', async () => { - const account = toSmartAccount({ + const account = await toSmartAccount({ address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', sign, }) diff --git a/src/zksync/accounts/toSmartAccount.ts b/src/zksync/accounts/toSmartAccount.ts index 092e42c0f3..0edd558c80 100644 --- a/src/zksync/accounts/toSmartAccount.ts +++ b/src/zksync/accounts/toSmartAccount.ts @@ -23,9 +23,9 @@ export type ToSmartAccountErrorType = ErrorType * Creates a [ZKsync Smart Account](https://docs.zksync.io/build/developer-reference/account-abstraction/building-smart-accounts) * from a Contract Address and a custom sign function. */ -export function toSmartAccount( +export async function toSmartAccount( parameters: ToSmartAccountParameters, -): ZksyncSmartAccount { +): Promise { const { address, sign } = parameters const account = toAccount({ @@ -45,7 +45,7 @@ export function toSmartAccount( return serializeTransaction({ ...signableTransaction, customSignature: await sign({ - hash: keccak256(serializeTransaction(signableTransaction)), + hash: keccak256(await serializeTransaction(signableTransaction)), }), }) }, diff --git a/src/zksync/actions/signEip712Transaction.ts b/src/zksync/actions/signEip712Transaction.ts index ffb8eb3ed0..68c11cdb9a 100644 --- a/src/zksync/actions/signEip712Transaction.ts +++ b/src/zksync/actions/signEip712Transaction.ts @@ -138,7 +138,7 @@ export async function signEip712Transaction< account, }) - return chain?.serializers?.transaction( + return (await chain?.serializers?.transaction( { chainId, ...transaction, @@ -146,5 +146,5 @@ export async function signEip712Transaction< type: 'eip712' as any, }, { r: '0x0', s: '0x0', v: 0n }, - ) as SignEip712TransactionReturnType + )) as SignEip712TransactionReturnType } diff --git a/src/zksync/actions/signTransaction.ts b/src/zksync/actions/signTransaction.ts index d62630b1e7..34489cd149 100644 --- a/src/zksync/actions/signTransaction.ts +++ b/src/zksync/actions/signTransaction.ts @@ -90,6 +90,7 @@ export async function signTransaction< client: Client, args: SignTransactionParameters, ): Promise { - if (isEIP712Transaction(args)) return signEip712Transaction(client, args) + if (isEIP712Transaction(args)) + return await signEip712Transaction(client, args) return await signTransaction_(client, args as any) } diff --git a/src/zksync/serializers.test.ts b/src/zksync/serializers.test.ts index 184981df01..c49de4c5d5 100644 --- a/src/zksync/serializers.test.ts +++ b/src/zksync/serializers.test.ts @@ -259,7 +259,7 @@ describe('invalid params', () => { }) }) -test('other', () => { +test('other', async () => { const transaction: TransactionSerializableEIP1559 = { to: accounts[0].address, chainId: 1, @@ -268,7 +268,7 @@ test('other', () => { maxPriorityFeePerGas: parseGwei('2'), value: parseEther('1'), } - const serialized = serializeTransaction(transaction) + const serialized = await serializeTransaction(transaction) expect(serialized).toMatchInlineSnapshot( '"0x02ed0180847735940084773594008094f39fd6e51aad88f6f4ce6ab8827279cfffb92266880de0b6b3a764000080c0"', ) diff --git a/src/zksync/serializers.ts b/src/zksync/serializers.ts index a1e7491b0a..8a48c45370 100644 --- a/src/zksync/serializers.ts +++ b/src/zksync/serializers.ts @@ -14,7 +14,7 @@ import type { import { assertEip712Transaction } from './utils/assertEip712Transaction.js' import { isEIP712Transaction } from './utils/isEip712Transaction.js' -export function serializeTransaction( +export async function serializeTransaction( transaction: ZksyncTransactionSerializable, signature?: Signature | undefined, ) { diff --git a/vectors/src/transaction.vectors.test.ts b/vectors/src/transaction.vectors.test.ts index 0acb44ce34..96fa4abc40 100644 --- a/vectors/src/transaction.vectors.test.ts +++ b/vectors/src/transaction.vectors.test.ts @@ -63,8 +63,8 @@ describe('parseTransaction', () => { describe('serializeTransaction', () => { transactions.forEach(({ name, serialized, transaction }) => { - test(`${name}`, () => { - expect(serializeTransaction(transaction)).toEqual(serialized) + test(`${name}`, async () => { + expect(await serializeTransaction(transaction)).toEqual(serialized) }) }) })