@fintekkers/ledger-models 0.4.2 → 0.4.3
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/node/wrappers/models/security/BondSecurity.d.ts +5 -21
- package/node/wrappers/models/security/BondSecurity.fromPricerInputs.test.js +17 -11
- package/node/wrappers/models/security/BondSecurity.fromPricerInputs.test.js.map +1 -1
- package/node/wrappers/models/security/BondSecurity.fromPricerInputs.test.ts +17 -11
- package/node/wrappers/models/security/BondSecurity.js +15 -32
- package/node/wrappers/models/security/BondSecurity.js.map +1 -1
- package/node/wrappers/models/security/BondSecurity.ts +18 -37
- package/node/wrappers/models/security/Issuance.d.ts +3 -5
- package/node/wrappers/models/security/Issuance.js +3 -8
- package/node/wrappers/models/security/Issuance.js.map +1 -1
- package/node/wrappers/models/security/Issuance.test.js +16 -8
- package/node/wrappers/models/security/Issuance.test.js.map +1 -1
- package/node/wrappers/models/security/Issuance.test.ts +10 -2
- package/node/wrappers/models/security/Issuance.ts +6 -12
- package/node/wrappers/models/security/MortgageBackedSecurity.fromPricerInputs.test.js +11 -7
- package/node/wrappers/models/security/MortgageBackedSecurity.fromPricerInputs.test.js.map +1 -1
- package/node/wrappers/models/security/MortgageBackedSecurity.fromPricerInputs.test.ts +12 -8
- package/node/wrappers/models/security/TIPSBond.d.ts +2 -3
- package/node/wrappers/models/security/TIPSBond.js +2 -4
- package/node/wrappers/models/security/TIPSBond.js.map +1 -1
- package/node/wrappers/models/security/TIPSBond.ts +5 -7
- package/node/wrappers/models/security/security.d.ts +38 -12
- package/node/wrappers/models/security/security.js +58 -15
- package/node/wrappers/models/security/security.js.map +1 -1
- package/node/wrappers/models/security/security.test.js +91 -10
- package/node/wrappers/models/security/security.test.js.map +1 -1
- package/node/wrappers/models/security/security.test.ts +106 -11
- package/node/wrappers/models/security/security.ts +64 -16
- package/node/wrappers/models/transaction/transaction.d.ts +2 -3
- package/node/wrappers/models/transaction/transaction.js +23 -21
- package/node/wrappers/models/transaction/transaction.js.map +1 -1
- package/node/wrappers/models/transaction/transaction.ts +22 -21
- package/node/wrappers/models/transaction/transaction_constructor.test.js +4 -2
- package/node/wrappers/models/transaction/transaction_constructor.test.js.map +1 -1
- package/node/wrappers/models/transaction/transaction_constructor.test.ts +10 -8
- package/node/wrappers/models/utils/date.d.ts +13 -1
- package/node/wrappers/models/utils/date.js +26 -1
- package/node/wrappers/models/utils/date.js.map +1 -1
- package/node/wrappers/models/utils/date.ts +25 -1
- package/node/wrappers/services/security-service/security.maturityLadder.test.js +4 -2
- package/node/wrappers/services/security-service/security.maturityLadder.test.js.map +1 -1
- package/node/wrappers/services/security-service/security.maturityLadder.test.ts +3 -2
- package/package.json +1 -1
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import Security from './security';
|
|
2
2
|
import { SecurityProto, BondDetailsProto } from '../../../fintekkers/models/security/security_pb';
|
|
3
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
4
|
import { CouponFrequency } from './coupon_frequency';
|
|
7
5
|
import { CouponType } from './coupon_type';
|
|
8
6
|
import { Tenor } from './term';
|
|
@@ -19,15 +17,9 @@ export interface BondPricerInputs {
|
|
|
19
17
|
couponRate: Decimal;
|
|
20
18
|
couponType: CouponTypeProto;
|
|
21
19
|
couponFrequency: CouponFrequencyProto;
|
|
22
|
-
issueDate:
|
|
23
|
-
maturityDate:
|
|
20
|
+
issueDate: Date;
|
|
21
|
+
maturityDate: Date;
|
|
24
22
|
}
|
|
25
|
-
/**
|
|
26
|
-
* Build a LocalDateProto from a LocalDate wrapper. Exported so subclass
|
|
27
|
-
* builders (TIPSBond, FloatingRateNote) can re-use it without poking at
|
|
28
|
-
* LocalDate's proto privately.
|
|
29
|
-
*/
|
|
30
|
-
export declare function localDateToProto(d: LocalDate): LocalDateProto;
|
|
31
23
|
/** Build a DecimalValueProto from a Decimal. */
|
|
32
24
|
export declare function decimalToProto(v: Decimal): DecimalValueProto;
|
|
33
25
|
/**
|
|
@@ -50,11 +42,11 @@ declare class BondSecurity extends Security {
|
|
|
50
42
|
* This method handles month and year boundaries correctly.
|
|
51
43
|
*/
|
|
52
44
|
private calculatePeriod;
|
|
53
|
-
getCouponRate():
|
|
54
|
-
getFaceValue():
|
|
45
|
+
getCouponRate(): Decimal | null;
|
|
46
|
+
getFaceValue(): Decimal | null;
|
|
55
47
|
getCouponType(): CouponType;
|
|
56
48
|
getCouponFrequency(): CouponFrequency;
|
|
57
|
-
getDatedDate():
|
|
49
|
+
getDatedDate(): Date | null;
|
|
58
50
|
/**
|
|
59
51
|
* Returns every auction/reopening record on this bond as typed Issuance
|
|
60
52
|
* wrappers. Empty list if bond_details is unset or has no issuances.
|
|
@@ -73,14 +65,6 @@ declare class BondSecurity extends Security {
|
|
|
73
65
|
* @returns The price scale factor as a Decimal (0.01)
|
|
74
66
|
*/
|
|
75
67
|
getPriceScaleFactor(): Decimal;
|
|
76
|
-
/**
|
|
77
|
-
* Bond issue date is the auction date and is required for bonds.
|
|
78
|
-
* Overrides Security.getIssueDate (which returns LocalDate | null on the
|
|
79
|
-
* base) with a non-nullable return type — for a properly-formed bond,
|
|
80
|
-
* issue date is always present, and TS callers narrowed via isBond()
|
|
81
|
-
* shouldn't have to null-check.
|
|
82
|
-
*/
|
|
83
|
-
getIssueDate(): LocalDate;
|
|
84
68
|
getProductType(): string;
|
|
85
69
|
}
|
|
86
70
|
export default BondSecurity;
|
|
@@ -11,11 +11,11 @@ const product_type_pb_1 = require("../../../fintekkers/models/security/product_t
|
|
|
11
11
|
const coupon_type_pb_1 = require("../../../fintekkers/models/security/coupon_type_pb");
|
|
12
12
|
const coupon_frequency_pb_1 = require("../../../fintekkers/models/security/coupon_frequency_pb");
|
|
13
13
|
const index_type_pb_1 = require("../../../fintekkers/models/security/index/index_type_pb");
|
|
14
|
-
const date_1 = require("../utils/date");
|
|
15
|
-
const local_date_pb_1 = require("../../../fintekkers/models/util/local_date_pb");
|
|
16
14
|
const decimal_js_1 = require("decimal.js");
|
|
17
15
|
function makeDate(y, m, d) {
|
|
18
|
-
|
|
16
|
+
const date = new Date(y, m - 1, d);
|
|
17
|
+
date.setHours(0, 0, 0, 0);
|
|
18
|
+
return date;
|
|
19
19
|
}
|
|
20
20
|
const baseInputs = {
|
|
21
21
|
faceValue: new decimal_js_1.Decimal('1000'),
|
|
@@ -31,15 +31,19 @@ test('BondSecurity.fromPricerInputs round-trips through Security.create as a Bon
|
|
|
31
31
|
const sec = security_1.default.create(proto);
|
|
32
32
|
expect(sec).toBeInstanceOf(BondSecurity_1.default);
|
|
33
33
|
const bond = sec;
|
|
34
|
-
expect(bond.getCouponRate().
|
|
35
|
-
expect(bond.getFaceValue().
|
|
34
|
+
expect(bond.getCouponRate().equals(new decimal_js_1.Decimal('0.045'))).toBe(true);
|
|
35
|
+
expect(bond.getFaceValue().equals(new decimal_js_1.Decimal('1000'))).toBe(true);
|
|
36
36
|
expect(bond.getCouponType().name()).toBe('FIXED');
|
|
37
37
|
expect(bond.getCouponFrequency().toString()).toBe('SEMIANNUALLY');
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
const issueDate = bond.getIssueDate();
|
|
39
|
+
const maturityDate = bond.getMaturityDate();
|
|
40
|
+
expect(issueDate).toBeInstanceOf(Date);
|
|
41
|
+
expect(maturityDate).toBeInstanceOf(Date);
|
|
42
|
+
expect(issueDate.getFullYear()).toBe(2024);
|
|
43
|
+
expect(maturityDate.getFullYear()).toBe(2034);
|
|
40
44
|
});
|
|
41
45
|
test('TIPSBond.fromPricerInputs round-trips with tips_extension populated', () => {
|
|
42
|
-
var _a
|
|
46
|
+
var _a;
|
|
43
47
|
const proto = TIPSBond_1.default.fromPricerInputs(Object.assign(Object.assign({}, baseInputs), { baseCpi: new decimal_js_1.Decimal('301.5'), indexDate: makeDate(2024, 1, 15), inflationIndexType: index_type_pb_1.IndexTypeProto.CPI_U }));
|
|
44
48
|
expect(proto.getProductType()).toBe(product_type_pb_1.ProductTypeProto.TIPS);
|
|
45
49
|
expect(proto.hasTipsExtension()).toBe(true);
|
|
@@ -47,10 +51,12 @@ test('TIPSBond.fromPricerInputs round-trips with tips_extension populated', () =
|
|
|
47
51
|
expect(sec).toBeInstanceOf(TIPSBond_1.default);
|
|
48
52
|
const tips = sec;
|
|
49
53
|
// Bond-side checks (inherited from BondSecurity)
|
|
50
|
-
expect(tips.getCouponRate().
|
|
54
|
+
expect(tips.getCouponRate().equals(new decimal_js_1.Decimal('0.045'))).toBe(true);
|
|
51
55
|
// TIPS-specific checks
|
|
52
56
|
expect((_a = tips.getBaseCpi()) === null || _a === void 0 ? void 0 : _a.toString()).toBe('301.5');
|
|
53
|
-
|
|
57
|
+
const indexDate = tips.getIndexDate();
|
|
58
|
+
expect(indexDate).toBeInstanceOf(Date);
|
|
59
|
+
expect(indexDate.getFullYear()).toBe(2024);
|
|
54
60
|
expect(tips.getInflationIndexType()).toBe(index_type_pb_1.IndexTypeProto.CPI_U);
|
|
55
61
|
});
|
|
56
62
|
test('FloatingRateNote.fromPricerInputs round-trips with frn_extension populated', () => {
|
|
@@ -61,7 +67,7 @@ test('FloatingRateNote.fromPricerInputs round-trips with frn_extension populated
|
|
|
61
67
|
const sec = security_1.default.create(proto);
|
|
62
68
|
expect(sec).toBeInstanceOf(FloatingRateNote_1.default);
|
|
63
69
|
const frn = sec;
|
|
64
|
-
expect(frn.getCouponRate().
|
|
70
|
+
expect(frn.getCouponRate().equals(new decimal_js_1.Decimal('0.045'))).toBe(true);
|
|
65
71
|
expect((_a = frn.getSpread()) === null || _a === void 0 ? void 0 : _a.toString()).toBe('0.0015');
|
|
66
72
|
expect(frn.getReferenceRateIndex()).toBe(index_type_pb_1.IndexTypeProto.SOFR);
|
|
67
73
|
expect(frn.getResetFrequency()).toBe(coupon_frequency_pb_1.CouponFrequencyProto.QUARTERLY);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BondSecurity.fromPricerInputs.test.js","sourceRoot":"","sources":["BondSecurity.fromPricerInputs.test.ts"],"names":[],"mappings":";;;;;AAAA,0DAAkC;AAClC,kEAA0C;AAC1C,0DAAkC;AAClC,0EAAkD;AAClD,yFAAuF;AACvF,uFAAqF;AACrF,iGAA+F;AAC/F,2FAAyF;AACzF,
|
|
1
|
+
{"version":3,"file":"BondSecurity.fromPricerInputs.test.js","sourceRoot":"","sources":["BondSecurity.fromPricerInputs.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,12 +6,12 @@ import { ProductTypeProto } from '../../../fintekkers/models/security/product_ty
|
|
|
6
6
|
import { CouponTypeProto } from '../../../fintekkers/models/security/coupon_type_pb';
|
|
7
7
|
import { CouponFrequencyProto } from '../../../fintekkers/models/security/coupon_frequency_pb';
|
|
8
8
|
import { IndexTypeProto } from '../../../fintekkers/models/security/index/index_type_pb';
|
|
9
|
-
import { LocalDate } from '../utils/date';
|
|
10
|
-
import { LocalDateProto } from '../../../fintekkers/models/util/local_date_pb';
|
|
11
9
|
import { Decimal } from 'decimal.js';
|
|
12
10
|
|
|
13
|
-
function makeDate(y: number, m: number, d: number):
|
|
14
|
-
|
|
11
|
+
function makeDate(y: number, m: number, d: number): Date {
|
|
12
|
+
const date = new Date(y, m - 1, d);
|
|
13
|
+
date.setHours(0, 0, 0, 0);
|
|
14
|
+
return date;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
const baseInputs = {
|
|
@@ -29,12 +29,16 @@ test('BondSecurity.fromPricerInputs round-trips through Security.create as a Bon
|
|
|
29
29
|
const sec = Security.create(proto);
|
|
30
30
|
expect(sec).toBeInstanceOf(BondSecurity);
|
|
31
31
|
const bond = sec as BondSecurity;
|
|
32
|
-
expect(bond.getCouponRate()
|
|
33
|
-
expect(bond.getFaceValue()
|
|
32
|
+
expect(bond.getCouponRate()!.equals(new Decimal('0.045'))).toBe(true);
|
|
33
|
+
expect(bond.getFaceValue()!.equals(new Decimal('1000'))).toBe(true);
|
|
34
34
|
expect(bond.getCouponType().name()).toBe('FIXED');
|
|
35
35
|
expect(bond.getCouponFrequency().toString()).toBe('SEMIANNUALLY');
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
const issueDate = bond.getIssueDate();
|
|
37
|
+
const maturityDate = bond.getMaturityDate();
|
|
38
|
+
expect(issueDate).toBeInstanceOf(Date);
|
|
39
|
+
expect(maturityDate).toBeInstanceOf(Date);
|
|
40
|
+
expect(issueDate!.getFullYear()).toBe(2024);
|
|
41
|
+
expect(maturityDate!.getFullYear()).toBe(2034);
|
|
38
42
|
});
|
|
39
43
|
|
|
40
44
|
test('TIPSBond.fromPricerInputs round-trips with tips_extension populated', () => {
|
|
@@ -51,10 +55,12 @@ test('TIPSBond.fromPricerInputs round-trips with tips_extension populated', () =
|
|
|
51
55
|
expect(sec).toBeInstanceOf(TIPSBond);
|
|
52
56
|
const tips = sec as TIPSBond;
|
|
53
57
|
// Bond-side checks (inherited from BondSecurity)
|
|
54
|
-
expect(tips.getCouponRate()
|
|
58
|
+
expect(tips.getCouponRate()!.equals(new Decimal('0.045'))).toBe(true);
|
|
55
59
|
// TIPS-specific checks
|
|
56
60
|
expect(tips.getBaseCpi()?.toString()).toBe('301.5');
|
|
57
|
-
|
|
61
|
+
const indexDate = tips.getIndexDate();
|
|
62
|
+
expect(indexDate).toBeInstanceOf(Date);
|
|
63
|
+
expect(indexDate!.getFullYear()).toBe(2024);
|
|
58
64
|
expect(tips.getInflationIndexType()).toBe(IndexTypeProto.CPI_U);
|
|
59
65
|
});
|
|
60
66
|
|
|
@@ -71,7 +77,7 @@ test('FloatingRateNote.fromPricerInputs round-trips with frn_extension populated
|
|
|
71
77
|
const sec = Security.create(proto);
|
|
72
78
|
expect(sec).toBeInstanceOf(FloatingRateNote);
|
|
73
79
|
const frn = sec as FloatingRateNote;
|
|
74
|
-
expect(frn.getCouponRate()
|
|
80
|
+
expect(frn.getCouponRate()!.equals(new Decimal('0.045'))).toBe(true);
|
|
75
81
|
expect(frn.getSpread()?.toString()).toBe('0.0015');
|
|
76
82
|
expect(frn.getReferenceRateIndex()).toBe(IndexTypeProto.SOFR);
|
|
77
83
|
expect(frn.getResetFrequency()).toBe(CouponFrequencyProto.QUARTERLY);
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.buildBondDetails = exports.decimalToProto =
|
|
6
|
+
exports.buildBondDetails = exports.decimalToProto = void 0;
|
|
7
7
|
const security_1 = __importDefault(require("./security"));
|
|
8
8
|
const security_pb_1 = require("../../../fintekkers/models/security/security_pb");
|
|
9
9
|
const product_type_pb_1 = require("../../../fintekkers/models/security/product_type_pb");
|
|
@@ -16,15 +16,6 @@ const tenor_type_pb_1 = require("../../../fintekkers/models/security/tenor_type_
|
|
|
16
16
|
const decimal_js_1 = require("decimal.js");
|
|
17
17
|
const product_hierarchy_1 = require("./product_hierarchy");
|
|
18
18
|
const Issuance_1 = __importDefault(require("./Issuance"));
|
|
19
|
-
/**
|
|
20
|
-
* Build a LocalDateProto from a LocalDate wrapper. Exported so subclass
|
|
21
|
-
* builders (TIPSBond, FloatingRateNote) can re-use it without poking at
|
|
22
|
-
* LocalDate's proto privately.
|
|
23
|
-
*/
|
|
24
|
-
function localDateToProto(d) {
|
|
25
|
-
return d.toProto();
|
|
26
|
-
}
|
|
27
|
-
exports.localDateToProto = localDateToProto;
|
|
28
19
|
/** Build a DecimalValueProto from a Decimal. */
|
|
29
20
|
function decimalToProto(v) {
|
|
30
21
|
return new decimal_value_pb_1.DecimalValueProto().setArbitraryPrecisionValue(v.toString());
|
|
@@ -40,8 +31,8 @@ function buildBondDetails(args) {
|
|
|
40
31
|
.setCouponRate(decimalToProto(args.couponRate))
|
|
41
32
|
.setCouponType(args.couponType)
|
|
42
33
|
.setCouponFrequency(args.couponFrequency)
|
|
43
|
-
.setIssueDate(
|
|
44
|
-
.setMaturityDate(
|
|
34
|
+
.setIssueDate((0, date_1.dateToLocalDateProto)(args.issueDate))
|
|
35
|
+
.setMaturityDate((0, date_1.dateToLocalDateProto)(args.maturityDate));
|
|
45
36
|
}
|
|
46
37
|
exports.buildBondDetails = buildBondDetails;
|
|
47
38
|
class BondSecurity extends security_1.default {
|
|
@@ -66,8 +57,13 @@ class BondSecurity extends security_1.default {
|
|
|
66
57
|
* @returns The tenor (term) of the bond as a Tenor object.
|
|
67
58
|
*/
|
|
68
59
|
getTenor(asOfDate) {
|
|
69
|
-
const
|
|
70
|
-
const maturityDate = this.getMaturityDate()
|
|
60
|
+
const issueDate = this.getIssueDate();
|
|
61
|
+
const maturityDate = this.getMaturityDate();
|
|
62
|
+
if (!issueDate)
|
|
63
|
+
throw new Error("Issue date is required for getTenor");
|
|
64
|
+
if (!maturityDate)
|
|
65
|
+
throw new Error("Maturity date is required for getTenor");
|
|
66
|
+
const startDate = asOfDate ? asOfDate : issueDate;
|
|
71
67
|
// Calculate the period between issue date and maturity date
|
|
72
68
|
const period = this.calculatePeriod(startDate, maturityDate);
|
|
73
69
|
return new term_1.Tenor(tenor_type_pb_1.TenorTypeProto.TERM, period);
|
|
@@ -102,15 +98,15 @@ class BondSecurity extends security_1.default {
|
|
|
102
98
|
const bond = this.getBondLikeDetails();
|
|
103
99
|
const rate = bond ? bond.getCouponRate() : undefined;
|
|
104
100
|
if (!rate)
|
|
105
|
-
|
|
106
|
-
return rate;
|
|
101
|
+
return null;
|
|
102
|
+
return new decimal_js_1.Decimal(rate.getArbitraryPrecisionValue());
|
|
107
103
|
}
|
|
108
104
|
getFaceValue() {
|
|
109
105
|
const bond = this.getBondLikeDetails();
|
|
110
106
|
const faceValue = bond ? bond.getFaceValue() : undefined;
|
|
111
107
|
if (!faceValue)
|
|
112
|
-
|
|
113
|
-
return faceValue;
|
|
108
|
+
return null;
|
|
109
|
+
return new decimal_js_1.Decimal(faceValue.getArbitraryPrecisionValue());
|
|
114
110
|
}
|
|
115
111
|
getCouponType() {
|
|
116
112
|
const bond = this.getBondLikeDetails();
|
|
@@ -129,7 +125,7 @@ class BondSecurity extends security_1.default {
|
|
|
129
125
|
getDatedDate() {
|
|
130
126
|
const bond = this.getBondLikeDetails();
|
|
131
127
|
const datedDate = bond ? bond.getDatedDate() : undefined;
|
|
132
|
-
return
|
|
128
|
+
return (0, date_1.localDateProtoToDate)(datedDate);
|
|
133
129
|
}
|
|
134
130
|
/**
|
|
135
131
|
* Returns every auction/reopening record on this bond as typed Issuance
|
|
@@ -160,19 +156,6 @@ class BondSecurity extends security_1.default {
|
|
|
160
156
|
getPriceScaleFactor() {
|
|
161
157
|
return new decimal_js_1.Decimal('0.01');
|
|
162
158
|
}
|
|
163
|
-
/**
|
|
164
|
-
* Bond issue date is the auction date and is required for bonds.
|
|
165
|
-
* Overrides Security.getIssueDate (which returns LocalDate | null on the
|
|
166
|
-
* base) with a non-nullable return type — for a properly-formed bond,
|
|
167
|
-
* issue date is always present, and TS callers narrowed via isBond()
|
|
168
|
-
* shouldn't have to null-check.
|
|
169
|
-
*/
|
|
170
|
-
getIssueDate() {
|
|
171
|
-
const date = super.getIssueDate();
|
|
172
|
-
if (!date)
|
|
173
|
-
throw new Error("Issue date is required for bonds");
|
|
174
|
-
return date;
|
|
175
|
-
}
|
|
176
159
|
getProductType() {
|
|
177
160
|
// Only BondSecurity has getTenor implemented
|
|
178
161
|
// Check if getTenor method exists (it's only in BondSecurity)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BondSecurity.js","sourceRoot":"","sources":["BondSecurity.ts"],"names":[],"mappings":";;;;;;AAAA,0DAAkC;AAClC,iFAAkG;AAClG,yFAAuF;AACvF,uFAAqF;AAErF,
|
|
1
|
+
{"version":3,"file":"BondSecurity.js","sourceRoot":"","sources":["BondSecurity.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { SecurityProto, BondDetailsProto } from '../../../fintekkers/models/secu
|
|
|
3
3
|
import { ProductTypeProto } from "../../../fintekkers/models/security/product_type_pb";
|
|
4
4
|
import { DecimalValueProto } from '../../../fintekkers/models/util/decimal_value_pb';
|
|
5
5
|
import { LocalDateProto } from '../../../fintekkers/models/util/local_date_pb';
|
|
6
|
-
import {
|
|
6
|
+
import { dateToLocalDateProto, localDateProtoToDate } from '../utils/date';
|
|
7
7
|
import { IssuanceProto } from '../../../fintekkers/models/security/bond/issuance_pb';
|
|
8
8
|
import { CouponFrequency } from './coupon_frequency';
|
|
9
9
|
import { CouponType } from './coupon_type';
|
|
@@ -24,17 +24,8 @@ export interface BondPricerInputs {
|
|
|
24
24
|
couponRate: Decimal;
|
|
25
25
|
couponType: CouponTypeProto;
|
|
26
26
|
couponFrequency: CouponFrequencyProto;
|
|
27
|
-
issueDate:
|
|
28
|
-
maturityDate:
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Build a LocalDateProto from a LocalDate wrapper. Exported so subclass
|
|
33
|
-
* builders (TIPSBond, FloatingRateNote) can re-use it without poking at
|
|
34
|
-
* LocalDate's proto privately.
|
|
35
|
-
*/
|
|
36
|
-
export function localDateToProto(d: LocalDate): LocalDateProto {
|
|
37
|
-
return d.toProto();
|
|
27
|
+
issueDate: Date;
|
|
28
|
+
maturityDate: Date;
|
|
38
29
|
}
|
|
39
30
|
|
|
40
31
|
/** Build a DecimalValueProto from a Decimal. */
|
|
@@ -52,8 +43,8 @@ export function buildBondDetails(args: BondPricerInputs): BondDetailsProto {
|
|
|
52
43
|
.setCouponRate(decimalToProto(args.couponRate))
|
|
53
44
|
.setCouponType(args.couponType)
|
|
54
45
|
.setCouponFrequency(args.couponFrequency)
|
|
55
|
-
.setIssueDate(
|
|
56
|
-
.setMaturityDate(
|
|
46
|
+
.setIssueDate(dateToLocalDateProto(args.issueDate))
|
|
47
|
+
.setMaturityDate(dateToLocalDateProto(args.maturityDate));
|
|
57
48
|
}
|
|
58
49
|
|
|
59
50
|
class BondSecurity extends Security {
|
|
@@ -81,8 +72,11 @@ class BondSecurity extends Security {
|
|
|
81
72
|
* @returns The tenor (term) of the bond as a Tenor object.
|
|
82
73
|
*/
|
|
83
74
|
getTenor(asOfDate?: Date): Tenor {
|
|
84
|
-
const
|
|
85
|
-
const maturityDate = this.getMaturityDate()
|
|
75
|
+
const issueDate = this.getIssueDate();
|
|
76
|
+
const maturityDate = this.getMaturityDate();
|
|
77
|
+
if (!issueDate) throw new Error("Issue date is required for getTenor");
|
|
78
|
+
if (!maturityDate) throw new Error("Maturity date is required for getTenor");
|
|
79
|
+
const startDate = asOfDate ? asOfDate : issueDate;
|
|
86
80
|
|
|
87
81
|
// Calculate the period between issue date and maturity date
|
|
88
82
|
const period = this.calculatePeriod(startDate, maturityDate);
|
|
@@ -120,18 +114,18 @@ class BondSecurity extends Security {
|
|
|
120
114
|
};
|
|
121
115
|
}
|
|
122
116
|
|
|
123
|
-
getCouponRate():
|
|
117
|
+
getCouponRate(): Decimal | null {
|
|
124
118
|
const bond = this.getBondLikeDetails();
|
|
125
119
|
const rate = bond ? bond.getCouponRate() : undefined;
|
|
126
|
-
if (!rate)
|
|
127
|
-
return rate;
|
|
120
|
+
if (!rate) return null;
|
|
121
|
+
return new Decimal(rate.getArbitraryPrecisionValue());
|
|
128
122
|
}
|
|
129
123
|
|
|
130
|
-
getFaceValue():
|
|
124
|
+
getFaceValue(): Decimal | null {
|
|
131
125
|
const bond = this.getBondLikeDetails();
|
|
132
126
|
const faceValue = bond ? bond.getFaceValue() : undefined;
|
|
133
|
-
if (!faceValue)
|
|
134
|
-
return faceValue;
|
|
127
|
+
if (!faceValue) return null;
|
|
128
|
+
return new Decimal(faceValue.getArbitraryPrecisionValue());
|
|
135
129
|
}
|
|
136
130
|
|
|
137
131
|
getCouponType(): CouponType {
|
|
@@ -148,10 +142,10 @@ class BondSecurity extends Security {
|
|
|
148
142
|
return new CouponFrequency(couponFrequency);
|
|
149
143
|
}
|
|
150
144
|
|
|
151
|
-
getDatedDate():
|
|
145
|
+
getDatedDate(): Date | null {
|
|
152
146
|
const bond = this.getBondLikeDetails();
|
|
153
147
|
const datedDate = bond ? bond.getDatedDate() : undefined;
|
|
154
|
-
return
|
|
148
|
+
return localDateProtoToDate(datedDate);
|
|
155
149
|
}
|
|
156
150
|
|
|
157
151
|
/**
|
|
@@ -186,19 +180,6 @@ class BondSecurity extends Security {
|
|
|
186
180
|
return new Decimal('0.01');
|
|
187
181
|
}
|
|
188
182
|
|
|
189
|
-
/**
|
|
190
|
-
* Bond issue date is the auction date and is required for bonds.
|
|
191
|
-
* Overrides Security.getIssueDate (which returns LocalDate | null on the
|
|
192
|
-
* base) with a non-nullable return type — for a properly-formed bond,
|
|
193
|
-
* issue date is always present, and TS callers narrowed via isBond()
|
|
194
|
-
* shouldn't have to null-check.
|
|
195
|
-
*/
|
|
196
|
-
getIssueDate(): LocalDate {
|
|
197
|
-
const date = super.getIssueDate();
|
|
198
|
-
if (!date) throw new Error("Issue date is required for bonds");
|
|
199
|
-
return date;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
183
|
getProductType(): string {
|
|
203
184
|
// Only BondSecurity has getTenor implemented
|
|
204
185
|
// Check if getTenor method exists (it's only in BondSecurity)
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { IssuanceProto } from "../../../fintekkers/models/security/bond/issuance_pb";
|
|
2
2
|
import { AuctionTypeProto } from "../../../fintekkers/models/security/bond/auction_type_pb";
|
|
3
|
-
import { LocalDate } from "../utils/date";
|
|
4
3
|
import Decimal from "decimal.js";
|
|
5
4
|
/**
|
|
6
5
|
* Typed wrapper around a single IssuanceProto. Returns null for unset
|
|
7
|
-
* sub-messages and Decimal/
|
|
6
|
+
* sub-messages and Decimal/Date for populated ones — callers no longer
|
|
8
7
|
* have to spell out the proto / Decimal coercions at every call site.
|
|
9
8
|
*
|
|
10
9
|
* Note: IssuanceProto has no `dated_date` or `auction_date` field on the
|
|
@@ -14,11 +13,10 @@ declare class Issuance {
|
|
|
14
13
|
proto: IssuanceProto;
|
|
15
14
|
constructor(proto: IssuanceProto);
|
|
16
15
|
private static _toDecimal;
|
|
17
|
-
private static _toLocalDate;
|
|
18
16
|
/** Auction issue (settlement) date. Null if unset. */
|
|
19
|
-
getIssueDate():
|
|
17
|
+
getIssueDate(): Date | null;
|
|
20
18
|
/** Auction announcement date. Null if unset. */
|
|
21
|
-
getAnnouncementDate():
|
|
19
|
+
getAnnouncementDate(): Date | null;
|
|
22
20
|
/** Auction offering amount (original face value offered). Null if unset. */
|
|
23
21
|
getOriginalFaceValue(): Decimal | null;
|
|
24
22
|
/** Total quantity accepted at auction. Null if unset. */
|
|
@@ -7,7 +7,7 @@ const date_1 = require("../utils/date");
|
|
|
7
7
|
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
8
8
|
/**
|
|
9
9
|
* Typed wrapper around a single IssuanceProto. Returns null for unset
|
|
10
|
-
* sub-messages and Decimal/
|
|
10
|
+
* sub-messages and Decimal/Date for populated ones — callers no longer
|
|
11
11
|
* have to spell out the proto / Decimal coercions at every call site.
|
|
12
12
|
*
|
|
13
13
|
* Note: IssuanceProto has no `dated_date` or `auction_date` field on the
|
|
@@ -22,18 +22,13 @@ class Issuance {
|
|
|
22
22
|
return null;
|
|
23
23
|
return new decimal_js_1.default(value.getArbitraryPrecisionValue());
|
|
24
24
|
}
|
|
25
|
-
static _toLocalDate(value) {
|
|
26
|
-
if (!value)
|
|
27
|
-
return null;
|
|
28
|
-
return new date_1.LocalDate(value);
|
|
29
|
-
}
|
|
30
25
|
/** Auction issue (settlement) date. Null if unset. */
|
|
31
26
|
getIssueDate() {
|
|
32
|
-
return
|
|
27
|
+
return (0, date_1.localDateProtoToDate)(this.proto.getAuctionIssueDate());
|
|
33
28
|
}
|
|
34
29
|
/** Auction announcement date. Null if unset. */
|
|
35
30
|
getAnnouncementDate() {
|
|
36
|
-
return
|
|
31
|
+
return (0, date_1.localDateProtoToDate)(this.proto.getAuctionAnnouncementDate());
|
|
37
32
|
}
|
|
38
33
|
/** Auction offering amount (original face value offered). Null if unset. */
|
|
39
34
|
getOriginalFaceValue() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Issuance.js","sourceRoot":"","sources":["Issuance.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"Issuance.js","sourceRoot":"","sources":["Issuance.ts"],"names":[],"mappings":";;;;;AAGA,wCAAqD;AACrD,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;IAED,sDAAsD;IACtD,YAAY;QACV,OAAO,IAAA,2BAAoB,EAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,gDAAgD;IAChD,mBAAmB;QACjB,OAAO,IAAA,2BAAoB,EAAC,IAAI,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC;IACvE,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"}
|
|
@@ -22,15 +22,23 @@ function buildProto() {
|
|
|
22
22
|
return p;
|
|
23
23
|
}
|
|
24
24
|
test('Issuance typed accessors return wrapped values', () => {
|
|
25
|
-
var _a, _b, _c, _d, _e
|
|
25
|
+
var _a, _b, _c, _d, _e;
|
|
26
26
|
const iss = new Issuance_1.default(buildProto());
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
expect(
|
|
30
|
-
expect(
|
|
31
|
-
expect(
|
|
32
|
-
expect((
|
|
33
|
-
expect(
|
|
27
|
+
const issueDate = iss.getIssueDate();
|
|
28
|
+
const announcementDate = iss.getAnnouncementDate();
|
|
29
|
+
expect(issueDate).toBeInstanceOf(Date);
|
|
30
|
+
expect(announcementDate).toBeInstanceOf(Date);
|
|
31
|
+
expect(issueDate.getFullYear()).toBe(2023);
|
|
32
|
+
expect(issueDate.getMonth()).toBe(1); // February (0-based)
|
|
33
|
+
expect(issueDate.getDate()).toBe(15);
|
|
34
|
+
expect(announcementDate.getFullYear()).toBe(2023);
|
|
35
|
+
expect(announcementDate.getMonth()).toBe(1);
|
|
36
|
+
expect(announcementDate.getDate()).toBe(8);
|
|
37
|
+
expect((_a = iss.getOriginalFaceValue()) === null || _a === void 0 ? void 0 : _a.toString()).toBe('45000000000');
|
|
38
|
+
expect((_b = iss.getTotalAccepted()) === null || _b === void 0 ? void 0 : _b.toString()).toBe('44999500000');
|
|
39
|
+
expect((_c = iss.getPostAuctionOutstandingQuantity()) === null || _c === void 0 ? void 0 : _c.toString()).toBe('44999500000');
|
|
40
|
+
expect((_d = iss.getMatureSecurityAmount()) === null || _d === void 0 ? void 0 : _d.toString()).toBe('0');
|
|
41
|
+
expect((_e = iss.getPriceForSinglePriceAuction()) === null || _e === void 0 ? void 0 : _e.toString()).toBe('99.875');
|
|
34
42
|
expect(iss.getAuctionType()).toBe(auction_type_pb_1.AuctionTypeProto.SINGLE_PRICE);
|
|
35
43
|
});
|
|
36
44
|
test('Issuance returns null for unset sub-messages', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Issuance.test.js","sourceRoot":"","sources":["Issuance.test.ts"],"names":[],"mappings":";;;;;AAAA,0DAAkC;AAClC,sFAAqF;AACrF,8FAA4F;AAC5F,uFAAqF;AACrF,iFAA+E;AAC/E,4DAAiC;AAEjC,SAAS,UAAU;IACjB,MAAM,CAAC,GAAG,IAAI,2BAAa,EAAE,CAAC;IAC9B,CAAC,CAAC,mBAAmB,CAAC,IAAI,8BAAc,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC,CAAC,0BAA0B,CAAC,IAAI,8BAAc,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC,wBAAwB,CAAC,IAAI,oCAAiB,EAAE,CAAC,0BAA0B,CAAC,aAAa,CAAC,CAAC,CAAC;IAC9F,CAAC,CAAC,gBAAgB,CAAC,IAAI,oCAAiB,EAAE,CAAC,0BAA0B,CAAC,aAAa,CAAC,CAAC,CAAC;IACtF,CAAC,CAAC,iCAAiC,CAAC,IAAI,oCAAiB,EAAE,CAAC,0BAA0B,CAAC,aAAa,CAAC,CAAC,CAAC;IACvG,CAAC,CAAC,uBAAuB,CAAC,IAAI,oCAAiB,EAAE,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,6BAA6B,CAAC,IAAI,oCAAiB,EAAE,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9F,CAAC,CAAC,cAAc,CAAC,kCAAgB,CAAC,YAAY,CAAC,CAAC;IAChD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;;IAC1D,MAAM,GAAG,GAAG,IAAI,kBAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACvC,MAAM,
|
|
1
|
+
{"version":3,"file":"Issuance.test.js","sourceRoot":"","sources":["Issuance.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,8 +20,16 @@ function buildProto(): IssuanceProto {
|
|
|
20
20
|
|
|
21
21
|
test('Issuance typed accessors return wrapped values', () => {
|
|
22
22
|
const iss = new Issuance(buildProto());
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
const issueDate = iss.getIssueDate();
|
|
24
|
+
const announcementDate = iss.getAnnouncementDate();
|
|
25
|
+
expect(issueDate).toBeInstanceOf(Date);
|
|
26
|
+
expect(announcementDate).toBeInstanceOf(Date);
|
|
27
|
+
expect(issueDate!.getFullYear()).toBe(2023);
|
|
28
|
+
expect(issueDate!.getMonth()).toBe(1); // February (0-based)
|
|
29
|
+
expect(issueDate!.getDate()).toBe(15);
|
|
30
|
+
expect(announcementDate!.getFullYear()).toBe(2023);
|
|
31
|
+
expect(announcementDate!.getMonth()).toBe(1);
|
|
32
|
+
expect(announcementDate!.getDate()).toBe(8);
|
|
25
33
|
expect(iss.getOriginalFaceValue()?.toString()).toBe('45000000000');
|
|
26
34
|
expect(iss.getTotalAccepted()?.toString()).toBe('44999500000');
|
|
27
35
|
expect(iss.getPostAuctionOutstandingQuantity()?.toString()).toBe('44999500000');
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { IssuanceProto } from "../../../fintekkers/models/security/bond/issuance_pb";
|
|
2
2
|
import { AuctionTypeProto } from "../../../fintekkers/models/security/bond/auction_type_pb";
|
|
3
3
|
import { DecimalValueProto } from "../../../fintekkers/models/util/decimal_value_pb";
|
|
4
|
-
import {
|
|
5
|
-
import { LocalDate } from "../utils/date";
|
|
4
|
+
import { localDateProtoToDate } from "../utils/date";
|
|
6
5
|
import Decimal from "decimal.js";
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
8
|
* Typed wrapper around a single IssuanceProto. Returns null for unset
|
|
10
|
-
* sub-messages and Decimal/
|
|
9
|
+
* sub-messages and Decimal/Date for populated ones — callers no longer
|
|
11
10
|
* have to spell out the proto / Decimal coercions at every call site.
|
|
12
11
|
*
|
|
13
12
|
* Note: IssuanceProto has no `dated_date` or `auction_date` field on the
|
|
@@ -25,19 +24,14 @@ class Issuance {
|
|
|
25
24
|
return new Decimal(value.getArbitraryPrecisionValue());
|
|
26
25
|
}
|
|
27
26
|
|
|
28
|
-
private static _toLocalDate(value: LocalDateProto | undefined): LocalDate | null {
|
|
29
|
-
if (!value) return null;
|
|
30
|
-
return new LocalDate(value);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
27
|
/** Auction issue (settlement) date. Null if unset. */
|
|
34
|
-
getIssueDate():
|
|
35
|
-
return
|
|
28
|
+
getIssueDate(): Date | null {
|
|
29
|
+
return localDateProtoToDate(this.proto.getAuctionIssueDate());
|
|
36
30
|
}
|
|
37
31
|
|
|
38
32
|
/** Auction announcement date. Null if unset. */
|
|
39
|
-
getAnnouncementDate():
|
|
40
|
-
return
|
|
33
|
+
getAnnouncementDate(): Date | null {
|
|
34
|
+
return localDateProtoToDate(this.proto.getAuctionAnnouncementDate());
|
|
41
35
|
}
|
|
42
36
|
|
|
43
37
|
/** Auction offering amount (original face value offered). Null if unset. */
|