@aztec/entrypoints 0.26.5
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/README.md +8 -0
- package/dest/account_entrypoint.d.ts +17 -0
- package/dest/account_entrypoint.d.ts.map +1 -0
- package/dest/account_entrypoint.js +129 -0
- package/dest/constants.d.ts +5 -0
- package/dest/constants.d.ts.map +1 -0
- package/dest/constants.js +5 -0
- package/dest/dapp_entrypoint.d.ts +18 -0
- package/dest/dapp_entrypoint.d.ts.map +1 -0
- package/dest/dapp_entrypoint.js +102 -0
- package/dest/entrypoint_payload.d.ts +41 -0
- package/dest/entrypoint_payload.d.ts.map +1 -0
- package/dest/entrypoint_payload.js +76 -0
- package/dest/index.d.ts +10 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +10 -0
- package/package.json +61 -0
- package/src/account_entrypoint.ts +137 -0
- package/src/constants.ts +4 -0
- package/src/dapp_entrypoint.ts +112 -0
- package/src/entrypoint_payload.ts +124 -0
- package/src/index.ts +10 -0
package/README.md
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Account Entrypoints
|
|
2
|
+
|
|
3
|
+
This package contains different transaction entrypoints for the Aztec Network.
|
|
4
|
+
|
|
5
|
+
## Available entrypoints
|
|
6
|
+
|
|
7
|
+
- **Account entrypoint**: this entrypoint encodes the payload to start an interaction through an Account Contract. It is meant to be used with accounts implementing the interface defined by `@aztec/accounts`.
|
|
8
|
+
- **DApp entrypoint**: this encodes the payload so that it may run a dapp directly, instead of going through an account contract.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AuthWitnessProvider, EntrypointInterface, FeeOptions } from '@aztec/aztec.js/account';
|
|
2
|
+
import { FunctionCall, TxExecutionRequest } from '@aztec/circuit-types';
|
|
3
|
+
import { AztecAddress } from '@aztec/circuits.js';
|
|
4
|
+
/**
|
|
5
|
+
* Implementation for an entrypoint interface that follows the default entrypoint signature
|
|
6
|
+
* for an account, which accepts an AppPayload and a FeePayload as defined in noir-libs/aztec-noir/src/entrypoint module
|
|
7
|
+
*/
|
|
8
|
+
export declare class DefaultAccountEntrypoint implements EntrypointInterface {
|
|
9
|
+
private address;
|
|
10
|
+
private auth;
|
|
11
|
+
private chainId;
|
|
12
|
+
private version;
|
|
13
|
+
constructor(address: AztecAddress, auth: AuthWitnessProvider, chainId?: number, version?: number);
|
|
14
|
+
createTxExecutionRequest(executions: FunctionCall[], feeOpts?: FeeOptions): Promise<TxExecutionRequest>;
|
|
15
|
+
private getEntrypointAbi;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=account_entrypoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account_entrypoint.d.ts","sourceRoot":"","sources":["../src/account_entrypoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC/F,OAAO,EAAE,YAAY,EAAmB,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,YAAY,EAA2C,MAAM,oBAAoB,CAAC;AAM3F;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,mBAAmB;IAEhE,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,OAAO;gBAHP,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,mBAAmB,EACzB,OAAO,GAAE,MAAyB,EAClC,OAAO,GAAE,MAAwB;IAGrC,wBAAwB,CAAC,UAAU,EAAE,YAAY,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAsB7G,OAAO,CAAC,gBAAgB;CA8FzB"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { PackedArguments, TxExecutionRequest } from '@aztec/circuit-types';
|
|
2
|
+
import { FunctionData, GeneratorIndex, TxContext } from '@aztec/circuits.js';
|
|
3
|
+
import { encodeArguments } from '@aztec/foundation/abi';
|
|
4
|
+
import { DEFAULT_CHAIN_ID, DEFAULT_VERSION } from './constants.js';
|
|
5
|
+
import { buildAppPayload, buildFeePayload, hashPayload } from './entrypoint_payload.js';
|
|
6
|
+
/**
|
|
7
|
+
* Implementation for an entrypoint interface that follows the default entrypoint signature
|
|
8
|
+
* for an account, which accepts an AppPayload and a FeePayload as defined in noir-libs/aztec-noir/src/entrypoint module
|
|
9
|
+
*/
|
|
10
|
+
export class DefaultAccountEntrypoint {
|
|
11
|
+
constructor(address, auth, chainId = DEFAULT_CHAIN_ID, version = DEFAULT_VERSION) {
|
|
12
|
+
this.address = address;
|
|
13
|
+
this.auth = auth;
|
|
14
|
+
this.chainId = chainId;
|
|
15
|
+
this.version = version;
|
|
16
|
+
}
|
|
17
|
+
async createTxExecutionRequest(executions, feeOpts) {
|
|
18
|
+
const { payload: appPayload, packedArguments: appPackedArguments } = buildAppPayload(executions);
|
|
19
|
+
const { payload: feePayload, packedArguments: feePackedArguments } = await buildFeePayload(feeOpts);
|
|
20
|
+
const abi = this.getEntrypointAbi();
|
|
21
|
+
const entrypointPackedArgs = PackedArguments.fromArgs(encodeArguments(abi, [appPayload, feePayload]));
|
|
22
|
+
const appAuthWitness = await this.auth.createAuthWitness(hashPayload(appPayload, GeneratorIndex.SIGNATURE_PAYLOAD));
|
|
23
|
+
const feeAuthWitness = await this.auth.createAuthWitness(hashPayload(feePayload, GeneratorIndex.FEE_PAYLOAD));
|
|
24
|
+
const txRequest = TxExecutionRequest.from({
|
|
25
|
+
argsHash: entrypointPackedArgs.hash,
|
|
26
|
+
origin: this.address,
|
|
27
|
+
functionData: FunctionData.fromAbi(abi),
|
|
28
|
+
txContext: TxContext.empty(this.chainId, this.version),
|
|
29
|
+
packedArguments: [...appPackedArguments, ...feePackedArguments, entrypointPackedArgs],
|
|
30
|
+
authWitnesses: [appAuthWitness, feeAuthWitness],
|
|
31
|
+
});
|
|
32
|
+
return txRequest;
|
|
33
|
+
}
|
|
34
|
+
getEntrypointAbi() {
|
|
35
|
+
return {
|
|
36
|
+
name: 'entrypoint',
|
|
37
|
+
functionType: 'secret',
|
|
38
|
+
isInternal: false,
|
|
39
|
+
parameters: [
|
|
40
|
+
{
|
|
41
|
+
name: 'app_payload',
|
|
42
|
+
type: {
|
|
43
|
+
kind: 'struct',
|
|
44
|
+
path: 'authwit::entrypoint::app::AppPayload',
|
|
45
|
+
fields: [
|
|
46
|
+
{
|
|
47
|
+
name: 'function_calls',
|
|
48
|
+
type: {
|
|
49
|
+
kind: 'array',
|
|
50
|
+
length: 4,
|
|
51
|
+
type: {
|
|
52
|
+
kind: 'struct',
|
|
53
|
+
path: 'authwit::entrypoint::function_call::FunctionCall',
|
|
54
|
+
fields: [
|
|
55
|
+
{ name: 'args_hash', type: { kind: 'field' } },
|
|
56
|
+
{
|
|
57
|
+
name: 'function_selector',
|
|
58
|
+
type: {
|
|
59
|
+
kind: 'struct',
|
|
60
|
+
path: 'authwit::aztec::protocol_types::abis::function_selector::FunctionSelector',
|
|
61
|
+
fields: [{ name: 'inner', type: { kind: 'integer', sign: 'unsigned', width: 32 } }],
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: 'target_address',
|
|
66
|
+
type: {
|
|
67
|
+
kind: 'struct',
|
|
68
|
+
path: 'authwit::aztec::protocol_types::address::AztecAddress',
|
|
69
|
+
fields: [{ name: 'inner', type: { kind: 'field' } }],
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
{ name: 'is_public', type: { kind: 'boolean' } },
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
{ name: 'nonce', type: { kind: 'field' } },
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
visibility: 'public',
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: 'fee_payload',
|
|
84
|
+
type: {
|
|
85
|
+
kind: 'struct',
|
|
86
|
+
path: 'authwit::entrypoint::fee::FeePayload',
|
|
87
|
+
fields: [
|
|
88
|
+
{
|
|
89
|
+
name: 'function_calls',
|
|
90
|
+
type: {
|
|
91
|
+
kind: 'array',
|
|
92
|
+
length: 2,
|
|
93
|
+
type: {
|
|
94
|
+
kind: 'struct',
|
|
95
|
+
path: 'authwit::entrypoint::function_call::FunctionCall',
|
|
96
|
+
fields: [
|
|
97
|
+
{ name: 'args_hash', type: { kind: 'field' } },
|
|
98
|
+
{
|
|
99
|
+
name: 'function_selector',
|
|
100
|
+
type: {
|
|
101
|
+
kind: 'struct',
|
|
102
|
+
path: 'authwit::aztec::protocol_types::abis::function_selector::FunctionSelector',
|
|
103
|
+
fields: [{ name: 'inner', type: { kind: 'integer', sign: 'unsigned', width: 32 } }],
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: 'target_address',
|
|
108
|
+
type: {
|
|
109
|
+
kind: 'struct',
|
|
110
|
+
path: 'authwit::aztec::protocol_types::address::AztecAddress',
|
|
111
|
+
fields: [{ name: 'inner', type: { kind: 'field' } }],
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
{ name: 'is_public', type: { kind: 'boolean' } },
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
{ name: 'nonce', type: { kind: 'field' } },
|
|
120
|
+
],
|
|
121
|
+
},
|
|
122
|
+
visibility: 'public',
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
returnTypes: [],
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudF9lbnRyeXBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FjY291bnRfZW50cnlwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWdCLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pGLE9BQU8sRUFBZ0IsWUFBWSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRixPQUFPLEVBQWUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXhGOzs7R0FHRztBQUNILE1BQU0sT0FBTyx3QkFBd0I7SUFDbkMsWUFDVSxPQUFxQixFQUNyQixJQUF5QixFQUN6QixVQUFrQixnQkFBZ0IsRUFDbEMsVUFBa0IsZUFBZTtRQUhqQyxZQUFPLEdBQVAsT0FBTyxDQUFjO1FBQ3JCLFNBQUksR0FBSixJQUFJLENBQXFCO1FBQ3pCLFlBQU8sR0FBUCxPQUFPLENBQTJCO1FBQ2xDLFlBQU8sR0FBUCxPQUFPLENBQTBCO0lBQ3hDLENBQUM7SUFFSixLQUFLLENBQUMsd0JBQXdCLENBQUMsVUFBMEIsRUFBRSxPQUFvQjtRQUM3RSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakcsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLEdBQUcsTUFBTSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFcEcsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDcEMsTUFBTSxvQkFBb0IsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRHLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFDcEgsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFOUcsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDO1lBQ3hDLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxJQUFJO1lBQ25DLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNwQixZQUFZLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDdkMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ3RELGVBQWUsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLEVBQUUsR0FBRyxrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBQztZQUNyRixhQUFhLEVBQUUsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDO1NBQ2hELENBQUMsQ0FBQztRQUVILE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsT0FBTztZQUNMLElBQUksRUFBRSxZQUFZO1lBQ2xCLFlBQVksRUFBRSxRQUFRO1lBQ3RCLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFVBQVUsRUFBRTtnQkFDVjtvQkFDRSxJQUFJLEVBQUUsYUFBYTtvQkFDbkIsSUFBSSxFQUFFO3dCQUNKLElBQUksRUFBRSxRQUFRO3dCQUNkLElBQUksRUFBRSxzQ0FBc0M7d0JBQzVDLE1BQU0sRUFBRTs0QkFDTjtnQ0FDRSxJQUFJLEVBQUUsZ0JBQWdCO2dDQUN0QixJQUFJLEVBQUU7b0NBQ0osSUFBSSxFQUFFLE9BQU87b0NBQ2IsTUFBTSxFQUFFLENBQUM7b0NBQ1QsSUFBSSxFQUFFO3dDQUNKLElBQUksRUFBRSxRQUFRO3dDQUNkLElBQUksRUFBRSxrREFBa0Q7d0NBQ3hELE1BQU0sRUFBRTs0Q0FDTixFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFOzRDQUM5QztnREFDRSxJQUFJLEVBQUUsbUJBQW1CO2dEQUN6QixJQUFJLEVBQUU7b0RBQ0osSUFBSSxFQUFFLFFBQVE7b0RBQ2QsSUFBSSxFQUFFLDJFQUEyRTtvREFDakYsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztpREFDcEY7NkNBQ0Y7NENBQ0Q7Z0RBQ0UsSUFBSSxFQUFFLGdCQUFnQjtnREFDdEIsSUFBSSxFQUFFO29EQUNKLElBQUksRUFBRSxRQUFRO29EQUNkLElBQUksRUFBRSx1REFBdUQ7b0RBQzdELE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztpREFDckQ7NkNBQ0Y7NENBQ0QsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRTt5Q0FDakQ7cUNBQ0Y7aUNBQ0Y7NkJBQ0Y7NEJBQ0QsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRTt5QkFDM0M7cUJBQ0Y7b0JBQ0QsVUFBVSxFQUFFLFFBQVE7aUJBQ3JCO2dCQUNEO29CQUNFLElBQUksRUFBRSxhQUFhO29CQUNuQixJQUFJLEVBQUU7d0JBQ0osSUFBSSxFQUFFLFFBQVE7d0JBQ2QsSUFBSSxFQUFFLHNDQUFzQzt3QkFDNUMsTUFBTSxFQUFFOzRCQUNOO2dDQUNFLElBQUksRUFBRSxnQkFBZ0I7Z0NBQ3RCLElBQUksRUFBRTtvQ0FDSixJQUFJLEVBQUUsT0FBTztvQ0FDYixNQUFNLEVBQUUsQ0FBQztvQ0FDVCxJQUFJLEVBQUU7d0NBQ0osSUFBSSxFQUFFLFFBQVE7d0NBQ2QsSUFBSSxFQUFFLGtEQUFrRDt3Q0FDeEQsTUFBTSxFQUFFOzRDQUNOLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUU7NENBQzlDO2dEQUNFLElBQUksRUFBRSxtQkFBbUI7Z0RBQ3pCLElBQUksRUFBRTtvREFDSixJQUFJLEVBQUUsUUFBUTtvREFDZCxJQUFJLEVBQUUsMkVBQTJFO29EQUNqRixNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO2lEQUNwRjs2Q0FDRjs0Q0FDRDtnREFDRSxJQUFJLEVBQUUsZ0JBQWdCO2dEQUN0QixJQUFJLEVBQUU7b0RBQ0osSUFBSSxFQUFFLFFBQVE7b0RBQ2QsSUFBSSxFQUFFLHVEQUF1RDtvREFDN0QsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO2lEQUNyRDs2Q0FDRjs0Q0FDRCxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFO3lDQUNqRDtxQ0FDRjtpQ0FDRjs2QkFDRjs0QkFDRCxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFO3lCQUMzQztxQkFDRjtvQkFDRCxVQUFVLEVBQUUsUUFBUTtpQkFDckI7YUFDRjtZQUNELFdBQVcsRUFBRSxFQUFFO1NBQ0QsQ0FBQztJQUNuQixDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AACtC,uCAAuC;AACvC,eAAO,MAAM,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Default L1 chain ID to use when constructing txs (matches hardhat and anvil's default). */
|
|
2
|
+
export const DEFAULT_CHAIN_ID = 31337;
|
|
3
|
+
/** Default protocol version to use. */
|
|
4
|
+
export const DEFAULT_VERSION = 1;
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4RkFBOEY7QUFDOUYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQ3RDLHVDQUF1QztBQUN2QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AuthWitnessProvider, EntrypointInterface } from '@aztec/aztec.js/account';
|
|
2
|
+
import { FunctionCall, TxExecutionRequest } from '@aztec/circuit-types';
|
|
3
|
+
import { AztecAddress } from '@aztec/circuits.js';
|
|
4
|
+
/**
|
|
5
|
+
* Implementation for an entrypoint interface that follows the default entrypoint signature
|
|
6
|
+
* for an account, which accepts an AppPayload and a FeePayload as defined in noir-libs/aztec-noir/src/entrypoint module
|
|
7
|
+
*/
|
|
8
|
+
export declare class DefaultDappEntrypoint implements EntrypointInterface {
|
|
9
|
+
private userAddress;
|
|
10
|
+
private userAuthWitnessProvider;
|
|
11
|
+
private dappEntrypointAddress;
|
|
12
|
+
private chainId;
|
|
13
|
+
private version;
|
|
14
|
+
constructor(userAddress: AztecAddress, userAuthWitnessProvider: AuthWitnessProvider, dappEntrypointAddress: AztecAddress, chainId?: number, version?: number);
|
|
15
|
+
createTxExecutionRequest(executions: FunctionCall[]): Promise<TxExecutionRequest>;
|
|
16
|
+
private getEntrypointAbi;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=dapp_entrypoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dapp_entrypoint.d.ts","sourceRoot":"","sources":["../src/dapp_entrypoint.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,YAAY,EAAmB,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,YAAY,EAA+B,MAAM,oBAAoB,CAAC;AAM/E;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,mBAAmB;IAE7D,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,uBAAuB;IAC/B,OAAO,CAAC,qBAAqB;IAC7B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,OAAO;gBAJP,WAAW,EAAE,YAAY,EACzB,uBAAuB,EAAE,mBAAmB,EAC5C,qBAAqB,EAAE,YAAY,EACnC,OAAO,GAAE,MAAyB,EAClC,OAAO,GAAE,MAAwB;IAGrC,wBAAwB,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA4BvF,OAAO,CAAC,gBAAgB;CA6DzB"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { computeInnerAuthWitHash, computeOuterAuthWitHash } from '@aztec/aztec.js';
|
|
2
|
+
import { PackedArguments, TxExecutionRequest } from '@aztec/circuit-types';
|
|
3
|
+
import { Fr, FunctionData, TxContext } from '@aztec/circuits.js';
|
|
4
|
+
import { encodeArguments } from '@aztec/foundation/abi';
|
|
5
|
+
import { DEFAULT_CHAIN_ID, DEFAULT_VERSION } from './constants.js';
|
|
6
|
+
import { buildDappPayload } from './entrypoint_payload.js';
|
|
7
|
+
/**
|
|
8
|
+
* Implementation for an entrypoint interface that follows the default entrypoint signature
|
|
9
|
+
* for an account, which accepts an AppPayload and a FeePayload as defined in noir-libs/aztec-noir/src/entrypoint module
|
|
10
|
+
*/
|
|
11
|
+
export class DefaultDappEntrypoint {
|
|
12
|
+
constructor(userAddress, userAuthWitnessProvider, dappEntrypointAddress, chainId = DEFAULT_CHAIN_ID, version = DEFAULT_VERSION) {
|
|
13
|
+
this.userAddress = userAddress;
|
|
14
|
+
this.userAuthWitnessProvider = userAuthWitnessProvider;
|
|
15
|
+
this.dappEntrypointAddress = dappEntrypointAddress;
|
|
16
|
+
this.chainId = chainId;
|
|
17
|
+
this.version = version;
|
|
18
|
+
}
|
|
19
|
+
async createTxExecutionRequest(executions) {
|
|
20
|
+
if (executions.length !== 1) {
|
|
21
|
+
throw new Error('ILLEGAL');
|
|
22
|
+
}
|
|
23
|
+
const { payload, packedArguments } = buildDappPayload(executions[0]);
|
|
24
|
+
const abi = this.getEntrypointAbi();
|
|
25
|
+
const entrypointPackedArgs = PackedArguments.fromArgs(encodeArguments(abi, [payload, this.userAddress]));
|
|
26
|
+
const functionData = FunctionData.fromAbi(abi);
|
|
27
|
+
const innerHash = computeInnerAuthWitHash([Fr.ZERO, functionData.selector.toField(), entrypointPackedArgs.hash]);
|
|
28
|
+
const outerHash = computeOuterAuthWitHash(this.dappEntrypointAddress, innerHash);
|
|
29
|
+
const authWitness = await this.userAuthWitnessProvider.createAuthWitness(outerHash);
|
|
30
|
+
const txRequest = TxExecutionRequest.from({
|
|
31
|
+
argsHash: entrypointPackedArgs.hash,
|
|
32
|
+
origin: this.dappEntrypointAddress,
|
|
33
|
+
functionData,
|
|
34
|
+
txContext: TxContext.empty(this.chainId, this.version),
|
|
35
|
+
packedArguments: [...packedArguments, entrypointPackedArgs],
|
|
36
|
+
authWitnesses: [authWitness],
|
|
37
|
+
});
|
|
38
|
+
return txRequest;
|
|
39
|
+
}
|
|
40
|
+
getEntrypointAbi() {
|
|
41
|
+
return {
|
|
42
|
+
name: 'entrypoint',
|
|
43
|
+
functionType: 'secret',
|
|
44
|
+
isInternal: false,
|
|
45
|
+
parameters: [
|
|
46
|
+
{
|
|
47
|
+
name: 'payload',
|
|
48
|
+
type: {
|
|
49
|
+
kind: 'struct',
|
|
50
|
+
path: 'dapp_payload::DAppPayload',
|
|
51
|
+
fields: [
|
|
52
|
+
{
|
|
53
|
+
name: 'function_calls',
|
|
54
|
+
type: {
|
|
55
|
+
kind: 'array',
|
|
56
|
+
length: 1,
|
|
57
|
+
type: {
|
|
58
|
+
kind: 'struct',
|
|
59
|
+
path: 'authwit::entrypoint::function_call::FunctionCall',
|
|
60
|
+
fields: [
|
|
61
|
+
{ name: 'args_hash', type: { kind: 'field' } },
|
|
62
|
+
{
|
|
63
|
+
name: 'function_selector',
|
|
64
|
+
type: {
|
|
65
|
+
kind: 'struct',
|
|
66
|
+
path: 'authwit::aztec::protocol_types::abis::function_selector::FunctionSelector',
|
|
67
|
+
fields: [{ name: 'inner', type: { kind: 'integer', sign: 'unsigned', width: 32 } }],
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: 'target_address',
|
|
72
|
+
type: {
|
|
73
|
+
kind: 'struct',
|
|
74
|
+
path: 'authwit::aztec::protocol_types::address::aztec_address::AztecAddress',
|
|
75
|
+
fields: [{ name: 'inner', type: { kind: 'field' } }],
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
{ name: 'is_public', type: { kind: 'boolean' } },
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
{ name: 'nonce', type: { kind: 'field' } },
|
|
84
|
+
],
|
|
85
|
+
},
|
|
86
|
+
visibility: 'public',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: 'user_address',
|
|
90
|
+
type: {
|
|
91
|
+
kind: 'struct',
|
|
92
|
+
path: 'authwit::aztec::protocol_types::address::aztec_address::AztecAddress',
|
|
93
|
+
fields: [{ name: 'inner', type: { kind: 'field' } }],
|
|
94
|
+
},
|
|
95
|
+
visibility: 'public',
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
returnTypes: [],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFwcF9lbnRyeXBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RhcHBfZW50cnlwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVuRixPQUFPLEVBQWdCLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pGLE9BQU8sRUFBZ0IsRUFBRSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQWUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTNEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxxQkFBcUI7SUFDaEMsWUFDVSxXQUF5QixFQUN6Qix1QkFBNEMsRUFDNUMscUJBQW1DLEVBQ25DLFVBQWtCLGdCQUFnQixFQUNsQyxVQUFrQixlQUFlO1FBSmpDLGdCQUFXLEdBQVgsV0FBVyxDQUFjO1FBQ3pCLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBcUI7UUFDNUMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUFjO1FBQ25DLFlBQU8sR0FBUCxPQUFPLENBQTJCO1FBQ2xDLFlBQU8sR0FBUCxPQUFPLENBQTBCO0lBQ3hDLENBQUM7SUFFSixLQUFLLENBQUMsd0JBQXdCLENBQUMsVUFBMEI7UUFDdkQsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUNELE1BQU0sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFD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
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { FeeOptions } from '@aztec/aztec.js/account';
|
|
2
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
3
|
+
import { FunctionCall, PackedArguments } from '@aztec/circuit-types';
|
|
4
|
+
import { AztecAddress } from '@aztec/circuits.js';
|
|
5
|
+
/** Encoded function call for account contract entrypoint */
|
|
6
|
+
type EntrypointFunctionCall = {
|
|
7
|
+
/** Arguments hash for the call */
|
|
8
|
+
args_hash: Fr;
|
|
9
|
+
/** Selector of the function to call */
|
|
10
|
+
function_selector: Fr;
|
|
11
|
+
/** Address of the contract to call */
|
|
12
|
+
target_address: Fr;
|
|
13
|
+
/** Whether the function is public or private */
|
|
14
|
+
is_public: boolean;
|
|
15
|
+
};
|
|
16
|
+
/** Encoded payload for the account contract entrypoint */
|
|
17
|
+
type EntrypointPayload = {
|
|
18
|
+
/** Encoded function calls to execute */
|
|
19
|
+
function_calls: EntrypointFunctionCall[];
|
|
20
|
+
/** A nonce for replay protection */
|
|
21
|
+
nonce: Fr;
|
|
22
|
+
};
|
|
23
|
+
/** Represents a generic payload to be executed in the context of an account contract */
|
|
24
|
+
export type PayloadWithArguments = {
|
|
25
|
+
/** The payload to be run */
|
|
26
|
+
payload: EntrypointPayload;
|
|
27
|
+
/** The packed arguments for the function calls */
|
|
28
|
+
packedArguments: PackedArguments[];
|
|
29
|
+
};
|
|
30
|
+
/** builds the payload for a Dapp entrypoint */
|
|
31
|
+
export declare function buildDappPayload(call: FunctionCall): PayloadWithArguments;
|
|
32
|
+
/** Assembles an entrypoint app payload from a set of private and public function calls */
|
|
33
|
+
export declare function buildAppPayload(calls: FunctionCall[]): PayloadWithArguments;
|
|
34
|
+
/** Creates the payload for paying the fee for a transaction */
|
|
35
|
+
export declare function buildFeePayload(feeOpts?: FeeOptions): Promise<PayloadWithArguments>;
|
|
36
|
+
/** Hashes a payload to a 32-byte buffer */
|
|
37
|
+
export declare function hashPayload(payload: EntrypointPayload, generatorIndex: number): Fr;
|
|
38
|
+
/** Hash the payload for a dapp */
|
|
39
|
+
export declare function hashDappPayload(payload: EntrypointPayload, userAddress: AztecAddress, generatorIndex: number): Fr;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=entrypoint_payload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entrypoint_payload.d.ts","sourceRoot":"","sources":["../src/entrypoint_payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAqB,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAUlD,4DAA4D;AAC5D,KAAK,sBAAsB,GAAG;IAE5B,kCAAkC;IAClC,SAAS,EAAE,EAAE,CAAC;IAEd,uCAAuC;IACvC,iBAAiB,EAAE,EAAE,CAAC;IAEtB,sCAAsC;IACtC,cAAc,EAAE,EAAE,CAAC;IAEnB,gDAAgD;IAChD,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,0DAA0D;AAC1D,KAAK,iBAAiB,GAAG;IAEvB,wCAAwC;IACxC,cAAc,EAAE,sBAAsB,EAAE,CAAC;IACzC,oCAAoC;IACpC,KAAK,EAAE,EAAE,CAAC;CACX,CAAC;AAEF,wFAAwF;AACxF,MAAM,MAAM,oBAAoB,GAAG;IACjC,4BAA4B;IAC5B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,kDAAkD;IAClD,eAAe,EAAE,eAAe,EAAE,CAAC;CACpC,CAAC;AAsCF,+CAA+C;AAC/C,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,oBAAoB,CAEzE;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,oBAAoB,CAE3E;AAED,+DAA+D;AAC/D,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAGzF;AAGD,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,MAK7E;AAED,kCAAkC;AAClC,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,MAE5G"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
2
|
+
import { PackedArguments, emptyFunctionCall } from '@aztec/circuit-types';
|
|
3
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
4
|
+
import { pedersenHash } from '@aztec/foundation/crypto';
|
|
5
|
+
// These must match the values defined in:
|
|
6
|
+
// - noir-projects/aztec-nr/aztec/src/entrypoint/app.nr
|
|
7
|
+
const ACCOUNT_MAX_CALLS = 4;
|
|
8
|
+
// - and noir-projects/aztec-nr/aztec/src/entrypoint/fee.nr
|
|
9
|
+
const FEE_MAX_CALLS = 2;
|
|
10
|
+
/**
|
|
11
|
+
* Builds a payload to be sent to the account contract
|
|
12
|
+
* @param calls - The function calls to run
|
|
13
|
+
* @param maxCalls - The maximum number of call expected to be run. Used for padding
|
|
14
|
+
* @returns A payload object and packed arguments
|
|
15
|
+
*/
|
|
16
|
+
function buildPayload(calls, maxCalls) {
|
|
17
|
+
const nonce = Fr.random();
|
|
18
|
+
const paddedCalls = padArrayEnd(calls, emptyFunctionCall(), maxCalls);
|
|
19
|
+
const packedArguments = [];
|
|
20
|
+
for (const call of paddedCalls) {
|
|
21
|
+
packedArguments.push(PackedArguments.fromArgs(call.args));
|
|
22
|
+
}
|
|
23
|
+
const formattedCalls = paddedCalls.map((call, index) => ({
|
|
24
|
+
// eslint-disable-next-line camelcase
|
|
25
|
+
args_hash: packedArguments[index].hash,
|
|
26
|
+
// eslint-disable-next-line camelcase
|
|
27
|
+
function_selector: call.functionData.selector.toField(),
|
|
28
|
+
// eslint-disable-next-line camelcase
|
|
29
|
+
target_address: call.to.toField(),
|
|
30
|
+
// eslint-disable-next-line camelcase
|
|
31
|
+
is_public: !call.functionData.isPrivate,
|
|
32
|
+
}));
|
|
33
|
+
return {
|
|
34
|
+
payload: {
|
|
35
|
+
// eslint-disable-next-line camelcase
|
|
36
|
+
function_calls: formattedCalls,
|
|
37
|
+
nonce,
|
|
38
|
+
},
|
|
39
|
+
packedArguments,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** builds the payload for a Dapp entrypoint */
|
|
43
|
+
export function buildDappPayload(call) {
|
|
44
|
+
return buildPayload([call], 1);
|
|
45
|
+
}
|
|
46
|
+
/** Assembles an entrypoint app payload from a set of private and public function calls */
|
|
47
|
+
export function buildAppPayload(calls) {
|
|
48
|
+
return buildPayload(calls, ACCOUNT_MAX_CALLS);
|
|
49
|
+
}
|
|
50
|
+
/** Creates the payload for paying the fee for a transaction */
|
|
51
|
+
export async function buildFeePayload(feeOpts) {
|
|
52
|
+
const calls = feeOpts ? await feeOpts.paymentMethod.getFunctionCalls(new Fr(feeOpts.maxFee)) : [];
|
|
53
|
+
return buildPayload(calls, FEE_MAX_CALLS);
|
|
54
|
+
}
|
|
55
|
+
// TODO (dogfooding) change all of these names app/dapp/fee/payload and generator indices for all of them
|
|
56
|
+
/** Hashes a payload to a 32-byte buffer */
|
|
57
|
+
export function hashPayload(payload, generatorIndex) {
|
|
58
|
+
return pedersenHash(flattenPayload(payload).map(fr => fr.toBuffer()), generatorIndex);
|
|
59
|
+
}
|
|
60
|
+
/** Hash the payload for a dapp */
|
|
61
|
+
export function hashDappPayload(payload, userAddress, generatorIndex) {
|
|
62
|
+
return pedersenHash([...flattenPayload(payload).map(fr => fr.toBuffer()), userAddress.toBuffer()], generatorIndex);
|
|
63
|
+
}
|
|
64
|
+
/** Flattens an payload */
|
|
65
|
+
function flattenPayload(payload) {
|
|
66
|
+
return [
|
|
67
|
+
...payload.function_calls.flatMap(call => [
|
|
68
|
+
call.args_hash,
|
|
69
|
+
call.function_selector,
|
|
70
|
+
call.target_address,
|
|
71
|
+
new Fr(call.is_public),
|
|
72
|
+
]),
|
|
73
|
+
payload.nonce,
|
|
74
|
+
];
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50cnlwb2ludF9wYXlsb2FkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2VudHJ5cG9pbnRfcGF5bG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUMsT0FBTyxFQUFnQixlQUFlLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXhELDBDQUEwQztBQUMxQyx1REFBdUQ7QUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFDNUIsMkRBQTJEO0FBQzNELE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQztBQW1DeEI7Ozs7O0dBS0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxLQUFxQixFQUFFLFFBQWdCO0lBQzNELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUUxQixNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdEUsTUFBTSxlQUFlLEdBQXNCLEVBQUUsQ0FBQztJQUM5QyxLQUFLLE1BQU0sSUFBSSxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQy9CLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQTZCLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLHFDQUFxQztRQUNyQyxTQUFTLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUk7UUFDdEMscUNBQXFDO1FBQ3JDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRTtRQUN2RCxxQ0FBcUM7UUFDckMsY0FBYyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFO1FBQ2pDLHFDQUFxQztRQUNyQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVM7S0FDeEMsQ0FBQyxDQUFDLENBQUM7SUFFSixPQUFPO1FBQ0wsT0FBTyxFQUFFO1lBQ1AscUNBQXFDO1lBQ3JDLGNBQWMsRUFBRSxjQUFjO1lBQzlCLEtBQUs7U0FDTjtRQUNELGVBQWU7S0FDaEIsQ0FBQztBQUNKLENBQUM7QUFFRCwrQ0FBK0M7QUFDL0MsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQWtCO0lBQ2pELE9BQU8sWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVELDBGQUEwRjtBQUMxRixNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQXFCO0lBQ25ELE9BQU8sWUFBWSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRCwrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsT0FBb0I7SUFDeEQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNsRyxPQUFPLFlBQVksQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELHlHQUF5RztBQUN6RywyQ0FBMkM7QUFDM0MsTUFBTSxVQUFVLFdBQVcsQ0FBQyxPQUEwQixFQUFFLGNBQXNCO0lBQzVFLE9BQU8sWUFBWSxDQUNqQixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQ2hELGNBQWMsQ0FDZixDQUFDO0FBQ0osQ0FBQztBQUVELGtDQUFrQztBQUNsQyxNQUFNLFVBQVUsZUFBZSxDQUFDLE9BQTBCLEVBQUUsV0FBeUIsRUFBRSxjQUFzQjtJQUMzRyxPQUFPLFlBQVksQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ3JILENBQUM7QUFFRCwwQkFBMEI7QUFDMUIsU0FBUyxjQUFjLENBQUMsT0FBMEI7SUFDaEQsT0FBTztRQUNMLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsU0FBUztZQUNkLElBQUksQ0FBQyxpQkFBaUI7WUFDdEIsSUFBSSxDQUFDLGNBQWM7WUFDbkIsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUN2QixDQUFDO1FBQ0YsT0FBTyxDQUFDLEtBQUs7S0FDZCxDQUFDO0FBQ0osQ0FBQyJ9
|
package/dest/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `@aztec/accounts/defaults` export provides the base class {@link DefaultAccountContract} for implementing account contracts that use the default entrypoint payload module.
|
|
3
|
+
*
|
|
4
|
+
* Read more in {@link https://docs.aztec.network/developers/wallets/writing_an_account_contract | Writing an account contract}.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export * from './account_entrypoint.js';
|
|
9
|
+
export * from './dapp_entrypoint.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC"}
|
package/dest/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `@aztec/accounts/defaults` export provides the base class {@link DefaultAccountContract} for implementing account contracts that use the default entrypoint payload module.
|
|
3
|
+
*
|
|
4
|
+
* Read more in {@link https://docs.aztec.network/developers/wallets/writing_an_account_contract | Writing an account contract}.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export * from './account_entrypoint.js';
|
|
9
|
+
export * from './dapp_entrypoint.js';
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHNCQUFzQixDQUFDIn0=
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aztec/entrypoints",
|
|
3
|
+
"homepage": "https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/entrypoints",
|
|
4
|
+
"description": "Implementation of sample contract entrypoints for the Aztec Network",
|
|
5
|
+
"version": "0.26.5",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"exports": {
|
|
8
|
+
"./dapp": "./dest/dapp_entrypoint.js",
|
|
9
|
+
"./account": "./dest/account_entrypoint.js"
|
|
10
|
+
},
|
|
11
|
+
"typedocOptions": {
|
|
12
|
+
"entryPoints": [
|
|
13
|
+
"./src/index.ts"
|
|
14
|
+
],
|
|
15
|
+
"name": "Entrypoints",
|
|
16
|
+
"tsconfig": "./tsconfig.json"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "yarn clean && tsc -b",
|
|
20
|
+
"build:dev": "tsc -b --watch",
|
|
21
|
+
"build:ts": "tsc -b",
|
|
22
|
+
"clean": "rm -rf ./dest .tsbuildinfo",
|
|
23
|
+
"formatting": "run -T prettier --check ./src && run -T eslint ./src",
|
|
24
|
+
"formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
|
|
25
|
+
"test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --passWithNoTests"
|
|
26
|
+
},
|
|
27
|
+
"inherits": [
|
|
28
|
+
"../package.common.json"
|
|
29
|
+
],
|
|
30
|
+
"jest": {
|
|
31
|
+
"preset": "ts-jest/presets/default-esm",
|
|
32
|
+
"moduleNameMapper": {
|
|
33
|
+
"^(\\.{1,2}/.*)\\.[cm]?js$": "$1"
|
|
34
|
+
},
|
|
35
|
+
"testRegex": "./src/.*\\.test\\.(js|mjs|ts)$",
|
|
36
|
+
"rootDir": "./src"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@aztec/aztec.js": "0.26.5",
|
|
40
|
+
"@aztec/circuit-types": "0.26.5",
|
|
41
|
+
"@aztec/circuits.js": "0.26.5",
|
|
42
|
+
"@aztec/foundation": "0.26.5",
|
|
43
|
+
"tslib": "^2.4.0"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@jest/globals": "^29.5.0",
|
|
47
|
+
"@types/jest": "^29.5.0",
|
|
48
|
+
"jest": "^29.5.0",
|
|
49
|
+
"ts-jest": "^29.1.0",
|
|
50
|
+
"ts-node": "^10.9.1",
|
|
51
|
+
"typescript": "^5.0.4"
|
|
52
|
+
},
|
|
53
|
+
"files": [
|
|
54
|
+
"dest",
|
|
55
|
+
"src",
|
|
56
|
+
"!*.test.*"
|
|
57
|
+
],
|
|
58
|
+
"engines": {
|
|
59
|
+
"node": ">=18"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { AuthWitnessProvider, EntrypointInterface, FeeOptions } from '@aztec/aztec.js/account';
|
|
2
|
+
import { FunctionCall, PackedArguments, TxExecutionRequest } from '@aztec/circuit-types';
|
|
3
|
+
import { AztecAddress, FunctionData, GeneratorIndex, TxContext } from '@aztec/circuits.js';
|
|
4
|
+
import { FunctionAbi, encodeArguments } from '@aztec/foundation/abi';
|
|
5
|
+
|
|
6
|
+
import { DEFAULT_CHAIN_ID, DEFAULT_VERSION } from './constants.js';
|
|
7
|
+
import { buildAppPayload, buildFeePayload, hashPayload } from './entrypoint_payload.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Implementation for an entrypoint interface that follows the default entrypoint signature
|
|
11
|
+
* for an account, which accepts an AppPayload and a FeePayload as defined in noir-libs/aztec-noir/src/entrypoint module
|
|
12
|
+
*/
|
|
13
|
+
export class DefaultAccountEntrypoint implements EntrypointInterface {
|
|
14
|
+
constructor(
|
|
15
|
+
private address: AztecAddress,
|
|
16
|
+
private auth: AuthWitnessProvider,
|
|
17
|
+
private chainId: number = DEFAULT_CHAIN_ID,
|
|
18
|
+
private version: number = DEFAULT_VERSION,
|
|
19
|
+
) {}
|
|
20
|
+
|
|
21
|
+
async createTxExecutionRequest(executions: FunctionCall[], feeOpts?: FeeOptions): Promise<TxExecutionRequest> {
|
|
22
|
+
const { payload: appPayload, packedArguments: appPackedArguments } = buildAppPayload(executions);
|
|
23
|
+
const { payload: feePayload, packedArguments: feePackedArguments } = await buildFeePayload(feeOpts);
|
|
24
|
+
|
|
25
|
+
const abi = this.getEntrypointAbi();
|
|
26
|
+
const entrypointPackedArgs = PackedArguments.fromArgs(encodeArguments(abi, [appPayload, feePayload]));
|
|
27
|
+
|
|
28
|
+
const appAuthWitness = await this.auth.createAuthWitness(hashPayload(appPayload, GeneratorIndex.SIGNATURE_PAYLOAD));
|
|
29
|
+
const feeAuthWitness = await this.auth.createAuthWitness(hashPayload(feePayload, GeneratorIndex.FEE_PAYLOAD));
|
|
30
|
+
|
|
31
|
+
const txRequest = TxExecutionRequest.from({
|
|
32
|
+
argsHash: entrypointPackedArgs.hash,
|
|
33
|
+
origin: this.address,
|
|
34
|
+
functionData: FunctionData.fromAbi(abi),
|
|
35
|
+
txContext: TxContext.empty(this.chainId, this.version),
|
|
36
|
+
packedArguments: [...appPackedArguments, ...feePackedArguments, entrypointPackedArgs],
|
|
37
|
+
authWitnesses: [appAuthWitness, feeAuthWitness],
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
return txRequest;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
private getEntrypointAbi() {
|
|
44
|
+
return {
|
|
45
|
+
name: 'entrypoint',
|
|
46
|
+
functionType: 'secret',
|
|
47
|
+
isInternal: false,
|
|
48
|
+
parameters: [
|
|
49
|
+
{
|
|
50
|
+
name: 'app_payload',
|
|
51
|
+
type: {
|
|
52
|
+
kind: 'struct',
|
|
53
|
+
path: 'authwit::entrypoint::app::AppPayload',
|
|
54
|
+
fields: [
|
|
55
|
+
{
|
|
56
|
+
name: 'function_calls',
|
|
57
|
+
type: {
|
|
58
|
+
kind: 'array',
|
|
59
|
+
length: 4,
|
|
60
|
+
type: {
|
|
61
|
+
kind: 'struct',
|
|
62
|
+
path: 'authwit::entrypoint::function_call::FunctionCall',
|
|
63
|
+
fields: [
|
|
64
|
+
{ name: 'args_hash', type: { kind: 'field' } },
|
|
65
|
+
{
|
|
66
|
+
name: 'function_selector',
|
|
67
|
+
type: {
|
|
68
|
+
kind: 'struct',
|
|
69
|
+
path: 'authwit::aztec::protocol_types::abis::function_selector::FunctionSelector',
|
|
70
|
+
fields: [{ name: 'inner', type: { kind: 'integer', sign: 'unsigned', width: 32 } }],
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'target_address',
|
|
75
|
+
type: {
|
|
76
|
+
kind: 'struct',
|
|
77
|
+
path: 'authwit::aztec::protocol_types::address::AztecAddress',
|
|
78
|
+
fields: [{ name: 'inner', type: { kind: 'field' } }],
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
{ name: 'is_public', type: { kind: 'boolean' } },
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
{ name: 'nonce', type: { kind: 'field' } },
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
visibility: 'public',
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: 'fee_payload',
|
|
93
|
+
type: {
|
|
94
|
+
kind: 'struct',
|
|
95
|
+
path: 'authwit::entrypoint::fee::FeePayload',
|
|
96
|
+
fields: [
|
|
97
|
+
{
|
|
98
|
+
name: 'function_calls',
|
|
99
|
+
type: {
|
|
100
|
+
kind: 'array',
|
|
101
|
+
length: 2,
|
|
102
|
+
type: {
|
|
103
|
+
kind: 'struct',
|
|
104
|
+
path: 'authwit::entrypoint::function_call::FunctionCall',
|
|
105
|
+
fields: [
|
|
106
|
+
{ name: 'args_hash', type: { kind: 'field' } },
|
|
107
|
+
{
|
|
108
|
+
name: 'function_selector',
|
|
109
|
+
type: {
|
|
110
|
+
kind: 'struct',
|
|
111
|
+
path: 'authwit::aztec::protocol_types::abis::function_selector::FunctionSelector',
|
|
112
|
+
fields: [{ name: 'inner', type: { kind: 'integer', sign: 'unsigned', width: 32 } }],
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'target_address',
|
|
117
|
+
type: {
|
|
118
|
+
kind: 'struct',
|
|
119
|
+
path: 'authwit::aztec::protocol_types::address::AztecAddress',
|
|
120
|
+
fields: [{ name: 'inner', type: { kind: 'field' } }],
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
{ name: 'is_public', type: { kind: 'boolean' } },
|
|
124
|
+
],
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
{ name: 'nonce', type: { kind: 'field' } },
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
visibility: 'public',
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
returnTypes: [],
|
|
135
|
+
} as FunctionAbi;
|
|
136
|
+
}
|
|
137
|
+
}
|
package/src/constants.ts
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { computeInnerAuthWitHash, computeOuterAuthWitHash } from '@aztec/aztec.js';
|
|
2
|
+
import { AuthWitnessProvider, EntrypointInterface } from '@aztec/aztec.js/account';
|
|
3
|
+
import { FunctionCall, PackedArguments, TxExecutionRequest } from '@aztec/circuit-types';
|
|
4
|
+
import { AztecAddress, Fr, FunctionData, TxContext } from '@aztec/circuits.js';
|
|
5
|
+
import { FunctionAbi, encodeArguments } from '@aztec/foundation/abi';
|
|
6
|
+
|
|
7
|
+
import { DEFAULT_CHAIN_ID, DEFAULT_VERSION } from './constants.js';
|
|
8
|
+
import { buildDappPayload } from './entrypoint_payload.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Implementation for an entrypoint interface that follows the default entrypoint signature
|
|
12
|
+
* for an account, which accepts an AppPayload and a FeePayload as defined in noir-libs/aztec-noir/src/entrypoint module
|
|
13
|
+
*/
|
|
14
|
+
export class DefaultDappEntrypoint implements EntrypointInterface {
|
|
15
|
+
constructor(
|
|
16
|
+
private userAddress: AztecAddress,
|
|
17
|
+
private userAuthWitnessProvider: AuthWitnessProvider,
|
|
18
|
+
private dappEntrypointAddress: AztecAddress,
|
|
19
|
+
private chainId: number = DEFAULT_CHAIN_ID,
|
|
20
|
+
private version: number = DEFAULT_VERSION,
|
|
21
|
+
) {}
|
|
22
|
+
|
|
23
|
+
async createTxExecutionRequest(executions: FunctionCall[]): Promise<TxExecutionRequest> {
|
|
24
|
+
if (executions.length !== 1) {
|
|
25
|
+
throw new Error('ILLEGAL');
|
|
26
|
+
}
|
|
27
|
+
const { payload, packedArguments } = buildDappPayload(executions[0]);
|
|
28
|
+
|
|
29
|
+
const abi = this.getEntrypointAbi();
|
|
30
|
+
const entrypointPackedArgs = PackedArguments.fromArgs(encodeArguments(abi, [payload, this.userAddress]));
|
|
31
|
+
|
|
32
|
+
const functionData = FunctionData.fromAbi(abi);
|
|
33
|
+
|
|
34
|
+
const innerHash = computeInnerAuthWitHash([Fr.ZERO, functionData.selector.toField(), entrypointPackedArgs.hash]);
|
|
35
|
+
const outerHash = computeOuterAuthWitHash(this.dappEntrypointAddress, innerHash);
|
|
36
|
+
|
|
37
|
+
const authWitness = await this.userAuthWitnessProvider.createAuthWitness(outerHash);
|
|
38
|
+
|
|
39
|
+
const txRequest = TxExecutionRequest.from({
|
|
40
|
+
argsHash: entrypointPackedArgs.hash,
|
|
41
|
+
origin: this.dappEntrypointAddress,
|
|
42
|
+
functionData,
|
|
43
|
+
txContext: TxContext.empty(this.chainId, this.version),
|
|
44
|
+
packedArguments: [...packedArguments, entrypointPackedArgs],
|
|
45
|
+
authWitnesses: [authWitness],
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
return txRequest;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private getEntrypointAbi() {
|
|
52
|
+
return {
|
|
53
|
+
name: 'entrypoint',
|
|
54
|
+
functionType: 'secret',
|
|
55
|
+
isInternal: false,
|
|
56
|
+
parameters: [
|
|
57
|
+
{
|
|
58
|
+
name: 'payload',
|
|
59
|
+
type: {
|
|
60
|
+
kind: 'struct',
|
|
61
|
+
path: 'dapp_payload::DAppPayload',
|
|
62
|
+
fields: [
|
|
63
|
+
{
|
|
64
|
+
name: 'function_calls',
|
|
65
|
+
type: {
|
|
66
|
+
kind: 'array',
|
|
67
|
+
length: 1,
|
|
68
|
+
type: {
|
|
69
|
+
kind: 'struct',
|
|
70
|
+
path: 'authwit::entrypoint::function_call::FunctionCall',
|
|
71
|
+
fields: [
|
|
72
|
+
{ name: 'args_hash', type: { kind: 'field' } },
|
|
73
|
+
{
|
|
74
|
+
name: 'function_selector',
|
|
75
|
+
type: {
|
|
76
|
+
kind: 'struct',
|
|
77
|
+
path: 'authwit::aztec::protocol_types::abis::function_selector::FunctionSelector',
|
|
78
|
+
fields: [{ name: 'inner', type: { kind: 'integer', sign: 'unsigned', width: 32 } }],
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: 'target_address',
|
|
83
|
+
type: {
|
|
84
|
+
kind: 'struct',
|
|
85
|
+
path: 'authwit::aztec::protocol_types::address::aztec_address::AztecAddress',
|
|
86
|
+
fields: [{ name: 'inner', type: { kind: 'field' } }],
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
{ name: 'is_public', type: { kind: 'boolean' } },
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
{ name: 'nonce', type: { kind: 'field' } },
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
visibility: 'public',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: 'user_address',
|
|
101
|
+
type: {
|
|
102
|
+
kind: 'struct',
|
|
103
|
+
path: 'authwit::aztec::protocol_types::address::aztec_address::AztecAddress',
|
|
104
|
+
fields: [{ name: 'inner', type: { kind: 'field' } }],
|
|
105
|
+
},
|
|
106
|
+
visibility: 'public',
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
returnTypes: [],
|
|
110
|
+
} as FunctionAbi;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { FeeOptions } from '@aztec/aztec.js/account';
|
|
2
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
3
|
+
import { FunctionCall, PackedArguments, emptyFunctionCall } from '@aztec/circuit-types';
|
|
4
|
+
import { AztecAddress } from '@aztec/circuits.js';
|
|
5
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
6
|
+
import { pedersenHash } from '@aztec/foundation/crypto';
|
|
7
|
+
|
|
8
|
+
// These must match the values defined in:
|
|
9
|
+
// - noir-projects/aztec-nr/aztec/src/entrypoint/app.nr
|
|
10
|
+
const ACCOUNT_MAX_CALLS = 4;
|
|
11
|
+
// - and noir-projects/aztec-nr/aztec/src/entrypoint/fee.nr
|
|
12
|
+
const FEE_MAX_CALLS = 2;
|
|
13
|
+
|
|
14
|
+
/** Encoded function call for account contract entrypoint */
|
|
15
|
+
type EntrypointFunctionCall = {
|
|
16
|
+
// eslint-disable-next-line camelcase
|
|
17
|
+
/** Arguments hash for the call */
|
|
18
|
+
args_hash: Fr;
|
|
19
|
+
// eslint-disable-next-line camelcase
|
|
20
|
+
/** Selector of the function to call */
|
|
21
|
+
function_selector: Fr;
|
|
22
|
+
// eslint-disable-next-line camelcase
|
|
23
|
+
/** Address of the contract to call */
|
|
24
|
+
target_address: Fr;
|
|
25
|
+
// eslint-disable-next-line camelcase
|
|
26
|
+
/** Whether the function is public or private */
|
|
27
|
+
is_public: boolean;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/** Encoded payload for the account contract entrypoint */
|
|
31
|
+
type EntrypointPayload = {
|
|
32
|
+
// eslint-disable-next-line camelcase
|
|
33
|
+
/** Encoded function calls to execute */
|
|
34
|
+
function_calls: EntrypointFunctionCall[];
|
|
35
|
+
/** A nonce for replay protection */
|
|
36
|
+
nonce: Fr;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/** Represents a generic payload to be executed in the context of an account contract */
|
|
40
|
+
export type PayloadWithArguments = {
|
|
41
|
+
/** The payload to be run */
|
|
42
|
+
payload: EntrypointPayload;
|
|
43
|
+
/** The packed arguments for the function calls */
|
|
44
|
+
packedArguments: PackedArguments[];
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Builds a payload to be sent to the account contract
|
|
49
|
+
* @param calls - The function calls to run
|
|
50
|
+
* @param maxCalls - The maximum number of call expected to be run. Used for padding
|
|
51
|
+
* @returns A payload object and packed arguments
|
|
52
|
+
*/
|
|
53
|
+
function buildPayload(calls: FunctionCall[], maxCalls: number): PayloadWithArguments {
|
|
54
|
+
const nonce = Fr.random();
|
|
55
|
+
|
|
56
|
+
const paddedCalls = padArrayEnd(calls, emptyFunctionCall(), maxCalls);
|
|
57
|
+
const packedArguments: PackedArguments[] = [];
|
|
58
|
+
for (const call of paddedCalls) {
|
|
59
|
+
packedArguments.push(PackedArguments.fromArgs(call.args));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const formattedCalls: EntrypointFunctionCall[] = paddedCalls.map((call, index) => ({
|
|
63
|
+
// eslint-disable-next-line camelcase
|
|
64
|
+
args_hash: packedArguments[index].hash,
|
|
65
|
+
// eslint-disable-next-line camelcase
|
|
66
|
+
function_selector: call.functionData.selector.toField(),
|
|
67
|
+
// eslint-disable-next-line camelcase
|
|
68
|
+
target_address: call.to.toField(),
|
|
69
|
+
// eslint-disable-next-line camelcase
|
|
70
|
+
is_public: !call.functionData.isPrivate,
|
|
71
|
+
}));
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
payload: {
|
|
75
|
+
// eslint-disable-next-line camelcase
|
|
76
|
+
function_calls: formattedCalls,
|
|
77
|
+
nonce,
|
|
78
|
+
},
|
|
79
|
+
packedArguments,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** builds the payload for a Dapp entrypoint */
|
|
84
|
+
export function buildDappPayload(call: FunctionCall): PayloadWithArguments {
|
|
85
|
+
return buildPayload([call], 1);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Assembles an entrypoint app payload from a set of private and public function calls */
|
|
89
|
+
export function buildAppPayload(calls: FunctionCall[]): PayloadWithArguments {
|
|
90
|
+
return buildPayload(calls, ACCOUNT_MAX_CALLS);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Creates the payload for paying the fee for a transaction */
|
|
94
|
+
export async function buildFeePayload(feeOpts?: FeeOptions): Promise<PayloadWithArguments> {
|
|
95
|
+
const calls = feeOpts ? await feeOpts.paymentMethod.getFunctionCalls(new Fr(feeOpts.maxFee)) : [];
|
|
96
|
+
return buildPayload(calls, FEE_MAX_CALLS);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// TODO (dogfooding) change all of these names app/dapp/fee/payload and generator indices for all of them
|
|
100
|
+
/** Hashes a payload to a 32-byte buffer */
|
|
101
|
+
export function hashPayload(payload: EntrypointPayload, generatorIndex: number) {
|
|
102
|
+
return pedersenHash(
|
|
103
|
+
flattenPayload(payload).map(fr => fr.toBuffer()),
|
|
104
|
+
generatorIndex,
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Hash the payload for a dapp */
|
|
109
|
+
export function hashDappPayload(payload: EntrypointPayload, userAddress: AztecAddress, generatorIndex: number) {
|
|
110
|
+
return pedersenHash([...flattenPayload(payload).map(fr => fr.toBuffer()), userAddress.toBuffer()], generatorIndex);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Flattens an payload */
|
|
114
|
+
function flattenPayload(payload: EntrypointPayload) {
|
|
115
|
+
return [
|
|
116
|
+
...payload.function_calls.flatMap(call => [
|
|
117
|
+
call.args_hash,
|
|
118
|
+
call.function_selector,
|
|
119
|
+
call.target_address,
|
|
120
|
+
new Fr(call.is_public),
|
|
121
|
+
]),
|
|
122
|
+
payload.nonce,
|
|
123
|
+
];
|
|
124
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `@aztec/accounts/defaults` export provides the base class {@link DefaultAccountContract} for implementing account contracts that use the default entrypoint payload module.
|
|
3
|
+
*
|
|
4
|
+
* Read more in {@link https://docs.aztec.network/developers/wallets/writing_an_account_contract | Writing an account contract}.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export * from './account_entrypoint.js';
|
|
10
|
+
export * from './dapp_entrypoint.js';
|