Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions apps/ans/frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,23 @@
"@daml/types": "^3.4.11",
"@emotion/react": "^11.11.1",
"@emotion/styled": "^11.11.0",
"@lfdecentralizedtrust/openapi-ts-client": "file:../openapi-ts-client/dist",
"@mui/icons-material": "^7.3.4",
"@mui/material": "^7.3.4",
"@tanstack/react-query": "5.90.20",
"dompurify": "^3.4.2",
"jose": "^4.15.9",
"jsondiffpatch": "^0.7.3",
"msw": "^2.14.2",
"oidc-client-ts": "2.2.1",
"@lfdecentralizedtrust/openapi-ts-client": "file:../openapi-ts-client/dist",
"react": "18.3.1",
"react-dom": "18.3.1",
"react-helmet-async": "^2.0.5",
"react-oidc-context": "2.2.2",
"use-debounce": "^9.0.4",
"uuid": "9.0.0",
"web-vitals": "4.2.4"
"uuid": "^14.0.0",
"web-vitals": "4.2.4",
"zod": "^3.25.76"
},
"devDependencies": {
"@eslint/js": "^9.24.0",
Expand All @@ -46,7 +51,7 @@
"@types/react-dom": "18.3.6",
"@types/uuid": "8.3.4",
"@vitejs/plugin-react": "^6.0.1",
"eslint": "9.24.0",
"eslint": "^9.39.4",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^5.2.0",
"globals": "^16.0.0",
Expand Down
11 changes: 11 additions & 0 deletions apps/ans/frontend/src/__tests__/setup/setup.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
// Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

// happy-dom@20 doesn't lowercase header names during iteration as the Fetch
// spec requires; the openapi clients read `headers["content-type"]`, so without
// this patch they fail to parse JSON responses from MSW.
const _origForEach = Headers.prototype.forEach;
Headers.prototype.forEach = function (cb, thisArg) {
return _origForEach.call(this, function (value: string, name: string, parent: Headers) {
cb.call(thisArg, value, name.toLowerCase(), parent);
});
};

import crypto from 'crypto';
import { vi } from 'vitest';

Expand Down
11 changes: 9 additions & 2 deletions apps/common/frontend-test-handlers/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
"@daml/types": "^3.4.11",
"@trivago/prettier-plugin-sort-imports": "5.2.2",
"@types/node": "22.14.0",
"eslint": "9.24.0",
"eslint": "^9.39.4",
"eslint-config-prettier": "10.1.1",
"msw": "^1.2.5",
"msw": "^2.14.2",
"nodemon": "^3.1.9",
"prettier": "3.5.3",
"typescript": "5.8.3",
Expand All @@ -27,5 +27,12 @@
"lint:check": "eslint --ignore-pattern src/com/* --max-warnings=0 -- src",
"lint:fix": "eslint --ignore-pattern src/com/* --fix --max-warnings=0 -- src",
"start": "tsc --watch"
},
"dependencies": {
"dompurify": "^3.4.2",
"jose": "^4.15.9",
"jsondiffpatch": "^0.7.3",
"uuid": "^14.0.0",
"zod": "^3.25.76"
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { rest, RestHandler } from 'msw';
import { http, HttpHandler, HttpResponse } from 'msw';

import { getAmuletRulesConfig } from '../helpers/amulet-config-helper';
import { getDsoRulesConfig } from '../helpers/dso-config-helper';
Expand Down Expand Up @@ -592,8 +592,8 @@ export const dsoInfo = {
],
};

export function dsoInfoHandler(baseUrl: string): RestHandler {
return rest.get(`${baseUrl}/v0/dso`, (_, res, ctx) => {
return res(ctx.json(dsoInfo));
export function dsoInfoHandler(baseUrl: string): HttpHandler {
return http.get(`${baseUrl}/v0/dso`, () => {
return HttpResponse.json(dsoInfo);
});
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { rest, RestHandler } from 'msw';
import { http, HttpHandler, HttpResponse } from 'msw';

import { ValidatorLicense } from '@daml.js/splice-amulet/lib/Splice/ValidatorLicense';

export function validatorLicensesHandler(baseUrl: string): RestHandler {
return rest.get(`${baseUrl}/v0/admin/validator/licenses`, (req, res, ctx) => {
const n = parseInt(req.url.searchParams.get('limit')!);
const after = req.url.searchParams.get('after');
export function validatorLicensesHandler(baseUrl: string): HttpHandler {
return http.get(`${baseUrl}/v0/admin/validator/licenses`, ({ request }) => {
const n = parseInt(new URL(request.url).searchParams.get('limit')!);
const after = new URL(request.url).searchParams.get('after');
const from = after ? parseInt(after) + 1 : 0;
const aTimestamp = '2024-09-26T16:15:36Z';
const validatorLicenses = Array.from({ length: n }, (_, i) => {
Expand All @@ -30,11 +30,9 @@ export function validatorLicensesHandler(baseUrl: string): RestHandler {
template_id: ValidatorLicense.templateId,
};
});
return res(
ctx.json({
validator_licenses: validatorLicenses,
next_page_token: from + n,
})
);
return HttpResponse.json({
validator_licenses: validatorLicenses,
next_page_token: from + n,
});
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -253,62 +253,65 @@ export function getExpectedAmuletRulesConfigDiffsHTML(
replacementCreateFee: string
): string {
const mock = `
<div
<div
class="jsondiffpatch-delta jsondiffpatch-node jsondiffpatch-child-node-type-object"><ul
class="jsondiffpatch-node jsondiffpatch-node-type-object"><li
data-key="decentralizedSynchronizer"
class="jsondiffpatch-node jsondiffpatch-child-node-type-object"><div
class="jsondiffpatch-property-name">decentralizedSynchronizer</div><ul
class="jsondiffpatch-node jsondiffpatch-child-node-type-object"
data-key="transferConfig"><div
class="jsondiffpatch-property-name">transferConfig</div><ul
class="jsondiffpatch-node jsondiffpatch-node-type-object"><li
data-key="activeSynchronizer" class="jsondiffpatch-unchanged"><div
class="jsondiffpatch-property-name">activeSynchronizer</div><div
class="jsondiffpatch-value"><pre>"global-domain::12200c1f141acd0b2e48defae40aa2eb3daae48e4c16b7e1fa5d9211d352cc150c81"</pre></div></li><li
data-key="fees" class="jsondiffpatch-unchanged"><div
class="jsondiffpatch-property-name">fees</div><div
class="jsondiffpatch-value"><pre>{
"baseRateTrafficLimits": {
"burstAmount": "400000",
"burstWindow": {
"microseconds": "1200000000"
class="jsondiffpatch-node jsondiffpatch-child-node-type-object"
data-key="createFee"><div
class="jsondiffpatch-property-name">createFee</div><ul
class="jsondiffpatch-node jsondiffpatch-node-type-object"><li
class="jsondiffpatch-modified" data-key="fee"><div
class="jsondiffpatch-property-name">fee</div><div
class="jsondiffpatch-value jsondiffpatch-left-value"><pre>"${originalCreateFee}"</pre></div><div
class="jsondiffpatch-value jsondiffpatch-right-value"><pre>"${replacementCreateFee}"</pre></div></li></ul></li><li
class="jsondiffpatch-unchanged" data-key="holdingFee"><div
class="jsondiffpatch-property-name">holdingFee</div><div
class="jsondiffpatch-value"><pre>{
"rate": "0.0000190259"
}</pre></div></li><li class="jsondiffpatch-unchanged"
data-key="transferFee"><div
class="jsondiffpatch-property-name">transferFee</div><div
class="jsondiffpatch-value"><pre>{
"initialRate": "0.01",
"steps": [
{
"_1": "100.0",
"_2": "0.001"
},
{
"_1": "1000.0",
"_2": "0.0001"
},
{
"_1": "1000000.0",
"_2": "0.00001"
}
},
"extraTrafficPrice": "16.67",
"readVsWriteScalingFactor": "4",
"minTopupAmount": "200000"
}</pre></div></li><li data-key="requiredSynchronizers"
class="jsondiffpatch-node jsondiffpatch-child-node-type-object"><div
class="jsondiffpatch-property-name">requiredSynchronizers</div><ul
class="jsondiffpatch-node jsondiffpatch-node-type-object"><li
data-key="map" class="jsondiffpatch-modified"><div
class="jsondiffpatch-property-name">map</div><div
class="jsondiffpatch-value jsondiffpatch-left-value"><pre>[
[
"global-domain::12200c1f141acd0b2e48defae40aa2eb3daae48e4c16b7e1fa5d9211d352cc150c81",
{}
]
]</pre></div><div class="jsondiffpatch-value jsondiffpatch-right-value"><pre>{
"_kvs": [
[
"global-domain::12200c1f141acd0b2e48defae40aa2eb3daae48e4c16b7e1fa5d9211d352cc150c81",
{}
]
],
"_keys": [
"global-domain::12200c1f141acd0b2e48defae40aa2eb3daae48e4c16b7e1fa5d9211d352cc150c81"
],
"_values": [
{}
]
}</pre></div></li></ul></li></ul></li><li data-key="externalPartyConfigStateTickDuration"
class="jsondiffpatch-unchanged"><div
class="jsondiffpatch-property-name">externalPartyConfigStateTickDuration</div><div
class="jsondiffpatch-value"><pre>null</pre></div></li><li data-key="featuredAppActivityMarkerAmount"
class="jsondiffpatch-unchanged"><div
class="jsondiffpatch-property-name">featuredAppActivityMarkerAmount</div><div
class="jsondiffpatch-value"><pre>null</pre></div></li><li
data-key="issuanceCurve" class="jsondiffpatch-unchanged"><div
class="jsondiffpatch-property-name">issuanceCurve</div><div
class="jsondiffpatch-value"><pre>{
}</pre></div></li><li class="jsondiffpatch-unchanged"
data-key="lockHolderFee"><div
class="jsondiffpatch-property-name">lockHolderFee</div><div
class="jsondiffpatch-value"><pre>{
"fee": "0.005"
}</pre></div></li><li class="jsondiffpatch-unchanged"
data-key="extraFeaturedAppRewardAmount"><div
class="jsondiffpatch-property-name">extraFeaturedAppRewardAmount</div><div
class="jsondiffpatch-value"><pre>"1.0"</pre></div></li><li
class="jsondiffpatch-unchanged" data-key="maxNumInputs"><div
class="jsondiffpatch-property-name">maxNumInputs</div><div
class="jsondiffpatch-value"><pre>"100"</pre></div></li><li
class="jsondiffpatch-unchanged" data-key="maxNumOutputs"><div
class="jsondiffpatch-property-name">maxNumOutputs</div><div
class="jsondiffpatch-value"><pre>"100"</pre></div></li><li
class="jsondiffpatch-unchanged" data-key="maxNumLockHolders"><div
class="jsondiffpatch-property-name">maxNumLockHolders</div><div
class="jsondiffpatch-value"><pre>"50"</pre></div></li></ul></li><li
class="jsondiffpatch-unchanged" data-key="issuanceCurve"><div
class="jsondiffpatch-property-name">issuanceCurve</div><div
class="jsondiffpatch-value"><pre>{
"initialValue": {
"amuletToIssuePerYear": "40000000000.0",
"validatorRewardPercentage": "0.05",
Expand Down Expand Up @@ -381,80 +384,81 @@ export function getExpectedAmuletRulesConfigDiffsHTML(
}
}
]
}</pre></div></li><li data-key="optDevelopmentFundManager"
class="jsondiffpatch-unchanged"><div
class="jsondiffpatch-property-name">optDevelopmentFundManager</div><div
class="jsondiffpatch-value"><pre>null</pre></div></li><li
data-key="packageConfig" class="jsondiffpatch-unchanged"><div
class="jsondiffpatch-property-name">packageConfig</div><div
class="jsondiffpatch-value"><pre>{
}</pre></div></li><li
class="jsondiffpatch-node jsondiffpatch-child-node-type-object"
data-key="decentralizedSynchronizer"><div
class="jsondiffpatch-property-name">decentralizedSynchronizer</div><ul
class="jsondiffpatch-node jsondiffpatch-node-type-object"><li
class="jsondiffpatch-node jsondiffpatch-child-node-type-object"
data-key="requiredSynchronizers"><div
class="jsondiffpatch-property-name">requiredSynchronizers</div><ul
class="jsondiffpatch-node jsondiffpatch-node-type-object"><li
class="jsondiffpatch-modified" data-key="map"><div
class="jsondiffpatch-property-name">map</div><div
class="jsondiffpatch-value jsondiffpatch-left-value"><pre>[
[
"global-domain::12200c1f141acd0b2e48defae40aa2eb3daae48e4c16b7e1fa5d9211d352cc150c81",
{}
]
]</pre></div><div class="jsondiffpatch-value jsondiffpatch-right-value"><pre>{
"_kvs": [
[
"global-domain::12200c1f141acd0b2e48defae40aa2eb3daae48e4c16b7e1fa5d9211d352cc150c81",
{}
]
],
"_keys": [
"global-domain::12200c1f141acd0b2e48defae40aa2eb3daae48e4c16b7e1fa5d9211d352cc150c81"
],
"_values": [
{}
]
}</pre></div></li></ul></li><li class="jsondiffpatch-unchanged"
data-key="activeSynchronizer"><div
class="jsondiffpatch-property-name">activeSynchronizer</div><div
class="jsondiffpatch-value"><pre>"global-domain::12200c1f141acd0b2e48defae40aa2eb3daae48e4c16b7e1fa5d9211d352cc150c81"</pre></div></li><li
class="jsondiffpatch-unchanged" data-key="fees"><div
class="jsondiffpatch-property-name">fees</div><div
class="jsondiffpatch-value"><pre>{
"baseRateTrafficLimits": {
"burstAmount": "400000",
"burstWindow": {
"microseconds": "1200000000"
}
},
"extraTrafficPrice": "16.67",
"readVsWriteScalingFactor": "4",
"minTopupAmount": "200000"
}</pre></div></li></ul></li><li class="jsondiffpatch-unchanged"
data-key="tickDuration"><div
class="jsondiffpatch-property-name">tickDuration</div><div
class="jsondiffpatch-value"><pre>{
"microseconds": "600000000"
}</pre></div></li><li class="jsondiffpatch-unchanged"
data-key="packageConfig"><div
class="jsondiffpatch-property-name">packageConfig</div><div
class="jsondiffpatch-value"><pre>{
"amulet": "0.1.8",
"amuletNameService": "0.1.8",
"dsoGovernance": "0.1.11",
"validatorLifecycle": "0.1.2",
"wallet": "0.1.8",
"walletPayments": "0.1.8"
}</pre></div></li><li data-key="tickDuration"
class="jsondiffpatch-unchanged"><div
class="jsondiffpatch-property-name">tickDuration</div><div
class="jsondiffpatch-value"><pre>{
"microseconds": "600000000"
}</pre></div></li><li data-key="transferConfig"
class="jsondiffpatch-node jsondiffpatch-child-node-type-object"><div
class="jsondiffpatch-property-name">transferConfig</div><ul
class="jsondiffpatch-node jsondiffpatch-node-type-object"><li
data-key="createFee"
class="jsondiffpatch-node jsondiffpatch-child-node-type-object"><div
class="jsondiffpatch-property-name">createFee</div><ul
class="jsondiffpatch-node jsondiffpatch-node-type-object"><li
data-key="fee" class="jsondiffpatch-modified"><div
class="jsondiffpatch-property-name">fee</div><div
class="jsondiffpatch-value jsondiffpatch-left-value"><pre>"${originalCreateFee}"</pre></div><div
class="jsondiffpatch-value jsondiffpatch-right-value"><pre>"${replacementCreateFee}"</pre></div></li></ul></li><li
data-key="extraFeaturedAppRewardAmount" class="jsondiffpatch-unchanged"><div
class="jsondiffpatch-property-name">extraFeaturedAppRewardAmount</div><div
class="jsondiffpatch-value"><pre>"1.0"</pre></div></li><li
data-key="holdingFee" class="jsondiffpatch-unchanged"><div
class="jsondiffpatch-property-name">holdingFee</div><div
class="jsondiffpatch-value"><pre>{
"rate": "0.0000190259"
}</pre></div></li><li data-key="lockHolderFee"
class="jsondiffpatch-unchanged"><div
class="jsondiffpatch-property-name">lockHolderFee</div><div
class="jsondiffpatch-value"><pre>{
"fee": "0.005"
}</pre></div></li><li data-key="maxNumInputs"
class="jsondiffpatch-unchanged"><div
class="jsondiffpatch-property-name">maxNumInputs</div><div
class="jsondiffpatch-value"><pre>"100"</pre></div></li><li
data-key="maxNumLockHolders" class="jsondiffpatch-unchanged"><div
class="jsondiffpatch-property-name">maxNumLockHolders</div><div
class="jsondiffpatch-value"><pre>"50"</pre></div></li><li
data-key="maxNumOutputs" class="jsondiffpatch-unchanged"><div
class="jsondiffpatch-property-name">maxNumOutputs</div><div
class="jsondiffpatch-value"><pre>"100"</pre></div></li><li
data-key="transferFee" class="jsondiffpatch-unchanged"><div
class="jsondiffpatch-property-name">transferFee</div><div
class="jsondiffpatch-value"><pre>{
"initialRate": "0.01",
"steps": [
{
"_1": "100.0",
"_2": "0.001"
},
{
"_1": "1000.0",
"_2": "0.0001"
},
{
"_1": "1000000.0",
"_2": "0.00001"
}
]
}</pre></div></li></ul></li><li data-key="transferPreapprovalFee"
class="jsondiffpatch-unchanged"><div
class="jsondiffpatch-property-name">transferPreapprovalFee</div><div
class="jsondiffpatch-value"><pre>null</pre></div></li></ul></div>
}</pre></div></li><li class="jsondiffpatch-unchanged"
data-key="transferPreapprovalFee"><div
class="jsondiffpatch-property-name">transferPreapprovalFee</div><div
class="jsondiffpatch-value"><pre>null</pre></div></li><li
class="jsondiffpatch-unchanged"
data-key="featuredAppActivityMarkerAmount"><div
class="jsondiffpatch-property-name">featuredAppActivityMarkerAmount</div><div
class="jsondiffpatch-value"><pre>null</pre></div></li><li
class="jsondiffpatch-unchanged" data-key="optDevelopmentFundManager"><div
class="jsondiffpatch-property-name">optDevelopmentFundManager</div><div
class="jsondiffpatch-value"><pre>null</pre></div></li><li
class="jsondiffpatch-unchanged"
data-key="externalPartyConfigStateTickDuration"><div
class="jsondiffpatch-property-name">externalPartyConfigStateTickDuration</div><div
class="jsondiffpatch-value"><pre>null</pre></div></li></ul></div>
`;
return mock;
}
Loading
Loading