@aztec/bot 3.0.3-rc.3 → 3.9.9-nightly.20260312

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 +14 -15
  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 +39 -24
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +42 -14
  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 +172 -80
  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 +429 -31
  28. package/dest/store/bot_store.d.ts +31 -6
  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 +17 -14
  35. package/src/amm_bot.ts +26 -21
  36. package/src/base_bot.ts +13 -27
  37. package/src/bot.ts +10 -8
  38. package/src/config.ts +89 -58
  39. package/src/cross_chain_bot.ts +203 -0
  40. package/src/factory.ts +193 -63
  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,21 +1,26 @@
1
- import { SchnorrAccountContract } from '@aztec/accounts/schnorr';
2
1
  import { getInitialTestAccountsData } from '@aztec/accounts/testing';
3
2
  import { AztecAddress } from '@aztec/aztec.js/addresses';
4
- import { BatchCall } from '@aztec/aztec.js/contracts';
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';
6
+ import { deriveKeys } from '@aztec/aztec.js/keys';
7
7
  import { createLogger } from '@aztec/aztec.js/log';
8
8
  import { waitForL1ToL2MessageReady } from '@aztec/aztec.js/messaging';
9
+ import { waitForTx } from '@aztec/aztec.js/node';
9
10
  import { createEthereumChain } from '@aztec/ethereum/chain';
10
11
  import { createExtendedL1Client } from '@aztec/ethereum/client';
12
+ import { RollupContract } from '@aztec/ethereum/contracts';
11
13
  import { Fr } from '@aztec/foundation/curves/bn254';
14
+ import { EthAddress } from '@aztec/foundation/eth-address';
12
15
  import { Timer } from '@aztec/foundation/timer';
13
16
  import { AMMContract } from '@aztec/noir-contracts.js/AMM';
14
17
  import { PrivateTokenContract } from '@aztec/noir-contracts.js/PrivateToken';
15
18
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
19
+ import { TestContract } from '@aztec/noir-test-contracts.js/Test';
16
20
  import { GasSettings } from '@aztec/stdlib/gas';
17
21
  import { deriveSigningKey } from '@aztec/stdlib/keys';
18
22
  import { SupportedTokenContracts } from './config.js';
23
+ import { seedL1ToL2Message } from './l1_to_l2_seeding.js';
19
24
  import { getBalances, getPrivateBalance, isStandardTokenContract } from './utils.js';
20
25
  const MINT_BALANCE = 1e12;
21
26
  const MIN_BALANCE = 1e3;
@@ -39,7 +44,7 @@ export class BotFactory {
39
44
  * deploying the token contract, and minting tokens if necessary.
40
45
  */ async setup() {
41
46
  const defaultAccountAddress = await this.setupAccount();
42
- const recipient = (await this.wallet.createAccount()).address;
47
+ const recipient = (await this.wallet.createSchnorrAccount(Fr.random(), Fr.random())).address;
43
48
  const token = await this.setupToken(defaultAccountAddress);
44
49
  await this.mintTokens(token, defaultAccountAddress);
45
50
  return {
@@ -68,6 +73,65 @@ export class BotFactory {
68
73
  };
69
74
  }
70
75
  /**
76
+ * Initializes the cross-chain bot by deploying TestContract, creating an L1 client,
77
+ * seeding initial L1→L2 messages, and waiting for the first to be ready.
78
+ */ async setupCrossChain() {
79
+ const defaultAccountAddress = await this.setupAccount();
80
+ // Create L1 client (same pattern as bridgeL1FeeJuice)
81
+ const l1RpcUrls = this.config.l1RpcUrls;
82
+ if (!l1RpcUrls?.length) {
83
+ throw new Error('L1 RPC URLs required for cross-chain bot');
84
+ }
85
+ const mnemonicOrPrivateKey = this.config.l1PrivateKey?.getValue() ?? this.config.l1Mnemonic?.getValue();
86
+ if (!mnemonicOrPrivateKey) {
87
+ throw new Error('L1 mnemonic or private key required for cross-chain bot');
88
+ }
89
+ const { l1ChainId, l1ContractAddresses } = await this.aztecNode.getNodeInfo();
90
+ const chain = createEthereumChain(l1RpcUrls, l1ChainId);
91
+ const l1Client = createExtendedL1Client(chain.rpcUrls, mnemonicOrPrivateKey, chain.chainInfo);
92
+ // Fetch Rollup version (needed for Inbox L2Actor struct)
93
+ const rollupContract = new RollupContract(l1Client, l1ContractAddresses.rollupAddress.toString());
94
+ const rollupVersion = await rollupContract.getVersion();
95
+ // Deploy TestContract
96
+ const contract = await this.setupTestContract(defaultAccountAddress);
97
+ // Recover any pending messages from store (clean up stale ones first)
98
+ await this.store.cleanupOldPendingMessages();
99
+ const pendingMessages = await this.store.getUnconsumedL1ToL2Messages();
100
+ // Seed initial L1→L2 messages if pipeline is empty
101
+ const seedCount = Math.max(0, this.config.l1ToL2SeedCount - pendingMessages.length);
102
+ for(let i = 0; i < seedCount; i++){
103
+ await seedL1ToL2Message(l1Client, EthAddress.fromString(l1ContractAddresses.inboxAddress.toString()), contract.address, rollupVersion, this.store, this.log);
104
+ }
105
+ // Block until at least one message is ready
106
+ const allMessages = await this.store.getUnconsumedL1ToL2Messages();
107
+ if (allMessages.length > 0) {
108
+ this.log.info(`Waiting for first L1→L2 message to be ready...`);
109
+ const firstMsg = allMessages[0];
110
+ await waitForL1ToL2MessageReady(this.aztecNode, Fr.fromHexString(firstMsg.msgHash), {
111
+ timeoutSeconds: this.config.l1ToL2MessageTimeoutSeconds
112
+ });
113
+ this.log.info(`First L1→L2 message is ready`);
114
+ }
115
+ return {
116
+ wallet: this.wallet,
117
+ defaultAccountAddress,
118
+ contract,
119
+ node: this.aztecNode,
120
+ l1Client,
121
+ rollupVersion
122
+ };
123
+ }
124
+ async setupTestContract(deployer) {
125
+ const deployOpts = {
126
+ from: deployer,
127
+ contractAddressSalt: this.config.tokenSalt,
128
+ universalDeploy: true
129
+ };
130
+ const deploy = TestContract.deploy(this.wallet);
131
+ const instance = await this.registerOrDeployContract('TestContract', deploy, deployOpts);
132
+ return TestContract.at(instance.address, this.wallet);
133
+ }
134
+ /**
71
135
  * Checks if the sender account contract is initialized, and initializes it if necessary.
72
136
  * @returns The sender wallet.
73
137
  */ async setupAccount() {
@@ -83,14 +147,9 @@ export class BotFactory {
83
147
  async setupAccountWithPrivateKey(secret) {
84
148
  const salt = this.config.senderSalt ?? Fr.ONE;
85
149
  const signingKey = deriveSigningKey(secret);
86
- const accountData = {
87
- secret,
88
- salt,
89
- contract: new SchnorrAccountContract(signingKey)
90
- };
91
- const accountManager = await this.wallet.createAccount(accountData);
92
- const isInit = (await this.wallet.getContractMetadata(accountManager.address)).isContractInitialized;
93
- if (isInit) {
150
+ const accountManager = await this.wallet.createSchnorrAccount(secret, salt, signingKey);
151
+ const metadata = await this.wallet.getContractMetadata(accountManager.address);
152
+ if (metadata.isContractInitialized) {
94
153
  this.log.info(`Account at ${accountManager.address.toString()} already initialized`);
95
154
  const timer = new Timer();
96
155
  const address = accountManager.address;
@@ -103,22 +162,24 @@ export class BotFactory {
103
162
  const claim = await this.getOrCreateBridgeClaim(address);
104
163
  const paymentMethod = new FeeJuicePaymentMethodWithClaim(accountManager.address, claim);
105
164
  const deployMethod = await accountManager.getDeployMethod();
106
- const maxFeesPerGas = (await this.aztecNode.getCurrentBaseFees()).mul(1 + this.config.baseFeePadding);
165
+ const maxFeesPerGas = (await this.aztecNode.getCurrentMinFees()).mul(1 + this.config.minFeePadding);
107
166
  const gasSettings = GasSettings.default({
108
167
  maxFeesPerGas
109
168
  });
110
- const sentTx = deployMethod.send({
111
- from: AztecAddress.ZERO,
112
- fee: {
113
- gasSettings,
114
- paymentMethod
115
- }
116
- });
117
- const txHash = await sentTx.getTxHash();
118
- this.log.info(`Sent tx for account deployment with hash ${txHash.toString()}`);
119
- await this.withNoMinTxsPerBlock(()=>sentTx.wait({
169
+ await this.withNoMinTxsPerBlock(async ()=>{
170
+ const { txHash } = await deployMethod.send({
171
+ from: AztecAddress.ZERO,
172
+ fee: {
173
+ gasSettings,
174
+ paymentMethod
175
+ },
176
+ wait: NO_WAIT
177
+ });
178
+ this.log.info(`Sent tx for account deployment with hash ${txHash.toString()}`);
179
+ return waitForTx(this.aztecNode, txHash, {
120
180
  timeout: this.config.txMinedWaitSeconds
121
- }));
181
+ });
182
+ });
122
183
  this.log.info(`Account deployed at ${address}`);
123
184
  // Clean up the consumed bridge claim
124
185
  await this.store.deleteBridgeClaim(address);
@@ -127,12 +188,7 @@ export class BotFactory {
127
188
  }
128
189
  async setupTestAccount() {
129
190
  const [initialAccountData] = await getInitialTestAccountsData();
130
- const accountData = {
131
- secret: initialAccountData.secret,
132
- salt: initialAccountData.salt,
133
- contract: new SchnorrAccountContract(initialAccountData.signingKey)
134
- };
135
- const accountManager = await this.wallet.createAccount(accountData);
191
+ const accountManager = await this.wallet.createSchnorrAccount(initialAccountData.secret, initialAccountData.salt, initialAccountData.signingKey);
136
192
  return accountManager.address;
137
193
  }
138
194
  /**
@@ -141,47 +197,70 @@ export class BotFactory {
141
197
  * @returns The TokenContract instance.
142
198
  */ async setupToken(sender) {
143
199
  let deploy;
200
+ let tokenInstance;
144
201
  const deployOpts = {
145
202
  from: sender,
146
203
  contractAddressSalt: this.config.tokenSalt,
147
204
  universalDeploy: true
148
205
  };
206
+ let token;
149
207
  if (this.config.contract === SupportedTokenContracts.TokenContract) {
150
208
  deploy = TokenContract.deploy(this.wallet, sender, 'BotToken', 'BOT', 18);
209
+ tokenInstance = await deploy.getInstance(deployOpts);
210
+ token = TokenContract.at(tokenInstance.address, this.wallet);
151
211
  } else if (this.config.contract === SupportedTokenContracts.PrivateTokenContract) {
152
- deploy = PrivateTokenContract.deploy(this.wallet, MINT_BALANCE, sender);
212
+ // Generate keys for the contract since PrivateToken uses SinglePrivateMutable which requires keys
213
+ const tokenSecretKey = Fr.random();
214
+ const tokenPublicKeys = (await deriveKeys(tokenSecretKey)).publicKeys;
215
+ deploy = PrivateTokenContract.deployWithPublicKeys(tokenPublicKeys, this.wallet, MINT_BALANCE, sender);
153
216
  deployOpts.skipInstancePublication = true;
154
217
  deployOpts.skipClassPublication = true;
155
218
  deployOpts.skipInitialization = false;
219
+ // Register the contract with the secret key before deployment
220
+ tokenInstance = await deploy.getInstance(deployOpts);
221
+ token = PrivateTokenContract.at(tokenInstance.address, this.wallet);
222
+ await this.wallet.registerContract(tokenInstance, PrivateTokenContract.artifact, tokenSecretKey);
223
+ // The contract constructor initializes private storage vars that need the contract's own nullifier key.
224
+ deployOpts.additionalScopes = [
225
+ tokenInstance.address
226
+ ];
156
227
  } else {
157
228
  throw new Error(`Unsupported token contract type: ${this.config.contract}`);
158
229
  }
159
- const address = (await deploy.getInstance(deployOpts)).address;
160
- if ((await this.wallet.getContractMetadata(address)).isContractPublished) {
230
+ const address = tokenInstance?.address ?? (await deploy.getInstance(deployOpts)).address;
231
+ const metadata = await this.wallet.getContractMetadata(address);
232
+ if (metadata.isContractPublished) {
161
233
  this.log.info(`Token at ${address.toString()} already deployed`);
162
- return deploy.register();
234
+ await deploy.register();
163
235
  } else {
164
236
  this.log.info(`Deploying token contract at ${address.toString()}`);
165
- const sentTx = deploy.send(deployOpts);
166
- const txHash = await sentTx.getTxHash();
237
+ const { txHash } = await deploy.send({
238
+ ...deployOpts,
239
+ wait: NO_WAIT
240
+ });
167
241
  this.log.info(`Sent tx for token setup with hash ${txHash.toString()}`);
168
- return this.withNoMinTxsPerBlock(()=>sentTx.deployed({
242
+ await this.withNoMinTxsPerBlock(async ()=>{
243
+ await waitForTx(this.aztecNode, txHash, {
169
244
  timeout: this.config.txMinedWaitSeconds
170
- }));
245
+ });
246
+ return token;
247
+ });
171
248
  }
249
+ return token;
172
250
  }
173
251
  /**
174
252
  * Checks if the token contract is deployed and deploys it if necessary.
175
253
  * @param wallet - Wallet to deploy the token contract from.
176
254
  * @returns The TokenContract instance.
177
- */ setupTokenContract(deployer, contractAddressSalt, name, ticker, decimals = 18) {
255
+ */ async setupTokenContract(deployer, contractAddressSalt, name, ticker, decimals = 18) {
178
256
  const deployOpts = {
179
257
  from: deployer,
180
258
  contractAddressSalt,
181
259
  universalDeploy: true
182
260
  };
183
261
  const deploy = TokenContract.deploy(this.wallet, deployer, name, ticker, decimals);
184
- return this.registerOrDeployContract('Token - ' + name, deploy, deployOpts);
262
+ const instance = await this.registerOrDeployContract('Token - ' + name, deploy, deployOpts);
263
+ return TokenContract.at(instance.address, this.wallet);
185
264
  }
186
265
  async setupAmmContract(deployer, contractAddressSalt, token0, token1, lpToken) {
187
266
  const deployOpts = {
@@ -190,15 +269,16 @@ export class BotFactory {
190
269
  universalDeploy: true
191
270
  };
192
271
  const deploy = AMMContract.deploy(this.wallet, token0.address, token1.address, lpToken.address);
193
- const amm = await this.registerOrDeployContract('AMM', deploy, deployOpts);
272
+ const instance = await this.registerOrDeployContract('AMM', deploy, deployOpts);
273
+ const amm = AMMContract.at(instance.address, this.wallet);
194
274
  this.log.info(`AMM deployed at ${amm.address}`);
195
- const minterTx = lpToken.methods.set_minter(amm.address, true).send({
196
- from: deployer
197
- });
198
- this.log.info(`Set LP token minter to AMM txHash=${(await minterTx.getTxHash()).toString()}`);
199
- await minterTx.wait({
200
- timeout: this.config.txMinedWaitSeconds
275
+ const { receipt: minterReceipt } = await lpToken.methods.set_minter(amm.address, true).send({
276
+ from: deployer,
277
+ wait: {
278
+ timeout: this.config.txMinedWaitSeconds
279
+ }
201
280
  });
281
+ this.log.info(`Set LP token minter to AMM txHash=${minterReceipt.txHash.toString()}`);
202
282
  this.log.info(`Liquidity token initialized`);
203
283
  return amm;
204
284
  }
@@ -206,13 +286,13 @@ export class BotFactory {
206
286
  const getPrivateBalances = ()=>Promise.all([
207
287
  token0.methods.balance_of_private(liquidityProvider).simulate({
208
288
  from: liquidityProvider
209
- }),
289
+ }).then((r)=>r.result),
210
290
  token1.methods.balance_of_private(liquidityProvider).simulate({
211
291
  from: liquidityProvider
212
- }),
292
+ }).then((r)=>r.result),
213
293
  lpToken.methods.balance_of_private(liquidityProvider).simulate({
214
294
  from: liquidityProvider
215
- })
295
+ }).then((r)=>r.result)
216
296
  ]);
217
297
  const authwitNonce = Fr.random();
218
298
  // keep some tokens for swapping
@@ -231,45 +311,52 @@ export class BotFactory {
231
311
  caller: amm.address,
232
312
  call: await token1.methods.transfer_to_public_and_prepare_private_balance_increase(liquidityProvider, amm.address, amount1Max, authwitNonce).getFunctionCall()
233
313
  });
234
- const mintTx = new BatchCall(this.wallet, [
314
+ const { receipt: mintReceipt } = await new BatchCall(this.wallet, [
235
315
  token0.methods.mint_to_private(liquidityProvider, MINT_BALANCE),
236
316
  token1.methods.mint_to_private(liquidityProvider, MINT_BALANCE)
237
317
  ]).send({
238
- from: liquidityProvider
239
- });
240
- this.log.info(`Sent mint tx: ${(await mintTx.getTxHash()).toString()}`);
241
- await mintTx.wait({
242
- timeout: this.config.txMinedWaitSeconds
318
+ from: liquidityProvider,
319
+ wait: {
320
+ timeout: this.config.txMinedWaitSeconds
321
+ }
243
322
  });
244
- const addLiquidityTx = amm.methods.add_liquidity(amount0Max, amount1Max, amount0Min, amount1Min, authwitNonce).send({
323
+ this.log.info(`Sent mint tx: ${mintReceipt.txHash.toString()}`);
324
+ const { receipt: addLiquidityReceipt } = await amm.methods.add_liquidity(amount0Max, amount1Max, amount0Min, amount1Min, authwitNonce).send({
245
325
  from: liquidityProvider,
246
326
  authWitnesses: [
247
327
  token0Authwit,
248
328
  token1Authwit
249
- ]
250
- });
251
- this.log.info(`Sent tx to add liquidity to the AMM: ${(await addLiquidityTx.getTxHash()).toString()}`);
252
- await addLiquidityTx.wait({
253
- timeout: this.config.txMinedWaitSeconds
329
+ ],
330
+ wait: {
331
+ timeout: this.config.txMinedWaitSeconds
332
+ }
254
333
  });
334
+ this.log.info(`Sent tx to add liquidity to the AMM: ${addLiquidityReceipt.txHash.toString()}`);
255
335
  this.log.info(`Liquidity added`);
256
336
  const [newT0Bal, newT1Bal, newLPBal] = await getPrivateBalances();
257
337
  this.log.info(`Updated private balances of ${defaultAccountAddress} after minting and funding AMM: token0=${newT0Bal}, token1=${newT1Bal}, lp=${newLPBal}`);
258
338
  }
259
339
  async registerOrDeployContract(name, deploy, deployOpts) {
260
- const address = (await deploy.getInstance(deployOpts)).address;
261
- if ((await this.wallet.getContractMetadata(address)).isContractPublished) {
340
+ const instance = await deploy.getInstance(deployOpts);
341
+ const address = instance.address;
342
+ const metadata = await this.wallet.getContractMetadata(address);
343
+ if (metadata.isContractPublished) {
262
344
  this.log.info(`Contract ${name} at ${address.toString()} already deployed`);
263
- return deploy.register();
345
+ await deploy.register();
264
346
  } else {
265
347
  this.log.info(`Deploying contract ${name} at ${address.toString()}`);
266
- const sentTx = deploy.send(deployOpts);
267
- const txHash = await sentTx.getTxHash();
268
- this.log.info(`Sent contract ${name} setup tx with hash ${txHash.toString()}`);
269
- return this.withNoMinTxsPerBlock(()=>sentTx.deployed({
348
+ await this.withNoMinTxsPerBlock(async ()=>{
349
+ const { txHash } = await deploy.send({
350
+ ...deployOpts,
351
+ wait: NO_WAIT
352
+ });
353
+ this.log.info(`Sent contract ${name} setup tx with hash ${txHash.toString()}`);
354
+ return waitForTx(this.aztecNode, txHash, {
270
355
  timeout: this.config.txMinedWaitSeconds
271
- }));
356
+ });
357
+ });
272
358
  }
359
+ return instance;
273
360
  }
274
361
  /**
275
362
  * Mints private and public tokens for the sender if their balance is below the minimum.
@@ -296,14 +383,21 @@ export class BotFactory {
296
383
  this.log.info(`Skipping minting as ${minter.toString()} has enough tokens`);
297
384
  return;
298
385
  }
299
- const sentTx = new BatchCall(token.wallet, calls).send({
300
- from: minter
301
- });
302
- const txHash = await sentTx.getTxHash();
303
- this.log.info(`Sent token mint tx with hash ${txHash.toString()}`);
304
- await this.withNoMinTxsPerBlock(()=>sentTx.wait({
386
+ // PrivateToken's mint accesses contract-level private storage vars (admin, total_supply).
387
+ const additionalScopes = isStandardToken ? undefined : [
388
+ token.address
389
+ ];
390
+ await this.withNoMinTxsPerBlock(async ()=>{
391
+ const { txHash } = await new BatchCall(token.wallet, calls).send({
392
+ from: minter,
393
+ additionalScopes,
394
+ wait: NO_WAIT
395
+ });
396
+ this.log.info(`Sent token mint tx with hash ${txHash.toString()}`);
397
+ return waitForTx(this.aztecNode, txHash, {
305
398
  timeout: this.config.txMinedWaitSeconds
306
- }));
399
+ });
400
+ });
307
401
  }
308
402
  /**
309
403
  * Gets or creates a bridge claim for the recipient.
@@ -318,8 +412,7 @@ export class BotFactory {
318
412
  try {
319
413
  const messageHash = Fr.fromHexString(existingClaim.claim.messageHash);
320
414
  await this.withNoMinTxsPerBlock(()=>waitForL1ToL2MessageReady(this.aztecNode, messageHash, {
321
- timeoutSeconds: this.config.l1ToL2MessageTimeoutSeconds,
322
- forPublicConsumption: false
415
+ timeoutSeconds: this.config.l1ToL2MessageTimeoutSeconds
323
416
  }));
324
417
  return existingClaim.claim;
325
418
  } catch (err) {
@@ -347,8 +440,7 @@ export class BotFactory {
347
440
  const mintAmount = await portal.getTokenManager().getMintAmount();
348
441
  const claim = await portal.bridgeTokensPublic(recipient, mintAmount, true);
349
442
  await this.withNoMinTxsPerBlock(()=>waitForL1ToL2MessageReady(this.aztecNode, Fr.fromHexString(claim.messageHash), {
350
- timeoutSeconds: this.config.l1ToL2MessageTimeoutSeconds,
351
- forPublicConsumption: false
443
+ timeoutSeconds: this.config.l1ToL2MessageTimeoutSeconds
352
444
  }));
353
445
  this.log.info(`Created a claim for ${mintAmount} L1 fee juice to ${recipient}.`, claim);
354
446
  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"}