@pax2pay/model-banking 0.1.377 → 0.1.379

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Counterbalance.ts CHANGED
@@ -1,10 +1,10 @@
1
- import { isoly } from "isoly"
2
1
  import { isly } from "isly"
3
2
 
4
3
  export type Counterbalance = {
5
4
  minted: Partial<Record<Counterbalance.Source, number>>
6
5
  burned: Partial<Record<Counterbalance.Sink, number>>
7
6
  internal?: Partial<Record<string, number>>
7
+ charge?: number
8
8
  }
9
9
  export namespace Counterbalance {
10
10
  export type Source = string
@@ -15,17 +15,8 @@ export namespace Counterbalance {
15
15
  minted: isly.record<Counterbalance["minted"]>(Source, isly.number()),
16
16
  burned: isly.record<Counterbalance["burned"]>(Sink, isly.number()),
17
17
  internal: isly.record<Required<Counterbalance>["internal"]>(isly.string(), isly.number()).optional(),
18
+ charge: isly.number().optional(),
18
19
  })
19
20
  export type Link = Source | Sink
20
21
  export const Link = isly.string()
21
- export function add(currency: isoly.Currency, addendee: Counterbalance, addend: Counterbalance): Counterbalance {
22
- const result: Counterbalance = { minted: { ...addend.minted }, burned: { ...addend.burned } }
23
- for (const [source, value] of Object.entries(addendee["minted"]) as [Source, number][]) {
24
- result["minted"][source] = isoly.Currency.add(currency, value ?? 0, addend["minted"][source] ?? 0)
25
- }
26
- for (const [sink, value] of Object.entries(addendee["burned"]) as [Sink, number][]) {
27
- result["burned"][sink] = isoly.Currency.add(currency, value ?? 0, addend["burned"][sink] ?? 0)
28
- }
29
- return result
30
- }
31
22
  }
@@ -5,13 +5,6 @@ import { Counterbalance } from "./Counterbalance"
5
5
  export type Counterbalances = Partial<Record<isoly.Currency, Counterbalance>>
6
6
 
7
7
  export namespace Counterbalances {
8
- export function add(addendee: Counterbalances, addend: Counterbalances): Counterbalances {
9
- const result: Counterbalances = {}
10
- for (const [currency, counterbalance] of Object.entries(addendee) as [isoly.Currency, Counterbalance][]) {
11
- result[currency] = Counterbalance.add(currency, counterbalance, addend[currency] ?? { minted: {}, burned: {} })
12
- }
13
- return result
14
- }
15
8
  export const type = isly.record<Counterbalances>(
16
9
  isly.fromIs("isoly.Currency", isoly.Currency.is),
17
10
  Counterbalance.type
@@ -7,8 +7,7 @@ import { Warning } from "./Warning"
7
7
  export interface Fragment {
8
8
  warnings: Warning[]
9
9
  emoney: Balance.Extended
10
- minted: Fragment.Coinage.Minted
11
- burned: Fragment.Coinage.Burned
10
+ counterbalance: Fragment.Counterbalance
12
11
  fiat: {
13
12
  safe: number
14
13
  unsafe: number
@@ -19,32 +18,41 @@ export interface Fragment {
19
18
  }
20
19
  }
21
20
  export namespace Fragment {
22
- export namespace Coinage {
23
- export type LedgerAccount = string
24
- export type Change = { account: Record<LedgerAccount, number>; amount: number }
25
- export const change = isly.object<Change>({
26
- account: isly.record(isly.string(), isly.number()),
27
- amount: isly.number(),
28
- })
29
- type Source = string
30
- export type Minted = Record<Source, Change>
31
- export namespace Minted {
32
- export const type = isly.record<Minted>(isly.string(), Fragment.Coinage.change)
33
- }
34
- type Sink = string
35
- export type Burned = Record<Sink, Change>
36
- export namespace Burned {
37
- export const type = isly.record<Burned>(isly.string(), Fragment.Coinage.change)
21
+ export type Counterbalance = Record<string, { total: number; account: Record<string, { amount: number }> }>
22
+ export namespace Counterbalance {
23
+ export const type = isly.record<Counterbalance>(
24
+ isly.string(),
25
+ isly.object<Counterbalance[string]>({
26
+ total: isly.number(),
27
+ account: isly.record<Counterbalance[string]["account"]>(
28
+ isly.string(),
29
+ isly.object<Counterbalance[string]["account"][string]>({ amount: isly.number() })
30
+ ),
31
+ })
32
+ )
33
+ export function sum(currency: isoly.Currency, accounts: Record<string, { amount: number }>): number {
34
+ return Object.values(accounts).reduce(
35
+ (result, account) => isoly.Currency.add(currency, result, account.amount),
36
+ 0
37
+ )
38
38
  }
39
- export function sum(currency: isoly.Currency, coinage: Burned | Minted): number {
40
- return Object.values(coinage).reduce((result, change) => isoly.Currency.add(currency, result, change.amount), 0)
39
+ export function validate(currency: isoly.Currency, counterbalances: Counterbalance): boolean {
40
+ for (const counterbalance of Object.values(counterbalances))
41
+ if (isoly.Currency.subtract(currency, counterbalance.total, sum(currency, counterbalance.account)))
42
+ return false
43
+ return true
41
44
  }
42
45
  }
46
+ export function validate(currency: isoly.Currency, fragment: Fragment): boolean {
47
+ const validCounterbalance = Counterbalance.validate(currency, fragment.counterbalance)
48
+ const issuable = fragment.fiat.total
49
+ const actual = fragment.emoney.actual ?? 0
50
+ return validCounterbalance && issuable == actual
51
+ }
43
52
  export const type = isly.object<Fragment>({
44
53
  warnings: Warning.type.array(),
45
- emoney: Balance.type,
46
- minted: Fragment.Coinage.Minted.type,
47
- burned: Fragment.Coinage.Burned.type,
54
+ emoney: Balance.Extended,
55
+ counterbalance: Counterbalance.type,
48
56
  fiat: isly.object({
49
57
  safe: isly.number(),
50
58
  unsafe: isly.number(),
@@ -54,9 +62,57 @@ export namespace Fragment {
54
62
  accounts: Account.type.array(),
55
63
  }),
56
64
  })
57
- export function validate(currency: isoly.Currency, fragment: Fragment): boolean {
58
- const issuable = fragment.fiat.total
59
- const actual = fragment.emoney.actual ?? 0
60
- return issuable == actual
65
+ export type Legacy = Omit<Fragment, "counterbalance"> & { minted: Legacy.Coinage; burned: Legacy.Coinage }
66
+ export namespace Legacy {
67
+ export type LedgerAccount = string
68
+ export type Change = { account: Record<LedgerAccount, number>; amount: number }
69
+ export const change = isly.object<Change>({
70
+ account: isly.record(isly.string(), isly.number()),
71
+ amount: isly.number(),
72
+ })
73
+ export type Coinage = Record<string, Change>
74
+ export const type = isly.record<Coinage>(isly.string(), change)
75
+ function mergeAccounts(
76
+ currency: isoly.Currency,
77
+ burned: Record<string, { amount: number }>,
78
+ minted?: Record<string, { amount: number }>
79
+ ): Record<string, { amount: number }> {
80
+ const result: Record<string, { amount: number }> = { ...(minted ?? {}) }
81
+ for (const [id, account] of Object.entries(burned)) {
82
+ result[id] = { amount: isoly.Currency.subtract(currency, result[id]?.amount ?? 0, account.amount) }
83
+ }
84
+ return result
85
+ }
86
+ function accountToNew(account: Record<LedgerAccount, number>): Record<string, { amount: number }> {
87
+ return Object.fromEntries(
88
+ Object.entries(account).map<[string, { amount: number }]>(([id, amount]) => [id, { amount }])
89
+ )
90
+ }
91
+ export function toCounterbalance(currency: isoly.Currency, minted: Coinage, burned: Coinage): Counterbalance {
92
+ const result: Counterbalance = {}
93
+ for (const [code, change] of Object.entries(minted)) {
94
+ result[code] = { total: change.amount, account: accountToNew(change.account) }
95
+ }
96
+ for (const [code, change] of Object.entries(burned)) {
97
+ result[code] = {
98
+ total: isoly.Currency.subtract(currency, result[code]?.total ?? 0, change.amount),
99
+ account: mergeAccounts(currency, accountToNew(change.account), result[code]?.account),
100
+ }
101
+ }
102
+ return result
103
+ }
104
+ }
105
+ export function fromLegacy(currency: isoly.Currency, fragment: Fragment | Legacy): Fragment {
106
+ let result: Fragment
107
+ if ("counterbalance" in fragment) {
108
+ result = fragment
109
+ } else {
110
+ const counterbalance = Legacy.toCounterbalance(currency, fragment.minted, fragment.burned)
111
+ const result: Fragment = { ...fragment, counterbalance }
112
+ "burned" in result && delete result.burned
113
+ "minted" in result && delete result.minted
114
+ return result
115
+ }
116
+ return result
61
117
  }
62
118
  }
@@ -1,9 +1,9 @@
1
- import { isoly } from "isoly";
2
1
  import { isly } from "isly";
3
2
  export type Counterbalance = {
4
3
  minted: Partial<Record<Counterbalance.Source, number>>;
5
4
  burned: Partial<Record<Counterbalance.Sink, number>>;
6
5
  internal?: Partial<Record<string, number>>;
6
+ charge?: number;
7
7
  };
8
8
  export declare namespace Counterbalance {
9
9
  type Source = string;
@@ -13,5 +13,4 @@ export declare namespace Counterbalance {
13
13
  const type: isly.object.ExtendableType<Counterbalance>;
14
14
  type Link = Source | Sink;
15
15
  const Link: isly.Type<string>;
16
- function add(currency: isoly.Currency, addendee: Counterbalance, addend: Counterbalance): Counterbalance;
17
16
  }
@@ -1,4 +1,3 @@
1
- import { isoly } from "isoly";
2
1
  import { isly } from "isly";
3
2
  export var Counterbalance;
4
3
  (function (Counterbalance) {
@@ -8,18 +7,8 @@ export var Counterbalance;
8
7
  minted: isly.record(Counterbalance.Source, isly.number()),
9
8
  burned: isly.record(Counterbalance.Sink, isly.number()),
10
9
  internal: isly.record(isly.string(), isly.number()).optional(),
10
+ charge: isly.number().optional(),
11
11
  });
12
12
  Counterbalance.Link = isly.string();
13
- function add(currency, addendee, addend) {
14
- const result = { minted: { ...addend.minted }, burned: { ...addend.burned } };
15
- for (const [source, value] of Object.entries(addendee["minted"])) {
16
- result["minted"][source] = isoly.Currency.add(currency, value ?? 0, addend["minted"][source] ?? 0);
17
- }
18
- for (const [sink, value] of Object.entries(addendee["burned"])) {
19
- result["burned"][sink] = isoly.Currency.add(currency, value ?? 0, addend["burned"][sink] ?? 0);
20
- }
21
- return result;
22
- }
23
- Counterbalance.add = add;
24
13
  })(Counterbalance || (Counterbalance = {}));
25
14
  //# sourceMappingURL=Counterbalance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Counterbalance.js","sourceRoot":"../","sources":["Counterbalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAO3B,MAAM,KAAW,cAAc,CAsB9B;AAtBD,WAAiB,cAAc;IAEjB,qBAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;IAEtB,mBAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;IACpB,mBAAI,GAAG,IAAI,CAAC,MAAM,CAAiB;QAC/C,MAAM,EAAE,IAAI,CAAC,MAAM,CAA2B,eAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QACpE,MAAM,EAAE,IAAI,CAAC,MAAM,CAA2B,eAAA,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAClE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAuC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;KACpG,CAAC,CAAA;IAEW,mBAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;IACjC,SAAgB,GAAG,CAAC,QAAwB,EAAE,QAAwB,EAAE,MAAsB;QAC7F,MAAM,MAAM,GAAmB,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,CAAA;QAC7F,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAuB,EAAE,CAAC;YACxF,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;QACnG,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAqB,EAAE,CAAC;YACpF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC/F,CAAC;QACD,OAAO,MAAM,CAAA;IACd,CAAC;IATe,kBAAG,MASlB,CAAA;AACF,CAAC,EAtBgB,cAAc,KAAd,cAAc,QAsB9B"}
1
+ {"version":3,"file":"Counterbalance.js","sourceRoot":"../","sources":["Counterbalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAQ3B,MAAM,KAAW,cAAc,CAa9B;AAbD,WAAiB,cAAc;IAEjB,qBAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;IAEtB,mBAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;IACpB,mBAAI,GAAG,IAAI,CAAC,MAAM,CAAiB;QAC/C,MAAM,EAAE,IAAI,CAAC,MAAM,CAA2B,eAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QACpE,MAAM,EAAE,IAAI,CAAC,MAAM,CAA2B,eAAA,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAClE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAuC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACpG,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAChC,CAAC,CAAA;IAEW,mBAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;AAClC,CAAC,EAbgB,cAAc,KAAd,cAAc,QAa9B"}
@@ -3,6 +3,5 @@ import { isly } from "isly";
3
3
  import { Counterbalance } from "./Counterbalance";
4
4
  export type Counterbalances = Partial<Record<isoly.Currency, Counterbalance>>;
5
5
  export declare namespace Counterbalances {
6
- function add(addendee: Counterbalances, addend: Counterbalances): Counterbalances;
7
6
  const type: isly.Type<Partial<Record<"BTN" | "CHE" | "MKD" | "AED" | "AFN" | "ALL" | "AMD" | "ANG" | "AOA" | "ARS" | "AUD" | "AWG" | "AZN" | "BAM" | "BBD" | "BDT" | "BGN" | "BHD" | "BIF" | "BMD" | "BND" | "BOB" | "BOV" | "BRL" | "BSD" | "BWP" | "BYN" | "BZD" | "CAD" | "CDF" | "CHF" | "CHW" | "CLF" | "CLP" | "CNY" | "COP" | "COU" | "CRC" | "CUC" | "CUP" | "CVE" | "CZK" | "DJF" | "DKK" | "DOP" | "DZD" | "EGP" | "ERN" | "ETB" | "EUR" | "FJD" | "FKP" | "GBP" | "GEL" | "GHS" | "GIP" | "GMD" | "GNF" | "GTQ" | "GYD" | "HKD" | "HNL" | "HRK" | "HTG" | "HUF" | "IDR" | "ILS" | "INR" | "IQD" | "IRR" | "ISK" | "JMD" | "JOD" | "JPY" | "KES" | "KGS" | "KHR" | "KMF" | "KPW" | "KRW" | "KWD" | "KYD" | "KZT" | "LAK" | "LBP" | "LKR" | "LRD" | "LSL" | "LYD" | "MAD" | "MDL" | "MGA" | "MMK" | "MNT" | "MOP" | "MRU" | "MUR" | "MVR" | "MWK" | "MXN" | "MXV" | "MYR" | "MZN" | "NAD" | "NGN" | "NIO" | "NOK" | "NPR" | "NZD" | "OMR" | "PAB" | "PEN" | "PGK" | "PHP" | "PKR" | "PLN" | "PYG" | "QAR" | "RON" | "RSD" | "RUB" | "RWF" | "SAR" | "SBD" | "SCR" | "SDG" | "SEK" | "SGD" | "SHP" | "SLL" | "SOS" | "SRD" | "SSP" | "STN" | "SVC" | "SYP" | "SZL" | "THB" | "TJS" | "TMT" | "TND" | "TOP" | "TRY" | "TTD" | "TWD" | "TZS" | "UAH" | "UGX" | "USD" | "USN" | "UYI" | "UYU" | "UYW" | "UZS" | "VES" | "VND" | "VUV" | "WST" | "XAF" | "XAG" | "XAU" | "XBA" | "XBB" | "XBC" | "XBD" | "XCD" | "XDR" | "XOF" | "XPD" | "XPF" | "XPT" | "XSU" | "XTS" | "XUA" | "XXX" | "YER" | "ZAR" | "ZMW" | "ZWL", Counterbalance>>>;
8
7
  }
@@ -3,14 +3,6 @@ import { isly } from "isly";
3
3
  import { Counterbalance } from "./Counterbalance";
4
4
  export var Counterbalances;
5
5
  (function (Counterbalances) {
6
- function add(addendee, addend) {
7
- const result = {};
8
- for (const [currency, counterbalance] of Object.entries(addendee)) {
9
- result[currency] = Counterbalance.add(currency, counterbalance, addend[currency] ?? { minted: {}, burned: {} });
10
- }
11
- return result;
12
- }
13
- Counterbalances.add = add;
14
6
  Counterbalances.type = isly.record(isly.fromIs("isoly.Currency", isoly.Currency.is), Counterbalance.type);
15
7
  })(Counterbalances || (Counterbalances = {}));
16
8
  //# sourceMappingURL=Counterbalances.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Counterbalances.js","sourceRoot":"../","sources":["Counterbalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAIjD,MAAM,KAAW,eAAe,CAY/B;AAZD,WAAiB,eAAe;IAC/B,SAAgB,GAAG,CAAC,QAAyB,EAAE,MAAuB;QACrE,MAAM,MAAM,GAAoB,EAAE,CAAA;QAClC,KAAK,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAuC,EAAE,CAAC;YACzG,MAAM,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;QAChH,CAAC;QACD,OAAO,MAAM,CAAA;IACd,CAAC;IANe,mBAAG,MAMlB,CAAA;IACY,oBAAI,GAAG,IAAI,CAAC,MAAM,CAC9B,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAChD,cAAc,CAAC,IAAI,CACnB,CAAA;AACF,CAAC,EAZgB,eAAe,KAAf,eAAe,QAY/B"}
1
+ {"version":3,"file":"Counterbalances.js","sourceRoot":"../","sources":["Counterbalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAIjD,MAAM,KAAW,eAAe,CAK/B;AALD,WAAiB,eAAe;IAClB,oBAAI,GAAG,IAAI,CAAC,MAAM,CAC9B,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAChD,cAAc,CAAC,IAAI,CACnB,CAAA;AACF,CAAC,EALgB,eAAe,KAAf,eAAe,QAK/B"}
@@ -6,8 +6,7 @@ import { Warning } from "./Warning";
6
6
  export interface Fragment {
7
7
  warnings: Warning[];
8
8
  emoney: Balance.Extended;
9
- minted: Fragment.Coinage.Minted;
10
- burned: Fragment.Coinage.Burned;
9
+ counterbalance: Fragment.Counterbalance;
11
10
  fiat: {
12
11
  safe: number;
13
12
  unsafe: number;
@@ -18,26 +17,35 @@ export interface Fragment {
18
17
  };
19
18
  }
20
19
  export declare namespace Fragment {
21
- namespace Coinage {
22
- export type LedgerAccount = string;
23
- export type Change = {
20
+ type Counterbalance = Record<string, {
21
+ total: number;
22
+ account: Record<string, {
23
+ amount: number;
24
+ }>;
25
+ }>;
26
+ namespace Counterbalance {
27
+ const type: isly.Type<Counterbalance>;
28
+ function sum(currency: isoly.Currency, accounts: Record<string, {
29
+ amount: number;
30
+ }>): number;
31
+ function validate(currency: isoly.Currency, counterbalances: Counterbalance): boolean;
32
+ }
33
+ function validate(currency: isoly.Currency, fragment: Fragment): boolean;
34
+ const type: isly.object.ExtendableType<Fragment>;
35
+ type Legacy = Omit<Fragment, "counterbalance"> & {
36
+ minted: Legacy.Coinage;
37
+ burned: Legacy.Coinage;
38
+ };
39
+ namespace Legacy {
40
+ type LedgerAccount = string;
41
+ type Change = {
24
42
  account: Record<LedgerAccount, number>;
25
43
  amount: number;
26
44
  };
27
- export const change: isly.object.ExtendableType<Change>;
28
- type Source = string;
29
- export type Minted = Record<Source, Change>;
30
- export namespace Minted {
31
- const type: isly.Type<Minted>;
32
- }
33
- type Sink = string;
34
- export type Burned = Record<Sink, Change>;
35
- export namespace Burned {
36
- const type: isly.Type<Burned>;
37
- }
38
- export function sum(currency: isoly.Currency, coinage: Burned | Minted): number;
39
- export {};
45
+ const change: isly.object.ExtendableType<Change>;
46
+ type Coinage = Record<string, Change>;
47
+ const type: isly.Type<Coinage>;
48
+ function toCounterbalance(currency: isoly.Currency, minted: Coinage, burned: Coinage): Counterbalance;
40
49
  }
41
- const type: isly.object.ExtendableType<Fragment>;
42
- function validate(currency: isoly.Currency, fragment: Fragment): boolean;
50
+ function fromLegacy(currency: isoly.Currency, fragment: Fragment | Legacy): Fragment;
43
51
  }
@@ -5,30 +5,35 @@ import { Account } from "../Account";
5
5
  import { Warning } from "./Warning";
6
6
  export var Fragment;
7
7
  (function (Fragment) {
8
- let Coinage;
9
- (function (Coinage) {
10
- Coinage.change = isly.object({
11
- account: isly.record(isly.string(), isly.number()),
12
- amount: isly.number(),
13
- });
14
- let Minted;
15
- (function (Minted) {
16
- Minted.type = isly.record(isly.string(), Fragment.Coinage.change);
17
- })(Minted = Coinage.Minted || (Coinage.Minted = {}));
18
- let Burned;
19
- (function (Burned) {
20
- Burned.type = isly.record(isly.string(), Fragment.Coinage.change);
21
- })(Burned = Coinage.Burned || (Coinage.Burned = {}));
22
- function sum(currency, coinage) {
23
- return Object.values(coinage).reduce((result, change) => isoly.Currency.add(currency, result, change.amount), 0);
8
+ let Counterbalance;
9
+ (function (Counterbalance) {
10
+ Counterbalance.type = isly.record(isly.string(), isly.object({
11
+ total: isly.number(),
12
+ account: isly.record(isly.string(), isly.object({ amount: isly.number() })),
13
+ }));
14
+ function sum(currency, accounts) {
15
+ return Object.values(accounts).reduce((result, account) => isoly.Currency.add(currency, result, account.amount), 0);
16
+ }
17
+ Counterbalance.sum = sum;
18
+ function validate(currency, counterbalances) {
19
+ for (const counterbalance of Object.values(counterbalances))
20
+ if (isoly.Currency.subtract(currency, counterbalance.total, sum(currency, counterbalance.account)))
21
+ return false;
22
+ return true;
24
23
  }
25
- Coinage.sum = sum;
26
- })(Coinage = Fragment.Coinage || (Fragment.Coinage = {}));
24
+ Counterbalance.validate = validate;
25
+ })(Counterbalance = Fragment.Counterbalance || (Fragment.Counterbalance = {}));
26
+ function validate(currency, fragment) {
27
+ const validCounterbalance = Counterbalance.validate(currency, fragment.counterbalance);
28
+ const issuable = fragment.fiat.total;
29
+ const actual = fragment.emoney.actual ?? 0;
30
+ return validCounterbalance && issuable == actual;
31
+ }
32
+ Fragment.validate = validate;
27
33
  Fragment.type = isly.object({
28
34
  warnings: Warning.type.array(),
29
- emoney: Balance.type,
30
- minted: Fragment.Coinage.Minted.type,
31
- burned: Fragment.Coinage.Burned.type,
35
+ emoney: Balance.Extended,
36
+ counterbalance: Counterbalance.type,
32
37
  fiat: isly.object({
33
38
  safe: isly.number(),
34
39
  unsafe: isly.number(),
@@ -38,11 +43,52 @@ export var Fragment;
38
43
  accounts: Account.type.array(),
39
44
  }),
40
45
  });
41
- function validate(currency, fragment) {
42
- const issuable = fragment.fiat.total;
43
- const actual = fragment.emoney.actual ?? 0;
44
- return issuable == actual;
46
+ let Legacy;
47
+ (function (Legacy) {
48
+ Legacy.change = isly.object({
49
+ account: isly.record(isly.string(), isly.number()),
50
+ amount: isly.number(),
51
+ });
52
+ Legacy.type = isly.record(isly.string(), Legacy.change);
53
+ function mergeAccounts(currency, burned, minted) {
54
+ const result = { ...(minted ?? {}) };
55
+ for (const [id, account] of Object.entries(burned)) {
56
+ result[id] = { amount: isoly.Currency.subtract(currency, result[id]?.amount ?? 0, account.amount) };
57
+ }
58
+ return result;
59
+ }
60
+ function accountToNew(account) {
61
+ return Object.fromEntries(Object.entries(account).map(([id, amount]) => [id, { amount }]));
62
+ }
63
+ function toCounterbalance(currency, minted, burned) {
64
+ const result = {};
65
+ for (const [code, change] of Object.entries(minted)) {
66
+ result[code] = { total: change.amount, account: accountToNew(change.account) };
67
+ }
68
+ for (const [code, change] of Object.entries(burned)) {
69
+ result[code] = {
70
+ total: isoly.Currency.subtract(currency, result[code]?.total ?? 0, change.amount),
71
+ account: mergeAccounts(currency, accountToNew(change.account), result[code]?.account),
72
+ };
73
+ }
74
+ return result;
75
+ }
76
+ Legacy.toCounterbalance = toCounterbalance;
77
+ })(Legacy = Fragment.Legacy || (Fragment.Legacy = {}));
78
+ function fromLegacy(currency, fragment) {
79
+ let result;
80
+ if ("counterbalance" in fragment) {
81
+ result = fragment;
82
+ }
83
+ else {
84
+ const counterbalance = Legacy.toCounterbalance(currency, fragment.minted, fragment.burned);
85
+ const result = { ...fragment, counterbalance };
86
+ "burned" in result && delete result.burned;
87
+ "minted" in result && delete result.minted;
88
+ return result;
89
+ }
90
+ return result;
45
91
  }
46
- Fragment.validate = validate;
92
+ Fragment.fromLegacy = fromLegacy;
47
93
  })(Fragment || (Fragment = {}));
48
94
  //# sourceMappingURL=Fragment.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Fragment.js","sourceRoot":"../","sources":["Treasury/Snapshot/Fragment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAgBnC,MAAM,KAAW,QAAQ,CAyCxB;AAzCD,WAAiB,QAAQ;IACxB,IAAiB,OAAO,CAoBvB;IApBD,WAAiB,OAAO;QAGV,cAAM,GAAG,IAAI,CAAC,MAAM,CAAS;YACzC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YAClD,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;SACrB,CAAC,CAAA;QAGF,IAAiB,MAAM,CAEtB;QAFD,WAAiB,MAAM;YACT,WAAI,GAAG,IAAI,CAAC,MAAM,CAAS,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAChF,CAAC,EAFgB,MAAM,GAAN,cAAM,KAAN,cAAM,QAEtB;QAGD,IAAiB,MAAM,CAEtB;QAFD,WAAiB,MAAM;YACT,WAAI,GAAG,IAAI,CAAC,MAAM,CAAS,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAChF,CAAC,EAFgB,MAAM,GAAN,cAAM,KAAN,cAAM,QAEtB;QACD,SAAgB,GAAG,CAAC,QAAwB,EAAE,OAAwB;YACrE,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QACjH,CAAC;QAFe,WAAG,MAElB,CAAA;IACF,CAAC,EApBgB,OAAO,GAAP,gBAAO,KAAP,gBAAO,QAoBvB;IACY,aAAI,GAAG,IAAI,CAAC,MAAM,CAAW;QACzC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE;QAC9B,MAAM,EAAE,OAAO,CAAC,IAAI;QACpB,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;QACpC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;QACpC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;YACjB,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACrB,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;YACpB,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;YACpB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACrB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE;SAC9B,CAAC;KACF,CAAC,CAAA;IACF,SAAgB,QAAQ,CAAC,QAAwB,EAAE,QAAkB;QACpE,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAA;QACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAA;QAC1C,OAAO,QAAQ,IAAI,MAAM,CAAA;IAC1B,CAAC;IAJe,iBAAQ,WAIvB,CAAA;AACF,CAAC,EAzCgB,QAAQ,KAAR,QAAQ,QAyCxB"}
1
+ {"version":3,"file":"Fragment.js","sourceRoot":"../","sources":["Treasury/Snapshot/Fragment.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pax2pay/model-banking",
3
- "version": "0.1.377",
3
+ "version": "0.1.379",
4
4
  "description": "Library containing data model types and functions for the Pax2Pay Banking API.",
5
5
  "author": "Pax2Pay Ltd",
6
6
  "license": "MIT",