nx_damages_gate.nx source
↩ module page · 88 lines · 4507 B
1// nx_damages_gate.nx -- PREJUDGMENT INTEREST GATE.
2// Proves the exact day count (via composed nx_sol), simple and annually-compounded interest, that compound
3// exceeds simple for the same period, the total-award composition, a full real scenario ($50k loss over an
4// exact 3-year interval at 8pct simple = $12k interest), and the fail-closed refusals (judgment before
5// accrual, negative principal/rate/days, sentinel propagation). license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0
6
7import "nx_damages_lib.nx"
8import "nx_matter_lib.nx"
9
10func dm_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
11func dm_putn(v: i64) -> i64 {
12 let t: *u8 = sys_mmap(32)
13 var o: i64 = 0
14 var m: i64 = v
15 if m < 0 { t[o] = 45 as u8; o = o + 1; m = 0 - m }
16 let d: *u8 = sys_mmap(32)
17 var k: i64 = 0
18 if m == 0 { d[0] = 48 as u8; k = 1 }
19 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
20 var i: i64 = 0
21 while i < k { t[o] = d[k - 1 - i]; o = o + 1; i = i + 1 }
22 sys_write(1, t, o)
23 return 0
24}
25func dm_ck(cnt: *i64, name: *u8, got: i64, want: i64) -> i64 {
26 if got == want {
27 cnt[0] = cnt[0] + 1
28 dm_puts(" PASS " as *u8); dm_puts(name); dm_puts(" = " as *u8); dm_putn(got); dm_puts("\n" as *u8)
29 return 1
30 }
31 cnt[1] = cnt[1] + 1
32 dm_puts(" FAIL " as *u8); dm_puts(name); dm_puts(" got " as *u8); dm_putn(got)
33 dm_puts(" want " as *u8); dm_putn(want); dm_puts("\n" as *u8)
34 return 0
35}
36
37func main(argc: i64, argv: *i64) -> i64 {
38 let cnt: *i64 = sys_mmap(16) as *i64
39 cnt[0] = 0
40 cnt[1] = 0
41
42 dm_puts("NISHI-DAMAGES-GATE (prejudgment interest: exact day count via nx_sol, simple/compound, fail-closed)\n" as *u8)
43
44 // ---- exact day count (composed from nx_sol) ----
45 dm_ck(cnt, "D1 2020-01-01 to 2022-01-01 = 731 days (leap-aware)" as *u8, dmg_days_between(2020, 1, 1, 2022, 1, 1), 731)
46
47 // ---- simple interest: $1000.00 principal at 10pct ----
48 dm_ck(cnt, "D2 simple 100000c @10pct for 365d = 10000 ($100)" as *u8, dmg_simple_interest(100000, 1000, 365), 10000)
49 dm_ck(cnt, "D3 simple 100000c @10pct for 730d = 20000 ($200)" as *u8, dmg_simple_interest(100000, 1000, 730), 20000)
50 dm_ck(cnt, "D4 simple for 0 days = 0" as *u8, dmg_simple_interest(100000, 1000, 0), 0)
51
52 // ---- annually compounded ----
53 dm_ck(cnt, "D5 compound 100000c @10pct for 2yr = 21000 interest" as *u8, dmg_compound_interest(100000, 1000, 2), 21000)
54 let comp: i64 = dmg_compound_interest(100000, 1000, 2)
55 let simp: i64 = dmg_simple_interest(100000, 1000, 730)
56 var cgt: i64 = 0
57 if comp > simp { cgt = 1 }
58 dm_ck(cnt, "D6 compound > simple over the same 2 years" as *u8, cgt, 1)
59 dm_ck(cnt, "D7 compound for 0 years = 0" as *u8, dmg_compound_interest(100000, 1000, 0), 0)
60
61 // ---- total award ----
62 dm_ck(cnt, "D8 total award = principal + interest = 120000" as *u8, dmg_total_award(100000, 20000), 120000)
63
64 // ---- *REAL SCENARIO: $50,000 loss on 2020-03-15, judgment 2023-03-15, 8pct simple ----
65 let days: i64 = dmg_days_between(2020, 3, 15, 2023, 3, 15)
66 dm_ck(cnt, "D9 exact interval 2020-03-15 to 2023-03-15 = 1095 days" as *u8, days, 1095)
67 let intr: i64 = dmg_simple_interest(5000000, 800, days)
68 dm_ck(cnt, "D10 prejudgment interest = 1200000c ($12,000 = 8pct x 3yr x $50k)" as *u8, intr, 1200000)
69 dm_ck(cnt, "D11 total award = 6200000c ($62,000)" as *u8, dmg_total_award(5000000, intr), 6200000)
70
71 // ---- *FAIL-CLOSED ----
72 dm_ck(cnt, "D12 judgment BEFORE accrual -> DMG_BAD" as *u8, dmg_days_between(2022, 1, 1, 2020, 1, 1), DMG_BAD)
73 dm_ck(cnt, "D13 negative principal -> DMG_BAD" as *u8, dmg_simple_interest(0 - 100, 1000, 365), DMG_BAD)
74 dm_ck(cnt, "D14 negative rate -> DMG_BAD" as *u8, dmg_simple_interest(100000, 0 - 5, 365), DMG_BAD)
75 dm_ck(cnt, "D15 negative days -> DMG_BAD" as *u8, dmg_simple_interest(100000, 1000, 0 - 5), DMG_BAD)
76 dm_ck(cnt, "D16 total award propagates the sentinel" as *u8, dmg_total_award(100000, DMG_BAD), DMG_BAD)
77
78 dm_puts("nx_damages_gate: pass=" as *u8); dm_putn(cnt[0])
79 dm_puts(" fail=" as *u8); dm_putn(cnt[1]); dm_puts("\n" as *u8)
80 if cnt[1] == 0 {
81 dm_puts("DAMAGES nx_damages: VERDICT=GREEN (exact prejudgment interest on a composed nx_sol day count; fail-closed)\n" as *u8)
82 sys_exit(0)
83 return 0
84 }
85 dm_puts("DAMAGES nx_damages: VERDICT=RED\n" as *u8)
86 sys_exit(1)
87 return 1
88}