@voltr/vault-sdk 2.0.0 → 2.1.0

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.
@@ -0,0 +1,33 @@
1
+ import { type AcceptProtocolAdminEvent, type AcceptVaultAdminEvent, type AddAdaptorEvent, type CalibrateHighWaterMarkEvent, type CalibrateHighWaterMarkUnsafeEvent, type CancelRequestWithdrawVaultEvent, type CloseStrategyEvent, type DepositStrategyEvent, type DepositVaultEvent, type DirectWithdrawStrategyEvent, type HarvestFeeEvent, type InitializeDirectWithdrawStrategyEvent, type InitializeStrategyEvent, type InitializeVaultEvent, type InitProtocolEvent, type InstantWithdrawStrategyEvent, type InstantWithdrawVaultEvent, type RemoveAdaptorEvent, type RequestWithdrawVaultEvent, type UpdateProtocolEvent, type UpdateVaultConfigEvent, type UpdateVaultEvent, type UpdateVaultProtocolFeeEvent, type WithdrawStrategyEvent, type WithdrawVaultEvent } from "../generated/types";
2
+ /**
3
+ * Discriminated union of every Voltr Vault event Codama can decode. The first
4
+ * 8 bytes of each Anchor `emit!` payload identify the variant via
5
+ * `sha256("event:<EventName>")[..8]`; the remainder is the borsh-encoded
6
+ * payload for the named struct.
7
+ */
8
+ export type ParsedVoltrEvent = ParsedEventOf<"AcceptProtocolAdminEvent", AcceptProtocolAdminEvent> | ParsedEventOf<"AcceptVaultAdminEvent", AcceptVaultAdminEvent> | ParsedEventOf<"AddAdaptorEvent", AddAdaptorEvent> | ParsedEventOf<"CalibrateHighWaterMarkEvent", CalibrateHighWaterMarkEvent> | ParsedEventOf<"CalibrateHighWaterMarkUnsafeEvent", CalibrateHighWaterMarkUnsafeEvent> | ParsedEventOf<"CancelRequestWithdrawVaultEvent", CancelRequestWithdrawVaultEvent> | ParsedEventOf<"CloseStrategyEvent", CloseStrategyEvent> | ParsedEventOf<"DepositStrategyEvent", DepositStrategyEvent> | ParsedEventOf<"DepositVaultEvent", DepositVaultEvent> | ParsedEventOf<"DirectWithdrawStrategyEvent", DirectWithdrawStrategyEvent> | ParsedEventOf<"HarvestFeeEvent", HarvestFeeEvent> | ParsedEventOf<"InitProtocolEvent", InitProtocolEvent> | ParsedEventOf<"InitializeDirectWithdrawStrategyEvent", InitializeDirectWithdrawStrategyEvent> | ParsedEventOf<"InitializeStrategyEvent", InitializeStrategyEvent> | ParsedEventOf<"InitializeVaultEvent", InitializeVaultEvent> | ParsedEventOf<"InstantWithdrawStrategyEvent", InstantWithdrawStrategyEvent> | ParsedEventOf<"InstantWithdrawVaultEvent", InstantWithdrawVaultEvent> | ParsedEventOf<"RemoveAdaptorEvent", RemoveAdaptorEvent> | ParsedEventOf<"RequestWithdrawVaultEvent", RequestWithdrawVaultEvent> | ParsedEventOf<"UpdateProtocolEvent", UpdateProtocolEvent> | ParsedEventOf<"UpdateVaultConfigEvent", UpdateVaultConfigEvent> | ParsedEventOf<"UpdateVaultEvent", UpdateVaultEvent> | ParsedEventOf<"UpdateVaultProtocolFeeEvent", UpdateVaultProtocolFeeEvent> | ParsedEventOf<"WithdrawStrategyEvent", WithdrawStrategyEvent> | ParsedEventOf<"WithdrawVaultEvent", WithdrawVaultEvent>;
9
+ type ParsedEventOf<Name extends string, Payload> = {
10
+ name: Name;
11
+ payload: Payload;
12
+ /** Top-level instruction index this event was emitted under. */
13
+ ixIndex: number;
14
+ /** Sequential index of this event within the transaction (0-based). */
15
+ eventIndex: number;
16
+ };
17
+ /**
18
+ * Minimal structural shape of a transaction `meta` object — narrow enough
19
+ * that callers can pass `meta` from any RPC client (web3.js legacy,
20
+ * @solana/kit, or a hand-rolled fixture) without conversion.
21
+ */
22
+ export type TransactionMetaForEvents = {
23
+ logMessages?: readonly string[] | null;
24
+ };
25
+ /**
26
+ * Walk a transaction's `meta.logMessages`, decode every Voltr event emitted
27
+ * via Anchor's `emit!`, and return them in emission order. Lines whose
28
+ * discriminator doesn't belong to a Voltr event are skipped, so logs from
29
+ * other programs in the same tx are safe to pass through.
30
+ */
31
+ export declare function parseTransactionEvents(meta: TransactionMetaForEvents | null | undefined): ParsedVoltrEvent[];
32
+ export {};
33
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/extensions/events.ts"],"names":[],"mappings":"AAEA,OAAO,EA0BL,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,2BAA2B,EAChC,KAAK,iCAAiC,EACtC,KAAK,+BAA+B,EACpC,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,EAChC,KAAK,eAAe,EACpB,KAAK,qCAAqC,EAC1C,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC;AAE5B;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GACxB,aAAa,CAAC,0BAA0B,EAAE,wBAAwB,CAAC,GACnE,aAAa,CAAC,uBAAuB,EAAE,qBAAqB,CAAC,GAC7D,aAAa,CAAC,iBAAiB,EAAE,eAAe,CAAC,GACjD,aAAa,CAAC,6BAA6B,EAAE,2BAA2B,CAAC,GACzE,aAAa,CACX,mCAAmC,EACnC,iCAAiC,CAClC,GACD,aAAa,CACX,iCAAiC,EACjC,+BAA+B,CAChC,GACD,aAAa,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,GACvD,aAAa,CAAC,sBAAsB,EAAE,oBAAoB,CAAC,GAC3D,aAAa,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,GACrD,aAAa,CAAC,6BAA6B,EAAE,2BAA2B,CAAC,GACzE,aAAa,CAAC,iBAAiB,EAAE,eAAe,CAAC,GACjD,aAAa,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,GACrD,aAAa,CACX,uCAAuC,EACvC,qCAAqC,CACtC,GACD,aAAa,CAAC,yBAAyB,EAAE,uBAAuB,CAAC,GACjE,aAAa,CAAC,sBAAsB,EAAE,oBAAoB,CAAC,GAC3D,aAAa,CAAC,8BAA8B,EAAE,4BAA4B,CAAC,GAC3E,aAAa,CAAC,2BAA2B,EAAE,yBAAyB,CAAC,GACrE,aAAa,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,GACvD,aAAa,CAAC,2BAA2B,EAAE,yBAAyB,CAAC,GACrE,aAAa,CAAC,qBAAqB,EAAE,mBAAmB,CAAC,GACzD,aAAa,CAAC,wBAAwB,EAAE,sBAAsB,CAAC,GAC/D,aAAa,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,GACnD,aAAa,CAAC,6BAA6B,EAAE,2BAA2B,CAAC,GACzE,aAAa,CAAC,uBAAuB,EAAE,qBAAqB,CAAC,GAC7D,aAAa,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;AAE5D,KAAK,aAAa,CAAC,IAAI,SAAS,MAAM,EAAE,OAAO,IAAI;IACjD,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CACxC,CAAC;AAwJF;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,wBAAwB,GAAG,IAAI,GAAG,SAAS,GAChD,gBAAgB,EAAE,CA6CpB"}
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseTransactionEvents = parseTransactionEvents;
4
+ const kit_1 = require("@solana/kit");
5
+ const types_1 = require("../generated/types");
6
+ // Discriminators are sha256("event:<EventName>")[..8] — stable, fixed by the
7
+ // Anchor IDL. Hardcoded so this module has no runtime hashing dependency.
8
+ const EVENT_TABLE = [
9
+ [
10
+ "AcceptProtocolAdminEvent",
11
+ [0xc4, 0x5d, 0xad, 0xfd, 0xaf, 0x8c, 0x79, 0x20],
12
+ (0, types_1.getAcceptProtocolAdminEventDecoder)(),
13
+ ],
14
+ [
15
+ "AcceptVaultAdminEvent",
16
+ [0x8c, 0xff, 0x1d, 0x44, 0x10, 0xc2, 0xfb, 0x23],
17
+ (0, types_1.getAcceptVaultAdminEventDecoder)(),
18
+ ],
19
+ [
20
+ "AddAdaptorEvent",
21
+ [0x18, 0xb5, 0xc9, 0x94, 0xf0, 0xb7, 0xeb, 0x0c],
22
+ (0, types_1.getAddAdaptorEventDecoder)(),
23
+ ],
24
+ [
25
+ "CalibrateHighWaterMarkEvent",
26
+ [0x8c, 0x4c, 0xc3, 0x90, 0xb4, 0xb2, 0x00, 0x9b],
27
+ (0, types_1.getCalibrateHighWaterMarkEventDecoder)(),
28
+ ],
29
+ [
30
+ "CalibrateHighWaterMarkUnsafeEvent",
31
+ [0xcd, 0x4c, 0xa9, 0xff, 0x25, 0xe4, 0x41, 0x82],
32
+ (0, types_1.getCalibrateHighWaterMarkUnsafeEventDecoder)(),
33
+ ],
34
+ [
35
+ "CancelRequestWithdrawVaultEvent",
36
+ [0x2e, 0xa5, 0x18, 0x72, 0x01, 0x50, 0xcd, 0x88],
37
+ (0, types_1.getCancelRequestWithdrawVaultEventDecoder)(),
38
+ ],
39
+ [
40
+ "CloseStrategyEvent",
41
+ [0xd5, 0x5f, 0xdb, 0xa1, 0x11, 0xd0, 0x5d, 0xff],
42
+ (0, types_1.getCloseStrategyEventDecoder)(),
43
+ ],
44
+ [
45
+ "DepositStrategyEvent",
46
+ [0xca, 0xc9, 0x76, 0x31, 0x1d, 0xb4, 0x74, 0xaa],
47
+ (0, types_1.getDepositStrategyEventDecoder)(),
48
+ ],
49
+ [
50
+ "DepositVaultEvent",
51
+ [0x0b, 0x0f, 0x07, 0x5c, 0x96, 0x64, 0xa5, 0xe8],
52
+ (0, types_1.getDepositVaultEventDecoder)(),
53
+ ],
54
+ [
55
+ "DirectWithdrawStrategyEvent",
56
+ [0x71, 0xca, 0x97, 0x7c, 0x89, 0xff, 0x99, 0x65],
57
+ (0, types_1.getDirectWithdrawStrategyEventDecoder)(),
58
+ ],
59
+ [
60
+ "HarvestFeeEvent",
61
+ [0x45, 0x30, 0xc0, 0x17, 0xe8, 0x16, 0x17, 0x1e],
62
+ (0, types_1.getHarvestFeeEventDecoder)(),
63
+ ],
64
+ [
65
+ "InitProtocolEvent",
66
+ [0x0d, 0x51, 0xb7, 0x84, 0x58, 0x2b, 0xca, 0xd5],
67
+ (0, types_1.getInitProtocolEventDecoder)(),
68
+ ],
69
+ [
70
+ "InitializeDirectWithdrawStrategyEvent",
71
+ [0xa9, 0x16, 0x39, 0x08, 0x0f, 0x49, 0xff, 0x73],
72
+ (0, types_1.getInitializeDirectWithdrawStrategyEventDecoder)(),
73
+ ],
74
+ [
75
+ "InitializeStrategyEvent",
76
+ [0x1e, 0xe9, 0xd3, 0xf9, 0x53, 0xbc, 0xea, 0x98],
77
+ (0, types_1.getInitializeStrategyEventDecoder)(),
78
+ ],
79
+ [
80
+ "InitializeVaultEvent",
81
+ [0xb3, 0x4b, 0x32, 0xa1, 0xbf, 0x1c, 0xf5, 0x6b],
82
+ (0, types_1.getInitializeVaultEventDecoder)(),
83
+ ],
84
+ [
85
+ "InstantWithdrawStrategyEvent",
86
+ [0xdd, 0x17, 0x0c, 0xd7, 0x64, 0x2a, 0x61, 0x95],
87
+ (0, types_1.getInstantWithdrawStrategyEventDecoder)(),
88
+ ],
89
+ [
90
+ "InstantWithdrawVaultEvent",
91
+ [0x2e, 0x39, 0x3c, 0x14, 0x06, 0xa0, 0xa4, 0xf7],
92
+ (0, types_1.getInstantWithdrawVaultEventDecoder)(),
93
+ ],
94
+ [
95
+ "RemoveAdaptorEvent",
96
+ [0x9b, 0xb2, 0x02, 0x1d, 0xf5, 0x56, 0xf6, 0x99],
97
+ (0, types_1.getRemoveAdaptorEventDecoder)(),
98
+ ],
99
+ [
100
+ "RequestWithdrawVaultEvent",
101
+ [0x3b, 0x5e, 0x1a, 0x26, 0x2f, 0x83, 0x9e, 0xa2],
102
+ (0, types_1.getRequestWithdrawVaultEventDecoder)(),
103
+ ],
104
+ [
105
+ "UpdateProtocolEvent",
106
+ [0x0e, 0xe3, 0xcc, 0xd9, 0x3e, 0x2e, 0xf1, 0xed],
107
+ (0, types_1.getUpdateProtocolEventDecoder)(),
108
+ ],
109
+ [
110
+ "UpdateVaultConfigEvent",
111
+ [0x3d, 0x5c, 0xce, 0x97, 0xa2, 0x28, 0xed, 0x67],
112
+ (0, types_1.getUpdateVaultConfigEventDecoder)(),
113
+ ],
114
+ [
115
+ "UpdateVaultEvent",
116
+ [0x7b, 0x1f, 0x1b, 0xbd, 0x66, 0x01, 0x79, 0x39],
117
+ (0, types_1.getUpdateVaultEventDecoder)(),
118
+ ],
119
+ [
120
+ "UpdateVaultProtocolFeeEvent",
121
+ [0xac, 0x01, 0xad, 0xe6, 0xe4, 0x3d, 0x4d, 0xf4],
122
+ (0, types_1.getUpdateVaultProtocolFeeEventDecoder)(),
123
+ ],
124
+ [
125
+ "WithdrawStrategyEvent",
126
+ [0x70, 0x2d, 0x10, 0xac, 0xaa, 0x21, 0x16, 0xd4],
127
+ (0, types_1.getWithdrawStrategyEventDecoder)(),
128
+ ],
129
+ [
130
+ "WithdrawVaultEvent",
131
+ [0xc4, 0x7b, 0x4f, 0xd7, 0x04, 0xd6, 0x14, 0xc5],
132
+ (0, types_1.getWithdrawVaultEventDecoder)(),
133
+ ],
134
+ ];
135
+ const DISPATCH = new Map(EVENT_TABLE.map(([name, disc, decoder]) => [
136
+ discriminatorKey(disc),
137
+ { name, decoder },
138
+ ]));
139
+ const PROGRAM_DATA_PREFIX = "Program data: ";
140
+ // Top-level instructions log "Program <id> invoke [1]" — depth >1 is a CPI.
141
+ const TOP_LEVEL_INVOKE_RE = /^Program \S+ invoke \[1\]$/;
142
+ const base64Encoder = (0, kit_1.getBase64Encoder)();
143
+ /**
144
+ * Walk a transaction's `meta.logMessages`, decode every Voltr event emitted
145
+ * via Anchor's `emit!`, and return them in emission order. Lines whose
146
+ * discriminator doesn't belong to a Voltr event are skipped, so logs from
147
+ * other programs in the same tx are safe to pass through.
148
+ */
149
+ function parseTransactionEvents(meta) {
150
+ const logs = meta?.logMessages;
151
+ if (!logs || logs.length === 0)
152
+ return [];
153
+ const out = [];
154
+ let ixIndex = -1;
155
+ let eventIndex = 0;
156
+ for (const line of logs) {
157
+ if (TOP_LEVEL_INVOKE_RE.test(line)) {
158
+ ixIndex++;
159
+ continue;
160
+ }
161
+ if (!line.startsWith(PROGRAM_DATA_PREFIX))
162
+ continue;
163
+ const b64 = line.slice(PROGRAM_DATA_PREFIX.length);
164
+ let bytes;
165
+ try {
166
+ bytes = base64Encoder.encode(b64);
167
+ }
168
+ catch {
169
+ continue;
170
+ }
171
+ if (bytes.length < 8)
172
+ continue;
173
+ const entry = DISPATCH.get(discriminatorKey(bytes.subarray(0, 8)));
174
+ if (!entry)
175
+ continue;
176
+ // The discriminator is 8 bytes of sha256, so spurious matches from other
177
+ // programs are unlikely but possible — and corrupt fixtures happen too.
178
+ // Skip the line rather than aborting the whole parse if borsh decode fails.
179
+ let payload;
180
+ try {
181
+ payload = entry.decoder.decode(bytes, 8);
182
+ }
183
+ catch {
184
+ continue;
185
+ }
186
+ out.push({
187
+ name: entry.name,
188
+ payload,
189
+ ixIndex: ixIndex < 0 ? 0 : ixIndex,
190
+ eventIndex: eventIndex++,
191
+ });
192
+ }
193
+ return out;
194
+ }
195
+ function discriminatorKey(disc) {
196
+ let s = "";
197
+ for (let i = 0; i < disc.length; i++) {
198
+ const b = disc[i] & 0xff;
199
+ s += (b < 16 ? "0" : "") + b.toString(16);
200
+ }
201
+ return s;
202
+ }
203
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/extensions/events.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export * from "./batchFetchers";
2
2
  export * from "./decimal";
3
+ export * from "./events";
3
4
  export * from "./fees";
4
5
  export * from "./lpEconomics";
5
6
  export * from "./math";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,OAAO,CAAC;AACtB,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,OAAO,CAAC;AACtB,cAAc,eAAe,CAAC"}
@@ -16,6 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./batchFetchers"), exports);
18
18
  __exportStar(require("./decimal"), exports);
19
+ __exportStar(require("./events"), exports);
19
20
  __exportStar(require("./fees"), exports);
20
21
  __exportStar(require("./lpEconomics"), exports);
21
22
  __exportStar(require("./math"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,4CAA0B;AAC1B,yCAAuB;AACvB,gDAA8B;AAC9B,yCAAuB;AACvB,gDAA8B;AAC9B,6CAA2B;AAC3B,wCAAsB;AACtB,gDAA8B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,4CAA0B;AAC1B,2CAAyB;AACzB,yCAAuB;AACvB,gDAA8B;AAC9B,yCAAuB;AACvB,gDAA8B;AAC9B,6CAA2B;AAC3B,wCAAsB;AACtB,gDAA8B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voltr/vault-sdk",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "Codama-generated TypeScript client for the Voltr Vault program",
5
5
  "license": "MIT",
6
6
  "author": "voltr",
@@ -0,0 +1,328 @@
1
+ import { getBase64Encoder, type Decoder } from "@solana/kit";
2
+
3
+ import {
4
+ getAcceptProtocolAdminEventDecoder,
5
+ getAcceptVaultAdminEventDecoder,
6
+ getAddAdaptorEventDecoder,
7
+ getCalibrateHighWaterMarkEventDecoder,
8
+ getCalibrateHighWaterMarkUnsafeEventDecoder,
9
+ getCancelRequestWithdrawVaultEventDecoder,
10
+ getCloseStrategyEventDecoder,
11
+ getDepositStrategyEventDecoder,
12
+ getDepositVaultEventDecoder,
13
+ getDirectWithdrawStrategyEventDecoder,
14
+ getHarvestFeeEventDecoder,
15
+ getInitializeDirectWithdrawStrategyEventDecoder,
16
+ getInitializeStrategyEventDecoder,
17
+ getInitializeVaultEventDecoder,
18
+ getInitProtocolEventDecoder,
19
+ getInstantWithdrawStrategyEventDecoder,
20
+ getInstantWithdrawVaultEventDecoder,
21
+ getRemoveAdaptorEventDecoder,
22
+ getRequestWithdrawVaultEventDecoder,
23
+ getUpdateProtocolEventDecoder,
24
+ getUpdateVaultConfigEventDecoder,
25
+ getUpdateVaultEventDecoder,
26
+ getUpdateVaultProtocolFeeEventDecoder,
27
+ getWithdrawStrategyEventDecoder,
28
+ getWithdrawVaultEventDecoder,
29
+ type AcceptProtocolAdminEvent,
30
+ type AcceptVaultAdminEvent,
31
+ type AddAdaptorEvent,
32
+ type CalibrateHighWaterMarkEvent,
33
+ type CalibrateHighWaterMarkUnsafeEvent,
34
+ type CancelRequestWithdrawVaultEvent,
35
+ type CloseStrategyEvent,
36
+ type DepositStrategyEvent,
37
+ type DepositVaultEvent,
38
+ type DirectWithdrawStrategyEvent,
39
+ type HarvestFeeEvent,
40
+ type InitializeDirectWithdrawStrategyEvent,
41
+ type InitializeStrategyEvent,
42
+ type InitializeVaultEvent,
43
+ type InitProtocolEvent,
44
+ type InstantWithdrawStrategyEvent,
45
+ type InstantWithdrawVaultEvent,
46
+ type RemoveAdaptorEvent,
47
+ type RequestWithdrawVaultEvent,
48
+ type UpdateProtocolEvent,
49
+ type UpdateVaultConfigEvent,
50
+ type UpdateVaultEvent,
51
+ type UpdateVaultProtocolFeeEvent,
52
+ type WithdrawStrategyEvent,
53
+ type WithdrawVaultEvent,
54
+ } from "../generated/types";
55
+
56
+ /**
57
+ * Discriminated union of every Voltr Vault event Codama can decode. The first
58
+ * 8 bytes of each Anchor `emit!` payload identify the variant via
59
+ * `sha256("event:<EventName>")[..8]`; the remainder is the borsh-encoded
60
+ * payload for the named struct.
61
+ */
62
+ export type ParsedVoltrEvent =
63
+ | ParsedEventOf<"AcceptProtocolAdminEvent", AcceptProtocolAdminEvent>
64
+ | ParsedEventOf<"AcceptVaultAdminEvent", AcceptVaultAdminEvent>
65
+ | ParsedEventOf<"AddAdaptorEvent", AddAdaptorEvent>
66
+ | ParsedEventOf<"CalibrateHighWaterMarkEvent", CalibrateHighWaterMarkEvent>
67
+ | ParsedEventOf<
68
+ "CalibrateHighWaterMarkUnsafeEvent",
69
+ CalibrateHighWaterMarkUnsafeEvent
70
+ >
71
+ | ParsedEventOf<
72
+ "CancelRequestWithdrawVaultEvent",
73
+ CancelRequestWithdrawVaultEvent
74
+ >
75
+ | ParsedEventOf<"CloseStrategyEvent", CloseStrategyEvent>
76
+ | ParsedEventOf<"DepositStrategyEvent", DepositStrategyEvent>
77
+ | ParsedEventOf<"DepositVaultEvent", DepositVaultEvent>
78
+ | ParsedEventOf<"DirectWithdrawStrategyEvent", DirectWithdrawStrategyEvent>
79
+ | ParsedEventOf<"HarvestFeeEvent", HarvestFeeEvent>
80
+ | ParsedEventOf<"InitProtocolEvent", InitProtocolEvent>
81
+ | ParsedEventOf<
82
+ "InitializeDirectWithdrawStrategyEvent",
83
+ InitializeDirectWithdrawStrategyEvent
84
+ >
85
+ | ParsedEventOf<"InitializeStrategyEvent", InitializeStrategyEvent>
86
+ | ParsedEventOf<"InitializeVaultEvent", InitializeVaultEvent>
87
+ | ParsedEventOf<"InstantWithdrawStrategyEvent", InstantWithdrawStrategyEvent>
88
+ | ParsedEventOf<"InstantWithdrawVaultEvent", InstantWithdrawVaultEvent>
89
+ | ParsedEventOf<"RemoveAdaptorEvent", RemoveAdaptorEvent>
90
+ | ParsedEventOf<"RequestWithdrawVaultEvent", RequestWithdrawVaultEvent>
91
+ | ParsedEventOf<"UpdateProtocolEvent", UpdateProtocolEvent>
92
+ | ParsedEventOf<"UpdateVaultConfigEvent", UpdateVaultConfigEvent>
93
+ | ParsedEventOf<"UpdateVaultEvent", UpdateVaultEvent>
94
+ | ParsedEventOf<"UpdateVaultProtocolFeeEvent", UpdateVaultProtocolFeeEvent>
95
+ | ParsedEventOf<"WithdrawStrategyEvent", WithdrawStrategyEvent>
96
+ | ParsedEventOf<"WithdrawVaultEvent", WithdrawVaultEvent>;
97
+
98
+ type ParsedEventOf<Name extends string, Payload> = {
99
+ name: Name;
100
+ payload: Payload;
101
+ /** Top-level instruction index this event was emitted under. */
102
+ ixIndex: number;
103
+ /** Sequential index of this event within the transaction (0-based). */
104
+ eventIndex: number;
105
+ };
106
+
107
+ /**
108
+ * Minimal structural shape of a transaction `meta` object — narrow enough
109
+ * that callers can pass `meta` from any RPC client (web3.js legacy,
110
+ * @solana/kit, or a hand-rolled fixture) without conversion.
111
+ */
112
+ export type TransactionMetaForEvents = {
113
+ logMessages?: readonly string[] | null;
114
+ };
115
+
116
+ type DispatchEntry = {
117
+ name: ParsedVoltrEvent["name"];
118
+ decoder: Decoder<unknown>;
119
+ };
120
+
121
+ // Discriminators are sha256("event:<EventName>")[..8] — stable, fixed by the
122
+ // Anchor IDL. Hardcoded so this module has no runtime hashing dependency.
123
+ const EVENT_TABLE: ReadonlyArray<
124
+ readonly [ParsedVoltrEvent["name"], readonly number[], Decoder<unknown>]
125
+ > = [
126
+ [
127
+ "AcceptProtocolAdminEvent",
128
+ [0xc4, 0x5d, 0xad, 0xfd, 0xaf, 0x8c, 0x79, 0x20],
129
+ getAcceptProtocolAdminEventDecoder(),
130
+ ],
131
+ [
132
+ "AcceptVaultAdminEvent",
133
+ [0x8c, 0xff, 0x1d, 0x44, 0x10, 0xc2, 0xfb, 0x23],
134
+ getAcceptVaultAdminEventDecoder(),
135
+ ],
136
+ [
137
+ "AddAdaptorEvent",
138
+ [0x18, 0xb5, 0xc9, 0x94, 0xf0, 0xb7, 0xeb, 0x0c],
139
+ getAddAdaptorEventDecoder(),
140
+ ],
141
+ [
142
+ "CalibrateHighWaterMarkEvent",
143
+ [0x8c, 0x4c, 0xc3, 0x90, 0xb4, 0xb2, 0x00, 0x9b],
144
+ getCalibrateHighWaterMarkEventDecoder(),
145
+ ],
146
+ [
147
+ "CalibrateHighWaterMarkUnsafeEvent",
148
+ [0xcd, 0x4c, 0xa9, 0xff, 0x25, 0xe4, 0x41, 0x82],
149
+ getCalibrateHighWaterMarkUnsafeEventDecoder(),
150
+ ],
151
+ [
152
+ "CancelRequestWithdrawVaultEvent",
153
+ [0x2e, 0xa5, 0x18, 0x72, 0x01, 0x50, 0xcd, 0x88],
154
+ getCancelRequestWithdrawVaultEventDecoder(),
155
+ ],
156
+ [
157
+ "CloseStrategyEvent",
158
+ [0xd5, 0x5f, 0xdb, 0xa1, 0x11, 0xd0, 0x5d, 0xff],
159
+ getCloseStrategyEventDecoder(),
160
+ ],
161
+ [
162
+ "DepositStrategyEvent",
163
+ [0xca, 0xc9, 0x76, 0x31, 0x1d, 0xb4, 0x74, 0xaa],
164
+ getDepositStrategyEventDecoder(),
165
+ ],
166
+ [
167
+ "DepositVaultEvent",
168
+ [0x0b, 0x0f, 0x07, 0x5c, 0x96, 0x64, 0xa5, 0xe8],
169
+ getDepositVaultEventDecoder(),
170
+ ],
171
+ [
172
+ "DirectWithdrawStrategyEvent",
173
+ [0x71, 0xca, 0x97, 0x7c, 0x89, 0xff, 0x99, 0x65],
174
+ getDirectWithdrawStrategyEventDecoder(),
175
+ ],
176
+ [
177
+ "HarvestFeeEvent",
178
+ [0x45, 0x30, 0xc0, 0x17, 0xe8, 0x16, 0x17, 0x1e],
179
+ getHarvestFeeEventDecoder(),
180
+ ],
181
+ [
182
+ "InitProtocolEvent",
183
+ [0x0d, 0x51, 0xb7, 0x84, 0x58, 0x2b, 0xca, 0xd5],
184
+ getInitProtocolEventDecoder(),
185
+ ],
186
+ [
187
+ "InitializeDirectWithdrawStrategyEvent",
188
+ [0xa9, 0x16, 0x39, 0x08, 0x0f, 0x49, 0xff, 0x73],
189
+ getInitializeDirectWithdrawStrategyEventDecoder(),
190
+ ],
191
+ [
192
+ "InitializeStrategyEvent",
193
+ [0x1e, 0xe9, 0xd3, 0xf9, 0x53, 0xbc, 0xea, 0x98],
194
+ getInitializeStrategyEventDecoder(),
195
+ ],
196
+ [
197
+ "InitializeVaultEvent",
198
+ [0xb3, 0x4b, 0x32, 0xa1, 0xbf, 0x1c, 0xf5, 0x6b],
199
+ getInitializeVaultEventDecoder(),
200
+ ],
201
+ [
202
+ "InstantWithdrawStrategyEvent",
203
+ [0xdd, 0x17, 0x0c, 0xd7, 0x64, 0x2a, 0x61, 0x95],
204
+ getInstantWithdrawStrategyEventDecoder(),
205
+ ],
206
+ [
207
+ "InstantWithdrawVaultEvent",
208
+ [0x2e, 0x39, 0x3c, 0x14, 0x06, 0xa0, 0xa4, 0xf7],
209
+ getInstantWithdrawVaultEventDecoder(),
210
+ ],
211
+ [
212
+ "RemoveAdaptorEvent",
213
+ [0x9b, 0xb2, 0x02, 0x1d, 0xf5, 0x56, 0xf6, 0x99],
214
+ getRemoveAdaptorEventDecoder(),
215
+ ],
216
+ [
217
+ "RequestWithdrawVaultEvent",
218
+ [0x3b, 0x5e, 0x1a, 0x26, 0x2f, 0x83, 0x9e, 0xa2],
219
+ getRequestWithdrawVaultEventDecoder(),
220
+ ],
221
+ [
222
+ "UpdateProtocolEvent",
223
+ [0x0e, 0xe3, 0xcc, 0xd9, 0x3e, 0x2e, 0xf1, 0xed],
224
+ getUpdateProtocolEventDecoder(),
225
+ ],
226
+ [
227
+ "UpdateVaultConfigEvent",
228
+ [0x3d, 0x5c, 0xce, 0x97, 0xa2, 0x28, 0xed, 0x67],
229
+ getUpdateVaultConfigEventDecoder(),
230
+ ],
231
+ [
232
+ "UpdateVaultEvent",
233
+ [0x7b, 0x1f, 0x1b, 0xbd, 0x66, 0x01, 0x79, 0x39],
234
+ getUpdateVaultEventDecoder(),
235
+ ],
236
+ [
237
+ "UpdateVaultProtocolFeeEvent",
238
+ [0xac, 0x01, 0xad, 0xe6, 0xe4, 0x3d, 0x4d, 0xf4],
239
+ getUpdateVaultProtocolFeeEventDecoder(),
240
+ ],
241
+ [
242
+ "WithdrawStrategyEvent",
243
+ [0x70, 0x2d, 0x10, 0xac, 0xaa, 0x21, 0x16, 0xd4],
244
+ getWithdrawStrategyEventDecoder(),
245
+ ],
246
+ [
247
+ "WithdrawVaultEvent",
248
+ [0xc4, 0x7b, 0x4f, 0xd7, 0x04, 0xd6, 0x14, 0xc5],
249
+ getWithdrawVaultEventDecoder(),
250
+ ],
251
+ ];
252
+
253
+ const DISPATCH: ReadonlyMap<string, DispatchEntry> = new Map(
254
+ EVENT_TABLE.map(([name, disc, decoder]) => [
255
+ discriminatorKey(disc),
256
+ { name, decoder },
257
+ ])
258
+ );
259
+
260
+ const PROGRAM_DATA_PREFIX = "Program data: ";
261
+ // Top-level instructions log "Program <id> invoke [1]" — depth >1 is a CPI.
262
+ const TOP_LEVEL_INVOKE_RE = /^Program \S+ invoke \[1\]$/;
263
+
264
+ const base64Encoder = getBase64Encoder();
265
+
266
+ /**
267
+ * Walk a transaction's `meta.logMessages`, decode every Voltr event emitted
268
+ * via Anchor's `emit!`, and return them in emission order. Lines whose
269
+ * discriminator doesn't belong to a Voltr event are skipped, so logs from
270
+ * other programs in the same tx are safe to pass through.
271
+ */
272
+ export function parseTransactionEvents(
273
+ meta: TransactionMetaForEvents | null | undefined
274
+ ): ParsedVoltrEvent[] {
275
+ const logs = meta?.logMessages;
276
+ if (!logs || logs.length === 0) return [];
277
+
278
+ const out: ParsedVoltrEvent[] = [];
279
+ let ixIndex = -1;
280
+ let eventIndex = 0;
281
+
282
+ for (const line of logs) {
283
+ if (TOP_LEVEL_INVOKE_RE.test(line)) {
284
+ ixIndex++;
285
+ continue;
286
+ }
287
+ if (!line.startsWith(PROGRAM_DATA_PREFIX)) continue;
288
+
289
+ const b64 = line.slice(PROGRAM_DATA_PREFIX.length);
290
+ let bytes: Uint8Array;
291
+ try {
292
+ bytes = base64Encoder.encode(b64) as Uint8Array;
293
+ } catch {
294
+ continue;
295
+ }
296
+ if (bytes.length < 8) continue;
297
+
298
+ const entry = DISPATCH.get(discriminatorKey(bytes.subarray(0, 8)));
299
+ if (!entry) continue;
300
+
301
+ // The discriminator is 8 bytes of sha256, so spurious matches from other
302
+ // programs are unlikely but possible — and corrupt fixtures happen too.
303
+ // Skip the line rather than aborting the whole parse if borsh decode fails.
304
+ let payload: unknown;
305
+ try {
306
+ payload = entry.decoder.decode(bytes, 8);
307
+ } catch {
308
+ continue;
309
+ }
310
+ out.push({
311
+ name: entry.name,
312
+ payload,
313
+ ixIndex: ixIndex < 0 ? 0 : ixIndex,
314
+ eventIndex: eventIndex++,
315
+ } as ParsedVoltrEvent);
316
+ }
317
+
318
+ return out;
319
+ }
320
+
321
+ function discriminatorKey(disc: ArrayLike<number>): string {
322
+ let s = "";
323
+ for (let i = 0; i < disc.length; i++) {
324
+ const b = disc[i] & 0xff;
325
+ s += (b < 16 ? "0" : "") + b.toString(16);
326
+ }
327
+ return s;
328
+ }
@@ -1,5 +1,6 @@
1
1
  export * from "./batchFetchers";
2
2
  export * from "./decimal";
3
+ export * from "./events";
3
4
  export * from "./fees";
4
5
  export * from "./lpEconomics";
5
6
  export * from "./math";