@aztec/aztec.js 0.1.0-alpha33 → 0.1.0-alpha35
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/.tsbuildinfo +1 -1
- package/dest/abis/ecdsa_account_contract.json +2 -2
- package/dest/abis/schnorr_account_contract.json +147 -0
- package/dest/abis/schnorr_single_key_account_contract.json +2 -2
- package/dest/account/account.d.ts +18 -5
- package/dest/account/account.d.ts.map +1 -1
- package/dest/account/account.js +36 -14
- package/dest/account/contract/schnorr_account_contract.js +3 -3
- package/dest/account/entrypoint/entrypoint_collection.d.ts +8 -0
- package/dest/account/entrypoint/entrypoint_collection.d.ts.map +1 -1
- package/dest/account/entrypoint/entrypoint_collection.js +17 -2
- package/dest/account/entrypoint/entrypoint_payload.d.ts +3 -2
- package/dest/account/entrypoint/entrypoint_payload.d.ts.map +1 -1
- package/dest/account/entrypoint/entrypoint_payload.js +6 -7
- package/dest/account/entrypoint/single_key_account_entrypoint.js +3 -3
- package/dest/account/entrypoint/stored_key_account_entrypoint.js +4 -4
- package/dest/account/index.d.ts +17 -1
- package/dest/account/index.d.ts.map +1 -1
- package/dest/account/index.js +26 -1
- package/dest/aztec_rpc_client/aztec_rpc_client.d.ts.map +1 -1
- package/dest/aztec_rpc_client/aztec_rpc_client.js +3 -3
- package/dest/aztec_rpc_client/wallet.d.ts +19 -2
- package/dest/aztec_rpc_client/wallet.d.ts.map +1 -1
- package/dest/aztec_rpc_client/wallet.js +35 -3
- package/dest/contract/contract.test.js +2 -2
- package/dest/main.js +1 -1
- package/dest/utils/account.d.ts +2 -2
- package/dest/utils/account.d.ts.map +1 -1
- package/dest/utils/account.js +4 -4
- package/package.json +4 -4
- package/src/abis/ecdsa_account_contract.json +2 -2
- package/src/abis/schnorr_account_contract.json +147 -0
- package/src/abis/schnorr_single_key_account_contract.json +2 -2
- package/src/account/account.ts +41 -16
- package/src/account/contract/schnorr_account_contract.ts +2 -2
- package/src/account/entrypoint/entrypoint_collection.ts +20 -0
- package/src/account/entrypoint/entrypoint_payload.ts +10 -6
- package/src/account/entrypoint/single_key_account_entrypoint.ts +2 -2
- package/src/account/entrypoint/stored_key_account_entrypoint.ts +3 -3
- package/src/account/index.ts +35 -1
- package/src/aztec_rpc_client/aztec_rpc_client.ts +2 -1
- package/src/aztec_rpc_client/wallet.ts +46 -3
- package/src/contract/contract.test.ts +1 -1
- package/src/utils/account.ts +3 -3
- package/dest/abis/schnorr_multi_key_account_contract.json +0 -147
- package/src/abis/schnorr_multi_key_account_contract.json +0 -147
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"isInternal": false,
|
|
8
8
|
"parameters": [],
|
|
9
9
|
"returnTypes": [],
|
|
10
|
-
"bytecode": "H4sIAAAAAAAA/
|
|
10
|
+
"bytecode": "H4sIAAAAAAAA/9Xc12/aUBzFcUKTdO/svfewsQ02XWm6994roYHu3f7/5SggRXnN4eF7JQv8Yp2PAPuO3+VfLper5LZbW/3I14/2xvvmeceu887G+52teb7WeI2CYhxXS4VqGIWbQSGrpEkQJ5ViGqZhkiZbhTSKqmmclrJKVgqyMI6qYS3Jolqw3Xp2XCvYY2tlzl5Izj5Izn5IzgFIzkFIziFIzmFIzhFIzlFIzjFIznFIzglIzklIzilIzmlIzhlIzllIzjlIznlIzgVIzkVIziVIzmVIzhVIzlVIzgCSM4TkLEByRpCcMSRnAslZhOQsQXKmkJwZJGe5RTnzu3IGe2thm9F8BmLOG81nIeZ9RvM5iLndaD4PMXcYzRcg5k6jeQ1i7jGaL0LMvUbzOsTcZzRfgpj7jebLEPOA0XwFYh40mq9CzENG8zWIedhovg4xjxjNNyDmUaP5JsQ8ZjTfgpjHjebbEPOE0XwHYp40mu9CzFNG8z2Iedpovg8xzxjNDyDmWaP5IcQ8ZzQ/gpjnjebHEPOC0fwEYl40mp9CzEtG8zOIedlofg4xrxjNLyDmVaP5JcQcGM2vIObQaH4NMReM5jcQc2Q0v4WYY6P5HcScGM0bEHPRaN6EmEtGcwViTo3m9xBzZjRvQcxlo7kKMe83mmsQ8wGj+QPEfNBo/ggxHzKaP0HMh43mzxDzEaP5C8R81Gj+CjEfM5q/QczHjebvEPMJo/kHxHzSaP4JMZ8ymn9BzKeN5t8Qc5fR/Adi7jaa/7bA3N14bf5fn/ZGaa+Q9s5oL4nGhRonadygfrT6lepnqd+h57CeS7pP676l37G+112N65Yb19ZeOO0N014p7R1q7qXRXov1+qFafNWmq1Zbtcuq5VVtq2o9VfuoWkDVxqlWTLVTqiVSbY1qTVR7oVoErc1rrVprt1rL1Nqe1rq09qO1EK0NaK5cc8eaS92oH5pr09yT5mI0N6GxusauGstpbKO+vvq+6guqb6S+gp6depbo3qp7jX57+i7qs/kPVgMtpSBRAAA=",
|
|
11
11
|
"verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
|
|
12
12
|
},
|
|
13
13
|
{
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
}
|
|
96
96
|
],
|
|
97
97
|
"returnTypes": [],
|
|
98
|
-
"bytecode": "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",
|
|
98
|
+
"bytecode": "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",
|
|
99
99
|
"verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
|
|
100
100
|
}
|
|
101
101
|
]
|
package/src/account/account.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Fr, PublicKey, getContractDeploymentInfo } from '@aztec/circuits.js';
|
|
2
2
|
import { AztecRPC, PrivateKey } from '@aztec/types';
|
|
3
3
|
|
|
4
|
-
import { AccountWallet, ContractDeployer,
|
|
4
|
+
import { AccountWallet, ContractDeployer, DeployMethod, WaitOpts, generatePublicKey } from '../index.js';
|
|
5
5
|
import { CompleteAddress, isCompleteAddress } from './complete_address.js';
|
|
6
6
|
import { DeployAccountSentTx } from './deploy_account_sent_tx.js';
|
|
7
|
-
import { AccountContract, Salt } from './index.js';
|
|
7
|
+
import { AccountContract, Entrypoint, Salt } from './index.js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Manages a user account. Provides methods for calculating the account's address, deploying the account contract,
|
|
@@ -16,6 +16,7 @@ export class Account {
|
|
|
16
16
|
|
|
17
17
|
private completeAddress?: CompleteAddress;
|
|
18
18
|
private encryptionPublicKey?: PublicKey;
|
|
19
|
+
private deployMethod?: DeployMethod;
|
|
19
20
|
|
|
20
21
|
constructor(
|
|
21
22
|
private rpc: AztecRPC,
|
|
@@ -37,6 +38,16 @@ export class Account {
|
|
|
37
38
|
return this.encryptionPublicKey;
|
|
38
39
|
}
|
|
39
40
|
|
|
41
|
+
/**
|
|
42
|
+
* Returns the entrypoint for this account as defined by its account contract.
|
|
43
|
+
* @returns An entrypoint.
|
|
44
|
+
*/
|
|
45
|
+
public async getEntrypoint(): Promise<Entrypoint> {
|
|
46
|
+
const nodeInfo = await this.rpc.getNodeInfo();
|
|
47
|
+
const completeAddress = await this.getCompleteAddress();
|
|
48
|
+
return this.accountContract.getEntrypoint(completeAddress, nodeInfo);
|
|
49
|
+
}
|
|
50
|
+
|
|
40
51
|
/**
|
|
41
52
|
* Gets the calculated complete address associated with this account.
|
|
42
53
|
* Does not require the account to be deployed or registered.
|
|
@@ -60,11 +71,9 @@ export class Account {
|
|
|
60
71
|
* instances to be interacted with from this account.
|
|
61
72
|
* @returns A Wallet instance.
|
|
62
73
|
*/
|
|
63
|
-
public async getWallet(): Promise<
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
const account = await this.accountContract.getEntrypoint(completeAddress, nodeInfo);
|
|
67
|
-
return new AccountWallet(this.rpc, account);
|
|
74
|
+
public async getWallet(): Promise<AccountWallet> {
|
|
75
|
+
const entrypoint = await this.getEntrypoint();
|
|
76
|
+
return new AccountWallet(this.rpc, entrypoint, await this.getCompleteAddress());
|
|
68
77
|
}
|
|
69
78
|
|
|
70
79
|
/**
|
|
@@ -73,12 +82,30 @@ export class Account {
|
|
|
73
82
|
* Use the returned wallet to create Contract instances to be interacted with from this account.
|
|
74
83
|
* @returns A Wallet instance.
|
|
75
84
|
*/
|
|
76
|
-
public async register(): Promise<
|
|
85
|
+
public async register(): Promise<AccountWallet> {
|
|
77
86
|
const { address, partialAddress } = await this.getCompleteAddress();
|
|
78
87
|
await this.rpc.addAccount(this.encryptionPrivateKey, address, partialAddress);
|
|
79
88
|
return this.getWallet();
|
|
80
89
|
}
|
|
81
90
|
|
|
91
|
+
/**
|
|
92
|
+
* Returns the pre-populated deployment method to deploy the account contract that backs this account.
|
|
93
|
+
* Typically you will not need this method and can call `deploy` directly. Use this for having finer
|
|
94
|
+
* grained control on when to create, simulate, and send the deployment tx.
|
|
95
|
+
* @returns A DeployMethod instance that deploys this account contract.
|
|
96
|
+
*/
|
|
97
|
+
public async getDeployMethod() {
|
|
98
|
+
if (!this.deployMethod) {
|
|
99
|
+
if (!this.salt) throw new Error(`Cannot deploy account contract without known salt.`);
|
|
100
|
+
await this.register();
|
|
101
|
+
const encryptionPublicKey = await this.getEncryptionPublicKey();
|
|
102
|
+
const deployer = new ContractDeployer(this.accountContract.getContractAbi(), this.rpc, encryptionPublicKey);
|
|
103
|
+
const args = await this.accountContract.getDeploymentArgs();
|
|
104
|
+
this.deployMethod = deployer.deploy(...args);
|
|
105
|
+
}
|
|
106
|
+
return this.deployMethod;
|
|
107
|
+
}
|
|
108
|
+
|
|
82
109
|
/**
|
|
83
110
|
* Deploys the account contract that backs this account.
|
|
84
111
|
* Uses the salt provided in the constructor or a randomly generated one.
|
|
@@ -88,12 +115,9 @@ export class Account {
|
|
|
88
115
|
* @returns A SentTx object that can be waited to get the associated Wallet.
|
|
89
116
|
*/
|
|
90
117
|
public async deploy(): Promise<DeployAccountSentTx> {
|
|
91
|
-
|
|
92
|
-
const wallet = await this.
|
|
93
|
-
const
|
|
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 });
|
|
118
|
+
const deployMethod = await this.getDeployMethod();
|
|
119
|
+
const wallet = await this.getWallet();
|
|
120
|
+
const sentTx = deployMethod.send({ contractAddressSalt: this.salt });
|
|
97
121
|
return new DeployAccountSentTx(wallet, sentTx.getTxHash());
|
|
98
122
|
}
|
|
99
123
|
|
|
@@ -106,7 +130,8 @@ export class Account {
|
|
|
106
130
|
* @param opts - Options to wait for the tx to be mined.
|
|
107
131
|
* @returns A Wallet instance.
|
|
108
132
|
*/
|
|
109
|
-
public async waitDeploy(opts: WaitOpts): Promise<
|
|
110
|
-
|
|
133
|
+
public async waitDeploy(opts: WaitOpts = {}): Promise<AccountWallet> {
|
|
134
|
+
await this.deploy().then(tx => tx.wait(opts));
|
|
135
|
+
return this.getWallet();
|
|
111
136
|
}
|
|
112
137
|
}
|
|
@@ -2,7 +2,7 @@ import { Schnorr } from '@aztec/circuits.js/barretenberg';
|
|
|
2
2
|
import { ContractAbi } from '@aztec/foundation/abi';
|
|
3
3
|
import { NodeInfo, PrivateKey } from '@aztec/types';
|
|
4
4
|
|
|
5
|
-
import
|
|
5
|
+
import SchnorrAccountContractAbi from '../../abis/schnorr_account_contract.json' assert { type: 'json' };
|
|
6
6
|
import { CompleteAddress } from '../complete_address.js';
|
|
7
7
|
import { StoredKeyAccountEntrypoint } from '../entrypoint/stored_key_account_entrypoint.js';
|
|
8
8
|
import { AccountContract } from './index.js';
|
|
@@ -24,6 +24,6 @@ export class SchnorrAccountContract implements AccountContract {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
public getContractAbi(): ContractAbi {
|
|
27
|
-
return
|
|
27
|
+
return SchnorrAccountContractAbi as ContractAbi;
|
|
28
28
|
}
|
|
29
29
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AztecAddress } from '@aztec/circuits.js';
|
|
2
2
|
import { FunctionCall, TxExecutionRequest } from '@aztec/types';
|
|
3
3
|
|
|
4
|
+
import { Account } from '../account.js';
|
|
4
5
|
import { CreateTxRequestOpts, Entrypoint } from './index.js';
|
|
5
6
|
|
|
6
7
|
/**
|
|
@@ -10,6 +11,25 @@ import { CreateTxRequestOpts, Entrypoint } from './index.js';
|
|
|
10
11
|
export class EntrypointCollection implements Entrypoint {
|
|
11
12
|
private entrypoints: Map<string, Entrypoint> = new Map();
|
|
12
13
|
|
|
14
|
+
constructor(entrypoints: [AztecAddress, Entrypoint][] = []) {
|
|
15
|
+
for (const [key, value] of entrypoints) {
|
|
16
|
+
this.registerAccount(key, value);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Creates a new instance out of a set of Accounts.
|
|
22
|
+
* @param accounts - Accounts to register in this entrypoint.
|
|
23
|
+
* @returns A new instance.
|
|
24
|
+
*/
|
|
25
|
+
static async fromAccounts(accounts: Account[]) {
|
|
26
|
+
const collection = new EntrypointCollection();
|
|
27
|
+
for (const account of accounts) {
|
|
28
|
+
collection.registerAccount((await account.getCompleteAddress()).address, await account.getEntrypoint());
|
|
29
|
+
}
|
|
30
|
+
return collection;
|
|
31
|
+
}
|
|
32
|
+
|
|
13
33
|
/**
|
|
14
34
|
* Registers an entrypoint against an aztec address
|
|
15
35
|
* @param addr - The aztec address agianst which to register the implementation.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { CircuitsWasm, Fr } from '@aztec/circuits.js';
|
|
1
|
+
import { CircuitsWasm, Fr, GeneratorIndex } from '@aztec/circuits.js';
|
|
2
|
+
import { pedersenPlookupCompressWithHashIndex } from '@aztec/circuits.js/barretenberg';
|
|
2
3
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
3
|
-
import {
|
|
4
|
+
import { IWasmModule } from '@aztec/foundation/wasm';
|
|
4
5
|
import { FunctionCall, PackedArguments, emptyFunctionCall } from '@aztec/types';
|
|
5
6
|
|
|
6
7
|
// These must match the values defined in yarn-project/noir-libs/noir-aztec/src/entrypoint.nr
|
|
@@ -60,10 +61,13 @@ export async function buildPayload(
|
|
|
60
61
|
};
|
|
61
62
|
}
|
|
62
63
|
|
|
63
|
-
/**
|
|
64
|
-
export function hashPayload(payload: EntrypointPayload) {
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
/** Compresses an entrypoint payload to a 32-byte buffer (useful for signing) */
|
|
65
|
+
export function hashPayload(payload: EntrypointPayload, wasm: IWasmModule) {
|
|
66
|
+
return pedersenPlookupCompressWithHashIndex(
|
|
67
|
+
wasm,
|
|
68
|
+
flattenPayload(payload).map(fr => fr.toBuffer()),
|
|
69
|
+
GeneratorIndex.SIGNATURE_PAYLOAD,
|
|
70
|
+
);
|
|
67
71
|
}
|
|
68
72
|
|
|
69
73
|
/** Flattens an entrypoint payload */
|
|
@@ -44,9 +44,9 @@ export class SingleKeyAccountEntrypoint implements Entrypoint {
|
|
|
44
44
|
const [privateCalls, publicCalls] = partition(executions, exec => exec.functionData.isPrivate);
|
|
45
45
|
const wasm = await CircuitsWasm.get();
|
|
46
46
|
const { payload, packedArguments: callsPackedArguments } = await buildPayload(privateCalls, publicCalls);
|
|
47
|
-
const
|
|
47
|
+
const message = hashPayload(payload, wasm);
|
|
48
48
|
|
|
49
|
-
const signature = this.signer.constructSignature(
|
|
49
|
+
const signature = this.signer.constructSignature(message, this.privateKey).toBuffer();
|
|
50
50
|
const publicKey = await generatePublicKey(this.privateKey);
|
|
51
51
|
const args = [payload, publicKey.toBuffer(), signature, this.partialContractAddress];
|
|
52
52
|
const abi = this.getEntrypointAbi();
|
|
@@ -39,9 +39,9 @@ export class StoredKeyAccountEntrypoint implements Entrypoint {
|
|
|
39
39
|
const [privateCalls, publicCalls] = partition(executions, exec => exec.functionData.isPrivate);
|
|
40
40
|
const wasm = await CircuitsWasm.get();
|
|
41
41
|
const { payload, packedArguments: callsPackedArguments } = await buildPayload(privateCalls, publicCalls);
|
|
42
|
-
const
|
|
43
|
-
const signature = this.signer.constructSignature(
|
|
44
|
-
this.log(`Signed challenge ${
|
|
42
|
+
const message = hashPayload(payload, wasm);
|
|
43
|
+
const signature = this.signer.constructSignature(message, this.privateKey).toBuffer();
|
|
44
|
+
this.log(`Signed challenge ${message.toString('hex')} as ${signature.toString('hex')}`);
|
|
45
45
|
|
|
46
46
|
const args = [payload, signature];
|
|
47
47
|
const abi = this.getEntrypointAbi();
|
package/src/account/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AztecRPC, PrivateKey } from '@aztec/types';
|
|
2
2
|
|
|
3
|
-
import { Fr } from '../index.js';
|
|
3
|
+
import { AccountContract, AccountWallet, AztecAddress, Fr } from '../index.js';
|
|
4
4
|
import { Account } from './account.js';
|
|
5
5
|
import { CompleteAddress } from './complete_address.js';
|
|
6
6
|
import { EcdsaAccountContract } from './contract/ecdsa_account_contract.js';
|
|
@@ -65,3 +65,37 @@ export function getUnsafeSchnorrAccount(
|
|
|
65
65
|
saltOrAddress,
|
|
66
66
|
);
|
|
67
67
|
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Gets a wallet for an already registered account using Schnorr signatures with a single key for encryption and authentication.
|
|
71
|
+
* @param rpc - An AztecRPC server instance.
|
|
72
|
+
* @param address - Address for the account.
|
|
73
|
+
* @param signingPrivateKey - Grumpkin key used for note encryption and signing transactions.
|
|
74
|
+
* @returns A wallet for this account that can be used to interact with a contract instance.
|
|
75
|
+
*/
|
|
76
|
+
export function getUnsafeSchnorrWallet(
|
|
77
|
+
rpc: AztecRPC,
|
|
78
|
+
address: AztecAddress,
|
|
79
|
+
signingKey: PrivateKey,
|
|
80
|
+
): Promise<AccountWallet> {
|
|
81
|
+
return getWallet(rpc, address, new SingleKeyAccountContract(signingKey));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Gets a wallet for an already registered account.
|
|
86
|
+
* @param rpc - An AztecRPC server instance.
|
|
87
|
+
* @param address - Address for the account.
|
|
88
|
+
* @param accountContract - Account contract implementation.
|
|
89
|
+
* * @returns A wallet for this account that can be used to interact with a contract instance.
|
|
90
|
+
*/
|
|
91
|
+
export async function getWallet(
|
|
92
|
+
rpc: AztecRPC,
|
|
93
|
+
address: AztecAddress,
|
|
94
|
+
accountContract: AccountContract,
|
|
95
|
+
): Promise<AccountWallet> {
|
|
96
|
+
const [publicKey, partialAddress] = await rpc.getPublicKeyAndPartialAddress(address);
|
|
97
|
+
const nodeInfo = await rpc.getNodeInfo();
|
|
98
|
+
const completeAddress: CompleteAddress = { publicKey, partialAddress, address };
|
|
99
|
+
const entrypoint = await accountContract.getEntrypoint(completeAddress, nodeInfo);
|
|
100
|
+
return new AccountWallet(rpc, entrypoint, completeAddress);
|
|
101
|
+
}
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
ContractData,
|
|
6
6
|
ContractDeploymentTx,
|
|
7
7
|
ContractPublicData,
|
|
8
|
+
L2BlockL2Logs,
|
|
8
9
|
Tx,
|
|
9
10
|
TxExecutionRequest,
|
|
10
11
|
TxHash,
|
|
@@ -27,7 +28,7 @@ export const createAztecRpcClient = (url: string, fetch = defaultFetch): AztecRP
|
|
|
27
28
|
PrivateKey,
|
|
28
29
|
Fr,
|
|
29
30
|
},
|
|
30
|
-
{ Tx, ContractDeploymentTx, TxReceipt },
|
|
31
|
+
{ Tx, ContractDeploymentTx, TxReceipt, L2BlockL2Logs },
|
|
31
32
|
false,
|
|
32
33
|
fetch,
|
|
33
34
|
);
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
AztecAddress,
|
|
3
|
+
CircuitsWasm,
|
|
4
|
+
Fr,
|
|
5
|
+
PartialContractAddress,
|
|
6
|
+
PrivateKey,
|
|
7
|
+
PublicKey,
|
|
8
|
+
TxContext,
|
|
9
|
+
} from '@aztec/circuits.js';
|
|
2
10
|
import {
|
|
3
11
|
AztecRPC,
|
|
4
12
|
ContractData,
|
|
@@ -7,6 +15,7 @@ import {
|
|
|
7
15
|
FunctionCall,
|
|
8
16
|
L2BlockL2Logs,
|
|
9
17
|
NodeInfo,
|
|
18
|
+
PackedArguments,
|
|
10
19
|
SyncStatus,
|
|
11
20
|
Tx,
|
|
12
21
|
TxExecutionRequest,
|
|
@@ -15,6 +24,7 @@ import {
|
|
|
15
24
|
} from '@aztec/types';
|
|
16
25
|
|
|
17
26
|
import { CreateTxRequestOpts, Entrypoint } from '../account/entrypoint/index.js';
|
|
27
|
+
import { CompleteAddress } from '../index.js';
|
|
18
28
|
|
|
19
29
|
/**
|
|
20
30
|
* The wallet interface.
|
|
@@ -99,9 +109,9 @@ export abstract class BaseWallet implements Wallet {
|
|
|
99
109
|
}
|
|
100
110
|
|
|
101
111
|
/**
|
|
102
|
-
* A simple wallet implementation that forwards authentication requests to a provided
|
|
112
|
+
* A simple wallet implementation that forwards authentication requests to a provided entrypoint implementation.
|
|
103
113
|
*/
|
|
104
|
-
export class
|
|
114
|
+
export class EntrypointWallet extends BaseWallet {
|
|
105
115
|
constructor(rpc: AztecRPC, protected accountImpl: Entrypoint) {
|
|
106
116
|
super(rpc);
|
|
107
117
|
}
|
|
@@ -109,3 +119,36 @@ export class AccountWallet extends BaseWallet {
|
|
|
109
119
|
return this.accountImpl.createTxExecutionRequest(executions, opts);
|
|
110
120
|
}
|
|
111
121
|
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* A wallet implementation that forwards authentication requests to a provided account.
|
|
125
|
+
*/
|
|
126
|
+
export class AccountWallet extends EntrypointWallet {
|
|
127
|
+
constructor(rpc: AztecRPC, protected accountImpl: Entrypoint, protected address: CompleteAddress) {
|
|
128
|
+
super(rpc, accountImpl);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** Returns the complete address of the account that implements this wallet. */
|
|
132
|
+
public getCompleteAddress() {
|
|
133
|
+
return this.address;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Wallet implementation which creates a transaction request directly to the requested contract without any signing.
|
|
139
|
+
*/
|
|
140
|
+
export class SignerlessWallet extends BaseWallet {
|
|
141
|
+
async createTxExecutionRequest(executions: FunctionCall[]): Promise<TxExecutionRequest> {
|
|
142
|
+
if (executions.length !== 1) {
|
|
143
|
+
throw new Error(`Unexpected number of executions. Expected 1, received ${executions.length})`);
|
|
144
|
+
}
|
|
145
|
+
const [execution] = executions;
|
|
146
|
+
const wasm = await CircuitsWasm.get();
|
|
147
|
+
const packedArguments = await PackedArguments.fromArgs(execution.args, wasm);
|
|
148
|
+
const { chainId, version } = await this.rpc.getNodeInfo();
|
|
149
|
+
const txContext = TxContext.empty(chainId, version);
|
|
150
|
+
return Promise.resolve(
|
|
151
|
+
new TxExecutionRequest(execution.to, execution.functionData, packedArguments.hash, txContext, [packedArguments]),
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
@@ -19,7 +19,7 @@ describe('Contract Class', () => {
|
|
|
19
19
|
const mockTxHash = { type: 'TxHash' } as any as TxHash;
|
|
20
20
|
const mockTxReceipt = { type: 'TxReceipt' } as any as TxReceipt;
|
|
21
21
|
const mockViewResultValue = 1;
|
|
22
|
-
const mockNodeInfo: NodeInfo = { version: 1, chainId: 2 };
|
|
22
|
+
const mockNodeInfo: NodeInfo = { version: 1, chainId: 2, rollupAddress: EthAddress.random() };
|
|
23
23
|
|
|
24
24
|
const defaultAbi: ContractAbi = {
|
|
25
25
|
name: 'FooContract',
|
package/src/utils/account.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { createDebugLogger } from '@aztec/foundation/log';
|
|
|
5
5
|
import { AztecRPC, TxStatus } from '@aztec/types';
|
|
6
6
|
|
|
7
7
|
import { SingleKeyAccountEntrypoint } from '../account/entrypoint/single_key_account_entrypoint.js';
|
|
8
|
-
import {
|
|
8
|
+
import { EntrypointWallet, Wallet } from '../aztec_rpc_client/wallet.js';
|
|
9
9
|
import { ContractDeployer, EntrypointCollection, generatePublicKey } from '../index.js';
|
|
10
10
|
|
|
11
11
|
/**
|
|
@@ -47,7 +47,7 @@ export async function createAccounts(
|
|
|
47
47
|
new SingleKeyAccountEntrypoint(address, deploymentInfo.partialAddress, privKey, await Schnorr.new()),
|
|
48
48
|
);
|
|
49
49
|
}
|
|
50
|
-
return new
|
|
50
|
+
return new EntrypointWallet(aztecRpcClient, accountImpls);
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
/**
|
|
@@ -71,5 +71,5 @@ export async function getAccountWallet(
|
|
|
71
71
|
address,
|
|
72
72
|
new SingleKeyAccountEntrypoint(address, deploymentInfo.partialAddress, privateKey, await Schnorr.new()),
|
|
73
73
|
);
|
|
74
|
-
return new
|
|
74
|
+
return new EntrypointWallet(aztecRpcClient, accountCollection);
|
|
75
75
|
}
|