This software is a framework for building and deploying a Ripple Gateway software system. The system includes a core database that manages accounting for deposits and withdrawals of assets to the Ripple network. The Ripple Gateway Framework provides a standard interface for issuing any currency on the Ripple network and exchange, with the goal of completely abstracting interaction with Ripple.
Interact with the Ripple Gateway Framework by building custom integrations with banking and payment systems around the world, and by using the built-in APIs for designing beautiful gateway mobile apps and user interfaces. A HTTP/JSON server, Javascript library, and Command Line Interface are provided as interfaces to the Ripple Gateway Framework software.
The Ripple Gateway's features include:
- user registration
- deposits and withdrawals
- issuing currency
- ripple payment sending and monitoring
- gateway administration
- Node.js
- The express web module is used to serve HTTP/JSON endpoints
- A Basic Auth strategy is used for authentication of users, admin.
- Several NPM modules must be globally installed: db-migrate, pg, forever, and mocha
- Postgres
- The easiest way to get started with Postgres is by launching a free database hosted by Heroku
- For local development on Mac the simplest installation is via the Postgres App by Heroku.
- On Ubuntu, install and configure Postgres using the aptitude package manager and the psql tool.
- The Ripple REST API provides a simplified HTTP/JSON interface to all the Ripple protocol network operations, such as payments and other transactions.
The gateway server software requires git, g++, make, nodejs, postgres, and several npm modules.
- Comprehensive installation script for Ubuntu
Once ripple-gateway is installed, configure your gateway wallets and server
After installation, start the gateway processes by running the command:
bin/gateway start
gatewayd : v3.20.0
POST /v1/registrations
POST /v1/users/{:id}/activate
POST /v1/users/{:id}
POST /v1/deposits/
GET /v1/deposits
GET /v1/payments/outgoing
GET /v1/payments/failed
POST /v1/payments/failed/{:id}/retry
GET /v1/payments/incoming
GET /v1/withdrawals
POST /v1/withdrawals/{:id}/clear
GET /v1/cleared
GET /v1/balances
GET /v1/liabilities
POST /v1/register
POST /v1/users/login
GET /v1/users/{:id}
GET /v1/users/{:id}/external_accounts
GET /v1/users/{:id}/external_transactions
GET /v1/users/{:id}/ripple_addresses
GET /v1/users/{:id}/ripple_transactions
POST /v1/wallets/hot/fund
POST /v1/config/database
GET /v1/config/database
POST /v1/config/ripple/rest
GET /v1/config/ripple/rest
POST /v1/config/wallets/cold
GET /v1/config/wallets/cold
POST /v1/config/wallets/generate
POST /v1/config/wallets/hot
GET /v1/config/wallets/hot
POST /v1/trust
GET /v1/trust
POST /v1/wallets/hot/fund
POST /v1/config/last_payment_hash
GET /v1/config/last_payment_hash
POST /v1/config/domin
GET /v1/config/domain
POST /v1/config/key
GET /v1/config/key
POST /v1/currencies
GET /v1/currencies
POST /v1/wallets/cold/refund
POST /v1/start
POST /v1/processes
POST /v1/registrations
Register a user with the gatewayd. A username, password, and ripple address are required. Upon
registration several records are created in the gatewayd database, including a user record,
a "independent" ripple address record with the address provided, a "hosted" ripple address
record for making withdrawals, and a "default" external account for recording deposits and
withdrawals.
REQUEST:
{
"name": "steven@ripple.com",
"password": "s0m3supe&$3cretp@s$w0r*",
"ripple_address": "r4EwBWxrx5HxYRyisfGzMto3AT8FZiYdWk"
}
RESPONSE:
{
"user": {
"name": "steven@ripple.com",
"salt": "63a5f6fc48addb712ec8940ff591d742f57f0c4f7058d2040714bd260c4d93e0",
"password_hash": "86e3b615a72b6f6c56f36dc6657d3133c747a59e8da8e6304c20f3229098f21e",
"active": false,
"updatedAt": "2014-06-12T00:43:17.572Z",
"createdAt": "2014-06-12T00:43:17.572Z",
"id": 508,
"federation_tag": null,
"admin": null,
"federation_name": null,
"bank_account_id": null,
"kyc_id": null,
"external_id": null,
"data": null,
"uid": null,
"ripple_address": {
"data": null,
"user_id": 508,
"address": "r4EwBWxrx5HxYRyisfGzMto3AT8FZiYdWk",
"managed": false,
"type": "independent",
"updatedAt": "2014-06-12T00:43:17.613Z",
"createdAt": "2014-06-12T00:43:17.613Z",
"id": 647,
"tag": null,
"secret": null,
"previous_transaction_hash": null,
"uid": null
},
"external_account": {
"data": null,
"name": "default",
"user_id": 508,
"updatedAt": "2014-06-12T00:43:17.620Z",
"createdAt": "2014-06-12T00:43:17.620Z",
"id": 307,
"uid": null
},
"hosted_address": {
"data": null,
"user_id": 508,
"address": "r4EwBWxrx5HxYRyisfGzMto3AT8FZiYdWk",
"managed": true,
"type": "hosted",
"tag": 307,
"updatedAt": "2014-06-12T00:43:17.627Z",
"createdAt": "2014-06-12T00:43:17.627Z",
"id": 648,
"secret": null,
"previous_transaction_hash": null,
"uid": null
}
}
}
POST /v1/users/{:id}/activate
By default a user is marked as "inactive", and to activate the user run this command. No separate action is taken by gatewayd to prevent inactive users from operating, and for now it is simply informational.
RESPONSE:
{
"user": {
"id": 508,
"name": "steven@ripple.com",
"salt": "63a5f6fc48addb712ec8940ff591d742f57f0c4f7058d2040714bd260c4d93e0",
"federation_tag": null,
"admin": null,
"federation_name": null,
"password_hash": "86e3b615a72b6f6c56f36dc6657d3133c747a59e8da8e6304c20f3229098f21e",
"bank_account_id": null,
"kyc_id": null,
"createdAt": "2014-06-12T07:43:17.572Z",
"updatedAt": "2014-06-12T00:44:05.786Z",
"external_id": null,
"data": null,
"uid": null,
"active": true
}
}
POST /v1/users/{:id}/deactivate
Mark a user an "inactive", which is a flag purely for informational purposes and has no explicit effect on the user's interaction with gatewayd.
RESPONSE:
{
"user": {
"id": 508,
"name": "steven@ripple.com",
"salt": "63a5f6fc48addb712ec8940ff591d742f57f0c4f7058d2040714bd260c4d93e0",
"federation_tag": null,
"admin": null,
"federation_name": null,
"password_hash": "86e3b615a72b6f6c56f36dc6657d3133c747a59e8da8e6304c20f3229098f21e",
"bank_account_id": null,
"kyc_id": null,
"createdAt": "2014-06-12T14:43:17.572Z",
"updatedAt": "2014-06-12T00:44:52.919Z",
"external_id": null,
"data": null,
"uid": null,
"active": false
}
}
POST /v1/deposits
Upon receipt of an asset from a user, record the asset in gatewayd's database with a "deposit" record, which creates an entry in the external transactions database table. By default a deposit is marked as "queued", and the gatewayd "deposit" process will take the queued deposit, apply fees, and enqueue a corresponding outbound ripple payment.
REQUEST:
{
"external_account_id": 307,
"currency": "BTC"
"amount": "10.7"
}
RESPONSE:
{
"deposit": {
"data": null,
"external_account_id": 307,
"currency": "BTC",
"amount": "10.7",
"deposit": true,
"status": "queued",
"updatedAt": "2014-06-12T00:46:02.080Z",
"createdAt": "2014-06-12T00:46:02.080Z",
"id": 1,
"ripple_transaction_id": null,
"uid": null
}
}
GET /v1/deposits
List all deposits that are currently queued, ie they have not been processed yet nor sent to ripple.
RESPONSE:
{
"deposits": [
{
"data": null,
"id": 1,
"amount": "10.7",
"currency": "BTC",
"deposit": true,
"external_account_id": 307,
"status": "queued",
"ripple_transaction_id": null,
"createdAt": "2014-06-12T00:46:02.080Z",
"updatedAt": "2014-06-12T00:46:02.080Z",
"uid": null
},
{
"data": null,
"id": 2,
"amount": "281.2",
"currency": "XAG",
"deposit": true,
"external_account_id": 307,
"status": "queued",
"ripple_transaction_id": null,
"createdAt": "2014-06-12T00:47:24.754Z",
"updatedAt": "2014-06-12T00:47:24.754Z",
"uid": null
}
]
}
GET /v1/payments/outgoing
Ripple transaction records that are marked as "outgoing" are picked up and sent to the ripple network. List Outoing Payments returns a list of the queued "outgoing" payments. All deposit records are eventually placed in the outgoing payments queue after fees are subtracted.
RESPONSE:
{
"payments": [
{
"data": null,
"id": 1,
"to_address_id": 647,
"from_address_id": 623,
"transaction_state": null,
"transaction_hash": null,
"to_amount": "10.593",
"to_currency": "BTC",
"to_issuer": "r4EwBWxrx5HxYRyisfGzMto3AT8FZiYdWk",
"from_amount": "10.593",
"from_currency": "BTC",
"from_issuer": "r4EwBWxrx5HxYRyisfGzMto3AT8FZiYdWk",
"createdAt": "2014-06-12T00:48:02.302Z",
"updatedAt": "2014-06-12T00:48:02.302Z",
"uid": null,
"client_resource_id": "false",
"state": "outgoing",
"external_transaction_id": 1
},
{
"data": null,
"id": 2,
"to_address_id": 647,
"from_address_id": 623,
"transaction_state": null,
"transaction_hash": null,
"to_amount": "278.388",
"to_currency": "XAG",
"to_issuer": "r4EwBWxrx5HxYRyisfGzMto3AT8FZiYdWk",
"from_amount": "278.388",
"from_currency": "XAG",
"from_issuer": "r4EwBWxrx5HxYRyisfGzMto3AT8FZiYdWk",
"createdAt": "2014-06-12T00:48:02.324Z",
"updatedAt": "2014-06-12T00:48:02.324Z",
"uid": null,
"client_resource_id": "false",
"state": "outgoing",
"external_transaction_id": 2
}
]
}
GET /v1/payments/failed
Outgoing payments are often rejected from ripple, such as when there is insufficient trust from the recipient account to the gateway account, or when the gateway hot wallet account has insufficient funds to process the payment. In the case that a payment will never make it into the ripple ledger the outgoing payment is marked as "failed".
RESPONSE:
{
"payments": [
{
"data": null,
"id": 2,
"to_address_id": 647,
"from_address_id": 623,
"transaction_state": null,
"transaction_hash": null,
"to_amount": "278.388",
"to_currency": "XAG",
"to_issuer": "r4EwBWxrx5HxYRyisfGzMto3AT8FZiYdWk",
"from_amount": "278.388",
"from_currency": "XAG",
"from_issuer": "r4EwBWxrx5HxYRyisfGzMto3AT8FZiYdWk",
"createdAt": "2014-07-28T02:48:02.324Z",
"updatedAt": "2014-06-13T00:38:03.086Z",
"uid": null,
"client_resource_id": "false",
"state": "failed",
"external_transaction_id": 2
},
{
"data": null,
"id": 3,
"to_address_id": 25,
"from_address_id": 623,
"transaction_state": null,
"transaction_hash": null,
"to_amount": "9899999999.01",
"to_currency": "XAG",
"to_issuer": "r4EwBWxrx5HxYRyisfGzMto3AT8FZiYdWk",
"from_amount": "9899999999.01",
"from_currency": "XAG",
"from_issuer": "r4EwBWxrx5HxYRyisfGzMto3AT8FZiYdWk",
"createdAt": "2014-06-16T12:37:39.985Z",
"updatedAt": "2014-06-13T00:38:04.184Z",
"uid": null,
"client_resource_id": "false",
"state": "failed",
"external_transaction_id": 3
}
]
}
POST /v1/payments/failed/{:id}/retry
A payment that failed due to insufficient funds or lack of trust lines may be successfully retried once funds are increased or an appropriate line of trust is established. Retrying a payment simply changes the payment's state from "failed" to "outgoing", effectively enqueueing the transaction to be re-submitted to ripple.
RESPONSE:
{
"payment": {
"data": null,
"id": 6,
"to_address_id": 1,
"from_address_id": 2,
"transaction_state": null,
"transaction_hash": null,
"to_amount": "100",
"to_currency": "XAG",
"to_issuer": "1",
"from_amount": "100",
"from_currency": "XAG",
"from_issuer": "1",
"createdAt": "2014-06-13T07:46:07.190Z",
"updatedAt": "2014-06-13T02:33:26.772Z",
"uid": null,
"client_resource_id": "false",
"state": "outgoing",
"external_transaction_id": null
}
}
GET /v1/payments/incoming
Gatewayd monitors the gateway's account for inbound payments made to the gateway, and records the payments in the Ripple Transactions database table. Newly recorded incoming ripple transactions are always marked as "incoming" until the gatewayd "withdrawals" process picks them up and, after applying fees, enqueues a withdrawal record in the external transactions table.
RESPONSE:
{
"incoming_payments": [
{
"data": null,
"id": 90,
"to_address_id": 0,
"from_address_id": 13,
"transaction_state": "tesSUCCESS",
"transaction_hash": "12AE1B1843D886D7D6783DA02AB5F43C32579212853CF3CEFD6DBDF29F03BC80",
"to_amount": "5.12",
"to_currency": "SWD",
"to_issuer": "rDNP5C7Vjt2mLushCmUPwm6dvwNzNiuND6",
"from_amount": "5.12",
"from_currency": "SWD",
"from_issuer": "rDNP5C7Vjt2mLushCmUPwm6dvwNzNiuND6",
"createdAt": "2014-06-12T19:59:52.642Z",
"updatedAt": "2014-06-12T19:59:52.642Z",
"uid": null,
"client_resource_id": "false",
"state": "incoming",
"external_transaction_id": null
}
]
}
GET /v1/withdrawals
To retrieve assets from the gateway a user sends funds back to the gateway's account. Once the incoming payment has been received and processed (fees subtracted) it is placed in the pending withdrawals queue, which is a list of external transaction withdrawal records with a state of "pending". If the gateway administrator has registered a withdrawal callback url, the withdrawal callbacks process will read withdrawals from this list and POST their data to the callback url provided.
RESPONSE:
{
"withdrawals": [
{
"data": null,
"id": 79,
"amount": "1001",
"currency": "SWD",
"deposit": false,
"external_account_id": 6,
"status": "queued",
"ripple_transaction_id": 80,
"createdAt": "2014-05-30T19:23:48.390Z",
"updatedAt": "2014-05-30T19:23:48.390Z",
"uid": null
},
{
"data": null,
"id": 84,
"amount": "8.5",
"currency": "SWD",
"deposit": false,
"external_account_id": 6,
"status": "queued",
"ripple_transaction_id": 85,
"createdAt": "2014-06-11T00:23:56.992Z",
"updatedAt": "2014-06-11T00:23:56.992Z",
"uid": null
}
]
}
POST /v1/withdrawals/{:id}/clear
A pending withdrawal record indicates to the gateway operator that a user wishes to withdraw a given asset. Once the operator processes the withdrawal by sending the asset to the user, mark the withdrawal as "cleared".
RESPONSE:
{
"withdrawal": {
"data": null,
"id": 84,
"amount": "8.5",
"currency": "SWD",
"deposit": false,
"external_account_id": 6,
"status": "cleared",
"ripple_transaction_id": 85,
"createdAt": "2014-06-11T00:23:56.992Z",
"updatedAt": "2014-06-12T20:01:29.663Z",
"uid": null
}
}
GET /v1/cleared
List all deposits and withdrawals that have been completed, ie are no longer pending.
RESPONSE:
{
"deposits": [
{
"data": null,
"id": 3,
"amount": "4.95",
"currency": "SWD",
"deposit": false,
"external_account_id": 1,
"status": "cleared",
"ripple_transaction_id": 3,
"createdAt": "2014-05-13T23:10:20.803Z",
"updatedAt": "2014-05-13T23:11:26.323Z",
"uid": null
},
{
"data": null,
"id": 5,
"amount": "2.9699999999999998",
"currency": "SWD",
"deposit": false,
"external_account_id": 1,
"status": "cleared",
"ripple_transaction_id": 5,
"createdAt": "2014-05-14T19:45:05.244Z",
"updatedAt": "2014-05-14T21:19:54.231Z",
"uid": null
}
]
}
GET /v1/balances
The hot wallet holds limited funds issued by the cold wallet, and the current balance thereof is represented as hot wallet balances.
RESPONSE:
{
"success": true,
"balances": [
{
"value": "29.999358",
"currency": "XRP",
"counterparty": ""
},
{
"value": "8776.3012",
"currency": "SWD",
"counterparty": "rDNP5C7Vjt2mLushCmUPwm6dvwNzNiuND6"
},
{
"value": "0",
"currency": "USD",
"counterparty": "rNoc7mZg54TkSd1mENAtEi65c9afYMBuTu"
}
]
}
GET /v1/liabilities
Every asset that the gateway holds and for which it issues currency is a liability of the gateway. Listed here are the total gateway liabilities for each asset type.
RESPONSE:
{
"success": true,
"balances": [
{
"value": "29.999985",
"currency": "XRP",
"counterparty": ""
},
{
"value": "-8776.3012",
"currency": "SWD",
"counterparty": "rEmFrbcZvNR9i2fkBkLxDzB4X85aB4qwyZ"
},
{
"value": "-63.1843",
"currency": "SWD",
"counterparty": "r4EwBWxrx5HxYRyisfGzMto3AT8FZiYdWk"
},
{
"value": "0",
"currency": "SWD",
"counterparty": "rNoc7mZg54TkSd1mENAtEi65c9afYMBuTu"
},
{
"value": "0",
"currency": "SWD",
"counterparty": "rwNJY1jnzXHCyfKRyCyVyt8UcSZfAo7z68"
},
{
"value": "0",
"currency": "SWD",
"counterparty": "raj7HbHuG4da8bm5eNA8dAD19t8Kj8G4NR"
}
]
}
POST /v1/users/login
Verifies that a user has the correct username and password combination. Used for the web application and requires user credentials in place of an API key.
GET /v1/users/{:id}
Return the database record for a given user.
RESPONSE:
{
"success": true,
"users": {
"id": 8,
"name": "steven@ripple.com",
"salt": "1366f14307850818afddd1509f329fdc1a73fb93919d92d5b44c91f07560c999",
"federation_tag": null,
"admin": null,
"federation_name": null,
"password_hash": "dd1d5a0ba63c63a117ff811f14040fa87dcbfedd7e37b5df506bfc4e8014c8e5",
"bank_account_id": null,
"kyc_id": null,
"createdAt": "2014-06-10T22:37:19.647Z",
"updatedAt": "2014-06-10T22:37:19.647Z",
"external_id": null,
"data": null,
"uid": null,
"active": false
}
}
GET /v1/users/{:id}/external_accounts
List all external account records for a given user.
RESPONSE:
{
"external_accounts": [
{
"data": null,
"id": 8,
"name": "default",
"user_id": 8,
"createdAt": "2014-06-10T22:37:19.835Z",
"updatedAt": "2014-06-10T22:37:19.835Z",
"uid": null
}
]
}
GET /v1/users/{:id}/external_transactions
List all external transaction records for a given user. Withdrawals and deposits are the two types of external transaction records.
RESPONSE:
{
"externalTransactions": [
{
"id": 80,
"currency": "SWD",
"amount": "1",
"deposit": true,
"ripple_transaction_id": 81,
"external_account_id": 8,
"status": "processed"
},
{
"id": 81,
"currency": "SWD",
"amount": "1.5999",
"deposit": true,
"ripple_transaction_id": 82,
"external_account_id": 8,
"status": "processed"
}
]
}
GET /v1/users/{:id}/ripple_addresses
List all ripple addresses for a given user. Most users will have at least one independent address and one hosted address.
RESPONSE:
{
"rippleAddresses": [
{
"data": null,
"id": 16,
"managed": false,
"address": "r4EwBWxrx5HxYRyisfGzMto3AT8FZiYdWk",
"type": "independent",
"user_id": 8,
"tag": null,
"secret": null,
"previous_transaction_hash": null,
"createdAt": "2014-06-10T22:37:19.825Z",
"updatedAt": "2014-06-10T22:37:19.825Z",
"uid": null
},
{
"data": null,
"id": 17,
"managed": true,
"address": "rDNP5C7Vjt2mLushCmUPwm6dvwNzNiuND6",
"type": "hosted",
"user_id": 8,
"tag": 8,
"secret": null,
"previous_transaction_hash": null,
"createdAt": "2014-06-10T22:37:19.844Z",
"updatedAt": "2014-06-10T22:37:19.844Z",
"uid": null
}
]
}
GET /v1/users/{:id}/ripple_transactions
List all ripple transactions for a given user, which represent transactions made to or from all of the users's ripple addresses.
RESPONSE:
{
"rippleTransactions": [
{
"address": "r4EwBWxrx5HxYRyisfGzMto3AT8FZiYdWk",
"tag": null,
"ripple_address_id": 16,
"id": 81,
"to_address_id": 16,
"from_address_id": 1,
"transaction_state": "tesSUCCESS",
"transaction_hash": "F0737576A4E7D064BF00145FAD6E6BAD19115C7739A3C8CDB6D1FD38888C8364",
"to_amount": "1",
"to_currency": "SWD",
"to_issuer": "rDNP5C7Vjt2mLushCmUPwm6dvwNzNiuND6",
"from_amount": "1",
"from_currency": "SWD",
"from_issuer": "rDNP5C7Vjt2mLushCmUPwm6dvwNzNiuND6",
"createdAt": "2014-06-10T22:41:14.258Z",
"updatedAt": "2014-06-10T22:41:16.717Z",
"uid": "505a336f-4ff9-473d-862b-164b3ad63b73",
"data": null,
"client_resource_id": "false",
"state": "succeeded",
"external_transaction_id": 80
},
{
"address": "r4EwBWxrx5HxYRyisfGzMto3AT8FZiYdWk",
"tag": null,
"ripple_address_id": 16,
"id": 82,
"to_address_id": 16,
"from_address_id": 1,
"transaction_state": "tesSUCCESS",
"transaction_hash": "7DEEF3BBAEEA3FEECF7819D3FAA53C580ED4A790A98DD2E761E8D747EAFB1969",
"to_amount": "1.5999",
"to_currency": "SWD",
"to_issuer": "rDNP5C7Vjt2mLushCmUPwm6dvwNzNiuND6",
"from_amount": "1.5999",
"from_currency": "SWD",
"from_issuer": "rDNP5C7Vjt2mLushCmUPwm6dvwNzNiuND6",
"createdAt": "2014-06-10T22:43:57.090Z",
"updatedAt": "2014-06-10T22:43:59.364Z",
"uid": "5205d9b4-f1c2-4273-b656-78e908e94210",
"data": null,
"client_resource_id": "false",
"state": "succeeded",
"external_transaction_id": 81
}
]
}
POST /v1/wallets/hot/fund
Issue funds from the cold wallet to the hot wallet, specifying the amount, currency, and the cold wallet secret key.
POST /v1/config/database
Set the database url for in gatewayd configuration.
GET /v1/config/database
Show the database url from the gatewayd configuration.
RESPONSE:
{
"DATABASE_URL": "postgres://postgres:password@localhost:5432/ripple_gateway"
}
POST /v1/config/ripple/rest
Set the ripple rest url in the gatewayd configuration.
GET /v1/config/ripple/rest
Show the ripple rest url from the gatewayd configuration.
RESPONSE:
{
"RIPPLE_REST_API": "http://localhost:5990/"
}
POST /v1/config/wallets/cold
Set the gateway cold wallet, from which funds are issued.
GET /v1/config/wallets/cold
Show the gatewayd cold wallet, from which funds are issued.
POST /v1/config/wallets/generate
Generate a random ripple address and secret key pair, which represents an unfunded ripple account.
POST /v1/config/wallets/cold
Set the gatewayd hot wallet, which is used to automatically send funds, and which maintains trust to and balances of the cold wallet.
POST /v1/config/wallets/cold
Show the gatewayd hot wallet, which is used to automatically send funds, and which maintains trust to and balances of the cold wallet.
POST /v1/trust
Set a line of trust from the gateway hot wallet to the gateway cold wallet. The line of trust represents the total amount of each asset that gatewayd can hold and automatically send out without a manual refunding by a gateway operator.
GET /v1/trust
List lines of trust from the gateway hot wallet to the gateway cold wallet. The line of trust represents the total amount of each asset that gatewayd can hold and automatically send out without a manual refunding by a gateway operator.
RESPONSE:
{
"lines": [
{
"account": "rDNP5C7Vjt2mLushCmUPwm6dvwNzNiuND6",
"balance": "8776.3012",
"currency": "SWD",
"limit": "10000",
"limit_peer": "0",
"quality_in": 0,
"quality_out": 0
}
]
}
POST /v1/wallets/hot/fund
Issue funds from the cold wallet to the hot wallet. The cold wallet secret is required.
POST /v1/config/last_payment_hash
Gatewayd polls the ripple network for notifications of inbound and outbound payments beginning with the last known transaction hash. Manually set that hash.
GET /v1/config/last_payment_hash
Gatewayd polls the ripple network for notifications of inbound and outbound payments beginning with the last known transaction hash. Returns that hash.
RESPONSE:
{
"LAST_PAYMENT_HASH": "12AE1B1843D886D7D6783DA02AB5F43C32579212853CF3CEFD6DBDF29F03BC80"
}
POST /v1/config/domain
Set the domain of the gateway, which is automatically added to the gateway's ripple.txt.
REQUEST:
{
"domain": "stevenzeiler.com"
}
RESPONSE:
{
"DOMAIN": "stevenzeiler.com"
}
GET /v1/config/domain
Show the domain of the gateway, which is shown in the gateway's ripple.txt.
RESPONSE:
{
"DOMAIN": "stroopgate.com"
}
POST /v1/config/key
Reset the gateway api key, which generates, saves, and returns a new api key.
REQUEST:
{
"key": "1234578dddd"
}
RESPONSE:
{
"KEY": "1234578dddd"
}
GET /v1/config/key
Show the current api key.
RESPONSE:
{
"KEY": "ebdb883d5723a71c59fb8ecefbb65476a6923f2a69b49b53cffe212c817cab92"
}
GET /v1/currencies
List currencies supported by the gateway, which are shown in the gateway's ripple.txt manifest file.
RESPONSE:
{
"CURRENCIES": {
"SWD": 10000
}
}
POST /v1/currencies
Add a currency to be supported by the gateway. This currency is shown in the gateway's ripple.txt manifest file.
REQUEST:
{
currency: "XAG"
}
RESPONSE:
{
"CURRENCIES": {
"SWD": 10000,
"XAG": 0
}
}
POST /v1/wallets/cold/refund
If a hot wallet is potentially compromised, send the remaining funds back to the cold wallet.
POST /v1/start
Start one or more gateway processes, including but not limited to "deposits", "outgoing", "incoming", "withdrawals", "callbacks", etc.
GET /v1/processes
List information about the currently-running gateway daemon processes.
RESPONSE:
[ { pid: 26269,
name: 'ripplerest',
pm2_env:
{ name: 'ripplerest',
exec_mode: 'cluster_mode',
exec_interpreter: 'node',
env: [Object],
pm_exec_path: '/home/ubuntu/ripple-rest/server.js',
pm_out_log_path: '/home/ubuntu/.pm2/logs/ripplerest-out-0.log',
pm_err_log_path: '/home/ubuntu/.pm2/logs/ripplerest-err-0.log',
pm_pid_path: '/home/ubuntu/.pm2/pids/ripplerest.pid',
LESSOPEN: '| /usr/bin/lesspipe %s',
MAIL: '/var/mail/ubuntu',
SSH_CLIENT: '208.90.215.186 61957 22',
USER: 'ubuntu',
DATABASE_URL: 'postgres://postgres:password@localhost:5432/ripple_gateway',
SHLVL: '1',
HOME: '/home/ubuntu',
OLDPWD: '/home/ubuntu/gatewayd',
SSH_TTY: '/dev/pts/0',
LOGNAME: 'ubuntu',
_: '/usr/bin/pm2',
TERM: 'xterm-256color',
PATH: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games',
LANG: 'en_US.UTF-8',
LS_COLORS: 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:',
SHELL: '/bin/bash',
NODE_PATH: '/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript',
LESSCLOSE: '/usr/bin/lesspipe %s %s',
PWD: '/home/ubuntu/ripple-rest',
SSH_CONNECTION: '208.90.215.186 61957 10.151.118.93 22',
pm_cwd: '/home/ubuntu/ripple-rest',
pm_id: 0,
restart_time: 0,
unstable_restarts: 0,
created_at: 1402602962147,
pm_uptime: 1402602962147,
status: 'online' },
pm_id: 0,
monit: { memory: 142966784, cpu: 4 } },
{ pid: 27633,
name: 'deposits',
pm2_env:
{ name: 'deposits',
cron_restart: '0 * * * *',
exec_mode: 'cluster_mode',
exec_interpreter: 'node',
env: [Object],
pm_exec_path: '/home/ubuntu/gatewayd/processes/deposits.js',
pm_out_log_path: '/home/ubuntu/.pm2/logs/deposits-out-1.log',
pm_err_log_path: '/home/ubuntu/.pm2/logs/deposits-err-1.log',
pm_pid_path: '/home/ubuntu/.pm2/pids/deposits.pid',
LESSOPEN: '| /usr/bin/lesspipe %s',
MAIL: '/var/mail/ubuntu',
SSH_CLIENT: '208.90.215.186 61957 22',
USER: 'ubuntu',
DATABASE_URL: 'postgres://postgres:password@localhost:5432/ripple_gateway',
SHLVL: '1',
HOME: '/home/ubuntu',
OLDPWD: '/home/ubuntu/ripple-rest',
SSH_TTY: '/dev/pts/0',
LOGNAME: 'ubuntu',
_: 'bin/gateway',
TERM: 'xterm-256color',
PATH: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games',
LANG: 'en_US.UTF-8',
LS_COLORS: 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:',
SHELL: '/bin/bash',
NODE_PATH: '/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript',
LESSCLOSE: '/usr/bin/lesspipe %s %s',
PWD: '/home/ubuntu/gatewayd',
SSH_CONNECTION: '208.90.215.186 61957 10.151.118.93 22',
pm_cwd: '/home/ubuntu/gatewayd',
pm_id: 1,
restart_time: 1,
unstable_restarts: 0,
created_at: 1402602983124,
pm_uptime: 1402603201351,
status: 'online' },
pm_id: 1,
monit: { memory: 78327808, cpu: 0 } },
{ pid: 27628,
name: 'outgoing',
pm2_env:
{ name: 'outgoing',
cron_restart: '0 * * * *',
exec_mode: 'cluster_mode',
exec_interpreter: 'node',
env: [Object],
pm_exec_path: '/home/ubuntu/gatewayd/processes/outgoing.js',
pm_out_log_path: '/home/ubuntu/.pm2/logs/outgoing-out-2.log',
pm_err_log_path: '/home/ubuntu/.pm2/logs/outgoing-err-2.log',
pm_pid_path: '/home/ubuntu/.pm2/pids/outgoing.pid',
LESSOPEN: '| /usr/bin/lesspipe %s',
MAIL: '/var/mail/ubuntu',
SSH_CLIENT: '208.90.215.186 61957 22',
USER: 'ubuntu',
DATABASE_URL: 'postgres://postgres:password@localhost:5432/ripple_gateway',
SHLVL: '1',
HOME: '/home/ubuntu',
OLDPWD: '/home/ubuntu/ripple-rest',
SSH_TTY: '/dev/pts/0',
LOGNAME: 'ubuntu',
_: 'bin/gateway',
TERM: 'xterm-256color',
PATH: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games',
LANG: 'en_US.UTF-8',
LS_COLORS: 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:',
SHELL: '/bin/bash',
NODE_PATH: '/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript',
LESSCLOSE: '/usr/bin/lesspipe %s %s',
PWD: '/home/ubuntu/gatewayd',
SSH_CONNECTION: '208.90.215.186 61957 10.151.118.93 22',
pm_cwd: '/home/ubuntu/gatewayd',
pm_id: 2,
restart_time: 1,
unstable_restarts: 0,
created_at: 1402602985180,
pm_uptime: 1402603200575,
status: 'online' },
pm_id: 2,
monit: { memory: 79495168, cpu: 1 } },
{ pid: 27621,
name: 'incoming',
pm2_env:
{ name: 'incoming',
cron_restart: '0 * * * *',
exec_mode: 'cluster_mode',
exec_interpreter: 'node',
env: [Object],
pm_exec_path: '/home/ubuntu/gatewayd/processes/incoming.js',
pm_out_log_path: '/home/ubuntu/.pm2/logs/incoming-out-3.log',
pm_err_log_path: '/home/ubuntu/.pm2/logs/incoming-err-3.log',
pm_pid_path: '/home/ubuntu/.pm2/pids/incoming.pid',
LESSOPEN: '| /usr/bin/lesspipe %s',
MAIL: '/var/mail/ubuntu',
SSH_CLIENT: '208.90.215.186 61957 22',
USER: 'ubuntu',
DATABASE_URL: 'postgres://postgres:password@localhost:5432/ripple_gateway',
SHLVL: '1',
HOME: '/home/ubuntu',
OLDPWD: '/home/ubuntu/ripple-rest',
SSH_TTY: '/dev/pts/0',
LOGNAME: 'ubuntu',
_: 'bin/gateway',
TERM: 'xterm-256color',
PATH: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games',
LANG: 'en_US.UTF-8',
LS_COLORS: 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:',
SHELL: '/bin/bash',
NODE_PATH: '/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript',
LESSCLOSE: '/usr/bin/lesspipe %s %s',
PWD: '/home/ubuntu/gatewayd',
SSH_CONNECTION: '208.90.215.186 61957 10.151.118.93 22',
pm_cwd: '/home/ubuntu/gatewayd',
pm_id: 3,
restart_time: 1,
unstable_restarts: 0,
created_at: 1402602985949,
pm_uptime: 1402603200180,
status: 'online' },
pm_id: 3,
monit: { memory: 79024128, cpu: 0 } },
{ pid: 29812,
name: 'server',
pm2_env:
{ name: 'server',
cron_restart: '0 * * * *',
exec_mode: 'cluster_mode',
exec_interpreter: 'node',
env: [Object],
pm_exec_path: '/home/ubuntu/gatewayd/processes/server.js',
pm_out_log_path: '/home/ubuntu/.pm2/logs/server-out-4.log',
pm_err_log_path: '/home/ubuntu/.pm2/logs/server-err-4.log',
pm_pid_path: '/home/ubuntu/.pm2/pids/server.pid',
LESSOPEN: '| /usr/bin/lesspipe %s',
MAIL: '/var/mail/ubuntu',
SSH_CLIENT: '208.90.215.186 61957 22',
USER: 'ubuntu',
DATABASE_URL: 'postgres://postgres:password@localhost:5432/ripple_gateway',
SHLVL: '1',
HOME: '/home/ubuntu',
OLDPWD: '/home/ubuntu/ripple-rest',
SSH_TTY: '/dev/pts/0',
LOGNAME: 'ubuntu',
_: 'bin/gateway',
TERM: 'xterm-256color',
PATH: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games',
LANG: 'en_US.UTF-8',
LS_COLORS: 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:',
SHELL: '/bin/bash',
NODE_PATH: '/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript',
LESSCLOSE: '/usr/bin/lesspipe %s %s',
PWD: '/home/ubuntu/gatewayd',
SSH_CONNECTION: '208.90.215.186 61957 10.151.118.93 22',
pm_cwd: '/home/ubuntu/gatewayd',
pm_id: 4,
restart_time: 2,
unstable_restarts: 0,
created_at: 1402602986623,
pm_uptime: 1402603773423,
status: 'online' },
pm_id: 4,
monit: { memory: 78049280, cpu: 0 } },
{ pid: 0,
name: 'withdrawals',
pm2_env:
{ name: 'withdrawals',
cron_restart: '0 * * * *',
exec_mode: 'cluster_mode',
exec_interpreter: 'node',
env: [Object],
pm_exec_path: '/home/ubuntu/gatewayd/processes/withdrawals.js',
pm_out_log_path: '/home/ubuntu/.pm2/logs/withdrawals-out-5.log',
pm_err_log_path: '/home/ubuntu/.pm2/logs/withdrawals-err-5.log',
pm_pid_path: '/home/ubuntu/.pm2/pids/withdrawals.pid',
LESSOPEN: '| /usr/bin/lesspipe %s',
MAIL: '/var/mail/ubuntu',
SSH_CLIENT: '208.90.215.186 61957 22',
USER: 'ubuntu',
DATABASE_URL: 'postgres://postgres:password@localhost:5432/ripple_gateway',
SHLVL: '1',
HOME: '/home/ubuntu',
OLDPWD: '/home/ubuntu/ripple-rest',
SSH_TTY: '/dev/pts/0',
LOGNAME: 'ubuntu',
_: 'bin/gateway',
TERM: 'xterm-256color',
PATH: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games',
LANG: 'en_US.UTF-8',
LS_COLORS: 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:',
SHELL: '/bin/bash',
NODE_PATH: '/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript',
LESSCLOSE: '/usr/bin/lesspipe %s %s',
PWD: '/home/ubuntu/gatewayd',
SSH_CONNECTION: '208.90.215.186 61957 10.151.118.93 22',
pm_cwd: '/home/ubuntu/gatewayd',
pm_id: 5,
restart_time: 0,
unstable_restarts: 0,
created_at: 1402602987366,
pm_uptime: 1402602987366,
status: 'stopped' },
pm_id: 5,
monit: { memory: 0, cpu: 0 } } ]
Usage: bin/gateway [options] [command]
Commands:
register_user <username> <password> <ripple_address> create a user with a ripple address
list_users list registered users
record_deposit <amount> <currency> <external_account_id> record a deposit in the deposit processing queue
list_deposits list deposits in the deposit processing queue
list_outgoing_payments list the outgoing ripple payments.
list_incoming_payments list unprocesses incoming ripple payments
list_withdrawals get pending withdrawals to external accounts
clear_withdrawal <external_transaction_id> clear pending withdrawal to external account
generate_wallet generate a random ripple wallet
set_hot_wallet <address> <secret> set the gateway hot wallet
get_hot_wallet get the address of the gateway hot wallet
get_hot_wallet_secret get the secret of the gateway hot wallet
fund_hot_wallet <amount> <currency> issue funds from cold wallet to hot wallet
set_cold_wallet <account> set the gateway hot wallet
get_cold_wallet get the gateway cold wallet
refund_cold_wallet <amount> <currency> send back funds from the hot wallet to cold wallet
set_trust <amount> <currency> set level of trust from hot to cold wallet
get_trust_lines get the trust lines from hot wallet to cold wallet
list_currencies List all currencies supported by the gateway
add_currency <currency> add support for a currency
remove_currency <currency> remove support for a currency
set_domain <domain> set the domain name of the gateway
get_domain get the domain name of the gateway
set_postgres_url <url> set the url of the postgres database
get_postgres_url get the url of the postgres database
set_ripple_rest_url <url> set the url of the ripple rest api
get_ripple_rest_url get the url of the ripple rest api
set_key set the admin api key
get_key get the admin api key
set_last_payment_hash <hash> set the last encountered payment hash for incoming processing.
get_last_payment_hash get the last encountered payment hash for incoming processing.
Options:
-h, --help output usage information
The Ripple Gateway software is composed of a backed data store which serves as a queue for many types of processes that handle deposits and withdrawals of assets, and issuance and receipt of digital currency on ripple. In this post I will explain the various processes of a ripple gateway that together form an automated machine of gateway transaction processing.
In the diagram above each process is represented by a circle, and should be designed to scale horizontally, that is enable N processes of each type all operating on the same queues. Queues, represented by rectangles are actually SQL database tables maintained by the gateway data store.
- Process 1: Recording Deposits
A banking API integration or manual human gateway operator receives the deposit of an asset and records the deposit in the ripple gateway data store. This process is designed to be implemented externally, and example implementations are provided by the command line interface and the http/json express.js server.
API calls: record_deposit
- Process 2: Deposit Business Logic
A newly recorded deposit is handed to the business logic, which performs some function, ultimately en-queuing a corresponding ripple payment. This process is designed to be modified and customized.
node processes/deposits.js
API calls: list_deposits, enqueue_payment
- Process 3: Send Outgoing Ripple Payments
A payment record resulting from the deposit business logic process is sent to the Ripple REST server, ultimately propagating to the network. This process is standard and should not be modified.
node processes/outgoing.js
API calls: send_payment
- Process 1: Record inbound Ripple payments
Poll the Ripple REST server for new payment notifications to the gateway, and record the incoming payments in the ripple gateway data store. This process is standard and should not be modified.
node processes/incoming.js
API calls: get_payment_notification, record_payment
- Process 2: Withdrawal Business Logic
A newly recorded incoming ripple payment is handed to the business logic, which performs some function, ultimately en-queuing a corresponding asset withdrawal record. This process is designed to be modified and customized.
node processes/withdrawals.js
API calls: enqueue_withdrawal
- Process 3: Clear Withdrawals
A banking API integration or manual human gateway operator reads the queue of pending withdrawals from the gateway data store, redeems the corresponding asset, and finally clears the withdrawal from the queue by updating the gateway data store. This process is designed to be implemented externally, and example implementations are provided by the command line interface and the http/json express.js server.
API calls: list_withdrawals, clear_withdrawal
Alternatively one can provide a WITHDRAWALS_CALLBACK_URL in the configuration, and then start the withdrawal_callbacks process to receive POST notifications whenever a new withdrawal comes in the gateway from the Ripple network. This process is currently not starte by default.