@aztec/bot 0.0.1-commit.3469e52 → 0.0.1-commit.35158ae7e

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 (46) hide show
  1. package/dest/amm_bot.d.ts +6 -7
  2. package/dest/amm_bot.d.ts.map +1 -1
  3. package/dest/amm_bot.js +27 -16
  4. package/dest/base_bot.d.ts +6 -6
  5. package/dest/base_bot.d.ts.map +1 -1
  6. package/dest/base_bot.js +12 -13
  7. package/dest/bot.d.ts +6 -6
  8. package/dest/bot.d.ts.map +1 -1
  9. package/dest/bot.js +8 -4
  10. package/dest/config.d.ts +32 -16
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +37 -10
  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 +20 -10
  17. package/dest/factory.d.ts.map +1 -1
  18. package/dest/factory.js +245 -73
  19. package/dest/index.d.ts +2 -1
  20. package/dest/index.d.ts.map +1 -1
  21. package/dest/index.js +1 -0
  22. package/dest/l1_to_l2_seeding.d.ts +8 -0
  23. package/dest/l1_to_l2_seeding.d.ts.map +1 -0
  24. package/dest/l1_to_l2_seeding.js +63 -0
  25. package/dest/runner.d.ts +3 -3
  26. package/dest/runner.d.ts.map +1 -1
  27. package/dest/runner.js +17 -1
  28. package/dest/store/bot_store.d.ts +30 -5
  29. package/dest/store/bot_store.d.ts.map +1 -1
  30. package/dest/store/bot_store.js +37 -6
  31. package/dest/store/index.d.ts +2 -2
  32. package/dest/store/index.d.ts.map +1 -1
  33. package/dest/utils.js +3 -3
  34. package/package.json +16 -13
  35. package/src/amm_bot.ts +26 -21
  36. package/src/base_bot.ts +11 -25
  37. package/src/bot.ts +10 -8
  38. package/src/config.ts +40 -12
  39. package/src/cross_chain_bot.ts +203 -0
  40. package/src/factory.ts +232 -67
  41. package/src/index.ts +1 -0
  42. package/src/l1_to_l2_seeding.ts +79 -0
  43. package/src/runner.ts +18 -5
  44. package/src/store/bot_store.ts +60 -5
  45. package/src/store/index.ts +1 -1
  46. package/src/utils.ts +3 -3
package/dest/factory.js CHANGED
@@ -1,22 +1,27 @@
1
- import { SchnorrAccountContract } from '@aztec/accounts/schnorr';
2
1
  import { getInitialTestAccountsData } from '@aztec/accounts/testing';
3
- import { AztecAddress } from '@aztec/aztec.js/addresses';
4
- import { BatchCall } from '@aztec/aztec.js/contracts';
2
+ import { NO_FROM } from '@aztec/aztec.js/account';
3
+ import { BatchCall, NO_WAIT } from '@aztec/aztec.js/contracts';
5
4
  import { L1FeeJuicePortalManager } from '@aztec/aztec.js/ethereum';
6
5
  import { FeeJuicePaymentMethodWithClaim } from '@aztec/aztec.js/fee';
7
6
  import { deriveKeys } from '@aztec/aztec.js/keys';
8
7
  import { createLogger } from '@aztec/aztec.js/log';
9
8
  import { waitForL1ToL2MessageReady } from '@aztec/aztec.js/messaging';
9
+ import { waitForTx } from '@aztec/aztec.js/node';
10
+ import { ContractInitializationStatus } from '@aztec/aztec.js/wallet';
10
11
  import { createEthereumChain } from '@aztec/ethereum/chain';
11
12
  import { createExtendedL1Client } from '@aztec/ethereum/client';
13
+ import { RollupContract } from '@aztec/ethereum/contracts';
12
14
  import { Fr } from '@aztec/foundation/curves/bn254';
15
+ import { EthAddress } from '@aztec/foundation/eth-address';
13
16
  import { Timer } from '@aztec/foundation/timer';
14
17
  import { AMMContract } from '@aztec/noir-contracts.js/AMM';
15
18
  import { PrivateTokenContract } from '@aztec/noir-contracts.js/PrivateToken';
16
19
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
17
- import { GasSettings } from '@aztec/stdlib/gas';
20
+ import { TestContract } from '@aztec/noir-test-contracts.js/Test';
21
+ import { GasFees, GasSettings } from '@aztec/stdlib/gas';
18
22
  import { deriveSigningKey } from '@aztec/stdlib/keys';
19
23
  import { SupportedTokenContracts } from './config.js';
24
+ import { seedL1ToL2Message } from './l1_to_l2_seeding.js';
20
25
  import { getBalances, getPrivateBalance, isStandardTokenContract } from './utils.js';
21
26
  const MINT_BALANCE = 1e12;
22
27
  const MIN_BALANCE = 1e3;
@@ -34,13 +39,16 @@ export class BotFactory {
34
39
  this.aztecNode = aztecNode;
35
40
  this.aztecNodeAdmin = aztecNodeAdmin;
36
41
  this.log = createLogger('bot');
42
+ // Set fee padding on the wallet so that all transactions during setup
43
+ // (token deploy, minting, etc.) use the configured padding, not the default.
44
+ this.wallet.setMinFeePadding(config.minFeePadding);
37
45
  }
38
46
  /**
39
47
  * Initializes a new bot by setting up the sender account, registering the recipient,
40
48
  * deploying the token contract, and minting tokens if necessary.
41
49
  */ async setup() {
42
50
  const defaultAccountAddress = await this.setupAccount();
43
- const recipient = (await this.wallet.createAccount()).address;
51
+ const recipient = (await this.wallet.createSchnorrAccount(Fr.random(), Fr.random())).address;
44
52
  const token = await this.setupToken(defaultAccountAddress);
45
53
  await this.mintTokens(token, defaultAccountAddress);
46
54
  return {
@@ -69,6 +77,65 @@ export class BotFactory {
69
77
  };
70
78
  }
71
79
  /**
80
+ * Initializes the cross-chain bot by deploying TestContract, creating an L1 client,
81
+ * seeding initial L1→L2 messages, and waiting for the first to be ready.
82
+ */ async setupCrossChain() {
83
+ const defaultAccountAddress = await this.setupAccount();
84
+ // Create L1 client (same pattern as bridgeL1FeeJuice)
85
+ const l1RpcUrls = this.config.l1RpcUrls;
86
+ if (!l1RpcUrls?.length) {
87
+ throw new Error('L1 RPC URLs required for cross-chain bot');
88
+ }
89
+ const mnemonicOrPrivateKey = this.config.l1PrivateKey?.getValue() ?? this.config.l1Mnemonic?.getValue();
90
+ if (!mnemonicOrPrivateKey) {
91
+ throw new Error('L1 mnemonic or private key required for cross-chain bot');
92
+ }
93
+ const { l1ChainId, l1ContractAddresses } = await this.aztecNode.getNodeInfo();
94
+ const chain = createEthereumChain(l1RpcUrls, l1ChainId);
95
+ const l1Client = createExtendedL1Client(chain.rpcUrls, mnemonicOrPrivateKey, chain.chainInfo);
96
+ // Fetch Rollup version (needed for Inbox L2Actor struct)
97
+ const rollupContract = new RollupContract(l1Client, l1ContractAddresses.rollupAddress.toString());
98
+ const rollupVersion = await rollupContract.getVersion();
99
+ // Deploy TestContract
100
+ const contract = await this.setupTestContract(defaultAccountAddress);
101
+ // Recover any pending messages from store (clean up stale ones first)
102
+ await this.store.cleanupOldPendingMessages();
103
+ const pendingMessages = await this.store.getUnconsumedL1ToL2Messages();
104
+ // Seed initial L1→L2 messages if pipeline is empty
105
+ const seedCount = Math.max(0, this.config.l1ToL2SeedCount - pendingMessages.length);
106
+ for(let i = 0; i < seedCount; i++){
107
+ await seedL1ToL2Message(l1Client, EthAddress.fromString(l1ContractAddresses.inboxAddress.toString()), contract.address, rollupVersion, this.store, this.log);
108
+ }
109
+ // Block until at least one message is ready
110
+ const allMessages = await this.store.getUnconsumedL1ToL2Messages();
111
+ if (allMessages.length > 0) {
112
+ this.log.info(`Waiting for first L1→L2 message to be ready...`);
113
+ const firstMsg = allMessages[0];
114
+ await waitForL1ToL2MessageReady(this.aztecNode, Fr.fromHexString(firstMsg.msgHash), {
115
+ timeoutSeconds: this.config.l1ToL2MessageTimeoutSeconds
116
+ });
117
+ this.log.info(`First L1→L2 message is ready`);
118
+ }
119
+ return {
120
+ wallet: this.wallet,
121
+ defaultAccountAddress,
122
+ contract,
123
+ node: this.aztecNode,
124
+ l1Client,
125
+ rollupVersion
126
+ };
127
+ }
128
+ async setupTestContract(deployer) {
129
+ const deployOpts = {
130
+ from: deployer,
131
+ contractAddressSalt: this.config.tokenSalt,
132
+ universalDeploy: true
133
+ };
134
+ const deploy = TestContract.deploy(this.wallet);
135
+ const instance = await this.registerOrDeployContract('TestContract', deploy, deployOpts);
136
+ return TestContract.at(instance.address, this.wallet);
137
+ }
138
+ /**
72
139
  * Checks if the sender account contract is initialized, and initializes it if necessary.
73
140
  * @returns The sender wallet.
74
141
  */ async setupAccount() {
@@ -84,14 +151,9 @@ export class BotFactory {
84
151
  async setupAccountWithPrivateKey(secret) {
85
152
  const salt = this.config.senderSalt ?? Fr.ONE;
86
153
  const signingKey = deriveSigningKey(secret);
87
- const accountData = {
88
- secret,
89
- salt,
90
- contract: new SchnorrAccountContract(signingKey)
91
- };
92
- const accountManager = await this.wallet.createAccount(accountData);
154
+ const accountManager = await this.wallet.createSchnorrAccount(secret, salt, signingKey);
93
155
  const metadata = await this.wallet.getContractMetadata(accountManager.address);
94
- if (metadata.isContractInitialized) {
156
+ if (metadata.initializationStatus === ContractInitializationStatus.INITIALIZED) {
95
157
  this.log.info(`Account at ${accountManager.address.toString()} already initialized`);
96
158
  const timer = new Timer();
97
159
  const address = accountManager.address;
@@ -105,21 +167,34 @@ export class BotFactory {
105
167
  const paymentMethod = new FeeJuicePaymentMethodWithClaim(accountManager.address, claim);
106
168
  const deployMethod = await accountManager.getDeployMethod();
107
169
  const maxFeesPerGas = (await this.aztecNode.getCurrentMinFees()).mul(1 + this.config.minFeePadding);
108
- const gasSettings = GasSettings.default({
109
- maxFeesPerGas
110
- });
111
- const sentTx = deployMethod.send({
112
- from: AztecAddress.ZERO,
170
+ const { estimatedGas } = await deployMethod.simulate({
171
+ from: NO_FROM,
113
172
  fee: {
114
- gasSettings,
173
+ estimateGas: true,
115
174
  paymentMethod
116
175
  }
117
176
  });
118
- const txHash = await sentTx.getTxHash();
119
- this.log.info(`Sent tx for account deployment with hash ${txHash.toString()}`);
120
- await this.withNoMinTxsPerBlock(()=>sentTx.wait({
177
+ const gasSettings = GasSettings.from({
178
+ ...estimatedGas,
179
+ maxFeesPerGas,
180
+ maxPriorityFeesPerGas: GasFees.empty()
181
+ });
182
+ await this.withNoMinTxsPerBlock(async ()=>{
183
+ const { txHash } = await deployMethod.send({
184
+ from: NO_FROM,
185
+ fee: {
186
+ gasSettings,
187
+ paymentMethod
188
+ },
189
+ wait: NO_WAIT
190
+ });
191
+ this.log.info(`Sent tx for account deployment with hash ${txHash.toString()}`, {
192
+ gasSettings
193
+ });
194
+ return waitForTx(this.aztecNode, txHash, {
121
195
  timeout: this.config.txMinedWaitSeconds
122
- }));
196
+ });
197
+ });
123
198
  this.log.info(`Account deployed at ${address}`);
124
199
  // Clean up the consumed bridge claim
125
200
  await this.store.deleteBridgeClaim(address);
@@ -128,12 +203,7 @@ export class BotFactory {
128
203
  }
129
204
  async setupTestAccount() {
130
205
  const [initialAccountData] = await getInitialTestAccountsData();
131
- const accountData = {
132
- secret: initialAccountData.secret,
133
- salt: initialAccountData.salt,
134
- contract: new SchnorrAccountContract(initialAccountData.signingKey)
135
- };
136
- const accountManager = await this.wallet.createAccount(accountData);
206
+ const accountManager = await this.wallet.createSchnorrAccount(initialAccountData.secret, initialAccountData.salt, initialAccountData.signingKey);
137
207
  return accountManager.address;
138
208
  }
139
209
  /**
@@ -148,8 +218,11 @@ export class BotFactory {
148
218
  contractAddressSalt: this.config.tokenSalt,
149
219
  universalDeploy: true
150
220
  };
221
+ let token;
151
222
  if (this.config.contract === SupportedTokenContracts.TokenContract) {
152
223
  deploy = TokenContract.deploy(this.wallet, sender, 'BotToken', 'BOT', 18);
224
+ tokenInstance = await deploy.getInstance(deployOpts);
225
+ token = TokenContract.at(tokenInstance.address, this.wallet);
153
226
  } else if (this.config.contract === SupportedTokenContracts.PrivateTokenContract) {
154
227
  // Generate keys for the contract since PrivateToken uses SinglePrivateMutable which requires keys
155
228
  const tokenSecretKey = Fr.random();
@@ -160,7 +233,12 @@ export class BotFactory {
160
233
  deployOpts.skipInitialization = false;
161
234
  // Register the contract with the secret key before deployment
162
235
  tokenInstance = await deploy.getInstance(deployOpts);
236
+ token = PrivateTokenContract.at(tokenInstance.address, this.wallet);
163
237
  await this.wallet.registerContract(tokenInstance, PrivateTokenContract.artifact, tokenSecretKey);
238
+ // The contract constructor initializes private storage vars that need the contract's own nullifier key.
239
+ deployOpts.additionalScopes = [
240
+ tokenInstance.address
241
+ ];
164
242
  } else {
165
243
  throw new Error(`Unsupported token contract type: ${this.config.contract}`);
166
244
  }
@@ -168,29 +246,47 @@ export class BotFactory {
168
246
  const metadata = await this.wallet.getContractMetadata(address);
169
247
  if (metadata.isContractPublished) {
170
248
  this.log.info(`Token at ${address.toString()} already deployed`);
171
- return deploy.register();
249
+ await deploy.register();
172
250
  } else {
173
251
  this.log.info(`Deploying token contract at ${address.toString()}`);
174
- const sentTx = deploy.send(deployOpts);
175
- const txHash = await sentTx.getTxHash();
176
- this.log.info(`Sent tx for token setup with hash ${txHash.toString()}`);
177
- return this.withNoMinTxsPerBlock(()=>sentTx.deployed({
252
+ const { estimatedGas } = await deploy.simulate({
253
+ ...deployOpts,
254
+ fee: {
255
+ estimateGas: true
256
+ }
257
+ });
258
+ const { txHash } = await deploy.send({
259
+ ...deployOpts,
260
+ fee: {
261
+ gasSettings: estimatedGas
262
+ },
263
+ wait: NO_WAIT
264
+ });
265
+ this.log.info(`Sent tx for token setup with hash ${txHash.toString()}`, {
266
+ estimatedGas
267
+ });
268
+ await this.withNoMinTxsPerBlock(async ()=>{
269
+ await waitForTx(this.aztecNode, txHash, {
178
270
  timeout: this.config.txMinedWaitSeconds
179
- }));
271
+ });
272
+ return token;
273
+ });
180
274
  }
275
+ return token;
181
276
  }
182
277
  /**
183
278
  * Checks if the token contract is deployed and deploys it if necessary.
184
279
  * @param wallet - Wallet to deploy the token contract from.
185
280
  * @returns The TokenContract instance.
186
- */ setupTokenContract(deployer, contractAddressSalt, name, ticker, decimals = 18) {
281
+ */ async setupTokenContract(deployer, contractAddressSalt, name, ticker, decimals = 18) {
187
282
  const deployOpts = {
188
283
  from: deployer,
189
284
  contractAddressSalt,
190
285
  universalDeploy: true
191
286
  };
192
287
  const deploy = TokenContract.deploy(this.wallet, deployer, name, ticker, decimals);
193
- return this.registerOrDeployContract('Token - ' + name, deploy, deployOpts);
288
+ const instance = await this.registerOrDeployContract('Token - ' + name, deploy, deployOpts);
289
+ return TokenContract.at(instance.address, this.wallet);
194
290
  }
195
291
  async setupAmmContract(deployer, contractAddressSalt, token0, token1, lpToken) {
196
292
  const deployOpts = {
@@ -199,14 +295,27 @@ export class BotFactory {
199
295
  universalDeploy: true
200
296
  };
201
297
  const deploy = AMMContract.deploy(this.wallet, token0.address, token1.address, lpToken.address);
202
- const amm = await this.registerOrDeployContract('AMM', deploy, deployOpts);
298
+ const instance = await this.registerOrDeployContract('AMM', deploy, deployOpts);
299
+ const amm = AMMContract.at(instance.address, this.wallet);
203
300
  this.log.info(`AMM deployed at ${amm.address}`);
204
- const minterTx = lpToken.methods.set_minter(amm.address, true).send({
205
- from: deployer
301
+ const setMinterInteraction = lpToken.methods.set_minter(amm.address, true);
302
+ const { estimatedGas: setMinterGas } = await setMinterInteraction.simulate({
303
+ from: deployer,
304
+ fee: {
305
+ estimateGas: true
306
+ }
307
+ });
308
+ const { receipt: minterReceipt } = await setMinterInteraction.send({
309
+ from: deployer,
310
+ fee: {
311
+ gasSettings: setMinterGas
312
+ },
313
+ wait: {
314
+ timeout: this.config.txMinedWaitSeconds
315
+ }
206
316
  });
207
- this.log.info(`Set LP token minter to AMM txHash=${(await minterTx.getTxHash()).toString()}`);
208
- await minterTx.wait({
209
- timeout: this.config.txMinedWaitSeconds
317
+ this.log.info(`Set LP token minter to AMM txHash=${minterReceipt.txHash.toString()}`, {
318
+ estimatedGas: setMinterGas
210
319
  });
211
320
  this.log.info(`Liquidity token initialized`);
212
321
  return amm;
@@ -215,13 +324,13 @@ export class BotFactory {
215
324
  const getPrivateBalances = ()=>Promise.all([
216
325
  token0.methods.balance_of_private(liquidityProvider).simulate({
217
326
  from: liquidityProvider
218
- }),
327
+ }).then((r)=>r.result),
219
328
  token1.methods.balance_of_private(liquidityProvider).simulate({
220
329
  from: liquidityProvider
221
- }),
330
+ }).then((r)=>r.result),
222
331
  lpToken.methods.balance_of_private(liquidityProvider).simulate({
223
332
  from: liquidityProvider
224
- })
333
+ }).then((r)=>r.result)
225
334
  ]);
226
335
  const authwitNonce = Fr.random();
227
336
  // keep some tokens for swapping
@@ -240,46 +349,91 @@ export class BotFactory {
240
349
  caller: amm.address,
241
350
  call: await token1.methods.transfer_to_public_and_prepare_private_balance_increase(liquidityProvider, amm.address, amount1Max, authwitNonce).getFunctionCall()
242
351
  });
243
- const mintTx = new BatchCall(this.wallet, [
352
+ const mintBatch = new BatchCall(this.wallet, [
244
353
  token0.methods.mint_to_private(liquidityProvider, MINT_BALANCE),
245
354
  token1.methods.mint_to_private(liquidityProvider, MINT_BALANCE)
246
- ]).send({
247
- from: liquidityProvider
355
+ ]);
356
+ const { estimatedGas: mintGas } = await mintBatch.simulate({
357
+ from: liquidityProvider,
358
+ fee: {
359
+ estimateGas: true
360
+ }
361
+ });
362
+ const { receipt: mintReceipt } = await mintBatch.send({
363
+ from: liquidityProvider,
364
+ fee: {
365
+ gasSettings: mintGas
366
+ },
367
+ wait: {
368
+ timeout: this.config.txMinedWaitSeconds
369
+ }
248
370
  });
249
- this.log.info(`Sent mint tx: ${(await mintTx.getTxHash()).toString()}`);
250
- await mintTx.wait({
251
- timeout: this.config.txMinedWaitSeconds
371
+ this.log.info(`Sent mint tx: ${mintReceipt.txHash.toString()}`, {
372
+ estimatedGas: mintGas
252
373
  });
253
- const addLiquidityTx = amm.methods.add_liquidity(amount0Max, amount1Max, amount0Min, amount1Min, authwitNonce).send({
374
+ const addLiquidityInteraction = amm.methods.add_liquidity(amount0Max, amount1Max, amount0Min, amount1Min, authwitNonce);
375
+ const { estimatedGas: addLiquidityGas } = await addLiquidityInteraction.simulate({
254
376
  from: liquidityProvider,
377
+ fee: {
378
+ estimateGas: true
379
+ },
255
380
  authWitnesses: [
256
381
  token0Authwit,
257
382
  token1Authwit
258
383
  ]
259
384
  });
260
- this.log.info(`Sent tx to add liquidity to the AMM: ${(await addLiquidityTx.getTxHash()).toString()}`);
261
- await addLiquidityTx.wait({
262
- timeout: this.config.txMinedWaitSeconds
385
+ const { receipt: addLiquidityReceipt } = await addLiquidityInteraction.send({
386
+ from: liquidityProvider,
387
+ fee: {
388
+ gasSettings: addLiquidityGas
389
+ },
390
+ authWitnesses: [
391
+ token0Authwit,
392
+ token1Authwit
393
+ ],
394
+ wait: {
395
+ timeout: this.config.txMinedWaitSeconds
396
+ }
397
+ });
398
+ this.log.info(`Sent tx to add liquidity to the AMM: ${addLiquidityReceipt.txHash.toString()}`, {
399
+ estimatedGas: addLiquidityGas
263
400
  });
264
401
  this.log.info(`Liquidity added`);
265
402
  const [newT0Bal, newT1Bal, newLPBal] = await getPrivateBalances();
266
403
  this.log.info(`Updated private balances of ${defaultAccountAddress} after minting and funding AMM: token0=${newT0Bal}, token1=${newT1Bal}, lp=${newLPBal}`);
267
404
  }
268
405
  async registerOrDeployContract(name, deploy, deployOpts) {
269
- const address = (await deploy.getInstance(deployOpts)).address;
406
+ const instance = await deploy.getInstance(deployOpts);
407
+ const address = instance.address;
270
408
  const metadata = await this.wallet.getContractMetadata(address);
271
409
  if (metadata.isContractPublished) {
272
410
  this.log.info(`Contract ${name} at ${address.toString()} already deployed`);
273
- return deploy.register();
411
+ await deploy.register();
274
412
  } else {
275
- this.log.info(`Deploying contract ${name} at ${address.toString()}`);
276
- const sentTx = deploy.send(deployOpts);
277
- const txHash = await sentTx.getTxHash();
278
- this.log.info(`Sent contract ${name} setup tx with hash ${txHash.toString()}`);
279
- return this.withNoMinTxsPerBlock(()=>sentTx.deployed({
413
+ const { estimatedGas } = await deploy.simulate({
414
+ ...deployOpts,
415
+ fee: {
416
+ estimateGas: true
417
+ }
418
+ });
419
+ this.log.info(`Deploying contract ${name} at ${address.toString()}`, {
420
+ estimatedGas
421
+ });
422
+ await this.withNoMinTxsPerBlock(async ()=>{
423
+ const { txHash } = await deploy.send({
424
+ ...deployOpts,
425
+ fee: {
426
+ gasSettings: estimatedGas
427
+ },
428
+ wait: NO_WAIT
429
+ });
430
+ this.log.info(`Sent contract ${name} setup tx with hash ${txHash.toString()}`);
431
+ return waitForTx(this.aztecNode, txHash, {
280
432
  timeout: this.config.txMinedWaitSeconds
281
- }));
433
+ });
434
+ });
282
435
  }
436
+ return instance;
283
437
  }
284
438
  /**
285
439
  * Mints private and public tokens for the sender if their balance is below the minimum.
@@ -306,14 +460,34 @@ export class BotFactory {
306
460
  this.log.info(`Skipping minting as ${minter.toString()} has enough tokens`);
307
461
  return;
308
462
  }
309
- const sentTx = new BatchCall(token.wallet, calls).send({
310
- from: minter
463
+ // PrivateToken's mint accesses contract-level private storage vars (admin, total_supply).
464
+ const additionalScopes = isStandardToken ? undefined : [
465
+ token.address
466
+ ];
467
+ const mintBatch = new BatchCall(token.wallet, calls);
468
+ const { estimatedGas } = await mintBatch.simulate({
469
+ from: minter,
470
+ fee: {
471
+ estimateGas: true
472
+ },
473
+ additionalScopes
311
474
  });
312
- const txHash = await sentTx.getTxHash();
313
- this.log.info(`Sent token mint tx with hash ${txHash.toString()}`);
314
- await this.withNoMinTxsPerBlock(()=>sentTx.wait({
475
+ await this.withNoMinTxsPerBlock(async ()=>{
476
+ const { txHash } = await mintBatch.send({
477
+ from: minter,
478
+ additionalScopes,
479
+ fee: {
480
+ gasSettings: estimatedGas
481
+ },
482
+ wait: NO_WAIT
483
+ });
484
+ this.log.info(`Sent token mint tx with hash ${txHash.toString()}`, {
485
+ estimatedGas
486
+ });
487
+ return waitForTx(this.aztecNode, txHash, {
315
488
  timeout: this.config.txMinedWaitSeconds
316
- }));
489
+ });
490
+ });
317
491
  }
318
492
  /**
319
493
  * Gets or creates a bridge claim for the recipient.
@@ -328,8 +502,7 @@ export class BotFactory {
328
502
  try {
329
503
  const messageHash = Fr.fromHexString(existingClaim.claim.messageHash);
330
504
  await this.withNoMinTxsPerBlock(()=>waitForL1ToL2MessageReady(this.aztecNode, messageHash, {
331
- timeoutSeconds: this.config.l1ToL2MessageTimeoutSeconds,
332
- forPublicConsumption: false
505
+ timeoutSeconds: this.config.l1ToL2MessageTimeoutSeconds
333
506
  }));
334
507
  return existingClaim.claim;
335
508
  } catch (err) {
@@ -357,8 +530,7 @@ export class BotFactory {
357
530
  const mintAmount = await portal.getTokenManager().getMintAmount();
358
531
  const claim = await portal.bridgeTokensPublic(recipient, mintAmount, true);
359
532
  await this.withNoMinTxsPerBlock(()=>waitForL1ToL2MessageReady(this.aztecNode, Fr.fromHexString(claim.messageHash), {
360
- timeoutSeconds: this.config.l1ToL2MessageTimeoutSeconds,
361
- forPublicConsumption: false
533
+ timeoutSeconds: this.config.l1ToL2MessageTimeoutSeconds
362
534
  }));
363
535
  this.log.info(`Created a claim for ${mintAmount} L1 fee juice to ${recipient}.`, claim);
364
536
  return claim;
package/dest/index.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  export { Bot } from './bot.js';
2
2
  export { AmmBot } from './amm_bot.js';
3
+ export { CrossChainBot } from './cross_chain_bot.js';
3
4
  export { BotRunner } from './runner.js';
4
5
  export { BotStore } from './store/bot_store.js';
5
6
  export { type BotConfig, getBotConfigFromEnv, getBotDefaultConfig, botConfigMappings, SupportedTokenContracts, } from './config.js';
6
7
  export { getBotRunnerApiHandler } from './rpc.js';
7
8
  export * from './interface.js';
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUNMLEtBQUssU0FBUyxFQUNkLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLHVCQUF1QixHQUN4QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEQsY0FBYyxnQkFBZ0IsQ0FBQyJ9
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFDTCxLQUFLLFNBQVMsRUFDZCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQix1QkFBdUIsR0FDeEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xELGNBQWMsZ0JBQWdCLENBQUMifQ==
@@ -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,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EACL,KAAK,SAAS,EACd,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,cAAc,gBAAgB,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,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EACL,KAAK,SAAS,EACd,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,cAAc,gBAAgB,CAAC"}
package/dest/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export { Bot } from './bot.js';
2
2
  export { AmmBot } from './amm_bot.js';
3
+ export { CrossChainBot } from './cross_chain_bot.js';
3
4
  export { BotRunner } from './runner.js';
4
5
  export { BotStore } from './store/bot_store.js';
5
6
  export { getBotConfigFromEnv, getBotDefaultConfig, botConfigMappings, SupportedTokenContracts } from './config.js';
@@ -0,0 +1,8 @@
1
+ import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
2
+ import { EthAddress } from '@aztec/foundation/eth-address';
3
+ import type { Logger } from '@aztec/foundation/log';
4
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
5
+ import type { BotStore, PendingL1ToL2Message } from './store/index.js';
6
+ /** Sends an L1→L2 message via the Inbox contract and stores it. */
7
+ export declare function seedL1ToL2Message(l1Client: ExtendedViemWalletClient, inboxAddress: EthAddress, l2Recipient: AztecAddress, rollupVersion: bigint, store: BotStore, log: Logger): Promise<PendingL1ToL2Message>;
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfdG9fbDJfc2VlZGluZy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2wxX3RvX2wyX3NlZWRpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUd0RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFcEQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFJaEUsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdkUscUVBQW1FO0FBQ25FLHdCQUFzQixpQkFBaUIsQ0FDckMsUUFBUSxFQUFFLHdCQUF3QixFQUNsQyxZQUFZLEVBQUUsVUFBVSxFQUN4QixXQUFXLEVBQUUsWUFBWSxFQUN6QixhQUFhLEVBQUUsTUFBTSxFQUNyQixLQUFLLEVBQUUsUUFBUSxFQUNmLEdBQUcsRUFBRSxNQUFNLEdBQ1YsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBeUQvQiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l1_to_l2_seeding.d.ts","sourceRoot":"","sources":["../src/l1_to_l2_seeding.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAGtE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAIhE,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAEvE,qEAAmE;AACnE,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,wBAAwB,EAClC,YAAY,EAAE,UAAU,EACxB,WAAW,EAAE,YAAY,EACzB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,oBAAoB,CAAC,CAyD/B"}
@@ -0,0 +1,63 @@
1
+ import { generateClaimSecret } from '@aztec/aztec.js/ethereum';
2
+ import { compactArray } from '@aztec/foundation/collection';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
4
+ import { InboxAbi } from '@aztec/l1-artifacts';
5
+ import { decodeEventLog, getContract } from 'viem';
6
+ /** Sends an L1→L2 message via the Inbox contract and stores it. */ export async function seedL1ToL2Message(l1Client, inboxAddress, l2Recipient, rollupVersion, store, log) {
7
+ log.info('Seeding L1→L2 message');
8
+ const [secret, secretHash] = await generateClaimSecret(log);
9
+ const content = Fr.random();
10
+ const inbox = getContract({
11
+ address: inboxAddress.toString(),
12
+ abi: InboxAbi,
13
+ client: l1Client
14
+ });
15
+ const txHash = await inbox.write.sendL2Message([
16
+ {
17
+ actor: l2Recipient.toString(),
18
+ version: rollupVersion
19
+ },
20
+ content.toString(),
21
+ secretHash.toString()
22
+ ], {
23
+ gas: 1_000_000n
24
+ });
25
+ log.info(`L1→L2 message sent in tx ${txHash}`);
26
+ const txReceipt = await l1Client.waitForTransactionReceipt({
27
+ hash: txHash
28
+ });
29
+ if (txReceipt.status !== 'success') {
30
+ throw new Error(`L1→L2 message tx failed: ${txHash}`);
31
+ }
32
+ // Extract MessageSent event
33
+ const messageSentLogs = compactArray(txReceipt.logs.filter((l)=>l.address.toLowerCase() === inboxAddress.toString().toLowerCase()).map((l)=>{
34
+ try {
35
+ return decodeEventLog({
36
+ abi: InboxAbi,
37
+ eventName: 'MessageSent',
38
+ data: l.data,
39
+ topics: l.topics
40
+ });
41
+ } catch {
42
+ return undefined;
43
+ }
44
+ }));
45
+ if (messageSentLogs.length !== 1) {
46
+ throw new Error(`Expected 1 MessageSent event, got ${messageSentLogs.length}`);
47
+ }
48
+ const event = messageSentLogs[0];
49
+ const msgHash = event.args.hash;
50
+ const globalLeafIndex = event.args.index;
51
+ const msg = {
52
+ content: content.toString(),
53
+ secret: secret.toString(),
54
+ secretHash: secretHash.toString(),
55
+ msgHash,
56
+ sender: l1Client.account.address,
57
+ globalLeafIndex: globalLeafIndex.toString(),
58
+ timestamp: Date.now()
59
+ };
60
+ await store.savePendingL1ToL2Message(msg);
61
+ log.info(`Seeded L1→L2 message msgHash=${msg.msgHash}`);
62
+ return msg;
63
+ }
package/dest/runner.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { AztecNode } from '@aztec/aztec.js/node';
2
2
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
3
3
  import { type TelemetryClient, type Traceable, type Tracer } from '@aztec/telemetry-client';
4
- import type { TestWallet } from '@aztec/test-wallet/server';
4
+ import type { EmbeddedWallet } from '@aztec/wallets/embedded';
5
5
  import type { BotConfig } from './config.js';
6
6
  import type { BotInfo, BotRunnerApi } from './interface.js';
7
7
  import { BotStore } from './store/index.js';
@@ -19,7 +19,7 @@ export declare class BotRunner implements BotRunnerApi, Traceable {
19
19
  private consecutiveErrors;
20
20
  private healthy;
21
21
  readonly tracer: Tracer;
22
- constructor(config: BotConfig, wallet: TestWallet, aztecNode: AztecNode, telemetry: TelemetryClient, aztecNodeAdmin: AztecNodeAdmin | undefined, store: BotStore);
22
+ constructor(config: BotConfig, wallet: EmbeddedWallet, aztecNode: AztecNode, telemetry: TelemetryClient, aztecNodeAdmin: AztecNodeAdmin | undefined, store: BotStore);
23
23
  /** Initializes the bot if needed. Blocks until the bot setup is finished. */
24
24
  setup(): Promise<void>;
25
25
  private doSetup;
@@ -50,4 +50,4 @@ export declare class BotRunner implements BotRunnerApi, Traceable {
50
50
  /** Returns the bot sender address. */
51
51
  getInfo(): Promise<BotInfo>;
52
52
  }
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcnVubmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR3RELE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBRSxLQUFLLFNBQVMsRUFBRSxLQUFLLE1BQU0sRUFBYSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZHLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBSzVELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLHFCQUFhLFNBQVUsWUFBVyxZQUFZLEVBQUUsU0FBUzs7SUFVckQsT0FBTyxDQUFDLE1BQU07SUFDZCxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07SUFDdkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTO0lBQzFCLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUztJQUMxQixPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWM7SUFDL0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLO0lBZHhCLE9BQU8sQ0FBQyxHQUFHLENBQXVCO0lBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBbUI7SUFDL0IsT0FBTyxDQUFDLGNBQWMsQ0FBaUI7SUFDdkMsT0FBTyxDQUFDLGlCQUFpQixDQUFLO0lBQzlCLE9BQU8sQ0FBQyxPQUFPLENBQVE7SUFFdkIsU0FBZ0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUUvQixZQUNVLE1BQU0sRUFBRSxTQUFTLEVBQ1IsTUFBTSxFQUFFLFVBQVUsRUFDbEIsU0FBUyxFQUFFLFNBQVMsRUFDcEIsU0FBUyxFQUFFLGVBQWUsRUFDMUIsY0FBYyxFQUFFLGNBQWMsR0FBRyxTQUFTLEVBQzFDLEtBQUssRUFBRSxRQUFRLEVBS2pDO0lBRUQsNkVBQTZFO0lBQ2hFLEtBQUssa0JBSWpCO1lBR2EsT0FBTztJQU1yQjs7O09BR0c7SUFDVSxLQUFLLGtCQU1qQjtJQUVEOztPQUVHO0lBQ1UsSUFBSSxrQkFPaEI7SUFFTSxTQUFTLFlBRWY7SUFFRCwwQ0FBMEM7SUFDbkMsU0FBUyxZQUVmO0lBRUQ7OztPQUdHO0lBQ1UsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLGlCQWFwQztJQUVEOzs7T0FHRztJQUNVLEdBQUcsa0JBc0JmO0lBRUQscURBQXFEO0lBQzlDLFNBQVMsdUJBR2Y7SUFFRCxzQ0FBc0M7SUFDekIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FNdkM7Q0F1Q0YifQ==
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcnVubmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR3RELE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBRSxLQUFLLFNBQVMsRUFBRSxLQUFLLE1BQU0sRUFBYSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZHLE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSzlELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU3QyxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLHFCQUFhLFNBQVUsWUFBVyxZQUFZLEVBQUUsU0FBUzs7SUFVckQsT0FBTyxDQUFDLE1BQU07SUFDZCxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07SUFDdkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTO0lBQzFCLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUztJQUMxQixPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWM7SUFDL0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLO0lBZHhCLE9BQU8sQ0FBQyxHQUFHLENBQXVCO0lBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBbUI7SUFDL0IsT0FBTyxDQUFDLGNBQWMsQ0FBaUI7SUFDdkMsT0FBTyxDQUFDLGlCQUFpQixDQUFLO0lBQzlCLE9BQU8sQ0FBQyxPQUFPLENBQVE7SUFFdkIsU0FBZ0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUUvQixZQUNVLE1BQU0sRUFBRSxTQUFTLEVBQ1IsTUFBTSxFQUFFLGNBQWMsRUFDdEIsU0FBUyxFQUFFLFNBQVMsRUFDcEIsU0FBUyxFQUFFLGVBQWUsRUFDMUIsY0FBYyxFQUFFLGNBQWMsR0FBRyxTQUFTLEVBQzFDLEtBQUssRUFBRSxRQUFRLEVBS2pDO0lBRUQsNkVBQTZFO0lBQ2hFLEtBQUssa0JBSWpCO1lBR2EsT0FBTztJQU1yQjs7O09BR0c7SUFDVSxLQUFLLGtCQU1qQjtJQUVEOztPQUVHO0lBQ1UsSUFBSSxrQkFPaEI7SUFFTSxTQUFTLFlBRWY7SUFFRCwwQ0FBMEM7SUFDbkMsU0FBUyxZQUVmO0lBRUQ7OztPQUdHO0lBQ1UsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLGlCQWFwQztJQUVEOzs7T0FHRztJQUNVLEdBQUcsa0JBc0JmO0lBRUQscURBQXFEO0lBQzlDLFNBQVMsdUJBR2Y7SUFFRCxzQ0FBc0M7SUFDekIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FNdkM7Q0FtREYifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,MAAM,EAAa,MAAM,yBAAyB,CAAC;AACvG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAK5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,qBAAa,SAAU,YAAW,YAAY,EAAE,SAAS;;IAUrD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAdxB,OAAO,CAAC,GAAG,CAAuB;IAClC,OAAO,CAAC,GAAG,CAAC,CAAmB;IAC/B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,OAAO,CAAQ;IAEvB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,YACU,MAAM,EAAE,SAAS,EACR,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,eAAe,EAC1B,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,KAAK,EAAE,QAAQ,EAKjC;IAED,6EAA6E;IAChE,KAAK,kBAIjB;YAGa,OAAO;IAMrB;;;OAGG;IACU,KAAK,kBAMjB;IAED;;OAEG;IACU,IAAI,kBAOhB;IAEM,SAAS,YAEf;IAED,0CAA0C;IACnC,SAAS,YAEf;IAED;;;OAGG;IACU,MAAM,CAAC,MAAM,EAAE,SAAS,iBAapC;IAED;;;OAGG;IACU,GAAG,kBAsBf;IAED,qDAAqD;IAC9C,SAAS,uBAGf;IAED,sCAAsC;IACzB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAMvC;CAuCF"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,MAAM,EAAa,MAAM,yBAAyB,CAAC;AACvG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAK9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,qBAAa,SAAU,YAAW,YAAY,EAAE,SAAS;;IAUrD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAdxB,OAAO,CAAC,GAAG,CAAuB;IAClC,OAAO,CAAC,GAAG,CAAC,CAAmB;IAC/B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,OAAO,CAAQ;IAEvB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,YACU,MAAM,EAAE,SAAS,EACR,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,eAAe,EAC1B,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,KAAK,EAAE,QAAQ,EAKjC;IAED,6EAA6E;IAChE,KAAK,kBAIjB;YAGa,OAAO;IAMrB;;;OAGG;IACU,KAAK,kBAMjB;IAED;;OAEG;IACU,IAAI,kBAOhB;IAEM,SAAS,YAEf;IAED,0CAA0C;IACnC,SAAS,YAEf;IAED;;;OAGG;IACU,MAAM,CAAC,MAAM,EAAE,SAAS,iBAapC;IAED;;;OAGG;IACU,GAAG,kBAsBf;IAED,qDAAqD;IAC9C,SAAS,uBAGf;IAED,sCAAsC;IACzB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAMvC;CAmDF"}