<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://betaardordocs.jelurida.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Petko</id>
	<title>ArdorDocs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://betaardordocs.jelurida.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Petko"/>
	<link rel="alternate" type="text/html" href="https://betaardordocs.jelurida.com/Special:Contributions/Petko"/>
	<updated>2026-05-14T19:04:54Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://betaardordocs.jelurida.com/index.php?title=Getting_started&amp;diff=13051</id>
		<title>Getting started</title>
		<link rel="alternate" type="text/html" href="https://betaardordocs.jelurida.com/index.php?title=Getting_started&amp;diff=13051"/>
		<updated>2026-05-14T17:33:17Z</updated>

		<summary type="html">&lt;p&gt;Petko: Removed link to https://www.ardor.world/faucet_ardor/ and substituted the link to https://ardorforum.org/ with https://talk.jelurida.com/t/ardor-tesnet-tokens/1325&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:&lt;br /&gt;
|title=Getting started&lt;br /&gt;
|titlemode=replace&lt;br /&gt;
|keywords=ardor learning hub, ardor documentation, blockchain, proof of stake, ardor, ignis, jelurida, development, ardor wiki, wiki&lt;br /&gt;
|description=Ardor documentation homepage - Getting started with the Ardor platform&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;languages /&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
[https://www.jelurida.com/ardor Ardor] is a blockchain-as-a-service multi-chain platform that evolved from the time-tested and energy-efficient [https://www.jelurida.com/nxt Nxt blockchain]. The Ardor mainnet launched on 01 January 2018. Through this documentation, you will learn all about the extensive capabilities of the Ardor platform. Begin developing your knowledge by reading about each of Ardor’s distinctive [[Features]] or consider trying the technology yourself by following some [[Basic tutorials|Basic Tutorials]]. For developers, documentation is provided for each of Ardor’s more than 250 [[API|APIs]] that can be used to quickly and cost-effectively deploy dApps and smart contracts that integrate your business processes with the Ardor blockchain. Check this site regularly for new content and updates as additional features are released. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Download Ardor== &amp;lt;!--T:32--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:33--&amp;gt;&lt;br /&gt;
Before we begin, if you haven’t already done so, you may wish to check that you have the correct (usually most recent) version of [https://adoptopenjdk.net/ Java] installed on your computer. You can use any compatible Java available for your platform. The minimum required version is Java 8. The recommended version is Java 11. We usually test with OpenJDK 14.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:34--&amp;gt;&lt;br /&gt;
To start with Ardor/[https://www.jelurida.com/ignis Ignis], you must first download the client, also known as a &amp;quot;wallet&amp;quot;, on your machine. The client is distributed as a binary package for the following platforms:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:35--&amp;gt;&lt;br /&gt;
[[File:200px-Windowslogo.jpg|100px|frameless|link=Getting_started#Windows]][[File:200px-AppleLogo.jpg|100px|frameless|link=Getting_started#MacOS]][[File:200px-Linuxlogo.jpg|130px|frameless|link=Getting_started#Linux]][[File:200px-RaspberryPi_Logo.png|100px|frameless|link=Getting_started#Raspberry_Pi]][[File:200px-Android.png|100px|frameless|link=Getting_started#Android]]&lt;br /&gt;
&lt;br /&gt;
==Client Installation == &amp;lt;!--T:36--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:37--&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accordion&amp;quot; id=&amp;quot;accordion-win&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;accordion parent=&amp;quot;accordion-win&amp;quot; heading=&amp;quot;===Windows===&amp;quot;&amp;gt;&lt;br /&gt;
#Download the Windows installer for the latest official Ardor Client {{NRSVersion}} from {{NRSWinInstaller}}. If you want to test the latest testnet-only version {{NRSVersionExperimental}} that includes the snapshotting and pruning functionality, refer to the Universal Zip Package.&lt;br /&gt;
#Ardor&#039;s Windows client comes as an .exe file. After downloading it, you can verify its integrity by performing an [[Faq#How_to_verify_authenticity_of_Ardor_installations|integrity check]]&lt;br /&gt;
#Run the installer and follow the instructions on the screen. Note that you can select either the testnet or mainnet during installation, if further details are needed please follow the [[How_to_download_the_ardor_client_wallet|step-by-step guide]]. Once installed icons will be created by default in your desktop and Start Menu.&lt;br /&gt;
#You can now run the Ardor software by clicking on the Ardor icon. After a few seconds, the Ardor wallet will open in its own window.&lt;br /&gt;
#If you already have created an Ardor account, click on &#039;Returning User&#039; to introduce your passphrase. If you need to create your Ardor account, [[How_to_create_an_account_on_the_Ardor_Platform|click here for instructions to Create a New Ardor Account]].&lt;br /&gt;
&amp;lt;/accordion&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:38--&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accordion&amp;quot; id=&amp;quot;accordion-mac&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;accordion parent=&amp;quot;accordion-mac&amp;quot; heading=&amp;quot;===MacOS===&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:39--&amp;gt;&lt;br /&gt;
====Install and run the Ardor Client====&lt;br /&gt;
#Download the latest client version {{NRSVersion}} from or {{NRSDownload}} the experimental {{NRSVersionExperimental}} from {{NRSExperimentalDownload}}.&lt;br /&gt;
#Download the signature from https://www.jelurida.com/ardor-client.zip.asc (https://www.jelurida.com/ardor-client-experimental.zip.asc for the experimental version) to the same directory where the zip was downloaded. To verify the signature, open a terminal, navigate to the downloads directory and run the command&amp;lt;/br&amp;gt;&amp;lt;code&amp;gt;gpg --with-fingerprint ardor-client.zip.asc&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
##In case of error that the gpg command is not found, install GnuPG:&lt;br /&gt;
###&amp;lt;code&amp;gt;brew install gpg&amp;lt;/code&amp;gt;&lt;br /&gt;
###If brew is missing, follow the instructions at https://brew.sh to install it first.&lt;br /&gt;
##In case of error &amp;lt;code&amp;gt;gpg: Can&#039;t check signature: No public key&amp;lt;/code&amp;gt;:&lt;br /&gt;
###Download the Jelurida GPG key from https://www.jelurida.com/sites/default/files/jelurida.gpg&lt;br /&gt;
###Import it to GnuPG:&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;gpg --import jelurida.gpg&amp;lt;/code&amp;gt;&lt;br /&gt;
#Unzip &amp;lt;code&amp;gt;ardor-client.zip&amp;lt;/code&amp;gt; to a directory of your choice.&lt;br /&gt;
#Start Ardor by executing the file &amp;lt;code&amp;gt;ArdorMacOS.command&amp;lt;/code&amp;gt;. A terminal window will open and an Ardor icon will appear in the status menu.&lt;br /&gt;
====Common problems====&lt;br /&gt;
* In case an error &amp;lt;code&amp;gt;Unable to locate a Java Runtime&amp;lt;/code&amp;gt; is displayed in the terminal window, follow the instructions and install Java from http://www.java.com&lt;br /&gt;
* At first run Ardor may need about a minute to initialize the database. Messages like &amp;quot;Loading public keys&amp;quot; are displayed in the terminal. Wait for the initialization to complete and do not close the window.&lt;br /&gt;
* If the Desktop Application is inaccessible (the &amp;quot;Show Desktop Application&amp;quot; button is disabled in the status menu), it&#039;s likely due to missing JFX libraries in the Java installation. It&#039;s recommended to use the &amp;quot;Open Wallet in Browser&amp;quot; option from the menu instead. Alternatively, you can download JFX from https://openjfx.io/ and extract it into a directory named &amp;lt;code&amp;gt;javafx-sdk&amp;lt;/code&amp;gt; under the directory where Ardor was extracted in step 3.&lt;br /&gt;
====Deprecated instructions for using the installer in older Ardor versions====&lt;br /&gt;
#Download the Mac installer for the latest official Ardor Client  {{NRSVersion}} from {{NRSMacInstaller}}. After downloading, [[Faq#How_to_verify_authenticity_of_Ardor_installations|verify its signature]]. After downloading, check the SHA256 hash of the package for security. If you want to test the latest testnet-only version {{NRSVersionExperimental}} that includes the snapshotting and pruning functionality, refer to the Universal Zip Package.&lt;br /&gt;
#Open the MacOS terminal.&lt;br /&gt;
#Navigate to the Mac installer you just have downloaded.&lt;br /&gt;
#Execute the command &amp;lt;code&amp;gt;sudo xattr -c ardor-installer-{{NRSVersion}}.dmg&amp;lt;/code&amp;gt;. Type your passphrase&lt;br /&gt;
#Run the installer package (Ardor&#039;s Mac installer comes packaged in .dmg format) and follow the instructions on screen &lt;br /&gt;
## Select the language [[File:MacInstaller_2.png|none|border|400px]]&lt;br /&gt;
## Click on &#039;Next&#039; to begin with the installation [[File:MacInstaller_3.png|none|border|400px]]&lt;br /&gt;
## Accept the terms of the license agreement [[File:MacInstaller_4.png|none|border|400px]]&lt;br /&gt;
## Select the installation path [[File:MacInstaller_5.png|none|border|400px]]&lt;br /&gt;
## Select the packages you want to install [[File:MacInstaller_6.png|none|border|400px]]&lt;br /&gt;
## Check the options [[Tutorial_on_setting_up_the_ardor_testnet|See the tutorial for setting up the Ardor testnet]] [[File:MacInstaller_7.png|none|border|400px]]&lt;br /&gt;
## Once installed, click on finish [[File:MacInstaller_9.png|none|border|400px]]&lt;br /&gt;
#You can now run the Ardor software clicking on the &amp;quot;ardor.app&amp;quot; in Applications. If you already have created a Ardor account, click in &#039;Returning User&#039; to introduce your passphrase. If you need to create your Ardor account, [[How_to_create_an_account_on_the_Ardor_Platform|click here for instructions to Create a New Ardor Account]].&lt;br /&gt;
&amp;lt;/accordion&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:40--&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accordion&amp;quot; id=&amp;quot;accordion-linux&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;accordion parent=&amp;quot;accordion-linux&amp;quot; heading=&amp;quot;===Linux===&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:41--&amp;gt;&lt;br /&gt;
Here is the guide to installing the Ardor Client on a Linux 64-bit platform. 32-bit installation instructions are very similar; you just might need to download the 32-bit version of Java instead of the 64-bit one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
You can use these instructions on your Linux VPS as well.&lt;br /&gt;
&lt;br /&gt;
====Set up Java==== &amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
You can skip this step if you already have Java installed. Otherwise, you can install it via your distribution repository doing the following (for Ubuntu/Debian builds):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:42--&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt update &lt;br /&gt;
sudo apt install openjdk-11-jre-headless&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:87--&amp;gt;&lt;br /&gt;
You can also use `openjdk-8-jre-headless` or any other Java 8+ compatible version.&lt;br /&gt;
&lt;br /&gt;
====Install and run the Ardor Client==== &amp;lt;!--T:14--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Using the Unix installer===== &amp;lt;!--T:88--&amp;gt;&lt;br /&gt;
You can execute the Unix installer executable compatible with most Linux distributions from [https://www.jelurida.com/ardor-client.sh ardor-client.sh] and follow the instructions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:89--&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://www.jelurida.com/ardor-client.sh&lt;br /&gt;
sh ardor-client.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Using the Universal Zip Package===== &amp;lt;!--T:90--&amp;gt;&lt;br /&gt;
You can follow the more generic instructions as explained below:&lt;br /&gt;
#Change to your home folder and download the latest client (version {{NRSVersion}} or the experimental {{NRSVersionExperimental}}):&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;wget {{NRSDownload}}&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;wget https://www.jelurida.com/ardor-client.zip.asc&amp;lt;/code&amp;gt; and verify that the signature is correct: &amp;lt;code&amp;gt;gpg --with-fingerprint ardor-client.zip.asc&amp;lt;/code&amp;gt;&lt;br /&gt;
#Unzip it:&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;unzip ardor-client.zip&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;cd ardor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Using the experimental version is as follows: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;wget {{NRSExperimentalDownload}}&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;wget https://www.jelurida.com/ardor-client-experimental.zip.asc&amp;lt;/code&amp;gt; and verify that the signature is correct: &amp;lt;code&amp;gt;gpg --with-fingerprint ardor-client-experimental.zip.asc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Run the Ardor client===== &amp;lt;!--T:92--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:93--&amp;gt;&lt;br /&gt;
#Now it&#039;s time to start the software. You may start it by executing &amp;lt;code&amp;gt;./run.sh&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;./run.sh --daemon&amp;lt;/code&amp;gt; for running the Ardor node in the background, which you will find in the ardor directory. The server will be active as soon as you see in the window a text similar to this: &amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;Ardor server {{NRSVersion}} started successfully.&amp;lt;/code&amp;gt; This shell window will be running the Ardor server and print all the Ardor log messages, so it needs to stay running!&amp;lt;br /&amp;gt;&lt;br /&gt;
#Open http://localhost:27876/ from a web browser to access the Ardor Client. Please note that, if it&#039;s the first time you run Ardor in your machine, the Ardor blockchain will need to be downloaded until it is up to date. Depending on your network connection speed, this may take a few hours. The Ardor Client will show you a progress bar as the blockchain downloads. Now you can visit the [[How_to_create_an_account_on_the_Ardor_Platform|click here for instructions to Create a New Ardor Account]].&lt;br /&gt;
#*NOTE: If you&#039;ve installed the client on a dedicated server or VPS, you should change &amp;quot;localhost&amp;quot; to your Server/VPS IP.&lt;br /&gt;
&amp;lt;/accordion&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:43--&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accordion&amp;quot; id=&amp;quot;accordion-pi&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;accordion parent=&amp;quot;accordion-pi&amp;quot; heading=&amp;quot;===Raspberry Pi===&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:44--&amp;gt;&lt;br /&gt;
For installing the Ardor client on a Raspberry pi, you can refer to the description of [https://medium.com/@mrv_89306/solar-powered-ardor-blockchain-node-aa680a976c50 an implementation with the Ardor client powered by solar panels]&lt;br /&gt;
&amp;lt;/accordion&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:45--&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accordion&amp;quot; id=&amp;quot;accordion-android&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;accordion parent=&amp;quot;accordion-android&amp;quot; heading=&amp;quot;===Android===&amp;quot;&amp;gt;&lt;br /&gt;
Click on the [[Android_Full_Node|Android Full Node installation guide]] and follow the instructions.&lt;br /&gt;
&amp;lt;/accordion&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accordion&amp;quot; id=&amp;quot;accordion-docker&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;accordion parent=&amp;quot;accordion-docker&amp;quot; heading=&amp;quot;===Docker Image===&amp;quot;&amp;gt;&lt;br /&gt;
There is an Ardor Node Docker image available in the Docker Hub: [https://hub.docker.com/r/jeluridaswiss/ardor Ardor Docker Image]. Deploying this image requires knowledge about docker and management of containers. Please refer to the tutorial [[Deploying_the_Ardor_Node_Docker_Image|Deploying the Ardor Node Docker Image]]&lt;br /&gt;
&amp;lt;/accordion&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Need help?&#039;&#039;&#039;=== &amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
Need help during the download or development process? Contact us on the [https://talk.jelurida.com Ardor &amp;amp; Nxt Technical forum], and take a look at the [[Faq|FAQ]]. You can also reach us by opening a ticket in our [https://desk.zoho.eu/portal/jelurida/home helpdesk]&lt;br /&gt;
&lt;br /&gt;
==Lightweight Contracts documentation== &amp;lt;!--T:97--&amp;gt;&lt;br /&gt;
Lightweight Contracts represent a framework for developing a layer of automation on top of the existing Ardor APIs, refer to the official documentation to read more about this feature:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:98--&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;noprint&amp;quot; style=&amp;quot;float:none; border:1px solid black;width:95%;background-color:#F6F0F0;padding:2px;&amp;quot;&amp;gt;&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot;| &#039;&#039;&#039;[[Lightweight_Contracts|Lightweight Contracts documentation]]&#039;&#039;&#039; &lt;br /&gt;
|}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Login to Ardor== &amp;lt;!--T:99--&amp;gt;&lt;br /&gt;
There are different ways to log in to Ardor to create an account. It is explained in the [[Login_Page_Tutorial|Login Page Tutorial]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Getting your first ARDR== &amp;lt;!--T:76--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:77--&amp;gt;&lt;br /&gt;
With the Ardor client installed, it is now time to start transacting. To do that, we need to get some tokens, be it ARDR, IGNIS, or any other child chain. The Ardor mainnet is live and actual tokens are in circulation across numerous major exchanges. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:78--&amp;gt;&lt;br /&gt;
Note the tokens we will be using in the next examples are from testnet. These tokens are not traded in exchanges and have no monetary value -- they exist only as a convenience for developers and those willing to experiment with the features.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:79--&amp;gt;&lt;br /&gt;
To receive testnet tokens, ask for them in the [https://talk.jelurida.com/t/ardor-tesnet-tokens/1325 forum] or contact us on the [https://ardornxt.slack.com slack] channel #helpdesk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exchanges === &amp;lt;!--T:80--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:81--&amp;gt;&lt;br /&gt;
* [https://www.jelurida.com/ardor/explorers Currently trading ARDR]   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Next steps== &amp;lt;!--T:82--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:83--&amp;gt;&lt;br /&gt;
Learn how to use the Ardor platform by following the [[Basic_tutorials|basic tutorials]] or start reading about Ardor&#039;s extensive built-in [[Features]].&lt;br /&gt;
&lt;br /&gt;
=== Staking === &amp;lt;!--T:94--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:95--&amp;gt;&lt;br /&gt;
The process of staking in Ardor is called [[Forging_(f)|Forging]]. Once you have more than 1.000 ARDR you can start forging, thus earning the transaction fees when a block is generated by your node. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:96--&amp;gt;&lt;br /&gt;
Furthermore, you can also opt-in the [[Node_Reward_Program|Node Reward Program]] by just setting up a node with both the API and peer ports open to the Internet and a public and static IP address.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Feedback and errors== &amp;lt;!--T:84--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:85--&amp;gt;&lt;br /&gt;
If an error in this documentation is found, we would love to be aware to correct it as soon as possible. Please write a question to [mailto:info@jelurida.com info@jelurida.com] and we will take care.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:86--&amp;gt;&lt;br /&gt;
&amp;lt;accordion parent=&amp;quot;accordion&amp;quot; heading=&amp;quot;Latest documentation changes and updates&amp;quot;&amp;gt;&lt;br /&gt;
{{Special:SimpleChanges/days=150,limit=100,bots,hideminor,namespace=0}}&lt;br /&gt;
&amp;lt;/accordion&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;/div&gt;</summary>
		<author><name>Petko</name></author>
	</entry>
	<entry>
		<id>https://betaardordocs.jelurida.com/index.php?title=Exchange_Integration_of_Assets&amp;diff=12783</id>
		<title>Exchange Integration of Assets</title>
		<link rel="alternate" type="text/html" href="https://betaardordocs.jelurida.com/index.php?title=Exchange_Integration_of_Assets&amp;diff=12783"/>
		<updated>2021-01-12T07:40:20Z</updated>

		<summary type="html">&lt;p&gt;Petko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages /&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
{{#seo:&lt;br /&gt;
|title=Exchange Integration of Assets&lt;br /&gt;
|titlemode=replace&lt;br /&gt;
|keywords=ardor learning hub, ardor documentation, blockchain, proof of stake, ardor, ignis, jelurida, development, ardor wiki, wiki, tutorials, advanced tutorials, how to, Exchange Integration of Assets, Asset exchange&lt;br /&gt;
|description=Guide that explains how to integrate Ignis Assets into a centralized exchange&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Advanced_guides]]&lt;br /&gt;
__TOC__&lt;br /&gt;
==Introduction== &amp;lt;!--T:1--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
The following page explains how to integrate  [[Asset_exchange#Accessing_the_Asset_Exchange|Assets token]], the tokens of the Asset Exchange, into a crypto-currency exchange. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
In addition to the explanation covered by the section [[Exchange_Integration_Ignis#Dealing_with_Assets_and_Currencies|Dealing with Assets and Currencies]], this guide gets deeper in the explanation and provides examples for such integration of Assets.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
In this document we use assets to refer to the token assets, Ignis to refer to the main child chain and Ardor to refer to the platform in general.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites== &amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
Ardor node running 24/7 with fully synchronized blockchain.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:7--&amp;gt;&lt;br /&gt;
It is also recommended to setup a testnet node for QA and testing purposes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:8--&amp;gt;&lt;br /&gt;
All examples in this document: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
Use the 26876 testnet port. The mainnet port is 27876.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
Use ARDOR accounts.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:11--&amp;gt;&lt;br /&gt;
It is also supported numeric account ids from which the ARDOR account ids are derived. These numeric account ids has no error correction therefore we recommend that you&#039;ll never use it as any typo will lead to lost user funds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:12--&amp;gt;&lt;br /&gt;
An asset typically represents a share in an entity. Each asset is identified by the unique 64-bit transaction id of the asset issuance transaction, has a name, which is not necessarily unique, has a specific number of shares, which can be deleted and increased in the future. Asset quantities are divisible to between 0 to 8 decimal positions as specified by the asset issuance transaction.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accepting Asset Deposits or Transfers== &amp;lt;!--T:13--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:14--&amp;gt;&lt;br /&gt;
Unlike Bitcoin&#039;s throw away addresses, Ardor addresses are somewhat expensive to maintain. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:15--&amp;gt;&lt;br /&gt;
Each Ardor address and public key combination are maintained forever in the blockchain, however maintaining a completely empty account is less costly than maintaining an account with a non-zero balance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:16--&amp;gt;&lt;br /&gt;
Due to this, we do not recommend using a throwaway Ardor address per deposit as creating these addresses require higher fees payment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:17--&amp;gt;&lt;br /&gt;
Instead, we recommend creating at most one deposit address per user or even direct all deposits to the same address and maintain user identity using a message attached to the deposit transaction.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:18--&amp;gt;&lt;br /&gt;
Deposits can be accepted using one of the following approaches:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:19--&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;Message Based Deposits&#039;&#039;&#039; - Asset deposits are transferred to a single address, the user is identified by an attached message. &lt;br /&gt;
# &#039;&#039;&#039;Address per User&#039;&#039;&#039; - Asset is deposited to a new deposit address for each user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:20--&amp;gt;&lt;br /&gt;
Regardless of the method being used, always use a strong passphrase for the deposit account and protect the deposit account with a public key before accepting deposits.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Message-Based Deposits=== &amp;lt;!--T:21--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:22--&amp;gt;&lt;br /&gt;
Each transfer transaction of the assets can have an attached message, either in plain text or encrypted. This allows you to identify the user using a unique identifier such as the customer number or order number specified in the message. Which identifier you will use in the message to connect the payment to a specific user account is up to you and won’t be discussed in this document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:23--&amp;gt;&lt;br /&gt;
To monitor your account for new incoming payments, the [[Accounts#Get_Blockchain_Transactions|GetBlockchainTransactions]] API call is used with the parameter executedOnly=true (the executedOnly parameter filters out phased transactions which did not execute).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:24--&amp;gt;&lt;br /&gt;
The API call takes the following parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:25--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;chain&#039;&#039;&#039; - child chain identifier, use 2 for Ignis. It should be only accepted asset deposit and issue asset withdrawal on a specific child chain, preferably Ignis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:26--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;account&#039;&#039;&#039; - deposit account id&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;timestamp&#039;&#039;&#039; - if specified, transactions should be newer than this block timestamp&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039; - the type of transaction. For asset transfers this should be 2&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;subtype&#039;&#039;&#039; - the transaction subtype. For asset transfers this should be 1&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;firstIndex&#039;&#039;&#039; - for pagination purposes&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;lastIndex&#039;&#039;&#039; - for pagination purposes&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;executedOnly&#039;&#039;&#039; - set to true to filter out phased transactions which did not execute&lt;br /&gt;
  &lt;br /&gt;
To monitor a specific account for payment transactions use the following URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:27--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost:26876/nxt?&lt;br /&gt;
   requestType=getBlockchainTransactions&amp;amp;&lt;br /&gt;
   chain=2&amp;amp;&lt;br /&gt;
   account=ARDOR-X8ZN-WUJ2-SXY3-FBUYC&amp;amp;&lt;br /&gt;
   type=2&amp;amp;&lt;br /&gt;
   subtype=1&amp;amp;&lt;br /&gt;
   executedOnly=true&amp;amp;&lt;br /&gt;
   includePhasingResult=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:28--&amp;gt;&lt;br /&gt;
This is the JSON response:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:29--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;requestProcessingTime&amp;quot;: 4,&lt;br /&gt;
    &amp;quot;transactions&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;signature&amp;quot;: &amp;quot;83b5f9f782b62ff25664010e2c11027944b9a850bff4aaf90ec247d9558e2f0b08d10d46ccc2466c4a834b74679a7f33b78954f0acac7c452c92d5f5a601c15a&amp;quot;,&lt;br /&gt;
            &amp;quot;transactionIndex&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;type&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;fxtTransaction&amp;quot;: &amp;quot;7657558407516871755&amp;quot;,&lt;br /&gt;
            &amp;quot;phased&amp;quot;: false,&lt;br /&gt;
            &amp;quot;ecBlockId&amp;quot;: &amp;quot;5657621390974142748&amp;quot;,&lt;br /&gt;
            &amp;quot;signatureHash&amp;quot;: &amp;quot;1c86a29fd48f2727b1e9c59a61fb40d9124988ab4af4d468784b38cf9f024a00&amp;quot;,&lt;br /&gt;
            &amp;quot;attachment&amp;quot;: {&lt;br /&gt;
                &amp;quot;version.AssetTransfer&amp;quot;: 1,&lt;br /&gt;
                &amp;quot;quantityQNT&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
                &amp;quot;asset&amp;quot;: &amp;quot;9483630659743578360&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;senderRS&amp;quot;: &amp;quot;ARDOR-X8ZN-WUJ2-SXY3-FBUYC&amp;quot;,&lt;br /&gt;
            &amp;quot;subtype&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;amountNQT&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;recipientRS&amp;quot;: &amp;quot;ARDOR-3YLS-D9NM-84LE-2H9HP&amp;quot;,&lt;br /&gt;
            &amp;quot;block&amp;quot;: &amp;quot;3243082432540174808&amp;quot;,&lt;br /&gt;
            &amp;quot;blockTimestamp&amp;quot;: 69733158,&lt;br /&gt;
            &amp;quot;deadline&amp;quot;: 15,&lt;br /&gt;
            &amp;quot;timestamp&amp;quot;: 69733160,&lt;br /&gt;
            &amp;quot;height&amp;quot;: 4202046,&lt;br /&gt;
            &amp;quot;senderPublicKey&amp;quot;: &amp;quot;df21142bd38c04bd5c5c342c6ca36802f9de89b75b2a0a8cbd32d29dca481e5c&amp;quot;,&lt;br /&gt;
            &amp;quot;chain&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;feeNQT&amp;quot;: &amp;quot;1500000&amp;quot;,&lt;br /&gt;
            &amp;quot;confirmations&amp;quot;: 195,&lt;br /&gt;
            &amp;quot;fullHash&amp;quot;: &amp;quot;a0566aa12fef8ee4688c82e613408f84dc5be5827470b93518dab12a424b5bd2&amp;quot;,&lt;br /&gt;
            &amp;quot;version&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;sender&amp;quot;: &amp;quot;15382970207090678772&amp;quot;,&lt;br /&gt;
            &amp;quot;recipient&amp;quot;: &amp;quot;773756405444311640&amp;quot;,&lt;br /&gt;
            &amp;quot;ecBlockHeight&amp;quot;: 3214500&lt;br /&gt;
        },&lt;br /&gt;
        ... more transactions ...&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:30--&amp;gt;&lt;br /&gt;
Loop over this array of transactions and process the transactions one by one. Note that this response includes both incoming and outgoing payment transactions. You should filter out your own (outgoing) assets transfers by looking at the senderRS account address.&lt;br /&gt;
 &lt;br /&gt;
The important information of a transaction response is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:31--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;senderRS&#039;&#039;&#039; - the sender’s account id&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:32--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;confirmations&#039;&#039;&#039; - the number of confirmations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:33--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;asset&#039;&#039;&#039; - The asset identifier &lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;quantityQNT&#039;&#039;&#039; - the asset QNT transferred in [[General_notes#Quantity_Units|Quants]]&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;attachment.message&#039;&#039;&#039; - optional, an attached plain text message&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;attachment.encryptedMessage&#039;&#039;&#039; - optional, an attached encrypted message&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;timestamp&#039;&#039;&#039; - the time the transaction was made, in seconds since the genesis block&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;blockTimestamp&#039;&#039;&#039; - the time of the block since the genesis block&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;confirmations&#039;&#039;&#039; - number of confirmations received for the block in which the transaction is included&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:34--&amp;gt;&lt;br /&gt;
For most transactions, waiting for 10 confirmations should be enough. However, for transactions with large amount, special attention should be given to the transaction timestamp and deadline parameters, since blocks can become orphaned and transactions canceled as a result in case their deadline has passed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:35--&amp;gt;&lt;br /&gt;
When genesis time + timestamp + deadline * 60 is bigger than transaction.blockTime + 23 hours, a transaction can be accepted when the confirmations count reaches 10.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:36--&amp;gt;&lt;br /&gt;
For phased transactions i.e. phased=true, verify that approved=true then check the block in which the transaction has executed not the block in which it was initially submitted using the executionHeight field. Another alternative is not to accept phased deposit transactions at all i.e. if phased=true do not credit the transaction, but then you&#039;ll have to deal with refunding this transaction manually and document that it is not allowed in the deposit dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:37--&amp;gt;&lt;br /&gt;
If genesis time + transaction.timestamp + transaction.deadline * 60 is smaller than transaction.blockTimestamp + 23 hours, you should wait until the transaction has 720 confirmations before crediting the user’s account. 720 blocks is the maximum depth a blockchain reorganization can go. By waiting that long, you ensure the transaction is always included. Transactions that only required 10 confirmations will be put back in the blockchain automatically due to their longer deadline time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:38--&amp;gt;&lt;br /&gt;
The default deadline in the client is 24 hours, which means that in 99% of the cases only 10 confirmations will be necessary before crediting the user’s account.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:39--&amp;gt;&lt;br /&gt;
Genesis time for the Ardor blockchain is 1st of Jan, 2018 00:00:00 UTC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:40--&amp;gt;&lt;br /&gt;
To identify the user, you must look at the transaction attachment. If a plain text message is included, attachment.message is set and attachment.messageIsText is set to “true” (as string).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:41--&amp;gt;&lt;br /&gt;
If an encrypted message was attached instead, attachment.encryptedMessage should exist instead. This is not just a string, but an object and contains two keys; data and nonce.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:42--&amp;gt;&lt;br /&gt;
To decrypt the message use the [[Messages#Decrypt_From|decryptFrom]] API.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:43--&amp;gt;&lt;br /&gt;
This API call takes the following parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:44--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;account&#039;&#039;&#039; - account id that sent you the encrypted message&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039; - the encrypted message data extracted from transaction.attachment.encryptedMessage.data&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;nonce&#039;&#039;&#039; - the encrypted message nonce extracted from transaction.attachment.encryptedMessage.nonce&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;decryptedMessageIsText&#039;&#039;&#039; - set to “true&amp;quot; if the message you’re trying to decrypt is text&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;secretPhrase&#039;&#039;&#039; - passphrase of the account that received the encrypted message i.e. the deposit account&lt;br /&gt;
  &lt;br /&gt;
Example: to decrypt the message send the following request parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:45--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost:26876/nxt?&lt;br /&gt;
  requestType=decryptFrom&amp;amp;&lt;br /&gt;
  secretPhrase=[passphrase from account ARDOR-EVHD-5FLM-3NMQ-G46NR]&amp;amp;&lt;br /&gt;
  account=ARDOR-XK4R-7VJU-6EQG-7R335&amp;amp;&lt;br /&gt;
  data=9fd7a70625996990a4cf83bf9b1568830f557136044fb3209dd7343eec2ed96ec312457c4840dabaa8cbd8c1e9b8554b&amp;amp;&lt;br /&gt;
  nonce=650ef2a8641c19b9fd90a9ef22a2d50af90aa3b0de3d7a28b5ff2ad193369e7a&amp;amp;&lt;br /&gt;
  decryptedMessageIsText=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:46--&amp;gt;&lt;br /&gt;
The response is:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;decryptedMessage&amp;quot;: &amp;quot;test message&amp;quot;,&lt;br /&gt;
 &amp;quot;requestProcessingTime&amp;quot;: 2&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:47--&amp;gt;&lt;br /&gt;
After you have decrypted the message, you can now credit the customer account with the asset amount specified in transaction.attachment.quantityQNT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:48--&amp;gt;&lt;br /&gt;
Note: If you wish you can show pending deposits to the user for the transaction which did not yet reach the required number of confirmations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:49--&amp;gt;&lt;br /&gt;
You could also check for new transactions since a specific block by specifying the last block’s timestamp+1 as the timestamp parameter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:50--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost:26876/nxt?requestType=getBlockchainTransactions&amp;amp;...&amp;amp;timestamp=83099831&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:51--&amp;gt;&lt;br /&gt;
To get the last block timestamp, you would look at the last processed transaction blockTimestamp, or use the getBlockchainStatus API described in the account-based deposits section.&lt;br /&gt;
&lt;br /&gt;
====Preventing users from accidentally sending assets without message. &#039;&#039;nrs_recipient_ui_options&#039;&#039; properties functionality====&lt;br /&gt;
Refer to guide [[Account Setup for Message-based Deposits]] to set up the property &amp;lt;code&amp;gt;nrs_recipient_ui_options&amp;lt;/code&amp;gt; that prevents users to send funds without a message.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Account-Based Deposits=== &amp;lt;!--T:52--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:53--&amp;gt;&lt;br /&gt;
As discussed above, Ardor accounts are an expensive resource and should not be treated like disposable Bitcoin addresses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:54--&amp;gt;&lt;br /&gt;
For account-based deposits, you basically generate a new random passphrase for each user. The passphrase should be very strong and at least 35 characters long.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:55--&amp;gt;&lt;br /&gt;
Once you have this passphrase, you can get the account id and public key via the [[Accounts#Get_Account_Id|getAccountId]] API call.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:56--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;secretPhrase&#039;&#039;&#039; - account passphrase&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:57--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;publicKey&#039;&#039;&#039; - account public&lt;br /&gt;
 &lt;br /&gt;
Note that you only need to specify one of the above parameters, not both. So in our case, you just specify the secretPhrase parameter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:58--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
    http://localhost:26876/nxt?&lt;br /&gt;
     requestType=getAccountId&amp;amp;&lt;br /&gt;
     secretPhrase=1234&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:59--&amp;gt;&lt;br /&gt;
The response is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:60--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;accountRS&amp;quot;:&amp;quot;ARDOR-5WUN-YL5V-K29F-F43EJ&amp;quot;,&amp;quot;publicKey&amp;quot;:&amp;quot;fddcda69eeca58e5d783ad1032d080d2758a4e427881b6a4a6fe43d9e7f4ac34&amp;quot;, &amp;quot;account&amp;quot;:&amp;quot;15577989544718496596&amp;quot;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:61--&amp;gt;&lt;br /&gt;
On your site’s deposit page, you will need to show the account address extracted from the accountRS field i.e. &#039;&#039;&#039;ARDOR-5WUN-YL5V-K29F-F43EJ&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:62--&amp;gt;&lt;br /&gt;
If the account hasn’t yet had any incoming transactions, you will also need to display the publicKey to the user.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:63--&amp;gt;&lt;br /&gt;
The public key doesn’t have to be displayed any more after it has had its first incoming transaction.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:64--&amp;gt;&lt;br /&gt;
When a user sends funds to a new account, it needs to add the public key, so that an announcement of this key can be made. Once done, this is no longer needed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:65--&amp;gt;&lt;br /&gt;
Accounts without a public are only protected only by the 64-bit account address, not by the 256 public key. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:66--&amp;gt;&lt;br /&gt;
Tracking New Account-Based Deposits&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:67--&amp;gt;&lt;br /&gt;
To track new asset deposits, it’s easiest to simply inspect all transactions in a block to see if any of them are to account addresses you generated. An alternative method would be to use the getBlockchainTransactions API detailed in message-based deposits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:68--&amp;gt;&lt;br /&gt;
(This is to be done in a loop)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:69--&amp;gt;&lt;br /&gt;
Use the [[Server_info#Get_Blockchain_Status|getBlockchainStatus]] API to check if there is a new block. This API call has no parameters.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:70--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
    http://localhost:26876/nxt?requestType=getBlockchainStatus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
The response includes lastBlock (block id) and numberOfBlocks (the height).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:71--&amp;gt;&lt;br /&gt;
If numberOfBlocks is different from the previous execution of this API request, one or more new blocks have been generated. The transactions from the block which now has 10 confirmations have to be fetched. You should save in your database the height of the last block you processed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:72--&amp;gt;&lt;br /&gt;
Use the new getExecutedTransactions API to load all transactions executed at a given height either directly for non-phased transactions or indirectly for phased transactions applied at this height.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:73--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost:26876/nxt?&lt;br /&gt;
   requestType=getExecutedTransactions&amp;amp;&lt;br /&gt;
   chain=2&amp;amp;&lt;br /&gt;
   height=25117&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
For each of the resulting transactions, see if the recipientRS field corresponds to one of the deposit accounts you generated for your users. If so, this is an incoming payment. Credit the user’s internal asset balance and send the money to your hot wallet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:74--&amp;gt;&lt;br /&gt;
Similarly to message-based deposits handling, special attention should be given to the transaction timestamp and deadline parameters&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:75--&amp;gt;&lt;br /&gt;
After all transactions of this block have been checked, see if you’ve processed the previous block before or not (previousBlock).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:76--&amp;gt;&lt;br /&gt;
If not, traverse through the previous blocks chain until you reach the last processed block.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Withdrawing / Sending Assets== &amp;lt;!--T:77--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:78--&amp;gt;&lt;br /&gt;
When a user wants to withdraw assets to a specific account, you ask him for the account id he wants to withdraw to. When you receive this account id, you must first check if that account has a public key attached to it or not (i.e. if it’s new or not).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:79--&amp;gt;&lt;br /&gt;
To do this, you must use the [[Accounts#Get_Account_Public_Key|getAccountPublicKey]] API. It takes 1 parameter, account.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:80--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;account&#039;&#039;&#039; - account you want the public key of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:81--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost:26876/nxt?&lt;br /&gt;
   requestType=getAccountPublicKey&amp;amp;&lt;br /&gt;
   account=ARDOR-C6L6-UQ5W-RBJK-AWDSJ&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
If the account does not have a public key, you will get this error:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:82--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
    { &amp;quot;errorCode&amp;quot;: 5, &amp;quot;errorDescription&amp;quot;: &amp;quot;Unknown account&amp;quot; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
When you get this error, you should also ask the user for his public key or at least display a warning explaining the risk of using an account without a public key.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:83--&amp;gt;&lt;br /&gt;
When you have both the account id and public key, you can verify that they are correct by comparing the given account id with the account id generated by the public key using the getAccountId API call.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:84--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;publicKey&#039;&#039;&#039; - account public key&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:85--&amp;gt;&lt;br /&gt;
We want to calculate only by publicKey so our request looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:86--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost:26876/nxt? &lt;br /&gt;
   requestType=getAccountId&amp;amp;&lt;br /&gt;
   publicKey=28f56a81e0f8555b07eacffd0e697b21cbbbdf3cf620db14522732b763564f13&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:87--&amp;gt;&lt;br /&gt;
You’ll get back a response like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:88--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;    &lt;br /&gt;
{&amp;quot;accountRS&amp;quot;:&amp;quot;ARDOR-C6L6-UQ5W-RBJK-AWDSJ&amp;quot;,&amp;quot;publicKey&amp;quot;:&amp;quot;28f56a81e0f8555b07eacffd0e697b21cbbbdf3cf620db14522732b763564f13&amp;quot;,&amp;quot;requestProcessingTime&amp;quot;:0,&amp;quot;account&amp;quot;:&amp;quot;9827273118446850628&amp;quot;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:89--&amp;gt;&lt;br /&gt;
Now compare the response accountRS to the account id the user provided. If they are equal, you can go ahead and perform the withdrawal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:90--&amp;gt;&lt;br /&gt;
Sending assets is done via the [[Asset_Exchange#Transfer_Asset|Transfer Asset]] API call. The relevant parameters are:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:91--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;chain&#039;&#039;&#039; - the chain identifier, use 2 for Ignis. It should be only accepted asset deposit and issue asset withdrawal on a specific child chain, preferably Ignis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:92--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;recipient&#039;&#039;&#039; - recipient’s account address&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;asset&#039;&#039;&#039; - identifier of the asset being transferred&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:93--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;quantityQNT&#039;&#039;&#039; - the asset QNT transferred in [[General_notes#Quantity_Units|Quants]]&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;feeNQT&#039;&#039;&#039; - transaction fee for the transaction in NQT. In most cases set to -1 to let the receiving node calculate the minimum fee&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;secretPhrase&#039;&#039;&#039; - sender’s account passphrase&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;deadline&#039;&#039;&#039; - deadline for the transaction in minutes. Should be set to the maximum value of 1440&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;recipientPublicKey&#039;&#039;&#039; - recipient public key as provided by the user, only needed if the user account has no public key yet (on first transaction)&lt;br /&gt;
  &lt;br /&gt;
At the moment (Ardor v2.0.4e) the recipientPublicKey is optional, however not specifying it, puts the user&#039;s funds at risk. The recipientPublicKey is mandatory in case you like to attach an encrypted message to the withdrawal transaction of a new account.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:94--&amp;gt;&lt;br /&gt;
This request has to be sent using &#039;&#039;&#039;HTTP POST&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:95--&amp;gt;&lt;br /&gt;
The response should look like this if everything went OK:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:96--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt; &lt;br /&gt;
    { &amp;quot;fullHash&amp;quot;: “10788f7ad3f145b5209da6145327d7fed869…”, ... a lot more information ... }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
If there’s an error, you may get a response such as this (other errors may apply):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:97--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt; &lt;br /&gt;
    { &amp;quot;errorCode&amp;quot;: 5, &amp;quot;errorDescription&amp;quot;: &amp;quot;Unknown account&amp;quot; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:98--&amp;gt;&lt;br /&gt;
A correctly executed response should always contain the &amp;quot;transaction&amp;quot; field which represents the newly created transaction id.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Adding a Message To a (asset transfer) Transaction==== &amp;lt;!--T:99--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:100--&amp;gt;&lt;br /&gt;
You can add messages to any kind of transaction.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:101--&amp;gt;&lt;br /&gt;
To do so, specify the below parameters in your request:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:102--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;message&#039;&#039;&#039; - plain text message.&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;messageIsText&#039;&#039;&#039; - should be set to the string “true” if text.&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;messageToEncrypt&#039;&#039;&#039; - plain text message that should be encrypted.&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;messageToEncryptIsText&#039;&#039;&#039; - should be set to the string &amp;quot;true&amp;quot; if text.&lt;br /&gt;
  &lt;br /&gt;
In case you want to attach a plain text message, specify the message, and set messageIsText to “true”.&lt;br /&gt;
&lt;br /&gt;
If the account to which funds are withdrawn is configured for message-based deposits, you should prevent the user from sending funds without a message, or with incorrectly formatted message. See the [[Account_Setup_for_Message-based_Deposits|Account Setup for Message-based Deposits]] guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:103--&amp;gt;&lt;br /&gt;
If you want to attach an encrypted message that can only be read by the recipient, specify messageToEncrypt and set messgaeToEncryptIsText to “true”.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:104--&amp;gt;&lt;br /&gt;
Note that these are not mutually exclusive, you can add both a plain text and encrypted message in the same transaction.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:105--&amp;gt;&lt;br /&gt;
Allowing the user to add a message on your withdrawal page is recommended so that you can coordinate with other services that use a message-based deposit system.&lt;br /&gt;
&lt;br /&gt;
===Hot and Cold Wallets=== &amp;lt;!--T:106--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:107--&amp;gt;&lt;br /&gt;
You should not keep all of your user’s deposits in a single hot wallet. A hot wallet is a wallet for which the passphrase is stored somewhere on your server, so that you can send money from it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:108--&amp;gt;&lt;br /&gt;
Instead, you should have both a hot and cold wallet. The cold wallet should hold most of the coins and not be accessible from any of your servers. Ideally, you’d manually send from your cold wallet to your hot wallet when more coins are needed for day-to-day operations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:109--&amp;gt;&lt;br /&gt;
So the best thing to do is to have money sent to your cold wallet address, and then send out to your hot wallet manually when needed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Additional information=== &amp;lt;!--T:110--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Account Format==== &amp;lt;!--T:111--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:112--&amp;gt;&lt;br /&gt;
The account id is stored internally as a 64 bit signed long variable. When used in APIs it is usually returned as both unsigned number represented as string and using alphanumeric Reed-Solomon representation starting with &amp;quot;ARDOR-&amp;quot; prefix.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:113--&amp;gt;&lt;br /&gt;
For example: ARDOR-ER8M-SYV3-R7EK-EUF3L&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:114--&amp;gt;&lt;br /&gt;
In API request parameters and response JSON, you will find both representations, the numeric representation is typically displayed as account, sender, recipient. The alphanumeric representation is typically displayed as accountRS, senderRS, recipientRS (simply always add “RS”).&lt;br /&gt;
RS stands for Reed-Solomon. This form of address improves reliability by introducing redundancy that can detect and correct errors when entering and using Nxt account ID’s.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Asset and currency QNT amounts==== &amp;lt;!--T:115--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:116--&amp;gt;&lt;br /&gt;
Each Asset and Currency (generally referred to as &amp;quot;Holding&amp;quot;) has a specific number of decimal positions to which this holding is divisible.&lt;br /&gt;
API requests and responses always expect the holding quantity to be specified as a whole number without decimal positions. We refer to this value as QNT.&lt;br /&gt;
For example, when transferring 12.34 units of holding XYZ which has 4 decimal positions, specify the QNT value as 123400.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Minimum Fee and bundling==== &amp;lt;!--T:117--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:118--&amp;gt;&lt;br /&gt;
All outgoing transactions require a fee paid in the child chain token. Since 0 is now a valid fee value for child chains, all CreateTransaction APIs will accept it, instead of using it as a request for the server to calculate&lt;br /&gt;
and use the minimum fee. To let the server calculate the child transaction fee, a value of feeNQT=-1 should be used, and a new feeRateNQTPerFXT parameter must be supplied, to indicate the exchange rate to use when calculating the fee (since minimum fees can only be calculated in the parent chain token ARDR). If feeRateNQTPerFXT is also set to -1, the server will query the currently known bundlers rates for this child chain, also subject to the minBundlerBalanceFXT limit on effective bundler account balance, and use the best one for the fee calculation. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:119--&amp;gt;&lt;br /&gt;
A transaction fee in ARDR varies depending on the status of the recipient account, transferAsset to a new account will charge a higher fee than transferAsset to an existing account so don&#039;t make any assumption about the ARDR fee the bundler will have to pay to bundle your transactions, unless you check first if the recipient account is new.&lt;br /&gt;
One way to do this is to invoke the getAccount API on the recipient account and check for errorCode 5 in the response, then predict the fee according to the current minimum fee specifications.&lt;br /&gt;
A more robust approach is to submit the transaction when setting the broadcast parameter to false then read the minimumFeeFQT field from the response which indicates the minimum required fee in ARDR the bundler will pay for this transaction.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:120--&amp;gt;&lt;br /&gt;
As bundlers&#039; rates cannot be trusted blindly, the transaction will not be broadcasted in this case, the returned transaction JSON including the fees calculated should be reviewed by the user. The bundler rate used will be returned in the bundlerRateNQTPerFXT JSON field, -1 if no bundlers are known for the chain.&amp;quot;&lt;br /&gt;
The way the Ardor wallet works is that it first asks the user to calculate the fee then provides the best available fee from all bundlers as default fee which can be changed manually.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:121--&amp;gt;&lt;br /&gt;
Alternatively, you can develop your own bundling filter which will only bundle your withdrawal transactions.&lt;br /&gt;
You will need to implement an interface with a single Java method or reuse the available PersonalBundler.java example.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:122--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; &lt;br /&gt;
public interface Filter {&lt;br /&gt;
    boolean ok(Bundler bundler, ChildTransaction childTransaction);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:123--&amp;gt;&lt;br /&gt;
You then register this bundling filter using the following property in your nxt.properties file:&lt;br /&gt;
# When running Bundlers, only bundle transactions that satisfy this filter.&lt;br /&gt;
# Filter class must implement the nxt.Bundler.Filter interface, see&lt;br /&gt;
# nxt.addons.PersonalBundler for an example.&lt;br /&gt;
# nxt.bundlingFilter=nxt.addons.PersonalBundler&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:124--&amp;gt;&lt;br /&gt;
Our recommendation is that if you know that all your withdrawal transactions will be issued from a single account, also perform the bundling using this account and use the provided PersonalBundler filter to bundle only your own withdrawal transactions and ignore other transactions. This will provide you full control over the bundling process for your asset withdrawals, you will pay the fee in ARDR and receive back the child chain tokens (IGNIS in most cases) you charge from your customers as transaction fees. You can regularly adjust the bundling rate based on the IGNIS per ARDR rate on your exchange.&lt;br /&gt;
Bundler is started or updated using the startBundler API. Also see [[Bundling]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Account Properties Bundler==== &amp;lt;!--T:125--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:126--&amp;gt;&lt;br /&gt;
A more flexible approach is to use the Account Property Bundler in order to designate several accounts whose transactions your bundler will bundle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:127--&amp;gt;&lt;br /&gt;
Add the property nxt.bundlingFilter=nxt.addons.AccountPropertyBundler to your nxt.properties file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:128--&amp;gt;&lt;br /&gt;
Decide which account will perform the bundling (probably your Ardor deposit account which is guaranteed to contain Ardor to pay the fees), from this account submit a setAccountProperty transaction (better do it from the wallet under the dashboard --&amp;gt; Account Properties menu) set the recipient account to the account which will submit the asset transfer transactions and the name of the property to &amp;quot;bundling&amp;quot;, the value of the property is unimportant at the moment. Submit these transactions from the IGNIS chain, chain &amp;quot;2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:129--&amp;gt;&lt;br /&gt;
Wait for the set account properties transactions to confirm, then start a bundler from the property setter account (Ardor account) and set the bundling parameters as usual. In most cases, it makes sense to allow 0 fee transactions but it&#039;s not required.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:130--&amp;gt;&lt;br /&gt;
As a result, only transactions submitted by accounts on which you set the &amp;quot;bundling&amp;quot; property will be bundled by your bundler.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;/div&gt;</summary>
		<author><name>Petko</name></author>
	</entry>
	<entry>
		<id>https://betaardordocs.jelurida.com/index.php?title=Exchange_Integration_Ardor&amp;diff=12782</id>
		<title>Exchange Integration Ardor</title>
		<link rel="alternate" type="text/html" href="https://betaardordocs.jelurida.com/index.php?title=Exchange_Integration_Ardor&amp;diff=12782"/>
		<updated>2021-01-12T07:39:29Z</updated>

		<summary type="html">&lt;p&gt;Petko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages /&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
{{#seo:&lt;br /&gt;
|title=Exchange Integration Ardor&lt;br /&gt;
|titlemode=replace&lt;br /&gt;
|keywords=ardor learning hub, ardor documentation, blockchain, proof of stake, ardor, ignis, jelurida, development, ardor wiki, wiki, tutorials, advanced tutorials, how to, Exchange Integration Ardor&lt;br /&gt;
|description=This guide explains how to integrate Ardor into a currency exchange platform&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Advanced_guides]]&lt;br /&gt;
__TOC__&lt;br /&gt;
==Introduction== &amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
The following page explains how to integrate Ardor into a currency exchange platform&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites== &amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
Ardor node running 24/7 with fully synchronized blockchain.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
It is also recommended to setup a testnet node for QA and testing purposes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
All examples in this document: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:7--&amp;gt;&lt;br /&gt;
Use the 26876 testnet port. The mainnet port is 27876.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:8--&amp;gt;&lt;br /&gt;
Ardor also supports numeric account ids from which the ARDOR account ids are derived. These numeric account ids have no error correction therefore we recommend that you&#039;ll never use it as any typo will lead to lost user funds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accepting Deposits== &amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
Unlike Bitcoin&#039;s throw away addresses, Ardor addresses are somewhat expensive to maintain. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:11--&amp;gt;&lt;br /&gt;
Each Ardor address and public key combination are stored forever in the blockchain, however, maintaining a completely empty account is less costly than maintaining an account with non zero balance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:12--&amp;gt;&lt;br /&gt;
Due to this, we do not recommend using a throw-away Ardor address per deposit since creating these addresses need to pay a higher fee.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:13--&amp;gt;&lt;br /&gt;
Instead, we recommend creating at most one deposit address per user or even direct all deposits to the same address and maintain user identity using a message attached to the deposit transaction.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:14--&amp;gt;&lt;br /&gt;
Deposits can be accepted using one of the following approaches:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:15--&amp;gt;&lt;br /&gt;
1. Message-Based Deposits - Ardor deposits are sent to a single address, the user is identified by an attached message. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:16--&amp;gt;&lt;br /&gt;
2. Address per User - Ardor is deposited to a new deposit address for each user.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:17--&amp;gt;&lt;br /&gt;
When using both methods, always use a strong passphrase for the deposit account.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Message-Based Deposits=== &amp;lt;!--T:18--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:19--&amp;gt;&lt;br /&gt;
Each payment transaction in Ardor can have an attached message, either in plain text or encrypted. This allows you to identify the customer using an identifier provided by the exchange that the user will enter when making a deposit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:20--&amp;gt;&lt;br /&gt;
Which identifier you will use in the message to connect the payment to a specific user account is up to you and won’t be discussed in this document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:21--&amp;gt;&lt;br /&gt;
To monitor your account for new incoming payments, the [[Accounts#Get_Blockchain_Transactions|GetBlockchainTransactions]] API call is used&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:22--&amp;gt;&lt;br /&gt;
The API call takes the following parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:23--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;chain&#039;&#039;&#039; - set to 1 to identify the Ardor chain&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:24--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;account&#039;&#039;&#039; - deposit account id&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;timestamp&#039;&#039;&#039; - if specified, transactions should be newer than this block timestamp&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039; - the type of transaction. For Ardor payments this should be -2&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;subtype&#039;&#039;&#039; - the transaction subtype. For payments, this should be 0 as well&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:25--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;numberOfConfirmations&#039;&#039;&#039; - only load transactions with this number of confirmations&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;firstIndex&#039;&#039;&#039; - for pagination purposes&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;lastIndex&#039;&#039;&#039; - for pagination purposes&lt;br /&gt;
		&lt;br /&gt;
To monitor a specific account for payment transactions use the following URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:26--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;    &lt;br /&gt;
http://localhost:26876/nxt?&lt;br /&gt;
   requestType=getBlockchainTransactions&amp;amp;&lt;br /&gt;
   chain=1&amp;amp;&lt;br /&gt;
   account=ARDOR-XK4R-7VJU-6EQG-7R335&amp;amp;&lt;br /&gt;
   type=-2&amp;amp;&lt;br /&gt;
   subtype=0&amp;amp;&lt;br /&gt;
   numberOfConfirmations=10&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:27--&amp;gt;&lt;br /&gt;
This is a sample JSON response (irrelevant fields omitted):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:28--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;transactions&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;signature&amp;quot;: &amp;quot;acbe6720b1a7e13e6af7cdc2dc42e448b5aafb1fa3a481bac08cf150ab9db90842a9d231abb41c280c489f2cca1a122a186048aa6f41dca66663644b6f4e4588&amp;quot;,&lt;br /&gt;
            &amp;quot;transactionIndex&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;type&amp;quot;: -2,&lt;br /&gt;
            &amp;quot;phased&amp;quot;: false,&lt;br /&gt;
            &amp;quot;ecBlockId&amp;quot;: &amp;quot;1318911886063902233&amp;quot;,&lt;br /&gt;
            &amp;quot;signatureHash&amp;quot;: &amp;quot;a85066e35731f1ee34be7326a16e92cbf703c650d0487b88a947a3c83fe1719e&amp;quot;,&lt;br /&gt;
            &amp;quot;attachment&amp;quot;: {&lt;br /&gt;
                &amp;quot;version.FxtPayment&amp;quot;: 0,&lt;br /&gt;
                &amp;quot;version.PrunablePlainMessage&amp;quot;: 1,&lt;br /&gt;
                &amp;quot;messageIsText&amp;quot;: true,&lt;br /&gt;
                &amp;quot;messageHash&amp;quot;: &amp;quot;f8ed492c51010998ab9a8b8909d36cf0e792565e61048cd040fe406c0d519a75&amp;quot;,&lt;br /&gt;
                &amp;quot;message&amp;quot;: &amp;quot;{\&amp;quot;chain\&amp;quot;:2,\&amp;quot;fullHash\&amp;quot;:\&amp;quot;2bf7716b0867c743e3bf630360b852b98dc6559d33a22ede437d690db51fc5a4\&amp;quot;}&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;senderRS&amp;quot;: &amp;quot;ARDOR-EVHD-5FLM-3NMQ-G46NR&amp;quot;,&lt;br /&gt;
            &amp;quot;subtype&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;amountNQT&amp;quot;: &amp;quot;10000000000&amp;quot;,&lt;br /&gt;
            &amp;quot;recipientRS&amp;quot;: &amp;quot;ARDOR-XK4R-7VJU-6EQG-7R335&amp;quot;,&lt;br /&gt;
            &amp;quot;block&amp;quot;: &amp;quot;4144059555451144178&amp;quot;,&lt;br /&gt;
            &amp;quot;blockTimestamp&amp;quot;: 8018267,&lt;br /&gt;
            &amp;quot;deadline&amp;quot;: 1440,&lt;br /&gt;
            &amp;quot;timestamp&amp;quot;: 8018209,&lt;br /&gt;
            &amp;quot;height&amp;quot;: 135271,&lt;br /&gt;
            &amp;quot;senderPublicKey&amp;quot;: &amp;quot;0b4e505972149e7ceb51309edc76729795cabe1f2cc42d87688138d0966db436&amp;quot;,&lt;br /&gt;
            &amp;quot;chain&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;feeNQT&amp;quot;: &amp;quot;100000000&amp;quot;,&lt;br /&gt;
            &amp;quot;confirmations&amp;quot;: 55607,&lt;br /&gt;
            &amp;quot;fullHash&amp;quot;: &amp;quot;e33ccc4648786cba42bbb052796fb5be45c48e25c3c9b4908b773ff2295272f3&amp;quot;,&lt;br /&gt;
            &amp;quot;version&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;sender&amp;quot;: &amp;quot;16992224448242675179&amp;quot;,&lt;br /&gt;
            &amp;quot;recipient&amp;quot;: &amp;quot;5873880488492319831&amp;quot;,&lt;br /&gt;
            &amp;quot;ecBlockHeight&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;transaction&amp;quot;: &amp;quot;13433244040360115427&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;signature&amp;quot;: &amp;quot;393fc5bf120734468bd2f1d1dfcab6483c32167d6c6a008e4fc386c27985ce02f1e51499900c3c6b3a16e38e21ecd81062e734532b62754b73b2e7e2909dcaa7&amp;quot;,&lt;br /&gt;
            &amp;quot;transactionIndex&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;type&amp;quot;: -2,&lt;br /&gt;
            &amp;quot;phased&amp;quot;: false,&lt;br /&gt;
            &amp;quot;ecBlockId&amp;quot;: &amp;quot;7136116332013816990&amp;quot;,&lt;br /&gt;
            &amp;quot;signatureHash&amp;quot;: &amp;quot;a1d7c6d14e66572b7a0c2e5567a6ae60420654c8155694d37fbf1e9afa287662&amp;quot;,&lt;br /&gt;
            &amp;quot;attachment&amp;quot;: {&lt;br /&gt;
                &amp;quot;version.FxtPayment&amp;quot;: 0&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;senderRS&amp;quot;: &amp;quot;ARDOR-XK4R-7VJU-6EQG-7R335&amp;quot;,&lt;br /&gt;
            &amp;quot;subtype&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;amountNQT&amp;quot;: &amp;quot;1000000000000&amp;quot;,&lt;br /&gt;
            &amp;quot;recipientRS&amp;quot;: &amp;quot;ARDOR-ZQW8-EKSR-UX8K-CJ6DD&amp;quot;,&lt;br /&gt;
            &amp;quot;block&amp;quot;: &amp;quot;17515962222690505699&amp;quot;,&lt;br /&gt;
            &amp;quot;blockTimestamp&amp;quot;: 7530374,&lt;br /&gt;
            &amp;quot;deadline&amp;quot;: 15,&lt;br /&gt;
            &amp;quot;timestamp&amp;quot;: 7530360,&lt;br /&gt;
            &amp;quot;height&amp;quot;: 127214,&lt;br /&gt;
            &amp;quot;senderPublicKey&amp;quot;: &amp;quot;112e0c5748b5ea610a44a09b1ad0d2bddc945a6ef5edc7551b80576249ba585b&amp;quot;,&lt;br /&gt;
            &amp;quot;chain&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;feeNQT&amp;quot;: &amp;quot;100000000&amp;quot;,&lt;br /&gt;
            &amp;quot;confirmations&amp;quot;: 63664,&lt;br /&gt;
            &amp;quot;fullHash&amp;quot;: &amp;quot;2888abfe72b97a3599933de52337578cdb4d77f18fc02c1ceffcc152eb7ad4dc&amp;quot;,&lt;br /&gt;
            &amp;quot;version&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;sender&amp;quot;: &amp;quot;5873880488492319831&amp;quot;,&lt;br /&gt;
            &amp;quot;recipient&amp;quot;: &amp;quot;11938075473327676294&amp;quot;,&lt;br /&gt;
            &amp;quot;ecBlockHeight&amp;quot;: 17000,&lt;br /&gt;
            &amp;quot;transaction&amp;quot;: &amp;quot;3853596334718945320&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
   ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:29--&amp;gt;&lt;br /&gt;
Loop over this array of transactions and process the transactions one by one. Note that this response includes both incoming and outgoing payment transactions. You should filter out your own (outgoing) payments by looking at the senderRS account address.&lt;br /&gt;
 &lt;br /&gt;
The important information of a transaction response is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:30--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;chain&#039;&#039;&#039; - should always equal 1 to identify Ardor&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:31--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;senderRS&#039;&#039;&#039; - the sender’s account id&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:32--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;amountNQT&#039;&#039;&#039; - the amount sent in [[API#Quantity_Units_amountNQT.2C_QNT_and_priceNQTPer.28Share.2C_Coin.2C_Unit.2C_etc..29|NQT form]]&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;attachment.message&#039;&#039;&#039; - optional, an attached plain text message&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;attachment.encryptedMessage&#039;&#039;&#039; - optional, an attached encrypted message&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;timestamp&#039;&#039;&#039; - the time the transaction was made, in seconds since the genesis block&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;blockTimestamp&#039;&#039;&#039; - the time of the block since the genesis block&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;confirmations&#039;&#039;&#039; - number of confirmations received for the block in which the transaction is included&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:33--&amp;gt;&lt;br /&gt;
For most transactions, waiting for 10 confirmations should be enough. For very large amounts you may want to wait up to 720 which is the maximum possible fork height.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:34--&amp;gt;&lt;br /&gt;
To identify the user, you must look at the transaction attachment. If a plain text message is included, attachment.message is set and attachment.messageIsText is set to “true” (as string).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:35--&amp;gt;&lt;br /&gt;
If an encrypted message was attached instead, attachment.encryptedMessage should exist instead. This is not just a string, but an object and contains two keys; data and nonce.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:36--&amp;gt;&lt;br /&gt;
To decrypt the message use the [[Messages#Decrypt_From|decryptFrom]] API.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:37--&amp;gt;&lt;br /&gt;
This API call takes the following parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:38--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;account&#039;&#039;&#039; - account id that sent you the encrypted message&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039; - the encrypted message data extracted from transaction.attachment.encryptedMessage.data&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;nonce&#039;&#039;&#039; - the encrypted message nonce extracted from transaction.attachment.encryptedMessage.nonce&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;decryptedMessageIsText&#039;&#039;&#039; - set to “true&amp;quot; if the message you’re trying to decrypt is text&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;secretPhrase&#039;&#039;&#039; - passphrase of the account that received the encrypted message i.e. the deposit account&lt;br /&gt;
	&lt;br /&gt;
Example: to decrypt the message sent by testnet transaction 12700027308938063138 send the following request parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:39--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost:26876/nxt?&lt;br /&gt;
  requestType=decryptFrom&amp;amp;&lt;br /&gt;
  secretPhrase=[passphrase from account ARDOR-EVHD-5FLM-3NMQ-G46NR]&amp;amp;&lt;br /&gt;
  account=ARDOR-XK4R-7VJU-6EQG-7R335&amp;amp;&lt;br /&gt;
  data=9fd7a70625996990a4cf83bf9b1568830f557136044fb3209dd7343eec2ed96ec312457c4840dabaa8cbd8c1e9b8554b&amp;amp;&lt;br /&gt;
  nonce=650ef2a8641c19b9fd90a9ef22a2d50af90aa3b0de3d7a28b5ff2ad193369e7a&amp;amp;&lt;br /&gt;
  decryptedMessageIsText=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:40--&amp;gt;&lt;br /&gt;
The response is:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;decryptedMessage&amp;quot;: &amp;quot;test message&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:41--&amp;gt;&lt;br /&gt;
After you have decrypted the message, you can now credit the customer account with the amount specified in transaction.amountNQT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:42--&amp;gt;&lt;br /&gt;
Note: If you wish you can show pending deposits to the user for transactions that did not yet reach the required number of confirmations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:43--&amp;gt;&lt;br /&gt;
You could also check for new transactions since a specific block by specifying the last block’s timestamp+1 as the timestamp parameter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:44--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost:26876/nxt? &lt;br /&gt;
   requestType=getBlockchainTransactions&amp;amp;&lt;br /&gt;
   chain=1&amp;amp;&lt;br /&gt;
   account=ARDOR-XK4R-7VJU-6EQG-7R335&amp;amp;&lt;br /&gt;
   type=-2&amp;amp;&lt;br /&gt;
   subtype=0&amp;amp;&lt;br /&gt;
   timestamp=8018267&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:45--&amp;gt;&lt;br /&gt;
To get the last block timestamp, you would look at the last processed transaction blockTimestamp, or use the getBlockchainStatus API described in the account-based deposits section.&lt;br /&gt;
&lt;br /&gt;
====Preventing users from accidentally sending ARDR without message. &#039;&#039;nrs_recipient_ui_options&#039;&#039; properties functionality====&lt;br /&gt;
Refer to guide [[Account Setup for Message-based Deposits]] to set up the property &amp;lt;code&amp;gt;nrs_recipient_ui_options&amp;lt;/code&amp;gt; that prevents users to send funds without a message.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Account-Based Deposits=== &amp;lt;!--T:46--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:47--&amp;gt;&lt;br /&gt;
As discussed above, Ardor accounts are an expensive resource and should not be treated like disposable Bitcoin addresses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:48--&amp;gt;&lt;br /&gt;
For account-based deposits, you basically generate a new random passphrase for each user. The passphrase should be very strong and at least 35 characters long.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:49--&amp;gt;&lt;br /&gt;
Once you have this passphrase, you can get the account id and public key via the [[Accounts#Get_Account_Id|getAccountId]] API call.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:50--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;secretPhrase&#039;&#039;&#039; - account passphrase&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:51--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;publicKey&#039;&#039;&#039; - account public&lt;br /&gt;
 &lt;br /&gt;
Note that you only need to specify one of the above parameters, not both. So in our case, you just specify the secretPhrase parameter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:52--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost:26876/nxt?&lt;br /&gt;
   requestType=getAccountId&amp;amp;&lt;br /&gt;
   secretPhrase=1234&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:53--&amp;gt;&lt;br /&gt;
The response is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:54--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;accountRS&amp;quot;: &amp;quot;ARDOR-5WUN-YL5V-K29F-F43EJ&amp;quot;,&lt;br /&gt;
  &amp;quot;publicKey&amp;quot;: &amp;quot;fddcda69eeca58e5d783ad1032d080d2758a4e427881b6a4a6fe43d9e7f4ac34&amp;quot;,&lt;br /&gt;
  &amp;quot;requestProcessingTime&amp;quot;: 2,&lt;br /&gt;
  &amp;quot;account&amp;quot;: &amp;quot;15577989544718496596&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:55--&amp;gt;&lt;br /&gt;
On your site’s deposit page, you will need to show the account address extracted from the accountRS field i.e. &#039;&#039;&#039;ARDOR-5WUN-YL5V-K29F-F43EJ&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Tracking New Account-Based Deposits==== &amp;lt;!--T:56--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:57--&amp;gt;&lt;br /&gt;
To track new deposits, it’s easiest to simply inspect all transactions in a block to see if any of them are to account addresses you generated. An alternative method would be to use the getBlockchainTransactions API detailed in message-based deposits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:58--&amp;gt;&lt;br /&gt;
(This is to be done in a loop)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:59--&amp;gt;&lt;br /&gt;
Use the [[Server_info#Get_Blockchain_Status|getBlockchainStatus]] API to check if there is a new block. This API call has no parameters.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:60--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost:26876/nxt?&lt;br /&gt;
   requestType=getBlockchainStatus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:61--&amp;gt;&lt;br /&gt;
The response includes lastBlock (block id) and numberOfBlocks (the height).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:62--&amp;gt;&lt;br /&gt;
If numberOfBlocks is different from the previous execution of this API request, one or more new blocks have been generated. The transactions from the block which now has 10 confirmations have to be fetched. You should save in your database the height of the last block you processed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:63--&amp;gt;&lt;br /&gt;
Use the [[Blocks#Get_Block|getBlock]] API to get the block at the height of 10 blocks ago (10 confirmations). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:64--&amp;gt;&lt;br /&gt;
Pass it the numberOfBlocks parameter from the getBlockchainStatus API response after subtracting 11 from this value, since blocks start at height 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:65--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;height&#039;&#039;&#039; - height of the block, zero-based.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:66--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;includeTransactions&#039;&#039;&#039; - set to true to return the array of transactions included in the block&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:67--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost:26876/nxt?&lt;br /&gt;
   requestType=getBlock&amp;amp;&lt;br /&gt;
   height=135271&amp;amp;&lt;br /&gt;
   includeTransactions=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:68--&amp;gt;&lt;br /&gt;
Loop over the &amp;quot;transactions&amp;quot; array &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:69--&amp;gt;&lt;br /&gt;
For each transaction, see if the recipientRS field corresponds to one of the deposit accounts you generated for your users. If so, this is an incoming payment. Credit the user’s internal balance and send the money to your hot wallet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:70--&amp;gt;&lt;br /&gt;
Similarly, for message-based deposits, special attention should be given to the transaction timestamp and deadline parameters.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:71--&amp;gt;&lt;br /&gt;
After all transactions of this block have been checked, see if you’ve processed the previous block before or not (previousBlock).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:72--&amp;gt;&lt;br /&gt;
If not, traverse through the previous blocks chain until you reach the last processed block.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Withdrawing / Sending Money== &amp;lt;!--T:73--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:74--&amp;gt;&lt;br /&gt;
When a user wants to withdraw to a specific account, you ask him for the ARDOR account id he wants to withdraw to.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:75--&amp;gt;&lt;br /&gt;
Sending Ardor is done via the [[Accounts#Send_Money|sendMoney]] API call. The relevant parameters are:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:76--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;chain&#039;&#039;&#039; - set to 1 to identify the Ardor chain&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:77--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;recipient&#039;&#039;&#039; - recipient’s account address&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;amountNQT&#039;&#039;&#039; - amount of Ardor (in NQT (also called FQT in Ardor) i.e. 1^(10-8))&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;feeNQT&#039;&#039;&#039; - transaction fee for the transaction in NQT. The minimum value is 100000000 FQT (1 Ardor) but if you are withdrawing to a new account you need to pay 2 Ardor (use the getAccount API to check if the account already exists)&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;secretPhrase&#039;&#039;&#039; - sender’s account passphrase&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;deadline&#039;&#039;&#039; - deadline for the transaction in minutes. Should be set to the maximum value of 1440&lt;br /&gt;
	&lt;br /&gt;
The sendMoney request has to use HTTP POST. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:78--&amp;gt;&lt;br /&gt;
The response should look like this if everything went OK:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:79--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
    { &amp;quot;fullHash&amp;quot;: “10788f7ad3f145b5209da6145327d7fed869…”, ... a lot more information ... }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:80--&amp;gt;&lt;br /&gt;
If there’s an error, you may get a response such as this (other errors may apply):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:81--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
    { &amp;quot;errorCode&amp;quot;: 5, &amp;quot;errorDescription&amp;quot;: &amp;quot;Unknown account&amp;quot; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:82--&amp;gt;&lt;br /&gt;
A correctly executed response should always contain the &amp;quot;transaction&amp;quot; field which represents the newly created fullHash field which represents the unique transaction identifier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Adding a Message To a (Payment) Transaction==== &amp;lt;!--T:83--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:84--&amp;gt;&lt;br /&gt;
You can add messages to any kind of transaction.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:85--&amp;gt;&lt;br /&gt;
To do so, specify the below parameters in your request:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:86--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;message&#039;&#039;&#039; - plain text message.&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;messageIsText&#039;&#039;&#039; - should be set to the string “true” if text.&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;messageToEncrypt&#039;&#039;&#039; - plain text message that should be encrypted.&lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;messageToEncryptIsText&#039;&#039;&#039; - should be set to the string &amp;quot;true&amp;quot; if text.&lt;br /&gt;
	&lt;br /&gt;
In case you want to attach a plain text message, specify message, and set messageIsText to &amp;quot;true&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If the account to which funds are withdrawn is configured for message-based deposits, you should prevent the user from sending funds without a message, or with incorrectly formatted message. See the [[Account_Setup_for_Message-based_Deposits|Account Setup for Message-based Deposits]] guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:87--&amp;gt;&lt;br /&gt;
If you want to attach an encrypted message that can only be read by the recipient, specify messageToEncrypt and set messgaeToEncryptIsText to “true”.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:88--&amp;gt;&lt;br /&gt;
Note that these are not mutually exclusive, you can add both a plain text and encrypted message in the same transaction.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:89--&amp;gt;&lt;br /&gt;
Allowing the user to add a message on your withdrawal page is recommended so that you can coordinate with other services that use a message-based deposit system.&lt;br /&gt;
&lt;br /&gt;
===Hot and Cold Wallets=== &amp;lt;!--T:90--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:91--&amp;gt;&lt;br /&gt;
You should not keep all of your user’s deposits in a single hot wallet. A hot wallet is a wallet for which the passphrase is stored somewhere on your server, so that you can send money from it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:92--&amp;gt;&lt;br /&gt;
Instead, you should have both a hot and cold wallet. The cold wallet should hold most of the coins and not be accessible from any of your servers. Ideally, you’d manually send from your cold wallet to your hot wallet when more coins are needed for day-to-day operations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:93--&amp;gt;&lt;br /&gt;
So the best thing to do is to have money sent to your cold wallet address, and then send out to your hot wallet manually when needed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Additional information=== &amp;lt;!--T:94--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ardor Account Format==== &amp;lt;!--T:95--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:96--&amp;gt;&lt;br /&gt;
The Ardor account ID is stored internally as a 64 bit signed long variable. When used in APIs it is usually returned as both unsigned number represented as string and using alphanumeric Reed-Solomon representation starting with &amp;quot;ARDOR-&amp;quot; prefix.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:97--&amp;gt;&lt;br /&gt;
For example: &#039;&#039;&#039;ARDOR-ER8M-SYV3-R7EK-EUF3L&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:98--&amp;gt;&lt;br /&gt;
In API request parameters and response JSON, you will find both representations, the numeric representation is typically displayed as account, sender, recipient. The alphanumeric representation is typically displayed as accountRS, senderRS, recipientRS (simply always add “RS”).&lt;br /&gt;
RS stands for Reed-Solomon. This form of address improves reliability by introducing redundancy that can detect and correct errors when entering and using Ardor account ID’s.&lt;br /&gt;
Therefore always use the RS address format in your user interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ARDR and FQT Amounts==== &amp;lt;!--T:99--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:100--&amp;gt;&lt;br /&gt;
All Ardor amounts should be converted to FQT format (same as NQT) to be used in API calls.&lt;br /&gt;
FQT is the name given to 0.00000001 ARDR (or 10^(-8) in mathematical shorthand). The FQT to ARDR ratio is equivalent to the Satoshi to Bitcoin ratio.&lt;br /&gt;
Simply put, 1 ARDR is 100000000 FQT, therefore to convert ARDR to FQT, simply multiply by 100000000.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Minimum Fee==== &amp;lt;!--T:101--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:102--&amp;gt;&lt;br /&gt;
All outgoing transactions require a fee of at least 1 ARDR. In API calls, this must be represented as 100000000 FQT.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Time Calculations==== &amp;lt;!--T:103--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:104--&amp;gt;&lt;br /&gt;
Genesis time for the Ardor blockchain is 01 JAN, 2018 00:00:00 UTC.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;/div&gt;</summary>
		<author><name>Petko</name></author>
	</entry>
	<entry>
		<id>https://betaardordocs.jelurida.com/index.php?title=File:Account_setup_for_Message-based_deposits_-_3.jpg&amp;diff=12778</id>
		<title>File:Account setup for Message-based deposits - 3.jpg</title>
		<link rel="alternate" type="text/html" href="https://betaardordocs.jelurida.com/index.php?title=File:Account_setup_for_Message-based_deposits_-_3.jpg&amp;diff=12778"/>
		<updated>2021-01-11T21:43:43Z</updated>

		<summary type="html">&lt;p&gt;Petko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Petko</name></author>
	</entry>
	<entry>
		<id>https://betaardordocs.jelurida.com/index.php?title=File:Start_forging_dialog.png&amp;diff=7300</id>
		<title>File:Start forging dialog.png</title>
		<link rel="alternate" type="text/html" href="https://betaardordocs.jelurida.com/index.php?title=File:Start_forging_dialog.png&amp;diff=7300"/>
		<updated>2019-10-11T12:25:48Z</updated>

		<summary type="html">&lt;p&gt;Petko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Start forging dialog&lt;/div&gt;</summary>
		<author><name>Petko</name></author>
	</entry>
	<entry>
		<id>https://betaardordocs.jelurida.com/index.php?title=File:Save_forging_screen.png&amp;diff=7299</id>
		<title>File:Save forging screen.png</title>
		<link rel="alternate" type="text/html" href="https://betaardordocs.jelurida.com/index.php?title=File:Save_forging_screen.png&amp;diff=7299"/>
		<updated>2019-10-11T12:17:42Z</updated>

		<summary type="html">&lt;p&gt;Petko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Save_forging_screen&lt;/div&gt;</summary>
		<author><name>Petko</name></author>
	</entry>
	<entry>
		<id>https://betaardordocs.jelurida.com/index.php?title=File:Ardor_control_screen_started_sever.png&amp;diff=7298</id>
		<title>File:Ardor control screen started sever.png</title>
		<link rel="alternate" type="text/html" href="https://betaardordocs.jelurida.com/index.php?title=File:Ardor_control_screen_started_sever.png&amp;diff=7298"/>
		<updated>2019-10-11T11:33:27Z</updated>

		<summary type="html">&lt;p&gt;Petko: Petko uploaded a new version of File:Ardor control screen started sever.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The control screen of the Ardor app for Android when the server is started&lt;/div&gt;</summary>
		<author><name>Petko</name></author>
	</entry>
	<entry>
		<id>https://betaardordocs.jelurida.com/index.php?title=File:Ardor_server_launcheer.png&amp;diff=7268</id>
		<title>File:Ardor server launcheer.png</title>
		<link rel="alternate" type="text/html" href="https://betaardordocs.jelurida.com/index.php?title=File:Ardor_server_launcheer.png&amp;diff=7268"/>
		<updated>2019-10-08T13:41:38Z</updated>

		<summary type="html">&lt;p&gt;Petko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ardor Server launcher&lt;/div&gt;</summary>
		<author><name>Petko</name></author>
	</entry>
	<entry>
		<id>https://betaardordocs.jelurida.com/index.php?title=File:Android_unknown_app_warning.png&amp;diff=7267</id>
		<title>File:Android unknown app warning.png</title>
		<link rel="alternate" type="text/html" href="https://betaardordocs.jelurida.com/index.php?title=File:Android_unknown_app_warning.png&amp;diff=7267"/>
		<updated>2019-10-08T13:18:15Z</updated>

		<summary type="html">&lt;p&gt;Petko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Android unknown app warning&lt;/div&gt;</summary>
		<author><name>Petko</name></author>
	</entry>
	<entry>
		<id>https://betaardordocs.jelurida.com/index.php?title=File:Ardor_Android_Configuration_Screen.png&amp;diff=7258</id>
		<title>File:Ardor Android Configuration Screen.png</title>
		<link rel="alternate" type="text/html" href="https://betaardordocs.jelurida.com/index.php?title=File:Ardor_Android_Configuration_Screen.png&amp;diff=7258"/>
		<updated>2019-09-25T04:26:05Z</updated>

		<summary type="html">&lt;p&gt;Petko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Configuration screen of Android app&lt;/div&gt;</summary>
		<author><name>Petko</name></author>
	</entry>
	<entry>
		<id>https://betaardordocs.jelurida.com/index.php?title=File:Ardor_control_screen_server_not_started.png&amp;diff=7254</id>
		<title>File:Ardor control screen server not started.png</title>
		<link rel="alternate" type="text/html" href="https://betaardordocs.jelurida.com/index.php?title=File:Ardor_control_screen_server_not_started.png&amp;diff=7254"/>
		<updated>2019-09-23T20:13:14Z</updated>

		<summary type="html">&lt;p&gt;Petko: Petko uploaded a new version of File:Ardor control screen server not started.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The control screen of the Ardor app for Android before the server is started&lt;/div&gt;</summary>
		<author><name>Petko</name></author>
	</entry>
	<entry>
		<id>https://betaardordocs.jelurida.com/index.php?title=Template:BundlerFilters&amp;diff=3024</id>
		<title>Template:BundlerFilters</title>
		<link rel="alternate" type="text/html" href="https://betaardordocs.jelurida.com/index.php?title=Template:BundlerFilters&amp;diff=3024"/>
		<updated>2019-06-14T09:37:17Z</updated>

		<summary type="html">&lt;p&gt;Petko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Parameter&lt;br /&gt;
|-&lt;br /&gt;
|PersonalBundler&lt;br /&gt;
|Only bundle the transactions of the bundler account&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|PropertyBundler&lt;br /&gt;
|Only bundle transactions sent by accounts which have the &amp;quot;bundling&amp;quot; property set on them by the bundler account&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|AssetBundler&lt;br /&gt;
|Bundles only transactions for asset with ID provided as parameter&lt;br /&gt;
|Asset ID (numeric)&lt;br /&gt;
|-&lt;br /&gt;
|CurrencyBundler&lt;br /&gt;
|Bundles only transactions for MS currency with ID provided as parameter&lt;br /&gt;
|Currency ID (numeric). This is &#039;&#039;&#039;not&#039;&#039;&#039; the currency code&lt;br /&gt;
|-&lt;br /&gt;
|PurchaseBundler&lt;br /&gt;
|Bundles only purchases of digital goods sold by an account provided as parameter&lt;br /&gt;
|Account ID (numeric or RS format)&lt;br /&gt;
|-&lt;br /&gt;
|QuotaBundler&lt;br /&gt;
|Bundles transaction until the quota per account and transaction type is reached. The quota is provided as parameter.&lt;br /&gt;
|Max number of transactions per account and transaction type that will be accepted by the rule&lt;br /&gt;
|-&lt;br /&gt;
|TransactionTypeBundler&lt;br /&gt;
|Bundles only transaction types provided as parameter.&lt;br /&gt;
|Comma separated string, which contains the &amp;lt;type&amp;gt;:&amp;lt;subtype&amp;gt; pairs specifying the &amp;quot;type&amp;quot; and &amp;quot;subtype&amp;quot; identifier of the whitelisted transaction types. The &amp;quot;type&amp;quot; and &amp;quot;subtype&amp;quot; identifiers can be found in the transactionSubTypes field of the getConstants result. E.g. &amp;quot;7:1,7:2&amp;quot; bundles only ShufflingRegistration and ShufflingProcessing transactions.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Petko</name></author>
	</entry>
</feed>