Update OSIRIS engine with signatory access control and Freezone examples

This commit is contained in:
Timur Gordon
2025-10-31 02:29:39 +01:00
parent 973c36c703
commit 7633f14db1
7 changed files with 1341 additions and 60 deletions

View File

@@ -15,11 +15,7 @@ print("=== FREEZONE REGISTRATION FLOW ===\n");
// ============================================================================
// KEYPAIRS AND IDENTITIES
// ============================================================================
// Freezone Organization (Keypair 1)
let freezone_pubkey = "04d0aea7f0a48bcab4389753ddc2e61623dd89d800652b11d0a383eb3ea74561d730bdd06e0ca8f4cd4013907d95782a0a584313e1d91ae5ad09b663de36bfac44";
// User: Timur (Keypair 2)
let freezone_pubkey = "04e58314c13ea3f9caed882001a5090797b12563d5f9bbd7f16efe020e060c780b446862311501e2e9653416527d2634ff8a8050ff3a085baccd7ddcb94185ff56";
let timur_pubkey = "04090636d0a15854c4c0b73f65b6de5f6a27a7b22d6fbf5f6d97c45476a0384fe50781444c33f5af577e017599e4b432373fbcdcd844d8783c5e52240a14b63dc3";
print("Identities:");
@@ -40,35 +36,77 @@ print("✓ Freezone context created");
print(" Context ID: " + freezone_ctx.context_id());
print(" Signatory: Freezone (" + freezone_pubkey + ")");
// Configure Email Client
print("\nConfiguring Email Client...");
// Configure email client for sending verification emails
// Common SMTP providers:
// - Gmail: smtp.gmail.com:587 (requires app password)
// - Outlook: smtp-mail.outlook.com:587
// - SendGrid: smtp.sendgrid.net:587
// - Mailgun: smtp.mailgun.org:587
// - AWS SES: email-smtp.us-east-1.amazonaws.com:587
let freezone_email_client = new_email_client()
.smtp_host("smtp.freezone.example")
.smtp_port(587)
.from_email("noreply@freezone.example")
.from_name("Freezone Platform");
.smtp_host("smtp-relay.brevo.com") // Change to your SMTP server
.smtp_port(587) // 587 for TLS, 465 for SSL
.username("timur@incubaid.com") // Your SMTP username/email
.password("xsmtpsib-a470d3fffa3f3b0f66800fe065f339067a07066d6a7df405fa465759418285ee-ojLWpd4oIShqIr6X") // Your SMTP password or app password
.from_email("registrar@ourworldfreezone.com") // From address
.from_name("Zanzibar Digital Free Zone")
.use_tls(true);
print("✓ Email client configured");
print(" SMTP Host: smtp.freezone.example");
freezone_ctx.save(freezone_email_client);
// Create verification email template
let verification_mail_template = new_mail_template()
.id("verification_email")
.name("Email Verification Template")
.subject("Verify your email address - Freezone")
.body("Hello,\n\nPlease verify your email address by clicking the link below:\n\n${url}\n\nOr use this verification code: ${code}\n\nThis link will expire in 24 hours.\n\nIf you didn't request this, please ignore this email.\n\nBest regards,\nFreezone Team")
.html_body("<!DOCTYPE html><html><head><style>body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; } .container { max-width: 600px; margin: 0 auto; padding: 20px; } .button { display: inline-block; padding: 12px 24px; background-color: #007bff; color: white; text-decoration: none; border-radius: 4px; margin: 20px 0; } .code { font-size: 24px; font-weight: bold; letter-spacing: 4px; padding: 10px; background-color: #f5f5f5; display: inline-block; margin: 10px 0; }</style></head><body><div class=\"container\"><h2>Verify your email address</h2><p>Hello,</p><p>Please verify your email address by clicking the button below:</p><a href=\"${url}\" class=\"button\">Verify Email</a><p>Or enter this verification code:</p><div class=\"code\">${code}</div><p>This link will expire in 24 hours.</p><p>If you didn't request this, please ignore this email.</p><p>Best regards,<br>Freezone Team</p></div></body></html>");
print("✓ Verification email template created");
freezone_ctx.save(verification_mail_template);
print(" From: noreply@freezone.example");
// Configure Payment Provider (Pesapal)
// Get your credentials from: https://developer.pesapal.com/
// Sandbox: https://demo.pesapal.com/
// Production: https://www.pesapal.com/
print("\nConfiguring Payment Provider...");
// For SANDBOX testing (demo environment):
let freezone_payment_client = new_payment_client_pesapal_sandbox(
1,
"qkio1BGGYAXTu2JOfm7XSXNruoZsrqEW",
"osGQ364R49cXKeOYSpaOnT++rHs="
"qkio1BGGYAXTu2JOfm7XSXNruoZsrqEW", // Your Pesapal Consumer Key
"osGQ364R49cXKeOYSpaOnT++rHs=" // Your Pesapal Consumer Secret
);
// For PRODUCTION (real payments), use:
// let freezone_payment_client = new_payment_client_pesapal(
// 1,
// "your-production-consumer-key",
// "your-production-consumer-secret"
// );
print("✓ Payment provider configured (Pesapal Sandbox)");
print(" Provider: Pesapal");
print(" Environment: Sandbox");
print(" Note: Real payment links will be generated");
// Configure KYC Provider
// Configure KYC Provider (Idenfy)
// Get your credentials from: https://www.idenfy.com/
// Dashboard: https://dashboard.idenfy.com/
print("\nConfiguring KYC Provider...");
print("✓ KYC provider configured");
print(" Provider: Freezone KYC");
print(" Callback URL: https://freezone.example/kyc/callback");
// Create Idenfy KYC client
let freezone_kyc_client = new_kyc_client_idenfy(
"your-idenfy-api-key", // Your Idenfy API Key
"your-idenfy-api-secret" // Your Idenfy API Secret
);
print("✓ KYC provider configured (Idenfy)");
print(" Provider: Idenfy");
print(" Note: Real KYC verification sessions will be created");
// Create Freezone's own Ethereum wallet
print("\nCreating Freezone Ethereum Wallet...");
@@ -155,8 +193,25 @@ print(" Nonce: " + verification.get_nonce());
// Prepare verification email
let verification_link = "https://freezone.example/verify?nonce=" + verification.get_nonce();
print(" Verification link: " + verification_link);
print(" (Email sent to: " + user_email + ")");
// Create verification mail with template parameters
let verification_mail = new_mail()
.to(user_email)
.template(verification_mail_template.get_id())
.parameter("url", verification_link)
.parameter("code", verification.get_code());
print("✓ Verification email prepared");
print(" To: " + user_email);
print(" Template: " + verification_mail_template.get_id());
print(" Link: " + verification_link);
print(" Code: " + verification.get_code());
// Send verification email using template
// Note: In production, configure real SMTP credentials
// For now, we'll simulate sending (actual SMTP would fail with example.com)
print("✓ Verification email would be sent to: " + user_email);
print(" (Skipping actual SMTP send - configure real server in production)");
// Simulate user clicking verification link and verifying
print("\n✓ User clicks verification link and verifies email");
@@ -259,15 +314,32 @@ print("✓ Payment request created");
print(" Amount: $100 USD");
print(" Description: Freezone Registration Fee");
// Initiate payment with Pesapal (this would return a payment URL)
// Initiate payment with Pesapal - creates real payment link
print("\nInitiating payment session with Pesapal...");
print(" Payment URL: https://pay.pesapal.com/iframe/PesapalIframe3/Index/?OrderTrackingId=abc123");
let payment_response = freezone_payment_client.create_payment_link(payment_request);
let payment_url = payment_response.get_payment_url();
let order_tracking_id = payment_response.get_order_tracking_id();
print("✓ Payment session created");
print(" Payment URL: " + payment_url);
print(" Order Tracking ID: " + order_tracking_id);
print(" (User would be redirected to Pesapal payment page)");
// Simulate user completing payment
print("\n✓ User clicks payment link and completes payment");
print(" Payment Status: COMPLETED");
print(" Transaction ID: TXN_" + timestamp());
// In production, you would:
// 1. Redirect user to payment_url
// 2. User completes payment on Pesapal
// 3. Pesapal calls your callback_url
// 4. You verify payment status with get_payment_status(order_tracking_id)
// For demo purposes, check payment status
print("\nChecking payment status...");
let payment_status = freezone_payment_client.get_payment_status(order_tracking_id);
print("✓ Payment status retrieved");
print(" Status: " + payment_status.get_payment_status_description());
print(" Amount: " + payment_status.get_amount() + " " + payment_status.get_currency());
print(" Transaction ID: " + order_tracking_id);
// Create payment transaction record
let payment_tx = new_transaction()
@@ -288,48 +360,73 @@ print("✓ Transaction saved\n");
print("Step 6: KYC Verification");
print("─────────────────────────────────────────────────────────────");
// Pre-fill KYC form with already collected info (first name, last name)
// User will fill in the rest at Idenfy (DOB, address, nationality, etc.)
print("\nPreparing KYC session with pre-filled data...");
let kyc_info = new_kyc_info()
.client_id("user_1")
.first_name("Timur") // From user profile
.last_name("Gordon") // From user profile
.email(user_email); // From user profile
print("✓ Pre-fill data prepared");
print(" Name: Timur Gordon (pre-filled)");
print(" Email: " + user_email + " (pre-filled)");
print(" User will provide: DOB, address, nationality, ID document");
// Create KYC session
let kyc_session = new_kyc_session("user_1", "freezone_kyc")
let kyc_session = new_kyc_session("user_1", "idenfy")
.callback_url("https://freezone.example/kyc/callback")
.success_url("https://freezone.example/kyc/success")
.error_url("https://freezone.example/kyc/error");
.error_url("https://freezone.example/kyc/error")
.locale("en");
print("✓ KYC session created");
print(" Client ID: " + kyc_session.get_client_id());
print(" Provider: " + kyc_session.get_provider());
// Generate KYC verification URL
print("\nKYC Verification URL generated:");
print(" https://kyc.provider.com/verify?session=kyc_session_" + timestamp());
print(" (User would be redirected to KYC provider)");
// Create verification session with Idenfy - generates real verification URL
print("\nCreating Idenfy verification session...");
let verification_url = freezone_kyc_client.create_verification_session(kyc_info, kyc_session);
// Simulate user clicking KYC link and completing verification
print("\n✓ User clicks KYC link and completes verification");
print(" - Uploads identity document (Passport)");
print("✓ Idenfy verification session created");
print(" Verification URL: " + verification_url);
print(" (User redirected to Idenfy to complete verification)");
// Production flow:
// 1. Redirect user to verification_url
// 2. User fills in remaining info (DOB, address, nationality)
// 3. User uploads ID document (Passport/ID/Driver's License)
// 4. User takes selfie for liveness check
// 5. Idenfy performs automated verification
// 6. Idenfy calls callback_url with VERIFIED data from ID document
// 7. Callback handler stores verified KYC info
print("\n✓ User completes verification at Idenfy:");
print(" - Fills in DOB, address, nationality");
print(" - Uploads identity document");
print(" - Takes selfie for liveness check");
print(" - Provides address proof");
print(" - Idenfy extracts and verifies data from ID");
// Simulate KYC callback with verification results
print("\n✓ KYC Provider callback received:");
print(" - Identity verification: PASSED");
print(" - Liveness check: PASSED");
print(" - Address verification: PASSED");
print(" - Sanctions screening: CLEAR");
print(" - PEP check: NOT FOUND");
print(" - Overall Status: VERIFIED");
print("\n✓ Idenfy callback will provide VERIFIED data:");
print(" - All personal info extracted from ID document");
print(" - Document number, issue date, expiry date");
print(" - Verification status (APPROVED/DENIED)");
print(" - Liveness check result");
// Create KYC info with verified data from callback
print("\nStoring verified KYC information...");
// For demo purposes, simulate what callback would receive
print("\nSimulating callback data (in production, this comes from Idenfy)...");
let kyc_info_verified = new_kyc_info()
.first_name("Timur")
.last_name("Gordon")
.client_id("user_1")
.first_name("Timur") // Verified from ID
.last_name("Gordon") // Verified from ID
.email(user_email)
.phone("+1-555-0123")
.country("US")
.date_of_birth("1990-05-15")
.document_type("passport")
.document_number("P123456789")
.verified(true);
.date_of_birth("1990-05-15") // Extracted from ID
.nationality("US") // Extracted from ID
.document_type("passport") // From verification
.document_number("P123456789") // Extracted from ID
.provider("idenfy")
.verified(true); // Only if status == "APPROVED"
freezone_ctx.save(kyc_info_verified);
freezone_ctx.save(kyc_session);