diff options
author | Özgür Kesim <oec-taler@kesim.org> | 2023-09-14 12:13:35 +0200 |
---|---|---|
committer | Özgür Kesim <oec-taler@kesim.org> | 2023-09-14 12:13:35 +0200 |
commit | 35611f0bf9cf67638b171c2a300fab1797d3d8f0 (patch) | |
tree | d067d5d62ac2fd0d88b25d2c759cc2caa9485c00 /packages | |
parent | 64c19c8cde56699ab4aaf05a1ac6fea6a4e0e4ba (diff) | |
parent | a5960665245c4ffb625dd16923019e8c62c20159 (diff) |
Merge branch 'master' into age-withdraw
Diffstat (limited to 'packages')
-rw-r--r-- | packages/aml-backoffice-ui/package.json | 2 | ||||
-rw-r--r-- | packages/anastasis-cli/package.json | 4 | ||||
-rw-r--r-- | packages/anastasis-core/package.json | 4 | ||||
-rw-r--r-- | packages/anastasis-webui/package.json | 2 | ||||
-rw-r--r-- | packages/demobank-ui/package.json | 2 | ||||
-rw-r--r-- | packages/idb-bridge/package.json | 4 | ||||
-rw-r--r-- | packages/merchant-backend-ui/package.json | 4 | ||||
-rw-r--r-- | packages/merchant-backoffice-ui/package.json | 5 | ||||
-rw-r--r-- | packages/pogen/package.json | 1 | ||||
-rw-r--r-- | packages/taler-harness/package.json | 4 | ||||
-rw-r--r-- | packages/taler-util/package.json | 4 | ||||
-rw-r--r-- | packages/taler-wallet-cli/package.json | 4 | ||||
-rw-r--r-- | packages/taler-wallet-core/package.json | 4 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/dbless.ts | 2 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/util/coinSelection.test.ts | 156 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/util/coinSelection.ts | 20 | ||||
-rw-r--r-- | packages/taler-wallet-embedded/package.json | 6 | ||||
-rw-r--r-- | packages/taler-wallet-webextension/package.json | 6 | ||||
-rw-r--r-- | packages/web-util/package.json | 3 |
19 files changed, 201 insertions, 36 deletions
diff --git a/packages/aml-backoffice-ui/package.json b/packages/aml-backoffice-ui/package.json index a761374df..9ca6312a7 100644 --- a/packages/aml-backoffice-ui/package.json +++ b/packages/aml-backoffice-ui/package.json @@ -8,7 +8,9 @@ "type": "module", "scripts": { "build": "./build.mjs", + "typedoc": "typedoc --out dist/typedoc ./src/", "check": "tsc", + "clean": "rm -rf dist lib", "compile": "tsc && ./build.mjs", "test": "./test.mjs && mocha --require source-map-support/register 'dist/test/**/*.test.js' 'dist/test/**/test.js'", "lint": "eslint 'src/**/*.{js,jsx,ts,tsx}'", diff --git a/packages/anastasis-cli/package.json b/packages/anastasis-cli/package.json index 55af7cc06..e0b154de8 100644 --- a/packages/anastasis-cli/package.json +++ b/packages/anastasis-cli/package.json @@ -18,7 +18,8 @@ "scripts": { "compile": "tsc && ./build-node.mjs", "test": "tsc", - "clean": "rimraf lib dist tsconfig.tsbuildinfo", + "clean": "rm -rf lib dist tsconfig.tsbuildinfo", + "typedoc": "typedoc --out dist/typedoc ./src/", "pretty": "prettier --write src" }, "files": [ @@ -32,7 +33,6 @@ "devDependencies": { "@types/node": "^18.11.17", "prettier": "^2.8.8", - "rimraf": "^3.0.2", "typedoc": "^0.25.1", "typescript": "^5.2.2" }, diff --git a/packages/anastasis-core/package.json b/packages/anastasis-core/package.json index aa182e047..14768b178 100644 --- a/packages/anastasis-core/package.json +++ b/packages/anastasis-core/package.json @@ -10,14 +10,14 @@ "pretty": "prettier --write src", "test": "tsc && ava", "coverage": "tsc && nyc ava", - "clean": "rimraf dist lib tsconfig.tsbuildinfo" + "typedoc": "typedoc --out dist/typedoc ./src/", + "clean": "rm -rf dist lib tsconfig.tsbuildinfo" }, "author": "Florian Dold <dold@taler.net>", "license": "AGPL-3-or-later", "type": "module", "devDependencies": { "ava": "^4.3.3", - "rimraf": "^3.0.2", "typescript": "^5.2.2" }, "dependencies": { diff --git a/packages/anastasis-webui/package.json b/packages/anastasis-webui/package.json index efee9633e..0a63a66c4 100644 --- a/packages/anastasis-webui/package.json +++ b/packages/anastasis-webui/package.json @@ -8,7 +8,9 @@ "build": "./build.mjs", "compile": "tsc && ./build.mjs", "dev": "./dev.mjs", + "clean": "rm -rf dist lib tsconfig.tsbuildinfo", "lint": "eslint 'src/**/*.{js,jsx,ts,tsx}'", + "typedoc": "typedoc --out dist/typedoc ./src/", "test": "./test.mjs && mocha --require source-map-support/register --enable-source-maps 'dist/**/*test.js'", "pretty": "prettier --write src" }, diff --git a/packages/demobank-ui/package.json b/packages/demobank-ui/package.json index d33fae709..8b999aeed 100644 --- a/packages/demobank-ui/package.json +++ b/packages/demobank-ui/package.json @@ -7,9 +7,11 @@ "scripts": { "build": "./build.mjs", "check": "tsc", + "clean": "rm -rf dist lib tsconfig.tsbuildinfo", "compile": "tsc && ./build.mjs", "test": "./test.mjs && mocha --require source-map-support/register 'dist/test/**/*.test.js' 'dist/test/**/test.js'", "lint": "eslint 'src/**/*.{js,jsx,ts,tsx}'", + "typedoc": "typedoc --out dist/typedoc ./src/", "i18n:extract": "pogen extract", "i18n:merge": "pogen merge", "i18n:emit": "pogen emit", diff --git a/packages/idb-bridge/package.json b/packages/idb-bridge/package.json index ce64314ff..3ed3e76b5 100644 --- a/packages/idb-bridge/package.json +++ b/packages/idb-bridge/package.json @@ -11,8 +11,9 @@ "private": false, "scripts": { "test": "tsc && ava", + "typedoc": "typedoc --out dist/typedoc ./src/", "compile": "tsc", - "clean": "rimraf dist lib tsconfig.tsbuildinfo", + "clean": "rm -rf dist lib tsconfig.tsbuildinfo", "pretty": "prettier --write src" }, "exports": { @@ -28,7 +29,6 @@ "@types/node": "^20.4.1", "ava": "^5.3.1", "prettier": "^2.8.8", - "rimraf": "^5.0.1", "typescript": "^5.2.2" }, "dependencies": { diff --git a/packages/merchant-backend-ui/package.json b/packages/merchant-backend-ui/package.json index 03e64308c..bb8114fba 100644 --- a/packages/merchant-backend-ui/package.json +++ b/packages/merchant-backend-ui/package.json @@ -9,8 +9,7 @@ "render-examples": "ts-node -O '{\"module\": \"commonjs\"}' -T render-examples.ts dist/pages dist/examples", "lint-check": "eslint '{src,tests}/**/*.{js,jsx,ts,tsx}'", "lint-fix": "eslint --fix '{src,tests}/**/*.{js,jsx,ts,tsx}'", - "typedoc": "typedoc src", - "clean": "rimraf dist", + "clean": "rm -rf dist lib tsconfig.tsbuildinfo", "serve-dist": "sirv --port ${PORT:=8080} --cors --single dist" }, "engines": { @@ -61,7 +60,6 @@ "mustache": "^4.2.0", "po2json": "^0.4.5", "preact-render-to-string": "^5.1.19", - "rimraf": "^3.0.2", "sirv-cli": "^1.0.11", "ts-node": "^10.9.1", "tslib": "2.5.3", diff --git a/packages/merchant-backoffice-ui/package.json b/packages/merchant-backoffice-ui/package.json index 12aeb4b0e..66e03a65c 100644 --- a/packages/merchant-backoffice-ui/package.json +++ b/packages/merchant-backoffice-ui/package.json @@ -15,7 +15,7 @@ "i18n:merge": "pogen merge", "i18n:emit": "pogen emit", "i18n": "pnpm i18n:extract && pnpm i18n:merge && pnpm i18n:emit", - "typedoc": "typedoc src", + "typedoc": "typedoc --out dist/typedoc ./src/", "pretty": "prettier --write src" }, "eslintConfig": { @@ -72,7 +72,6 @@ "inline-chunk-html-plugin": "^1.1.1", "mocha": "^9.2.0", "preact-render-to-string": "^5.2.6", - "rimraf": "^3.0.2", "sass": "1.56.1", "source-map-support": "^0.5.21", "typedoc": "^0.25.1", @@ -81,4 +80,4 @@ "pogen": { "domain": "taler-merchant-backoffice" } -}
\ No newline at end of file +} diff --git a/packages/pogen/package.json b/packages/pogen/package.json index 9160e699c..82391a675 100644 --- a/packages/pogen/package.json +++ b/packages/pogen/package.json @@ -7,6 +7,7 @@ "author": "Florian Dold", "license": "GPL-2.0+", "scripts": { + "clean": "rm -rf lib", "compile": "tsc" }, "devDependencies": { diff --git a/packages/taler-harness/package.json b/packages/taler-harness/package.json index 9f2b0d8e3..38f168af4 100644 --- a/packages/taler-harness/package.json +++ b/packages/taler-harness/package.json @@ -19,7 +19,8 @@ "compile": "tsc && ./build.mjs", "check": "tsc", "test": "tsc", - "clean": "rimraf lib dist tsconfig.tsbuildinfo", + "typedoc": "typedoc --out dist/typedoc ./src/", + "clean": "rm -rf lib dist tsconfig.tsbuildinfo", "pretty": "prettier --write src" }, "files": [ @@ -34,7 +35,6 @@ "@types/node": "^18.11.17", "esbuild": "^0.17.7", "prettier": "^2.8.8", - "rimraf": "^3.0.2", "typescript": "^5.2.2" }, "dependencies": { diff --git a/packages/taler-util/package.json b/packages/taler-util/package.json index 0bb98767d..80e99ae0e 100644 --- a/packages/taler-util/package.json +++ b/packages/taler-util/package.json @@ -59,7 +59,8 @@ "scripts": { "compile": "tsc", "test": "tsc && ava", - "clean": "rimraf dist lib tsconfig.tsbuildinfo", + "clean": "rm -rf dist lib tsconfig.tsbuildinfo", + "typedoc": "typedoc --out dist/typedoc ./src/", "pretty": "prettier --write src" }, "devDependencies": { @@ -67,7 +68,6 @@ "ava": "^4.3.3", "esbuild": "^0.17.7", "prettier": "^2.8.8", - "rimraf": "^3.0.2", "typescript": "^5.2.2" }, "dependencies": { diff --git a/packages/taler-wallet-cli/package.json b/packages/taler-wallet-cli/package.json index 6196c8971..382951223 100644 --- a/packages/taler-wallet-cli/package.json +++ b/packages/taler-wallet-cli/package.json @@ -18,7 +18,8 @@ "scripts": { "compile": "tsc && ./build-node.mjs", "test": "tsc", - "clean": "rimraf lib dist tsconfig.tsbuildinfo", + "typedoc": "typedoc --out dist/typedoc ./src/", + "clean": "rm -rf lib dist tsconfig.tsbuildinfo", "pretty": "prettier --write src" }, "files": [ @@ -32,7 +33,6 @@ "devDependencies": { "@types/node": "^18.11.17", "prettier": "^2.8.8", - "rimraf": "^3.0.2", "typedoc": "^0.25.1", "typescript": "^5.2.2" }, diff --git a/packages/taler-wallet-core/package.json b/packages/taler-wallet-core/package.json index fda7b6081..668fe4b92 100644 --- a/packages/taler-wallet-core/package.json +++ b/packages/taler-wallet-core/package.json @@ -15,9 +15,10 @@ "compile": "tsc", "pretty": "prettier --write src", "test": "tsc && ava", + "typedoc": "typedoc --out dist/typedoc ./src/", "coverage": "tsc && c8 --src src --all ava", "coverage:html": "tsc && c8 -r html --src src --all ava", - "clean": "rimraf dist lib tsconfig.tsbuildinfo" + "clean": "rm -rf dist lib tsconfig.tsbuildinfo" }, "files": [ "AUTHORS", @@ -64,7 +65,6 @@ "jed": "^1.1.1", "po2json": "^0.4.5", "prettier": "^2.8.8", - "rimraf": "^3.0.2", "typedoc": "^0.25.1", "typescript": "^5.2.2" }, diff --git a/packages/taler-wallet-core/src/dbless.ts b/packages/taler-wallet-core/src/dbless.ts index 65c293bdf..d70eab888 100644 --- a/packages/taler-wallet-core/src/dbless.ts +++ b/packages/taler-wallet-core/src/dbless.ts @@ -31,6 +31,7 @@ import { AmountJson, Amounts, AmountString, + BankAccessApiClient, codecForAny, codecForBankWithdrawalOperationPostResponse, codecForBatchDepositSuccess, @@ -53,7 +54,6 @@ import { HttpRequestLibrary, readSuccessResponseJsonOrThrow, } from "@gnu-taler/taler-util/http"; -import { BankAccessApiClient } from "../../taler-util/src/bank-api-client.js"; import { TalerCryptoInterface } from "./crypto/cryptoImplementation.js"; import { DenominationRecord } from "./db.js"; import { isWithdrawableDenom } from "./index.js"; diff --git a/packages/taler-wallet-core/src/util/coinSelection.test.ts b/packages/taler-wallet-core/src/util/coinSelection.test.ts index b907eb160..2a322c4a9 100644 --- a/packages/taler-wallet-core/src/util/coinSelection.test.ts +++ b/packages/taler-wallet-core/src/util/coinSelection.test.ts @@ -17,9 +17,165 @@ import { AbsoluteTime, AgeRestriction, AmountJson, + AmountString, Amounts, + DenomKeyType, Duration, TransactionAmountMode, } from "@gnu-taler/taler-util"; import test, { ExecutionContext } from "ava"; +import { AvailableDenom, testing_greedySelectPeer } from "./coinSelection.js" +type Tester<T> = { + deep: { + equal(another: T): ReturnType<ExecutionContext["deepEqual"]>; + equals(another: T): ReturnType<ExecutionContext["deepEqual"]>; + } +} + +function expect<T>(t: ExecutionContext, thing: T): Tester<T> { + return { + deep: { + equal: (another: T) => t.deepEqual(thing, another), + equals: (another: T) => t.deepEqual(thing, another), + }, + }; +} + +const inTheDistantFuture = AbsoluteTime.toProtocolTimestamp( + AbsoluteTime.addDuration(AbsoluteTime.now(), Duration.fromSpec({ hours: 1 })) +) +const inThePast = AbsoluteTime.toProtocolTimestamp( + AbsoluteTime.subtractDuraction(AbsoluteTime.now(), Duration.fromSpec({ hours: 1 })) +) + +test("should select the coin", (t) => { + const instructedAmount = Amounts.parseOrThrow("LOCAL:2") + const tally = { + amountAcc: Amounts.zeroOfCurrency(instructedAmount.currency), + depositFeesAcc: Amounts.zeroOfCurrency(instructedAmount.currency), + lastDepositFee: Amounts.zeroOfCurrency(instructedAmount.currency), + }; + const coins = testing_greedySelectPeer( + createCandidates([{ + amount: "LOCAL:10", + numAvailable: 5, + depositFee: "LOCAL:0.1", + fromExchange: "http://exchange.localhost/", + }]), + instructedAmount, + tally + ); + + expect(t, coins).deep.equal({ + "hash0;32;http://exchange.localhost/": { + exchangeBaseUrl: "http://exchange.localhost/", + denomPubHash: "hash0", + maxAge: 32, + contributions: [Amounts.parseOrThrow("LOCAL:2")], + } + }); + + expect(t, tally).deep.equal({ + amountAcc: Amounts.parseOrThrow("LOCAL:2"), + depositFeesAcc: Amounts.parseOrThrow("LOCAL:0.1"), + lastDepositFee: Amounts.parseOrThrow("LOCAL:0.1"), + }); + +}); + +test("should select 3 coins", (t) => { + const instructedAmount = Amounts.parseOrThrow("LOCAL:20") + const tally = { + amountAcc: Amounts.zeroOfCurrency(instructedAmount.currency), + depositFeesAcc: Amounts.zeroOfCurrency(instructedAmount.currency), + lastDepositFee: Amounts.zeroOfCurrency(instructedAmount.currency), + }; + const coins = testing_greedySelectPeer( + createCandidates([{ + amount: "LOCAL:10", + numAvailable: 5, + depositFee: "LOCAL:0.1", + fromExchange: "http://exchange.localhost/", + }]), + instructedAmount, + tally + ); + + expect(t, coins).deep.equal({ + "hash0;32;http://exchange.localhost/": { + exchangeBaseUrl: "http://exchange.localhost/", + denomPubHash: "hash0", + maxAge: 32, + contributions: [ + Amounts.parseOrThrow("LOCAL:9.9"), + Amounts.parseOrThrow("LOCAL:9.9"), + Amounts.parseOrThrow("LOCAL:0.2") + ], + } + }); + + expect(t, tally).deep.equal({ + amountAcc: Amounts.parseOrThrow("LOCAL:20"), + depositFeesAcc: Amounts.parseOrThrow("LOCAL:0.3"), + lastDepositFee: Amounts.parseOrThrow("LOCAL:0.1"), + }); + +}); + +test("can't select since the instructed amount is too high", (t) => { + const instructedAmount = Amounts.parseOrThrow("LOCAL:60") + const tally = { + amountAcc: Amounts.zeroOfCurrency(instructedAmount.currency), + depositFeesAcc: Amounts.zeroOfCurrency(instructedAmount.currency), + lastDepositFee: Amounts.zeroOfCurrency(instructedAmount.currency), + }; + const coins = testing_greedySelectPeer( + createCandidates([{ + amount: "LOCAL:10", + numAvailable: 5, + depositFee: "LOCAL:0.1", + fromExchange: "http://exchange.localhost/", + }]), + instructedAmount, + tally + ); + + expect(t, coins).deep.equal(undefined); + + expect(t, tally).deep.equal({ + amountAcc: Amounts.parseOrThrow("LOCAL:49.5"), + depositFeesAcc: Amounts.parseOrThrow("LOCAL:0.5"), + lastDepositFee: Amounts.parseOrThrow("LOCAL:0.1"), + }); + +}); + + + + +function createCandidates(ar: {amount: AmountString, depositFee: AmountString, numAvailable: number, fromExchange: string}[]): AvailableDenom[] { + return ar.map((r,idx) => { + return { + "denomPub": { + "age_mask": 0, + "cipher": DenomKeyType.Rsa, + "rsa_public_key": "PPP" + }, + "denomPubHash": `hash${idx}`, + "value": r.amount, + "feeDeposit": r.depositFee, + "feeRefresh": "LOCAL:0", + "feeRefund": "LOCAL:0", + "feeWithdraw": "LOCAL:0", + "stampExpireDeposit": inTheDistantFuture, + "stampExpireLegal": inTheDistantFuture, + "stampExpireWithdraw": inTheDistantFuture, + "stampStart": inThePast, + "exchangeBaseUrl": r.fromExchange, + "numAvailable": r.numAvailable, + "maxAge": 32, + + } + }) +} diff --git a/packages/taler-wallet-core/src/util/coinSelection.ts b/packages/taler-wallet-core/src/util/coinSelection.ts index 6fd0f1b86..0885215dd 100644 --- a/packages/taler-wallet-core/src/util/coinSelection.ts +++ b/packages/taler-wallet-core/src/util/coinSelection.ts @@ -894,6 +894,12 @@ interface PeerCoinSelectionTally { lastDepositFee: AmountJson; } +/** + * exporting for testing + */ +export function testing_greedySelectPeer(...args: Parameters<typeof greedySelectPeer>): ReturnType<typeof greedySelectPeer> { + return greedySelectPeer(...args) +} function greedySelectPeer( candidates: AvailableDenom[], instructedAmount: AmountLike, @@ -912,19 +918,19 @@ function greedySelectPeer( instructedAmount, tally.amountAcc, ).amount; - const coinSpend = Amounts.max( - Amounts.min(amountPayRemaining, denom.value), - denom.feeDeposit, - ); + const coinContrib = Amounts.sub(denom.value, denom.feeDeposit).amount + + const coinSpend = Amounts.min(amountPayRemaining, coinContrib) + tally.amountAcc = Amounts.add(tally.amountAcc, coinSpend).amount; - // Since this is a peer payment, there is no merchant to - // potentially cover the deposit fees. - tally.amountAcc = Amounts.sub(tally.amountAcc, denom.feeDeposit).amount; + tally.depositFeesAcc = Amounts.add( tally.depositFeesAcc, denom.feeDeposit, ).amount; + tally.lastDepositFee = Amounts.parseOrThrow(denom.feeDeposit); + contributions.push(coinSpend); } if (contributions.length > 0) { diff --git a/packages/taler-wallet-embedded/package.json b/packages/taler-wallet-embedded/package.json index b96edff25..35a4fcffe 100644 --- a/packages/taler-wallet-embedded/package.json +++ b/packages/taler-wallet-embedded/package.json @@ -15,7 +15,8 @@ "scripts": { "compile": "./build.mjs", "pretty": "prettier --write src", - "clean": "rimraf lib dist tsconfig.tsbuildinfo", + "typedoc": "typedoc --out dist/typedoc ./src/wallet-qjs.ts", + "clean": "rm -rf lib dist tsconfig.tsbuildinfo", "deps": "pnpm install --frozen-lockfile --filter @gnu-taler/taler-wallet-embedded..." }, "files": [ @@ -29,8 +30,7 @@ "devDependencies": { "@types/node": "^18.11.17", "esbuild": "^0.17.7", - "prettier": "^2.8.8", - "rimraf": "^3.0.2" + "prettier": "^2.8.8" }, "dependencies": { "@gnu-taler/idb-bridge": "workspace:*", diff --git a/packages/taler-wallet-webextension/package.json b/packages/taler-wallet-webextension/package.json index f442b1509..23736729c 100644 --- a/packages/taler-wallet-webextension/package.json +++ b/packages/taler-wallet-webextension/package.json @@ -9,10 +9,11 @@ "license": "AGPL-3.0-or-later", "private": false, "scripts": { - "clean": "rimraf dist lib tsconfig.tsbuildinfo", + "clean": "rm -rf dist lib tsconfig.tsbuildinfo", "test": "./test.mjs && mocha --require source-map-support/register 'dist/test/**/*.test.js' 'dist/test/**/test.js'", "test:coverage": "nyc pnpm test", "compile": "./patch-linaria.sh && tsc && ./build.mjs", + "typedoc": "typedoc --out dist/typedoc ./src/ --entryPointStrategy expand", "dev": "./dev.mjs", "pretty": "prettier --write src", "i18n:extract": "pogen extract", @@ -63,7 +64,6 @@ "polished": "^4.1.4", "preact-cli": "^3.3.5", "preact-render-to-string": "^5.1.19", - "rimraf": "^3.0.2", "typescript": "5.2.2" }, "nyc": { @@ -75,4 +75,4 @@ "pogen": { "domain": "taler-wallet-webex" } -}
\ No newline at end of file +} diff --git a/packages/web-util/package.json b/packages/web-util/package.json index 81eee949a..ac85fe8eb 100644 --- a/packages/web-util/package.json +++ b/packages/web-util/package.json @@ -28,7 +28,7 @@ }, "scripts": { "compile": "tsc && ./build.mjs", - "clean": "rimraf dist lib tsconfig.tsbuildinfo", + "clean": "rm -rf dist lib tsconfig.tsbuildinfo", "pretty": "prettier --write src" }, "devDependencies": { @@ -52,7 +52,6 @@ "preact": "10.11.3", "preact-render-to-string": "^5.2.6", "prettier": "^2.8.8", - "rimraf": "^3.0.2", "sass": "1.56.1", "swr": "2.0.3", "tslib": "^2.5.3", |