@aztec/bot 0.51.1 → 0.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bot.d.ts +3 -1
- package/dest/bot.d.ts.map +1 -1
- package/dest/bot.js +32 -12
- package/dest/config.d.ts +6 -0
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +17 -2
- package/package.json +10 -10
- package/src/bot.ts +36 -17
- package/src/config.ts +22 -0
package/dest/bot.d.ts
CHANGED
|
@@ -6,13 +6,14 @@ export declare class Bot {
|
|
|
6
6
|
readonly wallet: Wallet;
|
|
7
7
|
readonly token: TokenContract;
|
|
8
8
|
readonly recipient: AztecAddress;
|
|
9
|
-
|
|
9
|
+
config: BotConfig;
|
|
10
10
|
private log;
|
|
11
11
|
protected constructor(wallet: Wallet, token: TokenContract, recipient: AztecAddress, config: BotConfig);
|
|
12
12
|
static create(config: BotConfig, dependencies?: {
|
|
13
13
|
pxe?: PXE;
|
|
14
14
|
node?: AztecNode;
|
|
15
15
|
}): Promise<Bot>;
|
|
16
|
+
updateConfig(config: Partial<BotConfig>): void;
|
|
16
17
|
run(): Promise<void>;
|
|
17
18
|
getBalances(): Promise<{
|
|
18
19
|
sender: {
|
|
@@ -24,5 +25,6 @@ export declare class Bot {
|
|
|
24
25
|
publicBalance: bigint;
|
|
25
26
|
};
|
|
26
27
|
}>;
|
|
28
|
+
private getSendMethodOpts;
|
|
27
29
|
}
|
|
28
30
|
//# sourceMappingURL=bot.d.ts.map
|
package/dest/bot.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EAKjB,KAAK,MAAM,EAEZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,SAAS,EAAqB,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAGnF,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,qBAAa,GAAG;aAII,MAAM,EAAE,MAAM;aACd,KAAK,EAAE,aAAa;aACpB,SAAS,EAAE,YAAY;
|
|
1
|
+
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EAKjB,KAAK,MAAM,EAEZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,SAAS,EAAqB,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAGnF,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,qBAAa,GAAG;aAII,MAAM,EAAE,MAAM;aACd,KAAK,EAAE,aAAa;aACpB,SAAS,EAAE,YAAY;IAChC,MAAM,EAAE,SAAS;IAN1B,OAAO,CAAC,GAAG,CAAkC;IAE7C,SAAS,aACS,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,YAAY,EAChC,MAAM,EAAE,SAAS;WAGb,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,GAAE;QAAE,GAAG,CAAC,EAAE,GAAG,CAAC;QAAC,IAAI,CAAC,EAAE,SAAS,CAAA;KAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IAKjG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC;IAKjC,GAAG;IAiDH,WAAW;;;;;;;;;;IAOxB,OAAO,CAAC,iBAAiB;CAmB1B"}
|
package/dest/bot.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BatchCall, FeeJuicePaymentMethod, NoFeePaymentMethod, createDebugLogger, } from '@aztec/aztec.js';
|
|
2
|
-
import { GasSettings } from '@aztec/circuits.js';
|
|
2
|
+
import { Gas, GasSettings } from '@aztec/circuits.js';
|
|
3
3
|
import { times } from '@aztec/foundation/collection';
|
|
4
4
|
import { BotFactory } from './factory.js';
|
|
5
5
|
import { getBalances } from './utils.js';
|
|
@@ -16,19 +16,21 @@ export class Bot {
|
|
|
16
16
|
const { wallet, token, recipient } = await new BotFactory(config, dependencies).setup();
|
|
17
17
|
return new Bot(wallet, token, recipient, config);
|
|
18
18
|
}
|
|
19
|
+
updateConfig(config) {
|
|
20
|
+
this.log.info(`Updating bot config ${Object.keys(config).join(', ')}`);
|
|
21
|
+
this.config = { ...this.config, ...config };
|
|
22
|
+
}
|
|
19
23
|
async run() {
|
|
20
24
|
const logCtx = { runId: Date.now() * 1000 + Math.floor(Math.random() * 1000) };
|
|
21
|
-
const { privateTransfersPerTx, publicTransfersPerTx, feePaymentMethod } = this.config;
|
|
25
|
+
const { privateTransfersPerTx, publicTransfersPerTx, feePaymentMethod, followChain, txMinedWaitSeconds } = this.config;
|
|
22
26
|
const { token, recipient, wallet } = this;
|
|
23
27
|
const sender = wallet.getAddress();
|
|
24
|
-
this.log.verbose(`
|
|
28
|
+
this.log.verbose(`Preparing tx with ${feePaymentMethod} fee with ${privateTransfersPerTx} private and ${publicTransfersPerTx} public transfers`, logCtx);
|
|
25
29
|
const calls = [
|
|
26
30
|
...times(privateTransfersPerTx, () => token.methods.transfer(recipient, TRANSFER_AMOUNT).request()),
|
|
27
31
|
...times(publicTransfersPerTx, () => token.methods.transfer_public(sender, recipient, TRANSFER_AMOUNT, 0).request()),
|
|
28
32
|
];
|
|
29
|
-
const
|
|
30
|
-
const gasSettings = GasSettings.default();
|
|
31
|
-
const opts = { estimateGas: true, fee: { paymentMethod, gasSettings } };
|
|
33
|
+
const opts = this.getSendMethodOpts();
|
|
32
34
|
const batch = new BatchCall(wallet, calls);
|
|
33
35
|
this.log.verbose(`Creating batch execution request with ${calls.length} calls`, logCtx);
|
|
34
36
|
await batch.create(opts);
|
|
@@ -39,15 +41,15 @@ export class Bot {
|
|
|
39
41
|
this.log.verbose(`Sending tx`, logCtx);
|
|
40
42
|
const tx = batch.send(opts);
|
|
41
43
|
const txHash = await tx.getTxHash();
|
|
42
|
-
if (
|
|
44
|
+
if (followChain === 'NONE') {
|
|
43
45
|
this.log.info(`Transaction ${txHash} sent, not waiting for it to be mined`);
|
|
44
46
|
return;
|
|
45
47
|
}
|
|
46
|
-
this.log.verbose(`Awaiting tx ${txHash} to be on the ${
|
|
48
|
+
this.log.verbose(`Awaiting tx ${txHash} to be on the ${followChain} (timeout ${txMinedWaitSeconds}s)`, logCtx);
|
|
47
49
|
const receipt = await tx.wait({
|
|
48
|
-
timeout:
|
|
49
|
-
provenTimeout:
|
|
50
|
-
proven:
|
|
50
|
+
timeout: txMinedWaitSeconds,
|
|
51
|
+
provenTimeout: txMinedWaitSeconds,
|
|
52
|
+
proven: followChain === 'PROVEN',
|
|
51
53
|
});
|
|
52
54
|
this.log.info(`Tx ${receipt.txHash} mined in block ${receipt.blockNumber}`, logCtx);
|
|
53
55
|
}
|
|
@@ -57,5 +59,23 @@ export class Bot {
|
|
|
57
59
|
recipient: await getBalances(this.token, this.recipient),
|
|
58
60
|
};
|
|
59
61
|
}
|
|
62
|
+
getSendMethodOpts() {
|
|
63
|
+
const sender = this.wallet.getAddress();
|
|
64
|
+
const { feePaymentMethod, l2GasLimit, daGasLimit, skipPublicSimulation } = this.config;
|
|
65
|
+
const paymentMethod = feePaymentMethod === 'fee_juice' ? new FeeJuicePaymentMethod(sender) : new NoFeePaymentMethod();
|
|
66
|
+
let gasSettings, estimateGas;
|
|
67
|
+
if (l2GasLimit !== undefined && l2GasLimit > 0 && daGasLimit !== undefined && daGasLimit > 0) {
|
|
68
|
+
gasSettings = GasSettings.default({ gasLimits: Gas.from({ l2Gas: l2GasLimit, daGas: daGasLimit }) });
|
|
69
|
+
estimateGas = false;
|
|
70
|
+
this.log.verbose(`Using gas limits ${l2GasLimit} L2 gas ${daGasLimit} DA gas`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
gasSettings = GasSettings.default();
|
|
74
|
+
estimateGas = true;
|
|
75
|
+
this.log.verbose(`Estimating gas for transaction`);
|
|
76
|
+
}
|
|
77
|
+
this.log.verbose(skipPublicSimulation ? `Skipping public simulation` : `Simulating public transfers`);
|
|
78
|
+
return { estimateGas, fee: { paymentMethod, gasSettings }, skipPublicSimulation };
|
|
79
|
+
}
|
|
60
80
|
}
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2JvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULHFCQUFxQixFQUNyQixrQkFBa0IsRUFHbEIsaUJBQWlCLEdBQ2xCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFJckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXpDLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUUxQixNQUFNLE9BQU8sR0FBRztJQUdkLFlBQ2tCLE1BQWMsRUFDZCxLQUFvQixFQUNwQixTQUF1QixFQUNoQyxNQUFpQjtRQUhSLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFlO1FBQ3BCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDaEMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQU5sQixRQUFHLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFPMUMsQ0FBQztJQUVKLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQWlCLEVBQUUsZUFBZ0QsRUFBRTtRQUN2RixNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4RixPQUFPLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTSxZQUFZLENBQUMsTUFBMEI7UUFDNUMsSUFBSSxDQUFD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
|
package/dest/config.d.ts
CHANGED
|
@@ -31,6 +31,12 @@ export type BotConfig = {
|
|
|
31
31
|
maxPendingTxs: number;
|
|
32
32
|
/** Whether to flush after sending each 'setup' transaction */
|
|
33
33
|
flushSetupTransactions: boolean;
|
|
34
|
+
/** Whether to skip public simulation of txs before sending them. */
|
|
35
|
+
skipPublicSimulation: boolean;
|
|
36
|
+
/** L2 gas limit for the tx (empty to have the bot trigger an estimate gas). */
|
|
37
|
+
l2GasLimit: number | undefined;
|
|
38
|
+
/** DA gas limit for the tx (empty to have the bot trigger an estimate gas). */
|
|
39
|
+
daGasLimit: number | undefined;
|
|
34
40
|
};
|
|
35
41
|
export declare const botConfigMappings: ConfigMappingsType<BotConfig>;
|
|
36
42
|
export declare function getBotConfigFromEnv(): BotConfig;
|
package/dest/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AACxC,OAAO,EACL,KAAK,kBAAkB,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AACxC,OAAO,EACL,KAAK,kBAAkB,EAMxB,MAAM,0BAA0B,CAAC;AAElC,QAAA,MAAM,cAAc,wCAAyC,CAAC;AAC9D,KAAK,cAAc,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtD,MAAM,MAAM,SAAS,GAAG;IACtB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,8EAA8E;IAC9E,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,kDAAkD;IAClD,gBAAgB,EAAE,EAAE,CAAC;IACrB,iDAAiD;IACjD,yBAAyB,EAAE,EAAE,CAAC;IAC9B,8CAA8C;IAC9C,SAAS,EAAE,EAAE,CAAC;IACd,sDAAsD;IACtD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,4DAA4D;IAC5D,qBAAqB,EAAE,MAAM,CAAC;IAC9B,2DAA2D;IAC3D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kCAAkC;IAClC,gBAAgB,EAAE,WAAW,GAAG,MAAM,CAAC;IACvC,0EAA0E;IAC1E,OAAO,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,4EAA4E;IAC5E,WAAW,EAAE,cAAc,CAAC;IAC5B,gFAAgF;IAChF,aAAa,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,sBAAsB,EAAE,OAAO,CAAC;IAChC,oEAAoE;IACpE,oBAAoB,EAAE,OAAO,CAAC;IAC9B,+EAA+E;IAC/E,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,+EAA+E;IAC/E,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,kBAAkB,CAAC,SAAS,CA8F3D,CAAC;AAEF,wBAAgB,mBAAmB,IAAI,SAAS,CAE/C;AAED,wBAAgB,mBAAmB,IAAI,SAAS,CAE/C"}
|
package/dest/config.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Fr } from '@aztec/circuits.js';
|
|
2
|
-
import { booleanConfigHelper, getConfigFromMappings, getDefaultConfig, numberConfigHelper, } from '@aztec/foundation/config';
|
|
2
|
+
import { booleanConfigHelper, getConfigFromMappings, getDefaultConfig, numberConfigHelper, optionalNumberConfigHelper, } from '@aztec/foundation/config';
|
|
3
3
|
const botFollowChain = ['NONE', 'PENDING', 'PROVEN'];
|
|
4
4
|
export const botConfigMappings = {
|
|
5
5
|
nodeUrl: {
|
|
@@ -80,6 +80,21 @@ export const botConfigMappings = {
|
|
|
80
80
|
description: 'Make a request for the sequencer to build a block after each setup transaction.',
|
|
81
81
|
...booleanConfigHelper(false),
|
|
82
82
|
},
|
|
83
|
+
skipPublicSimulation: {
|
|
84
|
+
env: 'BOT_SKIP_PUBLIC_SIMULATION',
|
|
85
|
+
description: 'Whether to skip public simulation of txs before sending them.',
|
|
86
|
+
...booleanConfigHelper(false),
|
|
87
|
+
},
|
|
88
|
+
l2GasLimit: {
|
|
89
|
+
env: 'BOT_L2_GAS_LIMIT',
|
|
90
|
+
description: 'L2 gas limit for the tx (empty to have the bot trigger an estimate gas).',
|
|
91
|
+
...optionalNumberConfigHelper(),
|
|
92
|
+
},
|
|
93
|
+
daGasLimit: {
|
|
94
|
+
env: 'BOT_DA_GAS_LIMIT',
|
|
95
|
+
description: 'DA gas limit for the tx (empty to have the bot trigger an estimate gas).',
|
|
96
|
+
...optionalNumberConfigHelper(),
|
|
97
|
+
},
|
|
83
98
|
};
|
|
84
99
|
export function getBotConfigFromEnv() {
|
|
85
100
|
return getConfigFromMappings(botConfigMappings);
|
|
@@ -87,4 +102,4 @@ export function getBotConfigFromEnv() {
|
|
|
87
102
|
export function getBotDefaultConfig() {
|
|
88
103
|
return getDefaultConfig(botConfigMappings);
|
|
89
104
|
}
|
|
90
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEMsT0FBTyxFQUVMLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQiwwQkFBMEIsR0FDM0IsTUFBTSwwQkFBMEIsQ0FBQztBQUVsQyxNQUFNLGNBQWMsR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFVLENBQUM7QUF3QzlELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFrQztJQUM5RCxPQUFPLEVBQUU7UUFDUCxHQUFHLEVBQUUsZ0JBQWdCO1FBQ3JCLFdBQVcsRUFBRSx3REFBd0Q7S0FDdEU7SUFDRCxNQUFNLEVBQUU7UUFDTixHQUFHLEVBQUUsYUFBYTtRQUNsQixXQUFXLEVBQUUseUVBQXlFO0tBQ3ZGO0lBQ0QsZ0JBQWdCLEVBQUU7UUFDaEIsR0FBRyxFQUFFLGlCQUFpQjtRQUN0QixXQUFXLEVBQUUsNkNBQTZDO1FBQzFELFFBQVEsRUFBRSxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFDN0MsWUFBWSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUU7S0FDMUI7SUFDRCx5QkFBeUIsRUFBRTtRQUN6QixHQUFHLEVBQUUsaUNBQWlDO1FBQ3RDLFdBQVcsRUFBRSw0Q0FBNEM7UUFDekQsUUFBUSxFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUM3QyxZQUFZLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUM7S0FDMUM7SUFDRCxTQUFTLEVBQUU7UUFDVCxHQUFHLEVBQUUsZ0JBQWdCO1FBQ3JCLFdBQVcsRUFBRSx5Q0FBeUM7UUFDdEQsUUFB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/bot",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.53.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js"
|
|
@@ -49,15 +49,15 @@
|
|
|
49
49
|
]
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@aztec/accounts": "0.
|
|
53
|
-
"@aztec/aztec.js": "0.
|
|
54
|
-
"@aztec/circuit-types": "0.
|
|
55
|
-
"@aztec/circuits.js": "0.
|
|
56
|
-
"@aztec/entrypoints": "0.
|
|
57
|
-
"@aztec/foundation": "0.
|
|
58
|
-
"@aztec/noir-contracts.js": "0.
|
|
59
|
-
"@aztec/protocol-contracts": "0.
|
|
60
|
-
"@aztec/types": "0.
|
|
52
|
+
"@aztec/accounts": "0.53.0",
|
|
53
|
+
"@aztec/aztec.js": "0.53.0",
|
|
54
|
+
"@aztec/circuit-types": "0.53.0",
|
|
55
|
+
"@aztec/circuits.js": "0.53.0",
|
|
56
|
+
"@aztec/entrypoints": "0.53.0",
|
|
57
|
+
"@aztec/foundation": "0.53.0",
|
|
58
|
+
"@aztec/noir-contracts.js": "0.53.0",
|
|
59
|
+
"@aztec/protocol-contracts": "0.53.0",
|
|
60
|
+
"@aztec/types": "0.53.0",
|
|
61
61
|
"source-map-support": "^0.5.21",
|
|
62
62
|
"tslib": "^2.4.0"
|
|
63
63
|
},
|
package/src/bot.ts
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
createDebugLogger,
|
|
9
9
|
} from '@aztec/aztec.js';
|
|
10
10
|
import { type AztecNode, type FunctionCall, type PXE } from '@aztec/circuit-types';
|
|
11
|
-
import { GasSettings } from '@aztec/circuits.js';
|
|
11
|
+
import { Gas, GasSettings } from '@aztec/circuits.js';
|
|
12
12
|
import { times } from '@aztec/foundation/collection';
|
|
13
13
|
import { type TokenContract } from '@aztec/noir-contracts.js';
|
|
14
14
|
|
|
@@ -25,7 +25,7 @@ export class Bot {
|
|
|
25
25
|
public readonly wallet: Wallet,
|
|
26
26
|
public readonly token: TokenContract,
|
|
27
27
|
public readonly recipient: AztecAddress,
|
|
28
|
-
public
|
|
28
|
+
public config: BotConfig,
|
|
29
29
|
) {}
|
|
30
30
|
|
|
31
31
|
static async create(config: BotConfig, dependencies: { pxe?: PXE; node?: AztecNode } = {}): Promise<Bot> {
|
|
@@ -33,14 +33,20 @@ export class Bot {
|
|
|
33
33
|
return new Bot(wallet, token, recipient, config);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
public updateConfig(config: Partial<BotConfig>) {
|
|
37
|
+
this.log.info(`Updating bot config ${Object.keys(config).join(', ')}`);
|
|
38
|
+
this.config = { ...this.config, ...config };
|
|
39
|
+
}
|
|
40
|
+
|
|
36
41
|
public async run() {
|
|
37
42
|
const logCtx = { runId: Date.now() * 1000 + Math.floor(Math.random() * 1000) };
|
|
38
|
-
const { privateTransfersPerTx, publicTransfersPerTx, feePaymentMethod } =
|
|
43
|
+
const { privateTransfersPerTx, publicTransfersPerTx, feePaymentMethod, followChain, txMinedWaitSeconds } =
|
|
44
|
+
this.config;
|
|
39
45
|
const { token, recipient, wallet } = this;
|
|
40
46
|
const sender = wallet.getAddress();
|
|
41
47
|
|
|
42
48
|
this.log.verbose(
|
|
43
|
-
`
|
|
49
|
+
`Preparing tx with ${feePaymentMethod} fee with ${privateTransfersPerTx} private and ${publicTransfersPerTx} public transfers`,
|
|
44
50
|
logCtx,
|
|
45
51
|
);
|
|
46
52
|
|
|
@@ -51,11 +57,7 @@ export class Bot {
|
|
|
51
57
|
),
|
|
52
58
|
];
|
|
53
59
|
|
|
54
|
-
const
|
|
55
|
-
feePaymentMethod === 'fee_juice' ? new FeeJuicePaymentMethod(sender) : new NoFeePaymentMethod();
|
|
56
|
-
const gasSettings = GasSettings.default();
|
|
57
|
-
const opts: SendMethodOptions = { estimateGas: true, fee: { paymentMethod, gasSettings } };
|
|
58
|
-
|
|
60
|
+
const opts = this.getSendMethodOpts();
|
|
59
61
|
const batch = new BatchCall(wallet, calls);
|
|
60
62
|
this.log.verbose(`Creating batch execution request with ${calls.length} calls`, logCtx);
|
|
61
63
|
await batch.create(opts);
|
|
@@ -71,19 +73,16 @@ export class Bot {
|
|
|
71
73
|
|
|
72
74
|
const txHash = await tx.getTxHash();
|
|
73
75
|
|
|
74
|
-
if (
|
|
76
|
+
if (followChain === 'NONE') {
|
|
75
77
|
this.log.info(`Transaction ${txHash} sent, not waiting for it to be mined`);
|
|
76
78
|
return;
|
|
77
79
|
}
|
|
78
80
|
|
|
79
|
-
this.log.verbose(
|
|
80
|
-
`Awaiting tx ${txHash} to be on the ${this.config.followChain} (timeout ${this.config.txMinedWaitSeconds}s)`,
|
|
81
|
-
logCtx,
|
|
82
|
-
);
|
|
81
|
+
this.log.verbose(`Awaiting tx ${txHash} to be on the ${followChain} (timeout ${txMinedWaitSeconds}s)`, logCtx);
|
|
83
82
|
const receipt = await tx.wait({
|
|
84
|
-
timeout:
|
|
85
|
-
provenTimeout:
|
|
86
|
-
proven:
|
|
83
|
+
timeout: txMinedWaitSeconds,
|
|
84
|
+
provenTimeout: txMinedWaitSeconds,
|
|
85
|
+
proven: followChain === 'PROVEN',
|
|
87
86
|
});
|
|
88
87
|
this.log.info(`Tx ${receipt.txHash} mined in block ${receipt.blockNumber}`, logCtx);
|
|
89
88
|
}
|
|
@@ -94,4 +93,24 @@ export class Bot {
|
|
|
94
93
|
recipient: await getBalances(this.token, this.recipient),
|
|
95
94
|
};
|
|
96
95
|
}
|
|
96
|
+
|
|
97
|
+
private getSendMethodOpts(): SendMethodOptions {
|
|
98
|
+
const sender = this.wallet.getAddress();
|
|
99
|
+
const { feePaymentMethod, l2GasLimit, daGasLimit, skipPublicSimulation } = this.config;
|
|
100
|
+
const paymentMethod =
|
|
101
|
+
feePaymentMethod === 'fee_juice' ? new FeeJuicePaymentMethod(sender) : new NoFeePaymentMethod();
|
|
102
|
+
|
|
103
|
+
let gasSettings, estimateGas;
|
|
104
|
+
if (l2GasLimit !== undefined && l2GasLimit > 0 && daGasLimit !== undefined && daGasLimit > 0) {
|
|
105
|
+
gasSettings = GasSettings.default({ gasLimits: Gas.from({ l2Gas: l2GasLimit, daGas: daGasLimit }) });
|
|
106
|
+
estimateGas = false;
|
|
107
|
+
this.log.verbose(`Using gas limits ${l2GasLimit} L2 gas ${daGasLimit} DA gas`);
|
|
108
|
+
} else {
|
|
109
|
+
gasSettings = GasSettings.default();
|
|
110
|
+
estimateGas = true;
|
|
111
|
+
this.log.verbose(`Estimating gas for transaction`);
|
|
112
|
+
}
|
|
113
|
+
this.log.verbose(skipPublicSimulation ? `Skipping public simulation` : `Simulating public transfers`);
|
|
114
|
+
return { estimateGas, fee: { paymentMethod, gasSettings }, skipPublicSimulation };
|
|
115
|
+
}
|
|
97
116
|
}
|
package/src/config.ts
CHANGED
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
getConfigFromMappings,
|
|
6
6
|
getDefaultConfig,
|
|
7
7
|
numberConfigHelper,
|
|
8
|
+
optionalNumberConfigHelper,
|
|
8
9
|
} from '@aztec/foundation/config';
|
|
9
10
|
|
|
10
11
|
const botFollowChain = ['NONE', 'PENDING', 'PROVEN'] as const;
|
|
@@ -39,6 +40,12 @@ export type BotConfig = {
|
|
|
39
40
|
maxPendingTxs: number;
|
|
40
41
|
/** Whether to flush after sending each 'setup' transaction */
|
|
41
42
|
flushSetupTransactions: boolean;
|
|
43
|
+
/** Whether to skip public simulation of txs before sending them. */
|
|
44
|
+
skipPublicSimulation: boolean;
|
|
45
|
+
/** L2 gas limit for the tx (empty to have the bot trigger an estimate gas). */
|
|
46
|
+
l2GasLimit: number | undefined;
|
|
47
|
+
/** DA gas limit for the tx (empty to have the bot trigger an estimate gas). */
|
|
48
|
+
daGasLimit: number | undefined;
|
|
42
49
|
};
|
|
43
50
|
|
|
44
51
|
export const botConfigMappings: ConfigMappingsType<BotConfig> = {
|
|
@@ -120,6 +127,21 @@ export const botConfigMappings: ConfigMappingsType<BotConfig> = {
|
|
|
120
127
|
description: 'Make a request for the sequencer to build a block after each setup transaction.',
|
|
121
128
|
...booleanConfigHelper(false),
|
|
122
129
|
},
|
|
130
|
+
skipPublicSimulation: {
|
|
131
|
+
env: 'BOT_SKIP_PUBLIC_SIMULATION',
|
|
132
|
+
description: 'Whether to skip public simulation of txs before sending them.',
|
|
133
|
+
...booleanConfigHelper(false),
|
|
134
|
+
},
|
|
135
|
+
l2GasLimit: {
|
|
136
|
+
env: 'BOT_L2_GAS_LIMIT',
|
|
137
|
+
description: 'L2 gas limit for the tx (empty to have the bot trigger an estimate gas).',
|
|
138
|
+
...optionalNumberConfigHelper(),
|
|
139
|
+
},
|
|
140
|
+
daGasLimit: {
|
|
141
|
+
env: 'BOT_DA_GAS_LIMIT',
|
|
142
|
+
description: 'DA gas limit for the tx (empty to have the bot trigger an estimate gas).',
|
|
143
|
+
...optionalNumberConfigHelper(),
|
|
144
|
+
},
|
|
123
145
|
};
|
|
124
146
|
|
|
125
147
|
export function getBotConfigFromEnv(): BotConfig {
|