Skip to content

Commit aeb5033

Browse files
authored
♻️ (tx-check) [NO-ISSUE]: Use new generic transaction check loader (#1070)
2 parents 630030f + d7ee5f5 commit aeb5033

File tree

58 files changed

+2005
-1914
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+2005
-1914
lines changed

.changeset/full-tools-read.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@ledgerhq/device-signer-kit-ethereum": patch
3+
---
4+
5+
Use generic transaction check loader

.changeset/modern-emus-travel.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@ledgerhq/device-signer-kit-solana": patch
3+
---
4+
5+
Improve tests to not depend on specific context module changes

.changeset/nine-papers-march.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@ledgerhq/context-module": minor
3+
---
4+
5+
Replace legacy web3check loader by generic transaction check loader

packages/signer/context-module/src/ContextModule.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { type SolanaTransactionContext } from "./shared/model/SolanaTransactionC
77
import { type TypedDataClearSignContext } from "./shared/model/TypedDataClearSignContext";
88
import { type TypedDataContext } from "./shared/model/TypedDataContext";
99
import { type SolanaTransactionContextResult } from "./solana/domain/solanaContextTypes";
10-
import { type Web3CheckContext } from "./web3-check/domain/web3CheckTypes";
1110

1211
export interface ContextModule {
1312
getContexts<TInput>(
@@ -21,9 +20,6 @@ export interface ContextModule {
2120
getTypedDataFilters(
2221
typedData: TypedDataContext,
2322
): Promise<TypedDataClearSignContext>;
24-
getWeb3Checks(
25-
transactionContext: Web3CheckContext,
26-
): Promise<ClearSignContext | null>;
2723
getSolanaContext(
2824
transactionContext: SolanaTransactionContext,
2925
): Promise<SolanaTransactionContextResult>;

packages/signer/context-module/src/ContextModuleBuilder.test.ts

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -83,42 +83,12 @@ describe("ContextModuleBuilder", () => {
8383
expect(config.web3checks).toEqual(defaultWeb3ChecksConfig);
8484
});
8585

86-
it("should return a custom context module with a custom custom web3checks loader", () => {
87-
const contextModuleBuilder = new ContextModuleBuilder();
88-
const customLoader = { load: vi.fn() };
89-
90-
const res = contextModuleBuilder
91-
.removeDefaultLoaders()
92-
.addWeb3CheckLoader(customLoader)
93-
.build();
94-
95-
expect(res).toBeInstanceOf(DefaultContextModule);
96-
// @ts-expect-error _web3CheckLoader is private
97-
expect(res["_web3CheckLoader"]).toBe(customLoader);
98-
});
99-
100-
it("should throw an error if origin token is not provided", () => {
101-
const contextModuleBuilder = new ContextModuleBuilder();
102-
103-
expect(() => contextModuleBuilder.build()).toThrow(
104-
"Origin token is required",
105-
);
106-
});
107-
10886
it("should not throw an error if origin token is provided", () => {
10987
const contextModuleBuilder = new ContextModuleBuilder(defaultBuilderArgs);
11088

11189
expect(() => contextModuleBuilder.build()).not.toThrow();
11290
});
11391

114-
it("should not throw an error if origin token is not provided and addWeb3CheckLoader is called", () => {
115-
const contextModuleBuilder = new ContextModuleBuilder();
116-
117-
expect(() =>
118-
contextModuleBuilder.addWeb3CheckLoader({ load: vi.fn() }).build(),
119-
).not.toThrow();
120-
});
121-
12292
describe("setMetadataServiceConfig", () => {
12393
it("should set the metadata service configuration", () => {
12494
const contextModuleBuilder = new ContextModuleBuilder(defaultBuilderArgs);

packages/signer/context-module/src/ContextModuleBuilder.ts

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
import { type ContextLoader } from "./shared/domain/ContextLoader";
1010
import { type SolanaContextLoader } from "./solana/domain/SolanaContextLoader";
1111
import { type TypedDataContextLoader } from "./typed-data/domain/TypedDataContextLoader";
12-
import { type Web3CheckContextLoader } from "./web3-check/domain/Web3CheckContextLoader";
1312
import { type ContextModule } from "./ContextModule";
1413
import { DefaultContextModule } from "./DefaultContextModule";
1514

@@ -39,7 +38,6 @@ export const DEFAULT_CONFIG: ContextModuleConfig = {
3938

4039
export class ContextModuleBuilder {
4140
private config: ContextModuleConfig = DEFAULT_CONFIG;
42-
private needOriginToken: boolean = true;
4341
private originToken?: string;
4442

4543
constructor({ originToken }: ContextModuleConstructorArgs = {}) {
@@ -78,18 +76,6 @@ export class ContextModuleBuilder {
7876
return this;
7977
}
8078

81-
/**
82-
* Replace the default loader for web3 checks
83-
*
84-
* @param loader loader to use for web3 checks
85-
* @returns this
86-
*/
87-
addWeb3CheckLoader(loader: Web3CheckContextLoader) {
88-
this.needOriginToken = false;
89-
this.config.customWeb3CheckLoader = loader;
90-
return this;
91-
}
92-
9379
/**
9480
* Replace the default loader for Solana context
9581
*
@@ -153,10 +139,6 @@ export class ContextModuleBuilder {
153139
* @returns the context module
154140
*/
155141
build(): ContextModule {
156-
if (this.needOriginToken && !this.originToken) {
157-
throw new Error("Origin token is required");
158-
}
159-
160142
const config = { ...this.config, originToken: this.originToken };
161143
return new DefaultContextModule(config);
162144
}

packages/signer/context-module/src/DefaultContextModule.test.ts

Lines changed: 0 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
import { DeviceModelId } from "@ledgerhq/device-management-kit";
2-
import { Left, Right } from "purify-ts";
3-
41
import { type ContextModuleConfig } from "./config/model/ContextModuleConfig";
52
import { type ContextFieldLoader } from "./shared/domain/ContextFieldLoader";
63
import { type ContextLoader } from "./shared/domain/ContextLoader";
@@ -174,58 +171,6 @@ describe("DefaultContextModule", () => {
174171
expect(typedDataLoader.load).toHaveBeenCalledTimes(1);
175172
});
176173

177-
it("should return a web3 check context", async () => {
178-
const loader = { load: vi.fn() }; // Web3CheckLoader doesn't use ContextLoader interface
179-
vi.spyOn(loader, "load").mockResolvedValueOnce(
180-
Right({ descriptor: "payload" }),
181-
);
182-
const contextModule = new DefaultContextModule({
183-
...defaultContextModuleConfig,
184-
customLoaders: [],
185-
customWeb3CheckLoader: loader,
186-
});
187-
188-
const res = await contextModule.getWeb3Checks({
189-
deviceModelId: DeviceModelId.FLEX,
190-
from: "from",
191-
rawTx: "rawTx",
192-
chainId: 1,
193-
});
194-
195-
expect(loader.load).toHaveBeenCalledTimes(1);
196-
expect(res).toEqual({ type: "web3Check", payload: "payload" });
197-
});
198-
199-
it("should return null if no web3 check context", async () => {
200-
const loader = { load: vi.fn() }; // Web3CheckLoader doesn't use ContextLoader interface
201-
vi.spyOn(loader, "load").mockResolvedValue(Left(new Error("error")));
202-
const contextModule = new DefaultContextModule({
203-
...defaultContextModuleConfig,
204-
customLoaders: [],
205-
customWeb3CheckLoader: loader,
206-
});
207-
208-
const res = await contextModule.getWeb3Checks({
209-
deviceModelId: DeviceModelId.FLEX,
210-
from: "from",
211-
rawTx: "rawTx",
212-
chainId: 1,
213-
});
214-
215-
expect(loader.load).toHaveBeenCalledTimes(1);
216-
expect(res).toBeNull();
217-
});
218-
219-
it("should throw an error if origin token is not provided", () => {
220-
expect(
221-
() =>
222-
new DefaultContextModule({
223-
...defaultContextModuleConfig,
224-
originToken: undefined,
225-
}),
226-
).toThrow("Origin token is required");
227-
});
228-
229174
describe("getFieldContext", () => {
230175
it("should return error when no loader can handle the field", async () => {
231176
// GIVEN

packages/signer/context-module/src/DefaultContextModule.ts

Lines changed: 7 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,23 @@ import { type ContextFieldLoader } from "./shared/domain/ContextFieldLoader";
1616
import { type ContextLoader } from "./shared/domain/ContextLoader";
1717
import {
1818
type ClearSignContext,
19-
type ClearSignContextSuccess,
2019
ClearSignContextType,
2120
} from "./shared/model/ClearSignContext";
2221
import { type SolanaTransactionContext } from "./shared/model/SolanaTransactionContext";
2322
import { solanaContextTypes } from "./solana/di/solanaContextTypes";
2423
import { type SolanaContextLoader } from "./solana/domain/SolanaContextLoader";
2524
import { type SolanaTransactionContextResult } from "./solana/domain/solanaContextTypes";
2625
import { tokenTypes } from "./token/di/tokenTypes";
26+
import { transactionCheckTypes } from "./transaction-check/di/transactionCheckTypes";
2727
import { typedDataTypes } from "./typed-data/di/typedDataTypes";
2828
import type { TypedDataContextLoader } from "./typed-data/domain/TypedDataContextLoader";
29-
import { web3CheckTypes } from "./web3-check/di/web3CheckTypes";
30-
import { type Web3CheckContextLoader } from "./web3-check/domain/Web3CheckContextLoader";
31-
import {
32-
type Web3CheckContext,
33-
type Web3Checks,
34-
} from "./web3-check/domain/web3CheckTypes";
3529
import { type ContextModule } from "./ContextModule";
3630
import { makeContainer } from "./di";
3731

3832
export class DefaultContextModule implements ContextModule {
3933
private _container: Container;
4034
private _loaders: ContextLoader<unknown>[];
4135
private _typedDataLoader: TypedDataContextLoader;
42-
private _web3CheckLoader: Web3CheckContextLoader;
4336
private _solanaLoader: SolanaContextLoader;
4437
private _fieldLoaders: ContextFieldLoader<unknown>[];
4538

@@ -56,8 +49,6 @@ export class DefaultContextModule implements ContextModule {
5649

5750
this._typedDataLoader =
5851
args.customTypedDataLoader ?? this._getDefaultTypedDataLoader();
59-
this._web3CheckLoader =
60-
args.customWeb3CheckLoader ?? this._getWeb3CheckLoader();
6152
this._solanaLoader = args.customSolanaLoader ?? this._getSolanaLoader();
6253
}
6354

@@ -91,6 +82,12 @@ export class DefaultContextModule implements ContextModule {
9182
dynamicNetworkTypes.DynamicNetworkContextLoader,
9283
),
9384
this._container.get<ContextLoader>(safeTypes.SafeAddressLoader),
85+
this._container.get<ContextLoader>(
86+
transactionCheckTypes.TransactionCheckContextLoader,
87+
),
88+
this._container.get<ContextLoader>(
89+
transactionCheckTypes.TypedDataCheckContextLoader,
90+
),
9491
];
9592
}
9693

@@ -100,12 +97,6 @@ export class DefaultContextModule implements ContextModule {
10097
);
10198
}
10299

103-
private _getWeb3CheckLoader(): Web3CheckContextLoader {
104-
return this._container.get<Web3CheckContextLoader>(
105-
web3CheckTypes.Web3CheckContextLoader,
106-
);
107-
}
108-
109100
private _getSolanaLoader(): SolanaContextLoader {
110101
try {
111102
return this._container.get<SolanaContextLoader>(
@@ -173,21 +164,6 @@ export class DefaultContextModule implements ContextModule {
173164
return this._typedDataLoader.load(typedData);
174165
}
175166

176-
public async getWeb3Checks(
177-
transactionContext: Web3CheckContext,
178-
): Promise<ClearSignContextSuccess<ClearSignContextType.WEB3_CHECK> | null> {
179-
const web3Checks = await this._web3CheckLoader.load(transactionContext);
180-
181-
return web3Checks.caseOf({
182-
Right: (checks: Web3Checks) => ({
183-
type: ClearSignContextType.WEB3_CHECK,
184-
payload: checks.descriptor,
185-
certificate: checks.certificate,
186-
}),
187-
Left: () => null,
188-
});
189-
}
190-
191167
public async getSolanaContext(
192168
transactionContext: SolanaTransactionContext,
193169
): Promise<SolanaTransactionContextResult> {

packages/signer/context-module/src/config/model/ContextModuleConfig.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { type ContextFieldLoader } from "@/shared/domain/ContextFieldLoader";
22
import { type ContextLoader } from "@/shared/domain/ContextLoader";
33
import { type SolanaContextLoader } from "@/solana/domain/SolanaContextLoader";
44
import { type TypedDataContextLoader } from "@/typed-data/domain/TypedDataContextLoader";
5-
import { type Web3CheckContextLoader } from "@/web3-check/domain/Web3CheckContextLoader";
65

76
export type ContextModuleCalMode = "prod" | "test";
87
export type ContextModuleCalBranch = "next" | "main" | "demo";
@@ -34,7 +33,6 @@ export type ContextModuleConfig = {
3433
customFieldLoaders: ContextFieldLoader[];
3534
customLoaders: ContextLoader[];
3635
customTypedDataLoader?: TypedDataContextLoader;
37-
customWeb3CheckLoader?: Web3CheckContextLoader;
3836
customSolanaLoader?: SolanaContextLoader;
3937
originToken?: string;
4038
datasource?: ContextModuleDatasourceConfig;

packages/signer/context-module/src/di.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ import { proxyModuleFactory } from "@/proxy/di/proxyModuleFactory";
1111
import { safeModuleFactory } from "@/safe/di/safeModuleFactory";
1212
import { solanaContextModuleFactory } from "@/solana/di/SolanaContextModuleFactory";
1313
import { tokenModuleFactory } from "@/token/di/tokenModuleFactory";
14+
import { transactionCheckModuleFactory } from "@/transaction-check/di/transactionCheckModuleFactory";
1415
import { trustedNameModuleFactory } from "@/trusted-name/di/trustedNameModuleFactory";
1516
import { typedDataModuleFactory } from "@/typed-data/di/typedDataModuleFactory";
1617
import { uniswapModuleFactory } from "@/uniswap/di/uniswapModuleFactory";
17-
import { web3CheckModuleFactory } from "@/web3-check/di/web3CheckModuleFactory";
1818

1919
type MakeContainerArgs = {
2020
config: ContextModuleConfig;
@@ -36,7 +36,7 @@ export const makeContainer = ({ config }: MakeContainerArgs) => {
3636
typedDataModuleFactory(),
3737
nanoPkiModuleFactory(),
3838
uniswapModuleFactory(),
39-
web3CheckModuleFactory(),
39+
transactionCheckModuleFactory(),
4040
solanaContextModuleFactory(),
4141
);
4242

0 commit comments

Comments
 (0)