@stwd/react 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.
- package/README.md +99 -0
- package/dist/components/ApprovalQueue.d.ts +6 -0
- package/dist/components/ApprovalQueue.d.ts.map +1 -0
- package/dist/components/ApprovalQueue.js +44 -0
- package/dist/components/ApprovalQueue.js.map +1 -0
- package/dist/components/PolicyControls.d.ts +6 -0
- package/dist/components/PolicyControls.d.ts.map +1 -0
- package/dist/components/PolicyControls.js +224 -0
- package/dist/components/PolicyControls.js.map +1 -0
- package/dist/components/SpendDashboard.d.ts +6 -0
- package/dist/components/SpendDashboard.d.ts.map +1 -0
- package/dist/components/SpendDashboard.js +52 -0
- package/dist/components/SpendDashboard.js.map +1 -0
- package/dist/components/TransactionHistory.d.ts +6 -0
- package/dist/components/TransactionHistory.d.ts.map +1 -0
- package/dist/components/TransactionHistory.js +34 -0
- package/dist/components/TransactionHistory.js.map +1 -0
- package/dist/components/WalletOverview.d.ts +6 -0
- package/dist/components/WalletOverview.d.ts.map +1 -0
- package/dist/components/WalletOverview.js +40 -0
- package/dist/components/WalletOverview.js.map +1 -0
- package/dist/hooks/useApprovals.d.ts +14 -0
- package/dist/hooks/useApprovals.d.ts.map +1 -0
- package/dist/hooks/useApprovals.js +75 -0
- package/dist/hooks/useApprovals.js.map +1 -0
- package/dist/hooks/usePolicies.d.ts +14 -0
- package/dist/hooks/usePolicies.d.ts.map +1 -0
- package/dist/hooks/usePolicies.js +75 -0
- package/dist/hooks/usePolicies.js.map +1 -0
- package/dist/hooks/useSpend.d.ts +11 -0
- package/dist/hooks/useSpend.d.ts.map +1 -0
- package/dist/hooks/useSpend.js +42 -0
- package/dist/hooks/useSpend.js.map +1 -0
- package/dist/hooks/useSteward.d.ts +6 -0
- package/dist/hooks/useSteward.d.ts.map +1 -0
- package/dist/hooks/useSteward.js +8 -0
- package/dist/hooks/useSteward.js.map +1 -0
- package/dist/hooks/useTransactions.d.ts +24 -0
- package/dist/hooks/useTransactions.d.ts.map +1 -0
- package/dist/hooks/useTransactions.js +78 -0
- package/dist/hooks/useTransactions.js.map +1 -0
- package/dist/hooks/useWallet.d.ts +16 -0
- package/dist/hooks/useWallet.d.ts.map +1 -0
- package/dist/hooks/useWallet.js +46 -0
- package/dist/hooks/useWallet.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/provider.d.ts +11 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +81 -0
- package/dist/provider.js.map +1 -0
- package/dist/styles.css +796 -0
- package/dist/types.d.ts +223 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/format.d.ts +41 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +138 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/theme.d.ts +5 -0
- package/dist/utils/theme.d.ts.map +1 -0
- package/dist/utils/theme.js +35 -0
- package/dist/utils/theme.js.map +1 -0
- package/package.json +54 -0
package/README.md
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# @stwd/react
|
|
2
|
+
|
|
3
|
+
Embeddable React components for Steward agent wallet management. Drop-in UI for wallet overview, transaction history, policy controls, approval queues, and spend analytics.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @stwd/react @stwd/sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { StewardProvider, WalletOverview, PolicyControls, TransactionHistory } from "@stwd/react";
|
|
15
|
+
import "@stwd/react/styles.css";
|
|
16
|
+
import { StewardClient } from "@stwd/sdk";
|
|
17
|
+
|
|
18
|
+
const client = new StewardClient({
|
|
19
|
+
baseUrl: "https://api.steward.fi",
|
|
20
|
+
bearerToken: agentJwt,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
function AgentWalletPage({ agentId }: { agentId: string }) {
|
|
24
|
+
return (
|
|
25
|
+
<StewardProvider client={client} agentId={agentId}>
|
|
26
|
+
<WalletOverview showQR />
|
|
27
|
+
<PolicyControls />
|
|
28
|
+
<TransactionHistory pageSize={10} />
|
|
29
|
+
</StewardProvider>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Components
|
|
35
|
+
|
|
36
|
+
| Component | Description |
|
|
37
|
+
|-----------|-------------|
|
|
38
|
+
| `<StewardProvider>` | Context provider — wraps all other components |
|
|
39
|
+
| `<WalletOverview>` | Wallet address, balance, chain info, funding QR |
|
|
40
|
+
| `<TransactionHistory>` | Paginated tx list with status badges and explorer links |
|
|
41
|
+
| `<PolicyControls>` | Human-friendly policy toggles (spending limits, address lists, etc.) |
|
|
42
|
+
| `<ApprovalQueue>` | Pending transaction review with approve/deny |
|
|
43
|
+
| `<SpendDashboard>` | Spend tracking with budget bars and charts |
|
|
44
|
+
|
|
45
|
+
## Hooks
|
|
46
|
+
|
|
47
|
+
All components use public hooks. Use them directly for custom UIs:
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
import { useSteward, useWallet, useTransactions, usePolicies, useApprovals, useSpend } from "@stwd/react";
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
| Hook | Returns |
|
|
54
|
+
|------|---------|
|
|
55
|
+
| `useSteward()` | Client, agentId, features, theme, tenant config |
|
|
56
|
+
| `useWallet()` | Agent data, balance, addresses with auto-refresh |
|
|
57
|
+
| `useTransactions(opts?)` | Paginated tx history |
|
|
58
|
+
| `usePolicies()` | Policy CRUD + template support |
|
|
59
|
+
| `useApprovals(interval?)` | Pending approvals + approve/reject actions |
|
|
60
|
+
| `useSpend(range?)` | Spend analytics for time range |
|
|
61
|
+
|
|
62
|
+
## Theming
|
|
63
|
+
|
|
64
|
+
Components use CSS custom properties. Override any `--stwd-*` variable:
|
|
65
|
+
|
|
66
|
+
```css
|
|
67
|
+
.stwd-root {
|
|
68
|
+
--stwd-primary: #8B5CF6;
|
|
69
|
+
--stwd-accent: #A78BFA;
|
|
70
|
+
--stwd-bg: #0F0F0F;
|
|
71
|
+
--stwd-surface: #1A1A2E;
|
|
72
|
+
--stwd-text: #FAFAFA;
|
|
73
|
+
--stwd-muted: #6B7280;
|
|
74
|
+
--stwd-success: #10B981;
|
|
75
|
+
--stwd-error: #EF4444;
|
|
76
|
+
--stwd-warning: #F59E0B;
|
|
77
|
+
--stwd-radius: 12px;
|
|
78
|
+
--stwd-font: Inter, system-ui, sans-serif;
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Or pass theme overrides to the provider:
|
|
83
|
+
|
|
84
|
+
```tsx
|
|
85
|
+
<StewardProvider
|
|
86
|
+
client={client}
|
|
87
|
+
agentId={agentId}
|
|
88
|
+
theme={{ primaryColor: "#FF6B35", colorScheme: "light" }}
|
|
89
|
+
>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Peer Dependencies
|
|
93
|
+
|
|
94
|
+
- `react >= 18`
|
|
95
|
+
- `@stwd/sdk >= 0.1.0`
|
|
96
|
+
|
|
97
|
+
## License
|
|
98
|
+
|
|
99
|
+
MIT
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ApprovalQueueProps } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Pending transactions awaiting human review.
|
|
4
|
+
*/
|
|
5
|
+
export declare function ApprovalQueue({ refreshInterval, onResolve, showPolicyReason, className, }: ApprovalQueueProps): import("react/jsx-runtime").JSX.Element | null;
|
|
6
|
+
//# sourceMappingURL=ApprovalQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApprovalQueue.d.ts","sourceRoot":"","sources":["../../src/components/ApprovalQueue.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKtD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,eAAe,EACf,SAAS,EACT,gBAAuB,EACvB,SAAS,GACV,EAAE,kBAAkB,kDA2IpB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { useApprovals } from "../hooks/useApprovals.js";
|
|
4
|
+
import { useStewardContext } from "../provider.js";
|
|
5
|
+
import { truncateAddress, formatWei, formatRelativeTime, getStatusColor } from "../utils/format.js";
|
|
6
|
+
/**
|
|
7
|
+
* Pending transactions awaiting human review.
|
|
8
|
+
*/
|
|
9
|
+
export function ApprovalQueue({ refreshInterval, onResolve, showPolicyReason = true, className, }) {
|
|
10
|
+
const { features } = useStewardContext();
|
|
11
|
+
const { pending, isLoading, error, approve, reject, isResolving } = useApprovals(refreshInterval);
|
|
12
|
+
const [confirmAction, setConfirmAction] = useState(null);
|
|
13
|
+
if (!features.showApprovalQueue)
|
|
14
|
+
return null;
|
|
15
|
+
const handleConfirm = async () => {
|
|
16
|
+
if (!confirmAction)
|
|
17
|
+
return;
|
|
18
|
+
try {
|
|
19
|
+
if (confirmAction.action === "approve") {
|
|
20
|
+
await approve(confirmAction.txId);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
await reject(confirmAction.txId);
|
|
24
|
+
}
|
|
25
|
+
onResolve?.(confirmAction.txId, confirmAction.action === "approve" ? "approved" : "rejected");
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Error handled by hook
|
|
29
|
+
}
|
|
30
|
+
setConfirmAction(null);
|
|
31
|
+
};
|
|
32
|
+
if (isLoading) {
|
|
33
|
+
return (_jsx("div", { className: `stwd-card stwd-approval-queue ${className || ""}`, children: _jsx("div", { className: "stwd-loading", children: "Loading approvals..." }) }));
|
|
34
|
+
}
|
|
35
|
+
if (error) {
|
|
36
|
+
return (_jsx("div", { className: `stwd-card stwd-approval-queue ${className || ""}`, children: _jsxs("div", { className: "stwd-error-text", children: ["Failed to load approvals: ", error.message] }) }));
|
|
37
|
+
}
|
|
38
|
+
return (_jsxs("div", { className: `stwd-card stwd-approval-queue ${className || ""}`, children: [_jsxs("div", { className: "stwd-approval-header", children: [_jsx("h3", { className: "stwd-heading", children: "Pending Approvals" }), pending.length > 0 && (_jsx("span", { className: "stwd-badge stwd-badge-warning", children: pending.length }))] }), pending.length === 0 ? (_jsxs("div", { className: "stwd-empty-state", children: [_jsx("div", { className: "stwd-empty-icon", children: "\u2705" }), _jsx("div", { className: "stwd-empty-text", children: "No pending approvals" })] })) : (_jsx("div", { className: "stwd-approval-list", children: pending.map((entry) => (_jsxs("div", { className: "stwd-approval-item", children: [_jsxs("div", { className: "stwd-approval-main", children: [_jsxs("div", { className: "stwd-approval-to", children: ["To: ", _jsx("code", { children: truncateAddress(entry.to) })] }), _jsxs("div", { className: "stwd-approval-value", children: [formatWei(entry.value), " ETH"] }), _jsxs("div", { className: "stwd-approval-meta", children: [_jsxs("span", { className: "stwd-badge stwd-badge-muted", children: ["Chain ", entry.chainId] }), _jsx("span", { className: "stwd-approval-time", children: formatRelativeTime(entry.createdAt) })] })] }), showPolicyReason && entry.policyResults.length > 0 && (_jsxs("div", { className: "stwd-approval-reasons", children: [_jsx("div", { className: "stwd-approval-reasons-label", children: "Triggered policies:" }), entry.policyResults
|
|
39
|
+
.filter((pr) => !pr.passed)
|
|
40
|
+
.map((pr, i) => (_jsxs("div", { className: `stwd-badge ${getStatusColor("rejected")}`, children: [pr.type, ": ", pr.reason || "failed"] }, i)))] })), _jsxs("div", { className: "stwd-approval-actions", children: [_jsx("button", { className: "stwd-btn stwd-btn-error", disabled: isResolving, onClick: () => setConfirmAction({ txId: entry.txId, action: "reject" }), children: "Deny" }), _jsx("button", { className: "stwd-btn stwd-btn-success", disabled: isResolving, onClick: () => setConfirmAction({ txId: entry.txId, action: "approve" }), children: "Approve" })] })] }, entry.id))) })), confirmAction && (_jsx("div", { className: "stwd-modal-overlay", onClick: () => setConfirmAction(null), children: _jsxs("div", { className: "stwd-modal", onClick: (e) => e.stopPropagation(), children: [_jsx("h3", { className: "stwd-heading", children: confirmAction.action === "approve" ? "Approve Transaction?" : "Deny Transaction?" }), _jsx("p", { className: "stwd-muted-text", children: confirmAction.action === "approve"
|
|
41
|
+
? "This transaction will be signed and broadcast."
|
|
42
|
+
: "This transaction will be rejected and will not be executed." }), _jsxs("div", { className: "stwd-modal-actions", children: [_jsx("button", { className: "stwd-btn stwd-btn-secondary", onClick: () => setConfirmAction(null), children: "Cancel" }), _jsx("button", { className: `stwd-btn ${confirmAction.action === "approve" ? "stwd-btn-success" : "stwd-btn-error"}`, onClick: handleConfirm, disabled: isResolving, children: isResolving ? "Processing..." : confirmAction.action === "approve" ? "Approve" : "Deny" })] })] }) }))] }));
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=ApprovalQueue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApprovalQueue.js","sourceRoot":"","sources":["../../src/components/ApprovalQueue.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PolicyControlsProps } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Human-friendly policy toggles. Respects tenant exposure config.
|
|
4
|
+
*/
|
|
5
|
+
export declare function PolicyControls({ showTemplates, onSave, readOnly, labels: labelOverrides, className, }: PolicyControlsProps): import("react/jsx-runtime").JSX.Element | null;
|
|
6
|
+
//# sourceMappingURL=PolicyControls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PolicyControls.d.ts","sourceRoot":"","sources":["../../src/components/PolicyControls.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,aAAa,CAAC;AAsBvE;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAC7B,aAAoB,EACpB,MAAM,EACN,QAAgB,EAChB,MAAM,EAAE,cAAc,EACtB,SAAS,GACV,EAAE,mBAAmB,kDAsMrB"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { usePolicies } from "../hooks/usePolicies.js";
|
|
4
|
+
import { useStewardContext } from "../provider.js";
|
|
5
|
+
const DEFAULT_LABELS = {
|
|
6
|
+
"spending-limit": "Spending Limits",
|
|
7
|
+
"approved-addresses": "Approved Addresses",
|
|
8
|
+
"auto-approve-threshold": "Auto-Approve Threshold",
|
|
9
|
+
"time-window": "Time Window",
|
|
10
|
+
"rate-limit": "Rate Limit",
|
|
11
|
+
"allowed-chains": "Allowed Chains",
|
|
12
|
+
};
|
|
13
|
+
const POLICY_DESCRIPTIONS = {
|
|
14
|
+
"spending-limit": "Set maximum amounts per transaction, per day, and per week.",
|
|
15
|
+
"approved-addresses": "Whitelist or blacklist specific addresses for transactions.",
|
|
16
|
+
"auto-approve-threshold": "Transactions below this amount are auto-approved without review.",
|
|
17
|
+
"time-window": "Restrict transactions to specific hours and days.",
|
|
18
|
+
"rate-limit": "Limit the number of transactions per hour and per day.",
|
|
19
|
+
"allowed-chains": "Restrict which blockchain networks can be used.",
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Human-friendly policy toggles. Respects tenant exposure config.
|
|
23
|
+
*/
|
|
24
|
+
export function PolicyControls({ showTemplates = true, onSave, readOnly = false, labels: labelOverrides, className, }) {
|
|
25
|
+
const { features, tenantConfig } = useStewardContext();
|
|
26
|
+
const { policies, isLoading, isSaving, error, setPolicies, applyTemplate } = usePolicies();
|
|
27
|
+
const [editPolicies, setEditPolicies] = useState(null);
|
|
28
|
+
const [showTemplateModal, setShowTemplateModal] = useState(false);
|
|
29
|
+
const [saveError, setSaveError] = useState(null);
|
|
30
|
+
if (!features.showPolicyControls)
|
|
31
|
+
return null;
|
|
32
|
+
const labels = { ...DEFAULT_LABELS, ...labelOverrides };
|
|
33
|
+
const exposure = tenantConfig?.exposedPolicies;
|
|
34
|
+
const templates = tenantConfig?.policyTemplates || [];
|
|
35
|
+
const currentPolicies = editPolicies || policies;
|
|
36
|
+
const getExposure = (type) => {
|
|
37
|
+
return exposure?.[type] || "visible";
|
|
38
|
+
};
|
|
39
|
+
const visibleTypes = [
|
|
40
|
+
"spending-limit",
|
|
41
|
+
"approved-addresses",
|
|
42
|
+
"auto-approve-threshold",
|
|
43
|
+
"time-window",
|
|
44
|
+
"rate-limit",
|
|
45
|
+
"allowed-chains",
|
|
46
|
+
].filter((t) => getExposure(t) !== "hidden");
|
|
47
|
+
const findPolicy = (type) => currentPolicies.find((p) => p.type === type);
|
|
48
|
+
const updatePolicy = (type, updates) => {
|
|
49
|
+
if (readOnly)
|
|
50
|
+
return;
|
|
51
|
+
const existing = currentPolicies.find((p) => p.type === type);
|
|
52
|
+
const updated = existing
|
|
53
|
+
? currentPolicies.map((p) => (p.type === type ? { ...p, ...updates } : p))
|
|
54
|
+
: [
|
|
55
|
+
...currentPolicies,
|
|
56
|
+
{
|
|
57
|
+
id: `policy-${type}`,
|
|
58
|
+
type,
|
|
59
|
+
enabled: true,
|
|
60
|
+
config: {},
|
|
61
|
+
...updates,
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
setEditPolicies(updated);
|
|
65
|
+
};
|
|
66
|
+
const updateConfig = (type, key, value) => {
|
|
67
|
+
const policy = findPolicy(type);
|
|
68
|
+
const config = { ...(policy?.config || {}), [key]: value };
|
|
69
|
+
updatePolicy(type, { config });
|
|
70
|
+
};
|
|
71
|
+
const handleSave = async () => {
|
|
72
|
+
if (!editPolicies)
|
|
73
|
+
return;
|
|
74
|
+
setSaveError(null);
|
|
75
|
+
try {
|
|
76
|
+
await setPolicies(editPolicies);
|
|
77
|
+
setEditPolicies(null);
|
|
78
|
+
onSave?.(editPolicies);
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
setSaveError(err instanceof Error ? err.message : "Failed to save");
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const handleApplyTemplate = async (templateId) => {
|
|
85
|
+
try {
|
|
86
|
+
await applyTemplate(templateId);
|
|
87
|
+
setShowTemplateModal(false);
|
|
88
|
+
setEditPolicies(null);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
setSaveError(err instanceof Error ? err.message : "Failed to apply template");
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
if (isLoading) {
|
|
95
|
+
return (_jsx("div", { className: `stwd-card stwd-policy-controls ${className || ""}`, children: _jsx("div", { className: "stwd-loading", children: "Loading policies..." }) }));
|
|
96
|
+
}
|
|
97
|
+
return (_jsxs("div", { className: `stwd-card stwd-policy-controls ${className || ""}`, children: [_jsxs("div", { className: "stwd-policy-header", children: [_jsx("h3", { className: "stwd-heading", children: "Policy Controls" }), showTemplates && templates.length > 0 && !readOnly && (_jsx("button", { className: "stwd-btn stwd-btn-secondary", onClick: () => setShowTemplateModal(true), children: "Use Template" }))] }), error && _jsx("div", { className: "stwd-error-text", children: error.message }), _jsx("div", { className: "stwd-policy-list", children: visibleTypes.map((type) => {
|
|
98
|
+
const policy = findPolicy(type);
|
|
99
|
+
const isEnforced = getExposure(type) === "enforced";
|
|
100
|
+
const isEnabled = policy?.enabled ?? false;
|
|
101
|
+
return (_jsxs("div", { className: `stwd-policy-item ${isEnforced ? "stwd-enforced" : ""}`, children: [_jsxs("div", { className: "stwd-policy-item-header", children: [_jsxs("div", { className: "stwd-policy-info", children: [_jsxs("div", { className: "stwd-policy-name", children: [isEnforced && _jsx("span", { className: "stwd-lock-icon", title: "Set by platform", children: "\uD83D\uDD12" }), labels[type]] }), _jsx("div", { className: "stwd-policy-desc", children: POLICY_DESCRIPTIONS[type] })] }), _jsxs("label", { className: "stwd-toggle", children: [_jsx("input", { type: "checkbox", checked: isEnabled, disabled: readOnly || isEnforced, onChange: (e) => updatePolicy(type, { enabled: e.target.checked }) }), _jsx("span", { className: "stwd-toggle-slider" })] })] }), isEnabled && (_jsx("div", { className: "stwd-policy-config", children: _jsx(PolicyConfigEditor, { type: type, config: policy?.config || {}, readOnly: readOnly || isEnforced, onConfigChange: (key, val) => updateConfig(type, key, val) }) })), isEnforced && (_jsx("div", { className: "stwd-enforced-label", children: "Set by platform \u2014 cannot be changed" }))] }, type));
|
|
102
|
+
}) }), editPolicies && !readOnly && (_jsxs("div", { className: "stwd-policy-actions", children: [saveError && _jsx("div", { className: "stwd-error-text", children: saveError }), _jsx("button", { className: "stwd-btn stwd-btn-secondary", onClick: () => setEditPolicies(null), disabled: isSaving, children: "Cancel" }), _jsx("button", { className: "stwd-btn stwd-btn-primary", onClick: handleSave, disabled: isSaving, children: isSaving ? "Saving..." : "Save Policies" })] })), showTemplateModal && (_jsx("div", { className: "stwd-modal-overlay", onClick: () => setShowTemplateModal(false), children: _jsxs("div", { className: "stwd-modal", onClick: (e) => e.stopPropagation(), children: [_jsx("h3", { className: "stwd-heading", children: "Choose a Template" }), _jsx("div", { className: "stwd-template-list", children: templates.map((tpl) => (_jsxs("div", { className: "stwd-template-card", children: [_jsx("div", { className: "stwd-template-name", children: tpl.name }), _jsx("div", { className: "stwd-template-desc", children: tpl.description }), _jsx("button", { className: "stwd-btn stwd-btn-primary", onClick: () => handleApplyTemplate(tpl.id), disabled: isSaving, children: "Apply" })] }, tpl.id))) }), _jsx("button", { className: "stwd-btn stwd-btn-secondary", onClick: () => setShowTemplateModal(false), children: "Cancel" })] }) }))] }));
|
|
103
|
+
}
|
|
104
|
+
function PolicyConfigEditor({ type, config, readOnly, onConfigChange }) {
|
|
105
|
+
switch (type) {
|
|
106
|
+
case "spending-limit":
|
|
107
|
+
return _jsx(SpendingLimitEditor, { config: config, readOnly: readOnly, onChange: onConfigChange });
|
|
108
|
+
case "approved-addresses":
|
|
109
|
+
return _jsx(ApprovedAddressesEditor, { config: config, readOnly: readOnly, onChange: onConfigChange });
|
|
110
|
+
case "auto-approve-threshold":
|
|
111
|
+
return _jsx(AutoApproveEditor, { config: config, readOnly: readOnly, onChange: onConfigChange });
|
|
112
|
+
case "time-window":
|
|
113
|
+
return _jsx(TimeWindowEditor, { config: config, readOnly: readOnly, onChange: onConfigChange });
|
|
114
|
+
case "rate-limit":
|
|
115
|
+
return _jsx(RateLimitEditor, { config: config, readOnly: readOnly, onChange: onConfigChange });
|
|
116
|
+
case "allowed-chains":
|
|
117
|
+
return _jsx(AllowedChainsEditor, { config: config, readOnly: readOnly, onChange: onConfigChange });
|
|
118
|
+
default:
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// ─── Spending Limit ───
|
|
123
|
+
function SpendingLimitEditor({ config, readOnly, onChange, }) {
|
|
124
|
+
const toEth = (wei) => {
|
|
125
|
+
if (!wei || typeof wei !== "string")
|
|
126
|
+
return "";
|
|
127
|
+
try {
|
|
128
|
+
return (Number(BigInt(wei)) / 1e18).toString();
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return String(wei);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
const toWei = (eth) => {
|
|
135
|
+
try {
|
|
136
|
+
return BigInt(Math.floor(parseFloat(eth) * 1e18)).toString();
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return "0";
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
return (_jsxs("div", { className: "stwd-config-grid", children: [_jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Max per transaction (ETH)" }), _jsx("input", { type: "number", step: "0.001", className: "stwd-input", value: toEth(config.maxPerTx), disabled: readOnly, onChange: (e) => onChange("maxPerTx", toWei(e.target.value)) })] }), _jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Max per day (ETH)" }), _jsx("input", { type: "number", step: "0.01", className: "stwd-input", value: toEth(config.maxPerDay), disabled: readOnly, onChange: (e) => onChange("maxPerDay", toWei(e.target.value)) })] }), _jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Max per week (ETH)" }), _jsx("input", { type: "number", step: "0.01", className: "stwd-input", value: toEth(config.maxPerWeek), disabled: readOnly, onChange: (e) => onChange("maxPerWeek", toWei(e.target.value)) })] })] }));
|
|
143
|
+
}
|
|
144
|
+
// ─── Approved Addresses ───
|
|
145
|
+
function ApprovedAddressesEditor({ config, readOnly, onChange, }) {
|
|
146
|
+
const addresses = config.addresses || [];
|
|
147
|
+
const mode = config.mode || "whitelist";
|
|
148
|
+
const [newAddr, setNewAddr] = useState("");
|
|
149
|
+
const addAddress = () => {
|
|
150
|
+
if (newAddr && /^0x[0-9a-fA-F]{40}$/.test(newAddr)) {
|
|
151
|
+
onChange("addresses", [...addresses, newAddr]);
|
|
152
|
+
setNewAddr("");
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
const removeAddress = (idx) => {
|
|
156
|
+
onChange("addresses", addresses.filter((_, i) => i !== idx));
|
|
157
|
+
};
|
|
158
|
+
return (_jsxs("div", { className: "stwd-config-stack", children: [_jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Mode" }), _jsxs("select", { className: "stwd-select", value: mode, disabled: readOnly, onChange: (e) => onChange("mode", e.target.value), children: [_jsx("option", { value: "whitelist", children: "Whitelist (only these addresses)" }), _jsx("option", { value: "blacklist", children: "Blacklist (block these addresses)" })] })] }), _jsx("div", { className: "stwd-address-list", children: addresses.map((addr, i) => (_jsxs("div", { className: "stwd-address-item", children: [_jsx("code", { children: addr }), !readOnly && (_jsx("button", { className: "stwd-btn stwd-btn-ghost stwd-btn-sm", onClick: () => removeAddress(i), children: "\u2715" }))] }, i))) }), !readOnly && (_jsxs("div", { className: "stwd-address-add", children: [_jsx("input", { type: "text", className: "stwd-input", placeholder: "0x...", value: newAddr, onChange: (e) => setNewAddr(e.target.value), onKeyDown: (e) => e.key === "Enter" && addAddress() }), _jsx("button", { className: "stwd-btn stwd-btn-secondary", onClick: addAddress, children: "Add" })] }))] }));
|
|
159
|
+
}
|
|
160
|
+
// ─── Auto-Approve Threshold ───
|
|
161
|
+
function AutoApproveEditor({ config, readOnly, onChange, }) {
|
|
162
|
+
const toEth = (wei) => {
|
|
163
|
+
if (!wei || typeof wei !== "string")
|
|
164
|
+
return "";
|
|
165
|
+
try {
|
|
166
|
+
return (Number(BigInt(wei)) / 1e18).toString();
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return String(wei);
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
const toWei = (eth) => {
|
|
173
|
+
try {
|
|
174
|
+
return BigInt(Math.floor(parseFloat(eth) * 1e18)).toString();
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return "0";
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
return (_jsxs("div", { className: "stwd-config-stack", children: [_jsx("p", { className: "stwd-muted-text", children: "Transactions below this amount will be automatically approved without human review." }), _jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Threshold (ETH)" }), _jsx("input", { type: "number", step: "0.001", className: "stwd-input", value: toEth(config.threshold), disabled: readOnly, onChange: (e) => onChange("threshold", toWei(e.target.value)) })] })] }));
|
|
181
|
+
}
|
|
182
|
+
// ─── Time Window ───
|
|
183
|
+
function TimeWindowEditor({ config, readOnly, onChange, }) {
|
|
184
|
+
const allowedHours = config.allowedHours || [
|
|
185
|
+
{ start: 9, end: 17 },
|
|
186
|
+
];
|
|
187
|
+
const allowedDays = config.allowedDays || [1, 2, 3, 4, 5];
|
|
188
|
+
const dayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
189
|
+
const toggleDay = (day) => {
|
|
190
|
+
const newDays = allowedDays.includes(day)
|
|
191
|
+
? allowedDays.filter((d) => d !== day)
|
|
192
|
+
: [...allowedDays, day].sort();
|
|
193
|
+
onChange("allowedDays", newDays);
|
|
194
|
+
};
|
|
195
|
+
const updateHours = (index, field, value) => {
|
|
196
|
+
const newHours = allowedHours.map((h, i) => i === index ? { ...h, [field]: value } : h);
|
|
197
|
+
onChange("allowedHours", newHours);
|
|
198
|
+
};
|
|
199
|
+
return (_jsxs("div", { className: "stwd-config-stack", children: [_jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Active Hours" }), allowedHours.map((hours, i) => (_jsxs("div", { className: "stwd-time-range", children: [_jsx("input", { type: "number", min: 0, max: 23, className: "stwd-input stwd-input-sm", value: hours.start, disabled: readOnly, onChange: (e) => updateHours(i, "start", parseInt(e.target.value)) }), _jsx("span", { children: "to" }), _jsx("input", { type: "number", min: 0, max: 23, className: "stwd-input stwd-input-sm", value: hours.end, disabled: readOnly, onChange: (e) => updateHours(i, "end", parseInt(e.target.value)) })] }, i)))] }), _jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Active Days" }), _jsx("div", { className: "stwd-day-picker", children: dayNames.map((name, i) => (_jsx("button", { className: `stwd-day-btn ${allowedDays.includes(i) ? "stwd-day-active" : ""}`, disabled: readOnly, onClick: () => toggleDay(i), children: name }, i))) })] })] }));
|
|
200
|
+
}
|
|
201
|
+
// ─── Rate Limit ───
|
|
202
|
+
function RateLimitEditor({ config, readOnly, onChange, }) {
|
|
203
|
+
return (_jsxs("div", { className: "stwd-config-grid", children: [_jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Max transactions per hour" }), _jsx("input", { type: "number", min: 1, className: "stwd-input", value: config.maxTxPerHour || 10, disabled: readOnly, onChange: (e) => onChange("maxTxPerHour", parseInt(e.target.value)) })] }), _jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Max transactions per day" }), _jsx("input", { type: "number", min: 1, className: "stwd-input", value: config.maxTxPerDay || 100, disabled: readOnly, onChange: (e) => onChange("maxTxPerDay", parseInt(e.target.value)) })] })] }));
|
|
204
|
+
}
|
|
205
|
+
// ─── Allowed Chains ───
|
|
206
|
+
function AllowedChainsEditor({ config, readOnly, onChange, }) {
|
|
207
|
+
const chains = config.chains || [];
|
|
208
|
+
const availableChains = [
|
|
209
|
+
{ caip2: "eip155:1", name: "Ethereum", symbol: "ETH" },
|
|
210
|
+
{ caip2: "eip155:8453", name: "Base", symbol: "ETH" },
|
|
211
|
+
{ caip2: "eip155:137", name: "Polygon", symbol: "POL" },
|
|
212
|
+
{ caip2: "eip155:42161", name: "Arbitrum", symbol: "ETH" },
|
|
213
|
+
{ caip2: "eip155:56", name: "BSC", symbol: "BNB" },
|
|
214
|
+
{ caip2: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", name: "Solana", symbol: "SOL" },
|
|
215
|
+
];
|
|
216
|
+
const toggleChain = (caip2) => {
|
|
217
|
+
const newChains = chains.includes(caip2)
|
|
218
|
+
? chains.filter((c) => c !== caip2)
|
|
219
|
+
: [...chains, caip2];
|
|
220
|
+
onChange("chains", newChains);
|
|
221
|
+
};
|
|
222
|
+
return (_jsx("div", { className: "stwd-config-stack", children: _jsx("div", { className: "stwd-chain-checklist", children: availableChains.map((chain) => (_jsxs("label", { className: "stwd-chain-option", children: [_jsx("input", { type: "checkbox", checked: chains.includes(chain.caip2), disabled: readOnly, onChange: () => toggleChain(chain.caip2) }), _jsx("span", { className: "stwd-chain-name", children: chain.name }), _jsx("span", { className: "stwd-chain-symbol", children: chain.symbol })] }, chain.caip2))) }) }));
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=PolicyControls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PolicyControls.js","sourceRoot":"","sources":["../../src/components/PolicyControls.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SpendDashboardProps } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Spend tracking visualization with budget usage bars and breakdown.
|
|
4
|
+
*/
|
|
5
|
+
export declare function SpendDashboard({ range, showBudgetUsage, showChart, showTopDestinations, className, }: SpendDashboardProps): import("react/jsx-runtime").JSX.Element | null;
|
|
6
|
+
//# sourceMappingURL=SpendDashboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpendDashboard.d.ts","sourceRoot":"","sources":["../../src/components/SpendDashboard.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAKvD;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAY,EACZ,eAAsB,EACtB,SAAgB,EAChB,mBAA0B,EAC1B,SAAS,GACV,EAAE,mBAAmB,kDAiKrB"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useSpend } from "../hooks/useSpend.js";
|
|
3
|
+
import { useStewardContext } from "../provider.js";
|
|
4
|
+
import { truncateAddress } from "../utils/format.js";
|
|
5
|
+
/**
|
|
6
|
+
* Spend tracking visualization with budget usage bars and breakdown.
|
|
7
|
+
*/
|
|
8
|
+
export function SpendDashboard({ range = "7d", showBudgetUsage = true, showChart = true, showTopDestinations = true, className, }) {
|
|
9
|
+
const { features } = useStewardContext();
|
|
10
|
+
const { stats, isLoading, error } = useSpend(range);
|
|
11
|
+
if (!features.showSpendDashboard)
|
|
12
|
+
return null;
|
|
13
|
+
if (isLoading) {
|
|
14
|
+
return (_jsx("div", { className: `stwd-card stwd-spend-dashboard ${className || ""}`, children: _jsx("div", { className: "stwd-loading", children: "Loading spend data..." }) }));
|
|
15
|
+
}
|
|
16
|
+
if (error) {
|
|
17
|
+
return (_jsx("div", { className: `stwd-card stwd-spend-dashboard ${className || ""}`, children: _jsxs("div", { className: "stwd-error-text", children: ["Failed to load spend data: ", error.message] }) }));
|
|
18
|
+
}
|
|
19
|
+
if (!stats) {
|
|
20
|
+
return (_jsx("div", { className: `stwd-card stwd-spend-dashboard ${className || ""}`, children: _jsxs("div", { className: "stwd-empty-state", children: [_jsx("div", { className: "stwd-empty-icon", children: "\uD83D\uDCCA" }), _jsx("div", { className: "stwd-empty-text", children: "No spend data available" })] }) }));
|
|
21
|
+
}
|
|
22
|
+
const getRangeLabel = (r) => {
|
|
23
|
+
switch (r) {
|
|
24
|
+
case "24h": return "Last 24 Hours";
|
|
25
|
+
case "7d": return "Last 7 Days";
|
|
26
|
+
case "30d": return "Last 30 Days";
|
|
27
|
+
case "all": return "All Time";
|
|
28
|
+
default: return r;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const getBarColor = (pct) => {
|
|
32
|
+
if (pct >= 90)
|
|
33
|
+
return "var(--stwd-error)";
|
|
34
|
+
if (pct >= 70)
|
|
35
|
+
return "var(--stwd-warning)";
|
|
36
|
+
return "var(--stwd-success)";
|
|
37
|
+
};
|
|
38
|
+
return (_jsxs("div", { className: `stwd-card stwd-spend-dashboard ${className || ""}`, children: [_jsxs("div", { className: "stwd-spend-header", children: [_jsx("h3", { className: "stwd-heading", children: "Spend Dashboard" }), _jsx("span", { className: "stwd-badge stwd-badge-muted", children: getRangeLabel(stats.range) })] }), _jsxs("div", { className: "stwd-spend-stats-grid", children: [_jsxs("div", { className: "stwd-stat-card", children: [_jsx("div", { className: "stwd-stat-label", children: "Total Spent" }), _jsxs("div", { className: "stwd-stat-value", children: [stats.totalSpentFormatted, " ETH"] })] }), _jsxs("div", { className: "stwd-stat-card", children: [_jsx("div", { className: "stwd-stat-label", children: "Transactions" }), _jsx("div", { className: "stwd-stat-value", children: stats.txCount })] }), _jsxs("div", { className: "stwd-stat-card", children: [_jsx("div", { className: "stwd-stat-label", children: "Avg Tx Value" }), _jsxs("div", { className: "stwd-stat-value", children: [stats.avgTxValueFormatted, " ETH"] })] }), stats.largestTx && (_jsxs("div", { className: "stwd-stat-card", children: [_jsx("div", { className: "stwd-stat-label", children: "Largest Tx" }), _jsxs("div", { className: "stwd-stat-value", children: [stats.largestTx.value, " ETH"] })] }))] }), showBudgetUsage && stats.budgetUsage && (_jsxs("div", { className: "stwd-budget-section", children: [_jsx("h4", { className: "stwd-subheading", children: "Budget Usage" }), _jsxs("div", { className: "stwd-budget-bar-group", children: [_jsxs("div", { className: "stwd-budget-bar-label", children: [_jsx("span", { children: "Daily" }), _jsxs("span", { children: [stats.budgetUsage.dailyPercent, "%"] })] }), _jsx("div", { className: "stwd-budget-bar-track", children: _jsx("div", { className: "stwd-budget-bar-fill", style: {
|
|
39
|
+
width: `${Math.min(100, stats.budgetUsage.dailyPercent)}%`,
|
|
40
|
+
backgroundColor: getBarColor(stats.budgetUsage.dailyPercent),
|
|
41
|
+
} }) }), _jsxs("div", { className: "stwd-budget-bar-detail", children: [stats.budgetUsage.dailyUsed, " / ", stats.budgetUsage.dailyLimit, " wei"] })] }), _jsxs("div", { className: "stwd-budget-bar-group", children: [_jsxs("div", { className: "stwd-budget-bar-label", children: [_jsx("span", { children: "Weekly" }), _jsxs("span", { children: [stats.budgetUsage.weeklyPercent, "%"] })] }), _jsx("div", { className: "stwd-budget-bar-track", children: _jsx("div", { className: "stwd-budget-bar-fill", style: {
|
|
42
|
+
width: `${Math.min(100, stats.budgetUsage.weeklyPercent)}%`,
|
|
43
|
+
backgroundColor: getBarColor(stats.budgetUsage.weeklyPercent),
|
|
44
|
+
} }) }), _jsxs("div", { className: "stwd-budget-bar-detail", children: [stats.budgetUsage.weeklyUsed, " / ", stats.budgetUsage.weeklyLimit, " wei"] })] })] })), showChart && stats.daily.length > 0 && (_jsxs("div", { className: "stwd-chart-section", children: [_jsx("h4", { className: "stwd-subheading", children: "Daily Spend" }), _jsx("div", { className: "stwd-bar-chart", children: stats.daily.map((day) => {
|
|
45
|
+
const maxSpent = Math.max(...stats.daily.map((d) => parseFloat(d.spentFormatted) || 0));
|
|
46
|
+
const height = maxSpent > 0
|
|
47
|
+
? (parseFloat(day.spentFormatted) / maxSpent) * 100
|
|
48
|
+
: 0;
|
|
49
|
+
return (_jsxs("div", { className: "stwd-bar-col", title: `${day.date}: ${day.spentFormatted} ETH (${day.txCount} txs)`, children: [_jsx("div", { className: "stwd-bar", style: { height: `${Math.max(2, height)}%` } }), _jsx("div", { className: "stwd-bar-label", children: day.date.slice(-5) })] }, day.date));
|
|
50
|
+
}) })] })), showTopDestinations && stats.topDestinations.length > 0 && (_jsxs("div", { className: "stwd-destinations-section", children: [_jsx("h4", { className: "stwd-subheading", children: "Top Destinations" }), _jsx("div", { className: "stwd-destination-list", children: stats.topDestinations.map((dest, i) => (_jsxs("div", { className: "stwd-destination-row", children: [_jsx("code", { className: "stwd-address", children: truncateAddress(dest.address) }), _jsxs("span", { className: "stwd-destination-amount", children: [dest.totalSent, " wei"] }), _jsxs("span", { className: "stwd-badge stwd-badge-muted", children: [dest.txCount, " txs"] })] }, i))) })] }))] }));
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=SpendDashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpendDashboard.js","sourceRoot":"","sources":["../../src/components/SpendDashboard.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAe,MAAM,oBAAoB,CAAC;AAElE;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,GAAG,IAAI,EACZ,eAAe,GAAG,IAAI,EACtB,SAAS,GAAG,IAAI,EAChB,mBAAmB,GAAG,IAAI,EAC1B,SAAS,GACW;IACpB,MAAM,EAAE,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACzC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,IAAI,CAAC,QAAQ,CAAC,kBAAkB;QAAE,OAAO,IAAI,CAAC;IAE9C,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CACL,cAAK,SAAS,EAAE,kCAAkC,SAAS,IAAI,EAAE,EAAE,YACjE,cAAK,SAAS,EAAC,cAAc,sCAA4B,GACrD,CACP,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CACL,cAAK,SAAS,EAAE,kCAAkC,SAAS,IAAI,EAAE,EAAE,YACjE,eAAK,SAAS,EAAC,iBAAiB,4CAA6B,KAAK,CAAC,OAAO,IAAO,GAC7E,CACP,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CACL,cAAK,SAAS,EAAE,kCAAkC,SAAS,IAAI,EAAE,EAAE,YACjE,eAAK,SAAS,EAAC,kBAAkB,aAC/B,cAAK,SAAS,EAAC,iBAAiB,6BAAS,EACzC,cAAK,SAAS,EAAC,iBAAiB,wCAA8B,IAC1D,GACF,CACP,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,CAAS,EAAE,EAAE;QAClC,QAAQ,CAAC,EAAE,CAAC;YACV,KAAK,KAAK,CAAC,CAAC,OAAO,eAAe,CAAC;YACnC,KAAK,IAAI,CAAC,CAAC,OAAO,aAAa,CAAC;YAChC,KAAK,KAAK,CAAC,CAAC,OAAO,cAAc,CAAC;YAClC,KAAK,KAAK,CAAC,CAAC,OAAO,UAAU,CAAC;YAC9B,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE;QAC1C,IAAI,GAAG,IAAI,EAAE;YAAE,OAAO,mBAAmB,CAAC;QAC1C,IAAI,GAAG,IAAI,EAAE;YAAE,OAAO,qBAAqB,CAAC;QAC5C,OAAO,qBAAqB,CAAC;IAC/B,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAE,kCAAkC,SAAS,IAAI,EAAE,EAAE,aACjE,eAAK,SAAS,EAAC,mBAAmB,aAChC,aAAI,SAAS,EAAC,cAAc,gCAAqB,EACjD,eAAM,SAAS,EAAC,6BAA6B,YAAE,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,GAAQ,IAC7E,EAGN,eAAK,SAAS,EAAC,uBAAuB,aACpC,eAAK,SAAS,EAAC,gBAAgB,aAC7B,cAAK,SAAS,EAAC,iBAAiB,4BAAkB,EAClD,eAAK,SAAS,EAAC,iBAAiB,aAAE,KAAK,CAAC,mBAAmB,YAAW,IAClE,EACN,eAAK,SAAS,EAAC,gBAAgB,aAC7B,cAAK,SAAS,EAAC,iBAAiB,6BAAmB,EACnD,cAAK,SAAS,EAAC,iBAAiB,YAAE,KAAK,CAAC,OAAO,GAAO,IAClD,EACN,eAAK,SAAS,EAAC,gBAAgB,aAC7B,cAAK,SAAS,EAAC,iBAAiB,6BAAmB,EACnD,eAAK,SAAS,EAAC,iBAAiB,aAAE,KAAK,CAAC,mBAAmB,YAAW,IAClE,EACL,KAAK,CAAC,SAAS,IAAI,CAClB,eAAK,SAAS,EAAC,gBAAgB,aAC7B,cAAK,SAAS,EAAC,iBAAiB,2BAAiB,EACjD,eAAK,SAAS,EAAC,iBAAiB,aAAE,KAAK,CAAC,SAAS,CAAC,KAAK,YAAW,IAC9D,CACP,IACG,EAGL,eAAe,IAAI,KAAK,CAAC,WAAW,IAAI,CACvC,eAAK,SAAS,EAAC,qBAAqB,aAClC,aAAI,SAAS,EAAC,iBAAiB,6BAAkB,EAEjD,eAAK,SAAS,EAAC,uBAAuB,aACpC,eAAK,SAAS,EAAC,uBAAuB,aACpC,mCAAkB,EAClB,2BAAO,KAAK,CAAC,WAAW,CAAC,YAAY,SAAS,IAC1C,EACN,cAAK,SAAS,EAAC,uBAAuB,YACpC,cACE,SAAS,EAAC,sBAAsB,EAChC,KAAK,EAAE;wCACL,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG;wCAC1D,eAAe,EAAE,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC;qCAC7D,GACD,GACE,EACN,eAAK,SAAS,EAAC,wBAAwB,aACpC,KAAK,CAAC,WAAW,CAAC,SAAS,SAAK,KAAK,CAAC,WAAW,CAAC,UAAU,YACzD,IACF,EAEN,eAAK,SAAS,EAAC,uBAAuB,aACpC,eAAK,SAAS,EAAC,uBAAuB,aACpC,oCAAmB,EACnB,2BAAO,KAAK,CAAC,WAAW,CAAC,aAAa,SAAS,IAC3C,EACN,cAAK,SAAS,EAAC,uBAAuB,YACpC,cACE,SAAS,EAAC,sBAAsB,EAChC,KAAK,EAAE;wCACL,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG;wCAC3D,eAAe,EAAE,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC;qCAC9D,GACD,GACE,EACN,eAAK,SAAS,EAAC,wBAAwB,aACpC,KAAK,CAAC,WAAW,CAAC,UAAU,SAAK,KAAK,CAAC,WAAW,CAAC,WAAW,YAC3D,IACF,IACF,CACP,EAGA,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CACtC,eAAK,SAAS,EAAC,oBAAoB,aACjC,aAAI,SAAS,EAAC,iBAAiB,4BAAiB,EAChD,cAAK,SAAS,EAAC,gBAAgB,YAC5B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;4BACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;4BACxF,MAAM,MAAM,GAAG,QAAQ,GAAG,CAAC;gCACzB,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,QAAQ,CAAC,GAAG,GAAG;gCACnD,CAAC,CAAC,CAAC,CAAC;4BACN,OAAO,CACL,eAAoB,SAAS,EAAC,cAAc,EAAC,KAAK,EAAE,GAAG,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,cAAc,SAAS,GAAG,CAAC,OAAO,OAAO,aAC/G,cAAK,SAAS,EAAC,UAAU,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,GAAI,EAC1E,cAAK,SAAS,EAAC,gBAAgB,YAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAO,KAFlD,GAAG,CAAC,IAAI,CAGZ,CACP,CAAC;wBACJ,CAAC,CAAC,GACE,IACF,CACP,EAGA,mBAAmB,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,CAC1D,eAAK,SAAS,EAAC,2BAA2B,aACxC,aAAI,SAAS,EAAC,iBAAiB,iCAAsB,EACrD,cAAK,SAAS,EAAC,uBAAuB,YACnC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtC,eAAa,SAAS,EAAC,sBAAsB,aAC3C,eAAM,SAAS,EAAC,cAAc,YAAE,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,GAAQ,EACrE,gBAAM,SAAS,EAAC,yBAAyB,aAAE,IAAI,CAAC,SAAS,YAAY,EACrE,gBAAM,SAAS,EAAC,6BAA6B,aAAE,IAAI,CAAC,OAAO,YAAY,KAH/D,CAAC,CAIL,CACP,CAAC,GACE,IACF,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { TransactionHistoryProps } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Paginated transaction list with status badges and explorer links.
|
|
4
|
+
*/
|
|
5
|
+
export declare function TransactionHistory({ pageSize, statusFilter, chainFilter, showPolicyDetails, renderTransaction, onTransactionClick, className, }: TransactionHistoryProps): import("react/jsx-runtime").JSX.Element | null;
|
|
6
|
+
//# sourceMappingURL=TransactionHistory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TransactionHistory.d.ts","sourceRoot":"","sources":["../../src/components/TransactionHistory.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAY3D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,QAAa,EACb,YAAY,EACZ,WAAW,EACX,iBAAyB,EACzB,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,GACV,EAAE,uBAAuB,kDA6IzB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useTransactions } from "../hooks/useTransactions.js";
|
|
3
|
+
import { useStewardContext } from "../provider.js";
|
|
4
|
+
import { truncateAddress, formatWei, formatRelativeTime, getExplorerTxUrl, getStatusColor, copyToClipboard, } from "../utils/format.js";
|
|
5
|
+
/**
|
|
6
|
+
* Paginated transaction list with status badges and explorer links.
|
|
7
|
+
*/
|
|
8
|
+
export function TransactionHistory({ pageSize = 20, statusFilter, chainFilter, showPolicyDetails = false, renderTransaction, onTransactionClick, className, }) {
|
|
9
|
+
const { features } = useStewardContext();
|
|
10
|
+
if (!features.showTransactionHistory)
|
|
11
|
+
return null;
|
|
12
|
+
const { transactions, isLoading, error, page, totalPages, nextPage, prevPage } = useTransactions({
|
|
13
|
+
pageSize,
|
|
14
|
+
status: statusFilter,
|
|
15
|
+
chainId: chainFilter?.[0],
|
|
16
|
+
});
|
|
17
|
+
if (isLoading) {
|
|
18
|
+
return (_jsx("div", { className: `stwd-card stwd-tx-history ${className || ""}`, children: _jsx("div", { className: "stwd-loading", children: "Loading transactions..." }) }));
|
|
19
|
+
}
|
|
20
|
+
if (error) {
|
|
21
|
+
return (_jsx("div", { className: `stwd-card stwd-tx-history ${className || ""}`, children: _jsxs("div", { className: "stwd-error-text", children: ["Failed to load transactions: ", error.message] }) }));
|
|
22
|
+
}
|
|
23
|
+
return (_jsxs("div", { className: `stwd-card stwd-tx-history ${className || ""}`, children: [_jsx("h3", { className: "stwd-heading", children: "Transaction History" }), transactions.length === 0 ? (_jsxs("div", { className: "stwd-empty-state", children: [_jsx("div", { className: "stwd-empty-icon", children: "\uD83D\uDCED" }), _jsx("div", { className: "stwd-empty-text", children: "No transactions yet" })] })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "stwd-tx-list", children: transactions.map((tx) => {
|
|
24
|
+
if (renderTransaction) {
|
|
25
|
+
return _jsx("div", { children: renderTransaction(tx) }, tx.id);
|
|
26
|
+
}
|
|
27
|
+
const chainId = tx.request?.chainId || 8453;
|
|
28
|
+
return (_jsxs("div", { className: `stwd-tx-row ${onTransactionClick ? "stwd-tx-clickable" : ""}`, onClick: () => onTransactionClick?.(tx), children: [_jsxs("div", { className: "stwd-tx-main", children: [_jsx("div", { className: "stwd-tx-to", children: tx.request?.to ? (_jsx("code", { children: truncateAddress(tx.request.to) })) : (_jsx("span", { className: "stwd-muted-text", children: "\u2014" })) }), _jsxs("div", { className: "stwd-tx-value", children: [tx.request?.value ? formatWei(tx.request.value) : "0", " ETH"] })] }), _jsxs("div", { className: "stwd-tx-meta", children: [_jsx("span", { className: `stwd-badge ${getStatusColor(tx.status)}`, children: tx.status }), _jsx("span", { className: "stwd-tx-time", children: formatRelativeTime(tx.createdAt) }), tx.txHash && (_jsx("a", { className: "stwd-link", href: getExplorerTxUrl(tx.txHash, chainId), target: "_blank", rel: "noopener noreferrer", onClick: (e) => e.stopPropagation(), title: "View on explorer", children: "\u2197" })), tx.txHash && (_jsx("button", { className: "stwd-btn stwd-btn-ghost stwd-btn-sm", onClick: (e) => {
|
|
29
|
+
e.stopPropagation();
|
|
30
|
+
copyToClipboard(tx.txHash);
|
|
31
|
+
}, title: "Copy tx hash", children: "\uD83D\uDCCB" }))] }), showPolicyDetails && tx.policyResults.length > 0 && (_jsx("div", { className: "stwd-tx-policies", children: tx.policyResults.map((pr, i) => (_jsxs("span", { className: `stwd-badge ${pr.passed ? "stwd-badge-success" : "stwd-badge-error"}`, children: [pr.type, ": ", pr.passed ? "✓" : "✗", pr.reason && ` (${pr.reason})`] }, i))) }))] }, tx.id));
|
|
32
|
+
}) }), totalPages > 1 && (_jsxs("div", { className: "stwd-pagination", children: [_jsx("button", { className: "stwd-btn stwd-btn-secondary", onClick: prevPage, disabled: page <= 1, children: "\u2190 Prev" }), _jsxs("span", { className: "stwd-page-info", children: ["Page ", page, " of ", totalPages] }), _jsx("button", { className: "stwd-btn stwd-btn-secondary", onClick: nextPage, disabled: page >= totalPages, children: "Next \u2192" })] }))] }))] }));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=TransactionHistory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TransactionHistory.js","sourceRoot":"","sources":["../../src/components/TransactionHistory.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { WalletOverviewProps } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Displays agent wallet address, balances, chain info, and optional funding QR.
|
|
4
|
+
*/
|
|
5
|
+
export declare function WalletOverview({ chains, showQR, showCopy, className, onCopyAddress, }: WalletOverviewProps): import("react/jsx-runtime").JSX.Element | null;
|
|
6
|
+
//# sourceMappingURL=WalletOverview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WalletOverview.d.ts","sourceRoot":"","sources":["../../src/components/WalletOverview.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAKvD;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,MAAM,EACN,QAAe,EACf,SAAS,EACT,aAAa,GACd,EAAE,mBAAmB,kDA2GrB"}
|