@aztec/prover-node 0.76.4-devnet-test → 0.76.4-devnet-test-rc3

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 (76) hide show
  1. package/dest/bond/bond-manager.d.ts +22 -0
  2. package/dest/bond/bond-manager.d.ts.map +1 -0
  3. package/dest/bond/bond-manager.js +42 -0
  4. package/dest/bond/config.d.ts +8 -0
  5. package/dest/bond/config.d.ts.map +1 -0
  6. package/dest/bond/config.js +17 -0
  7. package/dest/bond/escrow-contract.d.ts +19 -0
  8. package/dest/bond/escrow-contract.d.ts.map +1 -0
  9. package/dest/bond/escrow-contract.js +32 -0
  10. package/dest/bond/factory.d.ts +6 -0
  11. package/dest/bond/factory.d.ts.map +1 -0
  12. package/dest/bond/factory.js +17 -0
  13. package/dest/bond/index.d.ts +3 -0
  14. package/dest/bond/index.d.ts.map +1 -0
  15. package/dest/bond/index.js +3 -0
  16. package/dest/bond/token-contract.d.ts +26 -0
  17. package/dest/bond/token-contract.d.ts.map +1 -0
  18. package/dest/bond/token-contract.js +58 -0
  19. package/dest/config.d.ts +7 -1
  20. package/dest/config.d.ts.map +1 -1
  21. package/dest/config.js +23 -2
  22. package/dest/factory.d.ts.map +1 -1
  23. package/dest/factory.js +32 -3
  24. package/dest/job/epoch-proving-job.d.ts +0 -1
  25. package/dest/job/epoch-proving-job.d.ts.map +1 -1
  26. package/dest/job/epoch-proving-job.js +1 -4
  27. package/dest/monitors/claims-monitor.d.ts +24 -0
  28. package/dest/monitors/claims-monitor.d.ts.map +1 -0
  29. package/dest/monitors/claims-monitor.js +54 -0
  30. package/dest/monitors/epoch-monitor.d.ts +1 -0
  31. package/dest/monitors/epoch-monitor.d.ts.map +1 -1
  32. package/dest/monitors/epoch-monitor.js +2 -2
  33. package/dest/monitors/index.d.ts +1 -0
  34. package/dest/monitors/index.d.ts.map +1 -1
  35. package/dest/monitors/index.js +2 -1
  36. package/dest/prover-node-publisher.d.ts +7 -0
  37. package/dest/prover-node-publisher.d.ts.map +1 -1
  38. package/dest/prover-node-publisher.js +10 -9
  39. package/dest/prover-node.d.ts +26 -12
  40. package/dest/prover-node.d.ts.map +1 -1
  41. package/dest/prover-node.js +89 -24
  42. package/dest/quote-provider/http.d.ts +15 -0
  43. package/dest/quote-provider/http.d.ts.map +1 -0
  44. package/dest/quote-provider/http.js +33 -0
  45. package/dest/quote-provider/index.d.ts +6 -0
  46. package/dest/quote-provider/index.d.ts.map +1 -0
  47. package/dest/quote-provider/index.js +2 -0
  48. package/dest/quote-provider/simple.d.ts +9 -0
  49. package/dest/quote-provider/simple.d.ts.map +1 -0
  50. package/dest/quote-provider/simple.js +11 -0
  51. package/dest/quote-provider/utils.d.ts +4 -0
  52. package/dest/quote-provider/utils.d.ts.map +1 -0
  53. package/dest/quote-provider/utils.js +8 -0
  54. package/dest/quote-signer.d.ts +13 -0
  55. package/dest/quote-signer.d.ts.map +1 -0
  56. package/dest/quote-signer.js +18 -0
  57. package/package.json +20 -20
  58. package/src/bond/bond-manager.ts +48 -0
  59. package/src/bond/config.ts +25 -0
  60. package/src/bond/escrow-contract.ts +50 -0
  61. package/src/bond/factory.ts +28 -0
  62. package/src/bond/index.ts +2 -0
  63. package/src/bond/token-contract.ts +72 -0
  64. package/src/config.ts +37 -1
  65. package/src/factory.ts +40 -2
  66. package/src/job/epoch-proving-job.ts +0 -4
  67. package/src/monitors/claims-monitor.ts +69 -0
  68. package/src/monitors/epoch-monitor.ts +2 -1
  69. package/src/monitors/index.ts +1 -0
  70. package/src/prover-node-publisher.ts +10 -8
  71. package/src/prover-node.ts +106 -29
  72. package/src/quote-provider/http.ts +48 -0
  73. package/src/quote-provider/index.ts +8 -0
  74. package/src/quote-provider/simple.ts +15 -0
  75. package/src/quote-provider/utils.ts +10 -0
  76. package/src/quote-signer.ts +24 -0
@@ -0,0 +1,15 @@
1
+ import { type L2Block } from '@aztec/circuit-types';
2
+ import { type QuoteProvider, type QuoteProviderResult } from './index.js';
3
+ export declare class HttpQuoteProvider implements QuoteProvider {
4
+ private readonly url;
5
+ constructor(url: string);
6
+ getQuote(epochNumber: number, epoch: L2Block[]): Promise<QuoteProviderResult | undefined>;
7
+ }
8
+ export type HttpQuoteRequestPayload = {
9
+ epochNumber: number;
10
+ fromBlock: number;
11
+ toBlock: number;
12
+ totalFees: string;
13
+ txCount: number;
14
+ };
15
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/quote-provider/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAG1E,qBAAa,iBAAkB,YAAW,aAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,MAAM;IAE3B,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;CA8BvG;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { jsonStringify } from '@aztec/foundation/json-rpc';
2
+ import { getTotalFees, getTxCount } from './utils.js';
3
+ export class HttpQuoteProvider {
4
+ constructor(url) {
5
+ this.url = url;
6
+ }
7
+ async getQuote(epochNumber, epoch) {
8
+ const payload = {
9
+ epochNumber,
10
+ fromBlock: epoch[0].number,
11
+ toBlock: epoch.at(-1).number,
12
+ totalFees: getTotalFees(epoch).toString(),
13
+ txCount: getTxCount(epoch),
14
+ };
15
+ const response = await fetch(this.url, {
16
+ method: 'POST',
17
+ body: jsonStringify(payload),
18
+ headers: { 'content-type': 'application/json' },
19
+ });
20
+ if (!response.ok) {
21
+ throw new Error(`Failed to fetch quote: ${response.statusText}`);
22
+ }
23
+ const data = await response.json();
24
+ if (!data.basisPointFee || !data.bondAmount) {
25
+ throw new Error(`Missing required fields (basisPointFee | bondAmount) in response: ${jsonStringify(data)}`);
26
+ }
27
+ const basisPointFee = Number(data.basisPointFee);
28
+ const bondAmount = BigInt(data.bondAmount);
29
+ const validUntilSlot = data.validUntilSlot ? BigInt(data.validUntilSlot) : undefined;
30
+ return { basisPointFee, bondAmount, validUntilSlot };
31
+ }
32
+ }
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9xdW90ZS1wcm92aWRlci9odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUczRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV0RCxNQUFNLE9BQU8saUJBQWlCO0lBQzVCLFlBQTZCLEdBQVc7UUFBWCxRQUFHLEdBQUgsR0FBRyxDQUFRO0lBQUcsQ0FBQztJQUVyQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQW1CLEVBQUUsS0FBZ0I7UUFDekQsTUFBTSxPQUFPLEdBQTRCO1lBQ3ZDLFdBQVc7WUFDWCxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDMUIsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQyxNQUFNO1lBQzdCLFNBQVMsRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFO1lBQ3pDLE9BQU8sRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDO1NBQzNCLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3JDLE1BQU0sRUFBRSxNQUFNO1lBQ2QsSUFBSSxFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDNUIsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1NBQ2hELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMscUVBQXFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUcsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLENBQUM7SUFDdkQsQ0FBQztDQUNGIn0=
@@ -0,0 +1,6 @@
1
+ import { type EpochProofQuotePayload, type L2Block } from '@aztec/circuit-types';
2
+ export type QuoteProviderResult = Pick<EpochProofQuotePayload, 'basisPointFee' | 'bondAmount'> & Partial<Pick<EpochProofQuotePayload, 'validUntilSlot'>>;
3
+ export interface QuoteProvider {
4
+ getQuote(epochNumber: number, epoch: L2Block[]): Promise<QuoteProviderResult | undefined>;
5
+ }
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/quote-provider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sBAAsB,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEjF,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,EAAE,eAAe,GAAG,YAAY,CAAC,GAC5F,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAE1D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;CAC3F"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcXVvdGUtcHJvdmlkZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,9 @@
1
+ import { type EpochProofQuotePayload, type L2Block } from '@aztec/circuit-types';
2
+ import { type QuoteProvider } from './index.js';
3
+ export declare class SimpleQuoteProvider implements QuoteProvider {
4
+ readonly basisPointFee: number;
5
+ readonly bondAmount: bigint;
6
+ constructor(basisPointFee: number, bondAmount: bigint);
7
+ getQuote(_epochNumber: number, _epoch: L2Block[]): Promise<Pick<EpochProofQuotePayload, 'basisPointFee' | 'bondAmount'>>;
8
+ }
9
+ //# sourceMappingURL=simple.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple.d.ts","sourceRoot":"","sources":["../../src/quote-provider/simple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sBAAsB,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,qBAAa,mBAAoB,YAAW,aAAa;aAC3B,aAAa,EAAE,MAAM;aAAkB,UAAU,EAAE,MAAM;gBAAzD,aAAa,EAAE,MAAM,EAAkB,UAAU,EAAE,MAAM;IAErF,QAAQ,CACN,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,OAAO,EAAE,GAChB,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,eAAe,GAAG,YAAY,CAAC,CAAC;CAIzE"}
@@ -0,0 +1,11 @@
1
+ export class SimpleQuoteProvider {
2
+ constructor(basisPointFee, bondAmount) {
3
+ this.basisPointFee = basisPointFee;
4
+ this.bondAmount = bondAmount;
5
+ }
6
+ getQuote(_epochNumber, _epoch) {
7
+ const { basisPointFee, bondAmount } = this;
8
+ return Promise.resolve({ basisPointFee, bondAmount });
9
+ }
10
+ }
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3F1b3RlLXByb3ZpZGVyL3NpbXBsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLE9BQU8sbUJBQW1CO0lBQzlCLFlBQTRCLGFBQXFCLEVBQWtCLFVBQWtCO1FBQXpELGtCQUFhLEdBQWIsYUFBYSxDQUFRO1FBQWtCLGVBQVUsR0FBVixVQUFVLENBQVE7SUFBRyxDQUFDO0lBRXpGLFFBQVEsQ0FDTixZQUFvQixFQUNwQixNQUFpQjtRQUVqQixNQUFNLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQztRQUMzQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0NBQ0YifQ==
@@ -0,0 +1,4 @@
1
+ import { type L2Block } from '@aztec/circuit-types';
2
+ export declare function getTotalFees(epoch: L2Block[]): bigint;
3
+ export declare function getTxCount(epoch: L2Block[]): number;
4
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/quote-provider/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,UAE5C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,UAE1C"}
@@ -0,0 +1,8 @@
1
+ import { Fr } from '@aztec/circuits.js';
2
+ export function getTotalFees(epoch) {
3
+ return epoch.reduce((total, block) => total.add(block.header.totalFees), Fr.ZERO).toBigInt();
4
+ }
5
+ export function getTxCount(epoch) {
6
+ return epoch.reduce((total, block) => total + block.body.txEffects.length, 0);
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcXVvdGUtcHJvdmlkZXIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXhDLE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBZ0I7SUFDM0MsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUMvRixDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFnQjtJQUN6QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2hGLENBQUMifQ==
@@ -0,0 +1,13 @@
1
+ import { EpochProofQuote, type EpochProofQuotePayload } from '@aztec/circuit-types';
2
+ import { Buffer32 } from '@aztec/foundation/buffer';
3
+ import { Secp256k1Signer } from '@aztec/foundation/crypto';
4
+ import { type RollupAbi } from '@aztec/l1-artifacts';
5
+ import { type GetContractReturnType, type PublicClient } from 'viem';
6
+ export declare class QuoteSigner {
7
+ private readonly signer;
8
+ private readonly quoteToDigest;
9
+ constructor(signer: Secp256k1Signer, quoteToDigest: (payload: EpochProofQuotePayload) => Promise<Buffer32>);
10
+ static new(privateKey: Buffer32, rollupContract: GetContractReturnType<typeof RollupAbi, PublicClient>): QuoteSigner;
11
+ sign(payload: EpochProofQuotePayload): Promise<EpochProofQuote>;
12
+ }
13
+ //# sourceMappingURL=quote-signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quote-signer.d.ts","sourceRoot":"","sources":["../src/quote-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,YAAY,EAAE,MAAM,MAAM,CAAC;AAErE,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa;gBADb,MAAM,EAAE,eAAe,EACvB,aAAa,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,QAAQ,CAAC;IAGxF,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,qBAAqB,CAAC,OAAO,SAAS,EAAE,YAAY,CAAC,GAAG,WAAW;IAMvG,IAAI,CAAC,OAAO,EAAE,sBAAsB;CAIlD"}
@@ -0,0 +1,18 @@
1
+ import { EpochProofQuote } from '@aztec/circuit-types';
2
+ import { Buffer32 } from '@aztec/foundation/buffer';
3
+ import { Secp256k1Signer } from '@aztec/foundation/crypto';
4
+ export class QuoteSigner {
5
+ constructor(signer, quoteToDigest) {
6
+ this.signer = signer;
7
+ this.quoteToDigest = quoteToDigest;
8
+ }
9
+ static new(privateKey, rollupContract) {
10
+ const quoteToDigest = (payload) => rollupContract.read.quoteToDigest([payload.toViemArgs()]).then(Buffer32.fromString);
11
+ return new QuoteSigner(new Secp256k1Signer(privateKey), quoteToDigest);
12
+ }
13
+ async sign(payload) {
14
+ const digest = await this.quoteToDigest(payload);
15
+ return EpochProofQuote.new(digest, payload, this.signer);
16
+ }
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGUtc2lnbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3F1b3RlLXNpZ25lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUErQixNQUFNLHNCQUFzQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFLM0QsTUFBTSxPQUFPLFdBQVc7SUFDdEIsWUFDbUIsTUFBdUIsRUFDdkIsYUFBcUU7UUFEckUsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUFDdkIsa0JBQWEsR0FBYixhQUFhLENBQXdEO0lBQ3JGLENBQUM7SUFFSixNQUFNLENBQUMsR0FBRyxDQUFDLFVBQW9CLEVBQUUsY0FBcUU7UUFDcEcsTUFBTSxhQUFhLEdBQUcsQ0FBQyxPQUErQixFQUFFLEVBQUUsQ0FDeEQsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEYsT0FBTyxJQUFJLFdBQVcsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUErQjtRQUMvQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakQsT0FBTyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNELENBQUM7Q0FDRiJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/prover-node",
3
- "version": "0.76.4-devnet-test",
3
+ "version": "0.76.4-devnet-test-rc3",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -53,25 +53,25 @@
53
53
  ]
54
54
  },
55
55
  "dependencies": {
56
- "@aztec/archiver": "0.76.4-devnet-test",
57
- "@aztec/bb-prover": "0.76.4-devnet-test",
58
- "@aztec/blob-sink": "0.76.4-devnet-test",
59
- "@aztec/circuit-types": "0.76.4-devnet-test",
60
- "@aztec/circuits.js": "0.76.4-devnet-test",
61
- "@aztec/epoch-cache": "0.76.4-devnet-test",
62
- "@aztec/ethereum": "0.76.4-devnet-test",
63
- "@aztec/foundation": "0.76.4-devnet-test",
64
- "@aztec/kv-store": "0.76.4-devnet-test",
65
- "@aztec/l1-artifacts": "0.76.4-devnet-test",
66
- "@aztec/noir-protocol-circuits-types": "0.76.4-devnet-test",
67
- "@aztec/p2p": "0.76.4-devnet-test",
68
- "@aztec/protocol-contracts": "0.76.4-devnet-test",
69
- "@aztec/prover-client": "0.76.4-devnet-test",
70
- "@aztec/sequencer-client": "0.76.4-devnet-test",
71
- "@aztec/simulator": "0.76.4-devnet-test",
72
- "@aztec/telemetry-client": "0.76.4-devnet-test",
73
- "@aztec/types": "0.76.4-devnet-test",
74
- "@aztec/world-state": "0.76.4-devnet-test",
56
+ "@aztec/archiver": "0.76.4-devnet-test-rc3",
57
+ "@aztec/bb-prover": "0.76.4-devnet-test-rc3",
58
+ "@aztec/blob-sink": "0.76.4-devnet-test-rc3",
59
+ "@aztec/circuit-types": "0.76.4-devnet-test-rc3",
60
+ "@aztec/circuits.js": "0.76.4-devnet-test-rc3",
61
+ "@aztec/epoch-cache": "0.76.4-devnet-test-rc3",
62
+ "@aztec/ethereum": "0.76.4-devnet-test-rc3",
63
+ "@aztec/foundation": "0.76.4-devnet-test-rc3",
64
+ "@aztec/kv-store": "0.76.4-devnet-test-rc3",
65
+ "@aztec/l1-artifacts": "0.76.4-devnet-test-rc3",
66
+ "@aztec/noir-protocol-circuits-types": "0.76.4-devnet-test-rc3",
67
+ "@aztec/p2p": "0.76.4-devnet-test-rc3",
68
+ "@aztec/protocol-contracts": "0.76.4-devnet-test-rc3",
69
+ "@aztec/prover-client": "0.76.4-devnet-test-rc3",
70
+ "@aztec/sequencer-client": "0.76.4-devnet-test-rc3",
71
+ "@aztec/simulator": "0.76.4-devnet-test-rc3",
72
+ "@aztec/telemetry-client": "0.76.4-devnet-test-rc3",
73
+ "@aztec/types": "0.76.4-devnet-test-rc3",
74
+ "@aztec/world-state": "0.76.4-devnet-test-rc3",
75
75
  "source-map-support": "^0.5.21",
76
76
  "tslib": "^2.4.0",
77
77
  "viem": "2.22.8"
@@ -0,0 +1,48 @@
1
+ import { createLogger } from '@aztec/foundation/log';
2
+
3
+ import { type EscrowContract } from './escrow-contract.js';
4
+ import { type TokenContract } from './token-contract.js';
5
+
6
+ export class BondManager {
7
+ private readonly logger = createLogger('prover-node:bond-manager');
8
+
9
+ constructor(
10
+ private readonly tokenContract: TokenContract,
11
+ private readonly escrowContract: EscrowContract,
12
+ /** Minimum escrowed bond. A top-up will be issued once this threshold is hit. */
13
+ public minimumAmount: bigint,
14
+ /** Target escrowed bond. Top-up will target this value. */
15
+ public targetAmount: bigint,
16
+ ) {}
17
+
18
+ /**
19
+ * Ensures the bond is at least minimumBond, or sends a tx to deposit the remaining to reach targetBond.
20
+ * @param overrideMinimum - Override the minimum bond threshold. Also overrides target if it is higher.
21
+ */
22
+ public async ensureBond(overrideMinimum?: bigint) {
23
+ const minimum = overrideMinimum ?? this.minimumAmount;
24
+ const target = overrideMinimum && overrideMinimum > this.targetAmount ? overrideMinimum : this.targetAmount;
25
+
26
+ try {
27
+ const current = await this.escrowContract.getProverDeposit();
28
+ if (current >= minimum) {
29
+ this.logger.debug(`Current prover bond ${current} is above minimum ${minimum}`);
30
+ return;
31
+ }
32
+
33
+ const topUpAmount = target - current;
34
+ this.logger.verbose(`Prover bond top-up ${topUpAmount} required to get ${current} to target ${target}`);
35
+
36
+ const balance = await this.tokenContract.getBalance();
37
+ if (balance < topUpAmount) {
38
+ throw new Error(`Not enough balance to top-up prover bond: ${balance} < ${topUpAmount}`);
39
+ }
40
+
41
+ await this.tokenContract.ensureAllowance(this.escrowContract.getEscrowAddress());
42
+ await this.escrowContract.depositProverBond(topUpAmount);
43
+ this.logger.verbose(`Prover bond top-up of ${topUpAmount} completed`);
44
+ } catch (err) {
45
+ throw new Error(`Could not set prover bond: ${err}`);
46
+ }
47
+ }
48
+ }
@@ -0,0 +1,25 @@
1
+ import { type ConfigMappingsType, bigintConfigHelper, getConfigFromMappings } from '@aztec/foundation/config';
2
+
3
+ export type ProverBondManagerConfig = {
4
+ proverMinimumEscrowAmount: bigint;
5
+ proverTargetEscrowAmount?: bigint;
6
+ };
7
+
8
+ export const proverBondManagerConfigMappings: ConfigMappingsType<ProverBondManagerConfig> = {
9
+ proverMinimumEscrowAmount: {
10
+ env: 'PROVER_MINIMUM_ESCROW_AMOUNT',
11
+ description:
12
+ 'Minimum amount to ensure is staked in the escrow contract for this prover. Prover node will top up whenever escrow falls below this number.',
13
+ ...bigintConfigHelper(100000n),
14
+ },
15
+ proverTargetEscrowAmount: {
16
+ env: 'PROVER_TARGET_ESCROW_AMOUNT',
17
+ description:
18
+ 'Target amount to ensure is staked in the escrow contract for this prover. Prover node will top up to this value. Defaults to twice the minimum amount.',
19
+ ...bigintConfigHelper(),
20
+ },
21
+ };
22
+
23
+ export function getProverBondManagerConfigFromEnv(): ProverBondManagerConfig {
24
+ return getConfigFromMappings<ProverBondManagerConfig>(proverBondManagerConfigMappings);
25
+ }
@@ -0,0 +1,50 @@
1
+ import { EthAddress } from '@aztec/circuits.js';
2
+ import { type L1Clients } from '@aztec/ethereum';
3
+ import { IProofCommitmentEscrowAbi } from '@aztec/l1-artifacts';
4
+
5
+ import {
6
+ type Chain,
7
+ type GetContractReturnType,
8
+ type HttpTransport,
9
+ type PrivateKeyAccount,
10
+ type WalletClient,
11
+ getContract,
12
+ } from 'viem';
13
+
14
+ export class EscrowContract {
15
+ private escrow: GetContractReturnType<
16
+ typeof IProofCommitmentEscrowAbi,
17
+ WalletClient<HttpTransport, Chain, PrivateKeyAccount>
18
+ >;
19
+
20
+ constructor(private readonly client: L1Clients['walletClient'], address: EthAddress) {
21
+ this.escrow = getContract({ address: address.toString(), abi: IProofCommitmentEscrowAbi, client });
22
+ }
23
+
24
+ /** Returns the deposit of the publisher sender address on the proof commitment escrow contract. */
25
+ public async getProverDeposit() {
26
+ return await this.escrow.read.deposits([this.getSenderAddress().toString()]);
27
+ }
28
+
29
+ /**
30
+ * Deposits the given amount of tokens into the proof commitment escrow contract. Returns once the tx is mined.
31
+ * @param amount - The amount to deposit.
32
+ */
33
+ public async depositProverBond(amount: bigint) {
34
+ const hash = await this.escrow.write.deposit([amount]);
35
+ await this.client.waitForTransactionReceipt({ hash });
36
+ }
37
+
38
+ /** Returns the sender address for the client. */
39
+ public getSenderAddress(): EthAddress {
40
+ return EthAddress.fromString(this.client.account.address);
41
+ }
42
+
43
+ public getEscrowAddress(): EthAddress {
44
+ return EthAddress.fromString(this.escrow.address);
45
+ }
46
+
47
+ public async getTokenAddress(): Promise<EthAddress> {
48
+ return EthAddress.fromString(await this.escrow.read.token());
49
+ }
50
+ }
@@ -0,0 +1,28 @@
1
+ import { type EthAddress } from '@aztec/circuits.js';
2
+ import { type L1Clients } from '@aztec/ethereum';
3
+ import { compact } from '@aztec/foundation/collection';
4
+
5
+ import { BondManager } from './bond-manager.js';
6
+ import { type ProverBondManagerConfig, getProverBondManagerConfigFromEnv } from './config.js';
7
+ import { EscrowContract } from './escrow-contract.js';
8
+ import { TokenContract } from './token-contract.js';
9
+
10
+ export async function createBondManager(
11
+ escrowContractAddress: EthAddress,
12
+ client: L1Clients['walletClient'],
13
+ overrides: Partial<ProverBondManagerConfig> = {},
14
+ ) {
15
+ const config = { ...getProverBondManagerConfigFromEnv(), ...compact(overrides) };
16
+ const { proverMinimumEscrowAmount: minimumStake, proverTargetEscrowAmount: maybeTargetStake } = config;
17
+ const targetStake = maybeTargetStake ?? minimumStake * 2n;
18
+
19
+ const escrow = new EscrowContract(client, escrowContractAddress);
20
+
21
+ const tokenContractAddress = await escrow.getTokenAddress();
22
+ const token = new TokenContract(client, tokenContractAddress);
23
+
24
+ // Ensure the prover has enough balance to cover escrow and try to mint otherwise if on a dev environment
25
+ await token.ensureBalance(targetStake * 2n);
26
+
27
+ return new BondManager(token, escrow, minimumStake, targetStake);
28
+ }
@@ -0,0 +1,2 @@
1
+ export { BondManager } from './bond-manager.js';
2
+ export * from './factory.js';
@@ -0,0 +1,72 @@
1
+ import { EthAddress } from '@aztec/circuits.js';
2
+ import { type L1Clients } from '@aztec/ethereum';
3
+ import { createLogger } from '@aztec/foundation/log';
4
+ import { IERC20Abi, TestERC20Abi } from '@aztec/l1-artifacts';
5
+
6
+ import {
7
+ type Chain,
8
+ type GetContractReturnType,
9
+ type HttpTransport,
10
+ type PrivateKeyAccount,
11
+ type WalletClient,
12
+ getContract,
13
+ } from 'viem';
14
+
15
+ const MAX_ALLOWANCE = (1n << 256n) - 1n;
16
+ const MIN_ALLOWANCE = 1n << 255n;
17
+
18
+ export class TokenContract {
19
+ private token: GetContractReturnType<typeof IERC20Abi, WalletClient<HttpTransport, Chain, PrivateKeyAccount>>;
20
+ private logger = createLogger('prover-node:token-contract');
21
+
22
+ constructor(private readonly client: L1Clients['walletClient'], address: EthAddress) {
23
+ this.token = getContract({ address: address.toString(), abi: IERC20Abi, client });
24
+ }
25
+
26
+ /**
27
+ * Ensures the allowed address has near-maximum allowance, or sets it otherwise.
28
+ * Returns once allowance tx is mined successfully.
29
+ * @param allowed - Who to allow.
30
+ */
31
+ public async ensureAllowance(allowed: EthAddress) {
32
+ const allowance = await this.token.read.allowance([this.getSenderAddress().toString(), allowed.toString()]);
33
+ if (allowance < MIN_ALLOWANCE) {
34
+ this.logger.verbose(`Approving max allowance for ${allowed.toString()}`);
35
+ const hash = await this.token.write.approve([allowed.toString(), MAX_ALLOWANCE]);
36
+ await this.client.waitForTransactionReceipt({ hash });
37
+ }
38
+ }
39
+
40
+ /**
41
+ * Checks the sender address has enough balance.
42
+ * If it doesn't, it tries calling a `mint` method, available on testing environments.
43
+ * If it can't, it throws an error.
44
+ * @param amount - The balance to ensure.
45
+ */
46
+ public async ensureBalance(amount: bigint) {
47
+ const balance = await this.getBalance();
48
+ if (balance < amount) {
49
+ this.logger.verbose(`Balance ${balance} is below required ${amount}. Attempting mint.`);
50
+ const testToken = getContract({ address: this.token.address, abi: TestERC20Abi, client: this.client });
51
+ try {
52
+ await testToken.simulate.mint([this.getSenderAddress().toString(), amount - balance]);
53
+ const hash = await testToken.write.mint([this.getSenderAddress().toString(), amount - balance]);
54
+ await this.client.waitForTransactionReceipt({ hash });
55
+ this.logger.verbose(`Minted ${amount - balance} test tokens`);
56
+ } catch (err) {
57
+ this.logger.warn(`Error minting test tokens: ${err}`);
58
+ throw new Error(`Insufficient balance for ${this.getSenderAddress().toString()}: ${balance} < ${amount}`);
59
+ }
60
+ }
61
+ }
62
+
63
+ /** Returns the sender address. */
64
+ public getSenderAddress(): EthAddress {
65
+ return EthAddress.fromString(this.client.account.address);
66
+ }
67
+
68
+ /** Returns the balance of the sender. */
69
+ public async getBalance() {
70
+ return await this.token.read.balanceOf([this.getSenderAddress().toString()]);
71
+ }
72
+ }
package/src/config.ts CHANGED
@@ -1,6 +1,11 @@
1
1
  import { type ArchiverConfig, archiverConfigMappings, getArchiverConfigFromEnv } from '@aztec/archiver/config';
2
2
  import { type ACVMConfig, type BBConfig } from '@aztec/bb-prover/config';
3
- import { type ConfigMappingsType, getConfigFromMappings, numberConfigHelper } from '@aztec/foundation/config';
3
+ import {
4
+ type ConfigMappingsType,
5
+ bigintConfigHelper,
6
+ getConfigFromMappings,
7
+ numberConfigHelper,
8
+ } from '@aztec/foundation/config';
4
9
  import { type DataStoreConfig, dataConfigMappings, getDataConfigFromEnv } from '@aztec/kv-store/config';
5
10
  import { type P2PConfig, getP2PConfigFromEnv, p2pConfigMappings } from '@aztec/p2p/config';
6
11
  import {
@@ -25,6 +30,7 @@ import {
25
30
  } from '@aztec/sequencer-client/config';
26
31
  import { type WorldStateConfig, getWorldStateConfigFromEnv, worldStateConfigMappings } from '@aztec/world-state/config';
27
32
 
33
+ import { type ProverBondManagerConfig, proverBondManagerConfigMappings } from './bond/config.js';
28
34
  import {
29
35
  type ProverCoordinationConfig,
30
36
  getTxProviderConfigFromEnv,
@@ -39,6 +45,8 @@ export type ProverNodeConfig = ArchiverConfig &
39
45
  TxSenderConfig &
40
46
  DataStoreConfig &
41
47
  ProverCoordinationConfig &
48
+ ProverBondManagerConfig &
49
+ QuoteProviderConfig &
42
50
  SpecificProverNodeConfig;
43
51
 
44
52
  type SpecificProverNodeConfig = {
@@ -50,6 +58,12 @@ type SpecificProverNodeConfig = {
50
58
  txGatheringMaxParallelRequests: number;
51
59
  };
52
60
 
61
+ export type QuoteProviderConfig = {
62
+ quoteProviderBasisPointFee: number;
63
+ quoteProviderBondAmount: bigint;
64
+ quoteProviderUrl?: string;
65
+ };
66
+
53
67
  const specificProverNodeConfigMappings: ConfigMappingsType<SpecificProverNodeConfig> = {
54
68
  proverNodeMaxPendingJobs: {
55
69
  env: 'PROVER_NODE_MAX_PENDING_JOBS',
@@ -83,6 +97,24 @@ const specificProverNodeConfigMappings: ConfigMappingsType<SpecificProverNodeCon
83
97
  },
84
98
  };
85
99
 
100
+ const quoteProviderConfigMappings: ConfigMappingsType<QuoteProviderConfig> = {
101
+ quoteProviderBasisPointFee: {
102
+ env: 'QUOTE_PROVIDER_BASIS_POINT_FEE',
103
+ description: 'The basis point fee to charge for providing quotes',
104
+ ...numberConfigHelper(100),
105
+ },
106
+ quoteProviderBondAmount: {
107
+ env: 'QUOTE_PROVIDER_BOND_AMOUNT',
108
+ description: 'The bond amount to charge for providing quotes',
109
+ ...bigintConfigHelper(1000n),
110
+ },
111
+ quoteProviderUrl: {
112
+ env: 'QUOTE_PROVIDER_URL',
113
+ description:
114
+ 'The URL of the remote quote provider. Overrides QUOTE_PROVIDER_BASIS_POINT_FEE and QUOTE_PROVIDER_BOND_AMOUNT.',
115
+ },
116
+ };
117
+
86
118
  export const proverNodeConfigMappings: ConfigMappingsType<ProverNodeConfig> = {
87
119
  ...dataConfigMappings,
88
120
  ...archiverConfigMappings,
@@ -92,6 +124,8 @@ export const proverNodeConfigMappings: ConfigMappingsType<ProverNodeConfig> = {
92
124
  ...getPublisherConfigMappings('PROVER'),
93
125
  ...getTxSenderConfigMappings('PROVER'),
94
126
  ...proverCoordinationConfigMappings,
127
+ ...quoteProviderConfigMappings,
128
+ ...proverBondManagerConfigMappings,
95
129
  ...specificProverNodeConfigMappings,
96
130
  };
97
131
 
@@ -105,7 +139,9 @@ export function getProverNodeConfigFromEnv(): ProverNodeConfig {
105
139
  ...getPublisherConfigFromEnv('PROVER'),
106
140
  ...getTxSenderConfigFromEnv('PROVER'),
107
141
  ...getTxProviderConfigFromEnv(),
142
+ ...getConfigFromMappings(quoteProviderConfigMappings),
108
143
  ...getConfigFromMappings(specificProverNodeConfigMappings),
144
+ ...getConfigFromMappings(proverBondManagerConfigMappings),
109
145
  };
110
146
  }
111
147
 
package/src/factory.ts CHANGED
@@ -3,18 +3,28 @@ import { type BlobSinkClientInterface, createBlobSinkClient } from '@aztec/blob-
3
3
  import { type ProverCoordination, type ProvingJobBroker } from '@aztec/circuit-types';
4
4
  import { EpochCache } from '@aztec/epoch-cache';
5
5
  import { L1TxUtils, RollupContract, createEthereumChain, createL1Clients } from '@aztec/ethereum';
6
+ import { Buffer32 } from '@aztec/foundation/buffer';
7
+ import { EthAddress } from '@aztec/foundation/eth-address';
6
8
  import { type Logger, createLogger } from '@aztec/foundation/log';
7
9
  import { type DataStoreConfig } from '@aztec/kv-store/config';
10
+ import { RollupAbi } from '@aztec/l1-artifacts';
8
11
  import { createProverClient } from '@aztec/prover-client';
9
12
  import { createAndStartProvingBroker } from '@aztec/prover-client/broker';
10
13
  import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
11
14
  import { createWorldStateSynchronizer } from '@aztec/world-state';
12
15
 
13
- import { type ProverNodeConfig } from './config.js';
16
+ import { createPublicClient, getAddress, getContract, http } from 'viem';
17
+
18
+ import { createBondManager } from './bond/factory.js';
19
+ import { type ProverNodeConfig, type QuoteProviderConfig } from './config.js';
20
+ import { ClaimsMonitor } from './monitors/claims-monitor.js';
14
21
  import { EpochMonitor } from './monitors/epoch-monitor.js';
15
22
  import { createProverCoordination } from './prover-coordination/factory.js';
16
23
  import { ProverNodePublisher } from './prover-node-publisher.js';
17
24
  import { ProverNode, type ProverNodeOptions } from './prover-node.js';
25
+ import { HttpQuoteProvider } from './quote-provider/http.js';
26
+ import { SimpleQuoteProvider } from './quote-provider/simple.js';
27
+ import { QuoteSigner } from './quote-signer.js';
18
28
 
19
29
  /** Creates a new prover node given a config. */
20
30
  export async function createProverNode(
@@ -54,7 +64,7 @@ export async function createProverNode(
54
64
 
55
65
  const epochCache = await EpochCache.create(config.l1Contracts.rollupAddress, config);
56
66
 
57
- // If config.p2pEnabled is true, createProverCoordination will create a p2p client where txs are requested
67
+ // If config.p2pEnabled is true, createProverCoordination will create a p2p client where quotes will be shared and tx's requested
58
68
  // If config.p2pEnabled is false, createProverCoordination request information from the AztecNode
59
69
  const proverCoordination = await createProverCoordination(config, {
60
70
  aztecNodeTxProvider: deps.aztecNodeTxProvider,
@@ -64,6 +74,9 @@ export async function createProverNode(
64
74
  telemetry,
65
75
  });
66
76
 
77
+ const quoteProvider = createQuoteProvider(config);
78
+ const quoteSigner = createQuoteSigner(config);
79
+
67
80
  const proverNodeConfig: ProverNodeOptions = {
68
81
  maxPendingJobs: config.proverNodeMaxPendingJobs,
69
82
  pollingIntervalMs: config.proverNodePollingIntervalMs,
@@ -73,8 +86,12 @@ export async function createProverNode(
73
86
  txGatheringTimeoutMs: config.txGatheringTimeoutMs,
74
87
  };
75
88
 
89
+ const claimsMonitor = new ClaimsMonitor(publisher, proverNodeConfig, telemetry);
76
90
  const epochMonitor = new EpochMonitor(archiver, proverNodeConfig, telemetry);
77
91
 
92
+ const escrowContractAddress = await rollupContract.getProofCommitmentEscrow();
93
+ const bondManager = await createBondManager(EthAddress.fromString(escrowContractAddress), walletClient, config);
94
+
78
95
  return new ProverNode(
79
96
  prover,
80
97
  publisher,
@@ -83,8 +100,29 @@ export async function createProverNode(
83
100
  archiver,
84
101
  worldStateSynchronizer,
85
102
  proverCoordination,
103
+ quoteProvider,
104
+ quoteSigner,
105
+ claimsMonitor,
86
106
  epochMonitor,
107
+ bondManager,
87
108
  proverNodeConfig,
88
109
  telemetry,
89
110
  );
90
111
  }
112
+
113
+ function createQuoteProvider(config: QuoteProviderConfig) {
114
+ return config.quoteProviderUrl
115
+ ? new HttpQuoteProvider(config.quoteProviderUrl)
116
+ : new SimpleQuoteProvider(config.quoteProviderBasisPointFee, config.quoteProviderBondAmount);
117
+ }
118
+
119
+ function createQuoteSigner(config: ProverNodeConfig) {
120
+ // REFACTOR: We need a package that just returns an instance of a rollup contract ready to use
121
+ const { l1RpcUrl: rpcUrl, l1ChainId: chainId, l1Contracts } = config;
122
+ const chain = createEthereumChain(rpcUrl, chainId);
123
+ const client = createPublicClient({ chain: chain.chainInfo, transport: http(chain.rpcUrl) });
124
+ const address = getAddress(l1Contracts.rollupAddress.toString());
125
+ const rollupContract = getContract({ address, abi: RollupAbi, client });
126
+ const privateKey = config.publisherPrivateKey;
127
+ return QuoteSigner.new(Buffer32.fromString(privateKey), rollupContract);
128
+ }
@@ -63,10 +63,6 @@ export class EpochProvingJob implements Traceable {
63
63
  return this.state;
64
64
  }
65
65
 
66
- public getEpochNumber(): bigint {
67
- return this.epochNumber;
68
- }
69
-
70
66
  /**
71
67
  * Proves the given epoch and submits the proof to L1.
72
68
  */