diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ce4f5f969..7eb49ee7d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,10 +21,9 @@ jobs: - name: 'Validate federation.json files are in sync' shell: bash run: | - frontend_hash=$(jq --sort-keys . frontend/static/federation.json | sha256sum | cut -d' ' -f1) - api_hash=$(jq --sort-keys . api/federation.json | sha256sum | cut -d' ' -f1) - if [ "$frontend_hash" != "$api_hash" ]; then + if ! diff -q frontend/static/federation.json api/federation.json > /dev/null; then echo "ERROR: frontend/static/federation.json and api/federation.json are out of sync." + diff frontend/static/federation.json api/federation.json echo " Run 'cd frontend && npm run build' to regenerate api/federation.json, then commit the result." exit 1 fi diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 48acfc8b4..b4df522ed 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: - '--fix=lf' - id: trailing-whitespace - id: pretty-format-json - exclude: ^frontend/|^mobile/ + exclude: ^frontend/(?!static/federation\.json)|^mobile/ args: - '--autofix' - '--no-sort-keys' diff --git a/api/federation.json b/api/federation.json index bc42059ae..ee48dc2a2 100644 --- a/api/federation.json +++ b/api/federation.json @@ -152,23 +152,23 @@ "testnetNodesPubkeys": [], "federated": true }, - "freedomsats": { - "longAlias": "FreedomSats", - "shortAlias": "freedomsats", - "identifier": "freedomsats", - "description": "A Decentralized, deflationary currency enthusiast. Hoping to add liquidity to a non-KYC means for purchasing and selling bitcoin. Robosats P2P solves many issues with the modern day fiat system, and FreedomSats is happy to aid in its decentralization. The focus of FreedomSats will be to ensure data privacy and uptime-consistency.", - "motto": "Liberty’s Network Above", - "color": "#5d2365", - "established": "2025-06-30", - "nostrHexPubkey": "ded3dc02a1a9b61ce59d11f496539cb3fd15f00326a16f47e5f8d76baba24bdb", + "alice": { + "longAlias": "Alice", + "shortAlias": "alice", + "identifier": "alice", + "description": "Alice is here to empower Bitcoin enthusiasts by providing a decentralized, non-KYC, peer-to-peer exchange platform. With a focus on privacy, security, and ease of use, Alice is committed to ensuring that all users can participate in the Bitcoin economy with autonomy and integrity.", + "motto": "Privacy is not a crime", + "color": "#9932cc", + "established": "2025-11-27", + "nostrHexPubkey": "40d33962fdf26e0910805f36a3a96b239cf93b95d4a3e6dd779f1ea3ff9b0866", "contact": { - "email": "FreedomSatoshis@proton.me", - "telegram": "@freedomsats", - "simplex": "https://simplex.chat/contact#/?v=2-7&smp=smp%3A%2F%2Fh--vW7ZSkXPeOUpfxlFGgauQmXNFOzGoizak7Ult7cw%3D%40smp15.simplex.im%2FLjWY29_NGy7vujmzRCmnJocepWWMAk2D%23%2F%3Fv%3D1-4%26dh%3DMCowBQYDK2VuAyEAWRfXNPT2xQihjv0Ef2sV51J2YiAmboLcmE0adlEAv2c%253D%26q%3Dc%26srv%3Doauu4bgijybyhczbnxtlggo6hiubahmeutaqineuyy23aojpih3dajad.onion", - "pgp": "/static/federation/pgp/9D3D3BAF4744305EE3F0B837331AB575DD78D930.asc", - "nostr": "npub1mmfacq4p4xmpeevaz86fv5uuk073tuqry6sk73l9lrtkh2azf0dsykwxuj", + "email": "alice7b@proton.me", + "telegram": "", + "simplex": "https://smp12.simplex.im/a#peg1Oqqy55zhLXugHUmlZqXGkd31Fcr3HXXhvsZLQt0", + "pgp": "/static/federation/pgp/349137316F89DAF6D7E66A40D0B7C7C3C3744DBA.asc", + "nostr": "npub1grfnjcha7fhqjyyqtum282ttyww0jwu46j37dhthnu028lumppnqtenl5y", "website": null, - "fingerprint": "9D3D3BAF4744305EE3F0B837331AB575DD78D930" + "fingerprint": "349137316F89DAF6D7E66A40D0B7C7C3C3744DBA" }, "badges": { "isFounder": false, @@ -177,15 +177,15 @@ "hasLargeLimits": false }, "policies": { - "Privacy Policy 1": "Dispute Evidence Submission: If a dispute arises, you will be asked to provide only the transaction-related documentation needed to evaluate your claim—for example, transaction IDs, payment‐confirmation screenshots, or other pertinent records. Please keep a record of all relevant information.", - "Privacy Policy 2": "Limited Retention Period: All sensitive data gathered for the purpose of resolving a dispute will be retained strictly for the duration of that process. Once the issue is fully resolved, this information will be irrevocably and securely deleted", - "Data Policy 1": "No Third-Party Data Sharing: RoboSats is deliberately designed to collect no user data—no IP addresses, geolocation, or personal identifiers—and will never share information with outside parties.", - "Data Policy 2": "Ephemeral Log Retention: All operational logs required to run the coordinator are automatically deleted after seven days, unless they’re essential for an active dispute.", - "Rule 1:": "Please do not share any personal information through the chat, if possible share as little revealing information as possible.", - "Rule 2:": "Email is provided for convenience but other means of communication are recommended. Like Nostr/SimpleX/Telegram" + "Privacy Policy 1 — Evidence in Disputes": "In the event of a dispute, users will be asked to provide transaction-related evidence. This could include transaction IDs, screenshots of payment confirmations, or other pertinent transaction records. Personal information or unrelated transaction details should be redacted to maintain privacy.", + "Privacy Policy 2 — short-term Storage": "Sensitive information related to disputes will be stored only for the duration necessary to resolve the issue. Once resolved, the data will be permanently deleted. For ease of use e-mail communications are permitted, but E2EE and decentralized platforms such as NOSTR and SIMPLEX are advised.", + "Data Policy 1 — No Third-Party Sharing": "Under no circumstances will user information be shared with third parties. Also because it is impossible to do so by design of Robosats architecture. Due to the decentralized and privacy-centric structure of RoboSats built on the Tor network, we are unable to collect or store user information, including but not limited to, the location of users. This design ensures maximum privacy and anonymity for our users.", + "Data Policy 2 — Short-term Storage": "Any log needed to operate the coordinator will be cleared after 7 days, unless strictly needed to process disputes. To ensure utmost privacy, the coordinator will be accessible only through Tor.", + "Rule 1:": " Do not share personal information through the chat, unless strictly needed for completing the trade.", + "Rule 2:": "Users are solely responsible for understanding and complying with their local laws and regulations regarding cryptocurrency transactions. By using this coordinator, you agree to ensure that your activities on the platform are lawful in your jurisdiction." }, "mainnet": { - "onion": "http://dqmmejfmtlve7d4ccohk4usriifdtci6xk4wv7igxn2fyaduh25s6did.onion", + "onion": "http://alice7bqexhtnkiqhtgkuwgtzzfkishw23ac4sfwpznrwlmnipxlomyd.onion", "clearnet": null, "i2p": null }, @@ -195,45 +195,46 @@ "i2p": null }, "mainnetNodesPubkeys": [ - "028059662c65626f3002290dd3151186bc1952726c03f56012406f3ceadb81cacc" + "02580496598cf3e7bfe41c9b0721d1c90693d31d308364456dc30f0a22bf58ddd7" ], "testnetNodesPubkeys": [], "federated": true }, - "alice": { - "longAlias": "Alice", - "shortAlias": "alice", - "identifier": "alice", - "description": "Alice is here to empower Bitcoin enthusiasts by providing a decentralized, non-KYC, peer-to-peer exchange platform. With a focus on privacy, security, and ease of use, Alice is committed to ensuring that all users can participate in the Bitcoin economy with autonomy and integrity.", - "motto": "Privacy is not a crime", - "color": "#9932cc", - "established": "2025-11-27", - "nostrHexPubkey": "40d33962fdf26e0910805f36a3a96b239cf93b95d4a3e6dd779f1ea3ff9b0866", + "eleuteria": { + "longAlias": "Eleuteria", + "shortAlias": "eleuteria", + "identifier": "eleuteria", + "description": "Eleuteria is a privacy-focused, non-KYC RoboSats coordinator built around the principles of financial freedom, self-sovereignty and peer-to-peer Bitcoin. It provides a Tor-only environment where users can trade directly while minimizing unnecessary trust and exposure of personal information.", + "motto": "Coordinating privacy. Broadcasting freedom.", + "color": "#C58A32", + "established": "2026-08-26", + "nostrHexPubkey": "0f243ba69b7c7ffa73934bc7f5fa6586b8013afdc310d808b1ec2c2c98f1c219", "contact": { - "email": "alice7b@proton.me", - "telegram": "", - "simplex": "https://smp12.simplex.im/a#peg1Oqqy55zhLXugHUmlZqXGkd31Fcr3HXXhvsZLQt0", - "pgp": "/static/federation/pgp/349137316F89DAF6D7E66A40D0B7C7C3C3744DBA.asc", - "nostr": "npub1grfnjcha7fhqjyyqtum282ttyww0jwu46j37dhthnu028lumppnqtenl5y", + "email": "backsocks@proton.me", + "telegram": "@asyscom", + "simplex": "https://smp17.simplex.im/a#w2lbfI-Rbea5dukWc38CVDQEzLryz8q7p2C4NGEViNg", + "pgp": "/static/federation/pgp/546143E7584783759F6829AF6DA5626C8AF8DF61.asc", + "nostr": "npub1pujrhf5m03ll5uunf0rlt7n9s6uqzwhacvgdsz93askzex83cgvsukm9hf", "website": null, - "fingerprint": "349137316F89DAF6D7E66A40D0B7C7C3C3744DBA" + "matrix": null, + "fingerprint": "546143E7584783759F6829AF6DA5626C8AF8DF61" }, "badges": { "isFounder": false, - "donatesToDevFund": 20, + "donatesToDevFund": 30, "hasGoodOpSec": true, "hasLargeLimits": false }, "policies": { "Privacy Policy 1 — Evidence in Disputes": "In the event of a dispute, users will be asked to provide transaction-related evidence. This could include transaction IDs, screenshots of payment confirmations, or other pertinent transaction records. Personal information or unrelated transaction details should be redacted to maintain privacy.", - "Privacy Policy 2 — short-term Storage": "Sensitive information related to disputes will be stored only for the duration necessary to resolve the issue. Once resolved, the data will be permanently deleted. For ease of use e-mail communications are permitted, but E2EE and decentralized platforms such as NOSTR and SIMPLEX are advised.", + "Privacy Policy 2 — Short-term Storage": "Sensitive information related to disputes will be stored only for the duration necessary to resolve the issue. Once resolved, the data will be permanently deleted. For ease of use e-mail communications are permitted, but E2EE and decentralized platforms such as NOSTR and SIMPLEX are advised.", "Data Policy 1 — No Third-Party Sharing": "Under no circumstances will user information be shared with third parties. Also because it is impossible to do so by design of Robosats architecture. Due to the decentralized and privacy-centric structure of RoboSats built on the Tor network, we are unable to collect or store user information, including but not limited to, the location of users. This design ensures maximum privacy and anonymity for our users.", "Data Policy 2 — Short-term Storage": "Any log needed to operate the coordinator will be cleared after 7 days, unless strictly needed to process disputes. To ensure utmost privacy, the coordinator will be accessible only through Tor.", "Rule 1:": " Do not share personal information through the chat, unless strictly needed for completing the trade.", "Rule 2:": "Users are solely responsible for understanding and complying with their local laws and regulations regarding cryptocurrency transactions. By using this coordinator, you agree to ensure that your activities on the platform are lawful in your jurisdiction." }, "mainnet": { - "onion": "http://alice7bqexhtnkiqhtgkuwgtzzfkishw23ac4sfwpznrwlmnipxlomyd.onion", + "onion": "http://ixiiqsuzt7hh5qxshiqwyewyh3gyygltbygqlvlyitg3gl3u2cemk3ad.onion", "clearnet": null, "i2p": null }, @@ -243,7 +244,53 @@ "i2p": null }, "mainnetNodesPubkeys": [ - "02580496598cf3e7bfe41c9b0721d1c90693d31d308364456dc30f0a22bf58ddd7" + "03808d86fee8345c7b470f792f62e3a3cba78ad49d75d4623c8e27520c34f90d5b" + ], + "testnetNodesPubkeys": [], + "federated": true + }, + "freeport": { + "longAlias": "FreePort", + "shortAlias": "freeport", + "identifier": "freeport", + "description": "Privacy-focused P2P Bitcoin exchange coordinator. Tor-only for maximum privacy.", + "motto": "Free trade, free ports, free people.", + "color": "#808080", + "established": "2026-08-28", + "nostrHexPubkey": null, + "contact": { + "email": "fp-coordinator@proton.me", + "telegram": null, + "simplex": null, + "pgp": "/static/federation/pgp/27099F12B8752D8267B6DFF28265E7B36362CF31.asc", + "nostr": null, + "website": null, + "matrix": null, + "fingerprint": "27099F12B8752D8267B6DFF28265E7B36362CF31" + }, + "badges": { + "isFounder": false, + "donatesToDevFund": 20, + "hasGoodOpSec": true, + "hasLargeLimits": false + }, + "policies": { + "Privacy Policy": "Tor-only coordinator. No KYC required. Dispute evidence handled confidentially and deleted after resolution. No user tracking or analytics.", + "Data Policy": "No data shared with or sold to third parties. Database cleared regularly except for active disputes. Coordinator operates exclusively over Tor.", + "Other Policies": "Max order size: 500,000 sats. Maker fee: 0.025%. Taker fee: 0.175%." + }, + "mainnet": { + "onion": "http://2enoseg66hme76khjjn2qvrhipnzwgwa44mewgrdphrxbhzcxd2vdiqd.onion", + "clearnet": null, + "i2p": null + }, + "testnet": { + "onion": null, + "clearnet": null, + "i2p": null + }, + "mainnetNodesPubkeys": [ + "03230eea7d63303c3e54076f84745aeabf447e01a572e984e77b796665419d43cc" ], "testnetNodesPubkeys": [], "federated": true diff --git a/frontend/.prettierignore b/frontend/.prettierignore index fd6380cfc..ab93b5b9b 100644 --- a/frontend/.prettierignore +++ b/frontend/.prettierignore @@ -4,3 +4,4 @@ static/admin/** static/frontend/** static/import_export/** static/drf_spectacular_sidecar/** +static/federation.json diff --git a/frontend/static/federation.json b/frontend/static/federation.json index 9592c6b94..ee48dc2a2 100644 --- a/frontend/static/federation.json +++ b/frontend/static/federation.json @@ -45,8 +45,12 @@ "clearnet": "", "i2p": "" }, - "mainnetNodesPubkeys": ["0226f31c5f3a8b48bbbb7aaa97a10effcfb445b5972a676955d5c095383d35a428"], - "testnetNodesPubkeys": ["028e7a019180a664b84edf77ba656e96f2eb84f67f56d93020341caf4109e0dbc7"], + "mainnetNodesPubkeys": [ + "0226f31c5f3a8b48bbbb7aaa97a10effcfb445b5972a676955d5c095383d35a428" + ], + "testnetNodesPubkeys": [ + "028e7a019180a664b84edf77ba656e96f2eb84f67f56d93020341caf4109e0dbc7" + ], "federated": true }, "lake": { @@ -92,8 +96,12 @@ "clearnet": "https://test.unsafe.thebiglake.org", "i2p": "" }, - "mainnetNodesPubkeys": ["0385262f7e9e2eeeba1e7d6182a0efec98e79d01154b76189f3e0b88bcee279dd0"], - "testnetNodesPubkeys": ["0355f8604df9ec4bee20a284f045f94e26cdd1fc5e15dee0716a5a5dfc7cd33b7c"], + "mainnetNodesPubkeys": [ + "0385262f7e9e2eeeba1e7d6182a0efec98e79d01154b76189f3e0b88bcee279dd0" + ], + "testnetNodesPubkeys": [ + "0355f8604df9ec4bee20a284f045f94e26cdd1fc5e15dee0716a5a5dfc7cd33b7c" + ], "federated": true }, "bazaar": { @@ -138,27 +146,29 @@ "clearnet": null, "i2p": null }, - "mainnetNodesPubkeys": ["03ab3468f06d3aac93992ef7ae79bce083e18617dc760f09ef687d7bca89667a15"], + "mainnetNodesPubkeys": [ + "03ab3468f06d3aac93992ef7ae79bce083e18617dc760f09ef687d7bca89667a15" + ], "testnetNodesPubkeys": [], "federated": true }, - "freedomsats": { - "longAlias": "FreedomSats", - "shortAlias": "freedomsats", - "identifier": "freedomsats", - "description": "A Decentralized, deflationary currency enthusiast. Hoping to add liquidity to a non-KYC means for purchasing and selling bitcoin. Robosats P2P solves many issues with the modern day fiat system, and FreedomSats is happy to aid in its decentralization. The focus of FreedomSats will be to ensure data privacy and uptime-consistency.", - "motto": "Liberty\u2019s Network Above", - "color": "#5d2365", - "established": "2025-06-30", - "nostrHexPubkey": "ded3dc02a1a9b61ce59d11f496539cb3fd15f00326a16f47e5f8d76baba24bdb", + "alice": { + "longAlias": "Alice", + "shortAlias": "alice", + "identifier": "alice", + "description": "Alice is here to empower Bitcoin enthusiasts by providing a decentralized, non-KYC, peer-to-peer exchange platform. With a focus on privacy, security, and ease of use, Alice is committed to ensuring that all users can participate in the Bitcoin economy with autonomy and integrity.", + "motto": "Privacy is not a crime", + "color": "#9932cc", + "established": "2025-11-27", + "nostrHexPubkey": "40d33962fdf26e0910805f36a3a96b239cf93b95d4a3e6dd779f1ea3ff9b0866", "contact": { - "email": "FreedomSatoshis@proton.me", - "telegram": "@freedomsats", - "simplex": "https://simplex.chat/contact#/?v=2-7&smp=smp%3A%2F%2Fh--vW7ZSkXPeOUpfxlFGgauQmXNFOzGoizak7Ult7cw%3D%40smp15.simplex.im%2FLjWY29_NGy7vujmzRCmnJocepWWMAk2D%23%2F%3Fv%3D1-4%26dh%3DMCowBQYDK2VuAyEAWRfXNPT2xQihjv0Ef2sV51J2YiAmboLcmE0adlEAv2c%253D%26q%3Dc%26srv%3Doauu4bgijybyhczbnxtlggo6hiubahmeutaqineuyy23aojpih3dajad.onion", - "pgp": "/static/federation/pgp/9D3D3BAF4744305EE3F0B837331AB575DD78D930.asc", - "nostr": "npub1mmfacq4p4xmpeevaz86fv5uuk073tuqry6sk73l9lrtkh2azf0dsykwxuj", + "email": "alice7b@proton.me", + "telegram": "", + "simplex": "https://smp12.simplex.im/a#peg1Oqqy55zhLXugHUmlZqXGkd31Fcr3HXXhvsZLQt0", + "pgp": "/static/federation/pgp/349137316F89DAF6D7E66A40D0B7C7C3C3744DBA.asc", + "nostr": "npub1grfnjcha7fhqjyyqtum282ttyww0jwu46j37dhthnu028lumppnqtenl5y", "website": null, - "fingerprint": "9D3D3BAF4744305EE3F0B837331AB575DD78D930" + "fingerprint": "349137316F89DAF6D7E66A40D0B7C7C3C3744DBA" }, "badges": { "isFounder": false, @@ -167,15 +177,15 @@ "hasLargeLimits": false }, "policies": { - "Privacy Policy 1": "Dispute Evidence Submission: If a dispute arises, you will be asked to provide only the transaction-related documentation needed to evaluate your claim\u2014for example, transaction IDs, payment\u2010confirmation screenshots, or other pertinent records. Please keep a record of all relevant information.", - "Privacy Policy 2": "Limited Retention Period: All sensitive data gathered for the purpose of resolving a dispute will be retained strictly for the duration of that process. Once the issue is fully resolved, this information will be irrevocably and securely deleted", - "Data Policy 1": "No Third-Party Data Sharing: RoboSats is deliberately designed to collect no user data\u2014no IP addresses, geolocation, or personal identifiers\u2014and will never share information with outside parties.", - "Data Policy 2": "Ephemeral Log Retention: All operational logs required to run the coordinator are automatically deleted after seven days, unless they\u2019re essential for an active dispute.", - "Rule 1:": "Please do not share any personal information through the chat, if possible share as little revealing information as possible.", - "Rule 2:": "Email is provided for convenience but other means of communication are recommended. Like Nostr/SimpleX/Telegram" + "Privacy Policy 1 — Evidence in Disputes": "In the event of a dispute, users will be asked to provide transaction-related evidence. This could include transaction IDs, screenshots of payment confirmations, or other pertinent transaction records. Personal information or unrelated transaction details should be redacted to maintain privacy.", + "Privacy Policy 2 — short-term Storage": "Sensitive information related to disputes will be stored only for the duration necessary to resolve the issue. Once resolved, the data will be permanently deleted. For ease of use e-mail communications are permitted, but E2EE and decentralized platforms such as NOSTR and SIMPLEX are advised.", + "Data Policy 1 — No Third-Party Sharing": "Under no circumstances will user information be shared with third parties. Also because it is impossible to do so by design of Robosats architecture. Due to the decentralized and privacy-centric structure of RoboSats built on the Tor network, we are unable to collect or store user information, including but not limited to, the location of users. This design ensures maximum privacy and anonymity for our users.", + "Data Policy 2 — Short-term Storage": "Any log needed to operate the coordinator will be cleared after 7 days, unless strictly needed to process disputes. To ensure utmost privacy, the coordinator will be accessible only through Tor.", + "Rule 1:": " Do not share personal information through the chat, unless strictly needed for completing the trade.", + "Rule 2:": "Users are solely responsible for understanding and complying with their local laws and regulations regarding cryptocurrency transactions. By using this coordinator, you agree to ensure that your activities on the platform are lawful in your jurisdiction." }, "mainnet": { - "onion": "http://dqmmejfmtlve7d4ccohk4usriifdtci6xk4wv7igxn2fyaduh25s6did.onion", + "onion": "http://alice7bqexhtnkiqhtgkuwgtzzfkishw23ac4sfwpznrwlmnipxlomyd.onion", "clearnet": null, "i2p": null }, @@ -184,44 +194,93 @@ "clearnet": null, "i2p": null }, - "mainnetNodesPubkeys": ["028059662c65626f3002290dd3151186bc1952726c03f56012406f3ceadb81cacc"], + "mainnetNodesPubkeys": [ + "02580496598cf3e7bfe41c9b0721d1c90693d31d308364456dc30f0a22bf58ddd7" + ], "testnetNodesPubkeys": [], "federated": true }, - "alice": { - "longAlias": "Alice", - "shortAlias": "alice", - "identifier": "alice", - "description": "Alice is here to empower Bitcoin enthusiasts by providing a decentralized, non-KYC, peer-to-peer exchange platform. With a focus on privacy, security, and ease of use, Alice is committed to ensuring that all users can participate in the Bitcoin economy with autonomy and integrity.", - "motto": "Privacy is not a crime", - "color": "#9932cc", - "established": "2025-11-27", - "nostrHexPubkey": "40d33962fdf26e0910805f36a3a96b239cf93b95d4a3e6dd779f1ea3ff9b0866", + "eleuteria": { + "longAlias": "Eleuteria", + "shortAlias": "eleuteria", + "identifier": "eleuteria", + "description": "Eleuteria is a privacy-focused, non-KYC RoboSats coordinator built around the principles of financial freedom, self-sovereignty and peer-to-peer Bitcoin. It provides a Tor-only environment where users can trade directly while minimizing unnecessary trust and exposure of personal information.", + "motto": "Coordinating privacy. Broadcasting freedom.", + "color": "#C58A32", + "established": "2026-08-26", + "nostrHexPubkey": "0f243ba69b7c7ffa73934bc7f5fa6586b8013afdc310d808b1ec2c2c98f1c219", "contact": { - "email": "alice7b@proton.me", - "telegram": "", - "simplex": "https://smp12.simplex.im/a#peg1Oqqy55zhLXugHUmlZqXGkd31Fcr3HXXhvsZLQt0", - "pgp": "/static/federation/pgp/349137316F89DAF6D7E66A40D0B7C7C3C3744DBA.asc", - "nostr": "npub1grfnjcha7fhqjyyqtum282ttyww0jwu46j37dhthnu028lumppnqtenl5y", + "email": "backsocks@proton.me", + "telegram": "@asyscom", + "simplex": "https://smp17.simplex.im/a#w2lbfI-Rbea5dukWc38CVDQEzLryz8q7p2C4NGEViNg", + "pgp": "/static/federation/pgp/546143E7584783759F6829AF6DA5626C8AF8DF61.asc", + "nostr": "npub1pujrhf5m03ll5uunf0rlt7n9s6uqzwhacvgdsz93askzex83cgvsukm9hf", "website": null, - "fingerprint": "349137316F89DAF6D7E66A40D0B7C7C3C3744DBA" + "matrix": null, + "fingerprint": "546143E7584783759F6829AF6DA5626C8AF8DF61" }, "badges": { "isFounder": false, - "donatesToDevFund": 20, + "donatesToDevFund": 30, "hasGoodOpSec": true, "hasLargeLimits": false }, "policies": { - "Privacy Policy 1 \u2014 Evidence in Disputes": "In the event of a dispute, users will be asked to provide transaction-related evidence. This could include transaction IDs, screenshots of payment confirmations, or other pertinent transaction records. Personal information or unrelated transaction details should be redacted to maintain privacy.", - "Privacy Policy 2 \u2014 short-term Storage": "Sensitive information related to disputes will be stored only for the duration necessary to resolve the issue. Once resolved, the data will be permanently deleted. For ease of use e-mail communications are permitted, but E2EE and decentralized platforms such as NOSTR and SIMPLEX are advised.", - "Data Policy 1 \u2014 No Third-Party Sharing": "Under no circumstances will user information be shared with third parties. Also because it is impossible to do so by design of Robosats architecture. Due to the decentralized and privacy-centric structure of RoboSats built on the Tor network, we are unable to collect or store user information, including but not limited to, the location of users. This design ensures maximum privacy and anonymity for our users.", - "Data Policy 2 \u2014 Short-term Storage": "Any log needed to operate the coordinator will be cleared after 7 days, unless strictly needed to process disputes. To ensure utmost privacy, the coordinator will be accessible only through Tor.", + "Privacy Policy 1 — Evidence in Disputes": "In the event of a dispute, users will be asked to provide transaction-related evidence. This could include transaction IDs, screenshots of payment confirmations, or other pertinent transaction records. Personal information or unrelated transaction details should be redacted to maintain privacy.", + "Privacy Policy 2 — Short-term Storage": "Sensitive information related to disputes will be stored only for the duration necessary to resolve the issue. Once resolved, the data will be permanently deleted. For ease of use e-mail communications are permitted, but E2EE and decentralized platforms such as NOSTR and SIMPLEX are advised.", + "Data Policy 1 — No Third-Party Sharing": "Under no circumstances will user information be shared with third parties. Also because it is impossible to do so by design of Robosats architecture. Due to the decentralized and privacy-centric structure of RoboSats built on the Tor network, we are unable to collect or store user information, including but not limited to, the location of users. This design ensures maximum privacy and anonymity for our users.", + "Data Policy 2 — Short-term Storage": "Any log needed to operate the coordinator will be cleared after 7 days, unless strictly needed to process disputes. To ensure utmost privacy, the coordinator will be accessible only through Tor.", "Rule 1:": " Do not share personal information through the chat, unless strictly needed for completing the trade.", "Rule 2:": "Users are solely responsible for understanding and complying with their local laws and regulations regarding cryptocurrency transactions. By using this coordinator, you agree to ensure that your activities on the platform are lawful in your jurisdiction." }, "mainnet": { - "onion": "http://alice7bqexhtnkiqhtgkuwgtzzfkishw23ac4sfwpznrwlmnipxlomyd.onion", + "onion": "http://ixiiqsuzt7hh5qxshiqwyewyh3gyygltbygqlvlyitg3gl3u2cemk3ad.onion", + "clearnet": null, + "i2p": null + }, + "testnet": { + "onion": null, + "clearnet": null, + "i2p": null + }, + "mainnetNodesPubkeys": [ + "03808d86fee8345c7b470f792f62e3a3cba78ad49d75d4623c8e27520c34f90d5b" + ], + "testnetNodesPubkeys": [], + "federated": true + }, + "freeport": { + "longAlias": "FreePort", + "shortAlias": "freeport", + "identifier": "freeport", + "description": "Privacy-focused P2P Bitcoin exchange coordinator. Tor-only for maximum privacy.", + "motto": "Free trade, free ports, free people.", + "color": "#808080", + "established": "2026-08-28", + "nostrHexPubkey": null, + "contact": { + "email": "fp-coordinator@proton.me", + "telegram": null, + "simplex": null, + "pgp": "/static/federation/pgp/27099F12B8752D8267B6DFF28265E7B36362CF31.asc", + "nostr": null, + "website": null, + "matrix": null, + "fingerprint": "27099F12B8752D8267B6DFF28265E7B36362CF31" + }, + "badges": { + "isFounder": false, + "donatesToDevFund": 20, + "hasGoodOpSec": true, + "hasLargeLimits": false + }, + "policies": { + "Privacy Policy": "Tor-only coordinator. No KYC required. Dispute evidence handled confidentially and deleted after resolution. No user tracking or analytics.", + "Data Policy": "No data shared with or sold to third parties. Database cleared regularly except for active disputes. Coordinator operates exclusively over Tor.", + "Other Policies": "Max order size: 500,000 sats. Maker fee: 0.025%. Taker fee: 0.175%." + }, + "mainnet": { + "onion": "http://2enoseg66hme76khjjn2qvrhipnzwgwa44mewgrdphrxbhzcxd2vdiqd.onion", "clearnet": null, "i2p": null }, @@ -230,7 +289,9 @@ "clearnet": null, "i2p": null }, - "mainnetNodesPubkeys": ["02580496598cf3e7bfe41c9b0721d1c90693d31d308364456dc30f0a22bf58ddd7"], + "mainnetNodesPubkeys": [ + "03230eea7d63303c3e54076f84745aeabf447e01a572e984e77b796665419d43cc" + ], "testnetNodesPubkeys": [], "federated": true } diff --git a/frontend/static/federation/avatars/eleuteria.small.webp b/frontend/static/federation/avatars/eleuteria.small.webp new file mode 100644 index 000000000..866e883c1 Binary files /dev/null and b/frontend/static/federation/avatars/eleuteria.small.webp differ diff --git a/frontend/static/federation/avatars/eleuteria.webp b/frontend/static/federation/avatars/eleuteria.webp new file mode 100644 index 000000000..31e93ce80 Binary files /dev/null and b/frontend/static/federation/avatars/eleuteria.webp differ diff --git a/frontend/static/federation/avatars/freedomsats.small.webp b/frontend/static/federation/avatars/freedomsats.small.webp deleted file mode 100644 index 93fb1b9be..000000000 Binary files a/frontend/static/federation/avatars/freedomsats.small.webp and /dev/null differ diff --git a/frontend/static/federation/avatars/freedomsats.webp b/frontend/static/federation/avatars/freedomsats.webp deleted file mode 100644 index 5ba1c65f2..000000000 Binary files a/frontend/static/federation/avatars/freedomsats.webp and /dev/null differ diff --git a/frontend/static/federation/avatars/freeport.small.webp b/frontend/static/federation/avatars/freeport.small.webp new file mode 100644 index 000000000..13bd8f64d Binary files /dev/null and b/frontend/static/federation/avatars/freeport.small.webp differ diff --git a/frontend/static/federation/avatars/freeport.webp b/frontend/static/federation/avatars/freeport.webp new file mode 100644 index 000000000..56b583ac7 Binary files /dev/null and b/frontend/static/federation/avatars/freeport.webp differ diff --git a/frontend/static/federation/pgp/27099F12B8752D8267B6DFF28265E7B36362CF31.asc b/frontend/static/federation/pgp/27099F12B8752D8267B6DFF28265E7B36362CF31.asc new file mode 100644 index 000000000..58e02614d --- /dev/null +++ b/frontend/static/federation/pgp/27099F12B8752D8267B6DFF28265E7B36362CF31.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: 2709 9F12 B875 2D82 67B6 DFF2 8265 E7B3 6362 CF31 + +xsFNBGoVo6IBEADVLMYzkybabvAG0Lz5WCP4/hIr4vOmPtcNkA5aDgKGMhR02X0w +kAwQtmFCB+s9PVZf8sIifm+rMcjxiRtNC0xpATXWt9VREwS/z/qyCIz6mHdzNAsF +u16MuxyIBWoFQIvD636mak+oQObEp/OcJ0Q7wh4pNTr5CNYPBGWx1ASYPoMaKCD4 +iqERwtXI/CAeife+6itTyHrsp3gMRm+ntQqw9AtbS92eC7Q0xzcAWQPs+zr5U0vl +UALK1FrPdHu6uZI65nDkGst95tM2kmECsvT/bTuRQ2xpQm1GtklYwfyEZSUO2k+n +7RDlC1IHh/lRXanMP+dNlnmAiCHL5jlA/FZ7WWhuqW3h72kYN7buj1igefOdGaPl +XHEy41/+tJygHXkTDhyj8BijS8w3NW0hKSF2YRRrUN9frI5q3bYN1OGOcRJ7lpaT +f6l6hBqW0LL7JJKZNYO1p60Ph6AUwmohIwXOyYOoz5UI5ovD6Vt8V43g7AmGxlT0 +NZkOoWut5P+88Kyibza0rl7hUOfhfrf1fQI72MHYKfBcZiKId9nl6vc6HsNP3CXu +DO5L9v/MgOE6YS+JeJ6Hbkp6445PcZniT/Ua1SH1VYer8gUZVJ+Z9KcUzMwnzcJ9 +IuQoxnYEgyGGWTKcD+Jn43pv6q3CWixEGzBQiBn41flMQEBszXs+7fcqFQARAQAB +=gyRr +-----END PGP PUBLIC KEY BLOCK----- \ No newline at end of file diff --git a/frontend/static/federation/pgp/546143E7584783759F6829AF6DA5626C8AF8DF61.asc b/frontend/static/federation/pgp/546143E7584783759F6829AF6DA5626C8AF8DF61.asc new file mode 100644 index 000000000..a7ee74836 --- /dev/null +++ b/frontend/static/federation/pgp/546143E7584783759F6829AF6DA5626C8AF8DF61.asc @@ -0,0 +1,39 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: 5461 43E7 5847 8375 9F68 29AF 6DA5 626C 8AF8 DF61 + +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 +=HRUq +-----END PGP PUBLIC KEY BLOCK----- diff --git a/frontend/static/federation/pgp/9D3D3BAF4744305EE3F0B837331AB575DD78D930.asc b/frontend/static/federation/pgp/9D3D3BAF4744305EE3F0B837331AB575DD78D930.asc deleted file mode 100644 index 19c128b92..000000000 --- a/frontend/static/federation/pgp/9D3D3BAF4744305EE3F0B837331AB575DD78D930.asc +++ /dev/null @@ -1,39 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Comment: 9D3D 3BAF 4744 305E E3F0 B837 331A B575 DD78 D930 - -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 -=b2MY ------END PGP PUBLIC KEY BLOCK----- diff --git a/nodeapp/coordinators/AGENTS.md b/nodeapp/coordinators/AGENTS.md index 1632185bb..d4423b3a1 100644 --- a/nodeapp/coordinators/AGENTS.md +++ b/nodeapp/coordinators/AGENTS.md @@ -14,8 +14,9 @@ name — all three must match exactly. | lake | 104 | 1004 | ✅ yes | | | moon | 106 | 1006 | ✅ yes | | | bazaar | 107 | 1007 | ❌ same onion | testnet traffic hits mainnet service | -| freedomsats | 108 | 1008 | ❌ same onion | **BUG**: port collision with alice — see Traps | -| alice | 108 | 1008 | ❌ same onion | **BUG**: port collision with freedomsats; `upstreams.conf` wrongly points to 107/1007 | +| eleuteria | 110 | 1010 | ❌ same onion | testnet traffic hits mainnet service | +| freeport | 111 | 1011 | ❌ same onion | testnet traffic hits mainnet service | +| alice | 109 | 1009 | ❌ same onion | testnet traffic hits mainnet service | Testnet port convention: mainnet port + 900 (e.g. 102 → 1002). @@ -73,28 +74,18 @@ Reverse of the above: remove socat lines from `robosats-client.sh`, delete the users deploy a known, auditable set of coordinators torified at the container level, not a runtime-fetched list. Generating this config automatically from `federation.json` is a known improvement path but has not been implemented. -- **Testnet support in nodeapp is best-effort.** Three of five coordinators (bazaar, - freedomsats, alice) share a single onion for mainnet and testnet, so their testnet - traffic (API, WS, and relay) hits the mainnet service — the coordinator must distinguish - them server-side. Only temple and lake have distinct testnet onions with a real testnet - relay. +- **Testnet support in nodeapp is best-effort.** Four of six coordinators (bazaar, + eleuteria, freeport, alice) share a single onion for mainnet and testnet, so their + testnet traffic (API, WS, and relay) hits the mainnet service — the coordinator must + distinguish them server-side. Only temple and lake have distinct testnet onions with a + real testnet relay. ## Traps -- `coordinators/alice/upstreams.conf` comments say "Libre Bazaar" (copy-paste error) and - its upstream servers point to `127.0.0.1:107/1007` (Bazaar's ports) instead of alice's - socat ports 108/1008 — alice API/WS traffic currently routes to Libre Bazaar. Fix pending - in an open PR; live in `:latest`. -- `robosats-client.sh` assigns `mainnet_alice_port=108` and `mainnet_freedomsats_port=108` - — identical ports; the second socat process to bind will fail (`EADDRINUSE`). Fix pending - in the same PR; live in `:latest`. **Net effect: one of alice or freedomsats is - completely unreachable in any running `:latest` container.** -- All five `locations.conf` testnet avatar routes now use `/testnet/{alias}/...` +- All six `locations.conf` testnet avatar routes now use `/testnet/{alias}/...` consistent with the API/WS routes — fixed in this codebase. -- All five `locations.conf` now include a `/testnet/{alias}/relay/` route — fixed in this - codebase. For bazaar/freedomsats/alice the route proxies to the shared onion, so the - same relay serves mainnet and testnet events (the client filters by `network` tag). -- `coordinators/freedomsats/upstreams.conf` comments say "Libre freedomsats" — another - copy-paste artefact; functionally harmless but misleading. +- All six `locations.conf` now include a `/testnet/{alias}/relay/` route — fixed in this + codebase. For bazaar/eleuteria/freeport/alice the route proxies to the shared onion, so + the same relay serves mainnet and testnet events (the client filters by `network` tag). - Several `locations.conf` comments name the wrong coordinator (e.g., lake's testnet section heading says "Freedomsats Coordinator Testnet Locations", bazaar's says "TheBigLake Coordinator Mainnet") — copy-paste artefacts; functionally harmless. diff --git a/nodeapp/coordinators/freedomsats/locations.conf b/nodeapp/coordinators/eleuteria/locations.conf similarity index 70% rename from nodeapp/coordinators/freedomsats/locations.conf rename to nodeapp/coordinators/eleuteria/locations.conf index bb9fb2b7c..f333b413f 100644 --- a/nodeapp/coordinators/freedomsats/locations.conf +++ b/nodeapp/coordinators/eleuteria/locations.conf @@ -1,9 +1,9 @@ -# Freedomsats Mainnet Locations -location /mainnet/freedomsats/static/assets/avatars/ { - proxy_pass http://mainnet_freedomsats/static/assets/avatars/; +# Eleuteria Coordinator Mainnet Locations +location /mainnet/eleuteria/static/assets/avatars/ { + proxy_pass http://mainnet_eleuteria/static/assets/avatars/; } -location /mainnet/freedomsats/api/ { +location /mainnet/eleuteria/api/ { # if ($request_method = 'OPTIONS') { # add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; # add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; @@ -22,23 +22,23 @@ location /mainnet/freedomsats/api/ { # add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; # add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; # } - proxy_pass http://mainnet_freedomsats/api/; + proxy_pass http://mainnet_eleuteria/api/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; } -location /mainnet/freedomsats/ws/ { - proxy_pass http://mainnet_freedomsats/ws/; +location /mainnet/eleuteria/ws/ { + proxy_pass http://mainnet_eleuteria/ws/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; } -location /mainnet/freedomsats/relay/ { - proxy_pass http://mainnet_freedomsats/relay/; +location /mainnet/eleuteria/relay/ { + proxy_pass http://mainnet_eleuteria/relay/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; @@ -48,36 +48,36 @@ location /mainnet/freedomsats/relay/ { add_header Access-Control-Allow-Origin *; } -location /mainnet/freedomsats/blossom/ { - proxy_pass http://mainnet_freedomsats/blossom/; +location /mainnet/eleuteria/blossom/ { + proxy_pass http://mainnet_eleuteria/blossom/; proxy_http_version 1.1; proxy_set_header Host $host; client_max_body_size 12m; } -# Freedomsats Coordinator Testnet Locations -location /testnet/freedomsats/static/assets/avatars/ { - proxy_pass http://testnet_freedomsats/static/assets/avatars/; +# Eleuteria Coordinator Testnet Locations +location /testnet/eleuteria/static/assets/avatars/ { + proxy_pass http://testnet_eleuteria/static/assets/avatars/; } -location /testnet/freedomsats/api/ { - proxy_pass http://testnet_freedomsats/api/; +location /testnet/eleuteria/api/ { + proxy_pass http://testnet_eleuteria/api/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; } -location /testnet/freedomsats/ws/ { - proxy_pass http://testnet_freedomsats/ws/; +location /testnet/eleuteria/ws/ { + proxy_pass http://testnet_eleuteria/ws/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; } -location /testnet/freedomsats/relay/ { - proxy_pass http://testnet_freedomsats/relay/; +location /testnet/eleuteria/relay/ { + proxy_pass http://testnet_eleuteria/relay/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; @@ -87,8 +87,8 @@ location /testnet/freedomsats/relay/ { add_header Access-Control-Allow-Origin *; } -location /testnet/freedomsats/blossom/ { - proxy_pass http://testnet_freedomsats/blossom/; +location /testnet/eleuteria/blossom/ { + proxy_pass http://testnet_eleuteria/blossom/; proxy_http_version 1.1; proxy_set_header Host $host; client_max_body_size 12m; diff --git a/nodeapp/coordinators/eleuteria/upstreams.conf b/nodeapp/coordinators/eleuteria/upstreams.conf new file mode 100644 index 000000000..64ddfa976 --- /dev/null +++ b/nodeapp/coordinators/eleuteria/upstreams.conf @@ -0,0 +1,9 @@ +# Eleuteria Coordinator Mainnet +upstream mainnet_eleuteria { + server 127.0.0.1:110; +} + +# Eleuteria Coordinator Testnet +upstream testnet_eleuteria { + server 127.0.0.1:1010; +} diff --git a/nodeapp/coordinators/freedomsats/upstreams.conf b/nodeapp/coordinators/freedomsats/upstreams.conf deleted file mode 100644 index 94829a7f4..000000000 --- a/nodeapp/coordinators/freedomsats/upstreams.conf +++ /dev/null @@ -1,9 +0,0 @@ -# Freedomsats Coordinator Mainnet -upstream mainnet_freedomsats { - server 127.0.0.1:108; -} - -# Freedomsats Coordinator Testnet -upstream testnet_freedomsats { - server 127.0.0.1:1008; -} diff --git a/nodeapp/coordinators/freeport/locations.conf b/nodeapp/coordinators/freeport/locations.conf new file mode 100644 index 000000000..7f71693d6 --- /dev/null +++ b/nodeapp/coordinators/freeport/locations.conf @@ -0,0 +1,95 @@ +# FreePort Coordinator Mainnet Locations +location /mainnet/freeport/static/assets/avatars/ { + proxy_pass http://mainnet_freeport/static/assets/avatars/; +} + +location /mainnet/freeport/api/ { + # if ($request_method = 'OPTIONS') { + # add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; + # add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; + # add_header 'Access-Control-Max-Age' 1728000; + # add_header 'Content-Type' 'text/plain; charset=utf-8'; + # add_header 'Content-Length' 0; + # return 204; + # } + # if ($request_method = 'POST') { + # add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; + # add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; + # add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; + # } + # if ($request_method = 'GET') { + # add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; + # add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; + # add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; + # } + proxy_pass http://mainnet_freeport/api/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; +} + +location /mainnet/freeport/ws/ { + proxy_pass http://mainnet_freeport/ws/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; +} + +location /mainnet/freeport/relay/ { + proxy_pass http://mainnet_freeport/relay/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Origin $http_origin; + proxy_set_header Host $host; + + add_header Access-Control-Allow-Origin *; +} + +location /mainnet/freeport/blossom/ { + proxy_pass http://mainnet_freeport/blossom/; + proxy_http_version 1.1; + proxy_set_header Host $host; + client_max_body_size 12m; +} + +# FreePort Coordinator Testnet Locations +location /testnet/freeport/static/assets/avatars/ { + proxy_pass http://testnet_freeport/static/assets/avatars/; +} + +location /testnet/freeport/api/ { + proxy_pass http://testnet_freeport/api/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; +} + +location /testnet/freeport/ws/ { + proxy_pass http://testnet_freeport/ws/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; +} + +location /testnet/freeport/relay/ { + proxy_pass http://testnet_freeport/relay/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Origin $http_origin; + proxy_set_header Host $host; + + add_header Access-Control-Allow-Origin *; +} + +location /testnet/freeport/blossom/ { + proxy_pass http://testnet_freeport/blossom/; + proxy_http_version 1.1; + proxy_set_header Host $host; + client_max_body_size 12m; +} diff --git a/nodeapp/coordinators/freeport/upstreams.conf b/nodeapp/coordinators/freeport/upstreams.conf new file mode 100644 index 000000000..4f522e9b6 --- /dev/null +++ b/nodeapp/coordinators/freeport/upstreams.conf @@ -0,0 +1,9 @@ +# FreePort Coordinator Mainnet +upstream mainnet_freeport { + server 127.0.0.1:111; +} + +# FreePort Coordinator Testnet +upstream testnet_freeport { + server 127.0.0.1:1011; +} diff --git a/nodeapp/nginx.conf b/nodeapp/nginx.conf index 56e239f22..f6c73701e 100644 --- a/nodeapp/nginx.conf +++ b/nodeapp/nginx.conf @@ -34,8 +34,10 @@ http { include /etc/nginx/conf.d/lake/upstreams.conf; # Libre Bazaar include /etc/nginx/conf.d/bazaar/upstreams.conf; - # FreedomSats - include /etc/nginx/conf.d/freedomsats/upstreams.conf; + # Eleuteria + include /etc/nginx/conf.d/eleuteria/upstreams.conf; + # FreePort + include /etc/nginx/conf.d/freeport/upstreams.conf; # Alice include /etc/nginx/conf.d/alice/upstreams.conf; @@ -83,8 +85,10 @@ http { include /etc/nginx/conf.d/lake/locations.conf; # Libre Bazaar include /etc/nginx/conf.d/bazaar/locations.conf; - # FreedomSats - include /etc/nginx/conf.d/freedomsats/locations.conf; + # Eleuteria + include /etc/nginx/conf.d/eleuteria/locations.conf; + # FreePort + include /etc/nginx/conf.d/freeport/locations.conf; # Alice include /etc/nginx/conf.d/alice/locations.conf; diff --git a/nodeapp/robosats-client.sh b/nodeapp/robosats-client.sh index 41bead8c7..954dbd442 100644 --- a/nodeapp/robosats-client.sh +++ b/nodeapp/robosats-client.sh @@ -46,16 +46,28 @@ testnet_bazaar_socat="socat tcp4-LISTEN:${testnet_bazaar_port},reuseaddr,fork,ke ################################ -# Freedomsats +# Eleuteria # Mainnet -mainnet_freedomsats_onion=dqmmejfmtlve7d4ccohk4usriifdtci6xk4wv7igxn2fyaduh25s6did.onion -mainnet_freedomsats_port=108 +mainnet_eleuteria_onion=ixiiqsuzt7hh5qxshiqwyewyh3gyygltbygqlvlyitg3gl3u2cemk3ad.onion +mainnet_eleuteria_port=110 # Testnet -testnet_freedomsats_onion=dqmmejfmtlve7d4ccohk4usriifdtci6xk4wv7igxn2fyaduh25s6did.onion -testnet_freedomsats_port=1008 +testnet_eleuteria_onion=ixiiqsuzt7hh5qxshiqwyewyh3gyygltbygqlvlyitg3gl3u2cemk3ad.onion +testnet_eleuteria_port=1010 # socat cmd -mainnet_freedomsats_socat="socat tcp4-LISTEN:${mainnet_freedomsats_port},reuseaddr,fork,keepalive,bind=127.0.0.1 SOCKS5-CONNECT:${TOR_PROXY_IP:-127.0.0.1}:${mainnet_freedomsats_onion}:80,socksport=${TOR_PROXY_PORT:-9050}" -testnet_freedomsats_socat="socat tcp4-LISTEN:${testnet_freedomsats_port},reuseaddr,fork,keepalive,bind=127.0.0.1 SOCKS5-CONNECT:${TOR_PROXY_IP:-127.0.0.1}:${testnet_freedomsats_onion}:80,socksport=${TOR_PROXY_PORT:-9050}" +mainnet_eleuteria_socat="socat tcp4-LISTEN:${mainnet_eleuteria_port},reuseaddr,fork,keepalive,bind=127.0.0.1 SOCKS5-CONNECT:${TOR_PROXY_IP:-127.0.0.1}:${mainnet_eleuteria_onion}:80,socksport=${TOR_PROXY_PORT:-9050}" +testnet_eleuteria_socat="socat tcp4-LISTEN:${testnet_eleuteria_port},reuseaddr,fork,keepalive,bind=127.0.0.1 SOCKS5-CONNECT:${TOR_PROXY_IP:-127.0.0.1}:${testnet_eleuteria_onion}:80,socksport=${TOR_PROXY_PORT:-9050}" + +################################ +# FreePort +# Mainnet +mainnet_freeport_onion=2enoseg66hme76khjjn2qvrhipnzwgwa44mewgrdphrxbhzcxd2vdiqd.onion +mainnet_freeport_port=111 +# Testnet +testnet_freeport_onion=2enoseg66hme76khjjn2qvrhipnzwgwa44mewgrdphrxbhzcxd2vdiqd.onion +testnet_freeport_port=1011 +# socat cmd +mainnet_freeport_socat="socat tcp4-LISTEN:${mainnet_freeport_port},reuseaddr,fork,keepalive,bind=127.0.0.1 SOCKS5-CONNECT:${TOR_PROXY_IP:-127.0.0.1}:${mainnet_freeport_onion}:80,socksport=${TOR_PROXY_PORT:-9050}" +testnet_freeport_socat="socat tcp4-LISTEN:${testnet_freeport_port},reuseaddr,fork,keepalive,bind=127.0.0.1 SOCKS5-CONNECT:${TOR_PROXY_IP:-127.0.0.1}:${testnet_freeport_onion}:80,socksport=${TOR_PROXY_PORT:-9050}" ################################ # Alice @@ -77,4 +89,4 @@ if [ ! -f /etc/nginx/ssl/server.crt ]; then -subj "/CN=robosats_client" -addext "subjectAltName=DNS:localhost,IP:127.0.0.1" fi -$mainnet_temple_socat & $testnet_temple_socat & $mainnet_lake_socat & $testnet_lake_socat & $mainnet_bazaar_socat & $testnet_bazaar_socat & $mainnet_freedomsats_socat & $testnet_freedomsats_socat & $mainnet_alice_socat & $testnet_alice_socat & nginx +$mainnet_temple_socat & $testnet_temple_socat & $mainnet_lake_socat & $testnet_lake_socat & $mainnet_bazaar_socat & $testnet_bazaar_socat & $mainnet_eleuteria_socat & $testnet_eleuteria_socat & $mainnet_freeport_socat & $testnet_freeport_socat & $mainnet_alice_socat & $testnet_alice_socat & nginx