@prktsol/prkt 1.0.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.
- package/.env.devnet.all-protocols.example +18 -0
- package/.env.devnet.autonomous.example +16 -0
- package/.env.devnet.jupiter.example +16 -0
- package/.env.devnet.kamino.example +17 -0
- package/.env.devnet.marinade.example +16 -0
- package/.env.devnet.orca.example +16 -0
- package/.env.devnet.raydium.example +17 -0
- package/.env.example +32 -0
- package/ARCHITECTURE.md +159 -0
- package/CLI.md +509 -0
- package/CLI_QUICKSTART.md +108 -0
- package/COMPATIBILITY.md +103 -0
- package/DEVNET_PROTOCOL_ADDRESSES.md +72 -0
- package/README.md +339 -0
- package/dist/agent/AgentManager.js +166 -0
- package/dist/agent/AgentRuntime.js +92 -0
- package/dist/agent/DecisionEngine.js +95 -0
- package/dist/agent/MockPriceFeed.js +13 -0
- package/dist/agent/intents/types.js +2 -0
- package/dist/agent/new-index.js +17 -0
- package/dist/agent/policyFactory.js +54 -0
- package/dist/agent/registry/AgentRegistry.js +16 -0
- package/dist/agent/runner/AgentRunner.js +266 -0
- package/dist/agent/strategies/MemoHeartbeatStrategy.js +15 -0
- package/dist/agent/strategies/SimpleScriptedTransferStrategy.js +27 -0
- package/dist/agent/strategies/TokenRebalancerStrategy.js +35 -0
- package/dist/agent/strategies/TreasuryDistributorStrategy.js +29 -0
- package/dist/agent/strategies/UniversalDeFiStrategy.js +19 -0
- package/dist/agent/types/AgentContext.js +2 -0
- package/dist/cli/index.js +1159 -0
- package/dist/cli/services/activityStore.js +42 -0
- package/dist/cli/services/agentRegistry.js +123 -0
- package/dist/cli/services/agentRuntime.js +55 -0
- package/dist/cli/services/storagePaths.js +64 -0
- package/dist/cli/services/strategyFactory.js +66 -0
- package/dist/cli/services/walletCrypto.js +120 -0
- package/dist/cli/services/walletRegistry.js +145 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/utils/completion.js +62 -0
- package/dist/cli/utils/output.js +44 -0
- package/dist/config/agentPolicies.js +37 -0
- package/dist/config/env.js +249 -0
- package/dist/config/policyPresets.js +105 -0
- package/dist/core/balances/BalanceService.js +34 -0
- package/dist/core/funding/DevnetFundingService.js +105 -0
- package/dist/core/idempotency/ExecutionIdempotencyGuard.js +100 -0
- package/dist/core/index.js +19 -0
- package/dist/core/rpc/RpcClient.js +45 -0
- package/dist/core/rpc/RpcFailoverClient.js +97 -0
- package/dist/core/tokens/TokenService.js +75 -0
- package/dist/core/transactions/PostTransactionVerifier.js +103 -0
- package/dist/core/transactions/TransactionService.js +104 -0
- package/dist/core/types/services.js +2 -0
- package/dist/core/wallet/WalletManager.js +120 -0
- package/dist/defi/DeFiCoordinator.js +93 -0
- package/dist/defi/DeFiExecutor.js +29 -0
- package/dist/defi/DeFiPolicyGuard.js +31 -0
- package/dist/defi/adapters/JupiterAdapter.js +25 -0
- package/dist/defi/adapters/KaminoAdapter.js +50 -0
- package/dist/defi/adapters/MarinadeAdapter.js +25 -0
- package/dist/defi/adapters/RaydiumAdapter.js +45 -0
- package/dist/defi/kamino/kaminoInstructionCompat.js +24 -0
- package/dist/defi/kamino/kaminoLiveConfig.js +60 -0
- package/dist/defi/kamino/loadKaminoMarketWithFallback.js +68 -0
- package/dist/defi/lp/LpInstructionBuilder.js +2 -0
- package/dist/defi/lp/RaydiumLpInstructionBuilder.js +100 -0
- package/dist/defi/lp/raydiumDevnetConfig.js +62 -0
- package/dist/defi/protocols.js +29 -0
- package/dist/defi/types.js +2 -0
- package/dist/defi/universal/UniversalDeFiOrchestrator.js +126 -0
- package/dist/defi/universal/adapters.js +73 -0
- package/dist/defi/universal/index.js +5 -0
- package/dist/defi/universal/liveExecutors.js +394 -0
- package/dist/defi/universal/types.js +2 -0
- package/dist/demo/scenarios/multiAgentDevnetScenario.js +170 -0
- package/dist/demo/scripts/runMultiAgentDevnetDemo.js +17 -0
- package/dist/dex/JupiterSwapClient.js +59 -0
- package/dist/dex/SwapExecutor.js +52 -0
- package/dist/index.js +22 -0
- package/dist/kora/KoraRpcClient.js +60 -0
- package/dist/kora/KoraSigner.js +57 -0
- package/dist/kora/gaslessDemo.js +18 -0
- package/dist/policy/PolicyGuard.js +158 -0
- package/dist/policy/emergencyLock.js +164 -0
- package/dist/policy/engine/PolicyEngine.js +237 -0
- package/dist/policy/errors.js +10 -0
- package/dist/policy/index.js +7 -0
- package/dist/policy/sandbox/SandboxExecutor.js +77 -0
- package/dist/policy/types/policy.js +2 -0
- package/dist/scripts/devnetFunding.js +28 -0
- package/dist/scripts/devnetWalletPreflight.js +16 -0
- package/dist/scripts/localnetCheck.js +27 -0
- package/dist/scripts/managedAgentWallet.js +81 -0
- package/dist/scripts/mode.js +6 -0
- package/dist/scripts/releaseReadiness.js +93 -0
- package/dist/scripts/runAgentUniversalDeFi.js +115 -0
- package/dist/scripts/runAutonomousAgentWalletDevnet.js +154 -0
- package/dist/scripts/runAutonomousPortfolioDevnet.js +390 -0
- package/dist/scripts/runBorrowStrategy.js +35 -0
- package/dist/scripts/runDeFiSuite.js +41 -0
- package/dist/scripts/runDemoRehearsal.js +111 -0
- package/dist/scripts/runDevnetWalletDemo.js +53 -0
- package/dist/scripts/runGaslessMemo.js +23 -0
- package/dist/scripts/runGaslessWalletDemo.js +60 -0
- package/dist/scripts/runKaminoDevnet.js +109 -0
- package/dist/scripts/runLpStrategy.js +32 -0
- package/dist/scripts/runMarinadeDevnet.js +97 -0
- package/dist/scripts/runOrcaLpDevnet.js +208 -0
- package/dist/scripts/runRaydiumLpDevnet.js +95 -0
- package/dist/scripts/runReleaseReadiness.js +22 -0
- package/dist/scripts/runStakeStrategy.js +33 -0
- package/dist/scripts/runStressTest.js +41 -0
- package/dist/scripts/runTradeLoop.js +53 -0
- package/dist/scripts/runUniversalDeFiDemo.js +84 -0
- package/dist/scripts/runYieldStrategy.js +33 -0
- package/dist/scripts/runtimeFactory.js +27 -0
- package/dist/scripts/shared.js +24 -0
- package/dist/scripts/simulateAttack.js +40 -0
- package/dist/scripts/simulateSwarm.js +106 -0
- package/dist/simulation/attack.js +30 -0
- package/dist/solana/programs.js +9 -0
- package/dist/spl/TokenWallet.js +65 -0
- package/dist/types/policy.js +2 -0
- package/dist/wallet/WalletManager.js +5 -0
- package/package.json +99 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runCommandCheck = runCommandCheck;
|
|
4
|
+
exports.evaluateProductionTodo = evaluateProductionTodo;
|
|
5
|
+
exports.findOpenBlockingTodoItems = findOpenBlockingTodoItems;
|
|
6
|
+
exports.runReadinessChecks = runReadinessChecks;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const child_process_1 = require("child_process");
|
|
9
|
+
const BLOCKING_TODO_SECTION_PREFIXES = [
|
|
10
|
+
"## P0 Blockers",
|
|
11
|
+
"## P1 Security Hardening",
|
|
12
|
+
"## P1 End-to-End Live Paths",
|
|
13
|
+
"## P0 Test and Release Gates",
|
|
14
|
+
"## Mainnet Deployment Gate"
|
|
15
|
+
];
|
|
16
|
+
function runCommandCheck(command, args) {
|
|
17
|
+
const result = (0, child_process_1.spawnSync)([command, ...args].join(" "), {
|
|
18
|
+
shell: true,
|
|
19
|
+
stdio: "inherit"
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
detail: `${command} ${args.join(" ")}`,
|
|
23
|
+
ok: result.status === 0,
|
|
24
|
+
title: `Command ${command}`
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function evaluateProductionTodo(todoPath = "PRODUCTION_READINESS_TODO.md") {
|
|
28
|
+
if (!(0, fs_1.existsSync)(todoPath)) {
|
|
29
|
+
return {
|
|
30
|
+
detail: todoPath,
|
|
31
|
+
ok: false,
|
|
32
|
+
title: "Production TODO present"
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const blockingItems = findOpenBlockingTodoItems((0, fs_1.readFileSync)(todoPath, "utf8"));
|
|
36
|
+
if (blockingItems.length === 0) {
|
|
37
|
+
return {
|
|
38
|
+
detail: "No open P0/P1/mainnet deployment blockers",
|
|
39
|
+
ok: true,
|
|
40
|
+
title: "Production blockers cleared"
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
detail: blockingItems.join(" | "),
|
|
45
|
+
ok: false,
|
|
46
|
+
title: "Production blockers cleared"
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function findOpenBlockingTodoItems(markdown) {
|
|
50
|
+
const openItems = [];
|
|
51
|
+
let currentSection = "";
|
|
52
|
+
for (const rawLine of markdown.split(/\r?\n/u)) {
|
|
53
|
+
const line = rawLine.trim();
|
|
54
|
+
if (line.startsWith("## ")) {
|
|
55
|
+
currentSection = line;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (!BLOCKING_TODO_SECTION_PREFIXES.some((section) => currentSection.startsWith(section))) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const match = line.match(/^- \[ \] (.+)$/u);
|
|
62
|
+
if (!match) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
openItems.push(`${currentSection.replace(/^## /u, "")}: ${match[1]}`);
|
|
66
|
+
}
|
|
67
|
+
return openItems;
|
|
68
|
+
}
|
|
69
|
+
function runReadinessChecks() {
|
|
70
|
+
const npmCommand = "npm";
|
|
71
|
+
const checks = [];
|
|
72
|
+
checks.push({
|
|
73
|
+
detail: ".env.example",
|
|
74
|
+
ok: (0, fs_1.existsSync)(".env.example"),
|
|
75
|
+
title: "Env template present"
|
|
76
|
+
});
|
|
77
|
+
checks.push({
|
|
78
|
+
detail: "SKILLS.md",
|
|
79
|
+
ok: (0, fs_1.existsSync)("SKILLS.md"),
|
|
80
|
+
title: "Agent skills file present"
|
|
81
|
+
});
|
|
82
|
+
checks.push({
|
|
83
|
+
detail: "README.md",
|
|
84
|
+
ok: (0, fs_1.existsSync)("README.md"),
|
|
85
|
+
title: "README present"
|
|
86
|
+
});
|
|
87
|
+
checks.push(evaluateProductionTodo());
|
|
88
|
+
checks.push(runCommandCheck(npmCommand, ["run", "build"]));
|
|
89
|
+
checks.push(runCommandCheck("node", ["dist/cli/index.js", "--help"]));
|
|
90
|
+
checks.push(runCommandCheck(npmCommand, ["run", "test:coverage"]));
|
|
91
|
+
checks.push(runCommandCheck(npmCommand, ["pack", "--dry-run", "--cache", ".npm-cache"]));
|
|
92
|
+
return checks;
|
|
93
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
4
|
+
const AgentRunner_1 = require("../agent/runner/AgentRunner");
|
|
5
|
+
const UniversalDeFiStrategy_1 = require("../agent/strategies/UniversalDeFiStrategy");
|
|
6
|
+
const agentPolicies_1 = require("../config/agentPolicies");
|
|
7
|
+
const env_1 = require("../config/env");
|
|
8
|
+
const BalanceService_1 = require("../core/balances/BalanceService");
|
|
9
|
+
const RpcClient_1 = require("../core/rpc/RpcClient");
|
|
10
|
+
const TokenService_1 = require("../core/tokens/TokenService");
|
|
11
|
+
const TransactionService_1 = require("../core/transactions/TransactionService");
|
|
12
|
+
const universal_1 = require("../defi/universal");
|
|
13
|
+
const managedAgentWallet_1 = require("./managedAgentWallet");
|
|
14
|
+
const mode_1 = require("./mode");
|
|
15
|
+
const shared_1 = require("./shared");
|
|
16
|
+
const DEFAULT_AGENT_NAME = "agent-universal-defi";
|
|
17
|
+
async function main() {
|
|
18
|
+
(0, mode_1.printDemoMode)("SIMULATED", "AgentRunner universal DeFi flow (agent emits trade/lp/lending/borrowing/yield/staking intents)");
|
|
19
|
+
const rpcClient = new RpcClient_1.RpcClient((0, env_1.getRpcUrl)(), "confirmed");
|
|
20
|
+
const transactionService = new TransactionService_1.TransactionService(rpcClient);
|
|
21
|
+
const tokenService = new TokenService_1.TokenService(rpcClient);
|
|
22
|
+
const managed = (0, managedAgentWallet_1.resolveManagedAgentWallet)({
|
|
23
|
+
agentName: (0, managedAgentWallet_1.getManagedAgentName)({
|
|
24
|
+
defaultAgentName: DEFAULT_AGENT_NAME,
|
|
25
|
+
env: process.env
|
|
26
|
+
}),
|
|
27
|
+
ownerId: (0, managedAgentWallet_1.getManagedOwnerId)(process.env)
|
|
28
|
+
});
|
|
29
|
+
const walletManager = managed.walletManager;
|
|
30
|
+
const balanceService = new BalanceService_1.BalanceService(rpcClient, tokenService);
|
|
31
|
+
const koraSigner = (0, shared_1.createKoraSigner)();
|
|
32
|
+
const universalDeFi = new universal_1.UniversalDeFiOrchestrator({
|
|
33
|
+
koraSigner,
|
|
34
|
+
liveFirst: false,
|
|
35
|
+
logger: (message) => console.log(`[universal-defi] ${message}`),
|
|
36
|
+
walletManager
|
|
37
|
+
});
|
|
38
|
+
const runner = new AgentRunner_1.AgentRunner();
|
|
39
|
+
const agentId = managed.agent.name;
|
|
40
|
+
(0, managedAgentWallet_1.logManagedAgentWallet)(managed);
|
|
41
|
+
runner.registerAgent({
|
|
42
|
+
context: {
|
|
43
|
+
id: agentId,
|
|
44
|
+
walletManager,
|
|
45
|
+
walletPublicKey: walletManager.publicKey,
|
|
46
|
+
rpcClient,
|
|
47
|
+
transactionService,
|
|
48
|
+
tokenService,
|
|
49
|
+
balanceService,
|
|
50
|
+
policyConfig: (0, agentPolicies_1.createDefaultPolicyConfig)({
|
|
51
|
+
agentId
|
|
52
|
+
}),
|
|
53
|
+
logger: (message) => console.log(`[${agentId}] ${message}`),
|
|
54
|
+
universalDeFiExecutor: universalDeFi
|
|
55
|
+
},
|
|
56
|
+
strategy: new UniversalDeFiStrategy_1.UniversalDeFiStrategy([
|
|
57
|
+
{
|
|
58
|
+
capability: "trade",
|
|
59
|
+
snapshot: {
|
|
60
|
+
buyThresholdUsd: 100,
|
|
61
|
+
solPriceUsd: 95
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
capability: "staking",
|
|
66
|
+
snapshot: {
|
|
67
|
+
idleSolLamports: Math.round(1.0 * web3_js_1.LAMPORTS_PER_SOL)
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
capability: "lp",
|
|
72
|
+
snapshot: {
|
|
73
|
+
liquidityInRange: true
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
capability: "lending",
|
|
78
|
+
snapshot: {
|
|
79
|
+
healthFactor: 2.0,
|
|
80
|
+
idleUsdcAtomic: 5_000_000
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
capability: "borrowing",
|
|
85
|
+
protocol: "kamino",
|
|
86
|
+
snapshot: {
|
|
87
|
+
borrowDemandUsdcAtomic: 3_000_000,
|
|
88
|
+
collateralSolLamports: Math.round(1.2 * web3_js_1.LAMPORTS_PER_SOL),
|
|
89
|
+
healthFactor: 2.3
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
capability: "yield",
|
|
94
|
+
protocol: "raydium",
|
|
95
|
+
snapshot: {
|
|
96
|
+
rewardsClaimableAtomic: 750_000
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
])
|
|
100
|
+
});
|
|
101
|
+
const result = await runner.runOnceParallel();
|
|
102
|
+
console.log("Agent universal DeFi run complete.");
|
|
103
|
+
for (const agent of result) {
|
|
104
|
+
for (const outcome of agent.outcomes) {
|
|
105
|
+
const intentType = outcome.intent.type;
|
|
106
|
+
const suffix = outcome.signature ? `signature=${outcome.signature}` : "HOLD";
|
|
107
|
+
console.log(`${agent.agentId} ${intentType} -> ${suffix}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
main().catch((error) => {
|
|
112
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
113
|
+
console.error(`Agent universal DeFi run failed: ${message}`);
|
|
114
|
+
process.exitCode = 1;
|
|
115
|
+
});
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const marinade_ts_sdk_1 = require("@marinade.finance/marinade-ts-sdk");
|
|
4
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
5
|
+
const AgentRunner_1 = require("../agent/runner/AgentRunner");
|
|
6
|
+
const UniversalDeFiStrategy_1 = require("../agent/strategies/UniversalDeFiStrategy");
|
|
7
|
+
const agentPolicies_1 = require("../config/agentPolicies");
|
|
8
|
+
const env_1 = require("../config/env");
|
|
9
|
+
const BalanceService_1 = require("../core/balances/BalanceService");
|
|
10
|
+
const DevnetFundingService_1 = require("../core/funding/DevnetFundingService");
|
|
11
|
+
const RpcClient_1 = require("../core/rpc/RpcClient");
|
|
12
|
+
const TokenService_1 = require("../core/tokens/TokenService");
|
|
13
|
+
const TransactionService_1 = require("../core/transactions/TransactionService");
|
|
14
|
+
const universal_1 = require("../defi/universal");
|
|
15
|
+
const managedAgentWallet_1 = require("./managedAgentWallet");
|
|
16
|
+
const mode_1 = require("./mode");
|
|
17
|
+
const shared_1 = require("./shared");
|
|
18
|
+
const DEFAULT_AGENT_NAME = "agent-autonomous-wallet";
|
|
19
|
+
const REQUIRED_FUNDING_SOL = 0.5;
|
|
20
|
+
const DEFAULT_STAKE_SOL = 0.15;
|
|
21
|
+
async function main() {
|
|
22
|
+
(0, mode_1.printDemoMode)("LIVE", "Autonomous agent wallet: provision or load the assigned agent wallet, fund on devnet, execute live Marinade stake, and verify owner stop control");
|
|
23
|
+
const rpcUrl = (0, env_1.getRpcUrl)();
|
|
24
|
+
const cluster = (0, env_1.detectClusterFromRpcUrl)(rpcUrl);
|
|
25
|
+
if (cluster !== "devnet") {
|
|
26
|
+
throw new Error(`Autonomous agent wallet demo requires devnet. Current RPC cluster is ${cluster} (${rpcUrl}).`);
|
|
27
|
+
}
|
|
28
|
+
const rpcClient = new RpcClient_1.RpcClient(rpcUrl, "confirmed");
|
|
29
|
+
const tokenService = new TokenService_1.TokenService(rpcClient);
|
|
30
|
+
const balanceService = new BalanceService_1.BalanceService(rpcClient, tokenService);
|
|
31
|
+
const transactionService = new TransactionService_1.TransactionService(rpcClient);
|
|
32
|
+
const fundingService = new DevnetFundingService_1.DevnetFundingService(rpcClient, transactionService);
|
|
33
|
+
const managed = (0, managedAgentWallet_1.resolveManagedAgentWallet)({
|
|
34
|
+
agentName: (0, managedAgentWallet_1.getManagedAgentName)({
|
|
35
|
+
defaultAgentName: DEFAULT_AGENT_NAME,
|
|
36
|
+
env: process.env
|
|
37
|
+
}),
|
|
38
|
+
ownerId: (0, managedAgentWallet_1.getManagedOwnerId)(process.env)
|
|
39
|
+
});
|
|
40
|
+
const walletManager = managed.walletManager;
|
|
41
|
+
const logger = (0, shared_1.createRuntimeLogger)("autonomous-agent");
|
|
42
|
+
const agentId = managed.agent.name;
|
|
43
|
+
console.log("PRKT autonomous agent wallet demo");
|
|
44
|
+
console.log(`RPC: ${rpcUrl}`);
|
|
45
|
+
(0, managedAgentWallet_1.logManagedAgentWallet)(managed);
|
|
46
|
+
await (0, managedAgentWallet_1.ensureManagedAgentWalletFunding)({
|
|
47
|
+
balanceService,
|
|
48
|
+
fundingService,
|
|
49
|
+
minimumSol: REQUIRED_FUNDING_SOL,
|
|
50
|
+
publicKey: walletManager.publicKey
|
|
51
|
+
});
|
|
52
|
+
const marinade = new marinade_ts_sdk_1.Marinade(new marinade_ts_sdk_1.MarinadeConfig({
|
|
53
|
+
connection: rpcClient.connection,
|
|
54
|
+
publicKey: walletManager.publicKey
|
|
55
|
+
}));
|
|
56
|
+
const marinadeState = await marinade.getMarinadeState();
|
|
57
|
+
const msolMint = marinadeState.mSolMintAddress;
|
|
58
|
+
const solBefore = await balanceService.getSolBalance(walletManager.publicKey);
|
|
59
|
+
const msolBefore = await balanceService.getSplTokenBalance({
|
|
60
|
+
mint: msolMint,
|
|
61
|
+
owner: walletManager.publicKey
|
|
62
|
+
});
|
|
63
|
+
const koraSigner = (0, shared_1.createKoraSigner)();
|
|
64
|
+
const universalDeFi = new universal_1.UniversalDeFiOrchestrator({
|
|
65
|
+
koraSigner,
|
|
66
|
+
liveFirst: true,
|
|
67
|
+
logger,
|
|
68
|
+
walletManager
|
|
69
|
+
});
|
|
70
|
+
const runner = new AgentRunner_1.AgentRunner();
|
|
71
|
+
runner.registerAgent({
|
|
72
|
+
context: {
|
|
73
|
+
id: agentId,
|
|
74
|
+
walletManager,
|
|
75
|
+
walletPublicKey: walletManager.publicKey,
|
|
76
|
+
rpcClient,
|
|
77
|
+
transactionService,
|
|
78
|
+
tokenService,
|
|
79
|
+
balanceService,
|
|
80
|
+
policyConfig: (0, agentPolicies_1.createDefaultPolicyConfig)({
|
|
81
|
+
agentId,
|
|
82
|
+
maxSolPerTxLamports: Math.round(0.3 * web3_js_1.LAMPORTS_PER_SOL),
|
|
83
|
+
maxTransactionsPerDay: 10,
|
|
84
|
+
maxTransactionsPerSession: 3
|
|
85
|
+
}),
|
|
86
|
+
logger,
|
|
87
|
+
universalDeFiExecutor: universalDeFi
|
|
88
|
+
},
|
|
89
|
+
strategy: new UniversalDeFiStrategy_1.UniversalDeFiStrategy([
|
|
90
|
+
{
|
|
91
|
+
capability: "staking",
|
|
92
|
+
protocol: "marinade",
|
|
93
|
+
snapshot: {
|
|
94
|
+
idleSolLamports: Math.round(solBefore * web3_js_1.LAMPORTS_PER_SOL)
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
]),
|
|
98
|
+
approvalMode: "sandbox"
|
|
99
|
+
});
|
|
100
|
+
const [runResult] = await runner.runOnceParallel();
|
|
101
|
+
if (!runResult) {
|
|
102
|
+
throw new Error("Autonomous agent run did not produce a result.");
|
|
103
|
+
}
|
|
104
|
+
const [stakeOutcome] = runResult.outcomes;
|
|
105
|
+
if (!stakeOutcome) {
|
|
106
|
+
throw new Error("Autonomous agent produced no staking outcome.");
|
|
107
|
+
}
|
|
108
|
+
if (!stakeOutcome.allowed || !stakeOutcome.signature) {
|
|
109
|
+
throw new Error(`Autonomous stake was blocked: ${stakeOutcome.reasons.join("; ") || "unknown reason"}`);
|
|
110
|
+
}
|
|
111
|
+
const solAfter = await balanceService.getSolBalance(walletManager.publicKey);
|
|
112
|
+
const msolAfter = await balanceService.getSplTokenBalance({
|
|
113
|
+
mint: msolMint,
|
|
114
|
+
owner: walletManager.publicKey
|
|
115
|
+
});
|
|
116
|
+
if (msolAfter <= msolBefore) {
|
|
117
|
+
throw new Error(`Autonomous stake verification failed: mSOL did not increase (${msolBefore.toFixed(6)} -> ${msolAfter.toFixed(6)}).`);
|
|
118
|
+
}
|
|
119
|
+
console.log("");
|
|
120
|
+
console.log("Autonomous run");
|
|
121
|
+
console.log(`Agent: ${agentId}`);
|
|
122
|
+
console.log(`Intent: stake ${DEFAULT_STAKE_SOL.toFixed(2)} SOL via Marinade`);
|
|
123
|
+
console.log(`Signature: ${stakeOutcome.signature}`);
|
|
124
|
+
console.log(`SOL before: ${solBefore.toFixed(4)}`);
|
|
125
|
+
console.log(`SOL after: ${solAfter.toFixed(4)}`);
|
|
126
|
+
console.log(`mSOL before: ${msolBefore.toFixed(6)}`);
|
|
127
|
+
console.log(`mSOL after: ${msolAfter.toFixed(6)}`);
|
|
128
|
+
const originalEmergencyLock = process.env.POLICY_EMERGENCY_LOCK;
|
|
129
|
+
process.env.POLICY_EMERGENCY_LOCK = "true";
|
|
130
|
+
try {
|
|
131
|
+
const [lockedRun] = await runner.runOnceParallel();
|
|
132
|
+
const [lockedOutcome] = lockedRun?.outcomes ?? [];
|
|
133
|
+
if (!lockedOutcome || lockedOutcome.allowed) {
|
|
134
|
+
throw new Error("Emergency lock supervision check failed: agent execution was not blocked.");
|
|
135
|
+
}
|
|
136
|
+
console.log("");
|
|
137
|
+
console.log("Owner supervision");
|
|
138
|
+
console.log("Emergency lock engaged via POLICY_EMERGENCY_LOCK=true");
|
|
139
|
+
console.log(`Blocked reasons: ${lockedOutcome.reasons.join("; ")}`);
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
if (originalEmergencyLock === undefined) {
|
|
143
|
+
delete process.env.POLICY_EMERGENCY_LOCK;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
process.env.POLICY_EMERGENCY_LOCK = originalEmergencyLock;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
main().catch((error) => {
|
|
151
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
152
|
+
console.error(`Autonomous agent wallet demo failed: ${message}`);
|
|
153
|
+
process.exitCode = 1;
|
|
154
|
+
});
|