@agent-shield/sdk 0.3.1 → 0.5.1
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/LICENSE +191 -0
- package/README.md +14 -22
- package/dist/idl-json.d.ts +3 -3
- package/dist/idl-json.d.ts.map +1 -1
- package/dist/idl-json.js +2020 -2942
- package/dist/idl-json.js.map +1 -1
- package/dist/idl.d.ts +1403 -2057
- package/dist/idl.d.ts.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -2
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +893 -893
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/dist/wrapper/engine.d.ts +17 -0
- package/dist/wrapper/engine.d.ts.map +1 -0
- package/dist/wrapper/engine.js +45 -0
- package/dist/wrapper/engine.js.map +1 -0
- package/dist/wrapper/errors.d.ts +10 -0
- package/dist/wrapper/errors.d.ts.map +1 -0
- package/dist/wrapper/errors.js +20 -0
- package/dist/wrapper/errors.js.map +1 -0
- package/dist/wrapper/harden.d.ts +119 -0
- package/dist/wrapper/harden.d.ts.map +1 -0
- package/dist/wrapper/harden.js +399 -0
- package/dist/wrapper/harden.js.map +1 -0
- package/dist/wrapper/index.d.ts +17 -0
- package/dist/wrapper/index.d.ts.map +1 -0
- package/dist/wrapper/index.js +60 -0
- package/dist/wrapper/index.js.map +1 -0
- package/dist/wrapper/inspector.d.ts +22 -0
- package/dist/wrapper/inspector.d.ts.map +1 -0
- package/dist/wrapper/inspector.js +175 -0
- package/dist/wrapper/inspector.js.map +1 -0
- package/dist/wrapper/policies.d.ts +78 -0
- package/dist/wrapper/policies.d.ts.map +1 -0
- package/dist/wrapper/policies.js +108 -0
- package/dist/wrapper/policies.js.map +1 -0
- package/dist/wrapper/registry.d.ts +24 -0
- package/dist/wrapper/registry.d.ts.map +1 -0
- package/dist/wrapper/registry.js +43 -0
- package/dist/wrapper/registry.js.map +1 -0
- package/dist/wrapper/shield.d.ts +86 -0
- package/dist/wrapper/shield.d.ts.map +1 -0
- package/dist/wrapper/shield.js +226 -0
- package/dist/wrapper/shield.js.map +1 -0
- package/dist/wrapper/state.d.ts +3 -0
- package/dist/wrapper/state.d.ts.map +1 -0
- package/dist/wrapper/state.js +6 -0
- package/dist/wrapper/state.js.map +1 -0
- package/dist/wrapper/x402.d.ts +151 -0
- package/dist/wrapper/x402.d.ts.map +1 -0
- package/dist/wrapper/x402.js +326 -0
- package/dist/wrapper/x402.js.map +1 -0
- package/package.json +15 -11
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.analyzeTransaction = analyzeTransaction;
|
|
4
|
+
exports.extractInstructions = extractInstructions;
|
|
5
|
+
exports.resolveTransactionAddressLookupTables = resolveTransactionAddressLookupTables;
|
|
6
|
+
exports.getNonSystemProgramIds = getNonSystemProgramIds;
|
|
7
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
8
|
+
const spl_token_1 = require("@solana/spl-token");
|
|
9
|
+
const registry_1 = require("./registry");
|
|
10
|
+
/** SPL Token instruction discriminators */
|
|
11
|
+
const SPL_TRANSFER_DISCRIMINATOR = 3;
|
|
12
|
+
const SPL_TRANSFER_CHECKED_DISCRIMINATOR = 12;
|
|
13
|
+
/** Token 2022 program ID */
|
|
14
|
+
const TOKEN_2022_PROGRAM_ID = new web3_js_1.PublicKey("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb");
|
|
15
|
+
/**
|
|
16
|
+
* Analyze a transaction to extract program IDs, token transfers, and estimated value.
|
|
17
|
+
* Works with both legacy Transaction and VersionedTransaction.
|
|
18
|
+
*/
|
|
19
|
+
function analyzeTransaction(tx, signerPubkey, addressLookupTableAccounts) {
|
|
20
|
+
const instructions = extractInstructions(tx, addressLookupTableAccounts);
|
|
21
|
+
const programIds = [];
|
|
22
|
+
const transfers = [];
|
|
23
|
+
const seenPrograms = new Set();
|
|
24
|
+
for (const ix of instructions) {
|
|
25
|
+
const programKey = ix.programId.toBase58();
|
|
26
|
+
if (!seenPrograms.has(programKey)) {
|
|
27
|
+
seenPrograms.add(programKey);
|
|
28
|
+
programIds.push(ix.programId);
|
|
29
|
+
}
|
|
30
|
+
// Detect SPL token transfers
|
|
31
|
+
if (isTokenProgram(ix.programId)) {
|
|
32
|
+
const transfer = parseTokenTransfer(ix, signerPubkey);
|
|
33
|
+
if (transfer) {
|
|
34
|
+
transfers.push(transfer);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Sum outgoing transfer amounts as estimated value
|
|
39
|
+
const estimatedValueLamports = transfers
|
|
40
|
+
.filter((t) => t.direction === "outgoing")
|
|
41
|
+
.reduce((sum, t) => sum + t.amount, BigInt(0));
|
|
42
|
+
return { programIds, transfers, estimatedValueLamports };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Extract instructions from either Transaction or VersionedTransaction.
|
|
46
|
+
*/
|
|
47
|
+
function extractInstructions(tx, addressLookupTableAccounts) {
|
|
48
|
+
if (tx instanceof web3_js_1.Transaction) {
|
|
49
|
+
return tx.instructions;
|
|
50
|
+
}
|
|
51
|
+
// VersionedTransaction — need to resolve from compiled message
|
|
52
|
+
return extractFromVersionedMessage(tx.message, addressLookupTableAccounts);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Extract TransactionInstruction-like objects from a VersionedMessage.
|
|
56
|
+
* When addressLookupTableAccounts are provided, resolves account keys
|
|
57
|
+
* referenced through Address Lookup Tables (ALTs) in V0 messages.
|
|
58
|
+
*/
|
|
59
|
+
function extractFromVersionedMessage(message, addressLookupTableAccounts) {
|
|
60
|
+
// MessageV0 (version === 0) supports ALT resolution via
|
|
61
|
+
// getAccountKeys({ addressLookupTableAccounts }).
|
|
62
|
+
// Legacy Message (version === 'legacy') does not accept ALT args.
|
|
63
|
+
const accountKeys = addressLookupTableAccounts?.length && message.version === 0
|
|
64
|
+
? message.getAccountKeys({ addressLookupTableAccounts })
|
|
65
|
+
: message.getAccountKeys();
|
|
66
|
+
const instructions = [];
|
|
67
|
+
for (const compiled of message.compiledInstructions) {
|
|
68
|
+
const programId = accountKeys.get(compiled.programIdIndex);
|
|
69
|
+
if (!programId)
|
|
70
|
+
continue;
|
|
71
|
+
const keys = compiled.accountKeyIndexes.map((idx) => ({
|
|
72
|
+
pubkey: accountKeys.get(idx) ?? web3_js_1.PublicKey.default,
|
|
73
|
+
isSigner: message.isAccountSigner(idx),
|
|
74
|
+
isWritable: message.isAccountWritable(idx),
|
|
75
|
+
}));
|
|
76
|
+
instructions.push(new web3_js_1.TransactionInstruction({
|
|
77
|
+
programId,
|
|
78
|
+
keys,
|
|
79
|
+
data: Buffer.from(compiled.data),
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
return instructions;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Resolve Address Lookup Table accounts for a VersionedTransaction.
|
|
86
|
+
* Returns empty array if the transaction has no ALT references.
|
|
87
|
+
*/
|
|
88
|
+
async function resolveTransactionAddressLookupTables(tx, connection) {
|
|
89
|
+
const lookups = tx.message.addressTableLookups;
|
|
90
|
+
if (!lookups || lookups.length === 0)
|
|
91
|
+
return [];
|
|
92
|
+
const results = await Promise.all(lookups.map((lookup) => connection.getAddressLookupTable(lookup.accountKey)));
|
|
93
|
+
return results
|
|
94
|
+
.filter((r) => r.value !== null)
|
|
95
|
+
.map((r) => r.value);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Check if a program ID is a token program (SPL Token or Token 2022).
|
|
99
|
+
*/
|
|
100
|
+
function isTokenProgram(programId) {
|
|
101
|
+
return (programId.equals(spl_token_1.TOKEN_PROGRAM_ID) ||
|
|
102
|
+
programId.equals(TOKEN_2022_PROGRAM_ID));
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Parse an SPL Token transfer instruction to extract amount and direction.
|
|
106
|
+
* Handles both Transfer (discriminator 3) and TransferChecked (discriminator 12).
|
|
107
|
+
*/
|
|
108
|
+
function parseTokenTransfer(ix, signerPubkey) {
|
|
109
|
+
if (ix.data.length < 1)
|
|
110
|
+
return null;
|
|
111
|
+
const discriminator = ix.data[0];
|
|
112
|
+
if (discriminator === SPL_TRANSFER_DISCRIMINATOR) {
|
|
113
|
+
return parseTransfer(ix, signerPubkey);
|
|
114
|
+
}
|
|
115
|
+
if (discriminator === SPL_TRANSFER_CHECKED_DISCRIMINATOR) {
|
|
116
|
+
return parseTransferChecked(ix, signerPubkey);
|
|
117
|
+
}
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Parse SPL Token Transfer instruction.
|
|
122
|
+
* Layout: [1 byte disc][8 bytes amount LE]
|
|
123
|
+
* Accounts: [source, destination, authority]
|
|
124
|
+
*/
|
|
125
|
+
function parseTransfer(ix, signerPubkey) {
|
|
126
|
+
if (ix.data.length < 9 || ix.keys.length < 3)
|
|
127
|
+
return null;
|
|
128
|
+
const amount = readU64LE(ix.data, 1);
|
|
129
|
+
const source = ix.keys[0].pubkey;
|
|
130
|
+
const destination = ix.keys[1].pubkey;
|
|
131
|
+
const authority = ix.keys[2].pubkey;
|
|
132
|
+
const direction = authority.equals(signerPubkey) ? "outgoing" : "unknown";
|
|
133
|
+
return {
|
|
134
|
+
mint: web3_js_1.PublicKey.default, // Transfer (non-checked) doesn't include mint
|
|
135
|
+
amount,
|
|
136
|
+
direction,
|
|
137
|
+
destination: direction === "outgoing" ? destination : undefined,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Parse SPL Token TransferChecked instruction.
|
|
142
|
+
* Layout: [1 byte disc][8 bytes amount LE][1 byte decimals]
|
|
143
|
+
* Accounts: [source, mint, destination, authority]
|
|
144
|
+
*/
|
|
145
|
+
function parseTransferChecked(ix, signerPubkey) {
|
|
146
|
+
if (ix.data.length < 10 || ix.keys.length < 4)
|
|
147
|
+
return null;
|
|
148
|
+
const amount = readU64LE(ix.data, 1);
|
|
149
|
+
const source = ix.keys[0].pubkey;
|
|
150
|
+
const mint = ix.keys[1].pubkey;
|
|
151
|
+
const destination = ix.keys[2].pubkey;
|
|
152
|
+
const authority = ix.keys[3].pubkey;
|
|
153
|
+
const direction = authority.equals(signerPubkey) ? "outgoing" : "unknown";
|
|
154
|
+
return {
|
|
155
|
+
mint,
|
|
156
|
+
amount,
|
|
157
|
+
direction,
|
|
158
|
+
destination: direction === "outgoing" ? destination : undefined,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Read a little-endian u64 from a buffer at the given offset.
|
|
163
|
+
*/
|
|
164
|
+
function readU64LE(buf, offset) {
|
|
165
|
+
const view = Buffer.from(buf);
|
|
166
|
+
return view.readBigUInt64LE(offset);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get all non-system program IDs from a transaction analysis.
|
|
170
|
+
* Useful for checking if a transaction interacts with unknown programs.
|
|
171
|
+
*/
|
|
172
|
+
function getNonSystemProgramIds(analysis) {
|
|
173
|
+
return analysis.programIds.filter((pid) => !(0, registry_1.isSystemProgram)(pid));
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=inspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspector.js","sourceRoot":"","sources":["../../src/wrapper/inspector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { PublicKey } from "@solana/web3.js";
|
|
2
|
+
import * as Core from "@agent-shield/core";
|
|
3
|
+
export type { RateLimitConfig, PolicyCheckResult } from "@agent-shield/core";
|
|
4
|
+
export { DEFAULT_POLICIES, parseSpendLimit } from "@agent-shield/core";
|
|
5
|
+
/** Policy configuration for the shield wrapper (accepts PublicKey or string) */
|
|
6
|
+
export interface ShieldPolicies {
|
|
7
|
+
/** Maximum spend per rolling 24h window, per token. e.g. "500 USDC/day" or { mint, amount } */
|
|
8
|
+
maxSpend?: SpendLimit | SpendLimit[] | string | string[];
|
|
9
|
+
/** Maximum single transaction size in lamports-equivalent value */
|
|
10
|
+
maxTransactionSize?: bigint | string;
|
|
11
|
+
/** Allowed protocol program IDs. If set, only these + system programs are allowed. */
|
|
12
|
+
allowedProtocols?: (PublicKey | string)[];
|
|
13
|
+
/** Allowed token mints for transfers. If set, only these tokens can be sent. */
|
|
14
|
+
allowedTokens?: (PublicKey | string)[];
|
|
15
|
+
/** Block unknown (unregistered) program IDs. Default: true */
|
|
16
|
+
blockUnknownPrograms?: boolean;
|
|
17
|
+
/** Maximum transactions per time window */
|
|
18
|
+
rateLimit?: Core.RateLimitConfig;
|
|
19
|
+
/** Custom policy evaluation hook — runs AFTER built-in checks */
|
|
20
|
+
customCheck?: (analysis: TransactionAnalysis) => Core.PolicyCheckResult;
|
|
21
|
+
}
|
|
22
|
+
export interface SpendLimit {
|
|
23
|
+
/** SPL token mint address */
|
|
24
|
+
mint: PublicKey | string;
|
|
25
|
+
/** Maximum amount in token's native decimals (e.g. 500_000_000 for 500 USDC) */
|
|
26
|
+
amount: bigint;
|
|
27
|
+
/** Window duration in milliseconds. Default: 86_400_000 (24h) */
|
|
28
|
+
windowMs?: number;
|
|
29
|
+
}
|
|
30
|
+
/** Analysis of a transaction's contents, passed to policy engine and custom checks */
|
|
31
|
+
export interface TransactionAnalysis {
|
|
32
|
+
/** Program IDs invoked by the transaction */
|
|
33
|
+
programIds: PublicKey[];
|
|
34
|
+
/** Token transfers detected in the transaction */
|
|
35
|
+
transfers: TokenTransfer[];
|
|
36
|
+
/** Total estimated value of outgoing transfers, in lamports-equivalent */
|
|
37
|
+
estimatedValueLamports: bigint;
|
|
38
|
+
}
|
|
39
|
+
export interface TokenTransfer {
|
|
40
|
+
mint: PublicKey;
|
|
41
|
+
amount: bigint;
|
|
42
|
+
/** "outgoing" = tokens leaving the wallet, "incoming" = tokens arriving */
|
|
43
|
+
direction: "outgoing" | "incoming" | "unknown";
|
|
44
|
+
/** Destination account */
|
|
45
|
+
destination?: PublicKey;
|
|
46
|
+
}
|
|
47
|
+
/** Summary of current spending state relative to policy limits */
|
|
48
|
+
export interface SpendingSummary {
|
|
49
|
+
tokens: Array<{
|
|
50
|
+
mint: string;
|
|
51
|
+
symbol: string | undefined;
|
|
52
|
+
spent: bigint;
|
|
53
|
+
limit: bigint;
|
|
54
|
+
remaining: bigint;
|
|
55
|
+
windowMs: number;
|
|
56
|
+
}>;
|
|
57
|
+
rateLimit: {
|
|
58
|
+
count: number;
|
|
59
|
+
limit: number;
|
|
60
|
+
remaining: number;
|
|
61
|
+
windowMs: number;
|
|
62
|
+
};
|
|
63
|
+
isPaused: boolean;
|
|
64
|
+
}
|
|
65
|
+
/** Internal resolved policy representation (extends core with customCheck) */
|
|
66
|
+
export interface ResolvedPolicies extends Core.ResolvedPolicies {
|
|
67
|
+
customCheck: ((analysis: TransactionAnalysis) => Core.PolicyCheckResult) | undefined;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Normalize user-provided policies into a resolved internal format.
|
|
71
|
+
* Handles PublicKey → string conversion, string parsing, defaults, and validation.
|
|
72
|
+
*/
|
|
73
|
+
export declare function resolvePolicies(input?: ShieldPolicies): ResolvedPolicies;
|
|
74
|
+
/**
|
|
75
|
+
* Convert wrapper TransactionAnalysis (PublicKey-based) to core format (string-based).
|
|
76
|
+
*/
|
|
77
|
+
export declare function toCoreAnalysis(analysis: TransactionAnalysis): Core.TransactionAnalysis;
|
|
78
|
+
//# sourceMappingURL=policies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policies.d.ts","sourceRoot":"","sources":["../../src/wrapper/policies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAC;AAG3C,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEvE,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;IACzD,mEAAmE;IACnE,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrC,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,CAAC,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC;IAC1C,gFAAgF;IAChF,aAAa,CAAC,EAAE,CAAC,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC;IACvC,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,2CAA2C;IAC3C,SAAS,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC;IACjC,iEAAiE;IACjE,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAC,iBAAiB,CAAC;CACzE;AAED,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IACzB,gFAAgF;IAChF,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,sFAAsF;AACtF,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,kDAAkD;IAClD,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,0EAA0E;IAC1E,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,SAAS,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAC/C,0BAA0B;IAC1B,WAAW,CAAC,EAAE,SAAS,CAAC;CACzB;AAED,kEAAkE;AAClE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;QAC3B,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,SAAS,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,8EAA8E;AAC9E,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,gBAAgB;IAC7D,WAAW,EACP,CAAC,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAC,iBAAiB,CAAC,GAC3D,SAAS,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,gBAAgB,CA0BxE;AA6BD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,mBAAmB,GAC5B,IAAI,CAAC,mBAAmB,CAW1B"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.parseSpendLimit = exports.DEFAULT_POLICIES = void 0;
|
|
37
|
+
exports.resolvePolicies = resolvePolicies;
|
|
38
|
+
exports.toCoreAnalysis = toCoreAnalysis;
|
|
39
|
+
const Core = __importStar(require("@agent-shield/core"));
|
|
40
|
+
var core_1 = require("@agent-shield/core");
|
|
41
|
+
Object.defineProperty(exports, "DEFAULT_POLICIES", { enumerable: true, get: function () { return core_1.DEFAULT_POLICIES; } });
|
|
42
|
+
Object.defineProperty(exports, "parseSpendLimit", { enumerable: true, get: function () { return core_1.parseSpendLimit; } });
|
|
43
|
+
/**
|
|
44
|
+
* Normalize user-provided policies into a resolved internal format.
|
|
45
|
+
* Handles PublicKey → string conversion, string parsing, defaults, and validation.
|
|
46
|
+
*/
|
|
47
|
+
function resolvePolicies(input) {
|
|
48
|
+
// Convert Solana-aware input to core format
|
|
49
|
+
const coreInput = input
|
|
50
|
+
? {
|
|
51
|
+
maxSpend: input.maxSpend !== undefined
|
|
52
|
+
? convertSpendLimits(input.maxSpend)
|
|
53
|
+
: undefined,
|
|
54
|
+
maxTransactionSize: input.maxTransactionSize,
|
|
55
|
+
allowedProtocols: input.allowedProtocols?.map((p) => typeof p === "string" ? p : p.toBase58()),
|
|
56
|
+
allowedTokens: input.allowedTokens?.map((t) => typeof t === "string" ? t : t.toBase58()),
|
|
57
|
+
blockUnknownPrograms: input.blockUnknownPrograms,
|
|
58
|
+
rateLimit: input.rateLimit,
|
|
59
|
+
}
|
|
60
|
+
: undefined;
|
|
61
|
+
const coreResolved = Core.resolvePolicies(coreInput);
|
|
62
|
+
return {
|
|
63
|
+
...coreResolved,
|
|
64
|
+
customCheck: input?.customCheck ?? undefined,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/** Convert wrapper SpendLimit (PublicKey | string mint) to core SpendLimit (string mint) */
|
|
68
|
+
function convertSpendLimits(input) {
|
|
69
|
+
if (typeof input === "string")
|
|
70
|
+
return input;
|
|
71
|
+
if (Array.isArray(input)) {
|
|
72
|
+
// Check if all elements are strings
|
|
73
|
+
if (input.every((l) => typeof l === "string")) {
|
|
74
|
+
return input;
|
|
75
|
+
}
|
|
76
|
+
// Otherwise convert each element to Core.SpendLimit
|
|
77
|
+
return input.map((l) => {
|
|
78
|
+
if (typeof l === "string")
|
|
79
|
+
return Core.parseSpendLimit(l);
|
|
80
|
+
return {
|
|
81
|
+
mint: typeof l.mint === "string" ? l.mint : l.mint.toBase58(),
|
|
82
|
+
amount: l.amount,
|
|
83
|
+
windowMs: l.windowMs,
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
mint: typeof input.mint === "string" ? input.mint : input.mint.toBase58(),
|
|
89
|
+
amount: input.amount,
|
|
90
|
+
windowMs: input.windowMs,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Convert wrapper TransactionAnalysis (PublicKey-based) to core format (string-based).
|
|
95
|
+
*/
|
|
96
|
+
function toCoreAnalysis(analysis) {
|
|
97
|
+
return {
|
|
98
|
+
programIds: analysis.programIds.map((p) => p.toBase58()),
|
|
99
|
+
transfers: analysis.transfers.map((t) => ({
|
|
100
|
+
mint: t.mint.toBase58(),
|
|
101
|
+
amount: t.amount,
|
|
102
|
+
direction: t.direction,
|
|
103
|
+
destination: t.destination?.toBase58(),
|
|
104
|
+
})),
|
|
105
|
+
estimatedValueLamports: analysis.estimatedValueLamports,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=policies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policies.js","sourceRoot":"","sources":["../../src/wrapper/policies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { PublicKey } from "@solana/web3.js";
|
|
2
|
+
export { KNOWN_PROTOCOLS, KNOWN_TOKENS, SYSTEM_PROGRAMS, } from "@agent-shield/core";
|
|
3
|
+
/**
|
|
4
|
+
* Look up a token's symbol and decimals by mint address.
|
|
5
|
+
* Returns undefined for unknown tokens.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getTokenInfo(mint: PublicKey | string): {
|
|
8
|
+
symbol: string;
|
|
9
|
+
decimals: number;
|
|
10
|
+
} | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Look up a protocol's name by program ID.
|
|
13
|
+
* Returns undefined for unknown protocols.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getProtocolName(programId: PublicKey | string): string | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Check if a program ID is a known system program (always allowed).
|
|
18
|
+
*/
|
|
19
|
+
export declare function isSystemProgram(programId: PublicKey | string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Check if a program ID is a known DeFi protocol.
|
|
22
|
+
*/
|
|
23
|
+
export declare function isKnownProtocol(programId: PublicKey | string): boolean;
|
|
24
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/wrapper/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ5C,OAAO,EACL,eAAe,EACf,YAAY,EACZ,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,GAAG,MAAM,GACvB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAGlD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,GAAG,MAAM,GAC5B,MAAM,GAAG,SAAS,CAGpB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAGtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAGtE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SYSTEM_PROGRAMS = exports.KNOWN_TOKENS = exports.KNOWN_PROTOCOLS = void 0;
|
|
4
|
+
exports.getTokenInfo = getTokenInfo;
|
|
5
|
+
exports.getProtocolName = getProtocolName;
|
|
6
|
+
exports.isSystemProgram = isSystemProgram;
|
|
7
|
+
exports.isKnownProtocol = isKnownProtocol;
|
|
8
|
+
const core_1 = require("@agent-shield/core");
|
|
9
|
+
var core_2 = require("@agent-shield/core");
|
|
10
|
+
Object.defineProperty(exports, "KNOWN_PROTOCOLS", { enumerable: true, get: function () { return core_2.KNOWN_PROTOCOLS; } });
|
|
11
|
+
Object.defineProperty(exports, "KNOWN_TOKENS", { enumerable: true, get: function () { return core_2.KNOWN_TOKENS; } });
|
|
12
|
+
Object.defineProperty(exports, "SYSTEM_PROGRAMS", { enumerable: true, get: function () { return core_2.SYSTEM_PROGRAMS; } });
|
|
13
|
+
/**
|
|
14
|
+
* Look up a token's symbol and decimals by mint address.
|
|
15
|
+
* Returns undefined for unknown tokens.
|
|
16
|
+
*/
|
|
17
|
+
function getTokenInfo(mint) {
|
|
18
|
+
const key = typeof mint === "string" ? mint : mint.toBase58();
|
|
19
|
+
return (0, core_1.getTokenInfo)(key);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Look up a protocol's name by program ID.
|
|
23
|
+
* Returns undefined for unknown protocols.
|
|
24
|
+
*/
|
|
25
|
+
function getProtocolName(programId) {
|
|
26
|
+
const key = typeof programId === "string" ? programId : programId.toBase58();
|
|
27
|
+
return (0, core_1.getProtocolName)(key);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if a program ID is a known system program (always allowed).
|
|
31
|
+
*/
|
|
32
|
+
function isSystemProgram(programId) {
|
|
33
|
+
const key = typeof programId === "string" ? programId : programId.toBase58();
|
|
34
|
+
return (0, core_1.isSystemProgram)(key);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if a program ID is a known DeFi protocol.
|
|
38
|
+
*/
|
|
39
|
+
function isKnownProtocol(programId) {
|
|
40
|
+
const key = typeof programId === "string" ? programId : programId.toBase58();
|
|
41
|
+
return (0, core_1.isKnownProtocol)(key);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/wrapper/registry.ts"],"names":[],"mappings":";;;AAkBA,oCAKC;AAMD,0CAKC;AAKD,0CAGC;AAKD,0CAGC;AAjDD,6CAK4B;AAE5B,2CAI4B;AAH1B,uGAAA,eAAe,OAAA;AACf,oGAAA,YAAY,OAAA;AACZ,uGAAA,eAAe,OAAA;AAGjB;;;GAGG;AACH,SAAgB,YAAY,CAC1B,IAAwB;IAExB,MAAM,GAAG,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC9D,OAAO,IAAA,mBAAgB,EAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAC7B,SAA6B;IAE7B,MAAM,GAAG,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC7E,OAAO,IAAA,sBAAmB,EAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,SAA6B;IAC3D,MAAM,GAAG,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC7E,OAAO,IAAA,sBAAmB,EAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,SAA6B;IAC3D,MAAM,GAAG,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC7E,OAAO,IAAA,sBAAmB,EAAC,GAAG,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Connection, PublicKey, Transaction, VersionedTransaction } from "@solana/web3.js";
|
|
2
|
+
import { ShieldPolicies, SpendingSummary, ResolvedPolicies } from "./policies";
|
|
3
|
+
import { ShieldDeniedError } from "./errors";
|
|
4
|
+
import { ShieldState, ShieldStorage } from "./state";
|
|
5
|
+
/**
|
|
6
|
+
* A wallet-like object that shield() can wrap.
|
|
7
|
+
* Compatible with Keypair wallets, wallet adapters, Turnkey, Privy, Coinbase, etc.
|
|
8
|
+
*/
|
|
9
|
+
export interface WalletLike {
|
|
10
|
+
publicKey: PublicKey;
|
|
11
|
+
signTransaction<T extends Transaction | VersionedTransaction>(tx: T): Promise<T>;
|
|
12
|
+
signAllTransactions?<T extends Transaction | VersionedTransaction>(txs: T[]): Promise<T[]>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* A TEE-backed wallet — extends WalletLike with a provider identifier.
|
|
16
|
+
* Compatible with Crossmint, Turnkey, Privy, or any TEE custody provider.
|
|
17
|
+
*/
|
|
18
|
+
export interface TeeWallet extends WalletLike {
|
|
19
|
+
readonly provider: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Type guard to detect TEE-backed wallets at runtime.
|
|
23
|
+
*/
|
|
24
|
+
export declare function isTeeWallet(wallet: WalletLike): wallet is TeeWallet;
|
|
25
|
+
/**
|
|
26
|
+
* A shielded wallet — same interface as the input wallet, with policy enforcement.
|
|
27
|
+
*/
|
|
28
|
+
export interface ShieldedWallet extends WalletLike {
|
|
29
|
+
/** The underlying wallet before shielding */
|
|
30
|
+
readonly innerWallet: WalletLike;
|
|
31
|
+
/** Current shield state (spending tracker, rate limiter) */
|
|
32
|
+
readonly shieldState: ShieldState;
|
|
33
|
+
/** Whether this wallet has been hardened (on-chain enforcement) */
|
|
34
|
+
readonly isHardened: boolean;
|
|
35
|
+
/** The currently active resolved policies */
|
|
36
|
+
readonly resolvedPolicies: ResolvedPolicies;
|
|
37
|
+
/** Whether policy enforcement is currently paused */
|
|
38
|
+
readonly isPaused: boolean;
|
|
39
|
+
/** Update policies at runtime */
|
|
40
|
+
updatePolicies(policies: ShieldPolicies): void;
|
|
41
|
+
/** Reset all spending state */
|
|
42
|
+
resetState(): void;
|
|
43
|
+
/** Pause policy enforcement — transactions pass through without checks or spend recording */
|
|
44
|
+
pause(): void;
|
|
45
|
+
/** Resume policy enforcement after a pause */
|
|
46
|
+
resume(): void;
|
|
47
|
+
/** Get a summary of current spending relative to policy limits */
|
|
48
|
+
getSpendingSummary(): SpendingSummary;
|
|
49
|
+
/** Make an HTTP request with automatic x402 payment support */
|
|
50
|
+
fetch?: (url: string | URL, init?: RequestInit) => Promise<Response>;
|
|
51
|
+
}
|
|
52
|
+
export interface ShieldOptions {
|
|
53
|
+
/** Solana RPC connection — enables Address Lookup Table resolution for VersionedTransactions */
|
|
54
|
+
connection?: Connection;
|
|
55
|
+
/** Custom storage backend for state persistence. Default: auto-detect (localStorage in browser, in-memory in Node.js) */
|
|
56
|
+
storage?: ShieldStorage;
|
|
57
|
+
/** Event handler called when a transaction is denied */
|
|
58
|
+
onDenied?: (error: ShieldDeniedError) => void;
|
|
59
|
+
/** Event handler called when a transaction is approved and signed */
|
|
60
|
+
onApproved?: (txHash: string | null) => void;
|
|
61
|
+
/** Event handler called when policies are updated via updatePolicies() */
|
|
62
|
+
onPolicyUpdate?: (policies: ShieldPolicies) => void;
|
|
63
|
+
/** Event handler called when the shield is paused */
|
|
64
|
+
onPause?: () => void;
|
|
65
|
+
/** Event handler called when the shield is resumed */
|
|
66
|
+
onResume?: () => void;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Wrap any wallet with client-side spending controls.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* import { shieldWallet } from '@agent-shield/sdk';
|
|
74
|
+
*
|
|
75
|
+
* const protectedWallet = shieldWallet(wallet, { maxSpend: '500 USDC/day' });
|
|
76
|
+
* const agent = new SolanaAgentKit(protectedWallet, RPC_URL, config);
|
|
77
|
+
* ```
|
|
78
|
+
*
|
|
79
|
+
* With no config, secure defaults are applied:
|
|
80
|
+
* - 1000 USDC/day, 1000 USDT/day, 10 SOL/day spending caps
|
|
81
|
+
* - Unknown programs blocked
|
|
82
|
+
* - 60 transactions/hour rate limit
|
|
83
|
+
* @internal Use shieldWallet() instead
|
|
84
|
+
*/
|
|
85
|
+
export declare function shield(wallet: WalletLike, policies?: ShieldPolicies, options?: ShieldOptions): ShieldedWallet;
|
|
86
|
+
//# sourceMappingURL=shield.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shield.d.ts","sourceRoot":"","sources":["../../src/wrapper/shield.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,SAAS,EACT,WAAW,EACX,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,cAAc,EACd,eAAe,EACf,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGrD;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,CAAC,CAAC,SAAS,WAAW,GAAG,oBAAoB,EAC1D,EAAE,EAAE,CAAC,GACJ,OAAO,CAAC,CAAC,CAAC,CAAC;IACd,mBAAmB,CAAC,CAAC,CAAC,SAAS,WAAW,GAAG,oBAAoB,EAC/D,GAAG,EAAE,CAAC,EAAE,GACP,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,IAAI,SAAS,CAEnE;AAED;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,6CAA6C;IAC7C,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,mEAAmE;IACnE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,6CAA6C;IAC7C,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,iCAAiC;IACjC,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/C,+BAA+B;IAC/B,UAAU,IAAI,IAAI,CAAC;IACnB,6FAA6F;IAC7F,KAAK,IAAI,IAAI,CAAC;IACd,8CAA8C;IAC9C,MAAM,IAAI,IAAI,CAAC;IACf,kEAAkE;IAClE,kBAAkB,IAAI,eAAe,CAAC;IACtC,+DAA+D;IAC/D,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,aAAa;IAC5B,gGAAgG;IAChG,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,yHAAyH;IACzH,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9C,qEAAqE;IACrE,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7C,0EAA0E;IAC1E,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;IACpD,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,MAAM,CACpB,MAAM,EAAE,UAAU,EAClB,QAAQ,CAAC,EAAE,cAAc,EACzB,OAAO,CAAC,EAAE,aAAa,GACtB,cAAc,CA4MhB"}
|