@liens/cli 0.1.2 → 0.1.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/dist/bin.js
CHANGED
|
@@ -10,7 +10,7 @@ const program = new Command();
|
|
|
10
10
|
program
|
|
11
11
|
.name("lien")
|
|
12
12
|
.description("Lien — tie your loans. Create, simulate, and deploy Solana lending hooks.")
|
|
13
|
-
.version("0.1.
|
|
13
|
+
.version("0.1.3");
|
|
14
14
|
program.addCommand(createCommand());
|
|
15
15
|
program.addCommand(simulateCommand());
|
|
16
16
|
program.addCommand(deployCommand());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receipts.d.ts","sourceRoot":"","sources":["../../src/commands/receipts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"receipts.d.ts","sourceRoot":"","sources":["../../src/commands/receipts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkHpC,wBAAgB,eAAe,IAAI,OAAO,CA4FzC"}
|
|
@@ -12,13 +12,23 @@ const EVENT_KIND_LABEL = {
|
|
|
12
12
|
6: "beforeLiquidate",
|
|
13
13
|
7: "afterLiquidate",
|
|
14
14
|
};
|
|
15
|
+
// HookRan struct (v0.1.3, 8-byte discriminator prefix):
|
|
16
|
+
// composition(32) + pool(32) + event_kind(u8) + hook_program(32) +
|
|
17
|
+
// priority(u16) + flags_bits(u16) + decision(u8) + side_effect_kind(u8) +
|
|
18
|
+
// side_effect_payload(u64) + timestamp(i64)
|
|
19
|
+
// = 8 + 32 + 32 + 1 + 32 + 2 + 2 + 1 + 1 + 8 + 8 = 127 bytes
|
|
20
|
+
const HOOK_RAN_LEN = 127;
|
|
21
|
+
// CompositionExecuted struct:
|
|
22
|
+
// composition(32) + pool(32) + event_kind(u8) + position_owner(32) +
|
|
23
|
+
// adapter(u8) + hook_count_eligible(u8) + hook_count_skipped(u8) + timestamp(i64)
|
|
24
|
+
// = 8 + 32 + 32 + 1 + 32 + 1 + 1 + 1 + 8 = 116 bytes
|
|
25
|
+
const COMP_EXEC_LEN = 116;
|
|
15
26
|
function parseExecutorLogs(logs) {
|
|
16
|
-
// The executor emits
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
const out = {};
|
|
27
|
+
// The executor emits two events via Anchor's `emit!`: CompositionExecuted
|
|
28
|
+
// (aggregate, since v0.1.0) and HookRan (per eligible entry, since v0.1.3).
|
|
29
|
+
// Anchor prints them as "Program data: <base64>" lines. We pull both
|
|
30
|
+
// shapes off by length-matching; full borsh decode lives in @liens/sdk.
|
|
31
|
+
const out = { hook_runs: [] };
|
|
22
32
|
for (const line of logs) {
|
|
23
33
|
if (!line.includes("Program data:"))
|
|
24
34
|
continue;
|
|
@@ -32,23 +42,52 @@ function parseExecutorLogs(logs) {
|
|
|
32
42
|
catch {
|
|
33
43
|
continue;
|
|
34
44
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
if (buf.length === COMP_EXEC_LEN) {
|
|
46
|
+
out.composition = new PublicKey(buf.subarray(8, 40)).toBase58();
|
|
47
|
+
out.pool = new PublicKey(buf.subarray(40, 72)).toBase58();
|
|
48
|
+
out.event_kind = buf[72];
|
|
49
|
+
out.hook_count_eligible = buf[106];
|
|
50
|
+
out.hook_count_skipped = buf[107];
|
|
51
|
+
}
|
|
52
|
+
else if (buf.length === HOOK_RAN_LEN) {
|
|
53
|
+
const hookProgram = new PublicKey(buf.subarray(8 + 32 + 32 + 1, 8 + 32 + 32 + 1 + 32)).toBase58();
|
|
54
|
+
const off = 8 + 32 + 32 + 1 + 32;
|
|
55
|
+
const priority = buf.readUInt16LE(off);
|
|
56
|
+
const flags_bits = buf.readUInt16LE(off + 2);
|
|
57
|
+
const decision = buf[off + 4];
|
|
58
|
+
const side_effect_kind = buf[off + 5];
|
|
59
|
+
const side_effect_payload = buf.readBigUInt64LE(off + 6);
|
|
60
|
+
out.hook_runs.push({
|
|
61
|
+
hook_program: hookProgram,
|
|
62
|
+
priority,
|
|
63
|
+
flags_bits,
|
|
64
|
+
decision,
|
|
65
|
+
side_effect_kind,
|
|
66
|
+
side_effect_payload,
|
|
67
|
+
});
|
|
68
|
+
// also fill composition / pool / event_kind from the first HookRan if
|
|
69
|
+
// CompositionExecuted is missing (older firmwares or partial logs).
|
|
70
|
+
if (!out.composition) {
|
|
71
|
+
out.composition = new PublicKey(buf.subarray(8, 40)).toBase58();
|
|
72
|
+
out.pool = new PublicKey(buf.subarray(40, 72)).toBase58();
|
|
73
|
+
out.event_kind = buf[72];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
49
76
|
}
|
|
50
77
|
return out;
|
|
51
78
|
}
|
|
79
|
+
const DECISION_LABEL = {
|
|
80
|
+
0: "Accept",
|
|
81
|
+
1: "AcceptWith",
|
|
82
|
+
2: "Reject",
|
|
83
|
+
};
|
|
84
|
+
const SIDE_EFFECT_LABEL = {
|
|
85
|
+
0: "none",
|
|
86
|
+
1: "OverrideMaxLtvBps",
|
|
87
|
+
2: "DelayLiquidationSlots",
|
|
88
|
+
3: "OverrideRateBps",
|
|
89
|
+
4: "OpenHedge",
|
|
90
|
+
};
|
|
52
91
|
export function receiptsCommand() {
|
|
53
92
|
return new Command("receipts")
|
|
54
93
|
.description("Pull a HookRan receipt off the chain and pretty-print it. Single signature for now; per-pool window coming next.")
|
|
@@ -90,11 +129,24 @@ export function receiptsCommand() {
|
|
|
90
129
|
console.log(` event ${EVENT_KIND_LABEL[receipt.event_kind] ?? "?"} (kind=${receipt.event_kind})`);
|
|
91
130
|
console.log(` pool ${receipt.pool ?? "?"}`);
|
|
92
131
|
console.log(` composition ${receipt.composition ?? "?"}`);
|
|
93
|
-
|
|
94
|
-
|
|
132
|
+
if (receipt.hook_count_eligible !== undefined) {
|
|
133
|
+
console.log(` hooks eligible ${receipt.hook_count_eligible}`);
|
|
134
|
+
console.log(` hooks skipped ${receipt.hook_count_skipped}`);
|
|
135
|
+
}
|
|
136
|
+
if (receipt.hook_runs && receipt.hook_runs.length > 0) {
|
|
137
|
+
console.log("");
|
|
138
|
+
console.log(kleur.bold(` HookRan entries (v0.1.3) — ${receipt.hook_runs.length} eligible:`));
|
|
139
|
+
for (const [i, hr] of receipt.hook_runs.entries()) {
|
|
140
|
+
console.log(` [${i}] hook_program ${hr.hook_program}`);
|
|
141
|
+
console.log(` priority ${hr.priority}`);
|
|
142
|
+
console.log(` flags_bits 0x${hr.flags_bits.toString(16).padStart(4, "0")}`);
|
|
143
|
+
console.log(` decision ${DECISION_LABEL[hr.decision] ?? "?"} (${hr.decision})`);
|
|
144
|
+
console.log(` side_effect ${SIDE_EFFECT_LABEL[hr.side_effect_kind] ?? "?"} payload=${hr.side_effect_payload}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
95
147
|
}
|
|
96
148
|
else {
|
|
97
|
-
console.log(kleur.dim(" (no CompositionExecuted event in this transaction — was the signature an executor call?)"));
|
|
149
|
+
console.log(kleur.dim(" (no CompositionExecuted / HookRan event in this transaction — was the signature an executor call?)"));
|
|
98
150
|
}
|
|
99
151
|
// Raw logs for forensics
|
|
100
152
|
console.log("");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receipts.js","sourceRoot":"","sources":["../../src/commands/receipts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,gBAAgB,GAAG,8CAA8C,CAAC;AAExE,MAAM,gBAAgB,GAA2B;IAC/C,CAAC,EAAE,eAAe;IAClB,CAAC,EAAE,cAAc;IACjB,CAAC,EAAE,cAAc;IACjB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,YAAY;IACf,CAAC,EAAE,iBAAiB;IACpB,CAAC,EAAE,gBAAgB;CACpB,CAAC;
|
|
1
|
+
{"version":3,"file":"receipts.js","sourceRoot":"","sources":["../../src/commands/receipts.ts"],"names":[],"mappings":"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"}
|