@walletmesh/aztec-rpc-wallet 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +7 -0
- package/LICENSE +201 -0
- package/README.md +260 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/aztecRemoteWallet.d.ts +73 -0
- package/dist/aztecRemoteWallet.d.ts.map +1 -0
- package/dist/aztecRemoteWallet.js +354 -0
- package/dist/chainProvider.d.ts +56 -0
- package/dist/chainProvider.d.ts.map +1 -0
- package/dist/chainProvider.js +98 -0
- package/dist/contractArtifactCache.d.ts +50 -0
- package/dist/contractArtifactCache.d.ts.map +1 -0
- package/dist/contractArtifactCache.js +66 -0
- package/dist/errors.d.ts +50 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +62 -0
- package/dist/handlers/aztecAccountWallet.d.ts +4 -0
- package/dist/handlers/aztecAccountWallet.d.ts.map +1 -0
- package/dist/handlers/aztecAccountWallet.js +329 -0
- package/dist/handlers/transactions.d.ts +21 -0
- package/dist/handlers/transactions.d.ts.map +1 -0
- package/dist/handlers/transactions.js +90 -0
- package/dist/handlers.d.ts +27 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +55 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/provider.d.ts +105 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +160 -0
- package/dist/serializers/account.d.ts +167 -0
- package/dist/serializers/account.d.ts.map +1 -0
- package/dist/serializers/account.js +245 -0
- package/dist/serializers/contract-utils.d.ts +40 -0
- package/dist/serializers/contract-utils.d.ts.map +1 -0
- package/dist/serializers/contract-utils.js +102 -0
- package/dist/serializers/contract.d.ts +168 -0
- package/dist/serializers/contract.d.ts.map +1 -0
- package/dist/serializers/contract.js +268 -0
- package/dist/serializers/core.d.ts +110 -0
- package/dist/serializers/core.d.ts.map +1 -0
- package/dist/serializers/core.js +130 -0
- package/dist/serializers/index.d.ts +28 -0
- package/dist/serializers/index.d.ts.map +1 -0
- package/dist/serializers/index.js +159 -0
- package/dist/serializers/log.d.ts +113 -0
- package/dist/serializers/log.d.ts.map +1 -0
- package/dist/serializers/log.js +231 -0
- package/dist/serializers/note.d.ts +127 -0
- package/dist/serializers/note.d.ts.map +1 -0
- package/dist/serializers/note.js +182 -0
- package/dist/serializers/transaction-utils.d.ts +107 -0
- package/dist/serializers/transaction-utils.d.ts.map +1 -0
- package/dist/serializers/transaction-utils.js +130 -0
- package/dist/serializers/transaction.d.ts +103 -0
- package/dist/serializers/transaction.d.ts.map +1 -0
- package/dist/serializers/transaction.js +238 -0
- package/dist/serializers/types.d.ts +49 -0
- package/dist/serializers/types.d.ts.map +1 -0
- package/dist/serializers/types.js +22 -0
- package/dist/types.d.ts +391 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/wallet.d.ts +62 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +77 -0
- package/package.json +44 -0
- package/src/aztecRemoteWallet.test.ts +542 -0
- package/src/aztecRemoteWallet.ts +484 -0
- package/src/chainProvider.test.ts +322 -0
- package/src/chainProvider.ts +122 -0
- package/src/contractArtifactCache.test.ts +126 -0
- package/src/contractArtifactCache.ts +75 -0
- package/src/errors.ts +71 -0
- package/src/handlers/aztecAccountWallet.test.ts +720 -0
- package/src/handlers/aztecAccountWallet.ts +593 -0
- package/src/handlers/transactions.ts +110 -0
- package/src/handlers.test.ts +270 -0
- package/src/handlers.ts +70 -0
- package/src/index.test.ts +23 -0
- package/src/index.ts +64 -0
- package/src/provider.test.ts +276 -0
- package/src/provider.ts +189 -0
- package/src/serializers/account.test.ts +125 -0
- package/src/serializers/account.ts +319 -0
- package/src/serializers/contract-utils.ts +104 -0
- package/src/serializers/contract.test.ts +162 -0
- package/src/serializers/contract.ts +350 -0
- package/src/serializers/core.test.ts +56 -0
- package/src/serializers/core.ts +141 -0
- package/src/serializers/index.test.ts +122 -0
- package/src/serializers/index.ts +213 -0
- package/src/serializers/log.test.ts +119 -0
- package/src/serializers/log.ts +283 -0
- package/src/serializers/note.test.ts +100 -0
- package/src/serializers/note.ts +227 -0
- package/src/serializers/transaction-utils.ts +237 -0
- package/src/serializers/transaction.test.ts +153 -0
- package/src/serializers/transaction.ts +342 -0
- package/src/serializers/types.ts +58 -0
- package/src/types.ts +295 -0
- package/src/wallet.test.ts +275 -0
- package/src/wallet.ts +94 -0
- package/tsconfig.build.json +6 -0
- package/tsconfig.json +11 -0
- package/typedoc.json +15 -0
- package/vitest.config.ts +10 -0
@@ -0,0 +1,141 @@
|
|
1
|
+
import { Fr, AztecAddress, CompleteAddress, AuthWitness, TxHash } from '@aztec/aztec.js';
|
2
|
+
import { encodeBase64, decodeBase64 } from './types.js';
|
3
|
+
import type { TypeSerializer } from './types.js';
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Serializer for Fr (field element) values in the Aztec protocol.
|
7
|
+
* Handles conversion of field elements to/from base64-encoded strings for RPC transport.
|
8
|
+
* Field elements are fundamental to Aztec's cryptographic operations.
|
9
|
+
*/
|
10
|
+
export class FrSerializer implements TypeSerializer<Fr> {
|
11
|
+
/**
|
12
|
+
* Converts an Fr value to a base64-encoded string.
|
13
|
+
* @param value - The field element to serialize
|
14
|
+
* @returns Base64-encoded string representation
|
15
|
+
*/
|
16
|
+
serialize(value: Fr): string {
|
17
|
+
return encodeBase64(value.toString());
|
18
|
+
}
|
19
|
+
|
20
|
+
/**
|
21
|
+
* Reconstructs an Fr value from a base64-encoded string.
|
22
|
+
* @param data - The base64-encoded string to deserialize
|
23
|
+
* @returns Reconstructed field element
|
24
|
+
* @throws If the input string is not a valid field element representation
|
25
|
+
*/
|
26
|
+
deserialize(data: string): Fr {
|
27
|
+
return Fr.fromHexString(decodeBase64(data));
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
/**
|
32
|
+
* Serializer for Aztec protocol addresses.
|
33
|
+
* Handles conversion of AztecAddress instances to/from base64-encoded strings.
|
34
|
+
* Aztec addresses represent accounts and contracts in the protocol.
|
35
|
+
*/
|
36
|
+
export class AztecAddressSerializer implements TypeSerializer<AztecAddress> {
|
37
|
+
/**
|
38
|
+
* Converts an AztecAddress to a base64-encoded string.
|
39
|
+
* @param value - The Aztec address to serialize
|
40
|
+
* @returns Base64-encoded string representation
|
41
|
+
*/
|
42
|
+
serialize(value: AztecAddress): string {
|
43
|
+
return encodeBase64(value.toString());
|
44
|
+
}
|
45
|
+
|
46
|
+
/**
|
47
|
+
* Reconstructs an AztecAddress from a base64-encoded string.
|
48
|
+
* @param data - The base64-encoded string to deserialize
|
49
|
+
* @returns Reconstructed Aztec address
|
50
|
+
* @throws If the input string is not a valid address representation
|
51
|
+
*/
|
52
|
+
deserialize(data: string): AztecAddress {
|
53
|
+
return AztecAddress.fromString(decodeBase64(data));
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
/**
|
58
|
+
* Serializer for complete Aztec addresses that include additional metadata.
|
59
|
+
* CompleteAddress extends AztecAddress with extra information needed for certain operations.
|
60
|
+
*/
|
61
|
+
export class CompleteAddressSerializer implements TypeSerializer<CompleteAddress> {
|
62
|
+
/**
|
63
|
+
* Converts a CompleteAddress to a base64-encoded string.
|
64
|
+
* @param value - The complete address to serialize
|
65
|
+
* @returns Base64-encoded string representation
|
66
|
+
*/
|
67
|
+
serialize(value: CompleteAddress): string {
|
68
|
+
return encodeBase64(value.toString());
|
69
|
+
}
|
70
|
+
|
71
|
+
/**
|
72
|
+
* Reconstructs a CompleteAddress from a base64-encoded string.
|
73
|
+
* @param data - The base64-encoded string to deserialize
|
74
|
+
* @returns Reconstructed complete address
|
75
|
+
* @throws If the input string is not a valid complete address representation
|
76
|
+
*/
|
77
|
+
deserialize(data: string): CompleteAddress {
|
78
|
+
return CompleteAddress.fromString(decodeBase64(data));
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
/**
|
83
|
+
* Serializer for authentication witnesses in the Aztec protocol.
|
84
|
+
* AuthWitness values are used to prove transaction authorization.
|
85
|
+
*/
|
86
|
+
export class AuthWitnessSerializer implements TypeSerializer<AuthWitness> {
|
87
|
+
/**
|
88
|
+
* Converts an AuthWitness to a base64-encoded string.
|
89
|
+
* @param value - The authentication witness to serialize
|
90
|
+
* @returns Base64-encoded string representation
|
91
|
+
*/
|
92
|
+
serialize(value: AuthWitness): string {
|
93
|
+
return encodeBase64(value.toString());
|
94
|
+
}
|
95
|
+
|
96
|
+
/**
|
97
|
+
* Reconstructs an AuthWitness from a base64-encoded string.
|
98
|
+
* @param data - The base64-encoded string to deserialize
|
99
|
+
* @returns Reconstructed authentication witness
|
100
|
+
* @throws If the input string is not a valid auth witness representation
|
101
|
+
*/
|
102
|
+
deserialize(data: string): AuthWitness {
|
103
|
+
return AuthWitness.fromString(decodeBase64(data));
|
104
|
+
}
|
105
|
+
}
|
106
|
+
|
107
|
+
/**
|
108
|
+
* Serializer for transaction hashes in the Aztec protocol.
|
109
|
+
* TxHash values uniquely identify transactions and are used for lookups and references.
|
110
|
+
*/
|
111
|
+
export class TxHashSerializer implements TypeSerializer<TxHash> {
|
112
|
+
/**
|
113
|
+
* Converts a TxHash to a base64-encoded string.
|
114
|
+
* @param value - The transaction hash to serialize
|
115
|
+
* @returns Base64-encoded string representation
|
116
|
+
*/
|
117
|
+
serialize(value: TxHash): string {
|
118
|
+
return encodeBase64(value.toString());
|
119
|
+
}
|
120
|
+
|
121
|
+
/**
|
122
|
+
* Reconstructs a TxHash from a base64-encoded string.
|
123
|
+
* @param data - The base64-encoded string to deserialize
|
124
|
+
* @returns Reconstructed transaction hash
|
125
|
+
* @throws If the input string is not a valid transaction hash representation
|
126
|
+
*/
|
127
|
+
deserialize(data: string): TxHash {
|
128
|
+
return TxHash.fromString(decodeBase64(data));
|
129
|
+
}
|
130
|
+
}
|
131
|
+
|
132
|
+
/**
|
133
|
+
* Pre-instantiated serializer instances for common Aztec types.
|
134
|
+
* These singletons should be used instead of creating new instances
|
135
|
+
* to ensure consistent serialization across the application.
|
136
|
+
*/
|
137
|
+
export const frSerializer = new FrSerializer();
|
138
|
+
export const aztecAddressSerializer = new AztecAddressSerializer();
|
139
|
+
export const completeAddressSerializer = new CompleteAddressSerializer();
|
140
|
+
export const authWitnessSerializer = new AuthWitnessSerializer();
|
141
|
+
export const txHashSerializer = new TxHashSerializer();
|
@@ -0,0 +1,122 @@
|
|
1
|
+
import { describe, expect, it, beforeEach, vi } from 'vitest';
|
2
|
+
import { AztecWalletSerializer } from './index.js';
|
3
|
+
import { AztecAddress, Tx } from '@aztec/aztec.js';
|
4
|
+
import type { JSONRPCSerializer } from './types.js';
|
5
|
+
|
6
|
+
describe('AztecWalletSerializer', () => {
|
7
|
+
// Test known method (using aztec_setScopes as an example)
|
8
|
+
const knownMethod = 'aztec_setScopes';
|
9
|
+
|
10
|
+
// Test unknown method
|
11
|
+
const unknownMethod = 'unknown_method';
|
12
|
+
|
13
|
+
// Type assertion since we verify result exists in beforeEach
|
14
|
+
const resultSerializer = (AztecWalletSerializer as Required<JSONRPCSerializer<unknown, unknown>>).result;
|
15
|
+
|
16
|
+
describe('params', () => {
|
17
|
+
it('should serialize params for known methods', () => {
|
18
|
+
const params = { scopes: [AztecAddress.random()] };
|
19
|
+
const result = AztecWalletSerializer.params.serialize(knownMethod, params);
|
20
|
+
expect(result).toBeDefined();
|
21
|
+
expect(result.method).toBe(knownMethod);
|
22
|
+
expect(typeof result.serialized).toBe('string');
|
23
|
+
});
|
24
|
+
|
25
|
+
it('should wrap unknown method params in JSONRPCSerializedData format', () => {
|
26
|
+
const params = { someParam: 'value' };
|
27
|
+
const result = AztecWalletSerializer.params.serialize(unknownMethod, params);
|
28
|
+
expect(result).toBeDefined();
|
29
|
+
expect(result.method).toBe(unknownMethod);
|
30
|
+
expect(typeof result.serialized).toBe('string');
|
31
|
+
});
|
32
|
+
|
33
|
+
it('should pass through serialized data for unknown methods', () => {
|
34
|
+
const serializedData = { serialized: 'base64data', method: unknownMethod };
|
35
|
+
const result = AztecWalletSerializer.params.deserialize(unknownMethod, serializedData);
|
36
|
+
expect(result).toEqual(serializedData);
|
37
|
+
});
|
38
|
+
|
39
|
+
it('should throw error when params serializer fails', () => {
|
40
|
+
const params = { scopes: undefined }; // Invalid - scopes must be an array
|
41
|
+
expect(() => AztecWalletSerializer.params.serialize(knownMethod, params)).toThrow(
|
42
|
+
/Failed to serialize params/,
|
43
|
+
);
|
44
|
+
});
|
45
|
+
|
46
|
+
it('should throw error when params deserializer fails', () => {
|
47
|
+
const serializedData = { serialized: 'invalid-data', method: knownMethod };
|
48
|
+
expect(() => AztecWalletSerializer.params.deserialize(knownMethod, serializedData)).toThrow(
|
49
|
+
/Failed to deserialize params/,
|
50
|
+
);
|
51
|
+
});
|
52
|
+
});
|
53
|
+
|
54
|
+
describe('result', () => {
|
55
|
+
beforeEach(() => {
|
56
|
+
// Ensure result serializer exists
|
57
|
+
expect(resultSerializer).toBeDefined();
|
58
|
+
});
|
59
|
+
|
60
|
+
it('should serialize result for known methods', () => {
|
61
|
+
const value = true;
|
62
|
+
const result = resultSerializer.serialize(knownMethod, value);
|
63
|
+
expect(result).toBeDefined();
|
64
|
+
expect(result.method).toBe(knownMethod);
|
65
|
+
expect(typeof result.serialized).toBe('string');
|
66
|
+
});
|
67
|
+
|
68
|
+
it('should wrap unknown method result in JSONRPCSerializedData format', () => {
|
69
|
+
const testResult = { someResult: 'value' };
|
70
|
+
const result = resultSerializer.serialize(unknownMethod, testResult);
|
71
|
+
expect(result).toBeDefined();
|
72
|
+
expect(result.method).toBe(unknownMethod);
|
73
|
+
expect(typeof result.serialized).toBe('string');
|
74
|
+
});
|
75
|
+
|
76
|
+
it('should pass through serialized data for unknown methods', () => {
|
77
|
+
const serializedData = { serialized: 'base64data', method: unknownMethod };
|
78
|
+
const result = resultSerializer.deserialize(unknownMethod, serializedData);
|
79
|
+
expect(result).toEqual(serializedData);
|
80
|
+
});
|
81
|
+
|
82
|
+
it('should throw error when result serializer fails', () => {
|
83
|
+
interface CircularRef {
|
84
|
+
ref: CircularRef | null;
|
85
|
+
}
|
86
|
+
const circular: CircularRef = { ref: null };
|
87
|
+
circular.ref = circular; // Create circular reference which can't be JSON stringified
|
88
|
+
expect(() => resultSerializer.serialize(knownMethod, circular)).toThrow(/Failed to serialize result/);
|
89
|
+
});
|
90
|
+
|
91
|
+
it('should throw error when result deserializer fails', () => {
|
92
|
+
const serializedData = { serialized: 'invalid-data', method: knownMethod };
|
93
|
+
expect(() => resultSerializer.deserialize(knownMethod, serializedData)).toThrow(
|
94
|
+
/Failed to deserialize result/,
|
95
|
+
);
|
96
|
+
});
|
97
|
+
});
|
98
|
+
|
99
|
+
describe('integration', () => {
|
100
|
+
it('should handle contract methods', () => {
|
101
|
+
const method = 'aztec_getContractInstance';
|
102
|
+
const params = { address: AztecAddress.random() };
|
103
|
+
|
104
|
+
const serializedParams = AztecWalletSerializer.params.serialize(method, params);
|
105
|
+
expect(serializedParams).toBeDefined();
|
106
|
+
expect(serializedParams.method).toBe(method);
|
107
|
+
expect(typeof serializedParams.serialized).toBe('string');
|
108
|
+
});
|
109
|
+
|
110
|
+
it('should handle transaction methods', () => {
|
111
|
+
const method = 'aztec_sendTx';
|
112
|
+
const params = {
|
113
|
+
tx: Tx.random(),
|
114
|
+
};
|
115
|
+
|
116
|
+
const serializedParams = AztecWalletSerializer.params.serialize(method, params);
|
117
|
+
expect(serializedParams).toBeDefined();
|
118
|
+
expect(serializedParams.method).toBe(method);
|
119
|
+
expect(typeof serializedParams.serialized).toBe('string');
|
120
|
+
});
|
121
|
+
});
|
122
|
+
});
|
@@ -0,0 +1,213 @@
|
|
1
|
+
import type { AztecWalletMethodMap } from '../types.js';
|
2
|
+
import type { JSONRPCSerializer, JSONRPCSerializedData } from './types.js';
|
3
|
+
import { encodeBase64 } from './types.js';
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Re-export all serializer types and implementations.
|
7
|
+
* This provides a single entry point for importing any serializer functionality.
|
8
|
+
*/
|
9
|
+
export * from './types.js';
|
10
|
+
export * from './core.js';
|
11
|
+
export * from './account.js';
|
12
|
+
export * from './contract.js';
|
13
|
+
export * from './transaction.js';
|
14
|
+
export * from './note.js';
|
15
|
+
export * from './log.js';
|
16
|
+
|
17
|
+
// Import all serializer instances
|
18
|
+
import {
|
19
|
+
aztecSetScopesSerializer,
|
20
|
+
aztecRegisterAccountSerializer,
|
21
|
+
aztecAddAuthWitnessSerializer,
|
22
|
+
aztecGetAuthWitnessSerializer,
|
23
|
+
} from './account.js';
|
24
|
+
import {
|
25
|
+
aztecGetContractInstanceSerializer,
|
26
|
+
aztecGetContractClassSerializer,
|
27
|
+
aztecGetContractArtifactSerializer,
|
28
|
+
aztecRegisterContractSerializer,
|
29
|
+
} from './contract.js';
|
30
|
+
import {
|
31
|
+
aztecCreateTxExecutionRequestSerializer,
|
32
|
+
aztecProveTxSerializer,
|
33
|
+
aztecSendTxSerializer,
|
34
|
+
aztecGetTxReceiptSerializer,
|
35
|
+
} from './transaction.js';
|
36
|
+
import {
|
37
|
+
aztecGetIncomingNotesSerializer,
|
38
|
+
aztecAddNoteSerializer,
|
39
|
+
aztecAddNullifiedNoteSerializer,
|
40
|
+
} from './note.js';
|
41
|
+
import {
|
42
|
+
aztecGetUnencryptedLogsSerializer,
|
43
|
+
aztecGetEncryptedEventsSerializer,
|
44
|
+
aztecGetUnencryptedEventsSerializer,
|
45
|
+
} from './log.js';
|
46
|
+
|
47
|
+
/**
|
48
|
+
* Type alias for Aztec RPC method names.
|
49
|
+
* Represents all available methods in the Aztec wallet RPC interface.
|
50
|
+
*/
|
51
|
+
type AztecMethodName = keyof AztecWalletMethodMap;
|
52
|
+
|
53
|
+
/**
|
54
|
+
* Type helper for extracting parameter types for a given method.
|
55
|
+
* @typeParam T - The method name to get parameters for
|
56
|
+
*/
|
57
|
+
type AztecMethodParams<T extends AztecMethodName> = AztecWalletMethodMap[T]['params'];
|
58
|
+
|
59
|
+
/**
|
60
|
+
* Type helper for extracting result types for a given method.
|
61
|
+
* @typeParam T - The method name to get result type for
|
62
|
+
*/
|
63
|
+
type AztecMethodResult<T extends AztecMethodName> = AztecWalletMethodMap[T]['result'];
|
64
|
+
|
65
|
+
/**
|
66
|
+
* Registry of all available method serializers.
|
67
|
+
* Maps each RPC method name to its corresponding serializer implementation.
|
68
|
+
* This mapping is used by the main AztecWalletSerializer to route method calls
|
69
|
+
* to the appropriate specialized serializer.
|
70
|
+
*/
|
71
|
+
const methodSerializers: Record<AztecMethodName, JSONRPCSerializer<unknown, unknown>> = {
|
72
|
+
// Account methods
|
73
|
+
aztec_setScopes: aztecSetScopesSerializer,
|
74
|
+
aztec_registerAccount: aztecRegisterAccountSerializer,
|
75
|
+
aztec_addAuthWitness: aztecAddAuthWitnessSerializer,
|
76
|
+
aztec_getAuthWitness: aztecGetAuthWitnessSerializer,
|
77
|
+
|
78
|
+
// Contract methods
|
79
|
+
aztec_getContractInstance: aztecGetContractInstanceSerializer,
|
80
|
+
aztec_getContractClass: aztecGetContractClassSerializer,
|
81
|
+
aztec_getContractArtifact: aztecGetContractArtifactSerializer,
|
82
|
+
aztec_registerContract: aztecRegisterContractSerializer,
|
83
|
+
|
84
|
+
// Transaction methods
|
85
|
+
aztec_createTxExecutionRequest: aztecCreateTxExecutionRequestSerializer,
|
86
|
+
aztec_proveTx: aztecProveTxSerializer,
|
87
|
+
aztec_sendTx: aztecSendTxSerializer,
|
88
|
+
aztec_getTxReceipt: aztecGetTxReceiptSerializer,
|
89
|
+
|
90
|
+
// Note methods
|
91
|
+
aztec_getIncomingNotes: aztecGetIncomingNotesSerializer,
|
92
|
+
aztec_addNote: aztecAddNoteSerializer,
|
93
|
+
aztec_addNullifiedNote: aztecAddNullifiedNoteSerializer,
|
94
|
+
|
95
|
+
// Log methods
|
96
|
+
aztec_getUnencryptedLogs: aztecGetUnencryptedLogsSerializer,
|
97
|
+
aztec_getEncryptedEvents: aztecGetEncryptedEventsSerializer,
|
98
|
+
aztec_getUnencryptedEvents: aztecGetUnencryptedEventsSerializer,
|
99
|
+
};
|
100
|
+
|
101
|
+
/**
|
102
|
+
* Helper function to wrap unknown values in a standard JSON-RPC format.
|
103
|
+
* Used as a fallback when no specific serializer is available for a method.
|
104
|
+
*
|
105
|
+
* @param method - The RPC method name
|
106
|
+
* @param value - The value to wrap
|
107
|
+
* @returns Standardized JSON-RPC data structure
|
108
|
+
*/
|
109
|
+
function wrapUnknownValue(method: string, value: unknown): JSONRPCSerializedData {
|
110
|
+
return {
|
111
|
+
method,
|
112
|
+
serialized: encodeBase64(JSON.stringify(value)),
|
113
|
+
};
|
114
|
+
}
|
115
|
+
|
116
|
+
/**
|
117
|
+
* Main serializer for the Aztec wallet RPC interface.
|
118
|
+
* Provides a unified interface for serializing all supported RPC methods.
|
119
|
+
*
|
120
|
+
* This serializer:
|
121
|
+
* 1. Routes each method call to its specialized serializer from methodSerializers
|
122
|
+
* 2. Provides fallback handling for unknown methods
|
123
|
+
* 3. Wraps all serialization operations in proper error handling
|
124
|
+
*
|
125
|
+
* The serializer handles both:
|
126
|
+
* - Parameters: Incoming RPC call parameters
|
127
|
+
* - Results: Outgoing RPC call results
|
128
|
+
*/
|
129
|
+
export const AztecWalletSerializer: JSONRPCSerializer<unknown, unknown> = {
|
130
|
+
params: {
|
131
|
+
/**
|
132
|
+
* Serializes RPC method parameters using the appropriate method serializer.
|
133
|
+
* @param method - The RPC method name
|
134
|
+
* @param value - The parameters to serialize
|
135
|
+
* @returns Serialized parameter data
|
136
|
+
* @throws If serialization fails or encounters an error
|
137
|
+
*/
|
138
|
+
serialize: (method: string, value: unknown): JSONRPCSerializedData => {
|
139
|
+
const serializer = methodSerializers[method as AztecMethodName];
|
140
|
+
if (!serializer?.params) {
|
141
|
+
return wrapUnknownValue(method, value);
|
142
|
+
}
|
143
|
+
|
144
|
+
try {
|
145
|
+
return serializer.params.serialize(method, value);
|
146
|
+
} catch (error) {
|
147
|
+
throw new Error(`Failed to serialize params for method ${method}: ${error}`);
|
148
|
+
}
|
149
|
+
},
|
150
|
+
/**
|
151
|
+
* Deserializes RPC method parameters using the appropriate method serializer.
|
152
|
+
* @param method - The RPC method name
|
153
|
+
* @param data - The serialized parameter data
|
154
|
+
* @returns Deserialized parameters
|
155
|
+
* @throws If deserialization fails or encounters an error
|
156
|
+
*/
|
157
|
+
deserialize: (method: string, data: JSONRPCSerializedData): unknown => {
|
158
|
+
const serializer = methodSerializers[method as AztecMethodName];
|
159
|
+
if (!serializer?.params) {
|
160
|
+
return data;
|
161
|
+
}
|
162
|
+
|
163
|
+
try {
|
164
|
+
return serializer.params.deserialize(method, data);
|
165
|
+
} catch (error) {
|
166
|
+
throw new Error(`Failed to deserialize params for method ${method}: ${error}`);
|
167
|
+
}
|
168
|
+
},
|
169
|
+
},
|
170
|
+
result: {
|
171
|
+
/**
|
172
|
+
* Serializes RPC method results using the appropriate method serializer.
|
173
|
+
* @param method - The RPC method name
|
174
|
+
* @param value - The result to serialize
|
175
|
+
* @returns Serialized result data
|
176
|
+
* @throws If serialization fails or encounters an error
|
177
|
+
*/
|
178
|
+
serialize: (method: string, value: unknown): JSONRPCSerializedData => {
|
179
|
+
const serializer = methodSerializers[method as AztecMethodName];
|
180
|
+
if (!serializer?.result) {
|
181
|
+
return wrapUnknownValue(method, value);
|
182
|
+
}
|
183
|
+
|
184
|
+
try {
|
185
|
+
return serializer.result.serialize(method, value);
|
186
|
+
} catch (error) {
|
187
|
+
throw new Error(`Failed to serialize result for method ${method}: ${error}`);
|
188
|
+
}
|
189
|
+
},
|
190
|
+
/**
|
191
|
+
* Deserializes RPC method results using the appropriate method serializer.
|
192
|
+
* @param method - The RPC method name
|
193
|
+
* @param data - The serialized result data
|
194
|
+
* @returns Deserialized result
|
195
|
+
* @throws If deserialization fails or encounters an error
|
196
|
+
*/
|
197
|
+
deserialize: (method: string, data: JSONRPCSerializedData): unknown => {
|
198
|
+
const serializer = methodSerializers[method as AztecMethodName];
|
199
|
+
if (!serializer?.result) {
|
200
|
+
return data;
|
201
|
+
}
|
202
|
+
|
203
|
+
try {
|
204
|
+
return serializer.result.deserialize(method, data);
|
205
|
+
} catch (error) {
|
206
|
+
throw new Error(`Failed to deserialize result for method ${method}: ${error}`);
|
207
|
+
}
|
208
|
+
},
|
209
|
+
},
|
210
|
+
};
|
211
|
+
|
212
|
+
// Export the main serializer interface
|
213
|
+
export type { JSONRPCSerializer } from './types.js';
|
@@ -0,0 +1,119 @@
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
2
|
+
import { Point, AztecAddress } from '@aztec/aztec.js';
|
3
|
+
import { EventSelector } from '@aztec/foundation/abi';
|
4
|
+
import type { AbiType } from '@aztec/foundation/abi';
|
5
|
+
import {
|
6
|
+
ExtendedUnencryptedL2Log,
|
7
|
+
type GetUnencryptedLogsResponse,
|
8
|
+
type LogFilter,
|
9
|
+
LogId,
|
10
|
+
TxHash,
|
11
|
+
} from '@aztec/circuit-types';
|
12
|
+
import {
|
13
|
+
aztecGetUnencryptedLogsSerializer,
|
14
|
+
aztecGetEncryptedEventsSerializer,
|
15
|
+
aztecGetUnencryptedEventsSerializer,
|
16
|
+
} from './log.js';
|
17
|
+
|
18
|
+
describe('Log Serializers', () => {
|
19
|
+
describe('aztec_getUnencryptedLogs', () => {
|
20
|
+
const METHOD = 'aztec_getUnencryptedLogs';
|
21
|
+
|
22
|
+
it('should serialize and deserialize params', () => {
|
23
|
+
const filter: LogFilter = {
|
24
|
+
txHash: TxHash.random(),
|
25
|
+
fromBlock: 0,
|
26
|
+
toBlock: 100,
|
27
|
+
afterLog: LogId.random(),
|
28
|
+
contractAddress: AztecAddress.random(),
|
29
|
+
};
|
30
|
+
|
31
|
+
const params = { filter };
|
32
|
+
|
33
|
+
const serialized = aztecGetUnencryptedLogsSerializer.params.serialize(METHOD, params);
|
34
|
+
expect(serialized.method).toBe(METHOD);
|
35
|
+
|
36
|
+
const deserialized = aztecGetUnencryptedLogsSerializer.params.deserialize(METHOD, serialized);
|
37
|
+
expect(deserialized.filter.contractAddress?.toString()).toBe(filter.contractAddress?.toString());
|
38
|
+
expect(deserialized.filter.txHash?.toString()).toBe(filter.txHash?.toString());
|
39
|
+
expect(deserialized.filter.fromBlock).toBe(filter.fromBlock);
|
40
|
+
expect(deserialized.filter.toBlock).toBe(filter.toBlock);
|
41
|
+
expect(deserialized.filter.afterLog?.toString()).toBe(filter.afterLog?.toString());
|
42
|
+
});
|
43
|
+
|
44
|
+
it('should serialize and deserialize result', () => {
|
45
|
+
const result: GetUnencryptedLogsResponse = {
|
46
|
+
logs: [ExtendedUnencryptedL2Log.random()],
|
47
|
+
maxLogsHit: false,
|
48
|
+
};
|
49
|
+
|
50
|
+
const serialized = aztecGetUnencryptedLogsSerializer.result.serialize(METHOD, result);
|
51
|
+
expect(serialized.method).toBe(METHOD);
|
52
|
+
|
53
|
+
const deserialized = aztecGetUnencryptedLogsSerializer.result.deserialize(METHOD, serialized);
|
54
|
+
expect(deserialized.logs[0].toString()).toBe(result.logs[0].toString());
|
55
|
+
expect(deserialized.logs.length).toBe(result.logs.length);
|
56
|
+
expect(deserialized.maxLogsHit).toBe(result.maxLogsHit);
|
57
|
+
});
|
58
|
+
});
|
59
|
+
|
60
|
+
describe('aztec_getEncryptedEvents', () => {
|
61
|
+
const METHOD = 'aztec_getEncryptedEvents';
|
62
|
+
|
63
|
+
it('should serialize and deserialize params', () => {
|
64
|
+
const event = {
|
65
|
+
eventSelector: EventSelector.fromString('0x12345678'),
|
66
|
+
abiType: {
|
67
|
+
kind: 'field',
|
68
|
+
} as AbiType,
|
69
|
+
fieldNames: ['field1', 'field2'],
|
70
|
+
};
|
71
|
+
const params = {
|
72
|
+
event,
|
73
|
+
from: 0,
|
74
|
+
limit: 10,
|
75
|
+
vpks: [Point.random(), Point.random()],
|
76
|
+
};
|
77
|
+
|
78
|
+
const serialized = aztecGetEncryptedEventsSerializer.params.serialize(METHOD, params);
|
79
|
+
expect(serialized.method).toBe(METHOD);
|
80
|
+
|
81
|
+
const deserialized = aztecGetEncryptedEventsSerializer.params.deserialize(METHOD, serialized);
|
82
|
+
expect(deserialized.event.eventSelector.toString()).toBe(event.eventSelector.toString());
|
83
|
+
expect(deserialized.event.abiType).toEqual(event.abiType);
|
84
|
+
expect(deserialized.event.fieldNames).toEqual(event.fieldNames);
|
85
|
+
expect(deserialized.from).toBe(params.from);
|
86
|
+
expect(deserialized.limit).toBe(params.limit);
|
87
|
+
expect(deserialized.vpks?.map((p) => p.toString())).toEqual(params.vpks.map((p) => p.toString()));
|
88
|
+
});
|
89
|
+
});
|
90
|
+
|
91
|
+
describe('aztec_getUnencryptedEvents', () => {
|
92
|
+
const METHOD = 'aztec_getUnencryptedEvents';
|
93
|
+
|
94
|
+
it('should serialize and deserialize params', () => {
|
95
|
+
const event = {
|
96
|
+
eventSelector: EventSelector.fromString('0x12345678'),
|
97
|
+
abiType: {
|
98
|
+
kind: 'field',
|
99
|
+
} as AbiType,
|
100
|
+
fieldNames: ['field1', 'field2'],
|
101
|
+
};
|
102
|
+
const params = {
|
103
|
+
event,
|
104
|
+
from: 0,
|
105
|
+
limit: 10,
|
106
|
+
};
|
107
|
+
|
108
|
+
const serialized = aztecGetUnencryptedEventsSerializer.params.serialize(METHOD, params);
|
109
|
+
expect(serialized.method).toBe(METHOD);
|
110
|
+
|
111
|
+
const deserialized = aztecGetUnencryptedEventsSerializer.params.deserialize(METHOD, serialized);
|
112
|
+
expect(deserialized.event.eventSelector.toString()).toBe(event.eventSelector.toString());
|
113
|
+
expect(deserialized.event.abiType).toEqual(event.abiType);
|
114
|
+
expect(deserialized.event.fieldNames).toEqual(event.fieldNames);
|
115
|
+
expect(deserialized.from).toBe(params.from);
|
116
|
+
expect(deserialized.limit).toBe(params.limit);
|
117
|
+
});
|
118
|
+
});
|
119
|
+
});
|