@aztec/bot 0.0.0-test.1 → 0.0.1-commit.001888fc

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.
Files changed (57) hide show
  1. package/dest/amm_bot.d.ts +32 -0
  2. package/dest/amm_bot.d.ts.map +1 -0
  3. package/dest/amm_bot.js +108 -0
  4. package/dest/base_bot.d.ts +21 -0
  5. package/dest/base_bot.d.ts.map +1 -0
  6. package/dest/base_bot.js +79 -0
  7. package/dest/bot.d.ts +13 -18
  8. package/dest/bot.d.ts.map +1 -1
  9. package/dest/bot.js +26 -84
  10. package/dest/config.d.ts +106 -66
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +89 -39
  13. package/dest/cross_chain_bot.d.ts +54 -0
  14. package/dest/cross_chain_bot.d.ts.map +1 -0
  15. package/dest/cross_chain_bot.js +134 -0
  16. package/dest/factory.d.ts +43 -29
  17. package/dest/factory.d.ts.map +1 -1
  18. package/dest/factory.js +380 -139
  19. package/dest/index.d.ts +5 -2
  20. package/dest/index.d.ts.map +1 -1
  21. package/dest/index.js +4 -1
  22. package/dest/interface.d.ts +12 -1
  23. package/dest/interface.d.ts.map +1 -1
  24. package/dest/interface.js +5 -0
  25. package/dest/l1_to_l2_seeding.d.ts +8 -0
  26. package/dest/l1_to_l2_seeding.d.ts.map +1 -0
  27. package/dest/l1_to_l2_seeding.js +63 -0
  28. package/dest/rpc.d.ts +1 -7
  29. package/dest/rpc.d.ts.map +1 -1
  30. package/dest/rpc.js +0 -11
  31. package/dest/runner.d.ts +15 -11
  32. package/dest/runner.d.ts.map +1 -1
  33. package/dest/runner.js +457 -51
  34. package/dest/store/bot_store.d.ts +69 -0
  35. package/dest/store/bot_store.d.ts.map +1 -0
  36. package/dest/store/bot_store.js +138 -0
  37. package/dest/store/index.d.ts +2 -0
  38. package/dest/store/index.d.ts.map +1 -0
  39. package/dest/store/index.js +1 -0
  40. package/dest/utils.d.ts +8 -5
  41. package/dest/utils.d.ts.map +1 -1
  42. package/dest/utils.js +14 -5
  43. package/package.json +30 -23
  44. package/src/amm_bot.ts +129 -0
  45. package/src/base_bot.ts +82 -0
  46. package/src/bot.ts +52 -101
  47. package/src/config.ts +129 -71
  48. package/src/cross_chain_bot.ts +203 -0
  49. package/src/factory.ts +476 -152
  50. package/src/index.ts +4 -1
  51. package/src/interface.ts +9 -0
  52. package/src/l1_to_l2_seeding.ts +79 -0
  53. package/src/rpc.ts +0 -13
  54. package/src/runner.ts +51 -21
  55. package/src/store/bot_store.ts +196 -0
  56. package/src/store/index.ts +1 -0
  57. package/src/utils.ts +17 -6
@@ -0,0 +1,32 @@
1
+ import { AztecAddress } from '@aztec/aztec.js/addresses';
2
+ import { TxHash, TxReceipt } from '@aztec/aztec.js/tx';
3
+ import type { AMMContract } from '@aztec/noir-contracts.js/AMM';
4
+ import type { TokenContract } from '@aztec/noir-contracts.js/Token';
5
+ import type { AztecNode, AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
6
+ import type { EmbeddedWallet } from '@aztec/wallets/embedded';
7
+ import { BaseBot } from './base_bot.js';
8
+ import type { BotConfig } from './config.js';
9
+ import type { BotStore } from './store/index.js';
10
+ type Balances = {
11
+ token0: bigint;
12
+ token1: bigint;
13
+ };
14
+ export declare class AmmBot extends BaseBot {
15
+ readonly amm: AMMContract;
16
+ readonly token0: TokenContract;
17
+ readonly token1: TokenContract;
18
+ protected constructor(node: AztecNode, wallet: EmbeddedWallet, defaultAccountAddress: AztecAddress, amm: AMMContract, token0: TokenContract, token1: TokenContract, config: BotConfig);
19
+ static create(config: BotConfig, wallet: EmbeddedWallet, aztecNode: AztecNode, aztecNodeAdmin: AztecNodeAdmin | undefined, store: BotStore): Promise<AmmBot>;
20
+ protected createAndSendTx(logCtx: object): Promise<TxHash>;
21
+ protected onTxMined(receipt: TxReceipt, logCtx: object): Promise<void>;
22
+ getAmmBalances(): Promise<Balances>;
23
+ getBalances(): Promise<{
24
+ senderPublic: Balances;
25
+ senderPrivate: Balances;
26
+ amm: Balances;
27
+ }>;
28
+ private getPublicBalanceFor;
29
+ private getPrivateBalanceFor;
30
+ }
31
+ export {};
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1tX2JvdC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FtbV9ib3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkQsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEUsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pGLE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTlELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBS2pELEtBQUssUUFBUSxHQUFHO0lBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUFDLE1BQU0sRUFBRSxNQUFNLENBQUE7Q0FBRSxDQUFDO0FBRW5ELHFCQUFhLE1BQU8sU0FBUSxPQUFPO2FBS2YsR0FBRyxFQUFFLFdBQVc7YUFDaEIsTUFBTSxFQUFFLGFBQWE7YUFDckIsTUFBTSxFQUFFLGFBQWE7SUFOdkMsU0FBUyxhQUNQLElBQUksRUFBRSxTQUFTLEVBQ2YsTUFBTSxFQUFFLGNBQWMsRUFDdEIscUJBQXFCLEVBQUUsWUFBWSxFQUNuQixHQUFHLEVBQUUsV0FBVyxFQUNoQixNQUFNLEVBQUUsYUFBYSxFQUNyQixNQUFNLEVBQUUsYUFBYSxFQUNyQyxNQUFNLEVBQUUsU0FBUyxFQUdsQjtJQUVELE9BQWEsTUFBTSxDQUNqQixNQUFNLEVBQUUsU0FBUyxFQUNqQixNQUFNLEVBQUUsY0FBYyxFQUN0QixTQUFTLEVBQUUsU0FBUyxFQUNwQixjQUFjLEVBQUUsY0FBYyxHQUFHLFNBQVMsRUFDMUMsS0FBSyxFQUFFLFFBQVEsR0FDZCxPQUFPLENBQUMsTUFBTSxDQUFDLENBU2pCO0lBRUQsVUFBZ0IsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQTZDL0Q7SUFFRCxVQUF5QixTQUFTLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FHcEY7SUFFTSxjQUFjLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUV6QztJQUVZLFdBQVcsSUFBSSxPQUFPLENBQUM7UUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDO1FBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQztRQUFDLEdBQUcsRUFBRSxRQUFRLENBQUE7S0FBRSxDQUFDLENBTXRHO1lBRWEsbUJBQW1CO1lBS25CLG9CQUFvQjtDQVNuQyJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amm_bot.d.ts","sourceRoot":"","sources":["../src/amm_bot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAKjD,KAAK,QAAQ,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,qBAAa,MAAO,SAAQ,OAAO;aAKf,GAAG,EAAE,WAAW;aAChB,MAAM,EAAE,aAAa;aACrB,MAAM,EAAE,aAAa;IANvC,SAAS,aACP,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,cAAc,EACtB,qBAAqB,EAAE,YAAY,EACnB,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,aAAa,EACrC,MAAM,EAAE,SAAS,EAGlB;IAED,OAAa,MAAM,CACjB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,KAAK,EAAE,QAAQ,GACd,OAAO,CAAC,MAAM,CAAC,CASjB;IAED,UAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6C/D;IAED,UAAyB,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpF;IAEM,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC,CAEzC;IAEY,WAAW,IAAI,OAAO,CAAC;QAAE,YAAY,EAAE,QAAQ,CAAC;QAAC,aAAa,EAAE,QAAQ,CAAC;QAAC,GAAG,EAAE,QAAQ,CAAA;KAAE,CAAC,CAMtG;YAEa,mBAAmB;YAKnB,oBAAoB;CASnC"}
@@ -0,0 +1,108 @@
1
+ import { NO_WAIT } from '@aztec/aztec.js/contracts';
2
+ import { Fr } from '@aztec/aztec.js/fields';
3
+ import { jsonStringify } from '@aztec/foundation/json-rpc';
4
+ import { BaseBot } from './base_bot.js';
5
+ import { BotFactory } from './factory.js';
6
+ const TRANSFER_BASE_AMOUNT = 1_000;
7
+ const TRANSFER_VARIANCE = 200;
8
+ export class AmmBot extends BaseBot {
9
+ amm;
10
+ token0;
11
+ token1;
12
+ constructor(node, wallet, defaultAccountAddress, amm, token0, token1, config){
13
+ super(node, wallet, defaultAccountAddress, config), this.amm = amm, this.token0 = token0, this.token1 = token1;
14
+ }
15
+ static async create(config, wallet, aztecNode, aztecNodeAdmin, store) {
16
+ const { defaultAccountAddress, token0, token1, amm } = await new BotFactory(config, wallet, store, aztecNode, aztecNodeAdmin).setupAmm();
17
+ return new AmmBot(aztecNode, wallet, defaultAccountAddress, amm, token0, token1, config);
18
+ }
19
+ async createAndSendTx(logCtx) {
20
+ const { feePaymentMethod } = this.config;
21
+ const { wallet, amm, token0, token1 } = this;
22
+ const balances = this.getBalances();
23
+ this.log.info(`Preparing tx with ${feePaymentMethod} fee to swap tokens. Balances: ${jsonStringify(balances)}`, {
24
+ ...logCtx,
25
+ balances
26
+ });
27
+ // 1000 ± 200
28
+ const amountIn = Math.floor(TRANSFER_BASE_AMOUNT + (Math.random() - 0.5) * TRANSFER_VARIANCE);
29
+ const authwitNonce = Fr.random();
30
+ const [tokenIn, tokenOut] = Math.random() < 0.5 ? [
31
+ token0,
32
+ token1
33
+ ] : [
34
+ token1,
35
+ token0
36
+ ];
37
+ const swapAuthwit = await wallet.createAuthWit(this.defaultAccountAddress, {
38
+ caller: amm.address,
39
+ call: await tokenIn.methods.transfer_to_public(this.defaultAccountAddress, amm.address, amountIn, authwitNonce).getFunctionCall()
40
+ });
41
+ const { result: tokenInBalance } = await tokenIn.methods.balance_of_public(amm.address).simulate({
42
+ from: this.defaultAccountAddress
43
+ });
44
+ const { result: tokenOutBalance } = await tokenOut.methods.balance_of_public(amm.address).simulate({
45
+ from: this.defaultAccountAddress
46
+ });
47
+ const { result: amountOutMin } = await amm.methods.get_amount_out_for_exact_in(tokenInBalance, tokenOutBalance, amountIn).simulate({
48
+ from: this.defaultAccountAddress
49
+ });
50
+ const swapExactTokensInteraction = amm.methods.swap_exact_tokens_for_tokens(tokenIn.address, tokenOut.address, amountIn, amountOutMin, authwitNonce).with({
51
+ authWitnesses: [
52
+ swapAuthwit
53
+ ]
54
+ });
55
+ const opts = await this.getSendMethodOpts(swapExactTokensInteraction);
56
+ this.log.verbose(`Sending transaction`, logCtx);
57
+ this.log.info(`Tx. Balances: ${jsonStringify(balances)}`, {
58
+ ...logCtx,
59
+ balances
60
+ });
61
+ const { txHash } = await swapExactTokensInteraction.send({
62
+ ...opts,
63
+ wait: NO_WAIT
64
+ });
65
+ return txHash;
66
+ }
67
+ async onTxMined(receipt, logCtx) {
68
+ const balances = await this.getBalances();
69
+ this.log.info(`Balances after swap in tx ${receipt.txHash}: ${jsonStringify(balances)}`, {
70
+ ...logCtx,
71
+ balances
72
+ });
73
+ }
74
+ getAmmBalances() {
75
+ return this.getPublicBalanceFor(this.amm.address);
76
+ }
77
+ async getBalances() {
78
+ return {
79
+ senderPublic: await this.getPublicBalanceFor(this.defaultAccountAddress),
80
+ senderPrivate: await this.getPrivateBalanceFor(this.defaultAccountAddress),
81
+ amm: await this.getPublicBalanceFor(this.amm.address, this.defaultAccountAddress)
82
+ };
83
+ }
84
+ async getPublicBalanceFor(address, from) {
85
+ const { result: token0 } = await this.token0.methods.balance_of_public(address).simulate({
86
+ from: from ?? address
87
+ });
88
+ const { result: token1 } = await this.token1.methods.balance_of_public(address).simulate({
89
+ from: from ?? address
90
+ });
91
+ return {
92
+ token0,
93
+ token1
94
+ };
95
+ }
96
+ async getPrivateBalanceFor(address, from) {
97
+ const { result: token0 } = await this.token0.methods.balance_of_private(address).simulate({
98
+ from: from ?? address
99
+ });
100
+ const { result: token1 } = await this.token1.methods.balance_of_private(address).simulate({
101
+ from: from ?? address
102
+ });
103
+ return {
104
+ token0,
105
+ token1
106
+ };
107
+ }
108
+ }
@@ -0,0 +1,21 @@
1
+ import { AztecAddress } from '@aztec/aztec.js/addresses';
2
+ import { BatchCall, ContractFunctionInteraction, type SendInteractionOptions } from '@aztec/aztec.js/contracts';
3
+ import { TxHash, TxReceipt } from '@aztec/aztec.js/tx';
4
+ import type { AztecNode } from '@aztec/stdlib/interfaces/client';
5
+ import type { EmbeddedWallet } from '@aztec/wallets/embedded';
6
+ import type { BotConfig } from './config.js';
7
+ export declare abstract class BaseBot {
8
+ readonly node: AztecNode;
9
+ readonly wallet: EmbeddedWallet;
10
+ readonly defaultAccountAddress: AztecAddress;
11
+ config: BotConfig;
12
+ protected log: import("@aztec/aztec.js/log").Logger;
13
+ protected attempts: number;
14
+ protected successes: number;
15
+ protected constructor(node: AztecNode, wallet: EmbeddedWallet, defaultAccountAddress: AztecAddress, config: BotConfig);
16
+ run(): Promise<TxReceipt | TxHash>;
17
+ protected abstract createAndSendTx(logCtx: object): Promise<TxHash>;
18
+ protected onTxMined(_receipt: TxReceipt, _logCtx: object): Promise<void>;
19
+ protected getSendMethodOpts(interaction: ContractFunctionInteraction | BatchCall): Promise<SendInteractionOptions>;
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZV9ib3QuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9iYXNlX2JvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSwyQkFBMkIsRUFBRSxLQUFLLHNCQUFzQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHaEgsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQVksTUFBTSxvQkFBb0IsQ0FBQztBQUVqRSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU5RCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFN0MsOEJBQXNCLE9BQU87YUFPVCxJQUFJLEVBQUUsU0FBUzthQUNmLE1BQU0sRUFBRSxjQUFjO2FBQ3RCLHFCQUFxQixFQUFFLFlBQVk7SUFDNUMsTUFBTSxFQUFFLFNBQVM7SUFUMUIsU0FBUyxDQUFDLEdBQUcsdUNBQXVCO0lBRXBDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFLO0lBQy9CLFNBQVMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFLO0lBRWhDLFNBQVMsYUFDUyxJQUFJLEVBQUUsU0FBUyxFQUNmLE1BQU0sRUFBRSxjQUFjLEVBQ3RCLHFCQUFxQixFQUFFLFlBQVksRUFDNUMsTUFBTSxFQUFFLFNBQVMsRUFDdEI7SUFFUyxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0F5QjlDO0lBRUQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFcEUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUd2RTtJQUVELFVBQWdCLGlCQUFpQixDQUMvQixXQUFXLEVBQUUsMkJBQTJCLEdBQUcsU0FBUyxHQUNuRCxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FvQmpDO0NBQ0YifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base_bot.d.ts","sourceRoot":"","sources":["../src/base_bot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,2BAA2B,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAGhH,OAAO,EAAE,MAAM,EAAE,SAAS,EAAY,MAAM,oBAAoB,CAAC;AAEjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,8BAAsB,OAAO;aAOT,IAAI,EAAE,SAAS;aACf,MAAM,EAAE,cAAc;aACtB,qBAAqB,EAAE,YAAY;IAC5C,MAAM,EAAE,SAAS;IAT1B,SAAS,CAAC,GAAG,uCAAuB;IAEpC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAK;IAC/B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAK;IAEhC,SAAS,aACS,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,cAAc,EACtB,qBAAqB,EAAE,YAAY,EAC5C,MAAM,EAAE,SAAS,EACtB;IAES,GAAG,IAAI,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,CAyB9C;IAED,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpE,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvE;IAED,UAAgB,iBAAiB,CAC/B,WAAW,EAAE,2BAA2B,GAAG,SAAS,GACnD,OAAO,CAAC,sBAAsB,CAAC,CAoBjC;CACF"}
@@ -0,0 +1,79 @@
1
+ import { createLogger } from '@aztec/aztec.js/log';
2
+ import { waitForTx } from '@aztec/aztec.js/node';
3
+ import { TxStatus } from '@aztec/aztec.js/tx';
4
+ import { Gas } from '@aztec/stdlib/gas';
5
+ export class BaseBot {
6
+ node;
7
+ wallet;
8
+ defaultAccountAddress;
9
+ config;
10
+ log;
11
+ attempts;
12
+ successes;
13
+ constructor(node, wallet, defaultAccountAddress, config){
14
+ this.node = node;
15
+ this.wallet = wallet;
16
+ this.defaultAccountAddress = defaultAccountAddress;
17
+ this.config = config;
18
+ this.log = createLogger('bot');
19
+ this.attempts = 0;
20
+ this.successes = 0;
21
+ }
22
+ async run() {
23
+ this.attempts++;
24
+ const { followChain, txMinedWaitSeconds } = this.config;
25
+ const logCtx = {
26
+ runId: Date.now() * 1000 + Math.floor(Math.random() * 1000),
27
+ followChain,
28
+ txMinedWaitSeconds
29
+ };
30
+ this.log.verbose(`Creating tx`, logCtx);
31
+ const txHash = await this.createAndSendTx(logCtx);
32
+ if (followChain === 'NONE') {
33
+ this.log.info(`Transaction ${txHash.toString()} sent, not waiting for it to be mined`);
34
+ return txHash;
35
+ }
36
+ const waitForStatus = TxStatus[followChain];
37
+ this.log.verbose(`Awaiting tx ${txHash.toString()} to be on the ${followChain} chain`, logCtx);
38
+ const receipt = await waitForTx(this.node, txHash, {
39
+ timeout: txMinedWaitSeconds,
40
+ waitForStatus
41
+ });
42
+ this.successes++;
43
+ this.log.info(`Tx #${this.attempts} ${receipt.txHash} successfully mined in block ${receipt.blockNumber} (stats: ${this.successes}/${this.attempts} success)`, logCtx);
44
+ await this.onTxMined(receipt, logCtx);
45
+ return receipt;
46
+ }
47
+ onTxMined(_receipt, _logCtx) {
48
+ // no-op
49
+ return Promise.resolve();
50
+ }
51
+ async getSendMethodOpts(interaction) {
52
+ const { l2GasLimit, daGasLimit, minFeePadding } = this.config;
53
+ this.wallet.setMinFeePadding(minFeePadding);
54
+ let gasSettings;
55
+ if (l2GasLimit !== undefined && l2GasLimit > 0 && daGasLimit !== undefined && daGasLimit > 0) {
56
+ gasSettings = {
57
+ gasLimits: Gas.from({
58
+ l2Gas: l2GasLimit,
59
+ daGas: daGasLimit
60
+ })
61
+ };
62
+ this.log.verbose(`Using gas limits ${l2GasLimit} L2 gas ${daGasLimit} DA gas`);
63
+ } else {
64
+ this.log.verbose(`Estimating gas for transaction`);
65
+ ({ estimatedGas: gasSettings } = await interaction.simulate({
66
+ fee: {
67
+ estimateGas: true
68
+ },
69
+ from: this.defaultAccountAddress
70
+ }));
71
+ }
72
+ return {
73
+ from: this.defaultAccountAddress,
74
+ fee: {
75
+ gasSettings
76
+ }
77
+ };
78
+ }
79
+ }
package/dest/bot.d.ts CHANGED
@@ -1,23 +1,19 @@
1
- import { type AztecAddress, type Wallet } from '@aztec/aztec.js';
2
- import type { EasyPrivateTokenContract } from '@aztec/noir-contracts.js/EasyPrivateToken';
1
+ import type { AztecAddress } from '@aztec/aztec.js/addresses';
2
+ import { TxHash } from '@aztec/aztec.js/tx';
3
+ import type { PrivateTokenContract } from '@aztec/noir-contracts.js/PrivateToken';
3
4
  import type { TokenContract } from '@aztec/noir-contracts.js/Token';
4
- import type { AztecNode, PXE } from '@aztec/stdlib/interfaces/client';
5
+ import type { AztecNode, AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
6
+ import type { EmbeddedWallet } from '@aztec/wallets/embedded';
7
+ import { BaseBot } from './base_bot.js';
5
8
  import type { BotConfig } from './config.js';
6
- export declare class Bot {
7
- readonly wallet: Wallet;
8
- readonly token: TokenContract | EasyPrivateTokenContract;
9
+ import type { BotStore } from './store/index.js';
10
+ export declare class Bot extends BaseBot {
11
+ readonly token: TokenContract | PrivateTokenContract;
9
12
  readonly recipient: AztecAddress;
10
- config: BotConfig;
11
- private log;
12
- private attempts;
13
- private successes;
14
- protected constructor(wallet: Wallet, token: TokenContract | EasyPrivateTokenContract, recipient: AztecAddress, config: BotConfig);
15
- static create(config: BotConfig, dependencies?: {
16
- pxe?: PXE;
17
- node?: AztecNode;
18
- }): Promise<Bot>;
13
+ protected constructor(node: AztecNode, wallet: EmbeddedWallet, defaultAccountAddress: AztecAddress, token: TokenContract | PrivateTokenContract, recipient: AztecAddress, config: BotConfig);
14
+ static create(config: BotConfig, wallet: EmbeddedWallet, aztecNode: AztecNode, aztecNodeAdmin: AztecNodeAdmin | undefined, store: BotStore): Promise<Bot>;
19
15
  updateConfig(config: Partial<BotConfig>): void;
20
- run(): Promise<void>;
16
+ protected createAndSendTx(logCtx: object): Promise<TxHash>;
21
17
  getBalances(): Promise<{
22
18
  sender: {
23
19
  privateBalance: bigint;
@@ -28,6 +24,5 @@ export declare class Bot {
28
24
  publicBalance: bigint;
29
25
  };
30
26
  }>;
31
- private getSendMethodOpts;
32
27
  }
33
- //# sourceMappingURL=bot.d.ts.map
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm90LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYm90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTlELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QyxPQUFPLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2xGLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BFLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRixPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU3QyxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUtqRCxxQkFBYSxHQUFJLFNBQVEsT0FBTzthQUtaLEtBQUssRUFBRSxhQUFhLEdBQUcsb0JBQW9CO2FBQzNDLFNBQVMsRUFBRSxZQUFZO0lBTHpDLFNBQVMsYUFDUCxJQUFJLEVBQUUsU0FBUyxFQUNmLE1BQU0sRUFBRSxjQUFjLEVBQ3RCLHFCQUFxQixFQUFFLFlBQVksRUFDbkIsS0FBSyxFQUFFLGFBQWEsR0FBRyxvQkFBb0IsRUFDM0MsU0FBUyxFQUFFLFlBQVksRUFDdkMsTUFBTSxFQUFFLFNBQVMsRUFHbEI7SUFFRCxPQUFhLE1BQU0sQ0FDakIsTUFBTSxFQUFFLFNBQVMsRUFDakIsTUFBTSxFQUFFLGNBQWMsRUFDdEIsU0FBUyxFQUFFLFNBQVMsRUFDcEIsY0FBYyxFQUFFLGNBQWMsR0FBRyxTQUFTLEVBQzFDLEtBQUssRUFBRSxRQUFRLEdBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQVNkO0lBRU0sWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLFFBRzdDO0lBRUQsVUFBZ0IsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQTZCL0Q7SUFFWSxXQUFXOzs7Ozs7Ozs7T0FrQnZCO0NBQ0YifQ==
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,EAIjB,KAAK,MAAM,EAEZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAC1F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAGpE,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,qBAAa,GAAG;aAOI,MAAM,EAAE,MAAM;aACd,KAAK,EAAE,aAAa,GAAG,wBAAwB;aAC/C,SAAS,EAAE,YAAY;IAChC,MAAM,EAAE,SAAS;IAT1B,OAAO,CAAC,GAAG,CAAuB;IAElC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,SAAS,CAAa;IAE9B,SAAS,aACS,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,GAAG,wBAAwB,EAC/C,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;IAoEH,WAAW;;;;;;;;;;IAoBxB,OAAO,CAAC,iBAAiB;CAkB1B"}
1
+ {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAKjD,qBAAa,GAAI,SAAQ,OAAO;aAKZ,KAAK,EAAE,aAAa,GAAG,oBAAoB;aAC3C,SAAS,EAAE,YAAY;IALzC,SAAS,aACP,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,cAAc,EACtB,qBAAqB,EAAE,YAAY,EACnB,KAAK,EAAE,aAAa,GAAG,oBAAoB,EAC3C,SAAS,EAAE,YAAY,EACvC,MAAM,EAAE,SAAS,EAGlB;IAED,OAAa,MAAM,CACjB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,KAAK,EAAE,QAAQ,GACd,OAAO,CAAC,GAAG,CAAC,CASd;IAEM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,QAG7C;IAED,UAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6B/D;IAEY,WAAW;;;;;;;;;OAkBvB;CACF"}
package/dest/bot.js CHANGED
@@ -1,29 +1,18 @@
1
- import { BatchCall, FeeJuicePaymentMethod, createLogger } from '@aztec/aztec.js';
2
- import { timesParallel } from '@aztec/foundation/collection';
3
- import { Gas } from '@aztec/stdlib/gas';
1
+ import { BatchCall, NO_WAIT } from '@aztec/aztec.js/contracts';
2
+ import { times } from '@aztec/foundation/collection';
3
+ import { BaseBot } from './base_bot.js';
4
4
  import { BotFactory } from './factory.js';
5
5
  import { getBalances, getPrivateBalance, isStandardTokenContract } from './utils.js';
6
6
  const TRANSFER_AMOUNT = 1;
7
- export class Bot {
8
- wallet;
7
+ export class Bot extends BaseBot {
9
8
  token;
10
9
  recipient;
11
- config;
12
- log;
13
- attempts;
14
- successes;
15
- constructor(wallet, token, recipient, config){
16
- this.wallet = wallet;
17
- this.token = token;
18
- this.recipient = recipient;
19
- this.config = config;
20
- this.log = createLogger('bot');
21
- this.attempts = 0;
22
- this.successes = 0;
10
+ constructor(node, wallet, defaultAccountAddress, token, recipient, config){
11
+ super(node, wallet, defaultAccountAddress, config), this.token = token, this.recipient = recipient;
23
12
  }
24
- static async create(config, dependencies = {}) {
25
- const { wallet, token, recipient } = await new BotFactory(config, dependencies).setup();
26
- return new Bot(wallet, token, recipient, config);
13
+ static async create(config, wallet, aztecNode, aztecNodeAdmin, store) {
14
+ const { defaultAccountAddress, token, recipient } = await new BotFactory(config, wallet, store, aztecNode, aztecNodeAdmin).setup();
15
+ return new Bot(aztecNode, wallet, defaultAccountAddress, token, recipient, config);
27
16
  }
28
17
  updateConfig(config) {
29
18
  this.log.info(`Updating bot config ${Object.keys(config).join(', ')}`);
@@ -32,54 +21,37 @@ export class Bot {
32
21
  ...config
33
22
  };
34
23
  }
35
- async run() {
36
- this.attempts++;
37
- const logCtx = {
38
- runId: Date.now() * 1000 + Math.floor(Math.random() * 1000)
39
- };
40
- const { privateTransfersPerTx, publicTransfersPerTx, feePaymentMethod, followChain, txMinedWaitSeconds } = this.config;
24
+ async createAndSendTx(logCtx) {
25
+ const { privateTransfersPerTx, publicTransfersPerTx, feePaymentMethod } = this.config;
41
26
  const { token, recipient, wallet } = this;
42
- const sender = wallet.getAddress();
43
27
  this.log.verbose(`Preparing tx with ${feePaymentMethod} fee with ${privateTransfersPerTx} private and ${publicTransfersPerTx} public transfers`, logCtx);
44
- const calls = [];
45
- if (isStandardTokenContract(token)) {
46
- calls.push(...await timesParallel(privateTransfersPerTx, ()=>token.methods.transfer(recipient, TRANSFER_AMOUNT).request()));
47
- calls.push(...await timesParallel(publicTransfersPerTx, ()=>token.methods.transfer_in_public(sender, recipient, TRANSFER_AMOUNT, 0).request()));
48
- } else {
49
- calls.push(...await timesParallel(privateTransfersPerTx, ()=>token.methods.transfer(TRANSFER_AMOUNT, sender, recipient).request()));
50
- }
51
- const opts = this.getSendMethodOpts();
28
+ const calls = isStandardTokenContract(token) ? [
29
+ times(privateTransfersPerTx, ()=>token.methods.transfer(recipient, TRANSFER_AMOUNT)),
30
+ times(publicTransfersPerTx, ()=>token.methods.transfer_in_public(this.defaultAccountAddress, recipient, TRANSFER_AMOUNT, 0))
31
+ ].flat() : times(privateTransfersPerTx, ()=>token.methods.transfer(TRANSFER_AMOUNT, this.defaultAccountAddress, recipient));
52
32
  const batch = new BatchCall(wallet, calls);
33
+ const opts = await this.getSendMethodOpts(batch);
53
34
  this.log.verbose(`Simulating transaction with ${calls.length}`, logCtx);
54
- await batch.simulate();
55
- this.log.verbose(`Proving transaction`, logCtx);
56
- const provenTx = await batch.prove(opts);
57
- this.log.verbose(`Sending tx`, logCtx);
58
- const tx = provenTx.send();
59
- const txHash = await tx.getTxHash();
60
- if (followChain === 'NONE') {
61
- this.log.info(`Transaction ${txHash} sent, not waiting for it to be mined`);
62
- return;
63
- }
64
- this.log.verbose(`Awaiting tx ${txHash} to be on the ${followChain} chain (timeout ${txMinedWaitSeconds}s)`, logCtx);
65
- const receipt = await tx.wait({
66
- timeout: txMinedWaitSeconds,
67
- provenTimeout: txMinedWaitSeconds,
68
- proven: followChain === 'PROVEN'
35
+ await batch.simulate({
36
+ from: this.defaultAccountAddress
37
+ });
38
+ this.log.verbose(`Sending transaction`, logCtx);
39
+ const { txHash } = await batch.send({
40
+ ...opts,
41
+ wait: NO_WAIT
69
42
  });
70
- this.log.info(`Tx #${this.attempts} ${receipt.txHash} successfully mined in block ${receipt.blockNumber} (stats: ${this.successes}/${this.attempts} success)`, logCtx);
71
- this.successes++;
43
+ return txHash;
72
44
  }
73
45
  async getBalances() {
74
46
  if (isStandardTokenContract(this.token)) {
75
47
  return {
76
- sender: await getBalances(this.token, this.wallet.getAddress()),
48
+ sender: await getBalances(this.token, this.defaultAccountAddress),
77
49
  recipient: await getBalances(this.token, this.recipient)
78
50
  };
79
51
  } else {
80
52
  return {
81
53
  sender: {
82
- privateBalance: await getPrivateBalance(this.token, this.wallet.getAddress()),
54
+ privateBalance: await getPrivateBalance(this.token, this.defaultAccountAddress),
83
55
  publicBalance: 0n
84
56
  },
85
57
  recipient: {
@@ -89,34 +61,4 @@ export class Bot {
89
61
  };
90
62
  }
91
63
  }
92
- getSendMethodOpts() {
93
- const sender = this.wallet.getAddress();
94
- const { l2GasLimit, daGasLimit, skipPublicSimulation } = this.config;
95
- const paymentMethod = new FeeJuicePaymentMethod(sender);
96
- let gasSettings, estimateGas;
97
- if (l2GasLimit !== undefined && l2GasLimit > 0 && daGasLimit !== undefined && daGasLimit > 0) {
98
- gasSettings = {
99
- gasLimits: Gas.from({
100
- l2Gas: l2GasLimit,
101
- daGas: daGasLimit
102
- })
103
- };
104
- estimateGas = false;
105
- this.log.verbose(`Using gas limits ${l2GasLimit} L2 gas ${daGasLimit} DA gas`);
106
- } else {
107
- estimateGas = true;
108
- this.log.verbose(`Estimating gas for transaction`);
109
- }
110
- const baseFeePadding = 2; // Send 3x the current base fee
111
- this.log.verbose(skipPublicSimulation ? `Skipping public simulation` : `Simulating public transfers`);
112
- return {
113
- fee: {
114
- estimateGas,
115
- paymentMethod,
116
- gasSettings,
117
- baseFeePadding
118
- },
119
- skipPublicSimulation
120
- };
121
- }
122
64
  }