[MERGE] local changes

This commit is contained in:
mDuo13
2015-06-25 16:16:45 -07:00
27 changed files with 1615 additions and 594 deletions

View File

@@ -57,6 +57,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</li>
@@ -142,6 +143,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</div>

View File

@@ -84,6 +84,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</li>
@@ -137,6 +138,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</div>

File diff suppressed because it is too large Load Diff

View File

@@ -162,6 +162,8 @@ There are several prerequisites that ACME must meet in order for this to happen:
- 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.
See [Sending Payments to Users](#sending-payments-to-users) for an example of how to send payments into Ripple.
## Sending from Ripple to Gateway ##
@@ -189,7 +191,9 @@ 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:
- 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 makes it harder for malicious 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.
- When sending into Ripple, specify the cold wallet as the issuer of the currency. Otherwise, you might accidentally use paths that deliver the same currency issued by other accounts.
- Before sending a payment into Ripple, double check the cost of the payment. A simple payment from your hot wallet to a customer should not cost more than the destination amount plus any [transfer fee](#transferrate) you have set.
- 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.
- [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.
@@ -543,8 +547,6 @@ Response:
A successful response shows `"state": "validated"` when the change has been accepted into a validated Ripple ledger.
<!-- Note: RLJS-154 only affects 1.3.2-rc1 and -rc2 -->
## Robustly Monitoring for Payments ##
In order to robustly monitor incoming payments, gateways should do the following:
@@ -564,15 +566,7 @@ As an added precaution, we recommend comparing the balances of your Ripple cold
## 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 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.
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%:
![Alice sends 2,02€, Charlie receives 2,00€, and ACME owes 0,02€ on Ripple](img/e2g-with_transferrate.png)
The *TransferRate* setting (`transfer_rate` in Ripple-REST) defines a fee to charge for transferring issuances from one Ripple account to another. See [Transfer Fees](https://ripple.com/knowledge_center/transfer-fees/) in the Knowledge Center for more information.
The following is an example of a [Ripple-REST Update Account Settings request](ripple-rest.html#update-account-settings) to set the TransferRate for a fee of 0.5%.
@@ -619,6 +613,44 @@ All Ripple Accounts, including the hot wallet, are subject to the TransferRate.
**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.
## Sending Payments to Users ##
When you build an automated system to send payments into Ripple for your users, you must ensure that it constructs payments carefully. Malicious users are constantly trying to find ways to trick a system into paying them more money than it should. If you use Ripple-REST to construct payments, we recommend **not using** the Prepare Payment endpoint for payments from a hot wallet to a user. Sending from a hot wallet to a properly-configured user account requires only a default path, but the Prepare Payment method looks for _all_ possible paths to the destination account, including ones that have a higher `source_amount` than necessary.
The following template can be used with Ripple-REST's [Submit Payment method](ripple-rest.html#submit-payment). You should also follow the [reliable transaction submission](#reliable-transaction-submission) guidelines and persist a copy of the transaction before submitting it.
```
POST /v1/accounts/<HOT WALLET ADDRESS>/payments
{
"secret": <HOT WALLET SECRET KEY>,
"client_resource_id": <UNIQUE CLIENT RESOURCE ID>,
"payment": {
"source_account": <HOT WALLET ADDRESS>,
"source_amount": {
"value": <DESTINATION AMOUNT, for example "100">,
"currency": <CURRENCY>,
"issuer": <COLD WALLET ADDRESS>
},
"source_slippage": <DESTINATION AMOUNT * TRANSFER FEE, for example "0.5">,
"source_tag": <OPTIONAL SOURCE TAG>,
"destination_account": <CUSTOMER ADDRESS>,
"destination_amount": {
"value": <DESTINATION AMOUNT>,
"currency": <CURRENCY>,
"issuer": <COLD WALLET ADDRESS>
}
}
}
```
*Reminder: Don't send your secret to a server you do not control.*
In particular, note the following features of the payment object:
- No `paths` field. The payment will only succeed if it can use a default path, which is preferable. Using less direct paths can become much more expensive.
- The `issuer` of both the `source_amount` and the `destination_amount` is the cold wallet. This ensures that the transaction sends and delivers issuances from the cold wallet account, and not from some other gateway.
- The `source_amount` uses the same `value` as the `destination_amount`. The [transfer fee](#transferrate), if there is one, is covered by the `slippage` field.
## Bouncing Payments ##
@@ -626,18 +658,18 @@ When your hot or cold wallet receives a payment whose purpose is unclear, we rec
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 exchange rates within the Ripple network. You should publicize your bounced payments policy as part of your terms of use.
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. Send the bounced payment from an automated hot wallet or a human-operated warm wallet.
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"`. As long as your hot and cold wallets only send the currencies that your cold wallet issues, you should also remove the `paths` field, which is not necessary for simple payments. You should always specify your cold wallet as the issuer of the funds you want to deliver. (You can specify the issuer in the Prepare Payment request, or modify the `issuer` field of the `destination_amount` in the object you get back.)
Third, it is conventional that you take the Source Tag from the incoming payment (`source_tag` in Ripple-REST) and use that value as the Destination Tag (`destination_tag` in Ripple-REST) for the return payment.
It is conventional that you take the Source Tag from the incoming payment (`source_tag` in Ripple-REST) and use that value as the Destination Tag (`destination_tag` in Ripple-REST) for the return payment.
To prevent two systems from bouncing payments back and forth indefinitely, you can set a new Source Tag for the outgoing return payment. If you receive an unexpected payment whose Destination Tag matches the Source Tag of a return you sent, then do not bounce it back again.
The following is an example of a [Ripple-REST Submit Payment request](http://localhost/ripple-dev-portal/ripple-rest.html#submit-payment) to send a return payment. Particularly important fields include the [*destination_tag*](#source-and-destination-tags), setting `"slippage": "0"`, and `"partial_payment": true`:
The following is an example of a [Ripple-REST Submit Payment request](ripple-rest.html#submit-payment) to send a return payment. Particularly important fields include the [*destination_tag*](#source-and-destination-tags), setting `"slippage": "0"`, `"partial_payment": true`, the lack of a `"paths"` field, and the `issuer` of the `destination_amount` being the cold wallet:
```
POST /v1/accounts/{address}/payments?validated=true
POST /v1/accounts/rBEXjfD3MuXKATePRwrk4AqgqzuD9JjQqv/payments?validated=true
{
"secret": "sn3nxiW7v8KXzPzAqzyHXbSSKNuN9",
@@ -650,7 +682,7 @@ POST /v1/accounts/{address}/payments?validated=true
"source_amount": {
"value": "2",
"currency": "EUR",
"issuer": ""
"issuer": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn"
},
"source_slippage": "0",
"destination_account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59",
@@ -658,10 +690,9 @@ POST /v1/accounts/{address}/payments?validated=true
"destination_amount": {
"value": "2",
"currency": "EUR",
"issuer": ""
"issuer": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn"
},
"invoice_id": "",
"paths": "[[{\"account\":\"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B\",\"type\":1,\"type_hex\":\"0000000000000001\"}]]",
"partial_payment": true,
"no_direct_ripple": false
}
@@ -704,7 +735,7 @@ For additional information, consult the [Reliable Transaction Submission](reliab
## ripple.txt and host-meta ##
The [ripple.txt](https://wiki.ripple.com/Ripple.txt) and [host-meta](https://ripple.com/build/gateway-services/#host-meta) standards provide a way to publish information about your gateway so that automated tools and applications can read and understand it.
The [ripple.txt](https://wiki.ripple.com/Ripple.txt) and host-meta standards provide a way to publish information about your gateway so that automated tools and applications can read and understand it.
For example, if you run a validating `rippled` server, you can use ripple.txt to publish the public key of your validating server. You can also publish information about what currencies your gateway issues, and which Ripple account addresses you control, to protect against impostors or confusion.

View File

@@ -69,6 +69,21 @@ Amazon EC2's m3.medium or m3.large VM sizes may be appropriate depending on your
Naturally, a fast network connection is preferable.
## Clustering ##
If you are running multiple `rippled` servers in a single datacenter, you can configure your nodes to operate in a cluster to maximize efficiency. Operating your `rippled` servers in a cluster provides the following benefits:
* Clustered nodes share the work of cryptography. If one node has verified the authenticity of a message, the other nodes in the cluster trust it and do not re-verify.
* Clustered nodes share information about peers and API clients that are misbehaving or abusing the network. This makes it harder to attack all nodes of the cluster at once.
* Clustered nodes always propagate transactions throughout the cluster, even if the transaction does not meet the current load-based transaction fee on some of them.
To enable clustering, modify the following sections of your [config file](https://github.com/ripple/rippled/blob/d7def5509d8338b1e46c0adf309b5912e5168af0/doc/rippled-example.cfg#L297-L346) for each server:
* List the IP addresses of each other node under the `[ips_fixed]` section.
* Generate a unique seed (using the [`validation_create` command](rippled-apis.html#validation-seed)) for each of your nodes, and configure it under the `[node_seed]` section. The `rippled` node uses this key to sign its messages to other nodes in the peer-to-peer network. **Note:** This is a different key than the one `rippled` uses to sign ledger proposals for consensus, but it is in the same format.
* Add the public keys (for peer communication) of each of your other nodes under the `[cluster_nodes]` section.
# Installing rippled #

View File

@@ -26,7 +26,9 @@ https://groups.google.com/forum/#!forum/ripple-server
Before you can run any commands against a `rippled` server, you must know which server you are connecting to. Most servers are configured not to accept requests directly from the outside network.
Alternatively, you can [run your own local copy of `rippled`](rippled-setup.html). This is required if you want to access any of the [Admin Commands](#List-of-Admin-Commands). In this case, you should use whatever IP and port you configured the server to bind. (For example, `127.0.0.1:54321`)
Alternatively, you can [run your own local copy of `rippled`](rippled-setup.html). This is required if you want to access any of the [Admin Commands](#List-of-Admin-Commands). In this case, you should use whatever IP and port you configured the server to bind. (For example, `127.0.0.1:54321`) Additionally, in order to access admin functionality, you must connect to on a port/IP address marked as admin in the config file.
The [example config file](https://github.com/ripple/rippled/blob/d7def5509d8338b1e46c0adf309b5912e5168af0/doc/rippled-example.cfg#L831-L854) listens for connections on the local loopback network (127.0.0.1), with JSON-RPC (HTTP) on port 5005 and WebSocket (WS) on port 6006, and treats all connected clients as admin.
@@ -54,22 +56,6 @@ Currently, Ripple Labs maintains a set of public JSON-RPC servers at:
These public servers are not for sustained or business use, and they may become unavailable at any time. For regular use, you should run your own `rippled` server or contract someone you trust to do so.
If you are running your own `rippled` server, make sure that you have enabled the JSON-RPC interface in your [rippled.cfg](https://ripple.com/wiki/Rippled.cfg) file, since JSON-RPC is disabled by default. The relevant section is something like this example:
```
# [rpc_ip]:
# IP address or domain to bind to allow insecure RPC connections.
# Defaults to not allow RPC connections.
#
# [rpc_port]:
# Port to bind to if allowing insecure RPC connections.
[rpc_ip]
127.0.0.1
[rpc_port]
8088
```
### Commandline ###
The commandline interface connects to the same service as the JSON-RPC one, so the public servers and server configuration are the same. As a commandline client, `rippled` connects to the local instance. For example:
@@ -468,15 +454,22 @@ API methods for the Websocket and JSON-RPC APIs are defined by command names, an
* [`get_counts` - Get information about the server's memory usage](#get-counts)
* [`ledger_accept` - Close and advance the ledger in stand-alone mode](#ledger-accept)
* [`ledger_cleaner` - Configure the ledger cleaner service to check for corrupted data](#ledger-accept)
* [`ledger_request` - Query a peer server for a specific ledger version](#ledger-request)
* [`log_level` - Get or modify log verbosity](#log-level)
* [`logrotate` - Reopen the log file](#logrotate)
* [`peers` - Get information about the peer servers connected](#peers)
* [`print` - Get information about internal subsystems](#print)
* [`stop` - Shut down the rippled server](#stop)
* [`validation_create` - Generate keys for a new rippled validator](#validation-create)
* [`validation_seed` - Temporarily set key to be used for validating](#validation-seed)
* [`wallet_propose` - Generate keys for a new account](#wallet-propose)
The following admin commands are deprecated and may be removed without further notice: `ledger_header`, `unl_add`, `unl_delete`, `unl_list`, `unl_load`, `unl_network`, `unl_reset`, `unl_score`, and `wallet_seed`.
The following admin commands are deprecated and may be removed without further notice:
(For UNL management, use the the configuration file. To generate wallet keys, use [`wallet_propose`](#wallet-propose). To get a ledger header, use [`ledger`](#ledger))
* `ledger_header` - Use the [`ledger` command](#ledger) instead.
* `unl_add`, `unl_delete`, `unl_list`, `unl_load`, `unl_network`, `unl_reset`, `unl_score` - Use the configuration file for UNL management instead.
* `wallet_seed` - Use [`wallet_propose`](#wallet-propose) instead.
For information about other Admin Commands, consult [the old wiki documentation](https://ripple.com/wiki/JSON_Messages).
## Commandline Access ##
@@ -486,7 +479,7 @@ The `rippled` application, in addition to acting as a server, can be run (as a s
# Managing Accounts #
# Account Information #
Accounts are the core unit of authentication in the Ripple Network. Each account can hold balances in multiple currencies, and all transactions must be signed by an account's secret key. In order for an account to exist in a validated ledger version, it must hold a minimum reserve amount of XRP. (The [reserve for an account](https://ripple.com/wiki/Reserves) increases with the amount of data it is responsible for in the shared ledger.) It is expected that accounts will correspond loosely to individual users.
@@ -1958,7 +1951,7 @@ The key generated by this method can also be used as a regular key for an accoun
# Managing Ledgers #
# Ledger Information #
The globally-shared ledger is the core of the Ripple Network. Each `rippled` server keeps a current version of the ledger, which contains all the accounts, transactions, offers, and other data in the network in an optimized tree format. As transactions and offers are proposed, each server incorporates them into its current copy of the ledger, closes it periodically, and (if configured) participates in the process of advancing the globally-validated version. After concensus is reached in the network, that ledger version is validated and becomes permanently immutable. Any transactions that were not included in one ledger become candidates to be included in the next validated version.
@@ -2665,6 +2658,128 @@ The response follows the [standard format](#response-formatting), with a success
* `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.
## ledger_request ##
[[Source]<br>](https://github.com/ripple/rippled/blob/e980e69eca9ea843d200773eb1f43abe3848f1a0/src/ripple/rpc/handlers/LedgerRequest.cpp "Source")
The `ledger_request` command tells server to fetch a specific ledger version from its connected peers. This only works if one of the server's immediately-connected peers has that ledger. You may need to run the command several times to completely fetch a ledger.
*The `ledger_request` request is an admin command that cannot be run by unpriviledged users!*
#### Request Format ####
An example of the request format:
<div class='multicode'>
*WebSocket*
```
{
"id": 102,
"command": "ledger_request",
"ledger_index": 13800000
}
```
*Commandline*
```
rippled -- ledger_request 13800000
```
</div>
The request includes the following parameters:
| Field | Type | Description |
|---------------|--------|-------------|
| ledger\_index | Number | (Optional) Retrieve the specified ledger by its sequence number. |
| ledger\_hash | String | (Optional) Retrieve the specified ledger by its identifying hash. |
You must provide either `ledger_index` or `ledger_hash` but not both.
#### Response Format ####
The response follows the [standard format](#response-formatting). However, the request returns a failure response if it does not have the specified ledger _even if it successfully instructed the `rippled` server to start retrieving the ledger_.
**Note:** In order to retrieve a ledger, the rippled server must have a direct peer with that ledger in its history. If none of the peers have the requested ledger, you can use the [`connect` command](#connect) or the `fixed_ips` section of the config file to add Ripple Labs' full-history server at `s2.ripple.com` and then make the `ledger_request` request again.
A failure response indicates the status of fetching the ledger. A successful response contains the information for the ledger in a similar format to the [`ledger` command](#ledger).
<div class='multicode'>
*Commandline (failure)*
```
Loading: "/etc/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
"error" : "ledgerNotFound",
"hash" : "D6E25136ADF43DED49C886A6D049436DDC8F8CC02C84E7C89DE67E209F0FAAB6",
"have_header" : false,
"peers" : 2,
"request" : {
"command" : "ledger_request",
"ledger_index" : 13800000
},
"status" : "error",
"timeouts" : 0
}
}
```
*Commandline (success)*
```
Loading: "/etc/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
"ledger" : {
"accepted" : true,
"account_hash" : "84EBB27D9510AD5B9A3A328201921B3FD418D4A349E85D3DC69E33C7B506407F",
"close_time" : 486691300,
"close_time_human" : "2015-Jun-04 00:01:40",
"close_time_resolution" : 10,
"closed" : true,
"hash" : "DCF5D723ECEE1EF56D2B0024CD9BDFF2D8E3DC211BD2B9460165922564ACD863",
"ledger_hash" : "DCF5D723ECEE1EF56D2B0024CD9BDFF2D8E3DC211BD2B9460165922564ACD863",
"ledger_index" : "13840000",
"parent_hash" : "8A3F6FBC62C11DE4538D969F9C7966234635FE6CEB1133DDC37220978F8100A9",
"seqNum" : "13840000",
"totalCoins" : "99999022883526403",
"total_coins" : "99999022883526403",
"transaction_hash" : "3D759EF3AF1AE2F78716A8CCB2460C3030F82687E54206E883703372B9E1770C"
},
"ledger_index" : 13840000,
"status" : "success"
}
}
```
</div>
The fields of the "failure" response (the ledger was requested, but has not been fully retrieved yet) can include any of the following:
| Field | Type | Description |
|-----------------------------|---------|-------------|
| hash | String | The hash of the requested ledger, if the server knows it. |
| have\_header | Boolean | Whether the server has the header section of the requested ledger. |
| have\_state | Boolean | (May be omitted) Whether the server has the state section of the requested ledger. |
| have\_transactions | Boolean | (May be omitted) Whether the server has the transaction section of the requested ledger. |
| needed\_state\_hashes | Array of Strings | (May be omitted) Up to 16 hashes of nodes in the state tree that the server still needs to retrieve. |
| needed\_transaction\_hashes | Array of Strings | (May be omitted) Up to 16 hashes of nodes in the transaction tree that the server still needs to retrieve. |
| peers | Number | How many peers the server is querying in its attempt to find this ledger. |
#### 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. This error can also occur if you specify a ledger index equal or higher than the current in-progress ledger.
* `ledgerNotFound` - If the ledger is not yet available. This indicates that the server has started fetching the ledger, although it may fail if none of its connected peers have the requested ledger.
## ledger_accept ##
[[Source]<br>](https://github.com/ripple/rippled/blob/a61ffab3f9010d8accfaa98aa3cacc7d38e74121/src/ripple/rpc/handlers/LedgerAccept.cpp "Source")
@@ -2723,7 +2838,7 @@ The response follows the [standard format](#response-formatting), with a success
# Managing Transactions #
# Transactions #
Transactions are the only thing that can modify the shared global ledger of the Ripple Network. All business on the Ripple Network takes the form of transactions, which include not only payments, but also currency-exchange offers, account settings, and changes to the properties of the network itself (like adopting new features).
@@ -7206,7 +7321,7 @@ An example of a successful response:
*Commandline*
```
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Loading: "/etc/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
@@ -7407,7 +7522,7 @@ An example of a successful response:
*Commandline*
```
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Loading: "/etc/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
@@ -7565,7 +7680,7 @@ An example of a successful response:
*Commandline*
```
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Loading: "/etc/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
@@ -7642,12 +7757,6 @@ An example of the request format:
}
```
*Second tab*
```
//second example here
```
</div>
The request includes the following parameters:
@@ -7743,7 +7852,7 @@ Examples of successful responses:
*Commandline (set log level)*
```
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Loading: "/etc/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
@@ -7755,7 +7864,7 @@ Connecting to 127.0.0.1:5005
*Commandline (check log levels)*
```
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Loading: "/etc/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
@@ -7885,7 +7994,7 @@ An example of a successful response:
*Commandline*
```
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Loading: "/etc/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
@@ -7983,7 +8092,7 @@ An example of a successful response:
*Commandline*
```
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Loading: "/etc/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
@@ -8011,6 +8120,590 @@ The response follows the [standard format](#response-formatting), with a success
* `badSeed` - The request provided an invalid seed value. This usually means that the seed value appears to be a valid string of a different format, such as an account address or validation public key.
## validation_seed ##
[[Source]<br>](https://github.com/ripple/rippled/blob/a61ffab3f9010d8accfaa98aa3cacc7d38e74121/src/ripple/rpc/handlers/ValidationSeed.cpp "Source")
The `validation_seed` command temporarily sets the secret value that rippled uses to sign validations. This value resets based on the config file when you restart the server.
*The `validation_seed` request is an admin command that cannot be run by unpriviledged users!*
#### Request Format ####
An example of the request format:
<div class='multicode'>
*WebSocket*
```
{
"id": "set_seed_1",
"command": "validation_seed",
"secret": "BAWL MAN JADE MOON DOVE GEM SON NOW HAD ADEN GLOW TIRE"
}
```
*Commandline*
```#Syntax: validation_seed [secret]
rippled -- validation_seed 'BAWL MAN JADE MOON DOVE GEM SON NOW HAD ADEN GLOW TIRE'
```
</div>
The request includes the following parameters:
| Field | Type | Description |
|-------|------|-------------|
| secret | String | (Optional) If present, use this value as the secret value for the validating key pair. Valid formats include base-58, [RFC-1751](https://tools.ietf.org/html/rfc1751), or as a passphrase. If omitted, disables proposing validations to the network. |
#### Response Format ####
An example of a successful response:
<div class='multicode'>
*JSON-RPC*
```
200 OK
{
"result" : {
"status" : "success",
"validation_key" : "BAWL MAN JADE MOON DOVE GEM SON NOW HAD ADEN GLOW TIRE",
"validation_public_key" : "n9Jx6RS6zSgqsgnuWJifNA9EqgjTKAywqYNReK5NRd1yLBbfC3ng",
"validation_seed" : "snjJkyBGogTem5dFGbcRaThKq2Rt3"
}
}
```
*Commandline*
```
Loading: "/etc/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
"status" : "success",
"validation_key" : "BAWL MAN JADE MOON DOVE GEM SON NOW HAD ADEN GLOW TIRE",
"validation_public_key" : "n9Jx6RS6zSgqsgnuWJifNA9EqgjTKAywqYNReK5NRd1yLBbfC3ng",
"validation_seed" : "snjJkyBGogTem5dFGbcRaThKq2Rt3"
}
}
```
</div>
The response follows the [standard format](#response-formatting), with a successful result containing the following fields:
| Field | Type | Description |
|-------|------|-------------|
| validation\_key | String | (Omitted if proposing disabled) The secret key for these validation credentials, in [RFC-1751](https://tools.ietf.org/html/rfc1751) format. |
| validation\_public\_key | String | (Omitted if proposing disabled) The public key for these validation credentials, in Ripple's base-58 encoded string format. |
| validation\_seed | String | (Omitted if proposing disabled) The secret key for these validation credentials, in Ripple's base-58 encoded string format. |
#### Possible Errors ####
* Any of the [universal error types](#universal-errors).
* `badSeed` - The request provided an invalid secret value. This usually means that the secret value appears to be a valid string of a different format, such as an account address or validation public key.
## peers ##
[[Source]<br>](https://github.com/ripple/rippled/blob/52f298f150fc1530d201d3140c80d3eaf781cb5f/src/ripple/rpc/handlers/Peers.cpp "Source")
The `peers` command returns a list of all other `rippled` servers currently connected to this one, including information on their connection and sync status.
*The `peers` request is an admin command that cannot be run by unpriviledged users!*
#### Request Format ####
An example of the request format:
<div class='multicode'>
*WebSocket*
```
{
"id": 5,
"command": "peers"
}
```
*Commandline*
```
rippled -- peers
```
</div>
The request includes no additional parameters.
#### Response Format ####
An example of a successful response:
<div class='multicode'>
*JSON-RPC*
```
{
"result" : {
"peers" : [
{
"address" : "54.86.175.122:51235",
"complete_ledgers" : "14088526 - 14089550",
"ledger" : "D4D34FBDCF5AD9E9C1EF80FF3B37C161B6C1A30A393332296DCEBBD01DBD6EE5",
"load" : 1,
"public_key" : "n94rE1SydpHTvJ4NyX9vC1cdeDmYP5nQSXTyeMnLh8jMJSRdcy9Q",
"version" : "rippled-0.28.1-hf2"
},
{
"address" : "192.170.145.70:51235",
"complete_ledgers" : "14088527 - 14089551",
"latency" : 2913,
"ledger" : "D4D34FBDCF5AD9E9C1EF80FF3B37C161B6C1A30A393332296DCEBBD01DBD6EE5",
"load" : 10,
"public_key" : "n9L7jeMAVM28wfzhdzoYZqcvBRkP5p6ZCvidgqmyEa62ThUdCE1x",
"version" : "rippled-0.28.0-rc3"
},
{
"address" : "192.170.145.69:51235",
"complete_ledgers" : "14088527 - 14089551",
"latency" : 7802,
"ledger" : "D4D34FBDCF5AD9E9C1EF80FF3B37C161B6C1A30A393332296DCEBBD01DBD6EE5",
"load" : 10,
"public_key" : "n94JPD9sx9TetuJGn1ju5TRDG87Di7EEbUbXWCdjj52GKqZUsnKA",
"version" : "rippled-0.28.1-hf2"
},
{
"address" : "74.201.214.197:51235",
"complete_ledgers" : "14088531 - 14089555",
"ledger" : "77A37B94DDA7F1501076CC344F7DC0556684AFEB6ADA6EFF066977DCA3FB994F",
"load" : 4,
"public_key" : "n9LAPy9VbzXtodR4W58umSwwcbQsf9ZgFv1bpsd95CAgo7GWUvM4",
"version" : "rippled-0.28.1-hf2"
},
{
"address" : "93.190.138.234:51235",
"complete_ledgers" : "13948110 - 14089552",
"ledger" : "99288D510F63FDAC3F91BB410E4E251B050F92DF196CA33946A2F339DFF7483E",
"load" : 52,
"public_key" : "n9LYLVRw987hj8tyDdt2gVXZyrq4NvXF5vi4YwZPUNGaoPkqo4PH",
"version" : "rippled-0.28.0-b18"
},
{
"address" : "192.170.145.77:51235",
"complete_ledgers" : "32570 - 14089555",
"ledger" : "BFFF0AA3C71F9E1690F1B5537416CAEA2A038C896650FC5BB6E1057E464088ED",
"load" : 4,
"public_key" : "n9LwcmtjDAJQz4u8DZCMGQ9GXHuMEV4Cf8KpPL9NgqAV2puxdYc2",
"version" : "rippled-0.28.1-hf2"
},
{
"address" : "188.166.17.21:52345",
"complete_ledgers" : "14089423 - 14089551",
"latency" : 7894,
"ledger" : "2DBD1EAD2BAE89C01C183BE818B35C2E67BB2D0B07922C58A57A399B1ABD48BA",
"load" : 8,
"public_key" : "n9M3pWqDot5jyDRSdre6AZQVTA4RFXwUzWZHfj8m2dqMX1S99erB",
"version" : "rippled-0.27.0"
},
{
"address" : "198.204.238.130:51235",
"complete_ledgers" : "14087551 - 14089551",
"latency" : 3427,
"ledger" : "D4D34FBDCF5AD9E9C1EF80FF3B37C161B6C1A30A393332296DCEBBD01DBD6EE5",
"load" : 8,
"public_key" : "n94PN5sKswgBVjmg5UcJs2dwjSippFrbZXnHALvCm52LY1L3KGLT",
"version" : "rippled-0.27.4"
},
{
"address" : "162.217.98.92:51235",
"complete_ledgers" : "14088527 - 14089551",
"latency" : 2694,
"ledger" : "D4D34FBDCF5AD9E9C1EF80FF3B37C161B6C1A30A393332296DCEBBD01DBD6EE5",
"load" : 7,
"public_key" : "n9L4MyAQHZgtnhUSYeNmbc2SeveoBbxu9kWDyxckijGgj5WuKmy2",
"version" : "rippled-0.28.1-hf2"
},
{
"address" : "72.251.233.166:51235",
"complete_ledgers" : "14088531 - 14089555",
"latency" : 9358,
"ledger" : "77A37B94DDA7F1501076CC344F7DC0556684AFEB6ADA6EFF066977DCA3FB994F",
"load" : 88,
"public_key" : "n9MdrPRH9tQ6RDwwP4M41GJHTqgsVnBX2YLJd9XdYdgFzxSefdi8",
"version" : "rippled-0.28.0-rc3"
}
],
"status" : "success"
}
}
```
*Commandline*
```
Loading: "/etc/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
"peers" : [
{
"address" : "162.217.98.91:51235",
"complete_ledgers" : "14014038 - 14015062",
"latency" : 93,
"ledger" : "4DBECEB8DA331D9616FFAE4146A919D7A1BA7D06938239258FBD8A82C37585A7",
"load" : 15,
"public_key" : "n94szsuScMEjP4Nu7c3mndcyjWJELepZcASEkDMcDSwXhHH6Sn37",
"version" : "rippled-0.28.1-rc3"
},
{
"address" : "54.186.248.91:51235",
"complete_ledgers" : "14014038 - 14015062",
"latency" : 68,
"ledger" : "4DBECEB8DA331D9616FFAE4146A919D7A1BA7D06938239258FBD8A82C37585A7",
"load" : 17,
"public_key" : "n9MT5EjnV912KGuBUqPs4tpdhzMPGcnDBrTuWkD9sWQHJ1kDcUcz",
"version" : "rippled-0.28.1-rc3"
},
{
"address" : "162.217.98.136:51235",
"complete_ledgers" : "32570 - 14015062",
"latency" : 97,
"ledger" : "4DBECEB8DA331D9616FFAE4146A919D7A1BA7D06938239258FBD8A82C37585A7",
"load" : 32,
"public_key" : "n944PcXEoZaiEHnwFD92xA4bxsS7jjYb27WcdDQwkHYyk1MWTEsX",
"version" : "rippled-0.28.1-rc3"
},
{
"address" : "54.186.73.52:51235",
"complete_ledgers" : "14014038 - 14015062",
"latency" : 68,
"ledger" : "4DBECEB8DA331D9616FFAE4146A919D7A1BA7D06938239258FBD8A82C37585A7",
"load" : 14,
"public_key" : "n9JySgyBVcQKvyDoeRKg7s2Mm6ZcFHk22vUZb3o1HSosWxcj9xPt",
"version" : "rippled-0.28.1-rc3"
},
{
"address" : "72.251.233.165:51235",
"complete_ledgers" : "14014038 - 14015062",
"latency" : 39,
"ledger" : "4DBECEB8DA331D9616FFAE4146A919D7A1BA7D06938239258FBD8A82C37585A7",
"load" : 15,
"public_key" : "n9M77Uc9CSaSFZqt5V7sxPR4kFwbha7hwUFBD5v5kZt2SQjBeoDs",
"version" : "rippled-0.28.1-hf1"
},
{
"address" : "72.251.233.164:51235",
"complete_ledgers" : "14014038 - 14015062",
"latency" : 35,
"ledger" : "4DBECEB8DA331D9616FFAE4146A919D7A1BA7D06938239258FBD8A82C37585A7",
"load" : 15,
"public_key" : "n9LWq5vQbx9nrm5ERkjbvNmAN8erdoShdHWiHYj18Gbo3ExsnFDE",
"version" : "rippled-0.28.1-rc3"
},
{
"address" : "162.217.98.90:51235",
"complete_ledgers" : "14014038 - 14015062",
"latency" : 114,
"ledger" : "4DBECEB8DA331D9616FFAE4146A919D7A1BA7D06938239258FBD8A82C37585A7",
"load" : 14,
"public_key" : "n9KJB2KWFQcqQcnjNN9wLZ5KPYjFcoVpvZ94m6t34tvjV5PquhCc",
"version" : "rippled-0.28.1-rc3"
},
{
"address" : "72.251.233.166:51235",
"complete_ledgers" : "14014038 - 14015062",
"latency" : 20,
"ledger" : "4DBECEB8DA331D9616FFAE4146A919D7A1BA7D06938239258FBD8A82C37585A7",
"load" : 9,
"public_key" : "n9MdrPRH9tQ6RDwwP4M41GJHTqgsVnBX2YLJd9XdYdgFzxSefdi8",
"version" : "rippled-0.28.0-rc3"
},
{
"address" : "72.251.233.163:51235",
"complete_ledgers" : "14014038 - 14015062",
"latency" : 31,
"ledger" : "4DBECEB8DA331D9616FFAE4146A919D7A1BA7D06938239258FBD8A82C37585A7",
"load" : 16,
"public_key" : "n94ne2Z5dX8qcJNa8cPtAbtn21gEaCoEduS8TwdGAhi1iLfCUMDm",
"version" : "rippled-0.28.1-rc3"
},
{
"address" : "72.251.232.171:51235",
"complete_ledgers" : "32570 - 14015062",
"latency" : 32,
"ledger" : "4DBECEB8DA331D9616FFAE4146A919D7A1BA7D06938239258FBD8A82C37585A7",
"load" : 44,
"public_key" : "n9LJekVe9sUpxf1PEhWX3Csg63oShsTLMEfJ1mL4kpuzDu3bxotS",
"version" : "rippled-0.28.1-rc3"
}
],
"status" : "success"
}
}
```
</div>
The response follows the [standard format](#response-formatting), with a successful result containing a `peers` array. Each member of the peers array is a peer object with the following fields:
| Field | Type | Description |
|-------|------|-------------|
| address | String | The IP address and port where this peer is connected |
| cluster | Boolean | (May be omitted) If `true`, the current server and the peer server are part of the same `rippled` cluster. |
| name | String | (May be omitted) If the peer is part of the same cluster, this is the display name for that node as defined in the config file. |
| complete\_ledgers | String | Range expression indicating the sequence numbers of the ledger versions the peer `rippled` has available |
| inbound | Boolean | (May be omitted) If `true`, the peer is connecting to the local server. |
| latency | Number | The network latency to the peer (in milliseconds) |
| ledger | String | The hash of the peer's most recently closed ledger |
| load | Number | A measure of the amount of load the peer server is putting on the local server. Larger numbers indicate more load. (The units by which load is measured are not formally defined.) |
| protocol | String | (May be omitted) The protocol version that the peer is using, if not the same as the local server. |
| public\_key | String | (May be omitted) A public key that can be used to verify the integrity of the peer's messages. This is not the same key that is used for validations, but it follows the same format. |
| sanity | String | (May be omitted) Whether this peer is following the same rules and ledger sequence as the current server. A value of `insane` probably indicates that the peer is part of a parallel network. The value `unknown` indicates that the current server is unsure whether the peer is compatible. |
| status | String | (May be omitted) The most recent status message from the peer. Could be `connecting`, `connected`, `monitoring`, `validating`, or `shutting`. |
| version | string | (May be omitted) The `rippled` version number of the peer server |
#### Possible Errors ####
* Any of the [universal error types](#universal-errors).
## print ##
[[Source]<br>](https://github.com/ripple/rippled/blob/315a8b6b602798a4cff4d8e1911936011e12abdb/src/ripple/rpc/handlers/Print.cpp "Source")
The `print` command returns the current status of various internal subsystems, including peers, the ledger cleaner, and the resource manager.
*The `print` request is an admin command that cannot be run by unpriviledged users!*
#### Request Format ####
An example of the request format:
<div class='multicode'>
*WebSocket*
```
{
"id": "print_req_1",
"command": "print"
}
```
*Commandline*
```
rippled -- print
```
</div>
The request includes no parameters.
#### Response Format ####
An example of a successful response:
<div class='multicode'>
*Commandline*
```
Loading: "/etc/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
"app" : {
"ledgercleaner" : {
"status" : "idle"
},
"peers" : {
"peerfinder" : {
"bootcache" : {
"entries" : 109
},
"config" : {
"auto_connect" : "true",
"features" : "",
"max_peers" : 21,
"out_peers" : 10,
"port" : 51235,
"want_incoming" : "true"
},
"counts" : {
"accept" : 0,
"close" : 0,
"cluster" : "0",
"connect" : 0,
"fixed" : "0",
"in" : "0/11",
"out" : "10/10",
"total" : "10"
},
"fixed" : 0,
"livecache" : {
"entries" : [
{
"address" : "23.239.3.247:51235",
"expires" : "30000000000 nanoseconds",
"hops" : 2
},
{
"address" : "192.170.145.88:51235",
"expires" : "30000000000 nanoseconds",
"hops" : 1
},
{
"address" : "198.204.238.130:51235",
"expires" : "26000024558 nanoseconds",
"hops" : 1
},
{
"address" : "203.127.12.115:51235",
"expires" : "26000024558 nanoseconds",
"hops" : 2
},
{
"address" : "212.83.147.67:51235",
"expires" : "26000024558 nanoseconds",
"hops" : 2
}
],
"hist" : "0, 10, 74, 10, 0, 0, 0, 0",
"size" : "94"
},
"peers" : [
{
"local_address" : "10.1.10.78:48923",
"remote_address" : "52.24.43.83:51235",
"state" : "active"
},
{
"local_address" : "10.1.10.78:50004",
"remote_address" : "52.26.205.197:51235",
"state" : "active"
},
{
"local_address" : "10.1.10.78:37019",
"remote_address" : "168.1.60.132:51235",
"state" : "active"
},
{
"local_address" : "10.1.10.78:38775",
"remote_address" : "192.170.145.88:51235",
"state" : "active"
},
{
"local_address" : "10.1.10.78:34793",
"remote_address" : "198.204.238.130:51235",
"state" : "active"
}
]
}
},
"resource" : {
"admin" : [
{
"balance" : 0,
"count" : 1,
"name" : "\"127.0.0.1\""
}
],
"inactive" : [],
"inbound" : [],
"outbound" : [
{
"balance" : 23,
"count" : 1,
"name" : "93.190.138.234:51235"
},
{
"balance" : 35,
"count" : 1,
"name" : "198.204.238.130:51235"
},
{
"balance" : 31,
"count" : 1,
"name" : "52.26.205.197:51235"
},
{
"balance" : 32,
"count" : 1,
"name" : "54.186.73.52:51235"
},
{
"balance" : 15,
"count" : 1,
"name" : "72.251.233.164:51235"
}
]
},
"server" : {
"active" : "2",
"hist" : "16",
"history" : [
{
"bytes_in" : "214",
"bytes_out" : "11688",
"elapsed" : "0 seconds",
"id" : "16",
"requests" : 1,
"when" : "2015-Jun-16 16:33:50"
},
{
"bytes_in" : "214",
"bytes_out" : "11431",
"elapsed" : "0 seconds",
"id" : "15",
"requests" : 1,
"when" : "2015-Jun-16 16:11:59"
},
{
"bytes_in" : "227",
"bytes_out" : "337",
"elapsed" : "0 seconds",
"id" : "3",
"requests" : 1,
"when" : "2015-Jun-16 14:57:23"
},
{
"bytes_in" : "214",
"bytes_out" : "2917",
"elapsed" : "0 seconds",
"id" : "2",
"requests" : 1,
"when" : "2015-Jun-16 12:39:29"
},
{
"bytes_in" : "220",
"bytes_out" : "1426",
"elapsed" : "0 seconds",
"id" : "1",
"requests" : 1,
"when" : "2015-Jun-16 12:39:13"
}
]
},
"validators" : {}
},
"status" : "success"
}
}
```
</div>
The response follows the [standard format](#response-formatting). Additional fields in the result depend on the internal state of the `rippled` server. The results of this command are subject to change without notice.
#### Possible Errors ####
* Any of the [universal error types](#universal-errors).
# Convenience Functions #
@@ -8285,7 +8978,7 @@ An example of a successful response:
*Commandline*
```
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Loading: "/etc/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
@@ -8372,7 +9065,7 @@ An example of a successful response:
*Commandline*
```
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Loading: "/etc/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {

44
content/transferrate.md Normal file
View File

@@ -0,0 +1,44 @@
# Transfer Fees #
The *TransferRate* setting in the shared Ripple ledger allows issuing gateways to charge users a "transfer fee" for sending that gateway's issuances to other users. When a gateway sets the transfer fee, it costs extra to send a transfer of that gateway's issuances. The sender of the transfer is debited an extra percentage based on the transfer fee, while the recipient of the transfer is credited the intended amount. The difference is the transfer fee, which becomes the property of the issuing gateway, and is no longer tracked in the Ripple network. The transfer fee does not apply when sending or receiving *directly* to and from the issuing account, but it does apply when transferring from a hot wallet to another user.
XRP never has a transfer fee, because it never has an issuer.
For example, ACME Gateway might set the transfer fee to 0.5% for ACME issuances. In order for the recipient of a payment to get 2 EUR.ACME, the sender 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%:
![Alice sends 2,02€, Charlie receives 2,00€, and ACME owes 0,02€ less in Ripple](img/e2g-with_transferrate.png)
## Transfer Fees in Longer Paths ##
A transfer fee applies whenever an individual transfer would shift issuances from one party to another through the issuing account. In more complex transactions, this can occur multiple times. Transfer fees apply starting from the end and working backwards, so that ultimately the initial sender of a payment must send enough to account for all fees. For example:
![Diagram of cross-currency payment with transfer fees](img/transfer_fees_example.png)
In this scenario, Salazar (the sender) holds EUR issued by ACME, and wants to deliver 100 USD issued by WayGate to Rosa (the recipient). FXMaker is a market maker with the best offer in the order book, at a rate of 1 USD.WayGate for every 0.9 EUR.ACME. If there were no transfer fees, Salazar could deliver 100 USD to Rosa by sending 90 EUR. However, ACME has a transfer fee of 1% and WayGate has a transfer fee of 0.2%. This means:
* FXMaker must send 100.20 USD.WayGate in order for Rosa to receive 100 USD.WayGate.
* FXMaker's current ask is 90.18 EUR.ACME in order to send 100.20 USD.WayGate.
* In order for FXMaker to receive 90.18 EUR.ACME, Salazar must send 91.0818 EUR.ACME.
# Technical Details #
The transfer fee is represented by a setting on the issuing (**cold wallet**) account. The transfer fee has a maximum precision of 9 digits, and cannot be less than 0% or greater than 100%. The TransferRate setting applies to all currencies issued by the same account. If you want to have different transfer fee percentages for different currencies, use different cold wallets to issue each currency.
## Ripple-REST ##
In Ripple-REST, the transfer fee is specified in the `transfer_rate` field, as a decimal which represents the amount you must send in order for the recipient to get 1 unit of the same currency. A `transfer_rate` of `1.005` is equivalent to a transfer fee of 0.5%. By default, the `transfer_rate` is set at `1.0`, indicating no fee. The value of `transfer_rate` cannot be less than `1.0` or more than `2.0`. However, the value `0` is special: it is equivalent to `1.0`, meaning no fee.
A gateway can use the [Update Account Settings method](https://ripple.com/build/ripple-rest/#update-account-settings) with its cold wallet to change the `transfer_rate` for its issuances.
You can check an account's `transfer_rate` with the [Get Account Settings method](https://ripple.com/build/ripple-rest/#get-account-settings).
## rippled ##
In `rippled`'s JSON-RPC and WebSocket APIs, the transfer fee is specified in the `TransferRate` field, as an integer which represents the amount you must send in order for the recipient to get 1 billion units of the same currency. A `TransferRate` of `1005000000` is equivalent to a transfer fee of 0.5%. By default, the `transfer_rate` is set at `1000000000`, indicating no fee. The value of `TransferRate` cannot be less than `1000000000` or more than `2000000000`. However, value `0` is special: it is equivalent to `1000000000`, meaning no fee.
A gateway can submit an [AccountSet transaction](https://ripple.com/build/transactions/#accountset) from its cold wallet to change the `TransferRate` for its issuances.
You can check an account's `TransferRate` with the [account_info command](https://ripple.com/build/rippled-apis/#account-info). If the `TransferRate` is omitted, then that indicates no fee.

View File

@@ -410,7 +410,7 @@ In the above example with a ¥95/$15 offer and a ¥5/$2 offer, the situation is
[[Source]<br>](https://github.com/ripple/rippled/blob/f65cea66ef99b1de149c02c15f06de6c61abf360/src/ripple/app/transactors/SetAccount.cpp "Source")
An AccountSet transaction modifies the properties of an [account in the global ledger]((https://wiki.ripple.com/Ledger_Format#AccountRoot).
An AccountSet transaction modifies the properties of an [account in the global ledger](https://wiki.ripple.com/Ledger_Format#AccountRoot).
Example AccountSet:
@@ -498,14 +498,10 @@ Accounts can protect against unwanted incoming payments for non-XRP currencies s
### TransferRate ###
TransferRate allows issuing gateways to charge users for sending funds to other users of the same gateway. It adds a fee, specified in billionths of a unit (for all non-XRP currencies) that applies when a user pays another user in the currency issued by this account. The fee "disappears" from the balances on the ledger, becoming the property of the issuing gateway. The TransferRate does not apply when redeeming funds with the account that issued them. The TransferRate applies equally to all currencies issued by that account. (XRP, which never has an issuer, is never subject to a TransferRate.)
The TransferRate field specifies a fee to charge whenever a gateway's issuances change hands. See [Transfer Rate](https://ripple.com/knowledge_center/transfer-fees/) in the Knowledge Center for more information.
In rippled's WebSocket and JSON-RPC APIs, the TransferRate is represented as an integer, the amount that must be sent in order for 1 billion units to arrive. For example, a 20% transfer fee is represented as the value `120000000`. The value cannot be less than 1000000000. (Less than that would indicate giving away money for sending transactions, which is exploitable.) You can specify 0 as a shortcut for 1000000000, meaning no fee.
Ripple-REST uses a decimal value to represent the `transfer_rate` as a decimal, the amount that must be sent in order for 1 unit to arrive. For example, a 20% transfer fee is represented as the value `1.2`. Ripple-REST's format also allows 9 digits of precision. The value `0` is equivalent to the value `1`, both meaning no fee.
The fee is paid by the sender on top of the destination amount of the transaction. For example, if HighFeeGateway's `TransferRate` is 20% and Norman wants to send Arthur $100 of USD issued by HighFeeGateway, Norman would have to spend $120 in order for Arthur to receive $100. The other $20 would no longer be tracked on the Ripple Ledger, and would become the property of HighFeeGateway instead.
## SetRegularKey ##

View File

@@ -84,6 +84,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</li>
@@ -137,6 +138,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</div>

View File

@@ -84,6 +84,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</li>
@@ -137,6 +138,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</div>

View File

@@ -84,6 +84,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</li>
@@ -137,6 +138,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</div>

View File

@@ -84,6 +84,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</li>
@@ -137,6 +138,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</div>

View File

@@ -57,6 +57,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</li>
@@ -142,6 +143,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</div>

BIN
img/transfer_fees_example.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -70,6 +70,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</li>
@@ -232,6 +233,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</div>

View File

@@ -33,10 +33,9 @@ Request('Accounts Created', {
body: {
"startTime": TIME_20140101,
"endTime": "2015-03-31T00:00:00.000Z",
"timeIncrement": "month",
"timeIncrement": "week",
"descending": true,
"reduce": true,
"format": "json"
"reduce": true
}
});
@@ -185,11 +184,11 @@ Request('Top Markets', {
params: {},
body: {
"startTime": TIME_20150101,
"endTime": TIME_20150101_2,
"interval": "week",
"exchange": {
"currency": "USD",
"issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"
}
}
}
});
@@ -216,7 +215,7 @@ Request('Total Value Sent', {
params: {},
body: {
"startTime": TIME_20150101,
"endTime": TIME_20150101_2,
"interval": "month",
"exchange": {
"currency": "USD",
"issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"

View File

@@ -1,3 +1,15 @@
var urlParams;
(window.onpopstate = function () {
var match,
pl = /\+/g, // Regex for replacing addition symbol with a space
search = /([^&=]+)=?([^&]*)/g,
decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
query = window.location.search.substring(1);
urlParams = {};
while (match = search.exec(query))
urlParams[decode(match[1])] = decode(match[2]);
})();
;(function() {
@@ -17,19 +29,26 @@
var info = $(command_wrapper).find('#info');
var spinner = $(".loader");
var BASE_HOST_DEFAULT = 's2.ripple.com';
var BASE_PORT_DEFAULT = 443;
var remote = new ripple.Remote({
trusted: true,
local_signing: true,
local_fee: false,
servers: [
{
host: 's2.ripple.com',
port: 443,
host: BASE_HOST_DEFAULT,
port: BASE_PORT_DEFAULT,
secure: true
}
]
});
function new_remote(options) {
remote = new ripple.Remote(options);
}
function set_online_state(state) {
var state = state.toLowerCase();
$(online_state).removeClass();
@@ -42,7 +61,13 @@
});
remote.on('connect', function() {
set_online_state('connected');
var msg = "connected";
if (remote._servers.length === 1) {
msg = "connected to "+remote._servers[0].getHostID();
} else if (remote._servers.length > 1) {
msg = "connected to "+remote._servers.length+" servers";
}
set_online_state(msg);
});
/* ---- ---- ---- ---- ---- */
@@ -649,6 +674,37 @@
$(function() {
set_online_state('connecting');
if (urlParams["base_url"]) {
base_url = urlParams["base_url"].split(":");
if (base_url.length == 2) {
base_host = base_url[0];
base_port = base_url[1];
} else {
base_host = base_url[0];
base_port = BASE_PORT_DEFAULT;
}
if (urlParams["use_wss"]
&& urlParams["use_wss"].toLowerCase() === "false") {
use_wss = false;
} else {
use_wss = true;
}
new_remote({
trusted: true,
local_signing: true,
local_fee: false,
servers: [
{
host: base_host,
port: base_port,
secure: use_wss
}
]
});
}
remote.connect(init);
if (window.location.hash) {

View File

@@ -84,6 +84,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</li>
@@ -137,6 +138,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</div>

View File

@@ -57,6 +57,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</li>
@@ -142,6 +143,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</div>

View File

@@ -57,6 +57,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</li>
@@ -175,6 +176,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</div>

View File

@@ -84,6 +84,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</li>
@@ -137,6 +138,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</div>

View File

@@ -84,6 +84,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</li>
@@ -137,6 +138,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</div>

View File

@@ -84,6 +84,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</li>
@@ -137,6 +138,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</div>

View File

@@ -49,6 +49,11 @@
"md":"gateway_services_spec.md",
"html":"gateway_services.html"
},
{
"name": "Transfer Fees",
"md":"transferrate.md",
"html":"transfer_fees.html"
},
{
"name": "Whitepapers",
"md":"whitepapers.md",

View File

@@ -84,6 +84,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</li>
@@ -137,6 +138,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</div>

180
transfer_fees.html Normal file
View File

@@ -0,0 +1,180 @@
<!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>Transfer Fees - 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>
<!-- Flatdoc theme -->
<link href='vendor/flatdoc/v/0.8.0/theme-white/style.css' rel='stylesheet'>
<script src="vendor/flatdoc/v/0.8.0/theme-white/script.js"></script>
<!-- syntax highlighting -->
<link rel="stylesheet" href="vendor/docco.min.css">
<script src="vendor/highlight.min.js"></script>
<!-- syntax selection js -->
<script src="js/multicodetab.js"></script>
<!-- Code to load contents via Flatdoc -->
<script src="vendor/flatdoc/v/0.8.0/legacy.js"></script>
<script src="vendor/flatdoc/v/0.8.0/flatdoc.js"></script>
<script>
$(".flatdoc-content").empty();
$(".content-root .menubar .menu").empty();
Flatdoc.run({
fetcher: Flatdoc.file('content/transferrate.md')
});
$(document).on('flatdoc:ready', function() {
$().multicode_tabs();
hljs.initHighlighting();
});
</script>
<script src="js/expandcode.js"></script>
<script src="js/fixsidebarscroll.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 role='flatdoc' class='no-literate'>
<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="rippled-setup.html">rippled Setup</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="transfer_fees.html">Transfer Fees</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>
<li><a href="charts-api-tool.html">Charts 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 class='menubar'>
<div class='menu section' role='flatdoc-menu'>
</div>
</div>
<div role='flatdoc-content' class='content'>
</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="rippled-setup.html">rippled Setup</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="transfer_fees.html">Transfer Fees</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>
</body>
</html>

View File

@@ -84,6 +84,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</li>
@@ -137,6 +138,7 @@
<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="transfer_fees.html">Transfer Fees</a></li>
<li><a href="whitepapers.html">Whitepapers</a></li>
</ul>
</div>