@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.
- package/Dockerfile +15 -0
- package/package.json +6 -6
- package/src/abis/ecdsa_account_contract.json +2 -2
- package/src/abis/schnorr_account_contract.json +2 -2
- package/src/abis/schnorr_auth_witness_account_contract.json +542 -3
- package/src/abis/schnorr_single_key_account_contract.json +1 -1
- package/src/account/entrypoint/auth_witness_account_entrypoint.ts +41 -22
- package/src/account/entrypoint/entrypoint_payload.ts +1 -1
- package/src/account/entrypoint/index.ts +2 -10
- package/src/account/entrypoint/single_key_account_entrypoint.ts +2 -9
- package/src/account/entrypoint/stored_key_account_entrypoint.ts +2 -9
- package/src/aztec_rpc_client/wallet.ts +28 -13
- package/src/contract/base_contract_interaction.ts +0 -5
- package/src/contract/batch_call.ts +3 -4
- package/src/contract/contract.test.ts +2 -4
- package/src/contract/contract.ts +23 -0
- package/src/contract/contract_base.ts +14 -2
- package/src/contract/contract_function_interaction.ts +2 -3
- package/src/contract_deployer/contract_deployer.test.ts +1 -3
- package/src/contract_deployer/contract_deployer.ts +1 -1
- package/src/sandbox/index.ts +6 -19
- package/src/utils/account.ts +35 -79
- package/src/utils/cheat_codes.ts +3 -3
- package/.tsbuildinfo +0 -1
- package/dest/abis/ecdsa_account_contract.json +0 -160
- package/dest/abis/schnorr_account_contract.json +0 -148
- package/dest/abis/schnorr_auth_witness_account_contract.json +0 -104
- package/dest/abis/schnorr_single_key_account_contract.json +0 -103
- package/dest/account/account.d.ts +0 -72
- package/dest/account/account.d.ts.map +0 -1
- package/dest/account/account.js +0 -115
- package/dest/account/contract/auth_witness_account_contract.d.ts +0 -17
- package/dest/account/contract/auth_witness_account_contract.d.ts.map +0 -1
- package/dest/account/contract/auth_witness_account_contract.js +0 -23
- package/dest/account/contract/ecdsa_account_contract.d.ts +0 -16
- package/dest/account/contract/ecdsa_account_contract.d.ts.map +0 -1
- package/dest/account/contract/ecdsa_account_contract.js +0 -24
- package/dest/account/contract/index.d.ts +0 -28
- package/dest/account/contract/index.d.ts.map +0 -1
- package/dest/account/contract/index.js +0 -6
- package/dest/account/contract/schnorr_account_contract.d.ts +0 -16
- package/dest/account/contract/schnorr_account_contract.d.ts.map +0 -1
- package/dest/account/contract/schnorr_account_contract.js +0 -25
- package/dest/account/contract/single_key_account_contract.d.ts +0 -16
- package/dest/account/contract/single_key_account_contract.d.ts.map +0 -1
- package/dest/account/contract/single_key_account_contract.js +0 -21
- package/dest/account/deploy_account_sent_tx.d.ts +0 -28
- package/dest/account/deploy_account_sent_tx.d.ts.map +0 -1
- package/dest/account/deploy_account_sent_tx.js +0 -29
- package/dest/account/entrypoint/auth_witness_account_entrypoint.d.ts +0 -51
- package/dest/account/entrypoint/auth_witness_account_entrypoint.d.ts.map +0 -1
- package/dest/account/entrypoint/auth_witness_account_entrypoint.js +0 -82
- package/dest/account/entrypoint/entrypoint_collection.d.ts +0 -26
- package/dest/account/entrypoint/entrypoint_collection.d.ts.map +0 -1
- package/dest/account/entrypoint/entrypoint_collection.js +0 -40
- package/dest/account/entrypoint/entrypoint_payload.d.ts +0 -28
- package/dest/account/entrypoint/entrypoint_payload.d.ts.map +0 -1
- package/dest/account/entrypoint/entrypoint_payload.js +0 -48
- package/dest/account/entrypoint/entrypoint_utils.d.ts +0 -14
- package/dest/account/entrypoint/entrypoint_utils.d.ts.map +0 -1
- package/dest/account/entrypoint/entrypoint_utils.js +0 -24
- package/dest/account/entrypoint/index.d.ts +0 -27
- package/dest/account/entrypoint/index.d.ts.map +0 -1
- package/dest/account/entrypoint/index.js +0 -8
- package/dest/account/entrypoint/single_key_account_entrypoint.d.ts +0 -19
- package/dest/account/entrypoint/single_key_account_entrypoint.d.ts.map +0 -1
- package/dest/account/entrypoint/single_key_account_entrypoint.js +0 -53
- package/dest/account/entrypoint/stored_key_account_entrypoint.d.ts +0 -20
- package/dest/account/entrypoint/stored_key_account_entrypoint.d.ts.map +0 -1
- package/dest/account/entrypoint/stored_key_account_entrypoint.js +0 -50
- package/dest/account/index.d.ts +0 -50
- package/dest/account/index.d.ts.map +0 -1
- package/dest/account/index.js +0 -66
- package/dest/aztec_rpc_client/aztec_rpc_client.d.ts +0 -5
- package/dest/aztec_rpc_client/aztec_rpc_client.d.ts.map +0 -1
- package/dest/aztec_rpc_client/aztec_rpc_client.js +0 -18
- package/dest/aztec_rpc_client/index.d.ts +0 -3
- package/dest/aztec_rpc_client/index.d.ts.map +0 -1
- package/dest/aztec_rpc_client/index.js +0 -3
- package/dest/aztec_rpc_client/wallet.d.ts +0 -96
- package/dest/aztec_rpc_client/wallet.d.ts.map +0 -1
- package/dest/aztec_rpc_client/wallet.js +0 -167
- package/dest/contract/base_contract_interaction.d.ts +0 -50
- package/dest/contract/base_contract_interaction.d.ts.map +0 -1
- package/dest/contract/base_contract_interaction.js +0 -37
- package/dest/contract/batch_call.d.ts +0 -16
- package/dest/contract/batch_call.d.ts.map +0 -1
- package/dest/contract/batch_call.js +0 -22
- package/dest/contract/checker.d.ts +0 -11
- package/dest/contract/checker.d.ts.map +0 -1
- package/dest/contract/checker.js +0 -98
- package/dest/contract/checker.test.d.ts +0 -2
- package/dest/contract/checker.test.d.ts.map +0 -1
- package/dest/contract/checker.test.js +0 -168
- package/dest/contract/contract.d.ts +0 -22
- package/dest/contract/contract.d.ts.map +0 -1
- package/dest/contract/contract.js +0 -25
- package/dest/contract/contract.test.d.ts +0 -2
- package/dest/contract/contract.test.d.ts.map +0 -1
- package/dest/contract/contract.test.js +0 -143
- package/dest/contract/contract_base.d.ts +0 -63
- package/dest/contract/contract_base.d.ts.map +0 -1
- package/dest/contract/contract_base.js +0 -63
- package/dest/contract/contract_function_interaction.d.ts +0 -50
- package/dest/contract/contract_function_interaction.d.ts.map +0 -1
- package/dest/contract/contract_function_interaction.js +0 -60
- package/dest/contract/index.d.ts +0 -6
- package/dest/contract/index.d.ts.map +0 -1
- package/dest/contract/index.js +0 -6
- package/dest/contract/sent_tx.d.ts +0 -58
- package/dest/contract/sent_tx.d.ts.map +0 -1
- package/dest/contract/sent_tx.js +0 -86
- package/dest/contract/sent_tx.test.d.ts +0 -2
- package/dest/contract/sent_tx.test.d.ts.map +0 -1
- package/dest/contract/sent_tx.test.js +0 -42
- package/dest/contract_deployer/contract_deployer.d.ts +0 -25
- package/dest/contract_deployer/contract_deployer.d.ts.map +0 -1
- package/dest/contract_deployer/contract_deployer.js +0 -26
- package/dest/contract_deployer/contract_deployer.test.d.ts +0 -2
- package/dest/contract_deployer/contract_deployer.test.d.ts.map +0 -1
- package/dest/contract_deployer/contract_deployer.test.js +0 -48
- package/dest/contract_deployer/deploy_method.d.ts +0 -63
- package/dest/contract_deployer/deploy_method.d.ts.map +0 -1
- package/dest/contract_deployer/deploy_method.js +0 -80
- package/dest/contract_deployer/deploy_sent_tx.d.ts +0 -35
- package/dest/contract_deployer/deploy_sent_tx.d.ts.map +0 -1
- package/dest/contract_deployer/deploy_sent_tx.js +0 -39
- package/dest/contract_deployer/index.d.ts +0 -2
- package/dest/contract_deployer/index.d.ts.map +0 -1
- package/dest/contract_deployer/index.js +0 -2
- package/dest/index.d.ts +0 -13
- package/dest/index.d.ts.map +0 -1
- package/dest/index.js +0 -13
- package/dest/main.js +0 -2
- package/dest/main.js.LICENSE.txt +0 -10
- package/dest/sandbox/index.d.ts +0 -116
- package/dest/sandbox/index.d.ts.map +0 -1
- package/dest/sandbox/index.js +0 -75
- package/dest/utils/abi_types.d.ts +0 -7
- package/dest/utils/abi_types.d.ts.map +0 -1
- package/dest/utils/abi_types.js +0 -2
- package/dest/utils/account.d.ts +0 -20
- package/dest/utils/account.d.ts.map +0 -1
- package/dest/utils/account.js +0 -61
- package/dest/utils/cheat_codes.d.ts +0 -199
- package/dest/utils/cheat_codes.d.ts.map +0 -1
- package/dest/utils/cheat_codes.js +0 -279
- package/dest/utils/defaults.d.ts +0 -5
- package/dest/utils/defaults.d.ts.map +0 -1
- package/dest/utils/defaults.js +0 -5
- package/dest/utils/index.d.ts +0 -8
- package/dest/utils/index.d.ts.map +0 -1
- package/dest/utils/index.js +0 -8
- package/dest/utils/l1_contracts.d.ts +0 -32
- package/dest/utils/l1_contracts.d.ts.map +0 -1
- package/dest/utils/l1_contracts.js +0 -16
- package/dest/utils/l2_contracts.d.ts +0 -10
- package/dest/utils/l2_contracts.d.ts.map +0 -1
- package/dest/utils/l2_contracts.js +0 -10
- package/dest/utils/pub_key.d.ts +0 -8
- package/dest/utils/pub_key.d.ts.map +0 -1
- package/dest/utils/pub_key.js +0 -11
- package/dest/utils/secrets.d.ts +0 -8
- package/dest/utils/secrets.d.ts.map +0 -1
- package/dest/utils/secrets.js +0 -12
- 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 {
|
|
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
|
|
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(
|
|
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/
|
|
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 './
|
|
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[]
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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[]
|
|
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[]
|
|
114
|
-
return this.accountImpl.createTxExecutionRequest(executions
|
|
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:
|
|
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
|
-
|
|
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
|
|
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(
|
|
15
|
+
public async create(): Promise<TxExecutionRequest> {
|
|
17
16
|
if (!this.txRequest) {
|
|
18
|
-
this.txRequest = await this.wallet.createTxExecutionRequest(this.calls
|
|
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(
|
|
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 () => {
|
package/src/contract/contract.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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(
|
|
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()]
|
|
48
|
+
this.txRequest = await this.wallet.createTxExecutionRequest([this.request()]);
|
|
50
49
|
}
|
|
51
50
|
return this.txRequest;
|
|
52
51
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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
|
|
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) {}
|
package/src/sandbox/index.ts
CHANGED
|
@@ -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,
|
|
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
|
|
73
|
+
* @param rpc - The rpc client connected to the sandbox.
|
|
88
74
|
*/
|
|
89
|
-
export async function waitForSandbox(
|
|
75
|
+
export async function waitForSandbox(rpc?: AztecRPC) {
|
|
76
|
+
rpc = rpc ?? createAztecRpcClient(SANDBOX_URL);
|
|
90
77
|
while (true) {
|
|
91
78
|
try {
|
|
92
|
-
await
|
|
79
|
+
await rpc.getNodeInfo();
|
|
93
80
|
break;
|
|
94
81
|
} catch (err) {
|
|
95
82
|
await sleep(1000);
|