nx_stmt_gate.nx source
↩ module page · 181 lines · 7518 B
1// nx_stmt_gate.nx -- F985 INDEPENDENT GATE: statements derived from the ledger.
2// Builds a real business on the ledger (owner capital in, cash spent, revenue earned) and proves the
3// accounting equation holds BY DERIVATION at every step -- nobody types a balance-sheet figure -- and
4// that an unresolvable account REFUSES the whole statement rather than quietly dropping it.
5// license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0
6
7import "nx_stmt_lib.nx"
8
9func sg_puts(s: *u8) -> i64 {
10 var n: i64 = 0
11 while s[n] != (0 as u8) { n = n + 1 }
12 sys_write(1, s, n)
13 return 0
14}
15func sg_putn(v: i64) -> i64 {
16 let t: *u8 = sys_mmap(32)
17 var o: i64 = 0
18 var m: i64 = v
19 if m < 0 { t[o] = 45 as u8; o = o + 1; m = 0 - m }
20 let d: *u8 = sys_mmap(32)
21 var k: i64 = 0
22 if m == 0 { d[0] = 48 as u8; k = 1 }
23 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
24 var i: i64 = 0
25 while i < k { t[o] = d[k - 1 - i]; o = o + 1; i = i + 1 }
26 sys_write(1, t, o)
27 return 0
28}
29func sg_ck(cnt: *i64, name: *u8, got: i64, want: i64) -> i64 {
30 if got == want {
31 cnt[0] = cnt[0] + 1
32 sg_puts(" PASS " as *u8); sg_puts(name); sg_puts(" = " as *u8); sg_putn(got); sg_puts("\n" as *u8)
33 return 1
34 }
35 cnt[1] = cnt[1] + 1
36 sg_puts(" FAIL " as *u8); sg_puts(name); sg_puts(" got " as *u8); sg_putn(got)
37 sg_puts(" want " as *u8); sg_putn(want); sg_puts("\n" as *u8)
38 return 0
39}
40func sg_id(tag: *u8, nonce: i64, out: *u8) -> i64 {
41 var o: i64 = mt_catcopy(out, 0, tag)
42 o = mt_catn(out, o, nonce)
43 out[o] = 0 as u8
44 return o
45}
46
47func main(argc: i64, argv: *i64) -> i64 {
48 let lp: *u8 = "knowledge/store/stmtgate-led-" as *u8
49 let cp: *u8 = "knowledge/store/stmtgate-coa-" as *u8
50 let nonce: i64 = sys_now_us()
51 let cnt: *i64 = sys_mmap(16) as *i64
52 cnt[0] = 0
53 cnt[1] = 0
54
55 let cash: *u8 = sys_mmap(64)
56 let note: *u8 = sys_mmap(64)
57 let cap: *u8 = sys_mmap(64)
58 let rev: *u8 = sys_mmap(64)
59 let exp: *u8 = sys_mmap(64)
60 let ghost: *u8 = sys_mmap(64)
61 sg_id("cash_" as *u8, nonce, cash)
62 sg_id("note_" as *u8, nonce, note)
63 sg_id("capital_" as *u8, nonce, cap)
64 sg_id("revenue_" as *u8, nonce, rev)
65 sg_id("rent_" as *u8, nonce, exp)
66 sg_id("ghost_" as *u8, nonce, ghost)
67
68 let t1: *u8 = sys_mmap(64)
69 let t2: *u8 = sys_mmap(64)
70 let t3: *u8 = sys_mmap(64)
71 let t4: *u8 = sys_mmap(64)
72 sg_id("s1_" as *u8, nonce, t1)
73 sg_id("s2_" as *u8, nonce, t2)
74 sg_id("s3_" as *u8, nonce, t3)
75 sg_id("s4_" as *u8, nonce, t4)
76
77 // the data-driven side map
78 coa_type_put(cp, "asset" as *u8, "debit" as *u8)
79 coa_type_put(cp, "liability" as *u8, "credit" as *u8)
80 coa_type_put(cp, "equity" as *u8, "credit" as *u8)
81 coa_type_put(cp, "revenue" as *u8, "credit" as *u8)
82 coa_type_put(cp, "expense" as *u8, "debit" as *u8)
83 coa_put(cp, cash, "asset" as *u8)
84 coa_put(cp, note, "liability" as *u8)
85 coa_put(cp, cap, "equity" as *u8)
86 coa_put(cp, rev, "revenue" as *u8)
87 coa_put(cp, exp, "expense" as *u8)
88
89 let bs: *i64 = sys_mmap(8 * 8) as *i64
90 let inc: *i64 = sys_mmap(8 * 8) as *i64
91 let tb: *i64 = sys_mmap(8 * 8) as *i64
92
93 let accts: *i64 = sys_mmap(8 * 5) as *i64
94 accts[0] = cash as i64
95 accts[1] = note as i64
96 accts[2] = cap as i64
97 accts[3] = rev as i64
98 accts[4] = exp as i64
99
100 sg_puts("NISHI-STMT-GATE (F985 statements DERIVED from the ledger, never typed)\n" as *u8)
101
102 // 1) owner puts in $5000.00 capital -> debit cash, credit capital
103 led_xfer(lp, t1, cash, cap, 500000, "posted" as *u8)
104 // 2) borrow $2000.00 on a note -> debit cash, credit note payable
105 led_xfer(lp, t2, cash, note, 200000, "posted" as *u8)
106
107 // ---- S1: the accounting equation holds with ZERO figures typed ----
108 sg_ck(cnt, "S1 balance sheet derived AND balanced (1)" as *u8,
109 stmt_balance_sheet(lp, cp, accts, 5, bs), 1)
110 sg_ck(cnt, "S1a assets $7000.00" as *u8, bs[0], 700000)
111 sg_ck(cnt, "S1b liabilities $2000.00" as *u8, bs[1], 200000)
112 sg_ck(cnt, "S1c equity $5000.00" as *u8, bs[2], 500000)
113 sg_ck(cnt, "S1d variance assets-(liab+equity)" as *u8, bs[3], 0)
114
115 // 3) earn $1500.00 revenue in cash -> debit cash, credit revenue
116 led_xfer(lp, t3, cash, rev, 150000, "posted" as *u8)
117 // 4) pay $400.00 rent -> debit rent expense, credit cash
118 led_xfer(lp, t4, exp, cash, 40000, "posted" as *u8)
119
120 // ---- S2: income statement derived ----
121 sg_ck(cnt, "S2 income statement derived (1)" as *u8, stmt_income(lp, cp, accts, 5, inc), 1)
122 sg_ck(cnt, "S2a revenue $1500.00" as *u8, inc[0], 150000)
123 sg_ck(cnt, "S2b expenses $400.00" as *u8, inc[1], 40000)
124 sg_ck(cnt, "S2c NET INCOME $1100.00" as *u8, inc[2], 110000)
125
126 // ---- S3: cash is the sum of every cash movement, derived ----
127 let one: *i64 = sys_mmap(16) as *i64
128 coa_natural(lp, cp, cash, one)
129 sg_ck(cnt, "S3 cash = 5000+2000+1500-400 = $8100.00" as *u8, one[0], 810000)
130
131 // ---- S4: THE LINK. Assets now exceed liabilities+equity by EXACTLY net income, ----
132 // because revenue/expense have not been closed to equity yet. This is the real
133 // articulation between the two statements, and it is DERIVED, not asserted.
134 stmt_balance_sheet(lp, cp, accts, 5, bs)
135 sg_ck(cnt, "S4 pre-close variance EQUALS net income (statement articulation)" as *u8,
136 bs[3], inc[2])
137
138 // ---- S5: close the books -- move net income into equity, equation returns to 0 ----
139 let tc: *u8 = sys_mmap(64)
140 sg_id("close_" as *u8, nonce, tc)
141 led_xfer(lp, tc, rev, cap, 150000, "posted" as *u8)
142 let tc2: *u8 = sys_mmap(64)
143 sg_id("close2_" as *u8, nonce, tc2)
144 led_xfer(lp, tc2, cap, exp, 40000, "posted" as *u8)
145 sg_ck(cnt, "S5 after closing entries the equation BALANCES again" as *u8,
146 stmt_balance_sheet(lp, cp, accts, 5, bs), 1)
147 sg_ck(cnt, "S5a variance back to zero" as *u8, bs[3], 0)
148 sg_ck(cnt, "S5b equity absorbed net income: $5000 + $1100" as *u8, bs[2], 610000)
149
150 // ---- S6: trial balance -- total debits == total credits across the book ----
151 sg_ck(cnt, "S6 trial balance: debits == credits (1)" as *u8,
152 stmt_trial_balance(lp, accts, 5, tb), 1)
153
154 // ---- S7: FAIL-CLOSED. An unresolvable account REFUSES the whole statement. ----
155 // A balance sheet that silently drops an account it did not understand is the worst
156 // possible failure: authoritative-looking and wrong.
157 let accts2: *i64 = sys_mmap(8 * 6) as *i64
158 accts2[0] = cash as i64
159 accts2[1] = note as i64
160 accts2[2] = cap as i64
161 accts2[3] = rev as i64
162 accts2[4] = exp as i64
163 accts2[5] = ghost as i64
164 bs[3] = 999999
165 sg_ck(cnt, "S7 unregistered account REFUSES the balance sheet (0)" as *u8,
166 stmt_balance_sheet(lp, cp, accts2, 6, bs), 0)
167 sg_ck(cnt, "S7a refusal wrote NO variance (not silently dropped)" as *u8, bs[3], 999999)
168 sg_ck(cnt, "S7b unregistered account REFUSES the income statement too" as *u8,
169 stmt_income(lp, cp, accts2, 6, inc), 0)
170
171 sg_puts("nx_stmt_gate: pass=" as *u8); sg_putn(cnt[0])
172 sg_puts(" fail=" as *u8); sg_putn(cnt[1]); sg_puts("\n" as *u8)
173 if cnt[1] == 0 {
174 sg_puts("F985 nx_stmt: VERDICT=GREEN (equation derived not typed, articulation proven, fail-closed on omission)\n" as *u8)
175 sys_exit(0)
176 return 0
177 }
178 sg_puts("F985 nx_stmt: VERDICT=RED\n" as *u8)
179 sys_exit(1)
180 return 1
181}