@fintekkers/ledger-models 0.4.0 → 0.4.2

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.
Files changed (63) hide show
  1. package/hierarchy.json +2 -2
  2. package/node/fintekkers/models/security/bond/agency_grpc_pb.js +1 -0
  3. package/node/fintekkers/models/security/bond/agency_pb.d.ts +14 -0
  4. package/node/fintekkers/models/security/bond/agency_pb.js +35 -0
  5. package/node/fintekkers/models/security/product_type_pb.d.ts +1 -0
  6. package/node/fintekkers/models/security/product_type_pb.js +1 -0
  7. package/node/fintekkers/models/security/security_pb.d.ts +69 -0
  8. package/node/fintekkers/models/security/security_pb.js +572 -1
  9. package/node/wrappers/models/security/BondSecurity.d.ts +41 -3
  10. package/node/wrappers/models/security/BondSecurity.fromPricerInputs.test.d.ts +1 -0
  11. package/node/wrappers/models/security/BondSecurity.fromPricerInputs.test.js +75 -0
  12. package/node/wrappers/models/security/BondSecurity.fromPricerInputs.test.js.map +1 -0
  13. package/node/wrappers/models/security/BondSecurity.fromPricerInputs.test.ts +95 -0
  14. package/node/wrappers/models/security/BondSecurity.js +50 -2
  15. package/node/wrappers/models/security/BondSecurity.js.map +1 -1
  16. package/node/wrappers/models/security/BondSecurity.ts +65 -3
  17. package/node/wrappers/models/security/FloatingRateNote.d.ts +30 -0
  18. package/node/wrappers/models/security/FloatingRateNote.js +80 -0
  19. package/node/wrappers/models/security/FloatingRateNote.js.map +1 -0
  20. package/node/wrappers/models/security/FloatingRateNote.ts +67 -0
  21. package/node/wrappers/models/security/IndexSecurity.d.ts +16 -0
  22. package/node/wrappers/models/security/IndexSecurity.js +26 -0
  23. package/node/wrappers/models/security/IndexSecurity.js.map +1 -0
  24. package/node/wrappers/models/security/IndexSecurity.test.d.ts +1 -0
  25. package/node/wrappers/models/security/IndexSecurity.test.js +60 -0
  26. package/node/wrappers/models/security/IndexSecurity.test.js.map +1 -0
  27. package/node/wrappers/models/security/IndexSecurity.test.ts +60 -0
  28. package/node/wrappers/models/security/IndexSecurity.ts +24 -0
  29. package/node/wrappers/models/security/Issuance.d.ts +35 -0
  30. package/node/wrappers/models/security/Issuance.js +64 -0
  31. package/node/wrappers/models/security/Issuance.js.map +1 -0
  32. package/node/wrappers/models/security/Issuance.test.d.ts +1 -0
  33. package/node/wrappers/models/security/Issuance.test.js +55 -0
  34. package/node/wrappers/models/security/Issuance.test.js.map +1 -0
  35. package/node/wrappers/models/security/Issuance.test.ts +52 -0
  36. package/node/wrappers/models/security/Issuance.ts +74 -0
  37. package/node/wrappers/models/security/MortgageBackedSecurity.d.ts +48 -0
  38. package/node/wrappers/models/security/MortgageBackedSecurity.fromPricerInputs.test.d.ts +1 -0
  39. package/node/wrappers/models/security/MortgageBackedSecurity.fromPricerInputs.test.js +93 -0
  40. package/node/wrappers/models/security/MortgageBackedSecurity.fromPricerInputs.test.js.map +1 -0
  41. package/node/wrappers/models/security/MortgageBackedSecurity.fromPricerInputs.test.ts +107 -0
  42. package/node/wrappers/models/security/MortgageBackedSecurity.js +131 -0
  43. package/node/wrappers/models/security/MortgageBackedSecurity.js.map +1 -0
  44. package/node/wrappers/models/security/MortgageBackedSecurity.ts +125 -0
  45. package/node/wrappers/models/security/TIPSBond.d.ts +30 -0
  46. package/node/wrappers/models/security/TIPSBond.js +83 -0
  47. package/node/wrappers/models/security/TIPSBond.js.map +1 -0
  48. package/node/wrappers/models/security/TIPSBond.ts +70 -0
  49. package/node/wrappers/models/security/security.d.ts +20 -3
  50. package/node/wrappers/models/security/security.identifiers.test.d.ts +1 -0
  51. package/node/wrappers/models/security/security.identifiers.test.js +67 -0
  52. package/node/wrappers/models/security/security.identifiers.test.js.map +1 -0
  53. package/node/wrappers/models/security/security.identifiers.test.ts +67 -0
  54. package/node/wrappers/models/security/security.js +72 -22
  55. package/node/wrappers/models/security/security.js.map +1 -1
  56. package/node/wrappers/models/security/security.ts +75 -22
  57. package/node/wrappers/models/transaction/transaction.js +4 -2
  58. package/node/wrappers/models/transaction/transaction.js.map +1 -1
  59. package/node/wrappers/models/transaction/transaction.ts +4 -2
  60. package/node/wrappers/services/security-service/security.maturityLadder.test.js +3 -2
  61. package/node/wrappers/services/security-service/security.maturityLadder.test.js.map +1 -1
  62. package/node/wrappers/services/security-service/security.maturityLadder.test.ts +3 -2
  63. package/package.json +1 -1
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const security_1 = __importDefault(require("./security"));
7
+ const IndexSecurity_1 = __importDefault(require("./IndexSecurity"));
8
+ const security_pb_1 = require("../../../fintekkers/models/security/security_pb");
9
+ const product_type_pb_1 = require("../../../fintekkers/models/security/product_type_pb");
10
+ const index_type_pb_1 = require("../../../fintekkers/models/security/index/index_type_pb");
11
+ const uuid_1 = require("../utils/uuid");
12
+ test('Security.create routes CPI_SERIES to IndexSecurity', () => {
13
+ const proto = new security_pb_1.SecurityProto()
14
+ .setObjectClass('Security')
15
+ .setVersion('0.0.1')
16
+ .setUuid(uuid_1.UUID.random().toUUIDProto())
17
+ .setProductType(product_type_pb_1.ProductTypeProto.CPI_SERIES)
18
+ .setAssetClass('Index');
19
+ proto.setIndexDetails(new security_pb_1.IndexDetailsProto().setIndexType(index_type_pb_1.IndexTypeProto.CPI_U));
20
+ const sec = security_1.default.create(proto);
21
+ expect(sec).toBeInstanceOf(IndexSecurity_1.default);
22
+ expect(sec.getIndexType()).toBe(index_type_pb_1.IndexTypeProto.CPI_U);
23
+ });
24
+ test('Security.create routes SOFR_SERIES to IndexSecurity', () => {
25
+ const proto = new security_pb_1.SecurityProto()
26
+ .setObjectClass('Security')
27
+ .setVersion('0.0.1')
28
+ .setUuid(uuid_1.UUID.random().toUUIDProto())
29
+ .setProductType(product_type_pb_1.ProductTypeProto.SOFR_SERIES)
30
+ .setAssetClass('Index');
31
+ proto.setIndexDetails(new security_pb_1.IndexDetailsProto().setIndexType(index_type_pb_1.IndexTypeProto.SOFR));
32
+ const sec = security_1.default.create(proto);
33
+ expect(sec).toBeInstanceOf(IndexSecurity_1.default);
34
+ expect(sec.getIndexType()).toBe(index_type_pb_1.IndexTypeProto.SOFR);
35
+ });
36
+ test('IndexSecurity.getIndexType returns UNKNOWN when index_details is unset', () => {
37
+ // Force-construct without populating index_details so we exercise the
38
+ // null-safe branch in the getter.
39
+ const proto = new security_pb_1.SecurityProto()
40
+ .setObjectClass('Security')
41
+ .setVersion('0.0.1')
42
+ .setUuid(uuid_1.UUID.random().toUUIDProto())
43
+ .setProductType(product_type_pb_1.ProductTypeProto.CPI_SERIES)
44
+ .setAssetClass('Index');
45
+ const sec = security_1.default.create(proto);
46
+ expect(sec.getIndexType()).toBe(index_type_pb_1.IndexTypeProto.UNKNOWN_INDEX_TYPE);
47
+ });
48
+ test('IndexSecurity extends Security (not BondSecurity)', () => {
49
+ const proto = new security_pb_1.SecurityProto()
50
+ .setObjectClass('Security')
51
+ .setVersion('0.0.1')
52
+ .setUuid(uuid_1.UUID.random().toUUIDProto())
53
+ .setProductType(product_type_pb_1.ProductTypeProto.EQUITY_INDEX);
54
+ proto.setIndexDetails(new security_pb_1.IndexDetailsProto().setIndexType(index_type_pb_1.IndexTypeProto.US_TREASURY));
55
+ const sec = security_1.default.create(proto);
56
+ expect(sec).toBeInstanceOf(IndexSecurity_1.default);
57
+ expect(sec).toBeInstanceOf(security_1.default);
58
+ expect(sec.isBond()).toBe(false);
59
+ });
60
+ //# sourceMappingURL=IndexSecurity.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexSecurity.test.js","sourceRoot":"","sources":["IndexSecurity.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import Security from './security';
2
+ import IndexSecurity from './IndexSecurity';
3
+ import { SecurityProto, IndexDetailsProto } from '../../../fintekkers/models/security/security_pb';
4
+ import { ProductTypeProto } from '../../../fintekkers/models/security/product_type_pb';
5
+ import { IndexTypeProto } from '../../../fintekkers/models/security/index/index_type_pb';
6
+ import { UUID } from '../utils/uuid';
7
+
8
+ test('Security.create routes CPI_SERIES to IndexSecurity', () => {
9
+ const proto = new SecurityProto()
10
+ .setObjectClass('Security')
11
+ .setVersion('0.0.1')
12
+ .setUuid(UUID.random().toUUIDProto())
13
+ .setProductType(ProductTypeProto.CPI_SERIES)
14
+ .setAssetClass('Index');
15
+ proto.setIndexDetails(new IndexDetailsProto().setIndexType(IndexTypeProto.CPI_U));
16
+
17
+ const sec = Security.create(proto);
18
+ expect(sec).toBeInstanceOf(IndexSecurity);
19
+ expect((sec as IndexSecurity).getIndexType()).toBe(IndexTypeProto.CPI_U);
20
+ });
21
+
22
+ test('Security.create routes SOFR_SERIES to IndexSecurity', () => {
23
+ const proto = new SecurityProto()
24
+ .setObjectClass('Security')
25
+ .setVersion('0.0.1')
26
+ .setUuid(UUID.random().toUUIDProto())
27
+ .setProductType(ProductTypeProto.SOFR_SERIES)
28
+ .setAssetClass('Index');
29
+ proto.setIndexDetails(new IndexDetailsProto().setIndexType(IndexTypeProto.SOFR));
30
+
31
+ const sec = Security.create(proto);
32
+ expect(sec).toBeInstanceOf(IndexSecurity);
33
+ expect((sec as IndexSecurity).getIndexType()).toBe(IndexTypeProto.SOFR);
34
+ });
35
+
36
+ test('IndexSecurity.getIndexType returns UNKNOWN when index_details is unset', () => {
37
+ // Force-construct without populating index_details so we exercise the
38
+ // null-safe branch in the getter.
39
+ const proto = new SecurityProto()
40
+ .setObjectClass('Security')
41
+ .setVersion('0.0.1')
42
+ .setUuid(UUID.random().toUUIDProto())
43
+ .setProductType(ProductTypeProto.CPI_SERIES)
44
+ .setAssetClass('Index');
45
+ const sec = Security.create(proto) as IndexSecurity;
46
+ expect(sec.getIndexType()).toBe(IndexTypeProto.UNKNOWN_INDEX_TYPE);
47
+ });
48
+
49
+ test('IndexSecurity extends Security (not BondSecurity)', () => {
50
+ const proto = new SecurityProto()
51
+ .setObjectClass('Security')
52
+ .setVersion('0.0.1')
53
+ .setUuid(UUID.random().toUUIDProto())
54
+ .setProductType(ProductTypeProto.EQUITY_INDEX);
55
+ proto.setIndexDetails(new IndexDetailsProto().setIndexType(IndexTypeProto.US_TREASURY));
56
+ const sec = Security.create(proto);
57
+ expect(sec).toBeInstanceOf(IndexSecurity);
58
+ expect(sec).toBeInstanceOf(Security);
59
+ expect(sec.isBond()).toBe(false);
60
+ });
@@ -0,0 +1,24 @@
1
+ import Security from './security';
2
+ import { SecurityProto } from '../../../fintekkers/models/security/security_pb';
3
+ import { IndexTypeProto } from '../../../fintekkers/models/security/index/index_type_pb';
4
+
5
+ /**
6
+ * Wrapper for Security messages whose product_type is a descendant of
7
+ * INDEX in hierarchy.json (CPI_SERIES, SOFR_SERIES, EQUITY_INDEX, etc.).
8
+ * The index-specific fields live in the index_details sub-message (one of
9
+ * the non_bond_details oneof variants).
10
+ */
11
+ class IndexSecurity extends Security {
12
+ constructor(proto: SecurityProto) {
13
+ super(proto);
14
+ }
15
+
16
+ /** Which index family this security represents. Defaults to
17
+ * UNKNOWN_INDEX_TYPE when index_details is not populated. */
18
+ getIndexType(): IndexTypeProto {
19
+ const details = this.proto.getIndexDetails();
20
+ return details ? details.getIndexType() : IndexTypeProto.UNKNOWN_INDEX_TYPE;
21
+ }
22
+ }
23
+
24
+ export default IndexSecurity;
@@ -0,0 +1,35 @@
1
+ import { IssuanceProto } from "../../../fintekkers/models/security/bond/issuance_pb";
2
+ import { AuctionTypeProto } from "../../../fintekkers/models/security/bond/auction_type_pb";
3
+ import { LocalDate } from "../utils/date";
4
+ import Decimal from "decimal.js";
5
+ /**
6
+ * Typed wrapper around a single IssuanceProto. Returns null for unset
7
+ * sub-messages and Decimal/LocalDate for populated ones — callers no longer
8
+ * have to spell out the proto / Decimal coercions at every call site.
9
+ *
10
+ * Note: IssuanceProto has no `dated_date` or `auction_date` field on the
11
+ * proto today, so those accessors are intentionally absent.
12
+ */
13
+ declare class Issuance {
14
+ proto: IssuanceProto;
15
+ constructor(proto: IssuanceProto);
16
+ private static _toDecimal;
17
+ private static _toLocalDate;
18
+ /** Auction issue (settlement) date. Null if unset. */
19
+ getIssueDate(): LocalDate | null;
20
+ /** Auction announcement date. Null if unset. */
21
+ getAnnouncementDate(): LocalDate | null;
22
+ /** Auction offering amount (original face value offered). Null if unset. */
23
+ getOriginalFaceValue(): Decimal | null;
24
+ /** Total quantity accepted at auction. Null if unset. */
25
+ getTotalAccepted(): Decimal | null;
26
+ /** Outstanding quantity after auction settles. Null if unset. */
27
+ getPostAuctionOutstandingQuantity(): Decimal | null;
28
+ /** Quantity of the mature security used in reopenings. Null if unset. */
29
+ getMatureSecurityAmount(): Decimal | null;
30
+ /** Single-price auction clearing price. Null if unset (e.g., multi-price). */
31
+ getPriceForSinglePriceAuction(): Decimal | null;
32
+ /** Auction type enum (defaults to UNKNOWN_AUCTION_TYPE if unset). */
33
+ getAuctionType(): AuctionTypeProto;
34
+ }
35
+ export default Issuance;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const date_1 = require("../utils/date");
7
+ const decimal_js_1 = __importDefault(require("decimal.js"));
8
+ /**
9
+ * Typed wrapper around a single IssuanceProto. Returns null for unset
10
+ * sub-messages and Decimal/LocalDate for populated ones — callers no longer
11
+ * have to spell out the proto / Decimal coercions at every call site.
12
+ *
13
+ * Note: IssuanceProto has no `dated_date` or `auction_date` field on the
14
+ * proto today, so those accessors are intentionally absent.
15
+ */
16
+ class Issuance {
17
+ constructor(proto) {
18
+ this.proto = proto;
19
+ }
20
+ static _toDecimal(value) {
21
+ if (!value)
22
+ return null;
23
+ return new decimal_js_1.default(value.getArbitraryPrecisionValue());
24
+ }
25
+ static _toLocalDate(value) {
26
+ if (!value)
27
+ return null;
28
+ return new date_1.LocalDate(value);
29
+ }
30
+ /** Auction issue (settlement) date. Null if unset. */
31
+ getIssueDate() {
32
+ return Issuance._toLocalDate(this.proto.getAuctionIssueDate());
33
+ }
34
+ /** Auction announcement date. Null if unset. */
35
+ getAnnouncementDate() {
36
+ return Issuance._toLocalDate(this.proto.getAuctionAnnouncementDate());
37
+ }
38
+ /** Auction offering amount (original face value offered). Null if unset. */
39
+ getOriginalFaceValue() {
40
+ return Issuance._toDecimal(this.proto.getAuctionOfferingAmount());
41
+ }
42
+ /** Total quantity accepted at auction. Null if unset. */
43
+ getTotalAccepted() {
44
+ return Issuance._toDecimal(this.proto.getTotalAccepted());
45
+ }
46
+ /** Outstanding quantity after auction settles. Null if unset. */
47
+ getPostAuctionOutstandingQuantity() {
48
+ return Issuance._toDecimal(this.proto.getPostAuctionOutstandingQuantity());
49
+ }
50
+ /** Quantity of the mature security used in reopenings. Null if unset. */
51
+ getMatureSecurityAmount() {
52
+ return Issuance._toDecimal(this.proto.getMatureSecurityAmount());
53
+ }
54
+ /** Single-price auction clearing price. Null if unset (e.g., multi-price). */
55
+ getPriceForSinglePriceAuction() {
56
+ return Issuance._toDecimal(this.proto.getPriceForSinglePriceAuction());
57
+ }
58
+ /** Auction type enum (defaults to UNKNOWN_AUCTION_TYPE if unset). */
59
+ getAuctionType() {
60
+ return this.proto.getAuctionType();
61
+ }
62
+ }
63
+ exports.default = Issuance;
64
+ //# sourceMappingURL=Issuance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Issuance.js","sourceRoot":"","sources":["Issuance.ts"],"names":[],"mappings":";;;;;AAIA,wCAA0C;AAC1C,4DAAiC;AAEjC;;;;;;;GAOG;AACH,MAAM,QAAQ;IAGZ,YAAY,KAAoB;QAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEO,MAAM,CAAC,UAAU,CAAC,KAAoC;QAC5D,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,OAAO,IAAI,oBAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC;IACzD,CAAC;IAEO,MAAM,CAAC,YAAY,CAAC,KAAiC;QAC3D,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,OAAO,IAAI,gBAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,sDAAsD;IACtD,YAAY;QACV,OAAO,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,gDAAgD;IAChD,mBAAmB;QACjB,OAAO,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,4EAA4E;IAC5E,oBAAoB;QAClB,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,yDAAyD;IACzD,gBAAgB;QACd,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,iEAAiE;IACjE,iCAAiC;QAC/B,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,iCAAiC,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,yEAAyE;IACzE,uBAAuB;QACrB,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,8EAA8E;IAC9E,6BAA6B;QAC3B,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,qEAAqE;IACrE,cAAc;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;IACrC,CAAC;CACF;AAED,kBAAe,QAAQ,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Issuance_1 = __importDefault(require("./Issuance"));
7
+ const issuance_pb_1 = require("../../../fintekkers/models/security/bond/issuance_pb");
8
+ const auction_type_pb_1 = require("../../../fintekkers/models/security/bond/auction_type_pb");
9
+ const decimal_value_pb_1 = require("../../../fintekkers/models/util/decimal_value_pb");
10
+ const local_date_pb_1 = require("../../../fintekkers/models/util/local_date_pb");
11
+ const decimal_js_1 = __importDefault(require("decimal.js"));
12
+ function buildProto() {
13
+ const p = new issuance_pb_1.IssuanceProto();
14
+ p.setAuctionIssueDate(new local_date_pb_1.LocalDateProto().setYear(2023).setMonth(2).setDay(15));
15
+ p.setAuctionAnnouncementDate(new local_date_pb_1.LocalDateProto().setYear(2023).setMonth(2).setDay(8));
16
+ p.setAuctionOfferingAmount(new decimal_value_pb_1.DecimalValueProto().setArbitraryPrecisionValue('45000000000'));
17
+ p.setTotalAccepted(new decimal_value_pb_1.DecimalValueProto().setArbitraryPrecisionValue('44999500000'));
18
+ p.setPostAuctionOutstandingQuantity(new decimal_value_pb_1.DecimalValueProto().setArbitraryPrecisionValue('44999500000'));
19
+ p.setMatureSecurityAmount(new decimal_value_pb_1.DecimalValueProto().setArbitraryPrecisionValue('0'));
20
+ p.setPriceForSinglePriceAuction(new decimal_value_pb_1.DecimalValueProto().setArbitraryPrecisionValue('99.875'));
21
+ p.setAuctionType(auction_type_pb_1.AuctionTypeProto.SINGLE_PRICE);
22
+ return p;
23
+ }
24
+ test('Issuance typed accessors return wrapped values', () => {
25
+ var _a, _b, _c, _d, _e, _f, _g;
26
+ const iss = new Issuance_1.default(buildProto());
27
+ expect((_a = iss.getIssueDate()) === null || _a === void 0 ? void 0 : _a.toString()).toBe('2023-2-15');
28
+ expect((_b = iss.getAnnouncementDate()) === null || _b === void 0 ? void 0 : _b.toString()).toBe('2023-2-8');
29
+ expect((_c = iss.getOriginalFaceValue()) === null || _c === void 0 ? void 0 : _c.toString()).toBe('45000000000');
30
+ expect((_d = iss.getTotalAccepted()) === null || _d === void 0 ? void 0 : _d.toString()).toBe('44999500000');
31
+ expect((_e = iss.getPostAuctionOutstandingQuantity()) === null || _e === void 0 ? void 0 : _e.toString()).toBe('44999500000');
32
+ expect((_f = iss.getMatureSecurityAmount()) === null || _f === void 0 ? void 0 : _f.toString()).toBe('0');
33
+ expect((_g = iss.getPriceForSinglePriceAuction()) === null || _g === void 0 ? void 0 : _g.toString()).toBe('99.875');
34
+ expect(iss.getAuctionType()).toBe(auction_type_pb_1.AuctionTypeProto.SINGLE_PRICE);
35
+ });
36
+ test('Issuance returns null for unset sub-messages', () => {
37
+ const iss = new Issuance_1.default(new issuance_pb_1.IssuanceProto());
38
+ expect(iss.getIssueDate()).toBeNull();
39
+ expect(iss.getAnnouncementDate()).toBeNull();
40
+ expect(iss.getOriginalFaceValue()).toBeNull();
41
+ expect(iss.getTotalAccepted()).toBeNull();
42
+ expect(iss.getPostAuctionOutstandingQuantity()).toBeNull();
43
+ expect(iss.getMatureSecurityAmount()).toBeNull();
44
+ expect(iss.getPriceForSinglePriceAuction()).toBeNull();
45
+ // enum defaults to zero value
46
+ expect(iss.getAuctionType()).toBe(auction_type_pb_1.AuctionTypeProto.UNKNOWN_AUCTION_TYPE);
47
+ });
48
+ test('Issuance Decimal returns are Decimal instances (for math)', () => {
49
+ const iss = new Issuance_1.default(buildProto());
50
+ const faceValue = iss.getOriginalFaceValue();
51
+ expect(faceValue).toBeInstanceOf(decimal_js_1.default);
52
+ // smoke: doing arithmetic should work
53
+ expect(faceValue.plus(1).toString()).toBe('45000000001');
54
+ });
55
+ //# sourceMappingURL=Issuance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Issuance.test.js","sourceRoot":"","sources":["Issuance.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import Issuance from './Issuance';
2
+ import { IssuanceProto } from '../../../fintekkers/models/security/bond/issuance_pb';
3
+ import { AuctionTypeProto } from '../../../fintekkers/models/security/bond/auction_type_pb';
4
+ import { DecimalValueProto } from '../../../fintekkers/models/util/decimal_value_pb';
5
+ import { LocalDateProto } from '../../../fintekkers/models/util/local_date_pb';
6
+ import Decimal from 'decimal.js';
7
+
8
+ function buildProto(): IssuanceProto {
9
+ const p = new IssuanceProto();
10
+ p.setAuctionIssueDate(new LocalDateProto().setYear(2023).setMonth(2).setDay(15));
11
+ p.setAuctionAnnouncementDate(new LocalDateProto().setYear(2023).setMonth(2).setDay(8));
12
+ p.setAuctionOfferingAmount(new DecimalValueProto().setArbitraryPrecisionValue('45000000000'));
13
+ p.setTotalAccepted(new DecimalValueProto().setArbitraryPrecisionValue('44999500000'));
14
+ p.setPostAuctionOutstandingQuantity(new DecimalValueProto().setArbitraryPrecisionValue('44999500000'));
15
+ p.setMatureSecurityAmount(new DecimalValueProto().setArbitraryPrecisionValue('0'));
16
+ p.setPriceForSinglePriceAuction(new DecimalValueProto().setArbitraryPrecisionValue('99.875'));
17
+ p.setAuctionType(AuctionTypeProto.SINGLE_PRICE);
18
+ return p;
19
+ }
20
+
21
+ test('Issuance typed accessors return wrapped values', () => {
22
+ const iss = new Issuance(buildProto());
23
+ expect(iss.getIssueDate()?.toString()).toBe('2023-2-15');
24
+ expect(iss.getAnnouncementDate()?.toString()).toBe('2023-2-8');
25
+ expect(iss.getOriginalFaceValue()?.toString()).toBe('45000000000');
26
+ expect(iss.getTotalAccepted()?.toString()).toBe('44999500000');
27
+ expect(iss.getPostAuctionOutstandingQuantity()?.toString()).toBe('44999500000');
28
+ expect(iss.getMatureSecurityAmount()?.toString()).toBe('0');
29
+ expect(iss.getPriceForSinglePriceAuction()?.toString()).toBe('99.875');
30
+ expect(iss.getAuctionType()).toBe(AuctionTypeProto.SINGLE_PRICE);
31
+ });
32
+
33
+ test('Issuance returns null for unset sub-messages', () => {
34
+ const iss = new Issuance(new IssuanceProto());
35
+ expect(iss.getIssueDate()).toBeNull();
36
+ expect(iss.getAnnouncementDate()).toBeNull();
37
+ expect(iss.getOriginalFaceValue()).toBeNull();
38
+ expect(iss.getTotalAccepted()).toBeNull();
39
+ expect(iss.getPostAuctionOutstandingQuantity()).toBeNull();
40
+ expect(iss.getMatureSecurityAmount()).toBeNull();
41
+ expect(iss.getPriceForSinglePriceAuction()).toBeNull();
42
+ // enum defaults to zero value
43
+ expect(iss.getAuctionType()).toBe(AuctionTypeProto.UNKNOWN_AUCTION_TYPE);
44
+ });
45
+
46
+ test('Issuance Decimal returns are Decimal instances (for math)', () => {
47
+ const iss = new Issuance(buildProto());
48
+ const faceValue = iss.getOriginalFaceValue();
49
+ expect(faceValue).toBeInstanceOf(Decimal);
50
+ // smoke: doing arithmetic should work
51
+ expect(faceValue!.plus(1).toString()).toBe('45000000001');
52
+ });
@@ -0,0 +1,74 @@
1
+ import { IssuanceProto } from "../../../fintekkers/models/security/bond/issuance_pb";
2
+ import { AuctionTypeProto } from "../../../fintekkers/models/security/bond/auction_type_pb";
3
+ import { DecimalValueProto } from "../../../fintekkers/models/util/decimal_value_pb";
4
+ import { LocalDateProto } from "../../../fintekkers/models/util/local_date_pb";
5
+ import { LocalDate } from "../utils/date";
6
+ import Decimal from "decimal.js";
7
+
8
+ /**
9
+ * Typed wrapper around a single IssuanceProto. Returns null for unset
10
+ * sub-messages and Decimal/LocalDate for populated ones — callers no longer
11
+ * have to spell out the proto / Decimal coercions at every call site.
12
+ *
13
+ * Note: IssuanceProto has no `dated_date` or `auction_date` field on the
14
+ * proto today, so those accessors are intentionally absent.
15
+ */
16
+ class Issuance {
17
+ proto: IssuanceProto;
18
+
19
+ constructor(proto: IssuanceProto) {
20
+ this.proto = proto;
21
+ }
22
+
23
+ private static _toDecimal(value: DecimalValueProto | undefined): Decimal | null {
24
+ if (!value) return null;
25
+ return new Decimal(value.getArbitraryPrecisionValue());
26
+ }
27
+
28
+ private static _toLocalDate(value: LocalDateProto | undefined): LocalDate | null {
29
+ if (!value) return null;
30
+ return new LocalDate(value);
31
+ }
32
+
33
+ /** Auction issue (settlement) date. Null if unset. */
34
+ getIssueDate(): LocalDate | null {
35
+ return Issuance._toLocalDate(this.proto.getAuctionIssueDate());
36
+ }
37
+
38
+ /** Auction announcement date. Null if unset. */
39
+ getAnnouncementDate(): LocalDate | null {
40
+ return Issuance._toLocalDate(this.proto.getAuctionAnnouncementDate());
41
+ }
42
+
43
+ /** Auction offering amount (original face value offered). Null if unset. */
44
+ getOriginalFaceValue(): Decimal | null {
45
+ return Issuance._toDecimal(this.proto.getAuctionOfferingAmount());
46
+ }
47
+
48
+ /** Total quantity accepted at auction. Null if unset. */
49
+ getTotalAccepted(): Decimal | null {
50
+ return Issuance._toDecimal(this.proto.getTotalAccepted());
51
+ }
52
+
53
+ /** Outstanding quantity after auction settles. Null if unset. */
54
+ getPostAuctionOutstandingQuantity(): Decimal | null {
55
+ return Issuance._toDecimal(this.proto.getPostAuctionOutstandingQuantity());
56
+ }
57
+
58
+ /** Quantity of the mature security used in reopenings. Null if unset. */
59
+ getMatureSecurityAmount(): Decimal | null {
60
+ return Issuance._toDecimal(this.proto.getMatureSecurityAmount());
61
+ }
62
+
63
+ /** Single-price auction clearing price. Null if unset (e.g., multi-price). */
64
+ getPriceForSinglePriceAuction(): Decimal | null {
65
+ return Issuance._toDecimal(this.proto.getPriceForSinglePriceAuction());
66
+ }
67
+
68
+ /** Auction type enum (defaults to UNKNOWN_AUCTION_TYPE if unset). */
69
+ getAuctionType(): AuctionTypeProto {
70
+ return this.proto.getAuctionType();
71
+ }
72
+ }
73
+
74
+ export default Issuance;
@@ -0,0 +1,48 @@
1
+ import BondSecurity, { BondPricerInputs } from './BondSecurity';
2
+ import { SecurityProto } from '../../../fintekkers/models/security/security_pb';
3
+ import { AgencyProto } from '../../../fintekkers/models/security/bond/agency_pb';
4
+ import { Decimal } from 'decimal.js';
5
+ /**
6
+ * MBS-specific accessors layered on top of BondSecurity. Pool-level fields
7
+ * (agency, WAC, WAM, pass-through rate, factors, balances, PSA) live in
8
+ * the parallel mbs_extension sub-message; bond_details still carries the
9
+ * canonical coupon/dates/face value.
10
+ */
11
+ declare class MortgageBackedSecurity extends BondSecurity {
12
+ constructor(proto: SecurityProto);
13
+ private getMbsExtension;
14
+ /** Pool identifier (e.g. "FN AS1234"). */
15
+ getPoolNumber(): string;
16
+ /** Issuing agency (FNMA / FHLMC / GNMA). */
17
+ getAgency(): AgencyProto;
18
+ /** Weighted Average Coupon across underlying loans. */
19
+ getWac(): Decimal | null;
20
+ /** Weighted Average Maturity, in months. */
21
+ getWam(): number;
22
+ /** Pass-through rate paid to investors (net of servicing/guarantee fees). */
23
+ getPassThroughRate(): Decimal | null;
24
+ /** Current pool factor (remaining UPB / original face). */
25
+ getCurrentFactor(): Decimal | null;
26
+ /** Original face value at issuance. */
27
+ getOriginalFaceValue(): Decimal | null;
28
+ /** Current Unpaid Principal Balance. */
29
+ getCurrentUpb(): Decimal | null;
30
+ /** PSA prepayment speed assumption. */
31
+ getPsaSpeed(): Decimal | null;
32
+ /**
33
+ * Build a fresh SecurityProto for an agency MBS pass-through. product_type
34
+ * is set to MORTGAGE_BACKED so Security.create routes back to this wrapper.
35
+ */
36
+ static fromPricerInputs(args: BondPricerInputs & {
37
+ poolNumber: string;
38
+ agency: AgencyProto;
39
+ wac: Decimal;
40
+ wam: number;
41
+ passThroughRate: Decimal;
42
+ currentFactor: Decimal;
43
+ originalFaceValue: Decimal;
44
+ currentUpb: Decimal;
45
+ psaSpeed: Decimal;
46
+ }): SecurityProto;
47
+ }
48
+ export default MortgageBackedSecurity;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const security_1 = __importDefault(require("./security"));
7
+ const BondSecurity_1 = __importDefault(require("./BondSecurity"));
8
+ const MortgageBackedSecurity_1 = __importDefault(require("./MortgageBackedSecurity"));
9
+ const security_pb_1 = require("../../../fintekkers/models/security/security_pb");
10
+ const product_type_pb_1 = require("../../../fintekkers/models/security/product_type_pb");
11
+ const coupon_type_pb_1 = require("../../../fintekkers/models/security/coupon_type_pb");
12
+ const coupon_frequency_pb_1 = require("../../../fintekkers/models/security/coupon_frequency_pb");
13
+ const agency_pb_1 = require("../../../fintekkers/models/security/bond/agency_pb");
14
+ const date_1 = require("../utils/date");
15
+ const local_date_pb_1 = require("../../../fintekkers/models/util/local_date_pb");
16
+ const decimal_js_1 = require("decimal.js");
17
+ function makeDate(y, m, d) {
18
+ return new date_1.LocalDate(new local_date_pb_1.LocalDateProto().setYear(y).setMonth(m).setDay(d));
19
+ }
20
+ const baseInputs = {
21
+ faceValue: new decimal_js_1.Decimal('250000000'),
22
+ couponRate: new decimal_js_1.Decimal('0.04'),
23
+ couponType: coupon_type_pb_1.CouponTypeProto.FIXED,
24
+ couponFrequency: coupon_frequency_pb_1.CouponFrequencyProto.MONTHLY,
25
+ issueDate: makeDate(2024, 1, 1),
26
+ maturityDate: makeDate(2054, 1, 1),
27
+ };
28
+ const mbsInputs = Object.assign(Object.assign({}, baseInputs), { poolNumber: 'FN AS1234', agency: agency_pb_1.AgencyProto.FNMA, wac: new decimal_js_1.Decimal('0.045'), wam: 358, passThroughRate: new decimal_js_1.Decimal('0.04'), currentFactor: new decimal_js_1.Decimal('0.95'), originalFaceValue: new decimal_js_1.Decimal('250000000'), currentUpb: new decimal_js_1.Decimal('237500000'), psaSpeed: new decimal_js_1.Decimal('150') });
29
+ test('MortgageBackedSecurity.fromPricerInputs populates bond_details and mbs_extension', () => {
30
+ var _a, _b, _c, _d, _e, _f;
31
+ const proto = MortgageBackedSecurity_1.default.fromPricerInputs(mbsInputs);
32
+ expect(proto.getProductType()).toBe(product_type_pb_1.ProductTypeProto.MORTGAGE_BACKED);
33
+ expect(proto.hasBondDetails()).toBe(true);
34
+ expect(proto.hasMbsExtension()).toBe(true);
35
+ const ext = proto.getMbsExtension();
36
+ expect(ext.getPoolNumber()).toBe('FN AS1234');
37
+ expect(ext.getAgency()).toBe(agency_pb_1.AgencyProto.FNMA);
38
+ expect((_a = ext.getWac()) === null || _a === void 0 ? void 0 : _a.getArbitraryPrecisionValue()).toBe('0.045');
39
+ expect(ext.getWam()).toBe(358);
40
+ expect((_b = ext.getPassThroughRate()) === null || _b === void 0 ? void 0 : _b.getArbitraryPrecisionValue()).toBe('0.04');
41
+ expect((_c = ext.getCurrentFactor()) === null || _c === void 0 ? void 0 : _c.getArbitraryPrecisionValue()).toBe('0.95');
42
+ expect((_d = ext.getOriginalFaceValue()) === null || _d === void 0 ? void 0 : _d.getArbitraryPrecisionValue()).toBe('250000000');
43
+ expect((_e = ext.getCurrentUpb()) === null || _e === void 0 ? void 0 : _e.getArbitraryPrecisionValue()).toBe('237500000');
44
+ expect((_f = ext.getPsaSpeed()) === null || _f === void 0 ? void 0 : _f.getArbitraryPrecisionValue()).toBe('150');
45
+ });
46
+ test('MortgageBackedSecurity round-trips via serializeBinary / deserializeBinary preserving all 9 mbs fields', () => {
47
+ var _a, _b, _c, _d, _e, _f;
48
+ const proto = MortgageBackedSecurity_1.default.fromPricerInputs(mbsInputs);
49
+ const bytes = proto.serializeBinary();
50
+ const round = security_pb_1.SecurityProto.deserializeBinary(bytes);
51
+ expect(round.getProductType()).toBe(product_type_pb_1.ProductTypeProto.MORTGAGE_BACKED);
52
+ expect(round.hasBondDetails()).toBe(true);
53
+ expect(round.hasMbsExtension()).toBe(true);
54
+ const ext = round.getMbsExtension();
55
+ expect(ext.getPoolNumber()).toBe('FN AS1234');
56
+ expect(ext.getAgency()).toBe(agency_pb_1.AgencyProto.FNMA);
57
+ expect((_a = ext.getWac()) === null || _a === void 0 ? void 0 : _a.getArbitraryPrecisionValue()).toBe('0.045');
58
+ expect(ext.getWam()).toBe(358);
59
+ expect((_b = ext.getPassThroughRate()) === null || _b === void 0 ? void 0 : _b.getArbitraryPrecisionValue()).toBe('0.04');
60
+ expect((_c = ext.getCurrentFactor()) === null || _c === void 0 ? void 0 : _c.getArbitraryPrecisionValue()).toBe('0.95');
61
+ expect((_d = ext.getOriginalFaceValue()) === null || _d === void 0 ? void 0 : _d.getArbitraryPrecisionValue()).toBe('250000000');
62
+ expect((_e = ext.getCurrentUpb()) === null || _e === void 0 ? void 0 : _e.getArbitraryPrecisionValue()).toBe('237500000');
63
+ expect((_f = ext.getPsaSpeed()) === null || _f === void 0 ? void 0 : _f.getArbitraryPrecisionValue()).toBe('150');
64
+ });
65
+ test('MortgageBackedSecurity wraps via Security.create factory dispatch', () => {
66
+ const proto = MortgageBackedSecurity_1.default.fromPricerInputs(mbsInputs);
67
+ const sec = security_1.default.create(proto);
68
+ expect(sec).toBeInstanceOf(MortgageBackedSecurity_1.default);
69
+ // Inherits BondSecurity behaviour.
70
+ expect(sec).toBeInstanceOf(BondSecurity_1.default);
71
+ expect(sec.isBond()).toBe(true);
72
+ });
73
+ test('MortgageBackedSecurity typed accessors read back the expected values', () => {
74
+ var _a, _b, _c, _d, _e, _f;
75
+ const proto = MortgageBackedSecurity_1.default.fromPricerInputs(mbsInputs);
76
+ const sec = security_1.default.create(proto);
77
+ // Bond-side checks (inherited from BondSecurity).
78
+ expect(sec.getCouponRate().getArbitraryPrecisionValue()).toBe('0.04');
79
+ expect(sec.getFaceValue().getArbitraryPrecisionValue()).toBe('250000000');
80
+ expect(sec.getIssueDate().toDate().getFullYear()).toBe(2024);
81
+ expect(sec.getMaturityDate().toDate().getFullYear()).toBe(2054);
82
+ // MBS-specific accessor checks.
83
+ expect(sec.getPoolNumber()).toBe('FN AS1234');
84
+ expect(sec.getAgency()).toBe(agency_pb_1.AgencyProto.FNMA);
85
+ expect((_a = sec.getWac()) === null || _a === void 0 ? void 0 : _a.toString()).toBe('0.045');
86
+ expect(sec.getWam()).toBe(358);
87
+ expect((_b = sec.getPassThroughRate()) === null || _b === void 0 ? void 0 : _b.toString()).toBe('0.04');
88
+ expect((_c = sec.getCurrentFactor()) === null || _c === void 0 ? void 0 : _c.toString()).toBe('0.95');
89
+ expect((_d = sec.getOriginalFaceValue()) === null || _d === void 0 ? void 0 : _d.toString()).toBe('250000000');
90
+ expect((_e = sec.getCurrentUpb()) === null || _e === void 0 ? void 0 : _e.toString()).toBe('237500000');
91
+ expect((_f = sec.getPsaSpeed()) === null || _f === void 0 ? void 0 : _f.toString()).toBe('150');
92
+ });
93
+ //# sourceMappingURL=MortgageBackedSecurity.fromPricerInputs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MortgageBackedSecurity.fromPricerInputs.test.js","sourceRoot":"","sources":["MortgageBackedSecurity.fromPricerInputs.test.ts"],"names":[],"mappings":"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"}