Skip to content

Commit 6c2d52a

Browse files
added UUID computation to RecordScanner so theres no need to register each time a client spins up
1 parent 230a3d8 commit 6c2d52a

File tree

2 files changed

+23
-11
lines changed

2 files changed

+23
-11
lines changed

sdk/src/record-scanner.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import { EncryptedRecord } from "./models/record-provider/encryptedRecord";
33
import { OwnedFilter } from "./models/record-scanner/ownedFilter";
44
import { OwnedRecord } from "./models/record-provider/ownedRecord";
55
import { RecordProvider } from "./record-provider";
6-
import { RecordPlaintext } from "./wasm";
6+
import { Field, Poseidon4, RecordPlaintext, ViewKey } from "./wasm";
77
import { RecordSearchParams } from "./models/record-provider/recordSearchParams";
88
import { RecordsFilter } from "./models/record-scanner/recordsFilter";
99
import { RecordsResponseFilter } from "./models/record-scanner/recordsResponseFilter";
1010
import { RegistrationRequest } from "./models/record-scanner/registrationRequest";
1111
import { RegistrationResponse } from "./models/record-scanner/registrationResponse";
1212
import { StatusResponse } from "./models/record-scanner/statusResponse";
13+
import { RECORD_DOMAIN } from "./constants";
1314

1415
type RecordScannerOptions = {
1516
url: string;
@@ -68,6 +69,9 @@ class RecordScanner implements RecordProvider {
6869
this.url = options.url;
6970
this.account = options.account;
7071
this.apiKey = typeof options.apiKey === "string" ? { header: "X-Provable-API-Key", value: options.apiKey } : options.apiKey;
72+
if (this.account) {
73+
this.uuid = this.computeUUID(this.account.viewKey());
74+
}
7175
}
7276

7377
/**
@@ -76,8 +80,8 @@ class RecordScanner implements RecordProvider {
7680
* @param {Account} account The account to use for the record scanner.
7781
*/
7882
async setAccount(account: Account): Promise<void> {
79-
this.uuid = undefined;
8083
this.account = account;
84+
this.uuid = this.computeUUID(account.viewKey());
8185
}
8286

8387
/**
@@ -245,7 +249,7 @@ class RecordScanner implements RecordProvider {
245249
*/
246250
async findRecords(filter: OwnedFilter): Promise<OwnedRecord[]> {
247251
if (!this.uuid) {
248-
throw new Error("Not registered");
252+
throw new Error("You are using the RecordScanner implementation of the RecordProvider. No account has been registered with the RecordScanner which is required to use the findRecords method. Please set an with the setAccount method before calling the findRecords method again.");
249253
}
250254

251255
filter.uuid = this.uuid;
@@ -277,7 +281,7 @@ class RecordScanner implements RecordProvider {
277281
try {
278282
const records = await this.findRecords({
279283
decrypt: true,
280-
unspent: searchParameters.unspent ?? false,
284+
unspent: searchParameters.unspent,
281285
filter: {
282286
start: searchParameters.filter?.start ?? 0,
283287
program: "credits.aleo",
@@ -294,7 +298,7 @@ class RecordScanner implements RecordProvider {
294298
});
295299

296300
if (!record) {
297-
throw new Error("Record not found");
301+
throw new Error(`No records found matching the supplied search filter:\n${JSON.stringify(searchParameters, null, 2)}`);
298302
}
299303

300304
return record;
@@ -315,7 +319,7 @@ class RecordScanner implements RecordProvider {
315319
try {
316320
const records = await this.findRecords({
317321
decrypt: true,
318-
unspent: searchParameters.unspent ?? false,
322+
unspent: searchParameters.unspent,
319323
filter: {
320324
start: searchParameters.filter?.start ?? 0,
321325
program: "credits.aleo",
@@ -357,6 +361,14 @@ class RecordScanner implements RecordProvider {
357361
throw error;
358362
}
359363
}
364+
365+
private computeUUID(vk: ViewKey): Field {
366+
// Construct the material needed for the Poseidon oracle.
367+
const inputs = [Field.newDomainSeparator(RECORD_DOMAIN), vk().toField(), Field.one()]
368+
// Calculate the uuid.
369+
const hasher = new Poseidon4();
370+
return hasher.hash(inputs);
371+
}
360372
}
361373

362374
export { RecordScanner };

sdk/tests/record-scanner.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { expect } from "chai";
2-
import sinon from "sinon";
3-
import { RecordScanner } from "../src/record-scanner";
41
import { Account } from "../src/account";
52
import { CHECK_SNS_RESPONSE, CHECK_TAGS_RESPONSE, ENCRYPTED_RECORDS, OWNED_RECORDS } from "./data/records";
6-
import { RecordsResponseFilter } from "../src/models/record-scanner/recordsResponseFilter";
7-
import { RecordsFilter } from "../src/models/record-scanner/recordsFilter";
3+
import { expect } from "chai";
84
import { OwnedFilter } from "../src/models/record-scanner/ownedFilter";
95
import { OwnedRecordsResponseFilter } from "../src/models/record-scanner/ownedRecordsResponseFilter";
6+
import { RecordScanner } from "../src/record-scanner";
7+
import { RecordsFilter } from "../src/models/record-scanner/recordsFilter";
8+
import { RecordsResponseFilter } from "../src/models/record-scanner/recordsResponseFilter";
9+
import sinon from "sinon";
1010

1111
describe("RecordScanner", () => {
1212
const defaultAccount = new Account({ privateKey: "APrivateKey1zkp8CZNn3yeCseEtxuVPbDCwSyhGW6yZKUYKfgXmcpoGPWH" });

0 commit comments

Comments
 (0)