@aztec/aztec.js 0.1.0-alpha31 → 0.1.0-alpha33

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 (84) hide show
  1. package/.tsbuildinfo +1 -1
  2. package/dest/abis/ecdsa_account_contract.json +9 -3
  3. package/dest/abis/schnorr_multi_key_account_contract.json +147 -0
  4. package/dest/abis/schnorr_single_key_account_contract.json +6 -2
  5. package/dest/account/account.d.ts +60 -0
  6. package/dest/account/account.d.ts.map +1 -0
  7. package/dest/account/account.js +92 -0
  8. package/dest/account/complete_address.d.ts +13 -0
  9. package/dest/account/complete_address.d.ts.map +1 -0
  10. package/dest/account/complete_address.js +8 -0
  11. package/dest/account/contract/ecdsa_account_contract.d.ts +17 -0
  12. package/dest/account/contract/ecdsa_account_contract.d.ts.map +1 -0
  13. package/dest/account/contract/ecdsa_account_contract.js +22 -0
  14. package/dest/account/contract/index.d.ts +24 -0
  15. package/dest/account/contract/index.d.ts.map +1 -0
  16. package/dest/account/contract/index.js +4 -0
  17. package/dest/account/contract/schnorr_account_contract.d.ts +17 -0
  18. package/dest/account/contract/schnorr_account_contract.d.ts.map +1 -0
  19. package/dest/account/contract/schnorr_account_contract.js +23 -0
  20. package/dest/account/contract/single_key_account_contract.d.ts +17 -0
  21. package/dest/account/contract/single_key_account_contract.d.ts.map +1 -0
  22. package/dest/account/contract/single_key_account_contract.js +22 -0
  23. package/dest/account/deploy_account_sent_tx.d.ts +28 -0
  24. package/dest/account/deploy_account_sent_tx.d.ts.map +1 -0
  25. package/dest/account/deploy_account_sent_tx.js +29 -0
  26. package/dest/account/entrypoint/entrypoint_collection.d.ts +18 -0
  27. package/dest/account/entrypoint/entrypoint_collection.d.ts.map +1 -0
  28. package/dest/account/entrypoint/entrypoint_collection.js +25 -0
  29. package/dest/account/entrypoint/entrypoint_payload.d.ts.map +1 -0
  30. package/dest/account/entrypoint/entrypoint_payload.js +47 -0
  31. package/dest/{account_impl → account/entrypoint}/index.d.ts +8 -10
  32. package/dest/account/entrypoint/index.d.ts.map +1 -0
  33. package/dest/account/entrypoint/index.js +4 -0
  34. package/dest/{account_impl/single_key_account_contract.d.ts → account/entrypoint/single_key_account_entrypoint.d.ts} +3 -4
  35. package/dest/account/entrypoint/single_key_account_entrypoint.d.ts.map +1 -0
  36. package/dest/account/entrypoint/single_key_account_entrypoint.js +55 -0
  37. package/dest/{account_impl/stored_key_account_contract.d.ts → account/entrypoint/stored_key_account_entrypoint.d.ts} +3 -4
  38. package/dest/account/entrypoint/stored_key_account_entrypoint.d.ts.map +1 -0
  39. package/dest/account/entrypoint/stored_key_account_entrypoint.js +54 -0
  40. package/dest/account/index.d.ts +34 -0
  41. package/dest/account/index.d.ts.map +1 -0
  42. package/dest/account/index.js +37 -0
  43. package/dest/aztec_rpc_client/wallet.d.ts +4 -6
  44. package/dest/aztec_rpc_client/wallet.d.ts.map +1 -1
  45. package/dest/aztec_rpc_client/wallet.js +1 -4
  46. package/dest/index.d.ts +1 -1
  47. package/dest/index.d.ts.map +1 -1
  48. package/dest/index.js +2 -4
  49. package/dest/main.js +1 -1
  50. package/dest/utils/account.d.ts.map +1 -1
  51. package/dest/utils/account.js +7 -6
  52. package/package.json +4 -4
  53. package/src/abis/ecdsa_account_contract.json +9 -3
  54. package/src/abis/schnorr_multi_key_account_contract.json +147 -0
  55. package/src/abis/schnorr_single_key_account_contract.json +6 -2
  56. package/src/account/account.ts +112 -0
  57. package/src/account/complete_address.ts +18 -0
  58. package/src/account/contract/ecdsa_account_contract.ts +28 -0
  59. package/src/account/contract/index.ts +26 -0
  60. package/src/account/contract/schnorr_account_contract.ts +29 -0
  61. package/src/account/contract/single_key_account_contract.ts +35 -0
  62. package/src/account/deploy_account_sent_tx.ts +39 -0
  63. package/src/account/entrypoint/entrypoint_collection.ts +31 -0
  64. package/src/{account_impl → account/entrypoint}/index.ts +8 -11
  65. package/src/{account_impl/single_key_account_contract.ts → account/entrypoint/single_key_account_entrypoint.ts} +5 -9
  66. package/src/{account_impl/stored_key_account_contract.ts → account/entrypoint/stored_key_account_entrypoint.ts} +4 -8
  67. package/src/account/index.ts +67 -0
  68. package/src/aztec_rpc_client/wallet.ts +3 -7
  69. package/src/index.ts +1 -4
  70. package/src/utils/account.ts +6 -5
  71. package/dest/account_impl/account_collection.d.ts +0 -18
  72. package/dest/account_impl/account_collection.d.ts.map +0 -1
  73. package/dest/account_impl/account_collection.js +0 -30
  74. package/dest/account_impl/entrypoint_payload.d.ts.map +0 -1
  75. package/dest/account_impl/entrypoint_payload.js +0 -47
  76. package/dest/account_impl/index.d.ts.map +0 -1
  77. package/dest/account_impl/index.js +0 -4
  78. package/dest/account_impl/single_key_account_contract.d.ts.map +0 -1
  79. package/dest/account_impl/single_key_account_contract.js +0 -58
  80. package/dest/account_impl/stored_key_account_contract.d.ts.map +0 -1
  81. package/dest/account_impl/stored_key_account_contract.js +0 -57
  82. package/src/account_impl/account_collection.ts +0 -35
  83. /package/dest/{account_impl → account/entrypoint}/entrypoint_payload.d.ts +0 -0
  84. /package/src/{account_impl → account/entrypoint}/entrypoint_payload.ts +0 -0
@@ -6,7 +6,9 @@
6
6
  "functionType": "secret",
7
7
  "isInternal": false,
8
8
  "parameters": [],
9
- "returnTypes": []
9
+ "returnTypes": [],
10
+ "bytecode": "H4sIAAAAAAAA/9XcR2/iUBiFYZJJMr2l996rjW2wp2YyvffeCBOY3v7/JhzFSFG2OSzeK1ngjXUeAfYt3+V/oVCoFPZaW+Nobxwd+fvmeeeB8678/f7WPN/MX6OgFMe1crEWRuF2UMyqaRLESbWUhmmYpMlOMY2iWhqn5ayalYMsjKNaWE+yqB7std591woO2VqZsw+Ssx+ScwCScxCScwiScxiScwSScxSScwyScxyScwKScxKScwqScxqScwaScxaScw6Scx6ScwGScxGScwmScxmScwWScxWScw2Scx2ScwOSM4DkDCE5i5CcESRnDMmZQHKWIDnLkJxpi3K2H8gZHK6FbUZzBjG3G80XIOYjRvNFiLnDaL4EMXcazZch5i6j+QrE3Gs0X4WY+4zmTYi532i+BjEPGM1bEPOg0XwdYh4ymm9AzMNG802IecRovgUxjxrNtyHmMaP5DsQ8bjTfhZgnjOZ7EPOk0XwfYp4ymh9AzNNG80OIecZofgQxzxrNjyHmOaP5CcQ8bzQ/hZgXjOZnEPOi0fwcYl4yml9AzMtG80uIecVofgUxrxrNryHmNaP5DcS8bjS/hZg3jOZ3EHNgNL+HmEOj+QPEXDSaP0LMkdH8CWKOjebPEHNiNFcg5pLRvA0xl43mKsScGs1fIOajRvMOxHzMaK5BzMeN5jrEfMJo/goxnzSav0HMp4zm7xDzaaP5B8R8xmj+CTGfNZp/QcznjObfEPN5o/kPxNxtNP+FmHuM5n8tMPfkr83/cdOeGe0h0Z4K7THQeEH9Z/Un1b9Sf0PPXz2PdH/W/Uq/X32fu/Prpfk1tTdKe4W0d0Z7SbS3QnsNmrX3qs3eahyq3VUtq2o7Veuo2j/Vwqk2TLVSqh1SLY1qS1RrodoDrcVrbVprtVq71Fqe1ra01qO1D60FaG5cc8WaO9VcoubWNNekuZdK49DYXGNVjd00llHfXn1d9f3UF1LfQM9KPTt0L9W9Rb81fff0WewCHFR1DShPAAA=",
11
+ "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
10
12
  },
11
13
  {
12
14
  "name": "entrypoint",
@@ -92,7 +94,9 @@
92
94
  "visibility": "public"
93
95
  }
94
96
  ],
95
- "returnTypes": []
97
+ "returnTypes": [],
98
+ "bytecode": "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",
99
+ "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
96
100
  }
97
101
  ]
98
102
  }
@@ -0,0 +1,112 @@
1
+ import { Fr, PublicKey, getContractDeploymentInfo } from '@aztec/circuits.js';
2
+ import { AztecRPC, PrivateKey } from '@aztec/types';
3
+
4
+ import { AccountWallet, ContractDeployer, WaitOpts, Wallet, generatePublicKey } from '../index.js';
5
+ import { CompleteAddress, isCompleteAddress } from './complete_address.js';
6
+ import { DeployAccountSentTx } from './deploy_account_sent_tx.js';
7
+ import { AccountContract, Salt } from './index.js';
8
+
9
+ /**
10
+ * Manages a user account. Provides methods for calculating the account's address, deploying the account contract,
11
+ * and creating and registering the user wallet in the RPC server.
12
+ */
13
+ export class Account {
14
+ /** Deployment salt for the account contract. */
15
+ public readonly salt?: Fr;
16
+
17
+ private completeAddress?: CompleteAddress;
18
+ private encryptionPublicKey?: PublicKey;
19
+
20
+ constructor(
21
+ private rpc: AztecRPC,
22
+ private encryptionPrivateKey: PrivateKey,
23
+ private accountContract: AccountContract,
24
+ saltOrAddress?: Salt | CompleteAddress,
25
+ ) {
26
+ if (isCompleteAddress(saltOrAddress)) {
27
+ this.completeAddress = saltOrAddress;
28
+ } else {
29
+ this.salt = saltOrAddress ? new Fr(saltOrAddress) : Fr.random();
30
+ }
31
+ }
32
+
33
+ protected async getEncryptionPublicKey() {
34
+ if (!this.encryptionPublicKey) {
35
+ this.encryptionPublicKey = await generatePublicKey(this.encryptionPrivateKey);
36
+ }
37
+ return this.encryptionPublicKey;
38
+ }
39
+
40
+ /**
41
+ * Gets the calculated complete address associated with this account.
42
+ * Does not require the account to be deployed or registered.
43
+ * @returns The address, partial address, and encryption public key.
44
+ */
45
+ public async getCompleteAddress(): Promise<CompleteAddress> {
46
+ if (!this.completeAddress) {
47
+ const encryptionPublicKey = await generatePublicKey(this.encryptionPrivateKey);
48
+ this.completeAddress = await getContractDeploymentInfo(
49
+ this.accountContract.getContractAbi(),
50
+ await this.accountContract.getDeploymentArgs(),
51
+ this.salt!,
52
+ encryptionPublicKey,
53
+ );
54
+ }
55
+ return this.completeAddress;
56
+ }
57
+
58
+ /**
59
+ * Returns a Wallet instance associated with this account. Use it to create Contract
60
+ * instances to be interacted with from this account.
61
+ * @returns A Wallet instance.
62
+ */
63
+ public async getWallet(): Promise<Wallet> {
64
+ const nodeInfo = await this.rpc.getNodeInfo();
65
+ const completeAddress = await this.getCompleteAddress();
66
+ const account = await this.accountContract.getEntrypoint(completeAddress, nodeInfo);
67
+ return new AccountWallet(this.rpc, account);
68
+ }
69
+
70
+ /**
71
+ * Registers this account in the RPC server and returns the associated wallet. Registering
72
+ * the account on the RPC server is required for managing private state associated with it.
73
+ * Use the returned wallet to create Contract instances to be interacted with from this account.
74
+ * @returns A Wallet instance.
75
+ */
76
+ public async register(): Promise<Wallet> {
77
+ const { address, partialAddress } = await this.getCompleteAddress();
78
+ await this.rpc.addAccount(this.encryptionPrivateKey, address, partialAddress);
79
+ return this.getWallet();
80
+ }
81
+
82
+ /**
83
+ * Deploys the account contract that backs this account.
84
+ * Uses the salt provided in the constructor or a randomly generated one.
85
+ * Note that if the Account is constructed with an explicit complete address
86
+ * it is assumed that the account contract has already been deployed and this method will throw.
87
+ * Registers the account in the RPC server before deploying the contract.
88
+ * @returns A SentTx object that can be waited to get the associated Wallet.
89
+ */
90
+ public async deploy(): Promise<DeployAccountSentTx> {
91
+ if (!this.salt) throw new Error(`Cannot deploy account contract without known salt.`);
92
+ const wallet = await this.register();
93
+ const encryptionPublicKey = await this.getEncryptionPublicKey();
94
+ const deployer = new ContractDeployer(this.accountContract.getContractAbi(), this.rpc, encryptionPublicKey);
95
+ const args = await this.accountContract.getDeploymentArgs();
96
+ const sentTx = deployer.deploy(...args).send({ contractAddressSalt: this.salt });
97
+ return new DeployAccountSentTx(wallet, sentTx.getTxHash());
98
+ }
99
+
100
+ /**
101
+ * Deploys the account contract that backs this account and awaits the tx to be mined.
102
+ * Uses the salt provided in the constructor or a randomly generated one.
103
+ * Note that if the Account is constructed with an explicit complete address
104
+ * it is assumed that the account contract has already been deployed and this method will throw.
105
+ * Registers the account in the RPC server before deploying the contract.
106
+ * @param opts - Options to wait for the tx to be mined.
107
+ * @returns A Wallet instance.
108
+ */
109
+ public async waitDeploy(opts: WaitOpts): Promise<Wallet> {
110
+ return (await this.deploy()).getWallet(opts);
111
+ }
112
+ }
@@ -0,0 +1,18 @@
1
+ import { AztecAddress, PartialContractAddress, PublicKey } from '@aztec/circuits.js';
2
+
3
+ /** Address and preimages associated with an account. */
4
+ export type CompleteAddress = {
5
+ /** Address of an account. Derived from the partial address and public key. */
6
+ address: AztecAddress;
7
+ /** Partial address of the account. Required for deriving the address from the encryption public key. */
8
+ partialAddress: PartialContractAddress;
9
+ /** Encryption public key associated with this address. */
10
+ publicKey: PublicKey;
11
+ };
12
+
13
+ /** Returns whether the argument looks like a CompleteAddress. */
14
+ export function isCompleteAddress(obj: any): obj is CompleteAddress {
15
+ if (!obj) return false;
16
+ const maybe = obj as CompleteAddress;
17
+ return !!maybe.address && !!maybe.partialAddress && !!maybe.publicKey;
18
+ }
@@ -0,0 +1,28 @@
1
+ import { Ecdsa } from '@aztec/circuits.js/barretenberg';
2
+ import { ContractAbi } from '@aztec/foundation/abi';
3
+ import { NodeInfo, PrivateKey } from '@aztec/types';
4
+
5
+ import EcdsaAccountContractAbi from '../../abis/ecdsa_account_contract.json' assert { type: 'json' };
6
+ import { CompleteAddress } from '../complete_address.js';
7
+ import { StoredKeyAccountEntrypoint } from '../entrypoint/stored_key_account_entrypoint.js';
8
+ import { AccountContract } from './index.js';
9
+
10
+ /**
11
+ * Account contract that authenticates transactions using ECDSA signatures
12
+ * verified against a secp256k1 public key stored in an immutable encrypted note.
13
+ */ export class EcdsaAccountContract implements AccountContract {
14
+ constructor(private signingPrivateKey: PrivateKey) {}
15
+
16
+ public async getDeploymentArgs() {
17
+ const signingPublicKey = await Ecdsa.new().then(e => e.computePublicKey(this.signingPrivateKey));
18
+ return [signingPublicKey.subarray(0, 32), signingPublicKey.subarray(32, 64)];
19
+ }
20
+
21
+ public async getEntrypoint({ address }: CompleteAddress, { chainId, version }: NodeInfo) {
22
+ return new StoredKeyAccountEntrypoint(address, this.signingPrivateKey, await Ecdsa.new(), chainId, version);
23
+ }
24
+
25
+ public getContractAbi(): ContractAbi {
26
+ return EcdsaAccountContractAbi as ContractAbi;
27
+ }
28
+ }
@@ -0,0 +1,26 @@
1
+ import { ContractAbi } from '@aztec/foundation/abi';
2
+ import { NodeInfo } from '@aztec/types';
3
+
4
+ import { Entrypoint } from '../index.js';
5
+ import { CompleteAddress } from './../complete_address.js';
6
+
7
+ export * from './ecdsa_account_contract.js';
8
+ export * from './schnorr_account_contract.js';
9
+ export * from './single_key_account_contract.js';
10
+
11
+ /**
12
+ * An account contract instance. Knows its ABI, deployment arguments, and to create transaction execution
13
+ * requests out of function calls through an entrypoint.
14
+ */
15
+ export interface AccountContract {
16
+ /** Returns the ABI of this account contract. */
17
+ getContractAbi(): ContractAbi;
18
+ /** Returns the deployment arguments for this instance. */
19
+ getDeploymentArgs(): Promise<any[]>;
20
+ /**
21
+ * Creates an entrypoint for creating transaction execution requests for this account contract.
22
+ * @param address - Complete address of the deployed account contract.
23
+ * @param nodeInfo - Chain id and protocol version where the account contract is deployed.
24
+ */
25
+ getEntrypoint(address: CompleteAddress, nodeInfo: NodeInfo): Promise<Entrypoint>;
26
+ }
@@ -0,0 +1,29 @@
1
+ import { Schnorr } from '@aztec/circuits.js/barretenberg';
2
+ import { ContractAbi } from '@aztec/foundation/abi';
3
+ import { NodeInfo, PrivateKey } from '@aztec/types';
4
+
5
+ import SchnorrMultiKeyAccountContractAbi from '../../abis/schnorr_multi_key_account_contract.json' assert { type: 'json' };
6
+ import { CompleteAddress } from '../complete_address.js';
7
+ import { StoredKeyAccountEntrypoint } from '../entrypoint/stored_key_account_entrypoint.js';
8
+ import { AccountContract } from './index.js';
9
+
10
+ /**
11
+ * Account contract that authenticates transactions using Schnorr signatures
12
+ * verified against a Grumpkin public key stored in an immutable encrypted note.
13
+ */
14
+ export class SchnorrAccountContract implements AccountContract {
15
+ constructor(private signingPrivateKey: PrivateKey) {}
16
+
17
+ public async getDeploymentArgs() {
18
+ const signingPublicKey = await Schnorr.new().then(e => e.computePublicKey(this.signingPrivateKey));
19
+ return [signingPublicKey.x, signingPublicKey.y];
20
+ }
21
+
22
+ public async getEntrypoint({ address }: CompleteAddress, { chainId, version }: NodeInfo) {
23
+ return new StoredKeyAccountEntrypoint(address, this.signingPrivateKey, await Schnorr.new(), chainId, version);
24
+ }
25
+
26
+ public getContractAbi(): ContractAbi {
27
+ return SchnorrMultiKeyAccountContractAbi as ContractAbi;
28
+ }
29
+ }
@@ -0,0 +1,35 @@
1
+ import { Schnorr } from '@aztec/circuits.js/barretenberg';
2
+ import { ContractAbi } from '@aztec/foundation/abi';
3
+ import { NodeInfo, PrivateKey } from '@aztec/types';
4
+
5
+ import SchnorrSingleKeyAccountContractAbi from '../../abis/schnorr_single_key_account_contract.json' assert { type: 'json' };
6
+ import { CompleteAddress } from '../complete_address.js';
7
+ import { SingleKeyAccountEntrypoint } from '../entrypoint/single_key_account_entrypoint.js';
8
+ import { AccountContract } from './index.js';
9
+
10
+ /**
11
+ * Account contract that authenticates transactions using Schnorr signatures verified against
12
+ * the note encryption key, relying on a single private key for both encryption and authentication.
13
+ */
14
+ export class SingleKeyAccountContract implements AccountContract {
15
+ constructor(private encryptionPrivateKey: PrivateKey) {}
16
+
17
+ public getDeploymentArgs() {
18
+ return Promise.resolve([]);
19
+ }
20
+
21
+ public async getEntrypoint({ address, partialAddress }: CompleteAddress, { chainId, version }: NodeInfo) {
22
+ return new SingleKeyAccountEntrypoint(
23
+ address,
24
+ partialAddress,
25
+ this.encryptionPrivateKey,
26
+ await Schnorr.new(),
27
+ chainId,
28
+ version,
29
+ );
30
+ }
31
+
32
+ public getContractAbi(): ContractAbi {
33
+ return SchnorrSingleKeyAccountContractAbi as ContractAbi;
34
+ }
35
+ }
@@ -0,0 +1,39 @@
1
+ import { FieldsOf } from '@aztec/circuits.js';
2
+ import { TxHash, TxReceipt } from '@aztec/types';
3
+
4
+ import { SentTx, WaitOpts, Wallet } from '../index.js';
5
+
6
+ /** Extends a transaction receipt with a wallet instance for the newly deployed contract. */
7
+ export type DeployAccountTxReceipt = FieldsOf<TxReceipt> & {
8
+ /** Wallet that corresponds to the newly deployed account contract. */
9
+ wallet: Wallet;
10
+ };
11
+
12
+ /**
13
+ * A deployment transaction for an account contract sent to the network, extending SentTx with methods to get the resulting wallet.
14
+ */
15
+ export class DeployAccountSentTx extends SentTx {
16
+ constructor(private wallet: Wallet, txHashPromise: Promise<TxHash>) {
17
+ super(wallet, txHashPromise);
18
+ }
19
+
20
+ /**
21
+ * Awaits for the tx to be mined and returns the contract instance. Throws if tx is not mined.
22
+ * @param opts - Options for configuring the waiting for the tx to be mined.
23
+ * @returns The deployed contract instance.
24
+ */
25
+ public async getWallet(opts?: WaitOpts): Promise<Wallet> {
26
+ const receipt = await this.wait(opts);
27
+ return receipt.wallet;
28
+ }
29
+
30
+ /**
31
+ * Awaits for the tx to be mined and returns the receipt along with a wallet instance. Throws if tx is not mined.
32
+ * @param opts - Options for configuring the waiting for the tx to be mined.
33
+ * @returns The transaction receipt with the wallet for the deployed account contract.
34
+ */
35
+ public async wait(opts?: WaitOpts): Promise<DeployAccountTxReceipt> {
36
+ const receipt = await super.wait(opts);
37
+ return { ...receipt, wallet: this.wallet };
38
+ }
39
+ }
@@ -0,0 +1,31 @@
1
+ import { AztecAddress } from '@aztec/circuits.js';
2
+ import { FunctionCall, TxExecutionRequest } from '@aztec/types';
3
+
4
+ import { CreateTxRequestOpts, Entrypoint } from './index.js';
5
+
6
+ /**
7
+ * An entrypoint that groups together multiple concrete entrypoints.
8
+ * Delegates to the registered entrypoints based on the requested origin.
9
+ */
10
+ export class EntrypointCollection implements Entrypoint {
11
+ private entrypoints: Map<string, Entrypoint> = new Map();
12
+
13
+ /**
14
+ * Registers an entrypoint against an aztec address
15
+ * @param addr - The aztec address agianst which to register the implementation.
16
+ * @param impl - The entrypoint to be registered.
17
+ */
18
+ public registerAccount(addr: AztecAddress, impl: Entrypoint) {
19
+ this.entrypoints.set(addr.toString(), impl);
20
+ }
21
+
22
+ public createTxExecutionRequest(
23
+ executions: FunctionCall[],
24
+ opts: CreateTxRequestOpts = {},
25
+ ): Promise<TxExecutionRequest> {
26
+ const defaultAccount = this.entrypoints.values().next().value as Entrypoint;
27
+ const impl = opts.origin ? this.entrypoints.get(opts.origin.toString()) : defaultAccount;
28
+ if (!impl) throw new Error(`No entrypoint registered for ${opts.origin}`);
29
+ return impl.createTxExecutionRequest(executions, opts);
30
+ }
31
+ }
@@ -1,9 +1,9 @@
1
1
  import { AztecAddress } from '@aztec/circuits.js';
2
2
  import { FunctionCall, TxExecutionRequest } from '@aztec/types';
3
3
 
4
- export * from './account_collection.js';
5
- export * from './single_key_account_contract.js';
6
- export * from './stored_key_account_contract.js';
4
+ export * from './entrypoint_collection.js';
5
+ export * from './single_key_account_entrypoint.js';
6
+ export * from './stored_key_account_entrypoint.js';
7
7
 
8
8
  /** Options for creating a tx request out of a set of function calls. */
9
9
  export type CreateTxRequestOpts = {
@@ -11,14 +11,11 @@ export type CreateTxRequestOpts = {
11
11
  origin?: AztecAddress;
12
12
  };
13
13
 
14
- /** Represents an implementation for a user account contract. Knows how to encode and sign a tx for that particular implementation. */
15
- export interface AccountImplementation {
16
- /**
17
- * Returns the address for the account contract used by this implementation.
18
- * @returns The address.
19
- */
20
- getAddress(): AztecAddress;
21
-
14
+ /**
15
+ * Represents a transaction entrypoint in an account contract.
16
+ * Knows how to assemble a transaction execution request given a set of function calls.
17
+ */
18
+ export interface Entrypoint {
22
19
  /**
23
20
  * Generates an authenticated request out of set of intents
24
21
  * @param executions - The execution intents to be run.
@@ -12,18 +12,18 @@ import { FunctionCall, PackedArguments, TxExecutionRequest } from '@aztec/types'
12
12
 
13
13
  import partition from 'lodash.partition';
14
14
 
15
- import SchnorrSingleKeyAccountContractAbi from '../abis/schnorr_single_key_account_contract.json' assert { type: 'json' };
16
- import { generatePublicKey } from '../index.js';
17
- import { DEFAULT_CHAIN_ID, DEFAULT_VERSION } from '../utils/defaults.js';
15
+ import SchnorrSingleKeyAccountContractAbi from '../../abis/schnorr_single_key_account_contract.json' assert { type: 'json' };
16
+ import { generatePublicKey } from '../../index.js';
17
+ import { DEFAULT_CHAIN_ID, DEFAULT_VERSION } from '../../utils/defaults.js';
18
18
  import { buildPayload, hashPayload } from './entrypoint_payload.js';
19
- import { AccountImplementation, CreateTxRequestOpts } from './index.js';
19
+ import { CreateTxRequestOpts, Entrypoint } from './index.js';
20
20
 
21
21
  /**
22
22
  * Account contract implementation that uses a single key for signing and encryption. This public key is not
23
23
  * stored in the contract, but rather verified against the contract address. Note that this approach is not
24
24
  * secure and should not be used in real use cases.
25
25
  */
26
- export class SingleKeyAccountContract implements AccountImplementation {
26
+ export class SingleKeyAccountEntrypoint implements Entrypoint {
27
27
  constructor(
28
28
  private address: AztecAddress,
29
29
  private partialContractAddress: PartialContractAddress,
@@ -33,10 +33,6 @@ export class SingleKeyAccountContract implements AccountImplementation {
33
33
  private version: number = DEFAULT_VERSION,
34
34
  ) {}
35
35
 
36
- getAddress(): AztecAddress {
37
- return this.address;
38
- }
39
-
40
36
  async createTxExecutionRequest(
41
37
  executions: FunctionCall[],
42
38
  opts: CreateTxRequestOpts = {},
@@ -6,16 +6,16 @@ import { FunctionCall, PackedArguments, TxExecutionRequest } from '@aztec/types'
6
6
 
7
7
  import partition from 'lodash.partition';
8
8
 
9
- import EcdsaAccountContractAbi from '../abis/ecdsa_account_contract.json' assert { type: 'json' };
10
- import { DEFAULT_CHAIN_ID, DEFAULT_VERSION } from '../utils/defaults.js';
9
+ import EcdsaAccountContractAbi from '../../abis/ecdsa_account_contract.json' assert { type: 'json' };
10
+ import { DEFAULT_CHAIN_ID, DEFAULT_VERSION } from '../../utils/defaults.js';
11
11
  import { buildPayload, hashPayload } from './entrypoint_payload.js';
12
- import { AccountImplementation, CreateTxRequestOpts } from './index.js';
12
+ import { CreateTxRequestOpts, Entrypoint } from './index.js';
13
13
 
14
14
  /**
15
15
  * Account contract implementation that keeps a signing public key in storage, and is retrieved on
16
16
  * every new request in order to validate the payload signature.
17
17
  */
18
- export class StoredKeyAccountContract implements AccountImplementation {
18
+ export class StoredKeyAccountEntrypoint implements Entrypoint {
19
19
  private log: DebugLogger;
20
20
 
21
21
  constructor(
@@ -28,10 +28,6 @@ export class StoredKeyAccountContract implements AccountImplementation {
28
28
  this.log = createDebugLogger('aztec:client:accounts:stored_key');
29
29
  }
30
30
 
31
- getAddress(): AztecAddress {
32
- return this.address;
33
- }
34
-
35
31
  async createTxExecutionRequest(
36
32
  executions: FunctionCall[],
37
33
  opts: CreateTxRequestOpts = {},
@@ -0,0 +1,67 @@
1
+ import { AztecRPC, PrivateKey } from '@aztec/types';
2
+
3
+ import { Fr } from '../index.js';
4
+ import { Account } from './account.js';
5
+ import { CompleteAddress } from './complete_address.js';
6
+ import { EcdsaAccountContract } from './contract/ecdsa_account_contract.js';
7
+ import { SchnorrAccountContract } from './contract/schnorr_account_contract.js';
8
+ import { SingleKeyAccountContract } from './contract/single_key_account_contract.js';
9
+
10
+ export { Account } from './account.js';
11
+ export * from './contract/index.js';
12
+ export * from './entrypoint/index.js';
13
+ export { CompleteAddress };
14
+
15
+ /** A contract deployment salt. */
16
+ export type Salt = Fr | number | bigint;
17
+
18
+ /**
19
+ * Creates an Account that relies on an ECDSA signing key for authentication.
20
+ * @param rpc - An AztecRPC server instance.
21
+ * @param encryptionPrivateKey - Grumpkin key used for note encryption.
22
+ * @param signingPrivateKey - Secp256k1 key used for signing transactions.
23
+ * @param saltOrAddress - Deployment salt or complete address if account contract is already deployed.
24
+ */
25
+ export function getEcdsaAccount(
26
+ rpc: AztecRPC,
27
+ encryptionPrivateKey: PrivateKey,
28
+ signingPrivateKey: PrivateKey,
29
+ saltOrAddress?: Salt | CompleteAddress,
30
+ ): Account {
31
+ return new Account(rpc, encryptionPrivateKey, new EcdsaAccountContract(signingPrivateKey), saltOrAddress);
32
+ }
33
+
34
+ /**
35
+ * Creates an Account that relies on a Grumpkin signing key for authentication.
36
+ * @param rpc - An AztecRPC server instance.
37
+ * @param encryptionPrivateKey - Grumpkin key used for note encryption.
38
+ * @param signingPrivateKey - Grumpkin key used for signing transactions.
39
+ * @param saltOrAddress - Deployment salt or complete address if account contract is already deployed.
40
+ */
41
+ export function getSchnorrAccount(
42
+ rpc: AztecRPC,
43
+ encryptionPrivateKey: PrivateKey,
44
+ signingPrivateKey: PrivateKey,
45
+ saltOrAddress?: Salt | CompleteAddress,
46
+ ): Account {
47
+ return new Account(rpc, encryptionPrivateKey, new SchnorrAccountContract(signingPrivateKey), saltOrAddress);
48
+ }
49
+
50
+ /**
51
+ * Creates an Account that uses the same Grumpkin key for encryption and authentication.
52
+ * @param rpc - An AztecRPC server instance.
53
+ * @param encryptionAndSigningPrivateKey - Grumpkin key used for note encryption and signing transactions.
54
+ * @param saltOrAddress - Deployment salt or complete address if account contract is already deployed.
55
+ */
56
+ export function getUnsafeSchnorrAccount(
57
+ rpc: AztecRPC,
58
+ encryptionAndSigningPrivateKey: PrivateKey,
59
+ saltOrAddress?: Salt | CompleteAddress,
60
+ ): Account {
61
+ return new Account(
62
+ rpc,
63
+ encryptionAndSigningPrivateKey,
64
+ new SingleKeyAccountContract(encryptionAndSigningPrivateKey),
65
+ saltOrAddress,
66
+ );
67
+ }
@@ -14,12 +14,12 @@ import {
14
14
  TxReceipt,
15
15
  } from '@aztec/types';
16
16
 
17
- import { AccountImplementation, CreateTxRequestOpts } from '../account_impl/index.js';
17
+ import { CreateTxRequestOpts, Entrypoint } from '../account/entrypoint/index.js';
18
18
 
19
19
  /**
20
20
  * The wallet interface.
21
21
  */
22
- export type Wallet = AccountImplementation & AztecRPC;
22
+ export type Wallet = Entrypoint & AztecRPC;
23
23
 
24
24
  /**
25
25
  * A base class for Wallet implementations
@@ -27,7 +27,6 @@ export type Wallet = AccountImplementation & AztecRPC;
27
27
  export abstract class BaseWallet implements Wallet {
28
28
  constructor(protected readonly rpc: AztecRPC) {}
29
29
 
30
- abstract getAddress(): AztecAddress;
31
30
  abstract createTxExecutionRequest(execs: FunctionCall[], opts?: CreateTxRequestOpts): Promise<TxExecutionRequest>;
32
31
 
33
32
  addAccount(privKey: PrivateKey, address: AztecAddress, partialContractAddress: Fr): Promise<AztecAddress> {
@@ -103,12 +102,9 @@ export abstract class BaseWallet implements Wallet {
103
102
  * A simple wallet implementation that forwards authentication requests to a provided account implementation.
104
103
  */
105
104
  export class AccountWallet extends BaseWallet {
106
- constructor(rpc: AztecRPC, protected accountImpl: AccountImplementation) {
105
+ constructor(rpc: AztecRPC, protected accountImpl: Entrypoint) {
107
106
  super(rpc);
108
107
  }
109
- getAddress(): AztecAddress {
110
- return this.accountImpl.getAddress();
111
- }
112
108
  createTxExecutionRequest(executions: FunctionCall[], opts: CreateTxRequestOpts = {}): Promise<TxExecutionRequest> {
113
109
  return this.accountImpl.createTxExecutionRequest(executions, opts);
114
110
  }
package/src/index.ts CHANGED
@@ -2,12 +2,9 @@ export * from './contract/index.js';
2
2
  export * from './contract_deployer/index.js';
3
3
  export * from './utils/index.js';
4
4
  export * from './aztec_rpc_client/index.js';
5
- export * from './account_impl/index.js';
5
+ export * from './account/index.js';
6
6
  export * from './contract_deployer/deploy_method.js';
7
7
 
8
- // TODO - only export necessary stuffs
9
- // export * from '@aztec/aztec-rpc';
10
-
11
8
  export { AztecAddress, EthAddress, Point, Fr } from '@aztec/circuits.js';
12
9
  export {
13
10
  AztecRPC,