@aztec/aztec.js 0.6.7 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/Dockerfile +15 -0
  2. package/package.json +6 -6
  3. package/src/abis/ecdsa_account_contract.json +2 -2
  4. package/src/abis/schnorr_account_contract.json +2 -2
  5. package/src/abis/schnorr_auth_witness_account_contract.json +542 -3
  6. package/src/abis/schnorr_single_key_account_contract.json +1 -1
  7. package/src/account/entrypoint/auth_witness_account_entrypoint.ts +41 -22
  8. package/src/account/entrypoint/entrypoint_payload.ts +1 -1
  9. package/src/account/entrypoint/index.ts +2 -10
  10. package/src/account/entrypoint/single_key_account_entrypoint.ts +2 -9
  11. package/src/account/entrypoint/stored_key_account_entrypoint.ts +2 -9
  12. package/src/aztec_rpc_client/wallet.ts +28 -13
  13. package/src/contract/base_contract_interaction.ts +0 -5
  14. package/src/contract/batch_call.ts +3 -4
  15. package/src/contract/contract.test.ts +2 -4
  16. package/src/contract/contract.ts +23 -0
  17. package/src/contract/contract_base.ts +14 -2
  18. package/src/contract/contract_function_interaction.ts +2 -3
  19. package/src/contract_deployer/contract_deployer.test.ts +1 -3
  20. package/src/contract_deployer/contract_deployer.ts +1 -1
  21. package/src/sandbox/index.ts +6 -19
  22. package/src/utils/account.ts +35 -79
  23. package/src/utils/cheat_codes.ts +3 -3
  24. package/.tsbuildinfo +0 -1
  25. package/dest/abis/ecdsa_account_contract.json +0 -160
  26. package/dest/abis/schnorr_account_contract.json +0 -148
  27. package/dest/abis/schnorr_auth_witness_account_contract.json +0 -104
  28. package/dest/abis/schnorr_single_key_account_contract.json +0 -103
  29. package/dest/account/account.d.ts +0 -72
  30. package/dest/account/account.d.ts.map +0 -1
  31. package/dest/account/account.js +0 -115
  32. package/dest/account/contract/auth_witness_account_contract.d.ts +0 -17
  33. package/dest/account/contract/auth_witness_account_contract.d.ts.map +0 -1
  34. package/dest/account/contract/auth_witness_account_contract.js +0 -23
  35. package/dest/account/contract/ecdsa_account_contract.d.ts +0 -16
  36. package/dest/account/contract/ecdsa_account_contract.d.ts.map +0 -1
  37. package/dest/account/contract/ecdsa_account_contract.js +0 -24
  38. package/dest/account/contract/index.d.ts +0 -28
  39. package/dest/account/contract/index.d.ts.map +0 -1
  40. package/dest/account/contract/index.js +0 -6
  41. package/dest/account/contract/schnorr_account_contract.d.ts +0 -16
  42. package/dest/account/contract/schnorr_account_contract.d.ts.map +0 -1
  43. package/dest/account/contract/schnorr_account_contract.js +0 -25
  44. package/dest/account/contract/single_key_account_contract.d.ts +0 -16
  45. package/dest/account/contract/single_key_account_contract.d.ts.map +0 -1
  46. package/dest/account/contract/single_key_account_contract.js +0 -21
  47. package/dest/account/deploy_account_sent_tx.d.ts +0 -28
  48. package/dest/account/deploy_account_sent_tx.d.ts.map +0 -1
  49. package/dest/account/deploy_account_sent_tx.js +0 -29
  50. package/dest/account/entrypoint/auth_witness_account_entrypoint.d.ts +0 -51
  51. package/dest/account/entrypoint/auth_witness_account_entrypoint.d.ts.map +0 -1
  52. package/dest/account/entrypoint/auth_witness_account_entrypoint.js +0 -82
  53. package/dest/account/entrypoint/entrypoint_collection.d.ts +0 -26
  54. package/dest/account/entrypoint/entrypoint_collection.d.ts.map +0 -1
  55. package/dest/account/entrypoint/entrypoint_collection.js +0 -40
  56. package/dest/account/entrypoint/entrypoint_payload.d.ts +0 -28
  57. package/dest/account/entrypoint/entrypoint_payload.d.ts.map +0 -1
  58. package/dest/account/entrypoint/entrypoint_payload.js +0 -48
  59. package/dest/account/entrypoint/entrypoint_utils.d.ts +0 -14
  60. package/dest/account/entrypoint/entrypoint_utils.d.ts.map +0 -1
  61. package/dest/account/entrypoint/entrypoint_utils.js +0 -24
  62. package/dest/account/entrypoint/index.d.ts +0 -27
  63. package/dest/account/entrypoint/index.d.ts.map +0 -1
  64. package/dest/account/entrypoint/index.js +0 -8
  65. package/dest/account/entrypoint/single_key_account_entrypoint.d.ts +0 -19
  66. package/dest/account/entrypoint/single_key_account_entrypoint.d.ts.map +0 -1
  67. package/dest/account/entrypoint/single_key_account_entrypoint.js +0 -53
  68. package/dest/account/entrypoint/stored_key_account_entrypoint.d.ts +0 -20
  69. package/dest/account/entrypoint/stored_key_account_entrypoint.d.ts.map +0 -1
  70. package/dest/account/entrypoint/stored_key_account_entrypoint.js +0 -50
  71. package/dest/account/index.d.ts +0 -50
  72. package/dest/account/index.d.ts.map +0 -1
  73. package/dest/account/index.js +0 -66
  74. package/dest/aztec_rpc_client/aztec_rpc_client.d.ts +0 -5
  75. package/dest/aztec_rpc_client/aztec_rpc_client.d.ts.map +0 -1
  76. package/dest/aztec_rpc_client/aztec_rpc_client.js +0 -18
  77. package/dest/aztec_rpc_client/index.d.ts +0 -3
  78. package/dest/aztec_rpc_client/index.d.ts.map +0 -1
  79. package/dest/aztec_rpc_client/index.js +0 -3
  80. package/dest/aztec_rpc_client/wallet.d.ts +0 -96
  81. package/dest/aztec_rpc_client/wallet.d.ts.map +0 -1
  82. package/dest/aztec_rpc_client/wallet.js +0 -167
  83. package/dest/contract/base_contract_interaction.d.ts +0 -50
  84. package/dest/contract/base_contract_interaction.d.ts.map +0 -1
  85. package/dest/contract/base_contract_interaction.js +0 -37
  86. package/dest/contract/batch_call.d.ts +0 -16
  87. package/dest/contract/batch_call.d.ts.map +0 -1
  88. package/dest/contract/batch_call.js +0 -22
  89. package/dest/contract/checker.d.ts +0 -11
  90. package/dest/contract/checker.d.ts.map +0 -1
  91. package/dest/contract/checker.js +0 -98
  92. package/dest/contract/checker.test.d.ts +0 -2
  93. package/dest/contract/checker.test.d.ts.map +0 -1
  94. package/dest/contract/checker.test.js +0 -168
  95. package/dest/contract/contract.d.ts +0 -22
  96. package/dest/contract/contract.d.ts.map +0 -1
  97. package/dest/contract/contract.js +0 -25
  98. package/dest/contract/contract.test.d.ts +0 -2
  99. package/dest/contract/contract.test.d.ts.map +0 -1
  100. package/dest/contract/contract.test.js +0 -143
  101. package/dest/contract/contract_base.d.ts +0 -63
  102. package/dest/contract/contract_base.d.ts.map +0 -1
  103. package/dest/contract/contract_base.js +0 -63
  104. package/dest/contract/contract_function_interaction.d.ts +0 -50
  105. package/dest/contract/contract_function_interaction.d.ts.map +0 -1
  106. package/dest/contract/contract_function_interaction.js +0 -60
  107. package/dest/contract/index.d.ts +0 -6
  108. package/dest/contract/index.d.ts.map +0 -1
  109. package/dest/contract/index.js +0 -6
  110. package/dest/contract/sent_tx.d.ts +0 -58
  111. package/dest/contract/sent_tx.d.ts.map +0 -1
  112. package/dest/contract/sent_tx.js +0 -86
  113. package/dest/contract/sent_tx.test.d.ts +0 -2
  114. package/dest/contract/sent_tx.test.d.ts.map +0 -1
  115. package/dest/contract/sent_tx.test.js +0 -42
  116. package/dest/contract_deployer/contract_deployer.d.ts +0 -25
  117. package/dest/contract_deployer/contract_deployer.d.ts.map +0 -1
  118. package/dest/contract_deployer/contract_deployer.js +0 -26
  119. package/dest/contract_deployer/contract_deployer.test.d.ts +0 -2
  120. package/dest/contract_deployer/contract_deployer.test.d.ts.map +0 -1
  121. package/dest/contract_deployer/contract_deployer.test.js +0 -48
  122. package/dest/contract_deployer/deploy_method.d.ts +0 -63
  123. package/dest/contract_deployer/deploy_method.d.ts.map +0 -1
  124. package/dest/contract_deployer/deploy_method.js +0 -80
  125. package/dest/contract_deployer/deploy_sent_tx.d.ts +0 -35
  126. package/dest/contract_deployer/deploy_sent_tx.d.ts.map +0 -1
  127. package/dest/contract_deployer/deploy_sent_tx.js +0 -39
  128. package/dest/contract_deployer/index.d.ts +0 -2
  129. package/dest/contract_deployer/index.d.ts.map +0 -1
  130. package/dest/contract_deployer/index.js +0 -2
  131. package/dest/index.d.ts +0 -13
  132. package/dest/index.d.ts.map +0 -1
  133. package/dest/index.js +0 -13
  134. package/dest/main.js +0 -2
  135. package/dest/main.js.LICENSE.txt +0 -10
  136. package/dest/sandbox/index.d.ts +0 -116
  137. package/dest/sandbox/index.d.ts.map +0 -1
  138. package/dest/sandbox/index.js +0 -75
  139. package/dest/utils/abi_types.d.ts +0 -7
  140. package/dest/utils/abi_types.d.ts.map +0 -1
  141. package/dest/utils/abi_types.js +0 -2
  142. package/dest/utils/account.d.ts +0 -20
  143. package/dest/utils/account.d.ts.map +0 -1
  144. package/dest/utils/account.js +0 -61
  145. package/dest/utils/cheat_codes.d.ts +0 -199
  146. package/dest/utils/cheat_codes.d.ts.map +0 -1
  147. package/dest/utils/cheat_codes.js +0 -279
  148. package/dest/utils/defaults.d.ts +0 -5
  149. package/dest/utils/defaults.d.ts.map +0 -1
  150. package/dest/utils/defaults.js +0 -5
  151. package/dest/utils/index.d.ts +0 -8
  152. package/dest/utils/index.d.ts.map +0 -1
  153. package/dest/utils/index.js +0 -8
  154. package/dest/utils/l1_contracts.d.ts +0 -32
  155. package/dest/utils/l1_contracts.d.ts.map +0 -1
  156. package/dest/utils/l1_contracts.js +0 -16
  157. package/dest/utils/l2_contracts.d.ts +0 -10
  158. package/dest/utils/l2_contracts.d.ts.map +0 -1
  159. package/dest/utils/l2_contracts.js +0 -10
  160. package/dest/utils/pub_key.d.ts +0 -8
  161. package/dest/utils/pub_key.d.ts.map +0 -1
  162. package/dest/utils/pub_key.js +0 -11
  163. package/dest/utils/secrets.d.ts +0 -8
  164. package/dest/utils/secrets.d.ts.map +0 -1
  165. package/dest/utils/secrets.js +0 -12
  166. package/src/account/entrypoint/entrypoint_collection.ts +0 -51
@@ -96,7 +96,7 @@
96
96
  }
97
97
  ],
98
98
  "returnTypes": [],
99
- "bytecode": "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",
99
+ "bytecode": "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",
100
100
  "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
101
101
  }
102
102
  ]
@@ -7,7 +7,44 @@ import SchnorrAuthWitnessAccountContractAbi from '../../abis/schnorr_auth_witnes
7
7
  import { generatePublicKey } from '../../index.js';
8
8
  import { DEFAULT_CHAIN_ID, DEFAULT_VERSION } from '../../utils/defaults.js';
9
9
  import { buildPayload, hashPayload } from './entrypoint_payload.js';
10
- import { CreateTxRequestOpts, Entrypoint } from './index.js';
10
+ import { Entrypoint } from './index.js';
11
+
12
+ /**
13
+ * An extended interface for entrypoints that support signing and adding auth witnesses.
14
+ */
15
+ export interface IAuthWitnessAccountEntrypoint extends Entrypoint {
16
+ /**
17
+ * Sign a message hash with the private key.
18
+ * @param message - The message hash to sign.
19
+ * @returns The signature as a Buffer.
20
+ */
21
+ sign(message: Buffer): Buffer;
22
+
23
+ /**
24
+ * Creates an AuthWitness witness for the given message. In this case, witness is the public key, the signature
25
+ * and the partial address, to be used for verification.
26
+ * @param message - The message hash to sign.
27
+ * @param opts - Options.
28
+ * @returns [publicKey, signature, partialAddress] as Fr[].
29
+ */
30
+ createAuthWitness(message: Buffer): Promise<Fr[]>;
31
+
32
+ /**
33
+ * Returns the transaction request and the auth witness for the given function calls.
34
+ * Returning the witness here as a nonce is generated in the buildPayload action.
35
+ * @param executions - The function calls to execute
36
+ * @param opts - The options
37
+ * @returns The TxRequest, the auth witness to insert in db and the message signed
38
+ */
39
+ createTxExecutionRequestWithWitness(executions: FunctionCall[]): Promise<{
40
+ /** The transaction request */
41
+ txRequest: TxExecutionRequest;
42
+ /** The auth witness */
43
+ witness: Fr[];
44
+ /** The message signed */
45
+ message: Buffer;
46
+ }>;
47
+ }
11
48
 
12
49
  /**
13
50
  * Account contract implementation that uses a single key for signing and encryption. This public key is not
@@ -15,7 +52,7 @@ import { CreateTxRequestOpts, Entrypoint } from './index.js';
15
52
  * secure and should not be used in real use cases.
16
53
  * The entrypoint is extended to support signing and creating eip1271-like witnesses.
17
54
  */
18
- export class AuthWitnessAccountEntrypoint implements Entrypoint {
55
+ export class AuthWitnessAccountEntrypoint implements IAuthWitnessAccountEntrypoint {
19
56
  constructor(
20
57
  private address: AztecAddress,
21
58
  private partialAddress: PartialAddress,
@@ -25,21 +62,10 @@ export class AuthWitnessAccountEntrypoint implements Entrypoint {
25
62
  private version: number = DEFAULT_VERSION,
26
63
  ) {}
27
64
 
28
- /**
29
- * Sign a message hash with the private key.
30
- * @param message - The message hash to sign.
31
- * @returns The signature as a Buffer.
32
- */
33
65
  public sign(message: Buffer): Buffer {
34
66
  return this.signer.constructSignature(message, this.privateKey).toBuffer();
35
67
  }
36
68
 
37
- /**
38
- * Creates an AuthWitness witness for the given message. In this case, witness is the public key, the signature
39
- * and the partial address, to be used for verification.
40
- * @param message - The message hash to sign.
41
- * @returns [publicKey, signature, partialAddress] as Fr[].
42
- */
43
69
  async createAuthWitness(message: Buffer): Promise<Fr[]> {
44
70
  const signature = this.sign(message);
45
71
  const publicKey = await generatePublicKey(this.privateKey);
@@ -59,10 +85,7 @@ export class AuthWitnessAccountEntrypoint implements Entrypoint {
59
85
  * @param opts - The options
60
86
  * @returns The TxRequest, the auth witness to insert in db and the message signed
61
87
  */
62
- async createTxExecutionRequestWithWitness(
63
- executions: FunctionCall[],
64
- opts: CreateTxRequestOpts = {},
65
- ): Promise<{
88
+ async createTxExecutionRequestWithWitness(executions: FunctionCall[]): Promise<{
66
89
  /** The transaction request */
67
90
  txRequest: TxExecutionRequest;
68
91
  /** The auth witness */
@@ -70,10 +93,6 @@ export class AuthWitnessAccountEntrypoint implements Entrypoint {
70
93
  /** The message signed */
71
94
  message: Buffer;
72
95
  }> {
73
- if (opts.origin && !opts.origin.equals(this.address)) {
74
- throw new Error(`Sender ${opts.origin.toString()} does not match account address ${this.address.toString()}`);
75
- }
76
-
77
96
  const { payload, packedArguments: callsPackedArguments } = await buildPayload(executions);
78
97
  const message = await hashPayload(payload);
79
98
  const witness = await this.createAuthWitness(message);
@@ -92,7 +111,7 @@ export class AuthWitnessAccountEntrypoint implements Entrypoint {
92
111
  return { txRequest, message, witness };
93
112
  }
94
113
 
95
- createTxExecutionRequest(executions: FunctionCall[], _opts: CreateTxRequestOpts = {}): Promise<TxExecutionRequest> {
114
+ createTxExecutionRequest(_executions: FunctionCall[]): Promise<TxExecutionRequest> {
96
115
  throw new Error(`Not implemented, use createTxExecutionRequestWithWitness instead`);
97
116
  }
98
117
 
@@ -5,7 +5,7 @@ import { FunctionCall, PackedArguments, emptyFunctionCall } from '@aztec/types';
5
5
 
6
6
  import partition from 'lodash.partition';
7
7
 
8
- // These must match the values defined in yarn-project/noir-libs/noir-aztec/src/entrypoint.nr
8
+ // These must match the values defined in yarn-project/aztec-nr/aztec/src/entrypoint.nr
9
9
  export const ACCOUNT_MAX_PRIVATE_CALLS = 2;
10
10
  export const ACCOUNT_MAX_PUBLIC_CALLS = 2;
11
11
 
@@ -1,18 +1,10 @@
1
- import { AztecAddress } from '@aztec/circuits.js';
2
1
  import { FunctionCall, TxExecutionRequest } from '@aztec/types';
3
2
 
4
- export * from './entrypoint_collection.js';
3
+ export * from './auth_witness_account_entrypoint.js';
5
4
  export * from './entrypoint_payload.js';
6
5
  export * from './entrypoint_utils.js';
7
6
  export * from './single_key_account_entrypoint.js';
8
7
  export * from './stored_key_account_entrypoint.js';
9
- export * from './auth_witness_account_entrypoint.js';
10
-
11
- /** Options for creating a tx request out of a set of function calls. */
12
- export type CreateTxRequestOpts = {
13
- /** Origin of the tx. Needs to be an address managed by this account. */
14
- origin?: AztecAddress;
15
- };
16
8
 
17
9
  // docs:start:entrypoint-interface
18
10
  /**
@@ -26,6 +18,6 @@ export interface Entrypoint {
26
18
  * @param opts - Options.
27
19
  * @returns The authenticated transaction execution request.
28
20
  */
29
- createTxExecutionRequest(executions: FunctionCall[], opts?: CreateTxRequestOpts): Promise<TxExecutionRequest>;
21
+ createTxExecutionRequest(executions: FunctionCall[]): Promise<TxExecutionRequest>;
30
22
  }
31
23
  // docs:end:entrypoint-interface
@@ -7,7 +7,7 @@ import SchnorrSingleKeyAccountContractAbi from '../../abis/schnorr_single_key_ac
7
7
  import { generatePublicKey } from '../../index.js';
8
8
  import { DEFAULT_CHAIN_ID, DEFAULT_VERSION } from '../../utils/defaults.js';
9
9
  import { buildPayload, hashPayload } from './entrypoint_payload.js';
10
- import { CreateTxRequestOpts, Entrypoint } from './index.js';
10
+ import { Entrypoint } from './index.js';
11
11
 
12
12
  /**
13
13
  * Account contract implementation that uses a single key for signing and encryption. This public key is not
@@ -23,14 +23,7 @@ export class SingleKeyAccountEntrypoint implements Entrypoint {
23
23
  private version: number = DEFAULT_VERSION,
24
24
  ) {}
25
25
 
26
- async createTxExecutionRequest(
27
- executions: FunctionCall[],
28
- opts: CreateTxRequestOpts = {},
29
- ): Promise<TxExecutionRequest> {
30
- if (opts.origin && !opts.origin.equals(this.address)) {
31
- throw new Error(`Sender ${opts.origin.toString()} does not match account address ${this.address.toString()}`);
32
- }
33
-
26
+ async createTxExecutionRequest(executions: FunctionCall[]): Promise<TxExecutionRequest> {
34
27
  const { payload, packedArguments: callsPackedArguments } = await buildPayload(executions);
35
28
  const message = await hashPayload(payload);
36
29
 
@@ -7,7 +7,7 @@ import { FunctionCall, PackedArguments, TxExecutionRequest } from '@aztec/types'
7
7
  import EcdsaAccountContractAbi from '../../abis/ecdsa_account_contract.json' assert { type: 'json' };
8
8
  import { DEFAULT_CHAIN_ID, DEFAULT_VERSION } from '../../utils/defaults.js';
9
9
  import { buildPayload, hashPayload } from './entrypoint_payload.js';
10
- import { CreateTxRequestOpts, Entrypoint } from './index.js';
10
+ import { Entrypoint } from './index.js';
11
11
 
12
12
  /**
13
13
  * Account contract implementation that keeps a signing public key in storage, and is retrieved on
@@ -25,14 +25,7 @@ export class StoredKeyAccountEntrypoint implements Entrypoint {
25
25
  this.log = createDebugLogger('aztec:client:accounts:stored_key');
26
26
  }
27
27
 
28
- async createTxExecutionRequest(
29
- executions: FunctionCall[],
30
- opts: CreateTxRequestOpts = {},
31
- ): Promise<TxExecutionRequest> {
32
- if (opts.origin && !opts.origin.equals(this.address)) {
33
- throw new Error(`Sender ${opts.origin.toString()} does not match account address ${this.address.toString()}`);
34
- }
35
-
28
+ async createTxExecutionRequest(executions: FunctionCall[]): Promise<TxExecutionRequest> {
36
29
  const { payload, packedArguments: callsPackedArguments } = await buildPayload(executions);
37
30
  const message = await hashPayload(payload);
38
31
  const signature = this.sign(message).toBuffer();
@@ -16,7 +16,7 @@ import {
16
16
  TxReceipt,
17
17
  } from '@aztec/types';
18
18
 
19
- import { AuthWitnessAccountEntrypoint, CreateTxRequestOpts, Entrypoint } from '../account/entrypoint/index.js';
19
+ import { Entrypoint, IAuthWitnessAccountEntrypoint } from '../account/entrypoint/index.js';
20
20
  import { CompleteAddress } from '../index.js';
21
21
 
22
22
  /**
@@ -30,7 +30,7 @@ export type Wallet = Entrypoint & AztecRPC;
30
30
  export abstract class BaseWallet implements Wallet {
31
31
  constructor(protected readonly rpc: AztecRPC) {}
32
32
 
33
- abstract createTxExecutionRequest(execs: FunctionCall[], opts?: CreateTxRequestOpts): Promise<TxExecutionRequest>;
33
+ abstract createTxExecutionRequest(execs: FunctionCall[]): Promise<TxExecutionRequest>;
34
34
 
35
35
  registerAccount(privKey: GrumpkinPrivateKey, partialAddress: PartialAddress): Promise<void> {
36
36
  return this.rpc.registerAccount(privKey, partialAddress);
@@ -110,8 +110,8 @@ export class EntrypointWallet extends BaseWallet {
110
110
  constructor(rpc: AztecRPC, protected accountImpl: Entrypoint) {
111
111
  super(rpc);
112
112
  }
113
- createTxExecutionRequest(executions: FunctionCall[], opts: CreateTxRequestOpts = {}): Promise<TxExecutionRequest> {
114
- return this.accountImpl.createTxExecutionRequest(executions, opts);
113
+ createTxExecutionRequest(executions: FunctionCall[]): Promise<TxExecutionRequest> {
114
+ return this.accountImpl.createTxExecutionRequest(executions);
115
115
  }
116
116
  }
117
117
 
@@ -121,7 +121,7 @@ export class EntrypointWallet extends BaseWallet {
121
121
  * to provide authentication data to the contract during execution.
122
122
  */
123
123
  export class AuthWitnessEntrypointWallet extends BaseWallet {
124
- constructor(rpc: AztecRPC, protected accountImpl: AuthWitnessAccountEntrypoint) {
124
+ constructor(rpc: AztecRPC, protected accountImpl: IAuthWitnessAccountEntrypoint, protected address: CompleteAddress) {
125
125
  super(rpc);
126
126
  }
127
127
 
@@ -136,14 +136,8 @@ export class AuthWitnessEntrypointWallet extends BaseWallet {
136
136
  * @param opts - The options.
137
137
  * @returns - The TxRequest
138
138
  */
139
- async createTxExecutionRequest(
140
- executions: FunctionCall[],
141
- opts: CreateTxRequestOpts = {},
142
- ): Promise<TxExecutionRequest> {
143
- const { txRequest, message, witness } = await this.accountImpl.createTxExecutionRequestWithWitness(
144
- executions,
145
- opts,
146
- );
139
+ async createTxExecutionRequest(executions: FunctionCall[]): Promise<TxExecutionRequest> {
140
+ const { txRequest, message, witness } = await this.accountImpl.createTxExecutionRequestWithWitness(executions);
147
141
  await this.rpc.addAuthWitness(Fr.fromBuffer(message), witness);
148
142
  return txRequest;
149
143
  }
@@ -157,12 +151,33 @@ export class AuthWitnessEntrypointWallet extends BaseWallet {
157
151
  * This is useful for signing messages that are not directly part of the transaction payload, such as
158
152
  * approvals .
159
153
  * @param messageHash - The message hash to sign
154
+ * @param opts - The options.
160
155
  */
161
156
  async signAndAddAuthWitness(messageHash: Buffer): Promise<void> {
162
157
  const witness = await this.accountImpl.createAuthWitness(messageHash);
163
158
  await this.rpc.addAuthWitness(Fr.fromBuffer(messageHash), witness);
164
159
  return Promise.resolve();
165
160
  }
161
+
162
+ /**
163
+ * Signs the `messageHash` and adds the witness to the RPC.
164
+ * This is useful for signing messages that are not directly part of the transaction payload, such as
165
+ * approvals .
166
+ * @param messageHash - The message hash to sign
167
+ */
168
+ async signAndGetAuthWitness(messageHash: Buffer): Promise<Fr[]> {
169
+ return await this.accountImpl.createAuthWitness(messageHash);
170
+ }
171
+
172
+ /** Returns the complete address of the account that implements this wallet. */
173
+ public getCompleteAddress() {
174
+ return this.address;
175
+ }
176
+
177
+ /** Returns the address of the account that implements this wallet. */
178
+ public getAddress() {
179
+ return this.address.address;
180
+ }
166
181
  }
167
182
 
168
183
  /**
@@ -1,4 +1,3 @@
1
- import { AztecAddress } from '@aztec/circuits.js';
2
1
  import { AztecRPC, Tx, TxExecutionRequest } from '@aztec/types';
3
2
 
4
3
  import { SentTx } from './sent_tx.js';
@@ -8,10 +7,6 @@ import { SentTx } from './sent_tx.js';
8
7
  * Allows the user to specify the sender address and nonce for a transaction.
9
8
  */
10
9
  export interface SendMethodOptions {
11
- /**
12
- * Sender's address initiating the transaction.
13
- */
14
- origin?: AztecAddress;
15
10
  /**
16
11
  * Wether to skip the simulation of the public part of the transaction.
17
12
  */
@@ -1,5 +1,5 @@
1
1
  import { FunctionCall, TxExecutionRequest, Wallet } from '../index.js';
2
- import { BaseContractInteraction, SendMethodOptions } from './base_contract_interaction.js';
2
+ import { BaseContractInteraction } from './base_contract_interaction.js';
3
3
 
4
4
  /** A batch of function calls to be sent as a single transaction through a wallet. */
5
5
  export class BatchCall extends BaseContractInteraction {
@@ -10,12 +10,11 @@ export class BatchCall extends BaseContractInteraction {
10
10
  /**
11
11
  * Create a transaction execution request that represents this batch, encoded and authenticated by the
12
12
  * user's wallet, ready to be simulated.
13
- * @param options - An optional object containing additional configuration for the transaction.
14
13
  * @returns A Promise that resolves to a transaction instance.
15
14
  */
16
- public async create(options?: SendMethodOptions | undefined): Promise<TxExecutionRequest> {
15
+ public async create(): Promise<TxExecutionRequest> {
17
16
  if (!this.txRequest) {
18
- this.txRequest = await this.wallet.createTxExecutionRequest(this.calls, options);
17
+ this.txRequest = await this.wallet.createTxExecutionRequest(this.calls);
19
18
  }
20
19
  return this.txRequest;
21
20
  }
@@ -109,9 +109,7 @@ describe('Contract Class', () => {
109
109
  const fooContract = await Contract.at(contractAddress, defaultAbi, wallet);
110
110
  const param0 = 12;
111
111
  const param1 = 345n;
112
- const sentTx = fooContract.methods.bar(param0, param1).send({
113
- origin: account.address,
114
- });
112
+ const sentTx = fooContract.methods.bar(param0, param1).send();
115
113
  const txHash = await sentTx.getTxHash();
116
114
  const receipt = await sentTx.getReceipt();
117
115
 
@@ -134,7 +132,7 @@ describe('Contract Class', () => {
134
132
 
135
133
  it('should not call create on an unconstrained function', async () => {
136
134
  const fooContract = await Contract.at(contractAddress, defaultAbi, wallet);
137
- await expect(fooContract.methods.qux().create({ origin: account.address })).rejects.toThrow();
135
+ await expect(fooContract.methods.qux().create()).rejects.toThrow();
138
136
  });
139
137
 
140
138
  it('should not call view on a secret or open function', async () => {
@@ -1,7 +1,9 @@
1
1
  import { ContractAbi } from '@aztec/foundation/abi';
2
2
  import { AztecAddress } from '@aztec/foundation/aztec-address';
3
+ import { PublicKey } from '@aztec/types';
3
4
 
4
5
  import { Wallet } from '../aztec_rpc_client/wallet.js';
6
+ import { DeployMethod, Point } from '../index.js';
5
7
  import { ContractBase } from './contract_base.js';
6
8
 
7
9
  /**
@@ -26,4 +28,25 @@ export class Contract extends ContractBase {
26
28
  }
27
29
  return new Contract(extendedContractData.getCompleteAddress(), abi, wallet);
28
30
  }
31
+
32
+ /**
33
+ * Creates a tx to deploy a new instance of a contract.
34
+ * @param wallet - The wallet for executing the deployment.
35
+ * @param abi - ABI of the contract to deploy.
36
+ * @param args - Arguments for the constructor.
37
+ */
38
+ public static deploy(wallet: Wallet, abi: ContractAbi, args: any[]) {
39
+ return new DeployMethod(Point.ZERO, wallet, abi, args);
40
+ }
41
+
42
+ /**
43
+ * Creates a tx to deploy a new instance of a contract using the specified public key to derive the address.
44
+ * @param publicKey - Public key for deriving the address.
45
+ * @param wallet - The wallet for executing the deployment.
46
+ * @param abi - ABI of the contract to deploy.
47
+ * @param args - Arguments for the constructor.
48
+ */
49
+ public static deployWithPublicKey(publicKey: PublicKey, wallet: Wallet, abi: ContractAbi, args: any[]) {
50
+ return new DeployMethod(publicKey, wallet, abi, args);
51
+ }
29
52
  }
@@ -19,7 +19,7 @@ export type ContractMethod = ((...args: any[]) => ContractFunctionInteraction) &
19
19
  /**
20
20
  * Abstract implementation of a contract extended by the Contract class and generated contract types.
21
21
  */
22
- export abstract class ContractBase {
22
+ export class ContractBase {
23
23
  /**
24
24
  * An object containing contract methods mapped to their respective names.
25
25
  */
@@ -56,10 +56,22 @@ export abstract class ContractBase {
56
56
  });
57
57
  }
58
58
 
59
- get address() {
59
+ /**
60
+ * Address of the contract.
61
+ */
62
+ public get address() {
60
63
  return this.completeAddress.address;
61
64
  }
62
65
 
66
+ /**
67
+ * Creates a new instance of the contract wrapper attached to a different wallet.
68
+ * @param wallet - Wallet to use for sending txs.
69
+ * @returns A new contract instance.
70
+ */
71
+ public withWallet(wallet: Wallet): this {
72
+ return new ContractBase(this.completeAddress, this.abi, wallet) as this;
73
+ }
74
+
63
75
  /**
64
76
  * Attach the current contract instance to a portal contract and optionally add its dependencies.
65
77
  * The function will return a promise that resolves when all contracts have been added to the AztecRPCClient.
@@ -38,15 +38,14 @@ export class ContractFunctionInteraction extends BaseContractInteraction {
38
38
  /**
39
39
  * Create a transaction execution request that represents this call, encoded and authenticated by the
40
40
  * user's wallet, ready to be simulated.
41
- * @param options - An optional object containing additional configuration for the transaction.
42
41
  * @returns A Promise that resolves to a transaction instance.
43
42
  */
44
- public async create(options: SendMethodOptions = {}): Promise<TxExecutionRequest> {
43
+ public async create(): Promise<TxExecutionRequest> {
45
44
  if (this.functionDao.functionType === FunctionType.UNCONSTRAINED) {
46
45
  throw new Error("Can't call `create` on an unconstrained function.");
47
46
  }
48
47
  if (!this.txRequest) {
49
- this.txRequest = await this.wallet.createTxExecutionRequest([this.request()], options);
48
+ this.txRequest = await this.wallet.createTxExecutionRequest([this.request()]);
50
49
  }
51
50
  return this.txRequest;
52
51
  }
@@ -1,4 +1,4 @@
1
- import { AztecAddress, EthAddress, Fr, Point } from '@aztec/circuits.js';
1
+ import { EthAddress, Fr, Point } from '@aztec/circuits.js';
2
2
  import { ContractAbi, FunctionType } from '@aztec/foundation/abi';
3
3
  import { AztecRPC, PublicKey, Tx, TxHash, TxReceipt } from '@aztec/types';
4
4
 
@@ -26,7 +26,6 @@ describe.skip('Contract Deployer', () => {
26
26
  const publicKey: PublicKey = Point.random();
27
27
  const portalContract = EthAddress.random();
28
28
  const contractAddressSalt = Fr.random();
29
- const account = AztecAddress.random();
30
29
  const args = [12, 345n];
31
30
 
32
31
  const mockTx = { type: 'Tx' } as any as Tx;
@@ -44,7 +43,6 @@ describe.skip('Contract Deployer', () => {
44
43
  const sentTx = deployer.deploy(args[0], args[1]).send({
45
44
  portalContract,
46
45
  contractAddressSalt,
47
- origin: account,
48
46
  });
49
47
  const txHash = await sentTx.getTxHash();
50
48
  const receipt = await sentTx.getReceipt();
@@ -6,7 +6,7 @@ import { DeployMethod } from './deploy_method.js';
6
6
 
7
7
  /**
8
8
  * A class for deploying contract.
9
- * @remarks Keeping this around even though we have noir contract types because it can be useful for non-TS users.
9
+ * @remarks Keeping this around even though we have Aztec.nr contract types because it can be useful for non-TS users.
10
10
  */
11
11
  export class ContractDeployer {
12
12
  constructor(private abi: ContractAbi, private arc: AztecRPC, private publicKey?: PublicKey) {}
@@ -1,11 +1,10 @@
1
1
  import { Fr, GrumpkinScalar } from '@aztec/circuits.js';
2
- import { ContractAbi } from '@aztec/foundation/abi';
3
2
  import { sleep } from '@aztec/foundation/sleep';
4
3
 
5
4
  import zip from 'lodash.zip';
6
5
 
7
6
  import SchnorrAccountContractAbi from '../abis/schnorr_account_contract.json' assert { type: 'json' };
8
- import { AccountWallet, AztecRPC, EntrypointWallet, getAccountWallets, getSchnorrAccount } from '../index.js';
7
+ import { AccountWallet, AztecRPC, createAztecRpcClient, getSchnorrAccount } from '../index.js';
9
8
 
10
9
  export const INITIAL_SANDBOX_ENCRYPTION_KEYS = [
11
10
  GrumpkinScalar.fromString('2153536ff6628eee01cf4024889ff977a18d9fa61d0e414422f7681cf085c281'),
@@ -19,20 +18,7 @@ export const INITIAL_SANDBOX_SALTS = [Fr.ZERO, Fr.ZERO, Fr.ZERO];
19
18
 
20
19
  export const INITIAL_SANDBOX_ACCOUNT_CONTRACT_ABI = SchnorrAccountContractAbi;
21
20
 
22
- /**
23
- * Gets a single wallet that manages all the Aztec accounts that are initially stored in the sandbox.
24
- * @param aztecRpc - An instance of the Aztec RPC interface.
25
- * @returns An AccountWallet implementation that includes all the initial accounts.
26
- */
27
- export async function getSandboxAccountsWallet(aztecRpc: AztecRPC): Promise<EntrypointWallet> {
28
- return await getAccountWallets(
29
- aztecRpc,
30
- INITIAL_SANDBOX_ACCOUNT_CONTRACT_ABI as unknown as ContractAbi,
31
- INITIAL_SANDBOX_ENCRYPTION_KEYS,
32
- INITIAL_SANDBOX_SIGNING_KEYS,
33
- INITIAL_SANDBOX_SALTS,
34
- );
35
- }
21
+ export const { SANDBOX_URL = 'http://localhost:8080' } = process.env;
36
22
 
37
23
  /**
38
24
  * Gets a collection of wallets for the Aztec accounts that are initially stored in the sandbox.
@@ -84,12 +70,13 @@ export async function deployInitialSandboxAccounts(aztecRpc: AztecRPC) {
84
70
 
85
71
  /**
86
72
  * Function to wait until the sandbox becomes ready for use.
87
- * @param rpcServer - The rpc client connected to the sandbox.
73
+ * @param rpc - The rpc client connected to the sandbox.
88
74
  */
89
- export async function waitForSandbox(rpcServer: AztecRPC) {
75
+ export async function waitForSandbox(rpc?: AztecRPC) {
76
+ rpc = rpc ?? createAztecRpcClient(SANDBOX_URL);
90
77
  while (true) {
91
78
  try {
92
- await rpcServer.getNodeInfo();
79
+ await rpc.getNodeInfo();
93
80
  break;
94
81
  } catch (err) {
95
82
  await sleep(1000);