mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2025-11-19 11:15:49 +00:00
[MERGE] Data API / gh-pages
This commit is contained in:
@@ -89,8 +89,9 @@
|
|||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="ripple-api-tool.html">WebSocket Tool</a></li>
|
<li><a href="rest-api-tool.html">Ripple-REST API Tool</a></li>
|
||||||
<li><a href="rest-api-tool.html">REST Tool</a></li>
|
<li><a href="historicaldb-api-tool.html">Historical Database API Tool</a></li>
|
||||||
|
<li><a href="ripple-api-tool.html">WebSocket API Tool</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
|||||||
11
circle.yml
Normal file
11
circle.yml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
general:
|
||||||
|
build_dir: tool/
|
||||||
|
dependencies:
|
||||||
|
pre:
|
||||||
|
- pyenv global 3.4.0
|
||||||
|
override:
|
||||||
|
- pip3 install jinja2 requests beautifulsoup4
|
||||||
|
test:
|
||||||
|
override:
|
||||||
|
- ./parse_pages.py
|
||||||
|
- ./check_links.py
|
||||||
@@ -19,9 +19,9 @@ You are not on your own. Ripple Labs depends on the success of individual gatewa
|
|||||||
|
|
||||||
## Ripple Gateways Explained ##
|
## Ripple Gateways Explained ##
|
||||||
|
|
||||||
A Ripple _*Gateway*_ is an entity that exchanges value in the Ripple Network for value in the outside world, which is like performing deposits and withdrawals from Ripple. There are three major models that gateways can follow, with different purposes and modes of operation.
|
A Ripple _*Gateway*_ is an entity that exchanges value in the Ripple Network for value outside Ripple, so it connects Ripple to the outside world. There are three major models that gateways can follow, with different purposes and modes of operation.
|
||||||
|
|
||||||
* An **Issuing Gateway** receives money (or other assets of value) outside of Ripple, and creates _*issuances*_ in the Ripple Network. This provides a way for users to get money in and out of Ripple. This document focuses primarily on how to become an issuing gateway.
|
* An **Issuing Gateway** receives money (or other assets of value) outside of Ripple, and creates _*issuances*_ in the Ripple Network. This provides a direct way for users to get money in and out of Ripple. This document focuses primarily on how to become an issuing gateway.
|
||||||
* A **Private Exchange** lets its users purchase and trade XRP among users of the private exchange. This is similar to being an exchange for any other commodity or cryptocurrency. However, unlike other cryptocurrencies, there is also an exchange built into the Ripple protocol itself.
|
* A **Private Exchange** lets its users purchase and trade XRP among users of the private exchange. This is similar to being an exchange for any other commodity or cryptocurrency. However, unlike other cryptocurrencies, there is also an exchange built into the Ripple protocol itself.
|
||||||
* A **Merchant** accepts payment within Ripple for goods or services outside the network. Unlike an issuing gateway, a merchant business does not create its own currency, but accepts issuances that are created by other gateways. This guide does not describe how to accept Ripple payments as a merchant.
|
* A **Merchant** accepts payment within Ripple for goods or services outside the network. Unlike an issuing gateway, a merchant business does not create its own currency, but accepts issuances that are created by other gateways. This guide does not describe how to accept Ripple payments as a merchant.
|
||||||
|
|
||||||
@@ -29,7 +29,8 @@ A Ripple _*Gateway*_ is an entity that exchanges value in the Ripple Network for
|
|||||||
|
|
||||||
All assets in Ripple, except for the native cryptocurrency XRP, are represented as *issuances*, which are digital assets that reflect traditional assets held by a gateway. Within Ripple, issuances can be sent and traded without the gateway's intervention and very low barriers to entry. Issuances get their value from gateway's agreement to honor the obligation that the issuances represent; there is no computer system that can force a Ripple gateway to honor that obligation. Therefore, Ripple's *trust lines* ensure that users only hold issuances from gateways they trust to pay out when needed.
|
All assets in Ripple, except for the native cryptocurrency XRP, are represented as *issuances*, which are digital assets that reflect traditional assets held by a gateway. Within Ripple, issuances can be sent and traded without the gateway's intervention and very low barriers to entry. Issuances get their value from gateway's agreement to honor the obligation that the issuances represent; there is no computer system that can force a Ripple gateway to honor that obligation. Therefore, Ripple's *trust lines* ensure that users only hold issuances from gateways they trust to pay out when needed.
|
||||||
|
|
||||||
A "trust line" is link between two accounts in Ripple that represents an explicit statement of willingness to hold gateway debt obligations. When a user sends money into Ripple, a Gateway takes custody of those assets outside of Ripple, and sends issuances within the Ripple network to the user. When a user sends money out of Ripple, she sends the issuances to the gateway, and the gateway then sends the assets to the user in the outside world. To redeem funds, a user simply makes a Ripple payment from her Ripple account to the Gateway's.
|
A "trust line" is link between two accounts in Ripple that represents an explicit statement of willingness to hold gateway debt obligations. When a user sends money into Ripple, a Gateway takes custody of those assets outside of Ripple, and sends issuances within the Ripple network to the user. When a user sends money out of Ripple, she makes a Ripple payment to the gateway, and the gateway then sends the assets to the user in the outside world.
|
||||||
|
|
||||||
|
|
||||||
### XRP ###
|
### XRP ###
|
||||||
|
|
||||||
@@ -47,7 +48,7 @@ The Ripple network contains a distributed financial exchange, where any user can
|
|||||||
|
|
||||||
When adding a new gateway to the Ripple network, it is important to establish liquidity to other popular currencies. Because liquidity is provided by third-party market makers, a gateway can provide currency-exchange services through Ripple without having to keep a large reserve of currencies or shoulder the risk of financial exchange.
|
When adding a new gateway to the Ripple network, it is important to establish liquidity to other popular currencies. Because liquidity is provided by third-party market makers, a gateway can provide currency-exchange services through Ripple without having to keep a large reserve of currencies or shoulder the risk of financial exchange.
|
||||||
|
|
||||||
[Ripple Trade](https://www.rippletrade.com/) is the official client application, and it is used by a large number of market makers to participate in the global exchange. To make it easier on users to trade in ACME issuances, Ripple Labs can add a shortcut to ACME's gateway in Ripple Trade, so long as ACME meets certain best-practice requirements.
|
[Ripple Trade](https://www.rippletrade.com/) is the official client application, and it is used by a large number of market makers to participate in the global exchange. To make it easier on users to trade in ACME issuances, Ripple Labs can add a shortcut to ACME's gateway in Ripple Trade, so long as ACME meets [certain best-practice requirements](https://ripple.com/files/GB-2015-02.pdf).
|
||||||
|
|
||||||
Contact [partners@ripple.com](mailto:partners@ripple.com) for help establishing a market between your gateway and others, and about getting your gateway listed in Ripple Trade.
|
Contact [partners@ripple.com](mailto:partners@ripple.com) for help establishing a market between your gateway and others, and about getting your gateway listed in Ripple Trade.
|
||||||
|
|
||||||
@@ -86,27 +87,26 @@ As with hot wallets, warm wallets must trust the cold wallet, and should not be
|
|||||||
|
|
||||||
### Funds Lifecycle ###
|
### Funds Lifecycle ###
|
||||||
|
|
||||||
Funds in Ripple tend to flow in a cycle, from the cold wallet to the warm wallets, then the warm wallets, to customers, and eventually from customers back to the cold wallet. When you put that together with the transactions outside of Ripple, the lifecycle looks something like this:
|
Funds in Ripple tend to flow in a cycle, from the cold wallet to the warm wallets, then the warm wallets, to customers, and eventually from customers back to the cold wallet. Issuances (any non-XRP balance in Ripple) are always tied to a trust line, so each payment "ripples" through ACME's issuing account on the trust lines connected to it. Ultimately, the lifecycle of issuances in Ripple looks something like this:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
1. Charlie [sends €2 from ACME to Ripple](#sending-from-gateway-to-ripple). This involves two transactions. Outside of Ripple, ACME moves €2 from Charlie's ACME balance to ACME's Ripple-backing balance. Within Ripple, ACME's hot wallet sends €2 to Charlie's Ripple wallet.
|
1. Alice [initiates a payment from ACME to Ripple](#sending-from-gateway-to-ripple). Outside of Ripple, ACME debits Alice's account. Then ACME sends a Ripple payment of EUR.ACME from ACME's hot wallet account to Alice's Ripple account.
|
||||||
2. ACME refills its hot wallet using €2 from its warm wallet.
|
2. ACME refills its hot wallet using EUR.ACME from its warm wallet.
|
||||||
3. ACME refills its warm wallet by issuing a new €2 from its cold wallet.
|
3. ACME refills its warm wallet by issuing new EUR.ACME from its cold wallet.
|
||||||
4. Charlie [sends €2 from Ripple to ACME](#sending-from-ripple-to-gateway). This is basically the reverse of the initial step, with two transactions. Within Ripple, Charlie redeems issuances with ACME's cold wallet. Outside of Ripple, ACME debits €2 from its Ripple-backing balance and credits it to Charlie's balance.
|
4. Alice [initiates a payment from Ripple to ACME](#sending-from-ripple-to-gateway). This is basically the reverse of the initial step. Alice redeems issuances of EUR.ACME by sending them to ACME's cold wallet. Outside of Ripple, ACME credits Alice for the amount it received.
|
||||||
|
|
||||||
|
|
||||||
## Fees and Revenue Sources ##
|
## Fees and Revenue Sources ##
|
||||||
|
|
||||||
There are several ways in which a gateway can seek to benefit financially from Ripple integration. These can include:
|
There are several ways in which a gateway can seek to benefit financially from Ripple integration. These can include:
|
||||||
|
|
||||||
* Indirect revenue from value added. Ripple integration can provide valuable functionality for your customers that distinguishes your business from your competitors.
|
|
||||||
* Withdrawal and Deposit fees. It is typical for a gateway to charge a small fee (such as 1%) for the service of adding or removing money from Ripple. You have the power to determine the rate you credit people when they move money onto and off of Ripple through your gateway.
|
* Withdrawal and Deposit fees. It is typical for a gateway to charge a small fee (such as 1%) for the service of adding or removing money from Ripple. You have the power to determine the rate you credit people when they move money onto and off of Ripple through your gateway.
|
||||||
* Transfer fees. You can set a percentage fee to charge automatically when Ripple users send each other issuances created by your account. This amount is debited from the Ripple ledger, decreasing your obligation each time your issuances change hands. See [TransferRate](#transferrate) for details.
|
* Transfer fees. You can set a percentage fee to charge automatically when Ripple users send each other issuances created by your account. This amount is debited from the Ripple ledger, decreasing your obligation each time your issuances change hands. See [TransferRate](#transferrate) for details.
|
||||||
|
* Indirect revenue from value added. Ripple integration can provide valuable functionality for your customers that distinguishes your business from your competitors.
|
||||||
* Interest on Ripple-backed funds. You can keep some of your Ripple-backing currency in an external account that earns interest. Just make sure you can always access enough funds to service customer withdrawals.
|
* Interest on Ripple-backed funds. You can keep some of your Ripple-backing currency in an external account that earns interest. Just make sure you can always access enough funds to service customer withdrawals.
|
||||||
* [Market making](#market-makers). A gateway can also make offers to buy and sell its issuances for other issuances on Ripple, providing liquidity to cross-currency payments and possibly making a profit. (As with any market making opportunity, profits are not guaranteed.)
|
* [Market making](#market-makers). A gateway can also make offers to buy and sell its issuances for other issuances on Ripple, providing liquidity to cross-currency payments and possibly making a profit. (As with any market making opportunity, profits are not guaranteed.)
|
||||||
|
|
||||||
<span class='draft-comment'>TODO: Diagram of fee sources</span>
|
|
||||||
|
|
||||||
### Choosing Fee Rates ###
|
### Choosing Fee Rates ###
|
||||||
|
|
||||||
@@ -120,9 +120,9 @@ Fees imposed by gateways are optional. Obviously, higher fees mean more revenue
|
|||||||
|
|
||||||
Our example exchange, ACME, already accepts withdrawals and deposits from users using some existing system, and uses an internal accounting system to track how much balance each user has with the exchange. Such a system can be modeled simply with a balance sheet and tracking how much currency each user has on hand.
|
Our example exchange, ACME, already accepts withdrawals and deposits from users using some existing system, and uses an internal accounting system to track how much balance each user has with the exchange. Such a system can be modeled simply with a balance sheet and tracking how much currency each user has on hand.
|
||||||
|
|
||||||
In the following diagram, ACME Exchange starts with €5 on hand, including €1 that belongs to Bob, €2 that belongs to Charlie, and an additional €2 of reserves that belong to ACME itself. Alice deposits €4, so ACME adds her to its balance sheet and ends up with €9.
|
In the following diagram, ACME Exchange starts with €5 on hand, including €1 that belongs to Bob, €2 that belongs to Charlie, and an additional €2 of equity that belongs to ACME itself. Alice deposits €5, so ACME adds her to its balance sheet and ends up with €10.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**Assumptions:** To integrate with Ripple, we assume that an exchange such as ACME meets the following assumptions:
|
**Assumptions:** To integrate with Ripple, we assume that an exchange such as ACME meets the following assumptions:
|
||||||
|
|
||||||
@@ -133,28 +133,31 @@ In the following diagram, ACME Exchange starts with €5 on hand, including €1
|
|||||||
|
|
||||||
## Sending from Gateway to Ripple ##
|
## Sending from Gateway to Ripple ##
|
||||||
|
|
||||||
Ripple payments can automatically bridge between currencies, but an issuing gateway normally only sends single-currency payments that go directly to users. This means moving funds from a user's balance to a separate "Ripple-backing" balance, and then sending the equivalent amount of issuances in Ripple to the user's Ripple account.
|
Ripple payments can automatically bridge between currencies, but an issuing gateway normally only sends single-currency payments that go directly to users. This means debiting a user's current balance, and then sending the equivalent amount of issuances in Ripple to the user's Ripple account.
|
||||||
|
|
||||||
An example of a deposit flow:
|
An example flow for a payment into Ripple:
|
||||||
|
|
||||||
1. Alice asks to deposit €2 of her ACME balance into Ripple.
|
1. Alice asks to send €3 of her ACME balance into Ripple.
|
||||||
2. In its internal accounting, ACME debits Alice's balance €3 and credits the Ripple-backed balance by €2.
|
2. Internally, ACME debits Alice's balance €3.
|
||||||
3. ACME submits a Ripple transaction, sending €2 to Alice's Ripple address. The €2 is marked in Ripple as being "issued" by ACME (2 EUR.ACME).
|
3. ACME submits a Ripple transaction, sending €3 to Alice's Ripple address. The €3 is marked in the Ripple network as being "issued" by ACME (3 EUR.ACME).
|
||||||
|
|
||||||
**Assumptions:**
|
**Assumptions:**
|
||||||
|
|
||||||
* Alice already has a Ripple account separate from her ACME account, which she manages using an application such as Ripple Trade.
|
* Alice already has an account in the Ripple network separate from her ACME account, which she manages using an application such as Ripple Trade.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Requirements for Sending to Ripple ###
|
### Requirements for Sending to Ripple ###
|
||||||
|
|
||||||
There are several prerequisites that ACME must meet in order for this to happen:
|
There are several prerequisites that ACME must meet in order for this to happen:
|
||||||
|
|
||||||
- ACME modifies its core accounting system to track money that is backing funds issued on the Ripple Network. This could be as simple as adding a record for Ripple.
|
- ACME modifies its core accounting system to track money that is backing funds issued on the Ripple Network. ACME can query Ripple to see who holds its Ripple issuances at any time.
|
||||||
- Optionally, a gateway can take additional steps to separate normal user funds from funds backing the gateway's Ripple issuances. For example, the funds allocated to Ripple can be stored in a separate bank account. A cryptocurrency exchange can create a separate wallet to hold the funds allocated to Ripple, as publicly-verifiable proof to customers that the gateway is solvent.
|
- Optionally, a gateway can take additional steps to separate the assets backing the gateway's Ripple issuances. For example, the funds allocated to Ripple can be stored in a separate "Ripple Escrow" bank account. A cryptocurrency exchange can create a separate wallet to hold the funds allocated to Ripple, as publicly-verifiable proof to customers that the gateway is solvent.
|
||||||
- ACME must have a Ripple account. Our best practices recommend actually having at least two accounts: a "cold wallet" account to issue currency, and one or more "hot wallet" accounts that perform day-to-day transactions. See [Hot and Cold Wallets](#hot-and-cold-wallets) for more information.
|
- ACME must have an account on the Ripple network. Our best practices recommend actually having at least two accounts: a "cold wallet" account to issue currency, and one or more "hot wallet" accounts that perform day-to-day transactions. See [Hot and Cold Wallets](#hot-and-cold-wallets) for more information.
|
||||||
- Alice must create a trustline from her Ripple account to ACME's issuing (cold wallet) account. She can do this from any Ripple client (such as [Ripple Trade](https://www.rippletrade.com/) as long as she knows the address or Ripple Name of ACME's cold wallet.
|
- ACME must enable the [DefaultRipple Flag](#defaultripple) on its issuing account in order for users to send and receive its issuances.
|
||||||
|
- Alice must create a trustline from her Ripple account to ACME's issuing (cold wallet) account. She can do this from any Ripple client application as long as she knows the address or Ripple Name of ACME's cold wallet.
|
||||||
- In order to do this, Alice needs to find the address of ACME's cold wallet. ACME can publicize its cold wallet address on its website, or have its gateway listed in a client such as Ripple Trade. See [Setting Trust Lines in Ripple Trade](#setting-trust-lines-in-ripple-trade).
|
- In order to do this, Alice needs to find the address of ACME's cold wallet. ACME can publicize its cold wallet address on its website, or have its gateway listed in a client such as Ripple Trade. See [Setting Trust Lines in Ripple Trade](#setting-trust-lines-in-ripple-trade).
|
||||||
- ACME must create a user interface for Alice to send funds from ACME into Ripple.
|
- ACME must create a user interface for Alice to send funds from ACME into Ripple.
|
||||||
- In order to do this, ACME needs to know Alice's Ripple address. ACME can have Alice input her Ripple addresss as part of the interface, or ACME can require Alice to input and verify her Ripple address in advance.
|
- In order to do this, ACME needs to know Alice's Ripple address. ACME can have Alice input her Ripple addresss as part of the interface, or ACME can require Alice to input and verify her Ripple address in advance.
|
||||||
@@ -162,12 +165,12 @@ There are several prerequisites that ACME must meet in order for this to happen:
|
|||||||
|
|
||||||
## Sending from Ripple to Gateway ##
|
## Sending from Ripple to Gateway ##
|
||||||
|
|
||||||
A withdrawal from Ripple means moving funds from the Ripple-backed balance at a gateway into a user account in response to receiving a Ripple payment.
|
A payment out of Ripple means the Gateway receives a payment in the Ripple network, and credits a user outside of Ripple.
|
||||||
|
|
||||||
An example of a withdrawal flow:
|
An example flow of a payment out of Ripple:
|
||||||
|
|
||||||
1. Bob sends Ripple transaction of €1 to ACME's cold wallet.
|
1. Bob sends Ripple transaction of €1 to ACME's cold wallet.
|
||||||
2. In its internal accounting, ACME debits its Ripple-backing balance €1 and credits Bob's balance €1.
|
2. In its internal accounting, credits Bob's balance €1.
|
||||||
|
|
||||||
Payments going from Ripple to a gateway can be single-currency or cross-currency payments. Users can choose the exchange rates in a Ripple client application such as Ripple Trade, so that the gateway receives issuances created by its cold wallet account.
|
Payments going from Ripple to a gateway can be single-currency or cross-currency payments. Users can choose the exchange rates in a Ripple client application such as Ripple Trade, so that the gateway receives issuances created by its cold wallet account.
|
||||||
|
|
||||||
@@ -175,7 +178,7 @@ Payments going from Ripple to a gateway can be single-currency or cross-currency
|
|||||||
|
|
||||||
In addition to the [requirements for making deposits possible](#deposit-requirements), there are several prerequisites that ACME must meet in order to process payments coming from Ripple:
|
In addition to the [requirements for making deposits possible](#deposit-requirements), there are several prerequisites that ACME must meet in order to process payments coming from Ripple:
|
||||||
|
|
||||||
- ACME must monitor its Ripple accounts for incoming payments.
|
- ACME must monitor its cold and hot wallet Ripple accounts for incoming payments.
|
||||||
- ACME must know which user to credit internally for the incoming payments.
|
- ACME must know which user to credit internally for the incoming payments.
|
||||||
- We recommend that ACME should [bounce any unrecognized incoming payments](#bouncing-payments) back to their sender.
|
- We recommend that ACME should [bounce any unrecognized incoming payments](#bouncing-payments) back to their sender.
|
||||||
- Typically, the preferred method of recognizing incoming payments is through [destination tags](#destination-tags).
|
- Typically, the preferred method of recognizing incoming payments is through [destination tags](#destination-tags).
|
||||||
@@ -185,15 +188,15 @@ In addition to the [requirements for making deposits possible](#deposit-requirem
|
|||||||
|
|
||||||
Processing payments to and from Ripple naturally comes with some risks, so a gateway should be sure to take care in implementing these processes. We recommend the following precautions:
|
Processing payments to and from Ripple naturally comes with some risks, so a gateway should be sure to take care in implementing these processes. We recommend the following precautions:
|
||||||
|
|
||||||
- Protect yourself against reversible deposits. Ripple payments are irreversible, but many electronic money systems like credit cards or PayPal are not. Scammers can abuse this to take their fiat money back after receiving Ripple issuances.
|
- Protect yourself against reversible deposits. Ripple payments are irreversible, but many electronic money systems like credit cards or PayPal are not. Scammers can abuse this to take their fiat money back by canceling a deposit after receiving Ripple issuances.
|
||||||
- Before processing a payment out of Ripple, make sure you know the customer's identity. This is especially important because the users sending money from Ripple could be different than the ones that initially received the money in Ripple.
|
- Before processing a payment out of Ripple, make sure you know the customer's identity. This makes it harder for anonymous attackers to scam you, and it is also an important element of most anti-money-laundering regulations. This is especially important because the users sending money from Ripple could be different than the ones that initially received the money in Ripple.
|
||||||
- Follow the guidelines for [reliable transaction submission](#reliable-transaction-submission) when sending Ripple transactions.
|
- Follow the guidelines for [reliable transaction submission](#reliable-transaction-submission) when sending Ripple transactions.
|
||||||
- [Robustly monitor for incoming payments](#robustly-monitor-for-payments), and read the correct amount. Don't be deceived by [Partial Payments](transactions.html#partial-payments).
|
- [Robustly monitor for incoming payments](#robustly-monitoring-for-payments), and read the correct amount. Don't mistakenly credit someone the full amount if they only sent a [partial payment](transactions.html#partial-payments).
|
||||||
- Track your obligations and balances within the Ripple network, and compare with your assets off the network. If they do not match up, stop processing withdrawals and deposits until you resolve the discrepancy. (<span class='draft-comment'>TODO: Link to tallying bulletin when it comes out</span>)
|
- Track your obligations and balances within the Ripple network, and compare with your assets off the network. If they do not match up, stop processing withdrawals and deposits until you resolve the discrepancy.
|
||||||
- Proactively avoid ambiguous situations. We recommend the following:
|
- Proactively avoid ambiguous situations. We recommend the following:
|
||||||
- Enable the [`DisallowXRP` flag](#disallowxrp) for the cold wallet account and all hot wallet accounts, so users do not accidentally send you XRP. (Private exchanges should *not* set this flag, since they do trade XRP.)
|
- Enable the [`DisallowXRP` flag](#disallowxrp) for the cold wallet account and all hot wallet accounts, so users do not accidentally send you XRP. (Private exchanges should *not* set this flag, since they trade XRP normally.)
|
||||||
- Enable the [`RequireDest` flag](#requiredest) for the cold wallet account and all hot wallet accounts, so users do not accidentally forget the destination tag on payments to make withdrawals.
|
- Enable the [`RequireDest` flag](#requiredest) for the cold wallet account and all hot wallet accounts, so users do not accidentally send a payment without the destination tag to indicate who should be credited.
|
||||||
- Enable the [`RequireAuth` flag](#requireauth) on all hot wallet accounts so they cannot create their own issuances.
|
- Enable the [`RequireAuth` flag](#requireauth) on all hot wallet accounts so they cannot unintentionally create their own issuances.
|
||||||
- Monitor for suspicious or abusive behavior. For example, a user could repeatedly withdraw and deposit funds in Ripple, as a sort of "denial of service" attack that effectively empties the hot wallet. Suspend users whose accounts are involved in suspicious behavior by not processing their Ripple payments.
|
- Monitor for suspicious or abusive behavior. For example, a user could repeatedly withdraw and deposit funds in Ripple, as a sort of "denial of service" attack that effectively empties the hot wallet. Suspend users whose accounts are involved in suspicious behavior by not processing their Ripple payments.
|
||||||
|
|
||||||
|
|
||||||
@@ -204,6 +207,7 @@ After the issuances have been created in Ripple, they can be freely transferred
|
|||||||
- Anyone can buy/sell EUR.ACME on Ripple. If ACME issues multiple currencies on Ripple, a separate trust line is necessary for each.
|
- Anyone can buy/sell EUR.ACME on Ripple. If ACME issues multiple currencies on Ripple, a separate trust line is necessary for each.
|
||||||
- This includes users who do not have an account with ACME Exchange. In order to withdraw the funds successfully from ACME, users still have to create ACME accounts.
|
- This includes users who do not have an account with ACME Exchange. In order to withdraw the funds successfully from ACME, users still have to create ACME accounts.
|
||||||
- Optionally, use the [Authorized Accounts](#authorized-accounts) feature to limit who can hold EUR.ACME on Ripple.
|
- Optionally, use the [Authorized Accounts](#authorized-accounts) feature to limit who can hold EUR.ACME on Ripple.
|
||||||
|
- If a gateway determines that a user has acted in bad faith, the gateway can [Freeze](#freezes) that user's trust line to the gateway, so that the user can no longer trade in the gateway's issuances.
|
||||||
- Ripple users trading and sending EUR.ACME to one another requires no intervention by ACME.
|
- Ripple users trading and sending EUR.ACME to one another requires no intervention by ACME.
|
||||||
- All exchanges and balances on Ripple are publicly viewable in the shared, global ledger.
|
- All exchanges and balances on Ripple are publicly viewable in the shared, global ledger.
|
||||||
|
|
||||||
@@ -236,7 +240,7 @@ For more information, see the [Gateway Bulletin on Freezes](https://ripple.com/f
|
|||||||
|
|
||||||
Ripple's Authorized Accounts feature enables a gateway to limit who can hold that gateway's issuances, so that unknown Ripple accounts cannot hold the currency your gateway issues. We feel this is *not necessary* in most cases, since gateways have full control over the process of redeeming Ripple balances for value in the outside world. (You can collect customer information and impose limits on withdrawals at that stage without worrying about what happens within the Ripple network.)
|
Ripple's Authorized Accounts feature enables a gateway to limit who can hold that gateway's issuances, so that unknown Ripple accounts cannot hold the currency your gateway issues. We feel this is *not necessary* in most cases, since gateways have full control over the process of redeeming Ripple balances for value in the outside world. (You can collect customer information and impose limits on withdrawals at that stage without worrying about what happens within the Ripple network.)
|
||||||
|
|
||||||
To use the Authorized Accounts feature, a gateway first enables the `RequireAuth` flag for its cold wallet account, and then manually approves each user account's trust line before sending issuances in Ripple to that account.
|
To use the Authorized Accounts feature, a gateway enables the `RequireAuth` flag for its cold wallet account, and then individually approves each user account's trust line before sending issuances in Ripple to that account.
|
||||||
|
|
||||||
You must authorize trust lines using the same cold wallet account that issues the currency, which unfortunately means an increased risk exposure for that account. The process for sending funds into Ripple with RequireAuth enabled looks like the following:
|
You must authorize trust lines using the same cold wallet account that issues the currency, which unfortunately means an increased risk exposure for that account. The process for sending funds into Ripple with RequireAuth enabled looks like the following:
|
||||||
|
|
||||||
@@ -288,6 +292,67 @@ Any time you submit a Ripple transaction, it must be signed using your secret. H
|
|||||||
The examples in this document show Ripple-REST API methods that include an account secret. This is only safe if you control the Ripple-REST server yourself, *and* you connect to it over a connection that is secure from outside listeners. (For example, you could connect over a loopback (localhost) network, a private subnet, or an encrypted VPN.) Alternatively, you could operate your own `rippled` server; or you can use a client application such as `ripple-lib` to perform local signing before submitting your transactions to a third-party server.
|
The examples in this document show Ripple-REST API methods that include an account secret. This is only safe if you control the Ripple-REST server yourself, *and* you connect to it over a connection that is secure from outside listeners. (For example, you could connect over a loopback (localhost) network, a private subnet, or an encrypted VPN.) Alternatively, you could operate your own `rippled` server; or you can use a client application such as `ripple-lib` to perform local signing before submitting your transactions to a third-party server.
|
||||||
|
|
||||||
|
|
||||||
|
## DefaultRipple ##
|
||||||
|
|
||||||
|
The DefaultRipple flag controls whether the balances held in an account's trust lines are [allowed to ripple](https://ripple.com/knowledge_center/understanding-the-noripple-flag/) by default. Rippling is what allows users to trade issuances, so a gateway must allow rippling on all the trust lines connected to its issuing (cold wallet) account.
|
||||||
|
|
||||||
|
Before asking users to trust its issuing account, a gateway should enable the DefaultRipple flag on that account. Otherwise, the gateway must individually disable the NoRipple flag for each trust line that other accounts extend to it.
|
||||||
|
|
||||||
|
*Note:* Ripple-REST (as of version 1.4.0) does not yet support retrieving or setting the DefaultRipple flag.
|
||||||
|
|
||||||
|
The following is an example of using a local [`rippled` JSON-RPC API](ripple-rest.html#update-account-settings) to enable the DefaultRipple flag:
|
||||||
|
|
||||||
|
Request:
|
||||||
|
|
||||||
|
```
|
||||||
|
POST http://localhost:8088/
|
||||||
|
{
|
||||||
|
"method": "submit",
|
||||||
|
"params": [
|
||||||
|
{
|
||||||
|
"secret": "sn3nxiW7v8KXzPzAqzyHXbSSKNuN9",
|
||||||
|
"tx_json": {
|
||||||
|
"Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
|
||||||
|
"Fee": "15000",
|
||||||
|
"Flags": 0,
|
||||||
|
"SetFlag": 8,
|
||||||
|
"TransactionType": "AccountSet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
_(**Reminder:** Don't send your secret to a server you do not control.)_
|
||||||
|
|
||||||
|
Response:
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"result": {
|
||||||
|
"engine_result": "tesSUCCESS",
|
||||||
|
"engine_result_code": 0,
|
||||||
|
"engine_result_message": "The transaction was applied. Only final in a validated ledger.",
|
||||||
|
"status": "success",
|
||||||
|
"tx_blob": "1200032200000000240000003E202100000008684000000000003A98732103AB40A0490F9B7ED8DF29D246BF2D6269820A0EE7742ACDD457BEA7C7D0931EDB74473045022100D8F2DEF27DE313E3F0D1E189BF5AC8879F591045950E2A33787C3051169038C80220728A548F188F882EA40A416CCAF2AC52F3ED679563BBE1BAC014BB9E773A333581144B4E9C06F24296074F7BC48F92A97916C6DC5EA9",
|
||||||
|
"tx_json": {
|
||||||
|
"Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
|
||||||
|
"Fee": "15000",
|
||||||
|
"Flags": 0,
|
||||||
|
"Sequence": 62,
|
||||||
|
"SetFlag": 8,
|
||||||
|
"SigningPubKey": "03AB40A0490F9B7ED8DF29D246BF2D6269820A0EE7742ACDD457BEA7C7D0931EDB",
|
||||||
|
"TransactionType": "AccountSet",
|
||||||
|
"TxnSignature": "3045022100D8F2DEF27DE313E3F0D1E189BF5AC8879F591045950E2A33787C3051169038C80220728A548F188F882EA40A416CCAF2AC52F3ED679563BBE1BAC014BB9E773A3335",
|
||||||
|
"hash": "665B27B64CE658704FFD326A4FE2F5F5B5E67EACA61DE08258A59D35B883E1D5"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To confirm that an account has DefaultRipple enabled, look up the account using the [account_info command](rippled-apis.html#account-info), specifying a validated ledger version. Use [a bitwise-AND operator](https://en.wikipedia.org/wiki/Bitwise_operation#AND) to compare the `Flags` field with 0x00800000 (the [ledger flag lsfDefaultRipple](https://wiki.ripple.com/Ledger_Format#AccountRoot)). If the result of the bitwise-AND operation is nonzero, then the account has DefaultRipple enabled.
|
||||||
|
|
||||||
|
|
||||||
## Generating Souce and Destination Tags ##
|
## Generating Souce and Destination Tags ##
|
||||||
|
|
||||||
You need a scheme to create Source and Destination tags for your users and payments. (See [Source and Destination Tags](#source-and-destination-tags) for an explanation of what Source and Destination Tags are.)
|
You need a scheme to create Source and Destination tags for your users and payments. (See [Source and Destination Tags](#source-and-destination-tags) for an explanation of what Source and Destination Tags are.)
|
||||||
@@ -303,9 +368,9 @@ Enable the [RequireDest](#requiredest) flag on your hot and cold wallet accounts
|
|||||||
|
|
||||||
## DisallowXRP ##
|
## DisallowXRP ##
|
||||||
|
|
||||||
The DisallowXRP flag (`disallow_xrp` in Ripple-REST) is designed to discourage users from sending XRP to your account by accident. This reduces the costs and effort of bouncing undesired payments, if you operate a gateway that does not trade XRP. The DisallowXRP flag is not strictly enforced, because doing so could allow accounts to become permanently unusable. Client applications should honor it, but it is intentionally possible to work around.
|
The DisallowXRP flag (`disallow_xrp` in Ripple-REST) is designed to discourage users from sending XRP to an account by accident. This reduces the costs and effort of bouncing undesired payments, if you operate a gateway that does not trade XRP. The DisallowXRP flag is not strictly enforced, because doing so could allow accounts to become permanently unusable if they run out of XRP. Client applications should honor the DisallowXRP flag, but it is intentionally possible to work around.
|
||||||
|
|
||||||
An issuing gateway should enable the DisallowXRP flag on all gateway hot and cold wallets that are not expected to trade XRP. A private exchange that trades in XRP should not enable the DisallowXRP flag.
|
An issuing gateway that does not trade XRP should enable the DisallowXRP flag on all gateway hot and cold wallets. A private exchange that trades in XRP should only enable the DisallowXRP flag on accounts that are not expected to receive XRP.
|
||||||
|
|
||||||
The following is an example of a [Ripple-REST Update Account Settings request](ripple-rest.html#update-account-settings) to enable the DisallowXRP flag:
|
The following is an example of a [Ripple-REST Update Account Settings request](ripple-rest.html#update-account-settings) to enable the DisallowXRP flag:
|
||||||
|
|
||||||
@@ -342,7 +407,7 @@ Response:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
A successful response shows `"state": "validated"` when the change has been accepted into a validated Ripple ledger.
|
The value `"disallow_xrp": true` indicates that the DisallowXRP flag is enabled. A successful response shows `"state": "validated"` when the change has been accepted into a validated Ripple ledger.
|
||||||
|
|
||||||
|
|
||||||
## RequireDest ##
|
## RequireDest ##
|
||||||
@@ -385,14 +450,16 @@ Response:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
A successful response shows `"state": "validated"` when the change has been accepted into a validated Ripple ledger.
|
The value `"require_destination_tag": true` indicates that the RequireDest flag has been enabled. A successful response shows `"state": "validated"` when the change has been accepted into a validated Ripple ledger.
|
||||||
|
|
||||||
|
|
||||||
## RequireAuth ##
|
## RequireAuth ##
|
||||||
|
|
||||||
The `RequireAuth` flag (`require_authorization` in Ripple-REST) prevents a Ripple account's issuances from being held by other users unless the issuer approves them.
|
The `RequireAuth` flag (`require_authorization` in Ripple-REST) prevents a Ripple account's issuances from being held by other users unless the issuer approves them.
|
||||||
|
|
||||||
We recommend enabling RequireAuth for all hot wallet (and warm wallet) accounts, as a precaution. Separately, the [Authorized Accounts](#authorized-accounts) feature involves setting the RequireAuth flag on your cold wallet.
|
We recommend enabling RequireAuth for all hot wallet (and warm wallet) accounts, as a precaution. Separately, the Authorized Accounts feature involves [setting the RequireAuth flag on your cold wallet](#with-cold-wallets).
|
||||||
|
|
||||||
|
You can only enable RequireAuth if the account owns no trust lines and no offers in the Ripple ledger, so you must decide whether or not to use it before you start doing business in the Ripple network.
|
||||||
|
|
||||||
### With Hot Wallets ###
|
### With Hot Wallets ###
|
||||||
|
|
||||||
@@ -432,11 +499,11 @@ Response:
|
|||||||
|
|
||||||
### With Cold Wallets ###
|
### With Cold Wallets ###
|
||||||
|
|
||||||
You may also enable `RequireAuth` for your cold wallet in order to use the [Authorized Accounts](#authorized-accounts) feature. Enabling the RequireAuth flag for a cold wallet is the same as [with hot wallets](#with-hot-wallets).
|
You may also enable `RequireAuth` for your cold wallet in order to use the [Authorized Accounts](#authorized-accounts) feature. The procedure to enable the RequireAuth flag for a cold wallet is the same as [with hot wallets](#with-hot-wallets).
|
||||||
|
|
||||||
If ACME decides to use Authorized Accounts, ACME creates an interface for users to get their Ripple trust lines authorized by ACME's cold account. After Alice has extended a trust line to ACME from her Ripple account, she goes through the interface on ACME's website to require ACME authorize her trust line. ACME confirms that it has validated Alice's identity information, and then sends a TrustSet transaction to authorize Alice's trust line.
|
If ACME decides to use Authorized Accounts, ACME creates an interface for users to get their Ripple trust lines authorized by ACME's cold account. After Alice has extended a trust line to ACME from her Ripple account, she goes through the interface on ACME's website to require ACME authorize her trust line. ACME confirms that it has validated Alice's identity information, and then sends a TrustSet transaction to authorize Alice's trust line.
|
||||||
|
|
||||||
The following is an example of using the [Ripple-REST Grant Trustline method](ripple-rest.html#grant-trustline) to authorize the (customer) account rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn to hold issuances from the (cold wallet) account rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW:
|
The following is an example of using the [Ripple-REST Grant Trustline method](ripple-rest.html#grant-trustline) to authorize the (customer) account rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn to hold issuances of USD from the (cold wallet) account rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW:
|
||||||
|
|
||||||
Request:
|
Request:
|
||||||
|
|
||||||
@@ -483,25 +550,26 @@ A successful response shows `"state": "validated"` when the change has been acce
|
|||||||
|
|
||||||
In order to robustly monitor incoming payments, gateways should do the following:
|
In order to robustly monitor incoming payments, gateways should do the following:
|
||||||
|
|
||||||
* Keep a record of the most-recently-processed transaction. That way, if you temporarily lose connectivity, you know how far to go back.
|
* Keep a record of the most-recently-processed transaction and ledger. That way, if you temporarily lose connectivity, you know how far to go back.
|
||||||
* Check the result code of every incoming payment. Some payments go into the ledger to charge an anti-spam fee, even though they failed. Only transactions with the result code `tesSUCCESS` can change non-XRP balances. Only transactions from a validated ledger are final.
|
* Check the result code of every incoming payment. Some payments go into the ledger to charge an anti-spam fee, even though they failed. Only transactions with the result code `tesSUCCESS` can change non-XRP balances. Only transactions from a validated ledger are final.
|
||||||
* Look out for Partial Payments. If an incoming transaction has a `destination_balance_changes` field (Ripple-REST) or a `meta.AmountDelivered` field (WebSocket/JSON-RPC), then use that to see how much money *actually* got delivered to the destination account. Payments with the partial-payment flag enabled are considered "successful" if any non-zero amount is delivered, even miniscule amounts. (The flag is called `"partial_payment": true` in REST, and `tfPartialPayment` in WebSocket/JSON-RPC)
|
* [Look out for Partial Payments](https://ripple.com/files/GB-2014-06.pdf "Partial Payment Flag Gateway Bulletin"). If an incoming transaction has a `destination_balance_changes` field (Ripple-REST) or a `meta.delivered_amount` field (WebSocket/JSON-RPC), then use that to see how much money *actually* got delivered to the destination account. Payments with the partial-payment flag enabled are considered "successful" if any non-zero amount is delivered, even miniscule amounts. (The flag is called `"partial_payment": true` in REST, and `tfPartialPayment` in WebSocket/JSON-RPC)
|
||||||
* Some transactions modify your balances without being payments directly to or from one of your accounts. For example, if ACME sets a nonzero [TransferRate](#transferrate), then ACME's cold wallet's outstanding obligations decrease each time Bob and Charlie exchange ACME issuances. See [TransferRate](#transferrate) for more information.
|
* Some transactions modify your balances without being payments directly to or from one of your accounts. For example, if ACME sets a nonzero [TransferRate](#transferrate), then ACME's cold wallet's outstanding obligations decrease each time Bob and Charlie exchange ACME issuances. See [TransferRate](#transferrate) for more information.
|
||||||
|
|
||||||
To make things simpler for your users, we recommend monitoring for incoming payments to hot wallets and the cold wallet, and treating the two equivalently.
|
To make things simpler for your users, we recommend monitoring for incoming payments to hot wallets and the cold wallet, and treating the two equivalently.
|
||||||
|
|
||||||
As an added precaution, we recommend regularly comparing the balances of your Ripple cold wallet account with the Ripple-backing funds in your internal accounting system. The cold wallet's shows all outstanding issuances as negative balances, which should be match the positive assets you hold outside the network, backing Ripple. If the two do not match up, then you should suspend processing payments in and out of Ripple until you have resolved the discrepancy.
|
As an added precaution, we recommend comparing the balances of your Ripple cold wallet account with the Ripple-backing funds in your internal accounting system each time there is a new Ripple ledger. The cold wallet shows all outstanding issuances as negative balances, which should match the positive assets you have allocated to Ripple outside the network. If the two do not match up, then you should suspend processing payments in and out of Ripple until you have resolved the discrepancy.
|
||||||
|
|
||||||
* Use the [Get Account Balances method](ripple-rest.html#get-account-balances) (Ripple-REST) or the [`account_lines` command](rippled-apis.html#account-lines) (rippled) to check your balances.
|
* Use the [Get Account Balances method](ripple-rest.html#get-account-balances) (Ripple-REST) or the [`account_lines` command](rippled-apis.html#account-lines) (rippled) to check your balances.
|
||||||
|
* If you have a [TransferRate](#transferrate) set, then your obligations within the Ripple network decrease slightly whenever other users transfer your issuances among themselves.
|
||||||
|
|
||||||
|
|
||||||
## TransferRate ##
|
## TransferRate ##
|
||||||
|
|
||||||
The *TransferRate* setting (`transfer_rate` in Ripple-REST) defines a fee to charge for transferring issuances from one Ripple account to another. The transfer fee is set by the issuing (**cold wallet**) account. For any transaction *except paying back to the issuing account*, the sending account is debited issuances at a ratio of TransferRate:1 compared to the destination amount. The transfer fee has a maximum precision of 9 digits, and cannot be less than 0% (a `transfer_rate` of 1.0) or greater than 100% (a `transfer_rate` of 2.0).
|
The *TransferRate* setting (`transfer_rate` in Ripple-REST) defines a fee to charge for transferring issuances from one Ripple account to another. The transfer fee is set by the issuing (**cold wallet**) account. For any transaction *except paying back to the issuing account*, the sending account is debited issuances at a ratio of transfer\_rate:1 compared to the destination amount. The transfer fee has a maximum precision of 9 digits, and cannot be less than 0% (a `transfer_rate` of 1.0) or greater than 100% (a `transfer_rate` of 2.0).
|
||||||
|
|
||||||
The fee represented by the TransferRate is debited from the Ripple ledger, becoming the property of the gateway.
|
The fee represented by the TransferRate is debited from the Ripple ledger, becoming the property of the gateway.
|
||||||
|
|
||||||
For example, if ACME sets the trasfer_rate of its cold wallet to 1.005, that indicates a transfer fee of 0.5% for ACME issuances. In order for Bob to receive 2 EUR.ACME, Charlie must send 2.01 EUR.ACME. After the transaction, ACME's outstanding obligations in Ripple have decreased by €0.01, which means that it is no longer obliged to hold that amount in the account backing its Ripple issuances.
|
For example, if ACME sets the trasfer_rate of its cold wallet to 1.005, that indicates a transfer fee of 0.5% for ACME issuances. In order for Bob to receive 2 EUR.ACME, Charlie must send 2.01 EUR.ACME. After the transaction, ACME's outstanding obligations in Ripple have decreased by 0,01€, which means that it is no longer obliged to hold that amount in the account backing its Ripple issuances.
|
||||||
|
|
||||||
The following diagram shows a Ripple payment of 2 EUR.ACME from Alice to Charlie with a transfer fee of 1%:
|
The following diagram shows a Ripple payment of 2 EUR.ACME from Alice to Charlie with a transfer fee of 1%:
|
||||||
|
|
||||||
@@ -543,13 +611,13 @@ Response:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
A successful response shows `"state": "validated"` when the change has been accepted into a validated Ripple ledger.
|
The field `transfer_rate` in the `settings` object should have the value you set. A successful response shows `"state": "validated"` when the change has been accepted into a validated Ripple ledger.
|
||||||
|
|
||||||
### TransferRate with Hot and Warm Wallets ###
|
### TransferRate with Hot and Warm Wallets ###
|
||||||
|
|
||||||
All Ripple Accounts, including the hot wallet, are subject to the TransferRate. If you set a nonzero TransferRate, then you must send extra (to pay the TransferRate) when making payments to users from your hot wallet. You can accomplish this by setting the `source_amount` (Ripple-REST) or the `SendMax` (rippled) parameters higher than the destination amount.
|
All Ripple Accounts, including the hot wallet, are subject to the TransferRate. If you set a nonzero TransferRate, then you must send extra (to pay the TransferRate) when making payments to users from your hot wallet. You can accomplish this by setting the `source_amount` plus `slippage` (Ripple-REST) or the `SendMax` (rippled) parameters higher than the destination amount.
|
||||||
|
|
||||||
**Note:** The TransferRate does not apply when sending issuances back to the account that created them. The account that created issuances must always accept them at face value on Ripple. This means that users don't have to pay the TransferRate if they send payments to the cold wallet directly, but they do when sending to the hot wallet. (For example, if ACME sets a TransferRate of 1%, a Ripple payment with `source_amount` and `destination_amount` of 5 USD@ACME (and `slippage` of 0) would succeed if sent to ACME's cold wallet, but it would fail if sent to ACME's hot wallet. The hot wallet payment would only succeed if the `source_amount` plus `slippage` was at least 5.05 USD@ACME.) If you accept payments to both accounts, you may want to adjust the amount you credit users in your external system accordingly.
|
**Note:** The TransferRate does not apply when sending issuances back to the account that created them. The account that created issuances must always accept them at face value on Ripple. This means that users don't have to pay the TransferRate if they send payments to the cold wallet directly, but they do when sending to the hot wallet. (For example, if ACME sets a TransferRate of 1%, a Ripple payment with `source_amount` and `destination_amount` of 5 EUR.ACME (and `slippage` of 0) would succeed if sent to ACME's cold wallet, but it would fail if sent to ACME's hot wallet. The hot wallet payment would only succeed if the `source_amount` plus `slippage` was at least 5.05 EUR.ACME.) If you accept payments to both accounts, you may want to adjust the amount you credit users in your external system to make up for fees they paid to redeem with the hot wallet.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -557,9 +625,9 @@ All Ripple Accounts, including the hot wallet, are subject to the TransferRate.
|
|||||||
|
|
||||||
When your hot or cold wallet receives a payment whose purpose is unclear, we recommend that you make an attempt to return the money to its sender. While this is more work than simply pocketing the money, it demonstrates good faith towards customers. You can have an operator bounce payments manually, or create a system to do so automatically.
|
When your hot or cold wallet receives a payment whose purpose is unclear, we recommend that you make an attempt to return the money to its sender. While this is more work than simply pocketing the money, it demonstrates good faith towards customers. You can have an operator bounce payments manually, or create a system to do so automatically.
|
||||||
|
|
||||||
The first requirement to bouncing payments is [robustly monitoring for incoming payments](#robustly-monitoring-for-payments). You do not want to accidentally refund a user for more than they sent you! (This is particularly important if your bounce process is automated.)
|
The first requirement to bouncing payments is [robustly monitoring for incoming payments](#robustly-monitoring-for-payments). You do not want to accidentally refund a user for more than they sent you! (This is particularly important if your bounce process is automated.) The [Partial Payment Flag Gateway Bulletin](https://ripple.com/files/GB-2014-06.pdf) explains how to avoid a common problem.
|
||||||
|
|
||||||
Second, you should send bounced payments as Partial Payments. Since other Ripple users can manipulate the cost of pathways between your accounts, Partial Payments allow you to divest yourself of the full amount without being concerned about how much you might have to pay in fees.
|
Second, you should send bounced payments as Partial Payments. Since other Ripple users can manipulate the cost of pathways between your accounts, Partial Payments allow you to divest yourself of the full amount without being concerned about exchange rates within the Ripple network. You should publicize your bounced payments policy as part of your terms of use.
|
||||||
|
|
||||||
To send a Partial Payment in Ripple-REST, set the `partial_payment` field to true in the object returned by the [Prepare Payment method](ripple-rest.html#prepare-payment) before submitting it. Set the `source_amount` to be equal to the `destination_amount` and the `slippage` to `"0"`.
|
To send a Partial Payment in Ripple-REST, set the `partial_payment` field to true in the object returned by the [Prepare Payment method](ripple-rest.html#prepare-payment) before submitting it. Set the `source_amount` to be equal to the `destination_amount` and the `slippage` to `"0"`.
|
||||||
|
|
||||||
@@ -605,7 +673,7 @@ _(**Reminder:** Don't send your secret to a server you do not control.)_
|
|||||||
|
|
||||||
## Setting Trust Lines in Ripple Trade ##
|
## Setting Trust Lines in Ripple Trade ##
|
||||||
|
|
||||||
Follow these steps to extend a trust line to a Gateway's issuing (cold wallet) account in the Ripple Trade client.
|
As part of the [Hot and Cold Wallets](#hot-and-cold-wallets) model, each hot or warm wallet must have a trust line to the cold wallet. You can manually set up those trust lines by following these steps in the Ripple Trade client.
|
||||||
|
|
||||||
1. Log in and go to the **Fund** tab:
|
1. Log in and go to the **Fund** tab:
|
||||||

|

|
||||||
@@ -632,7 +700,7 @@ In order to achieve this, there are several steps you can take when submitting t
|
|||||||
* Use the `LastLedgerSequence` parameter. (Ripple-REST and ripple-lib do this by default.)
|
* Use the `LastLedgerSequence` parameter. (Ripple-REST and ripple-lib do this by default.)
|
||||||
* Resubmit a transaction if it has not appeared in a validated ledger whose sequence number is less than or equal to the transaction's `LastLedgerSequence` parameter.
|
* Resubmit a transaction if it has not appeared in a validated ledger whose sequence number is less than or equal to the transaction's `LastLedgerSequence` parameter.
|
||||||
|
|
||||||
For additional information, consult the guide to [Reliable Transaction Submission](reliable_tx.html)
|
For additional information, consult the [Reliable Transaction Submission](reliable_tx.html) guide.
|
||||||
|
|
||||||
|
|
||||||
## ripple.txt and host-meta ##
|
## ripple.txt and host-meta ##
|
||||||
@@ -5,7 +5,7 @@ The `rippled` Historical Database provides access to raw Ripple transactions tha
|
|||||||
|
|
||||||
Ripple Labs provides a live instance of the `rippled` Historical Database API with as complete a transaction record as possible at the following address:
|
Ripple Labs provides a live instance of the `rippled` Historical Database API with as complete a transaction record as possible at the following address:
|
||||||
|
|
||||||
`history.ripple.com`
|
`https://history.ripple.com`
|
||||||
|
|
||||||
The [rippled Historical Database source code](https://github.com/ripple/rippled-historical-database) is also available under an open-source license, so you can use, install, and contribute back to the project.
|
The [rippled Historical Database source code](https://github.com/ripple/rippled-historical-database) is also available under an open-source license, so you can use, install, and contribute back to the project.
|
||||||
|
|
||||||
@@ -83,6 +83,8 @@ GET /v1/accounts/{:address}/transactions
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
[Try it! >](historicaldb-api-tool.html#get-account-transaction-history)
|
||||||
|
|
||||||
The following URL parameters are required by this API endpoint:
|
The following URL parameters are required by this API endpoint:
|
||||||
|
|
||||||
| Field | Value | Description |
|
| Field | Value | Description |
|
||||||
@@ -593,6 +595,8 @@ GET /v1/accounts/{:address}/transactions/{:sequence}
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
[Try it! >](historicaldb-api-tool.html#get-transaction-by-account-and-sequence)
|
||||||
|
|
||||||
The following URL parameters are required by this API endpoint:
|
The following URL parameters are required by this API endpoint:
|
||||||
|
|
||||||
| Field | Value | Description |
|
| Field | Value | Description |
|
||||||
@@ -814,6 +818,8 @@ GET /v1/ledgers/{:ledger_identifier}
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
[Try it! >](historicaldb-api-tool.html#get-ledger)
|
||||||
|
|
||||||
The following URL parameters are required by this API endpoint:
|
The following URL parameters are required by this API endpoint:
|
||||||
|
|
||||||
| Field | Value | Description |
|
| Field | Value | Description |
|
||||||
@@ -883,6 +889,8 @@ GET /v1/transactions/{:hash}
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
[Try it! >](historicaldb-api-tool.html#get-transaction)
|
||||||
|
|
||||||
The following URL parameters are required by this API endpoint:
|
The following URL parameters are required by this API endpoint:
|
||||||
|
|
||||||
| Field | Value | Description |
|
| Field | Value | Description |
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
The core peer-to-peer server that operates the Ripple Network is called `rippled`. Each `rippled` server connects to the Ripple Network, relays cryptographically signed transactions, and maintains a local copy of the complete shared global ledger. The source code for `rippled` is written in C++, and is [available on GitHub under an open-source license](https://github.com/ripple/rippled).
|
The core peer-to-peer server that operates the Ripple Network is called `rippled`. Each `rippled` server connects to the Ripple Network, relays cryptographically signed transactions, and maintains a local copy of the complete shared global ledger. The source code for `rippled` is written in C++, and is [available on GitHub under an open-source license](https://github.com/ripple/rippled).
|
||||||
|
|
||||||
* [Building and Installating](https://wiki.ripple.com/Rippled_build_instructions)
|
* [Building and Installing](https://wiki.ripple.com/Rippled_build_instructions)
|
||||||
* [API Reference](#api-methods)
|
* [API Reference](#api-methods)
|
||||||
* [Transaction Reference](transactions.html)
|
* [Transaction Reference](transactions.html)
|
||||||
* Client Library - [Javascript](https://github.com/ripple/ripple-lib)
|
* Client Library - [Javascript](https://github.com/ripple/ripple-lib)
|
||||||
@@ -496,7 +496,7 @@ Accounts are the core unit of authentication in the Ripple Network. Each account
|
|||||||
## account_currencies ##
|
## account_currencies ##
|
||||||
[[Source]<br>](https://github.com/ripple/rippled/blob/df966a9ac6dd986585ecccb206aff24452e41a30/src/ripple/rpc/handlers/AccountCurrencies.cpp "Source")
|
[[Source]<br>](https://github.com/ripple/rippled/blob/df966a9ac6dd986585ecccb206aff24452e41a30/src/ripple/rpc/handlers/AccountCurrencies.cpp "Source")
|
||||||
|
|
||||||
The `account_currencies` command retrieves a simple list of currencies that an account can send or receive, based on its trustlines. (This is not a thoroughly confirmed list, but it can be used to populate user interfaces.)
|
The `account_currencies` command retrieves a simple list of currencies that an account can send or receive, based on its trust lines. (This is not a thoroughly confirmed list, but it can be used to populate user interfaces.)
|
||||||
|
|
||||||
#### Request Format ####
|
#### Request Format ####
|
||||||
An example of the request format:
|
An example of the request format:
|
||||||
@@ -632,7 +632,7 @@ The response follows the [standard format](#response-formatting), with a success
|
|||||||
| send\_currencies | Array of Strings | Array of currency codes for currencies that this account can send. Each currency is either a 3-letter [ISO 4217 Currency Code](http://www.xe.com/iso4217.php) or a 160-bit hex value according to the [currency format](https://wiki.ripple.com/Currency_format). |
|
| send\_currencies | Array of Strings | Array of currency codes for currencies that this account can send. Each currency is either a 3-letter [ISO 4217 Currency Code](http://www.xe.com/iso4217.php) or a 160-bit hex value according to the [currency format](https://wiki.ripple.com/Currency_format). |
|
||||||
| validated | Boolean | If `true`, this data comes from a validated ledger. |
|
| validated | Boolean | If `true`, this data comes from a validated ledger. |
|
||||||
|
|
||||||
*Note:* The currencies that an account can send or receive are defined based on a simple check of its trust lines. if an account has a trust line for a currency and enough room to increase its balance, it can receive that currency. If the trustline's balance can go down, the account can send that currency. This method *does not* check whether the trust line is frozen or authorized.
|
*Note:* The currencies that an account can send or receive are defined based on a simple check of its trust lines. If an account has a trust line for a currency and enough room to increase its balance, it can receive that currency. If the trust line's balance can go down, the account can send that currency. This method *does not* check whether the trust line is frozen or authorized.
|
||||||
|
|
||||||
#### Possible Errors ####
|
#### Possible Errors ####
|
||||||
|
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ Following that, use these instructions to get Ripple-REST installed and running:
|
|||||||
4. Copy the example config file to `config.json`:
|
4. Copy the example config file to `config.json`:
|
||||||
`cp config-example.json config.json`
|
`cp config-example.json config.json`
|
||||||
5. Start the server:
|
5. Start the server:
|
||||||
`node server.js`
|
`npm start`
|
||||||
6. Visit [http://localhost:5990](http://localhost:5990) in a browser to view available endpoints and get started
|
6. Visit [http://localhost:5990](http://localhost:5990) in a browser to view available endpoints and get started
|
||||||
|
|
||||||
|
|
||||||
@@ -698,14 +698,17 @@ The following URL parameters are required by this API endpoint:
|
|||||||
"success": true,
|
"success": true,
|
||||||
"settings": {
|
"settings": {
|
||||||
"account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
|
"account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
|
||||||
"transfer_rate": "",
|
"transfer_rate": 1004999999,
|
||||||
"password_spent": false,
|
"password_spent": false,
|
||||||
"require_destination_tag": false,
|
"require_destination_tag": true,
|
||||||
"require_authorization": false,
|
"require_authorization": false,
|
||||||
"disallow_xrp": false,
|
"disallow_xrp": true,
|
||||||
"disable_master": false,
|
"disable_master": false,
|
||||||
"transaction_sequence": "36",
|
"no_freeze": false,
|
||||||
"email_hash": "",
|
"global_freeze": false,
|
||||||
|
"default_ripple": true,
|
||||||
|
"transaction_sequence": "330",
|
||||||
|
"email_hash": "98B4375E1D753E5B91627516F6D70977",
|
||||||
"wallet_locator": "",
|
"wallet_locator": "",
|
||||||
"wallet_size": "",
|
"wallet_size": "",
|
||||||
"message_key": "0000000000000000000000070000000300",
|
"message_key": "0000000000000000000000070000000300",
|
||||||
@@ -720,18 +723,22 @@ The response contains a `settings` object, with the following fields:
|
|||||||
| Field | Value | Description |
|
| Field | Value | Description |
|
||||||
|-------|-------|-------------|
|
|-------|-------|-------------|
|
||||||
| account | String | The Ripple address of this account |
|
| account | String | The Ripple address of this account |
|
||||||
| transfer_rate | String (Quoted decimal number) | If set, imposes a fee for transferring balances issued by this account. Must be between 1 and 2, with up to 9 decimal places of precision. See [TransferRate](transactions.html#transferrate) for details. |
|
| transfer\_rate | String (Quoted decimal number) | If set, imposes a fee for transferring balances issued by this account. Must be between 1 and 2, with up to 9 decimal places of precision. See [TransferRate](transactions.html#transferrate) for details. |
|
||||||
| password_spent | Boolean | If false, then this account can submit a special [SetRegularKey transaction](transactions.html#setregularkey) without a transaction fee. |
|
| password\_spent | Boolean | If false, then this account can submit a special [SetRegularKey transaction](transactions.html#setregularkey) without a transaction fee. |
|
||||||
| require\_destination\_tag | Boolean | If true, require a destination tag to send payments to this account. (This is intended to protect users from accidentally omitting the destination tag in a payment to a gateway's hosted wallet.) |
|
| require\_destination\_tag | Boolean | If true, require a destination tag to send payments to this account. (This is intended to protect users from accidentally omitting the destination tag in a payment to a gateway's hosted wallet.) |
|
||||||
| require_authorization | Boolean | If true, require authorization for users to hold balances issued by this account. (This prevents users unknown to a gateway from holding funds issued by that gateway.) |
|
| require\_authorization | Boolean | If true, require authorization for users to hold balances issued by this account. (This prevents users unknown to a gateway from holding funds issued by that gateway.) |
|
||||||
| disallow_xrp | Boolean | If true, XRP should not be sent to this account. (Enforced in clients but not in the server, because it could cause accounts to become unusable if all their XRP were spent.) |
|
| disallow\_xrp | Boolean | If true, XRP should not be sent to this account. (Enforced in clients but not in the server, because it could cause accounts to become unusable if all their XRP were spent.) |
|
||||||
| disable_master | Boolean | If true, the master secret key cannot be used to sign transactions for this account. Can only be set to true if a Regular Key is defined for the account. |
|
| disable\_master | Boolean | If true, the master secret key cannot be used to sign transactions for this account. Can only be set to true if a Regular Key is defined for the account. |
|
||||||
| transaction_sequence | String (Quoted integer) | The sequence number of the next valid transaction for this account. (Each account starts with Sequence = 1 and increases each time a transaction is made.) |
|
| no_freeze | Boolean | If true, the account has permanently given up the ability to [freeze](https://ripple.com/files/GB-2014-02.pdf) its trust lines. |
|
||||||
|
| global_freeze | Boolean | If true, all trust lines connected to the account are [frozen](https://ripple.com/files/GB-2014-02.pdf). |
|
||||||
|
| default\_ripple | Boolean | If true, enables [rippling](https://ripple.com/knowledge_center/understanding-the-noripple-flag/) on this account's trustlines by default. _(New in [Ripple-REST v1.5.0](https://github.com/ripple/ripple-rest/releases/tag/1.5.0-rc1))_ |
|
||||||
|
| transaction\_sequence | String (Quoted integer) | The sequence number of the next valid transaction for this account. (Each account starts with Sequence = 1 and increases each time a transaction is made.) |
|
||||||
| email_hash | String | Hash of an email address to be used for generating an avatar image. Conventionally, clients use [Gravatar](http://en.gravatar.com/site/implement/hash/) to display this image. |
|
| email_hash | String | Hash of an email address to be used for generating an avatar image. Conventionally, clients use [Gravatar](http://en.gravatar.com/site/implement/hash/) to display this image. |
|
||||||
| wallet_locator | String | (Not used) |
|
| wallet\_locator | String | (Not used) |
|
||||||
| wallet_size | String | (Not used) |
|
| wallet\_size | String | (Not used) |
|
||||||
| message_key | String | A [secp256k1](https://en.bitcoin.it/wiki/Secp256k1) public key that should be used to encrypt secret messages to this account. |
|
| message\_key | String | A [secp256k1](https://en.bitcoin.it/wiki/Secp256k1) public key that should be used to encrypt secret messages to this account. |
|
||||||
| domain | String | The domain that holds this account. Clients can use this to verify the account in the [ripple.txt](https://wiki.ripple.com/Ripple.txt) or [host-meta](https://wiki.ripple.com/Gateway_Services) of the domain. |
|
| domain | String | The domain that holds this account. Clients can use this to verify the account in the [ripple.txt](https://wiki.ripple.com/Ripple.txt) or [host-meta](https://wiki.ripple.com/Gateway_Services) of the domain. |
|
||||||
|
| signers | (Undefined) | (To be used for [Multi-sign](https://wiki.ripple.com/M_of_N)) |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -755,7 +762,7 @@ POST /v1/accounts/{:address}/settings?validated=true
|
|||||||
"require_authorization": false,
|
"require_authorization": false,
|
||||||
"disallow_xrp": false,
|
"disallow_xrp": false,
|
||||||
"disable_master": false,
|
"disable_master": false,
|
||||||
"transaction_sequence": 22
|
"default_ripple": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -791,12 +798,14 @@ The `settings` object can contain any of the following fields (any omitted field
|
|||||||
|-------|-------|-------------|
|
|-------|-------|-------------|
|
||||||
| transfer_rate | String (Quoted decimal number) | If set, imposes a fee for transferring balances issued by this account. Must be between 1 and 2, with up to 9 decimal places of precision. |
|
| transfer_rate | String (Quoted decimal number) | If set, imposes a fee for transferring balances issued by this account. Must be between 1 and 2, with up to 9 decimal places of precision. |
|
||||||
| require\_destination\_tag | Boolean | If true, require a destination tag to send payments to this account. (This is intended to protect users from accidentally omitting the destination tag in a payment to a gateway's hosted wallet.) |
|
| require\_destination\_tag | Boolean | If true, require a destination tag to send payments to this account. (This is intended to protect users from accidentally omitting the destination tag in a payment to a gateway's hosted wallet.) |
|
||||||
| require_authorization | Boolean | If true, require authorization for users to hold balances issued by this account. (This prevents users unknown to a gateway from holding funds issued by that gateway.) |
|
| require\_authorization | Boolean | If true, require authorization for users to hold balances issued by this account. (This prevents users unknown to a gateway from holding funds issued by that gateway.) |
|
||||||
| disallow_xrp | Boolean | If true, XRP should not be sent to this account. (Enforced in clients but not in the server, because it could cause accounts to become unusable if all their XRP were spent.) |
|
| disallow\_xrp | Boolean | If true, XRP should not be sent to this account. (Enforced in clients but not in the server, because it could cause accounts to become unusable if all their XRP were spent.) |
|
||||||
| disable_master | Boolean | If true, the master secret key cannot be used to sign transactions for this account. Can only be set to true if a Regular Key is defined for the account. |
|
| disable_master | Boolean | If true, the master secret key cannot be used to sign transactions for this account. Can only be set to true if a Regular Key is defined for the account. |
|
||||||
| transaction_sequence | String (Quoted integer) | The sequence number of the next valid transaction for this account. |
|
| no_freeze | Boolean | If true, the account has permanently given up the ability to [freeze](https://ripple.com/files/GB-2014-02.pdf) its trust lines. Cannot be set to false after being true. |
|
||||||
|
| global_freeze | Boolean | If true, [freeze](https://ripple.com/files/GB-2014-02.pdf) all trust lines connected to the account. |
|
||||||
|
| default\_ripple | Boolean | If true, enables [rippling](https://ripple.com/knowledge_center/understanding-the-noripple-flag/) on this account's trustlines by default. _(New in [Ripple-REST v1.5.0](https://github.com/ripple/ripple-rest/releases/tag/1.5.0-rc1))_ |
|
||||||
| email_hash | String | Hash of an email address to be used for generating an avatar image. Conventionally, clients use [Gravatar](http://en.gravatar.com/site/implement/hash/) to display this image. |
|
| email_hash | String | Hash of an email address to be used for generating an avatar image. Conventionally, clients use [Gravatar](http://en.gravatar.com/site/implement/hash/) to display this image. |
|
||||||
| message_key | String | A [secp256k1](https://en.bitcoin.it/wiki/Secp256k1) public key that should be used to encrypt secret messages to this account, as hex. |
|
| message\_key | String | A [secp256k1](https://en.bitcoin.it/wiki/Secp256k1) public key that should be used to encrypt secret messages to this account, as hex. |
|
||||||
| domain | String | The domain that holds this account, as lowercase ASCII. Clients can use this to verify the account in the [ripple.txt](https://wiki.ripple.com/Ripple.txt) or [host-meta](https://wiki.ripple.com/Gateway_Services) of the domain. |
|
| domain | String | The domain that holds this account, as lowercase ASCII. Clients can use this to verify the account in the [ripple.txt](https://wiki.ripple.com/Ripple.txt) or [host-meta](https://wiki.ripple.com/Gateway_Services) of the domain. |
|
||||||
|
|
||||||
*Note:* Some of the account setting fields cannot be modified by this method. For example, the `password_spent` flag is only enabled when the account uses a free SetRegularKey transaction, and only disabled when the account receives a transmission of XRP.
|
*Note:* Some of the account setting fields cannot be modified by this method. For example, the `password_spent` flag is only enabled when the account uses a free SetRegularKey transaction, and only disabled when the account receives a transmission of XRP.
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ There are several different types of transactions that perform different actions
|
|||||||
|
|
||||||
Additionally, there are *Psuedo-Transactions* that are not created and submitted in the usual way, but may appear in ledgers:
|
Additionally, there are *Psuedo-Transactions* that are not created and submitted in the usual way, but may appear in ledgers:
|
||||||
|
|
||||||
* [Fee - Adjust the minimum transaction fee or account reserve](#fee)
|
* [SetFee - Adjust the minimum transaction fee or account reserve](#setfee)
|
||||||
|
|
||||||
Transactions are only valid if signed, submitted, and accepted into a validated ledger version. There are many ways a transaction can fail.
|
Transactions are only valid if signed, submitted, and accepted into a validated ledger version. There are many ways a transaction can fail.
|
||||||
|
|
||||||
@@ -465,8 +465,9 @@ The available AccountSet flags are:
|
|||||||
| asfDisallowXRP | 3 | XRP should not be sent to this account. (Enforced by client applications, not by `rippled`) | lsfDisallowXRP |
|
| asfDisallowXRP | 3 | XRP should not be sent to this account. (Enforced by client applications, not by `rippled`) | lsfDisallowXRP |
|
||||||
| asfDisableMaster | 4 | Disallow use of the master key. Can only be enabled if the account has a [RegularKey](#setregularkey) configured. | lsfDisableMaster |
|
| asfDisableMaster | 4 | Disallow use of the master key. Can only be enabled if the account has a [RegularKey](#setregularkey) configured. | lsfDisableMaster |
|
||||||
| asfAccountTxnID | 5 | Track the ID of this account's most recent transaction. Required for [AccountTxnID](#accounttxnid) | (None) |
|
| asfAccountTxnID | 5 | Track the ID of this account's most recent transaction. Required for [AccountTxnID](#accounttxnid) | (None) |
|
||||||
| asfNoFreeze | 6 | Permanently give up the ability to freeze individual trust lines. This flag can never be cleared. | lsfNoFreeze |
|
| asfNoFreeze | 6 | Permanently give up the ability to freeze individual trust lines. This flag can never be disabled after being enabled. | lsfNoFreeze |
|
||||||
| asfGlobalFreeze | 7 | Freeze all assets issued by this account. | lsfGlobalFreeze |
|
| asfGlobalFreeze | 7 | Freeze all assets issued by this account. | lsfGlobalFreeze |
|
||||||
|
| asfDefaultRipple | 8 | Enable [rippling](https://ripple.com/knowledge_center/understanding-the-noripple-flag/) on this account's trust lines by default. _(New in [rippled 0.27.3](https://github.com/ripple/rippled/releases/tag/0.27.3))_ | lsfDefaultRipple |
|
||||||
|
|
||||||
The following [Transaction flags](#flags), specific to the AccountSet transaction type, serve the same purpose, but are discouraged:
|
The following [Transaction flags](#flags), specific to the AccountSet transaction type, serve the same purpose, but are discouraged:
|
||||||
|
|
||||||
@@ -698,7 +699,7 @@ There are two cases where you can hold a balance on a trust line that is *greate
|
|||||||
|
|
||||||
Since a trust line occupies space in the ledger, [a trust line increases the XRP your account must hold in reserve](https://wiki.ripple.com/Reserves). This applies to the account extending trust, not to the account receiving it.
|
Since a trust line occupies space in the ledger, [a trust line increases the XRP your account must hold in reserve](https://wiki.ripple.com/Reserves). This applies to the account extending trust, not to the account receiving it.
|
||||||
|
|
||||||
A trust line with a limit *and* a balance of 0 is equivalent to no trust line.
|
A trust line with settings in the default state is equivalent to no trust line.
|
||||||
|
|
||||||
### TrustSet Flags ###
|
### TrustSet Flags ###
|
||||||
|
|
||||||
@@ -727,19 +728,38 @@ Some of the fields that are mandatory for normal transactions do not make sense
|
|||||||
| SigningPubKey | "" |
|
| SigningPubKey | "" |
|
||||||
| Signature | "" |
|
| Signature | "" |
|
||||||
|
|
||||||
## Fee ##
|
## SetFee ##
|
||||||
|
|
||||||
A change in transaction or account fees. This is typically in response to changes in the load on the network.
|
A change in transaction or account fees. This is typically in response to changes in the load on the network.
|
||||||
|
|
||||||
*Note:* There have been very few, if any, Fee psuedo-transactions, ever. It is possible, but very unlikely, that you may encounter one in a historical ledger.
|
*Note:* You cannot send a pseudo-transaction, but you may encounter one when processing ledgers.
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"Account": "rrrrrrrrrrrrrrrrrrrrrhoLvTp",
|
||||||
|
"BaseFee": "000000000000000A",
|
||||||
|
"Fee": "0",
|
||||||
|
"ReferenceFeeUnits": 10,
|
||||||
|
"ReserveBase": 20000000,
|
||||||
|
"ReserveIncrement": 5000000,
|
||||||
|
"Sequence": 0,
|
||||||
|
"SigningPubKey": "",
|
||||||
|
"TransactionType": "SetFee",
|
||||||
|
"date": 439578860,
|
||||||
|
"hash": "1C15FEA3E1D50F96B6598607FC773FF1F6E0125F30160144BE0C5CBC52F5151B",
|
||||||
|
"ledger_index": 3721729,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
| Field | JSON Type | [Internal Type](https://wiki.ripple.com/Binary_Format) | Description |
|
| Field | JSON Type | [Internal Type](https://wiki.ripple.com/Binary_Format) | Description |
|
||||||
|-------|-----------|--------------------------------------------------------|-------------|
|
|-------|-----------|--------------------------------------------------------|-------------|
|
||||||
| BaseFee | String (Quoted Integer) | UInt64 | The charge, in drops, for the reference transaction. (See [Transaction Fee Terminology](https://ripple.com/wiki/Transaction_Fee#Fee_Terminology) |
|
| BaseFee | String | UInt64 | The charge, in drops, for the reference transaction, as hex. (See [Transaction Fee Terminology](https://ripple.com/wiki/Transaction_Fee#Fee_Terminology) |
|
||||||
| ReferenceFeeUnits | Unsigned Integer | UInt32 | The cost, in fee units, of the reference transaction |
|
| ReferenceFeeUnits | Unsigned Integer | UInt32 | The cost, in fee units, of the reference transaction |
|
||||||
| ReserveBase | Unsigned Integer | UInt32 | The base reserve, in drops |
|
| ReserveBase | Unsigned Integer | UInt32 | The base reserve, in drops |
|
||||||
| ReserveIncrement | Unsigned Integer | UInt32 | The incremental reserve, in drops |
|
| ReserveIncrement | Unsigned Integer | UInt32 | The incremental reserve, in drops |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Transaction Results #
|
# Transaction Results #
|
||||||
|
|
||||||
## Immediate Response ##
|
## Immediate Response ##
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ h2 {
|
|||||||
margin:0;
|
margin:0;
|
||||||
height:100%;
|
height:100%;
|
||||||
}
|
}
|
||||||
#command_list li {
|
/*#command_list li {
|
||||||
padding:4px 12px;
|
padding:4px 12px;
|
||||||
display:block;
|
display:block;
|
||||||
width:200px;
|
width:200px;
|
||||||
@@ -61,13 +61,32 @@ h2 {
|
|||||||
-moz-user-select:none;
|
-moz-user-select:none;
|
||||||
color:#0088CC;
|
color:#0088CC;
|
||||||
}
|
}
|
||||||
#command_list li:hover {
|
|
||||||
color:#444;
|
|
||||||
}
|
|
||||||
#command_list li.selected {
|
#command_list li.selected {
|
||||||
color:#444;
|
color:#444;
|
||||||
background:#f0f0f0;
|
background:#f0f0f0;
|
||||||
|
cursor: auto;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
#command_list li {
|
||||||
|
width: 200px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#command_list li.selected a {
|
||||||
|
cursor: default;
|
||||||
|
text-decoration: none;
|
||||||
|
color: #444;
|
||||||
|
background: #f0f0f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#command_list li.separator {
|
||||||
|
color: #474648;
|
||||||
|
font-family: "Open Sans",sans-serif;
|
||||||
|
font-size: 13px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
#command_table {
|
#command_table {
|
||||||
height:100%;
|
height:100%;
|
||||||
}
|
}
|
||||||
@@ -454,3 +473,4 @@ span.cm-atom {
|
|||||||
#rest_url div input {
|
#rest_url div input {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
$(".flatdoc-content").empty();
|
$(".flatdoc-content").empty();
|
||||||
$(".content-root .menubar .menu").empty();
|
$(".content-root .menubar .menu").empty();
|
||||||
Flatdoc.run({
|
Flatdoc.run({
|
||||||
fetcher: Flatdoc.file('content/exchange_to_gateway.md')
|
fetcher: Flatdoc.file('content/gateway_guide.md')
|
||||||
});
|
});
|
||||||
$(document).on('flatdoc:ready', function() {
|
$(document).on('flatdoc:ready', function() {
|
||||||
$().multicode_tabs();
|
$().multicode_tabs();
|
||||||
@@ -89,8 +89,9 @@
|
|||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="ripple-api-tool.html">WebSocket Tool</a></li>
|
<li><a href="rest-api-tool.html">Ripple-REST API Tool</a></li>
|
||||||
<li><a href="rest-api-tool.html">REST Tool</a></li>
|
<li><a href="historicaldb-api-tool.html">Historical Database API Tool</a></li>
|
||||||
|
<li><a href="ripple-api-tool.html">WebSocket API Tool</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
|||||||
@@ -89,8 +89,9 @@
|
|||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="ripple-api-tool.html">WebSocket Tool</a></li>
|
<li><a href="rest-api-tool.html">Ripple-REST API Tool</a></li>
|
||||||
<li><a href="rest-api-tool.html">REST Tool</a></li>
|
<li><a href="historicaldb-api-tool.html">Historical Database API Tool</a></li>
|
||||||
|
<li><a href="ripple-api-tool.html">WebSocket API Tool</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
|||||||
@@ -89,8 +89,9 @@
|
|||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="ripple-api-tool.html">WebSocket Tool</a></li>
|
<li><a href="rest-api-tool.html">Ripple-REST API Tool</a></li>
|
||||||
<li><a href="rest-api-tool.html">REST Tool</a></li>
|
<li><a href="historicaldb-api-tool.html">Historical Database API Tool</a></li>
|
||||||
|
<li><a href="ripple-api-tool.html">WebSocket API Tool</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
|||||||
@@ -89,8 +89,9 @@
|
|||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="ripple-api-tool.html">WebSocket Tool</a></li>
|
<li><a href="rest-api-tool.html">Ripple-REST API Tool</a></li>
|
||||||
<li><a href="rest-api-tool.html">REST Tool</a></li>
|
<li><a href="historicaldb-api-tool.html">Historical Database API Tool</a></li>
|
||||||
|
<li><a href="ripple-api-tool.html">WebSocket API Tool</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
|||||||
190
historicaldb-api-tool.html
Normal file
190
historicaldb-api-tool.html
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
<!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>Historical Database API Tool - Ripple Developer Portal</title>
|
||||||
|
|
||||||
|
<!-- favicon -->
|
||||||
|
<link rel="icon" href="favicon.ico" type="image/x-icon">
|
||||||
|
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
|
||||||
|
|
||||||
|
<!-- jQuery -->
|
||||||
|
<script src="vendor/jquery-1.11.1.min.js"></script>
|
||||||
|
|
||||||
|
<!-- Bootstrap -->
|
||||||
|
<link href="css/bootstrap.min.css" rel="stylesheet">
|
||||||
|
<script src="js/bootstrap.min.js"></script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Custom Stylesheets -->
|
||||||
|
<link href="font/fonts.css" rel="stylesheet" type="text/css" />
|
||||||
|
<link href="css/main.css" rel="stylesheet" />
|
||||||
|
<link href="css/custom.css" rel="stylesheet" />
|
||||||
|
|
||||||
|
<link rel="shortcut icon" href="favicon.ico?v=2" type="image/x-icon" />
|
||||||
|
<link rel="icon" href="favicon.ico?v=2" type="image/x-icon" />
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body >
|
||||||
|
<div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
|
||||||
|
<div class="container">
|
||||||
|
<div class="navbar-header">
|
||||||
|
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
||||||
|
<span class="sr-only">Toggle navigation</span>
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
</button>
|
||||||
|
<a class="navbar-brand" href="./"><img class="small_logo" src="assets/img/ripple_logo_small.png"></a>
|
||||||
|
</div>
|
||||||
|
<div class="navbar-collapse collapse">
|
||||||
|
<ul class="nav navbar-nav">
|
||||||
|
<li class="dropdown">
|
||||||
|
<a href="./" class="dropdown-toggle" data-toggle="dropdown">Documentation <span class="caret"></span></a>
|
||||||
|
<ul class="dropdown-menu" role="menu">
|
||||||
|
<li><a href="rippled-apis.html">rippled</a></li>
|
||||||
|
<li><a href="ripple-rest.html">Ripple-REST</a></li>
|
||||||
|
<li><a href="gatewayd.html">Gatewayd</a></li>
|
||||||
|
<li><a href="transactions.html">Transactions</a></li>
|
||||||
|
<li><a href="reliable_tx.html">Reliable Transaction Submission</a></li>
|
||||||
|
<li><a href="gateway_guide.html">Gateway Guide</a></li>
|
||||||
|
<li><a href="historical_data.html">Historical Data API</a></li>
|
||||||
|
<li><a href="charts_api.html">Ripple Charts API</a></li>
|
||||||
|
<li><a href="gateway_services.html">Gateway Services</a></li>
|
||||||
|
<li><a href="whitepapers.html">Whitepapers</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li class="dropdown">
|
||||||
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
||||||
|
<ul class="dropdown-menu" role="menu">
|
||||||
|
<li><a href="rest-api-tool.html">Ripple-REST API Tool</a></li>
|
||||||
|
<li><a href="historicaldb-api-tool.html">Historical Database API Tool</a></li>
|
||||||
|
<li><a href="ripple-api-tool.html">WebSocket API Tool</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li class="dropdown">
|
||||||
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Resources <span class="caret"></span></a>
|
||||||
|
<ul class="dropdown-menu" role="menu">
|
||||||
|
<li><a href="https://forum.ripple.com/viewforum.php?f=2">Forums</a></li>
|
||||||
|
<li><a href="https://www.bountysource.com/teams/ripple/bounties">Bounties</a></li>
|
||||||
|
<li><a href="https://ripplelabs.atlassian.net/">Bug Tracking</a></li>
|
||||||
|
<li><a href="https://ripple.com/category/dev-blog/">Dev Blog</a></li>
|
||||||
|
<li><a href="https://ripple.com/press-releases/">Press Center</a></li>
|
||||||
|
<li><a href="https://ripple.com/brand-guidelines/">Brand Guidelines</a></li>
|
||||||
|
</ul>
|
||||||
|
<li><a href="https://github.com/ripple/ripple-dev-portal" title="GitHub">Site Source</a></li>
|
||||||
|
</ul>
|
||||||
|
</div><!--/.nav-collapse -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='wrapper'>
|
||||||
|
<div class='content-root'>
|
||||||
|
<div id='wrapper'>
|
||||||
|
<div style="clear:both;"></div>
|
||||||
|
<div id='command_wrapper'>
|
||||||
|
<ul id='command_list'>
|
||||||
|
</ul>
|
||||||
|
<div id='command_table'>
|
||||||
|
<div id='io_wrapper'>
|
||||||
|
<div id='input' class='io'>
|
||||||
|
<h2>REST Request</h2>
|
||||||
|
<div id='test_warning' class='alert alert-danger' style='display:none;'>
|
||||||
|
<h4>Test accounts only!</h4>
|
||||||
|
<p>Never submit account secrets to a server you do not control, unless you are prepared to lose ownership of the account!</p>
|
||||||
|
</div>
|
||||||
|
<div style="clear:both;"></div>
|
||||||
|
<h3 id='selected_command' title='Reference information'></h3>
|
||||||
|
<p id='description'></p>
|
||||||
|
<div id='invalid'>Invalid JSON</div>
|
||||||
|
<div id='rest_url_wrapper'>
|
||||||
|
<p><span id='rest_host'>https://history.ripple.com</span><span id='rest_url'></span></p>
|
||||||
|
</div>
|
||||||
|
<div id='request_body'></div>
|
||||||
|
<div id='request_options'>
|
||||||
|
<div class="button btn btn-primary api" id='request_button'>Send request</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id='output' class='io'>
|
||||||
|
<h2>Response</h2>
|
||||||
|
<div>
|
||||||
|
<img class="loader" src="assets/img/rippleThrobber.png" style="vertical-align: middle; display:none;"/>
|
||||||
|
<span id='rest_responsecode'></span>
|
||||||
|
</div>
|
||||||
|
<div id='response_body'></div>
|
||||||
|
<div id='tooltip'></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<footer class="footer">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3">
|
||||||
|
<h4>Documentation</h4>
|
||||||
|
<ul class="footer_links">
|
||||||
|
<li><a href="rippled-apis.html">rippled</a></li>
|
||||||
|
<li><a href="ripple-rest.html">Ripple-REST</a></li>
|
||||||
|
<li><a href="gatewayd.html">Gatewayd</a></li>
|
||||||
|
<li><a href="transactions.html">Transactions</a></li>
|
||||||
|
<li><a href="reliable_tx.html">Reliable Transaction Submission</a></li>
|
||||||
|
<li><a href="gateway_guide.html">Gateway Guide</a></li>
|
||||||
|
<li><a href="historical_data.html">Historical Data API</a></li>
|
||||||
|
<li><a href="charts_api.html">Ripple Charts API</a></li>
|
||||||
|
<li><a href="gateway_services.html">Gateway Services</a></li>
|
||||||
|
<li><a href="whitepapers.html">Whitepapers</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3">
|
||||||
|
<h4>Resources</h4>
|
||||||
|
<ul class="footer_links">
|
||||||
|
<li><a href="https://ripple.com/press-releases/">Press Center</a></li>
|
||||||
|
<li><a href="https://ripple.com/brand-guidelines/">Brand Use and Guidelines</a></li>
|
||||||
|
<li><a href="https://forum.ripple.com/viewforum.php?f=2">Forums</a></li>
|
||||||
|
<li><a href="https://ripple.com/category/dev-blog/">Dev Blog</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3">
|
||||||
|
<h4>Ripple Projects</h4>
|
||||||
|
<ul class="footer_links">
|
||||||
|
<li><a href="https://www.rippletrade.com">Ripple Trade</a>
|
||||||
|
<li><a href="https://www.ripplecharts.com">Ripple Charts</a>
|
||||||
|
<li><a href="https://ripple.com/graph">Ripple Graph</a>
|
||||||
|
<li><a href="http://codius.org/">Codius</a>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3">
|
||||||
|
<h4>Ripple Labs</h4>
|
||||||
|
<ul class="footer_links">
|
||||||
|
<li><a href="https://www.ripplelabs.com/wp-content/uploads/2014/10/ripple_labs_bylaws.pdf">Corporate Bylaws</a></li>
|
||||||
|
<li><a href="https://www.ripplelabs.com/wp-content/uploads/2014/09/ripple_labs_code_of_conduct1.pdf">Code of Conduct</a></li>
|
||||||
|
<li><a href="https://www.ripplelabs.com/team/">Team</a></li>
|
||||||
|
<li><a href="https://www.ripplelabs.com/careers/">Careers</a></li>
|
||||||
|
<li><a href="https://www.ripplelabs.com/investors/">Investors</a></li>
|
||||||
|
<li><a href="https://www.ripplelabs.com/advisors/">Advisors</a></li>
|
||||||
|
<li><a href="https://www.ripplelabs.com/xrp-distribution/">XRP Distribution</a></li>
|
||||||
|
<li><a href="https://www.ripplelabs.com/contact/">Contact</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<link rel='stylesheet' type='text/css' href='css/api-style.css'/>
|
||||||
|
<link rel='stylesheet' type='text/css' href='css/codemirror.css'/>
|
||||||
|
<script type='text/javascript' src='js/es5-shim.js'></script>
|
||||||
|
<script src='vendor/codemirror.min.js'></script>
|
||||||
|
<script type='text/javascript' src='js/cm-javascript.min.js'></script>
|
||||||
|
<script type='text/javascript' src='js/jquery.autosize.input.min.js'></script>
|
||||||
|
<script type='text/javascript' src='js/apitool-rest.js'></script>
|
||||||
|
<script type='text/javascript' src='js/apitool-methods-historical.js'></script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
BIN
img/e2g-funds_flow.png
Normal file
BIN
img/e2g-funds_flow.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 43 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 90 KiB |
@@ -75,8 +75,9 @@
|
|||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="ripple-api-tool.html">WebSocket Tool</a></li>
|
<li><a href="rest-api-tool.html">Ripple-REST API Tool</a></li>
|
||||||
<li><a href="rest-api-tool.html">REST Tool</a></li>
|
<li><a href="historicaldb-api-tool.html">Historical Database API Tool</a></li>
|
||||||
|
<li><a href="ripple-api-tool.html">WebSocket API Tool</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
@@ -141,7 +142,7 @@
|
|||||||
<ul class="resources">
|
<ul class="resources">
|
||||||
<li>Resources:</li>
|
<li>Resources:</li>
|
||||||
<li><a href="https://www.ripplecharts.com"><i class="fa fa-home"></i> Website </a></li>
|
<li><a href="https://www.ripplecharts.com"><i class="fa fa-home"></i> Website </a></li>
|
||||||
<li><a href="http://docs.rippledataapi.apiary.io/"><i class="fa fa-file-text-o"></i> Overview </a></li>
|
<li><a href="charts_api.html"><i class="fa fa-cubes"></i> API Reference </a></li>
|
||||||
<li><a href="https://github.com/ripple/ripplecharts-frontend"><i class="fa fa-code"></i> Source (Frontend) </a></li>
|
<li><a href="https://github.com/ripple/ripplecharts-frontend"><i class="fa fa-code"></i> Source (Frontend) </a></li>
|
||||||
<li><a href="https://github.com/ripple/ripple-data-api"><i class="fa fa-code"></i> Source (Data API) </a></li>
|
<li><a href="https://github.com/ripple/ripple-data-api"><i class="fa fa-code"></i> Source (Data API) </a></li>
|
||||||
<li><a href="https://www.bountysource.com/trackers/3954022-ripple-charts"><i class="fa fa-dot-circle-o"></i> Bounties </a></li>
|
<li><a href="https://www.bountysource.com/trackers/3954022-ripple-charts"><i class="fa fa-dot-circle-o"></i> Bounties </a></li>
|
||||||
@@ -204,7 +205,6 @@
|
|||||||
<li><a href="rippled-apis.html"><i class="fa fa-cubes"></i> API Reference </a></li>
|
<li><a href="rippled-apis.html"><i class="fa fa-cubes"></i> API Reference </a></li>
|
||||||
<li><a href="https://github.com/ripple/rippled"><i class="fa fa-code"></i> Source </a></li>
|
<li><a href="https://github.com/ripple/rippled"><i class="fa fa-code"></i> Source </a></li>
|
||||||
<li><a href="https://www.bountysource.com/trackers/304896-rippled"><i class="fa fa-dot-circle-o"></i> Bounties </a></li>
|
<li><a href="https://www.bountysource.com/trackers/304896-rippled"><i class="fa fa-dot-circle-o"></i> Bounties </a></li>
|
||||||
<li><a href="consensus-whitepaper.html"><i class="fa fa-file"></i> Consensus Whitepaper </a></li>
|
|
||||||
<li><a href="transactions.html"><i class="fa fa-cubes"></i> Transaction Format </a></li>
|
<li><a href="transactions.html"><i class="fa fa-cubes"></i> Transaction Format </a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
56
js/apitool-methods-historical.js
Normal file
56
js/apitool-methods-historical.js
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
//---------- List of requests ------------------------//
|
||||||
|
// Must be loaded after apitool-rest.js //
|
||||||
|
var DOC_BASE = "historical_data.html";
|
||||||
|
var URL_BASE = "https://history.ripple.com:443";
|
||||||
|
|
||||||
|
var DEFAULT_ADDRESS_1 = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn";
|
||||||
|
var DEFAULT_HASH = "9D591B18EDDD34F0B6CF4223A2940AEA2C3CC778925BABF289E0011CD8FA056E";
|
||||||
|
var DEFAULT_LEDGER = "3170DA37CE2B7F045F889594CBC323D88686D2E90E8FFD2BBCD9BAD12E416DB5";
|
||||||
|
|
||||||
|
|
||||||
|
Request('Get Account Transaction History', {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/accounts/{:address}/transactions?{:query_params}",
|
||||||
|
description: "Retrieve transactions that affected the given account.",
|
||||||
|
link: "#get-account-transaction-history",
|
||||||
|
params: {
|
||||||
|
"{:address}": DEFAULT_ADDRESS_1,
|
||||||
|
"{:query_params}": "type=Payment&result=tesSUCCESS"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request('Get Transaction By Account and Sequence', {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/accounts/{:address}/transactions/{:sequence}?{:query_params}",
|
||||||
|
description: "Retrieve a specific transaction, by the account that sent it and the sequence number it used.",
|
||||||
|
link: "#get-transaction-by-account-and-sequence",
|
||||||
|
params: {
|
||||||
|
"{:address}": DEFAULT_ADDRESS_1,
|
||||||
|
"{:sequence}": 1,
|
||||||
|
"{:query_params}": "binary=false"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request('Get Transaction', {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/transactions/{:hash}?{:query_params}",
|
||||||
|
description: "Retrieve a transactions by its identifying hash.",
|
||||||
|
link: "#get-transaction",
|
||||||
|
params: {
|
||||||
|
"{:hash}": DEFAULT_HASH,
|
||||||
|
"{:query_params}": "binary=false"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request('Get Ledger', {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/ledgers/{:ledger_identifier}?{:query_params}",
|
||||||
|
description: "Retrieve a ledger by its sequence number or identifying hash.",
|
||||||
|
link: "#get-ledger",
|
||||||
|
params: {
|
||||||
|
"{:ledger_identifier}": DEFAULT_LEDGER,
|
||||||
|
"{:query_params}": "transactions=true&binary=false&expand=true"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//---------- End req. List ---------------------------//
|
||||||
309
js/apitool-methods-ripplerest.js
Normal file
309
js/apitool-methods-ripplerest.js
Normal file
@@ -0,0 +1,309 @@
|
|||||||
|
//---------- List of requests ------------------------//
|
||||||
|
// Must be loaded after apitool-rest.js //
|
||||||
|
var URL_BASE = "https://api.ripple.com:443";
|
||||||
|
var DOC_BASE = "ripple-rest.html";
|
||||||
|
|
||||||
|
var DEFAULT_ADDRESS_1 = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn";
|
||||||
|
var DEFAULT_ADDRESS_2 = "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX";
|
||||||
|
var DEFAULT_ADDRESS_3 = "rJnZ4YHCUsHvQu7R6mZohevKJDHFzVD6Zr";
|
||||||
|
var DEFAULT_HASH = "9D591B18EDDD34F0B6CF4223A2940AEA2C3CC778925BABF289E0011CD8FA056E";
|
||||||
|
var DEFAULT_SECRET = "sn3nxiW7v8KXzPzAqzyHXbSSKNuN9";
|
||||||
|
|
||||||
|
Request('ACCOUNTS');
|
||||||
|
|
||||||
|
Request('Generate Wallet', {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/wallet/new",
|
||||||
|
description: 'Randomly generate keys for a potential new Ripple account.',
|
||||||
|
link: '#generate-wallet'
|
||||||
|
});
|
||||||
|
|
||||||
|
Request('Get Account Balances', {
|
||||||
|
method: GET,
|
||||||
|
path: '/v1/accounts/{:address}/balances?{:query_params}',
|
||||||
|
description: 'Retrieve the current balances for the given Ripple account.',
|
||||||
|
link: '#get-account-balances',
|
||||||
|
params: {
|
||||||
|
"{:address}": DEFAULT_ADDRESS_1,
|
||||||
|
"{:query_params}": "currency=USD"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request('Get Account Settings', {
|
||||||
|
method: GET,
|
||||||
|
path: '/v1/accounts/{:address}/settings',
|
||||||
|
description: 'Retrieve the current settings for the given Ripple account.',
|
||||||
|
link: '#get-account-settings',
|
||||||
|
params: {
|
||||||
|
"{:address}": DEFAULT_ADDRESS_1
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request('Update Account Settings', {
|
||||||
|
method: POST,
|
||||||
|
path: '/v1/accounts/{:address}/settings?{:query_params}',
|
||||||
|
description: 'Change the current settings for the given Ripple account.',
|
||||||
|
link: '#update-account-settings',
|
||||||
|
test_only: true,
|
||||||
|
params: {
|
||||||
|
"{:address}": DEFAULT_ADDRESS_1,
|
||||||
|
"{:query_params}": "validated=true"
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
secret: DEFAULT_SECRET,
|
||||||
|
settings: {
|
||||||
|
require_destination_tag: false,
|
||||||
|
require_authorization: false,
|
||||||
|
disallow_xrp: false,
|
||||||
|
disable_master: false,
|
||||||
|
email_hash: "98b4375e1d753e5b91627516f6d70977"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request("PAYMENTS");
|
||||||
|
|
||||||
|
Request('Prepare Payment', {
|
||||||
|
method: GET,
|
||||||
|
path: '/v1/accounts/{:source_address}/payments/paths/{:destination_address}/{:amount}?{:query_params}',
|
||||||
|
description: 'Retrieve possible payment objects for a desired payment.',
|
||||||
|
link: '#prepare-payment',
|
||||||
|
params: {
|
||||||
|
"{:source_address}": DEFAULT_ADDRESS_1,
|
||||||
|
"{:destination_address}": DEFAULT_ADDRESS_2,
|
||||||
|
"{:amount}": "1+USD+rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
|
||||||
|
"{:query_params}": "source_currencies=USD"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request('Submit Payment', {
|
||||||
|
method: POST,
|
||||||
|
path: '/v1/accounts/{:source_address}/payments?{:query_params}',
|
||||||
|
description: 'Send a prepared payment to the network.',
|
||||||
|
link: '#submit-payment',
|
||||||
|
test_only: true,
|
||||||
|
body: {
|
||||||
|
"secret": DEFAULT_SECRET,
|
||||||
|
"client_resource_id": "348170b9-16b9-4927-854d-7f9d4a2a692d",
|
||||||
|
"payment": {
|
||||||
|
"source_account": DEFAULT_ADDRESS_1,
|
||||||
|
"source_tag": "",
|
||||||
|
"source_amount": {
|
||||||
|
"value": "1",
|
||||||
|
"currency": "USD",
|
||||||
|
"issuer": ""
|
||||||
|
},
|
||||||
|
"source_slippage": "0",
|
||||||
|
"destination_account": DEFAULT_ADDRESS_2,
|
||||||
|
"destination_tag": "",
|
||||||
|
"destination_amount": {
|
||||||
|
"value": "1",
|
||||||
|
"currency": "USD",
|
||||||
|
"issuer": DEFAULT_ADDRESS_1
|
||||||
|
},
|
||||||
|
"invoice_id": "",
|
||||||
|
"paths": "[]",
|
||||||
|
"partial_payment": false,
|
||||||
|
"no_direct_ripple": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
params: {
|
||||||
|
"{:source_address}": DEFAULT_ADDRESS_1,
|
||||||
|
"{:query_params}": "validated=true"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request("Confirm Payment", {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/accounts/{:address}/payments/{:id}",
|
||||||
|
description: "Retrieve details of a payment and its status.",
|
||||||
|
link: "#confirm-payment",
|
||||||
|
params: {
|
||||||
|
"{:address}": DEFAULT_ADDRESS_1,
|
||||||
|
"{:id}": DEFAULT_HASH
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request("Get Payment History", {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/accounts/{:address}/payments?{:query_params}",
|
||||||
|
description: "Browse through the history of payments sent and received by an account.",
|
||||||
|
link: "#get-payment-history",
|
||||||
|
params: {
|
||||||
|
"{:address}": DEFAULT_ADDRESS_1,
|
||||||
|
"{:query_params}": "direction=incoming&exclude_failed=true"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request("ORDERS");
|
||||||
|
|
||||||
|
Request("Place Order", {
|
||||||
|
method: POST,
|
||||||
|
path: "/v1/accounts/{:address}/orders?{:query_params}",
|
||||||
|
description: "Place an order on the ripple network.",
|
||||||
|
link: "#place-order",
|
||||||
|
test_only: true,
|
||||||
|
params: {
|
||||||
|
"{:address}": DEFAULT_ADDRESS_1,
|
||||||
|
"{:query_params}": "validated=true"
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
"secret": DEFAULT_SECRET,
|
||||||
|
"order": {
|
||||||
|
"type": "sell",
|
||||||
|
"taker_pays": {
|
||||||
|
"currency": "JPY",
|
||||||
|
"value": "4000",
|
||||||
|
"counterparty": "rMAz5ZnK73nyNUL4foAvaxdreczCkG3vA6"
|
||||||
|
},
|
||||||
|
"taker_gets": {
|
||||||
|
"currency": "USD",
|
||||||
|
"value": ".25",
|
||||||
|
"counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"
|
||||||
|
},
|
||||||
|
"immediate_or_cancel": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request("Cancel Order", {
|
||||||
|
method: DELETE,
|
||||||
|
path: "/v1/accounts/{:address}/orders/{:order}/?{:query_params}",
|
||||||
|
description: "Cancel an order on the ripple network.",
|
||||||
|
link: "#cancel-order",
|
||||||
|
test_only: true,
|
||||||
|
params: {
|
||||||
|
"{:address}": DEFAULT_ADDRESS_1,
|
||||||
|
"{:query_params}": "validated=true",
|
||||||
|
"{:order}": "23"
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
"secret": DEFAULT_SECRET
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request("Get Account Orders", {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/accounts/{:address}/orders?{:query_params}",
|
||||||
|
description: "Get open currency-exchange orders associated with the Ripple address.",
|
||||||
|
link: "#get-account-orders",
|
||||||
|
params: {
|
||||||
|
"{:address}": DEFAULT_ADDRESS_3,
|
||||||
|
"{:query_params}": "ledger=10399192&limit=15"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request("Get Order Transaction", {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/accounts/{:address}/orders/{:hash}",
|
||||||
|
description: "Get the details of an order transaction.",
|
||||||
|
link: "#get-order-transaction",
|
||||||
|
params: {
|
||||||
|
"{:address}": "rEQWVz1qN4DWw5J17s3DgXQzUuVYDSpK6M",
|
||||||
|
"{:hash}": "D53A3B99AC0C3CAF35D72178390ACA94CD42479A98CEA438EEAFF338E5FEB76D"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request("Get Order Book", {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/accounts/{:address}/order_book/{:base}/{:counter}?{:query_params}",
|
||||||
|
description: "Get the order book for a currency pair",
|
||||||
|
link: "#get-order-book",
|
||||||
|
params: {
|
||||||
|
"{:address}": DEFAULT_ADDRESS_3,
|
||||||
|
"{:base}": "BTC+rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
|
||||||
|
"{:counter}": "USD+rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
|
||||||
|
"{:query_params}": "limit=10"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request("TRUST LINES");
|
||||||
|
|
||||||
|
Request("Get Trustlines", {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/accounts/{:address}/trustlines?{:query_params}",
|
||||||
|
description: "Check the status of one or more trustlines attached to an account.",
|
||||||
|
link: "#get-trustlines",
|
||||||
|
params: {
|
||||||
|
"{:address}": DEFAULT_ADDRESS_1,
|
||||||
|
"{:query_params}": "currency=USD&counterparty=ra5nK24KXen9AHvsdFTKHSANinZseWnPcX"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request("Grant Trustline", {
|
||||||
|
method: POST,
|
||||||
|
path: "/v1/accounts/{:address}/trustlines?{:query_params}",
|
||||||
|
description: "Add or modify a trustline from this account.",
|
||||||
|
link: "#grant-trustline",
|
||||||
|
test_only: true,
|
||||||
|
params: {
|
||||||
|
"{:address}": DEFAULT_ADDRESS_1,
|
||||||
|
"{:query_params}": "validated=true"
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
"secret": DEFAULT_SECRET,
|
||||||
|
"trustline": {
|
||||||
|
"limit": "110",
|
||||||
|
"currency": "USD",
|
||||||
|
"counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q",
|
||||||
|
"allows_rippling": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request("NOTIFICATIONS");
|
||||||
|
|
||||||
|
Request("Check Notifications", {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/accounts/{:address}/notifications/{:id}",
|
||||||
|
description: "Monitor an account for all kinds of transactions.",
|
||||||
|
link: "#check-notifications",
|
||||||
|
params: {
|
||||||
|
"{:address}": DEFAULT_ADDRESS_1,
|
||||||
|
"{:id}": DEFAULT_HASH
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request("RIPPLED SERVER STATUS");
|
||||||
|
|
||||||
|
Request("Check Connection", {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/server/connected",
|
||||||
|
description: "Check whether the REST server is connected to a rippled server.",
|
||||||
|
link: "#check-connection"
|
||||||
|
});
|
||||||
|
|
||||||
|
Request("Get Server Status", {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/server",
|
||||||
|
description: "Retrieve information about the current status of the Ripple-REST server and the rippled server it is connected to.",
|
||||||
|
link: "#get-server-status"
|
||||||
|
});
|
||||||
|
|
||||||
|
Request("UTILITIES");
|
||||||
|
|
||||||
|
Request("Retrieve Ripple Transaction", {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/transactions/{:id}",
|
||||||
|
description: "Retrieve a raw Ripple transaction",
|
||||||
|
link: "#retrieve-ripple-transaction",
|
||||||
|
params: {
|
||||||
|
"{:id}": DEFAULT_HASH
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Request("Retrieve Transaction Fee", {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/transaction-fee",
|
||||||
|
description: "Retrieve the current transaction fee for the connected rippled server(s).",
|
||||||
|
link: "#retrieve-transaction-fee",
|
||||||
|
});
|
||||||
|
|
||||||
|
Request("Generate UUID", {
|
||||||
|
method: GET,
|
||||||
|
path: "/v1/uuid",
|
||||||
|
description: "Create a universally-unique identifier (UUID) to use as the client resource ID for a payment.",
|
||||||
|
link: "#create-client-resource-id"
|
||||||
|
});
|
||||||
|
|
||||||
|
//---------- End req. List ---------------------------//
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
var commands = $("#command_list li");
|
var commandlist = $("#command_list");
|
||||||
var request_body = $("#request_body");
|
var request_body = $("#request_body");
|
||||||
var request_button = $("#request_button");
|
var request_button = $("#request_button");
|
||||||
var response_body = $("#response_body");
|
var response_body = $("#response_body");
|
||||||
@@ -14,9 +14,6 @@ var GET = "GET";
|
|||||||
var POST = "POST";
|
var POST = "POST";
|
||||||
var PUT = "PUT";
|
var PUT = "PUT";
|
||||||
var DELETE = "DELETE";
|
var DELETE = "DELETE";
|
||||||
var URL_BASE = "https://api.ripple.com:443";
|
|
||||||
|
|
||||||
var DOC_BASE = "ripple-rest.html";
|
|
||||||
|
|
||||||
|
|
||||||
function slugify(str) {
|
function slugify(str) {
|
||||||
@@ -39,318 +36,44 @@ function slugify(str) {
|
|||||||
|
|
||||||
//Build requests
|
//Build requests
|
||||||
var requests = { };
|
var requests = { };
|
||||||
|
var requestlist = [];
|
||||||
function Request(name, obj) {
|
function Request(name, obj) {
|
||||||
|
if (obj === undefined) {
|
||||||
|
requestlist.push({slug: null,name: name});//separator
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
obj.name = name;
|
obj.name = name;
|
||||||
requests[slugify(name)] = obj;
|
obj.slug = slugify(name);
|
||||||
|
requests[obj.slug] = obj;
|
||||||
|
requestlist.push(obj);
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
};
|
};
|
||||||
|
|
||||||
$(commands).click(function() {
|
function generate_table_of_contents() {
|
||||||
var cmd = slugify($(this).text().trim());
|
$.each(requestlist, function(i, req) {
|
||||||
|
if (req.slug === null) {
|
||||||
if (!requests[cmd]) return;
|
commandlist.append("<li class='separator'>"+req.name+"</li>");
|
||||||
|
} else {
|
||||||
select_request(cmd, true);
|
commandlist.append("<li><a href='#"+req.slug+"'>"+req.name+"</a></li>");
|
||||||
window.location.hash = cmd;
|
|
||||||
|
|
||||||
$(this).siblings().removeClass('selected');
|
|
||||||
$(this).addClass('selected');
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
//---------- List of requests ------------------------//
|
|
||||||
|
|
||||||
var DEFAULT_ADDRESS_1 = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn";
|
|
||||||
var DEFAULT_ADDRESS_2 = "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX";
|
|
||||||
var DEFAULT_ADDRESS_3 = "rJnZ4YHCUsHvQu7R6mZohevKJDHFzVD6Zr";
|
|
||||||
var DEFAULT_HASH = "9D591B18EDDD34F0B6CF4223A2940AEA2C3CC778925BABF289E0011CD8FA056E";
|
|
||||||
var DEFAULT_SECRET = "sn3nxiW7v8KXzPzAqzyHXbSSKNuN9";
|
|
||||||
|
|
||||||
Request('Generate Wallet', {
|
|
||||||
method: GET,
|
|
||||||
path: "/v1/wallet/new",
|
|
||||||
description: 'Randomly generate keys for a potential new Ripple account.',
|
|
||||||
link: '#generate-wallet'
|
|
||||||
});
|
|
||||||
|
|
||||||
Request('Get Account Balances', {
|
|
||||||
method: GET,
|
|
||||||
path: '/v1/accounts/{:address}/balances?{:query_params}',
|
|
||||||
description: 'Retrieve the current balances for the given Ripple account.',
|
|
||||||
link: '#get-account-balances',
|
|
||||||
params: {
|
|
||||||
"{:address}": DEFAULT_ADDRESS_1,
|
|
||||||
"{:query_params}": "currency=USD"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Request('Get Account Settings', {
|
|
||||||
method: GET,
|
|
||||||
path: '/v1/accounts/{:address}/settings',
|
|
||||||
description: 'Retrieve the current settings for the given Ripple account.',
|
|
||||||
link: '#get-account-settings',
|
|
||||||
params: {
|
|
||||||
"{:address}": DEFAULT_ADDRESS_1
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Request('Update Account Settings', {
|
|
||||||
method: POST,
|
|
||||||
path: '/v1/accounts/{:address}/settings?{:query_params}',
|
|
||||||
description: 'Change the current settings for the given Ripple account.',
|
|
||||||
link: '#update-account-settings',
|
|
||||||
test_only: true,
|
|
||||||
params: {
|
|
||||||
"{:address}": DEFAULT_ADDRESS_1,
|
|
||||||
"{:query_params}": "validated=true"
|
|
||||||
},
|
|
||||||
body: {
|
|
||||||
secret: DEFAULT_SECRET,
|
|
||||||
settings: {
|
|
||||||
require_destination_tag: false,
|
|
||||||
require_authorization: false,
|
|
||||||
disallow_xrp: false,
|
|
||||||
disable_master: false,
|
|
||||||
email_hash: "98b4375e1d753e5b91627516f6d70977"
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
});
|
}
|
||||||
|
|
||||||
Request('Prepare Payment', {
|
function make_commands_clickable() {
|
||||||
method: GET,
|
commandlist.children("li").click(function() {
|
||||||
path: '/v1/accounts/{:source_address}/payments/paths/{:destination_address}/{:amount}?{:query_params}',
|
var cmd = slugify($(this).text().trim());
|
||||||
description: 'Retrieve possible payment objects for a desired payment.',
|
|
||||||
link: '#prepare-payment',
|
|
||||||
params: {
|
|
||||||
"{:source_address}": DEFAULT_ADDRESS_1,
|
|
||||||
"{:destination_address}": DEFAULT_ADDRESS_2,
|
|
||||||
"{:amount}": "1+USD+rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
|
|
||||||
"{:query_params}": "source_currencies=USD"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Request('Submit Payment', {
|
if (!requests[cmd]) return;
|
||||||
method: POST,
|
|
||||||
path: '/v1/accounts/{:source_address}/payments?{:query_params}',
|
|
||||||
description: 'Send a prepared payment to the network.',
|
|
||||||
link: '#submit-payment',
|
|
||||||
test_only: true,
|
|
||||||
body: {
|
|
||||||
"secret": DEFAULT_SECRET,
|
|
||||||
"client_resource_id": "348170b9-16b9-4927-854d-7f9d4a2a692d",
|
|
||||||
"payment": {
|
|
||||||
"source_account": DEFAULT_ADDRESS_1,
|
|
||||||
"source_tag": "",
|
|
||||||
"source_amount": {
|
|
||||||
"value": "1",
|
|
||||||
"currency": "USD",
|
|
||||||
"issuer": ""
|
|
||||||
},
|
|
||||||
"source_slippage": "0",
|
|
||||||
"destination_account": DEFAULT_ADDRESS_2,
|
|
||||||
"destination_tag": "",
|
|
||||||
"destination_amount": {
|
|
||||||
"value": "1",
|
|
||||||
"currency": "USD",
|
|
||||||
"issuer": DEFAULT_ADDRESS_1
|
|
||||||
},
|
|
||||||
"invoice_id": "",
|
|
||||||
"paths": "[]",
|
|
||||||
"partial_payment": false,
|
|
||||||
"no_direct_ripple": false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
params: {
|
|
||||||
"{:source_address}": DEFAULT_ADDRESS_1,
|
|
||||||
"{:query_params}": "validated=true"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Request("Confirm Payment", {
|
select_request(cmd, true);
|
||||||
method: GET,
|
window.location.hash = cmd;
|
||||||
path: "/v1/accounts/{:address}/payments/{:id}",
|
|
||||||
description: "Retrieve details of a payment and its status.",
|
|
||||||
link: "#confirm-payment",
|
|
||||||
params: {
|
|
||||||
"{:address}": DEFAULT_ADDRESS_1,
|
|
||||||
"{:id}": DEFAULT_HASH
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Request("Get Payment History", {
|
$(this).siblings().removeClass('selected');
|
||||||
method: GET,
|
$(this).addClass('selected');
|
||||||
path: "/v1/accounts/{:address}/payments?{:query_params}",
|
});
|
||||||
description: "Browse through the history of payments sent and received by an account.",
|
}
|
||||||
link: "#get-payment-history",
|
|
||||||
params: {
|
|
||||||
"{:address}": DEFAULT_ADDRESS_1,
|
|
||||||
"{:query_params}": "direction=incoming&exclude_failed=true"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Request("Place Order", {
|
|
||||||
method: POST,
|
|
||||||
path: "/v1/accounts/{:address}/orders?{:query_params}",
|
|
||||||
description: "Place an order on the ripple network.",
|
|
||||||
link: "#place-order",
|
|
||||||
test_only: true,
|
|
||||||
params: {
|
|
||||||
"{:address}": DEFAULT_ADDRESS_1,
|
|
||||||
"{:query_params}": "validated=true"
|
|
||||||
},
|
|
||||||
body: {
|
|
||||||
"secret": DEFAULT_SECRET,
|
|
||||||
"order": {
|
|
||||||
"type": "sell",
|
|
||||||
"taker_pays": {
|
|
||||||
"currency": "JPY",
|
|
||||||
"value": "4000",
|
|
||||||
"counterparty": "rMAz5ZnK73nyNUL4foAvaxdreczCkG3vA6"
|
|
||||||
},
|
|
||||||
"taker_gets": {
|
|
||||||
"currency": "USD",
|
|
||||||
"value": ".25",
|
|
||||||
"counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"
|
|
||||||
},
|
|
||||||
"immediate_or_cancel": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Request("Cancel Order", {
|
|
||||||
method: DELETE,
|
|
||||||
path: "/v1/accounts/{:address}/orders/{:order}/?{:query_params}",
|
|
||||||
description: "Cancel an order on the ripple network.",
|
|
||||||
link: "#cancel-order",
|
|
||||||
test_only: true,
|
|
||||||
params: {
|
|
||||||
"{:address}": DEFAULT_ADDRESS_1,
|
|
||||||
"{:query_params}": "validated=true",
|
|
||||||
"{:order}": "23"
|
|
||||||
},
|
|
||||||
body: {
|
|
||||||
"secret": DEFAULT_SECRET
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Request("Get Account Orders", {
|
|
||||||
method: GET,
|
|
||||||
path: "/v1/accounts/{:address}/orders?{:query_params}",
|
|
||||||
description: "Get open currency-exchange orders associated with the Ripple address.",
|
|
||||||
link: "#get-account-orders",
|
|
||||||
params: {
|
|
||||||
"{:address}": DEFAULT_ADDRESS_3,
|
|
||||||
"{:query_params}": "ledger=10399192&limit=15"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Request("Get Order Transaction", {
|
|
||||||
method: GET,
|
|
||||||
path: "/v1/accounts/{:address}/orders/{:hash}",
|
|
||||||
description: "Get the details of an order transaction.",
|
|
||||||
link: "#get-order-transaction",
|
|
||||||
params: {
|
|
||||||
"{:address}": "rEQWVz1qN4DWw5J17s3DgXQzUuVYDSpK6M",
|
|
||||||
"{:hash}": "D53A3B99AC0C3CAF35D72178390ACA94CD42479A98CEA438EEAFF338E5FEB76D"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Request("Get Order Book", {
|
|
||||||
method: GET,
|
|
||||||
path: "/v1/accounts/{:address}/order_book/{:base}/{:counter}?{:query_params}",
|
|
||||||
description: "Get the order book for a currency pair",
|
|
||||||
link: "#get-order-book",
|
|
||||||
params: {
|
|
||||||
"{:address}": DEFAULT_ADDRESS_3,
|
|
||||||
"{:base}": "BTC+rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
|
|
||||||
"{:counter}": "USD+rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
|
|
||||||
"{:query_params}": "limit=10"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Request("Get Trustlines", {
|
|
||||||
method: GET,
|
|
||||||
path: "/v1/accounts/{:address}/trustlines?{:query_params}",
|
|
||||||
description: "Check the status of one or more trustlines attached to an account.",
|
|
||||||
link: "#get-trustlines",
|
|
||||||
params: {
|
|
||||||
"{:address}": DEFAULT_ADDRESS_1,
|
|
||||||
"{:query_params}": "currency=USD&counterparty=ra5nK24KXen9AHvsdFTKHSANinZseWnPcX"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Request("Grant Trustline", {
|
|
||||||
method: POST,
|
|
||||||
path: "/v1/accounts/{:address}/trustlines?{:query_params}",
|
|
||||||
description: "Add or modify a trustline from this account.",
|
|
||||||
link: "#grant-trustline",
|
|
||||||
test_only: true,
|
|
||||||
params: {
|
|
||||||
"{:address}": DEFAULT_ADDRESS_1,
|
|
||||||
"{:query_params}": "validated=true"
|
|
||||||
},
|
|
||||||
body: {
|
|
||||||
"secret": DEFAULT_SECRET,
|
|
||||||
"trustline": {
|
|
||||||
"limit": "110",
|
|
||||||
"currency": "USD",
|
|
||||||
"counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q",
|
|
||||||
"allows_rippling": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Request("Check Notifications", {
|
|
||||||
method: GET,
|
|
||||||
path: "/v1/accounts/{:address}/notifications/{:id}",
|
|
||||||
description: "Monitor an account for all kinds of transactions.",
|
|
||||||
link: "#check-notifications",
|
|
||||||
params: {
|
|
||||||
"{:address}": DEFAULT_ADDRESS_1,
|
|
||||||
"{:id}": DEFAULT_HASH
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Request("Check Connection", {
|
|
||||||
method: GET,
|
|
||||||
path: "/v1/server/connected",
|
|
||||||
description: "Check whether the REST server is connected to a rippled server.",
|
|
||||||
link: "#check-connection"
|
|
||||||
});
|
|
||||||
|
|
||||||
Request("Get Server Status", {
|
|
||||||
method: GET,
|
|
||||||
path: "/v1/server",
|
|
||||||
description: "Retrieve information about the current status of the Ripple-REST server and the rippled server it is connected to.",
|
|
||||||
link: "#get-server-status"
|
|
||||||
});
|
|
||||||
|
|
||||||
Request("Retrieve Ripple Transaction", {
|
|
||||||
method: GET,
|
|
||||||
path: "/v1/transactions/{:id}",
|
|
||||||
description: "Retrieve a raw Ripple transaction",
|
|
||||||
link: "#retrieve-ripple-transaction",
|
|
||||||
params: {
|
|
||||||
"{:id}": DEFAULT_HASH
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Request("Retrieve Transaction Fee", {
|
|
||||||
method: GET,
|
|
||||||
path: "/v1/transaction-fee",
|
|
||||||
description: "Retrieve the current transaction fee for the connected rippled server(s).",
|
|
||||||
link: "#retrieve-transaction-fee",
|
|
||||||
});
|
|
||||||
|
|
||||||
Request("Generate UUID", {
|
|
||||||
method: GET,
|
|
||||||
path: "/v1/uuid",
|
|
||||||
description: "Create a universally-unique identifier (UUID) to use as the client resource ID for a payment.",
|
|
||||||
link: "#create-client-resource-id"
|
|
||||||
});
|
|
||||||
|
|
||||||
//---------- End req. List ---------------------------//
|
|
||||||
|
|
||||||
var cm_request = CodeMirror(request_body.get(0), {
|
var cm_request = CodeMirror(request_body.get(0), {
|
||||||
mode: 'javascript',
|
mode: 'javascript',
|
||||||
@@ -410,6 +133,19 @@ function change_path(command) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function select_request(request) {
|
function select_request(request) {
|
||||||
|
if (request === undefined) {
|
||||||
|
var el = commandlist.children("li:not(.separator)").eq(0);
|
||||||
|
request = slugify(el.text());
|
||||||
|
|
||||||
|
/* var keys = Object.keys(requests);
|
||||||
|
var index = keys.indexOf(cmd);
|
||||||
|
if (index === -1) return;*/
|
||||||
|
} else {
|
||||||
|
var el = commandlist.find("li a[href='#"+request+"']").parent();
|
||||||
|
}
|
||||||
|
$(el).siblings().removeClass('selected');
|
||||||
|
$(el).addClass('selected');
|
||||||
|
|
||||||
command = requests[request];
|
command = requests[request];
|
||||||
|
|
||||||
if (command.test_only === true) {
|
if (command.test_only === true) {
|
||||||
@@ -422,12 +158,14 @@ function select_request(request) {
|
|||||||
$(description).html(command.description);
|
$(description).html(command.description);
|
||||||
|
|
||||||
if (command.link) {
|
if (command.link) {
|
||||||
$(description).append(" <a class='link_underline' href='"+DOC_BASE+command.link+"'>Read more</a>");
|
$(description).append(" <a class='link_underline' href='" +
|
||||||
|
DOC_BASE+command.link+"'>Read more</a>");
|
||||||
}
|
}
|
||||||
|
|
||||||
$(description).show();
|
$(description).show();
|
||||||
} else if (command.link) {
|
} else if (command.link) {
|
||||||
$(description).html("<a class='link_underline' href='"+DOC_BASE+command.link+"'>Read more</a>");
|
$(description).html("<a class='link_underline' href='" + DOC_BASE+
|
||||||
|
command.link+"'>Read more</a>");
|
||||||
} else {
|
} else {
|
||||||
$(description).hide();
|
$(description).hide();
|
||||||
}
|
}
|
||||||
@@ -436,13 +174,8 @@ function select_request(request) {
|
|||||||
.attr('href', DOC_BASE+command.link)
|
.attr('href', DOC_BASE+command.link)
|
||||||
.text(command.name));
|
.text(command.name));
|
||||||
|
|
||||||
//rest_url.val(command.path);
|
|
||||||
//rest_url.text(command.path);
|
|
||||||
change_path(command);
|
change_path(command);
|
||||||
|
|
||||||
|
|
||||||
// rest_method.val(command.method);
|
|
||||||
// rest_method.change();
|
|
||||||
request_button.val(command.method);
|
request_button.val(command.method);
|
||||||
request_button.text(command.method+" request");
|
request_button.text(command.method+" request");
|
||||||
update_method(request_button);
|
update_method(request_button);
|
||||||
@@ -451,7 +184,6 @@ function select_request(request) {
|
|||||||
cm_request.setValue(JSON.stringify(command.body, null, 2));
|
cm_request.setValue(JSON.stringify(command.body, null, 2));
|
||||||
} else {
|
} else {
|
||||||
//No body, so wipe out the current contents.
|
//No body, so wipe out the current contents.
|
||||||
//This prevents confusion if the user toggles the HTTP method dropdown
|
|
||||||
cm_request.setValue("");
|
cm_request.setValue("");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -531,6 +263,10 @@ function reset_response_area() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
|
//wait for the Requests to be populated by another file
|
||||||
|
generate_table_of_contents();
|
||||||
|
make_commands_clickable();
|
||||||
|
|
||||||
request_button.click(send_request);
|
request_button.click(send_request);
|
||||||
//rest_method.change(update_method);
|
//rest_method.change(update_method);
|
||||||
|
|
||||||
@@ -547,18 +283,8 @@ $(document).ready(function() {
|
|||||||
|
|
||||||
if (window.location.hash) {
|
if (window.location.hash) {
|
||||||
var cmd = window.location.hash.slice(1).toLowerCase();
|
var cmd = window.location.hash.slice(1).toLowerCase();
|
||||||
var keys = Object.keys(requests);
|
|
||||||
var index = keys.indexOf(cmd);
|
|
||||||
|
|
||||||
if (index === -1) return;
|
|
||||||
|
|
||||||
var el = commands.eq(index);
|
|
||||||
|
|
||||||
select_request(cmd);
|
select_request(cmd);
|
||||||
|
|
||||||
$(el).siblings().removeClass('selected');
|
|
||||||
$(el).addClass('selected');
|
|
||||||
} else {
|
} else {
|
||||||
select_request('generate-wallet');
|
select_request();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -89,8 +89,9 @@
|
|||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="ripple-api-tool.html">WebSocket Tool</a></li>
|
<li><a href="rest-api-tool.html">Ripple-REST API Tool</a></li>
|
||||||
<li><a href="rest-api-tool.html">REST Tool</a></li>
|
<li><a href="historicaldb-api-tool.html">Historical Database API Tool</a></li>
|
||||||
|
<li><a href="ripple-api-tool.html">WebSocket API Tool</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
|||||||
@@ -62,8 +62,9 @@
|
|||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="ripple-api-tool.html">WebSocket Tool</a></li>
|
<li><a href="rest-api-tool.html">Ripple-REST API Tool</a></li>
|
||||||
<li><a href="rest-api-tool.html">REST Tool</a></li>
|
<li><a href="historicaldb-api-tool.html">Historical Database API Tool</a></li>
|
||||||
|
<li><a href="ripple-api-tool.html">WebSocket API Tool</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
@@ -87,32 +88,6 @@
|
|||||||
<div style="clear:both;"></div>
|
<div style="clear:both;"></div>
|
||||||
<div id='command_wrapper'>
|
<div id='command_wrapper'>
|
||||||
<ul id='command_list'>
|
<ul id='command_list'>
|
||||||
<li class='selected'>Generate Wallet</li>
|
|
||||||
<li>Get Account Balances</li>
|
|
||||||
<li>Get Account Settings</li>
|
|
||||||
<li>Update Account Settings</li>
|
|
||||||
<br/>
|
|
||||||
<li>Prepare Payment</li>
|
|
||||||
<li>Submit Payment</li>
|
|
||||||
<li>Confirm Payment</li>
|
|
||||||
<li>Get Payment History</li>
|
|
||||||
<br/>
|
|
||||||
<li>Place Order</li>
|
|
||||||
<li>Cancel Order</li>
|
|
||||||
<li>Get Account Orders</li>
|
|
||||||
<li>Get Order Book</li>
|
|
||||||
<br/>
|
|
||||||
<li>Get Trustlines</li>
|
|
||||||
<li>Grant Trustline</li>
|
|
||||||
<br/>
|
|
||||||
<li>Check Notifications</li>
|
|
||||||
<br/>
|
|
||||||
<li>Check Connection</li>
|
|
||||||
<li>Get Server Status</li>
|
|
||||||
<br/>
|
|
||||||
<li>Retrieve Ripple Transaction</li>
|
|
||||||
<li>Retrieve Transaction Fee</li>
|
|
||||||
<li>Generate UUID</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
<div id='command_table'>
|
<div id='command_table'>
|
||||||
<div id='io_wrapper'>
|
<div id='io_wrapper'>
|
||||||
@@ -209,6 +184,7 @@
|
|||||||
<script type='text/javascript' src='js/cm-javascript.min.js'></script>
|
<script type='text/javascript' src='js/cm-javascript.min.js'></script>
|
||||||
<script type='text/javascript' src='js/jquery.autosize.input.min.js'></script>
|
<script type='text/javascript' src='js/jquery.autosize.input.min.js'></script>
|
||||||
<script type='text/javascript' src='js/apitool-rest.js'></script>
|
<script type='text/javascript' src='js/apitool-rest.js'></script>
|
||||||
|
<script type='text/javascript' src='js/apitool-methods-ripplerest.js'></script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -62,8 +62,9 @@
|
|||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="ripple-api-tool.html">WebSocket Tool</a></li>
|
<li><a href="rest-api-tool.html">Ripple-REST API Tool</a></li>
|
||||||
<li><a href="rest-api-tool.html">REST Tool</a></li>
|
<li><a href="historicaldb-api-tool.html">Historical Database API Tool</a></li>
|
||||||
|
<li><a href="ripple-api-tool.html">WebSocket API Tool</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
@@ -87,33 +88,33 @@
|
|||||||
<div style="clear:both;"></div>
|
<div style="clear:both;"></div>
|
||||||
<div id='command_wrapper'>
|
<div id='command_wrapper'>
|
||||||
<ul id='command_list'>
|
<ul id='command_list'>
|
||||||
<li class='selected'>server_info</li>
|
<li class='selected'><a href='#server_info'>server_info</a></li>
|
||||||
<li>server_state</li>
|
<li><a href='#server_state'>server_state</a></li>
|
||||||
<li>ping</li>
|
<li><a href='#ping'>ping</a></li>
|
||||||
<br/>
|
<br/>
|
||||||
<li>subscribe</li>
|
<li><a href='#subscribe'>subscribe</a></li>
|
||||||
<li>unsubscribe</li>
|
<li><a href='#unsubscribe'>unsubscribe</a></li>
|
||||||
<br/>
|
<br/>
|
||||||
<li>ledger</li>
|
<li><a href='#ledger'>ledger</a></li>
|
||||||
<li>ledger_closed</li>
|
<li><a href='#ledger_closed'>ledger_closed</a></li>
|
||||||
<li>ledger_current</li>
|
<li><a href='#ledger_current'>ledger_current</a></li>
|
||||||
<li>ledger_entry</li>
|
<li><a href='#ledger_entry'>ledger_entry</a></li>
|
||||||
<br/>
|
<br/>
|
||||||
<li>account_info</li>
|
<li><a href='#account_info'>account_info</a></li>
|
||||||
<li>account_lines</li>
|
<li><a href='#account_lines'>account_lines</a></li>
|
||||||
<li>account_offers</li>
|
<li><a href='#account_offers'>account_offers</a></li>
|
||||||
<li>account_tx</li>
|
<li><a href='#account_tx'>account_tx</a></li>
|
||||||
<br/>
|
<br/>
|
||||||
<li>transaction_entry</li>
|
<li><a href='#transaction_entry'>transaction_entry</a></li>
|
||||||
<li>tx</li>
|
<li><a href='#tx'>tx</a></li>
|
||||||
<li>tx_history</li>
|
<li><a href='#tx_history'>tx_history</a></li>
|
||||||
<br/>
|
<br/>
|
||||||
<li>sign</li>
|
<li><a href='#sign'>sign</a></li>
|
||||||
<li>submit</li>
|
<li><a href='#submit'>submit</a></li>
|
||||||
<br/>
|
<br/>
|
||||||
<li>ripple_path_find</li>
|
<li><a href='#ripple_path_find'>ripple_path_find</a></li>
|
||||||
<li>path_find</li>
|
<li><a href='#path_find'>path_find</a></li>
|
||||||
<li>book_offers</li>
|
<li><a href='#book_offers'>book_offers</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<div id='command_table'>
|
<div id='command_table'>
|
||||||
<div id='io_wrapper'>
|
<div id='io_wrapper'>
|
||||||
|
|||||||
@@ -89,8 +89,9 @@
|
|||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="ripple-api-tool.html">WebSocket Tool</a></li>
|
<li><a href="rest-api-tool.html">Ripple-REST API Tool</a></li>
|
||||||
<li><a href="rest-api-tool.html">REST Tool</a></li>
|
<li><a href="historicaldb-api-tool.html">Historical Database API Tool</a></li>
|
||||||
|
<li><a href="ripple-api-tool.html">WebSocket API Tool</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
|||||||
@@ -89,8 +89,9 @@
|
|||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="ripple-api-tool.html">WebSocket Tool</a></li>
|
<li><a href="rest-api-tool.html">Ripple-REST API Tool</a></li>
|
||||||
<li><a href="rest-api-tool.html">REST Tool</a></li>
|
<li><a href="historicaldb-api-tool.html">Historical Database API Tool</a></li>
|
||||||
|
<li><a href="ripple-api-tool.html">WebSocket API Tool</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
|||||||
35
tool/check_links.py
Executable file
35
tool/check_links.py
Executable file
@@ -0,0 +1,35 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
import requests
|
||||||
|
import os
|
||||||
|
|
||||||
|
externalCache = []
|
||||||
|
atRoot = True
|
||||||
|
|
||||||
|
for dirpath, dirnames, filenames in os.walk("../"):
|
||||||
|
if atRoot:
|
||||||
|
dirnames.remove('tool')
|
||||||
|
atRoot = False
|
||||||
|
for fname in filenames:
|
||||||
|
fullPath = os.path.join(dirpath, fname);
|
||||||
|
if fullPath.endswith(".html"):
|
||||||
|
f = open(fullPath, 'r')
|
||||||
|
soup = BeautifulSoup(f.read())
|
||||||
|
links = soup.find_all('a')
|
||||||
|
for link in links:
|
||||||
|
endpoint = link['href']
|
||||||
|
if "://" in endpoint:
|
||||||
|
if endpoint not in externalCache:
|
||||||
|
print("Testing remote URL %s"%(endpoint))
|
||||||
|
code = requests.head(endpoint).status_code
|
||||||
|
if code < 200 or code >= 400:
|
||||||
|
print("Broken remote link in %s to %s"%(fullPath, endpoint))
|
||||||
|
else:
|
||||||
|
externalCache.append(endpoint)
|
||||||
|
elif endpoint[0] == '#':
|
||||||
|
continue
|
||||||
|
elif endpoint[0] == '/':
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
if not os.path.exists(os.path.join(dirpath, endpoint)):
|
||||||
|
print("Broken local link in %s to %s"%(fullPath, endpoint))
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Gateway Guide",
|
"name": "Gateway Guide",
|
||||||
"md":"exchange_to_gateway.md",
|
"md":"gateway_guide.md",
|
||||||
"html":"gateway_guide.html"
|
"html":"gateway_guide.html"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -57,11 +57,23 @@
|
|||||||
{
|
{
|
||||||
"name": "Ripple-REST API Tool",
|
"name": "Ripple-REST API Tool",
|
||||||
"template":"template-rest-api-tool.html",
|
"template":"template-rest-api-tool.html",
|
||||||
|
"methods_js": "js/apitool-methods-ripplerest.js",
|
||||||
|
"is_apitool": true,
|
||||||
|
"rest_host": "https://api.ripple.com",
|
||||||
"html": "rest-api-tool.html"
|
"html": "rest-api-tool.html"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Historical Database API Tool",
|
||||||
|
"template":"template-rest-api-tool.html",
|
||||||
|
"methods_js": "js/apitool-methods-historical.js",
|
||||||
|
"is_apitool": true,
|
||||||
|
"rest_host": "https://history.ripple.com",
|
||||||
|
"html": "historicaldb-api-tool.html"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "WebSocket API Tool",
|
"name": "WebSocket API Tool",
|
||||||
"template":"template-ripple-api-tool.html",
|
"template":"template-ripple-api-tool.html",
|
||||||
|
"is_apitool": true,
|
||||||
"html": "ripple-api-tool.html"
|
"html": "ripple-api-tool.html"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
52
tool/ripple-rest-markdown-skeleton.md
Normal file
52
tool/ripple-rest-markdown-skeleton.md
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
## title ##
|
||||||
|
[[Source]<br>]( "Source")
|
||||||
|
|
||||||
|
blurb
|
||||||
|
|
||||||
|
#### Request Format ####
|
||||||
|
|
||||||
|
<div class='multicode'>
|
||||||
|
|
||||||
|
*REST*
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
[Try it! >](rest-api-tool.html#prepare-payment)
|
||||||
|
|
||||||
|
|
||||||
|
This method requires the following URL parameters:
|
||||||
|
|
||||||
|
| Field | Value | Description |
|
||||||
|
|-------|-------|-------------|
|
||||||
|
|
||||||
|
|
||||||
|
Optionally, you can also include the following query parameters:
|
||||||
|
|
||||||
|
| Field | Value | Description |
|
||||||
|
|-------|-------|-------------|
|
||||||
|
|
||||||
|
|
||||||
|
The request includes the following body parameters:
|
||||||
|
|
||||||
|
| Field | Value | Description |
|
||||||
|
|-------|-------|-------------|
|
||||||
|
|
||||||
|
|
||||||
|
Further description
|
||||||
|
|
||||||
|
#### Response Format ####
|
||||||
|
|
||||||
|
An example of a successful response:
|
||||||
|
|
||||||
|
```js
|
||||||
|
//actual example here
|
||||||
|
```
|
||||||
|
|
||||||
|
A successful result contains the following fields:
|
||||||
|
|
||||||
|
| Field | Type | Description |
|
||||||
|
|-------|------|-------------|
|
||||||
71
tool/rippled-markdown-skeleton.md
Normal file
71
tool/rippled-markdown-skeleton.md
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
## command ##
|
||||||
|
[[Source]<br>](githuburl "Source")
|
||||||
|
|
||||||
|
blurb
|
||||||
|
|
||||||
|
#### Request Format ####
|
||||||
|
An example of the request format:
|
||||||
|
|
||||||
|
<div class='multicode'>
|
||||||
|
|
||||||
|
*WebSocket*
|
||||||
|
|
||||||
|
```
|
||||||
|
//actual example here
|
||||||
|
```
|
||||||
|
|
||||||
|
*Second tab*
|
||||||
|
|
||||||
|
```
|
||||||
|
//second example here
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
The request includes the following parameters:
|
||||||
|
|
||||||
|
| Field | Type | Description |
|
||||||
|
|-------|------|-------------|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### Response Format ####
|
||||||
|
|
||||||
|
An example of a successful response:
|
||||||
|
|
||||||
|
<div class='multicode'>
|
||||||
|
|
||||||
|
*WebSocket*
|
||||||
|
|
||||||
|
```
|
||||||
|
//actual example here
|
||||||
|
```
|
||||||
|
|
||||||
|
*Second tab*
|
||||||
|
|
||||||
|
```
|
||||||
|
//second example here
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
The response follows the [standard format](#response-formatting), with a successful result containing the following fields:
|
||||||
|
|
||||||
|
| Field | Type | Description |
|
||||||
|
|-------|------|-------------|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### Possible Errors ####
|
||||||
|
|
||||||
|
* Any of the [universal error types](#universal-errors).
|
||||||
|
* `invalidParams` - One or more fields are specified incorrectly, or one or more required fields are missing.
|
||||||
|
* `actNotFound` - The address specified in the `account` field of the request does not correspond to an account in the ledger.
|
||||||
|
* `lgrNotFound` - The ledger specified by the `ledger_hash` or `ledger_index` does not exist, or it does exist but the server does not have it.
|
||||||
@@ -59,8 +59,11 @@
|
|||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="ripple-api-tool.html">WebSocket Tool</a></li>
|
{% for page in pages %}
|
||||||
<li><a href="rest-api-tool.html">REST Tool</a></li>
|
{% if page.is_apitool %}
|
||||||
|
<li><a href="{{ page.html }}">{{ page.name }}</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
<ul class="resources">
|
<ul class="resources">
|
||||||
<li>Resources:</li>
|
<li>Resources:</li>
|
||||||
<li><a href="https://www.ripplecharts.com"><i class="fa fa-home"></i> Website </a></li>
|
<li><a href="https://www.ripplecharts.com"><i class="fa fa-home"></i> Website </a></li>
|
||||||
<li><a href="http://docs.rippledataapi.apiary.io/"><i class="fa fa-file-text-o"></i> Overview </a></li>
|
<li><a href="charts_api.html"><i class="fa fa-cubes"></i> API Reference </a></li>
|
||||||
<li><a href="https://github.com/ripple/ripplecharts-frontend"><i class="fa fa-code"></i> Source (Frontend) </a></li>
|
<li><a href="https://github.com/ripple/ripplecharts-frontend"><i class="fa fa-code"></i> Source (Frontend) </a></li>
|
||||||
<li><a href="https://github.com/ripple/ripple-data-api"><i class="fa fa-code"></i> Source (Data API) </a></li>
|
<li><a href="https://github.com/ripple/ripple-data-api"><i class="fa fa-code"></i> Source (Data API) </a></li>
|
||||||
<li><a href="https://www.bountysource.com/trackers/3954022-ripple-charts"><i class="fa fa-dot-circle-o"></i> Bounties </a></li>
|
<li><a href="https://www.bountysource.com/trackers/3954022-ripple-charts"><i class="fa fa-dot-circle-o"></i> Bounties </a></li>
|
||||||
@@ -126,7 +126,6 @@
|
|||||||
<li><a href="rippled-apis.html"><i class="fa fa-cubes"></i> API Reference </a></li>
|
<li><a href="rippled-apis.html"><i class="fa fa-cubes"></i> API Reference </a></li>
|
||||||
<li><a href="https://github.com/ripple/rippled"><i class="fa fa-code"></i> Source </a></li>
|
<li><a href="https://github.com/ripple/rippled"><i class="fa fa-code"></i> Source </a></li>
|
||||||
<li><a href="https://www.bountysource.com/trackers/304896-rippled"><i class="fa fa-dot-circle-o"></i> Bounties </a></li>
|
<li><a href="https://www.bountysource.com/trackers/304896-rippled"><i class="fa fa-dot-circle-o"></i> Bounties </a></li>
|
||||||
<li><a href="consensus-whitepaper.html"><i class="fa fa-file"></i> Consensus Whitepaper </a></li>
|
|
||||||
<li><a href="transactions.html"><i class="fa fa-cubes"></i> Transaction Format </a></li>
|
<li><a href="transactions.html"><i class="fa fa-cubes"></i> Transaction Format </a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -5,32 +5,6 @@
|
|||||||
<div style="clear:both;"></div>
|
<div style="clear:both;"></div>
|
||||||
<div id='command_wrapper'>
|
<div id='command_wrapper'>
|
||||||
<ul id='command_list'>
|
<ul id='command_list'>
|
||||||
<li class='selected'>Generate Wallet</li>
|
|
||||||
<li>Get Account Balances</li>
|
|
||||||
<li>Get Account Settings</li>
|
|
||||||
<li>Update Account Settings</li>
|
|
||||||
<br/>
|
|
||||||
<li>Prepare Payment</li>
|
|
||||||
<li>Submit Payment</li>
|
|
||||||
<li>Confirm Payment</li>
|
|
||||||
<li>Get Payment History</li>
|
|
||||||
<br/>
|
|
||||||
<li>Place Order</li>
|
|
||||||
<li>Cancel Order</li>
|
|
||||||
<li>Get Account Orders</li>
|
|
||||||
<li>Get Order Book</li>
|
|
||||||
<br/>
|
|
||||||
<li>Get Trustlines</li>
|
|
||||||
<li>Grant Trustline</li>
|
|
||||||
<br/>
|
|
||||||
<li>Check Notifications</li>
|
|
||||||
<br/>
|
|
||||||
<li>Check Connection</li>
|
|
||||||
<li>Get Server Status</li>
|
|
||||||
<br/>
|
|
||||||
<li>Retrieve Ripple Transaction</li>
|
|
||||||
<li>Retrieve Transaction Fee</li>
|
|
||||||
<li>Generate UUID</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
<div id='command_table'>
|
<div id='command_table'>
|
||||||
<div id='io_wrapper'>
|
<div id='io_wrapper'>
|
||||||
@@ -45,7 +19,7 @@
|
|||||||
<p id='description'></p>
|
<p id='description'></p>
|
||||||
<div id='invalid'>Invalid JSON</div>
|
<div id='invalid'>Invalid JSON</div>
|
||||||
<div id='rest_url_wrapper'>
|
<div id='rest_url_wrapper'>
|
||||||
<p><span id='rest_host'>https://api.ripple.com</span><span id='rest_url'></span></p>
|
<p><span id='rest_host'>{{ currentpage.rest_host }}</span><span id='rest_url'></span></p>
|
||||||
</div>
|
</div>
|
||||||
<div id='request_body'></div>
|
<div id='request_body'></div>
|
||||||
<div id='request_options'>
|
<div id='request_options'>
|
||||||
@@ -76,6 +50,7 @@
|
|||||||
<script type='text/javascript' src='js/cm-javascript.min.js'></script>
|
<script type='text/javascript' src='js/cm-javascript.min.js'></script>
|
||||||
<script type='text/javascript' src='js/jquery.autosize.input.min.js'></script>
|
<script type='text/javascript' src='js/jquery.autosize.input.min.js'></script>
|
||||||
<script type='text/javascript' src='js/apitool-rest.js'></script>
|
<script type='text/javascript' src='js/apitool-rest.js'></script>
|
||||||
|
<script type='text/javascript' src='{{ currentpage.methods_js }}'></script>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|||||||
@@ -5,33 +5,33 @@
|
|||||||
<div style="clear:both;"></div>
|
<div style="clear:both;"></div>
|
||||||
<div id='command_wrapper'>
|
<div id='command_wrapper'>
|
||||||
<ul id='command_list'>
|
<ul id='command_list'>
|
||||||
<li class='selected'>server_info</li>
|
<li class='selected'><a href='#server_info'>server_info</a></li>
|
||||||
<li>server_state</li>
|
<li><a href='#server_state'>server_state</a></li>
|
||||||
<li>ping</li>
|
<li><a href='#ping'>ping</a></li>
|
||||||
<br/>
|
<br/>
|
||||||
<li>subscribe</li>
|
<li><a href='#subscribe'>subscribe</a></li>
|
||||||
<li>unsubscribe</li>
|
<li><a href='#unsubscribe'>unsubscribe</a></li>
|
||||||
<br/>
|
<br/>
|
||||||
<li>ledger</li>
|
<li><a href='#ledger'>ledger</a></li>
|
||||||
<li>ledger_closed</li>
|
<li><a href='#ledger_closed'>ledger_closed</a></li>
|
||||||
<li>ledger_current</li>
|
<li><a href='#ledger_current'>ledger_current</a></li>
|
||||||
<li>ledger_entry</li>
|
<li><a href='#ledger_entry'>ledger_entry</a></li>
|
||||||
<br/>
|
<br/>
|
||||||
<li>account_info</li>
|
<li><a href='#account_info'>account_info</a></li>
|
||||||
<li>account_lines</li>
|
<li><a href='#account_lines'>account_lines</a></li>
|
||||||
<li>account_offers</li>
|
<li><a href='#account_offers'>account_offers</a></li>
|
||||||
<li>account_tx</li>
|
<li><a href='#account_tx'>account_tx</a></li>
|
||||||
<br/>
|
<br/>
|
||||||
<li>transaction_entry</li>
|
<li><a href='#transaction_entry'>transaction_entry</a></li>
|
||||||
<li>tx</li>
|
<li><a href='#tx'>tx</a></li>
|
||||||
<li>tx_history</li>
|
<li><a href='#tx_history'>tx_history</a></li>
|
||||||
<br/>
|
<br/>
|
||||||
<li>sign</li>
|
<li><a href='#sign'>sign</a></li>
|
||||||
<li>submit</li>
|
<li><a href='#submit'>submit</a></li>
|
||||||
<br/>
|
<br/>
|
||||||
<li>ripple_path_find</li>
|
<li><a href='#ripple_path_find'>ripple_path_find</a></li>
|
||||||
<li>path_find</li>
|
<li><a href='#path_find'>path_find</a></li>
|
||||||
<li>book_offers</li>
|
<li><a href='#book_offers'>book_offers</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<div id='command_table'>
|
<div id='command_table'>
|
||||||
<div id='io_wrapper'>
|
<div id='io_wrapper'>
|
||||||
|
|||||||
@@ -89,8 +89,9 @@
|
|||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="ripple-api-tool.html">WebSocket Tool</a></li>
|
<li><a href="rest-api-tool.html">Ripple-REST API Tool</a></li>
|
||||||
<li><a href="rest-api-tool.html">REST Tool</a></li>
|
<li><a href="historicaldb-api-tool.html">Historical Database API Tool</a></li>
|
||||||
|
<li><a href="ripple-api-tool.html">WebSocket API Tool</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
|||||||
@@ -89,8 +89,9 @@
|
|||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="ripple-api-tool.html">WebSocket Tool</a></li>
|
<li><a href="rest-api-tool.html">Ripple-REST API Tool</a></li>
|
||||||
<li><a href="rest-api-tool.html">REST Tool</a></li>
|
<li><a href="historicaldb-api-tool.html">Historical Database API Tool</a></li>
|
||||||
|
<li><a href="ripple-api-tool.html">WebSocket API Tool</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
|||||||
Reference in New Issue
Block a user