-
Notifications
You must be signed in to change notification settings - Fork 268
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Use gas estimation in aztecjs contract function interactions (#…
…6260) Adds an `estimateGas` flag to the `send` method of contract function interactions (defaulting to false for now) to run an initial simulate on the request to get the gas limits before actually sending the tx.
- Loading branch information
1 parent
ddf4461
commit 18192ac
Showing
14 changed files
with
221 additions
and
104 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
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
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
Oops, something went wrong.