-
Notifications
You must be signed in to change notification settings - Fork 275
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add tests and refactor getGasLimits out of SimulatedTx
- Loading branch information
1 parent
b2cb4d1
commit 658f611
Showing
9 changed files
with
148 additions
and
68 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
import { PublicKernelType, type SimulatedTx, mockSimulatedTx } from '@aztec/circuit-types'; | ||
import { Gas } from '@aztec/circuits.js'; | ||
|
||
import { getGasLimits } from './get_gas_limits.js'; | ||
|
||
describe('getGasLimits', () => { | ||
let simulatedTx: SimulatedTx; | ||
|
||
beforeEach(() => { | ||
simulatedTx = mockSimulatedTx(); | ||
simulatedTx.tx.data.publicInputs.end.gasUsed = Gas.from({ daGas: 100, l2Gas: 200 }); | ||
simulatedTx.publicOutput!.gasUsed = { | ||
[PublicKernelType.SETUP]: Gas.from({ daGas: 10, l2Gas: 20 }), | ||
[PublicKernelType.APP_LOGIC]: Gas.from({ daGas: 20, l2Gas: 40 }), | ||
[PublicKernelType.TEARDOWN]: Gas.from({ daGas: 10, l2Gas: 20 }), | ||
}; | ||
}); | ||
|
||
it('returns gas limits from private gas usage only', () => { | ||
simulatedTx.publicOutput = undefined; | ||
// Should be 110 and 220 but oh floating point | ||
expect(getGasLimits(simulatedTx)).toEqual({ | ||
totalGas: Gas.from({ daGas: 111, l2Gas: 221 }), | ||
teardownGas: Gas.empty(), | ||
}); | ||
}); | ||
|
||
it('returns gas limits for private and public', () => { | ||
expect(getGasLimits(simulatedTx)).toEqual({ | ||
totalGas: Gas.from({ daGas: 154, l2Gas: 308 }), | ||
teardownGas: Gas.from({ daGas: 11, l2Gas: 22 }), | ||
}); | ||
}); | ||
|
||
it('pads gas limits', () => { | ||
expect(getGasLimits(simulatedTx, 1)).toEqual({ | ||
totalGas: Gas.from({ daGas: 280, l2Gas: 560 }), | ||
teardownGas: Gas.from({ daGas: 20, l2Gas: 40 }), | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
import { PublicKernelType, type SimulatedTx } from '@aztec/circuit-types'; | ||
import { Gas } from '@aztec/circuits.js'; | ||
|
||
/** | ||
* Returns suggested total and teardown gas limits for a simulated tx. | ||
* Note that public gas usage is only accounted for if the publicOutput is present. | ||
* @param pad - Percentage to pad the suggested gas limits by, defaults to 10%. | ||
*/ | ||
export function getGasLimits(simulatedTx: SimulatedTx, pad = 0.1) { | ||
const privateGasUsed = simulatedTx.tx.data.publicInputs.end.gasUsed; | ||
if (simulatedTx.publicOutput) { | ||
const publicGasUsed = Object.values(simulatedTx.publicOutput.gasUsed) | ||
.filter(Boolean) | ||
.reduce((total, current) => total.add(current), Gas.empty()); | ||
const teardownGas = simulatedTx.publicOutput.gasUsed[PublicKernelType.TEARDOWN] ?? Gas.empty(); | ||
|
||
return { | ||
totalGas: privateGasUsed.add(publicGasUsed).mul(1 + pad), | ||
teardownGas: teardownGas.mul(1 + pad), | ||
}; | ||
} | ||
|
||
return { totalGas: privateGasUsed.mul(1 + pad), teardownGas: Gas.empty() }; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
66 changes: 66 additions & 0 deletions
66
yarn-project/end-to-end/src/e2e_fees/gas_estimation.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
import { | ||
type AccountWallet, | ||
type AztecAddress, | ||
type FeePaymentMethod, | ||
NativeFeePaymentMethod, | ||
PublicFeePaymentMethod, | ||
} from '@aztec/aztec.js'; | ||
import { GasFees, type GasSettings } from '@aztec/circuits.js'; | ||
import { type TokenContract as BananaCoin, type FPCContract } from '@aztec/noir-contracts.js'; | ||
|
||
import { FeesTest } from './fees_test.js'; | ||
|
||
describe('e2e_fees gas_estimation', () => { | ||
let aliceWallet: AccountWallet; | ||
let aliceAddress: AztecAddress; | ||
let bobAddress: AztecAddress; | ||
let bananaCoin: BananaCoin; | ||
let bananaFPC: FPCContract; | ||
let gasSettings: GasSettings; | ||
let teardownFixedFee: bigint; | ||
|
||
const t = new FeesTest('gas_estimation'); | ||
|
||
beforeAll(async () => { | ||
await t.applyBaseSnapshots(); | ||
await t.applyFundAliceWithBananas(); | ||
await t.applyFundAliceWithGasToken(); | ||
({ aliceWallet, aliceAddress, bobAddress, bananaCoin, bananaFPC, gasSettings } = await t.setup()); | ||
|
||
teardownFixedFee = gasSettings.teardownGasLimits.computeFee(GasFees.default()).toBigInt(); | ||
}); | ||
|
||
afterAll(async () => { | ||
await t.teardown(); | ||
}); | ||
|
||
// Sends two tx with transfers of public tokens: one with estimateGas on, one with estimateGas off | ||
const sendTransfers = (paymentMethod: FeePaymentMethod) => | ||
Promise.all( | ||
[true, false].map(estimateGas => | ||
bananaCoin.methods | ||
.transfer_public(aliceAddress, bobAddress, 1n, 0n) | ||
.send({ estimateGas, fee: { gasSettings, paymentMethod } }) | ||
.wait(), | ||
), | ||
); | ||
|
||
it('estimates gas with native fee payment method', async () => { | ||
const paymentMethod = await NativeFeePaymentMethod.create(aliceWallet); | ||
const [withEstimate, withoutEstimate] = await sendTransfers(paymentMethod); | ||
|
||
// Estimation should yield that teardown has no cost, so should send the tx with zero for teardown | ||
expect(withEstimate.transactionFee! + teardownFixedFee).toEqual(withoutEstimate.transactionFee!); | ||
}); | ||
|
||
it('estimates gas with public payment method', async () => { | ||
const paymentMethod = new PublicFeePaymentMethod(bananaCoin.address, bananaFPC.address, aliceWallet); | ||
const [withEstimate, withoutEstimate] = await sendTransfers(paymentMethod); | ||
|
||
// Estimation should yield that teardown has reduced cost, but is not zero | ||
// TODO(palla/gas): We set toBeGreaterThanOrEqual because gas in public functions is zero for now (we only meter on AVM). | ||
// We should be able to change this to a strict equality once we meter gas in public functions or we replace brillig with the AVM. | ||
expect(withEstimate.transactionFee!).toBeLessThan(withoutEstimate.transactionFee!); | ||
expect(withEstimate.transactionFee! + teardownFixedFee).toBeGreaterThanOrEqual(withoutEstimate.transactionFee!); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters