{"id":307,"date":"2025-12-04T23:48:26","date_gmt":"2025-12-04T17:48:26","guid":{"rendered":"https:\/\/stellardns.io\/?page_id=307"},"modified":"2025-12-09T20:43:05","modified_gmt":"2025-12-09T14:43:05","slug":"register-domains","status":"publish","type":"page","link":"https:\/\/stellardns.io\/?page_id=307","title":{"rendered":"Register Domains"},"content":{"rendered":"        <!-- Load Stellar SDK from CDN -->\r\n        <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/stellar-sdk\/11.3.0\/stellar-sdk.min.js\"><\/script>\r\n        <script>\r\n        \/\/ Stellar configuration for domain registration (mainnet only)\r\n        const stellarDomainConfig = {\r\n            network: 'mainnet',\r\n            horizonUrl: 'https:\/\/horizon.stellar.org'\r\n        };\r\n        console.log('Stellar Domain Config:', stellarDomainConfig);\r\n        <\/script>\r\n\r\n        <div class=\"stellar-domain-registration\">\r\n            <style>\r\n                .stellar-domain-registration {\r\n                    max-width: 800px;\r\n                    margin: 0 auto;\r\n                    padding: 20px;\r\n                }\r\n                .domain-card {\r\n                    background: white;\r\n                    border-radius: 12px;\r\n                    padding: 30px;\r\n                    box-shadow: 0 4px 12px rgba(0,0,0,0.1);\r\n                    margin-bottom: 20px;\r\n                }\r\n                .domain-card h2 {\r\n                    margin-top: 0;\r\n                    color: #333;\r\n                }\r\n                .form-group {\r\n                    margin-bottom: 20px;\r\n                }\r\n                .form-group label {\r\n                    display: block;\r\n                    margin-bottom: 8px;\r\n                    font-weight: 600;\r\n                    color: #555;\r\n                }\r\n                .form-group input, .form-group textarea {\r\n                    width: 100%;\r\n                    padding: 12px;\r\n                    border: 2px solid #ddd;\r\n                    border-radius: 6px;\r\n                    font-size: 16px;\r\n                }\r\n                .form-group input:focus, .form-group textarea:focus {\r\n                    outline: none;\r\n                    border-color: #667eea;\r\n                }\r\n                .btn {\r\n                    background: linear-gradient(135deg, #667eea, #764ba2);\r\n                    color: white;\r\n                    border: none;\r\n                    padding: 14px 28px;\r\n                    border-radius: 8px;\r\n                    font-size: 16px;\r\n                    font-weight: 600;\r\n                    cursor: pointer;\r\n                    transition: all 0.3s;\r\n                }\r\n                .btn:hover {\r\n                    transform: translateY(-2px);\r\n                    box-shadow: 0 6px 20px rgba(102,126,234,0.3);\r\n                }\r\n                .btn:disabled {\r\n                    opacity: 0.6;\r\n                    cursor: not-allowed;\r\n                }\r\n                .btn-secondary {\r\n                    background: #6c757d;\r\n                }\r\n                .status-message {\r\n                    padding: 15px;\r\n                    border-radius: 8px;\r\n                    margin: 15px 0;\r\n                }\r\n                .status-success {\r\n                    background: #d4edda;\r\n                    color: #155724;\r\n                    border: 1px solid #c3e6cb;\r\n                }\r\n                .status-error {\r\n                    background: #f8d7da;\r\n                    color: #721c24;\r\n                    border: 1px solid #f5c6cb;\r\n                }\r\n                .status-info {\r\n                    background: #d1ecf1;\r\n                    color: #0c5460;\r\n                    border: 1px solid #bee5eb;\r\n                }\r\n                .loading {\r\n                    display: inline-block;\r\n                    width: 20px;\r\n                    height: 20px;\r\n                    border: 3px solid rgba(102,126,234,0.3);\r\n                    border-radius: 50%;\r\n                    border-top-color: #667eea;\r\n                    animation: spin 1s ease-in-out infinite;\r\n                    margin-right: 10px;\r\n                }\r\n                @keyframes spin {\r\n                    to { transform: rotate(360deg); }\r\n                }\r\n            <\/style>\r\n            \r\n            <!-- Check Domain -->\r\n            <div class=\"domain-card\">\r\n                <h2>\ud83d\udd0d Check Domain Availability<\/h2>\r\n                <form id=\"check-domain-form\">\r\n                    <div class=\"form-group\">\r\n                        <label>Domain Name<\/label>\r\n                        <input type=\"text\" id=\"check-domain-name\" placeholder=\"example.stellar\" required>\r\n                    <\/div>\r\n                    <button type=\"submit\" class=\"btn\">Check Availability<\/button>\r\n                <\/form>\r\n                <div id=\"check-result\"><\/div>\r\n            <\/div>\r\n            \r\n            <!-- Register Domain -->\r\n            <div class=\"domain-card\">\r\n                <h2>\u2728 Register Domain<\/h2>\r\n                <form id=\"register-domain-form\">\r\n                    <div class=\"form-group\">\r\n                        <label>Domain Name<\/label>\r\n                        <input type=\"text\" id=\"domain-name\" placeholder=\"example.stellar\" required>\r\n                        <small class=\"form-text\">Your desired domain name<\/small>\r\n                    <\/div>\r\n                    <div class=\"form-group\">\r\n                        <label>Secret Key (for signing)<\/label>\r\n                        <input type=\"password\" id=\"secret-key\" placeholder=\"S...\" required>\r\n                        <small class=\"form-text\">Your Stellar secret key - your address will be derived from this<\/small>\r\n                    <\/div>\r\n                    <div class=\"form-group\">\r\n                        <label>A Record (IP Address) - Optional<\/label>\r\n                        <input type=\"text\" id=\"a-record\" placeholder=\"192.168.1.1\">\r\n                        <small class=\"form-text\">Point your domain to an IP address (optional)<\/small>\r\n                    <\/div>\r\n                    <button type=\"submit\" class=\"btn\" id=\"register-btn\">Register Domain<\/button>\r\n                <\/form>\r\n                <div id=\"register-result\"><\/div>\r\n            <\/div>\r\n        <\/div>\r\n        \r\n        <script>\r\n        \/* Version: 2.1.0 - Enhanced error logging + empty memo fix - 2025-12-09 *\/\r\n        \/\/ Define AJAX data inline\r\n        var stellarDomainData = {\r\n            ajaxUrl: 'https:\/\/stellardns.io\/wp-admin\/admin-ajax.php',\r\n            nonce: 'bd2ad8e531'\r\n        };\r\n\r\n        jQuery(document).ready(function($) {\r\n            \/\/ Check domain\r\n            $('#check-domain-form').on('submit', function(e) {\r\n                e.preventDefault();\r\n                const domain = $('#check-domain-name').val().trim();\r\n                const resultDiv = $('#check-result');\r\n                \r\n                resultDiv.html('<div class=\"status-info\"><div class=\"loading\"><\/div>Checking availability...<\/div>');\r\n                \r\n                $.ajax({\r\n                    url: stellarDomainData.ajaxUrl,\r\n                    type: 'POST',\r\n                    data: {\r\n                        action: 'stellar_check_domain',\r\n                        nonce: stellarDomainData.nonce,\r\n                        domain: domain\r\n                    },\r\n                    success: function(response) {\r\n                        if (response.success) {\r\n                            if (response.data.available) {\r\n                                resultDiv.html('<div class=\"status-success\">\u2705 Domain is available!<\/div>');\r\n                            } else {\r\n                                resultDiv.html('<div class=\"status-error\">\u274c Domain is already registered<\/div>');\r\n                            }\r\n                        } else {\r\n                            resultDiv.html('<div class=\"status-error\">\u274c Error: ' + response.data + '<\/div>');\r\n                        }\r\n                    },\r\n                    error: function() {\r\n                        resultDiv.html('<div class=\"status-error\">\u274c Connection error<\/div>');\r\n                    }\r\n                });\r\n            });\r\n            \r\n            \/\/ Register domain\r\n            $('#register-domain-form').on('submit', async function(e) {\r\n                e.preventDefault();\r\n                const domain = $('#domain-name').val().trim();\r\n                const secretKey = $('#secret-key').val().trim();\r\n                const aRecord = $('#a-record').val().trim();\r\n                const resultDiv = $('#register-result');\r\n                const btn = $('#register-btn');\r\n\r\n                if (!secretKey.startsWith('S') || secretKey.length !== 56) {\r\n                    resultDiv.html('<div class=\"status-error\">\u274c Invalid secret key format<\/div>');\r\n                    return;\r\n                }\r\n\r\n                resultDiv.html('<div class=\"status-info\"><div class=\"loading\"><\/div>Step 1\/2: Creating Stellar transaction...<\/div>');\r\n                btn.prop('disabled', true);\r\n\r\n                try {\r\n                    \/\/ Step 1: Create Stellar blockchain transaction\r\n                    const txResult = await registerDomainOnStellar(domain, aRecord, secretKey);\r\n\r\n                    if (!txResult.success) {\r\n                        throw new Error(txResult.message);\r\n                    }\r\n\r\n                    console.log('\u2705 Stellar transaction created:', txResult.hash);\r\n                    console.log('\u2705 Stellar address:', txResult.account);\r\n                    resultDiv.html('<div class=\"status-info\"><div class=\"loading\"><\/div>Step 2\/2: Registering with backend...<\/div>');\r\n\r\n                    \/\/ Step 2: Submit to WordPress backend with transaction hash and derived address\r\n                    $.ajax({\r\n                        url: stellarDomainData.ajaxUrl,\r\n                        type: 'POST',\r\n                        data: {\r\n                            action: 'stellar_register_domain',\r\n                            nonce: stellarDomainData.nonce,\r\n                            domain: domain,\r\n                            stellar_address: txResult.account,\r\n                            transaction_hash: txResult.hash,\r\n                            a_record: aRecord\r\n                        },\r\n                        success: function(response) {\r\n                            btn.prop('disabled', false);\r\n                            if (response.success) {\r\n                                resultDiv.html('<div class=\"status-success\">\u2705 Domain registered successfully!<br>Account: ' + txResult.account.substring(0, 8) + '...<br>Transaction: ' + txResult.hash + '<\/div>');\r\n                                $('#register-domain-form')[0].reset();\r\n                            } else {\r\n                                resultDiv.html('<div class=\"status-error\">\u274c Backend error: ' + response.data + '<\/div>');\r\n                            }\r\n                        },\r\n                        error: function(xhr, status, error) {\r\n                            btn.prop('disabled', false);\r\n                            resultDiv.html('<div class=\"status-error\">\u274c Backend connection error: ' + error + '<\/div>');\r\n                        }\r\n                    });\r\n\r\n                } catch (error) {\r\n                    btn.prop('disabled', false);\r\n                    console.error('Domain registration error:', error);\r\n                    resultDiv.html('<div class=\"status-error\">\u274c Error: ' + error.message + '<\/div>');\r\n                }\r\n            });\r\n\r\n            \/\/ Function to register domain on Stellar blockchain\r\n            async function registerDomainOnStellar(domain, aRecord, secretKey) {\r\n                try {\r\n                    if (!window.StellarSdk) {\r\n                        throw new Error('Stellar SDK not loaded. Please refresh the page.');\r\n                    }\r\n\r\n                    const StellarSdk = window.StellarSdk;\r\n\r\n                    console.log('\ud83d\ude80 Starting domain registration:', {\r\n                        domain: domain,\r\n                        network: stellarDomainConfig.network,\r\n                        horizonUrl: stellarDomainConfig.horizonUrl\r\n                    });\r\n\r\n                    \/\/ Test Horizon connectivity\r\n                    try {\r\n                        const testResponse = await fetch(stellarDomainConfig.horizonUrl);\r\n                        if (!testResponse.ok) {\r\n                            throw new Error(`Horizon server not accessible: ${testResponse.status}`);\r\n                        }\r\n                        console.log('\u2705 Horizon server reachable');\r\n                    } catch (error) {\r\n                        throw new Error(`Cannot connect to Horizon: ${error.message}`);\r\n                    }\r\n\r\n                    const server = new StellarSdk.Horizon.Server(stellarDomainConfig.horizonUrl);\r\n                    const networkPassphrase = StellarSdk.Networks.PUBLIC;\r\n\r\n                    console.log('\ud83d\udd11 Creating keypair from secret...');\r\n                    const keypair = StellarSdk.Keypair.fromSecret(secretKey);\r\n                    const publicKey = keypair.publicKey();\r\n\r\n                    console.log('\ud83d\udce1 Loading account:', publicKey.substring(0, 8) + '...');\r\n                    const account = await server.loadAccount(publicKey);\r\n\r\n                    \/\/ Build DNS records memo (same format as register_domain.html)\r\n                    const records = {};\r\n                    if (aRecord) {\r\n                        records.A = aRecord;\r\n                    }\r\n\r\n                    const memoParts = [];\r\n                    for (const [type, value] of Object.entries(records)) {\r\n                        memoParts.push(`${type}:${value}`);\r\n                    }\r\n                    const memo = memoParts.join(';');\r\n\r\n                    if (new TextEncoder().encode(memo).length > 28) {\r\n                        throw new Error('DNS memo too long (max 28 bytes)');\r\n                    }\r\n\r\n                    console.log('\ud83c\udfd7\ufe0f Building transaction...');\r\n                    const transactionBuilder = new StellarSdk.TransactionBuilder(account, {\r\n                        fee: StellarSdk.BASE_FEE,\r\n                        networkPassphrase: networkPassphrase,\r\n                    })\r\n                    .addOperation(StellarSdk.Operation.manageData({\r\n                        name: \"dns_domain\",\r\n                        value: domain\r\n                    }));\r\n\r\n                    \/\/ Add memo only if not empty\r\n                    if (memo && memo.length > 0) {\r\n                        transactionBuilder.addMemo(StellarSdk.Memo.text(memo));\r\n                    }\r\n\r\n                    const transaction = transactionBuilder\r\n                        .setTimeout(180)\r\n                        .build();\r\n\r\n                    console.log('\u270d\ufe0f Signing transaction...');\r\n                    transaction.sign(keypair);\r\n\r\n                    console.log('\ud83d\udce4 Submitting transaction to Horizon...');\r\n                    let result;\r\n                    try {\r\n                        result = await server.submitTransaction(transaction);\r\n                        console.log('\u2705 Transaction submitted successfully:', result.hash);\r\n                    } catch (error) {\r\n                        console.error('\u274c Transaction submission failed:', error);\r\n\r\n                        \/\/ Aggressive error logging - stringify everything\r\n                        try {\r\n                            console.error('\ud83d\udd0d FULL ERROR OBJECT:', JSON.stringify(error, null, 2));\r\n                        } catch (e) {\r\n                            console.error('Could not stringify error:', e.message);\r\n                        }\r\n\r\n                        \/\/ Log error structure\r\n                        console.error('Error message:', error.message);\r\n                        console.error('Error name:', error.name);\r\n\r\n                        \/\/ Access response deeply\r\n                        if (error.response) {\r\n                            console.error('\u2705 error.response exists');\r\n                            console.error('Response status:', error.response.status);\r\n                            console.error('Response statusText:', error.response.statusText);\r\n\r\n                            if (error.response.data) {\r\n                                console.error('\u2705 error.response.data exists');\r\n                                console.error('\ud83d\udcc4 HORIZON ERROR RESPONSE:', error.response.data);\r\n\r\n                                \/\/ Try to stringify response data\r\n                                try {\r\n                                    console.error('\ud83d\udcc4 HORIZON ERROR (stringified):', JSON.stringify(error.response.data, null, 2));\r\n                                } catch (e) {\r\n                                    console.error('Could not stringify response.data');\r\n                                }\r\n\r\n                                \/\/ Check for result codes\r\n                                if (error.response.data.extras) {\r\n                                    console.error('\u2705 extras exists:', error.response.data.extras);\r\n\r\n                                    if (error.response.data.extras.result_codes) {\r\n                                        const codes = error.response.data.extras.result_codes;\r\n                                        console.error('\ud83c\udfaf RESULT CODES:', codes);\r\n\r\n                                        let errorMsg = 'Transaction failed: ';\r\n                                        if (codes.transaction) {\r\n                                            errorMsg += `${codes.transaction}`;\r\n                                        }\r\n                                        if (codes.operations) {\r\n                                            errorMsg += ` Operations: ${JSON.stringify(codes.operations)}`;\r\n                                        }\r\n\r\n                                        throw new Error(errorMsg);\r\n                                    }\r\n                                }\r\n                            }\r\n                        } else {\r\n                            console.error('\u274c error.response does NOT exist');\r\n                        }\r\n\r\n                        throw new Error(`Transaction failed: ${error.message || 'Unknown error'}`);\r\n                    }\r\n\r\n                    return {\r\n                        success: true,\r\n                        hash: result.hash,\r\n                        memo: memo,\r\n                        account: publicKey\r\n                    };\r\n\r\n                } catch (error) {\r\n                    console.error('\ud83d\udd25 Registration error:', error);\r\n                    return {\r\n                        success: false,\r\n                        message: error.message\r\n                    };\r\n                }\r\n            }\r\n        });\r\n        <\/script>\r\n        \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-307","page","type-page","status-publish","hentry"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/stellardns.io\/index.php?rest_route=\/wp\/v2\/pages\/307","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/stellardns.io\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/stellardns.io\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/stellardns.io\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/stellardns.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=307"}],"version-history":[{"count":4,"href":"https:\/\/stellardns.io\/index.php?rest_route=\/wp\/v2\/pages\/307\/revisions"}],"predecessor-version":[{"id":319,"href":"https:\/\/stellardns.io\/index.php?rest_route=\/wp\/v2\/pages\/307\/revisions\/319"}],"wp:attachment":[{"href":"https:\/\/stellardns.io\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}