@aztec/cli-wallet 0.0.1-commit.db765a8 → 0.0.1-commit.ddcf04837
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/dest/cmds/check_tx.d.ts +1 -1
- package/dest/cmds/check_tx.d.ts.map +1 -1
- package/dest/cmds/check_tx.js +36 -9
- package/dest/cmds/create_account.d.ts +4 -3
- package/dest/cmds/create_account.d.ts.map +1 -1
- package/dest/cmds/create_account.js +24 -21
- package/dest/cmds/deploy.d.ts +4 -3
- package/dest/cmds/deploy.d.ts.map +1 -1
- package/dest/cmds/deploy.js +24 -23
- package/dest/cmds/deploy_account.d.ts +4 -3
- package/dest/cmds/deploy_account.d.ts.map +1 -1
- package/dest/cmds/deploy_account.js +19 -16
- package/dest/cmds/get_fee_juice_balance.d.ts +5 -0
- package/dest/cmds/get_fee_juice_balance.d.ts.map +1 -0
- package/dest/cmds/get_fee_juice_balance.js +27 -0
- package/dest/cmds/index.d.ts +1 -1
- package/dest/cmds/index.d.ts.map +1 -1
- package/dest/cmds/index.js +30 -14
- package/dest/cmds/send.d.ts +4 -3
- package/dest/cmds/send.d.ts.map +1 -1
- package/dest/cmds/send.js +23 -22
- package/dest/storage/wallet_db.d.ts +6 -1
- package/dest/storage/wallet_db.d.ts.map +1 -1
- package/dest/storage/wallet_db.js +14 -0
- package/dest/utils/options/fees.d.ts +3 -2
- package/dest/utils/options/fees.d.ts.map +1 -1
- package/dest/utils/options/fees.js +32 -9
- package/dest/utils/wallet.d.ts +8 -7
- package/dest/utils/wallet.d.ts.map +1 -1
- package/dest/utils/wallet.js +58 -38
- package/package.json +14 -14
- package/src/cmds/check_tx.ts +43 -11
- package/src/cmds/create_account.ts +25 -16
- package/src/cmds/deploy.ts +21 -15
- package/src/cmds/deploy_account.ts +19 -11
- package/src/cmds/get_fee_juice_balance.ts +37 -0
- package/src/cmds/index.ts +56 -3
- package/src/cmds/send.ts +20 -15
- package/src/storage/wallet_db.ts +14 -0
- package/src/utils/options/fees.ts +39 -9
- package/src/utils/wallet.ts +72 -64
package/dest/utils/wallet.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { EcdsaRAccountContract, EcdsaRSSHAccountContract } from '@aztec/accounts/ecdsa';
|
|
2
2
|
import { SchnorrAccountContract } from '@aztec/accounts/schnorr';
|
|
3
|
-
import {
|
|
3
|
+
import { StubEcdsaAccountContractArtifact, createStubEcdsaAccount } from '@aztec/accounts/stub/ecdsa';
|
|
4
|
+
import { StubSchnorrAccountContractArtifact, createStubSchnorrAccount } from '@aztec/accounts/stub/schnorr';
|
|
4
5
|
import { getIdentities } from '@aztec/accounts/utils';
|
|
5
|
-
import {
|
|
6
|
+
import { NO_FROM } from '@aztec/aztec.js/account';
|
|
6
7
|
import { getContractInstanceFromInstantiationParams, getGasLimits } from '@aztec/aztec.js/contracts';
|
|
7
8
|
import { AccountManager } from '@aztec/aztec.js/wallet';
|
|
9
|
+
import { TxSimulationResultWithAppOffset } from '@aztec/aztec.js/wallet';
|
|
10
|
+
import { DefaultEntrypoint } from '@aztec/entrypoints/default';
|
|
8
11
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
9
12
|
import { createPXE, getPXEConfig } from '@aztec/pxe/server';
|
|
10
13
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
@@ -28,20 +31,28 @@ export class CLIWallet extends BaseWallet {
|
|
|
28
31
|
}
|
|
29
32
|
async getAccounts() {
|
|
30
33
|
const accounts = await this.db?.listAliases('accounts') ?? [];
|
|
31
|
-
return Promise.resolve(accounts.map(({ key, value })=>
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
return Promise.resolve(accounts.map(({ key, value })=>{
|
|
35
|
+
const alias = key.includes(':') ? key.slice(key.indexOf(':') + 1) : key;
|
|
36
|
+
return {
|
|
37
|
+
alias,
|
|
38
|
+
item: AztecAddress.fromString(value)
|
|
39
|
+
};
|
|
40
|
+
}));
|
|
35
41
|
}
|
|
36
42
|
async createCancellationTxExecutionRequest(from, txNonce, increasedFee) {
|
|
37
43
|
const executionPayload = ExecutionPayload.empty();
|
|
38
|
-
const feeOptions = await this.completeFeeOptions(
|
|
44
|
+
const feeOptions = await this.completeFeeOptions({
|
|
45
|
+
from,
|
|
46
|
+
feePayer: executionPayload.feePayer,
|
|
47
|
+
gasSettings: increasedFee.gasSettings
|
|
48
|
+
});
|
|
39
49
|
const feeExecutionPayload = await feeOptions.walletFeePaymentMethod?.getExecutionPayload();
|
|
40
50
|
const fromAccount = await this.getAccountFromAddress(from);
|
|
41
51
|
const chainInfo = await this.getChainInfo();
|
|
42
52
|
const executionOptions = {
|
|
43
53
|
txNonce,
|
|
44
54
|
cancellable: this.cancellableTransactions,
|
|
55
|
+
// If from is an address, feeOptions include the way the account contract should handle the fee payment
|
|
45
56
|
feePaymentMethodOptions: feeOptions.accountFeePaymentMethodOptions
|
|
46
57
|
};
|
|
47
58
|
return await fromAccount.createTxExecutionRequest(feeExecutionPayload ?? executionPayload, feeOptions.gasSettings, chainInfo, executionOptions);
|
|
@@ -52,9 +63,7 @@ export class CLIWallet extends BaseWallet {
|
|
|
52
63
|
}
|
|
53
64
|
async getAccountFromAddress(address) {
|
|
54
65
|
let account;
|
|
55
|
-
if (address.
|
|
56
|
-
account = new SignerlessAccount();
|
|
57
|
-
} else if (this.accountCache.has(address.toString())) {
|
|
66
|
+
if (this.accountCache.has(address.toString())) {
|
|
58
67
|
return this.accountCache.get(address.toString());
|
|
59
68
|
} else {
|
|
60
69
|
const accountManager = await this.createOrRetrieveAccount(address);
|
|
@@ -125,31 +134,32 @@ export class CLIWallet extends BaseWallet {
|
|
|
125
134
|
* @returns The stub account, contract instance, and artifact for simulation
|
|
126
135
|
*/ async getFakeAccountDataFor(address) {
|
|
127
136
|
const originalAccount = await this.getAccountFromAddress(address);
|
|
128
|
-
// Account contracts can only be overridden if they have an associated address
|
|
129
|
-
// Overwriting SignerlessAccount is not supported, and does not really make sense
|
|
130
|
-
// since it has no authorization mechanism.
|
|
131
|
-
if (originalAccount instanceof SignerlessAccount) {
|
|
132
|
-
throw new Error(`Cannot create fake account data for SignerlessAccount at address: ${address}`);
|
|
133
|
-
}
|
|
134
137
|
const originalAddress = originalAccount.getCompleteAddress();
|
|
135
138
|
const contractInstance = await this.pxe.getContractInstance(originalAddress.address);
|
|
136
139
|
if (!contractInstance) {
|
|
137
140
|
throw new Error(`No contract instance found for address: ${originalAddress.address}`);
|
|
138
141
|
}
|
|
139
|
-
const
|
|
140
|
-
const
|
|
142
|
+
const { type } = await this.db.retrieveAccount(address);
|
|
143
|
+
const isSchnorr = type === 'schnorr';
|
|
144
|
+
const artifact = isSchnorr ? StubSchnorrAccountContractArtifact : StubEcdsaAccountContractArtifact;
|
|
145
|
+
const stubAccount = isSchnorr ? createStubSchnorrAccount(originalAddress) : createStubEcdsaAccount(originalAddress);
|
|
146
|
+
const instance = await getContractInstanceFromInstantiationParams(artifact, {
|
|
141
147
|
salt: Fr.random()
|
|
142
148
|
});
|
|
143
149
|
return {
|
|
144
150
|
account: stubAccount,
|
|
145
151
|
instance,
|
|
146
|
-
artifact
|
|
152
|
+
artifact
|
|
147
153
|
};
|
|
148
154
|
}
|
|
149
155
|
async simulateTx(executionPayload, opts) {
|
|
150
156
|
const simulationResults = await super.simulateTx(executionPayload, opts);
|
|
151
157
|
if (opts.fee?.estimateGas) {
|
|
152
|
-
const feeOptions = await this.completeFeeOptions(
|
|
158
|
+
const feeOptions = await this.completeFeeOptions({
|
|
159
|
+
from: opts.from,
|
|
160
|
+
feePayer: executionPayload.feePayer,
|
|
161
|
+
gasSettings: opts.fee?.gasSettings
|
|
162
|
+
});
|
|
153
163
|
const limits = getGasLimits(simulationResults, opts.fee?.estimatedGasPadding);
|
|
154
164
|
printGasEstimates(feeOptions, limits, this.userLog);
|
|
155
165
|
}
|
|
@@ -157,38 +167,48 @@ export class CLIWallet extends BaseWallet {
|
|
|
157
167
|
}
|
|
158
168
|
/**
|
|
159
169
|
* Uses a stub account for kernelless simulation, bypassing real account authorization.
|
|
160
|
-
*
|
|
161
|
-
*/ async simulateViaEntrypoint(executionPayload,
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}
|
|
170
|
+
* Uses DefaultEntrypoint directly for NO_FROM transactions.
|
|
171
|
+
*/ async simulateViaEntrypoint(executionPayload, opts) {
|
|
172
|
+
const { from, feeOptions, additionalScopes } = opts;
|
|
173
|
+
const scopes = this.scopesFrom(from, additionalScopes);
|
|
165
174
|
const feeExecutionPayload = await feeOptions.walletFeePaymentMethod?.getExecutionPayload();
|
|
166
|
-
const executionOptions = {
|
|
167
|
-
txNonce: Fr.random(),
|
|
168
|
-
cancellable: this.cancellableTransactions,
|
|
169
|
-
feePaymentMethodOptions: feeOptions.accountFeePaymentMethodOptions
|
|
170
|
-
};
|
|
171
175
|
const finalExecutionPayload = feeExecutionPayload ? mergeExecutionPayloads([
|
|
172
176
|
feeExecutionPayload,
|
|
173
177
|
executionPayload
|
|
174
178
|
]) : executionPayload;
|
|
175
|
-
const { account: fromAccount, instance, artifact } = await this.getFakeAccountDataFor(from);
|
|
176
179
|
const chainInfo = await this.getChainInfo();
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
180
|
+
let overrides;
|
|
181
|
+
let txRequest;
|
|
182
|
+
if (from === NO_FROM) {
|
|
183
|
+
const entrypoint = new DefaultEntrypoint();
|
|
184
|
+
txRequest = await entrypoint.createTxExecutionRequest(finalExecutionPayload, feeOptions.gasSettings, chainInfo);
|
|
185
|
+
} else {
|
|
186
|
+
const { account, instance, artifact } = await this.getFakeAccountDataFor(from);
|
|
187
|
+
overrides = {
|
|
183
188
|
contracts: {
|
|
184
189
|
[from.toString()]: {
|
|
185
190
|
instance,
|
|
186
191
|
artifact
|
|
187
192
|
}
|
|
188
193
|
}
|
|
189
|
-
}
|
|
194
|
+
};
|
|
195
|
+
const executionOptions = {
|
|
196
|
+
txNonce: Fr.random(),
|
|
197
|
+
cancellable: this.cancellableTransactions,
|
|
198
|
+
// If from is an address, feeOptions include the way the account contract should handle the fee payment
|
|
199
|
+
feePaymentMethodOptions: feeOptions.accountFeePaymentMethodOptions
|
|
200
|
+
};
|
|
201
|
+
txRequest = await account.createTxExecutionRequest(finalExecutionPayload, feeOptions.gasSettings, chainInfo, executionOptions);
|
|
202
|
+
}
|
|
203
|
+
const result = await this.pxe.simulateTx(txRequest, {
|
|
204
|
+
simulatePublic: true,
|
|
205
|
+
skipFeeEnforcement: true,
|
|
206
|
+
skipTxValidation: true,
|
|
207
|
+
overrides,
|
|
190
208
|
scopes
|
|
191
209
|
});
|
|
210
|
+
const appCallOffset = await this.computeAppCallOffset(from, feeOptions);
|
|
211
|
+
return TxSimulationResultWithAppOffset.fromResultAndOffset(result, appCallOffset);
|
|
192
212
|
}
|
|
193
213
|
// Exposed because of the `aztec-wallet get-tx` command. It has been decided that it's fine to keep around because
|
|
194
214
|
// this is just a CLI wallet.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/cli-wallet",
|
|
3
|
-
"version": "0.0.1-commit.
|
|
3
|
+
"version": "0.0.1-commit.ddcf04837",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/cmds/index.js",
|
|
@@ -67,19 +67,19 @@
|
|
|
67
67
|
]
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
-
"@aztec/accounts": "0.0.1-commit.
|
|
71
|
-
"@aztec/aztec.js": "0.0.1-commit.
|
|
72
|
-
"@aztec/bb.js": "0.0.1-commit.
|
|
73
|
-
"@aztec/cli": "0.0.1-commit.
|
|
74
|
-
"@aztec/entrypoints": "0.0.1-commit.
|
|
75
|
-
"@aztec/ethereum": "0.0.1-commit.
|
|
76
|
-
"@aztec/foundation": "0.0.1-commit.
|
|
77
|
-
"@aztec/kv-store": "0.0.1-commit.
|
|
78
|
-
"@aztec/noir-contracts.js": "0.0.1-commit.
|
|
79
|
-
"@aztec/noir-noirc_abi": "0.0.1-commit.
|
|
80
|
-
"@aztec/pxe": "0.0.1-commit.
|
|
81
|
-
"@aztec/stdlib": "0.0.1-commit.
|
|
82
|
-
"@aztec/wallet-sdk": "0.0.1-commit.
|
|
70
|
+
"@aztec/accounts": "0.0.1-commit.ddcf04837",
|
|
71
|
+
"@aztec/aztec.js": "0.0.1-commit.ddcf04837",
|
|
72
|
+
"@aztec/bb.js": "0.0.1-commit.ddcf04837",
|
|
73
|
+
"@aztec/cli": "0.0.1-commit.ddcf04837",
|
|
74
|
+
"@aztec/entrypoints": "0.0.1-commit.ddcf04837",
|
|
75
|
+
"@aztec/ethereum": "0.0.1-commit.ddcf04837",
|
|
76
|
+
"@aztec/foundation": "0.0.1-commit.ddcf04837",
|
|
77
|
+
"@aztec/kv-store": "0.0.1-commit.ddcf04837",
|
|
78
|
+
"@aztec/noir-contracts.js": "0.0.1-commit.ddcf04837",
|
|
79
|
+
"@aztec/noir-noirc_abi": "0.0.1-commit.ddcf04837",
|
|
80
|
+
"@aztec/pxe": "0.0.1-commit.ddcf04837",
|
|
81
|
+
"@aztec/stdlib": "0.0.1-commit.ddcf04837",
|
|
82
|
+
"@aztec/wallet-sdk": "0.0.1-commit.ddcf04837",
|
|
83
83
|
"commander": "^12.1.0",
|
|
84
84
|
"inquirer": "^10.1.8",
|
|
85
85
|
"source-map-support": "^0.5.21",
|
package/src/cmds/check_tx.ts
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import type { ContractArtifact } from '@aztec/aztec.js/abi';
|
|
2
|
-
import
|
|
2
|
+
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
3
3
|
import { Fr } from '@aztec/aztec.js/fields';
|
|
4
4
|
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
5
5
|
import { ProtocolContractAddress } from '@aztec/aztec.js/protocol';
|
|
6
6
|
import type { TxHash } from '@aztec/aztec.js/tx';
|
|
7
7
|
import type { LogFn } from '@aztec/foundation/log';
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
computeSiloedPrivateInitializationNullifier,
|
|
10
|
+
computeSiloedPublicInitializationNullifier,
|
|
11
|
+
siloNullifier,
|
|
12
|
+
} from '@aztec/stdlib/hash';
|
|
9
13
|
import { NoteDao } from '@aztec/stdlib/note';
|
|
10
14
|
|
|
11
15
|
import type { CLIWallet } from '../utils/wallet.js';
|
|
@@ -83,12 +87,13 @@ async function inspectTx(wallet: CLIWallet, aztecNode: AztecNode, txHash: TxHash
|
|
|
83
87
|
// Nullifiers
|
|
84
88
|
const nullifierCount = effects.nullifiers.length;
|
|
85
89
|
const { deployNullifiers, initNullifiers, classNullifiers } = await getKnownNullifiers(wallet, artifactMap);
|
|
90
|
+
const accounts = (await wallet.getAccounts()).map(a => a.item);
|
|
86
91
|
if (nullifierCount > 0) {
|
|
87
92
|
log(' Nullifiers:');
|
|
88
93
|
for (const nullifier of effects.nullifiers) {
|
|
89
94
|
const deployed = deployNullifiers[nullifier.toString()];
|
|
90
95
|
const note = deployed
|
|
91
|
-
? (await wallet.getNotes({ siloedNullifier: nullifier, contractAddress: deployed, scopes:
|
|
96
|
+
? (await wallet.getNotes({ siloedNullifier: nullifier, contractAddress: deployed, scopes: accounts }))[0]
|
|
92
97
|
: undefined;
|
|
93
98
|
const initialized = initNullifiers[nullifier.toString()];
|
|
94
99
|
const registered = classNullifiers[nullifier.toString()];
|
|
@@ -144,22 +149,49 @@ function toFriendlyAddress(address: AztecAddress, artifactMap: ArtifactMap) {
|
|
|
144
149
|
|
|
145
150
|
async function getKnownNullifiers(wallet: CLIWallet, artifactMap: ArtifactMap) {
|
|
146
151
|
const knownContracts = await wallet.getContracts();
|
|
147
|
-
|
|
148
|
-
const
|
|
152
|
+
|
|
153
|
+
const [contractResults, classResults] = await Promise.all([
|
|
154
|
+
Promise.all(knownContracts.map(contract => getContractNullifiers(wallet, contract))),
|
|
155
|
+
Promise.all(Object.values(artifactMap).map(artifact => getClassNullifier(artifact))),
|
|
156
|
+
]);
|
|
157
|
+
|
|
149
158
|
const initNullifiers: Record<string, AztecAddress> = {};
|
|
150
159
|
const deployNullifiers: Record<string, AztecAddress> = {};
|
|
151
160
|
const classNullifiers: Record<string, string> = {};
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
deployNullifiers[
|
|
161
|
+
|
|
162
|
+
for (const { contract, deployNullifier, privateInitNullifier, publicInitNullifier } of contractResults) {
|
|
163
|
+
deployNullifiers[deployNullifier.toString()] = contract;
|
|
164
|
+
if (privateInitNullifier) {
|
|
165
|
+
initNullifiers[privateInitNullifier.toString()] = contract;
|
|
166
|
+
}
|
|
167
|
+
initNullifiers[publicInitNullifier.toString()] = contract;
|
|
155
168
|
}
|
|
156
|
-
for (const
|
|
157
|
-
classNullifiers[
|
|
158
|
-
`${artifact.name}Class<${artifact.classId}>`;
|
|
169
|
+
for (const { nullifier, label } of classResults) {
|
|
170
|
+
classNullifiers[nullifier.toString()] = label;
|
|
159
171
|
}
|
|
172
|
+
|
|
160
173
|
return { initNullifiers, deployNullifiers, classNullifiers };
|
|
161
174
|
}
|
|
162
175
|
|
|
176
|
+
async function getContractNullifiers(wallet: CLIWallet, contract: AztecAddress) {
|
|
177
|
+
const deployerAddress = ProtocolContractAddress.ContractInstanceRegistry;
|
|
178
|
+
const deployNullifier = await siloNullifier(deployerAddress, contract.toField());
|
|
179
|
+
|
|
180
|
+
const metadata = await wallet.getContractMetadata(contract);
|
|
181
|
+
const privateInitNullifier = metadata.instance
|
|
182
|
+
? await computeSiloedPrivateInitializationNullifier(contract, metadata.instance.initializationHash)
|
|
183
|
+
: undefined;
|
|
184
|
+
const publicInitNullifier = await computeSiloedPublicInitializationNullifier(contract);
|
|
185
|
+
|
|
186
|
+
return { contract, deployNullifier, privateInitNullifier, publicInitNullifier };
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
async function getClassNullifier(artifact: ContractArtifactWithClassId) {
|
|
190
|
+
const classRegistryAddress = ProtocolContractAddress.ContractClassRegistry;
|
|
191
|
+
const nullifier = await siloNullifier(classRegistryAddress, artifact.classId);
|
|
192
|
+
return { nullifier, label: `${artifact.name}Class<${artifact.classId}>` };
|
|
193
|
+
}
|
|
194
|
+
|
|
163
195
|
type ArtifactMap = Record<string, ContractArtifactWithClassId>;
|
|
164
196
|
type ContractArtifactWithClassId = ContractArtifact & { classId: Fr };
|
|
165
197
|
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import { NO_FROM } from '@aztec/aztec.js/account';
|
|
1
2
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
3
|
import { NO_WAIT } from '@aztec/aztec.js/contracts';
|
|
3
|
-
import type
|
|
4
|
+
import { type AztecNode, waitForTx } from '@aztec/aztec.js/node';
|
|
4
5
|
import type { DeployAccountOptions } from '@aztec/aztec.js/wallet';
|
|
5
6
|
import { prettyPrintJSON } from '@aztec/cli/cli-utils';
|
|
6
7
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
7
8
|
import type { LogFn, Logger } from '@aztec/foundation/log';
|
|
8
|
-
import type
|
|
9
|
+
import { type TxHash, type TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
9
10
|
|
|
10
11
|
import { DEFAULT_TX_TIMEOUT_S } from '../utils/cli_wallet_and_node_wrapper.js';
|
|
11
12
|
import type { AccountType } from '../utils/constants.js';
|
|
@@ -18,6 +19,7 @@ export async function createAccount(
|
|
|
18
19
|
aztecNode: AztecNode,
|
|
19
20
|
accountType: AccountType,
|
|
20
21
|
secretKey: Fr | undefined,
|
|
22
|
+
salt: Fr | undefined,
|
|
21
23
|
publicKey: string | undefined,
|
|
22
24
|
alias: string | undefined,
|
|
23
25
|
deployer: AztecAddress | undefined,
|
|
@@ -27,6 +29,7 @@ export async function createAccount(
|
|
|
27
29
|
registerClass: boolean,
|
|
28
30
|
wait: boolean,
|
|
29
31
|
feeOpts: CLIFeeArgs,
|
|
32
|
+
waitForStatus: TxStatus,
|
|
30
33
|
json: boolean,
|
|
31
34
|
verbose: boolean,
|
|
32
35
|
debugLogger: Logger,
|
|
@@ -38,10 +41,10 @@ export async function createAccount(
|
|
|
38
41
|
undefined /* address, we don't have it yet */,
|
|
39
42
|
secretKey,
|
|
40
43
|
accountType,
|
|
41
|
-
|
|
44
|
+
salt,
|
|
42
45
|
publicKey,
|
|
43
46
|
);
|
|
44
|
-
const
|
|
47
|
+
const instanceSalt = account.getInstance().salt;
|
|
45
48
|
const { address, publicKeys, partialAddress } = await account.getCompleteAddress();
|
|
46
49
|
|
|
47
50
|
const out: Record<string, any> = {};
|
|
@@ -52,7 +55,7 @@ export async function createAccount(
|
|
|
52
55
|
out.secretKey = secretKey;
|
|
53
56
|
}
|
|
54
57
|
out.partialAddress = partialAddress;
|
|
55
|
-
out.salt =
|
|
58
|
+
out.salt = instanceSalt;
|
|
56
59
|
out.initHash = account.getInstance().initializationHash;
|
|
57
60
|
} else {
|
|
58
61
|
log(`\nNew account:\n`);
|
|
@@ -62,7 +65,7 @@ export async function createAccount(
|
|
|
62
65
|
log(`Secret key: ${secretKey.toString()}`);
|
|
63
66
|
}
|
|
64
67
|
log(`Partial address: ${partialAddress.toString()}`);
|
|
65
|
-
log(`Salt: ${
|
|
68
|
+
log(`Salt: ${instanceSalt.toString()}`);
|
|
66
69
|
log(`Init hash: ${account.getInstance().initializationHash.toString()}`);
|
|
67
70
|
}
|
|
68
71
|
|
|
@@ -72,7 +75,7 @@ export async function createAccount(
|
|
|
72
75
|
const { paymentMethod, gasSettings } = await feeOpts.toUserFeeOptions(aztecNode, wallet, address);
|
|
73
76
|
|
|
74
77
|
const delegatedDeployment = deployer && !account.address.equals(deployer);
|
|
75
|
-
const from = delegatedDeployment ? deployer :
|
|
78
|
+
const from = delegatedDeployment ? deployer : NO_FROM;
|
|
76
79
|
|
|
77
80
|
const deployAccountOpts: DeployAccountOptions = {
|
|
78
81
|
skipClassPublication: !registerClass,
|
|
@@ -82,6 +85,7 @@ export async function createAccount(
|
|
|
82
85
|
fee: { paymentMethod, gasSettings },
|
|
83
86
|
};
|
|
84
87
|
|
|
88
|
+
const localStart = performance.now();
|
|
85
89
|
const deployMethod = await account.getDeployMethod();
|
|
86
90
|
const sim = await deployMethod.simulate({
|
|
87
91
|
...deployAccountOpts,
|
|
@@ -121,19 +125,24 @@ export async function createAccount(
|
|
|
121
125
|
}
|
|
122
126
|
: undefined,
|
|
123
127
|
};
|
|
128
|
+
|
|
129
|
+
({ txHash } = await deployMethod.send({ ...sendOpts, wait: NO_WAIT }));
|
|
130
|
+
const localTimeMs = performance.now() - localStart;
|
|
131
|
+
|
|
124
132
|
if (wait) {
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
txReceipt = receipt;
|
|
130
|
-
txHash = receipt.txHash;
|
|
133
|
+
const nodeStart = performance.now();
|
|
134
|
+
txReceipt = await waitForTx(aztecNode, txHash, { timeout: DEFAULT_TX_TIMEOUT_S, waitForStatus });
|
|
135
|
+
const nodeTimeMs = performance.now() - nodeStart;
|
|
136
|
+
|
|
131
137
|
out.txReceipt = {
|
|
132
138
|
status: txReceipt.status,
|
|
133
139
|
transactionFee: txReceipt.transactionFee,
|
|
134
140
|
};
|
|
135
|
-
|
|
136
|
-
(
|
|
141
|
+
|
|
142
|
+
if (!json) {
|
|
143
|
+
log(` Local processing time: ${(localTimeMs / 1000).toFixed(1)}s`);
|
|
144
|
+
log(` Node inclusion time: ${(nodeTimeMs / 1000).toFixed(1)}s`);
|
|
145
|
+
}
|
|
137
146
|
}
|
|
138
147
|
debugLogger.debug(`Account contract tx sent with hash ${txHash.toString()}`);
|
|
139
148
|
out.txHash = txHash;
|
|
@@ -151,5 +160,5 @@ export async function createAccount(
|
|
|
151
160
|
}
|
|
152
161
|
}
|
|
153
162
|
|
|
154
|
-
return { alias, address, secretKey, salt };
|
|
163
|
+
return { alias, address, secretKey, salt: instanceSalt };
|
|
155
164
|
}
|
package/src/cmds/deploy.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
|
+
import { NO_FROM } from '@aztec/aztec.js/account';
|
|
1
2
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
3
|
import type { DeployOptions } from '@aztec/aztec.js/contracts';
|
|
3
4
|
import { NO_WAIT } from '@aztec/aztec.js/contracts';
|
|
4
5
|
import { ContractDeployer } from '@aztec/aztec.js/deployment';
|
|
5
6
|
import { Fr } from '@aztec/aztec.js/fields';
|
|
6
|
-
import type
|
|
7
|
+
import { type AztecNode, waitForTx } from '@aztec/aztec.js/node';
|
|
7
8
|
import { encodeArgs, getContractArtifact, prettyPrintJSON } from '@aztec/cli/utils';
|
|
8
9
|
import type { LogFn, Logger } from '@aztec/foundation/log';
|
|
9
10
|
import { getAllFunctionAbis, getInitializer } from '@aztec/stdlib/abi';
|
|
10
11
|
import { PublicKeys } from '@aztec/stdlib/keys';
|
|
12
|
+
import type { TxStatus } from '@aztec/stdlib/tx';
|
|
11
13
|
|
|
12
14
|
import { DEFAULT_TX_TIMEOUT_S } from '../utils/cli_wallet_and_node_wrapper.js';
|
|
13
15
|
import { CLIFeeArgs } from '../utils/options/fees.js';
|
|
@@ -29,6 +31,7 @@ export async function deploy(
|
|
|
29
31
|
skipInitialization: boolean | undefined,
|
|
30
32
|
wait: boolean,
|
|
31
33
|
feeOpts: CLIFeeArgs,
|
|
34
|
+
waitForStatus: TxStatus,
|
|
32
35
|
verbose: boolean,
|
|
33
36
|
timeout: number = DEFAULT_TX_TIMEOUT_S,
|
|
34
37
|
debugLogger: Logger,
|
|
@@ -59,11 +62,11 @@ export async function deploy(
|
|
|
59
62
|
debugLogger.debug(`Encoded arguments: ${args.join(', ')}`);
|
|
60
63
|
}
|
|
61
64
|
|
|
62
|
-
const
|
|
65
|
+
const deployInteraction = contractDeployer.deploy(...args);
|
|
63
66
|
const { paymentMethod, gasSettings } = await feeOpts.toUserFeeOptions(node, wallet, deployer);
|
|
64
67
|
const deployOpts: DeployOptions = {
|
|
65
68
|
fee: { gasSettings, paymentMethod },
|
|
66
|
-
from: deployer ??
|
|
69
|
+
from: deployer ?? NO_FROM,
|
|
67
70
|
contractAddressSalt: salt,
|
|
68
71
|
universalDeploy: !deployer,
|
|
69
72
|
skipClassPublication,
|
|
@@ -71,7 +74,8 @@ export async function deploy(
|
|
|
71
74
|
skipInstancePublication,
|
|
72
75
|
};
|
|
73
76
|
|
|
74
|
-
const
|
|
77
|
+
const localStart = performance.now();
|
|
78
|
+
const sim = await deployInteraction.simulate({
|
|
75
79
|
...deployOpts,
|
|
76
80
|
fee: { ...deployOpts.fee, estimateGas: true },
|
|
77
81
|
});
|
|
@@ -97,14 +101,18 @@ export async function deploy(
|
|
|
97
101
|
printProfileResult(stats, log);
|
|
98
102
|
}
|
|
99
103
|
|
|
100
|
-
const { address, partialAddress } =
|
|
101
|
-
const instance = await
|
|
104
|
+
const { address, partialAddress } = deployInteraction;
|
|
105
|
+
const instance = await deployInteraction.getInstance();
|
|
106
|
+
|
|
107
|
+
const { txHash } = await deployInteraction.send({ ...deployOpts, wait: NO_WAIT });
|
|
108
|
+
const localTimeMs = performance.now() - localStart;
|
|
109
|
+
debugLogger.debug(`Deploy tx sent with hash ${txHash.toString()}`);
|
|
110
|
+
out.hash = txHash;
|
|
102
111
|
|
|
103
112
|
if (wait) {
|
|
104
|
-
const
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
out.hash = txHash;
|
|
113
|
+
const nodeStart = performance.now();
|
|
114
|
+
const receipt = await waitForTx(node, txHash, { timeout, waitForStatus });
|
|
115
|
+
const nodeTimeMs = performance.now() - nodeStart;
|
|
108
116
|
|
|
109
117
|
if (!json) {
|
|
110
118
|
log(`Contract deployed at ${address?.toString()}`);
|
|
@@ -114,6 +122,8 @@ export async function deploy(
|
|
|
114
122
|
log(`Deployment salt: ${salt.toString()}`);
|
|
115
123
|
log(`Deployer: ${instance.deployer.toString()}`);
|
|
116
124
|
log(`Transaction fee: ${receipt.transactionFee?.toString()}`);
|
|
125
|
+
log(` Local processing time: ${(localTimeMs / 1000).toFixed(1)}s`);
|
|
126
|
+
log(` Node inclusion time: ${(nodeTimeMs / 1000).toFixed(1)}s`);
|
|
117
127
|
} else {
|
|
118
128
|
out.contract = {
|
|
119
129
|
address: address?.toString(),
|
|
@@ -124,10 +134,6 @@ export async function deploy(
|
|
|
124
134
|
};
|
|
125
135
|
}
|
|
126
136
|
} else {
|
|
127
|
-
const { txHash } = await deploy.send({ ...deployOpts, wait: NO_WAIT });
|
|
128
|
-
debugLogger.debug(`Deploy tx sent with hash ${txHash.toString()}`);
|
|
129
|
-
out.hash = txHash;
|
|
130
|
-
|
|
131
137
|
if (!json) {
|
|
132
138
|
log(`Contract deployed at ${address?.toString()}`);
|
|
133
139
|
log(`Contract partial address ${(await partialAddress)?.toString()}`);
|
|
@@ -148,5 +154,5 @@ export async function deploy(
|
|
|
148
154
|
if (json) {
|
|
149
155
|
log(prettyPrintJSON(out));
|
|
150
156
|
}
|
|
151
|
-
return
|
|
157
|
+
return deployInteraction.address;
|
|
152
158
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { NO_FROM } from '@aztec/aztec.js/account';
|
|
1
2
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
3
|
import { NO_WAIT } from '@aztec/aztec.js/contracts';
|
|
3
|
-
import type
|
|
4
|
+
import { type AztecNode, waitForTx } from '@aztec/aztec.js/node';
|
|
4
5
|
import type { DeployAccountOptions } from '@aztec/aztec.js/wallet';
|
|
5
6
|
import { prettyPrintJSON } from '@aztec/cli/cli-utils';
|
|
6
7
|
import type { LogFn, Logger } from '@aztec/foundation/log';
|
|
7
|
-
import type { TxHash, TxReceipt } from '@aztec/stdlib/tx';
|
|
8
|
+
import type { TxHash, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
8
9
|
|
|
9
10
|
import { DEFAULT_TX_TIMEOUT_S } from '../utils/cli_wallet_and_node_wrapper.js';
|
|
10
11
|
import type { CLIFeeArgs } from '../utils/options/fees.js';
|
|
@@ -21,6 +22,7 @@ export async function deployAccount(
|
|
|
21
22
|
publicDeploy: boolean,
|
|
22
23
|
skipInitialization: boolean,
|
|
23
24
|
feeOpts: CLIFeeArgs,
|
|
25
|
+
waitForStatus: TxStatus,
|
|
24
26
|
json: boolean,
|
|
25
27
|
verbose: boolean,
|
|
26
28
|
debugLogger: Logger,
|
|
@@ -52,7 +54,7 @@ export async function deployAccount(
|
|
|
52
54
|
const { paymentMethod, gasSettings } = await feeOpts.toUserFeeOptions(aztecNode, wallet, address);
|
|
53
55
|
|
|
54
56
|
const delegatedDeployment = deployer && !account.address.equals(deployer);
|
|
55
|
-
const from = delegatedDeployment ? deployer :
|
|
57
|
+
const from = delegatedDeployment ? deployer : NO_FROM;
|
|
56
58
|
|
|
57
59
|
const deployAccountOpts: DeployAccountOptions = {
|
|
58
60
|
skipClassPublication: !registerClass,
|
|
@@ -62,6 +64,7 @@ export async function deployAccount(
|
|
|
62
64
|
fee: { paymentMethod, gasSettings },
|
|
63
65
|
};
|
|
64
66
|
|
|
67
|
+
const localStart = performance.now();
|
|
65
68
|
const deployMethod = await account.getDeployMethod();
|
|
66
69
|
const sim = await deployMethod.simulate({
|
|
67
70
|
...deployAccountOpts,
|
|
@@ -101,19 +104,24 @@ export async function deployAccount(
|
|
|
101
104
|
}
|
|
102
105
|
: undefined,
|
|
103
106
|
};
|
|
107
|
+
|
|
108
|
+
({ txHash } = await deployMethod.send({ ...sendOpts, wait: NO_WAIT }));
|
|
109
|
+
const localTimeMs = performance.now() - localStart;
|
|
110
|
+
|
|
104
111
|
if (wait) {
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
txReceipt = receipt;
|
|
110
|
-
txHash = receipt.txHash;
|
|
112
|
+
const nodeStart = performance.now();
|
|
113
|
+
txReceipt = await waitForTx(aztecNode, txHash, { timeout: DEFAULT_TX_TIMEOUT_S, waitForStatus });
|
|
114
|
+
const nodeTimeMs = performance.now() - nodeStart;
|
|
115
|
+
|
|
111
116
|
out.txReceipt = {
|
|
112
117
|
status: txReceipt.status,
|
|
113
118
|
transactionFee: txReceipt.transactionFee,
|
|
114
119
|
};
|
|
115
|
-
|
|
116
|
-
(
|
|
120
|
+
|
|
121
|
+
if (!json) {
|
|
122
|
+
log(` Local processing time: ${(localTimeMs / 1000).toFixed(1)}s`);
|
|
123
|
+
log(` Node inclusion time: ${(nodeTimeMs / 1000).toFixed(1)}s`);
|
|
124
|
+
}
|
|
117
125
|
}
|
|
118
126
|
debugLogger.debug(`Account contract tx sent with hash ${txHash.toString()}`);
|
|
119
127
|
out.txHash = txHash;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
|
+
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
3
|
+
import { getFeeJuiceBalance } from '@aztec/aztec.js/utils';
|
|
4
|
+
import { prettyPrintJSON } from '@aztec/cli/cli-utils';
|
|
5
|
+
import type { LogFn } from '@aztec/foundation/log';
|
|
6
|
+
|
|
7
|
+
const FEE_JUICE_DECIMALS = 18;
|
|
8
|
+
const FEE_JUICE_UNIT = 10n ** BigInt(FEE_JUICE_DECIMALS);
|
|
9
|
+
|
|
10
|
+
/** Formats a raw FeeJuice balance (18 decimals) for human-readable display. */
|
|
11
|
+
function formatFeeJuice(raw: bigint, exact: boolean): string {
|
|
12
|
+
const whole = raw / FEE_JUICE_UNIT;
|
|
13
|
+
const fractional = raw % FEE_JUICE_UNIT;
|
|
14
|
+
const fracStr = fractional.toString().padStart(FEE_JUICE_DECIMALS, '0');
|
|
15
|
+
if (exact) {
|
|
16
|
+
return `${whole}.${fracStr} FJ`;
|
|
17
|
+
}
|
|
18
|
+
if (fractional === 0n) {
|
|
19
|
+
return `${whole} FJ`;
|
|
20
|
+
}
|
|
21
|
+
return `${whole}.${fracStr.replace(/0+$/, '')} FJ`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export async function getFeeJuiceBalanceCmd(
|
|
25
|
+
node: AztecNode,
|
|
26
|
+
address: AztecAddress,
|
|
27
|
+
json: boolean,
|
|
28
|
+
exact: boolean,
|
|
29
|
+
log: LogFn,
|
|
30
|
+
) {
|
|
31
|
+
const balance = await getFeeJuiceBalance(address, node);
|
|
32
|
+
if (json) {
|
|
33
|
+
log(prettyPrintJSON({ address: address.toString(), balance: balance.toString() }));
|
|
34
|
+
} else {
|
|
35
|
+
log(`Fee Juice balance for ${address.toString()}: ${formatFeeJuice(balance, exact)}`);
|
|
36
|
+
}
|
|
37
|
+
}
|