@aztec/bot 0.47.1 → 0.49.2
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.map +1 -1
- package/dest/bot.js +22 -8
- package/dest/config.d.ts +8 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +65 -32
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +11 -5
- package/dest/index.d.ts +1 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -2
- package/dest/runner.d.ts +1 -2
- package/dest/runner.d.ts.map +1 -1
- package/dest/runner.js +41 -21
- package/package.json +10 -10
- package/src/bot.ts +28 -6
- package/src/config.ts +76 -42
- package/src/factory.ts +10 -4
- package/src/index.ts +1 -1
- package/src/runner.ts +40 -20
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,EAAqB,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAGnE,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;aACvB,MAAM,EAAE,SAAS;IANnC,OAAO,CAAC,GAAG,CAAkC;IAE7C,SAAS,aACS,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,SAAS;WAGtB,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,GAAE;QAAE,GAAG,CAAC,EAAE,GAAG,CAAA;KAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IAKzE,GAAG;
|
|
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,EAAqB,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAGnE,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;aACvB,MAAM,EAAE,SAAS;IANnC,OAAO,CAAC,GAAG,CAAkC;IAE7C,SAAS,aACS,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,SAAS;WAGtB,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,GAAE;QAAE,GAAG,CAAC,EAAE,GAAG,CAAA;KAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IAKzE,GAAG;IAgDH,WAAW;;;;;;;;;;CAMzB"}
|
package/dest/bot.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BatchCall,
|
|
1
|
+
import { BatchCall, FeeJuicePaymentMethod, NoFeePaymentMethod, createDebugLogger, } from '@aztec/aztec.js';
|
|
2
2
|
import { GasSettings } from '@aztec/circuits.js';
|
|
3
3
|
import { times } from '@aztec/foundation/collection';
|
|
4
4
|
import { BotFactory } from './factory.js';
|
|
@@ -17,21 +17,35 @@ export class Bot {
|
|
|
17
17
|
return new Bot(wallet, token, recipient, config);
|
|
18
18
|
}
|
|
19
19
|
async run() {
|
|
20
|
+
const logCtx = { runId: Date.now() * 1000 + Math.floor(Math.random() * 1000) };
|
|
20
21
|
const { privateTransfersPerTx, publicTransfersPerTx, feePaymentMethod } = this.config;
|
|
21
22
|
const { token, recipient, wallet } = this;
|
|
22
23
|
const sender = wallet.getAddress();
|
|
23
|
-
this.log.verbose(`Sending tx with ${feePaymentMethod} fee with ${privateTransfersPerTx} private and ${publicTransfersPerTx} public transfers
|
|
24
|
+
this.log.verbose(`Sending tx with ${feePaymentMethod} fee with ${privateTransfersPerTx} private and ${publicTransfersPerTx} public transfers`, logCtx);
|
|
24
25
|
const calls = [
|
|
25
26
|
...times(privateTransfersPerTx, () => token.methods.transfer(recipient, TRANSFER_AMOUNT).request()),
|
|
26
27
|
...times(publicTransfersPerTx, () => token.methods.transfer_public(sender, recipient, TRANSFER_AMOUNT, 0).request()),
|
|
27
28
|
];
|
|
28
|
-
const paymentMethod = feePaymentMethod === '
|
|
29
|
+
const paymentMethod = feePaymentMethod === 'fee_juice' ? new FeeJuicePaymentMethod(sender) : new NoFeePaymentMethod();
|
|
29
30
|
const gasSettings = GasSettings.default();
|
|
30
31
|
const opts = { estimateGas: true, fee: { paymentMethod, gasSettings } };
|
|
31
|
-
const
|
|
32
|
-
this.log.verbose(`
|
|
33
|
-
|
|
34
|
-
this.log.
|
|
32
|
+
const batch = new BatchCall(wallet, calls);
|
|
33
|
+
this.log.verbose(`Creating batch execution request with ${calls.length} calls`, logCtx);
|
|
34
|
+
await batch.create(opts);
|
|
35
|
+
this.log.verbose(`Simulating transaction`, logCtx);
|
|
36
|
+
await batch.simulate();
|
|
37
|
+
this.log.verbose(`Proving transaction`, logCtx);
|
|
38
|
+
await batch.prove(opts);
|
|
39
|
+
this.log.verbose(`Sending tx`, logCtx);
|
|
40
|
+
const tx = batch.send(opts);
|
|
41
|
+
const txHash = await tx.getTxHash();
|
|
42
|
+
if (this.config.noWaitForTransfers) {
|
|
43
|
+
this.log.info(`Transaction ${txHash} sent, not waiting for it to be mined`);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
this.log.verbose(`Awaiting tx ${txHash} to be mined (timeout ${this.config.txMinedWaitSeconds}s)`, logCtx);
|
|
47
|
+
const receipt = await tx.wait({ timeout: this.config.txMinedWaitSeconds });
|
|
48
|
+
this.log.info(`Tx ${receipt.txHash} mined in block ${receipt.blockNumber}`, logCtx);
|
|
35
49
|
}
|
|
36
50
|
async getBalances() {
|
|
37
51
|
return {
|
|
@@ -40,4 +54,4 @@ export class Bot {
|
|
|
40
54
|
};
|
|
41
55
|
}
|
|
42
56
|
}
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2JvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULHFCQUFxQixFQUNyQixrQkFBa0IsRUFHbEIsaUJBQWlCLEdBQ2xCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUlyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFekMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBRTFCLE1BQU0sT0FBTyxHQUFHO0lBR2QsWUFDa0IsTUFBYyxFQUNkLEtBQW9CLEVBQ3BCLFNBQXVCLEVBQ3ZCLE1BQWlCO1FBSGpCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFlO1FBQ3BCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDdkIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQU4zQixRQUFHLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFPMUMsQ0FBQztJQUVKLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQWlCLEVBQUUsZUFBOEIsRUFBRTtRQUNyRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4RixPQUFPLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTSxLQUFLLENBQUMsR0FBRztRQUNkLE1BQU0sTUFBTSxHQUFHLEVBQUUs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
|
package/dest/config.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Fr } from '@aztec/circuits.js';
|
|
2
|
+
import { type ConfigMappingsType } from '@aztec/foundation/config';
|
|
2
3
|
export type BotConfig = {
|
|
3
4
|
/** URL to the PXE for sending txs, or undefined if an in-proc PXE is used. */
|
|
4
5
|
pxeUrl: string | undefined;
|
|
@@ -15,10 +16,15 @@ export type BotConfig = {
|
|
|
15
16
|
/** How many public token transfers are executed per tx. */
|
|
16
17
|
publicTransfersPerTx: number;
|
|
17
18
|
/** How to handle fee payments. */
|
|
18
|
-
feePaymentMethod: '
|
|
19
|
+
feePaymentMethod: 'fee_juice' | 'none';
|
|
19
20
|
/** True to not automatically setup or start the bot on initialization. */
|
|
20
21
|
noStart: boolean;
|
|
22
|
+
/** How long to wait for a tx to be mined before reporting an error. */
|
|
23
|
+
txMinedWaitSeconds: number;
|
|
24
|
+
/** Don't wait for transfer transactions. */
|
|
25
|
+
noWaitForTransfers: boolean;
|
|
21
26
|
};
|
|
27
|
+
export declare const botConfigMappings: ConfigMappingsType<BotConfig>;
|
|
22
28
|
export declare function getBotConfigFromEnv(): BotConfig;
|
|
23
|
-
export declare function getBotDefaultConfig(
|
|
29
|
+
export declare function getBotDefaultConfig(): BotConfig;
|
|
24
30
|
//# sourceMappingURL=config.d.ts.map
|
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;
|
|
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,EAKxB,MAAM,0BAA0B,CAAC;AAElC,MAAM,MAAM,SAAS,GAAG;IACtB,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,4CAA4C;IAC5C,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,kBAAkB,CAAC,SAAS,CA2D3D,CAAC;AAEF,wBAAgB,mBAAmB,IAAI,SAAS,CAE/C;AAED,wBAAgB,mBAAmB,IAAI,SAAS,CAE/C"}
|
package/dest/config.js
CHANGED
|
@@ -1,36 +1,69 @@
|
|
|
1
1
|
import { Fr } from '@aztec/circuits.js';
|
|
2
|
-
import {
|
|
2
|
+
import { booleanConfigHelper, getConfigFromMappings, getDefaultConfig, numberConfigHelper, } from '@aztec/foundation/config';
|
|
3
|
+
export const botConfigMappings = {
|
|
4
|
+
pxeUrl: {
|
|
5
|
+
env: 'BOT_PXE_URL',
|
|
6
|
+
description: 'URL to the PXE for sending txs, or undefined if an in-proc PXE is used.',
|
|
7
|
+
},
|
|
8
|
+
senderPrivateKey: {
|
|
9
|
+
env: 'BOT_PRIVATE_KEY',
|
|
10
|
+
description: 'Signing private key for the sender account.',
|
|
11
|
+
parseEnv: (val) => Fr.fromString(val),
|
|
12
|
+
defaultValue: Fr.random(),
|
|
13
|
+
},
|
|
14
|
+
recipientEncryptionSecret: {
|
|
15
|
+
env: 'BOT_RECIPIENT_ENCRYPTION_SECRET',
|
|
16
|
+
description: 'Encryption secret for a recipient account.',
|
|
17
|
+
parseEnv: (val) => Fr.fromString(val),
|
|
18
|
+
defaultValue: Fr.fromString('0xcafecafe'),
|
|
19
|
+
},
|
|
20
|
+
tokenSalt: {
|
|
21
|
+
env: 'BOT_TOKEN_SALT',
|
|
22
|
+
description: 'Salt for the token contract deployment.',
|
|
23
|
+
parseEnv: (val) => Fr.fromString(val),
|
|
24
|
+
defaultValue: Fr.fromString('1'),
|
|
25
|
+
},
|
|
26
|
+
txIntervalSeconds: {
|
|
27
|
+
env: 'BOT_TX_INTERVAL_SECONDS',
|
|
28
|
+
description: 'Every how many seconds should a new tx be sent.',
|
|
29
|
+
...numberConfigHelper(60),
|
|
30
|
+
},
|
|
31
|
+
privateTransfersPerTx: {
|
|
32
|
+
env: 'BOT_PRIVATE_TRANSFERS_PER_TX',
|
|
33
|
+
description: 'How many private token transfers are executed per tx.',
|
|
34
|
+
...numberConfigHelper(1),
|
|
35
|
+
},
|
|
36
|
+
publicTransfersPerTx: {
|
|
37
|
+
env: 'BOT_PUBLIC_TRANSFERS_PER_TX',
|
|
38
|
+
description: 'How many public token transfers are executed per tx.',
|
|
39
|
+
...numberConfigHelper(1),
|
|
40
|
+
},
|
|
41
|
+
feePaymentMethod: {
|
|
42
|
+
env: 'BOT_FEE_PAYMENT_METHOD',
|
|
43
|
+
description: 'How to handle fee payments. (Options: fee_juice, none)',
|
|
44
|
+
parseEnv: val => val || undefined,
|
|
45
|
+
defaultValue: 'none',
|
|
46
|
+
},
|
|
47
|
+
noStart: {
|
|
48
|
+
env: 'BOT_NO_START',
|
|
49
|
+
description: 'True to not automatically setup or start the bot on initialization.',
|
|
50
|
+
...booleanConfigHelper(),
|
|
51
|
+
},
|
|
52
|
+
txMinedWaitSeconds: {
|
|
53
|
+
env: 'BOT_TX_MINED_WAIT_SECONDS',
|
|
54
|
+
description: 'How long to wait for a tx to be mined before reporting an error.',
|
|
55
|
+
...numberConfigHelper(180),
|
|
56
|
+
},
|
|
57
|
+
noWaitForTransfers: {
|
|
58
|
+
env: 'BOT_NO_WAIT_FOR_TRANSFERS',
|
|
59
|
+
description: "Don't wait for transfer transactions.",
|
|
60
|
+
...booleanConfigHelper(),
|
|
61
|
+
},
|
|
62
|
+
};
|
|
3
63
|
export function getBotConfigFromEnv() {
|
|
4
|
-
|
|
5
|
-
if (BOT_FEE_PAYMENT_METHOD && !['native', 'none'].includes(BOT_FEE_PAYMENT_METHOD)) {
|
|
6
|
-
throw new Error(`Invalid bot fee payment method: ${BOT_FEE_PAYMENT_METHOD}`);
|
|
7
|
-
}
|
|
8
|
-
return getBotDefaultConfig({
|
|
9
|
-
pxeUrl: process.env.BOT_PXE_URL,
|
|
10
|
-
senderPrivateKey: BOT_PRIVATE_KEY ? Fr.fromString(BOT_PRIVATE_KEY) : undefined,
|
|
11
|
-
recipientEncryptionSecret: BOT_RECIPIENT_ENCRYPTION_SECRET
|
|
12
|
-
? Fr.fromString(BOT_RECIPIENT_ENCRYPTION_SECRET)
|
|
13
|
-
: undefined,
|
|
14
|
-
tokenSalt: BOT_TOKEN_SALT ? Fr.fromString(BOT_TOKEN_SALT) : undefined,
|
|
15
|
-
txIntervalSeconds: BOT_TX_INTERVAL_SECONDS ? parseInt(BOT_TX_INTERVAL_SECONDS) : undefined,
|
|
16
|
-
privateTransfersPerTx: BOT_PRIVATE_TRANSFERS_PER_TX ? parseInt(BOT_PRIVATE_TRANSFERS_PER_TX) : undefined,
|
|
17
|
-
publicTransfersPerTx: BOT_PUBLIC_TRANSFERS_PER_TX ? parseInt(BOT_PUBLIC_TRANSFERS_PER_TX) : undefined,
|
|
18
|
-
feePaymentMethod: BOT_FEE_PAYMENT_METHOD ? BOT_FEE_PAYMENT_METHOD : undefined,
|
|
19
|
-
noStart: BOT_NO_START ? ['1', 'true'].includes(BOT_NO_START) : undefined,
|
|
20
|
-
});
|
|
64
|
+
return getConfigFromMappings(botConfigMappings);
|
|
21
65
|
}
|
|
22
|
-
export function getBotDefaultConfig(
|
|
23
|
-
return
|
|
24
|
-
pxeUrl: undefined,
|
|
25
|
-
senderPrivateKey: Fr.random(),
|
|
26
|
-
recipientEncryptionSecret: Fr.fromString('0xcafecafe'),
|
|
27
|
-
tokenSalt: Fr.fromString('1'),
|
|
28
|
-
txIntervalSeconds: 60,
|
|
29
|
-
privateTransfersPerTx: 1,
|
|
30
|
-
publicTransfersPerTx: 1,
|
|
31
|
-
feePaymentMethod: 'none',
|
|
32
|
-
noStart: false,
|
|
33
|
-
...compact(overrides),
|
|
34
|
-
};
|
|
66
|
+
export function getBotDefaultConfig() {
|
|
67
|
+
return getDefaultConfig(botConfigMappings);
|
|
35
68
|
}
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEMsT0FBTyxFQUVMLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixHQUNuQixNQUFNLDBCQUEwQixDQUFDO0FBMkJsQyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBa0M7SUFDOUQsTUFBTSxFQUFFO1FBQ04sR0FBRyxFQUFFLGFBQWE7UUFDbEIsV0FBVyxFQUFFLHlFQUF5RTtLQUN2RjtJQUNELGdCQUFnQixFQUFFO1FBQ2hCLEdBQUcsRUFBRSxpQkFBaUI7UUFDdEIsV0FBVyxFQUFFLDZDQUE2QztRQUMxRCxRQUFRLEVBQUUsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQzdDLFlBQVksRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFO0tBQzFCO0lBQ0QseUJBQXlCLEVBQUU7UUFDekIsR0FBRyxFQUFFLGlDQUFpQztRQUN0QyxXQUFXLEVBQUUsNENBQTRDO1FBQ3pELFFBQVEsRUFBRSxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFDN0MsWUFBWSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO0tBQzFDO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsR0FBRyxFQUFFLGdCQUFnQjtRQUNyQixXQUFXLEVBQUUseUNBQXlDO1FBQ3RELFFBQVEsRUFBRSxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFDN0MsWUFBWSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO0tBQ2pDO0lBQ0QsaUJBQWlCLEVBQUU7UUFDakIsR0FBRyxFQUFFLHlCQUF5QjtRQUM5QixXQUFXLEVBQUUsaURBQWlEO1FBQzlELEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDO0tBQzFCO0lBQ0QscUJBQXFCLEVBQUU7UUFDckIsR0FBRyxFQUFFLDhCQUE4QjtRQUNuQyxXQUFXLEVBQUUsdURBQXVEO1FBQ3BFLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0tBQ3pCO0lBQ0Qsb0JBQW9CLEVBQUU7UUFDcEIsR0FBRyxFQUFFLDZCQUE2QjtRQUNsQyxXQUFXLEVBQUUsc0RBQXNEO1FBQ25FLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0tBQ3pCO0lBQ0QsZ0JBQWdCLEVBQUU7UUFDaEIsR0FBRyxFQUFFLHdCQUF3QjtRQUM3QixXQUFXLEVBQUUsd0RBQXdEO1FBQ3JFLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFFLEdBQTRCLElBQUksU0FBUztRQUMzRCxZQUFZLEVBQUUsTUFBTTtLQUNyQjtJQUNELE9BQU8sRUFBRTtRQUNQLEdBQUcsRUFBRSxjQUFjO1FBQ25CLFdBQVcsRUFBRSxxRUFBcUU7UUFDbEYsR0FBRyxtQkFBbUIsRUFBRTtLQUN6QjtJQUNELGtCQUFrQixFQUFFO1FBQ2xCLEdBQUcsRUFBRSwyQkFBMkI7UUFDaEMsV0FBVyxFQUFFLGtFQUFrRTtRQUMvRSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQztLQUMzQjtJQUNELGtCQUFrQixFQUFFO1FBQ2xCLEdBQUcsRUFBRSwyQkFBMkI7UUFDaEMsV0FBVyxFQUFFLHVDQUF1QztRQUNwRCxHQUFHLG1CQUFtQixFQUFFO0tBQ3pCO0NBQ0YsQ0FBQztBQUVGLE1BQU0sVUFBVSxtQkFBbUI7SUFDakMsT0FBTyxxQkFBcUIsQ0FBWSxpQkFBaUIsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CO0lBQ2pDLE9BQU8sZ0JBQWdCLENBQVksaUJBQWlCLENBQUMsQ0FBQztBQUN4RCxDQUFDIn0=
|
package/dest/factory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,qBAAa,UAAU;IAIT,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,GAAG,CAAkC;gBAEhB,MAAM,EAAE,SAAS,EAAE,YAAY,GAAE;QAAE,GAAG,CAAC,EAAE,GAAG,CAAA;KAAO;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,qBAAa,UAAU;IAIT,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,GAAG,CAAkC;gBAEhB,MAAM,EAAE,SAAS,EAAE,YAAY,GAAE;QAAE,GAAG,CAAC,EAAE,GAAG,CAAA;KAAO;IAchF;;;OAGG;IACU,KAAK;;;;;;IAQlB;;;OAGG;YACW,YAAY;IAc1B;;OAEG;YACW,iBAAiB;IAK/B;;;;OAIG;YACW,UAAU;IAaxB;;;OAGG;YACW,UAAU;CAkBzB"}
|
package/dest/factory.js
CHANGED
|
@@ -12,7 +12,13 @@ export class BotFactory {
|
|
|
12
12
|
if (!dependencies.pxe && !config.pxeUrl) {
|
|
13
13
|
throw new Error(`Either a PXE client or a PXE URL must be provided`);
|
|
14
14
|
}
|
|
15
|
-
|
|
15
|
+
if (dependencies.pxe) {
|
|
16
|
+
this.log.info(`Using local PXE`);
|
|
17
|
+
this.pxe = dependencies.pxe;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
this.log.info(`Using remote PXE at ${config.pxeUrl}`);
|
|
21
|
+
this.pxe = createPXEClient(config.pxeUrl);
|
|
16
22
|
}
|
|
17
23
|
/**
|
|
18
24
|
* Initializes a new bot by setting up the sender account, registering the recipient,
|
|
@@ -40,7 +46,7 @@ export class BotFactory {
|
|
|
40
46
|
}
|
|
41
47
|
else {
|
|
42
48
|
this.log.info(`Initializing account at ${account.getAddress().toString()}`);
|
|
43
|
-
return account.waitSetup();
|
|
49
|
+
return account.waitSetup({ timeout: this.config.txMinedWaitSeconds });
|
|
44
50
|
}
|
|
45
51
|
}
|
|
46
52
|
/**
|
|
@@ -65,7 +71,7 @@ export class BotFactory {
|
|
|
65
71
|
}
|
|
66
72
|
else {
|
|
67
73
|
this.log.info(`Deploying token contract at ${address.toString()}`);
|
|
68
|
-
return deploy.send(deployOpts).deployed();
|
|
74
|
+
return deploy.send(deployOpts).deployed({ timeout: this.config.txMinedWaitSeconds });
|
|
69
75
|
}
|
|
70
76
|
}
|
|
71
77
|
/**
|
|
@@ -88,7 +94,7 @@ export class BotFactory {
|
|
|
88
94
|
this.log.info(`Skipping minting as ${sender.toString()} has enough tokens`);
|
|
89
95
|
return;
|
|
90
96
|
}
|
|
91
|
-
await new BatchCall(token.wallet, calls).send().wait();
|
|
97
|
+
await new BatchCall(token.wallet, calls).send().wait({ timeout: this.config.txMinedWaitSeconds });
|
|
92
98
|
}
|
|
93
99
|
}
|
|
94
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sRUFBc0IsU0FBUyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXBHLE9BQU8sRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHL0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV6QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDMUIsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBRXhCLE1BQU0sT0FBTyxVQUFVO0lBSXJCLFlBQTZCLE1BQWlCLEVBQUUsZUFBOEIsRUFBRTtRQUFuRCxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBRnRDLFFBQUcsR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUczQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUVELElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDO1lBQzVCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLE1BQU0sQ0FBQyxNQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FB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
|
package/dest/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { Bot } from './bot.js';
|
|
2
2
|
export { BotRunner } from './runner.js';
|
|
3
|
-
export { BotConfig, getBotConfigFromEnv, getBotDefaultConfig } from './config.js';
|
|
3
|
+
export { BotConfig, getBotConfigFromEnv, getBotDefaultConfig, botConfigMappings } from './config.js';
|
|
4
4
|
export { createBotRunnerRpcServer } from './rpc.js';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dest/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC"}
|
package/dest/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { Bot } from './bot.js';
|
|
2
2
|
export { BotRunner } from './runner.js';
|
|
3
|
-
export { getBotConfigFromEnv, getBotDefaultConfig } from './config.js';
|
|
3
|
+
export { getBotConfigFromEnv, getBotDefaultConfig, botConfigMappings } from './config.js';
|
|
4
4
|
export { createBotRunnerRpcServer } from './rpc.js';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBYSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxVQUFVLENBQUMifQ==
|
package/dest/runner.d.ts
CHANGED
package/dest/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAqB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAqB,MAAM,iBAAiB,CAAC;AAI9D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,qBAAa,SAAS;;IAMD,OAAO,CAAC,MAAM;IALjC,OAAO,CAAC,GAAG,CAAkC;IAC7C,OAAO,CAAC,GAAG,CAAC,CAAe;IAC3B,OAAO,CAAC,GAAG,CAAC,CAAM;IAClB,OAAO,CAAC,cAAc,CAAiB;gBAEZ,MAAM,EAAE,SAAS,EAAE,YAAY,GAAE;QAAE,GAAG,CAAC,EAAE,GAAG,CAAA;KAAO;IAK9E,6EAA6E;IAChE,KAAK;IAQlB;;;OAGG;IACU,KAAK;IAQlB;;OAEG;IACU,IAAI;IAQjB,0CAA0C;IACnC,SAAS;IAIhB;;;OAGG;IACU,MAAM,CAAC,MAAM,EAAE,SAAS;IAerC;;;OAGG;IACU,GAAG;IAsBhB,qDAAqD;IAC9C,SAAS;CAqBjB"}
|
package/dest/runner.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
var _BotRunner_instances, _BotRunner_createBot;
|
|
1
|
+
var _BotRunner_instances, _BotRunner_createBot, _BotRunner_safeRun;
|
|
2
2
|
import { __classPrivateFieldGet } from "tslib";
|
|
3
3
|
import { createDebugLogger } from '@aztec/aztec.js';
|
|
4
|
+
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
4
5
|
import { Bot } from './bot.js';
|
|
5
6
|
export class BotRunner {
|
|
6
7
|
constructor(config, dependencies = {}) {
|
|
7
8
|
_BotRunner_instances.add(this);
|
|
8
9
|
this.config = config;
|
|
9
10
|
this.log = createDebugLogger('aztec:bot');
|
|
10
|
-
this.running = new Set();
|
|
11
11
|
this.pxe = dependencies.pxe;
|
|
12
|
+
this.runningPromise = new RunningPromise(() => __classPrivateFieldGet(this, _BotRunner_instances, "m", _BotRunner_safeRun).call(this), config.txIntervalSeconds * 1000);
|
|
12
13
|
}
|
|
13
14
|
/** Initializes the bot if needed. Blocks until the bot setup is finished. */
|
|
14
15
|
async setup() {
|
|
@@ -24,29 +25,24 @@ export class BotRunner {
|
|
|
24
25
|
*/
|
|
25
26
|
async start() {
|
|
26
27
|
await this.setup();
|
|
27
|
-
if (!this.
|
|
28
|
+
if (!this.runningPromise.isRunning()) {
|
|
28
29
|
this.log.info(`Starting bot with interval of ${this.config.txIntervalSeconds}s`);
|
|
29
|
-
this.
|
|
30
|
+
this.runningPromise.start();
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
33
|
/**
|
|
33
34
|
* Stops sending txs. Returns once all ongoing txs are finished.
|
|
34
35
|
*/
|
|
35
36
|
async stop() {
|
|
36
|
-
if (this.
|
|
37
|
+
if (this.runningPromise.isRunning()) {
|
|
37
38
|
this.log.verbose(`Stopping bot`);
|
|
38
|
-
|
|
39
|
-
this.interval = undefined;
|
|
40
|
-
}
|
|
41
|
-
if (this.running.size > 0) {
|
|
42
|
-
this.log.verbose(`Waiting for ${this.running.size} running txs to finish`);
|
|
43
|
-
await Promise.all(this.running);
|
|
39
|
+
await this.runningPromise.stop();
|
|
44
40
|
}
|
|
45
41
|
this.log.info(`Stopped bot`);
|
|
46
42
|
}
|
|
47
43
|
/** Returns whether the bot is running. */
|
|
48
44
|
isRunning() {
|
|
49
|
-
return
|
|
45
|
+
return this.runningPromise.isRunning();
|
|
50
46
|
}
|
|
51
47
|
/**
|
|
52
48
|
* Updates the bot config and recreates the bot. Will stop and restart the bot automatically if it was
|
|
@@ -59,6 +55,7 @@ export class BotRunner {
|
|
|
59
55
|
await this.stop();
|
|
60
56
|
}
|
|
61
57
|
this.config = { ...this.config, ...config };
|
|
58
|
+
this.runningPromise.setPollingIntervalMS(this.config.txIntervalSeconds * 1000);
|
|
62
59
|
await __classPrivateFieldGet(this, _BotRunner_instances, "m", _BotRunner_createBot).call(this);
|
|
63
60
|
this.log.info(`Bot config updated`);
|
|
64
61
|
if (wasRunning) {
|
|
@@ -71,14 +68,24 @@ export class BotRunner {
|
|
|
71
68
|
*/
|
|
72
69
|
async run() {
|
|
73
70
|
if (!this.bot) {
|
|
71
|
+
this.log.error(`Trying to run with uninitialized bot`);
|
|
74
72
|
throw new Error(`Bot is not initialized`);
|
|
75
73
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
74
|
+
let bot;
|
|
75
|
+
try {
|
|
76
|
+
bot = await this.bot;
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
this.log.error(`Error awaiting bot set up: ${err}`);
|
|
80
|
+
throw err;
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
await bot.run();
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
this.log.error(`Error running bot: ${err}`);
|
|
87
|
+
throw err;
|
|
88
|
+
}
|
|
82
89
|
}
|
|
83
90
|
/** Returns the current configuration for the bot. */
|
|
84
91
|
getConfig() {
|
|
@@ -86,7 +93,20 @@ export class BotRunner {
|
|
|
86
93
|
}
|
|
87
94
|
}
|
|
88
95
|
_BotRunner_instances = new WeakSet(), _BotRunner_createBot = async function _BotRunner_createBot() {
|
|
89
|
-
|
|
90
|
-
|
|
96
|
+
try {
|
|
97
|
+
this.bot = Bot.create(this.config, { pxe: this.pxe });
|
|
98
|
+
await this.bot;
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
this.log.error(`Error setting up bot: ${err}`);
|
|
102
|
+
throw err;
|
|
103
|
+
}
|
|
104
|
+
}, _BotRunner_safeRun = async function _BotRunner_safeRun() {
|
|
105
|
+
try {
|
|
106
|
+
await this.run();
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
// Already logged in run()
|
|
110
|
+
}
|
|
91
111
|
};
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3J1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBWSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVuRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRy9CLE1BQU0sT0FBTyxTQUFTO0lBTXBCLFlBQTJCLE1BQWlCLEVBQUUsZUFBOEIsRUFBRTs7UUFBbkQsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUxwQyxRQUFHLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFNM0MsSUFBSSxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDO1FBQzVCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsdUJBQUEsSUFBSSxnREFBUyxNQUFiLElBQUksQ0FBVyxFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBRUQsNkVBQTZFO0lBQ3RFLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ25DLE1BQU0sdUJBQUEsSUFBSSxrREFBVyxNQUFmLElBQUksQ0FBYSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsS0FBSztRQUNoQixNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFT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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.49.2",
|
|
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.49.2",
|
|
53
|
+
"@aztec/aztec.js": "0.49.2",
|
|
54
|
+
"@aztec/circuit-types": "0.49.2",
|
|
55
|
+
"@aztec/circuits.js": "0.49.2",
|
|
56
|
+
"@aztec/entrypoints": "0.49.2",
|
|
57
|
+
"@aztec/foundation": "0.49.2",
|
|
58
|
+
"@aztec/noir-contracts.js": "0.49.2",
|
|
59
|
+
"@aztec/protocol-contracts": "0.49.2",
|
|
60
|
+
"@aztec/types": "0.49.2",
|
|
61
61
|
"source-map-support": "^0.5.21",
|
|
62
62
|
"tslib": "^2.4.0"
|
|
63
63
|
},
|
package/src/bot.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
type AztecAddress,
|
|
3
3
|
BatchCall,
|
|
4
|
-
|
|
4
|
+
FeeJuicePaymentMethod,
|
|
5
5
|
NoFeePaymentMethod,
|
|
6
6
|
type SendMethodOptions,
|
|
7
7
|
type Wallet,
|
|
@@ -34,12 +34,14 @@ export class Bot {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
public async run() {
|
|
37
|
+
const logCtx = { runId: Date.now() * 1000 + Math.floor(Math.random() * 1000) };
|
|
37
38
|
const { privateTransfersPerTx, publicTransfersPerTx, feePaymentMethod } = this.config;
|
|
38
39
|
const { token, recipient, wallet } = this;
|
|
39
40
|
const sender = wallet.getAddress();
|
|
40
41
|
|
|
41
42
|
this.log.verbose(
|
|
42
43
|
`Sending tx with ${feePaymentMethod} fee with ${privateTransfersPerTx} private and ${publicTransfersPerTx} public transfers`,
|
|
44
|
+
logCtx,
|
|
43
45
|
);
|
|
44
46
|
|
|
45
47
|
const calls: FunctionCall[] = [
|
|
@@ -49,14 +51,34 @@ export class Bot {
|
|
|
49
51
|
),
|
|
50
52
|
];
|
|
51
53
|
|
|
52
|
-
const paymentMethod =
|
|
54
|
+
const paymentMethod =
|
|
55
|
+
feePaymentMethod === 'fee_juice' ? new FeeJuicePaymentMethod(sender) : new NoFeePaymentMethod();
|
|
53
56
|
const gasSettings = GasSettings.default();
|
|
54
57
|
const opts: SendMethodOptions = { estimateGas: true, fee: { paymentMethod, gasSettings } };
|
|
55
|
-
const tx = new BatchCall(wallet, calls).send(opts);
|
|
56
|
-
this.log.verbose(`Sent tx ${tx.getTxHash()}`);
|
|
57
58
|
|
|
58
|
-
const
|
|
59
|
-
this.log.
|
|
59
|
+
const batch = new BatchCall(wallet, calls);
|
|
60
|
+
this.log.verbose(`Creating batch execution request with ${calls.length} calls`, logCtx);
|
|
61
|
+
await batch.create(opts);
|
|
62
|
+
|
|
63
|
+
this.log.verbose(`Simulating transaction`, logCtx);
|
|
64
|
+
await batch.simulate();
|
|
65
|
+
|
|
66
|
+
this.log.verbose(`Proving transaction`, logCtx);
|
|
67
|
+
await batch.prove(opts);
|
|
68
|
+
|
|
69
|
+
this.log.verbose(`Sending tx`, logCtx);
|
|
70
|
+
const tx = batch.send(opts);
|
|
71
|
+
|
|
72
|
+
const txHash = await tx.getTxHash();
|
|
73
|
+
|
|
74
|
+
if (this.config.noWaitForTransfers) {
|
|
75
|
+
this.log.info(`Transaction ${txHash} sent, not waiting for it to be mined`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
this.log.verbose(`Awaiting tx ${txHash} to be mined (timeout ${this.config.txMinedWaitSeconds}s)`, logCtx);
|
|
80
|
+
const receipt = await tx.wait({ timeout: this.config.txMinedWaitSeconds });
|
|
81
|
+
this.log.info(`Tx ${receipt.txHash} mined in block ${receipt.blockNumber}`, logCtx);
|
|
60
82
|
}
|
|
61
83
|
|
|
62
84
|
public async getBalances() {
|
package/src/config.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { Fr } from '@aztec/circuits.js';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
type ConfigMappingsType,
|
|
4
|
+
booleanConfigHelper,
|
|
5
|
+
getConfigFromMappings,
|
|
6
|
+
getDefaultConfig,
|
|
7
|
+
numberConfigHelper,
|
|
8
|
+
} from '@aztec/foundation/config';
|
|
3
9
|
|
|
4
10
|
export type BotConfig = {
|
|
5
11
|
/** URL to the PXE for sending txs, or undefined if an in-proc PXE is used. */
|
|
@@ -17,52 +23,80 @@ export type BotConfig = {
|
|
|
17
23
|
/** How many public token transfers are executed per tx. */
|
|
18
24
|
publicTransfersPerTx: number;
|
|
19
25
|
/** How to handle fee payments. */
|
|
20
|
-
feePaymentMethod: '
|
|
26
|
+
feePaymentMethod: 'fee_juice' | 'none';
|
|
21
27
|
/** True to not automatically setup or start the bot on initialization. */
|
|
22
28
|
noStart: boolean;
|
|
29
|
+
/** How long to wait for a tx to be mined before reporting an error. */
|
|
30
|
+
txMinedWaitSeconds: number;
|
|
31
|
+
/** Don't wait for transfer transactions. */
|
|
32
|
+
noWaitForTransfers: boolean;
|
|
23
33
|
};
|
|
24
34
|
|
|
25
|
-
export
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
export const botConfigMappings: ConfigMappingsType<BotConfig> = {
|
|
36
|
+
pxeUrl: {
|
|
37
|
+
env: 'BOT_PXE_URL',
|
|
38
|
+
description: 'URL to the PXE for sending txs, or undefined if an in-proc PXE is used.',
|
|
39
|
+
},
|
|
40
|
+
senderPrivateKey: {
|
|
41
|
+
env: 'BOT_PRIVATE_KEY',
|
|
42
|
+
description: 'Signing private key for the sender account.',
|
|
43
|
+
parseEnv: (val: string) => Fr.fromString(val),
|
|
44
|
+
defaultValue: Fr.random(),
|
|
45
|
+
},
|
|
46
|
+
recipientEncryptionSecret: {
|
|
47
|
+
env: 'BOT_RECIPIENT_ENCRYPTION_SECRET',
|
|
48
|
+
description: 'Encryption secret for a recipient account.',
|
|
49
|
+
parseEnv: (val: string) => Fr.fromString(val),
|
|
50
|
+
defaultValue: Fr.fromString('0xcafecafe'),
|
|
51
|
+
},
|
|
52
|
+
tokenSalt: {
|
|
53
|
+
env: 'BOT_TOKEN_SALT',
|
|
54
|
+
description: 'Salt for the token contract deployment.',
|
|
55
|
+
parseEnv: (val: string) => Fr.fromString(val),
|
|
56
|
+
defaultValue: Fr.fromString('1'),
|
|
57
|
+
},
|
|
58
|
+
txIntervalSeconds: {
|
|
59
|
+
env: 'BOT_TX_INTERVAL_SECONDS',
|
|
60
|
+
description: 'Every how many seconds should a new tx be sent.',
|
|
61
|
+
...numberConfigHelper(60),
|
|
62
|
+
},
|
|
63
|
+
privateTransfersPerTx: {
|
|
64
|
+
env: 'BOT_PRIVATE_TRANSFERS_PER_TX',
|
|
65
|
+
description: 'How many private token transfers are executed per tx.',
|
|
66
|
+
...numberConfigHelper(1),
|
|
67
|
+
},
|
|
68
|
+
publicTransfersPerTx: {
|
|
69
|
+
env: 'BOT_PUBLIC_TRANSFERS_PER_TX',
|
|
70
|
+
description: 'How many public token transfers are executed per tx.',
|
|
71
|
+
...numberConfigHelper(1),
|
|
72
|
+
},
|
|
73
|
+
feePaymentMethod: {
|
|
74
|
+
env: 'BOT_FEE_PAYMENT_METHOD',
|
|
75
|
+
description: 'How to handle fee payments. (Options: fee_juice, none)',
|
|
76
|
+
parseEnv: val => (val as 'fee_juice' | 'none') || undefined,
|
|
77
|
+
defaultValue: 'none',
|
|
78
|
+
},
|
|
79
|
+
noStart: {
|
|
80
|
+
env: 'BOT_NO_START',
|
|
81
|
+
description: 'True to not automatically setup or start the bot on initialization.',
|
|
82
|
+
...booleanConfigHelper(),
|
|
83
|
+
},
|
|
84
|
+
txMinedWaitSeconds: {
|
|
85
|
+
env: 'BOT_TX_MINED_WAIT_SECONDS',
|
|
86
|
+
description: 'How long to wait for a tx to be mined before reporting an error.',
|
|
87
|
+
...numberConfigHelper(180),
|
|
88
|
+
},
|
|
89
|
+
noWaitForTransfers: {
|
|
90
|
+
env: 'BOT_NO_WAIT_FOR_TRANSFERS',
|
|
91
|
+
description: "Don't wait for transfer transactions.",
|
|
92
|
+
...booleanConfigHelper(),
|
|
93
|
+
},
|
|
94
|
+
};
|
|
39
95
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
senderPrivateKey: BOT_PRIVATE_KEY ? Fr.fromString(BOT_PRIVATE_KEY) : undefined,
|
|
43
|
-
recipientEncryptionSecret: BOT_RECIPIENT_ENCRYPTION_SECRET
|
|
44
|
-
? Fr.fromString(BOT_RECIPIENT_ENCRYPTION_SECRET)
|
|
45
|
-
: undefined,
|
|
46
|
-
tokenSalt: BOT_TOKEN_SALT ? Fr.fromString(BOT_TOKEN_SALT) : undefined,
|
|
47
|
-
txIntervalSeconds: BOT_TX_INTERVAL_SECONDS ? parseInt(BOT_TX_INTERVAL_SECONDS) : undefined,
|
|
48
|
-
privateTransfersPerTx: BOT_PRIVATE_TRANSFERS_PER_TX ? parseInt(BOT_PRIVATE_TRANSFERS_PER_TX) : undefined,
|
|
49
|
-
publicTransfersPerTx: BOT_PUBLIC_TRANSFERS_PER_TX ? parseInt(BOT_PUBLIC_TRANSFERS_PER_TX) : undefined,
|
|
50
|
-
feePaymentMethod: BOT_FEE_PAYMENT_METHOD ? (BOT_FEE_PAYMENT_METHOD as 'native' | 'none') : undefined,
|
|
51
|
-
noStart: BOT_NO_START ? ['1', 'true'].includes(BOT_NO_START) : undefined,
|
|
52
|
-
});
|
|
96
|
+
export function getBotConfigFromEnv(): BotConfig {
|
|
97
|
+
return getConfigFromMappings<BotConfig>(botConfigMappings);
|
|
53
98
|
}
|
|
54
99
|
|
|
55
|
-
export function getBotDefaultConfig(
|
|
56
|
-
return
|
|
57
|
-
pxeUrl: undefined,
|
|
58
|
-
senderPrivateKey: Fr.random(),
|
|
59
|
-
recipientEncryptionSecret: Fr.fromString('0xcafecafe'),
|
|
60
|
-
tokenSalt: Fr.fromString('1'),
|
|
61
|
-
txIntervalSeconds: 60,
|
|
62
|
-
privateTransfersPerTx: 1,
|
|
63
|
-
publicTransfersPerTx: 1,
|
|
64
|
-
feePaymentMethod: 'none',
|
|
65
|
-
noStart: false,
|
|
66
|
-
...compact(overrides),
|
|
67
|
-
};
|
|
100
|
+
export function getBotDefaultConfig(): BotConfig {
|
|
101
|
+
return getDefaultConfig<BotConfig>(botConfigMappings);
|
|
68
102
|
}
|
package/src/factory.ts
CHANGED
|
@@ -19,7 +19,13 @@ export class BotFactory {
|
|
|
19
19
|
throw new Error(`Either a PXE client or a PXE URL must be provided`);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
if (dependencies.pxe) {
|
|
23
|
+
this.log.info(`Using local PXE`);
|
|
24
|
+
this.pxe = dependencies.pxe;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
this.log.info(`Using remote PXE at ${config.pxeUrl!}`);
|
|
28
|
+
this.pxe = createPXEClient(config.pxeUrl!);
|
|
23
29
|
}
|
|
24
30
|
|
|
25
31
|
/**
|
|
@@ -48,7 +54,7 @@ export class BotFactory {
|
|
|
48
54
|
return account.register();
|
|
49
55
|
} else {
|
|
50
56
|
this.log.info(`Initializing account at ${account.getAddress().toString()}`);
|
|
51
|
-
return account.waitSetup();
|
|
57
|
+
return account.waitSetup({ timeout: this.config.txMinedWaitSeconds });
|
|
52
58
|
}
|
|
53
59
|
}
|
|
54
60
|
|
|
@@ -74,7 +80,7 @@ export class BotFactory {
|
|
|
74
80
|
return deploy.register();
|
|
75
81
|
} else {
|
|
76
82
|
this.log.info(`Deploying token contract at ${address.toString()}`);
|
|
77
|
-
return deploy.send(deployOpts).deployed();
|
|
83
|
+
return deploy.send(deployOpts).deployed({ timeout: this.config.txMinedWaitSeconds });
|
|
78
84
|
}
|
|
79
85
|
}
|
|
80
86
|
|
|
@@ -98,6 +104,6 @@ export class BotFactory {
|
|
|
98
104
|
this.log.info(`Skipping minting as ${sender.toString()} has enough tokens`);
|
|
99
105
|
return;
|
|
100
106
|
}
|
|
101
|
-
await new BatchCall(token.wallet, calls).send().wait();
|
|
107
|
+
await new BatchCall(token.wallet, calls).send().wait({ timeout: this.config.txMinedWaitSeconds });
|
|
102
108
|
}
|
|
103
109
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { Bot } from './bot.js';
|
|
2
2
|
export { BotRunner } from './runner.js';
|
|
3
|
-
export { BotConfig, getBotConfigFromEnv, getBotDefaultConfig } from './config.js';
|
|
3
|
+
export { BotConfig, getBotConfigFromEnv, getBotDefaultConfig, botConfigMappings } from './config.js';
|
|
4
4
|
export { createBotRunnerRpcServer } from './rpc.js';
|
package/src/runner.ts
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { type PXE, createDebugLogger } from '@aztec/aztec.js';
|
|
2
|
+
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
2
3
|
|
|
3
4
|
import { Bot } from './bot.js';
|
|
4
5
|
import { type BotConfig } from './config.js';
|
|
5
6
|
|
|
6
7
|
export class BotRunner {
|
|
7
8
|
private log = createDebugLogger('aztec:bot');
|
|
8
|
-
private interval?: NodeJS.Timeout;
|
|
9
9
|
private bot?: Promise<Bot>;
|
|
10
10
|
private pxe?: PXE;
|
|
11
|
-
private
|
|
11
|
+
private runningPromise: RunningPromise;
|
|
12
12
|
|
|
13
13
|
public constructor(private config: BotConfig, dependencies: { pxe?: PXE } = {}) {
|
|
14
14
|
this.pxe = dependencies.pxe;
|
|
15
|
+
this.runningPromise = new RunningPromise(() => this.#safeRun(), config.txIntervalSeconds * 1000);
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
/** Initializes the bot if needed. Blocks until the bot setup is finished. */
|
|
@@ -29,9 +30,9 @@ export class BotRunner {
|
|
|
29
30
|
*/
|
|
30
31
|
public async start() {
|
|
31
32
|
await this.setup();
|
|
32
|
-
if (!this.
|
|
33
|
+
if (!this.runningPromise.isRunning()) {
|
|
33
34
|
this.log.info(`Starting bot with interval of ${this.config.txIntervalSeconds}s`);
|
|
34
|
-
this.
|
|
35
|
+
this.runningPromise.start();
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
38
|
|
|
@@ -39,21 +40,16 @@ export class BotRunner {
|
|
|
39
40
|
* Stops sending txs. Returns once all ongoing txs are finished.
|
|
40
41
|
*/
|
|
41
42
|
public async stop() {
|
|
42
|
-
if (this.
|
|
43
|
+
if (this.runningPromise.isRunning()) {
|
|
43
44
|
this.log.verbose(`Stopping bot`);
|
|
44
|
-
|
|
45
|
-
this.interval = undefined;
|
|
46
|
-
}
|
|
47
|
-
if (this.running.size > 0) {
|
|
48
|
-
this.log.verbose(`Waiting for ${this.running.size} running txs to finish`);
|
|
49
|
-
await Promise.all(this.running);
|
|
45
|
+
await this.runningPromise.stop();
|
|
50
46
|
}
|
|
51
47
|
this.log.info(`Stopped bot`);
|
|
52
48
|
}
|
|
53
49
|
|
|
54
50
|
/** Returns whether the bot is running. */
|
|
55
51
|
public isRunning() {
|
|
56
|
-
return
|
|
52
|
+
return this.runningPromise.isRunning();
|
|
57
53
|
}
|
|
58
54
|
|
|
59
55
|
/**
|
|
@@ -67,6 +63,7 @@ export class BotRunner {
|
|
|
67
63
|
await this.stop();
|
|
68
64
|
}
|
|
69
65
|
this.config = { ...this.config, ...config };
|
|
66
|
+
this.runningPromise.setPollingIntervalMS(this.config.txIntervalSeconds * 1000);
|
|
70
67
|
await this.#createBot();
|
|
71
68
|
this.log.info(`Bot config updated`);
|
|
72
69
|
if (wasRunning) {
|
|
@@ -80,14 +77,24 @@ export class BotRunner {
|
|
|
80
77
|
*/
|
|
81
78
|
public async run() {
|
|
82
79
|
if (!this.bot) {
|
|
80
|
+
this.log.error(`Trying to run with uninitialized bot`);
|
|
83
81
|
throw new Error(`Bot is not initialized`);
|
|
84
82
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
83
|
+
|
|
84
|
+
let bot;
|
|
85
|
+
try {
|
|
86
|
+
bot = await this.bot;
|
|
87
|
+
} catch (err) {
|
|
88
|
+
this.log.error(`Error awaiting bot set up: ${err}`);
|
|
89
|
+
throw err;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
await bot.run();
|
|
94
|
+
} catch (err) {
|
|
95
|
+
this.log.error(`Error running bot: ${err}`);
|
|
96
|
+
throw err;
|
|
97
|
+
}
|
|
91
98
|
}
|
|
92
99
|
|
|
93
100
|
/** Returns the current configuration for the bot. */
|
|
@@ -96,7 +103,20 @@ export class BotRunner {
|
|
|
96
103
|
}
|
|
97
104
|
|
|
98
105
|
async #createBot() {
|
|
99
|
-
|
|
100
|
-
|
|
106
|
+
try {
|
|
107
|
+
this.bot = Bot.create(this.config, { pxe: this.pxe });
|
|
108
|
+
await this.bot;
|
|
109
|
+
} catch (err) {
|
|
110
|
+
this.log.error(`Error setting up bot: ${err}`);
|
|
111
|
+
throw err;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async #safeRun() {
|
|
116
|
+
try {
|
|
117
|
+
await this.run();
|
|
118
|
+
} catch (err) {
|
|
119
|
+
// Already logged in run()
|
|
120
|
+
}
|
|
101
121
|
}
|
|
102
122
|
}
|