mirror of
https://github.com/Xahau/xahau-web.git
synced 2025-11-04 12:15:49 +00:00
Merge branch 'main' into fix-table-code
This commit is contained in:
@@ -6,6 +6,7 @@ import starlight from '@astrojs/starlight'
|
||||
import tailwindcss from '@tailwindcss/vite'
|
||||
import { defineConfig } from 'astro/config'
|
||||
import starlightOpenAPI, { openAPISidebarGroups } from 'starlight-openapi'
|
||||
import { remarkGlobalReferences } from './src/plugins/remarkGlobalReferences'
|
||||
|
||||
// https://astro.build/config
|
||||
export default defineConfig({
|
||||
@@ -311,6 +312,9 @@ export default defineConfig({
|
||||
}),
|
||||
mdx(),
|
||||
],
|
||||
markdown: {
|
||||
remarkPlugins: [remarkGlobalReferences],
|
||||
},
|
||||
vite: {
|
||||
plugins: [tailwindcss()],
|
||||
},
|
||||
|
||||
15
package-lock.json
generated
15
package-lock.json
generated
@@ -18,6 +18,7 @@
|
||||
"astro": "^5.10.1",
|
||||
"react": "^19.1.0",
|
||||
"react-dom": "^19.1.0",
|
||||
"remark-reference-links": "^7.0.0",
|
||||
"starlight-openapi": "^0.19.1",
|
||||
"tailwindcss": "^4.1.11",
|
||||
"vanilla-cookieconsent": "^3.1.0"
|
||||
@@ -6421,6 +6422,20 @@
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
},
|
||||
"node_modules/remark-reference-links": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/remark-reference-links/-/remark-reference-links-7.0.0.tgz",
|
||||
"integrity": "sha512-OMACEps7CkpBio5nutUToCcXFJr9QkkoHdku41iIholMdFZ0jdRxgFmPm2B7R+DSvW83ZShdA3ubWTH+C3M6Eg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/mdast": "^4.0.0",
|
||||
"unist-util-visit": "^5.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
},
|
||||
"node_modules/remark-rehype": {
|
||||
"version": "11.1.2",
|
||||
"resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz",
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
"astro": "^5.10.1",
|
||||
"react": "^19.1.0",
|
||||
"react-dom": "^19.1.0",
|
||||
"remark-reference-links": "^7.0.0",
|
||||
"starlight-openapi": "^0.19.1",
|
||||
"tailwindcss": "^4.1.11",
|
||||
"vanilla-cookieconsent": "^3.1.0"
|
||||
|
||||
@@ -41,7 +41,7 @@ All interactions with this amendment are via the ClaimReward transaction:
|
||||
|
||||
```json
|
||||
{
|
||||
"Account": "<rAddr...>",
|
||||
"Account": "<rAddr...>",
|
||||
"TransactionType": "ClaimReward",
|
||||
"Issuer": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"NetworkID": 21337
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: Account Managment
|
||||
---
|
||||
import { Aside } from '@astrojs/starlight/components';
|
||||
import { LinkCard } from '@astrojs/starlight/components';
|
||||
|
||||
The Account Management features in the Xahau network are a crucial component for users to manage their accounts effectively.
|
||||
|
||||
@@ -13,25 +13,25 @@ This includes several transaction types that enable users to perform various ope
|
||||
|
||||
The `AccountSet` transaction type allows users to modify the properties of their accounts. This includes settings such as transfer rate, account flags, and more.
|
||||
|
||||
[accountset.md](/docs/protocol-reference/transactions/transaction-types/accountset.md)
|
||||
<LinkCard title="AccountSet" href="/docs/protocol-reference/transactions/transaction-types/accountset" />
|
||||
|
||||
#### AccountDelete
|
||||
|
||||
The `AccountDelete` transaction type enables users to delete their accounts from the Xahau network. This operation is irreversible and should be used with caution.
|
||||
|
||||
[accountdelete.md](/docs/protocol-reference/transactions/transaction-types/accountdelete.md)
|
||||
<LinkCard title="AccountDelete" href="/docs/protocol-reference/transactions/transaction-types/accountdelete" />
|
||||
|
||||
#### SetRegularKey
|
||||
|
||||
The `SetRegularKey` transaction type allows users to set a regular key pair for their account. This key pair can be used as an alternative to the master key pair for signing transactions.
|
||||
|
||||
[setregularkey.md](/docs/protocol-reference/transactions/transaction-types/setregularkey.md)
|
||||
<LinkCard title="SetRegularKey" href="/docs/protocol-reference/transactions/transaction-types/setregularkey" />
|
||||
|
||||
#### SignersListSet
|
||||
|
||||
The `SignersListSet` transaction type enables users to set a list of signers for their account. This is particularly useful for multi-signature accounts where multiple parties are required to sign off on transactions.
|
||||
|
||||
[signerlistset.md](/docs/protocol-reference/transactions/transaction-types/signerlistset.md)
|
||||
<LinkCard title="SignersListSet" href="/docs/protocol-reference/transactions/transaction-types/signerlistset" />
|
||||
|
||||
#### Import
|
||||
|
||||
@@ -39,6 +39,6 @@ The `Import` transaction type is used to import transactions from other networks
|
||||
|
||||
Please note that the process of importing for the issuer involves specific transaction types and requires careful configuration. Always ensure that the hooks are correctly set up and that the transactions are valid for the intended operations.
|
||||
|
||||
[import.md](/docs/protocol-reference/transactions/transaction-types/import.md)
|
||||
<LinkCard title="Import" href="/docs/protocol-reference/transactions/transaction-types/import" />
|
||||
|
||||
These transaction types provide users with a comprehensive set of tools for managing their accounts on the Xahau network. As with all operations, users should ensure they understand the implications of each transaction type before use.
|
||||
|
||||
13
src/content/references/global.md
Normal file
13
src/content/references/global.md
Normal file
@@ -0,0 +1,13 @@
|
||||
<!-- Currently, remarkPlugins does not support HMR, so you will need to restart the dev server if you change this file. -->
|
||||
[Internal Type]: /docs/protocol-reference/binary-format
|
||||
[Sequence Number]: /docs/protocol-reference/data-types/#account-sequence
|
||||
[Index Number]: /docs/protocol-reference/data-types/#index-number
|
||||
[SHA-512Half]: /docs/protocol-reference/data-types/#hashes
|
||||
[Specifying Time]: /docs/protocol-reference/data-types/#specifying-time
|
||||
[seconds since the Ripple Epoch]: /docs/protocol-reference/data-types/#specifying-time
|
||||
[Ledger Index]: /docs/protocol-reference/data-types/#ledger-index
|
||||
[ledger index]: /docs/protocol-reference/data-types/#ledger-index
|
||||
[Hash]: /docs/protocol-reference/data-types/#hashes
|
||||
[Address]: /docs/protocol-reference/data-types/#addresses
|
||||
[Currency Amount]: /docs/protocol-reference/data-types/#specifying-currency-amounts
|
||||
[drops of XAH]: /docs/protocol-reference/data-types/#specifying-currency-amounts
|
||||
5
src/content/references/pseudo-transactions.md
Normal file
5
src/content/references/pseudo-transactions.md
Normal file
@@ -0,0 +1,5 @@
|
||||
EnableAmendment
|
||||
EmitFailure
|
||||
SetFee
|
||||
UNLModify
|
||||
UNLReport
|
||||
38
src/content/references/transactions.md
Normal file
38
src/content/references/transactions.md
Normal file
@@ -0,0 +1,38 @@
|
||||
AccountDelete
|
||||
AccountSet
|
||||
CheckCancel
|
||||
CheckCash
|
||||
CheckCreate
|
||||
ClaimReward
|
||||
Clawback
|
||||
DepositPreauth
|
||||
EscrowCancel
|
||||
EscrowCreate
|
||||
EscrowFinish
|
||||
GenesisMint
|
||||
Import
|
||||
Invoke
|
||||
NFTokenAcceptOffer
|
||||
NFTokenBurn
|
||||
NFTokenCancelOffer
|
||||
NFTokenCreateOffer
|
||||
NFTokenMint
|
||||
OfferCancel
|
||||
OfferCreate
|
||||
Payment
|
||||
PaymentChannelClaim
|
||||
PaymentChannelCreate
|
||||
PaymentChannelFund
|
||||
Remit
|
||||
SetHook
|
||||
SetRegularKey
|
||||
SetRemarks
|
||||
SignerListSet
|
||||
SpinalTap
|
||||
TicketCreate
|
||||
TrustSet
|
||||
URITokenBurn
|
||||
URITokenBuy
|
||||
URITokenCancelSellOffer
|
||||
URITokenCreateSellOffer
|
||||
URITokenMint
|
||||
@@ -76,7 +76,7 @@ const { frontmatter } = Astro.props
|
||||
</div>
|
||||
<div class="text-black flex flex-col col-span-2 md:col-span-3 row-start-auto md:row-start-2 min-h-40 items-start justify-end p-4 bg-white border-black border-2">
|
||||
<h3 class="text-xl md:text-2xl font-semibold">Ledgers closed</h3>
|
||||
<h4 class="text-4xl md:text-6xl font-extrabold">15M+</h4>
|
||||
<h4 class="text-4xl md:text-6xl font-extrabold">16M+</h4>
|
||||
</div>
|
||||
<a href="/docs/infrastructure/node-requirements/" class="col-span-3 row-start-auto md:row-start-2 px-10 h-12 flex items-center justify-center bg-xahau-green text-black text-base font-bold hover:bg-black hover:text-white transition">Want to run a node?</a>
|
||||
</div>
|
||||
|
||||
@@ -40,7 +40,7 @@ Because of Hooks, the burn-rate of XAH is higher compared to that of XRPL. For p
|
||||
## What key events have there been for Xahau?
|
||||
Xahau was launched on October 30, 2023 by the Xahau Launch Alliance, an interim alliance formed by long-term, non-Ripple, XRPL developers, organisations and infrastructure providers: XRPL Labs, GateHub Limited, Titanium OU, Evernode Labs Ltd, and Digital Governing OU.
|
||||
|
||||
In the first year Xahau has received many updates, such as a new native feature, Remit, in March 2023, performance improvements, memory only nodes and JavaScript hook support.
|
||||
In the first year Xahau has received many updates, such as a new native feature, Remit, in March 2024, performance improvements, memory only nodes and JavaScript hook support.
|
||||
|
||||
Within the first year, the first cross-border remittance service was launched in collaboration between The Inclusive Financial Technologies Foundation (InFTF) and the Cooperative Bank of Oromia (COOP), one of Ethiopia's largest banks with more than 13 million account holders. The inward remittance solution helps the African Diaspora, many of whom work as blue-collar workers throughout the Middle East, US, and Europe, send money back to their friends and family in Ethiopia. With the service, initially launched for inward remittances using EUR, anyone can buy digital EUR, send it via blockchain for little to no cost, and have it settle in the bank account of a family member or friend in the local currency, ETB, within seconds.
|
||||
|
||||
|
||||
168
src/plugins/remarkGlobalReferences.ts
Normal file
168
src/plugins/remarkGlobalReferences.ts
Normal file
@@ -0,0 +1,168 @@
|
||||
import { readFileSync } from 'node:fs'
|
||||
import { visit } from 'unist-util-visit'
|
||||
|
||||
const parseRules: {
|
||||
path: string
|
||||
parse: (content: string) => { label: string; url: string }[]
|
||||
}[] = [
|
||||
{
|
||||
path: 'src/content/references/global.md',
|
||||
parse: (content: string) => {
|
||||
const lines = content.split('\n')
|
||||
const result: { label: string; url: string }[] = []
|
||||
for (const line of lines) {
|
||||
const match = line.match(/^\[([^\]]+)\]:\s*(.+)$/)
|
||||
if (match) {
|
||||
const [, label, url] = match
|
||||
result.push({ label, url: url.trim() })
|
||||
}
|
||||
}
|
||||
return result
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'src/content/references/transactions.md',
|
||||
parse: (content: string) => {
|
||||
const lines = content.split('\n')
|
||||
const result: { label: string; url: string }[] = []
|
||||
for (const line of lines) {
|
||||
if (line.length > 0) {
|
||||
const url = `/docs/protocol-reference/transactions/transaction-types/${line.toLowerCase()}`
|
||||
result.push({ label: `${line}`, url })
|
||||
result.push({ label: `${line} transaction`, url })
|
||||
result.push({ label: `${line} transactions`, url })
|
||||
}
|
||||
}
|
||||
return result
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'src/content/references/pseudo-transactions.md',
|
||||
parse: (content: string) => {
|
||||
const lines = content.split('\n')
|
||||
const result: { label: string; url: string }[] = []
|
||||
for (const line of lines) {
|
||||
if (line.length > 0) {
|
||||
const url = `/docs/protocol-reference/transactions/pseudo-transaction-types/${line.toLowerCase()}`
|
||||
result.push({ label: `${line}`, url })
|
||||
result.push({ label: `${line} transaction`, url })
|
||||
result.push({ label: `${line} transactions`, url })
|
||||
}
|
||||
}
|
||||
return result
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
/**
|
||||
* Remark plugin to resolve reference-style links from global.md
|
||||
*/
|
||||
export function remarkGlobalReferences() {
|
||||
let globalRefs: Record<string, string> | null = null
|
||||
|
||||
function loadGlobalReferences() {
|
||||
if (globalRefs !== null) return globalRefs
|
||||
|
||||
try {
|
||||
globalRefs = {}
|
||||
for (const rule of parseRules) {
|
||||
const content = readFileSync(rule.path, 'utf-8')
|
||||
const refs = rule.parse(content)
|
||||
for (const ref of refs) {
|
||||
globalRefs[ref.label] = ref.url
|
||||
}
|
||||
}
|
||||
|
||||
return globalRefs
|
||||
} catch (error: any) {
|
||||
console.warn('Could not load global.md references:', error.message)
|
||||
globalRefs = {}
|
||||
return globalRefs
|
||||
}
|
||||
}
|
||||
|
||||
return function transformer(tree: any) {
|
||||
const refs = loadGlobalReferences()
|
||||
|
||||
// Find all reference-style links in the format [text][]
|
||||
visit(tree, 'linkReference', (node) => {
|
||||
if (
|
||||
node.referenceType === 'shortcut' ||
|
||||
node.referenceType === 'collapsed'
|
||||
) {
|
||||
const label = node.label || node.children?.[0]?.value
|
||||
|
||||
if (label && refs[label]) {
|
||||
// Convert linkReference to a regular link
|
||||
node.type = 'link'
|
||||
node.url = refs[label]
|
||||
delete node.referenceType
|
||||
delete node.identifier
|
||||
delete node.label
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
// Also look for escaped reference-style links in text nodes: \[label]\[]
|
||||
visit(tree, 'text', (node, index, parent) => {
|
||||
if (!node.value) return
|
||||
|
||||
// Find escaped reference-style links: \[label]\[]
|
||||
const pattern = /\\?\[([^\]]+)\\?\]\\?\[\]/g
|
||||
const replacements = []
|
||||
let match: RegExpExecArray | null = null
|
||||
|
||||
match = pattern.exec(node.value)
|
||||
while (match !== null) {
|
||||
const [fullMatch, label] = match
|
||||
if (refs[label]) {
|
||||
replacements.push({
|
||||
start: match.index,
|
||||
end: match.index + fullMatch.length,
|
||||
label,
|
||||
url: refs[label],
|
||||
})
|
||||
}
|
||||
match = pattern.exec(node.value)
|
||||
}
|
||||
|
||||
// Apply replacements from right to left to maintain indices
|
||||
if (replacements.length > 0) {
|
||||
const newNodes = []
|
||||
let lastIndex = 0
|
||||
|
||||
for (const replacement of replacements) {
|
||||
// Add text before the replacement
|
||||
if (replacement.start > lastIndex) {
|
||||
newNodes.push({
|
||||
type: 'text',
|
||||
value: node.value.slice(lastIndex, replacement.start),
|
||||
})
|
||||
}
|
||||
|
||||
// Add the link
|
||||
newNodes.push({
|
||||
type: 'link',
|
||||
url: replacement.url,
|
||||
children: [{ type: 'text', value: replacement.label }],
|
||||
})
|
||||
|
||||
lastIndex = replacement.end
|
||||
}
|
||||
|
||||
// Add remaining text
|
||||
if (lastIndex < node.value.length) {
|
||||
newNodes.push({
|
||||
type: 'text',
|
||||
value: node.value.slice(lastIndex),
|
||||
})
|
||||
}
|
||||
|
||||
// Replace the current node with the new nodes
|
||||
if (parent && typeof index === 'number') {
|
||||
parent.children.splice(index, 1, ...newNodes)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user