@walletmesh/aztec-rpc-wallet 0.1.0
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/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
|
+
});
|