Skip to content

Commit

Permalink
feat: create context-module package for clear signing
Browse files Browse the repository at this point in the history
  • Loading branch information
aussedatlo committed Apr 30, 2024
1 parent ccc1534 commit ccf918a
Show file tree
Hide file tree
Showing 16 changed files with 701 additions and 50 deletions.
6 changes: 6 additions & 0 deletions libs/ledgerjs/packages/context-module/jest.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import baseConfig from "../../jest.config";

export default {
...baseConfig,
rootDir: __dirname,
};
30 changes: 30 additions & 0 deletions libs/ledgerjs/packages/context-module/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "@ledgerhq/context-module",
"version": "0.0.1",
"description": "Ledger context module",
"files": [
"./lib"
],
"main": "lib/index.js",
"types": "lib/index.d.ts",
"scripts": {
"build": "rimraf lib && tsc",
"test": "jest"
},
"keywords": [],
"author": "Louis Aussedat",
"license": "Apache-2.0",
"devDependencies": {
"@tsconfig/recommended": "^1.0.6",
"@types/jest": "^29.5.12",
"@types/node": "^20.12.7",
"jest": "^29.7.0",
"rimraf": "^5.0.5",
"ts-jest": "^29.1.2",
"ts-node": "^10.9.2",
"typescript": "^5.4.5"
},
"dependencies": {
"ethers": "^6.12.0"
}
}
7 changes: 7 additions & 0 deletions libs/ledgerjs/packages/context-module/src/ContextModule.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { ContextResponse } from "./models/ContextResponse";
import { LoaderOptions } from "./models/LoaderOptions";
import { Transaction } from "./models/Transaction";

export interface ContextModule {
getContexts(transaction: Transaction, options: LoaderOptions): Promise<ContextResponse[]>;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { DefaultContextModule } from "./DefaultContextModule";
import { LoaderOptions } from "./models/LoaderOptions";
import { Transaction } from "./models/Transaction";

const contextLoaderStubBuilder = () => {
return { load: jest.fn() };
};

describe("DefaultContextModule", () => {
beforeEach(() => {
jest.restoreAllMocks();
});

it("should call all fetch method from metadata fetcher", async () => {
const loader = contextLoaderStubBuilder();
const contextModule = new DefaultContextModule({ loaders: [loader, loader] });

await contextModule.getContexts({} as Transaction, {} as LoaderOptions);

expect(loader.load).toHaveBeenCalledTimes(2);
});

it("should return an array of context response", async () => {
const loader = contextLoaderStubBuilder();
const responses = [
[{ type: "provideERC20Info", payload: "payload1" }],
[
{ type: "provideERC20Info", payload: "payload2" },
{ type: "setPlugin", payload: "payload3" },
],
];
jest
.spyOn(loader, "load")
.mockResolvedValueOnce(responses[0])
.mockResolvedValueOnce(responses[1]);
const contextModule = new DefaultContextModule({ loaders: [loader, loader] });

const res = await contextModule.getContexts({} as Transaction, {} as LoaderOptions);

expect(loader.load).toHaveBeenCalledTimes(2);
expect(res).toEqual(responses.flat());
});
});
27 changes: 27 additions & 0 deletions libs/ledgerjs/packages/context-module/src/DefaultContextModule.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { ContextModule } from "./ContextModule";
import { ContextLoader } from "./loaders/ContextLoader";
import { ContextResponse } from "./models/ContextResponse";
import { LoaderOptions } from "./models/LoaderOptions";
import { Transaction } from "./models/Transaction";

type DefaultContextModuleConstructorArgs = {
loaders: ContextLoader[];
};

export class DefaultContextModule implements ContextModule {
private _loaders: ContextLoader[];

constructor({ loaders: loaders }: DefaultContextModuleConstructorArgs) {
this._loaders = loaders;
}

public async getContexts(
transaction: Transaction,
options: LoaderOptions,
): Promise<ContextResponse[]> {
const promises = this._loaders.map(fetcher => fetcher.load(transaction, options));
const responses = (await Promise.all(promises)).flat();

return responses;
}
}
1 change: 1 addition & 0 deletions libs/ledgerjs/packages/context-module/src/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Context Module
1 change: 1 addition & 0 deletions libs/ledgerjs/packages/context-module/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./DefaultContextModule";
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { ContextResponse } from "../models/ContextResponse";
import { LoaderOptions } from "../models/LoaderOptions";
import { Transaction } from "../models/Transaction";

export type ContextLoader = {
load: (transaction: Transaction, options: LoaderOptions) => Promise<ContextResponse[]>;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { LoaderOptions } from "../models/LoaderOptions";
import { Transaction } from "../models/Transaction";
import { ContextLoader } from "./ContextLoader";

export class ForwardDomainLoader implements ContextLoader {
constructor() {}

load(_transaction: Transaction, _options: LoaderOptions) {
return Promise.resolve([]);
}
}
12 changes: 12 additions & 0 deletions libs/ledgerjs/packages/context-module/src/loaders/NftLoader.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { LoaderOptions } from "../models/LoaderOptions";
import { Transaction } from "../models/Transaction";
import { ContextLoader } from "./ContextLoader";

export class NftLoader implements ContextLoader {
constructor() {}

load(_transaction: Transaction, _options: LoaderOptions) {
// TODO: implementation
return Promise.resolve([]);
}
}
11 changes: 11 additions & 0 deletions libs/ledgerjs/packages/context-module/src/loaders/TokenLoader.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { LoaderOptions } from "../models/LoaderOptions";
import { Transaction } from "../models/Transaction";
import { ContextLoader } from "./ContextLoader";

export class CalMetadataFetcher implements ContextLoader {
constructor() {}

load(_transaction: Transaction, _options: LoaderOptions) {
return Promise.resolve([]);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
export type ContextResponse =
| {
type:
| "provideERC20TokenInformation"
| "provideNFTInformation"
| "provideDomainName"
| "setPlugin"
| "setExternalPlugin";
payload: string;
}
| {
type: "error";
error: Error;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export type LoaderOptions = {
challenge: string;
forwardDomainOptions?: ForwardDomainOptions;
};

export type ForwardDomainOptions = { domain: string; registry: "ens" };
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { Transaction } from "ethers";
7 changes: 7 additions & 0 deletions libs/ledgerjs/packages/context-module/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "lib"
},
"include": ["src/**/*"]
}

0 comments on commit ccf918a

Please sign in to comment.