Fix some key errors and remove some now unused files

This commit is contained in:
mDuo13
2024-01-31 18:16:42 -08:00
parent 7645140477
commit dd2366fadd
92 changed files with 7 additions and 27932 deletions

View File

@@ -41,8 +41,6 @@ XRPL Dev Portalでは、開発者が開発を開始するためのサンプル
- `shared/` - Configuration files for some dependencies like CodeMirror.
- `static/` - Static files used by the site's templates and theme.
- `styles/` - SCSS source files for custom CSS.
- `template/` - **DEPRECATED** Old template files.
- `tool/` - **DEPRECATED** Old scripts and tools.
- `redirects.yaml` - Definitions of redirects from old site URLs to current paths.
- `redocly.yaml` - Main config file for the site.
- `sidebars.yaml` - Defines sidebars for the Documentation and Resources sections.

View File

@@ -77,8 +77,6 @@ export default function Impact() {
<div>
{/* Large */}
<div className="col d-none d-lg-block align-self-center">
{/* <div className="mt-10" id="map-dark" />
<div className="mt-10" id="map-light" /> */}
{View}
</div>
</div>
@@ -144,7 +142,7 @@ export default function Impact() {
<div className="d-flex flex-column-reverse">
<h2 className="h4 h2-sm mb-10-until-sm mb-8-sm">
{translate(
"Featured companies &amp; projects running on the XRP Ledger."
"Featured companies & projects running on the XRP Ledger."
)}
</h2>
<h6 className="eyebrow mb-3">

View File

@@ -395,7 +395,7 @@ export default function XrpOverview() {
<h6 className="fs-4-5">{translate("Hardware Wallets")}</h6>
</li>
{hardwallets.map((wallet) => (
<li className="nav-item">
<li className="nav-item" key={wallet.id}>
<a
className="nav-link external-link"
href={wallet.href}

View File

@@ -1,113 +0,0 @@
/**
* THis is very hacky script to convert jinja templates to jsx.
* It doesn't cover all cases yet. I tested it for index page only.
*/
const fs = require('fs');
const path = require('path');
const HtmlToJsx = require('htmltojsx');
const fileName = process.argv[2];
const pageName = path.basename(fileName, '.html.jinja').replace('page-', '').replace('home', 'index');
const outputFileName = 'content/' + pageName + '.page.tsx';
const componentName = pageName.substring(0, 1).toUpperCase() + pageName.substring(1);
const content = fs.readFileSync(fileName, 'utf8');
const mainBlockOffset = content.indexOf('{% block main %}');
const mainBlockEndOffset = content.indexOf('{% endblock %}', mainBlockOffset);
const mainBlock = content.substring(mainBlockOffset + 16, mainBlockEndOffset);
const classes = content.match(/{% block mainclasses %}(.+?){% endblock %}/)?.[1] || '';
const setStatements = mainBlock.match(/{% set ([\w\d]+) = ((.|\n)+?)%}/g);
const sets = setStatements?.map(setStatement => {
const setStatementParts = setStatement.split(' = ');
const setStatementName = setStatementParts[0].replace('{% set ', '');
const setStatementValue = setStatementParts[1].replace(/%}/g, '');
return {
name: setStatementName,
value: setStatementValue.replace(/_\("(.+?)"\)/g, '"$1"'),
};
});
const mainBlockWithoutSets = mainBlock.replace(/{% set ([\w\d]+) = ((.|\n)+?)%}/g, '');
const replacedJinja = mainBlockWithoutSets
.replace(/{%/g, '$$$$')
.replace(/%}/g, '$$$$')
.replace(/{{/g, '$$$$')
.replace(/}}/g, '$$$$');
const HtmlToJsxInst = new HtmlToJsx({
createClass: false,
indent: ' ',
});
const jsx = HtmlToJsxInst.convert(replacedJinja);
// replace trans
// Specifically handling <img> tags
const handleImgTags = (str) => {
return str.replace(/<img ([^>]*?)>/g, function(match) {
// If alt is not present, add a default one
if (!/alt=/.test(match)) {
return match.replace(/<img /, '<img alt="default-alt-text" ');
}
// If alt is present but malformed
if (/alt=\{(\d+)\}/.test(match)) {
return match.replace(/alt=\{(\d+)\}/, `alt="default-alt-text"`);
}
return match; // if alt is fine, return as is
});
};
const jsxWithHandledImgTags = handleImgTags(jsx);
// replace $$ for card in cards3 $$
const jsxWithReplacedForLoops = jsxWithHandledImgTags
.replace(/\$\$ for ([\w\d]+) in ([\w\d]+) \$\$/g, ' { $2.map($1 => (')
.replace(/\$\$ endfor \$\$/g, ')) }')
.replace(/="\$\$(\w+\.\w+)\$\$"/g, '={$1}')
.replace(/="\$\$(\w+\.\w+)\$\$\$\$(\w+\.\w+)\$\$"/g, '={$1 + $2}')
.replace(/="\$\$(\w+\.\w+)\$\$(.+?)"/g, '={$1 + "$2"}')
.replace(/\$\$(\w+\.\w+)\$\$/g, '{$1}')
.replace(/<img ([^>]*?)src="(.*?)"/g, '<img $1src={require("$2")}')
.replace(/<img ([^>]*?)src="(.*?)"/g, (match, attrs, src) => {
// Replace ./assets with ./static in the src attribute
const newSrc = src.replace('./assets', './static');
return `<img ${attrs}src={require("${newSrc}")}`;
});
const jsxWithReplacedTranslate = jsxWithReplacedForLoops.replace(
/\$\$ trans \$\$((?:.|\n)+?)\$\$ endtrans \$\$/g,
(match, match1) => {
if (match1.indexOf('<br className="until-sm" />') > -1) {
const parts = match1.split('<br className="until-sm" />');
return parts.map(part => '{translate(' + JSON.stringify(part) + ')}').join('<br className="until-sm" />' + '\n');
}
return '{translate(' + JSON.stringify(match1) + ')}';
}
);
const output = `import * as React from 'react';
import { useTranslate } from '@portal/hooks';
${!!sets && sets.map(set => `const ${set.name} = ${set.value};`).join('\n\n')}
const target= {prefix: ''}; // TODO: fixme
export default function ${componentName}() {
const { translate } = useTranslate();
return (
<div className="${classes}">
${jsxWithReplacedTranslate}
</div>
)
}
`;
fs.writeFileSync(outputFileName, output, 'utf8');

View File

@@ -1,85 +0,0 @@
// const fs = require('fs');
// const path = require('path');
// const MarkdownIt = require('markdown-it');
// const { JSDOM } = require('jsdom');
// const csDir = 'content/_code-samples/';
// const skipDirs = ['node_modules', '.git', '__pycache__'];
// const wordsToCaps = ['xrp'];
// const markdown = new MarkdownIt();
// let net, tls;
// if (typeof window === 'undefined') {
// net = require('net');
// tls = require('tls');
// }
// const toTitleCase = (s) => {
// const words = s.split(/_|[^\w']/);
// return words
// .filter((word) => word)
// .map((word) => (wordsToCaps.includes(word) ? word.toUpperCase() : word.charAt(0).toUpperCase() + word.slice(1)))
// .join(' ')
// .replace("'S", "'s")
// .replace(" A ", " a ");
// };
// let langs = [];
// const sortfunc = (cs) => {
// if (cs.title.includes('Intro') || cs.title.includes('Quickstart')) {
// return ` ${cs.title}`;
// }
// return cs.title;
// };
// const allCodeSamples = () => {
// const cses = [];
// const walkDir = (dirPath) => {
// const filenames = fs.readdirSync(dirPath);
// for (const skip of skipDirs) {
// const index = filenames.indexOf(skip);
// if (index > -1) filenames.splice(index, 1);
// }
// filenames.forEach((file) => {
// const fullPath = path.join(dirPath, file);
// if (fs.statSync(fullPath).isDirectory()) {
// walkDir(fullPath);
// } else if (file === 'README.md') {
// const md = fs.readFileSync(fullPath, 'utf-8');
// const html = markdown.render(md);
// const dom = new JSDOM(html);
// const document = dom.window.document;
// const h = document.querySelector('h1, h2, h3');
// const p = document.querySelector('p');
// const cs = {
// path: dirPath,
// title: h ? h.textContent : toTitleCase(path.basename(dirPath)),
// description: p ? p.textContent : '',
// href: dirPath,
// // you can fill the 'langs' array as per your logic
// langs: [],
// };
// // Add unique names to list for sorting
// if (!langs.includes(cs.langs)) {
// langs.push(cs.langs);
// }
// cses.push(cs);
// }
// });
// };
// walkDir(csDir);
// return cses.sort((a, b) => sortfunc(a).localeCompare(sortfunc(b)));
// };
// export { allCodeSamples, langs as allLangs };

View File

@@ -71,7 +71,7 @@ theme:
href: https://learn.xrpl.org/
external: true
- label: XRPL Brand Kit
href: https://xrpl.org/XRPL_Brand_Kit.zip
href: /XRPL_Brand_Kit.zip
external: true
- label: Ledger Explorer
href: https://livenet.xrpl.org/

View File

@@ -56,12 +56,13 @@ export default function CodeSamples() {
<div className="row col-md-12 px-0" id="code_samples_list">
{codeSamples.map(card => (
<a
key={card.href}
className={`card cardtest col-12 col-lg-5 ${card.langs.join(' ')}`}
href={target.github_forkurl + `/tree/${target.github_branch}/${card.href}`}
>
<div className="card-header">
{card.langs.map(lang => (
<span className="circled-logo">
<span className="circled-logo" key={lang}>
<img alt={lang} src={langIcons[lang]} />
</span>
))}

View File

@@ -39,8 +39,6 @@ The official source repository for the site is at <https://github.com/XRPLF/xrpl
- `shared/` - Configuration files for some dependencies like CodeMirror.
- `static/` - Static files used by the site's templates and theme.
- `styles/` - SCSS source files for custom CSS.
- `template/` - **DEPRECATED** Old template files.
- `tool/` - **DEPRECATED** Old scripts and tools.
- `redirects.yaml` - Definitions of redirects from old site URLs to current paths.
- `redocly.yaml` - Main config file for the site.
- `sidebars.yaml` - Defines sidebars for the Documentation and Resources sections.

View File

@@ -625,7 +625,7 @@
href: https://learn.xrpl.org/
external: true
- label: XRPL Brand Kit
href: /static/XRPL_Brand_Kit.zip
href: /XRPL_Brand_Kit.zip
external: true
- label: Ledger Explorer
href: https://livenet.xrpl.org/

View File

@@ -1,252 +0,0 @@
<!DOCTYPE html>
<html lang="{{target.lang}}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>{{ currentpage.name }} - {{target.display_name}}</title>
<meta name="viewport" content="width=device-width">
<meta property="og:title" content="{{ currentpage.name|escape }} | {{ target.display_name }}">
<meta property="og:url" content="https://xrpl.org/{% if currentpage.html != 'index.html' %}{{currentpage.html}}{% endif %}" />
<meta property="og:description" content="{% if currentpage.blurb %}{{ currentpage.blurb|escape}}{% else %}{{ target.blurb|escape }}{% endif %}" />
<meta name="description" content="{% if currentpage.blurb %}{{ currentpage.blurb|escape}}{% else %}{{ target.blurb|escape }}{% endif %}" />
<meta property="og:image" content="https://xrpl.org/assets/img/{% if currentpage.fb_card %}{{currentpage.fb_card}}{% else %}xrpl-fb-li-card.png{% endif %}" />
<meta name="twitter:card" content="summary" />
<meta name="twitter:image" content="https://xrpl.org/assets/img/{% if currentpage.twitter_card %}{{currentpage.twitter_card}}{% else %}xrpl-twitter-card.png{% endif %}" />
{% if currentpage.canonical_url %}<link rel="canonical" href="{{currentpage.canonical_url}}" />{% endif %}
<meta name="robots" content="index, follow" />
<meta name="docsearch:language" content="{{target.lang}}" />
{% for lang in config.languages %}
<link rel="alternate" href="https://xrpl.org{{lang.prefix}}{{currentpage.html}}" hreflang="{{lang.code}}" />
{% endfor %}
<link rel="alternate" href="https://xrpl.org/{{currentpage.html}}" hreflang="x-default" /><!-- Default: US english -->
<!-- favicon -->
<link rel="apple-touch-icon" sizes="180x180" href="{{currentpage.prefix}}assets/favicons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="16x16" href="{{currentpage.prefix}}assets/favicons/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="{{currentpage.prefix}}assets/favicons/favicon-32x32.png">
<link rel="manifest" href="{{currentpage.prefix}}assets/favicons/site.webmanifest">
<link rel="shortcut icon" href="favicon.ico">
<meta name="msapplication-TileColor" content="#25A768">
<meta name="msapplication-config" content="{{currentpage.prefix}}assets/favicons/browserconfig.xml">
<meta name="theme-color" content="#25A768">
{% if target.light_theme_enabled %}
<!-- The page supports both dark and light color schemes, and the page author prefers dark. -->
<meta name="color-scheme" content="dark light">
{% endif %}
<!-- jQuery -->
<script src="{{currentpage.prefix}}assets/vendor/jquery-3.7.1.min.js"></script>
<!-- Google Tag Manager -->
{% block analytics %}{% endblock %}
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-KCQZ3L8');</script>
<!-- Stylesheet -->
{% if target.lang=="ja" %}
<link href="{{currentpage.prefix}}assets/css/fonts-ja.css" rel="stylesheet" />
{% endif %}
<link href="{{currentpage.prefix}}assets/css/devportal2022-v25.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@docsearch/css@3" />
<script src="https://cmp.osano.com/AzyjT6TIZMlgyLyy8/f11f7772-8ed5-4b73-bd17-c0814edcc440/osano.js"></script>
<link rel="stylesheet" href="https://www.unpkg.com/@xrpl/ai-css/xrplai.css" />
{% if "js_editor" in currentpage.filters %}
<script src="{{currentpage.prefix}}assets/vendor/jshint.js"></script>
<script src="{{currentpage.prefix}}assets/vendor/codemirror-js-json-lint.min.js"></script>
<script src="{{currentpage.prefix}}assets/vendor/cm-javascript-lint.js"></script>
<script src="{{currentpage.prefix}}assets/js/js-editor.js"></script>
{% endif %}
{% if target.light_theme_enabled %}
<!-- Theme switch -->
<script src="{{currentpage.prefix}}assets/js/theme-switch.js"></script>
{% endif %}
{% block head %}
{% endblock %}
</head>
<body class="xrp-ledger-dev-portal {% if currentpage.sidebar is undefined or currentpage.sidebar != "disabled" %}sidebar-primary {% endif %}lang-{{target.lang}} {% block bodyclasses %}{% endblock %}" data-spy="scroll" data-target=".page-toc" data-offset="0" id="xrp-ledger-dev-portal">
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-KCQZ3L8"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
{% include 'component-top-nav.html.jinja' %}
<div class="container-fluid" role="document" id="main_content_wrapper">
<div class="row">
<!-- Right sidebar first so it's at the beginning for mobile layouts -->
{% if currentpage.sidebar is undefined or (currentpage.sidebar != "disabled" and currentpage.sidebar != "left_only") %}
<aside class="right-sidebar col-lg-3 order-lg-4" role="complementary">
{% block right_sidebar %}{% endblock %}
</aside>
{% endif %}
<!-- main column -->
<main class="main {% if currentpage.sidebar is defined and currentpage.sidebar == "disabled" %}col-md-12{% elif currentpage.sidebar == "left_only" %}col-lg-9 col-md-7{% else %}col-md-7 col-lg-6{% endif %} order-md-3 {% block mainclasses %}{% endblock %}" role="main" id="main_content_body">
{% block breadcrumbs %}
{% include 'component-breadcrumbs.html.jinja' %}
{% endblock %}
{% block main %}{% endblock %}
</main>
{% if currentpage.sidebar is undefined or currentpage.sidebar != "disabled" %}
<!-- Left sidebar last so it's at the end for mobile -->
<aside class="left-sidebar col-md-5 col-lg-3 order-md-1" role="complementary">
{% block left_sidebar %}
{% set docs_top = pages|selectattr('html', 'defined_and_equalto', 'docs.html')|list|first %}
{% if docs_top.is_ancestor_of(currentpage.html) %}
{% set tree_top = docs_top %}
{% endif %}
{% include "component-tree-nav.html.jinja" %}
{% endblock %}
{% block bottom_left_sidebar %}
{% endblock %}
</aside>
{% endif %}
</div><!--/.row (main layout)-->
</div>
{% include 'component-footer.html.jinja' %}
<!-- Non-blocking resources -->
<!-- Bootstrap JS -->
<script src="{{currentpage.prefix}}assets/vendor/bootstrap.min.js"></script>
<!-- fontawesome icons -->
<link rel="stylesheet" href="{{currentpage.prefix}}assets/vendor/fontawesome/css/font-awesome.min.css" />
<!-- Algolia DocSearch -->
<script src="https://cdn.jsdelivr.net/npm/@docsearch/js@3"></script>
<script type="text/javascript">
$(document).ready(() => {
const ds = docsearch({
apiKey: '3431349deec23b0bc3dcd3424beb9a6e',
indexName: 'xrpl',
container: '#topsearchboxcontainer',
appId: 'R39QY3MZC7',
searchParameters: { 'facetFilters': ["lang:{{target.lang}}"] },
debug: false
});
const search_params = new URLSearchParams(window.location.search)
if (search_params.has("q")) {
$(".navbar-toggler").click() // Show nav on mobile since search is in there
ds.autocomplete.autocomplete.setVal(search_params.get("q"))
ds.autocomplete.autocomplete.open()
}
})
</script>
<!-- XRPL AI -->
<script id="xrplai-options">
var TARGET_XRPL_DEV_PORTAL_BRANCH = 'main';
var PROMPT_MODE = 'prompt';
var RUNTIME_LOCATION = 'ripplex';
var DEV_XRPLAI_RIPPLEX_IO_PROJECT_KEY = `uPcw5BckVeKgyF2NE6la4VVFtA56OBQ4`;
var DEV_XRPLAI_RIPPLEX_API_BASE_URL = 'https://api.ai.xrpl.org';
var LOCALHOST_API_BASE_URL = 'http://api.localhost:3000';
var CHAT_ENDPOINT = '/v1/chat';
var PROMPT_ENDPOINT = '/v1/chat';
var FEEDBACK_ENDPOINT = '/v1/feedback';
var BASE_URL = RUNTIME_LOCATION === 'ripplex'
? DEV_XRPLAI_RIPPLEX_API_BASE_URL
: LOCALHOST_API_BASE_URL;
var CHAT_API_URL = `${BASE_URL}${CHAT_ENDPOINT}`;
var PROMPT_API_URL = `${BASE_URL}${PROMPT_ENDPOINT}`;
var FEEDBACK_API_URL = `${BASE_URL}${FEEDBACK_ENDPOINT}`;
/** @type {import('@xrpl/ai-react').MarkpromptOptions} */
window.markprompt = {
projectKey: DEV_XRPLAI_RIPPLEX_IO_PROJECT_KEY,
defaultView: 'prompt',
options: {
chat: {
enabled: PROMPT_MODE === 'chat',
apiUrl: CHAT_API_URL,
},
feedback: {
enabled: true,
apiUrl: FEEDBACK_API_URL,
},
prompt: {
apiUrl: PROMPT_API_URL,
systemPrompt: `
You are a very enthusiastic company representative who loves to help people! Given the following sections from the documentation (preceded by a section id), answer the question using only that information, outputted in Markdown format. If you are unsure and the answer is not explicitly written in the documentation, say "{{I_DONT_KNOW}}".
Context sections:
---
{{CONTEXT}}
Question: "{{PROMPT}}"
Answer (including related code snippets if available and markdown links to relevant things):
`.trim(),
},
references: {
getHref: (reference) => {
const { file } = reference;
if (file && file.path) {
// /\/content\/[^_][^/]*\.md/.test(file.path)
if (file.path.includes('content/') && !file.path.includes('content/_') && file.path.endsWith('.md')) {
// Remove the extension if it's a regular content page that lives on xrpl.org
// return file.path.replace(/\.[^.]+$/, '');
// Change extension to html and remove content/ from the URL
if (file.path.endsWith('ja.md')) {
// Japanese lives at /ja/<filename>.html
return `ja/${file.path.replace(/content\//, '').replace(/\.ja\.md$/, '.html')}`
}
return file.path.replace(/content\//, '').replace(/\.md$/, '.html')
} else {
// Otherwise link to a file on the github repo such as .js or README.md
return `https://github.com/XRPLF/xrpl-dev-portal/blob/master/${file.path}`;
}
} else {
// Handle the case where file or file.path is missing
return '';
}
},
getLabel: (reference) => {
return reference.meta?.leadHeading?.value || reference.file?.title;
},
},
showBranding: false,
trigger: {
floating: true,
},
search: {
enabled: true,
provider: {
name: 'algolia',
apiKey: '3431349deec23b0bc3dcd3424beb9a6e',
appId: 'R39QY3MZC7',
indexName: 'xrpl',
},
}
},
};
</script>
<script id="initjs" type="module" src="https://www.unpkg.com/@xrpl/ai-web/dist/init.js"></script>
{% if currentpage.embed_xrpl_js %}
<!-- ripple-lib & prerequisites -->
{{currentpage.ripple_lib_tag}}
{% endif %}
{% if "interactive_steps" in currentpage.filters %}
<!-- Helper for interactive tutorials -->
<script type="application/javascript" src="{{currentpage.prefix}}assets/js/interactive-tutorial.js"></script>
{% endif %}
{% block endbody %}{% endblock %}
</body>
</html>

View File

@@ -1,29 +0,0 @@
<nav class="breadcrumbs-wrap" aria-label="breadcrumb">
<ul class="breadcrumb">
{% set ns=namespace(crumbs = []) -%}
{%- macro get_crumbs(page) %}
{% if page.parent is undefined or page.parent == "index.html" %}
{% set homepage = pages|selectattr('html', 'defined_and_equalto', 'index.html')|list|first %}
{% set _ = ns.crumbs.insert(0, homepage) %}
{% else %}
{% set parent = pages|selectattr('html', 'defined_and_equalto', page.parent)|list|first %}
{% if parent is undefined %}
{% include "ERROR: Page "+page.html+" specifies a parent that doesn't exist in this target: "+page.parent %}
{% else %}
{% set _ = ns.crumbs.insert(0, parent) -%}
{{ get_crumbs(parent) }}
{% endif %}
{%- endif -%}
{%- endmacro %}
{{ get_crumbs(currentpage) }}
{% if currentpage.html != "index.html" %}
{%- for page in ns.crumbs %}
<li class="active breadcrumb-item"><a href="
{%- if page is defined and "//" not in page.html %}{{ currentpage.prefix }}{% endif -%}
{{ page.html }}">{{ page.name }}</a></li>
{% endfor %}
{% endif %}
<li class="active breadcrumb-item">{{ currentpage.name }}</li>
</ul>
</nav><!--/.breadcrumbs-wrap-->

View File

@@ -1,28 +0,0 @@
{# curated_cards must be defined first #}
{% if mobile_cols is undefined %}
{% set mobile_cols = 1 %}
{% endif %}
{% if desktop_cols is undefined %}
{% set desktop_cols = 4 %}
{% endif %}
{% if show_blurbs is undefined %}
{% set show_blurbs = True %}
{% endif %}
<div class="row row-cols-{{mobile_cols}} row-cols-lg-{{desktop_cols}} card-deck">
{% for cc in curated_cards %}
{% set page = pages|selectattr("html", "defined_and_equalto", cc)|first %}
<a class="card" href="{{target.prefix}}{{page.html}}">
<div class="card-body">
{% if page.showcase_icon is defined %}
<div class="circled-logo"><img src="{{page.showcase_icon}}" /></div>
{% endif %}
<h4 class="card-title h5">{% if page.top_nav_name is defined %}{{page.top_nav_name}}{% else %}{{page.name}}{% endif %}</h4>
{% if show_blurbs %}
<p class="card-text">{{page.blurb}}</p>
{% endif %}
</div>
<div class="card-footer">&nbsp;</div>
</a>
{% endfor %}
</div>

View File

@@ -1,19 +0,0 @@
<!-- Feedback Widget -->
<script src="{{currentpage.prefix}}assets/vendor/feedback-widget.js"></script>
<div id="feedback-content"></div>
<script>
// Options
const options = {
analyticsConfig: [
// { name: 'ga', id: 'UA-45576805-2' },
{ name: 'gtm', id: 'GTM-KCQZ3L8' },
],
analyticsName: 'Feedback Widget Tracker',
theme: 'xrpl',
currentPath: window.location.pathname,
parentElement: '#feedback-content',
};
// Init WidgetClass
const r = new WidgetClass(options);
</script>

View File

@@ -1,34 +0,0 @@
<footer class="xrpl-footer" role="contentinfo">
<section class="container-fluid">
<div class="row">
{% for parent_page in (pages|first).children %}
<div class="col-lg">
<h5>{% if parent_page.top_nav_name is defined %}{{ parent_page.top_nav_name }}{% else %}{{parent_page.name}}{% endif %}</h5>
<ul class="nav footer-nav flex-column">
<li class="nav-item"><a href="{% if '//' not in parent_page.html %}{{currentpage.prefix}}{% endif %}{{parent_page.html}}" class="nav-link">{{parent_page.name}}</a></li>
{% for page in parent_page.children %}
{% if not page.nav_omit %}
<li class="nav-item"><a href="{% if '//' not in page.html %}{{currentpage.prefix}}{% endif %}{{page.html}}" class="nav-link{% if '//' in page.html %} external-link{% endif %}">{% if page.top_nav_name is defined %}{{page.top_nav_name}}{% else %}{{page.name}}{% endif %}</a></li>
{% endif %}
{% endfor %}
</ul>
</div><!--/.col -->
{% endfor %}
</section>
<section class="container-fluid mt-20 absolute-bottom-footer">
<div class="d-lg-flex row">
<a href="{% if currentpage.prefix %}{{currentpage.prefix}}{% else %}/{% endif %}" class="footer-brand"><img src="{{currentpage.prefix}}assets/img/XRPLedger_DevPortal-white.svg" class="logo" height="24" alt="{{target.display_name}}" /></a>
<span class="flex-grow-1">&nbsp;</span>
<div class="copyright-license">&copy; 2023 XRP Ledger. <a href="https://raw.githubusercontent.com/XRPLF/xrpl-dev-portal/master/LICENSE">{% trans %}Open Source.{% endtrans %}</a>
</div>
</div><!-- /.absolute_bottom_footer -->
</section>
</footer>
<!-- Jump to top button -->
<a href="#main_content_wrapper" class="jump-to-top btn btn-primary" role="button" title="{% trans %}Jump to top of page{% endtrans %}"><i class="fa fa-arrow-up"></i></a>
<script type="text/javascript" src="{{currentpage.prefix}}assets/js/jump-to-top.js"></script>

View File

@@ -1,28 +0,0 @@
<div class="github-edit-wrap">
{% if target.github_forkurl is defined %}
{% set have_edit_link = False %}
{% if currentpage.md is defined %}
{% if currentpage.md.startswith("http://") or
currentpage.md.startswith("https://") %}
{# Leave have_edit_link = False #}
{% else %}
{% set have_edit_link = True %}
{% set githuburl = target.github_forkurl + "/edit/"
+ target.github_branch
+ "/content/" + currentpage.md %}
{% endif %}
{% elif currentpage.template is defined %}
{% set have_edit_link = True %}
{% set githuburl = target.github_forkurl + "/edit/"
+ target.github_branch + "/tool/" + currentpage.template %}
{% endif %}
{% if target.is_pr_build is defined and target.is_pr_build and have_edit_link %}
{% set githuburl = githuburl + "?pr=/XRPLF/xrpl-dev-portal/pull/"
+ target.github_pr_id %}
{% endif %}
{% if not have_edit_link %}
{% set githuburl = target.github_forkurl %}
{% endif %}
<a href="{{githuburl}}" target="_blank" class="btn btn-primary github-edit">{% trans %}Edit page{% endtrans %}</a>
{% endif %}
</div><!-- /.github-edit -->

View File

@@ -1,20 +0,0 @@
{% if use_page is undefined %}{% set use_page = currentpage %}{% endif %}
{% if use_page.labels %}
<div class="labels-wrap">
<ul class="list-inline">
{% for label in use_page.labels %}
{% set label_landing = pages|selectattr("landing_for", "defined_and_equalto", label)|first %}
{% if label_landing %}
<li class="list-inline-item">
<a href="{% if "//" not in label_landing.html %}{{target.prefix}}{% endif %}{{label_landing.html}}" class="label label-{{slug(label)}}">{{label}}</a>
</li>
{% else %}
<li class="list-inline-item">
<span class="label label-{{slug(label)}}">{{label}}</span>
<!-- TEMPLATE WARNING: no label landing found for "{{label}}" -->
</li>
{% endif %}
{% endfor %}
</ul>
</div><!--/.labels-wrap-->
{% endif %}

View File

@@ -1 +0,0 @@
<span class="status not_enabled" title="This feature is not currently enabled on the production XRP Ledger."><i class="fa fa-flask"></i></span>

View File

@@ -1 +0,0 @@
<span class="status removed" title="This page describes a legacy feature that has been removed."><i class="fa fa-trash-o"></i></span>

View File

@@ -1,12 +0,0 @@
<ul class="tag-cloud list-inline">
{% for page in pages %}
{% if page.landing_for is defined %}
<li class="list-inline-item d-block d-lg-inline-block">
<a class="label label-{{slug(page.landing_for)}}" href="{% if "//" not in page.html %}{{target.prefix}}{% endif %}{{page.html}}" title="{{page.blurb}}">
{{page.name}}
<span class="badge badge-pill">{{label_count(pages, page.landing_for)}}</span>
</a>
</li>
{% endif %}
{% endfor %}
</ul>

View File

@@ -1,105 +0,0 @@
<nav class="top-nav navbar navbar-expand-lg navbar-dark fixed-top">
<a href="{% if currentpage.prefix %}{{currentpage.prefix}}{% else %}/{% endif %}" class="navbar-brand"><img class="logo" height="40" alt="{{target.display_name}}" /></a>
<button class="navbar-toggler collapsed" type="button" data-toggle="collapse" data-target="#top-main-nav" aria-controls="navbarHolder" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"><div></div></span>
</button>
<div class="collapse navbar-collapse justify-content-between" id="top-main-nav">
<ul class="nav navbar-nav" id="topnav-pages">
{% macro dropdown(top_page) %}
{% set printed_groupings = [] %}
{% if top_page.children|selectattr('top_nav_omit', 'undefined_or_ne', True)|list|length %}
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="{% if "//" not in top_page.html %}{{currentpage.prefix}}{% endif %}{{top_page.html}}" id="topnav_{{slug(top_page.html)}}" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span>{% if top_page.top_nav_name is defined %}{{top_page.top_nav_name}}{% else %}{{top_page.name}}{% endif %}</span></a>
<div class="dropdown-menu" aria-labelledby="topnav_{{slug(top_page.html)}}" id="topnav_dd_{{slug(top_page.html)}}">
{% if top_page.top_nav_hero_image is defined %}
<a class="dropdown-item dropdown-hero" id="dropdown-hero-for-{{slug(top_page.name)}}" href="{% if "//" not in top_page.html %}{{currentpage.prefix}}{% endif %}{{top_page.html}}">
<img id="{{top_page.top_nav_hero_image}}" alt="{{top_page.name}} icon" />
<div class="dropdown-hero-text">
<h4>{{top_page.name}}</h4>
<p>{{top_page.top_nav_blurb|default(top_page.blurb)}}</p>
</div>
</a>
{% elif top_page.top_nav_grouping is defined %}
<div class="navcol col-for-{{slug(top_page.top_nav_grouping)}}">
<h5 class="dropdown-item">{{top_page.top_nav_grouping}}</h5>
{% set _ = printed_groupings.append(top_page.top_nav_grouping) %}
<a class="dropdown-item {% if currentpage == top_page %} active{% endif %}" href="{% if "//" not in top_page.html %}{{currentpage.prefix}}{% endif %}{{top_page.html}}">{{top_page.name}}</a>
{% endif %}
{% set dropdownchildren = top_page.children|list %}
{% for linkhtml in top_page.top_nav_shortcuts %}
{% set _ = dropdownchildren.append(pages|selectattr("html", "defined_and_equalto", linkhtml)|first) %}
{% if _ is not defined %}
{% include "ERROR: Couldn't find page "+linkhtml+" from top_nav_shortcuts" %}
{% endif %}
{% endfor %}
{% for link in dropdownchildren if not link.top_nav_omit %}
{% if link.top_nav_grouping not in printed_groupings %}
{% if printed_groupings %}
</div><!--./col-->
{% endif %}
{% if link.top_nav_grouping is defined %}
<div class="navcol col-for-{{slug(link.top_nav_grouping)}}">
<h5 class="dropdown-item">{{link.top_nav_grouping}}</h5>
{% else %}
<div class="navcol col-for-ungrouped">
{% endif %}
{% set _ = printed_groupings.append(link.top_nav_grouping) %}
{% endif %}
<a class="dropdown-item{% if currentpage == link %} active{% endif %}{% if "//" in link.html %} external-link{% endif %}" href="{% if "//" not in link.html %}{{currentpage.prefix}}{% endif %}{{link.html}}"{% if "//" in link.html %} target="_blank"{% endif %}>{% if link.top_nav_name is defined %}{{link.top_nav_name}}{% else %}{{link.name}}{% endif %}</a>
{% endfor %}
</div><!--./col-->
</div><!--/.dropdown-menu-->
</li>
{% elif not top_page.top_nav_omit %}
<li class="nav-item">
<a class="nav-link{% if "//" in top_page.html %} external-link{% endif %}" href="{% if "//" not in top_page.html %}{{currentpage.prefix}}{% endif %}{{top_page.html}}"{% if "//" in top_page.html %} target="_blank"{% endif %}><span>{{top_page.name}}</span></a>
</li>
{% endif %}
{% endmacro %}
{% for page in (pages|first).children %}
{{ dropdown(page) }}
{% endfor %}
</ul><!-- /.navbar-nav -->
<div class="nav-item search" id="topnav-search">
<form class="navbar-form navbar-right" role="search">
<div class="form-inline">
<div class="input-group" id="topsearchboxcontainer">
<label class="input-group-prepend" for="topsearchbox"><i class="fa fa-search input-group-text"></i><span class="sr-only">{% trans %}Search{% endtrans %}</span></label>
<input id="topsearchbox" name="q" type="text" class="form-control searchinput" placeholder="{% trans %}Search site...{% endtrans %}">
</div><!--/.input-group-->
</div>
</form>
</div><!--/#topnav-search-->
<div class="nav-item" id="topnav-language">
<div class="dropdown">
<a class="nav-link dropdown-toggle with-caret" id="language_selector_header_btn" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{(config.languages|selectattr('code', 'eq', target.lang)|first).display_name}}
<span class="chevron"><span></span><span></span></span>
</a>
<div class="dropdown-menu smaller-dropdown" aria-labelledby="language_selector_header_btn">
<hr />
{% for lang in config.languages if lang.code != target.lang %}
<a class="dropdown-item" href="{{lang.prefix}}{{currentpage.html}}">
{{lang.display_name}}
</a>
<hr />
{% endfor %}
</div><!--/.dropdown-menu-->
</div><!--/.dropdown-->
</div><!--/.language-selector-->
{% if target.light_theme_enabled %}
<div class="nav-item" id="topnav-theme">
<form class="form-inline">
<div class="custom-control custom-theme-toggle form-inline-item" title="" data-toggle="tooltip" data-placement="left" data-original-title="Toggle Dark Mode">
<input type="checkbox" class="custom-control-input" id="css-toggle-btn">
<label class="custom-control-label" for="css-toggle-btn"><span class="d-lg-none">Light/Dark Theme</span></label>
</div>
</form>
</div><!--/#topnav-theme-->
{% endif %}
</div><!--/#top-main-nav-->
</nav>

View File

@@ -1,48 +0,0 @@
{% if tree_top is undefined %}
{% set tree_top = pages|list|first %}
{% endif %}
{% macro page_w_children(pg, n) %}
{% if not (pg.nav_omit and pg != currentpage) %}
{% if pg.is_ancestor_of(currentpage.html) %}
{% set active_parent=True %}
{% else %}
{% set active_parent=False %}
{% endif %}
<div class="nav-item {% if currentpage == pg %}active{% elif active_parent%}active-parent{% endif %}">
{% if not pg.children %}
{% if "//" in pg.html %}
<a class="nav-link nav-leaf external-link" target="_blank" href="{% if "//" not in pg.html %}{{currentpage.prefix}}{% endif %}{{pg.html}}">{{ pg.name }}{% if pg.status is defined %} {% include 'component-status_'+pg.status+'.html.jinja' %}{% endif %} <i aria-hidden="true" class="fa fa-external-link"></i></a>
{% else %}
<a class="nav-link nav-leaf" href="{% if "//" not in pg.html %}{{currentpage.prefix}}{% endif %}{{pg.html}}">{{ pg.name }}{% if pg.status is defined %} {% include 'component-status_'+pg.status+'.html.jinja' %}{% endif %}</a>
{% endif %}
{% else %}
<a class="nav-toggler {% if not active_parent and currentpage != pg %}collapsed{% endif %}" role="button" data-toggle="collapse" href="#tree_nav_group_{{n}}" aria-expanded="{% if active_parent or currentpage == pg %}true{% else %}false{% endif %}" aria-controls="tree_nav_group_{{n}}"></a>
{% if "//" in pg.html %}
<a class="nav-link external-link" target="_blank" href="{% if "//" not in pg.html %}{{currentpage.prefix}}{% endif %}{{pg.html}}">{{ pg.name }}{% if pg.status is defined %} {% include 'component-status_'+pg.status+'.html.jinja' %}{% endif %} <i aria-hidden="true" class="fa fa-external-link"></i></a>
{% else %}
<a class="nav-link" href="{% if "//" not in pg.html %}{{currentpage.prefix}}{% endif %}{{pg.html}}">{{ pg.name }}{% if pg.status is defined %} {% include 'component-status_'+pg.status+'.html.jinja' %}{% endif %}</a>
{% endif %}
<nav class="nav flex-column {% if active_parent or pg == currentpage %}show {% else %}collapse{% endif %}" id="tree_nav_group_{{n}}">
{% for child in pg.children %}
{{ page_w_children(child, n~"_"~loop.index) }}
{% endfor %}
</nav>
{% endif %}
</div>
{% endif %}
{% endmacro %}
<nav class="nav flex-column dactyl-tree-nav">
<div class="nav-item nav-parent">
<a class="nav-link" href="{% if "//" not in tree_top.html %}{{currentpage.prefix}}{% endif %}{{tree_top.html}}">{{tree_top.name}}{% if tree_top.status is defined %} {% include 'component-status_'+tree_top.status+'.html.jinja' %}{% endif %}</a>
</div>
{% for child in tree_top.children %}
{{ page_w_children(child, loop.index) }}
{% endfor %}
</nav>

View File

@@ -1,9 +0,0 @@
{% macro get_funnel(pages, page) -%}
{%- set concepts = pages|selectattr('html', 'defined_and_equalto', 'concepts.html')|first -%}
{%- set tutorials = pages|selectattr('html', 'defined_and_equalto', 'tutorials.html')|first -%}
{%- set references = pages|selectattr('html', 'defined_and_equalto', 'references.html')|first -%}
{%- if concepts.is_ancestor_of(page.html) -%}Concepts
{%- elif tutorials.is_ancestor_of(page.html) -%}Tutorials
{%- elif references.is_ancestor_of(page.html) -%}References
{%- else -%}Other{%- endif -%}
{%- endmacro %}

View File

@@ -1,18 +0,0 @@
{% extends "base.html.jinja" %}
{% block main %}
<article class="pt-3 p-md-3">
<h1>Not Found</h1>
<div class="content">
<p>Sorry, this page does not exist. Try looking in the <a href="/docs-index.html">Full Documentation Index</a>, or you can search the site:</p>
<form role="search">
<div class="form-group">
<div class="input-group" id="centersearchboxcontainer">
<label class="input-group-prepend" for="centersearchboxcontainer"><i class="fa fa-search input-group-text"></i><span class="sr-only">{% trans %}Search{% endtrans %}</span></label>
<input id="centersearchboxcontainer" type="text" class="form-control searchinput" placeholder="{% trans %}Search for articles, training, and code samples...{% endtrans %}">
</div><!--/.form-group-->
</div>
</form>
</div>
</article>
{% endblock %}

View File

@@ -1,528 +0,0 @@
{% extends "base.html.jinja" %}
{% block head %}
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
{% endblock %}
{% block bodyclasses %}no-sidebar{% endblock %}
{% block mainclasses %}landing page-ambassadors{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block main %}
<div class="position-relative d-none-sm">
<img alt="background purple waves" src="./img/backgrounds/ambassador-purple.svg" class="position-absolute" style="top: 0; right:0">
</div>
<section class="container-new py-26 text-lg-center">
<div class="p-0 col-lg-8 mx-lg-auto">
<div class="d-flex flex-column-reverse">
<h1 class="mb-0">{% trans %}Become an XRP Ledger Campus Ambassador{% endtrans %}</h1>
<h6 class="eyebrow mb-3">{% trans %}Join the Student Cohort{% endtrans %}</h6>
</div>
<p class="mt-3 py-3 col-lg-8 mx-lg-auto p-0">{% trans %}The XRPL Campus Ambassador program engages, supports, connects, and recognizes a group of student champions of the XRPL and empowers them to further advance engagement on the ledger.{% endtrans %}</p>
<button data-tf-popup="qrw4zbHv" data-tf-iframe-props="title=XRPL Campus Ambassador" data-tf-medium="snippet"
class="btn btn-primary btn-arrow-out"
data-tf-hidden="utm_source=xxxxx,utm_medium=xxxxx,utm_campaign=xxxxx,utm_term=xxxxx,utm_content=xxxxx">Apply for Spring 2024</button>
</div>
</section>
<!-- Current Students -->
<section class="container-new py-26">
<div class="d-flex flex-column flex-lg-row align-items-lg-center">
<div class="order-lg-2 mx-lg-4 mb-4 pb-3 mb-lg-0 pb-lg-0 col-lg-6 px-0 pr-lg-5">
<div class="d-flex flex-column-reverse p-lg-3">
<h3 class="h4 h2-sm">{% trans %}XRPL Campus Ambassadors{% endtrans %}</h3>
<h6 class="eyebrow mb-3">{% trans %}Current Students{% endtrans %}</h6>
</div>
<p class="p-lg-3 mb-2 longform">{% trans %}The XRPL Campus Ambassador program aims to elevate the impact of college students who are passionate about blockchain technology. In their role, Campus Ambassadors help educate other students about crypto and how to start building on the XRPL.{% endtrans %}</p>
<div class="d-none d-lg-block p-lg-3">
<button data-tf-popup="qrw4zbHv" data-tf-iframe-props="title=XRPL Campus Ambassador" data-tf-medium="snippet"
class="btn btn-primary btn-arrow-out"
data-tf-hidden="utm_source=xxxxx,utm_medium=xxxxx,utm_campaign=xxxxx,utm_term=xxxxx,utm_content=xxxxx">Apply for Spring 2024</button>
</div>
</div>
<div class="order-lg-1 col-lg-6 px-0 mr-lg-4">
<div class="row m-0">
<img alt="Person speaking and person taking photo" src="./assets/img/ambassadors/developer-hero@2x.png" class="w-100">
</div>
</div>
<div class="d-lg-none order-3 mt-4 pt-3 p-lg-3">
<button data-tf-popup="qrw4zbHv" data-tf-iframe-props="title=XRPL Campus Ambassador" data-tf-medium="snippet"
class="btn btn-primary btn-arrow-out"
data-tf-hidden="utm_source=xxxxx,utm_medium=xxxxx,utm_campaign=xxxxx,utm_term=xxxxx,utm_content=xxxxx">Apply for Spring 2024</button>
</div>
</div>
</section>
<!-- Benefits -->
<section class="container-new py-26">
<!-- flex. Col for mobile. Row for large. on large align content to the center -->
<div class="d-flex flex-column flex-lg-row align-items-lg-center">
<div class="order-1 mb-4 pb-3 mb-lg-0 pb-lg-0 col-lg-6 px-0">
<div class="d-flex flex-column-reverse p-lg-3">
<h3 class="h4 h2-sm">{% trans %}Why become an XRPL Campus Ambassador?{% endtrans %}</h3>
<h6 class="eyebrow mb-3">{% trans %}Benefits{% endtrans %}</h6>
</div>
<p class="p-lg-3 mb-2 longform">{% trans %}Join a global cohort of students empowering others to build on the XRPL.{% endtrans %}</p>
</div>
<div class="order-2 col-lg-6 px-0 mr-lg-5">
<div class="row align-items-center m-0" id="benefits-list">
<!-- benefitslist -->
<div class="col-12 col-lg-6 p-0 pr-lg-4">
<div class="px-lg-3 pb-3">
<img alt="Smiley face" id="benefits-01" class="pl-lg-3">
<div class="p-lg-3 pt-3">
<h6 class="mb-3">{% trans %}Exclusive Opportunities{% endtrans %}</h6>
<p>{% trans %} Get access and invitations to Ambassador-only events, conferences, and opportunities{% endtrans %}</p>
</div>
</div>
<!-- Hide on large -->
<div class="px-lg-3 pb-3 d-lg-none ">
<img alt="Book" id="benefits-02" class="pl-lg-3">
<div class="p-lg-3 pt-3">
<h6 class="mb-3">{% trans %}Education{% endtrans %}</h6>
<p >{% trans %}Tutorials and workshops from leading XRPL and blockchain developers{% endtrans %}</p>
</div>
</div>
<div class="px-lg-3 pb-3">
<img alt="Gift" id="benefits-03" class="pl-lg-3">
<div class="p-lg-3 pt-3">
<h6 class="mb-3">{% trans %}Swag{% endtrans %}</h6>
<p >{% trans %}New XRPL swag for Ambassadors and swag to share with other students{% endtrans %}</p>
</div>
</div>
<!-- Hide on large -->
<div class="px-lg-3 pb-3 d-lg-none">
<img alt="Medallion" id="benefits-04" class="pl-lg-3">
<div class="p-lg-3 pt-3">
<h6 class="mb-3">{% trans %}Mentorship{% endtrans %}</h6>
<p>{% trans %}Serve as an advocate and receive support from notable members of the community{% endtrans %}</p>
</div>
</div>
<div class="px-lg-3 pb-3">
<img alt="Up Arrow" id="benefits-05" class="pl-lg-3">
<div class="p-lg-3 pt-3 pb-lg-0">
<h6 class="mb-3">{% trans %}Career Acceleration{% endtrans %}</h6>
<p class="pb-lg-0">{% trans %}Gain hands-on experience building communities and grow your professional network in the blockchain industry{% endtrans %}</p>
</div>
</div>
<!-- Hide on large -->
<div class="px-lg-3 pb-3 d-lg-none">
<img alt="Dollar Sign" id="benefits-06" class="pl-lg-3">
<div class="pb-lg-0">
<h6 class="mb-3">{% trans %}Stipend{% endtrans %}</h6>
<p class="pb-lg-0">{% trans %}Receive a stipend to fund your ideas and initiatives that fuel XRPL growth on your campus{% endtrans %}</p>
</div>
</div>
</div>
<!-- end col 1 -->
<!-- Show on large -->
<div class="col-12 col-lg-6 p-0 pl-lg-4 d-none d-lg-block">
<div class="px-lg-3 pb-3 pt-5 mt-5">
<img alt="Book" id="benefits-02" class="pl-lg-3">
<div class="p-lg-3 pt-3">
<h6 class="mb-3">{% trans %}Education{% endtrans %}</h6>
<p >{% trans %}Tutorials and workshops from leading XRPL and blockchain developers{% endtrans %}</p>
</div>
</div>
<div class="px-lg-3 pb-3 ">
<img alt="Medallion" id="benefits-04" class="pl-lg-3">
<div class="p-lg-3 pt-3">
<h6 class="mb-3">{% trans %}Mentorship{% endtrans %}</h6>
<p >{% trans %}Serve as an advocate and receive support from notable members of the community{% endtrans %}</p>
</div>
</div>
<div class="px-lg-3 pb-3">
<img alt="Dollar Sign" id="benefits-06" class="pl-lg-3">
<div class="p-lg-3 pt-3 pb-lg-0">
<h6 class="mb-3">{% trans %}Stipend{% endtrans %}</h6>
<p class="pb-lg-0">{% trans %}Receive a stipend to fund your ideas and initiatives that fuel XRPL growth on your campus{% endtrans %}</p>
</div>
</div>
</div>
<!-- end col 2 -->
</div>
</div>
</div>
</section>
<!-- Eligibility -->
<section class="container-new py-26">
<!-- flex. Col for mobile. Row for large. on large align content to the center -->
<div class="d-flex flex-column flex-lg-row align-items-lg-center mr-lg-4">
<div class="order-1 order-lg-2 mb-4 pb-3 mb-lg-0 pb-lg-0 col-lg-6 px-0 mr-lg-5">
<div class="d-flex flex-column-reverse p-lg-3">
<h3 class="h4 h2-sm">{% trans %}Should You Apply?{% endtrans %}</h3>
<h6 class="eyebrow mb-3">{% trans %}Eligibility for XRPL Campus Ambassadors{% endtrans %}</h6>
</div>
<p class="p-lg-3 mb-2 longform">{% trans %}Students currently enrolled in an undergraduate or postgraduate program at an accredited college or university are eligible to apply.{% endtrans %}</p>
</div>
<div class="order-2 order-lg-1 col-lg-6 px-0">
<div class="row align-items-center m-0" id="eligibility-list">
<div class="col-12 col-lg-6 p-0 pr-lg-4">
<div class="px-lg-3 pb-3">
<img alt="Calendar" id="eligibility-01" class="pl-lg-3">
<div class="p-lg-3 pt-3">
<h6 class="mb-3">{% trans %}A Leader{% endtrans %}</h6>
<p >{% trans %}Interested in leading meetups and workshops for your local campus community{% endtrans %}</p>
</div>
</div>
<!-- Hide on large -->
<div class="px-lg-3 pb-3 d-lg-none ">
<img alt="Book" id="eligibility-02" class="pl-lg-3">
<div class="p-lg-3 pt-3">
<h6 class="mb-3">{% trans %}Active{% endtrans %}</h6>
<p >{% trans %}An active participant in the XRPL community or interested in blockchain and crypto technologies{% endtrans %}</p>
</div>
</div>
<div class="px-lg-3 pb-3">
<img alt="CPU" id="eligibility-03" class="pl-lg-3">
<div class="p-lg-3 pt-3">
<h6 class="mb-3">{% trans %}Curious{% endtrans %}</h6>
<p >{% trans %}Eager to learn more about technical blockchain topics and the XRPL{% endtrans %}</p>
</div>
</div>
<!-- Hide on large -->
<div class="px-lg-3 pb-3 d-lg-none">
<img alt="Quote Bubble" id="eligibility-04" class="pl-lg-3">
<div class="p-lg-3 pt-3 pb-lg-0">
<h6 class="mb-3">{% trans %}Passionate{% endtrans %}</h6>
<p >{% trans %}Passionate about increasing XRPL education and awareness through events, content, and classroom engagement{% endtrans %}</p>
</div>
</div>
<div class="p-lg-3 pb-3">
<img alt="People" id="eligibility-05" class="pl-lg-3">
<div class="p-lg-3 pt-3 pb-lg-0">
<h6 class="mb-3">{% trans %}Creative{% endtrans %}</h6>
<p class="pb-lg-0 mb-0">{% trans %}Ability to think outside the box to grow the XRPL student community{% endtrans %}</p>
</div>
</div>
</div>
<!-- end col 1 -->
<!-- Show on large -->
<div class="col-12 col-lg-6 p-0 pl-lg-4 d-none d-lg-block">
<div class="px-lg-3 pb-3 ">
<img alt="Book" id="eligibility-02" class="pl-lg-3">
<div class="p-lg-3 pt-3">
<h6 class="mb-3">{% trans %}Active{% endtrans %}</h6>
<p>{% trans %}An active participant in the XRPL community or interested in blockchain and crypto technologies{% endtrans %} </p>
</div>
</div>
<div class="px-lg-3 pb-3 ">
<img alt="Quote Bubble" id="eligibility-04" class="pl-lg-3">
<div class="p-lg-3 pt-3 pb-lg-0">
<h6 class="mb-3">{% trans %}Passionate{% endtrans %}</h6>
<p > {% trans %}Passionate about increasing XRPL education and awareness through events, content, and classroom engagement{% endtrans %}</p>
</div>
</div>
</div>
<!-- end col 2 -->
</div>
</div>
</div>
</section>
<!-- Current Students -->
<section class="container-new py-26">
<!-- Quotes -->
<div id="carouselSlidesOnly" class="carousel slide col-lg-10 mx-auto px-0" data-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<div class="p-0">
<div class="mb-4 p-lg-3">
<img alt="I have learned so much through creating programs and connecting with the XRPL community. Im truly grateful for everyone's support along the way and for the opportunity to gain so much knowledge from this expierence" src="./assets/img/ambassadors/quote1-small.svg" class="h-100 d-lg-none mb-4">
<img alt="I have learned so much through creating programs and connecting with the XRPL community. Im truly grateful for everyone's support along the way and for the opportunity to gain so much knowledge from this expierence" src="./assets/img/ambassadors/quote1.svg" class="h-100 d-none d-lg-block">
<div class="p-0 col-lg-7 mx-lg-auto">
<p class="p-lg-3 mb-2"><strong>Derrick N.</strong><br >
Toronto Metropolitan University<br >
Spring 2023 XRPL Campus Ambassador</p>
</div>
</div>
</div>
</div>
<div class="carousel-item mb-20">
<div class="p-0">
<div class="mb-4 p-lg-3">
<img alt="The XRPL Campus Ambassador program really helped broaden my view of the blockchain industry with their learning resource and virtual community. Being an ambassador allowed me to meet industry professionals and likeminded peers which have given me invaluable experiences and insights." src="./assets/img/ambassadors/quote2-small.svg" class="h-150 d-lg-none mb-4">
<img alt="The XRPL Campus Ambassador program really helped broaden my view of the blockchain industry with their learning resource and virtual community. Being an ambassador allowed me to meet industry professionals and likeminded peers which have given me invaluable experiences and insights." src="./assets/img/ambassadors/quote2.svg" class="h-100 d-none d-lg-block">
<div class="p-0 col-lg-7 mx-lg-auto">
<p class="p-lg-3 mb-2"><strong>Sally Z.</strong><br >
Toronto Metropolitan University<br >
Spring 2023 XRPL Campus Ambassador</p>
</div>
</div>
</div>
</div>
<div class="carousel-item mb-40">
<div class="p-0">
<div class="mb-4 p-lg-3">
<img alt="Ive had the pleasure over the course of this program to speak with amazing individuals, I encourage you all to reach out to other people in this program and make as many connections as you can. You will quickly find out that by speaking with other people in this cohort you can learn just about anything if you ask the right people." src="./assets/img/ambassadors/quote3-small.svg" class="h-150 d-lg-none mb-4">
<img alt="Ive had the pleasure over the course of this program to speak with amazing individuals, I encourage you all to reach out to other people in this program and make as many connections as you can. You will quickly find out that by speaking with other people in this cohort you can learn just about anything if you ask the right people." src="./assets/img/ambassadors/quote3.svg" class="h-100 d-none d-lg-block">
<div class="p-0 col-lg-7 mx-lg-auto">
<p class="p-lg-3 mb-2"><strong>Nick D.</strong><br >
Miami University<br >
Spring 2023 XRPL Campus Ambassador</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- How it Works -->
<section class="container-new py-26">
<!-- flex. Col for mobile. Row for large. on large align content to the center -->
<div class="d-flex flex-column flex-lg-row align-items-lg-center">
<div class="order-1 mr-lg-4 mb-4 pb-3 mb-lg-0 pb-lg-0 col-lg-6 px-0">
<div class="d-flex flex-column-reverse p-lg-3">
<h3 class="h4 h2-sm">{% trans %}Process to become a Campus Ambassador{% endtrans %}</h3>
<h6 class="eyebrow mb-3">{% trans %}How it Works{% endtrans %}</h6>
</div>
<p class="p-lg-3 mb-2 longform">{% trans %}Apply now to become an XRPL Campus Ambassador.{% endtrans %}</p>
<div class="d-none d-lg-block p-lg-3">
<button data-tf-popup="qrw4zbHv" data-tf-iframe-props="title=XRPL Campus Ambassador" data-tf-medium="snippet"
class="btn btn-primary btn-arrow-out"
data-tf-hidden="utm_source=xxxxx,utm_medium=xxxxx,utm_campaign=xxxxx,utm_term=xxxxx,utm_content=xxxxx">Apply for Spring 2024</button>
</div>
</div>
<div class="order-2 col-lg-6 px-0 ml-lg-2">
<div class="row m-0">
<div class="col-12 col-lg-6 p-0 pr-lg-4">
<div class="px-lg-3 pb-3">
<img alt="01." src="./assets/img/ambassadors/01.svg" class="pl-lg-3">
<div class="p-lg-3 pt-3">
<h6 class="mb-3">{% trans %}Apply{% endtrans %}</h6>
<p>{% trans %}Submit an application to be considered for the Campus Ambassador program.{% endtrans %}</p>
</div>
</div>
<!-- Hide on large -->
<div class="px-lg-3 pb-3 d-lg-none ">
<img alt="02." src="./assets/img/ambassadors/02.svg" class="pl-lg-3">
<div class="p-lg-3 pt-3">
<h6 class="mb-3">{% trans %}Interview{% endtrans %}</h6>
<p >{% trans %}Tell the XRPL community-led panel more about yourself and your interest in the program during an interview.{% endtrans %}</p>
</div>
</div>
<div class="px-lg-3 pb-3">
<img alt="03." src="./assets/img/ambassadors/03.svg" class="pl-lg-3">
<div class="p-lg-3 pt-3">
<h6 class="mb-3">{% trans %}Join{% endtrans %}</h6>
<p >{% trans %}Congrats on your new role! Join the global cohort of Ambassadors and meet with community participants during onboarding.{% endtrans %}</p>
</div>
</div>
<!-- Hide on large -->
<div class="p-lg-3 pb-3 d-lg-none">
<img alt="04." src="./assets/img/ambassadors/04.svg" class="pl-lg-3">
<div class="p-lg-3 pt-3">
<h6 class="mb-3">{% trans %}Learn{% endtrans %}</h6>
<p> {% trans %}Participate in personalized learning and training sessions for Ambassadors on the XRPL and blockchain technology.{% endtrans %}</p>
</div>
</div>
</div>
<!-- end col 1 -->
<!-- Show on large -->
<div class="col-12 col-lg-6 p-0 pl-lg-4 d-none d-lg-block mt-5">
<div class="px-lg-3 pb-3 mt-5">
<img alt="02." src="./assets/img/ambassadors/02.svg" class="pl-lg-3">
<div class="p-lg-3 pt-3">
<h6 class="mb-3">{% trans %}Interview{% endtrans %}</h6>
<p >{% trans %}Tell the XRPL community-led panel more about yourself and your interest in the program during an interview.{% endtrans %}</p>
</div>
</div>
<div class="p-lg-3 pb-3 ">
<img alt="04." src="./assets/img/ambassadors/04.svg" class="pl-lg-3">
<div class="p-lg-3 pt-3 pb-lg-0">
<h6 class="mb-3">{% trans %}Learn{% endtrans %}</h6>
<p class="pb-lg-0">{% trans %}Participate in personalized learning and training sessions for Ambassadors on the XRPL and blockchain technology.{% endtrans %}</p>
</div>
</div>
</div>
<!-- end col 2 -->
</div>
</div>
<div class="d-lg-none order-3 mt-4 pt-3">
<button data-tf-popup="qrw4zbHv" data-tf-iframe-props="title=XRPL Campus Ambassador" data-tf-medium="snippet"
class="btn btn-primary btn-arrow-out"
data-tf-hidden="utm_source=xxxxx,utm_medium=xxxxx,utm_campaign=xxxxx,utm_term=xxxxx,utm_content=xxxxx">{% trans %}Apply for Spring 2024{% endtrans %}</button>
</div>
</div>
</section>
<!-- Image Block -->
<div >
<img alt="Ripple Conferences and two people Sitting" src="./assets/img/ambassadors/students-large.png" class="w-100">
</div>
<!-- Global Community Carousel -->
<section class="container-new pt-26">
<div class="p-0 col-lg-5">
<div class="d-flex flex-column-reverse p-lg-3">
<h3 class="h4 h2-sm">{% trans %}Join a global cohort of Student Ambassadors{% endtrans %}</h3>
<h6 class="eyebrow mb-3">{% trans %}Global Community{% endtrans %}</h6>
</div>
</div>
</section>
<div id="container-scroll">
<div class="photobanner">
<img src="./assets/img/ambassadors/locations-row-1.png" alt="Ambassador locations" height="48px" class="px-5">
<img src="./assets/img/ambassadors/locations-row-1.png" alt="Ambassador locations" height="48px" class="px-5">
<img src="./assets/img/ambassadors/locations-row-1.png" alt="Ambassador locations" height="48px" class="px-5">
</div>
<div class="photobanner photobanner-bottom">
<img src="./assets/img/ambassadors/locations-row-2.png" alt="Ambassador locations" height="48px" class="px-5">
<img src="./assets/img/ambassadors/locations-row-2.png" alt="Ambassador locations" height="48px" class="px-5">
<img src="./assets/img/ambassadors/locations-row-2.png" alt="Ambassador locations" height="48px" class="px-5">
</div>
</div>
<!-- Connect -->
<section class="container-new py-26">
<!-- flex. Col for mobile. Row for large. on large align content to the center -->
<div class="d-flex flex-column flex-lg-row align-items-lg-center">
<div class="order-1 mb-4 pb-3 mb-lg-0 pb-lg-0 col-lg-6 px-0">
<div class="d-flex flex-column-reverse p-lg-3">
<h3 class="h4 h2-sm">{% trans %}Stay connected to the XRPL Campus Ambassadors{% endtrans %}</h3>
<h6 class="eyebrow mb-3">{% trans %}Connect{% endtrans %}</h6>
</div>
<p class="p-lg-3 mb-2 longform">{% trans %}To stay up-to-date on the latest activity, meetups, and events of the XRPL Campus Ambassadors be sure to follow these channels:{% endtrans %}</p>
<div class="d-none d-lg-block p-lg-3">
<button data-tf-popup="qrw4zbHv" data-tf-iframe-props="title=XRPL Campus Ambassador" data-tf-medium="snippet" class="btn btn-primary btn-arrow-out" data-tf-hidden="utm_source=xxxxx,utm_medium=xxxxx,utm_campaign=xxxxx,utm_term=xxxxx,utm_content=xxxxx">Apply for Spring 2024</button>
</div>
</div>
<div class="order-2 col-lg-6 px-0 ml-lg-5">
<div class="row align-items-center m-0">
<div class="col-12 col-lg-6 p-0 pr-lg-4">
<div class="p-lg-3 mb-3 pb-3">
<img alt="meetup" src="./assets/img/ambassadors/icon_meetup.svg" class="mb-3">
<div >
<h6 class="mb-3"><a class="btn-arrow" href="https://www.meetup.com/pro/xrpl-community/">{% trans %}MeetUp{% endtrans %}</a></h6>
<p >{% trans %}Attend an XRPL Meetup in your local area{% endtrans %}</p>
</div>
</div>
<div class="p-lg-3 mb-3 pb-3">
<img alt="devto" src="./assets/img/ambassadors/icon_devto.svg" class="mb-3">
<div >
<h6 class="mb-3"><a class="btn-arrow" href="https://dev.to/t/xrpl">{% trans %}Dev.to Blog{% endtrans %}</a></h6>
<p >{% trans %}Read more about the activity of the XRPL Ambassadors{% endtrans %}</p>
</div>
</div>
</div>
<div class="col-12 col-lg-6 p-0 pl-lg-4">
<div class="p-lg-3 mb-3 pb-3 ">
<img alt="discord" src="./assets/img/ambassadors/icon_discord.svg" class="mb-3">
<div >
<h6 class="mb-3"><a class="btn-arrow" href="https://xrpldevs.org">{% trans %}Discord{% endtrans %}</a></h6>
<p >{% trans %}Join the conversation on the XRPL Developer Discord{% endtrans %}</p>
</div>
</div>
</div>
</div>
</div>
<div class="d-lg-none order-3 mt-4 pt-3">
<button data-tf-popup="qrw4zbHv" data-tf-iframe-props="title=XRPL Campus Ambassador" data-tf-medium="snippet" class="btn btn-primary btn-arrow-out" data-tf-hidden="utm_source=xxxxx,utm_medium=xxxxx,utm_campaign=xxxxx,utm_term=xxxxx,utm_content=xxxxx">Apply for Spring 2024</button>
</div>
</div>
</section>
<script src="//embed.typeform.com/next/embed.js"></script>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Splash Page",
"page_group": "Ambassadors"
})
</script>
{% endblock analytics %}

View File

@@ -1,19 +0,0 @@
{% extends "base.html.jinja" %}
{% block main %}
<section class="content">
<h1 id="main-page-header">{{ currentpage.name }}</h1>
{% include 'component-tag-cloud.html.jinja' %}
</section>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Hub Page",
"page_group": "Docs"
})
</script>
{% endblock analytics %}

View File

@@ -1,129 +0,0 @@
{% extends "base.html.jinja" %}
{% block bodyclasses %}no-sidebar{% endblock %}
{% block mainclasses %}landing page-community{% endblock %}
{% block main %}
<div class="">
<section class="py-26">
<div class="col-lg-8 mx-auto text-lg-center">
<div class="d-flex flex-column-reverse">
<h1 class="mb-0">{% trans %}Start Building with Example Code{% endtrans %}</h1>
<h6 class="eyebrow mb-3">{% trans %}Code Samples{% endtrans %}</h6>
</div>
{# <a class="mt-12 btn btn-primary btn-arrow" href="#">Submit Code Samples</a> #}
</div>
</section>
<div class="position-relative d-none-sm">
<img alt="" src="./img/backgrounds/xrpl-overview-orange.svg" id="xrpl-overview-orange">
</div>
<section class="container-new py-26">
<div class="d-flex flex-column col-sm-8 p-0">
<h3 class="h4 h2-sm">{% trans %}Browse sample code for building common use cases on the XRP Ledger{% endtrans %}</h3>
</div>
<div class="row col-12 card-deck mt-10" id="code-samples-deck">
{% set code_samples = all_code_samples() %}
{% set lang_icons = {
"cli": "assets/img/logos/cli.svg",
"go": "assets/img/logos/golang.svg",
"java": "assets/img/logos/java.svg",
"js": "assets/img/logos/javascript.svg",
"py": "assets/img/logos/python.svg",
"php": "assets/img/logos/php.svg",
"http": "assets/img/logos/globe.svg",
"ts": "assets/img/logos/typescript.svg",
} %}
<div class="row col-md-12 px-0" id="code_samples_list">
{% for card in code_samples %}
<a class="card cardtest col-12 col-lg-5 {% for lang in card.langs %} lang_{{lang}} {% endfor %} " href="{{target.github_forkurl}}/tree/{{target.github_branch}}/{{card.href}}">
<div class="card-header">
{% for lang in card.langs %}
<span class="circled-logo"><img alt="{{lang}}" src="{{lang_icons[lang]}}" /></span>
{% endfor %}
</div>
<div class="card-body">
<h4 class="card-title h5">{{card.title}}</h4>
<p class="card-text">{{card.description}}</p>
</div>
<div class="card-footer">&nbsp;</div>
</a>
{% endfor %}
</div>
</div>
</section>
<section class="container-new py-26">
<div>
<div class="d-flex flex-column">
<h3 class="h4 h2-sm pb-4">{% trans %}Contribute Code Samples{% endtrans %}</h3>
<h6 class="eyebrow mb-20">{% trans %}Help the XRPL community by submitting your<br> own code samples{% endtrans %}</h6>
</div>
<div class="row pl-4">
<div class=" col-lg-3 pl-4 pl-lg-0 pr-4 contribute dot contribute_1"><span class="dot"></span><h5 class="pb-4 pt-md-5">Fork and clone</h5><p class="pb-4">Fork the <a href="{{target.github_forkurl}}">xrpl-dev-portal repo</a>. Using git, clone the fork to your computer.</p></div>
<div class=" col-lg-3 pl-4 pl-lg-0 pr-4 contribute dot contribute_2"><span class="dot"></span><h5 class="pb-4 pt-md-5">Add to folder</h5><p class="pb-4">Add your sample code to the <code>content/_code-samples/</code> folder. Be sure to include a <code>README.md</code> that summarizes what it does and anything else people should know about it.</p></div>
<div class=" col-lg-3 pl-4 pl-lg-0 pr-4 contribute dot contribute_3"><span class="dot"></span><h5 class="pb-4 pt-md-5">Commit and push</h5><p class="pb-4">Commit your changes and push them to your fork on GitHub.</p></div>
<div class=" col-lg-3 pl-4 pl-lg-0 pr-2 contribute dot contribute_4 mb-4"><span class="dot"></span><h5 class="pb-4 pt-md-5">Open a pull request</h5><p class="pb-0 mb-0">Open a pull request to the original repo. Maintainers will review your submission and suggest changes if necessary. If the code sample is helpful, itll be merged and added to XRPL.org!</p></div>
</div>
{#<a class="mt-12 btn btn-primary btn-arrow" href="#">Submit Code Samples</a>#}
</div>
</section>
</div>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Hub Page",
"page_group": "Code Samples"
})
</script>
{% endblock analytics %}
{% block bottom_left_sidebar %}
{% set lang_text = {
"cli": "CLI",
"go": "go",
"java": "Java",
"js": "JavaScript",
"py": "Python",
"http": "HTTP",
} %}
<div class="p-2 mt-30">
<form >
<p>Code Language</p>
<div>
<input type="radio" name="langs" id="input_all" value="All" checked> <label for="input_all">All</label>
</div>
{% for lang in all_langs %}
<div class="single_lang">
<input type="radio" name="langs" id="input_{{lang}}" value="{{lang}}">
<label for="input_{{lang}}">{{lang_text[lang]}}</label>
</div>
{% endfor %}
</form>
</div>
<br><br>
{% endblock %}
{% block endbody %}
<script type="application/javascript" src="{{currentpage.prefix}}assets/js/code-samples.js"></script>
{% endblock %}

View File

@@ -1,393 +0,0 @@
{% extends "base.html.jinja" %}
{% block head %}
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
{% endblock %}
{% block bodyclasses %}no-sidebar{% endblock %}
{% block mainclasses %}landing page-community{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block main %}
<section class="text-center" id="community-heading" style="position: relative;">
<div class="d-lg-block d-none">
<img alt="People sitting at a conference" class="parallax one" width="152px" height="102px" src="./assets/img/community/community-one.png">
<img alt="Person speaking at a conference" class="parallax two" src="./assets/img/community/community-two.png">
<img alt="Person sitting and speaking" class="parallax three" src="./assets/img/community/community-three.png">
<img alt="People chatting" class="parallax four" width="120px" height="160px" src="./assets/img/community/community-four.png">
<img alt="Person speaking at Apex" class="parallax five" src="./assets/img/community/community-five.png">
</div>
<div class="mx-auto text-left col-lg-6 text-md-center hero-title" >
<div class="d-flex flex-column-reverse align-items-center sm-align-items-start">
<img src="../assets/img/icons/arrow-down.svg" class="bounce-arrow" alt="Down Arrow" />
<h1 class="mb-0 main-title">
{% trans %}A Global Blockchain {% endtrans %}
<br class="until-sm"/>
{% trans %}Community of {% endtrans %}
<span class="builders-wrap">Builders</span>
<br class="until-sm" />
{% trans %} and Innovators{% endtrans %}
</h1>
<h6 class="mb-3 eyebrow">{% trans %}XRPL Community{% endtrans %}</h6>
</div>
</div>
</section>
<section id="community-table" class="hot-topics">
<h6 class="eyebrow-convo">{% trans %}Join the Conversation{% endtrans %}</h6>
<h4 >{% trans %}Hot Topics Happening Now{% endtrans %}</h4>
<table>
<tr>
<td class="td-img"><img class="discord-icon" alt="discord icon"></td>
<td>{% trans %}AMA with Edge Wallet: Learn more about Edge Wallet and how they are building on the XRP Ledger.{% endtrans %}</td>
<td>
<a href="https://discord.com/channels/886050993802985492/950893687313940582/1162480612209332345" target="_blank" class="text-external-link"><span class="external-link-contribute"></span></a>
</td>
</tr>
<tr>
<td class="td-img"><img class="twitter-icon" alt="twitter icon"></td>
<td>{% trans %}Clawback: A newly proposed feature that adds to the XRP Ledger's token asset control capabilities.{% endtrans %}</td>
<td>
<a href="https://x.com/RippleXDev/status/1708889238471950610?s=20" target="_blank" class="text-external-link"><span class="external-link-contribute"></span></a>
</td>
</tr>
<tr>
<td class="td-img"><img class="youtube-icon" alt="youtube icon"></td>
<td>{% trans %}APEX 2023: View keynote sessions from the annual developer summit where developers, contributors, and thought leaders come together to learn, build, and celebrate all things XRP Ledger.{% endtrans %}</td>
<td>
<a href="https://www.youtube.com/playlist?list=PLJQ55Tj1hIVZBdGc33An5Is6IFMxw3D7u" target="_blank" class="text-external-link"><span class="external-link-contribute"></span></a>
</td>
</tr>
<tr class="final-tr">
<td class="td-img"><img class="xrpl-icon" alt="xrpl icon"></td>
<td>{% trans %}Deep Dive into XRPL DeFi Course: Learn about the inner workings of decentralized finance including safety and security, auto-bridging, pathfinding, liquidity pools, and more.{% endtrans %}</td>
<td>
<a href="https://learn.xrpl.org/course/deep-dive-into-xrpl-defi/" target="_blank" class="text-external-link"><span class="external-link-contribute"></span></a>
</td>
</tr>
</table>
</section>
<section class="xrpl-events-section">
<div class="header-div">
<div class="header">
<h6 class="events-text">{% trans %}XRPL Events{% endtrans %}</h6>
<h4 class="events-text">{% trans %}Check out global events hosted <br class="d-none-sm" /> by the XRPL community{% endtrans %}</h4>
</div>
<p class="description">{% trans %}Meet the XRPL community at meetups, hackathons, blockchain conferences, and more across global regions.{% endtrans %}</p>
<a class="cd-none-sm btn btn-primary btn-arrow view-all-events-btn" target="_blank" href="events.html">{% trans %}View All Events{% endtrans %}</a>
</div>
<div class="upcoming-event" id="upcoming-events-section">
<p class="upcoming-label">{% trans %}UPCOMING EVENT{% endtrans %}</p>
<div id="days-count" class="days-count">13</div>
<div class="days-word">{% trans %}days{% endtrans %}</div>
<div class="num-separator"></div>
<h5 id="upcoming-event-name" class="event-name">{% trans %}XRPL Warsaw Meetup 2023{% endtrans %}</h5>
<p class="mb-2 event-details d-flex icon"> <span class="icon-location"> </span><span id="upcoming-event-date">September 08-09, 2023</span></p>
<p class="event-location d-flex icon"> <span class="icon-date" id="upcoming-event-location"> </span><span id="location-tag"> Warsaw, Poland </span></p>
</div>
<a target="_blank" class="cd-none-lg btn btn-primary btn-arrow view-all-events-btn" href="events.html">{% trans %}View All Events{% endtrans %}</a>
</section>
<section class="carousel">
<div class="image-container">
<img id="left-image" alt="Left Event Image">
<div class="center-image-wrapper">
<img id="center-image" alt="Featured Event Image">
<div class="event-info">
<span class="name" id="event-name"></span>
<div class="flex-align">
<span class="icon-location"> </span>
<span id="event-location"></span>
</div>
<div class="flex-align">
<span class="icon-date"> </span>
<span id="event-date"> </span>
</div>
</div>
</div>
<img id="right-image" alt="Right Event Image">
</div>
<div class="arrow-wrapper">
<button class="arrow-button left-arrow" id="prev-btn">
<img alt="left arrow">
</button>
<button class="arrow-button right-arrow" id="next-btn">
<img alt="right arrow">
</button>
</div>
</section>
<section class="community-funding">
<a target="_blank" class="cd-none-lg btn btn-primary btn-arrow view-all-events-btn get-funding-btn" href="developer-funding.html">{% trans %}Get Funding{% endtrans %}</a>
<div class="stats">
<div class="stacked-stats">
<div class="stat">
<span class="small-text">{% trans %}funding been awarded{% endtrans %}</span>
<div id="staticImage" class="number gradient-num" >
<span class="surround-gradient">$</span>
13
<span class="surround-gradient">M+</span>
</div>
<div class=" ml-8 stat-separator"></div>
</div>
<div class="stat">
<span class="small-text">{% trans %}teams awarded globally{% endtrans %}</span>
<div class="number gradient-num-two" >120
<span class="surround-gradient-two">+</span>
</div>
<div class="ml-14 stat-separator"></div>
</div>
</div>
<div class="stat">
<span class="small-text">{% trans %}countries represented{% endtrans %}</span>
<div class="number gradient-num-three">28
<span class="surround-gradient-three">+</span>
</div>
<div class="ml-19 stat-separator"></div>
</div>
</div>
<div class="funding-section">
<span class="funding-text">{% trans %}XRPL Developer Funding{% endtrans %}</span>
<h2>{% trans %}Funding Opportunities for Blockchain Businesses{% endtrans %}</h2>
<p>{% trans %}If you're a software developer or team looking to build your next blockchain business on the XRP Ledger (XRPL), numerous funding opportunities like grants and hackathons await your innovation.{% endtrans %}</p>
<a class="cd-none-sm btn btn-primary btn-arrow view-all-events-btn" target="_blank" href="developer-funding.html">{% trans %}Get Funding{% endtrans %}</a>
</div>
</section>
<section class="community-spotlight-wrapper">
<div class="community-spotlight">
<h6 class="funding-text">{% trans %}XRPL Community Spotlight{% endtrans %}</h6>
<h2 class="spotlight-subtitle">{% trans %}Showcase your blockchain project, application, or product{% endtrans %}</h2>
<p class="spotlight-description">{% trans %}Get featured on the Developer Reflections blog or Ecosystem page, and amplify your innovation within the blockchain community.{% endtrans %}</p>
<a target="_blank" class="w-222 btn btn-primary btn-arrow view-all-events-btn" data-tf-popup="ssHZA7Ly" data-tf-iframe-props="title=Developer Reflections" data-tf-medium="snippet">{% trans %}Submit Your Project{% endtrans %}</a>
</div>
<div class="projects-wrapper">
<div class="project-card top-left">
<div class="card-image">
<img class="middle-image" src="./assets/img/community/blockdaemon.png" />
</div>
<div class="card-details">
<h6 class="project-title">Blockdaemon</h6>
<p class="project-description">{% trans %}Your go-to independent blockchain infrastructure provider, offering secure and scalable blockchain services, including wallets, nodes, staking, protocols, and integrations for developers and institutions alike.{% endtrans %}</p>
<a href="https://xrpl.org/blog/2023/blockdaemon.html" target="_blank" class="view-project external-link">{% trans %}View Project{% endtrans %}</a>
</div>
</div>
<div class="project-card bottom-right">
<div class="card-image">
<img class="middle-image-two" src="./assets/img/community/xrp-cafe.png" />
</div>
<div class="card-details">
<h6 class="project-title">XRPCafe</h6>
<p class="project-description">{% trans %}A premier NFT marketplace dedicated to fostering mass adoption of the XRP Ledger.{% endtrans %}</p>
<a href="https://xrpl.org/blog/2023/xrpcafe.html" target="_blank" class="view-project external-link">{% trans %}View Project{% endtrans %}</a>
</div>
</div>
</div>
</section>
<section class="bottom-cards-section">
<div class="com-card">
<img class="top-left-img" />
<div class="card-content">
<h6 class="card-title">{% trans %}Contribute to Consensus{% endtrans %} </h6>
<h6 class="card-subtitle">{% trans %}Run an XRP Ledger network node{% endtrans %} </h6>
<p class="card-description">{% trans %}Thank you for your interest in contributing to XRPL.org. {% endtrans %}</p>
<div class="card-links">
<a class="com-card-link" target="_blank" href="the-rippled-server.html">{% trans %}The <code>rippled</code> Server{% endtrans %}</a>
<a class="com-card-link" href="run-rippled-as-a-validator.html" target="_blank">{% trans %}Join UNL{% endtrans %} </a>
<a class="com-card-link" target="_blank" href="install-rippled.html">{% trans %}Install & Configure {% endtrans %}</a>
<a class="com-card-link" target="_blank" href="troubleshoot-the-rippled-server.html">{% trans %}Troubleshooting{% endtrans %}</a>
</div>
</div>
</div>
<div class="com-card">
<img class="bottom-right-img" />
<div class="card-content">
<h6 class="card-title">{% trans %}XRPL Careers {% endtrans %}</h6>
<h6 class="card-subtitle">{% trans %}Discover your next career opportunity in the XRPL community {% endtrans %}</h6>
<p class="card-description">{% trans %}Teams across the XRPL community are looking for talented individuals to help build their next innovation.{% endtrans %} </p>
<div class="card-links">
<a class="com-card-link" target="_blank" href="https://jobs.xrpl.org/jobs">{% trans %}View Open Roles{% endtrans %}</a>
</div>
</div>
</div>
<div class="com-card">
<img class="top-right-img" />
<div class="card-content">
<h6 class="card-title">{% trans %}Contribute to XRPL.org{% endtrans %} </h6>
<h6 class="card-subtitle">{% trans %}A Community-Driven Resource for All Things XRPL.org {% endtrans %}</h6>
<p class="card-description">{% trans %}Contribute to XRPL.org, the go-to resource for XRP Ledger. This open-source portal welcomes contributions from anyone for suggested changes.{% endtrans %} </p>
<div class="card-links">
<a class="com-card-link" target="_blank" href="https://github.com/XRPLF/xrpl-dev-portal/blob/master/CONTRIBUTING.md">{% trans %}Read Contributor Guidelines{% endtrans %} </a>
</div>
</div>
</div>
</section>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Splash Page",
"page_group": "Community"
})
</script>
{% endblock analytics %}
{% block endbody %}
<script type="text/javascript">
var events = {{[
{ "name": _("New Horizon: Innovate Without Limits: New Horizons Await"),
"description": _("Join our EVM-compatible chain launch for a chance to win $50,000 in prizes! Unleash your creativity in DeFi and NFTs, with judging criteria focused on novelty, impact, and community engagement."),
"type": "hackathon",
"link": "https://newhorizon.devpost.com/",
"location": _("Virtual"),
"date": "October 19, 2023 - December 22, 2023",
"image": "Hackathons.png",
"end_date": "December 22, 2023",
"start_date": "October 19, 2023"
},
{
"name":_("XRPL Community Report Launch Party"),
"description": _("Celebrate the XRPL Community Report launch at 7pm! Join blockchain enthusiasts, connect with experts, and discover opportunities in the XRP Ledger ecosystem. Limited space available, so register now for a night of celebration and networking!"),
"type": "meetup",
"link": "https://www.eventbrite.fr/e/billets-xrpl-community-report-launch-party-753788370307",
"location": _("Paris, France"),
"date": "November 28, 7pm - 9pm",
"image": "paris.png",
"end_date": "November 28, 2023",
"start_date": "November 28, 2023"
},
{
"name": _("XRPL Toronto Meetup Community - Celebrate with Us!"),
"description": _("To connect the blockchain community, showcase campus ambassador projects, and celebrate the year's progress with a holiday theme."),
"type": "meetup",
"link": "https://www.meetup.com/xrpl-toronto-community-meetup/events/294766059",
"location": _("Downtown, Toronto"),
"date": "December 7th, 6pm - 9pm",
"image": "event-meetup-toronto@2x.jpg",
"end_date": "December 7, 2023",
"start_date": "December 7, 2023"
},
{
"name": _("XRPL Grants Info Session: Decentralized Exchange (DEX) Focused"),
"description":
_("Watch the recorded information session and Q&A on applying to XRPL Grants Wave 7. This session will provide a general overview of the XRPL Grants application for Wave 7, with a focus on Decentralized Exchange (DEX) projects."),
"type": "info-session",
"link": "https://www.youtube.com/watch?v=BbGu0QC5WEE",
"location": _("Virtual - Zoom"),
"date": "September 06, 2023",
"image": "InfoSessions.png",
"end_date": "September 06, 2023",
"start_date": "September 06, 2023",
},
{
"name": _("APEX 2024: The XRPL Developer Summit"),
"description":
_("Apex XRPL Developer Summit is the annual event where developers, contributors, and thought leaders come together to learn, build, share, network, and celebrate all things XRP Ledger."),
"type": "conference",
"link": "http://apexdevsummit.com",
"location": _("Amsterdam"),
"date": "June 11 - 13, 2024",
"image": "Conference.png",
"end_date": "June 13, 2024",
"start_date": "June 11, 2024",
},
{
"name": _("XRPL Developers Reddit AMA: Real World Assets"),
"description":
_("Join us for a live chat on Reddit and learn more about how developers are building real world assets with confidence on the XRP Ledger."),
"type": "ama",
"link": "https://xrplresources.org/rwa-ama?utm_source=web&utm_medium=web&utm_campaign=bwc",
"location":_("Virtual - Reddit"),
"date": "October 17, 2023",
"image": "AMAs.png",
"end_date": "October 17, 2023",
"start_date": "October 17, 2023",
},
{
"name": _("Paris Blockchain Week"),
"description": _("Paris Blockchain Week is Europe's biggest blockchain & digital assets event that covers all aspects of blockchain technology."),
"type": "conference",
"link": "https://www.parisblockchainweek.com/",
"location": _("Paris, France"),
"date": "April 9 - 12, 2024",
"image": "Conference.png",
"end_date": "April 12, 2024",
"start_date": "April 12, 2024",
},
{
"name": _("Consensus"),
"description": _("Join us at Consensus! This event is the world's largest, longest-running and most influential gathering that brings together all sides of the cryptocurrency, blockchain and Web3 community."),
"type": "conference",
"link": "https://consensus2024.coindesk.com/sponsors/",
"location": _("Austin, Texas"),
"date": "May 29 - June 1, 2024",
"image": "Conference.png",
"end_date": "June 1, 2024",
"start_date": "June 1, 2024",
},
]}};
$(document).ready(() => {
// Function to convert string date to Date object
const parseDate = (dateString) => {
const [monthDay, year] = dateString.split(", ");
const [month, day] = monthDay.split(" ");
const months = {
"January": 0, "February": 1, "March": 2, "April": 3,
"May": 4, "June": 5, "July": 6, "August": 7,
"September": 8, "October": 9, "November": 10, "December": 11
};
return new Date(year, months[month], day);
};
// Get today's date (without time)
const today = new Date();
today.setHours(0, 0, 0, 0);
// Find the closest future event
let closestEvent = null;
let minDaysDiff = Infinity;
events.forEach(event => {
const eventEndDate = parseDate(event.start_date);
const diffTime = eventEndDate - today;
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
if (diffDays >= 0 && diffDays < minDaysDiff) {
closestEvent = event;
minDaysDiff = diffDays;
}
});
if (closestEvent) {
document.getElementById('days-count').textContent = `${minDaysDiff}`;
document.getElementById('upcoming-event-name').textContent = closestEvent.name;
document.getElementById('upcoming-event-date').textContent = closestEvent.date;
document.getElementById('location-tag').textContent = closestEvent.location;
} else {
console.log('No upcoming events found. Hiding upcoming events section');
document.getElementById('upcoming-events-section').style = 'display:none'
}
});
</script>
<script type="application/javascript" src="{{currentpage.prefix}}assets/js/contribute-carousel.js"></script>
<script src="//embed.typeform.com/next/embed.js"></script>
{% endblock %}

View File

@@ -1,211 +0,0 @@
{% extends "base.html.jinja" %}
{% block bodyclasses %}no-sidebar{% endblock %}
{% block mainclasses %}page-dev-tools{% endblock %}
{% block main %}
<div>
<section class="py-20">
<div class="mx-auto text-lg-left">
<div class="d-flex flex-column-reverse">
<p class="mb-0">
{% trans %}Use the developer tools to test, explore, and validate XRP Ledger
API requests and behavior.{% endtrans %}
</p>
<h3 class="eyebrow mb-3"> {% trans %}Dev Tools{% endtrans %}</h3>
</div>
</div>
</section>
<section class="py-10">
<div class="mx-auto text-lg-left">
<div className="sticky">
<ul class="nav nav-tabs pb-15" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active dev-tools-tab" id="explorers-tab" data-toggle="tab" data-target="#explorers" role="tab" aria-controls="explorers" aria-selected="true" >{% trans %}Explorers{% endtrans %}</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link dev-tools-tab" id="api-access-tab" data-toggle="tab" data-target="#api-access" role="tab" aria-controls="api-access" aria-selected="false">{% trans %}API Access{% endtrans %}</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link dev-tools-tab" id="other-tab" data-toggle="tab" data-target="#other" role="tab" aria-controls="other" aria-selected="false">{% trans %}Other{% endtrans %}</button>
</li>
</ul>
</div>
<div class="tab-content pt-20">
<div class="tab-pane show active" id="explorers" role="tabpanel" aria-labelledby="explorers-tab">
{% set explorers_tools =[
{
"id": "xrp-explorer",
"title": "XRPL Explorer",
"description":
"View validations of new ledger versions in real-time, or chart the location of servers in the XRP Ledger.",
"href": "https://livenet.xrpl.org",
"img": "img/dev-tools/explorer.png"
},
{
"id": "bithomp-explorer",
"title": "Bithomp Explorer",
"description":
"Explore public ledger data including accounts' transaction history and known names.",
"href": "https://bithomp.com/",
"img": "img/dev-tools/bithomp.png"
},
{
"id": "xrpscan",
"title": "XRPScan",
"description":
"Explore ledger activity, view amendment voting in real-time, and get account information. API access is also available.",
"href": "https://xrpscan.com/",
"img": "img/dev-tools/xrpscan.png"
},
{
"id": "token-list",
"title": "Token List",
"description":
"See all tokens issued in the XRP Ledger and use preset tools to issue custom tokens at the click of a button.",
"href": "https://xumm.community/tokens",
"img": "img/dev-tools/tokenlist.png"
},
] %}
<h4> {% trans %}Explorers{% endtrans %}</h4>
<div class="row row-cols-1 row-cols-lg-3 card-deck">
{% for card in explorers_tools%}
<a class="card" href="{{card.href}}" target="_blank" id="{{card.id}}">
{% if card.img %}<img src="{{card.img}}" alt="{{card.title}} Screenshot" />{% endif %}
<div class="card-body">
<h4 class="card-title h5">{{card.title}}</h4>
<p class="card-text">{{card.description}}</p>
</div>
<div class="card-footer">&nbsp;</div>
</a>
{% endfor %}
</div>
</div>
<div class="tab-pane" id="api-access" role="tabpanel" aria-labelledby="api-access-tab">
<h4> {% trans %}API Access{% endtrans %}</h4>
{% set api_access_tools = [
{
"id": "websocket",
"title": "WebSocket Tool",
"description":
"Send sample requests and get responses from the rippled API. ",
"href": "websocket-api-tool.html",
"img": "img/dev-tools/websocket-tool.png"
},
{
"id": "rpc",
"title": "RPC Tool",
"description":
"Print raw information about an XRP Ledger account, transaction, or ledger.",
"href": "xrp-ledger-rpc-tool.html",
"img": "img/dev-tools/rpc-tool.png"
},
{
"id": "technical-explorer",
"title": "Technical Explorer",
"description":
"Browse API objects from the ledger with real-time updates. ",
"href": "https://explorer.xrplf.org/",
"img": "img/dev-tools/technical-explorer.png"
},
{
"id": "faucets",
"title": "Faucets",
"description":
"Get credentials and test-XRP for XRP Ledger Testnet or Devnet.",
"href": "xrp-testnet-faucet.html",
"img": "img/dev-tools/faucets.png"
},
{
"id": "trasaction-sender",
"title": "Transaction Sender",
"description":
"Test how your code handles various XRP Ledger transactions by sending them over the Testnet to the address.",
"href": "tx-sender.html",
"img": "img/dev-tools/transaction-sender.png"
},
]%}
<div class="row row-cols-1 row-cols-lg-3 card-deck">
{% for card in api_access_tools %}
<a class="card" href="{{card.href}}" target="_blank" id="{{card.id}}">
{% if card.img %}<img src="{{card.img}}" alt="{{card.title}} Screenshot" />{% endif %}
<div class="card-body">
<h4 class="card-title h5">{{card.title}}</h4>
<p class="card-text">{{card.description}}</p>
</div>
<div class="card-footer">&nbsp;</div>
</a>
{% endfor %}
</div>
</div>
<div class="tab-pane" id="other" role="tabpanel" aria-labelledby="other-tab">
<h4> {% trans %}Other{% endtrans %}</h4>
{% set other = [
{
"id": "domain",
"title": "Domain Verification Checker",
"description": "Verify your validator's domain.",
"href": "validator-domain-verifier.html",
"img": "img/dev-tools/domain-checker.png"
},
{
"id":"xrp-ledger",
"title": "xrp-ledger.toml Checker",
"description":
"Verify that your xrp-ledger.toml file is set up properly.",
"href": "xrp-ledger-toml-checker.html",
"img": "img/dev-tools/toml-checker.png"
},
{
"id": "binary-visualizer",
"title": "Binary Visualizer",
"description":
"Parse the XRP Ledger's native binary format with a visual representation breaking down the raw structure into its parts.",
"href": "https://richardah.github.io/xrpl-binary-visualizer/",
"img": "img/dev-tools/binary-visualizer.png"
},
{
"id": "token-metadata-lookup",
"title": "Token Metadata Lookup",
"description":
"Query known information about any token issued on the XRP Ledger.",
"href": "https://xrplmeta.org/",
"img": "img/dev-tools/token-metadata.png"
},
]%}
<div class="row row-cols-1 row-cols-lg-3 card-deck">
{% for card in other %}
<a class="card" href="{{card.href}}" target="_blank" id="{{card.id}}">
{% if card.img %}<img src="{{card.img}}" alt="{{card.title}} Screenshot" />{% endif %}
<div class="card-body">
<h4 class="card-title h5">{{card.title}}</h4>
<p class="card-text">{{card.description}}</p>
</div>
<div class="card-footer">&nbsp;</div>
</a>
{% endfor %}
</div>
</div>
</div>
</div>
</section>
<section class="container-new py-10 px-0">
<div class="col-lg-12 p-6-sm p-10-until-sm br-8 cta-card">
<img src="./img/backgrounds/cta-home-purple.svg" class="d-none-sm cta cta-top-left">
<img src="./img/backgrounds/cta-home-green.svg" class="cta cta-bottom-right">
<div class="z-index-1 position-relative">
<h2 class="h4 mb-8-sm mb-10-until-sm">{% trans %}Have an Idea For a Tool?{% endtrans %}</h2>
<p class="mb-10">{% trans %}Contribute to the XRP Ledger community by submitting your idea for a tool or open a pull request if you've developed a tool.{% endtrans %}</p>
<a class="btn btn-primary btn-arrow-out" href="https://github.com/XRPLF/xrpl-dev-portal/">{% trans %}Open a pull Request{% endtrans %}</a>
</div>
</div>
</section>
{% endblock %}

View File

@@ -1,24 +0,0 @@
{% extends "base.html.jinja" %}
{% block breadcrumbs %}{% endblock %}
{% block mainclasses %}landing page-docs page-docs-index landing-builtin-bg overflow-hidden styled-page{% endblock %}
{% block main %}
<section class="container-new py-26 doc-index">
<div class="d-flex flex-column-reverse w-100">
<h2 id="full-doc-index" class="h4">{% trans %}Full documentation index{% endtrans %}</h2>
<h6 class="eyebrow mb-3">{% trans %}See Everything{% endtrans %}</h6>
</div>
{% set docpages = pages|selectattr('html', 'defined_and_equalto', 'docs.html')|list|first %}
<div class="row">
{% for page in docpages.children if page.html not in ("by-label.html", "faq.html", 'docs-index.html') %}
{% set parent_html = page.html %}
{% set depth = 6 %}
{% set show_blurbs = False %}
<div class="col-md-6 mt-20">
<a href="{% if '//' not in page.html %}{{target.prefix}}{% endif %}{{page.html}}"><h5 class="mb-3">{{page.name}}</h5></a>
{% include 'children.html' %}
</div>
{% endfor %}
</div>
</section>
{% endblock %}

View File

@@ -1,436 +0,0 @@
{% extends "base.html.jinja" %}
{% block mainclasses %}landing page-docs page-docs-index landing-builtin-bg overflow-hidden styled-page{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block left_sidebar %}
{% set tree_top = pages|selectattr("html", "defined_and_equalto", "docs.html")|first %}
{% include 'component-tree-nav.html.jinja' %}
{% endblock %}
{% block main %}
<section class="text-center title-space">
<div class="col-lg-9 mx-auto text-center">
<div class="d-flex flex-column-reverse">
<h1 class="">{% trans %}XRP Ledger Developer Resources{% endtrans %}</h1>
<h6 class="eyebrow mb-3">{% trans %}Documentation{% endtrans %}</h6>
</div>
</div>
</section>
{# Macros #}
{% macro primaryButton(href, text, isArrowUp) %}
{% if isArrowUp %}
<a class="btn btn-primary btn-arrow-out" id="{{href}}-button" href="{{href}}">{{ text }}</a>
{% else %}
<a class="btn btn-primary btn-arrow" id="{{href}}-button" href="{{href}}">{{ text }}</a>
{% endif %}
{% endmacro %}
{% macro flatCard(href, title, description, linkText, imgClass) %}
<a href="{{href}}" class="card flat-card float-up-on-hover">
<img
class="mb-2 {{imgClass}}"
alt={{title}}
/>
<h5 class="row">
<div class="nav-link">{{ title }}</div>
</h5>
<p class="row faded-text flat-card-padding">
{{ description }}
</p>
<div class="col align-button-on-bottom">
<div class="btn btn-primary btn-arrow" id="{{href}}-button">{{ linkText }}</div>
</div>
</a>
{% endmacro %}
{% macro videoCard(url, title, src)%}
<div class="col float-up-on-hover">
<a href="{{url}}" id="playvideo" class="btn1" data-url={{url}}>
<img
alt={{title}}
class="get-started-img video-image"
id={{title}}
src={{src}}
/>
<h6 class="pt-3">{{ title }}</h6>
</a>
</div>
{% endmacro %}
{% macro useCasesCard(subItems, title, imgClass, id) %}
<div class="col">
<img
class="use-cases-img img-fluid mb-2 shadow {{imgClass}}"
alt="{{title}}"
id={{id}}
>
<h5 class="mt-4">{{title}} </h5>
<ul class="nav flex-column">
{% for item in subItems %}
<li class="nav-item"><a href="{{item.link}}" class="nav-link">{{item.description}}</a>
{% endfor %}
</ul>
</div>
{% endmacro %}
{% macro devToolsCard(link, title, description) %}
<a href="{{ link }}" class="col dev-tools-link">
<h6 class="btn-arrow">{{ title }}</h6>
<p> {{ description }}</p>
</a>
{% endmacro %}
{% set recommendedPages = [
{
"description": _("rippled API Reference"),
"link": "./manage-the-rippled-server.html",
},
{
"description": _("XRP Faucet"),
"link": "./xrp-testnet-faucet.html",
},
{
"description": _("Getting Started with Python"),
"link": "./get-started-using-python.html#get-started-using-python",
},
{
"description": _("Websocket API Tool"),
"link": "./websocket-api-tool.html",
},
{ "description": _("XRP Ledger Explorer"), "link": "https://livenet.xrpl.org" },
] %}
{%
set intermediateVideos = [
{
"src": "./assets/img/backgrounds/docs-advanced-payment-features@2x.png",
"title": _("Advanced Payment Features"),
"url": "https://www.youtube.com/embed/e2Iwsk37LMk?rel=0&amp;showinfo=0&amp;autoplay=1",
},
{
"src": "./assets/img/backgrounds/docs-governance@2x.png",
"title": _("Governance and the Amendment Process"),
"url": "https://www.youtube.com/embed/4GbRdanHoR4?rel=0&amp;showinfo=0&amp;autoplay=1",
},
{
"src": "./assets/img/backgrounds/docs-sidechains@2x.png",
"title": _("Federated Sidechains"),
"url": "https://www.youtube.com/embed/NhH4LM8NxgY?rel=0&amp;showinfo=0&amp;autoplay=1",
},
]
%}
{% set useCases = [
{
"title": _("On-Chain Finance"),
"id": "on-chain-finance-use-cases",
"imgClass": "wallet-illustration",
"subItems": [
{
"description": _("Trade on the decentralized exchange"),
"link": "./trade-in-the-decentralized-exchange.html",
},
{
"description": _("Make payments"),
"link": "./send-xrp.html",
},
{
"description": _("Use specialized payment types"),
"link": "./use-specialized-payment-types.html"
}
],
},
{
"title": _("Tokens"),
"id": "token-use-cases",
"imgClass": "token-illustration",
"subItems": [
{
"description": _("Non-fungible Tokens"),
"link": "./non-fungible-tokens.html",
},
{
"description": _("Issue a stablecoin"),
"link": "./issue-a-fungible-token.html",
},
{
"description": _("Assign an authorized minter"),
"link": "./assign-an-authorized-minter-using-javascript.html",
},
],
},
{
"title": _("Payments"),
"id": "payments-use-cases",
"imgClass": "connections-illustration",
"subItems": [
{
"description": _("Peer to peer payments"),
"link": "./direct-xrp-payments.html",
},
{
"description": _("Cross-currency payments"),
"link": "./cross-currency-payments.html",
},
{
"description": _("Escrows"),
"link": "./escrow.html",
},
],
},
]
%}
{%
set getStartedVideos = [
{
"src": "./assets/img/backgrounds/docs-intro-to-XRP-ledger@2x.png",
"title": _("Intro to XRP Ledger"),
"url": "https://www.youtube.com/embed/sVTybJ3cNyo?rel=0&amp;showinfo=0&amp;autoplay=1",
},
{
"src": "./assets/img/backgrounds/docs-accounts@2x.png",
"title": _("Accounts"),
"url": "https://www.youtube.com/embed/eO8jE6PftX8?rel=0&amp;showinfo=0&amp;autoplay=1",
},
{
"src": "./assets/img/backgrounds/docs-decentralized-exchange@2x.png",
"title": _("Decentralized Exchange"),
"url": "https://www.youtube.com/embed/VWNrHBDfXvA?rel=0&amp;showinfo=0&amp;autoplay=1",
},
{
"src": "./assets/img/backgrounds/docs-tokenization@2x.png",
"title": _("Tokenization"),
"url": "https://www.youtube.com/embed/Oj4cWOiWf4A?rel=0&amp;showinfo=0&amp;autoplay=1",
},
]
%}
{%
set devTools = [
{
"title": _("Faucets"),
"link": "./xrp-testnet-faucet.html",
"description":
_("Get credentials and test-XRP for XRP Ledger Testnet or Devnet."),
},
{
"title": _("WebSocket Tool"),
"link": "./websocket-api-tool.html",
"description":
_("Send sample requests and get responses from the rippled API."),
},
{
"title": _("XRP Ledger Explorer"),
"link": "https://livenet.xrpl.org",
"description":
_("View validations of new ledger versions in real-time, chart the location of servers in the XRP Ledger."),
},
{
"title": _("Transaction Sender"),
"link": "./tx-sender.html",
"description":
_("Test how your code handles various XRP Ledger transactions by sending them over the Testnet to the address."),
},
]
%}
<section class="container-new ">
<div class="nav card-grid flat-card-grid card-grid-3xN">
<div class="col">
{{ flatCard("./concepts.html",
_("Concepts"),
_("Learn the \"what\" and the \"why\" behind fundamental aspects of the XRP Ledger."),
_("Read the Docs"),
"concepts-doc-illustration") }}
</div>
<div class="col">
{{ flatCard("./tutorials.html",
_("Tutorials"),
_("Get step-by-step guidance to perform common tasks with the XRP Ledger."),
_("View Tutorials"),
"tutorial-illustration") }}
</div>
<div class="col">
{{ flatCard("./references.html",
_("References"),
_("Look up reference documentation for the XRP Ledger protocol, API methods, and more."),
_("View References"),
"ref-book-illustration") }}
</div>
</div>
</section>
<section class="container-new">
<h4 class="pb-4">{% trans %}Use Cases{% endtrans %}</h4>
<div class="card-grid card-grid-3xN use-cases">
{% for useCase in useCases %}
{{ useCasesCard(useCase.subItems, useCase.title, useCase.imgClass, useCase.id)}}
{% endfor %}
</div>
</section>
<section class="container-new ">
<h4 class="pb-4">{% trans %}Getting Started{% endtrans %}</h4>
<div class="card-grid card-grid-2xN quickstart-card">
<div class="col">
<a href="./send-payments-using-javascript.html" class="card float-up-on-hover">
<h5 class="mt-7">{% trans %}Quickstart to XRP Ledger{% endtrans %}</h5>
<p class="mb-8 mt-4">
{% trans %}An introduction to fundamental aspects of the XRP Ledger.{% endtrans %}
</p>
<div class="dg-lg-block mb-3">
<div
class="btn btn-primary btn-arrow get-started-button"
>
{% trans %}Get Started{% endtrans %}
</div>
</div>
<img
alt="quick-start"
id="quick-start-img"
class="quickstart-image"
/>
</a>
</div>
<div class="col">
<div class="card-grid card-grid-2xN video-grid">
{% set test = "./assets/img/backgrounds/docs-intro-to-XRP-ledger@2x.png"%}
{% for video in getStartedVideos %}
{{ videoCard(video.url, video.title, video.src) }}
{% endfor %}
</div>
<div class="align-button-on-bottom">
{{ primaryButton("https://www.youtube.com/playlist?list=PLJQ55Tj1hIVZtJ_JdTvSum2qMTsedWkNi", _("Watch Full Series"), true) }}
</div>
</div>
</div>
</section>
<section class="container-new ">
<div class="d-flex flex-column-reverse col-sm-8 p-0">
<h3 class="h4 h2-sm">{% trans %}Interact with the XRP Ledger in a language of your choice{% endtrans %}</h3>
<h6 class="eyebrow mb-3">{% trans %}Explore SDKs{% endtrans %}</h6>
</div>
<div class="card-grid card-grid-2xN">
<div class="col">
<div class="card-grid langs-cards card-grid-2xN mt-10" id="langs-cards">
<div class="col langs">
<a href="./get-started-using-javascript.html">
<img
alt="Javascript Logo"
src="./assets/img/logos/javascript.svg"
class="circled-logo"
>
<h5 class="btn-arrow">{% trans %}Javascript{% endtrans %}</h5>
</a>
</div>
<div class="col langs">
<a href="./get-started-using-python.html">
<img
alt="Python Logo"
src="./assets/img/logos/python.svg"
class="circled-logo"
>
<h5 class="btn-arrow">{% trans %}Python{% endtrans %}</h5>
</a>
</div>
<div class="col langs">
<a href="./get-started-using-java.html">
<img
alt="Java Logo"
src="./assets/img/logos/java.svg"
class="circled-logo"
>
<h5 class="btn-arrow">{% trans %}Java{% endtrans %}</h5>
</a>
</div>
</div>
</div>
<div class="col center-image">
<img
class="img-fluid sdk-img"
/>
</div>
</div>
</section>
<section class="container-new ">
<h4 class="pb-4">{% trans %}Intermediate Learning Sources{% endtrans %}</h4>
<div class="card-grid card-grid-3xN">
{% for video in intermediateVideos %}
{{ videoCard(video.url, video.title, video.src) }}
{% endfor %}
</div>
</section>
<section class="container-new ">
<div class="card-grid card-grid-2xN">
<div class="col d-flex align-items-center justify-content-center">
<img
class="dev-tools-img"
>
</div>
<div class="col explore-links">
<div class="d-flex flex-column-reverse w-100">
<h4 class="mb-10">{% trans %}Explore, Test, Verify{% endtrans %}</h4>
<h6 class="mb-3">{% trans %}Explore Dev Tools{% endtrans %}</h6>
</div>
<p class="mb-20">
{% trans %}Use these web-based tools to assist during all stages of development, from getting your first payment to testing your implementation for best practices.{% endtrans %}
</p>
<div class="card-grid card-grid-2xN">
{% for card in devTools %}
{{ devToolsCard(card.link, card.title, card.description) }}
{% endfor %}
</div>
{{ primaryButton("./dev-tools.html", "View All tools", false) }}
</div>
</div>
</section>
<section class="container-new " id="docs-browse-by">
<div class="row card-grid card-grid-2xN">
<div class="col" id="popular-topics">
<h2 class="h4">{% trans %}Browse By Recommended Pages{% endtrans %}</h2>
<ul class="nav flex-column">
{% for page in recommendedPages %}
<li class="nav-item"><a href="{{page.link}}" class="nav-link">{{page.description}}</a>
{% endfor %}
</ul>
</div><!--/#popular-topics-->
<div class="col">
<div class="card cta-card p-8-sm p-10-until-sm br-8">
<img src="./img/backgrounds/cta-home-purple.svg" class="d-none-sm cta cta-top-left">
<img src="./img/backgrounds/cta-home-green.svg" class="cta cta-bottom-right">
<div class="z-index-1 position-relative">
<h2 class="h4 mb-8-sm mb-10-until-sm">{% trans %}Get Free Test XRP{% endtrans %}</h2>
<p class="mb-10">{% trans %}Connect to the XRP Ledger Testnet network to develop and test your apps built on the XRP Ledger, without risking real money or impacting production XRP Ledger users.{% endtrans %}</p>
<a class="btn btn-primary btn-arrow" href="xrp-testnet-faucet.html">{% trans %}Generate Testnet Credentials{% endtrans %}</a>
</div>
</div>
</div>
</div>
</section><!-- Browse by recommended and Generate Testnet Credentials -->
<section class="container-new">
<a href="./docs-index.html" class="btn-arrow arrow-purple documentation-index mr-auto">{% trans %}See full documentation index{% endtrans %}</a>
</section>
{% endblock %}
{% block endbody %}
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Hub Page",
"page_group": "Docs"
})
</script>
{% endblock analytics %}

View File

@@ -1,320 +0,0 @@
{% extends "base.html.jinja" %}
{% block head %}
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
{% endblock %}
{% block bodyclasses %}no-sidebar{% endblock %}
{% block mainclasses %}landing page-events{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block main %}
<div class="position-relative d-none-sm">
<img alt="" src="./img/backgrounds/events-orange.svg" id="events-orange">
</div>
<section class="text-center py-26">
<div class="mx-auto text-center col-lg-5">
<div class="d-flex flex-column-reverse">
<h1 class="mb-0">{% trans %}Find the XRPL Community Around the World{% endtrans %}</h1>
<h6 class="mb-3 eyebrow">{% trans %}Events{% endtrans %}</h6>
</div>
</div>
</section>
<section class="container-new py-26">
<div class="event-hero card-grid card-grid-2xN">
<div class="pr-2 col">
<img alt="" src="./assets/img/events/event-hero3@2x.png" class="w-100">
</div>
<div class="pt-5 pr-2 col">
<div class="d-flex flex-column-reverse">
<h2 class="mb-8 h4 h2-sm">{% trans %}The XRPL Developer Summit{% endtrans %}</h2>
<h6 class="mb-3 eyebrow">{% trans %}Save the Date{% endtrans %}</h6>
</div>
<p class="mb-4">{% trans %}Apex is back and headed to Amsterdam. Apex XRPL Developer Summit is the annual event where developers, contributors, and thought leaders come together to learn, build, share, network, and celebrate all things XRP Ledger.{% endtrans %}</p>
<div class="py-2 my-3 event-small-gray" >
Location: Amsterdam
</div>
<div class="py-2 my-3 event-small-gray" >
Date: June 11-13, 2024
</div>
<div class="d-lg-block">
<a class="btn btn-primary btn-arrow-out" target="_blank" href="https://www.apexdevsummit.com/">{% trans %}Learn More{% endtrans %}</a>
</div>
</div>
</div>
</section>
{# Upcoming Events #}
<section class="container-new py-26" id="upcoming-events">
<div class="p-0 pb-2 mb-4 d-flex flex-column-reverse col-lg-6 pr-lg-5">
<h3 class="h4 h2-sm">{% trans %}Check out meetups, hackathons, and other events hosted by the XRPL Community{% endtrans %}</h3>
<h6 class="mb-3 eyebrow">{% trans %}Upcoming Events{% endtrans %}</h6>
</div>
<div class="filter row col-12 mt-lg-5 d-flex flex-column">
<h6 class="mb-3">Filter By:</h6>
<div>
<div class="form-check form-check-inline">
<input value="conference" id="conference-upcoming" name="conference-upcoming" type="checkbox" class="events-filter" checked />
<label for="conference-upcoming">Conference</label>
</div>
<div class="form-check form-check-inline">
<input value="meetup" id="meetup-upcoming" name="meetup-upcoming" type="checkbox" class="events-filter" checked />
<label for="meetup-upcoming">Meetups</label>
</div>
<div class="form-check form-check-inline">
<input value="hackathon" id="hackathon-upcoming" name="hackathon-upcoming" type="checkbox" class="events-filter" checked />
<label for="hackathon-upcoming">Hackathons</label>
</div>
<div class="form-check form-check-inline">
<input value="ama" id="ama-upcoming" name="ama-upcoming" type="checkbox" class="events-filter" checked />
<label for="ama-upcoming">AMAs</label>
</div>
<div class="form-check form-check-inline">
<input value="cc" id="cc-upcoming" name="cc-upcoming" type="checkbox" class="events-filter" checked />
<label for="cc-upcoming">Community Calls</label>
</div>
<div class="form-check form-check-inline">
<input value="zone" id="zone-upcoming" name="zone-upcoming" type="checkbox" class="events-filter" checked />
<label for="zone-upcoming">XRPL Zone</label>
</div>
<div class="form-check form-check-inline">
<input value="info-session" id="info-session-upcoming" name="info-session-upcoming" type="checkbox" class="events-filter" checked />
<label for="info-session-upcoming">Info Session</label>
</div>
</div>
</div>
{#
Needs Link
{
"name": "APEX: The XRPL Developer Summit",
"description": "Save the date!",
"type": "conference",
"link": "",
"location": "Amsterdam",
"date": "June 11 - 13, 2024",
"image": "Conference.png",
"end_date": "June 13, 2024"
},
#}
{# Available Types - conference, hackathon, ama, cc, zone, meetup, info-session #}
{# Moved all dates to filter in order to be able to share it in other components #}
{% set results = categorize_dates() %}
{% set upcoming = results.upcoming %}
{% set past = results.past %}
<div class="mt-2 row row-cols-1 row-cols-lg-3 card-deck">
{% for event in upcoming %}
<a class="event-card {{event.type}}" href="{{event.link}}" style="{{event.style}}" target="_blank">
<div class="event-card-header" style="background: no-repeat url(assets/img/events/{{event.image}});">
<div class="event-card-title">{{event.name}}</div>
</div>
<div class="event-card-body">
<p>{{event.description}}</p>
</div>
<div class="mt-lg-auto event-card-footer d-flex flex-column">
<span class="mb-2 d-flex icon icon-location">{{event.location}}</span>
<span class="d-flex icon icon-date">{{event.date}}</span>
</div>
</a>
{% endfor %}
</div>
</section>
{# Past events #}
<section class="container-new pt-26" id="past-events">
<div class="p-0 pb-2 mb-4 d-flex flex-column-reverse col-lg-6 pr-lg-5">
<h3 class="h4 h2-sm">{% trans %}Explore past community-hosted events{% endtrans %}</h3>
<h6 class="mb-3 eyebrow">{% trans %}Past Events{% endtrans %}</h6>
</div>
<div class="filter row col-12 mt-lg-5 d-flex flex-column">
<h6 class="mb-3">Filter By:</h6>
<div>
<div class="form-check form-check-inline">
<input value="conference" id="conference-past" name="conference-past" type="checkbox" class="events-filter" checked />
<label for="conference-past">Conference</label>
</div>
<div class="form-check form-check-inline">
<input value="meetup" id="meetup-past" name="meetup-past" type="checkbox" class="events-filter" checked />
<label for="meetup-past">Meetups</label>
</div>
<div class="form-check form-check-inline">
<input value="hackathon" id="hackathon-past" name="hackathon-past" type="checkbox" class="events-filter" checked />
<label for="hackathon-past">Hackathons</label>
</div>
<div class="form-check form-check-inline">
<input value="ama" id="ama-past" name="ama-past" type="checkbox" class="events-filter" checked />
<label for="ama-past">AMAs</label>
</div>
<div class="form-check form-check-inline">
<input value="cc" id="cc-past" name="cc-past" type="checkbox" class="events-filter" checked />
<label for="cc-past">Community Calls</label>
</div>
<div class="form-check form-check-inline">
<input value="zone" id="zone-past" name="zone-past" type="checkbox" class="events-filter" checked />
<label for="zone-past">XRPL Zone</label>
</div>
<div class="form-check form-check-inline">
<input value="info-session" id="info-session-past" name="info-session-past" type="checkbox" class="events-filter" checked />
<label for="info-session-past">Info Session</label>
</div>
</div>
</div>
<div class="mt-2 mb-0 row row-cols-1 row-cols-lg-3 card-deck ">
{% for event in past|reverse %}
<a class="event-card {{event.type}}" href="{{event.link}}" target="_blank">
<div class="event-card-header" style="background: no-repeat url(assets/img/events/{{event.image}}); ">
<div class="event-card-title">{{event.name}}</div>
</div>
<div class="event-card-body">
<p>{{event.description}}</p>
</div>
<div class="mt-lg-auto event-card-footer d-flex flex-column">
<span class="mb-2 d-flex icon icon-location">{{event.location}}</span>
<span class="d-flex icon icon-date">{{event.date}}</span>
</div>
</a>
{% endfor %}
</div>
</section>
<script>
$('#conference-upcoming').change(function () {
if ($('#conference-upcoming').is(':checked')) {
$('.conference-upcoming').show();
} else {
$('.conference-upcoming').hide();
}
});
$('#meetup-upcoming').change(function () {
if ($('#meetup-upcoming').is(':checked')) {
$('.meetup-upcoming').show();
} else {
$('.meetup-upcoming').hide();
}
});
$('#hackathon-upcoming').change(function () {
if ($('#hackathon-upcoming').is(':checked')) {
$('.hackathon-upcoming').show();
} else {
$('.hackathon-upcoming').hide();
}
});
$('#ama-upcoming').change(function () {
if ($('#ama-upcoming').is(':checked')) {
$('.ama-upcoming').show();
} else {
$('.ama-upcoming').hide();
}
});
$('#cc-upcoming').change(function () {
if ($('#cc-upcoming').is(':checked')) {
$('.cc-upcoming').show();
} else {
$('.cc-upcoming').hide();
}
});
$('#zone-upcoming').change(function () {
if ($('#zone-upcoming').is(':checked')) {
$('.zone-upcoming').show();
} else {
$('.zone-upcoming').hide();
}
});
$('#info-session-upcoming').change(function () {
if ($('#info-session-upcoming').is(':checked')) {
$('.info-session-upcoming').show();
} else {
$('.info-session-upcoming').hide();
}
});
$('#conference-past').change(function () {
if ($('#conference-past').is(':checked')) {
$('.conference-past').show();
} else {
$('.conference-past').hide();
}
});
$('#meetup-past').change(function () {
if ($('#meetup-past').is(':checked')) {
$('.meetup-past').show();
} else {
$('.meetup-past').hide();
}
});
$('#hackathon-past').change(function () {
if ($('#hackathon-past').is(':checked')) {
$('.hackathon-past').show();
} else {
$('.hackathon-past').hide();
}
});
$('#ama-past').change(function () {
if ($('#ama-past').is(':checked')) {
$('.ama-past').show();
} else {
$('.ama-past').hide();
}
});
$('#cc-past').change(function () {
if ($('#cc-past').is(':checked')) {
$('.cc-past').show();
} else {
$('.cc-past').hide();
}
});
$('#zone-past').change(function () {
if ($('#zone-past').is(':checked')) {
$('.zone-past').show();
} else {
$('.zone-past').hide();
}
});
$('#info-session-past').change(function () {
if ($('#info-session-past').is(':checked')) {
$('.info-session-past').show();
} else {
$('.info-session-past').hide();
}
});
</script>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Splash Page",
"page_group": "Events"
})
</script>
{% endblock analytics %}

View File

@@ -1,45 +0,0 @@
{% extends "pagetype-doc.html.jinja" %}
{% block head %}
<script>
$(document).ready(function() {
$(window.location.hash).closest(".q-wrapper").find('.answer-wrapper').collapse('show');
});
</script>
{% endblock %}
{% block bodyclasses %}page-faq landing-builtin-bg{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block main %}
<article class="row">
{% if (target.lang != "en" and "en" in currentpage.targets) or currentpage.untranslated_warning %}
{# Add a "sorry this page isn't translated" banner. #}
<div class="devportal-callout note mb-5"><strong>{% trans %}Sorry, this page is not available in your language.{% endtrans %}</strong>
<p class="mb-0">{% trans %}We are making an effort to offer the XRP Ledger Dev Portal in a variety of languages, but not all pages are available in all languages. If you'd like to help, <a href="https://github.com/XRPLF/xrpl-dev-portal/blob/master/CONTRIBUTING.md">please contribute!</a>{% endtrans %}</p>
</div><!--/.devportal-callout-->
{% endif %}
{% if target.lang != "en" and currentpage.outdated_translation %}
{# Add a "This translation is not up-to-date." banner. #}
<div class="mb-5 devportal-callout note"><strong>{% trans %}This translated page is not updated to match the latest changes in the English version.{% endtrans %}</strong>
<p class="mb-0">{% trans %}We are making an effort to offer the XRP Ledger Dev Portal in a variety of languages, but not all translated contents are up-to-date. If you'd like to help, <a href="https://github.com/XRPLF/xrpl-dev-portal/blob/master/CONTRIBUTING.md">please contribute!</a>{% endtrans %}</p>
</div><!--/.devportal-callout-->
{% endif %}
<div class="content container-new">
<div class="d-flex-column">
{{ content }}
</div>
</div>
</article>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Splash Page",
"page_group": "About"
})
</script>
{% endblock analytics %}

View File

@@ -1,339 +0,0 @@
{% extends "base.html.jinja" %}
{% block head %}
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
{% endblock %}
{% block bodyclasses %}no-sidebar{% endblock %}
{% block mainclasses %}landing page-funding{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block main %}
<div class="position-relative d-none-sm">
<img alt="" src="./img/backgrounds/funding-purple.svg" class="position-absolute" style="top: 0; right:0">
</div>
<section class="container-new py-26 text-lg-center">
<div class="p-0 col-lg-6 mx-lg-auto">
<div class="d-flex flex-column-reverse">
<h1 class="mb-0">{% trans %}XRPL Developer Funding Programs{% endtrans %}</h1>
<h6 class="eyebrow mb-3">{% trans %}Project Resources{% endtrans %}</h6>
</div>
</div>
</section>
<section class="container-new py-26">
<div class="p-0 col-lg-6 mx-lg-auto" style="max-width: 520px;">
<div class="d-flex flex-column-reverse">
<h1 class="mb-0 h4 h2-sm">{% trans %}Explore funding opportunities for developers and teams{% endtrans %}</h1>
<h6 class="eyebrow mb-3">{% trans %}Funding Overview{% endtrans %}</h6>
</div>
<p class="mt-3 py-3 p-0 longform">{% trans %}If youre a software developer or team looking to build your next project or venture on the XRP Ledger (XRPL), there are a number of opportunities to fund your next innovation.{% endtrans %}</p>
</div>
</section>
<!-- Hackathons -->
<section class="container-new py-26">
<!-- flex. Col for mobile. Row for large. on large align content to the center -->
<div class="d-flex flex-column flex-lg-row align-items-lg-center">
<div class="order-1 order-lg-2 mb-4 pb-3 mb-lg-0 pb-lg-0 col-lg-6 px-0" style="max-width: 520px;">
<div class="d-flex flex-column-reverse p-lg-3">
<h3 class="h4 h2-sm">{% trans %}XRPL Hackathons{% endtrans %}</h3>
<h6 class="eyebrow mb-3">{% trans %}Join an Event{% endtrans %}</h6>
</div>
<p class="p-lg-3 mb-2 longform">{% trans %}Hackathons are open to all developers to explore and invent a project on the XRP Ledger. Visit the events page for updates on upcoming hackathons.{% endtrans %}</p>
<div class="d-none d-lg-block p-lg-3">
<a class="btn btn-primary btn-arrow" href="events.html">{% trans %}See Upcoming Events{% endtrans %}</a>
</div>
</div>
<div class="order-2 order-lg-1 col-lg-6 px-0">
<div class="row align-items-center m-0 funding-list">
<!-- funding list -->
<div class="col-12 col-lg-6 p-0">
<div class="px-lg-3 pb-3">
<img id="funding-01" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Best for{% endtrans %}</h6>
<p>{% trans %}Software developers and teams building directly on the XRP Ledger{% endtrans %}</p>
</div>
</div>
<!-- Hide on large -->
<div class="px-lg-3 pb-3 d-lg-none">
<img id="funding-02" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Required{% endtrans %}</h6>
<p>{% trans %}Some coding experience{% endtrans %}</p>
</div>
</div>
<div class="px-lg-3 pb-3 pt-lg-5">
<img id="funding-03" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Level{% endtrans %}</h6>
<p>{% trans %}XRPL beginner to advanced developers{% endtrans %}</p>
</div>
</div>
<!-- Hide on large -->
<div class="px-lg-3 pb-3 d-lg-none">
<img id="funding-04" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Funding Levels{% endtrans %}</h6>
<p>{% trans %}Prize money and awards{% endtrans %}</p>
</div>
</div>
</div>
<!-- end col 1 -->
<!-- Show on large -->
<div class="col-12 col-lg-6 p-0 d-none d-lg-block">
<div class="px-lg-3 pb-3 pt-5 mt-5">
<div class="pt-1 mt-3">
<img id="funding-02" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Required{% endtrans %}</h6>
<p>{% trans %}Some coding experience{% endtrans %}</p>
</div>
</div>
</div>
<div class="px-lg-3 pb-3 pt-5">
<img id="funding-04" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Funding Levels{% endtrans %}</h6>
<p>{% trans %}Prize money and awards{% endtrans %}</p>
</div>
</div>
</div>
<!-- end col 2 -->
</div>
</div>
<div class="d-lg-none order-3 mt-4 pt-3">
<a class="btn btn-primary btn-arrow" href="events.html">{% trans %}See Upcoming Events{% endtrans %}</a>
</div>
</div>
</section>
<!-- Eligibility -->
<section class="container-new py-26">
<!-- flex. Col for mobile. Row for large. on large align content to the center -->
<div class="d-flex flex-column flex-lg-row align-items-lg-center mr-lg-4">
<div class="order-1 mb-4 pb-3 mb-lg-0 pb-lg-0 col-lg-6 px-0 p-lg-3">
<div class="d-flex flex-column-reverse py-lg-3">
<h3 class="h4 h2-sm">{% trans %}XRPL Grants{% endtrans %}</h3>
<h6 class="eyebrow mb-3">{% trans %}Fund Your Project{% endtrans %}</h6>
</div>
<p class="py-lg-3 mb-2 longform" style="max-width: 520px;">{% trans %}Developer grants for projects that contribute to the growing XRP Ledger community.{% endtrans %}</p>
<div class="mt-4 pt-3" style="max-width: 520px;">
<span class="h6" style="font-size: 1rem;">{% trans %}Past awardees include:{% endtrans %}</span>
<div class="mb-4 py-3" id="xrplGrantsDark"></div>
</div>
<div class="d-none d-lg-block py-lg-3">
<a class="btn btn-primary btn-arrow-out" target="_blank" href="https://xrplgrants.org/">{% trans %}Visit XRPL Grants{% endtrans %}</a>
</div>
</div>
<div class="order-2 col-lg-6 px-0 pl-lg-3">
<div class="row align-items-center m-0 funding-list">
<!-- funding list -->
<div class="col-12 col-lg-6 p-0">
<div class="px-lg-3 pb-3">
<img id="funding-01" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Best for{% endtrans %}</h6>
<p>{% trans %}Software developers, teams, and start-ups building directly on the XRP Ledger{% endtrans %}</p>
</div>
</div>
<!-- Hide on large -->
<div class="px-lg-3 pb-3 d-lg-none">
<img id="funding-02" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Required{% endtrans %}</h6>
<p>{% trans %}Coding experience <span style="color: #7919FF;">&bull;</span> Github repository <span style="color: #7919FF;">&bull;</span> Project narrative/description <span style="color: #7919FF;">&bull;</span> At least one developer on the core team <span style="color: #7919FF;">&bull;</span> Budget and milestones{% endtrans %}</p>
</div>
</div>
<div class="px-lg-3 pb-3 pt-lg-5">
<img id="funding-03" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Level{% endtrans %}</h6>
<p>{% trans %}XRPL intermediate to advanced developers{% endtrans %}</p>
</div>
</div>
<!-- Hide on large -->
<div class="px-lg-3 pb-3 d-lg-none">
<img id="funding-04" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Funding Levels{% endtrans %}</h6>
<p>{% trans %}$10,000 - $200,000{% endtrans %}</p>
</div>
</div>
</div>
<!-- end col 1 -->
<!-- Show on large -->
<div class="col-12 col-lg-6 p-0 d-none d-lg-block">
<div class="px-lg-3 pb-3 pt-5 mt-5">
<div class="pt-1 mt-3">
<img id="funding-02" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Required{% endtrans %}</h6>
<p>{% trans %}Coding experience <span style="color: #7919FF;">&bull;</span> Github repository <span style="color: #7919FF;">&bull;</span> Project narrative/description <span style="color: #7919FF;">&bull;</span> At least one developer on the core team <span style="color: #7919FF;">&bull;</span> Budget and milestone{% endtrans %}</p>
</div>
</div>
</div>
<div class="px-lg-3 pb-3 pt-5">
<img id="funding-04" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Funding Levels{% endtrans %}</h6>
<p>{% trans %}$10,000 - $200,000{% endtrans %}</p>
</div>
</div>
</div>
<!-- end col 2 -->
</div>
</div>
<div class="d-lg-none order-3 mt-4 pt-3">
<a class="btn btn-primary btn-arrow-out" target="_blank" href="https://xrplgrants.org/">{% trans %}Visit XRPL Grants{% endtrans %}</a>
</div>
</div>
</section>
<!-- Accelerator -->
<section class="container-new py-26">
<!-- flex. Col for mobile. Row for large. on large align content to the center -->
<div class="d-flex flex-column flex-lg-row align-items-lg-center">
<div class="order-1 order-lg-2 mb-4 pb-3 mb-lg-0 pb-lg-0 col-lg-6 px-0" style="max-width: 520px;">
<div class="d-flex flex-column-reverse p-lg-3">
<h3 class="h4 h2-sm">{% trans %}XRPL Accelerator{% endtrans %}</h3>
<h6 class="eyebrow mb-3">{% trans %}Advance your project{% endtrans %}</h6>
</div>
<p class="p-lg-3 mb-2 longform">{% trans %}12-week program for entrepreneurs building on the XRP Ledger to scale their projects into thriving businesses.{% endtrans %}</p>
<div class="d-none d-lg-block p-lg-3">
<a class="btn btn-primary btn-arrow" href="https://xrplaccelerator.org/">{% trans %}View XRPL Accelerator{% endtrans %}</a>
</div>
</div>
<div class="order-2 order-lg-1 col-lg-6 px-0">
<div class="row align-items-center m-0 funding-list">
<!-- funding list -->
<div class="col-12 col-lg-6 p-0">
<div class="px-lg-3 pb-3">
<img id="funding-01" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Best for{% endtrans %}</h6>
<p>{% trans %}Start-ups building scalable products on XRPL that can capture a large market opportunity{% endtrans %}</p>
</div>
</div>
<!-- Hide on large -->
<div class="px-lg-3 pb-3 d-lg-none">
<img id="funding-02" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Required{% endtrans %}</h6>
<p>{% trans %}<span style="color: #7919FF;">&bull;</span> Strong founding team <br/> <span style="color: #7919FF;">&bull;</span> Bold, ambitious vision <br/> <span style="color: #7919FF;">&bull;</span> Ideally an MVP and monetization strategy{% endtrans %}</p>
</div>
</div>
<div class="px-lg-3 pb-3 pt-lg-5">
<img id="funding-03" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Level{% endtrans %}</h6>
<p>{% trans %}<span style="color: #7919FF;">&bull;</span> XRPL advanced developers <br/> <span style="color: #7919FF;">&bull;</span> Business acumen{% endtrans %}</p>
</div>
</div>
<!-- Hide on large -->
<div class="px-lg-3 pb-3 d-lg-none">
<img id="funding-04" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Funding Levels{% endtrans %}</h6>
<p>{% trans %}$50,000 (grant) + pitch for venture funding{% endtrans %}</p>
</div>
</div>
</div>
<!-- end col 1 -->
<!-- Show on large -->
<div class="col-12 col-lg-6 p-0 d-none d-lg-block">
<div class="px-lg-3 pb-3 pt-5 mt-5">
<div class="pt-1 mt-3">
<img id="funding-02" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Required{% endtrans %}</h6>
<p>{% trans %}<span style="color: #7919FF;">&bull;</span> Strong founding team <br/> <span style="color: #7919FF;">&bull;</span> Bold, ambitious vision <br/> <span style="color: #7919FF;">&bull;</span> Ideally an MVP and monetization strategy{% endtrans %}</p>
</div>
</div>
</div>
<div class="px-lg-3 pb-3 pt-5">
<img id="funding-04" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Funding Levels{% endtrans %}</h6>
<p>{% trans %}$50,000 (grant) + pitch for venture funding{% endtrans %}</p>
</div>
</div>
</div>
<!-- end col 2 -->
</div>
</div>
<div class="d-lg-none order-3 mt-4 pt-3">
<a class="btn btn-primary btn-arrow" href="https://xrplaccelerator.org/">{% trans %}View XRPL Accelerator{% endtrans %}</a>
</div>
</div>
</section>
<div class="position-relative d-none-sm">
<img alt="" src="./img/backgrounds/funding-orange.svg" id="funding-orange">
</div>
{% endblock %}
{% block endbody %}
<script type="text/javascript" src="{{currentpage.prefix}}assets/js/bodymovin.min.js"></script>
<!-- Dark version and using filter invert and adjust brightness for light mode -->
<script type="text/javascript" src="{{currentpage.prefix}}assets/js/community/XRPL-grants-dark.json"></script>
<script type="text/javascript">
function xrplGrantsAnimation(){
bodymovin.loadAnimation({
container: document.getElementById('xrplGrantsDark'),
renderer: 'svg',
loop: true,
autoplay: true,
animationData: xrplGrantsDark
});
};
xrplGrantsAnimation();
</script>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Splash Page",
"page_group": "Funding"
})
</script>
{% endblock analytics %}

View File

@@ -1,134 +0,0 @@
{% extends "base.html.jinja" %}
{% block head %}
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
{% endblock %}
{% block bodyclasses %}no-sidebar{% endblock %}
{% block mainclasses %}landing{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block main %}
<div class="overflow-hidden">
<div class="position-relative">
<img alt="" src="./img/backgrounds/history-orange.svg" class="landing-bg" id="history-orange">
</div>
<section class="py-26 text-center">
<div class="col-lg-5 mx-auto text-center">
<div class="d-flex flex-column-reverse">
<h1 class="mb-0">{% trans %}Provide a Better Alternative to Bitcoin{% endtrans %}</h1>
<h6 class="eyebrow mb-3">{% trans %}XRPL's Origin{% endtrans %}</h6>
</div>
</div>
</section>
<section class="container-new py-26">
<div class="col-lg-6 offset-lg-3">
<h4 class="longform mb-10">{% trans %}In 2011, three engineers—David Schwartz, Jed McCaleb, and Arthur Britto—began developing the XRP Ledger (XRPL). Fascinated by Bitcoin, they set out to create a better version that improved upon its limitations—with the goal of creating a digital asset that was more sustainable and built specifically for payments.{% endtrans %}</h4>
<p class="mb-6">{% trans %}The XRP Ledger first launched in June 2012. Shortly thereafter, they were joined by Chris Larsen, and the group started the Company NewCoin in September 2012 (quickly renamed OpenCoin and now named Ripple).{% endtrans %}</p>
<p class="mb-0">{% trans %}The XRPL founders gifted 80 billion XRP, the platforms native currency, to the company. Ripple has since put the majority in escrow.{% endtrans %}</p>
</div>
</section>
<div class="position-relative d-none-sm">
<img alt="" src="./img/backgrounds/history-purple.svg" id="history-purple">
</div>
<div class="container-new marketing-wrapper">
<section class="row mb-60">
<div class="timeline">
<div class="timeline-block mb-20-sm mb-10-until-sm">
<div class="timeline-dot"></div>
<div class="timeline-content text-sm-left text-md-right">
<div class="d-flex flex-column-reverse">
<h2 class="mb-6 h5 h2-sm">{% trans %}2011 XRP Ledger Development{% endtrans %}</h2>
<h6 class="h1 mb-3">2011</h6>
</div>
<p>{% trans %}In early 2011, three developers—David Schwartz, Jed McCaleb, and Arthur Britto—were fascinated with Bitcoin but observed the waste inherent in mining. They sought to create a more sustainable system for sending value (an idea outlined in a <a href="https://bitcointalk.org/index.php?topic=10193.0" target="_blank">May 2011 forum post: “Bitcoin without mining”</a>).{% endtrans %}</p>
<a class="btn btn-primary read-more mt-10" href="#" data-target="section-1">Read More</a>
<div class="hidden-section" id="section-1">
<p>{% trans %}Their initial observations about the high energy consumption and scalability issues that would plague Bitcoin proved prescient. In 2019, estimates suggest Bitcoin mining used more energy than the entire country of Portugal. Moreover, their initial read indicated that significant problems could arise if any miner obtained (or miners colluded to obtain) greater than 50&#37; of the mining power. That risk persists with Bitcoin (and Ethereum) today as mining power has consolidated in China.{% endtrans %}</p>
</div>
</div>
</div>
<div class="timeline-block mb-20-sm mb-10-until-sm">
<div class="timeline-dot"></div>
<div class="timeline-content">
<div class="d-flex flex-column-reverse">
<h2 class="mb-6 h5 h2-sm">{% trans %}XRPL Launches its Native Currency, XRP{% endtrans %}</h2>
<h6 class="h1 mb-3">2012</h6>
</div>
<p>{% trans %}The trio of developers continued the work to build a distributed ledger that improved upon these fundamental limitations of Bitcoin, originally naming the code Ripple. The ledger included a digital asset that would originally be called “ripples” (XRP as the currency code) to follow the same naming convention as Bitcoin (BTC). At the time, the name Ripple stood for the open-source project, the unique consensus ledger (Ripple Consensus Ledger), transaction protocol (Ripple Transaction Protocol or RTXP), the network (Ripple network), and the digital asset (known as “ripples”).{% endtrans %}</p>
<a class="btn btn-primary read-more mt-10" href="#" data-target="section-2">Read More</a>
<div class="hidden-section" id="section-2">
<p>{% trans %}In practice, this approach led to many broad uses of “Ripple.” For clarity, the community simply started calling the digital asset by its currency code, “XRP.”{% endtrans %}</p>
<p>{% trans %}By June 2012, Schwartz, McCaleb, and Britto finished code development, and the Ledger was complete.{% endtrans %}</p>
<p>{% trans %}Once the XRP Ledger was live, 80&#37; of the XRP was gifted to a new company that set out to build use cases for the digital asset—initially called NewCoin and renamed quickly to OpenCoin.{% endtrans %}</p>
<p>{% trans %}Chris Larsen was the CEO of OpenCoin, and at the company's founding, Jed was co-founder and CTO, David Schwartz was the Chief Cryptography Officer, and Arthur Britto an advisor.{% endtrans %}</p>
</div>
</div>
</div>
<div class="timeline-block mb-20-sm mb-10-until-sm">
<div class="timeline-dot"></div>
<div class="timeline-content text-sm-left text-md-right">
<div class="d-flex flex-column-reverse">
<h2 class="mb-6 h5 h2-sm">{% trans %}OpenCoin Rebranded to Ripple Labs{% endtrans %}</h2>
<h6 class="h1 mb-3">2013</h6>
</div>
<p>{% trans %}Since the early days, OpenCoin set out to revolutionize the global financial system. Despite the revolutionary ideals of many of Bitcoins early believers, Larsen never thought blockchain technology should be used to overthrow the existing financial system. He believed that historys most transformative innovations have always relied on the great ideas that came before them—not displacing them.{% endtrans %}</p>
<a class="btn btn-primary read-more mt-10" href="#" data-target="section-3">Read More</a>
<div class="hidden-section" id="section-3">
<p>{% trans %}In early conversations with potential customers, the team was asked about the differences between the Ripple project and OpenCoin company. With the community starting to refer to the digital asset as XRP, company leaders decided to rebrand the company to Ripple Labs, which has been shortened over time to “Ripple.”{% endtrans %}</p>
<p>{% trans %}Today, Ripple has created a use case leveraging the XRP Ledger and XRP for liquidity management in its cross-border payments business. Ripple also remains a stakeholder and contributor to the broader XRPL community.{% endtrans %}</p>
</div>
</div>
</div>
<div class="timeline-block mb-20-sm mb-10-until-sm">
<div class="timeline-dot"></div>
<div class="timeline-content">
<div class="d-flex flex-column-reverse">
<h2 class="mb-6 h5 h2-sm">{% trans %}XRPL Foundation Launched{% endtrans %}</h2>
<h6 class="h1 mb-3">2020</h6>
</div>
<p>{% trans %}<a href="https://foundation.xrpl.org/2020/09/24/xrp-ledger-foundation-launches-to-drive-growth-and-development-of-the-core-xrp-ledger-and-community/" target="_blank">Founded</a> September 24, 2020, the XRPL Foundation is an independent and nonprofit entity with a mission to accelerate the development and adoption of the decentralized XRP Ledger. The Foundation received an initial donation of over $6.5M from Coil, Ripple, and Gatehub to fund the Foundations work in service of the growing number of developers and other <a href='contribute.html'>global blockchain community</a> members building on the XRP Ledger.{% endtrans %}</p>
</div>
</div>
</div>
</section>
</div>
</div>
{% endblock %}
{% block endbody %}
<script type="text/javascript">
$('.read-more').on('click', function(e){
var target = $(this).attr('data-target');
$('#' + target).addClass('show');
$(this).addClass('d-none');
e.preventDefault();
})
</script>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Splash Page",
"page_group": "About"
})
</script>
{% endblock analytics %}

View File

@@ -1,218 +0,0 @@
{% extends "base.html.jinja" %}
{% block head %}
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
{% endblock %}
{% block bodyclasses %}no-sidebar{% endblock %}
{% block mainclasses %}landing page-home{% endblock %}
{% block breadcrumbs %}
{% endblock %}
{% block main %}
<div class="overflow-hidden">
<section class="container-new pb-26-until-sm mt-10 mb-10-sm text-center">
<div class="w-100">
<img id="home-hero-graphic" alt="X" />
</div>
<div class="col-lg-6 mx-auto text-center pl-0 pr-0">
<div class="d-flex flex-column-reverse">
<h1 class="mb-10">{% trans %}The Blockchain<br class="until-sm"/> Built for Business{% endtrans %}</h1>
<h6 class="eyebrow mb-3">{% trans %}XRPL | XRP Ledger{% endtrans %}</h6>
</div>
<a href="docs.html" class="btn btn-primary btn-arrow">{% trans %}Start Building{% endtrans %}</a>
</div>
</section>
<div class="position-relative d-none-sm">
<img src="./img/backgrounds/home-purple.svg" id="home-purple">
<img src="./img/backgrounds/home-green.svg" id="home-green">
</div>
<section class="container-new py-26">
<div class="col-lg-6 offset-lg-3 pl-0-sm pr-0-sm p-8-sm p-10-until-sm">
<h2 class="h4 mb-8 h2-sm">{% trans %}The XRP Ledger: The Blockchain Built for Business{% endtrans %}</h2>
<h6 class="longform mb-10">{% trans %}The XRP Ledger (XRPL) is a decentralized, public blockchain led by a global community of businesses and developers looking to solve problems and create value.{% endtrans %}</h6>
<p class="mb-0">{% trans %}Proven reliable over more than a decade of error-free functioning, the XRPL offers streamlined development, low transaction costs, high performance, and sustainability. So you can build with confidenceand move your most critical projects forward.{% endtrans %}</p>
</div>
</section>
<section class="container-new py-26">
<div class="d-flex flex-column-reverse col-sm-8 p-0">
<h3 class="h4 h2-sm">{% trans %}Why developers choose the XRP Ledger{% endtrans %}</h3>
<h6 class="eyebrow mb-3">{% trans %}Benefits{% endtrans %}</h6>
</div>
<ul class="mt-10 card-grid card-grid-3xN" id="benefits-list">
{% set cards = [
{ "id": "public",
"title": _("Public and Decentralized"),
"description": _("Open source, open to anyone to build on, maintained by the community")},
{ "id": "streamlined",
"title": _("Streamlined Development"),
"description": _("Intentional innovations, tools and documentation reduce time to market")},
{ "id": "performance",
"title": _("High Performance"),
"description": _("Thousands of transactions settled in seconds")},
{ "id": "low-cost",
"title": _("Low Cost"),
"description": _("At fractions of a penny per transaction, costs are inexpensive enough to enable a wide variety of <a href='uses.html'>blockchain use cases</a>")},
{ "id": "community",
"title": _("Motivated Community"),
"description": _("Companies, developers, validators, and users work together to make the XRP Ledger better every day")},
{ "id": "reliability",
"title": _("Proven Reliability"),
"description": _("10+ years of error-free, uninterrupted performance over more than 63 million ledgers")},
] %}
{% for card in cards %}
<li class="col ls-none">
<img id="{{card.id}}" alt="{{card.title}} Icon">
<h4 class="mt-3 mb-0 h5">{{card.title}}</h4>
<p class="mt-6-until-sm mt-3 mb-0">{{card.description}}</p>
</li>
{% endfor %}
</ul>
</section>
<section class="container-new py-26">
<div class="d-flex flex-column-reverse col-sm-8 p-0">
<h3 class="h4 h2-sm">{% trans %}Activate the proven potential of the XRP Ledger and find a trusted foundation for your next innovation{% endtrans %}</h3>
<h6 class="eyebrow mb-3">{% trans %}Powerful Features{% endtrans %}</h6>
</div>
<div class="row row-cols-1 row-cols-lg-3 card-deck mt-10" id="advanced-features">
{% set cards2 = [
{ "href": "decentralized-exchange.html",
"title": _("Decentralized Exchange"),
"description": _("A high-performance decentralized peer-to-peer multi-currency exchange built directly into the blockchain")},
{ "href": "cross-currency-payments.html",
"title": _("Cross-Currency Payments"),
"description": _("Atomically settle multi-hop payments that cross currency or national boundaries with ease")},
{ "href": "payment-channels.html",
"title": _("Payment <br class='until-sm'/>Channels"),
"description": _("Batched micropayments with unlimited speed, secured with XRP")},
{ "href": "multi-signing.html",
"title": _("Multi-Signing"),
"description": _("Flexible options for custody and security of on-ledger accounts")},
{ "href": "tokens.html",
"title": _("Tokens"),
"description": _("All currencies other than XRP can be represented in the XRP Ledger as tokens, sometimes called “IOUs”")},
] %}
{% for card in cards2 %}
<a class="card" href="{{target.prefix}}{{card.href}}">
<div class="card-body">
<h4 class="card-title h5">{{card.title}}</h4>
<p class="card-text">{{card.description}}</p>
</div>
<div class="card-footer">&nbsp;</div>
</a>
{% endfor %}
</div>
</section>
<section class="container-new py-26">
<div class="d-flex flex-column-reverse col-sm-8 p-0">
<h3 class="h4 h2-sm">{% trans %}Choose a path, and bring your project to life on the XRP Ledger{% endtrans %}</h3>
<h6 class="eyebrow mb-3">{% trans %}Where to Start{% endtrans %}</h6>
</div>
<div class="row row-cols-1 row-cols-lg-3 card-deck mt-10" id="get-started">
{% set cards3 = [
{ "href": "get-started.html",
"title": _("Quickstart"),
"description": _("Access everything you need to get started working with the XRPL")},
{ "href": "tutorials.html",
"title": _("Guided Tutorials"),
"description": _("Follow step-by-step guides for frequent tasks")},
{ "href": "concepts.html",
"title": _("XRPL Fundamentals"),
"description": _("Read about the XRPLs foundational concepts")},
{ "href": "client-libraries.html",
"title": _("Choose a Language"),
"description": _("Find tools, documentation, and sample code in Python, Java, Javascript, or use HTTP APIs")},
{ "href": "uses.html",
"title": _("Get Inspired"),
"description": _("See what your peers have built on the XRPL")},
] %}
{% for card in cards3 %}
<a class="card" id="{{card.id}}" href="{{target.prefix}}{{card.href}}">
<div class="card-body">
<h4 class="card-title h5">{{card.title}}</h4>
<p class="card-text">{{card.description}}</p>
</div>
<div class="card-footer">&nbsp;</div>
</a>
{% endfor %}
</div>
</section>
<section class="container-new py-26">
<div class="col-lg-6 offset-lg-3 p-6-sm p-10-until-sm br-8 cta-card">
<img src="./img/backgrounds/cta-home-purple.svg" class="d-none-sm cta cta-top-left">
<img src="./img/backgrounds/cta-home-green.svg" class="cta cta-bottom-right">
<div class="z-index-1 position-relative">
<h2 class="h4 mb-8-sm mb-10-until-sm">{% trans %}Our Shared Vision for XRPLs Future{% endtrans %}</h2>
<p class="mb-10">{% trans %}Together, we're building the greenest infrastructure to drive blockchain innovation that doesn't sacrifice utility or performance, to bring the developer community's vision to life.{% endtrans %}</p>
<a class="btn btn-primary btn-arrow" href="overview.html">{% trans %}Learn More{% endtrans %}</a>
</div>
</div>
</section>
<section class="container-new py-26">
<div class="d-flex flex-column-reverse col-sm-8 p-0">
<h3 class="h4 h2-sm">{% trans %}Explore what the community is building to enable new features and use cases on XRPL{% endtrans %}</h3>
<h6 class="eyebrow mb-3">{% trans %}Preview New Features{% endtrans %}</h6>
</div>
<ul class="mt-10 card-grid card-grid-3xN">
{% set features = [
{ "chip": _("In Development"),
"title": _("Smart Contracts"),
"description": _("Hooks are small, efficient WebAssembly modules designed specifically for the XRPL. Check out the <a href='https://hooks-testnet.xrpl-labs.com/' target='_blank'>hooks amendment and public testnet</a> that enable smart contract functionality."),
"href": "https://hooks-testnet.xrpl-labs.com/" },
{ "chip": _("Enabled"),
"title": _("Non-Fungible Tokens"),
"description": _("Lower fees, faster transactions, and custom token functionality make the XRPL ideally suited for building an ecosystem for NFTs. Explore the XRP Ledger's NFT capabilities."),
"href": "non-fungible-tokens.html"},
] %}
{% for feat in features %}
<li class="col ls-none pt-2">
<a class="label chip-green" href="{{feat.href}}">{{feat.chip}}</a>
<h4 class="mt-3 mb-0 h5">{{feat.title}}</h4>
<p class="mt-6-until-sm mt-3 mb-0">{{feat.description}}</p>
</li>
{% endfor %}
</ul>
</section>
<section class="container-new py-26">
<div class="col-md-6 offset-md-3 p-8-sm p-10-until-sm br-8 cta-card">
<img alt="" src="./img/backgrounds/cta-home-magenta.svg" class="cta cta-bottom-right">
<div class="z-index-1 position-relative">
<div class="d-flex flex-column-reverse">
<h2 class="h4 mb-8-sm mb-10-until-sm">{% trans %}Join the Community <br class="until-sm"/> at XRPL.org{% endtrans %}</h2>
</div>
<p class="mb-10">{% trans %}Connect at XRPL.org, a community by and for the developers <br class="until-sm"/> and entrepeneurs who rely on the XRPL.{% endtrans %}</p>
<a class="btn btn-primary btn-arrow" href="contribute.html">{% trans %}Get Involved{% endtrans %}</a>
</div>
</div>
</section>
</div>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Splash Page",
"page_group": "Home"
})
</script>
{% endblock analytics %}

View File

@@ -1,238 +0,0 @@
{% extends "base.html.jinja" %}
{% block head %}
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<!-- Play videos from youtube -->
<script src="{{currentpage.prefix}}assets/js/video.js"></script>
{% endblock %}
{% block bodyclasses %}no-sidebar{% endblock %}
{% block mainclasses %}landing page-impact{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block main %}
<div class="overflow-hidden">
<div class="position-relative d-none-sm">
<img src="./img/backgrounds/community-purple.svg" class="landing-bg" id="impact-purple">
</div>
<section class="container-new py-26 text-lg-center">
<div class="p-0 col-lg-8 mx-lg-auto">
<div class="d-flex flex-column-reverse">
<h1 class="mb-0">{% trans %}Todays Value, Tomorrows Vision{% endtrans %}</h1>
<h6 class="eyebrow mb-3">{% trans %}XRPL Today, XRPL Tomorrow{% endtrans %}</h6>
</div>
</div>
</section>
<div class="position-relative d-none-sm">
<img src="./img/backgrounds/home-green.svg" id="impact-green">
</div>
<!-- World map -->
<section class="container-new py-10">
<div class="col-sm-10 col-lg-6 offset-md-3 p-10-until-sm pl-0-sm pr-0-sm">
<h6 class="eyebrow mb-3">{% trans %}Building for the Future{% endtrans %}</h6>
<h2 class="h4 h2-sm mb-8">{% trans %}Consensus protocol is efficient and sustainable{% endtrans %}</h2>
<h5 class="longform mb-10">{% trans %}For more than 272 million migrants worldwide, sending and receiving money across borders is expensive, unreliable and complex.{% endtrans %}</h5>
<p class="mb-6">{% trans %}Open and decentralized, blockchain and crypto are seeing an increase in adoption across the financial services industry, from retail and institutional investment to <a href='uses.html'>commercial use cases</a> like CBDCs, NFTs, and cross-border payments.{% endtrans %}</p>
</div>
<div>
<!-- Large -->
<div class="col d-none d-lg-block align-self-center">
<div class="mt-10" id="map-dark"></div>
<div class="mt-10" id="map-light"></div>
</div>
</div>
</section>
<!-- Video sidebar -->
<section class="container-new py-26">
<div class="mt-10 card-grid card-grid-2xN">
<div class="col">
<iframe id="video1" style="display:none;" width="560" height="315" src="https://www.youtube.com/embed/WsmldDNGQ9s" title="What makes the XRPL sustainable?" frameborder="0" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<a href="#" id="playvideo">
<img alt="Preview of man speaking with a play button" src="./assets/img/impact/video_sustainable@2x.png" id="xrpl-overview-video-intro" class="w-100 video-image">
</a>
</div>
<div class="col ls-none mb-16-sm">
<h6 class="eyebrow mb-3">{% trans %}A Sustainable Future{% endtrans %}</h6>
<h2 class="h4 h2-sm mb-8">{% trans %}What makes the XRPL sustainable?{% endtrans %}</h2>
<h5 class="longform mb-10">{% trans %}XRPLs unique consensus mechanism is eco-friendly—it does not require mining to settle transactions. This results in efficiency without sacrificing security, decentralization, or scalability.{% endtrans %}</h5>
<p>{% trans %}The trivial amount of energy it does consume is then neutralized with carbon credits through EW Zero, an open-source blockchain decarbonization tool.{% endtrans %}</p>
</div>
</div>
</section>
<!-- Card -->
<section class="container-new py-26">
<div class="col-md-6 offset-md-3 p-6-sm p-10-until-sm br-8 cta-card">
<img src="./img/backgrounds/cta-community-purple.svg" class="cta cta-top-left">
<img alt="" src="./img/backgrounds/cta-calculator-green.svg" class="cta cta-bottom-right">
<div class="z-index-1 position-relative">
<div class="d-flex flex-column-reverse">
<h2 class="h4 h2-sm mb-10-until-sm mb-8-sm">{% trans %}Featured companies & projects running on the XRP Ledger.{% endtrans %}</h2>
<h6 class="eyebrow mb-3">{% trans %}Sustainable Projects{% endtrans %}</h6>
</div>
<p class="mb-10">{% trans %}Learn more about companies and developers who are using the XRP Ledger to solve interesting problems efficiently and sustainably.{% endtrans %}</p>
<a class="btn btn-primary btn-arrow" href="{{currentpage.prefix}}uses.html">{% trans %}See More{% endtrans %}</a>
</div>
</div>
</section>
<!-- Connect -->
<section class="container-new py-26">
<!-- flex. Col for mobile. Row for large. on large align content to the center -->
<div class="d-flex flex-column flex-lg-row align-items-lg-center mr-lg-4">
<div class="order-1 mb-4 pb-3 mb-lg-0 pb-lg-0 col-lg-6 px-0 p-lg-3">
<div class="d-flex flex-column-reverse py-lg-3">
<h3 class="h4 h2-sm">{% trans %}How can businesses and developers connect and contribute?{% endtrans %}</h3>
</div>
<p class="py-lg-3 mb-2 longform" style="max-width: 520px;">{% trans %}If you want to advance business with sustainable solutions to real-world problems, youre invited to join the global, growing XRPL community. Here are some ways to get involved:{% endtrans %}</p>
<div class="d-none d-lg-block py-lg-3">
<a class="btn btn-primary btn-arrow" href="/contribute.html">{% trans %}Join the Community{% endtrans %}</a>
</div>
</div>
<div class="order-2 col-lg-6 px-0 pl-lg-3">
<div class="row align-items-center m-0 connect-list">
<!-- connect list -->
<div class="col-12 col-lg-6 p-0 pr-3">
<div class="px-lg-3 pb-3">
<img id="connect-01" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Blog{% endtrans %}</h6>
<p>{% trans %}Check out the <a href="https://xrpl.org/blog/">XRPL dev blog</a> to stay up-to-date on the latest innovations and developments in the XRPL community.{% endtrans %}</p>
</div>
</div>
<!-- Hide on large -->
<div class="px-lg-3 pb-3 d-lg-none">
<img id="connect-02" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Events{% endtrans %}</h6>
<p>{% trans %}Attend <a href="/events.html">meetups, hackathons, and conferences</a> to meet other members of the community.{% endtrans %}</p>
</div>
</div>
<div class="px-lg-3 pb-3 pt-lg-5">
<img id="connect-03" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Code{% endtrans %}</h6>
<p>{% trans %}View the <a href="https://github.com/XRPLF/xrpl-dev-portal/" target="_blank">Github repositories</a> to find blockchain projects to see how you can contribute.{% endtrans %}</p>
</div>
</div>
<!-- Hide on large -->
<div class="px-lg-3 pb-3 d-lg-none">
<img id="connect-04" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Connect{% endtrans %}</h6>
<p>{% trans %}Join the conversation on social media using #XRPLCommunity.{% endtrans %}</p>
</div>
</div>
</div>
<!-- end col 1 -->
<!-- Show on large -->
<div class="col-12 col-lg-6 p-0 pr-3 d-none d-lg-block">
<div class="px-lg-3 pb-3 pt-5 mt-5">
<div class="pt-1 mt-3">
<img id="connect-02" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Events{% endtrans %}</h6>
<p>{% trans %}Attend <a href="/events.html">meetups, hackathons, and conferences</a> to meet other members of the community.{% endtrans %}</p>
</div>
</div>
</div>
<div class="px-lg-3 pb-3 pt-5">
<img id="connect-04" src="data:," />
<div class="pt-3">
<h6 class="mb-3">{% trans %}Connect{% endtrans %}</h6>
<p>{% trans %}Join the conversation on social media using #XRPLCommunity.{% endtrans %}</p>
</div>
</div>
</div>
<!-- end col 2 -->
</div>
</div>
<div class="d-lg-none order-3 mt-4 pt-3">
<a class="btn btn-primary btn-arrow" target="_blank" href="/contribute.html">{% trans %}Join the Community{% endtrans %}</a>
</div>
</div>
</section>
{% endblock %}
{% block endbody %}
<script type="text/javascript" src="{{currentpage.prefix}}assets/js/bodymovin.min.js"></script>
<!-- Light -->
<script type="text/javascript" src="{{currentpage.prefix}}assets/js/impact/map-animation-light.json"></script>
<!-- Dark -->
<script type="text/javascript" src="{{currentpage.prefix}}assets/js/impact/map-animation-dark.json"></script>
<script type="text/javascript">
//Light
function mapLightAnimation(){
bodymovin.loadAnimation({
container: document.getElementById('map-light'),
renderer: 'svg',
loop: true,
autoplay: true,
animationData: mapLight
});
};
mapLightAnimation();
//Dark
function mapDarkAnimation(){
bodymovin.loadAnimation({
container: document.getElementById('map-dark'),
renderer: 'svg',
loop: true,
autoplay: true,
animationData: mapDark
});
};
mapDarkAnimation();
</script>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Splash Page",
"page_group": "About"
})
</script>
{% endblock analytics %}

View File

@@ -1,18 +0,0 @@
{% extends "pagetype-doc.html.jinja" %}
{% block head %}
{% endblock %}
{% block bodyclasses %}page-privacy-policy{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Splash Page",
"page_group": "About"
})
</script>
{% endblock analytics %}

View File

@@ -1,116 +0,0 @@
{% extends "base.html.jinja" %}
{% block mainclasses %}landing page-references{% endblock %}
{% block main %}
<section class="py-20 text-center">
<div class="col-xl-8 col-lg-10 mx-auto text-center">
<div class="d-flex flex-column-reverse">
<h1 class="mb-18">{% trans %}References and APIs{% endtrans %}</h1>
<h6 class="eyebrow mb-3">{% trans %}Everything You Need to Know{% endtrans %}</h6>
</div>
</div>
</section>
<section class="container-new mb-30" id="refs-types">
<div class="row row-cols-1 row-cols-lg-3 card-deck">
{% for page in currentpage.children if not page.nav_omit and not page.html == "protocol-reference.html" %}
<div class="card">
<div class="card-body">
<h4 class="card-title h5">
<a href="{{page.html}}">
{% if page.top_nav_name is defined %}{{page.top_nav_name}}{% else %}{{page.name}}{% endif %}
</a>
</h4>
<p class="card-text">{{page.blurb}}</p>
{% if page.curated_anchors is defined %}
<div class="curated-links">
<ul class="nav flex-column">
{% for link in page.curated_anchors %}
<li class="nav-item"><a class="nav-link" href="{{page.html}}{{link.anchor}}">{{link.name}}</a></li>
{% endfor %}
</ul>
</div><!--/.curated-links-->
{% else %}
<ul class="nav flex-column">
{% for child in page.children if not child.nav_omit %}
<li class="nav-item"><a class="nav-link{% if '//' in child.html %} external-link{% endif %}" href="{{child.html}}">{{child.name}}</a></li>
{% endfor %}
</ul>
{% endif %}
</div><!--/.card-body-->
<div class="card-footer">&nbsp;</div>
</div><!--/.card-->
{% endfor %}
</div><!--/.card-deck-->
</section>
<section class="container-new mb-30" id="xrpl-protocol">
{% set protocolref = pages|selectattr("html", "defined_and_equalto", "protocol-reference.html")|first %}
<div class="d-flex flex-column-reverse col-sm-8 p-0">
<h2 class="h4">{{protocolref.name}}</h2>
<h6 class="eyebrow mb-3">{{protocolref.eyebrow_text}}</h6>
</div>
{% for row in protocolref.children|batch(4) %}
<div class="row row-cols-1 row-cols-lg-4 card-deck">
{% for page in row if not page.nav_omit %}
{% if page.children or page.curated_anchors %}
<div class="card">
<div class="card-body">
<h4 class="card-title h5">
<a href="{{page.html}}">
{% if page.top_nav_name is defined %}{{page.top_nav_name}}{% else %}{{page.name}}{% endif %}
</a>
</h4>
<p class="card-text">{{page.blurb}}</p>
{% if page.curated_anchors is defined %}
<div class="curated-links">
<ul class="nav flex-column">
{% for link in page.curated_anchors %}
<li class="nav-item"><a class="nav-link" href="{{page.html}}{{link.anchor}}">{{link.name}}</a></li>
{% endfor %}
</ul>
</div><!--/.curated-links-->
{% else %}
<ul class="nav flex-column">
{% for child in page.children if not child.nav_omit %}
<li class="nav-item"><a class="nav-link{% if '//' in child.html %} external-link{% endif %}" href="{{child.html}}">{{child.name}}</a></li>
{% endfor %}
</ul>
{% endif %}
</div><!--/.card-body-->
<div class="card-footer">&nbsp;</div>
</div><!--/.card-->
{% else %}
<a class="card" href="{{page.html}}">
<div class="card-body">
<h4 class="card-title h5">
{% if page.top_nav_name is defined %}{{page.top_nav_name}}{% else %}{{page.name}}{% endif %}
</h4>
<p class="card-text">{{page.blurb}}</p>
</div>
<div class="card-footer">&nbsp;</div>
</a><!--/.card-->
{% endif %}
{% endfor %}
{% endfor %}
</div><!--/.card-deck-->
</section>
{% endblock %}
{% block analytics %}
{% from "macro-get_funnel.jinja" import get_funnel %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Hub Page",
"page_group": "Docs",
"page_funnel": "{{get_funnel(pages, currentpage)}}",
"page_labels": {{currentpage.labels or []}}
})
</script>
{% endblock analytics %}

View File

@@ -1,116 +0,0 @@
{% extends "base.html.jinja" %}
{% block bodyclasses %}rpc-tool{% endblock %}
{% block main %}
<section class="container-fluid pt-3 p-md-3">
<h1>RPC Tool</h1>
<div class="content">
<p>{% trans %}This is a debug tool for printing raw information about an account (by classic address), a transaction (by hash) or a ledger (by sequence number).{% endtrans %}</p>
<form id="account-entry">
<fieldset class="form-group"><input id="target" class="form-control" required="" type="text" placeholder="{% trans %}XRP Ledger address, transaction ID, or ledger index{% endtrans %}" />
<span class="help-block"><small>{% trans %}Try an account like <em>rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn</em>.{% endtrans %}</small></span>
<button class="btn btn-primary">{% trans %}Get info{% endtrans %}</button></fieldset>
</form>
<div id="result">
<h2>{% trans %}Result{% endtrans %}</h2>
<div id="progress" class="progress">
<div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar"></div>
</div>
<div id="error" class="devportal-callout warning"></div>
<ul id="links" class="nav nav-pills">
<li><a id="permalink" href="#" target="_blank" rel="noopener">{% trans %}Permalink{% endtrans %}</a></li>
<li><a id="explorerlink" href="#" target="_blank" rel="noopener">{% trans %}Explorer{% endtrans %}</a></li>
</ul>
<div class="group group-tx">
<h3><a href="tx.html">tx</a></h3>
<ul class="tools nav nav-pills">
<li><a class="tx-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="tx-collapse">{% trans %}collapse all{% endtrans %}</a></li>
</ul>
<pre id="tx_info" class="json"></pre>
<ul class="tools nav nav-pills">
<li><a class="tx-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="tx-collapse">{% trans %}collapse all{% endtrans %}</a></li>
</ul>
</div>
<div class="group group-account">
<h3><a href="account_info.html">account_info</a></h3>
<pre id="account_info" class="json"></pre>
<h3><a href="account_lines.html">account_lines</a></h3>
<ul class="tools nav nav-pills">
<li><a class="account-lines-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="account-lines-collapse">{% trans %}collapse all{% endtrans %}</a></li>
</ul>
<pre id="account_lines" class="json"></pre>
<ul class="tools nav nav-pills">
<li><a class="account-lines-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="account-lines-collapse">{% trans %}collapse all{% endtrans %}</a></li>
</ul>
<h3><a href="account_tx.html">account_tx</a> {% trans %}(last 20){% endtrans %}</h3>
<ul class="tools nav nav-pills">
<li><a class="account-tx-expand-tx">{% trans %}expand tx{% endtrans %}</a></li>
<li><a class="account-tx-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="account-tx-collapse">{% trans %}collapse all{% endtrans %}</a></li>
<li><a class="account-tx-more">{% trans %}next 20{% endtrans %}</a></li>
<li><a class="account-tx-back">{% trans %}prev 20{% endtrans %}</a></li>
</ul>
<pre id="account_tx" class="json"></pre>
<ul class="tools nav nav-pills">
<li><a class="account-tx-expand-tx">{% trans %}expand tx{% endtrans %}</a></li>
<li><a class="account-tx-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="account-tx-collapse">{% trans %}collapse all{% endtrans %}</a></li>
<li><a class="account-tx-more">{% trans %}next 20{% endtrans %}</a></li>
<li><a class="account-tx-back">{% trans %}prev 20{% endtrans %}</a></li>
</ul>
<h3><a href="account_objects.html">account_objects</a></h3>
<ul class="tools nav nav-pills">
<li><a class="account-objects-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="account-objects-collapse">{% trans %}collapse all{% endtrans %}</a></li>
</ul>
<pre id="account_objects" class="json"></pre>
<ul class="tools nav nav-pills">
<li><a class="account-objects-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="account-objects-collapse">{% trans %}collapse all{% endtrans %}</a></li>
</ul>
</div>
<div class="group group-ledger">
<h3><a href="ledger.html">ledger</a></h3>
<ul class="tools nav nav-pills">
<li><a class="ledger-expand-tx">{% trans %}expand tx{% endtrans %}</a></li>
<li><a class="ledger-tx-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="ledger-tx-collapse">{% trans %}collapse all{% endtrans %}</a></li>
</ul>
<pre id="ledger_info" class="json"></pre>
<ul class="tools nav nav-pills">
<li><a class="ledger-tx-expand-tx">{% trans %}expand tx{% endtrans %}</a></li>
<li><a class="ledger-tx-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="ledger-tx-collapse">{% trans %}collapse all{% endtrans %}</a></li>
</ul>
</div>
</div>
</div>
</section>
{% endblock %}
{% block endbody %}
{{currentpage.ripple_lib_tag}}
<script type='text/javascript' src='assets/js/rpc-tool.js'></script>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Tool",
"page_group": "Docs",
"page_labels": {{currentpage.labels or []}}
})
</script>
{% endblock analytics %}

View File

@@ -1,69 +0,0 @@
{% extends "base.html.jinja" %}
{% block bodyclasses %}toml-checker{% endblock %}
{% block main %}
<section class="container-fluid">
<div class="p-3">
<h1>xrp-ledger.toml Checker</h1>
<p>If you run an XRP Ledger validator or use the XRP Ledger for your business, you can provide information about your usage of the XRP Ledger to the world in a machine-readable <a href="https://xrpl.org/xrp-ledger-toml.html"><code>xrp-ledger.toml</code> file</a>.</p>
</div>
<div class="p-3 pb-5">
<form id="domain-entry">
<h4>Look Up By Domain</h4>
<p>This tool allows you to verify that your <code>xrp-ledger.toml</code> file is syntactically
correct and deployed properly.</p>
<div class="input-group">
<input id="domain" type="text" class="form-control" required
placeholder="example.com (Domain name to check)"
pattern="^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z][a-zA-Z-]{0,22}[a-zA-Z]$"><br>
<button class="btn btn-primary form-control">Check toml file</button>
</div><!--/.input-group-->
</form>
<div id="result">
<h5 class='result-title'>Result</h5>
<ul id="log">
</ul>
</div>
</div>
<div class="p-3 pt-5">
<h4>Look Up By Account</h4>
<p>Enter an XRP Ledger address to see if that account is claimed by the domain it says owns it.</p>
<form id="domain-verification">
<div class="input-group">
<input id="verify-domain" type="text" class="form-control" required
placeholder="r... (Wallet Address to check)">
<br>
<button class="btn btn-primary form-control">Check account</button>
</div><!--/.input-group-->
</form>
<div id="verify-domain-result">
<h5 id="verify-domain-result-title" class='result-title'>Result</h5>
<ul id="verify-domain-log">
</ul>
</div>
</div>
</section>
{% endblock %}
{% block endbody %}
<script type="application/javascript" src="{{currentpage.prefix}}assets/js/xrp-ledger-toml-checker.js"></script>
<!-- TOML tool -->
<script type="application/javascript" src="{{currentpage.prefix}}assets/vendor/iarna-toml-parse.js"></script>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Tool",
"page_group": "Docs",
"page_labels": {{currentpage.labels or []}}
})
</script>
{% endblock analytics %}

View File

@@ -1,202 +0,0 @@
{% extends "base.html.jinja" %}
{% block mainclasses %}landing landing-children padded-main{% endblock %}
{% set categoriesTutorials = [
{
"id": "sdk",
"title": "Get started with SDKs",
"description": "These tutorials walk you through the basics of building a very simple XRP Ledger-connected application using SDKs.",
"children": [
{
"title": "Python",
"description": "Using xrpl.py, a pure Python library.",
"href": "python.html",
"img": "./assets/img/logos/python.svg",
},
{
"title": "Java",
"description": "Using xrpl4j, a pure Java library.",
"href": "java.html",
"img": "./assets/img/logos/java.svg",
},
{
"title": "Javascript",
"description": "Using the xrpl.js client library.",
"href": "javascript.html",
"img": "./assets/img/logos/javascript.svg",
},
{
"title": "PHP",
"description": "Using the XRPL_PHP client library.",
"href": "php.html",
"img": "./assets/img/logos/php.svg",
},
{
"title": "HTTP & Websocket APIs",
"description": "Access the XRP Ledger directly through the APIs of its core server.",
"href": "http-websocket-apis.html",
"img": "./assets/img/logos/globe.svg",
},
]
},
{
"id": "use-cases",
"title": "XRP Ledger Use Cases",
"description": "",
"children": [
{
"title": "Payments",
"description": "Send and receive payments on the XRP Ledger.",
"href": "payment.html",
"img": "",
},
{
"title": "Tokens",
"description": "Create and trade fungible and non-fungible tokens on the XRP Ledger.",
"href": "tokens.html",
"img": "",
},
]
},
{
"id": "servers",
"title": "Manage the XRP Ledger Servers",
"description": "",
"children": [
{
"title": "Install rippled Server",
"description": "These tutorials describe the steps to install and update the core XRP Ledger server.",
"href": "install-rippled.html",
"img": "",
"external": true,
},
{
"title": "Configure rippled Server",
"description": "These tutorials describe the steps to customize your <code>rippled</code> server configuration.",
"href": "configure-rippled.html",
"img": "",
"external": true,
},
{
"title": "Run rippled in Standalone Mode",
"description": "These tutorials describe the steps to run <code>rippled</code> in stand-alone mode and test features without a full network.",
"href": "use-stand-alone-mode.html",
"img": "",
"external": true,
},
{
"title": "Install Clio Server",
"description": "This tutorial describes the steps to install the Clio server on Ubuntu platform.",
"href": "install-clio-on-ubuntu.html",
"img": "",
},
]
},
{
"id": "businesses",
"title": "XRP Ledger Businesses",
"description": "This section demonstrates how to follow various best practices for running businesses that interface with the XRP Ledger, such as exchanges listing XRP and gateways issuing currency in the XRP Ledger.",
"children": [
{
"title": "List XRP as an Exchange",
"description": "Run a digital asset exchange? Follow these steps to add XRP.",
"href": "list-xrp-as-an-exchange.html",
"img": "",
},
{
"title": "Become a Stablecoin Issuer",
"description": "Stablecoin issuers link tokens in the XRP Ledger to assets in the outside world.",
"href": "stablecoin-issuer.html",
"img": "",
},
]
},
]%}
{% block right_sidebar %}
<div class="tutorial-sidebar">
<a class="with-caret expander collapsed d-lg-none" id="toc-expander" role="button" data-toggle="collapse" data-target="#page-toc-wrapper" aria-expanded="false">
Page Toolbar
<span class="chevron"><span></span><span></span></span>
</a>
<div id="page-toc-wrapper" class="collapse d-lg-block">
<ul class="page-toc nav flex-column" role="directory">
<li class="nav-item"><a class="nav-link" href="#main-page-header">Tutorials</a></li>
{% for c in categoriesTutorials %}
<li class="nav-item"><a class="nav-link" href="#{{c.id}}">{{c.title}}</a></li>
{% endfor %}
</ul>
</div>
</div>
{% endblock %}
{% block main %}
{% if content %}
<section class="pt-3 p-md-3">
<article class="content">
{{ content }}
{% set show_blurbs = True %}
{% set depth= 1 %}
{% include 'children.html' %}
</article>
</section>
{% else %}
<section class="pt-3 p-md-3">
<article class="content">
<h1 id="main-page-header">{{ currentpage.name }}</h1>
{% if currentpage.blurb != target.blurb %}<p class="blurb">{{ currentpage.blurb }}</p>{% endif %}
{% set show_blurbs = True %}
{% set depth= 1 %}
{% macro tutorialCard(title, description, href, img, external) %}
<a class="card float-up-on-hover" href="{{href}}" target="_blank">
<div class="card-body">
{% if img %}
<div class="card-icon-container">
<img src="{{img}}" alt="{{title}} Screenshot" />
</div>
{% endif %}
{% if external %}
<h4 class="card-title h5 nav-link external-link">{{title}}</h4>
{% else %}
<h4 class="card-title h5">{{title}}</h4>
{% endif %}
<p class="card-text">{{description}}</p>
</div>
<div class="card-footer">&nbsp;</div>
</a>
{% endmacro %}
<div class="tutorial-content">
{% for category in categoriesTutorials %}
<h5 id="{{category.id}}">{{category.title}}</h5>
<p>{{category.description}}</p>
<div id="{{category.id}}-cards" class="card-grid card-grid-3xN tutorial-card-grid">
{% for child in category.children %}
{{ tutorialCard(child.title, child.description, child.href, child.img, child.external)}}
{% endfor %}
</div>
{% endfor %}
</div>
</article>
</section>
{% endif %}
{% endblock %}
{% block analytics %}
{% from "macro-get_funnel.jinja" import get_funnel %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Hub Page",
"page_group": "Docs",
"page_funnel": "{{get_funnel(pages, currentpage)}}",
"page_labels": {{currentpage.labels or []}}
})
</script>
{% endblock analytics %}

View File

@@ -1,175 +0,0 @@
{% extends "base.html.jinja" %}
{% block bodyclasses %}page-tx-sender{% endblock %}
{% block right_sidebar %}
<div id="connection-status" class="card">
<div class="card-header">
<h4>{% trans %}Status{% endtrans %}</h4>
</div>
<div class="card-body">
<ul class="list-group list-group-flush">
<li class="list-group-item" id="connection-status-label">{% trans %}XRP Testnet:{% endtrans %}</li>
<li class="list-group-item disabled" id="connection-status-item">{% trans %}Not Connected{% endtrans %}</li>
<li class="list-group-item" id="sending-address-label">{% trans %}Sending Address:{% endtrans %}</li>
<li class="list-group-item disabled sending-address-item">{% trans %}(None){% endtrans %}</li>
<li class="list-group-item" id="balance-label">{% trans %}Testnet XRP Available:{% endtrans %}</li>
<li class="list-group-item disabled" id="balance-item">{% trans %}(None){% endtrans %}</li>
</ul>
<div id="tx-sender-history">
<h5 class="m-3">{% trans %}Transaction History{% endtrans %}</h5>
<ul class="list-group list-group-flush">
</ul>
</div>
</div>
</div>
{% endblock %}
{% block main %}
<section class="container-fluid pt-3 p-md-3">
<h1>{% trans %}Transaction Sender{% endtrans %}</h1>
<div class="content">
<p>{% trans %}This tool sends transactions to the <a href="xrp-test-net-faucet.html">XRP Testnet</a> address of your choice so you can test how you monitor and respond to incoming transactions.{% endtrans %}</p>
<form>
<div class="form-group">
<button class="btn btn-primary form-control" type="button" id="init_button">{% trans %}Initialize{% endtrans %}</button>
<small class="form-text text-muted">{% trans %}Set up the necessary Testnet XRP addresses to send test payments.{% endtrans %}</small>
</div><!--/.form-group-->
<div class="form-group">
<label for="destination_address">{% trans %}Destination Address{% endtrans %}</label>
<input type="text" class="form-control" id="destination_address" aria-describedby="destination_address_help" value="rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe" />
<small id="destination_address_help" class="form-text text-muted">{% trans %}Send transactions to this XRP Testnet address{% endtrans %}</small>
</div>
<p class="devportal-callout caution collapse" id="x-address-warning">{% trans %}<strong>Caution:</strong> This X-address is intended for use on Mainnet. Testnet addresses have a "T" prefix instead.{% endtrans %}</p>
<h3>{% trans %}Send Transaction{% endtrans %}</h3>
<div class="form-group" id="send_xrp_payment">
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text loader" style="display: none"><img class="throbber" src="{{currentpage.prefix}}assets/img/xrp-loader-96.png" alt="{% trans %}(loading){% endtrans %}"/></span>
</div>
<button class="btn btn-primary form-control disabled needs-connection" type="button" id="send_xrp_payment_btn" disabled="disabled">{% trans %}Send XRP Payment{% endtrans %}</button>
<input id="send_xrp_payment_amount" class="form-control" type="number" aria-describedby="send_xrp_payment_amount_help" value="100000" min="1" max="10000000000" />
<div class="input-group-append">
<span class="input-group-text" id="send_xrp_payment_amount_help">{% trans %}drops of XRP{% endtrans %}</span>
</div>
<!-- Future feature: Optional custom destination tag -->
</div>
<small class="form-text text-muted">{% trans %}Send a <a href="send-xrp.html">simple XRP-to-XRP payment</a>.{% endtrans %}</small>
</div><!-- /#send_xrp_payment -->
<hr />
<div class="form-group" id="send_partial_payment">
<div class="progress mb-1" id="pp_progress">
<div class="progress-bar progress-bar-striped w-0">&nbsp;</div>
<small class="justify-content-center d-flex position-absolute w-100">{% trans %}(Getting ready to send partial payments){% endtrans %}</small>
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text loader" style="display: none"><img class="throbber" alt="(loading)" src="{{currentpage.prefix}}assets/img/xrp-loader-96.png" /></span>
</div>
<button class="btn btn-primary form-control" type="button" id="send_partial_payment_btn" disabled="disabled" autocomplete="off" title="(Please wait for partial payments setup to finish)">{% trans %}Send Partial Payment{% endtrans %}</button>
</div>
<small class="form-text text-muted">{% trans %}Deliver a small amount of XRP with a large <code>Amount</code> value, to test your handling of <a href="partial-payments.html">partial payments</a>.{% endtrans %}</small>
</div><!-- /.form group for partial payment -->
<hr />
<div class="form-group" id="create_escrow">
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text loader" style="display: none"><img class="throbber" alt="(loading)" src="{{currentpage.prefix}}assets/img/xrp-loader-96.png" /></span>
</div>
<button class="btn btn-primary form-control disabled needs-connection" type="button" id="create_escrow_btn" disabled="disabled">{% trans %}Create Escrow{% endtrans %}</button>
<input class="form-control" type="number" value="60" min="5" max="10000" id="create_escrow_duration_seconds" />
<div class="input-group-append">
<span class="input-group-text">{% trans %}seconds{% endtrans %}</span>
</div>
<span class="input-group-text">
(
<input type="checkbox" id="create_escrow_release_automatically" value="1" />
<label class="form-check-label" for="create_escrow_release_automatically">{% trans %}Finish automatically{% endtrans %}</label>)
</span>
</div>
<small class="form-text text-muted">{% trans %}Create a <a href="escrow.html">time-based escrow</a> of 1 XRP for the specified number of seconds.{% endtrans %}</small>
<div class="progress mb-1" style="display:none" id="escrow_progress">
<div class="progress-bar progress-bar-striped w-0">&nbsp;</div>
<small class="justify-content-center d-flex position-absolute w-100">{% trans %}(Waiting to release Escrow when it's ready){% endtrans %}</small>
</div>
</div><!-- /.form group for create escrow -->
<hr />
<div class="form-group" id="create_payment_channel">
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text loader" style="display: none"><img class="throbber" alt="(loading)" src="{{currentpage.prefix}}assets/img/xrp-loader-96.png" /></span>
</div>
<button class="btn btn-primary form-control disabled needs-connection" type="button" id="create_payment_channel_btn" disabled="disabled">{% trans %}Create Payment Channel{% endtrans %}</button>
<input id="create_payment_channel_amount" class="form-control" type="number" aria-describedby="create_payment_channel_amount_help" value="100000" min="1" max="10000000000" />
<div class="input-group-append">
<span class="input-group-text" id="create_payment_channel_amount_help">{% trans %}drops of XRP{% endtrans %}</span>
</div>
</div>
<small class="form-text text-muted">{% trans %}Create a <a href="payment-channels.html">payment channel</a> and fund it with the specified amount of XRP.{% endtrans %}</small>
</div><!-- /.form group for create paychan -->
<hr />
<div class="form-group" id="send_issued_currency">
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text loader" style="display: none"><img class="throbber" alt="(loading)" src="{{currentpage.prefix}}assets/img/xrp-loader-96.png" /></span>
</div>
<button class="btn btn-primary form-control disabled needs-connection" type="button" id="send_issued_currency_btn" disabled="disabled">{% trans %}Send Issued Currency{% endtrans %}</button>
<input id="send_issued_currency_amount" class="form-control" type="text" value="100" /><!-- Note: HTML limits "number" inputs to IEEE 764 double precision, which isn't enough for the full range of issued currency amounts -->
<div class="input-group-append">
<span class="input-group-text" id="send_issued_currency_code">FOO</span><!-- TODO: custom currency codes -->
</div>
</div>
<small class="form-text text-muted">{% trans %}Your destination address needs a <a href="trust-lines-and-issuing.html">trust line</a> to <span class="sending-address-item">(the test sender)</span> for the currency in question. Otherwise, you'll get tecPATH_DRY.{% endtrans %}</small>
</div><!-- /.form group for issued currency payment -->
<hr />
<div class="form-group" id="trust_for">
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text loader" style="display: none"><img class="throbber" alt="(loading)" src="{{currentpage.prefix}}assets/img/xrp-loader-96.png" /></span>
</div>
<button class="btn btn-primary form-control disabled needs-connection" type="button" id="trust_for_btn" disabled="disabled">{% trans %}Trust for{% endtrans %}</button>
<input id="trust_for_amount" class="form-control disabled" type="number" value="100000" />
<div class="input-group-append">
<span class="input-group-text" id="trust_for_currency_code">FOO</span>
</div>
</div>
<small class="form-text text-muted">{% trans %}The test sender creates a <a href="trust-lines-and-issuing.html">trust line</a> to your account for the given currency.{% endtrans %}</small>
</div><!-- /.form group for create trust line -->
</form>
</div>
</section>
{% endblock %}
{% block endbody %}
<script type="application/javascript" src="{{currentpage.prefix}}assets/vendor/bootstrap-growl.jquery.js"></script>
<script type="application/javascript" src="{{currentpage.prefix}}assets/js/submit-and-verify2.js"></script>
<script type="application/javascript" src="{{currentpage.prefix}}assets/js/tx-sender.js"></script>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Tool",
"page_group": "Docs",
"page_labels": {{currentpage.labels or []}}
})
</script>
{% endblock analytics %}

View File

@@ -1,638 +0,0 @@
{% extends "base.html.jinja" %}
{% block head %}
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
{% endblock %}
{% block bodyclasses %}no-sidebar{% endblock %}
{% block mainclasses %}landing page-uses landing-builtin-bg{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block main %}
{% set cards = [
{
"id": "aesthetes",
"title": _("Aesthetes"),
"description": _("Aesthetes is a bridge between fine art and blockchain, enabling everyone, around the world, to buy and sell with just a click for fractional ownership of international physical art."),
"category_id": "nfts",
"category_name": _("NFTs"),
"link": "https://aesthetes.art/",
},
{
"id": "anchain-ai",
"title": _("Anchain.AI"),
"description": _("AnChain.AI offers AI-powered intelligence enhancing blockchain security, risk, and compliance strategies."),
"category_id": "security",
"category_name": _("Security"),
"link": "https://anchain.ai",
},
{
"id": "audiotarky",
"title": _("Audiotarky"),
"description": _("Audiotarky is a new music streaming platform that prioritises artists and privacy over algorithms and shareholders."),
"category_id": "nfts",
"category_name": _("NFTs"),
"link": "https://www.audiotarky.com/",
},
{
"id": "bitgo",
"title": _("BitGo"),
"description": _("BitGo provides custodial and non-custodial asset holdings for digital assets including XRP. BitGo's enterprise-level security empowers businesses to integrate digital currencies like XRP into new and existing financial systems."),
"category_id": "custody",
"category_name": _("Custody"),
"link": "https://www.bitgo.com/",
},
{
"id": "gatehub",
"title": _("Gatehub"),
"description": _("Gatehub XRP Ledger Markets is an explorer to track Gatehub's inssuances on the XRP Ledger."),
"category_id": "custody",
"category_name": _("Custody"),
"link": "https://gatehub.net/markets",
},
{
"id": "bithomp",
"title": _("Bithomp"),
"description": _("Bithomp is an XRPL explorer and toolkit, used by many cryptocurrency exchanges. Bithomp was launched in 2015 with a mission to build the most user-friendly XRPL explorer."),
"category_id": "infrastructure",
"category_name": _("Infrastructure"),
"link": "https://bithomp.com/",
},
{
"id": "bitpay",
"title": _("bitpay"),
"description": _("BitPay builds powerful, enterprise-grade tools for accepting and spending cryptocurrencies, including XRP."),
"category_id": "payments",
"category_name": _("Payments"),
"link": "https://bitpay.com/",
},
{
"id": "carbonland-trust",
"title": _("Carbonland Trust"),
"description": _("Carbonland Trust offers transparent nature-based carbon credits, and inclusive access to voluntary carbon markets for landowners and corporations alike. "),
"category_id": "sustainability",
"category_name": _("Carbon Markets/Sustainability"),
"link": "https://www.carbonlandtrust.com/",
},
{
"id": "cryptum",
"title": _("Cryptum"),
"description": _("Cryptum is an API/SDK platform for integrating the XRP Ledger with any application."),
"category_id": "developer_tooling",
"category_name": _("Developer Tooling"),
"link": "https://blockforce.in/products/cryptum",
},
{
"id": "evernode",
"title": _("Evernode"),
"description": _("Evernode proposes a permissionless, flexible, scalable Layer 2 smart contract network built from the XRP Ledger."),
"category_id": "developer_tooling",
"category_name": _("Developer Tooling"),
"link": "https://evernode.org/",
},
{
"id": "forte",
"title": _("Forte"),
"description": _("Forte offers an unprecedented set of easy-to-use tools and services for game developers to integrate blockchain technology into their games, to unlock new economic and creative opportunities for gamers across the world."),
"category_id": "gaming",
"category_name": _("Gaming"),
"link": "https://www.forte.io/",
},
{
"id": "gatehub",
"title": _("Gatehub"),
"description": _("Gatehub XRP Ledger Markets is an explorer to track Gatehub's inssuances on the XRP Ledger."),
"category_id": "infrastructure",
"category_name": _("Infrastructure"),
"link": "https://gatehub.net/markets",
},
{
"id": "gem-wallet",
"title": _("Gem Wallet"),
"description": _("GemWallet is a web extension that enables users to make fast payments on the XRP Ledger via a browser. It's a safer alternative to copying and pasting private keys for use with web applications."),
"category_id": "wallet",
"category_name": _("Wallet"),
"link": "https://gemwallet.app/",
},
{
"id": "ledger-city",
"title": _("Ledger City"),
"description": _("Ledger City is a crypto real estate game powered by the XRP Ledger."),
"category_id": "gaming",
"category_name": _("Gaming"),
"link": "https://ledgercitygame.com/",
},
{
"id": "multichain",
"title": _("Multichain"),
"description": _("Multichain is the ultimate Router for web3. It is an infrastructure developed for arbitrary cross-chain interactions."),
"category_id": "interoperability",
"category_name": _("Interoperability"),
"link": "https://multichain.org/",
},
{
"id": "nft-master",
"title": _("NFT Master"),
"description": _("NFT Master is an NFT marketplace where creators can buy, mint and sell NFTs."),
"category_id": "nfts",
"category_name": _("NFTs"),
"link": "https://nftmaster.com/",
},
{
"id": "onthedex",
"title": _("OnTheDex"),
"description": _("OnTheDex is a quality source of information for aggregator sites to take live feeds of XRPL token activity."),
"category_id": "infrastructure",
"category_name": _("Infrastructure"),
"link": "https://onthedex.live/",
},
{
"id": "onxrp",
"title": _("onXRP"),
"description": _("onXRP is an NFT marketplace where creators can buy, mint and sell NFTs built by the XPUNKs."),
"category_id": "nfts",
"category_name": _("NFTs"),
"link": "https://onxrp.com/about/",
},
{
"id": "peerkat",
"title": _("Peerkat"),
"description": _("Peerkat is an NFT services and tooling provider for the XRPL community."),
"category_id": "nfts",
"category_name": _("NFTs"),
"link": "https://peerkat.io/",
},
{
"id": "Crossmark",
"title": _("Crossmark"),
"description": _("Crossmark is a browser extension wallet built for interacting with the XRP Ledger."),
"category_id": "wallet",
"category_name": _("Wallet"),
"link": "https://github.com/crossmarkio",
},
{
"id": "Edge",
"title": _("Edge"),
"description": _("Edge is a secure, easy, and private way to use, store, trade, and exchange crypto assets. Edge ensures sure youre always in control of your money and information while also providing the tools necessary to protect yourself from others and your own mistakes. Edge has rich functionality, a battle-tested security architecture, and the industrys best customer support."),
"category_id": "wallet",
"category_name": "Wallet",
"link": "https://edge.app/ripple-wallet/",
},
{
"id": "ripples-cbdc-platform",
"title": _("Ripple's CBDC Platform"),
"description": _("Ripple's Central Bank Digital Currency (CBDC) solution enables banks to mint, manage, transact and redeem currency to easily manage the full CBDC lifecycle. Each solution is built on a private ledger that is based upon XRP Ledger technology."),
"category_id": "cbdcs",
"category_name": _("CBDC"),
"link": "https://ripple.com/solutions/central-bank-digital-currency/",
},
{
"id": "ripples-on-demand-liquidity",
"title": _("Ripple's On-Demand Liquidity"),
"description": _("Ripple powers real-time, low-cost cross-border payment settlement by using XRP as a bridge currency between two fiat currencies."),
"category_id": "payments",
"category_name": _("Payments"),
"link": "https://ripple.com/",
},
{
"id": "sologenic-dex",
"title": _("Sologenic DEX"),
"description": _("Sologenic DEX is a popular decentralized exchange on the XRP Ledger made by Sologenic."),
"category_id": "exchanges",
"category_name": _("Exchanges"),
"link": "https://sologenic.org/",
},
{
"id": "sologenic-nft",
"title": _("Sologenic NFT"),
"description": _("Sologenic NFT is an NFT marketplace designed by Sologenic."),
"category_id": "nfts",
"category_name": _("NFTs"),
"link": "https://sologenic.org/nfts/marketplace?network=mainnet",
},
{
"id": "towo-labs",
"title": _("Towo Labs"),
"description": _("Towo Labs was founded in 2019, to develop XRP Ledger and Interledger infrastructures and make non-custodial crypto management easier."),
"category_id": "infrastructure",
"category_name": _("Infrastructure"),
"link": "https://towolabs.com/",
},
{
"id": "x-tokenize",
"title": _("X-tokenize"),
"description": _("X-Tokenize is a command line tool to simplify the process of creating, managing and distributing issued currencies and eventually NFTs on the XRPL."),
"category_id": "developer_tooling",
"category_name": _("Developer Tooling"),
"link": "https://x-tokenize.com/",
},
{
"id": "threezy",
"title": _("3ZY"),
"description": _("3ZY develops SaaS solutions that combine web2 and web3 technologies with marketing to enhance the user experience for newcomers in the market, making it easier for them to purchase, stay secure, and engage in trustless decentralized finance and transactions."),
"category_id": "developer_tooling",
"category_name": _("Developer Tooling"),
"link": "https://3zyconnect.com/",
},
{
"id": "xp-market",
"title": _("XP Market"),
"description": _("XP Market is a price-tracking website for cryptoassets on the XRPL coupled with a decentralized exchange."),
"category_id": "exchanges",
"category_name": _("Exchanges"),
"link": "https://xpmarket.com/",
},
{
"id": "xrp-cafe",
"title": _("XRP Cafe"),
"description": _("XRP Cafe is an NFT marketplace built by the community that aims to be the easiest way to build, sell and mint NFTs."),
"category_id": "nfts",
"category_name": _("NFTs"),
"link": "https://xrp.cafe/",
},
{
"id": "xrp-toolkit",
"title": _("XRP Toolkit"),
"description": _("XRP Toolkit is a platform for managing crypto assets and trading on the XRP Ledger's decentralized exchange."),
"category_id": "infrastructure",
"category_name": _("Infrastructure"),
"link": "https://www.xrptoolkit.com/",
},
{
"id": "xrpl-rosetta",
"title": _("XRPL Rosetta"),
"description": _("XRPL Rosetta explores fiat data on XRPL through visualization."),
"category_id": "infrastructure",
"category_name": _("Infrastructure"),
"link": "https://threexrp.dev/",
},
{
"id": "xrpl-org-ledger-explorer",
"title": _("XRPL.org Ledger Explorer"),
"description": _("XRPL.org's Ledger Explorer is a block explorer of the XRP Ledger."),
"category_id": "infrastructure",
"category_name": _("Infrastructure"),
"link": "https://livenet.xrpl.org/",
},
{
"id": "xrpscan",
"title": _("XRPScan"),
"description": _("XRPSCAN is an explorer and analytics platform for the XRP Ledger. We provide a clean and simple way to look up accounts, ledgers and transactions."),
"category_id": "infrastructure",
"category_name": _("Infrastructure"),
"link": "https://xrpscan.com/",
},
{
"id": "xumm-wallet",
"title": _("Xumm Wallet"),
"description": _("Xumm Wallet is a non custodial wallet with superpower for the XRP Ledger."),
"category_id": "wallet",
"category_name": _("Wallet"),
"link": "https://xumm.app/#team",
},
] %}
{% set featured_categories = {
"infrastructure": _("Infrastructure"),
"developer_tooling": _("Developer Tooling"),
} %}
{% set other_categories = {
"interoperability": _("Interoperability"),
"wallet": _("Wallet"),
"nfts": _("NFTs"),
"exchanges": _("Exchanges"),
"gaming": _("Gaming"),
"security": _("Security"),
"payments": _("Payments"),
"sustainability": _("Sustainability"),
"cbdcs": _("CBDCs"),
"custody": _("Custody")
} %}
<!-- Modal -->
<div class="modal fade " id="categoryFilterModal" tabindex="-1" aria-labelledby="categoryFilterModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<a class="btn cancel" data-dismiss="modal"><span class="chevron"><span></span><span></span></span> {% trans %}Cancel{% endtrans %}</a>
<a class="btn apply" data-dismiss="modal">{% trans %}Apply{% endtrans %} <span class="chevron"><span></span><span></span></span></a>
</div>
<div class="modal-body">
<!-- -->
<div class="p-3 page-events">
<form >
<p class="category-header mb-4">{% trans %}Featured Categories{% endtrans %} <span id="featured_count_old" class="featured_count category_count">2</span></p>
{% for category_id, category_name in featured_categories.items() %}
<div class="cat_checkbox category-checkbox pb-2">
<input class="events-filter input_{{category_id}}" type="checkbox" name="categories" id="input_{{category_id}}" value="{{category_id}}" checked>
<label class="font-weight-bold" for="input_{{category_id}}">{{ category_name }}</label>
</div>
{% endfor %}
<p class="category-header pt-5 mt-3 mb-4">{% trans %}Other Categories{% endtrans %} <span id="other_count_old" class="other_count category_count">0</span></p>
{% for category_id, category_name in other_categories.items() %}
<div class="cat_checkbox category-checkbox pb-2">
<input class="events-filter input_{{category_id}}" type="checkbox" name="categories" id="input_{{category_id}}" value="{{category_id}}">
<label for="input_{{category_id}}">{{ category_name }}</label>
</div>
{% endfor %}
</form>
</div>
<!-- -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">{% trans %}Apply{% endtrans %}</button>
<a class="btn " data-dismiss="modal">{% trans %}Cancel{% endtrans %}</a>
</div>
</div>
</div>
</div>
<!-- end modal -->
<div class="overflow-hidden">
<section class="container-new py-26 text-lg-center">
<div class="p-3 col-lg-8 mx-lg-auto">
<div class="d-flex flex-column-reverse">
<h1 class="mb-0">{% trans %}Powering Innovative Use Cases and Projects.{% endtrans %}</h1>
<h6 class="eyebrow mb-3">{% trans %}XRPL Ecosystem{% endtrans %}</h6>
</div>
</div>
</section>
<section class="container-new py-26">
<div class="col-lg-5 p-3">
<div class="d-flex flex-column-reverse">
<div class="d-flex justify-content-start align-items-center">
<div class="arrow-animation" id="arrowAnimation"> </div>
<span class="explore-projects">Explore Featured Projects </span>
</div>
<p class="text-sm">{% trans %}The XRPL has a rich ecosystem with many contributors globally. Explore the community of developers, validators, and partners.{% endtrans %}</p>
<h6 class="eyebrow mb-3">{% trans %}Introducing the XRPL Ecosystem{% endtrans %}</h6>
</div>
</div>
<div class="col-lg-5 offset-lg-2 p-5 d-flex">
<div class="mb-4 pb-3 numbers-animation" id="numbersAnimation"></div>
<div class="mb-4 pb-3 numbers-animation" id="numbersAnimationLight"></div>
<div class="apps-built">Apps/exchanges <br/> built on the <br/> XRPL </div>
</div>
<ul class="card-grid card-grid-4xN ls-none mt-4 pt-lg-2" id="use-case-card-grid">
{% set uses = [
{"id": "infrastructure",
"title": _("Infrastructure"),
"number": 7,
"description" : _("Build and operate components or systems that help the functionality of the XRP Ledger, such as Nodes, dev tools, storage, security and more.")
},
{"id": "developer_tooling",
"title": _("Developer Tooling"),
"number": 4,
"description" : _("Developers can leverage open-source libraries, SDKs and more to help build their project and access essential XRP Ledger functionality.")
},
{"id": "interoperability",
"title": _("Interoperability"),
"number": 1,
"description": _("Developers and node operators can build and run custom sidechains while leveraging the XRPLs lean and efficient feature set.")
},
{"id": "wallet",
"title": _("Wallet"),
"number": 4,
"description": _("Build digital wallets to store passwords and interact with various blockchains to send and receive digital assets, including XRP.")
},
{"id": "nfts",
"title": _("NFTs"),
"number": 7,
"description": _("XRPL supports the issuance of IOUs that represent a currency of any value, as well as non-fungible tokens (NFTs).")
},
{"id": "exchanges",
"title": _("Exchanges"),
"number": 2,
"description": _("Build sophisticated exchanges where users can invest and trade crypto and assets such as stocks, ETFs, and commodities.")
},
{"id": "gaming",
"title": _("Gaming"),
"number": 2,
"description": _("The XRPL supports gaming at high speed given its reliable throughput, low fees, and sidechain interoperability.")
},
{"id": "security",
"title": _("Security"),
"number": 1,
"description": _("Build services and tools that help prevent and combat fraudulent activity with the XRPL.")
},
{"id": "payments",
"title": _("Payments"),
"number": 2,
"description": _("Leverage the efficiency and speed of the XRP Ledger to move value all over the globe.")
},
{"id": "cbdc",
"title": _("CBDC"),
"number": 1,
"description": "A private version of the XRP Ledger provides Central Banks a secure, controlled, and flexible solution to issue and manage Central Bank Issued Digital Currencies (CBDCs)."
},
{"id": "sustainability",
"title": _("Sustainability"),
"number": 1,
"description": _("Use the XRP Ledger to tokenize carbon offsets as non-fungible tokens (NFTs).")
},
{"id": "custody",
"title": _("Custody"),
"number": 2,
"description": _("Use the XRP Ledger to build crypto custody and securely hold, store and use your assets.")
},
] %}
{% for use in uses %}
<li class="col use-case-circle ls-none p-3 open-modal" data-id="{{use.id}}" data-title="{{use.title}}" data-description="{{use.description}}" data-number="{{use.number}}" data-src="{{use.src}}">
<div class="circle-content">
<img class="circle-img" id={{use.id}} alt="use-logos">
<p class="circle-text">{{use.title}}</p>
<div class="pill-box">
<span class="pill-number">{{use.number}}</span>
</div>
</div>
</li>
{% endfor %}
</ul>
</section>
<div class="modal modal-uses" id="myModal">
<div class="modal-content-uses">
<div class="arrows-container" id="arrows-container">
<button class="arrow-button left-arrow" id="leftArrow">
<img alt="left arrow">
</button>
<button class="arrow-button right-arrow" id="rightArrow">
<img alt="right arrow">
</button>
</div>
<div class="content-section">
<img class="section-image" alt="section image" width="40" height="40">
</div>
<div class="content-section">
<p class="section-text-title">Title</p>
</div>
<div class="content-section">
<p class="section-text-description">Description</p>
</div>
<div class="content-section">
<hr class="section-separator">
</div>
<div class="content-section">
<div class="section-logos">Group of logos here...</div>
</div>
</div>
</div>
<section class="join-xrpl-section py-26">
<div class="colorful-join-text-wrapper">
<span class="colorful-join-text"> Join the XRPL Ecosystem and showcase your XRPL project, application, or product. Get featured on the Developer Reflections blog or Ecosystem page. </span>
<div class="mt-10">
<a target="_blank" class="btn btn-primary btn-arrow" href="https://xrpl.typeform.com/dev-spotlight">{% trans %}Submit Your Project{% endtrans %}</a>
</div>
</div>
</section>
<section class="container-new py-26">
<div class="col-12 col-lg-8 col-xl-6 p-3 mb-5">
<div class="d-flex flex-column-reverse">
<h3 class="h4 h2-sm">{% trans %}Businesses and developers <br class="until-sm"/> rely on the XRP Ledger{% endtrans %}</h3>
<h6 class="eyebrow mb-3">{% trans %}Solving Real-World Problems{% endtrans %}</h6>
</div>
<p class="mb-0 longform mt-8-until-sm mt-3 ">{% trans %}With intentional innovations, tools and documentation that accelerate development and minimize time to market, XRP Ledger is used to create solutions across an expansive range of industries and use cases.{% endtrans %}</p>
</div>
<a class="btn d-block d-lg-none" data-toggle="modal" data-target="#categoryFilterModal">
<span class="mr-3"><img src="./assets/img/uses/usecase-filter.svg" alt="Filter button"></span>{% trans %}Filter by Categories{% endtrans %}<span class="ml-3 total_count category_count">2</span>
</a>
<!-- Start company cards -->
<div class="row col-12 m-0 p-0 mt-4 pt-2">
<div class="left col-3 m-0 p-0 mt-2 d-none d-lg-block">
<!-- Side bar Desktop. -->
<div class="p-3 category_sidebar">
<form >
<p class="category-header mb-4">{% trans %}Featured Categories{% endtrans %} <span id="featured_count_old" class="featured_count category_count">2</span></p>
{% for category_id, category_name in featured_categories.items() %}
<div class="cat_checkbox category-checkbox pb-2">
<input class="events-filter input_{{category_id}}" type="checkbox" name="categories" id="input_{{category_id}}" value="{{category_id}}" checked>
<label class="font-weight-bold" for="input_{{category_id}}">{{ category_name }}</label>
</div>
{% endfor %}
<p class="category-header pt-5 mt-3 mb-4">{% trans %}Other Categories{% endtrans %} <span id="other_count_old" class="other_count category_count">0</span></p>
{% for category_id, category_name in other_categories.items() %}
<div class="cat_checkbox category-checkbox pb-2">
<input class="events-filter input_{{category_id}}" type="checkbox" name="categories" id="input_{{category_id}}" value="{{category_id}}">
<label for="input_{{category_id}}">{{ category_name }}</label>
</div>
{% endfor %}
</form>
</div>
<!-- End sidebar desktop -->
</div>
<!-- cards -->
<div class="right row col row-cols-lg-2 m-0 p-0" id="use_case_companies_list">
{% for card in cards %}
<a class="card-uses category_{{card.category_id}}" href="{{card.link}}" target="_blank" id="{{card.id}}">
<div class="card-body row">
<span class="w-100 mb-3 pb-3">
<img class="mw-100 biz-logo" alt="{{card.title|default(card.id)}}">
</span>
<h4 class="card-title h6">{{card.title}}</h4>
<p class="card-text">{{card.description}}</p>
<div class="align-self-end"><span class="label label-use-{{card.category_id}}">{{card.category_name}}</span></div>
</div>
</a>
{% endfor %}
</div>
<!-- end cards -->
</div>
<!-- end company cards -->
</section>
</div>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Splash Page",
"page_group": "About"
})
</script>
{% endblock analytics %}
{% block endbody %}
<script type="text/javascript" src="{{currentpage.prefix}}assets/js/bodymovin.min.js"></script>
<script type="application/javascript" src="{{currentpage.prefix}}assets/js/modal.js"></script>
<script type="application/javascript" src="{{currentpage.prefix}}assets/js/use-cases.js"></script>
<script type="text/javascript" src="{{currentpage.prefix}}assets/js/ecosystem/numbers-animation.json"></script>
<script type="text/javascript" src="{{currentpage.prefix}}assets/js/ecosystem/numbers-animation-light.json"></script>
<script type="text/javascript" src="{{currentpage.prefix}}assets/js/ecosystem/arrow-animation.js"></script>
<script type="text/javascript">
function numAnimate(){
bodymovin.loadAnimation({
container: document.getElementById('numbersAnimation'),
renderer: 'svg',
loop: false,
autoplay: true,
animationData: numAnimation
});
};
function numAnimateLight(){
bodymovin.loadAnimation({
container: document.getElementById('numbersAnimationLight'),
renderer: 'svg',
loop: false,
autoplay: true,
animationData: numAnimationLight
});
};
function arrowAnimate(){
bodymovin.loadAnimation({
container: document.getElementById('arrowAnimation'),
renderer: 'svg',
loop: true,
autoplay: true,
animationData: arrowAnimation
});
};
numAnimate();
numAnimateLight()
arrowAnimate()
</script>
{% endblock %}

View File

@@ -1,42 +0,0 @@
{% extends "base.html.jinja" %}
{% block main %}
<section class="container-fluid p-3">
<h1>{% trans %}Domain Verification Checker{% endtrans %}</h1>
<p>{% trans %}This tool allows you to verify that <a href="xrp-ledger-toml.html#domain-verification">domain verification</a> is properly configured.{% endtrans %}</p>
<p>{% trans %}Enter the manifest found in your validator-keys.json file. Do not confuse this with your validator's secret key.{% endtrans %}</p>
<p>{% trans %}To do this with the validator-keys-tool use the following command:{% endtrans %}</p>
<pre><code>$ validator-keys show_manifest hex</code></pre>
<form id="manifest-entry">
<div class="input-group">
<input id="manifest" type="text" class="form-control" required
placeholder="{% trans %}Your Manifest Here{% endtrans %}"
pattern="[0-9A-Fa-f]+"><br>
<button class="btn btn-primary form-control">Check Domain Verification</button>
</div><!--/.input-group-->
</form>
<div id="result">
<h5 class='result-title'>{% trans %}Result{% endtrans %}</h5>
<ul id="log">
</ul>
</div>
</section>
{% endblock %}
{% block endbody %}
<script type='text/javascript' src='assets/vendor/iarna-toml-parse.js'></script>
<script type='text/javascript' src='assets/js/domain-verifier-bundle.js'></script>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Tool",
"page_group": "Docs",
"page_labels": {{currentpage.labels or []}}
})
</script>
{% endblock analytics %}

View File

@@ -1,234 +0,0 @@
{% extends "base.html.jinja" %}
{% block head %}
<!-- copy code button -->
<script src="https://cdn.jsdelivr.net/npm/clipboard@2.0.8/dist/clipboard.min.js"></script>
<script>
$(document).ready(function() {
new ClipboardJS('.clipboard-btn');
});
</script>
{% endblock %}
{% block right_sidebar %}
<div class="command-list-wrapper">
<div class="toc-header">
<h4>API Methods</h4>
</div>
<ul class="command-list" id="command_list"></ul>
</div>
{% endblock %}
{% block main %}
<section class="container-fluid pt-3 p-md-3 websocket-tool" id="wstool-1">
<h1>WebSocket Tool</h1>
<div class="api-method-description-wrapper">
<h3><a href="server_info.html" class="selected_command">server_info</a></h3>
<p class="blurb">Get information about the state of the server, formatted for human consumption.</p>
<a class="btn btn-outline-secondary api-readmore" href="server_info.html">Read more</a>
</div><!--/.api-method-description-wrapper-->
<div class="api-input-area pt-4">
<h4>Request</h4>
<div class="request-body"></div>
<div class="btn-toolbar justify-content-between" role="toolbar">
<div class="btn-group mr-3" role="group">
<button class="btn btn-outline-secondary send-request">Send request</button>
<div class="input-group loader send-loader" style="display:none;">
<span class="input-group-append">
<img alt="(loading)" src="{{currentpage.prefix}}assets/img/xrp-loader-96.png" height="24" width="24" />
</span><!--/.input-group-append-->
</div><!--/.input-group.loader-->
</div><!--/.btn-group-->
<div class="btn-group request-options" role="group">
<button class="btn btn-outline-secondary connection" data-toggle="modal" data-target="#wstool-1-connection-settings">Offline (Mainnet)</button>
<div class="input-group loader connect-loader" style="display:none;">
<span class="input-group-append">
<img alt="(loading)" src="{{currentpage.prefix}}assets/img/xrp-loader-96.png" height="24" width="24" />
</span><!--/.input-group-append-->
</div><!--/.input-group.loader-->
<button class="btn btn-outline-secondary permalink" data-toggle="modal" data-target="#wstool-1-permalink" title="Permalink"><i class="fa fa-link"></i></button>
<button class="btn btn-outline-secondary curl" data-toggle="modal" data-target="#wstool-1-curl" title="cURL syntax"><i class="fa fa-terminal"></i></button>
</div><!--/.request-options.btn-group-->
</div><!--/.btn-toolbar-->
</div><!--/.api-input-area-->
<div class="api-response-area pt-4">
<h4>Responses</h4>
<div class="btn-toolbar justify-content-between response-options" role="toolbar">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text" id="wstool-1-keep-last-label">Keep last:</div>
</div><!--/.input-group-prepend-->
<input type="number" value="50" min="1" aria-label="Number of responses to keep at once" aria-describedby="wstool-1-keep-last-label" class="form-control keep-last">
</div><!--/.input-group-->
<div class="btn-group" role="group">
<button class="btn btn-outline-secondary stream-pause" title="Pause Subscriptions">
<i class="fa fa-pause"></i>
</button>
<button class="btn btn-outline-secondary stream-unpause" title="Unpause Subscriptions" style="display:none;">
<i class="fa fa-play"></i>
</button>
<button class="btn btn-outline-secondary wipe-responses" title="Delete All Responses">
<i class="fa fa-trash"></i>
</button>
</div><!--/.btn-group-->
</div><!--/.btn-toolbar.response-options-->
<div class="response-body-wrapper">
</div>
</div><!--/.api-response-area-->
</section>
{% endblock %}
{% block endbody %}
<!-- Modals for settings -->
<div class="modal fade" id="wstool-1-connection-settings" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Connection Settings</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
{% for conn in [
{
"id": "wstool-1-connection-s1",
"ws_url": "wss://s1.ripple.com/",
"jsonrpc_url": "https://s1.ripple.com:51234/",
"shortname": "Mainnet s1",
"longname": "s1.ripple.com (Mainnet Public Cluster)"
},
{
"id": "wstool-1-connection-xrplcluster",
"ws_url": "wss://xrplcluster.com/",
"jsonrpc_url": "https://xrplcluster.com/",
"shortname": "Mainnet xrplcluster",
"longname": "xrplcluster.com (Mainnet Full History Cluster)"
},
{
"id": "wstool-1-connection-s2",
"ws_url": "wss://s2.ripple.com/",
"jsonrpc_url": "https://s2.ripple.com:51234/",
"shortname": "Mainnet s2",
"longname": "s2.ripple.com (Mainnet Full History Cluster)"
},
{
"id": "wstool-1-connection-testnet",
"ws_url": "wss://s.altnet.rippletest.net:51233/",
"jsonrpc_url": "https://s.altnet.rippletest.net:51234/",
"shortname": "Testnet",
"longname": "s.altnet.rippletest.net (Testnet Public Cluster)"
},
{
"id": "wstool-1-connection-devnet",
"ws_url": "wss://s.devnet.rippletest.net:51233/",
"jsonrpc_url": "https://s.devnet.rippletest.net:51234/",
"shortname": "Devnet",
"longname": "s.devnet.rippletest.net (Devnet Public Cluster)"
},
{
"id": "wstool-1-connection-sidechain-devnet",
"ws_url": "wss://sidechain-net2.devnet.rippletest.net:51233/",
"jsonrpc_url": "https://sidechain-net2.devnet.rippletest.net:51234/",
"shortname": "Sidechain-Devnet",
"longname": "sidechain-net2.devnet.rippletest.net (Issuing Sidechain Devnet Public Cluster)"
},
{
"id": "wstool-1-connection-localhost",
"ws_url": "ws://localhost:6006/",
"jsonrpc_url": "http://localhost:5005/",
"shortname": "Local server",
"longname": "localhost:6006 (Local <code>rippled</code> Server on port 6006) <br/>\n <small>(Requires that you <a href=\"install-rippled.html\">run <code>rippled</code></a> on this machine with default WebSocket settings)</small>"
}
] %}
<div class="form-check">
<input class="form-check-input" type="radio" name="wstool-1-connection" id="{{conn.id}}" value="{{conn.ws_url}}" data-jsonrpcurl="{{conn.jsonrpc_url}}" data-shortname="{{conn.shortname}}"{% if loop.index == 1 %} checked{% endif %}>
<label class="form-check-label" for="{{conn.id}}">
{{conn.longname}}
</label>
</div>
{% endfor %}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">Close</button>
</div><!--/.modal-footer-->
</div><!--/.modal-content-->
</div><!--/.modal-dialog-->
</div><!--/.modal-->
<div class="modal fade" id="wstool-1-permalink" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Permalink</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<form><div class="form-group">
<label for="permalink-box-1">Share the following link to load this page with the currently-loaded inputs:</label>
<textarea id="permalink-box-1" class="form-control">https://xrpl.org/websocket-api-tool.html?server=wss%3A%2F%2Fs1.ripple.com%2F&req=%7B%22id%22%3A1%2C%22command%22%3A%22server_info%22%7D</textarea>
</div></form>
</div><!--/.modal-body-->
<div class="modal-footer">
<button alt="Copy to clipboard" class="btn btn-outline-secondary clipboard-btn" data-clipboard-target="#permalink-box-1" id="permalink-box-1button"><i class="fa fa-clipboard"></i></button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">Close</button>
</div><!--/.modal-footer-->
</div><!--/.modal-content-->
</div><!--/.modal-dialog-->
</div><!--/.modal-->
<div class="modal fade" id="wstool-1-curl" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">cURL Syntax</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<form><div class="form-group">
<label for="curl-box-1">Use the following syntax to make the equivalent JSON-RPC request using <a href="https://curl.se/">cURL</a> from a commandline interface:</label>
<textarea id="curl-box-1" class="form-control" rows="8">curl -H 'Content-Type: application/json' -d '{"method":"server_info","params":[{}]}' https://s1.ripple.com:51234/</textarea>
</div></form>
</div><!--/.modal-body-->
<div class="modal-footer">
<button alt="Copy to clipboard" class="btn btn-outline-secondary clipboard-btn" data-clipboard-target="#curl-box-1" id="curl-box-1button"><i class="fa fa-clipboard"></i></button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">Close</button>
</div><!--/.modal-footer-->
</div><!--/.modal-content-->
</div><!--/.modal-dialog-->
</div><!--/.modal-->
<script type="text/javascript" src="{{currentpage.prefix}}assets/vendor/jsonlint.js"></script>
<script type="text/javascript" src="{{currentpage.prefix}}assets/vendor/codemirror-js-json-lint.min.js"></script>
<script type="text/javascript" src="{{currentpage.prefix}}assets/js/apitool-websocket.js"></script>
<script type="text/javascript" src="{{currentpage.prefix}}assets/js/apitool-methods-ws.js"></script>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Tool",
"page_group": "Docs",
"page_labels": {{currentpage.labels or []}}
})
</script>
{% endblock analytics %}

View File

@@ -1,93 +0,0 @@
{% extends "base.html.jinja" %}
{% set faucets = [
{
"id": "faucet-select-testnet",
"ws_url": "wss://s.altnet.rippletest.net:51233/",
"jsonrpc_url": "https://s.altnet.rippletest.net:51234/",
"shortname": "Testnet",
"faucet": "https://faucet.altnet.rippletest.net/accounts",
"desc": "Mainnet-like network for testing applications."
},
{
"id": "faucet-select-devnet",
"ws_url": "wss://s.devnet.rippletest.net:51233/",
"jsonrpc_url": "https://s.devnet.rippletest.net:51234/",
"shortname": "Devnet",
"faucet": "https://faucet.devnet.rippletest.net/accounts",
"desc": "Preview of upcoming amendments."
},
{
"id": "faucet-select-xahau",
"ws_url": "wss://xahau-test.net/",
"jsonrpc_url": "https://xahau-test.net/",
"shortname": "Xahau-Testnet",
"faucet": "https://xahau-test.net/accounts",
"desc": "Hooks (L1 smart contracts) enabled Xahau testnet."
}
] %}
{% block bodyclasses %}page-test-net{% endblock %}
{% block right_sidebar %}
{% for net in faucets %}
<h4>{{net.shortname}} Servers</h4>
<pre><code>// WebSocket
{{net.ws_url}}
// JSON-RPC
{{net.jsonrpc_url}}</code></pre>
{% endfor %}
{% endblock %}
{% block main %}
<section class="container-fluid pt-3 p-md-3">
<h1>XRP Faucets</h1>
<div class="content">
<p>These <a href="parallel-networks.html">parallel XRP Ledger test networks</a> provide platforms for testing changes to the XRP Ledger and software built on it, without using real funds.</p>
<p>These funds are intended for <strong>testing</strong> only. Test networks' ledger history and balances are reset as necessary. Devnets may be reset without warning.</p>
<p>All balances and XRP on these networks are separate from Mainnet. As a precaution, do not use the Testnet or Devnet credentials on the Mainnet.</p>
<h3>Choose Network:</h3>
{% for net in faucets %}
<div class="form-check">
<input onclick="document.getElementById('generate-creds-button').innerHTML='Generate {{net.shortname}} credentials'" class="form-check-input" type="radio" name="faucet-selector" id="{{net.id}}" value="{{net.faucet}}" data-jsonrpcurl="{{net.jsonrpc_url}}" data-wsurl="{{net.ws_url}}" data-shortname="{{net.shortname}}" {% if loop.index == 1 %} checked{% endif %} />
<label class="form-check-label" for="{{net.id}}"><strong>{{net.shortname}}</strong>: {{net.desc}}</label>
</div>
{% endfor %}
<div class="btn-toolbar" role="toolbar" aria-label="Button">
<button id="generate-creds-button" class="btn btn-primary mr-2 mb-2">Generate Testnet credentials</button>
</div><!--/.btn-toolbar-->
<div id='your-credentials'></div>
<div id='loader' style="display: none;"><img alt="(loading)" class="throbber" src="{{currentpage.prefix}}assets/img/xrp-loader-96.png"> Generating Keys...</div>
<div id='address'></div>
<div id='secret'></div>
<div id='balance'></div>
<div id='sequence'> <div id='loader' style="display: none;"><img alt="(loading)" class="throbber" src="{{currentpage.prefix}}assets/img/xrp-loader-96.png"> Waiting...</div></div>
</div>
</section>
{% endblock %}
{% block endbody %}
{{target.ripple_lib_tag}}
<script type='text/javascript' src='assets/js/faucet.js'></script>
<script src="{{currentpage.prefix}}assets/js/multicodetab.js"></script>
<script type="application/javascript">
$(document).ready(function() {
$(".multicode").minitabs();
});
</script>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Tool",
"page_group": "Docs",
"page_labels": {{currentpage.labels or []}}
})
</script>
{% endblock analytics %}

View File

@@ -1,289 +0,0 @@
{% extends "base.html.jinja" %}
{% block head %}
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
{% endblock %}
{% block bodyclasses %}no-sidebar{% endblock %}
{% block mainclasses %}landing{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block main %}
<div class="position-relative">
<img alt="" src="./img/backgrounds/xrp-overview-blue.svg" class="landing-bg" id="xrp-overview-blue">
</div>
<section class="py-26 text-center">
<div class="col-lg-5 mx-auto text-center">
<div class="d-flex flex-column-reverse">
<h1 class="mb-0">{% trans %}Your Questions About XRP, Answered{% endtrans %}</h1>
<h6 class="eyebrow mb-3">{% trans %}XRP Overview{% endtrans %}</h6>
</div>
</div>
</section>
<section class="container-new my-20">
<div class="card-grid card-grid-1x2">
<div class="d-none-sm mt-lg-0">
<ul class="page-toc no-sideline p-0 sticky-top floating-nav">
{% set links = [
{ "hash": _("#about-xrp"),
"text": _("About XRP") },
{ "hash": _("#xrp-trading"),
"text": _("XRP in Trading") },
{ "hash": _("#ripple"),
"text": _("Ripple vs. XRP") },
{ "hash": _("#wallets"),
"text": _("XRP Wallets") },
{ "hash": _("#exchanges"),
"text": _("XRP Exchanges") },
] %}
{% for link in links %}
<li class="nav-item"><a class="sidelinks nav-link" href="{{link.hash}}">{{link.text}}</a></li>
{% endfor %}
</ul>
</div>
<div class="col mt-lg-0">
<div class="link-section pb-26" id="about-xrp">
<h2 class="h4 h2-sm mb-8">{% trans %}What Is XRP?{% endtrans %}</h2>
<h5 class="longform mb-10">{% trans %}XRP is a digital asset thats native to the XRP Ledger—an open-source, permissionless and decentralized <a href="https://www.distributedagreement.com/2018/09/24/what-is-a-blockchain/" target="_blank">blockchain technology.</a>{% endtrans %}</h5>
<p class="mb-6">{% trans %}Created in 2012 specifically for payments, XRP can settle transactions on the ledger in 3-5 seconds. It was built to be a better Bitcoin—faster, cheaper and greener than any other digital asset.{% endtrans %}</p>
<div class="overflow-x-xs">
<table class="mb-10 landing-table">
<thead>
<tr>
<th><h6>{% trans %}Benefits{% endtrans %}</h6></th>
<th><h6>{% trans %}XRP{% endtrans %}</h6></th>
<th><h6>{% trans %}Bitcoin{% endtrans %}</h6></th>
</tr>
</thead>
<tbody>
<tr>
<td>{% trans %}Fast{% endtrans %}</td>
<td>{% trans %}3-5 seconds to settle{% endtrans %}</td>
<td>{% trans %}500 seconds to settle{% endtrans %}</td>
</tr>
<tr>
<td>{% trans %}Low-Cost{% endtrans %}</td>
<td>{% trans %}$0.0002/tx{% endtrans %}</td>
<td>{% trans %}$0.50/tx{% endtrans %}</td>
</tr>
<tr>
<td>{% trans %}Scalable{% endtrans %}</td>
<td>{% trans %}1,500 tx per second{% endtrans %}</td>
<td>{% trans %}3 tx per second{% endtrans %}</td>
</tr>
<tr>
<td>{% trans %}Sustainable{% endtrans %}</td>
<td>{% trans %}Environmentally sustainable (negligible energy consumption){% endtrans %}</td>
<td>{% trans %}0.3&#37; of global energy consumption{% endtrans %}</td>
</tr>
</tbody>
</table>
</div>
<p class="mb-10">{% trans %}XRP can be sent directly without needing a central intermediary, making it a convenient instrument in bridging two different currencies quickly and efficiently. It is freely exchanged on the open market and used in the real world for enabling cross-border payments and microtransactions.{% endtrans %}</p>
<div class="card-grid card-grid-2xN mb-10">
<div>
<img class="mw-100 mb-2 invertible-img" src="{{currentpage.prefix}}assets/img/icons/briefcase.svg">
<h6 class="fs-4-5">{% trans %}Financial Institutions{% endtrans %}</h6>
<p class="">{% trans %}Leverage XRP as a bridge currency to facilitate faster, more affordable cross-border payments around the world.{% endtrans %}</p>
</div>
<div>
<img class="mw-100 mb-2 invertible-img" src="{{currentpage.prefix}}assets/img/icons/user.svg">
<h6 class="fs-4-5">{% trans %}Individual Consumers{% endtrans %}</h6>
<p>{% trans %}Use XRP to move different currencies around the world. {% endtrans %}</p>
</div>
</div>
<div class="mt-10 p-10 br-8 cta-card position-relative">
<img alt="" src="./img/backgrounds/cta-xrp-overview-magenta.svg" class="cta cta-bottom-right">
<div class="z-index-1 position-relative">
<h2 class="h4 mb-10-until-sm mb-8-sm">{% trans %}The XRP Ledger was designed with sustainability in mind.{% endtrans %}</h2>
<p class="mb-10">{% trans %}Explore the impact of the world's first major, global, public carbon-neutral blockchain.{% endtrans %}</p>
<a class="btn btn-primary btn-arrow" href="impact.html">{% trans %}Impact{% endtrans %}</a>
</div>
</div>
</div>
<div class="py-26 link-section" id="xrp-trading">
<h2 class="h4 h2-sm mb-8">{% trans %}How Is XRP Used in Trading?{% endtrans %}</h2>
<h5 class="longform mb-10">{% trans %}XRP is traded on more than 100 markets and exchanges worldwide.{% endtrans %}</h5>
<p class="mb-6">{% trans %}XRPs low transaction fees, reliability and high-speed enable traders to use the digital asset as high-speed, cost-efficient and reliable collateral across trading venues—<a href="https://ripple.com/insights/xrp-a-preferred-base-currency-for-arbitrage-trading/" target="_blank">seizing arbitrage opportunities</a>, servicing margin calls and managing general trading inventory in real time.{% endtrans %}</p>
<p>{% trans %}Because of the properties inherent to XRP and the ecosystem around it, traders worldwide are able to shift collateral, bridge currencies and switch from one crypto into another nearly instantly, across any exchange on the planet.{% endtrans %}</p>
</div>
<div class="py-26 link-section" id="ripple">
<h2 class="h4 h2-sm mb-8">{% trans %}What Is the Relationship Between Ripple and XRP?{% endtrans %}</h2>
<h5 class="longform mb-10">{% trans %}<a href="https://ripple.com" target="_blank">Ripple</a> is a technology company that makes it easier to build a high-performance, global payments business. XRP is a digital asset independent of this.{% endtrans %}</h5>
<p>{% trans %}There is a finite amount of XRP. All XRP is already in existence today—no more than the original 100 billion can be created. The XRPL founders gifted 80 billion XRP, the platforms native currency, to Ripple. To provide predictability to the XRP supply, Ripple has locked 55 billion XRP (55&#37; of the total possible supply) into a series of escrows using the XRP Ledger itself. The XRPL's transaction processing rules, enforced by the consensus protocol, control the release of the XRP.{% endtrans %}</p>
<div class="mt-10 p-10 br-8 cta-card position-relative">
<img alt="" src="./img/backgrounds/cta-xrp-overview-green-2.svg" class="landing-bg cta cta-bottom-right">
<div class="z-index-1 position-relative">
<h3 class="h4">{% trans %}As of <span class="stat-highlight" id="ripple-escrow-as-of">December 2017</span> <br/>
<span class="d-inline-flex"><img id="xrp-mark-overview" class="mw-100 invertible-img mr-2" src="./img/logos/xrp-mark.svg" alt="XRP Logo Mark"> <span class="numbers stat-highlight" id="ripple-escrow-amount">55B</span></span><br/>
XRP remains in escrow{% endtrans %}</h3>
</div>
<script type="application/javascript">
$(document).ready(async() => {
let resp = await fetch("https://data.ripple.com/v2/network/xrp_distribution?descending=true&limit=1")
if (resp.ok) {
let j = await resp.json()
const exact_amt = j.rows[0].escrowed
const amt_billions = Math.floor(exact_amt / 1e9)
const when = new Date(j.rows[0].date)
$("#ripple-escrow-as-of").text(when.toLocaleDateString(undefined, {year: 'numeric', month:'short'}))
$("#ripple-escrow-amount").text(amt_billions + "B")
} else {
console.warn("Fetching data about Ripple's XRP escrow from the data API failed.")
}
})
</script>
</div>
</div>
<div class="link-section py-26" id="wallets">
<h2 class="h4 h2-sm mb-8">{% trans %}What Wallets Support XRP?{% endtrans %}</h2>
<h5 class="longform mb-10">{% trans %}Digital wallets are pieces of software that allow people to send, receive, and store cryptocurrencies, including XRP. There are two types of digital wallets: hardware and software.{% endtrans %}</h5>
<ul class="nav nav-grid-lg cols-of-5" id="wallets">
<li class="nav-item nav-grid-head">
<h6 class="fs-4-5">{% trans %}Software Wallets{% endtrans %}</h6>
</li>
{% set softwallets = [
{ "href": "https://towolabs.com/",
"id": "wallet-towo",
"alt": _("Towo") },
{ "href": "https://xumm.app/",
"id": "wallet-xumm",
"alt": _("Xumm") },
{ "href": _("https://trustwallet.com/"),
"id": "wallet-trust",
"alt": _("Trust Wallet") },
{ "href": _("https://gatehub.net/"),
"id": "wallet-gatehub",
"alt": _("Gatehub"),
"imgclasses": "invertible-img" },
] %}
{% for wallet in softwallets %}
<li class="nav-item">
<a class="nav-link external-link" href="{{wallet.href}}" target="_blank"><img class="mw-100 {% if wallet.imgclasses %}{{wallet.imgclasses}}{% endif %}" id="{{wallet.id}}" alt="{{wallet.alt}}" /></a>
</li>
{% endfor %}
<li class="nav-item nav-grid-head">
<h6 class="fs-4-5">{% trans %}Hardware Wallets{% endtrans %}</h6>
</li>
{% set hardwallets = [
{ "href": "https://www.ledger.com/",
"id": "wallet-ledger",
"alt": _("Ledger"),
"imgclasses": "invertible-img" },
{ "href": "https://keyst.one/",
"id": "wallet-keystone",
"alt": _("Keystone"),
},
{ "href": "https://dcentwallet.com/?lang=en",
"id": "wallet-dcent",
"alt": _("Dcent"),
},
{ "href": "https://trezor.io/",
"id": "wallet-trezor",
"alt": _("Trezor"),
"imgclasses": "invertible-img"},
] %}
{% for wallet in hardwallets %}
<li class="nav-item">
<a class="nav-link external-link" href="{{wallet.href}}" target="_blank"><img class="mw-100 {% if wallet.imgclasses %}{{wallet.imgclasses}}{% endif %}" id="{{wallet.id}}" alt="{{wallet.alt}}" /></a>
</li>
{% endfor %}
</ul>
<p class="fs-3 mt-10">{% trans %}Disclaimer: This information is drawn from other sources on the internet. XRPL.org does not endorse or recommend any exchanges or make any representations with respect to exchanges or the purchase or sale of digital assets more generally. Its advisable to conduct your own due diligence before relying on any third party or third-party technology, and providers may vary significantly in their compliance, data security, and privacy practices.{% endtrans %}</p>
</div>
<div class="py-26 link-section" id="exchanges">
<h2 class="h4 h2-sm mb-8">{% trans %}What Exchanges Support XRP?{% endtrans %}</h2>
<h5 class="longform mb-10">{% trans %}Exchanges are where people trade currencies. XRP is traded on more than 100 markets and exchanges worldwide.{% endtrans %}</h5>
<p class="mb-10">{% trans %}There are different types of exchanges that vary depending on the type of market (spot, futures, options, swaps), and the type of security model (custodial, non-custodial).{% endtrans %}</p>
<div class="card-grid card-grid-2xN mb-10">
<div>
<h6 class="fs-4-5">{% trans %}Spot Exchanges{% endtrans %}</h6>
<p class="mb-0">{% trans %}Spot exchanges allow people to buy and sell cryptocurrencies at current (spot) market rates.{% endtrans %}</p>
</div>
<div>
<h6 class="fs-4-5">{% trans %}Futures, Options and Swap Exchanges{% endtrans %}</h6>
<p class="mb-0">{% trans %}Futures, options and swap exchanges allow people to buy and sell standardized contracts of cryptocurrency market rates in the future.{% endtrans %}</p>
</div>
<div>
<h6 class="fs-4-5">{% trans %}Custodial Exchanges{% endtrans %}</h6>
<p class="mb-0">{% trans %}Custodial exchanges manage a users private keys, and publish centralized order books of buyers and sellers.{% endtrans %}</p>
</div>
<div>
<h6 class="fs-4-5">{% trans %}Non-Custodial Exchanges{% endtrans %}</h6>
<p class="mb-0">{% trans %}Non-custodial exchanges, also known as decentralized exchanges, do not manage a users private keys, and publish decentralized order books of buyers and sellers on a blockchain.{% endtrans %}</p>
</div>
</div>
<h6>{% trans %}Top Exchanges, according to CryptoCompare{% endtrans %}</h6>
<ul class="nav nav-grid-lg cols-of-5 mb-10" id="top-exchanges">
{% set exchanges = [
{ "href": "https://www.bitstamp.net/",
"id": "exch-bitstamp",
"alt": _("Bitstamp") },
{ "href": _("https://www.kraken.com/"),
"id": "exch-kraken",
"alt": _("Kraken") },
{ "href": _("https://cex.io/"),
"id": "exch-cex-io",
"alt": _("Cex.io") },
{ "href": _("https://www.liquid.com/"),
"id": "exch-liquid",
"alt": _("Liquid") },
{ "href": _("https://www.lmax.com/"),
"id": "exch-lmax",
"alt": _("LMAX") },
{ "href": _("https://www.bitfinex.com/"),
"id": "exch-bitfinex",
"alt": _("Bitfinex") },
{ "href": _("https://www.etoro.com/crypto/exchange/"),
"id": "exch-etoro",
"alt": _("eToro") },
{ "href": _("https://currency.com"),
"id": "exch-currency-com",
"alt": _("Currency.com") },
{ "href": _("https://bittrex.com/"),
"id": "exch-bittrex",
"alt": _("Bittrex") },
] %}
{% for exch in exchanges %}
<li class="nav-item">
<a class="nav-link external-link" href="{{exch.href}}" target="_blank"><span class="longform mr-3">{{loop.index}}</span><img class="mw-100" id="{{exch.id}}" alt="{{exch.alt}}"></a>
</li>
{% endfor %}
</ul>
<p class="fs-3 mt-10 mb-0">{% trans %}Disclaimer: This information is drawn from other sources on the internet. XRPL.org does not endorse or recommend any exchanges or make any representations with respect to exchanges or the purchase or sale of digital assets more generally. Its advisable to conduct your own due diligence before relying on any third party or third-party technology, and providers may vary significantly in their compliance, data security, and privacy practices.{% endtrans %}</p>
</div>
</div>
</section>
</div>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Splash Page",
"page_group": "About"
})
</script>
{% endblock analytics %}

View File

@@ -1,216 +0,0 @@
{% extends "base.html.jinja" %}
{% block head %}
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<!-- Play videos from youtube -->
<script src="{{currentpage.prefix}}assets/js/video.js"></script>
{% endblock %}
{% block bodyclasses %}no-sidebar{% endblock %}
{% block mainclasses %}landing{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block main %}
<div class="overflow-hidden">
<div id="video-overlay"></div>
<div id="video">
<div id="videoWrapper">
<iframe id="player" width="853" height="480" src="" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="position-relative">
<img src="./img/backgrounds/xrpl-overview-purple.svg" class="landing-bg" id="xrpl-overview-purple">
</div>
<section class="py-26 text-center">
<div class="col-lg-5 mx-auto text-center">
<div class="d-flex flex-column-reverse">
<h1 class="mb-0">{% trans %}The Business <br class="until-sm"/> of Impact{% endtrans %}</h1>
<h6 class="eyebrow mb-3">{% trans %}XRPL Today, XRPL Tomorrow{% endtrans %}</h6>
</div>
</div>
</section>
<div class="position-relative d-none-sm">
<img alt="" src="./img/backgrounds/xrpl-overview-orange.svg" id="xrpl-overview-orange">
</div>
<section class="container-new py-26">
<div class="card-grid card-grid-2xN">
<div class="col">
<div class="d-flex flex-column-reverse">
<h2 class="h4 h2-sm mb-8">{% trans %}How the XRP Ledger works{% endtrans %}</h2>
<h6 class="eyebrow mb-3">{% trans %}XRP Ledger Basics{% endtrans %}</h6>
</div>
<h5 class="longform mb-10">{% trans %}The XRP Ledger is a decentralized public blockchain built for business. {% endtrans %}</h5>
<p class="mb-4">{% trans %}The peer-to-peer network that manages the ledger is open to everyone. The XRP Ledger is maintained by software engineers, server operators, users, and businessesa global community working to solve problems and create real-world value.{% endtrans %}</p>
<div class="d-none d-lg-block">
<a class="btn btn-primary btn-arrow" href="docs.html">{% trans %}Read Technical Docs{% endtrans %}</a> <a class="ml-4 video-external-link" target="_blank" href="https://www.youtube.com/playlist?list=PLJQ55Tj1hIVZtJ_JdTvSum2qMTsedWkNi">{% trans %}Watch Explainer Videos {% endtrans %}</a>
</div>
</div>
<div class="col">
<iframe id="video1" style="display:none;" width="560" height="315" src="https://www.youtube.com/embed/sVTybJ3cNyo" title="Intro to the XRP Ledger" frameborder="0" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<a href="#" id="playvideo">
<img alt="XRPL logo with play button surrounded with image bubbles of various people" src="./assets/img/overview/video_explainer_intro@2x.png" id="xrpl-overview-video-intro" class="w-100 video-image">
</a>
<div class="text-center d-lg-none">
<a class="btn btn-primary btn-arrow mt-5 mb-4" href="docs.html">{% trans %}Read Technical Docs{% endtrans %}</a> <a class="ml-4 video-external-link" target="_blank" href="https://www.youtube.com/playlist?list=PLJQ55Tj1hIVZtJ_JdTvSum2qMTsedWkNi">{% trans %}Watch Explainer Videos {% endtrans %}</a>
</div>
</div>
</div>
</section>
<section class="container-new py-26">
<div class="card-grid card-grid-2xN">
<div class="col">
<div class="d-flex flex-column-reverse">
<h2 class="h4 h2-sm mb-8">{% trans %}How the Consensus Protocol works{% endtrans %}</h2>
<h6 class="eyebrow mb-3">{% trans %}Consensus{% endtrans %}</h6>
</div>
<h5 class="longform mb-10">{% trans %}To uphold performance, XRPL uses a consensus protocol. Designated servers called <a href="run-a-rippled-validator.html">validators</a>, which anyone can operate, come to an agreement on the order and outcome of XRP transactions every three to five seconds.{% endtrans %}</h5>
<p class="mb-6">{% trans %}All servers in the network process each transaction according to the same rules, and any transaction that follows the protocol is confirmed right away. All transactions are public, and strong cryptography guarantees the integrity of the system.{% endtrans %}</p>
<p class="mb-0">{% trans %}Currently, over 120 <a href="https://livenet.xrpl.org/network/validators" target="_blank">validators</a> are active on the ledger, operated by universities, exchanges, businesses, and individuals. As the validator pool grows, the consensus protocol ensures decentralization of the blockchain over time.{% endtrans %}</p>
</div>
<div class="col mb-16-sm">
<img class="mw-100" id="validator-graphic" alt="(Graphic: Validators in Consensus)">
</div>
</div>
</section>
<section class="container-new py-26">
<div class="col-md-6 offset-md-3 p-6-sm p-10-until-sm br-8 cta-card">
<img alt="" src="./img/backgrounds/cta-xrpl-overview-green.svg" class="cta cta-bottom-right">
<div class="z-index-1 position-relative">
<h2 class="h4 mb-10-until-sm mb-8-sm">{% trans %}A Sustainable Blockchain{% endtrans %}</h2>
<p class="mb-10">{% trans %}Unlike most other blockchains, the XRP Ledger requires no mining and uses negligible energy, key to long-term growth and stability.{% endtrans %}</p>
<a class="btn btn-primary btn-arrow" href="impact.html">{% trans %}Learn More{% endtrans %}</a>
</div>
</div>
</section>
<section class="container-new py-26">
<div class="card-grid card-grid-2xN">
<div class="col">
<div class="d-flex flex-column-reverse">
<h4 class="h4 h2-sm mb-8">{% trans %}Building with confidence on <br class="until-sm"/> proven technology{% endtrans %}</h4>
<h6 class="eyebrow mb-3">{% trans %}XRPL Today{% endtrans %}</h6>
</div>
<h5 class="longform mb-10">{% trans %}With 10+ years of error-free functioning and enterprise companies as champions, XRPL has established reliability.{% endtrans %}</h5>
<p class="mb-10">{% trans %}With the XRPL, these developers are building innovative blockchain projects and applications across use cases including tokenization of assets, online gaming, asset custody, NFTs, and DeFi.{% endtrans %}</p>
<a class="btn btn-primary btn-arrow mb-10-sm" href="uses.html">{% trans %}Explore More{% endtrans %}</a>
</div>
<div class="col mb-0">
<div class="d-flex flex-column-reverse">
<h4 class="h4 h2-sm mb-8">{% trans %}Creating new value for long-term growth{% endtrans %}</h4>
<h6 class="eyebrow mb-3">{% trans %}XRPL Tomorrow{% endtrans %}</h6>
</div>
<h5 class="longform mb-10">{% trans %}As a community-led blockchain built for business, XRPL attracts companies and developers driven to solve real problems and generate real valuenow and into the future.{% endtrans %}</h5>
<p class="mb-0">{% trans %}Significant investment in development, along with low transaction costs and energy usage, is fueling growth and opening up a wide variety of use cases at scale.{% endtrans %}</p>
</div>
</div>
</section>
<section class="container-new py-26">
<div class="d-flex flex-column-reverse col-xl-6 mb-lg-4 pl-0 ">
<h2 class="h4 h2-sm">{% trans %}Watch the explainer video series to learn more about the XRP Ledger{% endtrans %}</h2>
<h6 class="eyebrow mb-3">{% trans %}Tune In{% endtrans %}</h6>
</div>
<div class="row row-cols-1 row-cols-lg-3 d-flex justify-content-between w-100 mx-0 mx-md-n3 mt-md-5">
<div class="px-md-3 pt-5 pt-md-0">
<a href="#" class="btn1" data-url="https://www.youtube.com/embed/k6VqEkqRTmk?rel=0&amp;showinfo=0&amp;autoplay=1">
<img alt="Two Monitors with person image bubbles inside, facing each other with a play button in between" src="./assets/img/overview/video_explainer_consensus@2x.png" id="xrpl-overview-video-consensus" class="w-100 video-image">
</a>
<div class="mt-2">
<h4 class="video-title mt-3 mb-0">{% trans %}The Consensus Mechanism{% endtrans %}</h4>
</div>
</div>
<div class="px-md-3 pt-5 pt-md-0">
<a href="#" class="btn1" data-url="https://www.youtube.com/embed/JjaVDXPqnbA?rel=0&amp;showinfo=0&amp;autoplay=1">
<img alt="graphlike background with play button in center" src="./assets/img/overview/video_explainer_nodes@2x.png" id="xrpl-overview-video-nodes" class="w-100 video-image">
</a>
<div class="mt-2">
<h4 class="video-title mt-3 mb-0">{% trans %}Nodes and Validators{% endtrans %}</h4>
</div>
</div>
<div class="px-md-3 pt-5 pt-md-0">
<a href="#" class="btn1" data-url="https://www.youtube.com/embed/WsmldDNGQ9s?rel=0&amp;showinfo=0&amp;autoplay=1">
<img alt="A globe graph with a play button in center" src="./assets/img/overview/video_explainer_sustainability@2x.png" id="xrpl-overview-video-sustainability" class="w-100 video-image">
</a>
<div class="mt-2">
<h4 class="video-title mt-3 mb-0">{% trans %}Sustainability of the XRP Ledger{% endtrans %}</h4>
</div>
</div>
</div>
<div class="pt-5 w-100">
<a class="btn btn-primary btn-arrow" target="_blank" href="https://www.youtube.com/channel/UC6zTJdNCBI-TKMt5ubNc_Gg">{% trans %}Watch Full Series on YouTube{% endtrans %}</a>
</div>
</section>
<section class="container-new py-26">
<div class="col-md-6 offset-md-3 p-6-sm p-10-until-sm br-8 cta-card">
<img alt="" src="./img/backgrounds/cta-xrpl-overview-orange.svg" class="cta cta-bottom-right">
<div class="z-index-1 position-relative">
<h4 class="h4 mb-10-until-sm mb-8-sm">{% trans %}Tomorrows Blockchain Starts With You{% endtrans %}</h4>
<p class="mb-10">{% trans %}XRP Ledgers innovation relies on the shared community experience of builders like you. If youre ready to start your next big blockchain project, explore the XRPL now and consider applying for funding on your next <a href='developer-funding.html'>blockchain project</a>.{% endtrans %}</p>
<a class="btn btn-primary btn-arrow" href="https://xrplgrants.org/" target="_blank">{% trans %}Explore XRPL Developer Funding{% endtrans %}</a>
</div>
</div>
</section>
<section class="container-new py-26">
<div class="col-md-6 offset-md-3 w-100 pl-0 pr-0 mini-faq" id="minifaq-accordion">
{% set faqs = [
{ "question": _("Is XRPL a private blockchain, owned by Ripple?"),
"answer": _("No, the XRP Ledger is a decentralized, public blockchain. Any changes that would impact transaction processing or consensus need to be approved by at least 80%% of the network. Ripple is a contributor to the network, but its rights are the same as those of other contributors. In terms of validation, there are 150+ validators on the network with 35+ on the Unique Node List (see “What are Unique Node Lists (UNLs)?” in the Full FAQ) — Ripple runs 6 of these nodes.") },
{ "question": _("Isnt Proof of Work the best validation mechanism?"),
"answer": _("Proof of Work (PoW) was the first mechanism to solve the double spend problem without requiring a trusted 3rd party. However the XRP Ledgers consensus mechanism solves the same problem in a far faster, cheaper and more energy efficient way.") },
{ "question": _("How can a blockchain be sustainable?"),
"answer": _("Its been widely reported that Bitcoins energy consumption, as of 2021, is equivalent to that used by Argentina, with much of the electricity Bitcoin miners use coming from polluting sources. The XRP Ledger confirms transactions through a “consensus” mechanism - which does not waste energy like proof of work does - and leverages carbon offsets to be <a href='https://ripple.com/ripple-press/ripple-leads-sustainability-agenda-to-achieve-carbon-neutrality-by-2030/' target='_blank'>one of the first truly carbon neutral blockchains</a>.") },
] %}
{% for faq in faqs %}
<div class="q-wrapper">
<a href="#heading{{loop.index}}" class="expander collapsed" data-toggle="collapse" data-target="#answer{{loop.index}}" aria-expanded="false" aria-controls="answer{{loop.index}}">
<h4 id="heading{{loop.index}}">
{{faq.question}}
<span class="chevron"><span></span><span></span></span>
</h4>
</a>
<div id="answer{{loop.index}}" class="answer-wrapper collapse" aria-labelledby="heading{{loop.index}}">
<p>{{faq.answer}}</p>
</div><!--/.answer-wrapper {{loop.index}} -->
</div>
{% endfor %}
<center>
<a class="btn btn-primary btn-arrow mt-20" href="faq.html">{% trans %}View Full FAQ{% endtrans %}</a>
</center>
</div>
</section>
</div>
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Splash Page",
"page_group": "About"
})
</script>
{% endblock analytics %}

View File

@@ -1,43 +0,0 @@
{% extends "base.html.jinja" %}
{% block mainclasses %}landing landing-children padded-main{% endblock %}
{% block main %}
{% if content %}
<section class="p-0">
<article class="content">
{{ content }}
{% set show_blurbs = True %}
{% set depth= 1 %}
{% include 'children.html' %}
</article>
</section>
{% else %}
<section class="p-0">
<article class="content">
<h1 id="main-page-header">{{ currentpage.name }}</h1>
{% if currentpage.blurb != target.blurb %}<p class="blurb">{{ currentpage.blurb }}</p>{% endif %}
{% set show_blurbs = True %}
{% set depth= 1 %}
{% include 'children.html' %}
</article>
</section>
{% endif %}
{% endblock %}
{% block analytics %}
{% from "macro-get_funnel.jinja" import get_funnel %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Hub Page",
"page_group": "Docs",
"page_funnel": "{{get_funnel(pages, currentpage)}}",
"page_labels": {{currentpage.labels or []}}
})
</script>
{% endblock analytics %}

View File

@@ -1,73 +0,0 @@
{% extends "base.html.jinja" %}
{% block head %}
<!-- expandable code samples -->
<script src="{{currentpage.prefix}}assets/js/expandcode.js"></script>
<!-- multi-code selection tabs -->
<script src="{{currentpage.prefix}}assets/js/multicodetab.js"></script>
<!-- copy code button -->
<script src="https://cdn.jsdelivr.net/npm/clipboard@2.0.8/dist/clipboard.min.js"></script>
<script>
$(document).ready(function() {
$(".multicode").minitabs();
make_code_expandable();
new ClipboardJS('.clipboard-btn');
});
</script>
{% endblock %}
{% block main %}
<article>
{% if (target.lang != "en" and "en" in currentpage.targets) or currentpage.untranslated_warning %}
{# Add a "sorry this page isn't translated" banner. #}
<div class="mb-5 devportal-callout note"><strong>{% trans %}Sorry, this page is not available in your language.{% endtrans %}</strong>
<p class="mb-0">{% trans %}We are making an effort to offer the XRP Ledger Dev Portal in a variety of languages, but not all pages are available in all languages. If you'd like to help, <a href="https://github.com/XRPLF/xrpl-dev-portal/blob/master/CONTRIBUTING.md">please contribute!</a>{% endtrans %}</p>
</div><!--/.devportal-callout-->
{% endif %}
{% if target.lang != "en" and currentpage.outdated_translation %}
{# Add a "This translation is not up-to-date." banner. #}
<div class="mb-5 devportal-callout note"><strong>{% trans %}This translated page is not updated to match the latest changes in the English version.{% endtrans %}</strong>
<p class="mb-0">{% trans %}We are making an effort to offer the XRP Ledger Dev Portal in a variety of languages, but not all translated contents are up-to-date. If you'd like to help, <a href="https://github.com/XRPLF/xrpl-dev-portal/blob/master/CONTRIBUTING.md">please contribute!</a>{% endtrans %}</p>
</div><!--/.devportal-callout-->
{% endif %}
<div class="content">
{{ content }}
</div>
</article>
{% include 'component-feedback-widget.html.jinja' %}
{% endblock %}
{% block right_sidebar %}
<a class="with-caret expander collapsed d-lg-none" id="toc-expander" role="button" data-toggle="collapse" data-target="#page-toc-wrapper" aria-expanded="false">
Page Toolbar
<span class="chevron"><span></span><span></span></span>
</a>
<div id="page-toc-wrapper" class="collapse d-lg-block">
{% include 'component-github-edit.html.jinja' %}
{% include 'component-label-list.html.jinja' %}
<div class="toc-header">
<h4>{% trans %}In this document{% endtrans %}</h4>
</div>
<ul class="page-toc nav flex-column" role="directory">
{% for h in headers %}{% if h.level < 4 %}
<li class="nav-item level-{{h.level}}"><a class="nav-link" href="#{{h.id}}">{{h.text}}</a></li>
{% endif %}{% endfor %}
</ul>
</div>
{% endblock %}
{% block analytics %}
{% from "macro-get_funnel.jinja" import get_funnel %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Document",
"page_group": "Docs",
"page_funnel": "{{get_funnel(pages, currentpage)}}",
"page_labels": {{currentpage.labels or []}}
})
</script>
{% endblock analytics %}

View File

@@ -1,49 +0,0 @@
{% extends "base.html.jinja" %}
{% block mainclasses %}landing landing-children padded-main{% endblock %}
{% block main %}
<section class="content">
{% if content %}
{{ content}}
{% else %}
<h1 id="main-page-header">Label: {{ currentpage.name }}</h1>
{% if currentpage.blurb %}<p class="blurb">{{currentpage.blurb}}</p>{% endif %}
{% endif %}
{% for cat in ["concepts.html", "tutorials.html", "references.html"] %}
{% set catpg = pages|selectattr("html", "eq", cat)|first %}
{% set cat_lbl_pgs = children_with_label(pages, catpg, currentpage.landing_for) %}
{% if cat_lbl_pgs %}
<div class="curated-links">
<h3>{{catpg.name}}</h3>
<ul>
{% for page in cat_lbl_pgs %}
<li class="level-1">
<span class="pg-category">{{(pages|selectattr("html", "eq", page.parent)|first).name}}</span>
<a href="{% if "//" not in page.html %}{{currentpage.prefix}}{% endif %}{{page.html}}">{{page.name}}</a>
<p class="blurb child-blurb">{{page.blurb}}</p>
</li>
{% endfor %}
<ul>
</div>
{% endif %}
{% endfor %}
</section>
{% endblock %}
{% block endbody %}
{% include 'component-feedback-widget.html.jinja' %}
{% endblock %}
{% block analytics %}
<script type="application/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
"event": "page_info",
"page_type": "Hub Page",
"page_group": "Docs",
"page_labels": ["{{currentpage.landing_for}}"]
})
</script>
{% endblock analytics %}

View File

@@ -1,14 +0,0 @@
{% extends "base.html.jinja" %}
{% block head %}
<meta http-equiv="refresh" content="0;url={{currentpage.redirect_url}}" />
{% endblock %}
{% block main %}
<article class="pt-3 p-md-3">
<div class="content">
<p>This page has been moved! You should be redirected automatically. If not, <a href="{{currentpage.redirect_url}}">click here to go to the new {{currentpage.name}} page</a>.
</div>
</article>
{% endblock %}

View File

@@ -1,43 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width">
<title>{{ currentpage.name }} - {{target.display_name}}</title>
<!-- favicon -->
<link rel="icon" href="favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<script src="{{currentpage.prefix}}assets/vendor/jquery-3.7.1.min.js"></script>
<link href="{{currentpage.prefix}}assets/css/devportal2021.css" rel="stylesheet" />
{% block head %}
{% endblock %}
</head>
<body class="xrp-ledger-dev-portal {% if currentpage.sidebar is undefined or currentpage.sidebar != "disabled" %}sidebar-primary {% endif %}{% block bodyclasses %}{% endblock %}">
<div class="container-fluid" role="document" id="main_content_wrapper">
<div class="row">
<main class="main {% if currentpage.sidebar is defined and currentpage.sidebar == "disabled" %}col-md-12{% else %}col-md-7 col-lg-6{% endif %} order-md-3 {% block mainclasses %}{% endblock %}" role="main" id="main_content_body">
{{ content }}
</main>
</div>
</div>
<footer>(Exported {{ current_time }})</footer>
<!-- Non-blocking resources -->
<!-- Bootstrap JS -->
<script src="{{currentpage.prefix}}assets/vendor/bootstrap.min.js"></script>
<!-- fontawesome icons -->
<link rel="stylesheet" href="{{currentpage.prefix}}assets/vendor/fontawesome/css/font-awesome.min.css" />
</body>
</html>

View File

@@ -1,5 +0,0 @@
User-agent: *
Disallow:
Sitemap: http://www.xrpl.org/sitemap.txt

View File

@@ -1,4 +0,0 @@
{% for page in pages -%}
{%- if page.html is defined and page.html != "sitemap.txt" and "//" not in page.html -%}
https://xrpl.org/{{page.html}}
{% endif %}{% endfor %}

View File

@@ -1,369 +0,0 @@
# Interactive Tutorials
The site has code to aid development of interactive tutorials that connect to the live XRP Ledger (Mainnet, Testnet, or Devnet). This document explains how to use that code to create an interactive tutorial. **Note: This doc has been mostly updated to describe how the existing interactive tutorials work under Redocly, but the next phase of interactive tutorials will be different.**
## Limitations
Interactive Tutorials are intended to demonstrate interactivity with the XRP Ledger from in-browser code. They have some limitations and requirements, as follows:
- The actual code that runs in the interactive tutorial is JavaScript, because web browsers don't run other programming languages natively. Also, you can't use JavaScript functionality that's native to Node.js but not web browsers, such as `require("module")`. (Sometimes there are "shims" that imitate the Node.js behavior in the browser for these sorts of things, but that's more work.)
- You _can_ still provide examples of the equivalent code in other programming languages. The actual code that runs has some differences than your example JavaScript code anyway because the actual code has to interact with the interactive tutorial's user interface: buttons, HTML outputs, etc.
- The functionality you want to demonstrate has to be available on a public ledger and from the public API, whether that's Mainnet, Testnet, or Devnet. You can't make interactives for features that aren't enabled on a test network, or that require admin permissions.
- If the tutorial involves sending transactions, you need to use a test network and probably the faucet to get credentials. You should not try to send Mainnet transactions because that would require a secret key that holds actual, valuable XRP.
- If the tutorial requires certain objects to exist in the ledger (other than an account you can get from the Testnet faucet) you should either set those objects up on Mainnet in such a way that they'll never get removed, or be prepared to re-create them on the test network.
- As a best practice, don't call the faucet unless the user interacts with the page by clicking a button or something. Otherwise, web crawlers and things just loading the page end up draining the faucet pretty quickly.
## Memos
Transactions sent from interactive tutorials automatically attach a memo indicating what button of which tutorial sent the memo. Anyone who is watching Testnet/Devnet transactions can look for these memos to see when people are using the tutorials.
The memo is identified by a `MemoType` that decodes to the URL of this document:
```
MemoType (hex):
68747470733A2F2F6769746875622E636F6D2F5852504C462F7872706C2D6465762D706F7274616C2F626C6F622F6D61737465722F746F6F6C2F494E5445524143544956455F5455544F5249414C535F524541444D452E6D64
MemoType (ASCII-decoded):
https://github.com/XRPLF/xrpl-dev-portal/blob/master/tool/INTERACTIVE_TUTORIALS_README.md
```
The memo has a `MemoFormat` value of `6170706C69636174696F6E2F6A736F6E` (hex), which represents the MIME type `application/json`.
The memo has a `MemoData` field which is ASCII-encoded JSON containing the following data:
| Field | Type | Contents |
|---|---|---|
| `path` | String | The `window.location.pathname` of the tutorial. For example, `/send-xrp.html`. |
| `button` | String | The unique html ID of the button that triggered this transaction. For example, `submit-button`. |
| `step` | String (Number) | The step number that contained the button to trigger this transaction. For example, `"1"`. The first interactive block is step 1 (they are not 0-indexed). |
| `totalsteps` | String (Number) | The total number of interactive blocks in the tutorial that triggered this transaction. Not all steps of an interactive tutorial involve sending transactions, but all steps are counted. |
For privacy reasons, the memo does not and MUST NOT include personally identifying information about the user or their browser.
**Note:** The interactive tutorial code assumes that the path and ID are both possible to encode with plain ASCII, so please avoid using non-ASCII characters in the IDs and filenames.
## Recommended Process
An interactive tutorial is a page, so you add it to the `dactyl-config.yml` page like any other page. However, you need to add the following pieces to make the interactive stuff work:
1. Set page properties, either in the config file or the page's frontmatter. You need to include an array of step names as the `steps` parameter in the frontmatter
blurb: Use Tickets to send a transaction outside of normal Sequence order.
steps: ['Generate', 'Connect', 'Configure Issuer', 'Wait (Issuer Setup)', 'Configure Hot Address', 'Wait (Hot Address Setup)', 'Make Trust Line', 'Wait (TrustSet)', 'Send Token', 'Wait (Payment)', 'Confirm Balances']
The `steps` list must exactly match the list of step labels in the tutorial. Start with some steps you know you'll have like 'Generate' and keep the frontmatter updated as you add more.
The `interactive_steps` filter is no longer needed under Redocly.
2. For the tutorial, you're going to create (at least) two JavaScript files:
- **Example Code:** The example code that you'll display on the page. You want to make sure it actually runs correctly as shown to the user, after all. You should start by making this one. You should save this file as `_code-samples/{YOUR TUTORIAL}/{YOUR TUTORIAL}.js`.
- **Interactive Code:** A modified version of the same code that will actually run, and also interact with the user interface in the browser itself. You should adapt this one from the other version after you get the other one working. While working on this version, remember to backport any changes that are also applicable to the example code version. You should save this file as `static/js/tutorials/{YOUR_TUTORIAL}.js`.
3. Start working on the Example Code file first.
Rather than starting with empty example code, you copy and adapt one of the existing code samples, such as [Send XRP](../_code-samples/send-xrp/). For this, you can just open the `demo.html` directly in your browser and use the developer console; you can see your changes immediately after refreshing the page.
4. When you have working sample code, break it down into logical steps. Then, write the actual prose of the tutorial, with descriptions of each step.
Use excerpts of the example code to demonstrate each step. You can gloss over certain parts of the sample code if they're tangential to the goal of the tutorial, like the nitty-gritty of getting credentials from the Testnet faucet.
This is where `{% code-snippet %}` comes in really handy. You can pull in just an excerpt of a code sample based on starting and following bits (it goes up to but does not include the section you specify with `before`). For example:
```markdoc
{% tab label="JavaScript" %}
{% code-snippet file="/_code-samples/trade-in-the-decentralized-exchange/js/trade-in-the-dex.js" from="// Get credentials" before="// Define the proposed trade" language="js" /%}
{% /tab %}
```
Both `from` and `before` are optional; if you omit them, it'll all the way from the start of the file to the end. Tabs are also optional, but recommended if you have code in multiple languages.
5. Figure out what an interactive version of the tutorial looks like and where the user might interact with key steps.
Understanding [Bootstrap forms code](https://getbootstrap.com/docs/4.0/components/forms/) and [jQuery](https://api.jquery.com/) will help you get a better sense of what's more or less feasible to do. For some tutorials, the only user interaction may be clicking a button and looking at some output in each step. Giving the user some choices and freedom adds a bit of "wow" factor and can also be more educational because users can try it again and see how things turn out differently.
Just keep in mind, you're not building an entire app, you're just providing a demo.
6. Write the interactive code, embedding interactive blocks in each step of the tutorial near the code samples that do roughly the same thing.
## How to Use the Interactive Bits
To run your custom interactive code on your tutorial page, add scripts tag to the Markdown content of the page you're writing. Conventionally, this can be under the "Prerequisites" heading of the tutorial, but it's mostly invisible to the user so it can go almost anywhere.
The two files you should include are the shared interactive tutorials code, and the specific code for your tutorial. For example:
```html
<!-- Source for this tutorial's interactive bits: -->
<script type="application/javascript" src="/js/interactive-tutorial.js"></script>
<script type="application/javascript" src="/js/tutorials/use-tickets.js"></script>
```
### Starting Snippets
There are also snippets that handle some of the most generic and repeated parts of the tutorials.
For many tutorials, the first two steps are going to be "Connect to the Testnet" and "Get Credentials". The snippets for these are:
```markdoc
{% partial file="/docs/_snippets/interactive-tutorials/generate-step.md" /%}
```
```
{% partial file="/docs/_snippets/interactive-tutorials/connect-step.md" /%}
```
### Interactive Blocks
In your Markdown file, you'll use a Markdoc component to encapsulate the interactive code sections. By convention, it looks like this, though all the HTML is optional:
```markdoc
{% interactive-block label="Step Name" steps=$frontmatter.steps %}
<button id="your-button-id" class="btn btn-primary previous-steps-required">Click this button</button>
{% loading-icon message=" Doing stuff..." /%}
<div class="output-area"></div>
{% /interactive-block %}
```
**Warning:** It won't work right if you don't leave empty lines between the HTML tags and the Markdoc tags (`{% %}`).
Things you'll want to customize for each section:
- Each step name (`Step Name` in this example) must be unique within the page. It's used in the interactive tutorial breadcrumbs, so it's best if it's short (one or two words). The names `Connect` and `Generate` are taken by their respective snippets.
- The button can have whatever message you want on it (like `Click this button`).
- The class `previous-steps-required` causes the button to be disabled until the previous step in the tutorial has been marked as complete, and provides a tooltip on the disabled button while it's disabled.
- You can instead use the class `connection-required`; this allows the user to do this step at any time as long as they're already connected to the ledger, so they can skip ahead to this step. Don't use both that and `previous-steps-required` on the same button.
- Usually you want to give each button a unique ID (like `your-button-id`). This is how you refer to the button in your JavaScript code.
- The loading message (`Doing stuff...`) is hidden by default (that's what the `collapse` class does) but you can show it when you start something that might take a while, like querying or sending a network request, and then hide it again when the thing is done.
- The empty output-area div is where you'll write the results of doing whatever the step does. By convention, you shouldn't put anything in it since most of the example functions wipe its contents as the first thing they do.
- You can put other custom interactive stuff in the block as needed, usually above the loader and output area.
### The Wait Snippet
If you have a step in your tutorial where you wait for a transaction to get validated, the "Wait" snippet is there for you. The "Wait" snippet should be used like this:
```markdoc
{% partial file="/docs/_snippets/interactive-tutorials/wait-step.md" /%}
```
If you have multiple "Wait" steps, you need to give each one a unique name. To do that:
```markdoc
{% partial file="/docs/_snippets/interactive-tutorials/wait-step.md" variables={label: "Wait (again)"} /%}
```
### Step Code
The custom JavaScript code for your interactive tutorial should be wrapped in a function that runs it when the whole page is loaded, like this:
```js
window.onRouteChange(() => {
// Your code here
})
```
**Warning:** Don't use `$(document).ready(() => {...})`. That callback doesn't work properly under Redocly/React.
Inside that block, the code for each individual block tends to follow a pattern: you make event handlers for the ways users should interact with the buttons and things in each step. Within the handlers, you can use the event to identify the block so that most of the code is very familiar. The following example is pulled from the "Use Tickets" interactive tutorial, with extra comments added to clarify the various pieces.
```js
// 7. Check Available Tickets --------------------------------------------------
// create and bind a handler to a mouse click on the button with ID "check-tickets"
$("#check-tickets").click( async function(event) {
// Use jQuery to find the interactive block that contains the button that
// triggered this event, so we can do stuff within it. You can use this as-is
// in basically every handler.
const block = $(event.target).closest(".interactive-block")
// Get the address from the "Generate" step snippet, or display an error and
// quit out of this handler if it hasn't been run successfully yet.
// There's also a get_wallet(event) function which works the exact same way,
// but returns a Wallet instance.
const address = get_address(event)
if (!address) {return}
// Wipe previous output in this interactive block.
block.find(".output-area").html("")
// Show the loader animation and text while we wait for the next commands to
// finish.
block.find(".loader").show()
// Make a call using xrpl.js. The "api" is a Client instance provided by
// the "Connect" step snippet.
let response = await api.request({
"command": "account_objects",
"account": address,
"type": "ticket"
})
// Hide the loader animation. If you called any commands that can error out,
// don't forget to hide the loader in the error handling case, too. It's safe
// to call this even if the loader is already hidden; if so, it does nothing.
block.find(".loader").hide()
// Display the output of the call in the interactive block for the user's
// benefit. The pretty_print() helper function handles indentation and can
// take either a JSON-like object or a string containing serialized JSON.
// If you use .html() this will replace the contents of the output area; to
// add to it without resetting it, use .append() instead.
block.find(".output-area").html(
`<pre><code>${pretty_print(response)}</code></pre>`)
// This particular step sets up a set of clickable "radio buttons" in the
// following step based on the results of the query. So ticket-selector is
// the ID of an element in the next interactive block's HTML bits.
// Wipe any previous output from the ticket selector area
$("#ticket-selector .form-area").html("")
// For each ticket from the response, add a radio button to the ticket
// selector area.
response.result.account_objects.forEach((ticket, i) => {
$("#ticket-selector .form-area").append(
`<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" id="ticket${i}"
name="ticket-radio-set" value="${ticket.TicketSequence}">
<label class="form-check-label"
for="ticket${i}">${ticket.TicketSequence}</label></div>`)
})
// This marks the current step as complete. It adds a checkbox to the
// breadcrumbs at the top of each interactive block, and highlighting the next
// step. It also enables any buttons and things that have the
// "previous-steps-required" class.
// The name of the step has to exactly match the value passed to start_step()
// in the Markdown file.
// In this example, the step is complete when we're done processing the
// results of the #check-tickets button. Depending on your tutorial, you may
// wait to mark the step as complete until other things have happened.
complete_step("Check Tickets")
})
```
### All-in-one Transaction Sending
One common pattern is that a step is sending a transaction from the account whose credentials you generated in the "Generate" step. There's a helper function for that. But first, you have to set up the interactive block in your Markdown file. Here's an example:
```markdoc
{% interactive-block label="Send AccountSet" steps=$frontmatter.steps %}
<button id="send-accountset" class="btn btn-primary previous-steps-required" data-wait-step-name="Wait">Send AccountSet</button>
{% loading-icon message="Sending..." /%}
<div class="output-area"></div>
{% /interactive-block %}
```
Most parts—the start and end, loader, and output area—are exactly the same. But notice that the button has a new attribute: `data-wait-step-name="Wait"`. This basically is storing some information for the JavaScript code to use, and it tells it where to output the results of the transaction, in the form of a step using the "Wait Step" snippet, as described above. The value of the attribute is the exact name of the step, which (remember) has to be unique for each one. So if your tutorial involves sending multiple transactions, the first one might have its outcome displayed in a "Wait" step, and the other one might be in the "Wait Again" step, and so on. Usually the relevant wait step is the one immediately after the current step.
The JavaScript for this example looks like the following:
```js
// 3. Send AccountSet --------------------------------------------------------
$("#send-accountset").click( (event) => {
const address = get_address()
if (!address) {return}
generic_full_send(event, {
"TransactionType": "AccountSet",
"Account": address,
"SetFlag": 1 // RequireDest
})
complete_step("Send AccountSet")
})
```
For any step that involves sending a transaction, you can use this exact same pattern, just changing the appropriate parts of the code:
- The ID of the button that triggers the send (`send-accountset`).
- The transaction instructions to submit, as appropriate for your tutorial.
- The name of this step to mark complete after submitting the transaction.
The `generic_full_send(event, transaction)` function handles the rest, including all of the following:
1. Getting the relevant secret key as generated by the "Generate" snippet.
2. Showing this block's loader while stuff is happening and hiding it when done.
3. Preparing the transaction, filling in the auto-fillable fields like `Sequence`, `Fee`, and `LastLedgerSequence`.
4. Signing the transaction.
5. Submitting the transaction.
6. Displaying the preliminary results from preparing/signing/submitting in the current interactive block's output area.
7. Updating the relevant "Wait" step (as defined in the attribute of the HTML on the button that triggered the event) to show the transaction's identifying hash, the relevant ledger indexes to know when it might have expired, and the final result when one is available. It also adds a link to the appropriate (Testnet/Devnet/Mainnet) explorer if the final result is validated by consensus.
8. Marking the related "Wait" step as complete when the transaction has a final result.
### Generic Submit Only
For some tutorials, you might break up the steps of preparing and signing a transaction from the step where you submit it. In those cases, you can use a generic submit button handler provided by the interactive tutorials code. The block in the Markdown looks like this:
```markdoc
{% interactive-block label="Submit" steps=$frontmatter.steps %}
<button id="ticketcreate-submit" class="btn btn-primary previous-steps-required" data-tx-blob-from="#tx_blob" data-wait-step-name="Wait">Submit</button>
<div class="output-area"></div>
{% /interactive-block %}
```
There are _two_ data attributes that are important here:
- `data-wait-step-name="Wait"` is just like in All-in-One Transaction Sending. It's the unique name of the "Wait" step where to display the transaction's results.
- `data-tx-blob-from="#tx_blob"` tells the submit function where to find the transaction blob to submit, in the form of a [jQuery selector](https://api.jquery.com/category/selectors/). Usually this will be the ID of an element created or filled in by your JavaScript in a previous step. The generic submit handler finds the first element matching that selector and reads the text it contains ([`.text()`](https://api.jquery.com/text/#text)) to get the blob (as hexadecimal).
The JavaScript code for this is as follows:
```js
$("#ticketcreate-submit").click( submit_handler )
```
The generic submit handler does all the following:
1. Showing this block's loader while stuff is happening and hiding it when done.
2. Submitting the transaction.
3. Displaying the preliminary results from submitting in the current interactive block's output area.
4. Updating the relevant "Wait" step (as defined in the attribute of the HTML on the button that triggered the event) to show the transaction's identifying hash, the relevant ledger indexes to know when it might have expired, and the final result when one is available. It also adds a link to the appropriate (Testnet/Devnet/Mainnet) explorer if the final result is validated by consensus.
5. Marking the related "Wait" step as complete when the transaction has a final result.
### Other Bits
There are several other functions provided by the [interactive-tutorial.js](../static/js/interactive-tutorial.js) file that may be useful for certain things; for the full details on all of them, read the source. A brief summary of what you can use:
- Check if a step is complete (by name or by ID)
- Get the ID of a step that contains a given HTML element (like the one that triggered an event). You can use this to write an event handler that can process multiple different buttons similarly.
- Mark a step as complete (by name or ID)
- Pretty-print JSON
- Display an nicely-formatted error message in a given block
- Get the address or secret from the Generate step (and display an error if they aren't there yet)
- Call the Testnet/Devnet faucet to get credentials, or to send XRP to a specific address.
- Submit a transaction (all-in-one, submit only, or a full submit button handler)
There's also some translation stuff, but it's not ready to be used outside of that file yet.
## Examples
- **Send XRP** - The original interactive tutorial. (Much improved since its inception.) Uses `{% code-snippet %}` to pull in the Example Code from an HTML file that also work as a stand-alone.
- [Markdown](../docs/tutorials/get-started/send-xrp.md)
- [Example Code](../_code-samples/send-xrp/)
- [Interactive Code](../static//js/tutorials/send-xrp.js)
- **Use Tickets** - A fairly detailed case with some advanced interactions.
- [Markdown](../docs/tutorials/manage-account-settings/use-tickets.md)
- Example code is inlined in the Markdown file.
- [Interactive Code](../static/js/tutorials/use-tickets.js)
- **Require Destination Tags** - A relatively small and simple tutorial.
- [Markdown](../docs/tutorials/manage-account-settings/require-destination-tags.md)
- [Example Code](../_code-samples/require-destination-tags/)
- [Interactive Code](../static/js/tutorials/require-destination-tags.js)
- **Monitor Incoming Payments with WebSocket** - An interactive tutorial that doesn't use xrpl.js.
- [Markdown](../docs/tutorials/get-started/monitor-incoming-payments-with-websocket.md)
- [Example Code (incomplete)](../_code-samples/require-destination-tags/). The rest is inlined in the Markdown file.
- The interactive code is inlined in the Markdown file.

View File

@@ -1,80 +0,0 @@
#!/bin/bash
mkdir -p out
rm -r out
# Pass forward dactyl "vars" arg if provided
if [ "$1" == "--vars" ] && [ -n "$2" ];
then
dactyl_vars=$2
shift 2
fi
linkerrors=0
builderrors=0
# Build language-based targets all together first
langs=(en ja)
for lang in ${langs[*]}; do
echo "======================================="
echo "Building language: en"
if [ "$lang" == "en" ]; then
if [ -n "$dactyl_vars" ]; then
dactyl_build -q -t "$lang" --vars "$dactyl_vars"
else
dactyl_build -q -t "$lang"
fi
else
if [ -n "$dactyl_vars" ]; then
dactyl_build -q -t "$lang" -o "out/$lang" --vars "$dactyl_vars"
else
dactyl_build -q -t "$lang" -o "out/$lang"
fi
fi
buildresult=$?
if [ $buildresult -ne 0 ]; then
builderrors=$(($buildresult + $builderrors))
echo "Error building this target; link checker may miss things."
fi
done
# Check language targets all at once
dactyl_link_checker -q "$@"
linkerrors=$(($? + $linkerrors))
# Build & check other targets individually afterwords
other_targets=`dactyl_build -lq | awk '/^(en|ja) / {next;} {print $1}'`
while read -r line; do
echo ""
echo "======================================="
echo "Checking Target: $line"
rm -r out
if [ -n "$dactyl_vars" ]; then
dactyl_build -q -t "$line" --vars "$dactyl_vars"
else
dactyl_build -q -t "$line"
fi
buildresult=$?
if [ $buildresult -eq 0 ]
then
dactyl_link_checker -q "$@"
linkerrors=$(($? + $linkerrors))
else
builderrors=$(($buildresult + $builderrors))
echo "Error building this target; skipping link checker."
fi
done <<< "$other_targets"
totalerrors=$(($builderrors + $linkerrors))
echo ""
echo "======================================="
echo "======================================="
echo "All-target summary:"
echo "$builderrors build errors"
echo "$linkerrors link errors"
echo "-----------------------------"
echo " $totalerrors total errors"
echo ""
exit $totalerrors

File diff suppressed because it is too large Load Diff

View File

@@ -1,15 +0,0 @@
#!/bin/bash
## Run from the root directory of the repo to build all languages
## TODO: read the `-o` / `--out` argument and adapt it for non-en languages
# Pass forward dactyl "vars" arg if provided
if [ "$1" == "--vars" ] && [ -n "$2" ];
then
dactyl_vars=$2
shift 2
fi
set -e
dactyl_build --vars "$dactyl_vars"
dactyl_build -t ja -o out/ja --vars "$dactyl_vars"

View File

@@ -1,76 +0,0 @@
#!/usr/bin/env python
import os
import os.path
import ruamel.yaml
yaml = ruamel.yaml.YAML(typ="safe")
def should_include(fname):
"""
Return True if the given file/folder name should be checked.
Otherwise return False.
"""
if fname == "node_modules":
return False
if fname[:1] == "_":
return False
if ".git" in fname:
return False
return True
def list_mds(content_dir):
all_mds = []
for dirpath, dirnames, filenames in os.walk(content_dir, topdown=True):
dirnames[:] = [d for d in dirnames if should_include(d)]
filenames[:] = [f for f in filenames if should_include(f)]
for filename in filenames:
if filename[-3:] == ".md":
all_mds.append(os.path.relpath(os.path.join(dirpath,filename), content_dir))
return all_mds
def list_mds_in_dactyl_config(config_file):
with open(config_file, "r", encoding="utf-8") as f:
cfg = yaml.load(f)
# Config can contain the same file multiple times (e.g. variants across targets). De-dupe.
all_mds = list(set(pg["md"] for pg in cfg["pages"] if "md" in pg.keys()))
return all_mds
def report_mismatches(fs_mds, cfg_mds):
"""
Print a list of paths that aren't present in one or the other list
"""
fs_mds.sort()
cfg_mds.sort()
total_files = len(fs_mds)
total_pages = len(cfg_mds)
f_i = 0
p_i = 0
while f_i < total_files and p_i < total_pages:
fname = fs_mds[f_i]
pname = cfg_mds[p_i]
if fname == pname:
# print("Match:", fname)
f_i += 1
p_i += 1
elif fname < pname:
print("Missing from config:", fname)
f_i += 1
elif fname > pname:
print("Missing from filesystem:", pname)
p_i += 1
else:
print("Unexpected case:", fname, pname)
if __name__ == "__main__":
fs_mds = list_mds("./content/")
cfg_mds = list_mds_in_dactyl_config("dactyl-config.yml")
report_mismatches(fs_mds, cfg_mds)

View File

@@ -1,14 +0,0 @@
#!/bin/bash
PATTERNS=('<<<<<<<' '>>>>>>>')
#not including ====== because that can be used for markdown h1 syntax
n=0
for p in ${PATTERNS[@]}; do
g=`grep -R $p content/* | grep -v '^Binary file .* matches$'`
if [[ ! -z $g ]]; then
echo "Git merge conflict marker $p found: $g"
n=1
fi
done
exit $n

File diff suppressed because it is too large Load Diff

View File

@@ -1,511 +0,0 @@
from datetime import datetime
events = [
{
"name": "Hackathon: 2021",
"description": "Explore the exciting project submissions from the fall 2021 XRPL Hackathon that focused on the NFT and Hooks smart contract functionalities on the ledger.",
"type": "hackathon",
"link": "https://xrpl-hackathon-2021.devpost.com/project-gallery",
"location": "Virtual",
"date": "September 13-October 6, 2021",
"image": "Hackathons.png",
"end_date": "October 6, 2021",
},
{ "name": "XRPL Community Meetup: San Diego",
"description": "The first official Meetup hosted by the XRPL Community. Community members in Southern California gathered around a firepit and shared their experiences with the XRPL.",
"type": "meetup",
"link": "https://www.meetup.com/xrpl-community/events/281806645/",
"location": "San Diego, CA",
"date": "Saturday, November 20, 2021",
"image": "event-meetup-san-diego@2x.jpg",
"end_date": "November 20, 2021",
},
{ "name": "XRPL Community Meetup: Atlanta",
"description": "The inaugural Meetup in the Southeast region of the United States got community members excited to meet like-minded individuals in their area.",
"type": "meetup",
"link": "https://www.meetup.com/xrpl-community/events/281980446/",
"location": "Atlanta, GA",
"date": "Saturday, November 27, 2021",
"image": "event-meetup-alanta@2x.jpg",
"end_date": "November 27, 2021",
},
{ "name": "XRPL Community Meetup: San Francisco",
"description": "Community members in the Bay Area with diverse backgrounds in technology and beyond met in downtown San Francisco.",
"type": "meetup",
"link": "https://www.meetup.com/xrpl-community/events/281806676/",
"location": "San Francisco, CA",
"date": "Monday, November 29, 2021",
"image": "event-meetup-san-francisco@2x.jpg",
"end_date": "November 29, 2021",
},
{ "name": "XRPL Community Meetup: Miami",
"description": "One of the biggest Meetups held so far, this was the first of an ongoing series of local XRPL Community Meetup events in Miami. ",
"type": "meetup",
"link": "https://www.meetup.com/xrpl-community/events/281829463/",
"location": "Miami, FL ",
"date": "Thursday, December 9, 2021",
"image": "event-meetup-miami@2x.jpg",
"end_date": "December 8, 2022",
},
{ "name": "XRPL Community Meetup: Nashville",
"description": "Nashville-based members of the XRPL Community came together to network, learn, share ideas, and form new partnerships. ",
"type": "meetup",
"link": "https://www.meetup.com/xrp-ledger-nashville-community/events/282538189/",
"location": "Nashville, TN",
"date": "Saturday, December 18, 2021",
"image": "event-meetup-nashville@2x.jpg",
"end_date": "December 18, 2022",
},
{ "name": "NYC Meetup/Hackathon XRPL Celebration",
"id": "upcoming-xrpl-new-york",
"description": "The NYC/XRP community and Dev Null Productions cordially invites you to attend our 10th meetup, being held in celebration of the on-going XRPL Hackathon, at the unique and artistic TALS studio in Midtown Manhattan.",
"type": "meetup",
"link": "https://www.meetup.com/NYC-XRP/events/284485901/",
"location": "NYC, NY",
"date": "March 30, 2022",
"image": "event-meetup-new-york@2x.jpg",
"end_date": "March 30, 2022",
},
{ "name": "XRPL Community Meetup: London",
"id": "upcoming-xrpl-london",
"description": "Join for an evening of programming and networking with members of the XRPL Community in London, co-organised by Peerkat - the NFT platform for creators on the XRPL.",
"type": "meetup",
"link": "https://www.meetup.com/xrp-ledger-london-community/events/283536458/",
"location": "IDEALondon",
"date": "March 31, 2022",
"image": "event-meetup-london.png",
"end_date": "March 31, 2022",
},
{ "name": "XRPL Community Meetup: Toronto",
"id": "upcoming-xrpl-toronto",
"description": "Join us for our first Toronto meetup with an evening of programming and networking with other members of the XRP Ledger Community with special guests from the XUMM Wallet and ARK PLATES teams!",
"type": "meetup",
"link": "https://www.meetup.com/xrpl-toronto-community-meetup/events/284177188/",
"location": "Toronto",
"date": "March 31, 2022",
"image": "event-meetup-toronto@2x.jpg",
"end_date": "March 31, 2022",
},
{ "name": "XRPL Community Meetup: San Diego",
"id": "upcoming-xrpl-san-diego",
"description": "Get together with other San Diego-based members of the XRP Ledger Community to network and discuss all things XRPL! Join us for our second San Diego XRPL Meetup.",
"type": "meetup",
"link": "https://www.meetup.com/xrp-ledger-san-diego-community/events/284663355/",
"location": "San Diego, CA",
"date": "April 1st 2022",
"image": "event-meetup-san-diego@2x.jpg",
"end_date": "April 1, 2022",
},
{ "name": "XRPL Community Meetup: Irvine LA",
"id": "upcoming-xrpl-irvine",
"description": "Get together with other LA-based members of the XRP Ledger Community to network and discuss all things XRPL.",
"type": "meetup",
"link": "https://www.meetup.com/xrp-ledger-la-community-meetup/events/284824635/",
"location": "UC Irvine, CA",
"date": "April 3rd 2022",
"image": "event-meetup-irvine@2x.jpg",
"end_date": "April 2, 2022",
},
{ "name": "XRPL Community Meetup: Miami #2",
"id": "upcoming-xrpl-miami-2",
"description": "We're excited to host our second Miami meetup for XRP Ledger community members on April 6th from 6-8pm, featuring Marco Neri, Developer Advocate at Ripple, who will join us to give a presentation on the XRP Ledger.",
"type": "meetup",
"link": "https://www.meetup.com/xrp-ledger-miami-community/events/284463736/",
"location": "The LAB Miami, FL",
"date": "April 6th 2022",
"image": "event-meetup-miami@2x.jpg",
"end_date": "April 6, 2022",
},
{ "name": "Hackathon:<br />New Year, New NFT",
"id": "upcoming-xrpl-hackathon-new-year",
"description": "Build Functional NFTs that span across a full range of use cases.",
"type": "hackathon",
"link": "https://xrplnft2022.devpost.com/",
"location": "Virtual",
"date": "January 31 - March 14, 2022",
"image": "Hackathons.png",
"end_date": "March 14, 2022",
},
{ "name": "Hackathon: Creating Real World Impact",
"description": "Build apps to improve lives in the real world using any of the SDKs and APIs for the XRP Ledger.",
"type": "hackathon",
"link": "https://xrplimpact.devpost.com/",
"location": "Virtual",
"date": "May 26 - Jul 11, 2022",
"image": "Hackathons.png",
"end_date" : "July 11, 2022",
},
{ "name": "Conference:<br />Apex 2021",
"description": "View sessions from the Apex 2021 stages in Las Vegas and Tallinn.",
"type": "conference",
"link": "https://www.youtube.com/playlist?list=PLJQ55Tj1hIVZgnreb8ODgxJW032M9Z2XZ",
"location": "Las Vegas, Tallinn",
"date": "September 29-30, 2021",
"image": "Conference.png",
"end_date": "September 30, 2022",
},
{ "name": "Hackathon:<br />NFT Launch Party",
"description": "Build Functional NFTs that span across a full range of use cases.",
"type": "hackathon",
"link": "https://xrplnft.devpost.com/",
"location": "Virtual",
"date": "Oct 31 - Dec 12, 2022",
"image": "Hackathons.png",
"end_date": "December 12, 2022",
},
{ "name": "XRPL Zone @ Consensus",
"description": "XRPL Zone: your all-in-one location for creating and collaborating on XRP Ledger (XRPL) projects.",
"type": "zone",
"link": "https://xrplzone-consensus.splashthat.com/",
"location": "Austin, Texas",
"date": "April 27, 2023",
"image": "XRPLZone.png",
"end_date": "April 27, 2023"
},
{ "name": "XRPL Developer AMAs",
"description": "A chat with Crossmark about wallet development on the XRP Ledger!",
"type": "ama",
"link": "https://discord.com/invite/xrpl",
"location": "XRPL Developers Discord",
"date": "April 14, 2023",
"image": "AMAs.png",
"end_date": "April 14, 2023"
},
{ "name": "NFTs with xrp.cafe",
"description": "A cozy discussion with xrp.cafe about NFTs and the future of NFT infrastructure on the XRP Ledger.",
"type": "ama",
"link": "https://dev.to/ripplexdev/xrpcafe-ama-on-xrpl-developers-discord-36gp",
"location": "XRPL Developers Discord",
"date": "January 1, 2023",
"image": "AMAs.png",
"end_date": "January 1, 2023"
},
{ "name": "Community Calls #1",
"description": "An open discussion about the development of XLS-20 and NFTs on the XRP Ledger.",
"type": "cc",
"link": "https://youtu.be/KpSt0PFT2QM",
"location": "XRPL Developers Discord",
"date": "June 02, 2022",
"image": "CommunityCalls.png",
"end_date": "June 02, 2022"
},
{ "name": "Community Calls #2",
"description": "A community call about XRPL amendments with Chris McKay.",
"type": "cc",
"link": "https://youtu.be/oNJ1Qqns2Gw",
"location": "XRPL Developers Discord",
"date": "August 8, 2022",
"image": "CommunityCalls.png",
"end_date": "August 8, 2022"
},
{ "name": "AMAs: POS and Crypto Payments with FriiPay",
"description": "A discussion with FriiPay about payment rails and POS integrations through the XRP Ledger",
"type": "ama",
"link": "https://dev.to/ripplexdev/xrpl-developer-ama-pos-and-crypto-payments-with-friipay-13hm",
"location": "XRPL Developers Discord",
"date": "February 15, 2023",
"image": "AMAs.png",
"end_date": "February 15, 2023"
},
{ "name": "AMAs: On-chain Data with Bithomp",
"description": "A discuss with Bithomp about data infrastructure and their NFT integrations in one of the most popular explorers on the XRP Ledger.",
"type": "ama",
"link": "https://dev.to/ripplexdev/xrpl-developer-ama-bithomp-4a8d",
"location": "XRPL Developers Discord",
"date": "March 15, 2023",
"image": "AMAs.png",
"end_date": "March 15, 2023"
},
{
"name": "XRPL Community Meetup: Madrid",
"description": "Get together with other Madrid-based members of the XRP Ledger community to network and discuss all things XRPL.",
"type": "meetup",
"link": "https://www.meetup.com/xrp-ledger-espana-madrid-y-barcelona/events/292597878",
"location": "Madrid",
"date": "April 29, 2023",
"image": "Madrid.png",
"end_date": "April 29, 2023"
},
{
"name": "APEX 2023: The XRPL Developer Summit",
"description": "Apex XRPL Developer Summit is the annual event where developers, contributors, and thought leaders come together to learn, build, share, network, and celebrate all things XRP Ledger.",
"type": "conference",
"link": "http://apexdevsummit.com",
"location": "Amsterdam",
"date": "September 6 - 8, 2023",
"image": "Conference.png",
"end_date": "September 8, 2023"
},
{ "name": "Community Calls #3",
"description": "An open chat with the XRP Ledger community about NFTs and the EVM sidechain testnet.",
"type": "cc",
"link": "https://discord.com/invite/xrpl",
"location": "XRPL Developers Discord",
"date": "March 30, 2023",
"image": "CommunityCalls.png",
"end_date": "March 30, 2023"
},
{ "name": "XRPL Roundtable: XRPL @ Consensus",
"description": "A roundtable chat with those who represented the XRP Ledger at Consensus 2023.",
"type": "ama",
"link": "https://twitter.com/RippleXDev",
"location": "Twitter Spaces",
"date": "June 24, 2023",
"image": "AMAs.png",
"end_date": "June 24, 2023"
},
{ "name": "XRPL BUIDLERS BOOTCAMP",
"description": "First XRPL Ideathon in Japan Held Ahead of Crypto Event IVS Crypto.",
"type": "hackathon",
"link": "https://lu.ma/xrpl_builders_bootcamp",
"location": "Tokyo",
"date": "June 25, 2023",
"image": "Hackathons.png",
"end_date": "June 25, 2023"
},
{ "name": "XRPL Workshop at WebX Asia",
"description": "Workshop with XRP Ledger co-developer David Schwartz and leading Japanese XRPL developers.",
"type": "conference",
"link": "https://lu.ma/mn90h3h9",
"location": "Tokyo",
"date": "July 26, 2023",
"image": "Conference.png",
"end_date": "July 26, 2023"
},
{ "name": "XRPL Summer Hackathon",
"description": "The XRPL Hackathon is all about supporting innovative projects and getting developers from diverse backgrounds to explore creative ideas and transition from centralized systems to the exciting world of blockchain. Bring your innovative projects to life and get a chance to secure up to $10,000 in funding.",
"type": "hackathon",
"link": "https://dorahacks.io/hackathon/xrpl-hackathon",
"location": "Online",
"date": "June 5, 2023 - July 30, 2023",
"image": "Hackathons.png",
"end_date": "July 30, 2023"
},
{ "name": "AMAs: XRPL Developer AMAs",
"description": "A chat with Matt Mankins from Lorem Labs to discuss Kudos for Code and his recent XRPL Accelerator acceptance.",
"type": "ama",
"link": "http://xrpldevs.org/",
"location": "XRPL Developers Discord",
"date": "July 18, 2023",
"image": "AMAs.png",
"end_date": "July 18, 2023"
},
{ "name": "Q3 2023 Ripple XRP Meetup",
"description": "Join your fellow Ripple XRP Enthusiasts for a 90-minute discussion. Topics: XRP, Flare, XRPL, Ripple (Company), General Crypto QA.",
"type": "meetup",
"link": "https://www.meetup.com/ripple-xrp-community/events/292740612",
"location": "Online",
"date": "July 13, 2023",
"image": "Virtual-Event.png",
"end_date": "July 13, 2023"
},
{ "name": "XRPL Toronto Meetup",
"description": "Prepare for an evening of XRPL Toronto Meetup a celebration of discovery and connection. Join enthusiasts, innovators, and developers for inspiring talks, conversations, and learning. All are welcome, from seasoned developers to curious newcomers.",
"type": "meetup",
"link": "https://www.meetup.com/xrpl-toronto-community-meetup/events/294766059",
"location": "Downtown Toronto",
"date": "August 14, 2023",
"image": "event-meetup-toronto@2x.jpg",
"end_date": "August 14, 2023"
},
{ "name": "XRPL London Meetup (Accelerator Edition)",
"description": "Join us for a Happy Hour hosted by the XRPL Accelerator Team! Connect with fellow start-ups in the blockchain space and gain insights into cutting-edge projects and founders.",
"type": "meetup",
"link": "https://lu.ma/xrplacceleratorhappyhour",
"location": "Central London",
"date": "September 04, 2023",
"image": "event-meetup-london.png",
"end_date": "September 04, 2023"
},
{
"name": "XRPL Accelerator Demo Day",
"description": "Join us for our very first XRPL Accelerator Demo Day in London. Witness pitches from nine portfolio startups, engage in Q&A sessions, and network with founders and investors. ",
"type": "conference",
"link": "https://lu.ma/xrplaccelerator",
"location": "Central London and Online",
"date": "September 05, 2023",
"image": "Conference.png",
"end_date": "September 05, 2023"
},
{ "name": "XRPL Hackathon - Apex 2023",
"description": "Join the XRPL Hackathon - APEX 2023, a week before the XRP Ledger's annual developer conference. Explore the Future of Finance and Web3 tracks, collaborate, learn, and compete for 10K USD in prizes.",
"type": "hackathon",
"link": "https://lu.ma/4h3bqfw1",
"location": "Delft, Netherlands ",
"date": "August 30, 2023 - August 31, 2023",
"image": "Hackathons.png",
"end_date": "August 31, 2023"
},
{ "name": "XRPL Grants Info Session: Financial Inclusion Focused",
"description": "Join us for a live information session and Q&A on applying to XRPL Grants Wave 7. This session will provide a general overview of the XRPL Grants application for Wave 7, with a focus on Financial Inclusion projects.",
"type": "info-session",
"link": "https://www.youtube.com/watch?v=TgLaAXTZY7Q",
"location": "Virtual - Zoom",
"date": "September 05, 2023",
"image": "InfoSessions.png",
"end_date": "September 05, 2023"
},
{ "name": "XRPL South Korea Meetup - XCCESS",
"description": "We are excited to introduce the XRP Ledger XCCESS - an exclusive meetup bringing together the brightest minds, innovators, and enthusiasts from South Korea's blockchain industry. Join us for an engaging experience during the Korea Blockchain Week.",
"type": "meetup",
"link": "https://lu.ma/xrplxccess",
"location": "South Korea - JBK Tower",
"date": "September 06, 2023",
"image": "SouthKoreaMeetup.png",
"end_date": "September 06, 2023"
},
{ "name": "XRPL Grants Info Session: Decentralized Exchange (DEX) Focused",
"description": "Watch the recorded information session and Q&A on applying to XRPL Grants Wave 7. This session will provide a general overview of the XRPL Grants application for Wave 7, with a focus on Decentralized Exchange (DEX) projects.",
"type": "info-session",
"link": "https://www.youtube.com/watch?v=BbGu0QC5WEE",
"location": "Virtual - Zoom",
"date": "September 06, 2023",
"image": "InfoSessions.png",
"end_date": "September 06, 2023"
},
{ "name": "XRPL Developers Discord AMA: Edge Wallet",
"description": "Join us for a live chat on Discord and learn more about Edge Wallet and how they are building on the XRP Ledger.",
"type": "ama",
"link": "http://xrpldevs.org/",
"location": "XRPL Developers Discord",
"date": "October 13, 2023",
"image": "AMAs.png",
"end_date": "October 13, 2023"
},
{ "name": "XRPL Developers Reddit AMA: Real World Assets",
"description": "Join us for a live chat on Reddit and learn more about how developers are building real world assets with confidence on the XRP Ledger.",
"type": "ama",
"link": "https://xrplresources.org/rwa-ama?utm_source=web&utm_medium=web&utm_campaign=bwc",
"location": "Virtual - Reddit",
"date": "October 17, 2023",
"image": "AMAs.png",
"end_date": "October 17, 2023"
},
{ "name": "XRPL Blockhack Hackathon",
"description": "Join us at George Brown College's Waterfront Campus for workshops and talks on promoting growth for blockchain projects and ventures. We are supporting a for the most innovative application built on XRPL.",
"type": "hackathon",
"link": "https://blockhack-2023.devpost.com/",
"location": "George Brown College - Waterfront Campus",
"date": "October 20, 2023 - October 22, 2023",
"image": "Hackathons.png",
"end_date": "October 22, 2023"
},
{ "name": "XRPL Accelerator Demo Day",
"description": "Join us for XRPL Accelerator Demo Day in Singapore! Explore pitches from 11 promising startups building on the XRP Ledger, network with founders and investors, and kickstart the Singapore FinTech Festival. Webinar link coming soon!",
"type": "meetup",
"link": "https://www.eventbrite.co.uk/e/xrpl-demo-day-tickets-740650023157?aff=oddtdtcreator",
"location": "Hybrid Singapore/Virtual Webinar",
"date": "November 14, 2023",
"image": "singapore.png",
"end_date": "November 14, 2023"
},
{ "name": "New Horizon: Innovate Without Limits: New Horizons Await",
"description": "Join our EVM-compatible chain launch for a chance to win $50,000 in prizes! Unleash your creativity in DeFi and NFTs, with judging criteria focused on novelty, impact, and community engagement.",
"type": "hackathon",
"link": "https://newhorizon.devpost.com/",
"location": "Virtual",
"date": "October 19, 2023 - December 22, 2023",
"image": "Hackathons.png",
"end_date": "December 22, 2023"
},
{
"name": "XRPL Community Report Launch Party",
"description": "Celebrate the XRPL Community Report launch at 7pm! Join blockchain enthusiasts, connect with experts, and discover opportunities in the XRP Ledger ecosystem. Limited space available, so register now for a night of celebration and networking!",
"type": "meetup",
"link": "https://www.eventbrite.fr/e/billets-xrpl-community-report-launch-party-753788370307",
"location": "Paris, France",
"date": "November 28, 7pm - 9pm",
"image": "paris.png",
"end_date": "November 28, 2023"
},
# { "name": "XRP Ledger Zone ETHDenver",
# "description": "XRPL Zone: your all-in-one location for creating and collaborating on XRP Ledger (XRPL) projects. Details coming soon!",
# "type": "zone",
# "link": "https://xrplzone-consensus.splashthat.com/", need to update
# "location": "Denver, Colorado",
# "date": "April 27, 2023", need to update
# "image": "XRPLZone.png",
# "end_date": "April 27, 2023" need to update
# },
{ "name": "RippleXs Research: <br/> Stanford Engineering Campus Research Initiatives",
"description": "Learn more about RippleXs ongoing research projects on the XRP Ledger, addressing issues like frontrunning defense, the significance of threshold signatures, and challenges in cross-chain communication, including the construction of bridges on XRPL.",
"type": "conference",
"link": "https://stanford.zoom.us/meeting/register/tJ0vcOCorjMpGdPnS4_aBkWhphhnzld7sUKr",
"location": "Virtual",
"date": "December 12, 2023 4:15pm PST",
"image": "Conference.png",
"end_date": "December 12, 2023",
},
{ "name": "Paris Blockchain Week",
"description": "Paris Blockchain Week is Europe's biggest blockchain & digital assets event that covers all aspects of blockchain technology.",
"type": "conference",
"link": "https://www.parisblockchainweek.com/",
"location": "Paris, France",
"date": "April 9 - 12, 2024",
"image": "Conference.png",
"end_date": "April 12, 2024",
},
{ "name": "Consensus",
"description": "Join us at Consensus! This event is the world's largest, longest-running and most influential gathering that brings together all sides of the cryptocurrency, blockchain and Web3 community.",
"type": "conference",
"link": "https://consensus2024.coindesk.com/sponsors/",
"location": "Austin, Texas",
"date": "May 29 - June 1, 2024",
"image": "Conference.png",
"end_date": "June 1, 2024",
},
{ "name": "Permissionless",
"description": "Come see XRP Ledger at Permissionless: the world's largest DeFi conference.",
"type": "conference",
"link": "https://blockworks.co/event/permissionless-iii/home",
"location": "Salt Lake City, Utah",
"date": "October 9 - 11, 2024",
"image": "Conference.png",
"end_date": "October 11, 2024",
},
{
"name": "XRPL Toronto Meetup Community - Celebrate with Us!",
"description": "To connect the blockchain community, showcase campus ambassador projects, and celebrate the year's progress with a holiday theme.",
"type": "meetup",
"link": "https://www.meetup.com/xrpl-toronto-community-meetup/events/294766059",
"location": "Downtown, Toronto",
"date": "TBD",
"image": "event-meetup-toronto@2x.jpg",
"end_date": "January 31, 2024"
},
]
def categorize_dates():
past = []
upcoming = []
today = datetime.today()
for obj in events:
end_date = datetime.strptime(obj['end_date'], '%B %d, %Y')
if end_date < today:
obj['type'] = obj['type'] + '-past'
past.append(obj)
else:
obj['type'] = obj['type'] + '-upcoming'
upcoming.append(obj)
return {'past': past, 'upcoming': upcoming, 'all' : all}
export = {
"categorize_dates": categorize_dates,
}

View File

@@ -1,100 +0,0 @@
################################################################################
## Code Sample Functions ##
## Author: Rome Reginelli ##
## Copyright: Ripple Labs, Inc. 2021 ##
## License: MIT https://github.com/XRPLF/xrpl-dev-portal/blob/master/LICENSE ##
## ##
## Find code samples in the repository contents and figure out metadata about ##
## them automatically. ##
################################################################################
import os
import re
from bs4 import BeautifulSoup
from markdown import markdown
cs_dir = "content/_code-samples/"
skip_dirs = [
"node_modules",
".git",
"__pycache__"
]
words_to_caps = [
"xrp",
]
def to_title_case(s):
"""
Convert a folder name string to title case, for code samples that don't have
a README file. The input string is expected to be in kebab-case or snake_case.
"""
words = re.split(r"_|[^\w']", s)
words = [w.upper() if w in words_to_caps else w.title() for w in words if w] #remove empty splits
return " ".join(words).replace("'S", "'s").replace(" A ", " a ")
# def all_langs():
langs = []
def sortfunc(cs):
"""
Sort code samples alphabetically by title except with "Intro" fields first
"""
if "Intro" in cs["title"] or "Quickstart" in cs["title"]:
return " "+cs["title"]
else:
return cs["title"]
def all_code_samples():
cses = []
for dirpath, dirnames, filenames in os.walk(cs_dir):
if dirpath == cs_dir:
continue
# limit depth to just the code samples and language folders
depth = dirpath.count(os.sep) - cs_dir.count(os.sep) + 1
if depth > 1:
continue
for sd in skip_dirs:
if sd in dirnames:
dirnames.remove(sd)
cs = {
"path": dirpath,
"langs": sorted(list(set(["http" if d in ("websocket", "json-rpc") else d for d in dirnames]))),
}
# add unique names to list for sorting.
for d in dirnames:
lang = "http" if d in ("websocket", "json-rpc") else d
if lang not in langs:
langs.append(lang)
if "README.md" in filenames:
with open(os.path.join(dirpath, "README.md"), "r") as f:
md = f.read()
md = markdown(md)
soup = BeautifulSoup(md, "html.parser")
h = soup.find(["h1", "h2", "h3"]) # get first header in the file
if h:
cs["title"] = h.get_text()
else:
cs["title"] = to_title_case(os.path.basename(dirpath))
p = soup.find("p") # first paragraph defines the blurb
if p:
cs["description"] = p.get_text()
else:
cs["description"] = ""
else:
cs["title"] = to_title_case(os.path.basename(dirpath))
cs["description"] = ""
cs["href"] = dirpath
cses.append(cs)
return sorted(cses, key=sortfunc)
export = {
"all_code_samples": all_code_samples,
"all_langs": langs,
}

View File

@@ -1,42 +0,0 @@
################################################
## Add copy to clipboard btton
## Author: Jake Bonham
## Copyright: Ripple Labs, 2021
##
## Finds codeblocks and adds copy to clipboard button
################################################
def filter_soup(soup, **kwargs):
"""
1. Finds all elements with class of "codehilite"
2. Adds copy to clipboard button.
Button looks like >
<button class="btn btn-outline-secondary clipboard-btn" data-clipboard-target="#codeblock-0" id="codeblock-0button">Copy to clipboard</button>
3. Adds id to <code> element.
"""
code_blocks = soup.find_all(class_="codehilite")
index1 = 0
for code_block in code_blocks:
# add id to each child <code>
codeBlock = code_block.find("code")
codeBlock_id = "codeblock-%d" % index1
codeBlock["id"] = codeBlock_id
# Add button group
btn_group = soup.new_tag('div')
btn_group['class'] = "btn-group"
btn_group['role'] = "group"
btn_group['aria-label'] = "Code Buttons"
code_block.insert(0, btn_group)
# Add copy button
new_tag = soup.new_tag('button', id=codeBlock_id+'button')
icon = soup.new_tag('i')
icon['class'] = "fa fa-clipboard"
new_tag['class'] = "btn btn-outline-secondary clipboard-btn"
new_tag['alt'] = "Copy to clipboard"
new_tag['data-clipboard-target'] = "#"+codeBlock_id
new_tag.insert(0, icon)
btn_group.insert(0, new_tag)
#
index1 += 1

View File

@@ -1,18 +0,0 @@
################################################
## Add class to tables
## Author: Jake Bonham
## Copyright: Ripple Labs, 2021
##
## Finds tables and adds bootstrap class
################################################
import re
def filter_soup(soup, **kwargs):
"""
Adds responsive class to tables.
"""
tables = soup.find_all("table")
for table in tables:
table['class'] = table.get('class', []) + ['table-responsive']

View File

@@ -1,186 +0,0 @@
################################################################################
## Enforce Filenames ##
## Author: Rome Reginelli ##
## Copyright: Ripple Labs, Inc. 2023 ##
## License: MIT https://github.com/XRPLF/xrpl-dev-portal/blob/master/LICENSE ##
## ##
## Print errors and optionally fail out if an md page's filename does not ##
## closely match its title. ##
################################################################################
import os.path
import re
import ruamel.yaml
yaml = ruamel.yaml.YAML()
yaml.default_flow_style=False
yaml.indent(mapping=4, sequence=4, offset=2) ## For some reason this doesn't work?
# only walk the overall page hierarchy once
has_walked = False
DOCS_TOP = None
# TODO: generalize the "DOCS_TOP" thing and remove assumption it uses docs.html
def textof(el):
if not el:
# TODO: maybe raise error?
return ""
return " ".join(el.stripped_strings)
def idify(utext):
utext = re.sub(r'[^\w\s-]', '', utext).strip().lower()
utext = re.sub(r'[\s-]+', '-', utext)
return utext
def normalized_match(filename, heading, loose=False):
"""
Return True if the normalized versions of a filename and a heading match,
False otherwise.
If loose==True, allow some leeway like omitting 'and' and 'the'
"""
if filename[-3:] == ".md":
filename = filename[:-3]
fn_norm = idify(filename)
h1_norm = idify(heading)
if fn_norm == h1_norm:
return True
elif not loose:
return False
ignored_tokens = ("and", "the", "of")
fn_tokens = [t for t in fn_norm.split("-") if t not in ignored_tokens]
h1_tokens = [t for t in h1_norm.split("-") if t not in ignored_tokens]
if fn_tokens == h1_tokens:
return True
else: return False
def get_hierarchy(page, pages, logger):
global DOCS_TOP
crumbs = [page]
while crumbs[0] != DOCS_TOP:
for p in pages:
if p["html"] == crumbs[0]["parent"]:
crumbs.insert(0, p)
break
else:
logger.warning("Couldn't find parent '%s' of %s"%(page["parent"], page["html"]))
break
return crumbs[1:]
def compare_nav_and_fs_hierarchy(page, pages, logger):
crumbs = get_hierarchy(page, pages, logger)
crumbs = [idify(c["name"]) for c in crumbs]
#TODO: either fix the protocol reference thing or generalize the magic string into an "allowed aliases" feature
crumbs = [("protocol-reference" if c == "xrp-ledger-protocol-reference" else c) for c in crumbs]
expected_path = "/".join(crumbs) + ".md"
actual_path = page["md"]
if expected_path != actual_path:
path_parts = actual_path.split("/")
if len(path_parts) >=2 and path_parts[-2]+".md" == path_parts[-1]:
expected_path2 = "/".join(crumbs+[crumbs[-1]]) + ".md"
if actual_path == expected_path2:
logger.debug("Mismatched path {actual_path} is OK (follows 'topic/topic.md' convention)".format(actual_path=actual_path))
return
# Switch to the commented out print statement to get
# tab-separated values you can paste into a spreadsheet:
# print(expected_path, "\t", actual_path)
logger.info("""File path doesn't match the recommendation based on navigation.
Expected: {expected_path}
Actual: {actual_path}""".format(expected_path=expected_path, actual_path=actual_path))
def filter_soup(soup, currentpage={}, config={}, pages=[], logger=None, **kwargs):
# To build a Redocly sidebar and quit, run dactyl_build --vars '{"export-redocly-sidebar": true}'
if currentpage.get("export-redocly-sidebar", False):
redocly_sidebar(pages)
if "md" not in currentpage.keys() or currentpage.get("lang") != "en":
return
# assign docs top page (once) for purposes of figuring out hierarchy
global DOCS_TOP
if DOCS_TOP is None:
for p in pages:
if p["html"] == "docs.html":
DOCS_TOP = p
if DOCS_TOP["is_ancestor_of"](currentpage["html"]):
compare_nav_and_fs_hierarchy(currentpage, pages, logger)
# else:
# logger.warning("Skipping hierarchy check (not part of Docs tree)")
page_path, page_filename = os.path.split(currentpage["md"])
page_h1 = textof(soup.find("h1"))
if not page_h1:
print("File doesn't have an h1 title:", page_filename)
return
# TODO: allow configuration of loose/strict matching
if not normalized_match(page_filename, page_h1, loose=True):
logger.info("Filename/Title Mismatch: '{page_filename}' vs '{page_h1}'".format(page_filename=page_filename, page_h1=page_h1))
def page_mapping(pages):
mapping = {}
no_md_pages = []
for page in pages:
if page.get("template", "") == "pagetype-redirect.html.jinja":
continue
if page["html"][:8] == "https://":
continue
if "md" in page.keys():
mapping[page["html"]] = page["md"]
else:
no_md_pages.append(page["html"])
s = ""
for html, md in mapping.items():
s += html + "\t" + md + "\n"
s += "\n"
for html in no_md_pages:
s += html + "\n"
return s
def redocly_entry_for(page, pages):
"""
Potentially recursive method for getting a sidebar entry in Redocly format from a (parsed) Dactyl page item.
"""
si = {}
if not page.get("md", ""):
if page.get("children", []):
si["group"] = page.get("name", "no name?")
else:
si["label"] = page.get("name", "no name?")
if page["html"][:8] == "https://":
# Not a markdown source, just an external link
si["href"] = page["html"]
si["external"] = True
if page.get("md", ""):
# Normal md source file
si["page"] = page["md"]
if page.get("children", []):
si["expanded"] = False
si["items"] = [redocly_entry_for(child, pages) for child in page["children"]]
return si
def redocly_sidebar(pages, starting_point="index.html"):
sidebar = []
for page in pages:
if page.get("nav_omit", False):
# TODO: these are mostly redirects, but need to handle the ones that aren't
continue
if page.get("parent", "") == "index.html":
sidebar.append(redocly_entry_for(page, pages))
with open("content/sidebars.yaml", "w") as f:
yaml.dump(sidebar, f)
exit()
export = {
"page_mapping": page_mapping
}

View File

@@ -1,34 +0,0 @@
################################################
## External Link Marker
## Author: Rome Reginelli
## Copyright: Ripple Labs, 2019
##
## Finds external links and changes them to:
## - open in a new tab (target="_blank")
## - end with an "external link" icon
## (FontAwesome required)
################################################
import re
def filter_soup(soup, **kwargs):
"""
Adds an external link marker to external links
and makes them open in new tabs.
"""
extern_regex = re.compile(r"^https?://")
links = soup.find_all("a", href=True)
for link in links:
if extern_regex.match(link["href"]):
link["target"] = "_blank"
ex_link_marker = soup.new_tag("i", attrs={
"class":"fa fa-external-link",
"aria-hidden": "true"})
link.append(" ")
link.append(ex_link_marker)
oldclass = link.get('class',[])
if type(oldclass) == str:
oldclass = [oldclass]
link['class'] = oldclass + ['external-link']

View File

@@ -1,88 +0,0 @@
################################################
## FAQ Formatter
## Author: Rome Reginelli
## Copyright: Ripple Labs, 2021
##
## Styles the FAQ as an accordion of questions.
################################################
from bs4 import NavigableString
Q_TAG = "h4"
SECTION_TAG = "h2"
def append_chevron(soup, el):
"""
Adds markup for a CSS-animated chevron to an element, in the form of:
<span class="chevron">
<span></span>
<span></span>
</span>
"""
chev = soup.new_tag("span")
chev["class"] = "chevron"
chev.extend([soup.new_tag("span") for i in range(2)])
el.append(chev)
def wrap_question(soup, qi, q, elements):
q_wrapper = soup.new_tag("div")
q_wrapper["class"] = "q-wrapper"
q.replace_with(q_wrapper)
answer_wrapper = soup.new_tag("div")
answer_wrapper["id"] = "a{qi}".format(qi=qi)
answer_wrapper["class"] = "answer-wrapper collapse"
answer_wrapper["aria-labelledby"] = "a{qi}".format(qi=qi)
#answer_wrapper["data-parent"] = "#faqs-accordion"
for i,el in enumerate(elements):
# if i==0:
# el.replace_with(answer_wrapper)
answer_wrapper.append(el.extract())
q_wrapper.append(answer_wrapper)
q_toggler = soup.new_tag("a")
q_toggler["data-toggle"] = "collapse"
q_toggler["href"] = "#{qid}".format(qid=q["id"])
q_toggler["data-target"] = "#a{qi}".format(qi=qi)
q_toggler["aria-controls"] = "a{qi}".format(qi=qi)
q_toggler["aria-expanded"] = "false"
q_toggler["class"] = "expander collapsed"
q_toggler.insert(0, q.text)
q_id = "{qid}".format(qid=q["id"])
q = soup.new_tag("h4")
q["id"] = q_id
# Strip out permalinks since that would be a link inside a link (invalid)
[a.decompose() for a in q.find_all("a")]
append_chevron(soup, q_toggler)
q.insert(0, q_toggler)
q_wrapper.insert(0, q)
return q_wrapper
def wrap_section(soup, elements):
section = soup.new_tag("section")
section["class"] = "py-26"
section.extend([el.extract() for el in elements])
def filter_soup(soup, **kwargs):
qs = soup.find_all(Q_TAG)
for qi, q in enumerate(qs):
current_answer = []
el = q
while el.next_sibling:
el = el.next_sibling
if isinstance(el, NavigableString):
current_answer.append(el)
elif el.name == Q_TAG:
# We probably found the next question, stop here
break
elif el.name == SECTION_TAG:
# End of the section, definitely stop here
break
else:
current_answer.append(el)
wrap_question(soup, qi, q, current_answer)

View File

@@ -1,87 +0,0 @@
import os
def include_code(filename, lines="", mark_disjoint="", language="",
start_with=None, end_before=None):
# Note: this filter hackily assumes content/ since I don't want to figure
# out how to actually pull values from the Dactyl config file from this
# point in the code.
with open("content/"+filename, encoding="utf-8") as f:
s = f.read()
# Set the default marker for skipped lines if a custom one isn't provided
if mark_disjoint == True:
mark_disjoint = "..."
# Truncate everything before the specified starting point (start_with)
if start_with is not None:
start_i = s.find(start_with)
if start_i == -1:
raise ValueError("include_code: couldn't find start_with point '%s'"%start_with)
# Backtrack to start of the line
while start_i > 0:
if s[start_i] == "\n":
break
start_i -= 1
s = s[start_i:]
# Truncate everything after the specified ending point (end_before)
if end_before is not None:
end_i = s.find(end_before)
if end_i == -1:
raise ValueError("include_code: couldn't find end_before point '%s'"%end_before)
s = s[:end_i]
if lines:
use_lines = parse_range(lines)
s2 = ""
file_lines = s.split("\n")
old_i = None
for i in use_lines:
if i < 1 or i > len(file_lines):
raise ValueError("include_code: requested line is out of range: '%s'" % i)
if old_i != None and mark_disjoint:
if old_i+1 != i:
s2 += mark_disjoint + "\n"
s2 += file_lines[i-1] + "\n"
old_i = i
s = s2
if language == "py":
# Indentation in Python is meaningful so we can't remove all whitespace.
# Instead, remove only blank lines at the begining and end.
slines = s.split("\n")
s = ""
started = False
blank_tail = "" # Keep a running block of blank lines in case they're
# *between* meaningful lines.
for i, line in enumerate(slines):
if line.strip():
started = True
s += blank_tail
blank_tail = ""
s += line + "\n"
elif started:
blank_tail += line + "\n"
else:
s = s.strip()
return "```%s\n%s\n```" % (language, s)
def parse_range(range_string):
range_list = []
for x in range_string.split(","):
part = x.split("-")
if len(part) == 1:
range_list.append(int(part[0]))
elif len(part) == 2:
range_list += [i for i in range(int(part[0]), int(part[1])+1)]
else:
raise ValueError("invalid range: '%s'" % range_string)
return range_list
export = {
"include_code": include_code
}

View File

@@ -1,63 +0,0 @@
################################################################################
## SVG Diagram Includer ##
## Author: Rome Reginelli ##
## Copyright: Ripple Labs, Inc. 2020 ##
## License: MIT https://github.com/XRPLF/xrpl-dev-portal/blob/master/LICENSE ##
## ##
## Includes a particular SVG diagram inline while also making it a link to ##
## the raw diagram (so people can click to view it zoomed in). ##
################################################################################
from bs4 import BeautifulSoup
import os.path
def uniqify_urls(soup, attr, slug):
"""
Change url(#some-id) references by prefixing the slug to the unique ID.
"""
els = soup.find_all(attrs={attr: True})
for el in els:
if "url(#" in el[attr]:
el[attr] = el[attr].replace("url(#", "url(#"+slug)
def include_svg(filename, alt_text="(diagram)", classes=""):
# TODO: try/except, retriable error
filename = os.path.join("./content/", filename) # TODO: tempfix for img being in content/img for Redocly. Undo if we move img/ back up a level.
with open(filename, "r", encoding="utf-8") as f:
svgtext = f.read()
soup = BeautifulSoup(svgtext, "xml") #lxml required
# Fix height
soup.svg["height"] = "100%"
# Make IDs unique.
# Without this step, multiple diagrams in one page can clash on IDs
# resulting in using the wrong clip paths for diagrams beyond the first,
# which can cut off the edges of the diagrams.
slug = filename.replace(" ","_")+"__"
els_with_ids = soup.svg.find_all(id=True)
for el in els_with_ids:
el["id"] = slug+el["id"]
# Change clip-path URLs to use the unique IDs
uniqify_urls(soup.svg, "clip-path", slug)
uniqify_urls(soup.svg, "fill", slug)
uniqify_urls(soup.svg, "style", slug)
uniqify_urls(soup.svg, "mask", slug)
#TODO: add any other attributes that may contain url(#id) values.
a = soup.new_tag("a")
a["href"]=filename
a["title"]=alt_text
soup.svg.wrap(a)
fig = soup.a.wrap(soup.new_tag("figure"))
if classes:
fig["class"] = classes
# wrap in a block-level tag to prevent md parsing in the diagram text
return str(soup.figure)
export = {
"include_svg": include_svg
}

View File

@@ -1,91 +0,0 @@
################################################
## Interactive Steps Helper
## Author: Rome Reginelli
## Copyright: Ripple Labs, 2019
##
## Automates the process of building wrappers and breadcrumbs for interactive
## blocks in tutorials that have several interactive steps in order.
################################################
import re
def slugify(s):
unacceptable_chars = re.compile(r"[^A-Za-z0-9._ ]+")
whitespace_regex = re.compile(r"\s+")
s = re.sub(unacceptable_chars, "", s)
s = re.sub(whitespace_regex, "_", s)
s = s.lower()
if not s:
s = "_"
return s
def start_step(step_label):
"""Generates the HTML for the start of a step, including breadcrumbs"""
if '"' in step_label:
raise ValueError("step_label must not contain \" characters")
step_id = slugify(step_label)
out_html = """
<div class="interactive-block" id="interactive-{step_id}">
<div class="interactive-block-inner">
<div class="breadcrumbs-wrap">
<ul class="breadcrumb tutorial-step-crumbs" id="bc-ul-{step_id}" data-steplabel="{step_label}" data-stepid="{step_id}">
</ul><!--/.breadcrumb.tutorial-step-crumbs-->
</div><!--/.breadcrumbs-wrap-->
<div class="interactive-block-ui">
""".format(step_id=step_id, step_label=step_label)
return out_html
def end_step():
"""Generates the HTML for the end of a step"""
return " </div><!--/.interactive-block-ui-->\n </div><!--/.interactive-block-inner-->\n</div><!--/.interactive-block-->"
def filter_soup(soup, **kwargs):
"""Add steps to each tutorial-step-crumbs element based on the total steps
in the document. Each step results in a li element such as:
<li class="breadcrumb-item disabled current bc-connect">
<a href="#interactive-connect">Connect</a>
</li>
Also, add step numbers to the tutorials
"""
crumb_uls = soup.find_all(class_="tutorial-step-crumbs")
steps = [(el.attrs["data-stepid"], el.attrs["data-steplabel"]) for el in crumb_uls]
def add_lis(parent_ul, steps, current_step_id):
i = 0
for step_id, step_label in steps:
li = soup.new_tag("li")
li_classes = ["breadcrumb-item", "bc-{step_id}".format(step_id=step_id)]
if i > 0:
li_classes.append("disabled") # Steps get enabled in order by JS
if step_id == current_step_id:
li_classes.append("current")
li.attrs['class'] = li_classes
li_a = soup.new_tag("a", href="#interactive-{step_id}".format(step_id=step_id))
li_a.append(step_label)
li.append(li_a)
parent_ul.append(li)
i += 1
def add_stepnum(crumbs_ul, i, total):
steps_div = crumbs_ul.parent.parent.parent
if 'interactive-block' not in steps_div['class']:
raise ValueError("crumbs_ul not wrapped in .interactive-block as expected")
steps_div.attrs['data-stepnumber'] = i+1 # 1-index steps so it's less confusing
steps_div.attrs['data-totalsteps'] = total
for i, ul in enumerate(crumb_uls):
ul_step_id = ul.attrs["data-stepid"]
add_lis(ul, steps, ul_step_id)
add_stepnum(ul, i, len(steps))
export = {
"start_step": start_step,
"end_step": end_step
}

View File

@@ -1,88 +0,0 @@
################################################################################
## Label Functions ##
## Author: Rome Reginelli ##
## Copyright: Ripple Labs, Inc. 2021 ##
## License: MIT https://github.com/XRPLF/xrpl-dev-portal/blob/master/LICENSE ##
## ##
## Functions to find pages with a given label ##
################################################################################
from collections import Counter
def children_with_label(pages, parent, label):
"""
pages: list(Page)
parent: Page
label: str
returns: list(Page)
Filter for pages that are children of the given parent and tagged with the
given label.
"""
return [page for page in pages
if parent["is_ancestor_of"](page["html"])
and label in page.get("labels", [])]
def all_with_label(pages, label):
"""
pages: list(Page)
label: str
returns: list(Page)
Filter for pages that are tagged with the given label.
"""
return [page for page in pages if label in page.get("labels", [])]
def label_count(pages, label):
"""
pages: list(Page)
label: str
returns: int
Counts the total number of pages that have a given label.
"""
return len(all_with_label(pages, label))
def label_sizes(pages):
"""
pages: list(Page)
returns: dict[str: int]
For all labels with landings in the page list, assign each label a "size",
from 1 to 5, based on the total number of pages with that label. (A larger
size means the label contains more pages.)
"""
# Note: this is basically calculating a 5-bin histogram, but I didn't want
# to add another dependency like numpy just to do this.
labels = [page["landing_for"] for page in pages if "landing_for" in page]
label_counts = Counter()
for page in pages:
if "labels" in page:
label_counts.update(page["labels"])
if not label_counts:
return {}
total_labels = len(label_counts.keys())
label_sizemap = {}
size = 5
for i, (label, count) in enumerate(label_counts.most_common()):
if 1 - (i / total_labels) < (size - 1) / 5:
size -= 1
label_sizemap[label] = size
return label_sizemap
export = {
"children_with_label": children_with_label,
"all_with_label": all_with_label,
"label_count": label_count,
"label_sizes": label_sizes
}

View File

@@ -1,102 +0,0 @@
## Tool for one-time creation of index.md files for dactyl-config entries that
## represent auto-generated index pages.
import sys
import re
import ruamel.yaml
import os, os.path
yaml = ruamel.yaml.YAML()
with open("dactyl-config.yml") as f:
raw_config = yaml.load(f)
BASE_DIRS = ["content", "@i18n", "ja"]
class DumpString:
def __init__(self, s=""):
self.s = s
def write(self, something):
if type(something) == bytes:
something = something.decode()
self.s += something
def __repr__(self):
return self.s
def raw_config_for(page, target):
for raw_page in raw_config["pages"]:
if raw_page.get("html", "") == page["html"] and target in raw_page.get("targets", []):
return raw_page
# def get_hierarchy(page, pages, logger, top_page):
# crumbs = [page]
# while crumbs[0] != top_page:
# for p in pages:
# if p["html"] == crumbs[0]["parent"]:
# crumbs.insert(0, p)
# break
# else:
# logger.warning("Couldn't find parent '%s' of %s"%(page["parent"], page["html"]))
# break
# return crumbs[1:]
def idify(utext):
utext = re.sub(r'[^\w\s-]', '', utext).strip().lower()
utext = re.sub(r'[\s-]+', '-', utext)
return utext
def index_path_for(ja_page, pages):
for page in pages:
if page["html"] == ja_page["html"] and "en" in page["targets"]:
return page["md"] # might throw an error, we'll find out
def filter_soup(soup, currentpage={}, config={}, pages=[], logger=None, **kwargs):
# for p in pages:
# if p["html"] == "docs.html":
# top_page = p
# break
# else:
# exit("Couldn't find docs top")
top_page = pages[0]
for page in pages:
t = page.get("template", "")
if t != "pagetype-category.html.jinja" or page.get("md", ""):
continue
#crumbs = get_hierarchy(page, pages, logger, top_page)[1:]
#crumb_slugs = BASE_DIRS + [idify(c["name"]) for c in crumbs] + ["index.md"]
#index_path = "/".join(crumb_slugs)
index_path = os.path.join(*BASE_DIRS, index_path_for(page, config["pages"]))
#print(index_path)
simple_entry = {"md": index_path}
page_props = raw_config_for(page, "ja")
#print("page_props:", page_props)
simple_entry["targets"] = page_props["targets"]
del page_props["targets"]
title = page_props["name"]
del page_props["name"]
if "blurb" in page_props:
blurb = page_props["blurb"]
del page_props["blurb"]
else:
blurb = ""
se_str = DumpString()
yaml.dump(simple_entry, se_str)
print(se_str)
fcontents = DumpString("---\n")
frontmatter = yaml.dump(page_props, fcontents)
fcontents = str(fcontents) + "---\n# " + title + "\n" + blurb
# os.makedirs(os.path.split(index_path)[0], exist_ok=True)
# with open(index_path, "w") as f:
# f.write(str(fcontents))
#print(fcontents)
#print("\n\n\n")
exit()

View File

@@ -1,77 +0,0 @@
################################################################################
## Multicode Tabs 2 filter ##
## Author: Rome Reginelli ##
## Copyright: Ripple Labs, Inc. 2016 ##
## ##
## Finds multicode tab sections and turns them into properly-formatted ##
## HTML syntax to use with minitabs jQuery ##
################################################################################
import re
import logging
MC_START_REGEX = re.compile(r"<!--\s*MULTICODE_BLOCK_START\s*-->")
MC_END_REGEX = re.compile(r"<!--\s*MULTICODE_BLOCK_END\s*-->")
def filter_html(html, mode="html", **kwargs):
"""
Turn multicode comments into a div (after markdown inside is parsed). You
can use this div for styling even in PDF format. Doesn't apply to Markdown
since most parsers won't parse markdown inside HTML blocks.
"""
if mode == "md":
return html
html = re.sub(MC_START_REGEX, "<div class='multicode'>", html)
html = re.sub(MC_END_REGEX, "</div>", html)
return html
def filter_soup(soup, mode="html", **kwargs):
"""Turn a multicode block into the correct syntax for minitabs, but only
in the HTML version."""
if mode != "html":
return
multicodes = soup.find_all(class_="multicode")
index1 = 0
for cb_area in multicodes:
cb_area["id"] = "code-%d" % index1
codetabs_ul = soup.new_tag("ul")
codetabs_ul["class"] = "codetabs"
cb_area.insert(0,codetabs_ul)
pres = cb_area.find_all(class_="codehilite")
index2 = 0
for pre in pres:
#make a unique ID for this code sample
linkid = "code-%d-%d" % (index1, index2)
#wrap this code sample in an ID'd div
code_sample_wrapper = soup.new_tag("div", id=linkid)
code_sample_wrapper["style"] = "position: static;"
pre.wrap(code_sample_wrapper)
#add a link to the tabs ul
linkback = soup.new_tag("a", href=("#%s" % linkid))
linkback_li = soup.new_tag("li")
linkback_li.append(linkback)
codetabs_ul.append(linkback_li)
#find the text label for this sample
prev_p = code_sample_wrapper.find_previous_sibling("p")
try:
label = "".join(prev_p.em.strings)
except AttributeError:
label = "Code Sample %d-%d" % (index1, index2)
linkback.string = label
#add class with name of tab label
label_class = label.replace(" ","").replace("-","").replace(",","").replace("(","").replace(")","").replace(":","").lower()
linkback["class"] = label_class
code_sample_wrapper["class"] = "code_sample " + label_class
prev_p.decompose()
index2 += 1
index1 += 1

View File

@@ -1,106 +0,0 @@
################################################################################
## Redocly Sidebar ##
## Author: Rome Reginelli ##
## Copyright: Ripple Labs, Inc. 2023 ##
## License: MIT https://github.com/XRPLF/xrpl-dev-portal/blob/master/LICENSE ##
## ##
## Export a a sidebars.yaml file in Redocly format based on a Dactyl target. ##
################################################################################
import os.path
import ruamel.yaml
yaml = ruamel.yaml.YAML()
yaml.default_flow_style=False
yaml.width = 9999
yaml.indent(mapping=4, sequence=4, offset=2)
with open("tool/non_md_links.yaml") as f:
NON_MD_LINKS = yaml.load(f)
def find_page(html, pages):
for page in pages:
if page["html"] == html:
# Follow redirects first
if page.get("redirect_url", None) and page["redirect_url"][:8] != "https://":
# Follow the redirect to get the proper replacement page
return find_page(page["redirect_url"], pages)
else:
return page
return None
def filter_soup(soup, currentpage={}, config={}, pages=[], logger=None, **kwargs):
if not currentpage.get("do_redocly_sidebar", False):
return
redocly_sidebar(pages, logger=logger)
exit()
def redocly_entry_for(page, pages):
"""
Potentially recursive method for getting a sidebar entry in Redocly format from a (parsed) Dactyl page item.
"""
si = {}
if page.get("md", ""):
# Normal md source file
si["page"] = page["md"]
if page.get("children", []) and not page.get("md", ""): # Checked twice, but first here so that "group" is the first key if necessary
si["group"] = page.get("name", "no name?")
elif page["html"][:8] == "https://":
# Not a markdown source, just an external link
si["label"] = page.get("name", "no name?")
si["href"] = page["html"]
si["external"] = True
elif not page.get("md", ""):
si["label"] = page.get("name", "no name?")
if page.get("children", []):
si["expanded"] = False
si["items"] = [redocly_entry_for(child, pages) for child in page["children"]]
return si
def add_redirect_for(page, pages, redirects, logger):
if page["html"][:8] == "https://" or page["html"] in redirects.keys():
# external link or redirect already defined, no-op
return
redir = page.get("redirect_url")
if redir:
if redir[:8] == "https://":
# Redirect to an external link
redirects[page["html"]] = {"to": redir, "type": 301}
return
# Else, follow the redirect for new path
to_page = find_page(redir, pages)
if not to_page:
logger.warning("Mismatched redirect: "+redir)
return
md = to_page.get("md")
else:
md = page.get("md")
if not md:
logger.warning("Unclear where to redirect page to: %s"%page["html"])
return
if md[-8:] == "index.md":
new_path = "/"+md[:-8]
else:
new_path = "/"+md[:-3]
redirects[page["html"]] = {"to": new_path, "type": 301}
def redocly_sidebar(pages, starting_point="index.html", logger=None):
sidebar = []
redirects = {k:{"to": v, "type": 301} for k,v in NON_MD_LINKS.items()}
for page in pages:
add_redirect_for(page, pages, redirects, logger)
if page.get("nav_omit", False) or page.get("template", "") == "pagetype-redirect.html.jinja":
# TODO: these are mostly redirects, but need to handle the ones that aren't
continue
if page.get("parent", "") == "index.html":
sidebar.append(redocly_entry_for(page, pages))
with open("content/sidebars.yaml", "w") as f:
yaml.dump(sidebar, f)
with open("content/redirects.yaml", "w") as f:
yaml.dump(redirects, f)

View File

@@ -1,26 +0,0 @@
##################################################
## Slug Function
## Author: Rome Reginelli
## Copyright: Ripple Labs, 2021
##
## Exports a slug function to be used in templates
## to convert arbitrary text to something suitable
## for use as a CSS class, URL, etc.
##################################################
import re
# Unicode-friendly function for making IDs and similar. Removes any non-word
# characters except -, replaces whitespace with - reduces duplicate dashes,
# and lowercases text
def idify(utext):
"""Make a string ID-friendly (but more unicode-friendly)"""
utext = re.sub(r'[^\w\s-]', '', utext).strip().lower()
utext = re.sub(r'[\s-]+', '-', utext)
if not len(utext):
# IDs and similar must not be an empty string
return '_'
return utext
export = {
"slug": idify
}

View File

@@ -1,24 +0,0 @@
################################################
## Amendment Flask Marker
## Author: Rome Reginelli
## Copyright: Ripple Labs, 2019
##
## Uses the
## - end with an "external link" icon
## (FontAwesome required)
################################################
import os.path
STATUSES = {
":not_enabled:": "component-status_not_enabled.html.jinja",
":removed:": "component-status_removed.html.jinja",
}
def filter_markdown(md, config={}, **kwargs):
for needle, src_file in STATUSES.items():
with open(os.path.join(config["template_path"], src_file)) as f:
replacement = f.read().strip()
md = md.replace(needle, replacement)
return md

View File

@@ -1,232 +0,0 @@
###############################################################################
## Update Links: tool to help change abc.html links to relative links to the md
## source file for the same file.
###############################################################################
import re
import os.path
import ruamel.yaml
yaml = ruamel.yaml.YAML()
from bs4 import BeautifulSoup
from markdown import markdown
LOCAL_HTML_LINK = re.compile(r"(?P<fname>[a-z0-9_-]+\.html)(?P<query>\?[A-Za-z0-9_.%&=-]+)?(?P<anchor>#[a-z_\w%-]+)?")
with open("tool/non_md_links.yaml") as f:
NON_MD_LINKS = yaml.load(f)
UNMATCHED_REFLINK = re.compile(r"\[([^\]]+)?\]\[(\w| )*\]")
REFLINK_DEF = re.compile(r'^\[(?P<label>[^\]]+)\]: (?P<link>.*)$', re.MULTILINE)
REPLACE_IN_PLACE = True # False: only print changes, don't apply. True: open and rewrite files.
COMMON_LINKS_FILE = "content/_snippets/common-links.md"
DONE_SNIPPETS = False
# copy-pasted from md_dactyl_to_redocly because imports are weird
def should_include(fname):
"""
Return True if the given file/folder name should be checked.
Otherwise return False.
"""
if fname == "node_modules":
return False
if ".git" in fname:
return False
return True
def list_mds(content_dir):
all_mds = []
for dirpath, dirnames, filenames in os.walk(content_dir, topdown=True):
dirnames[:] = [d for d in dirnames if should_include(d)]
filenames[:] = [f for f in filenames if should_include(f)]
for filename in filenames:
if filename[-3:] == ".md":
#all_mds.append(os.path.relpath(os.path.join(dirpath,filename), content_dir))
all_mds.append(os.path.join(dirpath,filename))
return all_mds
def find_page(html, pages):
for page in pages:
if page["html"] == html:
# Follow redirects first
if page.get("redirect_url", None) and page["redirect_url"][:8] != "https://":
# Follow the redirect to get the proper replacement page
return find_page(page["redirect_url"], pages)
else:
return page
return None
def list_replacements(pg_srcpath, soup, pages, logger, link_subs={}):
with open("tool/autosubs_cheatsheet.yml") as f:
AUTOSUBS = yaml.load(f)
links = soup.find_all("a", href=True)
find_replace_list = []
for match in links:
rawlink = match["href"]
m = LOCAL_HTML_LINK.match(rawlink)
if m:
link = m.group("fname")
query = m.group("query") or ""
anchor = m.group("anchor") or ""
linked_page = find_page(link, pages)
link_sub = link_subs.get(rawlink, None)
if link_sub:
logger.debug("%s needs link substitution: '%s''%s'"%(pg_srcpath, rawlink, link_sub))
if not linked_page:
logger.warning("Link to missing page "+link)
elif link in NON_MD_LINKS.keys():
abs_path = NON_MD_LINKS[link]
logger.debug("Old link: "+link+query+anchor)
logger.debug("New link: "+abs_path+query+anchor)
# actually only replace (link) so we hopefully don't mess up e.g. frontmatter
old_link = "(%s%s%s)"%(link, query, anchor)
link_repl = "(%s%s%s)"%(abs_path, query, anchor)
find_replace_list.append( (old_link, link_repl) )
elif not linked_page.get("md", ""):
logger.warning("Link to page with no known new link: "+m.group(0))
else:
linked_md = linked_page["md"]
# Fix for links from translated→untranslated
# (The paths *should* be as if from the English version of the file)
relpath_start = pg_srcpath
if "@i18n" in pg_srcpath and "@i18n" not in linked_md:
relpath_start = "/".join(pg_srcpath.split("/")[2:]) # hacky way to trim off "@i18n/{lang}"
rel_path = os.path.relpath(linked_md, start=relpath_start)
logger.debug("Old link: "+link+query+anchor)
logger.debug("New link: "+rel_path+query+anchor)
# actually only replace (link) so we hopefully don't mess up e.g. frontmatter
old_link = "(%s%s%s)"%(link, query, anchor)
new_link = "(%s%s%s)"%(rel_path, query, anchor)
find_replace_list.append( (old_link, new_link) )
# also replace "[Link def]: path.html" in case this was a reference link
reflink_def_link = "]: %s%s%s\n" % (link, query, anchor)
reflink_def_repl = "]: %s%s%s\n" % (rel_path, query, anchor)
find_replace_list.append( (reflink_def_link, reflink_def_repl) )
# # reference links too
# for s in soup.strings:
# matches = re.finditer(UNMATCHED_REFLINK, s)
# for m in matches:
# if m:
# if m.group(2):
# # it's a [text][ref] style link
# old_ref = m.group(2)
# linktext = m.group(1)
# else:
# # probably a [textref][] style link
# old_ref = m.group(1)
# linktext = old_ref
# link = AUTOSUBS.get(old_ref, "")
# if "#" in link:
# link, anchor = link.split("#", 1)
# anchor = "#"+anchor
# else:
# anchor = ""
# if LOCAL_HTML_LINK.match(link):
# linked_page = find_page(link, pages)
# if not linked_page:
# logger.warning("Autolink to missing page "+link)
# elif not linked_page.get("md", ""):
# logger.warning("Autolink to page with no md source "+link)
# else:
# rel_path = os.path.relpath(linked_page["md"], start=pg_srcpath)
# repl_str = "[%s](%s%s)" % (linktext, rel_path, anchor)
# logger.debug("Old link: "+m.group(0))
# logger.debug("New link: "+repl_str)
# find_replace_list.append( (m.group(0), repl_str) )
# elif link:
# # probably a link to a full URL
# repl_str = "[%s](%s%s)" % (linktext, link, anchor)
# logger.debug("Old link: "+m.group(0))
# logger.debug("New link: "+repl_str)
# find_replace_list.append( (m.group(0), repl_str) )
# else:
# logger.warning("Unsure what to do with unmatched reflink "+m.group(0))
return find_replace_list
def do_replacements(fpath, find_replace_list):
#print("%s: Replacing %d links"%(fpath, len(find_replace_list)))
with open(fpath, "r") as f:
contents = f.read()
for old, new in find_replace_list:
contents = contents.replace(old, new)
with open(fpath, "w") as f:
f.write(contents)
def filter_soup(soup, currentpage={}, config={}, pages=[], logger=None, target={}, **kwargs):
# Nop unless you do dactyl_build --vars '{"do_link_replacement":true}'
if not currentpage.get("do_link_replacement", False):
return
global DONE_SNIPPETS
if not DONE_SNIPPETS:
replace_snippet_links(pages, target, logger)
DONE_SNIPPETS = True
if not currentpage.get("md", ""):
logger.debug("Skipping non-md page "+currentpage["html"])
return
link_subs = target.get("legacy_link_subs", {})#Temp testing handling link substitutions
find_replace_list = list_replacements(os.path.dirname(currentpage["md"]), soup, pages, logger, link_subs=link_subs)
if REPLACE_IN_PLACE and find_replace_list:
fpath = os.path.join(config["content_path"], currentpage["md"])
do_replacements(fpath, find_replace_list)
def replace_snippet_links(pages, target, logger):
all_snippets = list_mds("content/_snippets")
for snip in all_snippets:
if snip == COMMON_LINKS_FILE: # special case for this one file. Use absolute links instead of relative.
update_common_links(pages, target, logger)
continue
with open(snip, "r") as f:
md = f.read()
md = markdown(md, extensions=["markdown.extensions.extra"])
soup = BeautifulSoup(md, "html.parser")
snip_path = os.path.relpath(os.path.dirname(snip), start="content")
find_replace_list = list_replacements(snip_path, soup, pages, logger)
if REPLACE_IN_PLACE and find_replace_list:
do_replacements(snip, find_replace_list)
def update_common_links(pages, target, logger):
logger.debug("updating common links list")
with open(COMMON_LINKS_FILE) as f:
common_links_md = f.read()
find_replace_list = []
for m in re.finditer(REFLINK_DEF, common_links_md):
logger.debug("commonlink: "+m.group(0))
rawlink = m.group("link")
m2 = LOCAL_HTML_LINK.match(rawlink)
if m2:
logger.debug("match found: "+m2.group(0))
fname = m2.group("fname")
query = m2.group("query") or ""
anchor = m2.group("anchor") or ""
linked_page = find_page(fname, pages)
if not linked_page:
logger.warning("Common links has autolink to missing page "+fname)
continue
elif fname in NON_MD_LINKS.keys():
abs_path = NON_MD_LINKS[fname]
link = abs_path+query+anchor
find_replace_list.append( (m.group(0), "[%s]: %s"%(m.group("label"), link)) )
elif "md" in linked_page.keys():
abs_path = "/"+linked_page.get("md")
link = abs_path+query+anchor
find_replace_list.append( (m.group(0), "[%s]: %s"%(m.group("label"), link)) )
else:
logger.warning("Common link with no known new link: "+m.group(0))
do_replacements(COMMON_LINKS_FILE, find_replace_list)

View File

@@ -1,33 +0,0 @@
################################################################################
## Use Case Filter ##
## Author: Rome Reginelli ##
## Copyright: Ripple Labs, Inc. 2019 ##
## ##
## Nests a comment-delineated section into a use-case-steps div so it can be ##
## styled properly. ##
################################################################################
import re
START_REGEX = re.compile(r"<!--\s*USE_CASE_STEPS_START\s*-->")
START_REPL = '<div class="use-case-steps">'
END_REGEX = re.compile(r"<!--\s*USE_CASE_STEPS_END\s*-->")
END_REPL = '</div><!--/.use-case-steps-->'
def filter_html(html, mode="html", **kwargs):
"""
Turn multicode comments into a div (after markdown inside is parsed). You
can use this div for styling even in PDF format. Doesn't apply to Markdown
since most parsers won't parse markdown inside HTML blocks.
"""
if mode == "md":
return html
html = re.sub(START_REGEX, START_REPL, html, count=1)
if re.search(END_REGEX, html):
html = re.sub(END_REGEX, "", html)
else:
html = html+"\n"+END_REPL+"\n"
return html

View File

@@ -1,13 +0,0 @@
def filter_markdown(md, **kwargs):
"""
Remove the link to the dev portal from the readme and replace it with
a link to the repo (since we're in the dev portal already).
"""
REMOVE = """## [➡️ XRP API Reference Documentation](https://xrpl.org/xrp-api.html)
See the full reference documentation on the XRP Ledger Dev Portal."""
REPLACEMENT = """[[Source]](https://github.com/xpring-eng/xrp-api "Source")"""
return md.replace(REMOVE, REPLACEMENT)

View File

@@ -1,9 +0,0 @@
#!/bin/bash
## Run from the root directory of the repo to generate & compile all messages
TZ="UTC" pybabel extract -F ./locale/babel.cfg -o ./locale/messages.pot ./
pybabel update -l ja -d ./locale/ -i ./locale/messages.pot
pybabel compile -f -d ./locale/

View File

@@ -1,19 +0,0 @@
#!/bin/bash
echo '# Autosubs cheat sheet
{% include "_snippets/rippled-api-links.md" %}
{% include "_snippets/tx-type-links.md" %}
{% include "_snippets/rippled_versions.md" %}
' > content/autosubs_gen.md
dactyl_build --pages content/autosubs_gen.md --md -q
rm content/autosubs_gen.md
sed -i -r 's/\[|\]/"/g' out/autosubs_gen.md
sed -i -r 's/<!--.*-->//' out/autosubs_gen.md
#sed -i -r 's/ "BADGE_.*"//' out/autosubs_gen.md
cat out/autosubs_gen.md | sort | uniq > tool/autosubs_cheatsheet.yml
sed -i -r 's/^\s+//' tool/autosubs_cheatsheet.yml
sed -i '/./,$!d' tool/autosubs_cheatsheet.yml

View File

@@ -1,20 +0,0 @@
#!/bin/bash
echo '# Common links
{% include "_snippets/rippled-api-links.md" %}
{% include "_snippets/tx-type-links.md" %}
{% include "_snippets/rippled_versions.md" %}
' > content/common-links-gen.md
dactyl_build --pages content/common-links-gen.md --md -q
rm content/common-links-gen.md
#sed -i -r 's/\[|\]/"/g' out/autosubs_gen.md
sed -i 's/# Common links//' out/common-links-gen.md
sed -i -r 's/<!--.*-->//' out/common-links-gen.md
#sed -i -r 's/ "BADGE_.*"//' out/common-links-gen.md
cat out/common-links-gen.md | sort | uniq > content/_snippets/common-links.md
sed -i -r 's/^\s+//' content/_snippets/common-links.md
sed -i '/./,$!d' content/_snippets/common-links.md

View File

@@ -1,351 +0,0 @@
#!/usr/bin/env python
###############################################################################
## Markdown files: Dactyl (Jinja) to Redocly (Markdoc) syntax converter
## Author: mDuo13
## License: MIT
##
## Searches md files in the content dir for specific syntax and converts it to
## a format that should work under Redocly.
##
## 1) includes → partials
## 2) variables:
## a) github_fork / github_branch variables → repo-link component
## b) `{{currentpage.name}}` → code-page-name component
## c) {{currentpage.name}} → frontmatter.seo.title variable
## d) owner / account reserve variables → env variables
## 3) include_code() macro → code-snippet component
## 4) category template → child pages component
## 5) include_svg() → inline-svg component
## 6) callouts → admonitions
## 7) code tabs → tabs component
## 8) badge links → badge component
## 9) :not_enabled: → not-enabled component
###############################################################################
import os
import os.path
import re
import ruamel.yaml
yaml = ruamel.yaml.YAML(typ="safe")
def should_include(fname):
"""
Return True if the given file/folder name should be checked.
Otherwise return False.
"""
if fname == "node_modules":
return False
if fname == "_snippets":
return True
if fname[:1] == "_":
return False
if ".git" in fname:
return False
return True
def list_mds(content_dir):
all_mds = []
for dirpath, dirnames, filenames in os.walk(content_dir, topdown=True):
dirnames[:] = [d for d in dirnames if should_include(d)]
filenames[:] = [f for f in filenames if should_include(f)]
for filename in filenames:
if filename[-3:] == ".md":
#all_mds.append(os.path.relpath(os.path.join(dirpath,filename), content_dir))
all_mds.append(os.path.join(dirpath,filename))
return all_mds
RM_PATTERNS = [
"<!--_ -->",
"<!--{#_ #}-->",
"<!--#{ fix md highlighting_ #}-->",
]
def rm_extra_syntax(ftext):
for s in RM_PATTERNS:
ftext = ftext.replace(s, "")
ftext = ftext.strip()+"\n"
return ftext
COMMON_LINKS_INCLUDES = [
"<!--{# common link defs #}-->",
"<!-- {# common link defs #} -->",
"<!--{## common link defs #}-->",
"{% include '_snippets/rippled-api-links.md' %}",
"{% include '_snippets/tx-type-links.md' %}",
"{% include '_snippets/rippled_versions.md' %}",
]
NEW_COMMON_LINKS = '\n{% raw-partial file="/_snippets/common-links.md" /%}\n'
def update_common_links_includes(ftext):
"""
Remove (with no replacement) the includes that define common links at the
end of a file. Trim out extra whitespace (except last \n)
"""
had_common_links = False
for s in COMMON_LINKS_INCLUDES:
if s in ftext:
had_common_links = True
ftext = ftext.replace(s, "")
ftext = ftext.strip()+"\n"
if had_common_links:
ftext += NEW_COMMON_LINKS
return ftext
class RegexReplacer():
"""
Prototype class for replacing instances of a pattern throughout text
"""
regex: re.compile('')
@staticmethod
def replace(m: re.Match):
"""
To be overridden. Text that should replace an instance of the regex
"""
return ""
def replace_all(self, ftext):
ftext2 = ftext
for m in re.finditer(self.regex, ftext):
raw_string = m.group(0)
repl_string = self.replace(m)
ftext2 = ftext2.replace(raw_string, repl_string)
return ftext2
regex_todos = [] # List of RegexReplacer child instances to run, in order, on each page
class TabsToSpaces(RegexReplacer):
regex = re.compile(r'\t')
replace = staticmethod(lambda m: " ")
regex_todos.append(TabsToSpaces())
class IncludeCodeReplacer(RegexReplacer):
regex = re.compile(r'\{\{ *include_code\( *"(?P<fname>[^"]+)"[,\s]*(start_with="(?P<start_with>[^"]+)"[,\s]*|end_before="(?P<end_before>[^"]+)"[,\s]*|language="(?P<language>[^"]+)"[,\s]*)* *\) *\}\}')
@staticmethod
def replace(m: re.Match):
"""
Convert instances of the include_code() filter to instances
of the code-snippet Redocly component.
"""
repl_string = '{% code-snippet file="/'+m.group("fname")+'" '
if m.group("start_with"):
repl_string += 'from="'+m.group("start_with")+'" '
if m.group("end_before"):
repl_string += 'before="'+m.group("end_before")+'" '
if m.group("language"):
repl_string += 'language="'+m.group("language")+'" '
repl_string += '/%}'
return repl_string
regex_todos.append(IncludeCodeReplacer())
class IncludeSvgReplacer(RegexReplacer):
regex = re.compile(r'\{\{ *include_svg\( *"(?P<fname>[^"]+)"[, ]*("(?P<caption>[^"]*)")?[, ]*(classes="(?P<classes>[^"]*)")?\) *}}')
@staticmethod
def replace(m):
return '[{% inline-svg file="/' + m.group("fname") + '" /%}](/'+m.group("fname")+' "'+m.group("caption")+'")'
regex_todos.append(IncludeSvgReplacer())
class PrefixedCodeSnippetReplacer(RegexReplacer):
regex = re.compile(r"""```(?P<language>\w*)\n(?P<prefix>[^{`]+)\n\{% include ['"](?P<path>[^'"]+)['"] %\}\s*```""")
@staticmethod
def replace(m: re.Match):
escaped_prefix = m.group("prefix").replace("\n","\\n").replace('"', '\\"')+"\\n"
return '{% code-snippet file="/'+m.group("path")+'" language="'+m.group("language")+'" prefix="'+escaped_prefix+'" /%}'
regex_todos.append(PrefixedCodeSnippetReplacer())
class PlainCodeIncludeReplacer(RegexReplacer):
regex = re.compile(re.compile(r"""```(?P<language>\w*)\n\{% include ['"](?P<path>[^'"]+)['"] %\}\s*```"""))
replace = staticmethod(lambda m: '{% code-snippet file="/'+m.group("path")+'" language="'+m.group("language")+'" /%}')
regex_todos.append(PlainCodeIncludeReplacer())
class SnippetReplacer(RegexReplacer):
# Redocly requires partials to end in md due to Mardoc limitations.
# Other includes need to be converted to code-snippet instances instead.
regex = re.compile(r"\{% *include *'(?P<path>_[^']+\.md)' *%\}")
@staticmethod
def replace(m: re.Match):
fpath = m.group("path").replace(".ja.md", ".md")
return '{{% partial file="/{fpath}" /%}}'.format(fpath=fpath)
regex_todos.append(SnippetReplacer())
class RepoLinkReplacer(RegexReplacer):
"""
Replacement for links that use {{github_forkurl}} and {{github_branch}}.
Uses a custom repo-link component to pull info from .env, since variables
can't be evaluated inside the href of a link.
Note, this has to be run before general vars replacement since it covers a
special case that's larger than one variable.
"""
regex = re.compile(r"\[(?P<linktext>[^\]]+)\]\(\{\{ *target\.github_forkurl *\}\}/(tree|blob)/\{\{ *target\.github_branch *\}\}/(?P<path>[^\)]+)\)")
replace = staticmethod(lambda m: '{% repo-link path="'+m.group("path")+'" %}'+m.group("linktext")+'{% /repo-link %}')
regex_todos.append(RepoLinkReplacer())
class CodePageNameReplacer(RegexReplacer):
regex = re.compile(r"`\{\{ *(target|currentpage)\.name *\}\}`")
@staticmethod
def replace(m: re.Match):
return '{% code-page-name /%}'
regex_todos.append(CodePageNameReplacer())
class VarReplacer(RegexReplacer):
regex = re.compile(r"\{\{ *(target|currentpage)\.(?P<var>[a-z_]+) *}}")
@staticmethod
def replace(m):
if m.group("var") == "name":
return '{% $frontmatter.seo.title %}'
else:
return '{% $env.PUBLIC_'+m.group("var").upper()+" %}"
regex_todos.append(VarReplacer())
class TabsReplacer(RegexReplacer):
"""
Meat to run after all the code block replacers
"""
regex = re.compile(r'<!-- MULTICODE_BLOCK_START -->(.*?)<!-- MULTICODE_BLOCK_END -->', re.DOTALL)
@staticmethod
def replace(m: re.Match):
repl_string = "{% tabs %}\n\n"
indent = ""
code_tab_regex = re.compile(r'^[*_](?P<tabname>[^_*]+)[*_]\n+(?P<codeblock>```.+?```|\{% code-snippet .+? /%\}$)', re.MULTILINE|re.DOTALL)
if not code_tab_regex.search(m.group(1)):
indented_code_tab_regex = re.compile(r'^(?P<indentation> {4,})[*_](?P<tabname>[^_*]+)[*_]\n\n(?P<codeblock>( {8,}.*|\n)+)\n\n', re.MULTILINE)
double_indented_code_tab_regex = re.compile(r'^(?P<indentation> {8,})[*_](?P<tabname>[^_*]+)[*_]\n\n(?P<codeblock>( {12,}.*|\n)+)\n\n', re.MULTILINE) # Same as above except one level of indent more.
if indented_code_tab_regex.search(m.group(1)):
use_regex = indented_code_tab_regex
if double_indented_code_tab_regex.search(m.group(1)):
use_regex = double_indented_code_tab_regex
for m2 in re.finditer(use_regex, m.group(1)):
indent = m2.group("indentation")
repl_string += indent + '```{% label="'+m2.group("tabname")+'" %}\n'
for codeline in m2.group("codeblock").split("\n"):
if not codeline.strip():
repl_string += "\n"
else:
# Remove extra level of indentation since we're changing it to a fence.
# If the codeline isn't long enough, the md file probably has a syntax error.
repl_string += codeline[4:]+"\n"
# trim any excess trailing newlines
repl_string = repl_string.rstrip()+"\n"
repl_string += indent+'```\n\n'
else:
print("ERROR, no tab found in code tabs")
print(m.group(1))
exit(1)
for m2 in re.finditer(code_tab_regex, m.group(1)):
repl_string += '{% tab label="'+m2.group("tabname")+'" %}\n'
repl_string += m2.group("codeblock").strip() + "\n"
repl_string += '{% /tab %}\n\n'
repl_string += indent+"{% /tabs %}"
return repl_string
regex_todos.append(TabsReplacer())
callout_mapping = {
# lowercase callout name → admonition type
"tip": "success",
"note": "info",
"caution": "warning",
"warning": "danger",
"ヒント": "success",
"注記": "info",
"注意": "warning",
"警告": "danger",
}
class BQCalloutReplacer(RegexReplacer):
regex = re.compile(r'^\> [*_]{1,2}(?P<label>Tip|Note|Caution|Warning|ヒント|注記|注意|警告):?[*_]{1,2} (?P<content>(.*)(\n\> ?.*)*)$', re.MULTILINE|re.I)
@staticmethod
def replace(m: re.Match):
admontype = callout_mapping[m.group("label").lower()]
bq_start = re.compile(r'^\> |^\>$', re.MULTILINE)
content = bq_start.sub('', m.group("content"))
repl_string = '{% admonition type="'+admontype+'" name="'+m.group("label")+'" %}\n'+content+'\n{% /admonition %}'
return repl_string
regex_todos.append(BQCalloutReplacer())
class OnelineCalloutReplacer(RegexReplacer):
regex = re.compile(r'^(?P<indentation>\s*)[*_]{1,2}(?P<label>Tip|Note|Caution|Warning|ヒント|注記|注意|警告):?[*_]{1,2} (?P<content>.*)$', re.I)
@staticmethod
def replace(m: re.Match):
admontype = callout_mapping[m.group("label").lower()]
if m.group("indentation"):
repl_string = m.group("indentation")+'{% admonition type="'+admontype+'" name="'+m.group("label")+'" %}'+m.group("content")+'{% /admonition %}'
else:
repl_string = '{% admonition type="'+admontype+'" name="'+m.group("label")+'" %}\n'+m.group("content")+'\n{% /admonition %}'
return repl_string
regex_todos.append(OnelineCalloutReplacer())
class ImgPathReplacer(RegexReplacer):
regex = re.compile(r'\]\(img/([^)]+)\)')
@staticmethod
def replace(m: re.Match):
return "](/img/"+m.group(1)+")"
regex_todos.append(ImgPathReplacer())
class BadgeReplacer(RegexReplacer):
regex = re.compile(r'\[(?P<text>[^\]]+)\]\((?P<href>[^ ]*)\s+"BADGE_(?P<color>\w+)"\)')
@staticmethod
def replace(m: re.Match):
s = '{% badge '
#s += 'color="'+m.group("color")+'" '
if m.group("href"):
s += 'href="'+m.group("href")+'" '
s += '%}'+m.group("text")+'{% /badge %}'
return s
regex_todos.append(BadgeReplacer())
class NotEnabledReplacer(RegexReplacer):
regex = re.compile(r':not_enabled:')
replace = staticmethod(lambda s: '{% not-enabled /%}')
regex_todos.append(NotEnabledReplacer())
category_regex = re.compile(r'^#?template: *pagetype-category\.html\.jinja\n', re.MULTILINE)
def convert_category_page(ftext):
if not category_regex.search(ftext):
return ftext
ftext2 = re.sub(category_regex, "metadata:\n indexPage: true\n", ftext)
ftext2 = ftext2 + "\n\n{% child-pages /%}\n"
return ftext2
reflink_regex = re.compile(r"\[(?P<label>[^\]]+)\]\[\]")
badge_ref_regex = re.compile(r'(?P<href>[^ ]*)\s+"BADGE_(?P<color>\w+)"')
with open("tool/autosubs_cheatsheet.yml") as f:
AUTOSUBS = yaml.load(f)
def convert_reusable_badges(ftext):
if not reflink_regex.search(ftext):
return ftext
for m in reflink_regex.finditer(ftext):
if m.group("label") in AUTOSUBS.keys():
ref_target = AUTOSUBS[m.group("label")]
m2 = badge_ref_regex.match(ref_target)
if m2:
# Note: color intentionally omitted so it can be auto-set.
repl_string = '{% badge href="'+m2.group("href")+'" %}'+m.group("label")+'{% /badge %}'
ftext = ftext.replace(m.group(0), repl_string)
return ftext
def main():
all_mds = list_mds("content")
for fname in all_mds:
with open(fname) as f:
ftext = f.read()
ftext2 = rm_extra_syntax(ftext)
ftext2 = update_common_links_includes(ftext2)
for replacer in regex_todos:
ftext2 = replacer.replace_all(ftext2)
ftext2 = convert_reusable_badges(ftext2)
ftext2 = convert_category_page(ftext2)
if ftext2 != ftext:
#print("performing syntax conversion in", fname)
with open(fname, "w") as f:
f.write(ftext2)
main()

View File

@@ -1,38 +0,0 @@
#!/bin/bash
# Migrate links script. Requires a "working"(ish) Dactyl build, so it should be run before md_dactyl_to_redocly.py or convert-code-blocks.cjs
# Update the autosubs_cheatsheet.yml file based on the typical link includes.
tool/make_autosubs.sh
# Make a new "common links" snippet to replace the old ones.
tool/make_common_links_snippet.sh
# Re-generate the Redocly sidebar and redirects.yaml based on Dactyl pagelist.
dactyl_build --vars '{"do_redocly_sidebar":true}'
# Blank the snippets that contain reusable links, so the md reference links will remain unparsed as [Link text][]
truncate -s 0 content/_snippets/rippled-api-links.md
truncate -s 0 content/_snippets/tx-type-links.md
truncate -s 0 content/_snippets/rippled_versions.md
# Link replacement (English)
dactyl_build --vars '{"do_link_replacement":true}' -q
# Link replacement (Japanese)
dactyl_build -t ja -o out/ja --vars '{"do_link_replacement":true}' -q
# Blank this snippet which contains a Jinja macro (not needed, throws errors)
truncate -s 0 content/_snippets/macros/page-children.md
# Move Japanese snippets from _snippets/*.ja.md to @i18n/ja/_snippets/*.md
cd content/_snippets
find . -type d -exec sh -c 'mkdir -p "../@i18n/ja/_snippets/$0"' {} \;
find . -name "*.ja.md" -exec sh -c 'mv "$0" "../@i18n/ja/_snippets/${0%.ja.md}.md"' {} \;
cd ../..
# Convert Dactyl syntax to Redocly syntax
tool/md_dactyl_to_redocly.py
# Convert indented code blocks to (possibly-indented) code fences
node tool/convert-code-blocks.cjs content/

View File

@@ -1,33 +0,0 @@
"xrp-ledger-rpc-tool.html": "/resources/dev-tools/rpc-tool"
"xrp-ledger-toml-checker.html": "/resources/dev-tools/xrp-ledger-toml-checker"
"domain-verification-checker.html": "/resources/dev-tools/domain-verification-checker"
"websocket-api-tool.html": "/resources/dev-tools/websocket-api-tool"
"xrp-testnet-faucet.html": "/resources/dev-tools/xrp-faucets"
"xrp-test-net-faucet.html": "/resources/dev-tools/xrp-faucets"
"tx-sender.html": "/resources/dev-tools/tx-sender"
"uses.html": "/about/uses"
"docs.html": "/docs/"
"xrp-ledger-overview.html": "/about/"
"xrp-overview.html": "/about/xrp"
"overview.html": "/about/"
"history.html": "/about/history"
"impact.html": "/about/impact"
"carbon-calculator.html": "/about/impact"
"contribute.html": "/community"
"events.html": "/community/events"
"ambassadors.html": "/community/ambassadors"
"developer-funding.html": "/community/developer-funding"
"code-samples.html": "/resources/code-samples"
"dev-tools.html": "/resources/dev-tools/"
"dev-tools-dev-tools.html": "/resources/dev-tools/"
"validator-domain-verifier.html": "/resources/dev-tools/domain-verifier/"
# Special case: page that we'd like to re-create later but don't have ready yet.
"docs-index.html": "/docs/"
# Legacy pages
"explore.html": "/about/"
"wallet.html": "/about/xrp"
"exchanges.html": "/about/xrp"
"businesses.html": "/about/uses"
"ripple-txt-validator.html": "/resources/dev-tools/xrp-ledger-toml-checker"
"production-readiness.html": "/tutorials" # TODO: change to /docs/tutorials after re-levelization?
"get-started.html": "/tutorials" # TODO: change to /docs/tutorials after re-levelization?

View File

@@ -1,79 +0,0 @@
#Ripple style guidelines
cold wallet: issuing address
hot wallet: operational address
market maker: liquidity provider
warm wallet: standby address
ripple network: Ripple Consensus Ledger, Ripple peer-to-peer network
defaults to: the default is
#Plainlanguage.gov guidelines (adapted)
and/or: __ or __ or both
addressees are requested: (omit), please
adjacent to: next to
adversely impact on: hurt, set back
afford an opportunity: allow, let
a number of: some
arrive onboard: arrive
as a means of: to
as prescribed by: in, under
at the present time: at present, now
be advised: (omit)
by means of: by, with
close proximity: near
combat environment: combat
# comply with: follow
due to the fact that: due to, since
during the period: during
effect modifications: make changes
failed to: didn't
for a period of: for
has a requirement for: needs
in accordance with: by, following, per, under
in addition: also, besides, too
in an effort to: to
in a timely manner: on time, promptly
incumbent upon: must
in lieu of: instead
in order that: for, so
inter alia: (omit)
interpose no objection: don't object
in order for: for
in order to: to
in regard to: about, concerning, on
in relation to: about, with, to
#in the amount of: for
in the event of: if
in the near future: shortly, soon
in the process of: (omit)
in view of: since
in view of the above: so
inasmuch as: since
is applicable to: applies to
is authorized to: may
is in consonance with: agrees with, follows
is responsible for: (omit) handles
#it appears: seems
#it is: (omit)
it is essential: must, need to
it is requested: please, we request, I request
limited number: limits
not later than: by, before
pertaining to: about, of, on
prior to: before
provided that: if
provides guidance for: guides
pursuant to: by, following, per, under
set forth in: in
# similar to: like
successfully complete: complete, pass
take action to: (omit)
the month of: (omit)
#there is: (omit)
the undersigned: I
the use of: (omit)
time period: (either one)
under the provisions of: under
until such time as: until
with reference to: about
with the exception of: except for
your office: you

View File

@@ -1,297 +0,0 @@
# Data Types
hash128
hash160
hash256
starray
uint16
uint256
uint32
uint64
uint8
vector256
accountid
STObject
STIssue
# General purpose words
12th
20th
100th
512half
account_one
account_zero
altnet
altnets
aml
amm
AMMs
autobridging
base58
base58check
base64
blockchains
checkbox
cmake
codebases
config
cors
counterparty
counterparties
crypto
dapp
datastore
datastores
demurrage
demurraging
deserialization
devnet
ecdsa
ecmascript
ed25519
eddsa
etl
federators
fincen
gravatar
GPG
grpc
GUIs
hmac
interledger
interoperability
IPFS
kyc
lz4
mainchain
mainnet
micropayments
middleware
multisigning
NFT
NFTs
noripple
nudb
onboarding
p2p
pathfinding
pathset
permissionless
postgresql
preauthorizations
proactively
quickstart
readme
refactor
reputational
ripemd160
rippleapi
rocksdb
rtxp
secp256k1
semver
shor
sidechain
sidechains
SSDs
SSL
stablecoin
stablecoins
statsd
testnet
TLS
toolkits
tooltip
tooltips
unl
unls
unstake
v0
v1
v2
v10
validators
web3
workflows
XLS
XRPL
# rippled API methods
account_channels
account_currencies
account_info
account_lines
account_nfts
account_objects
account_offers
account_tx
amm_info
book_offers
can_delete
channel_authorize
channel_verify
consensus_info
crawl_shards
deposit_authorized
download_shard
fetch_info
gateway_balances
get_counts
ledger_accept
ledger_cleaner
ledger_closed
ledger_current
ledger_data
ledger_entry
ledger_request
log_level
logrotate
node_to_shard
noripple_check
nft_buy_offers
nft_info
nft_sell_offers
path_find
peer_reservations_add
peer_reservations_del
peer_reservations_list
ripple_path_find
server_info
server_state
sign_for
submit_multisigned
transaction_entry
tx_history
validation_create
validation_seed
validator_info
validator_list_sites
wallet_propose
# XRP Ledger transaction types
accountdelete
accountset
ammbid
ammcreate
ammdeposit
ammvote
ammwithdraw
checkcancel
checkcash
checkcreate
enableamendment
escrowcancel
escrowcreate
escrowfinish
nftoken
nftokens
nftokenoffer
nftokenmint
nftokenburn
nftokenacceptoffer
nftokencanceloffer
nftokencreateoffer
offercancel
offercreate
paymentchannelclaim
paymentchannelcreate
paymentchannelfund
setfee
setregularkey
signerlistset
TicketCreate
trustset
UNLModify
# XRP Ledger ledger entries
accountroot
directorynode
feesettings
ledgerhashes
NFTokenPage
paychannel
ripplestate
signerlist
# XRP Ledger amendment names
checkcashmakestrustline
cryptoconditions
cryptoconditionssuite
deletableaccounts
depositauth
depositpreauth
enforceinvariants
expandedsignerlist
fix1201
fix1368
fix1373
fix1512
fix1513
fix1515
fix1523
fix1528
fix1543
fix1571
fix1578
fix1623
fix1781
fixamendmentmajoritycalc
fixcheckthreading
fixmasterkeyasregularkey
fixnftokendirv1
fixnftokennegoffer
fixpaychanrecipientownerdir
fixqualityupperbound
fixremovenftokenautotrustline
fixrmsmallincreasedqoffers
fixstamountcanonicalize
fixtakerdryofferremoval
fixtrustlinestoself
flowcross
flowsortstrands
flowv2
feeescalation
hardenedvalidations
multisign
multisignreserve
negativeunl
nonfungibletokensv1
nonfungibletokensv1_1
ownerpaysfee
paychan
requirefullycanonicalsig
shamapv2
sorteddirectories
suspay
ticketbatch
ticksize
trustsetauth
# Names of people, orgs, etc.
asheesh
AWS
bharath
bithomp
Bitstamp
bittorrent
britto
ethermint
evm
horcrux
Keybase
macbrough
McCaleb
metamask
opensea
RippleX
scylladb
sologenic
tendermint
wxPython
xpring
xrpcharts
xrpchat
Xrplorer
xrpscan
xrpl4j
XRPLF
xumm

View File

@@ -1,157 +0,0 @@
#Ripple Style Guide suggestions
consult: see
# gateway: financial institution, issuer
# gateways: financial institutions, issuers
wallet: address, client application, account
ious: tokens
will: (avoid future tense)
#Plainlanguage.gov suggestions (adapted for Ripple)
accompany: go with
accomplish: carry out, do
accorded: given
# accordingly: so
accrue: add, gain
accurate: correct, exact, right
#additional: added, more, other
addressees: you
advantageous: helpful
advise: recommend, tell
aircraft: plane
allocate: divide
anticipate: expect
apparent: clear, plain
appreciable: many
#approximate: about
ascertain: find out, learn
assist: aid, help
assistance: aid, help
attain: meet
#attempt: try
basically: (omit)
#benefit: help
capability: ability
caveat: warning
clearly: (omit)
#combined: joint
commence: begin, start
component: part
comprise: form, include, make up
concerning: about, on
consequently: so
consolidate: combine, join, merge
constitutes: is, forms, makes up
convene: meet
#currently: (omit), now
deem: believe, consider, think
#delete: cut, drop
demonstrate: prove, show
depart: leave
designate: appoint, choose, name
desire: want, wish
#determine: decide, figure, find
# disclose: show
discontinue: drop, stop
disseminate: give, issue, pass, send
easy: (omit)
easily: (omit)
elect: choose, pick
eliminate: cut, drop, end
employ: use
encounter: meet
endeavor: try
#ensure: make sure
enumerate: count
equipments: equipment
equitable: fair
establish: set up, create, prove
evidenced: showed
evident: clear
exhibit: show
expedite: hasten, speed up
expeditious: fast, quick
expend: spend
# expertise: ability
#expiration: end
facilitate: ease, help
feasible: can be done, workable
females: women
finalize: complete, finish
forfeit: give up, lose
#forward: send
frequently: often
furnish: give, send
herein: here
heretofore: until now
herewith: below, here
identical: same
#identify: find, name, show
impacted: affected, changed
inception: start
indication: sign
#initial: first
initiate: start
insane: (omit)
just: (omit)
liaison: discussion
magnitude: size
#maintain: keep, support
methodology: method
#minimize: decrease, method
#modify: change
#monitor: check, watch
necessitate: cause, need
notify: let know, tell
notwithstanding: inspite of, still
numerous: many
objective: aim, goal
obligate: bind, compel
observe: see
obviously: (omit)
operate: run, use, work
optimum: best, greatest, most
#perform: do
performed: done
permit: let
portion: part
possess: have, own
practicable: practical
preclude: prevent
prioritize: rank
proceed: do, go ahead, try
procure: (omit)
proficiency: skill
promulgate: issue, publish
purchase: buy
reflect: say, show
regarding: about, of, on
relocate: move
#remain: stay
remainder: rest
remuneration: pay, payment
render: give, make
reside: live
retain: keep
selection: choice
sexy: (omit)
simple: (omit)
simply: (omit)
solicit: ask for, request
state-of-the-art: latest
subsequent: later, next
subsequently: after, later, then
substantial: large, much
sufficient: enough
terminate: end, stop
therefore: so
therein: there
thereof: its, their
timely: prompt
transmit: send
utilize: use
utilization: use
viable: practical, workable
vice: instead of, versus
warrant: call for, permit
whereas: because, since
witnessed: saw

View File

@@ -1,115 +0,0 @@
#!/bin/env python
"""
Tool to parse a markdown file for WebSocket examples,
reformat those examples as JSON-RPC, and test them against
a public WebSocket server.
"""
from __future__ import print_function
import re, json, sys, warnings, argparse
if sys.version_info[:2] <= (2,7):
import httplib
#gotta define this
class FileNotFoundError(IOError):
pass
else:
import http.client as httplib
RIPPLED_RPC_HOST = "s1.ripple.com"
RIPPLED_RPC_PORT = 51234
def ws2rpc(s):
ws_j = json.loads(s)
if "command" not in ws_j:
#apparently not a WebSocket request after all?
warnings.warn("Incorrect match? "+s)
return ""
rpc_j = {"params":[{}]}
for key,val in ws_j.items():
if key == "id":
continue
elif key == "command":
rpc_j["method"] = val
else:
rpc_j["params"][0][key] = val
return json.dumps(rpc_j, sort_keys=True, indent=4, separators=(',', ': '))
def do_JSONRPC(req, host, port):
conn = httplib.HTTPConnection(host, port)
conn.request("POST", "/", js)
response = conn.getresponse()
s = response.read()
header = "%s %s" % (response.status, response.reason)
return (header, s)
def find_ws_in_markdown(md_text):
WS_REGEX = r"\*WebSocket\*\s*```\s*(?P<json>\{[^`]*\})\s*```"
matches = re.findall(WS_REGEX, md_text)
return matches
def print_md_for_request(json_rpc_text):
print("""Request:
*JSON-RPC*
```
%s
```
""" % json_rpc_text)
def print_md_for_response(json_rpc_text):
header, response_body = do_JSONRPC(js, args.rippled_host, args.rippled_port)
try:
#parse & pretty-print response JSON if valid
response_json = json.loads(response_body.decode("utf-8"))
response_body = json.dumps(response_json, sort_keys=True,
indent=4, separators=(',', ': '))
except ValueError:
#invalid JSON; leave response as-is
pass
print("""Response:
*JSON-RPC*
```
%s
%s
```""" % (header, response_body) )
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Convert WebSocket examples to JSON-RPC with responses from the live rippled network")
parser.add_argument("inputfile")
parser.add_argument("--offline", action="store_true", help="don't connect to the network to generate responses", default=False)
parser.add_argument("--json", "-j", action="store_true", help="assume input file is raw JSON in websocket format", default=False)
parser.add_argument("--rippled_host", help="hostname of a rippled server to use", type=str, default=RIPPLED_RPC_HOST)
parser.add_argument("--rippled_port", help="port number of a rippled server to use", type=int, default=RIPPLED_RPC_PORT)
args = parser.parse_args()
with open(args.inputfile, "r") as f:
f_text = f.read()
if args.json:
js = ws2rpc(f_text)
print_md_for_request(js)
if not args.offline:
print_md_for_response(js)
else:
matches = find_ws_in_markdown(f_text)
for s in matches:
js = ws2rpc(s)
print_md_for_request(js)
if not args.offline:
print_md_for_response(js)

View File

@@ -67,7 +67,7 @@
href: https://learn.xrpl.org/
external: true
- label: XRPL Brand Kit
href: /static/XRPL_Brand_Kit.zip
href: /XRPL_Brand_Kit.zip
- group: Current Status
items:
- label: Ledger Explorer