Skip to content

feat: implement JWT auth, organizer profiles, Soroban listener, and currency rates#559

Merged
Yunusabdul38 merged 7 commits into
Agora-Events:mainfrom
Divine-designs:Contract1
May 4, 2026
Merged

feat: implement JWT auth, organizer profiles, Soroban listener, and currency rates#559
Yunusabdul38 merged 7 commits into
Agora-Events:mainfrom
Divine-designs:Contract1

Conversation

@Divine-designs
Copy link
Copy Markdown
Contributor

@Divine-designs Divine-designs commented Apr 28, 2026

PR Description
Description:

This PR implements four features across the Rust backend and Next.js frontend:

#484 — JWT Authentication Challenge-response flow: backend issues a random nonce, frontend signs it with the Stellar wallet's Ed25519 key, backend verifies the signature and issues a 24-hour JWT. Protected routes extract user_address from the Authorization: Bearer header. Nonces are stored in a new jwt_nonces table with 5-minute expiry and single-use enforcement.

#486 — Organizer Profile Management New organizer_profiles table keyed by Stellar wallet address. PUT /api/v1/profile upserts the profile with validation (display_name ≤ 50 chars, bio ≤ 500 chars). Profile data is returned in GET /api/v1/events/:id responses. Mirrored in the Next.js app at PUT /api/profile.

#490 — Soroban Event Listener Background task that long-polls the Stellar RPC getEvents endpoint every 5 seconds. Parses ticket_purchased, ticket_refunded, event_registered, and event_status_updated events. Re-org protection via MIN_CONFIRMATIONS = 2. Idempotent upserts on stellar_id.

#495 — Multiple Currency Support GET /api/v1/rates fetches USDC conversion rates from CoinGecko for 10 currencies (USD, NGN, EUR, GBP, KES, GHS, ZAR, CAD, AUD, JPY), cached in Redis for 60 seconds. Proxied to the frontend at GET /api/rates with a static fallback.

Also fixes pre-existing clippy and fmt issues across the server and contracts.

Checklist:

Closes #484
Closes #486
Closes #490
Closes #495

@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 28, 2026

@Divine-designs is attempting to deploy a commit to the oseh-svg's projects Team on Vercel.

A member of the Team first needs to authorize it.

@Divine-designs Divine-designs marked this pull request as ready for review April 29, 2026 01:12
@drips-wave
Copy link
Copy Markdown

drips-wave Bot commented May 4, 2026

@Divine-designs Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits.

You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀

Learn more about application limits

@Divine-designs Divine-designs changed the title chore: adjust fixes and setup feat: implement JWT auth, organizer profiles, Soroban listener, and currency rates May 4, 2026
@Divine-designs
Copy link
Copy Markdown
Contributor Author

done


## Test plan

- [x] All 226 event-registry tests pass
- [x] All 143 ticket-payment tests pass
- [x] Archive eligibility boundary condition verified (exactly 30 days fails, 30 days + 1s succeeds)
- [x] Referral reward calculation assertion updated to match contract behavior

@Divine-designs
Copy link
Copy Markdown
Contributor Author

More instances of tests passing


test result: ok. 226 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.69s

     Running unittests src/lib.rs (target/debug/deps/ticket_payment-78afcf555487fb39)

running 143 tests
test test::test_add_discount_hashes_and_invalid_code_rejected ... ok
test test::test_bulk_refund_rejected_for_active_event ... ok
test test::test_add_remove_token_whitelist ... ok
test test::test_affiliate_reward_capped_at_platform_fee ... ok
test test::test_cannot_remove_last_governor ... ok
test test::test_admin_refund_during_dispute ... ok
test test::test_claim_revenue_dust_swept_in_full ... ok
test test::test_bulk_refund_batching ... ok
test test::test_claim_revenue_above_dust_threshold_normal_behavior ... ok
test test::test_bulk_refund_success ... ok
test test::test_claim_automatic_refund_success ... ok
test test::test_claim_revenue_paused ... ok
test test::test_close_auction_rejects_early_closure ... ok
test test::test_day_calculation_same_day_shares_bucket ... ok
test test::test_affiliate_a_10pct_affiliate_b_5pct_same_event ... ok
test test::test_batch_purchase_success ... ok
test test::test_close_auction_rejects_when_no_bids_exist ... ok
test test::test_claim_revenue_rejects_event_not_marked_inactive ... ok
test test::test_discount_code_expired_returns_error ... ok
test test::test_confirm_payment ... ok
test test::test_close_auction_rejects_double_closure ... ok
test test::test_discount_code_invalid_code_returns_error ... ok
test test::test_create_and_apply_discount_code ... ok
test test::test_double_initialization_fails ... ok
test test::test_gas_profile_process_payment_budget ... ok
test test::test_discount_code_price_calculation ... ok
test test::test_early_bird_pricing_active ... ok
test test::test_get_asset_price_returns_oracle_price ... ok
test test::test_discount_code_max_uses_reached_returns_error ... ok
test test::test_get_asset_price_rejects_stale_oracle_price ... ok
test test::test_discount_code_one_time_use ... ok
test test::test_dispute_blocks_withdrawal ... ok
test test::test_get_payments_by_status_empty ... ok
test test::test_get_payments_by_status_all_statuses ... ok
test test::test_fee_calculation_variants ... ok
test test::test_early_bird_pricing_expired ... ok
test test::test_governance_can_update_withdrawal_cap ... ok
test test::test_get_payments_by_status_single_payment ... ok
test test::test_governance_propose_and_execute_time_lock ... ok
test test::test_governance_add_governor_requires_new_threshold ... ok
test test::test_governance_rejects_slippage_above_fifty_percent ... ok
test test::test_initialize_invalid_address ... ok
test test::test_initialize_success ... ok
test test::test_initialize_zero_platform_wallet_rejected ... ok
test test::test_governance_unauthorized_propose_and_vote ... ok
test test::test_get_payments_by_status_multiple_events ... ok
test test::test_get_payments_by_status_with_refunds ... ok
test test::test_governance_remove_governor ... ok
test test::test_get_payments_by_status_multiple_payments ... ok
test test::test_is_paused ... ok
test test::test_inventory_increment_on_successful_payment ... ok
test test::test_get_daily_withdrawn_amount_returns_zero_for_new_day ... ok
test test::test_loyalty_discount_is_capped_by_platform_fee ... ok
test test::test_integration_edge_cases ... ok
test test::test_loyalty_discount_reduces_platform_fee ... ok
test test::test_place_bid_rejects_bid_below_min_increment ... ok
test test::test_no_referral_reward_without_referrer ... ok
test test::test_no_cap_allows_unlimited_withdrawal ... ok
test test::test_payment_without_loyalty_discount_unchanged ... ok
test test::test_process_payment_extremely_high_ticket_price ... ok
test test::test_process_payment_max_supply_exceeded ... ok
test test::test_platform_fee_withdrawal_with_cap ... ok
test test::test_integration_full_platform_day ... ok
test test::test_process_payment_not_found ... ok
test test::test_process_payment_ignores_loyalty_update_failure ... ok
test test::test_process_payment_paused ... ok
test test::test_partial_refund_multi_batch_index_persisted ... ok
test test::test_partial_withdrawals_accumulate_within_day ... ok
test test::test_price_switched_event_emitted_exactly_once ... ok
test test::test_process_payment_no_code_unchanged ... ok
test test::test_process_payment_success ... ok
test test::test_process_payment_with_non_whitelisted_token ... ok
test test::test_process_payment_with_custom_fee ... ok
test test::test_proposal_expiry_blocks_execute ... ok
test test::test_process_payment_zero_amount - should panic ... ok
test test::test_proposal_executes_before_expiry ... ok
test test::test_process_payment_with_valid_discount_code ... ok
test test::test_proposal_expiry_blocks_vote ... ok
test test::test_integration_concurrent_multi_guest_sales_no_state_corruption ... ok
test test::test_process_payment_respects_event_specific_token ... ok
test test::test_refund_paused ... ok
test test::test_referral_reward_does_not_exceed_platform_fee_invariant ... ok
test test::test_process_payment_with_multiple_tokens ... ok
test test::test_remove_governor_succeeds_when_multiple_governors_exist ... ok
test test::test_protocol_revenue_reporting_views ... ok
test test::test_set_affiliate_rate_rejects_invalid_bps ... ok
test test::test_set_oracle_admin_only - should panic ... ok
test test::test_referral_reward_is_20_percent_of_platform_fee ... ok
test test::test_referral_reward_capped_when_platform_fee_is_zero ... ok
test test::test_set_pause_and_resume ... ok
test test::test_refund_rejected_after_deadline ... ok
test test::test_set_pause_unauthorized_panics - should panic ... ok
test test::test_request_guest_refund_deadline_passed ... ok
test test::test_transfer_ticket_paused ... ok
test test::test_request_guest_refund_success_with_fee ... ok
test test::test_transfer_ticket_contract_address_rejected ... ok
test test::test_transfer_ticket_no_sale_price_with_cap ... ok
test test::test_transfer_ticket_rejects_soulbound_ticket ... ok
test test::test_transfer_ticket_resale_price_exceeds_cap ... ok
test test::test_token_priced_payment_unchanged ... ok
test test::test_transfer_ticket_sale_price_no_cap ... ok
test test::test_transfer_ticket_self_transfer_rejected ... ok
test test::test_transfer_ticket_unauthorized - should panic ... ok
test test::test_transfer_ticket_zero_address_rejected ... ok
test test::test_transfer_ticket_with_fee ... ok
test test::test_transfer_ticket_resale_price_within_cap ... ok
test test::test_trigger_bulk_refund_paused ... ok
test test::test_transfer_ticket_valid_recipient_succeeds ... ok
test test::test_upgrade_preserves_initialization_addresses_and_emits_event ... ok
test test::test_upgrade_unauthorized_panics - should panic ... ok
test test::test_upgrade_verification_failure ... ok
test test::test_upgrade_works_when_paused ... ok
test test::test_transfer_ticket_success ... ok
test test::test_usd_priced_oracle_not_configured ... ok
test test::test_usd_priced_oracle_stale ... ok
test test::test_usd_priced_oracle_unavailable ... ok
test test::test_usd_priced_payment_below_slippage_fails ... ok
test test::test_unregistered_referrer_uses_default_20pct ... ok
test test::test_usd_priced_payment_above_slippage_fails ... ok
test test::test_withdraw_platform_fees_works_when_paused ... ok
test test::test_withdraw_organizer_funds ... ok
test test::test_withdraw_platform_fees ... ok
test test::test_usd_priced_payment_success ... ok
test test::test_usd_priced_payment_within_slippage ... ok
test test_e2e::test_check_in_allowed_when_no_end_time_set ... ok
test test_e2e::test_e2e_auction_flow ... ok
test test_e2e::test_check_in_blocked_after_event_end_time ... ok
test test_e2e::test_e2e_batch_purchase_then_partial_refund ... ok
test test_e2e::test_e2e_cancelled_event_automatic_refund ... ok
test test::test_withdraw_with_milestones ... ok
test test::test_withdrawal_cap_resets_across_multiple_days ... ok
test test_e2e::test_e2e_duplicate_payment_id_rejected ... ok
test test_e2e::test_e2e_full_purchase_confirm_checkin_lifecycle ... ok
test test_e2e::test_e2e_goal_failed_allows_automated_refund ... ok
test test::test_withdrawal_cap_resets_on_new_day ... ok
test test::test_withdrawal_cap_enforced_within_same_day ... ok
test test_e2e::test_e2e_goal_not_met_blocks_withdrawal ... ok
test test_e2e::test_e2e_state_consistent_after_failed_payment ... ok
test test_e2e::test_e2e_pause_blocks_operations_resume_allows ... ok
test test_e2e::test_e2e_purchase_and_refund_flow ... ok
test test_e2e::test_e2e_organizer_withdrawal_after_sales ... ok
test test_e2e::test_e2e_ticket_transfer_lifecycle ... ok
test test_e2e::test_e2e_zero_supply_unlimited_purchases ... ok

test result: ok. 143 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.82s

Copy link
Copy Markdown
Contributor

@Yunusabdul38 Yunusabdul38 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@Yunusabdul38 Yunusabdul38 merged commit f66c632 into Agora-Events:main May 4, 2026
2 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants