@buildaureon/sdk 0.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,147 @@
1
+ /**
2
+ * Verify underweight Auto sizing lands near 20% (not 98%).
3
+ */
4
+ import { readFileSync } from "node:fs";
5
+ import { join, dirname } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ import {
8
+ createPublicClient,
9
+ createWalletClient,
10
+ http,
11
+ type Address,
12
+ type Hex,
13
+ } from "viem";
14
+ import { privateKeyToAccount } from "viem/accounts";
15
+ import {
16
+ createAureonClient,
17
+ createSessionTokenProvider,
18
+ LOCAL_API_BASE_URL,
19
+ } from "../../src/index.js";
20
+
21
+ const BACKEND = join(dirname(fileURLToPath(import.meta.url)), "../../../backend");
22
+ const env = Object.fromEntries(
23
+ readFileSync(join(BACKEND, ".env"), "utf8")
24
+ .split(/\r?\n/)
25
+ .filter((l) => l && !l.startsWith("#") && l.includes("="))
26
+ .map((l) => {
27
+ const i = l.indexOf("=");
28
+ return [l.slice(0, i), l.slice(i + 1).trim()] as const;
29
+ })
30
+ );
31
+ const key = JSON.parse(
32
+ readFileSync(join(BACKEND, ".secrets/robinhood-testnet-wallet.json"), "utf8")
33
+ ).privateKey as Hex;
34
+ const account = privateKeyToAccount(key);
35
+ const rpc = env.AUREON_RPC_URL!;
36
+ const chainId = Number(env.AUREON_CHAIN_ID || 46630);
37
+ const publicClient = createPublicClient({ transport: http(rpc) });
38
+ const walletClient = createWalletClient({ account, transport: http(rpc) });
39
+ const chain = {
40
+ id: chainId,
41
+ name: "rh",
42
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
43
+ rpcUrls: { default: { http: [rpc] } },
44
+ } as const;
45
+
46
+ const session = createSessionTokenProvider(null);
47
+ const aureon = createAureonClient({
48
+ baseUrl: LOCAL_API_BASE_URL,
49
+ apiKey: env.AUREON_API_KEYS!.split(",")[0]!.trim(),
50
+ getAccessToken: session.getAccessToken,
51
+ });
52
+
53
+ const { message } = await aureon.getAuthNonce(account.address);
54
+ session.setToken(
55
+ (
56
+ await aureon.verifyWallet({
57
+ address: account.address,
58
+ message,
59
+ signature: await walletClient.signMessage({ account, message }),
60
+ })
61
+ ).token
62
+ );
63
+
64
+ // Fresh Auto objective
65
+ const objective = await aureon.createObjective({
66
+ name: `SizeFix 20% TSLA ${Date.now()}`,
67
+ kind: "balanced_portfolio",
68
+ targetWeight: 0.2,
69
+ tolerance: 0.05,
70
+ targetSymbol: "TSLA",
71
+ priority: "high",
72
+ automationMode: "auto",
73
+ });
74
+ console.log("objective", objective.id);
75
+
76
+ // Dump almost all TSLA so we're heavily underweight, keep/add WETH
77
+ const vault = await aureon.getVault();
78
+ console.log(
79
+ "before",
80
+ vault.balances.filter((b) => b.quantity > 0).map((b) => `${b.symbol}:${b.quantity}`)
81
+ );
82
+ const tsla = vault.balances.find((b) => b.symbol.toUpperCase() === "TSLA");
83
+ if (tsla && tsla.quantity > 0.0001) {
84
+ const amt = Math.max(tsla.quantity - 0.00001, 0).toFixed(8);
85
+ const prep = await aureon.prepareVaultWithdraw({ symbol: "TSLA", amount: amt });
86
+ for (const step of prep.steps) {
87
+ const hash = await walletClient.sendTransaction({
88
+ account,
89
+ chain,
90
+ to: step.to as Address,
91
+ data: step.data as Hex,
92
+ value: 0n,
93
+ });
94
+ await publicClient.waitForTransactionReceipt({ hash });
95
+ console.log("withdrew TSLA", hash);
96
+ }
97
+ }
98
+
99
+ const dep = await aureon.prepareVaultDeposit({ symbol: "ETH", amount: "0.0004" });
100
+ for (const step of dep.steps) {
101
+ const hash = await walletClient.sendTransaction({
102
+ account,
103
+ chain,
104
+ to: step.to as Address,
105
+ data: step.data as Hex,
106
+ value: BigInt(step.value),
107
+ });
108
+ await publicClient.waitForTransactionReceipt({ hash });
109
+ console.log("depositETH", hash);
110
+ }
111
+
112
+ await aureon.refreshWatchdog();
113
+ const h1 = (await aureon.getHealth(objective.id))[0]!;
114
+ console.log("health underweight", {
115
+ state: h1.state,
116
+ current: h1.currentMetric,
117
+ message: h1.message,
118
+ });
119
+
120
+ const plan = await aureon.getRestorePlan(objective.id);
121
+ console.log("plan", {
122
+ message: plan.message,
123
+ amountHuman: plan.amountHuman,
124
+ approxUsd: plan.approxUsd,
125
+ sell: (plan as { sellSymbol?: string }).sellSymbol,
126
+ buy: (plan as { buySymbol?: string }).buySymbol,
127
+ });
128
+
129
+ const receipt = await aureon.restoreObjective(objective.id);
130
+ console.log("exec", receipt.status, receipt.transactionHash);
131
+
132
+ await aureon.refreshWatchdog();
133
+ const h2 = (await aureon.getHealth(objective.id))[0]!;
134
+ console.log("health after", {
135
+ state: h2.state,
136
+ current: h2.currentMetric,
137
+ message: h2.message,
138
+ });
139
+
140
+ const weightPct = (h2.currentMetric ?? 0) * 100;
141
+ const ok = weightPct >= 5 && weightPct <= 45; // near 20% with band (was ~98% before)
142
+ console.log(
143
+ ok
144
+ ? `PASS sizing : TSLA weight ~${weightPct.toFixed(1)}% (want ~20%)`
145
+ : `FAIL sizing : TSLA weight ~${weightPct.toFixed(1)}% still overshot`
146
+ );
147
+ if (!ok) process.exitCode = 1;
@@ -0,0 +1,270 @@
1
+ /**
2
+ * @fileoverview Live SDK e2e against local AUREON API + Robinhood testnet vault.
3
+ *
4
+ * Exercises: wallet auth → sync → vault prepare deposit/withdraw (signed) →
5
+ * createObjective (Automatic) → restore plan.
6
+ *
7
+ * Env (loaded from backend/.env + .secrets automatically when unset):
8
+ * AUREON_API_URL default http://127.0.0.1:8787
9
+ * AUREON_API_KEY from backend/.env AUREON_API_KEYS (first key)
10
+ * AUREON_E2E_KEY hex private key (defaults to vault-deployer.key)
11
+ *
12
+ * pnpm --filter @buildaureon/sdk exec tsx examples/e2e-vault-flow/main.ts
13
+ */
14
+
15
+ import { readFileSync, existsSync } from "node:fs";
16
+ import { dirname, join } from "node:path";
17
+ import { fileURLToPath } from "node:url";
18
+ import {
19
+ createPublicClient,
20
+ createWalletClient,
21
+ http,
22
+ type Hex,
23
+ } from "viem";
24
+ import { privateKeyToAccount } from "viem/accounts";
25
+ import {
26
+ createAureonClient,
27
+ createSessionTokenProvider,
28
+ isAureonError,
29
+ LOCAL_API_BASE_URL,
30
+ } from "../../src/index.js";
31
+
32
+ const __dirname = dirname(fileURLToPath(import.meta.url));
33
+ const ROOT = join(__dirname, "../../..");
34
+ const BACKEND = join(ROOT, "backend");
35
+
36
+ function loadDotEnv(path: string): Record<string, string> {
37
+ if (!existsSync(path)) return {};
38
+ const out: Record<string, string> = {};
39
+ for (const line of readFileSync(path, "utf8").split(/\r?\n/)) {
40
+ const trimmed = line.trim();
41
+ if (!trimmed || trimmed.startsWith("#")) continue;
42
+ const i = trimmed.indexOf("=");
43
+ if (i < 0) continue;
44
+ out[trimmed.slice(0, i)] = trimmed.slice(i + 1).trim();
45
+ }
46
+ return out;
47
+ }
48
+
49
+ function firstApiKey(raw: string | undefined): string | null {
50
+ if (!raw) return null;
51
+ const key = raw.split(",")[0]?.trim();
52
+ return key || null;
53
+ }
54
+
55
+ function loadPrivateKey(): Hex {
56
+ if (process.env.AUREON_E2E_KEY?.startsWith("0x")) {
57
+ return process.env.AUREON_E2E_KEY as Hex;
58
+ }
59
+ const fromEnv = loadDotEnv(join(BACKEND, ".env")).AUREON_VAULT_DEPLOYER_KEY;
60
+ if (fromEnv?.startsWith("0x")) return fromEnv as Hex;
61
+ const keyPath = join(BACKEND, ".secrets/vault-deployer.key");
62
+ if (!existsSync(keyPath)) {
63
+ throw new Error("Missing AUREON_E2E_KEY / vault-deployer.key");
64
+ }
65
+ const hex = readFileSync(keyPath, "utf8").trim();
66
+ if (!/^0x[0-9a-fA-F]{64}$/.test(hex)) {
67
+ throw new Error("vault-deployer.key must be a 32-byte hex private key");
68
+ }
69
+ return hex as Hex;
70
+ }
71
+
72
+ function log(step: string, data?: unknown): void {
73
+ if (data === undefined) {
74
+ console.log(`✓ ${step}`);
75
+ return;
76
+ }
77
+ console.log(`✓ ${step}`, data);
78
+ }
79
+
80
+ async function main(): Promise<void> {
81
+ const env = loadDotEnv(join(BACKEND, ".env"));
82
+ const baseUrl =
83
+ process.env.AUREON_API_URL ?? env.AUREON_API_URL ?? LOCAL_API_BASE_URL;
84
+ const apiKey =
85
+ process.env.AUREON_API_KEY ?? firstApiKey(env.AUREON_API_KEYS);
86
+ const rpcUrl = env.AUREON_RPC_URL ?? "https://rpc.testnet.chain.robinhood.com";
87
+ const chainId = Number(env.AUREON_CHAIN_ID ?? 46630);
88
+
89
+ if (!apiKey) throw new Error("AUREON_API_KEY / AUREON_API_KEYS missing");
90
+
91
+ const account = privateKeyToAccount(loadPrivateKey());
92
+ const publicClient = createPublicClient({ transport: http(rpcUrl) });
93
+ const walletClient = createWalletClient({
94
+ account,
95
+ transport: http(rpcUrl),
96
+ });
97
+
98
+ const session = createSessionTokenProvider(null);
99
+ const aureon = createAureonClient({
100
+ baseUrl,
101
+ apiKey,
102
+ getAccessToken: session.getAccessToken,
103
+ });
104
+
105
+ const ping = await aureon.ping();
106
+ log("ping", ping);
107
+
108
+ const { message } = await aureon.getAuthNonce(account.address);
109
+ const signature = await walletClient.signMessage({
110
+ account,
111
+ message,
112
+ });
113
+ const login = await aureon.verifyWallet({
114
+ address: account.address,
115
+ message,
116
+ signature,
117
+ });
118
+ session.setToken(login.token);
119
+ log("auth", { wallet: login.walletAddress });
120
+
121
+ const me = await aureon.me();
122
+ if (me.walletAddress.toLowerCase() !== account.address.toLowerCase()) {
123
+ throw new Error("session wallet mismatch");
124
+ }
125
+
126
+ const synced = await aureon.syncPortfolio();
127
+ log("syncPortfolio", {
128
+ chainId: synced.chainId,
129
+ positions: synced.portfolio.positions.length,
130
+ totalNotionalUsd: synced.portfolio.totalNotionalUsd,
131
+ });
132
+
133
+ const vaultBefore = await aureon.getVault();
134
+ const statusBefore = await aureon.getVaultStatus();
135
+ const wethBefore =
136
+ vaultBefore.balances.find((b) => b.symbol.toUpperCase() === "WETH")
137
+ ?.quantity ?? 0;
138
+ log("vault before", {
139
+ address: vaultBefore.address,
140
+ empty: statusBefore.empty,
141
+ weth: wethBefore,
142
+ canRestore: statusBefore.canRestore,
143
+ });
144
+
145
+ const depositAmount = "0.0001";
146
+ const ethBal = await publicClient.getBalance({ address: account.address });
147
+ if (ethBal < 200000000000000n) {
148
+ throw new Error(
149
+ `Wallet ${account.address} needs ≥0.0002 ETH for deposit+gas (have ${ethBal})`
150
+ );
151
+ }
152
+
153
+ const deposit = await aureon.prepareVaultDeposit({
154
+ symbol: "ETH",
155
+ amount: depositAmount,
156
+ });
157
+ log("prepareVaultDeposit", {
158
+ steps: deposit.steps.map((s) => s.functionName),
159
+ amountHuman: deposit.amountHuman,
160
+ });
161
+
162
+ for (const step of deposit.steps) {
163
+ const hash = await walletClient.sendTransaction({
164
+ account,
165
+ chain: {
166
+ id: chainId,
167
+ name: "Robinhood Chain Testnet",
168
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
169
+ rpcUrls: { default: { http: [rpcUrl] } },
170
+ },
171
+ to: step.to as `0x${string}`,
172
+ data: step.data as Hex,
173
+ value: BigInt(step.value),
174
+ });
175
+ await publicClient.waitForTransactionReceipt({ hash });
176
+ log(`deposit tx ${step.functionName}`, { hash });
177
+ }
178
+
179
+ const vaultAfterDeposit = await aureon.getVault();
180
+ const wethAfterDeposit =
181
+ vaultAfterDeposit.balances.find((b) => b.symbol.toUpperCase() === "WETH")
182
+ ?.quantity ?? 0;
183
+ log("vault after deposit", { weth: wethAfterDeposit });
184
+ if (!(wethAfterDeposit > wethBefore)) {
185
+ throw new Error("expected vault WETH to increase after depositETH");
186
+ }
187
+
188
+ const withdrawAmount = "0.00005";
189
+ const withdraw = await aureon.prepareVaultWithdraw({
190
+ amount: withdrawAmount,
191
+ });
192
+ for (const step of withdraw.steps) {
193
+ const hash = await walletClient.sendTransaction({
194
+ account,
195
+ chain: {
196
+ id: chainId,
197
+ name: "Robinhood Chain Testnet",
198
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
199
+ rpcUrls: { default: { http: [rpcUrl] } },
200
+ },
201
+ to: step.to as `0x${string}`,
202
+ data: step.data as Hex,
203
+ value: BigInt(step.value),
204
+ });
205
+ await publicClient.waitForTransactionReceipt({ hash });
206
+ log(`withdraw tx ${step.functionName}`, { hash });
207
+ }
208
+
209
+ const vaultAfterWithdraw = await aureon.getVault();
210
+ const wethAfterWithdraw =
211
+ vaultAfterWithdraw.balances.find((b) => b.symbol.toUpperCase() === "WETH")
212
+ ?.quantity ?? 0;
213
+ log("vault after withdraw", { weth: wethAfterWithdraw });
214
+ if (!(wethAfterWithdraw < wethAfterDeposit)) {
215
+ throw new Error("expected vault WETH to decrease after withdraw");
216
+ }
217
+
218
+ await aureon.syncPortfolio();
219
+
220
+ const objective = await aureon.createObjective({
221
+ name: `SDK E2E Auto ${Date.now()}`,
222
+ kind: "balanced_portfolio",
223
+ targetWeight: 0.2,
224
+ tolerance: 0.05,
225
+ targetSymbol: "WETH",
226
+ priority: "high",
227
+ });
228
+ log("createObjective", {
229
+ id: objective.id,
230
+ automationMode: objective.automationMode,
231
+ summary: objective.policy.summary,
232
+ });
233
+ if (objective.automationMode !== "auto") {
234
+ throw new Error(
235
+ `SDK create must default to auto, got ${objective.automationMode}`
236
+ );
237
+ }
238
+
239
+ const health = await aureon.getHealth(objective.id);
240
+ log("health", health[0] ? { state: health[0].state, message: health[0].message } : null);
241
+
242
+ try {
243
+ const plan = await aureon.getRestorePlan(objective.id);
244
+ log("getRestorePlan", {
245
+ kind: plan.kind,
246
+ amountHuman: plan.amountHuman,
247
+ message: plan.message,
248
+ });
249
+ } catch (err) {
250
+ if (isAureonError(err)) {
251
+ log("getRestorePlan (expected if already in band)", {
252
+ code: err.code,
253
+ message: err.message,
254
+ });
255
+ } else {
256
+ throw err;
257
+ }
258
+ }
259
+
260
+ console.log("\nE2E OK : vault up/down + Automatic objective via SDK");
261
+ }
262
+
263
+ main().catch((error) => {
264
+ if (isAureonError(error)) {
265
+ console.error(`${error.code}: ${error.message}`);
266
+ } else {
267
+ console.error(error instanceof Error ? error.message : error);
268
+ }
269
+ process.exitCode = 1;
270
+ });
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @fileoverview Controlled market event example (simulation helper).
3
+ *
4
+ * Env: AUREON_API_KEY, AUREON_TOKEN, optional AUREON_API_URL
5
+ *
6
+ * pnpm --filter @buildaureon/sdk example:market
7
+ */
8
+
9
+ import {
10
+ createAureonClient,
11
+ createSessionTokenProvider,
12
+ DEFAULT_API_BASE_URL,
13
+ isAureonError,
14
+ } from "../../src/index.js";
15
+
16
+ async function main(): Promise<void> {
17
+ const session = createSessionTokenProvider(process.env.AUREON_TOKEN ?? null);
18
+ if (!session.getAccessToken()) {
19
+ throw new Error("Set AUREON_TOKEN from a wallet verify session.");
20
+ }
21
+
22
+ const aureon = createAureonClient({
23
+ baseUrl: process.env.AUREON_API_URL ?? DEFAULT_API_BASE_URL,
24
+ apiKey: process.env.AUREON_API_KEY ?? null,
25
+ getAccessToken: session.getAccessToken,
26
+ });
27
+
28
+ const objective = await aureon.createObjective({
29
+ name: "Maintain 20% Stable Assets",
30
+ kind: "stable_allocation",
31
+ targetWeight: 0.2,
32
+ tolerance: 0.02,
33
+ });
34
+
35
+ const result = await aureon.applyMarketEvent({
36
+ name: "NVDA Stock Token Rally",
37
+ description: "Controlled mark appreciation on NVIDIA Stock Token",
38
+ symbol: "NVDA",
39
+ priceChangeRatio: 0.45,
40
+ autoRestore: true,
41
+ });
42
+
43
+ console.log(
44
+ JSON.stringify(
45
+ {
46
+ objectiveId: objective.id,
47
+ eventId: result.event.id,
48
+ executions: result.executions.length,
49
+ settlement: result.executions[0]?.settlement ?? null,
50
+ health: result.health.find((h) => h.objectiveId === objective.id)?.state,
51
+ },
52
+ null,
53
+ 2
54
+ )
55
+ );
56
+ }
57
+
58
+ main().catch((error) => {
59
+ if (isAureonError(error)) {
60
+ console.error(`${error.code}: ${error.message}`);
61
+ } else {
62
+ console.error(error);
63
+ }
64
+ process.exitCode = 1;
65
+ });
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @fileoverview Quickstart example for @buildaureon/sdk against the AUREON API.
3
+ *
4
+ * Env:
5
+ * AUREON_API_KEY : product key (required on hosted API)
6
+ * AUREON_TOKEN : wallet Bearer session
7
+ * AUREON_API_URL : optional override (defaults to https://api.aureonlabs.network)
8
+ *
9
+ * pnpm --filter @buildaureon/sdk example:quickstart
10
+ */
11
+
12
+ import {
13
+ createAureonClient,
14
+ createSessionTokenProvider,
15
+ DEFAULT_API_BASE_URL,
16
+ formatWeight,
17
+ isAureonError,
18
+ } from "../../src/index.js";
19
+
20
+ async function main(): Promise<void> {
21
+ const session = createSessionTokenProvider(process.env.AUREON_TOKEN ?? null);
22
+ const aureon = createAureonClient({
23
+ baseUrl: process.env.AUREON_API_URL ?? DEFAULT_API_BASE_URL,
24
+ apiKey: process.env.AUREON_API_KEY ?? null,
25
+ getAccessToken: session.getAccessToken,
26
+ });
27
+
28
+ const ping = await aureon.ping();
29
+ console.log("connected", ping);
30
+
31
+ if (!session.getAccessToken()) {
32
+ throw new Error(
33
+ "Set AUREON_TOKEN from a wallet verify session (nonce → sign → verifyWallet)."
34
+ );
35
+ }
36
+
37
+ const me = await aureon.me();
38
+ console.log("wallet", me.walletAddress);
39
+
40
+ const synced = await aureon.syncPortfolio();
41
+ console.log("synced", {
42
+ chainId: synced.chainId,
43
+ positions: synced.portfolio.positions.length,
44
+ stableWeight: formatWeight(synced.portfolio.stableWeight),
45
+ });
46
+
47
+ const vault = await aureon.getVaultStatus();
48
+ console.log("vault", {
49
+ empty: vault.empty,
50
+ canRestore: vault.canRestore,
51
+ totalNotionalUsd: vault.totalNotionalUsd,
52
+ });
53
+
54
+ const objectives = await aureon.listObjectives();
55
+ console.log(
56
+ "objectives",
57
+ objectives.map((o) => ({
58
+ name: o.name,
59
+ automationMode: o.automationMode,
60
+ }))
61
+ );
62
+ }
63
+
64
+ main().catch((error) => {
65
+ if (isAureonError(error)) {
66
+ console.error(`${error.code}: ${error.message}`);
67
+ } else {
68
+ console.error(error instanceof Error ? error.message : error);
69
+ }
70
+ process.exitCode = 1;
71
+ });
@@ -0,0 +1,18 @@
1
+ {
2
+ "objectives": [
3
+ {
4
+ "name": "Maintain 20% Stable Assets",
5
+ "kind": "stable_allocation",
6
+ "targetWeight": 0.2,
7
+ "tolerance": 0.02,
8
+ "priority": "high"
9
+ },
10
+ {
11
+ "name": "Balanced Stock Token Sleeve",
12
+ "kind": "balanced_portfolio",
13
+ "targetWeight": 0.55,
14
+ "tolerance": 0.05,
15
+ "priority": "medium"
16
+ }
17
+ ]
18
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "portfolioId": "portfolio_operator_primary",
3
+ "positions": [
4
+ { "symbol": "USDG", "category": "stable", "quantity": 24000, "markPriceUsd": 1 },
5
+ { "symbol": "NVDA", "category": "stock_token", "quantity": 45, "markPriceUsd": 920 },
6
+ { "symbol": "AAPL", "category": "stock_token", "quantity": 80, "markPriceUsd": 210 },
7
+ { "symbol": "GOOGL", "category": "stock_token", "quantity": 60, "markPriceUsd": 175 },
8
+ { "symbol": "ETH", "category": "gas", "quantity": 8.5, "markPriceUsd": 3400 }
9
+ ]
10
+ }
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@buildaureon/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Official TypeScript SDK for AUREON Financial Compass on Robinhood Chain",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md",
18
+ "LICENSE",
19
+ "docs",
20
+ "examples",
21
+ "config",
22
+ "fixtures"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsup",
26
+ "dev": "tsup --watch",
27
+ "typecheck": "tsc -p tsconfig.json --noEmit",
28
+ "test": "tsx --test tests/**/*.test.ts",
29
+ "bench": "tsx benchmarks/client-throughput.ts",
30
+ "example:quickstart": "tsx examples/quickstart/main.ts",
31
+ "example:market": "tsx examples/market-event/main.ts",
32
+ "example:e2e": "tsx examples/e2e-vault-flow/main.ts",
33
+ "example:e2e-policy": "tsx examples/e2e-policy-rebalance/main.ts",
34
+ "cli": "tsx cli/aureon-cli.ts",
35
+ "prepublishOnly": "pnpm build"
36
+ },
37
+ "keywords": [
38
+ "aureon",
39
+ "robinhood-chain",
40
+ "fco",
41
+ "financial-compass",
42
+ "sdk",
43
+ "typescript"
44
+ ],
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "https://github.com/buildaureon/aureon-sdk"
48
+ },
49
+ "license": "MIT",
50
+ "author": "AUREON Labs (https://github.com/buildaureon)",
51
+ "publishConfig": {
52
+ "access": "public"
53
+ },
54
+ "engines": {
55
+ "node": ">=20"
56
+ },
57
+ "devDependencies": {
58
+ "@types/node": "^22.13.10",
59
+ "tsup": "^8.5.1",
60
+ "tsx": "^4.23.1",
61
+ "typescript": "^5.9.3",
62
+ "viem": "^2.55.1"
63
+ }
64
+ }