@scriptmasterlabs/mcp-x402 2.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.example +35 -0
- package/.github/workflows/ci.yml +59 -0
- package/.github/workflows/keepalive.yml +31 -0
- package/.well-known/agentcard.json +34 -0
- package/CONTRIBUTING.md +76 -0
- package/Dockerfile +19 -0
- package/LICENSE +21 -0
- package/README.md +304 -0
- package/agents.json +67 -0
- package/dist/lib/chains/base.d.ts +10 -0
- package/dist/lib/chains/base.d.ts.map +1 -0
- package/dist/lib/chains/base.js +73 -0
- package/dist/lib/chains/base.js.map +1 -0
- package/dist/lib/chains/solana.d.ts +10 -0
- package/dist/lib/chains/solana.d.ts.map +1 -0
- package/dist/lib/chains/solana.js +49 -0
- package/dist/lib/chains/solana.js.map +1 -0
- package/dist/lib/chains/xrpl.d.ts +10 -0
- package/dist/lib/chains/xrpl.d.ts.map +1 -0
- package/dist/lib/chains/xrpl.js +55 -0
- package/dist/lib/chains/xrpl.js.map +1 -0
- package/dist/lib/credit/bureau.d.ts +10 -0
- package/dist/lib/credit/bureau.d.ts.map +1 -0
- package/dist/lib/credit/bureau.js +58 -0
- package/dist/lib/credit/bureau.js.map +1 -0
- package/dist/lib/sml-api/agentcard.d.ts +17 -0
- package/dist/lib/sml-api/agentcard.d.ts.map +1 -0
- package/dist/lib/sml-api/agentcard.js +30 -0
- package/dist/lib/sml-api/agentcard.js.map +1 -0
- package/dist/lib/sml-api/backtest.d.ts +22 -0
- package/dist/lib/sml-api/backtest.d.ts.map +1 -0
- package/dist/lib/sml-api/backtest.js +28 -0
- package/dist/lib/sml-api/backtest.js.map +1 -0
- package/dist/lib/sml-api/brokers.d.ts +40 -0
- package/dist/lib/sml-api/brokers.d.ts.map +1 -0
- package/dist/lib/sml-api/brokers.js +128 -0
- package/dist/lib/sml-api/brokers.js.map +1 -0
- package/dist/lib/sml-api/copytrader.d.ts +11 -0
- package/dist/lib/sml-api/copytrader.d.ts.map +1 -0
- package/dist/lib/sml-api/copytrader.js +30 -0
- package/dist/lib/sml-api/copytrader.js.map +1 -0
- package/dist/lib/sml-api/crawl.d.ts +20 -0
- package/dist/lib/sml-api/crawl.d.ts.map +1 -0
- package/dist/lib/sml-api/crawl.js +32 -0
- package/dist/lib/sml-api/crawl.js.map +1 -0
- package/dist/lib/sml-api/echo.d.ts +10 -0
- package/dist/lib/sml-api/echo.d.ts.map +1 -0
- package/dist/lib/sml-api/echo.js +23 -0
- package/dist/lib/sml-api/echo.js.map +1 -0
- package/dist/lib/sml-api/forge.d.ts +11 -0
- package/dist/lib/sml-api/forge.d.ts.map +1 -0
- package/dist/lib/sml-api/forge.js +29 -0
- package/dist/lib/sml-api/forge.js.map +1 -0
- package/dist/lib/sml-api/ftd.d.ts +18 -0
- package/dist/lib/sml-api/ftd.d.ts.map +1 -0
- package/dist/lib/sml-api/ftd.js +43 -0
- package/dist/lib/sml-api/ftd.js.map +1 -0
- package/dist/lib/sml-api/ghost.d.ts +13 -0
- package/dist/lib/sml-api/ghost.d.ts.map +1 -0
- package/dist/lib/sml-api/ghost.js +29 -0
- package/dist/lib/sml-api/ghost.js.map +1 -0
- package/dist/lib/sml-api/launchpad.d.ts +20 -0
- package/dist/lib/sml-api/launchpad.d.ts.map +1 -0
- package/dist/lib/sml-api/launchpad.js +31 -0
- package/dist/lib/sml-api/launchpad.js.map +1 -0
- package/dist/lib/sml-api/leviathan.d.ts +22 -0
- package/dist/lib/sml-api/leviathan.d.ts.map +1 -0
- package/dist/lib/sml-api/leviathan.js +33 -0
- package/dist/lib/sml-api/leviathan.js.map +1 -0
- package/dist/lib/sml-api/nexus.d.ts +18 -0
- package/dist/lib/sml-api/nexus.d.ts.map +1 -0
- package/dist/lib/sml-api/nexus.js +40 -0
- package/dist/lib/sml-api/nexus.js.map +1 -0
- package/dist/lib/sml-api/proof402.d.ts +6 -0
- package/dist/lib/sml-api/proof402.d.ts.map +1 -0
- package/dist/lib/sml-api/proof402.js +30 -0
- package/dist/lib/sml-api/proof402.js.map +1 -0
- package/dist/lib/sml-api/rails.d.ts +12 -0
- package/dist/lib/sml-api/rails.d.ts.map +1 -0
- package/dist/lib/sml-api/rails.js +29 -0
- package/dist/lib/sml-api/rails.js.map +1 -0
- package/dist/lib/sml-api/shadow.d.ts +15 -0
- package/dist/lib/sml-api/shadow.d.ts.map +1 -0
- package/dist/lib/sml-api/shadow.js +27 -0
- package/dist/lib/sml-api/shadow.js.map +1 -0
- package/dist/lib/sml-api/squeezeos.d.ts +21 -0
- package/dist/lib/sml-api/squeezeos.d.ts.map +1 -0
- package/dist/lib/sml-api/squeezeos.js +97 -0
- package/dist/lib/sml-api/squeezeos.js.map +1 -0
- package/dist/lib/sml-api/xdeo.d.ts +13 -0
- package/dist/lib/sml-api/xdeo.d.ts.map +1 -0
- package/dist/lib/sml-api/xdeo.js +34 -0
- package/dist/lib/sml-api/xdeo.js.map +1 -0
- package/dist/lib/sml-api/xmit.d.ts +13 -0
- package/dist/lib/sml-api/xmit.d.ts.map +1 -0
- package/dist/lib/sml-api/xmit.js +34 -0
- package/dist/lib/sml-api/xmit.js.map +1 -0
- package/dist/server/health.d.ts +16 -0
- package/dist/server/health.d.ts.map +1 -0
- package/dist/server/health.js +39 -0
- package/dist/server/health.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +193 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/payments/ap2.d.ts +17 -0
- package/dist/server/payments/ap2.d.ts.map +1 -0
- package/dist/server/payments/ap2.js +75 -0
- package/dist/server/payments/ap2.js.map +1 -0
- package/dist/server/payments/receipt.d.ts +28 -0
- package/dist/server/payments/receipt.d.ts.map +1 -0
- package/dist/server/payments/receipt.js +60 -0
- package/dist/server/payments/receipt.js.map +1 -0
- package/dist/server/payments/router.d.ts +23 -0
- package/dist/server/payments/router.d.ts.map +1 -0
- package/dist/server/payments/router.js +69 -0
- package/dist/server/payments/router.js.map +1 -0
- package/dist/server/payments/wallet.d.ts +18 -0
- package/dist/server/payments/wallet.d.ts.map +1 -0
- package/dist/server/payments/wallet.js +107 -0
- package/dist/server/payments/wallet.js.map +1 -0
- package/dist/server/payments/x402.d.ts +29 -0
- package/dist/server/payments/x402.d.ts.map +1 -0
- package/dist/server/payments/x402.js +122 -0
- package/dist/server/payments/x402.js.map +1 -0
- package/dist/server/registry/catalog.d.ts +12 -0
- package/dist/server/registry/catalog.d.ts.map +1 -0
- package/dist/server/registry/catalog.js +55 -0
- package/dist/server/registry/catalog.js.map +1 -0
- package/dist/server/registry/discovery.d.ts +16 -0
- package/dist/server/registry/discovery.d.ts.map +1 -0
- package/dist/server/registry/discovery.js +33 -0
- package/dist/server/registry/discovery.js.map +1 -0
- package/dist/server/registry/pricing.d.ts +10 -0
- package/dist/server/registry/pricing.d.ts.map +1 -0
- package/dist/server/registry/pricing.js +66 -0
- package/dist/server/registry/pricing.js.map +1 -0
- package/dist/server/security/acl.d.ts +28 -0
- package/dist/server/security/acl.d.ts.map +1 -0
- package/dist/server/security/acl.js +36 -0
- package/dist/server/security/acl.js.map +1 -0
- package/dist/server/security/audit.d.ts +15 -0
- package/dist/server/security/audit.d.ts.map +1 -0
- package/dist/server/security/audit.js +77 -0
- package/dist/server/security/audit.js.map +1 -0
- package/dist/server/security/rate-limit.d.ts +12 -0
- package/dist/server/security/rate-limit.d.ts.map +1 -0
- package/dist/server/security/rate-limit.js +72 -0
- package/dist/server/security/rate-limit.js.map +1 -0
- package/dist/server/security/sandbox.d.ts +7 -0
- package/dist/server/security/sandbox.d.ts.map +1 -0
- package/dist/server/security/sandbox.js +42 -0
- package/dist/server/security/sandbox.js.map +1 -0
- package/dist/server/tools/agentcard.d.ts +3 -0
- package/dist/server/tools/agentcard.d.ts.map +1 -0
- package/dist/server/tools/agentcard.js +118 -0
- package/dist/server/tools/agentcard.js.map +1 -0
- package/dist/server/tools/backtest.d.ts +3 -0
- package/dist/server/tools/backtest.d.ts.map +1 -0
- package/dist/server/tools/backtest.js +112 -0
- package/dist/server/tools/backtest.js.map +1 -0
- package/dist/server/tools/brokers.d.ts +3 -0
- package/dist/server/tools/brokers.d.ts.map +1 -0
- package/dist/server/tools/brokers.js +223 -0
- package/dist/server/tools/brokers.js.map +1 -0
- package/dist/server/tools/copytrader.d.ts +3 -0
- package/dist/server/tools/copytrader.d.ts.map +1 -0
- package/dist/server/tools/copytrader.js +90 -0
- package/dist/server/tools/copytrader.js.map +1 -0
- package/dist/server/tools/crawl.d.ts +3 -0
- package/dist/server/tools/crawl.d.ts.map +1 -0
- package/dist/server/tools/crawl.js +60 -0
- package/dist/server/tools/crawl.js.map +1 -0
- package/dist/server/tools/discovery.d.ts +3 -0
- package/dist/server/tools/discovery.d.ts.map +1 -0
- package/dist/server/tools/discovery.js +188 -0
- package/dist/server/tools/discovery.js.map +1 -0
- package/dist/server/tools/echo.d.ts +3 -0
- package/dist/server/tools/echo.d.ts.map +1 -0
- package/dist/server/tools/echo.js +48 -0
- package/dist/server/tools/echo.js.map +1 -0
- package/dist/server/tools/forge.d.ts +3 -0
- package/dist/server/tools/forge.d.ts.map +1 -0
- package/dist/server/tools/forge.js +77 -0
- package/dist/server/tools/forge.js.map +1 -0
- package/dist/server/tools/ftd.d.ts +3 -0
- package/dist/server/tools/ftd.d.ts.map +1 -0
- package/dist/server/tools/ftd.js +70 -0
- package/dist/server/tools/ftd.js.map +1 -0
- package/dist/server/tools/ghost.d.ts +3 -0
- package/dist/server/tools/ghost.d.ts.map +1 -0
- package/dist/server/tools/ghost.js +83 -0
- package/dist/server/tools/ghost.js.map +1 -0
- package/dist/server/tools/index.d.ts +3 -0
- package/dist/server/tools/index.d.ts.map +1 -0
- package/dist/server/tools/index.js +44 -0
- package/dist/server/tools/index.js.map +1 -0
- package/dist/server/tools/launchpad.d.ts +3 -0
- package/dist/server/tools/launchpad.d.ts.map +1 -0
- package/dist/server/tools/launchpad.js +151 -0
- package/dist/server/tools/launchpad.js.map +1 -0
- package/dist/server/tools/leviathan.d.ts +3 -0
- package/dist/server/tools/leviathan.d.ts.map +1 -0
- package/dist/server/tools/leviathan.js +73 -0
- package/dist/server/tools/leviathan.js.map +1 -0
- package/dist/server/tools/nexus.d.ts +3 -0
- package/dist/server/tools/nexus.d.ts.map +1 -0
- package/dist/server/tools/nexus.js +65 -0
- package/dist/server/tools/nexus.js.map +1 -0
- package/dist/server/tools/proof402.d.ts +3 -0
- package/dist/server/tools/proof402.d.ts.map +1 -0
- package/dist/server/tools/proof402.js +74 -0
- package/dist/server/tools/proof402.js.map +1 -0
- package/dist/server/tools/rails.d.ts +3 -0
- package/dist/server/tools/rails.d.ts.map +1 -0
- package/dist/server/tools/rails.js +82 -0
- package/dist/server/tools/rails.js.map +1 -0
- package/dist/server/tools/shadow.d.ts +3 -0
- package/dist/server/tools/shadow.d.ts.map +1 -0
- package/dist/server/tools/shadow.js +114 -0
- package/dist/server/tools/shadow.js.map +1 -0
- package/dist/server/tools/squeezeos.d.ts +3 -0
- package/dist/server/tools/squeezeos.d.ts.map +1 -0
- package/dist/server/tools/squeezeos.js +231 -0
- package/dist/server/tools/squeezeos.js.map +1 -0
- package/dist/server/tools/xdeo.d.ts +3 -0
- package/dist/server/tools/xdeo.d.ts.map +1 -0
- package/dist/server/tools/xdeo.js +58 -0
- package/dist/server/tools/xdeo.js.map +1 -0
- package/dist/server/tools/xmit.d.ts +3 -0
- package/dist/server/tools/xmit.d.ts.map +1 -0
- package/dist/server/tools/xmit.js +59 -0
- package/dist/server/tools/xmit.js.map +1 -0
- package/docker-compose.yml +50 -0
- package/llms.txt +70 -0
- package/package.json +77 -0
- package/render.yaml +39 -0
- package/sdk/mcp-x402-sdk/package.json +18 -0
- package/sdk/mcp-x402-sdk/src/index.ts +118 -0
- package/sdk/mcp-x402-sdk/tsconfig.json +14 -0
- package/server.json +60 -0
- package/services/backtest_service.py +176 -0
- package/src/lib/chains/base.ts +77 -0
- package/src/lib/chains/solana.ts +59 -0
- package/src/lib/chains/xrpl.ts +63 -0
- package/src/lib/credit/bureau.ts +65 -0
- package/src/lib/sml-api/agentcard.ts +40 -0
- package/src/lib/sml-api/backtest.ts +47 -0
- package/src/lib/sml-api/brokers.ts +160 -0
- package/src/lib/sml-api/copytrader.ts +33 -0
- package/src/lib/sml-api/crawl.ts +44 -0
- package/src/lib/sml-api/echo.ts +28 -0
- package/src/lib/sml-api/forge.ts +33 -0
- package/src/lib/sml-api/ftd.ts +53 -0
- package/src/lib/sml-api/ghost.ts +35 -0
- package/src/lib/sml-api/launchpad.ts +43 -0
- package/src/lib/sml-api/leviathan.ts +49 -0
- package/src/lib/sml-api/nexus.ts +50 -0
- package/src/lib/sml-api/proof402.ts +27 -0
- package/src/lib/sml-api/rails.ts +34 -0
- package/src/lib/sml-api/shadow.ts +35 -0
- package/src/lib/sml-api/squeezeos.ts +95 -0
- package/src/lib/sml-api/xdeo.ts +40 -0
- package/src/lib/sml-api/xmit.ts +40 -0
- package/src/server/health.ts +52 -0
- package/src/server/index.ts +206 -0
- package/src/server/payments/ap2.ts +99 -0
- package/src/server/payments/receipt.ts +85 -0
- package/src/server/payments/router.ts +110 -0
- package/src/server/payments/wallet.ts +123 -0
- package/src/server/payments/x402.ts +162 -0
- package/src/server/registry/catalog.ts +61 -0
- package/src/server/registry/discovery.ts +39 -0
- package/src/server/registry/pricing.ts +76 -0
- package/src/server/security/acl.ts +42 -0
- package/src/server/security/audit.ts +94 -0
- package/src/server/security/rate-limit.ts +84 -0
- package/src/server/security/sandbox.ts +40 -0
- package/src/server/tools/agentcard.ts +134 -0
- package/src/server/tools/backtest.ts +119 -0
- package/src/server/tools/brokers.ts +250 -0
- package/src/server/tools/copytrader.ts +104 -0
- package/src/server/tools/crawl.ts +70 -0
- package/src/server/tools/discovery.ts +202 -0
- package/src/server/tools/echo.ts +58 -0
- package/src/server/tools/forge.ts +87 -0
- package/src/server/tools/ftd.ts +88 -0
- package/src/server/tools/ghost.ts +93 -0
- package/src/server/tools/index.ts +42 -0
- package/src/server/tools/launchpad.ts +173 -0
- package/src/server/tools/leviathan.ts +81 -0
- package/src/server/tools/nexus.ts +76 -0
- package/src/server/tools/proof402.ts +87 -0
- package/src/server/tools/rails.ts +92 -0
- package/src/server/tools/shadow.ts +128 -0
- package/src/server/tools/squeezeos.ts +312 -0
- package/src/server/tools/xdeo.ts +67 -0
- package/src/server/tools/xmit.ts +68 -0
- package/tests/integration/e2e.test.ts +51 -0
- package/tests/unit/payments.test.ts +49 -0
- package/tests/unit/security.test.ts +92 -0
- package/tests/unit/tools.test.ts +42 -0
- package/tsconfig.json +21 -0
- package/vitest.config.ts +20 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.BaseChain = void 0;
|
|
7
|
+
const viem_1 = require("viem");
|
|
8
|
+
const chains_1 = require("viem/chains");
|
|
9
|
+
const accounts_1 = require("viem/accounts");
|
|
10
|
+
const bip39_1 = require("bip39");
|
|
11
|
+
const hdkey_1 = __importDefault(require("hdkey"));
|
|
12
|
+
const wallet_js_1 = require("../../server/payments/wallet.js");
|
|
13
|
+
// USDC contract on Base mainnet
|
|
14
|
+
const USDC_BASE = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913';
|
|
15
|
+
// USDC contract on Base Sepolia
|
|
16
|
+
const USDC_BASE_SEPOLIA = '0x036CbD53842c5426634e7929541eC2318f3dCF7e';
|
|
17
|
+
const ERC20_TRANSFER_ABI = [
|
|
18
|
+
{
|
|
19
|
+
name: 'transfer',
|
|
20
|
+
type: 'function',
|
|
21
|
+
inputs: [
|
|
22
|
+
{ name: 'to', type: 'address' },
|
|
23
|
+
{ name: 'amount', type: 'uint256' },
|
|
24
|
+
],
|
|
25
|
+
outputs: [{ name: '', type: 'bool' }],
|
|
26
|
+
stateMutability: 'nonpayable',
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
class BaseChain {
|
|
30
|
+
static instance;
|
|
31
|
+
testnet;
|
|
32
|
+
constructor() {
|
|
33
|
+
this.testnet = process.env['TESTNET'] === 'true';
|
|
34
|
+
}
|
|
35
|
+
static getInstance() {
|
|
36
|
+
if (!BaseChain.instance) {
|
|
37
|
+
BaseChain.instance = new BaseChain();
|
|
38
|
+
}
|
|
39
|
+
return BaseChain.instance;
|
|
40
|
+
}
|
|
41
|
+
async sendPayment(params) {
|
|
42
|
+
const chain = this.testnet ? chains_1.baseSepolia : chains_1.base;
|
|
43
|
+
const rpcUrl = this.testnet
|
|
44
|
+
? (process.env['BASE_SEPOLIA_RPC_URL'] ?? 'https://sepolia.base.org')
|
|
45
|
+
: (process.env['BASE_RPC_URL'] ?? 'https://mainnet.base.org');
|
|
46
|
+
const privateKey = await this.getPrivateKey();
|
|
47
|
+
const account = (0, accounts_1.privateKeyToAccount)(privateKey);
|
|
48
|
+
const walletClient = (0, viem_1.createWalletClient)({ account, chain, transport: (0, viem_1.http)(rpcUrl) });
|
|
49
|
+
const publicClient = (0, viem_1.createPublicClient)({ chain, transport: (0, viem_1.http)(rpcUrl) });
|
|
50
|
+
const usdcAddress = this.testnet ? USDC_BASE_SEPOLIA : USDC_BASE;
|
|
51
|
+
const amount = (0, viem_1.parseUnits)(params.amount, 6); // USDC has 6 decimals
|
|
52
|
+
const hash = await walletClient.writeContract({
|
|
53
|
+
address: usdcAddress,
|
|
54
|
+
abi: ERC20_TRANSFER_ABI,
|
|
55
|
+
functionName: 'transfer',
|
|
56
|
+
args: [params.to, amount],
|
|
57
|
+
});
|
|
58
|
+
// Wait for confirmation
|
|
59
|
+
await publicClient.waitForTransactionReceipt({ hash });
|
|
60
|
+
return hash;
|
|
61
|
+
}
|
|
62
|
+
async getPrivateKey() {
|
|
63
|
+
const mnemonic = await wallet_js_1.WalletManager.getInstance().getSeed();
|
|
64
|
+
const seed = (0, bip39_1.mnemonicToSeedSync)(mnemonic);
|
|
65
|
+
const hdkey = hdkey_1.default.fromMasterSeed(seed);
|
|
66
|
+
const child = hdkey.derive("m/44'/60'/0'/0/0");
|
|
67
|
+
if (!child.privateKey)
|
|
68
|
+
throw new Error('Key derivation failed');
|
|
69
|
+
return `0x${child.privateKey.toString('hex')}`;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.BaseChain = BaseChain;
|
|
73
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/lib/chains/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RouteParams } from '../../server/payments/router.js';
|
|
2
|
+
export declare class SolanaChain {
|
|
3
|
+
private static instance;
|
|
4
|
+
private readonly rpcUrl;
|
|
5
|
+
private constructor();
|
|
6
|
+
static getInstance(): SolanaChain;
|
|
7
|
+
sendPayment(params: RouteParams): Promise<string>;
|
|
8
|
+
private getKeypair;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=solana.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../../src/lib/chains/solana.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAKnE,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,WAAW;IAO3B,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;YAkBzC,UAAU;CASzB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SolanaChain = void 0;
|
|
7
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
8
|
+
const spl_token_1 = require("@solana/spl-token");
|
|
9
|
+
const bip39_1 = require("bip39");
|
|
10
|
+
const hdkey_1 = __importDefault(require("hdkey"));
|
|
11
|
+
const wallet_js_1 = require("../../server/payments/wallet.js");
|
|
12
|
+
// USDC mint on Solana mainnet
|
|
13
|
+
const USDC_MINT = new web3_js_1.PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v');
|
|
14
|
+
class SolanaChain {
|
|
15
|
+
static instance;
|
|
16
|
+
rpcUrl;
|
|
17
|
+
constructor() {
|
|
18
|
+
this.rpcUrl = process.env['SOLANA_RPC_URL'] ?? 'https://api.mainnet-beta.solana.com';
|
|
19
|
+
}
|
|
20
|
+
static getInstance() {
|
|
21
|
+
if (!SolanaChain.instance) {
|
|
22
|
+
SolanaChain.instance = new SolanaChain();
|
|
23
|
+
}
|
|
24
|
+
return SolanaChain.instance;
|
|
25
|
+
}
|
|
26
|
+
async sendPayment(params) {
|
|
27
|
+
const connection = new web3_js_1.Connection(this.rpcUrl, 'confirmed');
|
|
28
|
+
const payer = await this.getKeypair();
|
|
29
|
+
const destination = new web3_js_1.PublicKey(params.to);
|
|
30
|
+
const fromATA = await (0, spl_token_1.getAssociatedTokenAddress)(USDC_MINT, payer.publicKey);
|
|
31
|
+
const toATA = await (0, spl_token_1.getAssociatedTokenAddress)(USDC_MINT, destination);
|
|
32
|
+
const lamports = Math.round(parseFloat(params.amount) * 1_000_000); // USDC 6 decimals
|
|
33
|
+
const tx = new web3_js_1.Transaction().add((0, spl_token_1.createTransferInstruction)(fromATA, toATA, payer.publicKey, BigInt(lamports)));
|
|
34
|
+
const sig = await (0, web3_js_1.sendAndConfirmTransaction)(connection, tx, [payer]);
|
|
35
|
+
return sig;
|
|
36
|
+
}
|
|
37
|
+
async getKeypair() {
|
|
38
|
+
const mnemonic = await wallet_js_1.WalletManager.getInstance().getSeed();
|
|
39
|
+
const seed = (0, bip39_1.mnemonicToSeedSync)(mnemonic);
|
|
40
|
+
const hdkey = hdkey_1.default.fromMasterSeed(seed);
|
|
41
|
+
// BIP-44 for Solana: m/44'/501'/0'/0'
|
|
42
|
+
const child = hdkey.derive("m/44'/501'/0'/0'");
|
|
43
|
+
if (!child.privateKey)
|
|
44
|
+
throw new Error('Solana key derivation failed');
|
|
45
|
+
return web3_js_1.Keypair.fromSeed(child.privateKey.slice(0, 32));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.SolanaChain = SolanaChain;
|
|
49
|
+
//# sourceMappingURL=solana.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana.js","sourceRoot":"","sources":["../../../src/lib/chains/solana.ts"],"names":[],"mappings":";;;;;;AAAA,6CAMyB;AACzB,iDAAyF;AACzF,iCAA2C;AAC3C,kDAA0B;AAC1B,+DAAgE;AAGhE,8BAA8B;AAC9B,MAAM,SAAS,GAAG,IAAI,mBAAS,CAAC,8CAA8C,CAAC,CAAC;AAEhF,MAAa,WAAW;IACd,MAAM,CAAC,QAAQ,CAAc;IACpB,MAAM,CAAS;IAEhC;QACE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,qCAAqC,CAAC;IACvF,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC1B,WAAW,CAAC,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC;QAC3C,CAAC;QACD,OAAO,WAAW,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAmB;QACnC,MAAM,UAAU,GAAG,IAAI,oBAAU,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACtC,MAAM,WAAW,GAAG,IAAI,mBAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE7C,MAAM,OAAO,GAAG,MAAM,IAAA,qCAAyB,EAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,MAAM,IAAA,qCAAyB,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAEtE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,kBAAkB;QAEtF,MAAM,EAAE,GAAG,IAAI,qBAAW,EAAE,CAAC,GAAG,CAC9B,IAAA,qCAAyB,EAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAC7E,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,IAAA,mCAAyB,EAAC,UAAU,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,MAAM,QAAQ,GAAG,MAAM,yBAAa,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAA,0BAAkB,EAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,eAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACzC,sCAAsC;QACtC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACvE,OAAO,iBAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;CACF;AA1CD,kCA0CC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RouteParams } from '../../server/payments/router.js';
|
|
2
|
+
export declare class XRPLChain {
|
|
3
|
+
private static instance;
|
|
4
|
+
private readonly rpcUrl;
|
|
5
|
+
private constructor();
|
|
6
|
+
static getInstance(): XRPLChain;
|
|
7
|
+
sendPayment(params: RouteParams): Promise<string>;
|
|
8
|
+
private getWallet;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=xrpl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xrpl.d.ts","sourceRoot":"","sources":["../../../src/lib/chains/xrpl.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAEnE,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,SAAS;IAOzB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;YAuCzC,SAAS;CAIxB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.XRPLChain = void 0;
|
|
4
|
+
const xrpl_1 = require("xrpl");
|
|
5
|
+
const wallet_js_1 = require("../../server/payments/wallet.js");
|
|
6
|
+
class XRPLChain {
|
|
7
|
+
static instance;
|
|
8
|
+
rpcUrl;
|
|
9
|
+
constructor() {
|
|
10
|
+
this.rpcUrl = process.env['XRPL_RPC_URL'] ?? 'wss://xrplcluster.com';
|
|
11
|
+
}
|
|
12
|
+
static getInstance() {
|
|
13
|
+
if (!XRPLChain.instance) {
|
|
14
|
+
XRPLChain.instance = new XRPLChain();
|
|
15
|
+
}
|
|
16
|
+
return XRPLChain.instance;
|
|
17
|
+
}
|
|
18
|
+
async sendPayment(params) {
|
|
19
|
+
const client = new xrpl_1.Client(this.rpcUrl);
|
|
20
|
+
await client.connect();
|
|
21
|
+
try {
|
|
22
|
+
const wallet = await this.getWallet();
|
|
23
|
+
// RLUSD on XRPL or XRP-denominated drop equivalent
|
|
24
|
+
const tx = await client.submitAndWait({
|
|
25
|
+
TransactionType: 'Payment',
|
|
26
|
+
Account: wallet.address,
|
|
27
|
+
Destination: params.to,
|
|
28
|
+
Amount: params.currency === 'RLUSD'
|
|
29
|
+
? {
|
|
30
|
+
currency: 'USD',
|
|
31
|
+
issuer: process.env['RLUSD_ISSUER'] ?? 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh',
|
|
32
|
+
value: params.amount,
|
|
33
|
+
}
|
|
34
|
+
: (0, xrpl_1.xrpToDrops)(params.amount),
|
|
35
|
+
}, { wallet });
|
|
36
|
+
if (tx.result.meta && typeof tx.result.meta === 'object' && 'TransactionResult' in tx.result.meta) {
|
|
37
|
+
const meta = tx.result.meta;
|
|
38
|
+
if (meta.TransactionResult !== 'tesSUCCESS') {
|
|
39
|
+
throw new Error(`XRPL transaction failed: ${meta.TransactionResult}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const txResult = tx.result;
|
|
43
|
+
return txResult.hash ?? 'unknown';
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
await client.disconnect();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async getWallet() {
|
|
50
|
+
const mnemonic = await wallet_js_1.WalletManager.getInstance().getSeed();
|
|
51
|
+
return xrpl_1.Wallet.fromMnemonic(mnemonic, { mnemonicEncoding: 'bip39' });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.XRPLChain = XRPLChain;
|
|
55
|
+
//# sourceMappingURL=xrpl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xrpl.js","sourceRoot":"","sources":["../../../src/lib/chains/xrpl.ts"],"names":[],"mappings":";;;AAAA,+BAAkD;AAClD,+DAAgE;AAGhE,MAAa,SAAS;IACZ,MAAM,CAAC,QAAQ,CAAY;IAClB,MAAM,CAAS;IAEhC;QACE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,uBAAuB,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACxB,SAAS,CAAC,QAAQ,GAAG,IAAI,SAAS,EAAE,CAAC;QACvC,CAAC;QACD,OAAO,SAAS,CAAC,QAAQ,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAmB;QACnC,MAAM,MAAM,GAAG,IAAI,aAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YAEtC,mDAAmD;YACnD,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CACnC;gBACE,eAAe,EAAE,SAAS;gBAC1B,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW,EAAE,MAAM,CAAC,EAAE;gBACtB,MAAM,EACJ,MAAM,CAAC,QAAQ,KAAK,OAAO;oBACzB,CAAC,CAAC;wBACE,QAAQ,EAAE,KAAK;wBACf,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,oCAAoC;wBAC3E,KAAK,EAAE,MAAM,CAAC,MAAM;qBACrB;oBACH,CAAC,CAAC,IAAA,iBAAU,EAAC,MAAM,CAAC,MAAM,CAAC;aAChC,EACD,EAAE,MAAM,EAAE,CACX,CAAC;YAEF,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,mBAAmB,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBAClG,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,IAAqC,CAAC;gBAC7D,IAAI,IAAI,CAAC,iBAAiB,KAAK,YAAY,EAAE,CAAC;oBAC5C,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAsC,CAAC;YAC3D,OAAO,QAAQ,CAAC,IAAI,IAAI,SAAS,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS;QACrB,MAAM,QAAQ,GAAG,MAAM,yBAAa,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;QAC7D,OAAO,aAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;CACF;AA1DD,8BA0DC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class CreditBureau {
|
|
2
|
+
private static instance;
|
|
3
|
+
private readonly cache;
|
|
4
|
+
private readonly baseUrl;
|
|
5
|
+
private constructor();
|
|
6
|
+
static getInstance(): CreditBureau;
|
|
7
|
+
getScore(wallet: string): Promise<number>;
|
|
8
|
+
incrementScore(wallet: string, delta: number): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=bureau.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bureau.d.ts","sourceRoot":"","sources":["../../../src/lib/credit/bureau.ts"],"names":[],"mappings":"AAOA,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,YAAY;IAO5B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4BzC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAanE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CreditBureau = void 0;
|
|
4
|
+
const SCORE_CACHE_TTL = 300_000; // 5 minutes
|
|
5
|
+
class CreditBureau {
|
|
6
|
+
static instance;
|
|
7
|
+
cache = new Map();
|
|
8
|
+
baseUrl;
|
|
9
|
+
constructor() {
|
|
10
|
+
this.baseUrl = process.env['PROOF402_URL'] ?? 'https://four02proof.onrender.com';
|
|
11
|
+
}
|
|
12
|
+
static getInstance() {
|
|
13
|
+
if (!CreditBureau.instance) {
|
|
14
|
+
CreditBureau.instance = new CreditBureau();
|
|
15
|
+
}
|
|
16
|
+
return CreditBureau.instance;
|
|
17
|
+
}
|
|
18
|
+
async getScore(wallet) {
|
|
19
|
+
const now = Date.now();
|
|
20
|
+
const cached = this.cache.get(wallet);
|
|
21
|
+
if (cached && now - cached.fetchedAt < SCORE_CACHE_TTL) {
|
|
22
|
+
return cached.score;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const res = await fetch(`${this.baseUrl}/v1/score/${wallet}`, {
|
|
26
|
+
signal: AbortSignal.timeout(5000),
|
|
27
|
+
});
|
|
28
|
+
if (res.ok) {
|
|
29
|
+
const body = (await res.json());
|
|
30
|
+
this.cache.set(wallet, { score: body.score, fetchedAt: now });
|
|
31
|
+
return body.score;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Fall through to default
|
|
36
|
+
}
|
|
37
|
+
// Default score for new/unknown agents
|
|
38
|
+
const defaultScore = 300;
|
|
39
|
+
this.cache.set(wallet, { score: defaultScore, fetchedAt: now });
|
|
40
|
+
return defaultScore;
|
|
41
|
+
}
|
|
42
|
+
async incrementScore(wallet, delta) {
|
|
43
|
+
try {
|
|
44
|
+
await fetch(`${this.baseUrl}/v1/score/${wallet}/increment`, {
|
|
45
|
+
method: 'POST',
|
|
46
|
+
headers: { 'Content-Type': 'application/json' },
|
|
47
|
+
body: JSON.stringify({ delta }),
|
|
48
|
+
});
|
|
49
|
+
// Invalidate cache
|
|
50
|
+
this.cache.delete(wallet);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Non-fatal
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.CreditBureau = CreditBureau;
|
|
58
|
+
//# sourceMappingURL=bureau.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bureau.js","sourceRoot":"","sources":["../../../src/lib/credit/bureau.ts"],"names":[],"mappings":";;;AAKA,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,YAAY;AAE7C,MAAa,YAAY;IACf,MAAM,CAAC,QAAQ,CAAe;IACrB,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IACtC,OAAO,CAAS;IAEjC;QACE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,kCAAkC,CAAC;IACnF,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC3B,YAAY,CAAC,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,YAAY,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEtC,IAAI,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,GAAG,eAAe,EAAE,CAAC;YACvD,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,aAAa,MAAM,EAAE,EAAE;gBAC5D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YAEH,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsB,CAAC;gBACrD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC9D,OAAO,IAAI,CAAC,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QAED,uCAAuC;QACvC,MAAM,YAAY,GAAG,GAAG,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,KAAa;QAChD,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,aAAa,MAAM,YAAY,EAAE;gBAC1D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;aAChC,CAAC,CAAC;YACH,mBAAmB;YACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;CACF;AAzDD,oCAyDC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface AgentCardMintParams {
|
|
2
|
+
walletAddress: string;
|
|
3
|
+
name: string;
|
|
4
|
+
did?: string;
|
|
5
|
+
metadata?: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
export interface AgentCardVerifyParams {
|
|
8
|
+
walletAddress: string;
|
|
9
|
+
message: string;
|
|
10
|
+
signature: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const AgentCardAPI: {
|
|
13
|
+
lookup: (walletOrDid: string) => Promise<unknown>;
|
|
14
|
+
verify: (params: AgentCardVerifyParams) => Promise<unknown>;
|
|
15
|
+
mint: (params: AgentCardMintParams) => Promise<unknown>;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=agentcard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentcard.d.ts","sourceRoot":"","sources":["../../../src/lib/sml-api/agentcard.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAaD,eAAO,MAAM,YAAY;0BACD,MAAM;qBACX,qBAAqB;mBACvB,mBAAmB;CACnC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AgentCardAPI = void 0;
|
|
4
|
+
const AGENTCARD_BASE = process.env['AGENTCARD_URL'] ?? 'https://agentcard.onrender.com';
|
|
5
|
+
async function acGet(path) {
|
|
6
|
+
const res = await fetch(`${AGENTCARD_BASE}${path}`, {
|
|
7
|
+
headers: { 'Accept': 'application/json' },
|
|
8
|
+
signal: AbortSignal.timeout(10_000),
|
|
9
|
+
});
|
|
10
|
+
if (!res.ok)
|
|
11
|
+
throw new Error(`AgentCard GET ${path}: HTTP ${res.status}`);
|
|
12
|
+
return res.json();
|
|
13
|
+
}
|
|
14
|
+
async function acPost(path, body) {
|
|
15
|
+
const res = await fetch(`${AGENTCARD_BASE}${path}`, {
|
|
16
|
+
method: 'POST',
|
|
17
|
+
headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' },
|
|
18
|
+
body: JSON.stringify(body),
|
|
19
|
+
signal: AbortSignal.timeout(15_000),
|
|
20
|
+
});
|
|
21
|
+
if (!res.ok)
|
|
22
|
+
throw new Error(`AgentCard POST ${path}: HTTP ${res.status}`);
|
|
23
|
+
return res.json();
|
|
24
|
+
}
|
|
25
|
+
exports.AgentCardAPI = {
|
|
26
|
+
lookup: (walletOrDid) => acGet(`/v1/card/${encodeURIComponent(walletOrDid)}`),
|
|
27
|
+
verify: (params) => acPost('/v1/verify', params),
|
|
28
|
+
mint: (params) => acPost('/v1/mint', params),
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=agentcard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentcard.js","sourceRoot":"","sources":["../../../src/lib/sml-api/agentcard.ts"],"names":[],"mappings":";;;AAAA,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,gCAAgC,CAAC;AAExF,KAAK,UAAU,KAAK,CAAC,IAAY;IAC/B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,GAAG,IAAI,EAAE,EAAE;QAClD,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE;QACzC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAeD,KAAK,UAAU,MAAM,CAAC,IAAY,EAAE,IAAa;IAC/C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,GAAG,IAAI,EAAE,EAAE;QAClD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC7E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3E,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAEY,QAAA,YAAY,GAAG;IAC1B,MAAM,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;IACrF,MAAM,EAAE,CAAC,MAA6B,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC;IACvE,IAAI,EAAE,CAAC,MAA2B,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC;CAClE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface BacktestParams {
|
|
2
|
+
ticker: string;
|
|
3
|
+
lookback_days?: number;
|
|
4
|
+
signals?: number[];
|
|
5
|
+
fees?: number;
|
|
6
|
+
slippage?: number;
|
|
7
|
+
momentum_window?: number;
|
|
8
|
+
momentum_threshold?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ValidateParams {
|
|
11
|
+
ticker: string;
|
|
12
|
+
lookback_days?: number;
|
|
13
|
+
train_ratio?: number;
|
|
14
|
+
fees?: number;
|
|
15
|
+
slippage?: number;
|
|
16
|
+
}
|
|
17
|
+
export declare const BacktestAPI: {
|
|
18
|
+
health: () => Promise<unknown>;
|
|
19
|
+
backtest: (params: BacktestParams) => Promise<unknown>;
|
|
20
|
+
walkForward: (params: ValidateParams) => Promise<unknown>;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=backtest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backtest.d.ts","sourceRoot":"","sources":["../../../src/lib/sml-api/backtest.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAgBD,eAAO,MAAM,WAAW;kBACJ,OAAO,CAAC,OAAO,CAAC;uBAKf,cAAc,KAAG,OAAO,CAAC,OAAO,CAAC;0BAE9B,cAAc,KAAG,OAAO,CAAC,OAAO,CAAC;CACxD,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// backtester-mcp microservice client
|
|
3
|
+
// Wraps the Python backtest_service.py running at BACKTEST_BASE_URL
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.BacktestAPI = void 0;
|
|
6
|
+
const BASE = process.env.BACKTEST_BASE_URL ?? 'http://localhost:8300';
|
|
7
|
+
async function post(path, body) {
|
|
8
|
+
const res = await fetch(`${BASE}${path}`, {
|
|
9
|
+
method: 'POST',
|
|
10
|
+
headers: { 'Content-Type': 'application/json' },
|
|
11
|
+
body: JSON.stringify(body),
|
|
12
|
+
signal: AbortSignal.timeout(30_000),
|
|
13
|
+
});
|
|
14
|
+
if (!res.ok) {
|
|
15
|
+
const err = await res.json().catch(() => ({ error: res.statusText }));
|
|
16
|
+
throw new Error(err.error ?? res.statusText);
|
|
17
|
+
}
|
|
18
|
+
return res.json();
|
|
19
|
+
}
|
|
20
|
+
exports.BacktestAPI = {
|
|
21
|
+
health: async () => {
|
|
22
|
+
const res = await fetch(`${BASE}/health`, { signal: AbortSignal.timeout(5_000) });
|
|
23
|
+
return res.json();
|
|
24
|
+
},
|
|
25
|
+
backtest: (params) => post('/backtest', params),
|
|
26
|
+
walkForward: (params) => post('/validate', params),
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=backtest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backtest.js","sourceRoot":"","sources":["../../../src/lib/sml-api/backtest.ts"],"names":[],"mappings":";AAAA,qCAAqC;AACrC,oEAAoE;;;AAEpE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,uBAAuB,CAAC;AAoBtE,KAAK,UAAU,IAAI,CAAC,IAAY,EAAE,IAAY;IAC5C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE;QACxC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACtE,MAAM,IAAI,KAAK,CAAE,GAA0B,CAAC,KAAK,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAEY,QAAA,WAAW,GAAG;IACzB,MAAM,EAAE,KAAK,IAAsB,EAAE;QACnC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClF,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,QAAQ,EAAE,CAAC,MAAsB,EAAoB,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;IAEjF,WAAW,EAAE,CAAC,MAAsB,EAAoB,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;CACrF,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface TradierQuoteParams {
|
|
2
|
+
symbols: string;
|
|
3
|
+
}
|
|
4
|
+
export interface TradierOrderParams {
|
|
5
|
+
account_id: string;
|
|
6
|
+
symbol: string;
|
|
7
|
+
side: 'buy' | 'sell';
|
|
8
|
+
quantity: number;
|
|
9
|
+
type: 'market' | 'limit' | 'stop' | 'stop_limit';
|
|
10
|
+
duration: 'day' | 'gtc' | 'pre' | 'post';
|
|
11
|
+
price?: number;
|
|
12
|
+
stop?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare const TradierAPI: {
|
|
15
|
+
quote: (params: TradierQuoteParams) => Promise<unknown>;
|
|
16
|
+
optionChain: (symbol: string, expiration: string) => Promise<unknown>;
|
|
17
|
+
order: (params: TradierOrderParams) => Promise<unknown>;
|
|
18
|
+
positions: (account_id: string) => Promise<unknown>;
|
|
19
|
+
balances: (account_id: string) => Promise<unknown>;
|
|
20
|
+
orderStatus: (account_id: string, order_id: string) => Promise<unknown>;
|
|
21
|
+
};
|
|
22
|
+
export interface RobinhoodOrderParams {
|
|
23
|
+
symbol: string;
|
|
24
|
+
side: 'buy' | 'sell';
|
|
25
|
+
quantity: number;
|
|
26
|
+
type: 'market' | 'limit';
|
|
27
|
+
time_in_force: 'gfd' | 'gtc' | 'ioc' | 'opg';
|
|
28
|
+
price?: number;
|
|
29
|
+
}
|
|
30
|
+
export declare const RobinhoodAPI: {
|
|
31
|
+
quote: (symbol: string) => Promise<{}>;
|
|
32
|
+
instruments: (symbol: string) => Promise<{
|
|
33
|
+
url: string;
|
|
34
|
+
} | undefined>;
|
|
35
|
+
order: (params: RobinhoodOrderParams) => Promise<unknown>;
|
|
36
|
+
portfolio: () => Promise<unknown>;
|
|
37
|
+
positions: () => Promise<unknown>;
|
|
38
|
+
orderHistory: () => Promise<unknown>;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=brokers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brokers.d.ts","sourceRoot":"","sources":["../../../src/lib/sml-api/brokers.ts"],"names":[],"mappings":"AAwEA,MAAM,WAAW,kBAAkB;IAAG,OAAO,EAAE,MAAM,CAAA;CAAE;AACvD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC;IACjD,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,UAAU;oBACL,kBAAkB;0BAGZ,MAAM,cAAc,MAAM;oBAGhC,kBAAkB;4BAcV,MAAM;2BAGP,MAAM;8BAGH,MAAM,YAAY,MAAM;CAEnD,CAAC;AAIF,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,aAAa,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,YAAY;oBACD,MAAM;0BAKA,MAAM;aACwD,MAAM;;oBAI1E,oBAAoB;;;;CAsB3C,CAAC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Broker execution rails — Robinhood + Tradier
|
|
3
|
+
// Robinhood: OAuth2 Bearer token (ROBINHOOD_ACCESS_TOKEN env)
|
|
4
|
+
// Tradier: Bearer token (TRADIER_API_KEY env, TRADIER_ENV=sandbox|production)
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RobinhoodAPI = exports.TradierAPI = void 0;
|
|
7
|
+
const TRADIER_BASE = process.env.TRADIER_ENV === 'production'
|
|
8
|
+
? 'https://api.tradier.com/v1'
|
|
9
|
+
: 'https://sandbox.tradier.com/v1';
|
|
10
|
+
const ROBINHOOD_BASE = 'https://api.robinhood.com';
|
|
11
|
+
// ── Shared fetch helpers ────────────────────────────────────────────────────
|
|
12
|
+
async function tradierGet(path, params) {
|
|
13
|
+
const token = process.env.TRADIER_API_KEY;
|
|
14
|
+
if (!token)
|
|
15
|
+
throw new Error('TRADIER_API_KEY not configured');
|
|
16
|
+
const url = new URL(`${TRADIER_BASE}${path}`);
|
|
17
|
+
if (params)
|
|
18
|
+
Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));
|
|
19
|
+
const res = await fetch(url.toString(), {
|
|
20
|
+
headers: { Authorization: `Bearer ${token}`, Accept: 'application/json' },
|
|
21
|
+
signal: AbortSignal.timeout(10_000),
|
|
22
|
+
});
|
|
23
|
+
if (!res.ok)
|
|
24
|
+
throw new Error(`Tradier ${res.status}: ${res.statusText}`);
|
|
25
|
+
return res.json();
|
|
26
|
+
}
|
|
27
|
+
async function tradierPost(path, body) {
|
|
28
|
+
const token = process.env.TRADIER_API_KEY;
|
|
29
|
+
if (!token)
|
|
30
|
+
throw new Error('TRADIER_API_KEY not configured');
|
|
31
|
+
const res = await fetch(`${TRADIER_BASE}${path}`, {
|
|
32
|
+
method: 'POST',
|
|
33
|
+
headers: {
|
|
34
|
+
Authorization: `Bearer ${token}`,
|
|
35
|
+
Accept: 'application/json',
|
|
36
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
37
|
+
},
|
|
38
|
+
body: new URLSearchParams(body).toString(),
|
|
39
|
+
signal: AbortSignal.timeout(10_000),
|
|
40
|
+
});
|
|
41
|
+
if (!res.ok)
|
|
42
|
+
throw new Error(`Tradier ${res.status}: ${res.statusText}`);
|
|
43
|
+
return res.json();
|
|
44
|
+
}
|
|
45
|
+
async function robinhoodGet(path) {
|
|
46
|
+
const token = process.env.ROBINHOOD_ACCESS_TOKEN;
|
|
47
|
+
if (!token)
|
|
48
|
+
throw new Error('ROBINHOOD_ACCESS_TOKEN not configured');
|
|
49
|
+
const res = await fetch(`${ROBINHOOD_BASE}${path}`, {
|
|
50
|
+
headers: { Authorization: `Bearer ${token}`, Accept: 'application/json' },
|
|
51
|
+
signal: AbortSignal.timeout(10_000),
|
|
52
|
+
});
|
|
53
|
+
if (!res.ok)
|
|
54
|
+
throw new Error(`Robinhood ${res.status}: ${res.statusText}`);
|
|
55
|
+
return res.json();
|
|
56
|
+
}
|
|
57
|
+
async function robinhoodPost(path, body) {
|
|
58
|
+
const token = process.env.ROBINHOOD_ACCESS_TOKEN;
|
|
59
|
+
if (!token)
|
|
60
|
+
throw new Error('ROBINHOOD_ACCESS_TOKEN not configured');
|
|
61
|
+
const res = await fetch(`${ROBINHOOD_BASE}${path}`, {
|
|
62
|
+
method: 'POST',
|
|
63
|
+
headers: {
|
|
64
|
+
Authorization: `Bearer ${token}`,
|
|
65
|
+
Accept: 'application/json',
|
|
66
|
+
'Content-Type': 'application/json',
|
|
67
|
+
},
|
|
68
|
+
body: JSON.stringify(body),
|
|
69
|
+
signal: AbortSignal.timeout(10_000),
|
|
70
|
+
});
|
|
71
|
+
if (!res.ok)
|
|
72
|
+
throw new Error(`Robinhood ${res.status}: ${res.statusText}`);
|
|
73
|
+
return res.json();
|
|
74
|
+
}
|
|
75
|
+
exports.TradierAPI = {
|
|
76
|
+
quote: (params) => tradierGet('/markets/quotes', { symbols: params.symbols, greeks: 'false' }),
|
|
77
|
+
optionChain: (symbol, expiration) => tradierGet('/markets/options/chains', { symbol, expiration, greeks: 'true' }),
|
|
78
|
+
order: (params) => {
|
|
79
|
+
const body = {
|
|
80
|
+
class: 'equity',
|
|
81
|
+
symbol: params.symbol,
|
|
82
|
+
side: params.side,
|
|
83
|
+
quantity: String(params.quantity),
|
|
84
|
+
type: params.type,
|
|
85
|
+
duration: params.duration,
|
|
86
|
+
};
|
|
87
|
+
if (params.price !== undefined)
|
|
88
|
+
body.price = String(params.price);
|
|
89
|
+
if (params.stop !== undefined)
|
|
90
|
+
body.stop = String(params.stop);
|
|
91
|
+
return tradierPost(`/accounts/${params.account_id}/orders`, body);
|
|
92
|
+
},
|
|
93
|
+
positions: (account_id) => tradierGet(`/accounts/${account_id}/positions`),
|
|
94
|
+
balances: (account_id) => tradierGet(`/accounts/${account_id}/balances`),
|
|
95
|
+
orderStatus: (account_id, order_id) => tradierGet(`/accounts/${account_id}/orders/${order_id}`),
|
|
96
|
+
};
|
|
97
|
+
exports.RobinhoodAPI = {
|
|
98
|
+
quote: async (symbol) => {
|
|
99
|
+
const data = await robinhoodGet(`/quotes/?symbols=${symbol}`);
|
|
100
|
+
return data.results?.[0] ?? data;
|
|
101
|
+
},
|
|
102
|
+
instruments: async (symbol) => {
|
|
103
|
+
const data = await robinhoodGet(`/instruments/?symbol=${symbol}`);
|
|
104
|
+
return data.results?.[0];
|
|
105
|
+
},
|
|
106
|
+
order: async (params) => {
|
|
107
|
+
const instrument = await exports.RobinhoodAPI.instruments(params.symbol);
|
|
108
|
+
if (!instrument?.url)
|
|
109
|
+
throw new Error(`Instrument not found: ${params.symbol}`);
|
|
110
|
+
const body = {
|
|
111
|
+
account: `/accounts/${process.env.ROBINHOOD_ACCOUNT_ID}/`,
|
|
112
|
+
instrument: instrument.url,
|
|
113
|
+
symbol: params.symbol,
|
|
114
|
+
side: params.side,
|
|
115
|
+
quantity: params.quantity,
|
|
116
|
+
type: params.type,
|
|
117
|
+
time_in_force: params.time_in_force,
|
|
118
|
+
trigger: 'immediate',
|
|
119
|
+
};
|
|
120
|
+
if (params.price !== undefined)
|
|
121
|
+
body.price = String(params.price);
|
|
122
|
+
return robinhoodPost('/orders/', body);
|
|
123
|
+
},
|
|
124
|
+
portfolio: () => robinhoodGet('/portfolios/'),
|
|
125
|
+
positions: () => robinhoodGet('/positions/?nonzero=true'),
|
|
126
|
+
orderHistory: () => robinhoodGet('/orders/?page_size=20'),
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=brokers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brokers.js","sourceRoot":"","sources":["../../../src/lib/sml-api/brokers.ts"],"names":[],"mappings":";AAAA,+CAA+C;AAC/C,8DAA8D;AAC9D,gFAAgF;;;AAEhF,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,YAAY;IAC3D,CAAC,CAAC,4BAA4B;IAC9B,CAAC,CAAC,gCAAgC,CAAC;AAErC,MAAM,cAAc,GAAG,2BAA2B,CAAC;AAEnD,+EAA+E;AAE/E,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,MAA+B;IACrE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC1C,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,YAAY,GAAG,IAAI,EAAE,CAAC,CAAC;IAC9C,IAAI,MAAM;QAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;QACtC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;QACzE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACzE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,IAA4B;IACnE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC1C,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,YAAY,GAAG,IAAI,EAAE,EAAE;QAChD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,mCAAmC;SACpD;QACD,IAAI,EAAE,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QAC1C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACzE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACjD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,GAAG,IAAI,EAAE,EAAE;QAClD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;QACzE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3E,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,IAAY;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACjD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,GAAG,IAAI,EAAE,EAAE;QAClD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3E,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAgBY,QAAA,UAAU,GAAG;IACxB,KAAK,EAAE,CAAC,MAA0B,EAAE,EAAE,CACpC,UAAU,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAE7E,WAAW,EAAE,CAAC,MAAc,EAAE,UAAkB,EAAE,EAAE,CAClD,UAAU,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAE/E,KAAK,EAAE,CAAC,MAA0B,EAAE,EAAE;QACpC,MAAM,IAAI,GAA2B;YACnC,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;YACjC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC;QACF,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClE,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/D,OAAO,WAAW,CAAC,aAAa,MAAM,CAAC,UAAU,SAAS,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC;IAED,SAAS,EAAE,CAAC,UAAkB,EAAE,EAAE,CAChC,UAAU,CAAC,aAAa,UAAU,YAAY,CAAC;IAEjD,QAAQ,EAAE,CAAC,UAAkB,EAAE,EAAE,CAC/B,UAAU,CAAC,aAAa,UAAU,WAAW,CAAC;IAEhD,WAAW,EAAE,CAAC,UAAkB,EAAE,QAAgB,EAAE,EAAE,CACpD,UAAU,CAAC,aAAa,UAAU,WAAW,QAAQ,EAAE,CAAC;CAC3D,CAAC;AAaW,QAAA,YAAY,GAAG;IAC1B,KAAK,EAAE,KAAK,EAAE,MAAc,EAAE,EAAE;QAC9B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,oBAAoB,MAAM,EAAE,CAA4B,CAAC;QACzF,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC;IAED,WAAW,EAAE,KAAK,EAAE,MAAc,EAAE,EAAE;QACpC,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,wBAAwB,MAAM,EAAE,CAAoC,CAAC;QACrG,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,EAAE,KAAK,EAAE,MAA4B,EAAE,EAAE;QAC5C,MAAM,UAAU,GAAG,MAAM,oBAAY,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAiC,CAAC;QACjG,IAAI,CAAC,UAAU,EAAE,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAChF,MAAM,IAAI,GAA4B;YACpC,OAAO,EAAE,aAAa,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG;YACzD,UAAU,EAAE,UAAU,CAAC,GAAG;YAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,OAAO,EAAE,WAAW;SACrB,CAAC;QACF,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClE,OAAO,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC;IAE7C,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,0BAA0B,CAAC;IAEzD,YAAY,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,uBAAuB,CAAC;CAC1D,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface CopyTraderSubscribeParams {
|
|
2
|
+
whaleAddress: string;
|
|
3
|
+
subscriberAddress: string;
|
|
4
|
+
maxCopyAmountXrp: number;
|
|
5
|
+
}
|
|
6
|
+
export declare const CopyTraderAPI: {
|
|
7
|
+
status: () => Promise<unknown>;
|
|
8
|
+
whales: () => Promise<unknown>;
|
|
9
|
+
subscribe: (params: CopyTraderSubscribeParams) => Promise<unknown>;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=copytrader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copytrader.d.ts","sourceRoot":"","sources":["../../../src/lib/sml-api/copytrader.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAaD,eAAO,MAAM,aAAa;;;wBAGJ,yBAAyB;CAC9C,CAAC"}
|