From 8aa6fb56c0c7a67da22ccbb8c65f9d90da026d2f Mon Sep 17 00:00:00 2001 From: Uche44 Date: Wed, 27 May 2026 19:00:13 +0100 Subject: [PATCH] contract: Integrate Dispute History Weighting into Cumulative Score --- .github/CODEOWNERS | 2 +- .github/scripts/deploy-contracts.sh | 164 +- .github/workflows/CI.yml | 114 +- .github/workflows/build-contracts.yml | 212 +- .npmrc | 2 +- CONTRIBUTING.md | 80 +- Cargo.lock | 3252 +- Cargo.toml | 76 +- README.md | 326 +- apps/web/.gitignore | 88 +- apps/web/README.md | 80 +- .../monitoring/deposit-indexing/page.tsx | 804 +- apps/web/app/admin/monitoring/page.tsx | 604 +- apps/web/app/admin/page.tsx | 126 +- apps/web/app/api-docs/page.tsx | 182 +- apps/web/app/dashboard-design-system.css | 980 +- apps/web/app/dashboard/freelancer/page.tsx | 524 +- apps/web/app/demo/transaction-modal/page.tsx | 38 +- apps/web/app/disputes/[id]/layout.tsx | 16 +- apps/web/app/disputes/[id]/page.tsx | 448 +- apps/web/app/error.tsx | 76 +- apps/web/app/globals.css | 252 +- apps/web/app/jobs/[id]/dispute/page.tsx | 706 +- apps/web/app/jobs/[id]/fund/page.tsx | 564 +- apps/web/app/jobs/[id]/page.tsx | 808 +- apps/web/app/jobs/layout.tsx | 16 +- apps/web/app/jobs/new/page.tsx | 438 +- apps/web/app/jobs/page.tsx | 862 +- apps/web/app/layout.tsx | 86 +- apps/web/app/milestones/page.tsx | 674 +- apps/web/app/page.tsx | 58 +- apps/web/app/profile/[address]/error.tsx | 80 +- apps/web/app/profile/[address]/layout.tsx | 16 +- apps/web/app/profile/[address]/page.tsx | 1678 +- apps/web/app/transaction-ui.css | 734 +- apps/web/components.json | 42 +- .../__tests__/activity-log.test.tsx | 108 +- .../components/__tests__/bid-card.test.tsx | 92 +- .../__tests__/status-badge.test.tsx | 54 +- apps/web/components/activity-log.tsx | 352 +- apps/web/components/auth/session-switcher.tsx | 134 +- .../web/components/blockchain/admin-vault.tsx | 282 +- .../blockchain/sign-transaction-modal.tsx | 390 +- .../blockchain/transaction-example.tsx | 398 +- .../blockchain/transaction-pipeline.tsx | 1052 +- .../transaction-signing-provider.tsx | 44 +- .../web/components/dashboard/DESIGN_TOKENS.md | 650 +- apps/web/components/dashboard/README.md | 1304 +- .../dashboard/__tests__/status-badge.test.tsx | 320 +- .../components/dashboard/client-dashboard.tsx | 270 +- .../dashboard/copy-address-button.tsx | 144 +- .../dashboard/earnings-overview-card.tsx | 220 +- apps/web/components/dashboard/glass-card.tsx | 98 +- .../web/components/dashboard/progress-bar.tsx | 116 +- .../web/components/dashboard/project-card.tsx | 304 +- .../dashboard/reputation-widget.tsx | 304 +- .../components/dashboard/role-overview.tsx | 290 +- .../dashboard/sidebar-navigation.tsx | 334 +- .../components/dashboard/sparkline-chart.tsx | 176 +- .../web/components/dashboard/status-badge.tsx | 164 +- apps/web/components/docs/ApiEndpoint.tsx | 200 +- apps/web/components/error-boundary.tsx | 98 +- apps/web/components/ipfs/IPFSUpload.jsx | 1640 +- .../jobs/__tests__/bid-list.test.tsx | 192 +- .../jobs/__tests__/job-card.test.tsx | 428 +- .../jobs/__tests__/save-job-button.test.tsx | 236 +- .../jobs/__tests__/share-job-button.test.tsx | 136 +- .../jobs/__tests__/submit-bid-modal.test.tsx | 300 +- apps/web/components/jobs/accept-bid-flow.tsx | 176 +- apps/web/components/jobs/accept-bid-modal.tsx | 222 +- apps/web/components/jobs/bid-card.tsx | 228 +- apps/web/components/jobs/bid-list.tsx | 458 +- .../components/jobs/bid-status-badge.test.tsx | 238 +- apps/web/components/jobs/bid-status-badge.tsx | 286 +- .../jobs/job-card-error-boundary.tsx | 124 +- apps/web/components/jobs/job-card.tsx | 504 +- apps/web/components/jobs/job-filters.tsx | 432 +- .../web/components/jobs/milestone-tracker.tsx | 1014 +- .../post-job/__tests__/post-job-form.test.tsx | 366 +- .../__tests__/step-1-details.test.tsx | 128 +- .../post-job/__tests__/step-2-budget.test.tsx | 172 +- .../post-job/__tests__/step-3-review.test.tsx | 134 +- .../__tests__/step-indicator.test.tsx | 206 +- .../components/jobs/post-job/form-field.tsx | 90 +- .../jobs/post-job/post-job-form.tsx | 646 +- .../jobs/post-job/step-1-details.tsx | 300 +- .../jobs/post-job/step-2-budget.tsx | 400 +- .../jobs/post-job/step-3-review.tsx | 208 +- .../jobs/post-job/step-indicator.tsx | 140 +- apps/web/components/jobs/save-job-button.tsx | 380 +- apps/web/components/jobs/share-job-button.tsx | 190 +- apps/web/components/jobs/status-badge.tsx | 56 +- .../jobs/submit-bid-error-boundary.tsx | 66 +- apps/web/components/jobs/submit-bid-modal.tsx | 488 +- .../components/layout/dashboard-layout.tsx | 90 +- apps/web/components/navigation/sidebar.tsx | 282 +- apps/web/components/navigation/top-nav.tsx | 514 +- .../notifications/notification-center.tsx | 198 +- .../notification-error-boundary.tsx | 58 +- .../profile/profile-error-boundary.tsx | 110 +- apps/web/components/providers.tsx | 58 +- apps/web/components/site-footer.tsx | 296 +- apps/web/components/site-header.tsx | 266 +- apps/web/components/site-shell.tsx | 128 +- apps/web/components/stars.tsx | 60 +- apps/web/components/state/auth-bootstrap.tsx | 40 +- apps/web/components/state/wallet-guard.tsx | 62 +- .../components/theme/theme-toggle.test.tsx | 106 +- apps/web/components/theme/theme-toggle.tsx | 56 +- apps/web/components/transaction-example.tsx | 344 +- .../components/transaction/ARCHITECTURE.md | 896 +- .../transaction/IMPLEMENTATION_SUMMARY.md | 802 +- .../transaction/INTEGRATION_EXAMPLES.md | 1242 +- .../transaction/ProgressTracker.tsx | 410 +- .../web/components/transaction/QUICK_START.md | 314 +- apps/web/components/transaction/README.md | 708 +- .../transaction/TransactionDashboard.tsx | 708 +- .../components/transaction/TxDetailsCard.tsx | 454 +- .../web/components/transaction/USAGE_GUIDE.md | 1206 +- .../insufficient-balance-alert.test.tsx | 238 +- .../transaction-status-modal.test.tsx | 866 +- .../transaction/example-integration.tsx | 880 +- .../insufficient-balance-alert.tsx | 314 +- .../transaction/transaction-status-modal.tsx | 916 +- .../transaction/transaction-tracker.tsx | 704 +- .../ui/__tests__/rich-text-editor.test.tsx | 230 +- apps/web/components/ui/avatar.tsx | 78 +- apps/web/components/ui/badge.tsx | 58 +- .../ui/blockchain-sync-indicator.tsx | 116 +- apps/web/components/ui/button.tsx | 112 +- apps/web/components/ui/card.tsx | 94 +- apps/web/components/ui/date-picker.test.tsx | 46 +- apps/web/components/ui/date-picker.tsx | 106 +- apps/web/components/ui/dialog.tsx | 242 +- apps/web/components/ui/dropdown-menu.tsx | 364 +- apps/web/components/ui/empty-state.test.tsx | 70 +- apps/web/components/ui/empty-state.tsx | 116 +- apps/web/components/ui/error-boundary.tsx | 138 +- apps/web/components/ui/explorer-link.tsx | 76 +- apps/web/components/ui/input.tsx | 42 +- .../components/ui/network-mismatch-banner.tsx | 48 +- apps/web/components/ui/pagination.test.tsx | 276 +- apps/web/components/ui/pagination.tsx | 384 +- apps/web/components/ui/rich-text-editor.tsx | 474 +- apps/web/components/ui/separator.tsx | 50 +- apps/web/components/ui/skeleton.tsx | 184 +- apps/web/components/ui/sonner.tsx | 56 +- apps/web/components/ui/textarea.tsx | 44 +- apps/web/components/ui/toast-provider.tsx | 66 +- apps/web/components/wallet-connect.tsx | 148 +- .../__tests__/wallet-integration.test.tsx | 1344 +- .../wallet/connect-wallet-button.tsx | 326 +- .../components/wallet/copy-address-button.tsx | 94 +- .../transaction-pending-notification.tsx | 224 +- .../wallet/wallet-connect-button.tsx | 186 +- apps/web/components/wallet/wallet-connect.tsx | 320 +- .../wallet/wallet-connection-modal.tsx | 472 +- .../wallet/wallet-error-display.tsx | 408 +- .../wallet/wallet-provider-icon.tsx | 108 +- .../wallet/wallet-selection-modal.tsx | 308 +- apps/web/eslint.config.mjs | 36 +- apps/web/hooks/use-accept-bid.ts | 228 +- apps/web/hooks/use-create-job.ts | 46 +- apps/web/hooks/use-indexer-status.ts | 80 +- apps/web/hooks/use-job-board.test.tsx | 502 +- apps/web/hooks/use-job-board.ts | 536 +- apps/web/hooks/use-live-job-workspace.ts | 304 +- apps/web/hooks/use-post-job.ts | 362 +- apps/web/hooks/use-realtime-notifications.ts | 164 +- apps/web/hooks/use-soroban-transaction.ts | 340 +- apps/web/hooks/use-submit-bid.ts | 246 +- apps/web/hooks/use-transaction-modal.ts | 408 +- apps/web/hooks/use-transaction-toast.ts | 204 +- apps/web/hooks/use-wallet-auth.ts | 118 +- apps/web/hooks/use-wallet-session.ts | 368 +- apps/web/hooks/use-wallet.ts | 252 +- apps/web/hooks/useApiDocs.ts | 62 +- apps/web/hooks/useTransaction.ts | 838 +- apps/web/lib/api.ts | 826 +- apps/web/lib/contracts.ts | 474 +- apps/web/lib/docs-api.ts | 136 +- apps/web/lib/error-mapper.ts | 776 +- apps/web/lib/format.ts | 88 +- apps/web/lib/job-registry.test.ts | 258 +- apps/web/lib/job-registry.ts | 1076 +- apps/web/lib/notifications.test.ts | 144 +- apps/web/lib/notifications.ts | 108 +- apps/web/lib/profile.test.ts | 168 +- apps/web/lib/profile.ts | 260 +- apps/web/lib/query-client.ts | 36 +- apps/web/lib/reputation.ts | 288 +- apps/web/lib/siws.ts | 118 +- apps/web/lib/soroban-events.ts | 930 +- apps/web/lib/soroban-pipeline.ts | 770 +- apps/web/lib/stellar.ts | 1052 +- apps/web/lib/store/transaction-store.ts | 452 +- apps/web/lib/store/use-auth-store.ts | 190 +- apps/web/lib/store/use-tx-status-store.ts | 148 +- apps/web/lib/store/use-wallet-store.ts | 142 +- apps/web/lib/toast.tsx | 362 +- apps/web/lib/transactions/README.md | 796 +- apps/web/lib/transactions/builder.ts | 450 +- apps/web/lib/transactions/fee-estimator.ts | 742 +- apps/web/lib/transactions/horizon-fallback.ts | 238 +- apps/web/lib/transactions/index.ts | 232 +- apps/web/lib/transactions/lifecycle.ts | 736 +- apps/web/lib/transactions/poller.ts | 314 +- apps/web/lib/transactions/simulator.ts | 746 +- apps/web/lib/transactions/submitter.ts | 566 +- apps/web/lib/transactions/xdr-encoder.ts | 984 +- apps/web/lib/utils.ts | 12 +- apps/web/lib/validators/filter.test.ts | 68 +- apps/web/lib/validators/filter.ts | 24 +- apps/web/lib/validators/job.ts | 22 +- apps/web/lib/wallet-errors.ts | 412 +- apps/web/lib/wallets/index.ts | 82 +- apps/web/lib/wallets/provider.ts | 520 +- apps/web/lib/wallets/signer.ts | 828 +- apps/web/lint_output.txt | 138 +- apps/web/next.config.ts | 98 +- apps/web/package.json | 124 +- apps/web/postcss.config.mjs | 14 +- apps/web/styles/transaction.css | 1038 +- apps/web/tsconfig.json | 70 +- apps/web/types/stellar-wallets-kit.d.ts | 326 +- apps/web/vitest.config.ts | 48 +- apps/web/vitest.setup.ts | 92 +- backend/.env.example | 30 +- backend/.gitignore | 10 +- backend/Dockerfile | 38 +- backend/deploy-gcp.sh | 152 +- backend/dist/config/db.js | 44 +- backend/dist/index.js | 88 +- backend/dist/routes/activity.js | 136 +- backend/dist/routes/appeals.js | 196 +- backend/dist/routes/auth.js | 216 +- backend/dist/routes/bids.js | 300 +- backend/dist/routes/deliverables.js | 170 +- backend/dist/routes/disputes.js | 270 +- backend/dist/routes/job-disputes.js | 136 +- backend/dist/routes/jobs.js | 464 +- backend/dist/routes/milestones.js | 202 +- backend/dist/routes/uploads.js | 90 +- backend/dist/routes/users.js | 298 +- backend/migrations/20260316000001_initial.sql | 158 +- backend/migrations/20260326000001_appeals.sql | 54 +- ...260329000001_profiles_and_deliverables.sql | 60 +- .../20260424000000_indexer_state.sql | 40 +- backend/migrations/20260424000001_auth.sql | 28 +- .../20260425000001_activity_log.sql | 28 +- .../migrations/20260425000002_deposits.sql | 30 +- .../migrations/20260425000003_saved_jobs.sql | 22 +- .../20260426000001_bid_status_transitions.sql | 70 +- .../20260426000002_milestone_tracking.sql | 64 +- .../20260426000003_transaction_queue.sql | 64 +- ...60426000004_transaction_metadata_cache.sql | 40 +- .../20260427000001_indexed_disputes.sql | 30 +- ...60428000001_indexed_milestone_releases.sql | 26 +- backend/package-lock.json | 8084 ++--- backend/package.json | 86 +- backend/prisma.config.ts | 28 +- backend/prisma/schema.prisma | 614 +- backend/setup-cloud-db.sh | 152 +- backend/src/config/db.ts | 42 +- backend/src/index.ts | 88 +- backend/src/routes/activity.ts | 144 +- backend/src/routes/appeals.ts | 220 +- backend/src/routes/auth.ts | 268 +- backend/src/routes/bids.ts | 346 +- backend/src/routes/deliverables.ts | 194 +- backend/src/routes/disputes.ts | 312 +- backend/src/routes/job-disputes.ts | 156 +- backend/src/routes/jobs.ts | 522 +- backend/src/routes/milestones.ts | 238 +- backend/src/routes/uploads.ts | 98 +- backend/src/routes/users.ts | 330 +- backend/test-sig-v2.js | 44 +- backend/tsconfig.json | 26 +- build_output.log | 228 +- contracts/escrow/Cargo.toml | 28 +- contracts/escrow/src/lib.rs | 5408 ++-- .../test/test_deposit_event_emitted.1.json | 3544 +-- ...est_deposit_invalid_state_not_setup.1.json | 3870 +-- .../test/test_deposit_negative_panics.1.json | 2744 +- .../test_deposit_no_milestones_panics.1.json | 2392 +- ...posit_success_transitions_to_funded.1.json | 3862 +-- ...est_deposit_with_wrong_total_panics.1.json | 2744 +- .../test/test_deposit_zero_panics.1.json | 2744 +- .../test/test_dispute_50_50_split.1.json | 7304 ++--- .../test/test_dispute_event_emission.1.json | 3894 +-- .../test/test_double_create_job_panics.1.json | 1076 +- .../test/test_double_deposit_panics.1.json | 2694 +- .../test/test_double_init.1.json | 736 +- .../test_exhaustive_release_funds_path.1.json | 7458 ++--- .../test/test_get_job_not_found_panics.1.json | 720 +- .../test/test_happy_path_lifecycle.1.json | 6666 ++-- .../test_open_dispute_by_rando_panics.1.json | 3508 +-- ...st_open_dispute_on_completed_panics.1.json | 4200 +-- ...n_dispute_syncs_job_registry_status.1.json | 6156 ++-- ..._raise_dispute_blocks_release_funds.1.json | 5500 ++-- ...raise_dispute_by_client_locks_funds.1.json | 4702 +-- ...e_dispute_by_freelancer_locks_funds.1.json | 4298 +-- ...raise_dispute_by_third_party_panics.1.json | 3518 +-- ...ise_dispute_on_completed_job_panics.1.json | 4210 +-- .../test_raise_dispute_then_resolve.1.json | 6858 ++-- .../test_snapshots/test/test_refund.1.json | 4706 +-- .../test_refund_by_non_client_panics.1.json | 3508 +-- .../test_release_funds_explicit_index.1.json | 6256 ++-- ..._release_funds_invalid_index_panics.1.json | 3536 +-- .../test_release_funds_twice_panics.1.json | 4162 +-- ...ase_milestone_no_pending_milestones.1.json | 4200 +-- ...t_release_milestone_overflow_panics.1.json | 4200 +-- ...elease_milestone_sequential_success.1.json | 7346 ++--- ...e_milestone_unauthorized_freelancer.1.json | 3508 +-- ...e_dispute_full_payout_to_freelancer.1.json | 4662 +-- ...solve_dispute_full_refund_to_client.1.json | 4622 +-- ...st_resolve_dispute_non_admin_panics.1.json | 2610 +- ...resolve_dispute_not_disputed_panics.1.json | 3572 +-- .../test/test_unauthorized_release.1.json | 3858 +-- ..._release_funds_by_freelancer_panics.1.json | 3536 +-- .../test/test_upgrade_requires_admin.1.json | 676 +- .../test_variable_milestone_amounts.1.json | 6704 ++-- contracts/job_registry/Cargo.toml | 26 +- contracts/job_registry/src/lib.rs | 1200 +- ...st_accept_bid_requires_existing_bid.1.json | 898 +- .../test/test_accept_bid_success.1.json | 1600 +- ..._accept_without_matching_bid_panics.1.json | 1532 +- .../test/test_bid_on_non_open_panics.1.json | 1718 +- ..._bid_same_freelancer_multiple_times.1.json | 1622 +- .../test/test_cannot_accept_bid_twice.1.json | 2100 +- .../test/test_double_initialize_panics.1.json | 836 +- .../test/test_duplicate_bid_panics.1.json | 1910 +- .../test/test_duplicate_job_id.1.json | 950 +- .../test/test_empty_hash_panics.1.json | 892 +- .../test/test_full_lifecycle.1.json | 3130 +- .../test/test_get_bids_job_not_found.1.json | 430 +- ...liverable_without_submission_panics.1.json | 1500 +- .../test/test_get_job_not_found.1.json | 430 +- .../test_initialize_bootstraps_storage.1.json | 778 +- .../test/test_invalid_budget_panics.1.json | 892 +- ...disputed_from_deliverable_submitted.1.json | 2188 +- ...test_mark_disputed_from_in_progress.1.json | 2368 +- .../test_mark_disputed_from_open_fails.1.json | 866 +- ...test_mark_disputed_from_open_panics.1.json | 1500 +- .../test_multiple_bids_on_same_job.1.json | 2888 +- .../test/test_multiple_jobs_and_bids.1.json | 3940 +-- ...t_job_auto_allocates_sequential_ids.1.json | 1898 +- ...t_post_job_before_initialize_panics.1.json | 550 +- ...ith_explicit_id_updates_next_job_id.1.json | 1250 +- ...pgrade_admin_requires_current_admin.1.json | 766 +- ...test_submit_bid_empty_proposal_hash.1.json | 898 +- .../test/test_submit_bid_job_not_found.1.json | 462 +- .../test_submit_bid_on_non_open_job.1.json | 1718 +- .../test/test_submit_bid_success.1.json | 1200 +- .../test_submit_deliverable_empty_hash.1.json | 1718 +- ...est_submit_deliverable_unauthorized.1.json | 1718 +- .../test/test_unauthorized_accept_bid.1.json | 1372 +- ...grade_admin_cannot_initialize_twice.1.json | 746 +- ...t_upgrade_admin_initialize_and_read.1.json | 560 +- contracts/reputation/Cargo.toml | 28 +- contracts/reputation/src/lib.rs | 686 +- contracts/reputation/src/profile.rs | 96 +- contracts/reputation/src/storage.rs | 70 +- ...trary_key_cannot_increment_disputes.1.json | 301 + .../test_arbitrary_key_cannot_slash.1.json | 307 + ...t_arbitrary_key_cannot_update_score.1.json | 307 + ..._arbitrary_key_cannot_upgrade_badge.1.json | 307 + ...zed_contract_can_increment_disputes.1.json | 777 + ...est_badge_level_out_of_range_panics.1.json | 307 + .../test/test_badge_upgrade_each_level.1.json | 1308 + ...ade_reflects_immediately_in_getters.1.json | 938 + ...ispute_decay_does_not_go_below_zero.1.json | 4226 +++ ...spute_decay_reduces_effective_score.1.json | 932 + .../test/test_initial_score.1.json | 376 +- ...ore_does_not_panic_on_empty_account.1.json | 205 + ...on_admin_cannot_grant_authorization.1.json | 293 + .../test/test_profile_metadata.1.json | 32 + ...query_reputation_returns_both_roles.1.json | 134 +- ...ked_authorized_contract_is_rejected.1.json | 431 + .../test_snapshots/test/test_slash.1.json | 94 +- ...updates_client_and_freelancer_paths.1.json | 96 + ...test_two_disputes_apply_decay_twice.1.json | 788 + .../test/test_unified_storage.1.json | 138 +- .../test/test_update_score.1.json | 94 +- docker-compose.yml | 90 +- docs/143-rich-text-editor.md | 58 +- docs/Issue_137_Bid_Status_Implementation.md | 376 +- .../escrow_job_registry_integration.md | 134 +- docs/contracts/escrow_state_transitions.md | 72 +- docs/contracts/job_registry.md | 236 +- docs/contracts/reentrancy_protection.md | 80 +- docs/contracts/reputation_query_function.md | 56 +- .../reputation_score_update_logic.md | 76 +- docs/contracts/storage_fee_handling.md | 144 +- docs/contracts/storage_layout_optimization.md | 110 +- docs/contracts/upgradeability_pattern.md | 132 +- docs/indexer_runbook.md | 376 +- docs/initialize-job-registry-storage.md | 196 +- docs/runbook-indexer.md | 20 +- docs/running-the-stack.md | 258 +- docs/troubleshooting.md | 962 +- docs/user-guide/stellar-wallets.md | 374 +- docs/wallet-integration-summary.md | 516 +- ...baseResourceFee in TransactionDashboard\"" | 324 + ...ceFee in TransactionDashboard\357\200\242" | 648 +- lanceFR.md | 18174 +++++------ monitoring/docker-compose.monitoring.yml | 48 +- .../provisioning/dashboards/dashboards.yml | 16 +- .../provisioning/dashboards/indexer.json | 178 +- .../provisioning/datasources/prometheus.yml | 16 +- monitoring/prometheus/prometheus.yml | 16 +- package-lock.json | 26268 ++++++++-------- package.json | 68 +- playwright-report/index.html | 168 +- .../trace/assets/codeMirrorModule-a5XoALAZ.js | 64 +- .../assets/defaultSettingsView-CJSZINFr.js | 532 +- .../trace/codeMirrorModule.DYBRYzYX.css | 2 +- .../trace/defaultSettingsView.7ch9cixO.css | 2 +- playwright-report/trace/index.BDwrLSGN.js | 4 +- playwright-report/trace/index.BVu7tZDe.css | 2 +- playwright-report/trace/index.html | 86 +- playwright-report/trace/manifest.webmanifest | 32 +- playwright-report/trace/playwright-logo.svg | 18 +- playwright-report/trace/snapshot.html | 42 +- playwright-report/trace/sw.bundle.js | 10 +- playwright-report/trace/uiMode.Btcz36p_.css | 2 +- playwright-report/trace/uiMode.CQJ9SCIQ.js | 10 +- playwright-report/trace/uiMode.html | 34 +- .../trace/xtermModule.DYP7pi_n.css | 64 +- playwright.config.ts | 94 +- rust-toolchain.toml | 8 +- test-results/.last-run.json | 16 +- tests/e2e/client-dashboard.spec.ts | 126 +- tests/e2e/gig-lifecycle.spec.ts | 380 +- tests/e2e/mock-backend.mjs | 306 +- tests/e2e/platform.spec.ts | 38 +- tsconfig.json | 24 +- 437 files changed, 197679 insertions(+), 185038 deletions(-) create mode 100644 contracts/reputation/test_snapshots/test/test_arbitrary_key_cannot_increment_disputes.1.json create mode 100644 contracts/reputation/test_snapshots/test/test_arbitrary_key_cannot_slash.1.json create mode 100644 contracts/reputation/test_snapshots/test/test_arbitrary_key_cannot_update_score.1.json create mode 100644 contracts/reputation/test_snapshots/test/test_arbitrary_key_cannot_upgrade_badge.1.json create mode 100644 contracts/reputation/test_snapshots/test/test_authorized_contract_can_increment_disputes.1.json create mode 100644 contracts/reputation/test_snapshots/test/test_badge_level_out_of_range_panics.1.json create mode 100644 contracts/reputation/test_snapshots/test/test_badge_upgrade_each_level.1.json create mode 100644 contracts/reputation/test_snapshots/test/test_badge_upgrade_reflects_immediately_in_getters.1.json create mode 100644 contracts/reputation/test_snapshots/test/test_dispute_decay_does_not_go_below_zero.1.json create mode 100644 contracts/reputation/test_snapshots/test/test_dispute_decay_reduces_effective_score.1.json create mode 100644 contracts/reputation/test_snapshots/test/test_initial_score_does_not_panic_on_empty_account.1.json create mode 100644 contracts/reputation/test_snapshots/test/test_non_admin_cannot_grant_authorization.1.json create mode 100644 contracts/reputation/test_snapshots/test/test_revoked_authorized_contract_is_rejected.1.json create mode 100644 contracts/reputation/test_snapshots/test/test_two_disputes_apply_decay_twice.1.json create mode 100644 "eFee to baseResourceFee in TransactionDashboard\"" diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 98435c8a..2cfdffce 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @soomtochukwu +* @soomtochukwu diff --git a/.github/scripts/deploy-contracts.sh b/.github/scripts/deploy-contracts.sh index 5b65404f..fd139c97 100755 --- a/.github/scripts/deploy-contracts.sh +++ b/.github/scripts/deploy-contracts.sh @@ -1,82 +1,82 @@ -#!/bin/bash -set -e - -# ./.github/scripts/deploy-contracts.sh -# Meticulously build and deploy Soroban contracts to Stellar Testnet. - -NETWORK="testnet" -RPC_URL="https://soroban-testnet.stellar.org" -FRIENDLY_NAME="deployer" - -# Automatically set testnet passphrase if not provided -if [ -z "$STELLAR_NETWORK_PASSPHRASE" ]; then - export STELLAR_NETWORK_PASSPHRASE="Test SDF Network ; September 2015" -fi - - -echo "🛠️ Building optimized WASM binaries using Stellar CLI..." -stellar contract build - -# Create scripts directory if not exists (redundant for CI but good for local) -mkdir -p ./.github/scripts - -# Function to deploy a contract and capture its address -deploy_contract() { - local contract_name=$1 - local wasm_path="./target/wasm32v1-none/release/${contract_name}.wasm" - - - echo "🚀 Deploying ${contract_name} to ${NETWORK}..." >&2 - - - # In a real CI, STELLAR_ACCOUNT_SECRET would be provided - # stellar contract deploy \ - # --wasm "$wasm_path" \ - # --source "$FRIENDLY_NAME" \ - # --network "$NETWORK" - - # For now, we simulation the output or use the CLI if available - # Assuming the CLI is available in the CI environment - ID=$(stellar contract deploy \ - --wasm "$wasm_path" \ - --source-account "$STELLAR_ACCOUNT_SECRET" \ - --network "$NETWORK" \ - --rpc-url "$RPC_URL") - - echo "$ID" -} - -# Ensure .env.local exists or create it -ENV_FILE=".env.local" -touch $ENV_FILE - -echo "📦 Capturing Contract IDs..." - -ESCROW_ID=$(deploy_contract "escrow") -REPUTATION_ID=$(deploy_contract "reputation") -JOB_REGISTRY_ID=$(deploy_contract "job_registry") - -# Update .env.local with new IDs -sed -i "/NEXT_PUBLIC_ESCROW_CONTRACT_ID=/d" $ENV_FILE -echo "NEXT_PUBLIC_ESCROW_CONTRACT_ID=$ESCROW_ID" >> $ENV_FILE - -sed -i "/NEXT_PUBLIC_REPUTATION_CONTRACT_ID=/d" $ENV_FILE -echo "NEXT_PUBLIC_REPUTATION_CONTRACT_ID=$REPUTATION_ID" >> $ENV_FILE - -sed -i "/NEXT_PUBLIC_JOB_REGISTRY_CONTRACT_ID=/d" $ENV_FILE -echo "NEXT_PUBLIC_JOB_REGISTRY_CONTRACT_ID=$JOB_REGISTRY_ID" >> $ENV_FILE - -echo "✅ Deployment complete! IDs saved to $ENV_FILE" -echo "Escrow: $ESCROW_ID" -echo "Reputation: $REPUTATION_ID" -echo "Job Registry: $JOB_REGISTRY_ID" - -# Optional: Notify via GitHub Step Summary or similar -if [ -n "$GITHUB_STEP_SUMMARY" ]; then - echo "### 🚀 Deployment Successful" >> $GITHUB_STEP_SUMMARY - echo "| Contract | ID |" >> $GITHUB_STEP_SUMMARY - echo "| --- | --- |" >> $GITHUB_STEP_SUMMARY - echo "| Escrow | \`$ESCROW_ID\` |" >> $GITHUB_STEP_SUMMARY - echo "| Reputation | \`$REPUTATION_ID\` |" >> $GITHUB_STEP_SUMMARY - echo "| Job Registry | \`$JOB_REGISTRY_ID\` |" >> $GITHUB_STEP_SUMMARY -fi +#!/bin/bash +set -e + +# ./.github/scripts/deploy-contracts.sh +# Meticulously build and deploy Soroban contracts to Stellar Testnet. + +NETWORK="testnet" +RPC_URL="https://soroban-testnet.stellar.org" +FRIENDLY_NAME="deployer" + +# Automatically set testnet passphrase if not provided +if [ -z "$STELLAR_NETWORK_PASSPHRASE" ]; then + export STELLAR_NETWORK_PASSPHRASE="Test SDF Network ; September 2015" +fi + + +echo "🛠️ Building optimized WASM binaries using Stellar CLI..." +stellar contract build + +# Create scripts directory if not exists (redundant for CI but good for local) +mkdir -p ./.github/scripts + +# Function to deploy a contract and capture its address +deploy_contract() { + local contract_name=$1 + local wasm_path="./target/wasm32v1-none/release/${contract_name}.wasm" + + + echo "🚀 Deploying ${contract_name} to ${NETWORK}..." >&2 + + + # In a real CI, STELLAR_ACCOUNT_SECRET would be provided + # stellar contract deploy \ + # --wasm "$wasm_path" \ + # --source "$FRIENDLY_NAME" \ + # --network "$NETWORK" + + # For now, we simulation the output or use the CLI if available + # Assuming the CLI is available in the CI environment + ID=$(stellar contract deploy \ + --wasm "$wasm_path" \ + --source-account "$STELLAR_ACCOUNT_SECRET" \ + --network "$NETWORK" \ + --rpc-url "$RPC_URL") + + echo "$ID" +} + +# Ensure .env.local exists or create it +ENV_FILE=".env.local" +touch $ENV_FILE + +echo "📦 Capturing Contract IDs..." + +ESCROW_ID=$(deploy_contract "escrow") +REPUTATION_ID=$(deploy_contract "reputation") +JOB_REGISTRY_ID=$(deploy_contract "job_registry") + +# Update .env.local with new IDs +sed -i "/NEXT_PUBLIC_ESCROW_CONTRACT_ID=/d" $ENV_FILE +echo "NEXT_PUBLIC_ESCROW_CONTRACT_ID=$ESCROW_ID" >> $ENV_FILE + +sed -i "/NEXT_PUBLIC_REPUTATION_CONTRACT_ID=/d" $ENV_FILE +echo "NEXT_PUBLIC_REPUTATION_CONTRACT_ID=$REPUTATION_ID" >> $ENV_FILE + +sed -i "/NEXT_PUBLIC_JOB_REGISTRY_CONTRACT_ID=/d" $ENV_FILE +echo "NEXT_PUBLIC_JOB_REGISTRY_CONTRACT_ID=$JOB_REGISTRY_ID" >> $ENV_FILE + +echo "✅ Deployment complete! IDs saved to $ENV_FILE" +echo "Escrow: $ESCROW_ID" +echo "Reputation: $REPUTATION_ID" +echo "Job Registry: $JOB_REGISTRY_ID" + +# Optional: Notify via GitHub Step Summary or similar +if [ -n "$GITHUB_STEP_SUMMARY" ]; then + echo "### 🚀 Deployment Successful" >> $GITHUB_STEP_SUMMARY + echo "| Contract | ID |" >> $GITHUB_STEP_SUMMARY + echo "| --- | --- |" >> $GITHUB_STEP_SUMMARY + echo "| Escrow | \`$ESCROW_ID\` |" >> $GITHUB_STEP_SUMMARY + echo "| Reputation | \`$REPUTATION_ID\` |" >> $GITHUB_STEP_SUMMARY + echo "| Job Registry | \`$JOB_REGISTRY_ID\` |" >> $GITHUB_STEP_SUMMARY +fi diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 182d0d90..396f8a87 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -1,57 +1,57 @@ -name: CI - -on: - push: - branches: [main, master] - pull_request: - branches: [main, master] - -env: - # Real Cloud Run Backend URL for the Frontend - NEXT_PUBLIC_API_URL: https://lance-api-641037923100.us-central1.run.app - - # Securely injected via GitHub Actions Secrets - DATABASE_URL: ${{ secrets.DATABASE_URL }} - JUDGE_AUTHORITY_SECRET: ${{ secrets.JUDGE_AUTHORITY_SECRET }} - OPENCLAW_API_KEY: ${{ secrets.OPENCLAW_API_KEY }} - - # Contract IDs (Public information, safe to commit) - ESCROW_CONTRACT_ID: CD5E6AXK2J5C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6 - REPUTATION_CONTRACT_ID: CD5E6AXK2J5C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6 - JOB_REGISTRY_CONTRACT_ID: CD5E6AXK2J5C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6 - OPENCLAW_BASE_URL: http://localhost:8080 - -jobs: - backend: - name: Node.js Backend - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: "npm" - cache-dependency-path: package-lock.json - - name: Install dependencies - run: npm install --prefix backend - - name: Generate Prisma Client - run: npx prisma generate --schema=backend/prisma/schema.prisma - - name: Build - run: npm run build --prefix backend - - web-build: - name: Web Frontend - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: "npm" - cache-dependency-path: package-lock.json - - name: Install dependencies - run: npm install --prefix apps/web - - name: Build - run: npm run build --prefix apps/web +name: CI + +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + +env: + # Real Cloud Run Backend URL for the Frontend + NEXT_PUBLIC_API_URL: https://lance-api-641037923100.us-central1.run.app + + # Securely injected via GitHub Actions Secrets + DATABASE_URL: ${{ secrets.DATABASE_URL }} + JUDGE_AUTHORITY_SECRET: ${{ secrets.JUDGE_AUTHORITY_SECRET }} + OPENCLAW_API_KEY: ${{ secrets.OPENCLAW_API_KEY }} + + # Contract IDs (Public information, safe to commit) + ESCROW_CONTRACT_ID: CD5E6AXK2J5C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6 + REPUTATION_CONTRACT_ID: CD5E6AXK2J5C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6 + JOB_REGISTRY_CONTRACT_ID: CD5E6AXK2J5C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6 + OPENCLAW_BASE_URL: http://localhost:8080 + +jobs: + backend: + name: Node.js Backend + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "npm" + cache-dependency-path: package-lock.json + - name: Install dependencies + run: npm install --prefix backend + - name: Generate Prisma Client + run: npx prisma generate --schema=backend/prisma/schema.prisma + - name: Build + run: npm run build --prefix backend + + web-build: + name: Web Frontend + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "npm" + cache-dependency-path: package-lock.json + - name: Install dependencies + run: npm install --prefix apps/web + - name: Build + run: npm run build --prefix apps/web diff --git a/.github/workflows/build-contracts.yml b/.github/workflows/build-contracts.yml index 9c585b8d..72c4dacd 100644 --- a/.github/workflows/build-contracts.yml +++ b/.github/workflows/build-contracts.yml @@ -1,106 +1,106 @@ -name: Build Soroban Contracts - -on: - push: - paths: - - 'contracts/**' - - '.github/workflows/build-contracts.yml' - pull_request: - paths: - - 'contracts/**' - - '.github/workflows/build-contracts.yml' - -env: - CARGO_TERM_COLOR: always - -jobs: - build-wasm: - name: Build Contract WASM - runs-on: ubuntu-latest - - strategy: - matrix: - contract: [escrow, job_registry, reputation] - - steps: - - uses: actions/checkout@v4 - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable - with: - targets: wasm32-unknown-unknown - toolchain: stable - - - name: Install Soroban CLI - run: | - cargo install --locked --version 22.0.0 soroban-cli - soroban --version - - - name: Install binaryen (wasm-opt) - run: sudo apt-get update && sudo apt-get install -y binaryen - - - name: Cache cargo registry - uses: actions/cache@v3 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - restore-keys: | - ${{ runner.os }}-cargo- - - - name: Build ${{ matrix.contract }} contract - run: | - cargo build --target wasm32-unknown-unknown --release -p ${{ matrix.contract }} - - - name: Optimize WASM - run: | - wasm-opt target/wasm32-unknown-unknown/release/${{ matrix.contract }}.wasm \ - -o target/wasm32-unknown-unknown/release/${{ matrix.contract }}.optimized.wasm \ - -Oz --enable-bulk-memory - - - name: Upload WASM artifact - uses: actions/upload-artifact@v4 - with: - name: ${{ matrix.contract }}-wasm - path: target/wasm32-unknown-unknown/release/${{ matrix.contract }}.optimized.wasm - retention-days: 30 - - - name: Generate WASM hash - run: | - wasm_file="target/wasm32-unknown-unknown/release/${{ matrix.contract }}.optimized.wasm" - if [ -f "$wasm_file" ]; then - sha256sum "$wasm_file" > "${{ matrix.contract }}.sha256" - echo "WASM hash: $(cat ${{ matrix.contract }}.sha256)" - fi - - - name: Upload hash artifact - uses: actions/upload-artifact@v4 - with: - name: ${{ matrix.contract }}-hash - path: ${{ matrix.contract }}.sha256 - retention-days: 30 - - test-contracts: - name: Test Contracts - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable - with: - targets: wasm32-unknown-unknown - toolchain: stable - - - name: Install Soroban CLI - run: | - cargo install --locked --version 22.0.0 soroban-cli - soroban --version - - - name: Run contract tests - run: | - cargo test -p escrow -p reputation -p job_registry - env: - RUST_BACKTRACE: 1 +name: Build Soroban Contracts + +on: + push: + paths: + - 'contracts/**' + - '.github/workflows/build-contracts.yml' + pull_request: + paths: + - 'contracts/**' + - '.github/workflows/build-contracts.yml' + +env: + CARGO_TERM_COLOR: always + +jobs: + build-wasm: + name: Build Contract WASM + runs-on: ubuntu-latest + + strategy: + matrix: + contract: [escrow, job_registry, reputation] + + steps: + - uses: actions/checkout@v4 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + targets: wasm32-unknown-unknown + toolchain: stable + + - name: Install Soroban CLI + run: | + cargo install --locked --version 22.0.0 soroban-cli + soroban --version + + - name: Install binaryen (wasm-opt) + run: sudo apt-get update && sudo apt-get install -y binaryen + + - name: Cache cargo registry + uses: actions/cache@v3 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Build ${{ matrix.contract }} contract + run: | + cargo build --target wasm32-unknown-unknown --release -p ${{ matrix.contract }} + + - name: Optimize WASM + run: | + wasm-opt target/wasm32-unknown-unknown/release/${{ matrix.contract }}.wasm \ + -o target/wasm32-unknown-unknown/release/${{ matrix.contract }}.optimized.wasm \ + -Oz --enable-bulk-memory + + - name: Upload WASM artifact + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.contract }}-wasm + path: target/wasm32-unknown-unknown/release/${{ matrix.contract }}.optimized.wasm + retention-days: 30 + + - name: Generate WASM hash + run: | + wasm_file="target/wasm32-unknown-unknown/release/${{ matrix.contract }}.optimized.wasm" + if [ -f "$wasm_file" ]; then + sha256sum "$wasm_file" > "${{ matrix.contract }}.sha256" + echo "WASM hash: $(cat ${{ matrix.contract }}.sha256)" + fi + + - name: Upload hash artifact + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.contract }}-hash + path: ${{ matrix.contract }}.sha256 + retention-days: 30 + + test-contracts: + name: Test Contracts + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + targets: wasm32-unknown-unknown + toolchain: stable + + - name: Install Soroban CLI + run: | + cargo install --locked --version 22.0.0 soroban-cli + soroban --version + + - name: Run contract tests + run: | + cargo test -p escrow -p reputation -p job_registry + env: + RUST_BACKTRACE: 1 diff --git a/.npmrc b/.npmrc index 521a9f7c..0e5e9ca8 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1 @@ -legacy-peer-deps=true +legacy-peer-deps=true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 229ad9c1..a506e242 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,40 +1,40 @@ -# Contributing to Lance - -Thank you for your interest in contributing! This is an open-source project and we welcome PRs. - -## Development Workflow - -1. Fork the repository and create a feature branch from `main`. -2. Make your changes with appropriate tests. -3. Run the full test suite locally (see README). -4. Submit a PR — CI must pass before merge. - -## Branch Naming - -| Type | Pattern | -| -------- | ------------------------------ | -| Feature | `feat/short-description` | -| Bug fix | `fix/short-description` | -| Contract | `contract/escrow-improvements` | -| Docs | `docs/update-readme` | - -## Commit Convention - -We follow [Conventional Commits](https://www.conventionalcommits.org/): - -``` -feat(escrow): add milestone partial release -fix(backend): handle missing job gracefully -docs(readme): update testnet deploy steps -``` - -## Code Style - -- **Rust**: `cargo fmt` + `cargo clippy --deny warnings` -- **TypeScript**: `eslint` + `prettier` - -CI enforces both. - -## Opening Issues - -Please use the GitHub issue templates for bug reports and feature requests. +# Contributing to Lance + +Thank you for your interest in contributing! This is an open-source project and we welcome PRs. + +## Development Workflow + +1. Fork the repository and create a feature branch from `main`. +2. Make your changes with appropriate tests. +3. Run the full test suite locally (see README). +4. Submit a PR — CI must pass before merge. + +## Branch Naming + +| Type | Pattern | +| -------- | ------------------------------ | +| Feature | `feat/short-description` | +| Bug fix | `fix/short-description` | +| Contract | `contract/escrow-improvements` | +| Docs | `docs/update-readme` | + +## Commit Convention + +We follow [Conventional Commits](https://www.conventionalcommits.org/): + +``` +feat(escrow): add milestone partial release +fix(backend): handle missing job gracefully +docs(readme): update testnet deploy steps +``` + +## Code Style + +- **Rust**: `cargo fmt` + `cargo clippy --deny warnings` +- **TypeScript**: `eslint` + `prettier` + +CI enforces both. + +## Opening Issues + +Please use the GitHub issue templates for bug reports and feature requests. diff --git a/Cargo.lock b/Cargo.lock index bcd11f8c..10f8d0ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,1626 +1,1626 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "addr2line" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "arbitrary" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" -dependencies = [ - "derive_arbitrary", -] - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "backtrace" -version = "0.3.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-link", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base32" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bumpalo" -version = "3.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" - -[[package]] -name = "bytes-lit" -version = "0.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0adabf37211a5276e46335feabcbb1530c95eb3fdf85f324c7db942770aa025d" -dependencies = [ - "num-bigint", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "cc" -version = "1.2.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" -dependencies = [ - "find-msvc-tools", - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "chrono" -version = "0.4.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" -dependencies = [ - "iana-time-zone", - "num-traits", - "serde", - "windows-link", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crate-git-revision" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c521bf1f43d31ed2f73441775ed31935d77901cb3451e44b38a1c1612fcbaf98" -dependencies = [ - "serde", - "serde_derive", - "serde_json", -] - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "ctor" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" -dependencies = [ - "quote", - "syn", -] - -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest", - "fiat-crypto", - "rustc_version", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core 0.20.11", - "darling_macro 0.20.11", -] - -[[package]] -name = "darling" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" -dependencies = [ - "darling_core 0.23.0", - "darling_macro 0.23.0", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn", -] - -[[package]] -name = "darling_core" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" -dependencies = [ - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core 0.20.11", - "quote", - "syn", -] - -[[package]] -name = "darling_macro" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" -dependencies = [ - "darling_core 0.23.0", - "quote", - "syn", -] - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" -dependencies = [ - "powerfmt", - "serde_core", -] - -[[package]] -name = "derive_arbitrary" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest", - "elliptic-curve", - "rfc6979", - "signature", -] - -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" -dependencies = [ - "curve25519-dalek", - "ed25519", - "rand_core", - "serde", - "sha2", - "subtle", - "zeroize", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest", - "ff", - "generic-array", - "group", - "rand_core", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "escape-bytes" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bfcf67fea2815c2fc3b90873fae90957be12ff417335dfadc7f52927feb03b2" - -[[package]] -name = "escrow" -version = "0.1.0" -dependencies = [ - "job_registry", - "soroban-sdk", -] - -[[package]] -name = "ethnum" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40404c3f5f511ec4da6fe866ddf6a717c309fdbb69fbbad7b0f3edab8f2e835f" - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core", - "subtle", -] - -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "find-msvc-tools" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "futures-core" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" - -[[package]] -name = "futures-task" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" - -[[package]] -name = "futures-util" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" -dependencies = [ - "futures-core", - "futures-task", - "pin-project-lite", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "gimli" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core", - "subtle", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" -dependencies = [ - "equivalent", - "hashbrown 0.15.5", - "serde", -] - -[[package]] -name = "indexmap-nostd" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" - -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" - -[[package]] -name = "job_registry" -version = "0.1.0" -dependencies = [ - "soroban-sdk", -] - -[[package]] -name = "js-sys" -version = "0.3.97" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf" -dependencies = [ - "cfg-if", - "futures-util", - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "k256" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "sha2", -] - -[[package]] -name = "keccak" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "libc" -version = "0.2.186" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" - -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "log" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" - -[[package]] -name = "memchr" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" - -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "object" -version = "0.37.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" - -[[package]] -name = "p256" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" -dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pin-project-lite" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn", -] - -[[package]] -name = "primeorder" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" -dependencies = [ - "elliptic-curve", -] - -[[package]] -name = "proc-macro2" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "ref-cast" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "reputation" -version = "0.1.0" -dependencies = [ - "soroban-sdk", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "schemars" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "subtle", - "zeroize", -] - -[[package]] -name = "semver" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.149" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_with" -version = "3.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05839ce67618e14a09b286535c0d9c94e85ef25469b0e13cb4f844e5593eb19" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.7.0", - "schemars 0.9.0", - "schemars 1.2.1", - "serde_core", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2ebbe86054f9b45bc3881e865683ccfaccce97b9b4cb53f3039d67f355a334" -dependencies = [ - "darling 0.23.0", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha3" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" -dependencies = [ - "digest", - "keccak", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest", - "rand_core", -] - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "soroban-builtin-sdk-macros" -version = "21.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f57a68ef8777e28e274de0f3a88ad9a5a41d9a2eb461b4dd800b086f0e83b80" -dependencies = [ - "itertools", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "soroban-env-common" -version = "21.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1c89463835fe6da996318156d39f424b4f167c725ec692e5a7a2d4e694b3d" -dependencies = [ - "arbitrary", - "crate-git-revision", - "ethnum", - "num-derive", - "num-traits", - "serde", - "soroban-env-macros", - "soroban-wasmi", - "static_assertions", - "stellar-xdr", - "wasmparser", -] - -[[package]] -name = "soroban-env-guest" -version = "21.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bfb2536811045d5cd0c656a324cbe9ce4467eb734c7946b74410d90dea5d0ce" -dependencies = [ - "soroban-env-common", - "static_assertions", -] - -[[package]] -name = "soroban-env-host" -version = "21.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b7a32c28f281c423189f1298960194f0e0fc4eeb72378028171e556d8cd6160" -dependencies = [ - "backtrace", - "curve25519-dalek", - "ecdsa", - "ed25519-dalek", - "elliptic-curve", - "generic-array", - "getrandom", - "hex-literal", - "hmac", - "k256", - "num-derive", - "num-integer", - "num-traits", - "p256", - "rand", - "rand_chacha", - "sec1", - "sha2", - "sha3", - "soroban-builtin-sdk-macros", - "soroban-env-common", - "soroban-wasmi", - "static_assertions", - "stellar-strkey", - "wasmparser", -] - -[[package]] -name = "soroban-env-macros" -version = "21.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "242926fe5e0d922f12d3796cd7cd02dd824e5ef1caa088f45fce20b618309f64" -dependencies = [ - "itertools", - "proc-macro2", - "quote", - "serde", - "serde_json", - "stellar-xdr", - "syn", -] - -[[package]] -name = "soroban-ledger-snapshot" -version = "21.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6edf92749fd8399b417192d301c11f710b9cdce15789a3d157785ea971576fa" -dependencies = [ - "serde", - "serde_json", - "serde_with", - "soroban-env-common", - "soroban-env-host", - "thiserror", -] - -[[package]] -name = "soroban-sdk" -version = "21.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcdf04484af7cc731a7a48ad1d9f5f940370edeea84734434ceaf398a6b862e" -dependencies = [ - "arbitrary", - "bytes-lit", - "ctor", - "derive_arbitrary", - "ed25519-dalek", - "rand", - "rustc_version", - "serde", - "serde_json", - "soroban-env-guest", - "soroban-env-host", - "soroban-ledger-snapshot", - "soroban-sdk-macros", - "stellar-strkey", -] - -[[package]] -name = "soroban-sdk-macros" -version = "21.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0974e413731aeff2443f2305b344578b3f1ffd18335a7ba0f0b5d2eb4e94c9ce" -dependencies = [ - "crate-git-revision", - "darling 0.20.11", - "itertools", - "proc-macro2", - "quote", - "rustc_version", - "sha2", - "soroban-env-common", - "soroban-spec", - "soroban-spec-rust", - "stellar-xdr", - "syn", -] - -[[package]] -name = "soroban-spec" -version = "21.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2c70b20e68cae3ef700b8fa3ae29db1c6a294b311fba66918f90cb8f9fd0a1a" -dependencies = [ - "base64 0.13.1", - "stellar-xdr", - "thiserror", - "wasmparser", -] - -[[package]] -name = "soroban-spec-rust" -version = "21.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2dafbde981b141b191c6c036abc86097070ddd6eaaa33b273701449501e43d3" -dependencies = [ - "prettyplease", - "proc-macro2", - "quote", - "sha2", - "soroban-spec", - "stellar-xdr", - "syn", - "thiserror", -] - -[[package]] -name = "soroban-wasmi" -version = "0.31.1-soroban.20.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "710403de32d0e0c35375518cb995d4fc056d0d48966f2e56ea471b8cb8fc9719" -dependencies = [ - "smallvec", - "spin", - "wasmi_arena", - "wasmi_core", - "wasmparser-nostd", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "stellar-strkey" -version = "0.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12d2bf45e114117ea91d820a846fd1afbe3ba7d717988fee094ce8227a3bf8bd" -dependencies = [ - "base32", - "crate-git-revision", - "thiserror", -] - -[[package]] -name = "stellar-xdr" -version = "21.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2675a71212ed39a806e415b0dbf4702879ff288ec7f5ee996dda42a135512b50" -dependencies = [ - "arbitrary", - "base64 0.13.1", - "crate-git-revision", - "escape-bytes", - "hex", - "serde", - "serde_with", - "stellar-strkey", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "2.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "time" -version = "0.3.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" - -[[package]] -name = "time-macros" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "typenum" -version = "1.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" - -[[package]] -name = "unicode-ident" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasm-bindgen" -version = "0.2.120" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df52b6d9b87e0c74c9edfa1eb2d9bf85e5d63515474513aa50fa181b3c4f5db1" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.120" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b1041f495fb322e64aca85f5756b2172e35cd459376e67f2a6c9dffcedb103" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.120" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dcd0ff20416988a18ac686d4d4d0f6aae9ebf08a389ff5d29012b05af2a1b41" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.120" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49757b3c82ebf16c57d69365a142940b384176c24df52a087fb748e2085359ea" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasmi_arena" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "104a7f73be44570cac297b3035d76b169d6599637631cf37a1703326a0727073" - -[[package]] -name = "wasmi_core" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf1a7db34bff95b85c261002720c00c3a6168256dcb93041d3fa2054d19856a" -dependencies = [ - "downcast-rs", - "libm", - "num-traits", - "paste", -] - -[[package]] -name = "wasmparser" -version = "0.116.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a58e28b80dd8340cb07b8242ae654756161f6fc8d0038123d679b7b99964fa50" -dependencies = [ - "indexmap 2.7.0", - "semver", -] - -[[package]] -name = "wasmparser-nostd" -version = "0.100.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5a015fe95f3504a94bb1462c717aae75253e39b9dd6c3fb1062c934535c64aa" -dependencies = [ - "indexmap-nostd", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - -[[package]] -name = "zerocopy" -version = "0.8.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zeroize" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" - -[[package]] -name = "zmij" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base32" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytes-lit" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0adabf37211a5276e46335feabcbb1530c95eb3fdf85f324c7db942770aa025d" +dependencies = [ + "num-bigint", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "cc" +version = "1.2.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crate-git-revision" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c521bf1f43d31ed2f73441775ed31935d77901cb3451e44b38a1c1612fcbaf98" +dependencies = [ + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctor" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core 0.20.11", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", + "quote", + "syn", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive_arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core", + "serde", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "escape-bytes" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bfcf67fea2815c2fc3b90873fae90957be12ff417335dfadc7f52927feb03b2" + +[[package]] +name = "escrow" +version = "0.1.0" +dependencies = [ + "job_registry", + "soroban-sdk", +] + +[[package]] +name = "ethnum" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40404c3f5f511ec4da6fe866ddf6a717c309fdbb69fbbad7b0f3edab8f2e835f" + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +dependencies = [ + "equivalent", + "hashbrown 0.15.5", + "serde", +] + +[[package]] +name = "indexmap-nostd" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "job_registry" +version = "0.1.0" +dependencies = [ + "soroban-sdk", +] + +[[package]] +name = "js-sys" +version = "0.3.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "sha2", +] + +[[package]] +name = "keccak" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "reputation" +version = "0.1.0" +dependencies = [ + "soroban-sdk", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_with" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05839ce67618e14a09b286535c0d9c94e85ef25469b0e13cb4f844e5593eb19" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.7.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf2ebbe86054f9b45bc3881e865683ccfaccce97b9b4cb53f3039d67f355a334" +dependencies = [ + "darling 0.23.0", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "soroban-builtin-sdk-macros" +version = "21.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f57a68ef8777e28e274de0f3a88ad9a5a41d9a2eb461b4dd800b086f0e83b80" +dependencies = [ + "itertools", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "soroban-env-common" +version = "21.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1c89463835fe6da996318156d39f424b4f167c725ec692e5a7a2d4e694b3d" +dependencies = [ + "arbitrary", + "crate-git-revision", + "ethnum", + "num-derive", + "num-traits", + "serde", + "soroban-env-macros", + "soroban-wasmi", + "static_assertions", + "stellar-xdr", + "wasmparser", +] + +[[package]] +name = "soroban-env-guest" +version = "21.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bfb2536811045d5cd0c656a324cbe9ce4467eb734c7946b74410d90dea5d0ce" +dependencies = [ + "soroban-env-common", + "static_assertions", +] + +[[package]] +name = "soroban-env-host" +version = "21.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b7a32c28f281c423189f1298960194f0e0fc4eeb72378028171e556d8cd6160" +dependencies = [ + "backtrace", + "curve25519-dalek", + "ecdsa", + "ed25519-dalek", + "elliptic-curve", + "generic-array", + "getrandom", + "hex-literal", + "hmac", + "k256", + "num-derive", + "num-integer", + "num-traits", + "p256", + "rand", + "rand_chacha", + "sec1", + "sha2", + "sha3", + "soroban-builtin-sdk-macros", + "soroban-env-common", + "soroban-wasmi", + "static_assertions", + "stellar-strkey", + "wasmparser", +] + +[[package]] +name = "soroban-env-macros" +version = "21.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "242926fe5e0d922f12d3796cd7cd02dd824e5ef1caa088f45fce20b618309f64" +dependencies = [ + "itertools", + "proc-macro2", + "quote", + "serde", + "serde_json", + "stellar-xdr", + "syn", +] + +[[package]] +name = "soroban-ledger-snapshot" +version = "21.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6edf92749fd8399b417192d301c11f710b9cdce15789a3d157785ea971576fa" +dependencies = [ + "serde", + "serde_json", + "serde_with", + "soroban-env-common", + "soroban-env-host", + "thiserror", +] + +[[package]] +name = "soroban-sdk" +version = "21.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcdf04484af7cc731a7a48ad1d9f5f940370edeea84734434ceaf398a6b862e" +dependencies = [ + "arbitrary", + "bytes-lit", + "ctor", + "derive_arbitrary", + "ed25519-dalek", + "rand", + "rustc_version", + "serde", + "serde_json", + "soroban-env-guest", + "soroban-env-host", + "soroban-ledger-snapshot", + "soroban-sdk-macros", + "stellar-strkey", +] + +[[package]] +name = "soroban-sdk-macros" +version = "21.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0974e413731aeff2443f2305b344578b3f1ffd18335a7ba0f0b5d2eb4e94c9ce" +dependencies = [ + "crate-git-revision", + "darling 0.20.11", + "itertools", + "proc-macro2", + "quote", + "rustc_version", + "sha2", + "soroban-env-common", + "soroban-spec", + "soroban-spec-rust", + "stellar-xdr", + "syn", +] + +[[package]] +name = "soroban-spec" +version = "21.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2c70b20e68cae3ef700b8fa3ae29db1c6a294b311fba66918f90cb8f9fd0a1a" +dependencies = [ + "base64 0.13.1", + "stellar-xdr", + "thiserror", + "wasmparser", +] + +[[package]] +name = "soroban-spec-rust" +version = "21.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2dafbde981b141b191c6c036abc86097070ddd6eaaa33b273701449501e43d3" +dependencies = [ + "prettyplease", + "proc-macro2", + "quote", + "sha2", + "soroban-spec", + "stellar-xdr", + "syn", + "thiserror", +] + +[[package]] +name = "soroban-wasmi" +version = "0.31.1-soroban.20.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "710403de32d0e0c35375518cb995d4fc056d0d48966f2e56ea471b8cb8fc9719" +dependencies = [ + "smallvec", + "spin", + "wasmi_arena", + "wasmi_core", + "wasmparser-nostd", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "stellar-strkey" +version = "0.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12d2bf45e114117ea91d820a846fd1afbe3ba7d717988fee094ce8227a3bf8bd" +dependencies = [ + "base32", + "crate-git-revision", + "thiserror", +] + +[[package]] +name = "stellar-xdr" +version = "21.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2675a71212ed39a806e415b0dbf4702879ff288ec7f5ee996dda42a135512b50" +dependencies = [ + "arbitrary", + "base64 0.13.1", + "crate-git-revision", + "escape-bytes", + "hex", + "serde", + "serde_with", + "stellar-strkey", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "typenum" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.120" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df52b6d9b87e0c74c9edfa1eb2d9bf85e5d63515474513aa50fa181b3c4f5db1" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.120" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b1041f495fb322e64aca85f5756b2172e35cd459376e67f2a6c9dffcedb103" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.120" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dcd0ff20416988a18ac686d4d4d0f6aae9ebf08a389ff5d29012b05af2a1b41" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.120" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49757b3c82ebf16c57d69365a142940b384176c24df52a087fb748e2085359ea" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasmi_arena" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "104a7f73be44570cac297b3035d76b169d6599637631cf37a1703326a0727073" + +[[package]] +name = "wasmi_core" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf1a7db34bff95b85c261002720c00c3a6168256dcb93041d3fa2054d19856a" +dependencies = [ + "downcast-rs", + "libm", + "num-traits", + "paste", +] + +[[package]] +name = "wasmparser" +version = "0.116.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a58e28b80dd8340cb07b8242ae654756161f6fc8d0038123d679b7b99964fa50" +dependencies = [ + "indexmap 2.7.0", + "semver", +] + +[[package]] +name = "wasmparser-nostd" +version = "0.100.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5a015fe95f3504a94bb1462c717aae75253e39b9dd6c3fb1062c934535c64aa" +dependencies = [ + "indexmap-nostd", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "zerocopy" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml index 23f1f771..b18d6b01 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,38 +1,38 @@ -[workspace] -members = [ - "contracts/escrow", - "contracts/reputation", - "contracts/job_registry", -] -resolver = "2" - -[workspace.dependencies] -soroban-sdk = { version = "21.0.0" } -stellar-xdr = "21.0.0" -tokio = { version = "1", features = ["full"] } -axum = { version = "0.7", features = ["macros", "multipart"] } -bytes = "1" -serde = { version = "1", features = ["derive"] } -serde_json = "1" -sqlx = { version = "0.7", features = ["postgres", "runtime-tokio-native-tls", "macros", "uuid", "chrono"] } -uuid = { version = "1", features = ["v4", "serde"] } -chrono = { version = "0.4", features = ["serde"] } -reqwest = { version = "0.12", features = ["json", "multipart"] } -tracing = "0.1" -tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] } -anyhow = "1" -thiserror = "1" -dotenvy = "0.15" -tower = "0.4" -tower-http = { version = "0.5", features = ["cors", "trace"] } -futures = "0.3" - -[profile.release] -opt-level = "z" -overflow-checks = true -debug = 0 -strip = "symbols" -debug-assertions = false -panic = "abort" -codegen-units = 1 -lto = true +[workspace] +members = [ + "contracts/escrow", + "contracts/reputation", + "contracts/job_registry", +] +resolver = "2" + +[workspace.dependencies] +soroban-sdk = { version = "21.0.0" } +stellar-xdr = "21.0.0" +tokio = { version = "1", features = ["full"] } +axum = { version = "0.7", features = ["macros", "multipart"] } +bytes = "1" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +sqlx = { version = "0.7", features = ["postgres", "runtime-tokio-native-tls", "macros", "uuid", "chrono"] } +uuid = { version = "1", features = ["v4", "serde"] } +chrono = { version = "0.4", features = ["serde"] } +reqwest = { version = "0.12", features = ["json", "multipart"] } +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] } +anyhow = "1" +thiserror = "1" +dotenvy = "0.15" +tower = "0.4" +tower-http = { version = "0.5", features = ["cors", "trace"] } +futures = "0.3" + +[profile.release] +opt-level = "z" +overflow-checks = true +debug = 0 +strip = "symbols" +debug-assertions = false +panic = "abort" +codegen-units = 1 +lto = true diff --git a/README.md b/README.md index 87d35b00..13bc236b 100644 --- a/README.md +++ b/README.md @@ -1,163 +1,163 @@ -# Lance — Freelancer Platform with AI Agent Judge - -> **A next-generation freelancer marketplace built on the Stellar network.** Lance leverages Soroban smart contracts for secure escrow, Stellar USDC for borderless payments, and integrates advanced AI agents as impartial judges for automated, fair dispute resolution. - ---- - -## Overview for Users - -Lance reimagines the freelance economy by introducing an **AI Agent Judge** for dispute resolution. Traditional platforms rely on expensive and slow human arbitration when clients and freelancers disagree on the quality of deliverables. Lance solves this by using AI agents (powered by OpenClaw) to impartially review work against original job requirements and make binding decisions. - -The platform is underpinned by **Soroban escrow smart contracts**. Clients deposit funds upfront, and the smart contract automatically releases payments based on milestone completion or the verdict of the AI judge if a dispute arises. This ensures trustless, cheap, and fair treatment for all parties. - -## Key Features - -- ** Soroban Escrow Smart Contracts**: Job postings hold funds securely on-chain. Payments are guaranteed for completed work, eliminating non-payment risks. -- ** AI Agent Judge**: Impartial dispute resolution powered by OpenClaw. The agent analyzes submissions, reasons about requirements, and provides clear, reasoned verdicts to resolve disagreements. -- ** Milestone-based Payments**: Automatic, trustless payment releases upon approval of project milestones using Stellar USDC. -- ** On-chain Reputation Tracking**: A robust Soroban-based reputation system mapping identity and work history. -- ** Evidence Submission & Appeal Process**: Built-in mechanisms for submitting proof of work and handling large complex disputes securely. - ---- - -## Architecture for Developers - -Lance is a full-stack decentralized application consisting of a Next.js frontend, a Node.js/Express backend (TypeScript), and Soroban smart contracts orchestrating the on-chain logic. - -```text -lance/ -├── apps/web/ ← Next.js 14 frontend (TypeScript, Tailwind, shadcn/ui) -├── backend/ ← Node.js/Express REST API (TypeScript, Prisma, BullMQ) -├── contracts/ -│ ├── escrow/ ← Soroban escrow contract (deposit, release, dispute handling) -│ ├── reputation/ ← Soroban reputation contract (on-chain scores & history) -│ └── job_registry/ ← Soroban job registry (job posting, bidding, deliverables) -├── tests/e2e/ ← Playwright end-to-end tests -├── docs/ ← Architecture docs -└── .github/workflows/ ← CI/CD pipelines -``` - -## Technology Stack - -| Layer | Technology | -| -------------- | ------------------------------------------------------------------ | -| **Frontend** | Next.js 14, TypeScript, Tailwind CSS, shadcn/ui | -| **Wallet** | Freighter via `@creit.tech/stellar-wallets-kit` | -| **Contracts** | Rust / Soroban (Stellar Smart Contracts) | -| **Escrow** | Soroban contract integrated with Stellar native multisig | -| **Reputation** | Custom Soroban contract for decentralized identity & scoring | -| **Payments** | Stellar USDC (Circle) for fast, low-cost settlement | -| **Backend** | Node.js / Express.js (TypeScript) | -| **Database** | PostgreSQL (Prisma ORM) | -| **Background** | BullMQ (Redis-based job queue) for ledger indexing | -| **AI Judge** | OpenClaw agent for reasoning & verdict generation | -| **Deploy** | Vercel (Frontend) · Google Cloud Run & Cloud SQL (Backend) | - ---- - -## Quick Start - -### Prerequisites - -- Node.js ≥ 20 -- Rust (stable) + `wasm32-unknown-unknown` target (for smart contracts) -- `stellar` CLI -- Docker (for local Postgres & Redis databases) -- [Freighter wallet](https://www.freighter.app/) browser extension - -### Install - -```bash -# 1. Clone the repository -git clone && cd lance - -# 2. Install frontend dependencies -cd apps/web && npm install && cd ../.. - -# 3. Install backend dependencies -cd backend && npm install && cd .. - -# 4. Build Soroban contracts -cargo build --target wasm32-unknown-unknown -p escrow -cargo build --target wasm32-unknown-unknown -p reputation -cargo build --target wasm32-unknown-unknown -p job_registry -``` - -### Environment Setup - -```bash -# Setup web frontend environment -cp apps/web/.env.example apps/web/.env.local - -# Setup backend environment -cp backend/.env.example backend/.env -``` - -### Run Locally - -```bash -# Terminal 1 — Start Postgres & Redis via Docker Compose -docker compose up -d - -# Terminal 2 — Run the Backend API (runs on port 3001) -cd backend && npm run dev - -# Terminal 3 — Run the Next.js Frontend (runs on port 3000) -cd apps/web && npm run dev -``` - -Open [http://localhost:3000](http://localhost:3000) in your browser to start exploring Lance. - ---- - -## Cloud Deployment - -The backend is fully containerized and automated for deployment to **Google Cloud Run** and **Google Cloud SQL**. - -To provision the cloud database and deploy the API: -```bash -cd backend -./setup-cloud-db.sh -./deploy-gcp.sh -``` - ---- - -## Smart Contracts - -Lance operates heavily on-chain to guarantee trustlessness. Our Soroban contracts handle job registries, escrows, and reputation scoring. - -```bash -# Run all Soroban contract tests -cargo test -p escrow -p reputation -p job_registry - -# Deploy contracts to Stellar Testnet (requires stellar CLI + funded account) -./.github/scripts/deploy-contracts.sh -``` - ---- - -## Testing - -```bash -# Frontend unit tests -cd apps/web && npm test - -# Backend build check -cd backend && npm run build - -# E2E test suite (requires running frontend + backend) -cd tests/e2e && npx playwright test -``` - ---- - -## Contributing - -We welcome contributions! Please see [CONTRIBUTING.md](./CONTRIBUTING.md) for details on how to get started. - ---- - -## License - -MIT License +# Lance — Freelancer Platform with AI Agent Judge + +> **A next-generation freelancer marketplace built on the Stellar network.** Lance leverages Soroban smart contracts for secure escrow, Stellar USDC for borderless payments, and integrates advanced AI agents as impartial judges for automated, fair dispute resolution. + +--- + +## Overview for Users + +Lance reimagines the freelance economy by introducing an **AI Agent Judge** for dispute resolution. Traditional platforms rely on expensive and slow human arbitration when clients and freelancers disagree on the quality of deliverables. Lance solves this by using AI agents (powered by OpenClaw) to impartially review work against original job requirements and make binding decisions. + +The platform is underpinned by **Soroban escrow smart contracts**. Clients deposit funds upfront, and the smart contract automatically releases payments based on milestone completion or the verdict of the AI judge if a dispute arises. This ensures trustless, cheap, and fair treatment for all parties. + +## Key Features + +- ** Soroban Escrow Smart Contracts**: Job postings hold funds securely on-chain. Payments are guaranteed for completed work, eliminating non-payment risks. +- ** AI Agent Judge**: Impartial dispute resolution powered by OpenClaw. The agent analyzes submissions, reasons about requirements, and provides clear, reasoned verdicts to resolve disagreements. +- ** Milestone-based Payments**: Automatic, trustless payment releases upon approval of project milestones using Stellar USDC. +- ** On-chain Reputation Tracking**: A robust Soroban-based reputation system mapping identity and work history. +- ** Evidence Submission & Appeal Process**: Built-in mechanisms for submitting proof of work and handling large complex disputes securely. + +--- + +## Architecture for Developers + +Lance is a full-stack decentralized application consisting of a Next.js frontend, a Node.js/Express backend (TypeScript), and Soroban smart contracts orchestrating the on-chain logic. + +```text +lance/ +├── apps/web/ ← Next.js 14 frontend (TypeScript, Tailwind, shadcn/ui) +├── backend/ ← Node.js/Express REST API (TypeScript, Prisma, BullMQ) +├── contracts/ +│ ├── escrow/ ← Soroban escrow contract (deposit, release, dispute handling) +│ ├── reputation/ ← Soroban reputation contract (on-chain scores & history) +│ └── job_registry/ ← Soroban job registry (job posting, bidding, deliverables) +├── tests/e2e/ ← Playwright end-to-end tests +├── docs/ ← Architecture docs +└── .github/workflows/ ← CI/CD pipelines +``` + +## Technology Stack + +| Layer | Technology | +| -------------- | ------------------------------------------------------------------ | +| **Frontend** | Next.js 14, TypeScript, Tailwind CSS, shadcn/ui | +| **Wallet** | Freighter via `@creit.tech/stellar-wallets-kit` | +| **Contracts** | Rust / Soroban (Stellar Smart Contracts) | +| **Escrow** | Soroban contract integrated with Stellar native multisig | +| **Reputation** | Custom Soroban contract for decentralized identity & scoring | +| **Payments** | Stellar USDC (Circle) for fast, low-cost settlement | +| **Backend** | Node.js / Express.js (TypeScript) | +| **Database** | PostgreSQL (Prisma ORM) | +| **Background** | BullMQ (Redis-based job queue) for ledger indexing | +| **AI Judge** | OpenClaw agent for reasoning & verdict generation | +| **Deploy** | Vercel (Frontend) · Google Cloud Run & Cloud SQL (Backend) | + +--- + +## Quick Start + +### Prerequisites + +- Node.js ≥ 20 +- Rust (stable) + `wasm32-unknown-unknown` target (for smart contracts) +- `stellar` CLI +- Docker (for local Postgres & Redis databases) +- [Freighter wallet](https://www.freighter.app/) browser extension + +### Install + +```bash +# 1. Clone the repository +git clone && cd lance + +# 2. Install frontend dependencies +cd apps/web && npm install && cd ../.. + +# 3. Install backend dependencies +cd backend && npm install && cd .. + +# 4. Build Soroban contracts +cargo build --target wasm32-unknown-unknown -p escrow +cargo build --target wasm32-unknown-unknown -p reputation +cargo build --target wasm32-unknown-unknown -p job_registry +``` + +### Environment Setup + +```bash +# Setup web frontend environment +cp apps/web/.env.example apps/web/.env.local + +# Setup backend environment +cp backend/.env.example backend/.env +``` + +### Run Locally + +```bash +# Terminal 1 — Start Postgres & Redis via Docker Compose +docker compose up -d + +# Terminal 2 — Run the Backend API (runs on port 3001) +cd backend && npm run dev + +# Terminal 3 — Run the Next.js Frontend (runs on port 3000) +cd apps/web && npm run dev +``` + +Open [http://localhost:3000](http://localhost:3000) in your browser to start exploring Lance. + +--- + +## Cloud Deployment + +The backend is fully containerized and automated for deployment to **Google Cloud Run** and **Google Cloud SQL**. + +To provision the cloud database and deploy the API: +```bash +cd backend +./setup-cloud-db.sh +./deploy-gcp.sh +``` + +--- + +## Smart Contracts + +Lance operates heavily on-chain to guarantee trustlessness. Our Soroban contracts handle job registries, escrows, and reputation scoring. + +```bash +# Run all Soroban contract tests +cargo test -p escrow -p reputation -p job_registry + +# Deploy contracts to Stellar Testnet (requires stellar CLI + funded account) +./.github/scripts/deploy-contracts.sh +``` + +--- + +## Testing + +```bash +# Frontend unit tests +cd apps/web && npm test + +# Backend build check +cd backend && npm run build + +# E2E test suite (requires running frontend + backend) +cd tests/e2e && npx playwright test +``` + +--- + +## Contributing + +We welcome contributions! Please see [CONTRIBUTING.md](./CONTRIBUTING.md) for details on how to get started. + +--- + +## License + +MIT License diff --git a/apps/web/.gitignore b/apps/web/.gitignore index 3cfa5545..63708b94 100644 --- a/apps/web/.gitignore +++ b/apps/web/.gitignore @@ -1,45 +1,45 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.* -.yarn/* -!.yarn/patches -!.yarn/plugins -!.yarn/releases -!.yarn/versions - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# env files (can opt-in for committing if needed) -.env* - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts - - -.agents/ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + + +.agents/ skills-lock.json \ No newline at end of file diff --git a/apps/web/README.md b/apps/web/README.md index 2769fb1d..79907278 100644 --- a/apps/web/README.md +++ b/apps/web/README.md @@ -1,40 +1,40 @@ -This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). - -## Getting Started - -First, run the development server: - -```bash -npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev -``` - -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. - -## Connecting a Stellar wallet - -See the end-user guide at [`docs/user-guide/stellar-wallets.md`](../../docs/user-guide/stellar-wallets.md) for supported wallets (Freighter, Albedo, xBull, …), the signing flow, Testnet vs. Mainnet configuration, and troubleshooting. - -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. - -This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. - -## Learn More - -To learn more about Next.js, take a look at the following resources: - -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. - -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! - -## Deploy on Vercel - -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. - -Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +## Connecting a Stellar wallet + +See the end-user guide at [`docs/user-guide/stellar-wallets.md`](../../docs/user-guide/stellar-wallets.md) for supported wallets (Freighter, Albedo, xBull, …), the signing flow, Testnet vs. Mainnet configuration, and troubleshooting. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/apps/web/app/admin/monitoring/deposit-indexing/page.tsx b/apps/web/app/admin/monitoring/deposit-indexing/page.tsx index 87e50a8a..d0c433ef 100644 --- a/apps/web/app/admin/monitoring/deposit-indexing/page.tsx +++ b/apps/web/app/admin/monitoring/deposit-indexing/page.tsx @@ -1,402 +1,402 @@ -"use client"; - -import React, { useState, useEffect } from "react"; -import { - Database, - RefreshCw, - Terminal, - Cpu, - Clock, - ArrowDownLeft, - ShieldCheck, - Zap -} from "lucide-react"; -import { - XAxis, - YAxis, - CartesianGrid, - Tooltip, - ResponsiveContainer, - AreaChart, - Area -} from "recharts"; -import { Button } from "@/components/ui/button"; -import { useIndexerStatus } from "@/hooks/use-indexer-status"; -import { apiAdmin } from "@/lib/api"; - -const generateInitialData = () => { - const data = []; - const now = new Date(); - for (let i = 20; i >= 0; i--) { - data.push({ - time: new Date(now.getTime() - i * 5000).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' }), - throughput: 0, - latency: 0, - }); - } - return data; -}; - -export default function DepositMonitoringDashboard() { - const { data: status, isLoading } = useIndexerStatus(); - const [chartData, setChartData] = useState(generateInitialData()); - const [logs, setLogs] = useState<{id: string, msg: string, type: 'info' | 'error' | 'warn' | 'success'}[]>([]); - const [confirmAction, setConfirmAction] = useState<"restart" | "rescan" | null>(null); - const [actionPending, setActionPending] = useState(false); - - const addLog = (msg: string, type: 'info' | 'error' | 'warn' | 'success' = 'info') => { - setLogs(prev => [{ id: Math.random().toString(36), msg, type }, ...prev].slice(0, 50)); - }; - - const handleRestart = async () => { - setActionPending(true); - setConfirmAction(null); - try { - const res = await apiAdmin.indexer.restart(); - addLog(res.message, 'success'); - } catch (e) { - addLog(`Restart failed: ${e instanceof Error ? e.message : String(e)}`, 'error'); - } finally { - setActionPending(false); - } - }; - - const handleRescan = async () => { - setActionPending(true); - setConfirmAction(null); - try { - const res = await apiAdmin.indexer.rescan(); - addLog(`Re-scan initiated from ledger ${res.rescan_from_ledger}`, 'info'); - } catch (e) { - addLog(`Re-scan failed: ${e instanceof Error ? e.message : String(e)}`, 'error'); - } finally { - setActionPending(false); - } - }; - - useEffect(() => { - if (!status) return; - - // Use a small delay to avoid cascading render warnings from synchronous state updates in effect - const timeoutId = setTimeout(() => { - setChartData(prev => { - const newData = [...prev.slice(1), { - time: new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' }), - throughput: status.last_batch_rate_per_second, - latency: status.last_rpc_latency_ms || status.last_loop_duration_ms, - }]; - return newData; - }); - - if (status.last_loop_duration_ms > 1000) { - addLog(`High indexing latency detected: ${status.last_loop_duration_ms}ms`, 'warn'); - } - - if (status.rpc_retry_count > 0) { - addLog(`RPC retry pressure detected: ${status.rpc_retry_count}`, 'warn'); - } - }, 0); - - return () => clearTimeout(timeoutId); - }, [status]); - - if (isLoading) return ( -
-
- -

Booting_Deposit_Monitor...

-
-
- ); - - return ( -
- {confirmAction && ( -
-
-

- {confirmAction === "restart" - ? "Send restart signal to the indexer worker?" - : "Roll back checkpoint and trigger ledger re-scan?"} -

-

This action cannot be undone.

-
- - -
-
-
- )} - - {/* Top Banner Status */} -
-
- - System::{status?.in_sync ? 'Operational' : 'Sync_Required'} {" // "} {status?.rpc.url} - -
- - {/* Header Section */} -
-
-

- INDEXING::DEPOSIT_EVENTS -

-
- Env::Production - - Ver::2.4.0-stable - - Documentation_Runbook -
-
- -
- - -
-
- - {/* Primary Metrics Grid */} -
- } - /> - } - /> - } - /> - 500 ? 'warning' : 'success'} - icon={} - /> -
- -
- {/* Real-time Throughput Chart */} -
-
-
-

Resource::Throughput_Analysis

-
-
-
- Events/Sec -
-
-
- Latency_ms -
-
-
- -
- - - - - `${v}`} - /> - - - - - -
-
- - {/* Event Distribution */} -
-

Protocol_Checkpoints

-
- - - -
-
-
- - {/* Live Terminal Log */} -
-
-
-

- - Live_System_Output -

-
-
-
- {logs.length === 0 && ( -
- {">"} Waiting for events...
- {">"} Connection established via Websocket tunnel
- {">"} Monitoring contract: CC72...X9A1 -
- )} - {logs.map((log, i) => ( -
- [{i+1024}] - - {log.msg} - -
- ))} - {/* Simulated tailing */} -
- [{1024 + logs.length}] - _ -
-
-
-
-
-
- ); -} - -function MetricItem({ - label, - value, - subValue, - icon, - status = 'default' -}: { - label: string, - value: string, - subValue: string, - icon: React.ReactNode, - status?: 'default' | 'success' | 'warning' | 'error' -}) { - const statusColor = { - default: 'bg-black text-white', - success: 'bg-black text-green-500', - warning: 'bg-black text-yellow-500', - error: 'bg-black text-red-500' - }[status]; - - return ( -
-
- {label} -
{icon}
-
-
{value}
-
{subValue}
-
- ); -} - -function LogPanel({ title, logs }: { title: string, logs: { msg: string, type: string }[] }) { - return ( -
-

{title}

-
- {logs.map((log, i) => ( -
- - {log.type === 'success' ? '√' : '»'} - - {log.msg} -
- ))} -
-
- ); -} +"use client"; + +import React, { useState, useEffect } from "react"; +import { + Database, + RefreshCw, + Terminal, + Cpu, + Clock, + ArrowDownLeft, + ShieldCheck, + Zap +} from "lucide-react"; +import { + XAxis, + YAxis, + CartesianGrid, + Tooltip, + ResponsiveContainer, + AreaChart, + Area +} from "recharts"; +import { Button } from "@/components/ui/button"; +import { useIndexerStatus } from "@/hooks/use-indexer-status"; +import { apiAdmin } from "@/lib/api"; + +const generateInitialData = () => { + const data = []; + const now = new Date(); + for (let i = 20; i >= 0; i--) { + data.push({ + time: new Date(now.getTime() - i * 5000).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' }), + throughput: 0, + latency: 0, + }); + } + return data; +}; + +export default function DepositMonitoringDashboard() { + const { data: status, isLoading } = useIndexerStatus(); + const [chartData, setChartData] = useState(generateInitialData()); + const [logs, setLogs] = useState<{id: string, msg: string, type: 'info' | 'error' | 'warn' | 'success'}[]>([]); + const [confirmAction, setConfirmAction] = useState<"restart" | "rescan" | null>(null); + const [actionPending, setActionPending] = useState(false); + + const addLog = (msg: string, type: 'info' | 'error' | 'warn' | 'success' = 'info') => { + setLogs(prev => [{ id: Math.random().toString(36), msg, type }, ...prev].slice(0, 50)); + }; + + const handleRestart = async () => { + setActionPending(true); + setConfirmAction(null); + try { + const res = await apiAdmin.indexer.restart(); + addLog(res.message, 'success'); + } catch (e) { + addLog(`Restart failed: ${e instanceof Error ? e.message : String(e)}`, 'error'); + } finally { + setActionPending(false); + } + }; + + const handleRescan = async () => { + setActionPending(true); + setConfirmAction(null); + try { + const res = await apiAdmin.indexer.rescan(); + addLog(`Re-scan initiated from ledger ${res.rescan_from_ledger}`, 'info'); + } catch (e) { + addLog(`Re-scan failed: ${e instanceof Error ? e.message : String(e)}`, 'error'); + } finally { + setActionPending(false); + } + }; + + useEffect(() => { + if (!status) return; + + // Use a small delay to avoid cascading render warnings from synchronous state updates in effect + const timeoutId = setTimeout(() => { + setChartData(prev => { + const newData = [...prev.slice(1), { + time: new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' }), + throughput: status.last_batch_rate_per_second, + latency: status.last_rpc_latency_ms || status.last_loop_duration_ms, + }]; + return newData; + }); + + if (status.last_loop_duration_ms > 1000) { + addLog(`High indexing latency detected: ${status.last_loop_duration_ms}ms`, 'warn'); + } + + if (status.rpc_retry_count > 0) { + addLog(`RPC retry pressure detected: ${status.rpc_retry_count}`, 'warn'); + } + }, 0); + + return () => clearTimeout(timeoutId); + }, [status]); + + if (isLoading) return ( +
+
+ +

Booting_Deposit_Monitor...

+
+
+ ); + + return ( +
+ {confirmAction && ( +
+
+

+ {confirmAction === "restart" + ? "Send restart signal to the indexer worker?" + : "Roll back checkpoint and trigger ledger re-scan?"} +

+

This action cannot be undone.

+
+ + +
+
+
+ )} + + {/* Top Banner Status */} +
+
+ + System::{status?.in_sync ? 'Operational' : 'Sync_Required'} {" // "} {status?.rpc.url} + +
+ + {/* Header Section */} +
+
+

+ INDEXING::DEPOSIT_EVENTS +

+
+ Env::Production + + Ver::2.4.0-stable + + Documentation_Runbook +
+
+ +
+ + +
+
+ + {/* Primary Metrics Grid */} +
+ } + /> + } + /> + } + /> + 500 ? 'warning' : 'success'} + icon={} + /> +
+ +
+ {/* Real-time Throughput Chart */} +
+
+
+

Resource::Throughput_Analysis

+
+
+
+ Events/Sec +
+
+
+ Latency_ms +
+
+
+ +
+ + + + + `${v}`} + /> + + + + + +
+
+ + {/* Event Distribution */} +
+

Protocol_Checkpoints

+
+ + + +
+
+
+ + {/* Live Terminal Log */} +
+
+
+

+ + Live_System_Output +

+
+
+
+ {logs.length === 0 && ( +
+ {">"} Waiting for events...
+ {">"} Connection established via Websocket tunnel
+ {">"} Monitoring contract: CC72...X9A1 +
+ )} + {logs.map((log, i) => ( +
+ [{i+1024}] + + {log.msg} + +
+ ))} + {/* Simulated tailing */} +
+ [{1024 + logs.length}] + _ +
+
+
+
+
+
+ ); +} + +function MetricItem({ + label, + value, + subValue, + icon, + status = 'default' +}: { + label: string, + value: string, + subValue: string, + icon: React.ReactNode, + status?: 'default' | 'success' | 'warning' | 'error' +}) { + const statusColor = { + default: 'bg-black text-white', + success: 'bg-black text-green-500', + warning: 'bg-black text-yellow-500', + error: 'bg-black text-red-500' + }[status]; + + return ( +
+
+ {label} +
{icon}
+
+
{value}
+
{subValue}
+
+ ); +} + +function LogPanel({ title, logs }: { title: string, logs: { msg: string, type: string }[] }) { + return ( +
+

{title}

+
+ {logs.map((log, i) => ( +
+ + {log.type === 'success' ? '√' : '»'} + + {log.msg} +
+ ))} +
+
+ ); +} diff --git a/apps/web/app/admin/monitoring/page.tsx b/apps/web/app/admin/monitoring/page.tsx index 23d833d7..c3293f26 100644 --- a/apps/web/app/admin/monitoring/page.tsx +++ b/apps/web/app/admin/monitoring/page.tsx @@ -1,302 +1,302 @@ -"use client"; - -import React, { useState, useCallback, useEffect } from "react"; -import { - Activity, Database, RefreshCw, Terminal, AlertCircle, - CheckCircle2, TrendingUp, Cpu, Clock, -} from "lucide-react"; -import { - XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, AreaChart, Area, -} from "recharts"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; -import { useIndexerStatus } from "@/hooks/use-indexer-status"; -import { apiAdmin } from "@/lib/api"; - -const generateInitialData = () => { - const now = new Date(); - return Array.from({ length: 21 }, (_, i) => ({ - time: new Date(now.getTime() - (20 - i) * 5000).toLocaleTimeString([], { - hour: "2-digit", minute: "2-digit", second: "2-digit", - }), - throughput: 0, - latency: 0, - })); -}; - -export default function MonitoringDashboard() { - const { data: status, isLoading } = useIndexerStatus(); - const [chartData, setChartData] = useState(generateInitialData); - const [logs, setLogs] = useState<{ id: string; msg: string; type: "info" | "error" | "warn" }[]>([]); - const [confirmAction, setConfirmAction] = useState<"restart" | "rescan" | null>(null); - const [actionPending, setActionPending] = useState(false); - - const addLog = useCallback((msg: string, type: "info" | "error" | "warn" = "info") => { - setLogs((prev) => [{ id: Math.random().toString(36).slice(2), msg, type }, ...prev].slice(0, 50)); - }, []); - - const handleRestart = async () => { - setActionPending(true); - setConfirmAction(null); - try { - const res = await apiAdmin.indexer.restart(); - addLog(res.message, "info"); - } catch (e) { - addLog(`Restart failed: ${e instanceof Error ? e.message : String(e)}`, "error"); - } finally { - setActionPending(false); - } - }; - - const handleRescan = async () => { - setActionPending(true); - setConfirmAction(null); - try { - const res = await apiAdmin.indexer.rescan(); - addLog(`Re-scan initiated from ledger ${res.rescan_from_ledger}`, "warn"); - } catch (e) { - addLog(`Re-scan failed: ${e instanceof Error ? e.message : String(e)}`, "error"); - } finally { - setActionPending(false); - } - }; - - useEffect(() => { - if (!status) return; - const id = setTimeout(() => { - setChartData((prev) => [ - ...prev.slice(1), - { - time: new Date().toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", second: "2-digit" }), - throughput: status.last_batch_rate_per_second, - latency: status.last_rpc_latency_ms || status.last_loop_duration_ms, - }, - ]); - if (status.ledger_lag > status.max_allowed_lag) { - addLog(`Lagging behind by ${status.ledger_lag} ledgers`, "warn"); - } - }, 0); - return () => clearTimeout(id); - }, [status, addLog]); - - if (isLoading) - return ( -
-
- -

INITIALIZING_MONITORING_SYSTEM...

-
-
- ); - - return ( -
- {confirmAction && ( -
-
-

- {confirmAction === "restart" - ? "Send restart signal to the indexer worker?" - : "Roll back checkpoint and trigger ledger re-scan?"} -

-

This action cannot be undone.

-
- - -
-
-
- )} - -
-
-

- - INFRASTRUCTURE::CORE_MONITOR -

-

- Production Environment // Soroban Network Service -

-
-
- - -
-
- -
- : } - trend={status?.in_sync ? "STABLE" : "DEGRADED"} - /> - } - /> - } - color={status?.error_count && status.error_count > 0 ? "text-red-500" : "text-zinc-500"} - /> - } - /> -
- -
-
- - - - Worker Throughput (EPS) - - - - - - - - - - - - - - - `${v} eps`} /> - - - - - - - - - - System Parameters - - - - - - - - - - - - - - - - - - -
ParameterValueID
-
-
-
- -
- - - Live_Events - STREAMING - - -
- {logs.length === 0 && ( -

No events in current session...

- )} - {logs.map((log) => ( -
-
- [{new Date().toLocaleTimeString()}] - - {log.msg} - -
-
- ))} -
-
- [{new Date().toLocaleTimeString()}] - LEDGER_CONSUMED :: #{status?.last_processed_ledger} -
-
-
-
-
-
-
-
- ); -} - -interface StatCardProps { - title: string; - value: string; - subValue: string; - icon: React.ReactNode; - color?: string; - trend?: "STABLE" | "DEGRADED"; -} - -function StatCard({ title, value, subValue, icon, color = "text-white", trend }: StatCardProps) { - return ( - - -
-

{title}

-
{icon}
-
-
-

{value}

- {trend && ( - - {trend} - - )} -
-

{subValue}

-
-
- ); -} - -function TableRow({ label, value, id }: { label: string; value: string; id: string }) { - return ( - - {label} - {value} - {id} - - ); -} +"use client"; + +import React, { useState, useCallback, useEffect } from "react"; +import { + Activity, Database, RefreshCw, Terminal, AlertCircle, + CheckCircle2, TrendingUp, Cpu, Clock, +} from "lucide-react"; +import { + XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, AreaChart, Area, +} from "recharts"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { Badge } from "@/components/ui/badge"; +import { useIndexerStatus } from "@/hooks/use-indexer-status"; +import { apiAdmin } from "@/lib/api"; + +const generateInitialData = () => { + const now = new Date(); + return Array.from({ length: 21 }, (_, i) => ({ + time: new Date(now.getTime() - (20 - i) * 5000).toLocaleTimeString([], { + hour: "2-digit", minute: "2-digit", second: "2-digit", + }), + throughput: 0, + latency: 0, + })); +}; + +export default function MonitoringDashboard() { + const { data: status, isLoading } = useIndexerStatus(); + const [chartData, setChartData] = useState(generateInitialData); + const [logs, setLogs] = useState<{ id: string; msg: string; type: "info" | "error" | "warn" }[]>([]); + const [confirmAction, setConfirmAction] = useState<"restart" | "rescan" | null>(null); + const [actionPending, setActionPending] = useState(false); + + const addLog = useCallback((msg: string, type: "info" | "error" | "warn" = "info") => { + setLogs((prev) => [{ id: Math.random().toString(36).slice(2), msg, type }, ...prev].slice(0, 50)); + }, []); + + const handleRestart = async () => { + setActionPending(true); + setConfirmAction(null); + try { + const res = await apiAdmin.indexer.restart(); + addLog(res.message, "info"); + } catch (e) { + addLog(`Restart failed: ${e instanceof Error ? e.message : String(e)}`, "error"); + } finally { + setActionPending(false); + } + }; + + const handleRescan = async () => { + setActionPending(true); + setConfirmAction(null); + try { + const res = await apiAdmin.indexer.rescan(); + addLog(`Re-scan initiated from ledger ${res.rescan_from_ledger}`, "warn"); + } catch (e) { + addLog(`Re-scan failed: ${e instanceof Error ? e.message : String(e)}`, "error"); + } finally { + setActionPending(false); + } + }; + + useEffect(() => { + if (!status) return; + const id = setTimeout(() => { + setChartData((prev) => [ + ...prev.slice(1), + { + time: new Date().toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", second: "2-digit" }), + throughput: status.last_batch_rate_per_second, + latency: status.last_rpc_latency_ms || status.last_loop_duration_ms, + }, + ]); + if (status.ledger_lag > status.max_allowed_lag) { + addLog(`Lagging behind by ${status.ledger_lag} ledgers`, "warn"); + } + }, 0); + return () => clearTimeout(id); + }, [status, addLog]); + + if (isLoading) + return ( +
+
+ +

INITIALIZING_MONITORING_SYSTEM...

+
+
+ ); + + return ( +
+ {confirmAction && ( +
+
+

+ {confirmAction === "restart" + ? "Send restart signal to the indexer worker?" + : "Roll back checkpoint and trigger ledger re-scan?"} +

+

This action cannot be undone.

+
+ + +
+
+
+ )} + +
+
+

+ + INFRASTRUCTURE::CORE_MONITOR +

+

+ Production Environment // Soroban Network Service +

+
+
+ + +
+
+ +
+ : } + trend={status?.in_sync ? "STABLE" : "DEGRADED"} + /> + } + /> + } + color={status?.error_count && status.error_count > 0 ? "text-red-500" : "text-zinc-500"} + /> + } + /> +
+ +
+
+ + + + Worker Throughput (EPS) + + + + + + + + + + + + + + + `${v} eps`} /> + + + + + + + + + + System Parameters + + + + + + + + + + + + + + + + + + +
ParameterValueID
+
+
+
+ +
+ + + Live_Events + STREAMING + + +
+ {logs.length === 0 && ( +

No events in current session...

+ )} + {logs.map((log) => ( +
+
+ [{new Date().toLocaleTimeString()}] + + {log.msg} + +
+
+ ))} +
+
+ [{new Date().toLocaleTimeString()}] + LEDGER_CONSUMED :: #{status?.last_processed_ledger} +
+
+
+
+
+
+
+
+ ); +} + +interface StatCardProps { + title: string; + value: string; + subValue: string; + icon: React.ReactNode; + color?: string; + trend?: "STABLE" | "DEGRADED"; +} + +function StatCard({ title, value, subValue, icon, color = "text-white", trend }: StatCardProps) { + return ( + + +
+

{title}

+
{icon}
+
+
+

{value}

+ {trend && ( + + {trend} + + )} +
+

{subValue}

+
+
+ ); +} + +function TableRow({ label, value, id }: { label: string; value: string; id: string }) { + return ( + + {label} + {value} + {id} + + ); +} diff --git a/apps/web/app/admin/page.tsx b/apps/web/app/admin/page.tsx index 6a402f62..d62d974f 100644 --- a/apps/web/app/admin/page.tsx +++ b/apps/web/app/admin/page.tsx @@ -1,64 +1,64 @@ -"use client"; - -import Link from "next/link"; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; -import { AdminVault } from "@/components/blockchain/admin-vault"; - -const adminLinks = [ - { - href: "/admin/monitoring", - title: "Monitoring", - description: "Live indexer and network status dashboard.", - }, - { - href: "/admin/monitoring/deposit-indexing", - title: "Deposit Indexing", - description: "Focused view for deposit event processing and state.", - }, -]; - -export default function AdminDashboardPage() { - return ( -
-
-
-
-

- Admin Console -

-

- Secure Vault Operations -

-

- Manage the admin key vault and jump to the existing monitoring views from a single - dashboard entry point. -

-
- -
- {adminLinks.map((link) => ( - -

{link.title}

-

- {link.description} -

- - ))} -
-
- - - - Admin Vault - - Submit the connected admin wallet into the secure vault contract. - - - - - - -
-
- ); +"use client"; + +import Link from "next/link"; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; +import { AdminVault } from "@/components/blockchain/admin-vault"; + +const adminLinks = [ + { + href: "/admin/monitoring", + title: "Monitoring", + description: "Live indexer and network status dashboard.", + }, + { + href: "/admin/monitoring/deposit-indexing", + title: "Deposit Indexing", + description: "Focused view for deposit event processing and state.", + }, +]; + +export default function AdminDashboardPage() { + return ( +
+
+
+
+

+ Admin Console +

+

+ Secure Vault Operations +

+

+ Manage the admin key vault and jump to the existing monitoring views from a single + dashboard entry point. +

+
+ +
+ {adminLinks.map((link) => ( + +

{link.title}

+

+ {link.description} +

+ + ))} +
+
+ + + + Admin Vault + + Submit the connected admin wallet into the secure vault contract. + + + + + + +
+
+ ); } \ No newline at end of file diff --git a/apps/web/app/api-docs/page.tsx b/apps/web/app/api-docs/page.tsx index c7193818..95a4586b 100644 --- a/apps/web/app/api-docs/page.tsx +++ b/apps/web/app/api-docs/page.tsx @@ -1,91 +1,91 @@ -"use client"; - -import React from "react"; -import { useApiDocs } from "../../hooks/useApiDocs"; -import { ApiEndpointCard } from "../../components/docs/ApiEndpoint"; - -/** - * API Documentation Page - * Displays a list of all API endpoints with a sticky sidebar for quick navigation. - * Uses TanStack Query for data fetching and Zinc-950 dark mode theme. - */ -export default function ApiDocsPage() { - const { data: endpoints, isLoading, error } = useApiDocs(); - - if (isLoading) { - return ( -
-
-
-

LOADING API METADATA...

-
-
- ); - } - - if (error) { - return ( -
-
-

Simulation Failed

-

Failed to retrieve API documentation metadata. Please verify your connection to the decentralized network.

-
-
- ); - } - - return ( -
-
- - {/* Sticky Sidebar */} - - - {/* Main Content */} -
-
-

- Developer Reference -

-

- Build robust applications on top of our decentralized marketplace protocol. - Our APIs provide real-time access to jobs, milestones, and on-chain state. -

-
- -
- {endpoints?.map((endpoint) => ( - - ))} -
- -
-

- © 2026 LANCE PROTOCOL — VERIFIED ON-CHAIN -

-
-
-
-
- ); -} +"use client"; + +import React from "react"; +import { useApiDocs } from "../../hooks/useApiDocs"; +import { ApiEndpointCard } from "../../components/docs/ApiEndpoint"; + +/** + * API Documentation Page + * Displays a list of all API endpoints with a sticky sidebar for quick navigation. + * Uses TanStack Query for data fetching and Zinc-950 dark mode theme. + */ +export default function ApiDocsPage() { + const { data: endpoints, isLoading, error } = useApiDocs(); + + if (isLoading) { + return ( +
+
+
+

LOADING API METADATA...

+
+
+ ); + } + + if (error) { + return ( +
+
+

Simulation Failed

+

Failed to retrieve API documentation metadata. Please verify your connection to the decentralized network.

+
+
+ ); + } + + return ( +
+
+ + {/* Sticky Sidebar */} + + + {/* Main Content */} +
+
+

+ Developer Reference +

+

+ Build robust applications on top of our decentralized marketplace protocol. + Our APIs provide real-time access to jobs, milestones, and on-chain state. +

+
+ +
+ {endpoints?.map((endpoint) => ( + + ))} +
+ +
+

+ © 2026 LANCE PROTOCOL — VERIFIED ON-CHAIN +

+
+
+
+
+ ); +} diff --git a/apps/web/app/dashboard-design-system.css b/apps/web/app/dashboard-design-system.css index 26032181..417b021a 100644 --- a/apps/web/app/dashboard-design-system.css +++ b/apps/web/app/dashboard-design-system.css @@ -1,490 +1,490 @@ -/** - * Freelancer Dashboard Design System - * - * A strict design system for Web3 freelancer interfaces - * Balances "Technical Trust" with "Modern Web3" aesthetics - */ - -/* ─── Color Tokens ───────────────────────────────────────────────────────── */ - -:root { - /* Base Colors */ - --dashboard-bg: #09090b; /* zinc-950 */ - --dashboard-surface: #18181b; /* zinc-900 */ - --dashboard-surface-elevated: #27272a; /* zinc-800 */ - - /* Status Colors */ - --dashboard-success: #10b981; /* emerald-500 */ - --dashboard-success-light: #34d399; /* emerald-400 */ - --dashboard-success-dark: #059669; /* emerald-600 */ - - --dashboard-warning: #f59e0b; /* amber-500 */ - --dashboard-warning-light: #fbbf24; /* amber-400 */ - --dashboard-warning-dark: #d97706; /* amber-600 */ - - --dashboard-error: #ef4444; /* red-500 */ - --dashboard-info: #3b82f6; /* blue-500 */ - - /* Text Colors */ - --dashboard-text-primary: #fafafa; /* zinc-50 */ - --dashboard-text-secondary: #a1a1aa; /* zinc-400 */ - --dashboard-text-tertiary: #71717a; /* zinc-500 */ - - /* Border Colors */ - --dashboard-border: #27272a; /* zinc-800 */ - --dashboard-border-light: #3f3f46; /* zinc-700 */ - - /* Glow Effect */ - --dashboard-glow-indigo: rgba(99, 102, 241, 0.08); - --dashboard-glow-slate: rgba(148, 163, 184, 0.05); - - /* Spacing Grid (8px base) */ - --space-1: 0.25rem; /* 4px */ - --space-2: 0.5rem; /* 8px */ - --space-3: 0.75rem; /* 12px */ - --space-4: 1rem; /* 16px */ - --space-5: 1.25rem; /* 20px */ - --space-6: 1.5rem; /* 24px */ - --space-8: 2rem; /* 32px */ - --space-10: 2.5rem; /* 40px */ - --space-12: 3rem; /* 48px */ - - /* Border Radius */ - --radius-sm: 0.5rem; /* 8px */ - --radius-md: 0.75rem; /* 12px */ - --radius-lg: 1rem; /* 16px */ - --radius-xl: 1.5rem; /* 24px */ - - /* Typography */ - --font-sans: 'Inter', 'Geist', ui-sans-serif, system-ui, sans-serif; - --font-mono: 'Geist Mono', 'SF Mono', 'Fira Code', ui-monospace, monospace; - - /* Transitions */ - --transition-fast: 150ms ease; - --transition-base: 200ms ease; - --transition-slow: 300ms ease; - - /* Shadows */ - --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3); - --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4); - --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.5); - --shadow-glow: 0 0 20px rgba(99, 102, 241, 0.15); -} - -/* ─── Glassmorphism Utilities ────────────────────────────────────────────── */ - -.glass-card { - background: rgba(24, 24, 27, 0.6); /* zinc-900 with 60% opacity */ - backdrop-filter: blur(16px); - -webkit-backdrop-filter: blur(16px); - border: 1px solid rgba(63, 63, 70, 0.3); /* zinc-700 with 30% opacity */ - border-radius: var(--radius-md); - box-shadow: var(--shadow-md); -} - -.glass-card-elevated { - background: rgba(39, 39, 42, 0.7); /* zinc-800 with 70% opacity */ - backdrop-filter: blur(20px); - -webkit-backdrop-filter: blur(20px); - border: 1px solid rgba(63, 63, 70, 0.4); - border-radius: var(--radius-md); - box-shadow: var(--shadow-lg); -} - -.glass-sidebar { - background: rgba(24, 24, 27, 0.8); /* zinc-900 with 80% opacity */ - backdrop-filter: blur(24px); - -webkit-backdrop-filter: blur(24px); - border-right: 1px solid rgba(63, 63, 70, 0.3); -} - -/* ─── Background Glow Effect ─────────────────────────────────────────────── */ - -.dashboard-bg-glow { - position: relative; - background: var(--dashboard-bg); -} - -.dashboard-bg-glow::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: radial-gradient( - circle at 20% 30%, - var(--dashboard-glow-indigo) 0%, - transparent 50% - ), - radial-gradient( - circle at 80% 70%, - var(--dashboard-glow-slate) 0%, - transparent 50% - ); - pointer-events: none; - z-index: 0; -} - -.dashboard-bg-glow > * { - position: relative; - z-index: 1; -} - -/* ─── Status Badges ──────────────────────────────────────────────────────── */ - -.badge-success { - display: inline-flex; - align-items: center; - gap: var(--space-1); - padding: var(--space-1) var(--space-3); - background: rgba(16, 185, 129, 0.15); - color: var(--dashboard-success-light); - border: 1px solid rgba(16, 185, 129, 0.3); - border-radius: var(--radius-sm); - font-size: 0.75rem; - font-weight: 600; - letter-spacing: 0.025em; - text-transform: uppercase; -} - -.badge-warning { - display: inline-flex; - align-items: center; - gap: var(--space-1); - padding: var(--space-1) var(--space-3); - background: rgba(245, 158, 11, 0.15); - color: var(--dashboard-warning-light); - border: 1px solid rgba(245, 158, 11, 0.3); - border-radius: var(--radius-sm); - font-size: 0.75rem; - font-weight: 600; - letter-spacing: 0.025em; - text-transform: uppercase; -} - -.badge-error { - display: inline-flex; - align-items: center; - gap: var(--space-1); - padding: var(--space-1) var(--space-3); - background: rgba(239, 68, 68, 0.15); - color: #fca5a5; - border: 1px solid rgba(239, 68, 68, 0.3); - border-radius: var(--radius-sm); - font-size: 0.75rem; - font-weight: 600; - letter-spacing: 0.025em; - text-transform: uppercase; -} - -.badge-info { - display: inline-flex; - align-items: center; - gap: var(--space-1); - padding: var(--space-1) var(--space-3); - background: rgba(59, 130, 246, 0.15); - color: #93c5fd; - border: 1px solid rgba(59, 130, 246, 0.3); - border-radius: var(--radius-sm); - font-size: 0.75rem; - font-weight: 600; - letter-spacing: 0.025em; - text-transform: uppercase; -} - -/* ─── Progress Bars ──────────────────────────────────────────────────────── */ - -.progress-bar { - width: 100%; - height: 0.5rem; - background: rgba(39, 39, 42, 0.8); - border-radius: var(--radius-sm); - overflow: hidden; - position: relative; -} - -.progress-bar-fill { - height: 100%; - background: linear-gradient( - 90deg, - var(--dashboard-success) 0%, - var(--dashboard-success-light) 100% - ); - border-radius: var(--radius-sm); - transition: width var(--transition-base); - position: relative; - overflow: hidden; -} - -.progress-bar-fill::after { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: linear-gradient( - 90deg, - transparent 0%, - rgba(255, 255, 255, 0.2) 50%, - transparent 100% - ); - animation: shimmer 2s infinite; -} - -/* ─── Typography Utilities ───────────────────────────────────────────────── */ - -.text-mono { - font-family: var(--font-mono); - letter-spacing: -0.02em; -} - -.text-financial { - font-family: var(--font-mono); - font-weight: 600; - letter-spacing: -0.01em; - font-variant-numeric: tabular-nums; -} - -.text-address { - font-family: var(--font-mono); - font-size: 0.875rem; - color: var(--dashboard-text-secondary); - letter-spacing: -0.02em; -} - -/* ─── Interactive Elements ───────────────────────────────────────────────── */ - -.btn-primary { - display: inline-flex; - align-items: center; - justify-content: center; - gap: var(--space-2); - padding: var(--space-3) var(--space-6); - background: var(--dashboard-success); - color: white; - border: none; - border-radius: var(--radius-md); - font-weight: 600; - font-size: 0.875rem; - cursor: pointer; - transition: all var(--transition-fast); - box-shadow: 0 0 0 0 rgba(16, 185, 129, 0); -} - -.btn-primary:hover { - background: var(--dashboard-success-light); - transform: translateY(-1px); - box-shadow: 0 0 20px rgba(16, 185, 129, 0.4); -} - -.btn-primary:active { - transform: translateY(0); -} - -.btn-secondary { - display: inline-flex; - align-items: center; - justify-content: center; - gap: var(--space-2); - padding: var(--space-3) var(--space-6); - background: rgba(39, 39, 42, 0.8); - color: var(--dashboard-text-primary); - border: 1px solid var(--dashboard-border-light); - border-radius: var(--radius-md); - font-weight: 600; - font-size: 0.875rem; - cursor: pointer; - transition: all var(--transition-fast); -} - -.btn-secondary:hover { - background: rgba(63, 63, 70, 0.8); - border-color: var(--dashboard-text-secondary); -} - -.copy-button { - display: inline-flex; - align-items: center; - justify-content: center; - padding: var(--space-2); - background: rgba(39, 39, 42, 0.6); - color: var(--dashboard-text-secondary); - border: 1px solid transparent; - border-radius: var(--radius-sm); - cursor: pointer; - transition: all var(--transition-fast); -} - -.copy-button:hover { - background: rgba(63, 63, 70, 0.8); - color: var(--dashboard-text-primary); - border-color: var(--dashboard-border-light); -} - -.copy-button:active { - transform: scale(0.95); -} - -/* ─── Card Hover Effects ─────────────────────────────────────────────────── */ - -.card-interactive { - transition: all var(--transition-fast); - cursor: pointer; -} - -.card-interactive:hover { - transform: translateY(-2px); - border-color: rgba(99, 102, 241, 0.4); - box-shadow: var(--shadow-glow); -} - -/* ─── Sparkline Chart ────────────────────────────────────────────────────── */ - -.sparkline { - width: 100%; - height: 48px; -} - -.sparkline-path { - fill: none; - stroke: var(--dashboard-success); - stroke-width: 2; - stroke-linecap: round; - stroke-linejoin: round; -} - -.sparkline-area { - fill: url(#sparkline-gradient); - opacity: 0.2; -} - -/* ─── Sidebar Navigation ─────────────────────────────────────────────────── */ - -.nav-item { - display: flex; - align-items: center; - gap: var(--space-3); - padding: var(--space-3) var(--space-4); - color: var(--dashboard-text-secondary); - border-radius: var(--radius-md); - font-weight: 500; - font-size: 0.875rem; - transition: all var(--transition-fast); - cursor: pointer; - position: relative; -} - -.nav-item::before { - content: ''; - position: absolute; - left: 0; - top: 50%; - transform: translateY(-50%); - width: 3px; - height: 0; - background: var(--dashboard-success); - border-radius: 0 2px 2px 0; - transition: height var(--transition-fast); -} - -.nav-item:hover { - background: rgba(39, 39, 42, 0.6); - color: var(--dashboard-text-primary); -} - -.nav-item.active { - background: rgba(16, 185, 129, 0.1); - color: var(--dashboard-success-light); -} - -.nav-item.active::before { - height: 60%; -} - -/* ─── Responsive Grid ────────────────────────────────────────────────────── */ - -.dashboard-grid { - display: grid; - gap: var(--space-6); - grid-template-columns: 1fr; -} - -@media (min-width: 768px) { - .dashboard-grid { - grid-template-columns: repeat(2, 1fr); - } -} - -@media (min-width: 1280px) { - .dashboard-grid { - grid-template-columns: repeat(3, 1fr); - } -} - -/* ─── Animations ─────────────────────────────────────────────────────────── */ - -@keyframes fadeIn { - from { - opacity: 0; - transform: translateY(10px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.animate-fade-in { - animation: fadeIn 0.3s ease-out; -} - -@keyframes pulse-glow { - 0%, 100% { - box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.4); - } - 50% { - box-shadow: 0 0 20px 4px rgba(16, 185, 129, 0.2); - } -} - -.animate-pulse-glow { - animation: pulse-glow 2s ease-in-out infinite; -} - -/* ─── Scrollbar Styling ──────────────────────────────────────────────────── */ - -.custom-scrollbar::-webkit-scrollbar { - width: 8px; - height: 8px; -} - -.custom-scrollbar::-webkit-scrollbar-track { - background: rgba(24, 24, 27, 0.4); - border-radius: var(--radius-sm); -} - -.custom-scrollbar::-webkit-scrollbar-thumb { - background: rgba(63, 63, 70, 0.6); - border-radius: var(--radius-sm); -} - -.custom-scrollbar::-webkit-scrollbar-thumb:hover { - background: rgba(82, 82, 91, 0.8); -} - -/* ─── Print Styles ───────────────────────────────────────────────────────── */ - -@media print { - .glass-card, - .glass-card-elevated, - .glass-sidebar { - background: white; - border: 1px solid #000; - } - - .dashboard-bg-glow::before { - display: none; - } -} +/** + * Freelancer Dashboard Design System + * + * A strict design system for Web3 freelancer interfaces + * Balances "Technical Trust" with "Modern Web3" aesthetics + */ + +/* ─── Color Tokens ───────────────────────────────────────────────────────── */ + +:root { + /* Base Colors */ + --dashboard-bg: #09090b; /* zinc-950 */ + --dashboard-surface: #18181b; /* zinc-900 */ + --dashboard-surface-elevated: #27272a; /* zinc-800 */ + + /* Status Colors */ + --dashboard-success: #10b981; /* emerald-500 */ + --dashboard-success-light: #34d399; /* emerald-400 */ + --dashboard-success-dark: #059669; /* emerald-600 */ + + --dashboard-warning: #f59e0b; /* amber-500 */ + --dashboard-warning-light: #fbbf24; /* amber-400 */ + --dashboard-warning-dark: #d97706; /* amber-600 */ + + --dashboard-error: #ef4444; /* red-500 */ + --dashboard-info: #3b82f6; /* blue-500 */ + + /* Text Colors */ + --dashboard-text-primary: #fafafa; /* zinc-50 */ + --dashboard-text-secondary: #a1a1aa; /* zinc-400 */ + --dashboard-text-tertiary: #71717a; /* zinc-500 */ + + /* Border Colors */ + --dashboard-border: #27272a; /* zinc-800 */ + --dashboard-border-light: #3f3f46; /* zinc-700 */ + + /* Glow Effect */ + --dashboard-glow-indigo: rgba(99, 102, 241, 0.08); + --dashboard-glow-slate: rgba(148, 163, 184, 0.05); + + /* Spacing Grid (8px base) */ + --space-1: 0.25rem; /* 4px */ + --space-2: 0.5rem; /* 8px */ + --space-3: 0.75rem; /* 12px */ + --space-4: 1rem; /* 16px */ + --space-5: 1.25rem; /* 20px */ + --space-6: 1.5rem; /* 24px */ + --space-8: 2rem; /* 32px */ + --space-10: 2.5rem; /* 40px */ + --space-12: 3rem; /* 48px */ + + /* Border Radius */ + --radius-sm: 0.5rem; /* 8px */ + --radius-md: 0.75rem; /* 12px */ + --radius-lg: 1rem; /* 16px */ + --radius-xl: 1.5rem; /* 24px */ + + /* Typography */ + --font-sans: 'Inter', 'Geist', ui-sans-serif, system-ui, sans-serif; + --font-mono: 'Geist Mono', 'SF Mono', 'Fira Code', ui-monospace, monospace; + + /* Transitions */ + --transition-fast: 150ms ease; + --transition-base: 200ms ease; + --transition-slow: 300ms ease; + + /* Shadows */ + --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3); + --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.5); + --shadow-glow: 0 0 20px rgba(99, 102, 241, 0.15); +} + +/* ─── Glassmorphism Utilities ────────────────────────────────────────────── */ + +.glass-card { + background: rgba(24, 24, 27, 0.6); /* zinc-900 with 60% opacity */ + backdrop-filter: blur(16px); + -webkit-backdrop-filter: blur(16px); + border: 1px solid rgba(63, 63, 70, 0.3); /* zinc-700 with 30% opacity */ + border-radius: var(--radius-md); + box-shadow: var(--shadow-md); +} + +.glass-card-elevated { + background: rgba(39, 39, 42, 0.7); /* zinc-800 with 70% opacity */ + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border: 1px solid rgba(63, 63, 70, 0.4); + border-radius: var(--radius-md); + box-shadow: var(--shadow-lg); +} + +.glass-sidebar { + background: rgba(24, 24, 27, 0.8); /* zinc-900 with 80% opacity */ + backdrop-filter: blur(24px); + -webkit-backdrop-filter: blur(24px); + border-right: 1px solid rgba(63, 63, 70, 0.3); +} + +/* ─── Background Glow Effect ─────────────────────────────────────────────── */ + +.dashboard-bg-glow { + position: relative; + background: var(--dashboard-bg); +} + +.dashboard-bg-glow::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: radial-gradient( + circle at 20% 30%, + var(--dashboard-glow-indigo) 0%, + transparent 50% + ), + radial-gradient( + circle at 80% 70%, + var(--dashboard-glow-slate) 0%, + transparent 50% + ); + pointer-events: none; + z-index: 0; +} + +.dashboard-bg-glow > * { + position: relative; + z-index: 1; +} + +/* ─── Status Badges ──────────────────────────────────────────────────────── */ + +.badge-success { + display: inline-flex; + align-items: center; + gap: var(--space-1); + padding: var(--space-1) var(--space-3); + background: rgba(16, 185, 129, 0.15); + color: var(--dashboard-success-light); + border: 1px solid rgba(16, 185, 129, 0.3); + border-radius: var(--radius-sm); + font-size: 0.75rem; + font-weight: 600; + letter-spacing: 0.025em; + text-transform: uppercase; +} + +.badge-warning { + display: inline-flex; + align-items: center; + gap: var(--space-1); + padding: var(--space-1) var(--space-3); + background: rgba(245, 158, 11, 0.15); + color: var(--dashboard-warning-light); + border: 1px solid rgba(245, 158, 11, 0.3); + border-radius: var(--radius-sm); + font-size: 0.75rem; + font-weight: 600; + letter-spacing: 0.025em; + text-transform: uppercase; +} + +.badge-error { + display: inline-flex; + align-items: center; + gap: var(--space-1); + padding: var(--space-1) var(--space-3); + background: rgba(239, 68, 68, 0.15); + color: #fca5a5; + border: 1px solid rgba(239, 68, 68, 0.3); + border-radius: var(--radius-sm); + font-size: 0.75rem; + font-weight: 600; + letter-spacing: 0.025em; + text-transform: uppercase; +} + +.badge-info { + display: inline-flex; + align-items: center; + gap: var(--space-1); + padding: var(--space-1) var(--space-3); + background: rgba(59, 130, 246, 0.15); + color: #93c5fd; + border: 1px solid rgba(59, 130, 246, 0.3); + border-radius: var(--radius-sm); + font-size: 0.75rem; + font-weight: 600; + letter-spacing: 0.025em; + text-transform: uppercase; +} + +/* ─── Progress Bars ──────────────────────────────────────────────────────── */ + +.progress-bar { + width: 100%; + height: 0.5rem; + background: rgba(39, 39, 42, 0.8); + border-radius: var(--radius-sm); + overflow: hidden; + position: relative; +} + +.progress-bar-fill { + height: 100%; + background: linear-gradient( + 90deg, + var(--dashboard-success) 0%, + var(--dashboard-success-light) 100% + ); + border-radius: var(--radius-sm); + transition: width var(--transition-base); + position: relative; + overflow: hidden; +} + +.progress-bar-fill::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient( + 90deg, + transparent 0%, + rgba(255, 255, 255, 0.2) 50%, + transparent 100% + ); + animation: shimmer 2s infinite; +} + +/* ─── Typography Utilities ───────────────────────────────────────────────── */ + +.text-mono { + font-family: var(--font-mono); + letter-spacing: -0.02em; +} + +.text-financial { + font-family: var(--font-mono); + font-weight: 600; + letter-spacing: -0.01em; + font-variant-numeric: tabular-nums; +} + +.text-address { + font-family: var(--font-mono); + font-size: 0.875rem; + color: var(--dashboard-text-secondary); + letter-spacing: -0.02em; +} + +/* ─── Interactive Elements ───────────────────────────────────────────────── */ + +.btn-primary { + display: inline-flex; + align-items: center; + justify-content: center; + gap: var(--space-2); + padding: var(--space-3) var(--space-6); + background: var(--dashboard-success); + color: white; + border: none; + border-radius: var(--radius-md); + font-weight: 600; + font-size: 0.875rem; + cursor: pointer; + transition: all var(--transition-fast); + box-shadow: 0 0 0 0 rgba(16, 185, 129, 0); +} + +.btn-primary:hover { + background: var(--dashboard-success-light); + transform: translateY(-1px); + box-shadow: 0 0 20px rgba(16, 185, 129, 0.4); +} + +.btn-primary:active { + transform: translateY(0); +} + +.btn-secondary { + display: inline-flex; + align-items: center; + justify-content: center; + gap: var(--space-2); + padding: var(--space-3) var(--space-6); + background: rgba(39, 39, 42, 0.8); + color: var(--dashboard-text-primary); + border: 1px solid var(--dashboard-border-light); + border-radius: var(--radius-md); + font-weight: 600; + font-size: 0.875rem; + cursor: pointer; + transition: all var(--transition-fast); +} + +.btn-secondary:hover { + background: rgba(63, 63, 70, 0.8); + border-color: var(--dashboard-text-secondary); +} + +.copy-button { + display: inline-flex; + align-items: center; + justify-content: center; + padding: var(--space-2); + background: rgba(39, 39, 42, 0.6); + color: var(--dashboard-text-secondary); + border: 1px solid transparent; + border-radius: var(--radius-sm); + cursor: pointer; + transition: all var(--transition-fast); +} + +.copy-button:hover { + background: rgba(63, 63, 70, 0.8); + color: var(--dashboard-text-primary); + border-color: var(--dashboard-border-light); +} + +.copy-button:active { + transform: scale(0.95); +} + +/* ─── Card Hover Effects ─────────────────────────────────────────────────── */ + +.card-interactive { + transition: all var(--transition-fast); + cursor: pointer; +} + +.card-interactive:hover { + transform: translateY(-2px); + border-color: rgba(99, 102, 241, 0.4); + box-shadow: var(--shadow-glow); +} + +/* ─── Sparkline Chart ────────────────────────────────────────────────────── */ + +.sparkline { + width: 100%; + height: 48px; +} + +.sparkline-path { + fill: none; + stroke: var(--dashboard-success); + stroke-width: 2; + stroke-linecap: round; + stroke-linejoin: round; +} + +.sparkline-area { + fill: url(#sparkline-gradient); + opacity: 0.2; +} + +/* ─── Sidebar Navigation ─────────────────────────────────────────────────── */ + +.nav-item { + display: flex; + align-items: center; + gap: var(--space-3); + padding: var(--space-3) var(--space-4); + color: var(--dashboard-text-secondary); + border-radius: var(--radius-md); + font-weight: 500; + font-size: 0.875rem; + transition: all var(--transition-fast); + cursor: pointer; + position: relative; +} + +.nav-item::before { + content: ''; + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%); + width: 3px; + height: 0; + background: var(--dashboard-success); + border-radius: 0 2px 2px 0; + transition: height var(--transition-fast); +} + +.nav-item:hover { + background: rgba(39, 39, 42, 0.6); + color: var(--dashboard-text-primary); +} + +.nav-item.active { + background: rgba(16, 185, 129, 0.1); + color: var(--dashboard-success-light); +} + +.nav-item.active::before { + height: 60%; +} + +/* ─── Responsive Grid ────────────────────────────────────────────────────── */ + +.dashboard-grid { + display: grid; + gap: var(--space-6); + grid-template-columns: 1fr; +} + +@media (min-width: 768px) { + .dashboard-grid { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (min-width: 1280px) { + .dashboard-grid { + grid-template-columns: repeat(3, 1fr); + } +} + +/* ─── Animations ─────────────────────────────────────────────────────────── */ + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.animate-fade-in { + animation: fadeIn 0.3s ease-out; +} + +@keyframes pulse-glow { + 0%, 100% { + box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.4); + } + 50% { + box-shadow: 0 0 20px 4px rgba(16, 185, 129, 0.2); + } +} + +.animate-pulse-glow { + animation: pulse-glow 2s ease-in-out infinite; +} + +/* ─── Scrollbar Styling ──────────────────────────────────────────────────── */ + +.custom-scrollbar::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +.custom-scrollbar::-webkit-scrollbar-track { + background: rgba(24, 24, 27, 0.4); + border-radius: var(--radius-sm); +} + +.custom-scrollbar::-webkit-scrollbar-thumb { + background: rgba(63, 63, 70, 0.6); + border-radius: var(--radius-sm); +} + +.custom-scrollbar::-webkit-scrollbar-thumb:hover { + background: rgba(82, 82, 91, 0.8); +} + +/* ─── Print Styles ───────────────────────────────────────────────────────── */ + +@media print { + .glass-card, + .glass-card-elevated, + .glass-sidebar { + background: white; + border: 1px solid #000; + } + + .dashboard-bg-glow::before { + display: none; + } +} diff --git a/apps/web/app/dashboard/freelancer/page.tsx b/apps/web/app/dashboard/freelancer/page.tsx index e0847b06..5cf98f75 100644 --- a/apps/web/app/dashboard/freelancer/page.tsx +++ b/apps/web/app/dashboard/freelancer/page.tsx @@ -1,262 +1,262 @@ -"use client"; - -/** - * Freelancer Dashboard - Main dashboard page - * - * A professional Web3 freelancer interface with: - * - Glassmorphic design - * - Strict 8px/4px spacing grid - * - Zinc-950 background with subtle glow - * - Emerald/Amber status colors - * - Responsive grid layout - */ - -import { useState } from "react"; -import { SidebarNavigation } from "@/components/dashboard/sidebar-navigation"; -import { EarningsOverviewCard } from "@/components/dashboard/earnings-overview-card"; -import { ProjectCard } from "@/components/dashboard/project-card"; -import { ReputationWidget } from "@/components/dashboard/reputation-widget"; -import { Plus, Filter, Search } from "lucide-react"; - -// Mock data - replace with real data from API -const mockEarningsData = { - totalEarnings: 45250.75, - pendingPayouts: 3500.00, - recentIncome: [2100, 2800, 2400, 3200, 2900, 3500, 4100, 3800, 4500, 4200, 3900, 3500], - currency: "USDC", -}; - -const mockProjects = [ - { - id: "1", - name: "DeFi Dashboard Development", - clientAddress: "GXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", - status: "active" as const, - milestonesCompleted: 3, - totalMilestones: 5, - budget: 8500, - deadline: "2026-05-15", - currency: "USDC", - }, - { - id: "2", - name: "Smart Contract Audit", - clientAddress: "GYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY", - status: "pending" as const, - milestonesCompleted: 1, - totalMilestones: 3, - budget: 5000, - deadline: "2026-05-30", - currency: "USDC", - }, - { - id: "3", - name: "NFT Marketplace Frontend", - clientAddress: "GZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ", - status: "success" as const, - milestonesCompleted: 4, - totalMilestones: 4, - budget: 12000, - deadline: "2026-04-20", - currency: "USDC", - }, - { - id: "4", - name: "Token Swap Integration", - clientAddress: "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - status: "active" as const, - milestonesCompleted: 2, - totalMilestones: 6, - budget: 7500, - deadline: "2026-06-10", - currency: "USDC", - }, - { - id: "5", - name: "Wallet Connect Implementation", - clientAddress: "GBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", - status: "pending" as const, - milestonesCompleted: 0, - totalMilestones: 2, - budget: 3000, - deadline: "2026-05-25", - currency: "USDC", - }, -]; - -const mockReputationData = { - rating: 4.8, - totalReviews: 47, - completedProjects: 52, - successRate: 98, - skills: ["Solidity", "React", "TypeScript", "Web3.js", "Smart Contracts", "DeFi"], - badges: ["Top Rated", "Fast Delivery", "Expert Verified"], -}; - -export default function FreelancerDashboard() { - const [activeNav, setActiveNav] = useState("dashboard"); - const [searchQuery, setSearchQuery] = useState(""); - - const handleViewProject = (projectId: string) => { - console.log("View project:", projectId); - // Navigate to project details - }; - - const filteredProjects = mockProjects.filter((project) => - project.name.toLowerCase().includes(searchQuery.toLowerCase()) - ); - - return ( -
- {/* Sidebar */} - - - {/* Main Content */} -
- {/* Header */} -
-

- Welcome back, Freelancer -

-

- Here's what's happening with your projects today. -

-
- - {/* Top Stats Row */} -
- {/* Earnings Overview - Spans 2 columns on large screens */} -
- -
- - {/* Quick Stats */} -
-

Quick Stats

-
-
-
- Active Projects - - {mockProjects.filter(p => p.status === "active").length} - -
-
-
-
- Pending - - {mockProjects.filter(p => p.status === "pending").length} - -
-
-
-
- Completed - - {mockProjects.filter(p => p.status === "success").length} - -
-
-
-
-
- - {/* Projects Section */} -
-
-

- Active Projects -

-
- {/* Search */} -
- - setSearchQuery(e.target.value)} - className="pl-10 pr-4 py-2 bg-zinc-900/60 border border-zinc-800 rounded-lg text-zinc-100 text-sm placeholder:text-zinc-500 focus:outline-none focus:border-emerald-500/50 transition-colors" - /> -
- - {/* Filter Button */} - - - {/* New Project Button */} - -
-
- - {/* Projects Grid */} -
- {filteredProjects.map((project, index) => ( -
- -
- ))} - -
- - {filteredProjects.length === 0 && ( -
-

No projects found matching your search.

-
- )} -
- - {/* Reputation Section */} -
-
- -
- - {/* Recent Activity */} -
-

- Recent Activity -

-
- {[ - { action: "Milestone completed", project: "DeFi Dashboard", time: "2 hours ago" }, - { action: "Payment received", project: "NFT Marketplace", time: "5 hours ago" }, - { action: "New message", project: "Smart Contract Audit", time: "1 day ago" }, - { action: "Review received", project: "Token Swap", time: "2 days ago" }, - ].map((activity, index) => ( -
-
-
-

{activity.action}

-

{activity.project}

-
- - {activity.time} - -
- ))} -
-
-
-
-
- ); -} +"use client"; + +/** + * Freelancer Dashboard - Main dashboard page + * + * A professional Web3 freelancer interface with: + * - Glassmorphic design + * - Strict 8px/4px spacing grid + * - Zinc-950 background with subtle glow + * - Emerald/Amber status colors + * - Responsive grid layout + */ + +import { useState } from "react"; +import { SidebarNavigation } from "@/components/dashboard/sidebar-navigation"; +import { EarningsOverviewCard } from "@/components/dashboard/earnings-overview-card"; +import { ProjectCard } from "@/components/dashboard/project-card"; +import { ReputationWidget } from "@/components/dashboard/reputation-widget"; +import { Plus, Filter, Search } from "lucide-react"; + +// Mock data - replace with real data from API +const mockEarningsData = { + totalEarnings: 45250.75, + pendingPayouts: 3500.00, + recentIncome: [2100, 2800, 2400, 3200, 2900, 3500, 4100, 3800, 4500, 4200, 3900, 3500], + currency: "USDC", +}; + +const mockProjects = [ + { + id: "1", + name: "DeFi Dashboard Development", + clientAddress: "GXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", + status: "active" as const, + milestonesCompleted: 3, + totalMilestones: 5, + budget: 8500, + deadline: "2026-05-15", + currency: "USDC", + }, + { + id: "2", + name: "Smart Contract Audit", + clientAddress: "GYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY", + status: "pending" as const, + milestonesCompleted: 1, + totalMilestones: 3, + budget: 5000, + deadline: "2026-05-30", + currency: "USDC", + }, + { + id: "3", + name: "NFT Marketplace Frontend", + clientAddress: "GZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ", + status: "success" as const, + milestonesCompleted: 4, + totalMilestones: 4, + budget: 12000, + deadline: "2026-04-20", + currency: "USDC", + }, + { + id: "4", + name: "Token Swap Integration", + clientAddress: "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + status: "active" as const, + milestonesCompleted: 2, + totalMilestones: 6, + budget: 7500, + deadline: "2026-06-10", + currency: "USDC", + }, + { + id: "5", + name: "Wallet Connect Implementation", + clientAddress: "GBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + status: "pending" as const, + milestonesCompleted: 0, + totalMilestones: 2, + budget: 3000, + deadline: "2026-05-25", + currency: "USDC", + }, +]; + +const mockReputationData = { + rating: 4.8, + totalReviews: 47, + completedProjects: 52, + successRate: 98, + skills: ["Solidity", "React", "TypeScript", "Web3.js", "Smart Contracts", "DeFi"], + badges: ["Top Rated", "Fast Delivery", "Expert Verified"], +}; + +export default function FreelancerDashboard() { + const [activeNav, setActiveNav] = useState("dashboard"); + const [searchQuery, setSearchQuery] = useState(""); + + const handleViewProject = (projectId: string) => { + console.log("View project:", projectId); + // Navigate to project details + }; + + const filteredProjects = mockProjects.filter((project) => + project.name.toLowerCase().includes(searchQuery.toLowerCase()) + ); + + return ( +
+ {/* Sidebar */} + + + {/* Main Content */} +
+ {/* Header */} +
+

+ Welcome back, Freelancer +

+

+ Here's what's happening with your projects today. +

+
+ + {/* Top Stats Row */} +
+ {/* Earnings Overview - Spans 2 columns on large screens */} +
+ +
+ + {/* Quick Stats */} +
+

Quick Stats

+
+
+
+ Active Projects + + {mockProjects.filter(p => p.status === "active").length} + +
+
+
+
+ Pending + + {mockProjects.filter(p => p.status === "pending").length} + +
+
+
+
+ Completed + + {mockProjects.filter(p => p.status === "success").length} + +
+
+
+
+
+ + {/* Projects Section */} +
+
+

+ Active Projects +

+
+ {/* Search */} +
+ + setSearchQuery(e.target.value)} + className="pl-10 pr-4 py-2 bg-zinc-900/60 border border-zinc-800 rounded-lg text-zinc-100 text-sm placeholder:text-zinc-500 focus:outline-none focus:border-emerald-500/50 transition-colors" + /> +
+ + {/* Filter Button */} + + + {/* New Project Button */} + +
+
+ + {/* Projects Grid */} +
+ {filteredProjects.map((project, index) => ( +
+ +
+ ))} + +
+ + {filteredProjects.length === 0 && ( +
+

No projects found matching your search.

+
+ )} +
+ + {/* Reputation Section */} +
+
+ +
+ + {/* Recent Activity */} +
+

+ Recent Activity +

+
+ {[ + { action: "Milestone completed", project: "DeFi Dashboard", time: "2 hours ago" }, + { action: "Payment received", project: "NFT Marketplace", time: "5 hours ago" }, + { action: "New message", project: "Smart Contract Audit", time: "1 day ago" }, + { action: "Review received", project: "Token Swap", time: "2 days ago" }, + ].map((activity, index) => ( +
+
+
+

{activity.action}

+

{activity.project}

+
+ + {activity.time} + +
+ ))} +
+
+
+
+
+ ); +} diff --git a/apps/web/app/demo/transaction-modal/page.tsx b/apps/web/app/demo/transaction-modal/page.tsx index 3deeb8f4..6852caa5 100644 --- a/apps/web/app/demo/transaction-modal/page.tsx +++ b/apps/web/app/demo/transaction-modal/page.tsx @@ -1,19 +1,19 @@ -/** - * Transaction Status Modal Demo Page - * - * Interactive demonstration of the TransactionStatusModal component - * with various scenarios and use cases. - * - * Access at: /demo/transaction-modal - */ - -import { TransactionModalDemo } from "@/components/transaction/example-integration"; - -export default function TransactionModalDemoPage() { - return ; -} - -export const metadata = { - title: "Transaction Status Modal Demo", - description: "Interactive demonstration of blockchain transaction lifecycle interface", -}; +/** + * Transaction Status Modal Demo Page + * + * Interactive demonstration of the TransactionStatusModal component + * with various scenarios and use cases. + * + * Access at: /demo/transaction-modal + */ + +import { TransactionModalDemo } from "@/components/transaction/example-integration"; + +export default function TransactionModalDemoPage() { + return ; +} + +export const metadata = { + title: "Transaction Status Modal Demo", + description: "Interactive demonstration of blockchain transaction lifecycle interface", +}; diff --git a/apps/web/app/disputes/[id]/layout.tsx b/apps/web/app/disputes/[id]/layout.tsx index 7fabc16e..b71688a6 100644 --- a/apps/web/app/disputes/[id]/layout.tsx +++ b/apps/web/app/disputes/[id]/layout.tsx @@ -1,9 +1,9 @@ -import { WalletGuard } from "@/components/state/wallet-guard"; - -export default function DisputesLayout({ - children, -}: { - children: React.ReactNode; -}) { - return {children}; +import { WalletGuard } from "@/components/state/wallet-guard"; + +export default function DisputesLayout({ + children, +}: { + children: React.ReactNode; +}) { + return {children}; } \ No newline at end of file diff --git a/apps/web/app/disputes/[id]/page.tsx b/apps/web/app/disputes/[id]/page.tsx index 23d8ad65..f7e80882 100644 --- a/apps/web/app/disputes/[id]/page.tsx +++ b/apps/web/app/disputes/[id]/page.tsx @@ -1,224 +1,224 @@ -"use client"; - -import Link from "next/link"; -import { useParams } from "next/navigation"; -import { FormEvent, useEffect, useState } from "react"; - -import { api, type Dispute, type Evidence, type Verdict } from "@/lib/api"; -import { connectWallet, signTransaction } from "@/lib/stellar"; - -export default function DisputePage() { - const params = useParams<{ id: string }>(); - const disputeId = params.id; - - const [dispute, setDispute] = useState(null); - const [verdict, setVerdict] = useState(null); - const [walletAddress, setWalletAddress] = useState(""); - const [signature, setSignature] = useState(""); - const [evidence, setEvidence] = useState(null); - const [content, setContent] = useState( - "Freelancer uploaded timestamped delivery proof and reviewer notes.", - ); - const [status, setStatus] = useState("Loading dispute state..."); - const [isSubmitting, setIsSubmitting] = useState(false); - - useEffect(() => { - let active = true; - - async function loadDispute() { - try { - const [nextDispute, nextVerdict] = await Promise.all([ - api.disputes.get(disputeId), - api.disputes.verdict(disputeId), - ]); - - if (!active) { - return; - } - - setDispute(nextDispute); - setVerdict(nextVerdict); - setStatus("Dispute loaded. Evidence can now be signed and submitted."); - } catch (error) { - if (!active) { - return; - } - - setStatus( - error instanceof Error ? error.message : "Unable to load dispute.", - ); - } - } - - void loadDispute(); - - return () => { - active = false; - }; - }, [disputeId]); - - async function ensureWallet(): Promise { - if (walletAddress) { - return walletAddress; - } - - const address = await connectWallet(); - setWalletAddress(address); - return address; - } - - async function onSubmitEvidence(event: FormEvent) { - event.preventDefault(); - setIsSubmitting(true); - setStatus("Connecting wallet for evidence approval..."); - - try { - const address = await ensureWallet(); - setStatus("Signing evidence receipt..."); - - const signed = await signTransaction( - JSON.stringify({ - action: "submit_evidence", - dispute_id: disputeId, - submitted_by: address, - content, - }), - ); - - setSignature(signed); - setStatus("Signature approved. Sending evidence to mocked backend..."); - - const savedEvidence = await api.disputes.evidence.submit(disputeId, { - submitted_by: address, - content, - file_hash: "bafybeigdyrdeterministicevidence", - }); - - setEvidence(savedEvidence); - setStatus("Evidence stored. UI reflects the signed submission."); - } catch (error) { - setStatus( - error instanceof Error ? error.message : "Evidence submission failed.", - ); - } finally { - setIsSubmitting(false); - } - } - - return ( -
-
-
- - Back to jobs - -

- Dispute Workspace -

-

Dispute Verdict

-

{status}

-
- -
-
-

Case Snapshot

-
-
-
- Dispute ID -
-
{dispute?.id ?? disputeId}
-
-
-
- Opened by -
-
{dispute?.opened_by ?? "Loading..."}
-
-
-
- Verdict -
-
- {verdict - ? `${verdict.winner} · ${verdict.freelancer_share_bps} bps` - : "Pending"} -
-
-
-
- Reasoning -
-
{verdict?.reasoning ?? "Loading..."}
-
-
-
- Settlement Tx -
-
{verdict?.on_chain_tx ?? "Pending"}
-
-
-
- Wallet -
-
{walletAddress || "Not connected"}
-
-
-
- Signed payload -
-
- {signature || "Awaiting wallet approval"} -
-
-
-
- -
-

Submit Evidence

-

- The test suite injects a mock Freighter-compatible wallet and signs - this evidence payload in-browser before the request is accepted. -

- -
-