<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://opentransactions.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=FellowTraveler</id>
	<title>Open Transactions - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://opentransactions.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=FellowTraveler"/>
	<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/Special:Contributions/FellowTraveler"/>
	<updated>2026-04-28T17:53:52Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.32.2</generator>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=File:Metier-screenshot.png&amp;diff=3231</id>
		<title>File:Metier-screenshot.png</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=File:Metier-screenshot.png&amp;diff=3231"/>
		<updated>2021-03-01T22:23:02Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Main_Page&amp;diff=3230</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Main_Page&amp;diff=3230"/>
		<updated>2019-07-21T19:34:32Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Open-Transactions ==&lt;br /&gt;
&lt;br /&gt;
'''[http://www.opentransactions.org/open-transactions.pdf Click here for white paper.]'''&lt;br /&gt;
&lt;br /&gt;
The Open-Transactions project is a collaborative effort to develop a robust, commercial-grade, fully-featured, '''free-software toolkit''' implementing the [[OTX|OTX protocol]] as well as a full-strength '''financial cryptography''' [[List_of_Classes|library]], API, GUI, command-line interface, and prototype notary server. The project is managed by a worldwide community of volunteers that use the Internet to communicate, plan, and develop the Open-Transactions toolkit and its related documentation.&lt;br /&gt;
&lt;br /&gt;
===Financial Cryptography===&lt;br /&gt;
&lt;br /&gt;
Financial cryptography means using using strong cryptographic techniques to create secure financial instruments, such as digital signing to create non-repudiable contracts, and encryption to create untraceable digital cash. In OT, transactions are unforgeable, receipts are destructible, and balances cannot be falsified or changed without user consent. OT is able to prove all balances, as well as which instruments are valid, and which transactions have closed, without storing any history except the last signed receipt.&lt;br /&gt;
&lt;br /&gt;
Open-Transactions implements financial instruments as Ricardian Contracts; contracts which can be understood both by humans and manipulated by software. &lt;br /&gt;
&lt;br /&gt;
All contracts in Open-Transactions use the same basic structure: all parties involved sign an agreement which is notarized by an independent third party witness. This technique is known as [[Triple-Signed Receipts]]. Importantly, transactions are formed and signed on the client side first, before being notarized by any server. An OT client is thus ensured that an OT notary server cannot falsify his receipts against his will, since the server can't forge the client's signature.&lt;br /&gt;
&lt;br /&gt;
This basic structure can be built upon to create many types of financial instruments.&lt;br /&gt;
&lt;br /&gt;
===Financial Instruments===&lt;br /&gt;
&lt;br /&gt;
Financial instruments are any representation of a financial agreement between two or more parties.&lt;br /&gt;
&lt;br /&gt;
The simplest financial instrument is a deposit agreement. A custodian of some asset (legal tender, or maybe gold) stores it on behalf of a depositor and agrees to redeem it on demand when presented with proof of a valid claim on the asset.&lt;br /&gt;
&lt;br /&gt;
Other types of financial instruments include securities, of which there can be many variations. A security is an instrument that entitles the bearer to a certain revenue stream, either because it represents a loan or perhaps because it represents equity in a business.&lt;br /&gt;
&lt;br /&gt;
Financial instruments in Open-Transactions have an issuer, who creates the contracts and is responsible for fulfilling the terms, and one or more bearers. Financial instruments are liabilities of the issuer owed to the bearers.&lt;br /&gt;
&lt;br /&gt;
===Working with Financial Instruments===&lt;br /&gt;
&lt;br /&gt;
Open-Transactions is designed to provide the highest security possible for both the issuers and bearers of financial instruments. Servers in Open-Transactions act as notaries which can witness and confirm balances, but cannot change them. Every party associated in a financial instrument can prove their balance to any other party, and no party can alter the balance of any other party without their agreement. Even a malicious notary cannot do this.&lt;br /&gt;
&lt;br /&gt;
Open-Transactions represents quantities of a given unit type as deposit agreements, which are signed by the bearer and a notary.&lt;br /&gt;
&lt;br /&gt;
Portions of a balance may be transferred between users via several asset-independent transaction types, including:&lt;br /&gt;
&lt;br /&gt;
; Transfers&lt;br /&gt;
: An atomic movement of funds from one account to a different account, like a bank account-to-account transfer.&lt;br /&gt;
; Cheques&lt;br /&gt;
: A payment which is not deducted from the sender's account until the recipient claims it.&lt;br /&gt;
; Vouchers&lt;br /&gt;
: A payment which is deducted from the senders account at the time of creation.&lt;br /&gt;
; Invoices&lt;br /&gt;
: A payment request which the recipient can opt to pay from any of his accounts.&lt;br /&gt;
; Cash&lt;br /&gt;
: Anonymous cryptographic tokens which can be securely redeemed by the recipient without revealing the sender.&lt;br /&gt;
; Market offers&lt;br /&gt;
: Open agreements to exchange a given quantity of one instrument type for a given quantity of another instrument type.&lt;br /&gt;
; Smart Contracts&lt;br /&gt;
: Customizable agreements between multiple parties, containing user-defined scripted clauses, hooks, and variables.&lt;br /&gt;
&lt;br /&gt;
==Use Cases==&lt;br /&gt;
&lt;br /&gt;
===Encouraged use cases===&lt;br /&gt;
&lt;br /&gt;
Encouraged uses cases are officially supported by Open-Transactions.&lt;br /&gt;
&lt;br /&gt;
====Deposit accounting====&lt;br /&gt;
&lt;br /&gt;
Entities that hold assets on behalf of depositors can use Open-Transactions to issue promissory notes as negotiable instruments.&lt;br /&gt;
&lt;br /&gt;
Examples of such depositories includes:&lt;br /&gt;
&lt;br /&gt;
* Precious metals&lt;br /&gt;
* Central bank currencies&lt;br /&gt;
* Cryptocurrencies&lt;br /&gt;
&lt;br /&gt;
====Payments====&lt;br /&gt;
&lt;br /&gt;
Users of OT negotiable instruments can authorize recurring payments to pay for services which operate on a billing cycle.&lt;br /&gt;
&lt;br /&gt;
====Bearer Securities====&lt;br /&gt;
&lt;br /&gt;
The negotiable instruments created by Open-Transactions can be used as the basis for financial products such as loans.&lt;br /&gt;
&lt;br /&gt;
===Discouraged use cases===&lt;br /&gt;
&lt;br /&gt;
Discouraged use cases are not supported by Open-Transactions, either because they violate the security requirements, or because they conflict with the philosophical goals of the project.&lt;br /&gt;
&lt;br /&gt;
In many cases, discouraged use cases may be achievable, but users are required to create and support their own smart contracts.&lt;br /&gt;
&lt;br /&gt;
====Third party balance editing====&lt;br /&gt;
&lt;br /&gt;
The only entity in Open-Transactions that can edit a balance is the holder of that balance receipt. Open-Transactions does not and will not include any functionality to bypass this design decision.&lt;br /&gt;
&lt;br /&gt;
------------------&lt;br /&gt;
&lt;br /&gt;
=== More Information ===&lt;br /&gt;
&lt;br /&gt;
[http://opentransactions.org/wiki/index.php/About About Open-Transactions]&lt;br /&gt;
&lt;br /&gt;
This product includes software developed by Ben Laurie for use in the [https://github.com/benlaurie/lucre Lucre] project.&lt;br /&gt;
&lt;br /&gt;
Credit for the OT logo goes to: [http://www.michpalmer.com/ moltenmich]&lt;br /&gt;
&lt;br /&gt;
=== Mailing list and IRC ===&lt;br /&gt;
&lt;br /&gt;
Mailing list: ot-dev@opentransactions.org&lt;br /&gt;
&lt;br /&gt;
[http://opentransactions.org/mailman/listinfo/ot-dev_opentransactions.org Subscribe to mailing list]&lt;br /&gt;
&lt;br /&gt;
IRC channel: '''#opentransactions''' on irc.freenode.net&lt;br /&gt;
&lt;br /&gt;
=== Sponsors and Contributors ===&lt;br /&gt;
&lt;br /&gt;
The OT community gratefully acknowledges the support and contributions of the following individuals and businesses to OT development: Chris Odom, Cameron Garnham, Randy Waterhouse, [[Monetas]].&lt;br /&gt;
&lt;br /&gt;
=== Install Programs ===&lt;br /&gt;
&lt;br /&gt;
[http://nightowl.cc/Moneychanger.dmg Mac OSX install for Moneychanger GUI] Self-contained.&lt;br /&gt;
&amp;lt;br /&amp;gt;Note: This Mac install of Moneychanger includes the notary server as well.&amp;lt;br /&amp;gt;It can be found at: /Applications/moneychanger-qt.app/Contents/MacOS/opentxs-notary&lt;br /&gt;
&lt;br /&gt;
[https://bitcointalk.org/index.php?topic=77301.msg859040#msg859040 (old) Windows binary installer ]&lt;br /&gt;
&lt;br /&gt;
=== White Paper ===&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf Open-Transactions White Paper]&lt;br /&gt;
&lt;br /&gt;
=== Source Code ===&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/opentxs Open-Transactions source code on github] (core library, client API, and 'opentxs' command-line client)&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/opentxs-notary Notary server source code on github] (Install OT core first)&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/Moneychanger Moneychanger GUI source code on github] (Install OT core first, and then build Moneychanger with the latest version of Qt Creator)&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Monetas&amp;diff=3222</id>
		<title>Monetas</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Monetas&amp;diff=3222"/>
		<updated>2016-01-17T06:37:05Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Monetas is a software company based in Zug, Switzerland, that was cofounded by Chris Odom, the creator of Open-Transactions. [http://www.opentransactions.org/open-transactions.pdf (Click for white paper.) ]&lt;br /&gt;
&lt;br /&gt;
Chris Odom [http://opentransactions.org/forum/index.php?topic=11922.0 stepped down] from Monetas in March 2015 and [http://opentransactions.org/forum/index.php?topic=11925.0 cofounded] [http://stashcrypto.com/ Stash]. He said, ''&amp;quot;When I cofounded Monetas in 2012 with Johann Gevers, our vision for the company was of a mobile money app and commercial notary software inspired by Open-Transactions, and with an emphasis on Africa.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Monetas was a major supporter of Open-Transactions development for several years, and spent significant financial and human resources on developing Open-Transactions from 2012 through 2015, while also implementing their own commercial notary and mobile wallet software inspired by Open-Transactions.&lt;br /&gt;
&lt;br /&gt;
Monetas has generously released their improvements to Open-Transactions under the [https://www.mozilla.org/en-US/MPL/2.0/ MPLv2] license, and the company is now solely focused on their own commercial implementation.&lt;br /&gt;
&lt;br /&gt;
Monetas' official website: http://monetas.net&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=FAQ&amp;diff=3221</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=FAQ&amp;diff=3221"/>
		<updated>2016-01-16T01:04:24Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: updates to some old info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''DO YOU HAVE A GUI YET?'''&lt;br /&gt;
&lt;br /&gt;
Yes... we have the QT/C++ client GUI [https://github.com/Open-Transactions/Moneychanger Moneychanger (Qt-based Desktop Client)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''CHAUMIAN CASH?'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Is this the '''real''' stuff? With blinded tokens? As in, invented by David Chaum?&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Yes, Open Transactions provides a full and working implementation of Chaumian blinded tokens. Specifically, the Wagner variant as implemented by Ben Laurie in his [http://anoncvs.aldigital.co.uk/lucre/ Lucre Project].&lt;br /&gt;
&lt;br /&gt;
Here's an intro [http://www.cs.bham.ac.uk/~mdr/teaching/modules06/netsec/lectures/DigitalCash.html article on digital cash].&lt;br /&gt;
&lt;br /&gt;
In the near future, I will also add Chaum's algorithm as well as Brands' -- Both are available in [http://www.cypherspace.org/credlib/ credlib].  To do this, FYI, basically I would make new subclasses of OTMint and OTToken, which call credlib functions instead of Lucre functions. Then you could specify which algorithms you prefer, in your currency contract.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''EXPLAIN THE DIFFERENCE BETWEEN &amp;amp;quot;NUMBERED ACCOUNTS&amp;amp;quot; and &amp;amp;quot;UNTRACEABLE&amp;amp;quot; and &amp;amp;quot;ANONYMOUS&amp;amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
A user account is '''numbered''' (it consists of a PGP key), so in this respect, it is '''pseudonymous''' (meaning, transactions can be tied to each other, but not to your real-life identity, presuming you use I2P or Tor.) The benefits of pseudo-anonymity are that your online Pseudonym (or &amp;amp;quot;Nym&amp;amp;quot;) has the potential to gain reputation over time, and also, that [[Instruments|many more instruments]] become possible when using accounts: Cheques, transfers, payment plans, markets with trades, etc. ([http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg See the diagram])&lt;br /&gt;
&lt;br /&gt;
Whether you use an account or not, '''The digital cash instrument itself is always untraceable, either way.'''  Meaning, the server can see that account# 38272 exchanged a token, but it doesn't know what withdrawal the token originally came from, and it won't know where and when it will eventually be spent. (Because tokens are blinded when the server signs them, and the server only sees a token's ID after it has been redeemed.) In fact, the server doesn't even know if you're just exchanging the same token over and over again because you're bored. (To learn more about the mathematics, google about &amp;amp;quot;Chaumian blinding&amp;amp;quot;.)&lt;br /&gt;
&lt;br /&gt;
''Then by adding an HTTPS cash-only interface (for token exchange), '''''you gain full anonymity''''' (as long as the user connects over I2P). But of course, in this case the user cannot use accounts, cheques, transfers, or cashier's cheques, since he is now operating '''&amp;amp;quot;cash-only&amp;amp;quot;.'''&lt;br /&gt;
&lt;br /&gt;
By full anonymity, I mean that all token exchanges, while already untraceable between the parties, are now additionally mixed with ''all of the other users' token exchanges'' (which are also being performed at the same cash-only interface), since ''the same user account is used for all of them'' (a dummy server Nym). There is also no record of any account balance changing, since no asset account is needed to exchange a token... and your real-life identity is hidden when connecting over an anonymous network. Here's a [http://billstclair.com/ot/OT-Anon-CashOnly.jpg diagram] of the fully-anonymous operation of OT.&lt;br /&gt;
&lt;br /&gt;
If the OT server itself is running on a network such as I2P, then the server may also choose to hide its identity and physical location, if it so chooses. Issuers may do the same. (Of course, this does not solve issues of trust.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''WHY DO YOU USE THE WORD &amp;amp;quot;CASH&amp;amp;quot; -- ISN'T THAT CONFUSING?'''&lt;br /&gt;
&lt;br /&gt;
Cash is the most accurate analogy.&lt;br /&gt;
&lt;br /&gt;
When you withdraw cash from the bank, and then later someone else deposits it, the bank has a record of a withdrawal and a deposit, but they don't know that it's the SAME cash, and they don't know who had it in between, or how many hands it passed through along the way. They simply can't trace it. These traits are also true of digital cash.&lt;br /&gt;
&lt;br /&gt;
The other digital financial instruments are much the same as their paper equivalents:&lt;br /&gt;
&lt;br /&gt;
* account '''transfer''' (a PGP-signed message, given directly to the bank, transferring funds to some other account),&lt;br /&gt;
* digital '''cheque''' (a signed message, given to the recipient, authorizing bank to transfer funds when presented),&lt;br /&gt;
* digital '''vouchers''' (like a cashier’s cheque. Funds are transferred to bank, who then issues a cheque. Bank becomes payer.),&lt;br /&gt;
* digital '''cash''' (Like a real cash withdrawal. Funds are transferred to bank, who then issues blinded, untraceable, bearer certificates), &lt;br /&gt;
&amp;lt;br&amp;gt;'''New: 2-way trades and re-occurring billing''' are also now functional!&lt;br /&gt;
&lt;br /&gt;
'''Remember, ''physical'' cash is not the actual value, it is only a transfer mechanism.''' YOU have to trust your government that your physical cash is backed with real value. (Whether that is gold, or silver, or &amp;amp;quot;their full faith and credit&amp;amp;quot; or whatever they claim that their currency is backed with.)&lt;br /&gt;
&lt;br /&gt;
'''''Digital'' cash is ALSO NOT actual value, it is ONLY a transfer mechanism.''' YOU have to trust the issuer of that cash, and the contract he used to issue it, and decide whether you trust that it is backed with real value. There is no escaping this basic fact (of electronic trading of any good) -- ''someone'' has to store the actual gold, or whatever it is, that supplies the actual backing value to the currency. And that is why Open Transactions is designed as best possible to distribute risk across multiple issuers (through basket currencies) as well as distributing risk in other ways (across a federation of transaction servers, across a diversity of jurisdictions, etc)&lt;br /&gt;
&lt;br /&gt;
''In Open Transactions, anyone can issue a currency. But the '''users''' still decide '''what they want to trade''' and '''who they want to trust.'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''So I can just give myself 1000000000000 Weaselbucks and then I can pay you in weaselbucks?'''&lt;br /&gt;
&amp;lt;br&amp;gt;''' Maybe I just don't get it.'''&lt;br /&gt;
&lt;br /&gt;
Most users will ''not'' issue any currency -- they will merely trade in established currencies, or baskets of those currencies. But anyone ''could'' issue a currency if he wanted to -- and the market ultimately decides which currencies actually get used. '''Most likely the currency people will choose to trade in will be some sort of Pecunix or other digital gold currency, not &amp;amp;quot;weaselbucks.&amp;amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
In Open Transactions, you can issue a currency onto multiple transaction servers (as many as you want.) A single currency can also have multiple issuers (via using basket currencies.) Users may choose to distribute their funds across a multiplicity of servers in a diversity of locations. A user's wallet software could even be written to have a list of servers, and do this distribution automatically.&lt;br /&gt;
&lt;br /&gt;
Imagine an eco-system with various different entities...&lt;br /&gt;
&lt;br /&gt;
Open Transactions is the software for the '''transaction server.'''&lt;br /&gt;
&lt;br /&gt;
Anyone choosing to act as an '''issuer''' could connect to such a transaction server and issue a currency. (Or even operate his own server.)&lt;br /&gt;
&lt;br /&gt;
MOREOVER, there will be a ''multiplicity'' of issuers ''and'' transaction servers, all operating in a ''diversity'' of jurisdictions. This is like the concept of &amp;amp;quot;Federated Software&amp;amp;quot; such as that proposed by the Diaspora project.&lt;br /&gt;
&lt;br /&gt;
There are other entities in this eco-system as well. The '''exchange''' companies in the local markets perform the work of exchanging digital currencies for the local &amp;amp;quot;coin of the realm.&amp;amp;quot; The exchanger, for you, might be your local coin shop. (Exchangers ''always'' pop up wherever there are multiple currencies. You could even buy chinese video game money right now, if you wanted to.)&lt;br /&gt;
&lt;br /&gt;
Digital currencies such as Pecunix, E-Gold (or Bitcoin) could all be used as backing for currencies issued on Open Transactions. It's all up to the issuer, who may or may not also be one of those entities. Users will take advantage of baskets in order to distribute risk across their favorite issuers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''HOW DOES THE CASH WORK?'''&lt;br /&gt;
&lt;br /&gt;
If you Google about &amp;amp;quot;chaumian digital cash&amp;amp;quot; you will find plenty of articles explaining it, including a good article from Wired.&lt;br /&gt;
&lt;br /&gt;
In Open Transactions, when the client software withdraws cash, it constructs blinded prototokens and sends them to the server. The server debits the asset account, signs the prototokens, and then sends those tokens back to the client, who unblinds them. (Now they are now ready to spend.)&lt;br /&gt;
&lt;br /&gt;
If you are an anonymous user connecting over Tor, then this step will occur through one of the server's exchange accounts, over an HTTPS interface specially set up for cash exchanges. (Meaning, you don't even need to have an account.)&lt;br /&gt;
&lt;br /&gt;
Later, when the token is spent, the payee deposits it into his own account at the server. (Or exchanges it.) When he does, the server sees the Token ID for the '''first time; it has no way of tracing it back to the withdrawal.''' The server then stores the token ID into a spent token database, in order to prevent double-spending of the token.&lt;br /&gt;
&lt;br /&gt;
You can see the full progression of the blinding code if you look here:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;1&amp;quot; style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;WITHDRAW (CREATE) PROTOTOKENS &lt;br /&gt;
&amp;lt;br&amp;gt;OTClient.cpp: &lt;br /&gt;
&amp;lt;br&amp;gt;else if (OTClient::notarizeWithdrawal == requestedCommand) // NOTARIZE WITHDRAWAL&lt;br /&gt;
&amp;lt;li&amp;gt;SIGN PROTOTOKENS &lt;br /&gt;
&amp;lt;br&amp;gt;OTServer.cpp:&lt;br /&gt;
&amp;lt;br /&amp;gt;void OTServer::NotarizeWithdrawal(OTPseudonym &amp;amp;amp; theNym, OTAccount theAccount, OTTransaction &amp;amp;amp; tranIn, OTTransaction &amp;amp;amp; tranOut)&lt;br /&gt;
&amp;lt;li&amp;gt;UNBLIND TOKENS &lt;br /&gt;
&amp;lt;br&amp;gt;OTClient.cpp:&lt;br /&gt;
&amp;lt;br /&amp;gt;void OTClient::ProcessWithdrawalResponse(OTTransaction &amp;amp;amp; theTransaction, OTServerConnection &amp;amp;amp; theConnection, OTMessage &amp;amp;amp; theReply)&lt;br /&gt;
&lt;br /&gt;
[The tokens are ready to spend now, and untraceable. Later, the client spends some tokens, by passing them to another wallet user. That payee deposits the tokens to verify them (perhaps immediately withdrawing again, if he just wants to exchange them for new ones.) The server has no way of knowing where the tokens came from, since they were blinded when they were issued. The server also has no way of knowing if the tokens represent a new payment to me from someone else, or if I am just exchanging and re-exchanging tokens that I already had, perhaps to fix an approaching expiration date. Below this point, that payee is now the client, since he now has the tokens...]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;DEPOSIT TOKENS (IN PURSE) &lt;br /&gt;
&amp;lt;br&amp;gt;OTClient.cpp: &lt;br /&gt;
&amp;lt;br&amp;gt;else if (OTClient::notarizePurse == requestedCommand) // NOTARIZE PURSE (deposit)&lt;br /&gt;
&amp;lt;li&amp;gt;VERIFY TOKENS &lt;br /&gt;
&amp;lt;br&amp;gt;OTServer.cpp:&lt;br /&gt;
&amp;lt;br /&amp;gt;void OTServer::NotarizeDeposit(OTPseudonym &amp;amp;amp; theNym, OTAccount &amp;amp;amp; theAccount, OTTransaction &amp;amp;amp; tranIn, OTTransaction &amp;amp;amp; tranOut)&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Also I suggest reading the OTToken and OTMint classes to see the actual Lucre calls being made.'''&lt;br /&gt;
&lt;br /&gt;
Update: The Spent Token Database is now operational as well!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''HOW DOES THIS COMPARE TO BITCOIN?'''&lt;br /&gt;
&lt;br /&gt;
Bitcoin is a distributed, p2p-based cryptocurrency, and its properties are quite complementary with Open Transactions. Both systems seem to solve different problems and indeed they solve problems for each other.&lt;br /&gt;
&lt;br /&gt;
'''Bitcoin gives OT:''' a universal &amp;amp;quot;glue&amp;amp;quot; between servers, a network of existing exchangers, and a publicly-auditable, reserve currency that cannot be confiscated or shut down.&lt;br /&gt;
&lt;br /&gt;
'''OT gives Bitcoin:''' Chaumian cash, instant finality of settlement, a wide range of financial instruments, and convertibility to other currencies on OT Markets. (Coming soon: voting pools for ''safe Bitcoin storage'' on ''low-trust OT servers''.)&lt;br /&gt;
&lt;br /&gt;
In more detail:&lt;br /&gt;
&lt;br /&gt;
Bitcoin Pros: &lt;br /&gt;
* Bitcoin cannot be confiscated since there are no real-world assets backing it. &lt;br /&gt;
* Bitcoin cannot be shut down since there is no central server. (Unlike Napster...) &lt;br /&gt;
* Bitcoin is publicly auditable, meaning reserves of Bitcoin can be verified. (This is a benefit of Bitcoin, for using it as a backing reserve, ''but it means that anonymizing layers are still necessary''.) &lt;br /&gt;
* Bitcoin cannot be counterfeited. Bitcoin is curiously similar to gold: it's perfectly fungible, recognizable, limited, evenly divisible, liquid, costly to obtain, valued, useful for trade, useful as a store of value, and possession is control. That is impressive!&lt;br /&gt;
&lt;br /&gt;
Bitcoin Cons: &lt;br /&gt;
* Bitcoin cannot be used for issuing currencies based on different asset types. (It's better to think of the Bitcoins themselves as a commodity, which is available p2p in a public way, but which could also be exchanged untraceably on an OT server the same as any other commodity or asset type.) &lt;br /&gt;
* Bitcoin is not untraceable by itself. (Due to being publicly auditable.)&lt;br /&gt;
* Bitcoin does not feature immediate settlement. (It takes ''time'' for several blocks before your transaction is secure. Ten minutes to an hour.)&lt;br /&gt;
&lt;br /&gt;
Opportunities: Since Bitcoin is publicly auditable, use it as the backing reserves for a currency issued on OT.&lt;br /&gt;
&lt;br /&gt;
Now those Bitcoins can be used untraceably as OT cash. Plus, all of the other instruments become available, and they can have instant finality of settlement (with receipts, if you prefer.) There are cheques, transfers, invoices, payment plans, vouchers, etc. The BTC is also now easily convertible in-or-out of any of the other asset types traded on OT markets.&lt;br /&gt;
&lt;br /&gt;
'''I would also like to point out that Bitcoin will probably serve as a &amp;amp;quot;glue&amp;amp;quot; between OT Servers and between various currencies, since it can be issued on any OT Server, and traded against all the other asset types on any server. This makes Bitcoin a universal medium as a result of its unique properties.'''&lt;br /&gt;
&lt;br /&gt;
To prevent Bitcoins from being stolen from any single OT server, my proposal is to bail them into ''voting pools in the blockchain itself'', so that 40 out of 50 other servers in the pool must verify signatures and vote before voting to release bitcoins and bail them out of the pool. (These servers must share audit data to make this possible. [[CENTRALIZED|The concept is discussed in more depth here]].)&lt;br /&gt;
&lt;br /&gt;
NOTE: Some people have speculated that I might be Satoshi Nakamoto (creator of Bitcoin.) But I cannot take credit for his genius. Definitely: '''not''' me. The most likely candidate IMO is Wei Dai--but perhaps it will always be a mystery. OT will still greatly benefit from his invention, however. So thanks, whoever you are.&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
OT clients will end up as p2p software, since they derive benefits from comparing notes on the servers. An OT client could be written that is simultaneously a Bitcoin node, and even also a Ripple node as well. In fact, over the long time I think it will also merge with anonymous networks. I think there is a lot of potential for development on the client/wallet/anonymous-node side where all these sorts of technologies will start to be tied together.&lt;br /&gt;
&lt;br /&gt;
I would like to see the server side of OT become completely distributed as well. However, I expect that in the near future this picture will more closely resemble a federated system such as that proposed by Diaspora. Remember that even Tor has directory servers, as well as special bridge nodes and relay nodes. An Open Transactions server would be a similar service, and could run hidden on an anonymous network, and could even profit while doing so, since OT makes anonymous profits possible. More importantly, this means that digital cash software like OT can help solve problems of resource allocation on anonymous networks.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''IS OT &amp;amp;quot;DISTRIBUTED&amp;amp;quot; or &amp;amp;quot;FEDERATED&amp;amp;quot; or &amp;amp;quot;P2P&amp;amp;quot; or &amp;amp;quot;CLIENT/SERVER&amp;amp;quot; ...OR WHAT?'''&lt;br /&gt;
&lt;br /&gt;
OT, at a basic level, ''is'' client/server. (There must be a signer in order to have chaumian cash.) Contrast this with fully distributed digital commodities, like Bitcoin, which rely on block chains and therefore cannot be untraceable.&lt;br /&gt;
&lt;br /&gt;
'''However, OT will end up with P2P Clients and Federated Servers. Here's why:'''&lt;br /&gt;
&lt;br /&gt;
On the server side, my vision for OT is of '''FEDERATED servers, similar to DIASPORA or the FREEDOM BOX'''. That is, many servers, operated by separate entities, forming a single eco-system for all, but with no central point of failure. Just like Diaspora. (And those servers could run on anonymous networks. In the past, anonymous servers had no way of receiving payment, and thus remained the realm of enthusiasts and hobbyists--but OT solves this.)&lt;br /&gt;
&lt;br /&gt;
This is already becoming the case. For example, Loom is operational, and we know it will not be the only transaction server in the world. Thus the same issuers will undoubtably issue the same digital assets on Loom AND other transaction servers simultaneously. Therefore we can already see that there will be multiple issuers, and multiple transaction servers, and that these separate entities will operate in a diversity of jurisdictions, and indeed this is already what is happening.&lt;br /&gt;
&lt;br /&gt;
'''Because the SAME digital asset types, from the SAME issuer, will be available on MORE THAN ONE server, this means that transfers from server to server can be negotiated by the issuers directly, as well as by the users (via a Ripple-like protocol.) In other words, cutting the transaction servers themselves out of the loop'''.&lt;br /&gt;
&lt;br /&gt;
For example, if I wanted to move some FT-Gold from Server A to Server B, then I don't have to involve Server A or B directly. Instead, I just make the request to FT-Gold, and THEY do the transfer, since they already exist at both ends.&lt;br /&gt;
&lt;br /&gt;
Similarly, wallet users themselves can perform this function. They can even devise lists and rules about WHICH asset types they accept, and WHICH servers they trust, and how much of a cut they charge for exchange... allowing funds to &amp;amp;quot;flow&amp;amp;quot; p2p from user to user, even changing currency types along the way. (This is the whole idea behind Ryan Fugger's ''Ripple'' system.) So if I have dollars, and I want to pay someone who only accepts gold, then the Ripple just finds a &amp;amp;quot;6 degrees of separation&amp;amp;quot; between us through our friends, and converts the currency as it ripples.&lt;br /&gt;
&lt;br /&gt;
I think that '''servers can also directly negotiate transfers to other servers'''. (Since they both have signed receipts from the same issuer, they can potentially negotiate the transfer between each other, from server to server, and drop the receipts into the issuer's accounts on both sides. This might require the issuer to run a server of his own for the transfer protocol to work, I have to think about it.)&lt;br /&gt;
&lt;br /&gt;
This, btw, does NOT mean that the cash tokens from one server would be redeemable at another server. They would not: When a SPECIFIC TOKEN has been issued by a SPECIFIC SERVER, then that token must be REDEEMED at the SAME SERVER. This is because only that server knows for sure if the tokens are still good. But the funds can nevertheless flow rather easily between servers, as described above, once they have been redeemed.&lt;br /&gt;
&lt;br /&gt;
'''I would also like to point out that Bitcoin will probably serve as a &amp;amp;quot;glue&amp;amp;quot; between OT Servers and between various currencies, since it can be issued on any OT Server, and traded against all the other asset types on any server. This makes Bitcoin a universal medium as a result of its unique properties.'''&lt;br /&gt;
&lt;br /&gt;
ON THE CLIENT SIDE, the wallets ALSO NEED TO BE P2P! This is because the wallets need to COMPARE NOTES with each other on the various servers, TO KEEP THE SERVERS HONEST.&lt;br /&gt;
&lt;br /&gt;
'''For example, if a server gave you a different public mint file than it gave to the other users, then your cash -- which you thought was untraceable -- suddenly becomes fully traceable'''. Therefore your wallet has a strong incentive to compare its copy of the public mint file (or a hash of that file) with the same data of other wallets on the p2p network.&lt;br /&gt;
&lt;br /&gt;
'''The wallets will also need to be p2p due to the &amp;amp;quot;Ripple&amp;amp;quot; possibilities outlined above. Users will automatically earn percentage cuts for money flows through their wallets, and centralized sources will no longer be necessary for &amp;amp;quot;wire transfers&amp;amp;quot; as they were in the 20th Century'''.&lt;br /&gt;
&lt;br /&gt;
EVERY TRANSACTION must be accompanied by a signed receipt containing a balance agreement. This means that in the event of a dispute, or '''if any specific transaction server goes down, ALL OF THE USERS should be able to present their LATEST SIGNED RECEIPTS to the issuer, and recreate their accounts'''.&lt;br /&gt;
&lt;br /&gt;
Since the cash is untraceable, it becomes possible for transaction servers to run, AT A PROFIT, anonymously and untraceably, on an anonymous network such as I2P. '''(Meaning, even though a server is NECESSARY, and I can't currently get around that, it CAN BE HIDDEN, AND FEDERATED, and PAID FOR. Think of it like a Tor Directory Server or something.)'''&lt;br /&gt;
&lt;br /&gt;
Just as the issuer on Loom does not actually operate the Loom server, so will the issuers who use various OT servers be able to operate independently of the server operation itself. Even unauthorized 3rd parties could issue their own &amp;amp;quot;pecunix-backed&amp;amp;quot; currency on an OT server(s) somewhere, if they wanted to--and it is up to the market to DECIDE WHO THEY TRUST.&lt;br /&gt;
&lt;br /&gt;
'''A single currency can also be distributed across multiple issuers (using basket currencies.)''' A user might feel unsafe putting his currency in 100% pecunix. Perhaps he prefers 33% pecunix, 33% goldmoney, and 33% c-gold. That's fine! Users can define baskets and trade them on markets, etc, and distribute a single currency across multiple issuers. Even a hundred issuers! The basket currencies do not take any additional system resources, they are just another asset type ID the same as any normal asset type.&lt;br /&gt;
&lt;br /&gt;
Another example of risk distribution: '''A nice wallet software can be designed to automatically distribute funds across MULTIPLE SERVERS. The little &amp;amp;quot;pile of gold&amp;amp;quot; that I see on the screen might actually be distributed across 10 accounts on 10 different servers.''' But this is seamless for me (LIKE DIASPORA) since transfers are possible between the servers, since the same issuers are available on multiple servers.&lt;br /&gt;
&lt;br /&gt;
For the user it's as easy as making a list of the servers he trusts, and the asset types that he trusts, and the wallet can be programmed to DO THE REST AUTOMATICALLY.&lt;br /&gt;
&lt;br /&gt;
So FYI, OT is NOT fully-distributed/p2p, and in fact cannot be so currently (the cash instrument needs a server somewhere in order to be untraceable), but it still has a vision for the DISTRIBUTION OF RISK and for solving THE NAPSTER PROBLEM (single point of failure.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''HOW DOES THIS COMPARE TO E-GOLD OR PECUNIX?'''&lt;br /&gt;
&lt;br /&gt;
The first big difference is that E-Gold and Pecunix are actual ''companies'', whereas Open Transactions is merely a piece of software, that could be downloaded and used by anyone.&lt;br /&gt;
&lt;br /&gt;
As far as I know, e-gold and other outfits like it specialize primarily in one specific instrument: ''account transfer''. Not cheques or cash -- only account transfer. (This means that none of them offer untraceable cash.)&lt;br /&gt;
&lt;br /&gt;
Open Transactions supports account transfer, ''and'' digital cheques, ''and'' digital cash.&lt;br /&gt;
&lt;br /&gt;
An outfit like Pecunix (btw, they are no relation to this project) could potentially ''use'' this software to issue cash backed in their gold. Also, there is nothing to prevent other, 3rd-party entities from issuing Pecunix or E-Gold ''backed'' currencies on an Open Transaction server. In that case, the issuer is merely a third party whose currency contract promises to be backed with [name your favorite digital gold currency].&lt;br /&gt;
&lt;br /&gt;
In that case, people could simply connect to the server and trade those currencies, even without the direct involvement of entities such as E-Gold or Pecunix. It's now between the trader, the server operator, and the issuer (and the exchanger.) '''Pecunix, in this scenario, would serve as the backing for the currency, but would have no direct involvement with the operation of the transaction server itself''' (or, even, with the issuer, since the two could deal through the various exchangers in the various local jurisdictions.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''HOW DOES ''OPEN TRANSACTIONS'' COMPARE TO ''LOOM''?'''&lt;br /&gt;
&lt;br /&gt;
Loom was what inspired me that the issuers could be a separate entity from the server operator. The issuer, on Loom, is just another user, who has decided to issue a new currency. There might be hundreds of different currencies issued on Loom. This ''separation of powers'' is also used in Open Transactions. Congratulations to Patrick Chkoreff for his excellent work in developing [http://loom.cc/ Loom].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''HOW DOES ''OPEN TRANSACTIONS'' COMPARE TO ''RIPPLE''?'''&lt;br /&gt;
&lt;br /&gt;
[http://ripple-project.org/ Ripple] is a great idea from Ryan Fugger. The concept is that users can be socially networked and issue credit to each other. This makes it possible for funds to &amp;amp;quot;flow&amp;amp;quot; through users so that two otherwise unrelated parties, using two otherwise unrelated payment systems, can still send payments to each other, via a &amp;amp;quot;six degrees of separation&amp;amp;quot; through a social network of mutual friends. (Sort of like Hawala.)&lt;br /&gt;
&lt;br /&gt;
I believe that Ripple, or something like it, will be built into a future version of the client software for Open Transactions (or something like it.) It's just obviously on the horizon, as far as I can tell. This will allows users all over to send funds into different payment systems '''without having to involve a central authority or do a wire transfer.''' Instead, the transfer will just flow through other users and cut out any &amp;amp;quot;banking system transfer&amp;amp;quot; entirely.&lt;br /&gt;
&lt;br /&gt;
With users incorporating such software, it will no longer even be necessary to add &amp;amp;quot;server transfer&amp;amp;quot; features to Open Transactions. Users will do their own transfers using Ripple. I can't wait to see the first really cool client software that incorporates all of these ideas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''HOW DOES ''OPEN TRANSACTIONS'' COMPARE TO TRULEDGER (formerly ''TRUBANC'')?'''&lt;br /&gt;
&lt;br /&gt;
The Open Transactions protocol for account-to-account transfers is similar to the one in Truledger. Bill St. Clair made a big contribution with his work on [http://truledger.com/ Trueledger].&lt;br /&gt;
&lt;br /&gt;
When using the ACCOUNT TRANSFER instrument (instead of cheques, or cash) these are the signatures that are received by all parties:&lt;br /&gt;
&lt;br /&gt;
ALICE &lt;br /&gt;
&amp;lt;br&amp;gt;- Alice gets the server's signature on her transfer request (whether it is accepted or rejected, she still gets a signed receipt.) &lt;br /&gt;
&amp;lt;br&amp;gt;- She gets Bob's signature (in her inbox) accepting her transfer when he processes his own inbox. \n&amp;lt;br&amp;gt;- She also gets the server's signature on that. &amp;lt;br&amp;gt;- She'll also get the server's signature on an agreement of balance at the same time.&lt;br /&gt;
&lt;br /&gt;
BOB &lt;br /&gt;
&amp;lt;br&amp;gt;- Bob gets Alice's signature sending the original transfer, which appears in his inbox. \n&amp;lt;br&amp;gt;- He also has the server's signature on that. &lt;br /&gt;
&amp;lt;br&amp;gt;- Then, when he accepts her transfer, he will get a signed receipt from the server when his balance is updated. &lt;br /&gt;
&amp;lt;br&amp;gt;- He will also have a signed balance agreement from the server at this time.&lt;br /&gt;
&lt;br /&gt;
THE SERVER &lt;br /&gt;
&amp;lt;br&amp;gt;- The server gets Alice's signature on the transfer request. &lt;br /&gt;
&amp;lt;br&amp;gt;- The server gets Bob's signature accepting Alice's transfer. &lt;br /&gt;
&amp;lt;br&amp;gt;- The server gets Alice's signature acknowledging Bob's acceptance (when she removes his accept notice from her inbox.) &lt;br /&gt;
&amp;lt;br&amp;gt;- The server will also have Alice AND Bob's agreement on both of their balances, allowing the server to destroy any other records.&lt;br /&gt;
&lt;br /&gt;
Not to complicate things, but on each of the above (on each balance agreement), there is also: &lt;br /&gt;
&amp;lt;br&amp;gt;- a list of transaction numbers still outstanding (signed out by the Nym). &amp;lt;br&amp;gt;- a list of pending transactions, and signed receipts, awaiting approval in the inbox. &lt;br /&gt;
&amp;lt;br&amp;gt;- ...and a similar list of pending outgoings (in the outbox.)&lt;br /&gt;
&lt;br /&gt;
You can see why we call it &amp;amp;quot;[[Triple-Signed Receipts]]&amp;amp;quot; for account transfer!&lt;br /&gt;
&lt;br /&gt;
For more info, check out Bill St. Clair's document: [http://truledger.com/doc/plain-english.html]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;''HOW DOES ''OPEN TRANSACTIONS'' COMPARE TO ''RICARDO'' BY SYSTEMICS?''&lt;br /&gt;
&lt;br /&gt;
[http://www.financialcryptography.com/ Ian Grigg] has commented that Open Transactions is along the same lines as Ricardo.&lt;br /&gt;
&lt;br /&gt;
Open Transactions has definitely adopted the '''[http://iang.org/papers/ricardian_contract.html Ricardian Contract]''' form, which is one of his innovations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''HOW DOES ''OPEN TRANSACTIONS'' COMPARE TO ''eCache''?'''&lt;br /&gt;
&lt;br /&gt;
'''eCache''' is an actual, anonymous internet bank, whereas Open Transactions is the ''sort of software'' that such a bank might run. (As a library, OT has many more uses than this, but this is a pretty good description for the OT server software.)&lt;br /&gt;
&lt;br /&gt;
As far as I know, eCache supports a '''&amp;amp;quot;Tor / HTTPS, Cash-Only Interface&amp;amp;quot; like the one described in this FAQ,''' and their users exchange bearer tokens through it, '''backed in gold''' and other precious metals.&lt;br /&gt;
&lt;br /&gt;
(What actual software they use over at eCache, and their math implementation, I have no idea -- I haven't seen their code.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''WHAT IF I WANT TO EXCHANGE TOKENS, BUT WITHOUT CREATING AN ACCOUNT?'''&lt;br /&gt;
&lt;br /&gt;
This is easy: '''the server operator just provides an HTTPS interface where people can paste their tokens and receive new ones. This way the super-paranoid people can still exchange tokens all they want without creating an &amp;amp;quot;account&amp;amp;quot;.''' (Notice that it must be the server operator who provides this interface, otherwise you now have to trust the interface provider.)&lt;br /&gt;
&lt;br /&gt;
Keep in mind, that an &amp;amp;quot;account&amp;amp;quot; on an Open Transactions server is not like an account at a bank. It's just a communication key. It consists of ONLY a PGP public key -- and its primary purpose is so the server can encrypt your replies before sending them back to you. You can open as many &amp;amp;quot;accounts&amp;amp;quot; as you wish, and each of these can open as many asset accounts as you wish, and you can connect to them over Tor, and...&lt;br /&gt;
&lt;br /&gt;
'''Here is the most critical part: even if you use an account, which you don't have to do, digital cash is STILL UNTRACEABLE.''' The blinded tokens can be withdrawn and deposited at will, (in fact that's all an exchange is) and the server cannot trace where they came from or who you will spend them to. Cash is like this whether you use an account or not.&lt;br /&gt;
&lt;br /&gt;
In fact, even if you exchange a thousand tokens, the server doesn't even know whether you are just exchanging the same token over and over again a thousand times or whether it is actually a new token each time. And it has no idea where it came from.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''AN INVOICE IS JUST A NEGATIVE CHEQUE? PLEASE EXPLAIN.'''&lt;br /&gt;
&lt;br /&gt;
If I write you a cheque for $50, and then you present it at the OT Server, (at that time selecting a specific account to deposit it to) then the server will take $50 out of my account (the one the cheque is drawn on), and put $50 into your selected account.&lt;br /&gt;
&lt;br /&gt;
Whereas if I write you a cheque for -$50 (NEGATIVE 50!), and then you present it at the server (at that time selecting a specific account to pay it from), then the server will take $50 out of your selected account, and put it into my account (the one the invoice is drawn on.)&lt;br /&gt;
&lt;br /&gt;
So it is the exact thing happening either way. The only difference is, when you use a negative amount, the functionality mirrors that of an invoice, so I decided to allow negative amounts on a cheque (the wallet software should know to display such instruments as invoices, as opposed to regular cheques, since it can see the amount.)&lt;br /&gt;
&lt;br /&gt;
Negative transfers do not occur with any other instrument, such as payment plans, markets, cash, and account transfer. They are only allowed with cheques, because the functionality is so useful on both sides (and requires voluntary signing and submission on both sides in order to be processed, in any case...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''THE TRANSPORT LAYER...'''&lt;br /&gt;
&lt;br /&gt;
-- '''The Open Transactions library itself is entirely agnostic to transport!''' All messages serialize to a string and you can transport them however you wish.&lt;br /&gt;
&lt;br /&gt;
-- The Server, API, and Test Client currently use the ZeroMQ library for all transport.&lt;br /&gt;
&lt;br /&gt;
-- This code is easy to swap out, due to its localization to a single callback.&lt;br /&gt;
&lt;br /&gt;
-- The library does all the heavy lifting of generating and [[Messaging|processing the OTMessages]].&lt;br /&gt;
&lt;br /&gt;
-- In most cases, the developers will make easy calls to the [[API]], which abstracts away the lower-level HTTP calls (that are being made behind the scenes to transfer the messages.) Instead the developer uses higher-level functions like &amp;amp;quot;Withdraw Cash&amp;amp;quot; or &amp;amp;quot;Write Cheque.&amp;amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''WHAT DATABASE DOES OPEN TRANSACTIONS USE?'''&lt;br /&gt;
&lt;br /&gt;
* Internally, the software uses signed XML contracts nearly exclusively, and is agnostic to where and how they are stored.&lt;br /&gt;
* '''All of the classes serialize to a STRING'''&lt;br /&gt;
* '''There is also an OTStorage abstraction used throughout the library''', which is capable of storing and retrieving plain strings, binary data, and data objects from &amp;amp;quot;OT local storage&amp;amp;quot;.&lt;br /&gt;
* Binary data is compressed and packed to architecture-neutral formats. '''Msgpack and Protobuf are both supported packers''' (based on compile-time and run-time options.)&lt;br /&gt;
* OT comes with a default subclass of OTStorage (OTStorageFS) that reads/writes to the filesystem. '''But by providing your own subclass, you can change OT to use any storage location you want.'''&lt;br /&gt;
* OT Storage paths are usable as keys or as filenames. So &amp;amp;quot;nyms/a6b123874ef2v1cc3.nym&amp;amp;quot; could be the key in a table instead of a filename on a filesystem.&lt;br /&gt;
* I assume this will eventually move towards some distributed db or &amp;amp;quot;data haven&amp;amp;quot;. I would like to integrate with such a project. (This is another great opportunity IMO -- integrating digital cash with distributed data stores and anonymous networks.)&lt;br /&gt;
&lt;br /&gt;
Feedback? Anyone?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''WHAT ABOUT CHAUM'S TRICK FOR IDENTIFYING THE DOUBLE-SPENDER?'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;FellowTraveler, does your blinded digital money work like Chaum's, in that a double-spend reveals the identity of the double-spender (in as much as a public key is an identity...)&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The answer is '''NO'''.&lt;br /&gt;
&lt;br /&gt;
When digital cash is issued, a blind signature is employed, meaning that at redemption, the server can see that the cash is good, but it has no way of knowing which withdrawal it actually came from. ''(If you continually exchange the same cash token over and over again, the server simply cannot tell whether it is the same token every single time, or whether it is a completely different token each time. It simply cannot see where the token originally came from.)''&lt;br /&gt;
&lt;br /&gt;
Once a token is spent, then the server CAN see its actual Token ID, which it records into a spent token database. If someone tries to double-spend that token, the server will refuse to accept it because it is already recorded as spent. While the server cannot see the perpetrator, it ''does'' have the potential to access the ID of the other victim who deposited it before you tried to (assuming, that is, that such info is stored in the spent token record, and assuming that an anonymous cash-only interface wasn't used) which may help in tracking down the perpetrator in real life.&lt;br /&gt;
&lt;br /&gt;
Right now, Open Transactions does not store the User ID of the depositor. (Even if it did, this couldn't prove who or where he got it from.) If the token is still good, then the deposit or exchange will be successful, and in the case of an exchange, the user will be issued a replacement token, ''which is again, untraceable, and now only he knows the token ID of it, since it is new and blind-signed''. At this point no one else can possibly spend it but him.&lt;br /&gt;
&lt;br /&gt;
If a merchant receives a token from someone, and tries to exchange it, and the server ''refuses'' it (because it was found in the spent token database) then in this case, while you may see the victim (the merchant) you cannot see the perpetrator who originally withdrew it. This is untraceable.&lt;br /&gt;
&lt;br /&gt;
So what could be done?&lt;br /&gt;
&lt;br /&gt;
What the server ''could'' do is leave a notice in the inbox of the victims, warning them that a certain piece of cash they ALL tried to process was double-spent and fraudulent, and via this, try to find out the common source of the cash in real life, (if that was the server policy to do such a thing.)&lt;br /&gt;
&lt;br /&gt;
Although this could possibly lead to the perpetrator in real life, it will probably not ever be necessary. In practice, this will not be a problem: '''No one will ever accept cash in the first place without exchanging the tokens first to validate and secure them.''' In other words, if you are standing in front of me, or if I am selling to you online, I will obviously not accept your cash (or your purchase) if the cash doesn't validate with the server. Instead, I'll simply refuse the transaction.&lt;br /&gt;
&lt;br /&gt;
Similarly, if you are somewhere else on the internet, then we are probably communicating through a &amp;amp;quot;cash streaming protocol.&amp;amp;quot; As soon as the little pieces of digital postage stop verifying, then I will stop serving you the high-speed anonymous download that you were doing through my computer's anonymous network node.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''LINUX?'''&lt;br /&gt;
&lt;br /&gt;
GOOD NEWS: Open Transactions is now available for Linux! Make sure you download the latest version of the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''FreeBSD?'''&lt;br /&gt;
&lt;br /&gt;
GOOD NEWS: Open Transactions is now available for FreeBSD!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''WINDOWS?'''&lt;br /&gt;
&lt;br /&gt;
GOOD NEWS: Open Transactions is now available for Windows!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''ANDROID?'''&lt;br /&gt;
&lt;br /&gt;
GOOD NEWS: Open Transactions is now available for Android!&lt;br /&gt;
&lt;br /&gt;
All supported platforms come with easy makefiles, project files, and instructions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''RUBY / PYTHON / PHP / Java ?'''&lt;br /&gt;
&lt;br /&gt;
Open Transactions now comes with Native APIs for:&lt;br /&gt;
&lt;br /&gt;
Java, Ruby, Python, Perl, PHP, C, C++, Obj-C, C#, Tcl, and Lisp.&lt;br /&gt;
&lt;br /&gt;
Open Transactions was written in C++ because '''Lucre itself is written in C++ and Java,''' and Open Transactions was originally conceived as a usable wrapper for Lucre. (Lucre is what does the actual math for the Chaumian properties of the digital cash.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''How about portability?'''&lt;br /&gt;
&lt;br /&gt;
The software now builds and runs on Mac OS X, FreeBSD, Linux, Android, and Windows. It also comes with Native APIs for many languages (see above.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''CAN YOU CONVERT THE LIBRARY TO ''C'' ?'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;You deserve praise for Open-Transaction, a most valuable piece of work. Unfortunately however, for various software engineering reasons, (integration, portability, reliability, ease of verification...) it should have been a C (''not'' C++) library. (If it was, I would probably start right now implementing something 'operational' based on it).&lt;br /&gt;
&lt;br /&gt;
My questions are: &lt;br /&gt;
&amp;lt;br&amp;gt;1) would you consider turning main components of it into C? &lt;br /&gt;
&amp;lt;br&amp;gt;2) would you assist someone attempting to do the same?&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Thank you for your kind words.&lt;br /&gt;
&lt;br /&gt;
I don't think I could spend the time rewriting it in C unless there was some money in it for me. (I just can't afford to burn another 2 months of my life.)&lt;br /&gt;
&lt;br /&gt;
However, it shouldn't be too difficult to convert...&lt;br /&gt;
&lt;br /&gt;
# The library doesn't use any exception handling -- it's all return values.&lt;br /&gt;
# I would convert the class members to a struct.&lt;br /&gt;
# I would convert the class methods to normal functions, with an additional &amp;amp;quot;this&amp;amp;quot; pointer passed in (for the struct)&lt;br /&gt;
# Have to make sure to call the constructor / destructor by hand whenever a struct is created or deleted.&lt;br /&gt;
# Is there anything else? Historically, C++ was processed into C code before compilation, so it seems to me that you should actually be able to download a TOOL that will convert the code FOR you. That would probably be the fastest/easiest and would enable to keep the two versions current with each other.&lt;br /&gt;
&lt;br /&gt;
I see this software more as a standard than as an implementation; I'd love to see different versions of it released in different languages, I just can't afford to write them all myself.&lt;br /&gt;
&lt;br /&gt;
One more thing: I mainly wrote this code in order to make Lucre (the blinded token portion) available for actual use (instead of just being a demonstration of the math.) And the Lucre library (by Ben Laurie) is also written in C++ (and Java.)&lt;br /&gt;
&lt;br /&gt;
So Lucre itself would also need to be converted, whether by hand or using a tool.&lt;br /&gt;
&lt;br /&gt;
NOTE: There is now a C function [[API]] that comes with Open Transactions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''WHAT ABOUT CHAUM'S CUT-AND-CHOOSE PROTOCOL?'''&lt;br /&gt;
&lt;br /&gt;
The OTToken class was originally designed for cut-and-choose, because I mistakenly thought it would be necessary with Lucre. You can read more about that &amp;amp;quot;here.&amp;amp;quot;:http://wiki.github.com/FellowTraveler/Open-Transactions/lucre-and-denominations&lt;br /&gt;
&lt;br /&gt;
Basically, Open Transactions does not need cut-and-choose in order to still have effective blinding and thus, still be untraceable. However, the library DOES support cut-and-choose, since it was originally designed under the assumption that it would be necessary. Pretty cool, huh?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''WHAT ABOUT BRANDS' PROTOCOL? WHAT ABOUT XYZ PROTOCOL?'''&lt;br /&gt;
&lt;br /&gt;
I would like to incorporate as many different digital cash protocols as possible into this software. If you have some good code in C or C++, I would love to check it out. I would like to see the community eventually add whatever new protocols they wish to the software over time, so that it supports all the top algorithms and protocols. (JUST LIKE PGP -- THAT'S THE IDEA.)&lt;br /&gt;
&lt;br /&gt;
In the near future, I will also add Chaum's algorithm as well as Brands' -- Both are available in [http://www.cypherspace.org/credlib/ credlib]. To do this, FYI, basically I would make new subclasses of OTMint and OTToken, which call credlib functions instead of Lucre functions. Then you could specify which algorithms you prefer, in your currency contract.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''HOW DO I VIEW THE BASE64-ENCODED DATA THAT APPEARS IN THE FILES AND MESSAGES?'''&lt;br /&gt;
&lt;br /&gt;
The data is always either encrypted, or just base64-encoded.&lt;br /&gt;
&lt;br /&gt;
If the data is only base64-encoded, then type &amp;amp;quot;decode&amp;amp;quot; and paste the data. Now hit enter and you will see the decoded contents.&lt;br /&gt;
&lt;br /&gt;
But if the data is encrypted, it will probably start with 3 A's (&amp;amp;quot;AAA&amp;amp;quot;). Type &amp;amp;quot;decrypt&amp;amp;quot; on the command-line (testwallet). Now paste the data and hit enter. The decrypted data will be displayed on your screen. This will only work if the nym is loaded (as long as you have typed &amp;amp;quot;load&amp;amp;quot; you'll be fine.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''WHY IS CASH WITHDRAWAL FAILING?'''&lt;br /&gt;
&lt;br /&gt;
The mint must be generated separately from the server process. (Otherwise the server would freeze up for 10 minutes while the keys are being generated.)&lt;br /&gt;
&lt;br /&gt;
Thus, there is a separate utility called &amp;amp;quot;createmint.exe&amp;amp;quot; located in the transaction/data_folder directory. Run it for instructions. It may ask for specific IDs, which can all be found inside this file: transaction/data_folder/notaryServer.xml&lt;br /&gt;
&lt;br /&gt;
Eventually the server will automatically spawn createmint as a separate process whenever it needs to, but for now, you have to run it by hand if your mint has expired.&lt;br /&gt;
&lt;br /&gt;
The Moneychanger GUI is smart enough to check the expiration date on any Mint, and download the latest version if it's expired.&lt;br /&gt;
&lt;br /&gt;
(Why do Mints expire, you ask? Because otherwise the spent-token database would become a maintenance nightmare, where server operators are forced to store an ever-growing database--forever!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''WHAT IF I WANT TO CREATE MY OWN CONTRACTS?'''&lt;br /&gt;
&lt;br /&gt;
Look in the Open-Transactions/sample-contracts folder: The .otc files ARE SIGNED. The .xml files are NOT signed.&lt;br /&gt;
&lt;br /&gt;
(Otherwise they are identical.)&lt;br /&gt;
&lt;br /&gt;
The public key of the issuer must be INSIDE the contract. (In the sample contracts, it's the first key that appears.)&lt;br /&gt;
&lt;br /&gt;
The contract must be SIGNED with THAT SAME KEY.&lt;br /&gt;
&lt;br /&gt;
Go to Open-Transactions/testwallet/data_folder and you'll find a file called signcontract.exe, which you can use for signing contracts. You can also use the testwallet.exe (command line utility) to sign contracts. Soon a &amp;amp;quot;contract signing page&amp;amp;quot; will be added to Moneychanger, but I haven't gotten around to it yet.&lt;br /&gt;
&lt;br /&gt;
Warning: Since the contract's ID is usually a hash of the contract, then you will obtain an entirely different ID if the contents are changed ''by even one bit''. As a result of this, contracts are VERY FICKLE ABOUT WHITESPACE! There should be no whitespace before the contract, in the contract file, and neither should there be any whitespace after it, except for a single newline at the end of the dashline (the bottom line of the signature.)&lt;br /&gt;
&lt;br /&gt;
The GUI will make this easier in the future by stripping whitespace as appropriate before generating the ID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''HOW CAN THE SERVER OPERATOR MAKE MONEY?'''&lt;br /&gt;
&lt;br /&gt;
* Transaction fees can easily be added, since transactions consist already of multiple items in a list.&lt;br /&gt;
* He can also make money from expired vouchers and expired cash, which both revert to the bank.&lt;br /&gt;
* He could issue a fractional reserve contract and make money from investments...&lt;br /&gt;
* The OT server also supports usage credits (charging by API call.)&lt;br /&gt;
* See the [[Business Cases]] page for more on this...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''LICENSE ?'''&lt;br /&gt;
&lt;br /&gt;
The various components of Open-Transactions were released in June 2010 under the AGPLv3 license.&lt;br /&gt;
&lt;br /&gt;
Open-Transactions has since been re-released in 2015 under the MPLv2 license.&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Monetas&amp;diff=3220</id>
		<title>Monetas</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Monetas&amp;diff=3220"/>
		<updated>2016-01-02T05:21:10Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: minor fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Monetas is a software company based in Zug, Switzerland, that was cofounded by Chris Odom, the creator of Open-Transactions. [http://www.opentransactions.org/open-transactions.pdf (Click for white paper.) ]&lt;br /&gt;
&lt;br /&gt;
Chris Odom [http://opentransactions.org/forum/index.php?topic=11922.0 stepped down] from Monetas in March 2015 and [http://opentransactions.org/forum/index.php?topic=11925.0 cofounded] [http://stashcrypto.com/ Stash]. He said, ''&amp;quot;When I cofounded Monetas in 2012 with Johann Gevers, our vision for the company was of a mobile money app and commercial notary software inspired by Open-Transactions, and with an emphasis on Africa.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Monetas was a major supporter of Open-Transactions development for several years, and spent significant financial and human resources on developing Open-Transactions from 2012 through 2015, while also implementing their own commercial notary and mobile wallet software inspired by Open-Transactions.&lt;br /&gt;
&lt;br /&gt;
Monetas has generously released their improvements to Open-Transactions under the [https://www.mozilla.org/en-US/MPL/2.0/ MPLv2] license, and the company is now focused only on their own commercial implementation.&lt;br /&gt;
&lt;br /&gt;
Monetas' official website: http://monetas.net&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=OTX&amp;diff=3219</id>
		<title>OTX</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=OTX&amp;diff=3219"/>
		<updated>2015-12-16T05:23:59Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: updated link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OTX Protocol ==&lt;br /&gt;
&lt;br /&gt;
For using OT in your own application, see the [[API|article on the high-level API.]]&lt;br /&gt;
&lt;br /&gt;
For more details on how these messages work, see the [[Messaging|article on messaging.]]&lt;br /&gt;
&lt;br /&gt;
Also see the [[Transactions|article on transaction messages.]]&lt;br /&gt;
&lt;br /&gt;
=== Version 0.1 ===&lt;br /&gt;
&lt;br /&gt;
These are the messages used by versions of the opentxs client and server up to [https://github.com/Open-Transactions/Open-Transactions 0.93]&lt;br /&gt;
&lt;br /&gt;
For specifics on each message, see the [https://github.com/Open-Transactions/opentxs/blob/develop/src/core/Message.cpp#L2600 opentxs::Message.cpp file.]&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;font-weight:bold;&amp;quot;&lt;br /&gt;
|Message||Action||Response||Transactional (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
|checkServerID||Like a server “ping”.||@checkServerID||N&lt;br /&gt;
|-&lt;br /&gt;
|createUserAccount||Register Nym + Credentials at Server||@createUserAccount||Y&lt;br /&gt;
|-&lt;br /&gt;
|createUserAccount||(If already exists) Download Nym from server||@createUserAccount||N&lt;br /&gt;
|-&lt;br /&gt;
|deleteUserAccount||Delete Nym from server||@deleteUserAccount||Y&lt;br /&gt;
|-&lt;br /&gt;
|getRequest||Get current request number for Nym||@getRequest||N&lt;br /&gt;
|-&lt;br /&gt;
|getContract||Download contract by ID||@getContract||N&lt;br /&gt;
|-&lt;br /&gt;
|getMint||Download Mint by Asset ID||@getMint||N&lt;br /&gt;
|-&lt;br /&gt;
|getMarketList||Download list of markets||@getMarketList||N&lt;br /&gt;
|-&lt;br /&gt;
|getMarketOffers||Download offers active on market||@getMarketOffers||N&lt;br /&gt;
|-&lt;br /&gt;
|getMarketRecentTrades||Download recent trades for market||@getMarketRecentTrades||N&lt;br /&gt;
|-&lt;br /&gt;
|getNym_MarketOffers||Download list of offers on market for Nym||@getNym_MarketOffers||N&lt;br /&gt;
|-&lt;br /&gt;
|checkUser||Download public credentials for a Nym||@checkUser||N&lt;br /&gt;
|-&lt;br /&gt;
|usageCredits||Get Nym's usage credits from server||@usageCredits||N&lt;br /&gt;
|-&lt;br /&gt;
|usageCredits||Set Nym's usage credits for server (admin)||@usageCredits||Y&lt;br /&gt;
|-&lt;br /&gt;
|sendUserMessage||Send message to another Nym||@sendUserMessage||Y&lt;br /&gt;
|-&lt;br /&gt;
|sendUserInstrument||Send payment instrument to another Nym||@sendUserInstrument||Y&lt;br /&gt;
|-&lt;br /&gt;
|issueAssetType||Issue currency or stock based on contract||@issueAssetType||Y&lt;br /&gt;
|-&lt;br /&gt;
|queryAssetTypes||Download list of asset types from server||@queryAssetTypes||N&lt;br /&gt;
|-&lt;br /&gt;
|issueBasket||Issue basket currency onto server||@issueBasket||Y&lt;br /&gt;
|-&lt;br /&gt;
|createAccount||Create asset account on server||@createAccount||Y&lt;br /&gt;
|-&lt;br /&gt;
|getAccount||Download account balance from server||@getAccount||N&lt;br /&gt;
|-&lt;br /&gt;
|deleteAssetAccount||Delete asset account from server||@deleteAssetAccount||Y&lt;br /&gt;
|-&lt;br /&gt;
|getTransactionNum||Ask server for 100 new transaction numbers||@getTransactionNum||Y&lt;br /&gt;
|-&lt;br /&gt;
|getNymbox||Download Nymbox from server||@getNymbox||N&lt;br /&gt;
|-&lt;br /&gt;
|getInbox||Download Inbox from server||@getInbox||N&lt;br /&gt;
|-&lt;br /&gt;
|getOutbox||Download outbox from server||@getOutbox||N&lt;br /&gt;
|-&lt;br /&gt;
|getBoxReceipt||Download box receipt from server||@getBoxReceipt||N&lt;br /&gt;
|-&lt;br /&gt;
|processInbox||Process inbox items||@processInbox||Y&lt;br /&gt;
|-&lt;br /&gt;
|processNymbox||Process nymbox items||@processNymbox||Y&lt;br /&gt;
|-&lt;br /&gt;
|triggerClause||Trigger clause on running smart contract||@triggerClause||Y&lt;br /&gt;
|-&lt;br /&gt;
|notarizeTransactions||“transfer” acct-to-acct||@notarizeTransactions||Y&lt;br /&gt;
|-&lt;br /&gt;
|notarizeTransactions||“deposit” cash||@notarizeTransactions||Y&lt;br /&gt;
|-&lt;br /&gt;
|notarizeTransactions||“deposit” cheque||@notarizeTransactions||Y&lt;br /&gt;
|-&lt;br /&gt;
|notarizeTransactions||“withdrawal” of cash||@notarizeTransactions||Y&lt;br /&gt;
|-&lt;br /&gt;
|notarizeTransactions||“withdrawal” of voucher||@notarizeTransactions||Y&lt;br /&gt;
|-&lt;br /&gt;
|notarizeTransactions||Place a “marketOffer”||@notarizeTransactions||Y&lt;br /&gt;
|-&lt;br /&gt;
|notarizeTransactions||Activate a “paymentPlan”||@notarizeTransactions||Y&lt;br /&gt;
|-&lt;br /&gt;
|notarizeTransactions||Activate a “smartContract”||@notarizeTransactions||Y&lt;br /&gt;
|-&lt;br /&gt;
|notarizeTransactions||“cancelCronItem” - Cancel a market offer, payment plan or smart contract.||@notarizeTransactions||Y&lt;br /&gt;
|-&lt;br /&gt;
|notarizeTransactions||“exchangeBasket” (Into the basket)||@notarizeTransactions||Y&lt;br /&gt;
|-&lt;br /&gt;
|notarizeTransactions||“exchangeBasket” (Out of the basket)||@notarizeTransactions||Y&lt;br /&gt;
|-&lt;br /&gt;
|notarizeTransactions||“payDividend” to shareholders||@notarizeTransactions||Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Version 0.2 ===&lt;br /&gt;
&lt;br /&gt;
For more details on message contents and formats, see [https://github.com/Open-Transactions/protocol-docs GitHub documentation]&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;font-weight:bold;&amp;quot;&lt;br /&gt;
|Old name||New name||Response Message&lt;br /&gt;
|-&lt;br /&gt;
|createUserAccount||registerNym||registerNymResponse&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[About|Click here to return to the About page.]]&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=About&amp;diff=3218</id>
		<title>About</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=About&amp;diff=3218"/>
		<updated>2015-12-05T05:55:47Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: /* Video Walkthrough */ Removed desktop video walkthru as well, since it contains footage showing the Monetas OT iPhone client. (Will post a new replacement video soon.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;plainlinks&amp;quot;&amp;gt;&lt;br /&gt;
{| id=&amp;quot;mp-topbanner&amp;quot; style=&amp;quot;width:100%; background:#f6f6f6; margin-top:1.2em; border:1px solid #ddd;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:61%; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;!--        &amp;quot;Welcome to Open-Transactions&amp;quot;        --&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:100%; border:none; background:none;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; white-space:nowrap; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:162%; border:none; margin:0; padding:.1em; color:#000;&amp;quot;&amp;gt;About the Open-Transactions project.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em; font-size:95%;&amp;quot;&amp;gt;Financial cryptography software.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;articlecount&amp;quot; style=&amp;quot;width:100%; text-align:center; font-size:85%;&amp;quot;&amp;gt;[[Special:Statistics|{{NUMBEROFARTICLES}}]] [[Special:Allpages|articles]].&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; max-width: 550px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What is Open-Transactions?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions is an [[Use Cases|easy-to-use]], financial crypto, [[Sample Cash|digital cash]] and transaction [[List of Classes|library]].&lt;br /&gt;
* Open-Transactions is open-source.&lt;br /&gt;
* Open-Transactions includes a [[API|client API]], a working [[Otserver|server]], a cross-platform [https://github.com/Open-Transactions/Moneychanger GUI] and a [[opentxs|command-line]] wallet utility.&lt;br /&gt;
* Open-Transactions features: a large variety of financial instruments, markets, basket currencies, unforgeable account balances, digital cash, destruction of account history, [http://iang.org/papers/ricardian_contract.html Ricardian contracts], Smart Contracts (scriptable clauses), and more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What does it do?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions allows users to issue and manipulate digital assets.&lt;br /&gt;
* Any issuer can sign and distribute new [[Sample Currency Contract|currency contracts]] in order to create new digital asset types.&lt;br /&gt;
* Users may create many ''pseudonyms'' (public keys), each of which may own ''asset accounts'' of various types, on OT servers.&lt;br /&gt;
* Users can operate '''&amp;amp;quot;cash-only&amp;amp;quot;''' for maximum anonymity, using '''[[Sample Cash|untraceable digital cash]]'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Financial Instruments'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Users can transfer digital assets ''securely and provably'', with [[Triple-Signed Receipts|receipts]] signed by all parties.&lt;br /&gt;
* '''Even an OT server cannot change balances, or forge transactions--since it cannot forge your signature on your receipt.'''&lt;br /&gt;
* Open-Transactions supports a range of '''[[Instruments|financial instruments]]''' such as account transfer, '''[[Sample-Cheque|cheques]]''' and vouchers (aka &amp;amp;quot;cashier's cheques&amp;amp;quot; or &amp;amp;quot;banker's cheques&amp;amp;quot;), in addition to cash.&lt;br /&gt;
* These instruments are all analogous to the same financial instruments that we all use at normal banks today. Everyone already has an intuitive understanding of these financial instruments, because we use them regularly in our normal daily lives.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Markets, Basket Currencies, and Smart Contracts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Open-Transactions also implements higher-level, '''contract-based transactions''' such as '''payment plans''' and '''markets with trades'''.&lt;br /&gt;
* The [[Markets|markets]] on Open-Transactions support ''market orders, limit orders, fill-or-kill orders, day orders, stop orders, and stop limits'', just like trading on a real market.&lt;br /&gt;
* '''Basket currencies''' are also supported, as well as payment plans (recurring payments.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc.&lt;br /&gt;
* [[Client-side scripting]]: &amp;lt;code&amp;gt;!/usr/bin/env ot&amp;lt;/code&amp;gt; The entire (mostly) high and low level OT API is available within your scripts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Triple Signed Receipts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* All of this is accomplished in such a way that all parties are able to ''prove'', at all times, ''which transactions have cleared and which instruments are authorized'', '''without having to store their entire transaction history''', but instead by merely keeping the '''last signed receipt'''.&lt;br /&gt;
* Without the special mechanism that makes this possible, ''all parties would otherwise be forced to store all receipts forever''.&lt;br /&gt;
* Nyms and Asset Types have consistent IDs across all OT servers, since the ID is formed by hashing the relevant contract or public key.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Is Open-Transactions [[CENTRALIZED|centralized]]?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* No—quite the opposite. Open-Transactions is highly '''decentralized'''.&lt;br /&gt;
* Typical centralized servers have power over their users, but in OT, '''no server has power over the clients it serves''', because:&lt;br /&gt;
# An OT server does not control user transactions—it merely notarizes them.&lt;br /&gt;
# Anyone can operate an OT server, and users can go to any OT server to notarize transactions. Thus OT servers compete with each other to attract users to use their notary services.&lt;br /&gt;
# Anyone can download an OT client, and use it to execute transactions on any OT server, or any group of OT servers.&lt;br /&gt;
# OT uses triple-signed receipts, so transaction parties have independent cryptographic proof of transactions and balances.&lt;br /&gt;
# OT servers do not store user assets. Rather, cryptocurrencies are stored in voting pools so the server can't steal them.&lt;br /&gt;
&lt;br /&gt;
In every way, '''the user is in control, not the server'''—even when you're using servers you do not trust. These characteristics generate a '''federated''' network architecture—similar to the internet, and it has the same virtues as the internet—openness, decentralization, resilience, censorship-resistance, and user control.&lt;br /&gt;
&lt;br /&gt;
The community behind OT is strongly committed to developing systems that give users full control over their own assets and information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; max-width: 300px; margin: -20px 10px 0 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== White Paper ==&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf OT White Paper]&lt;br /&gt;
 &lt;br /&gt;
== Diagrams ==&lt;br /&gt;
&lt;br /&gt;
[[Voting_Pool_Deposit_Process|Voting Pools]]&lt;br /&gt;
&lt;br /&gt;
[http://i.imgur.com/HTyAJjg.png Architecture Overview (new)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/ot-diagram.jpg Architecture Overview (old)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg Financial Instruments]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Radio Interviews ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=teNzIFu5L70 &amp;quot;Trust No One&amp;quot; Miami Speech]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=234 AgoristRadio Interview, Part 1]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=246 AgoristRadio Interview, Part 2]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=vtJcUM5-TeA Interview with &amp;quot;Let's Talk Bitcoin&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=HSgpStCTw2g Interview with FutureMoneyTrends.com]&lt;br /&gt;
&lt;br /&gt;
== Video Walkthrough ==&lt;br /&gt;
&lt;br /&gt;
[http://localhost:3000/img/iphone-app.png iPhone App screenshot]&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Components and GNU Licensing]]&lt;br /&gt;
&lt;br /&gt;
[[Vulnerabilities|Potential vulnerabilities]] of Open-Transactions&lt;br /&gt;
&lt;br /&gt;
== Related Systems ==&lt;br /&gt;
&lt;br /&gt;
[http://bitcoin.org/ Bitcoin] - A censorship-resistant global ledger&lt;br /&gt;
&lt;br /&gt;
[[Stash]] - Enterprise platform based on OT.&lt;br /&gt;
&lt;br /&gt;
[[Monetas]] - Transaction platform inspired by OT.&lt;br /&gt;
&lt;br /&gt;
[https://loom.cc/help Loom] - Asset issuance and transactions&lt;br /&gt;
&lt;br /&gt;
[http://www.csee.umbc.edu/~woodcock/cmsc482/proj1/magmoney.html Magic Money] - PGP-based Chaumian blinding (unlinkable cash)&lt;br /&gt;
&lt;br /&gt;
[http://opencoin.org/ OpenCoin.org] - REST-based blinded tokens&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransact.org/ OpenTransact] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://payswarm.com/ PaySwarm] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/publickeytransaction PKTP] - Public-Key Transaction Processor&lt;br /&gt;
&lt;br /&gt;
[http://wiki.dgcmagazine.com/index.php?title=Ricardo Ricardo] - Transaction system by Ian Grigg&lt;br /&gt;
&lt;br /&gt;
[https://ripple.com/ Ripple] - Consensus-based debt ledger&lt;br /&gt;
&lt;br /&gt;
[https://www.stellar.org/ Stellar] - Ripple-based&lt;br /&gt;
&lt;br /&gt;
[http://truledger.com/ Truledger] - Destruction of account history&lt;br /&gt;
&lt;br /&gt;
[http://www.voucher-safe.com/index.cfm Voucher-Safe] - Secure asset issuance with auditing&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
Article: [http://pelagic.wavyhill.xsmail.com/Private_Digital_Economy.html Toward a Private Digital Economy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both; padding-top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In More Detail... ==&lt;br /&gt;
&lt;br /&gt;
The server itself is a [[Transactions|transaction processor]] in the cypherpunk tradition. In more detail:&lt;br /&gt;
&lt;br /&gt;
* Many '''financial instruments''' are supported: Users can write '''cheques''', purchase '''cashier's cheques''' (&amp;amp;quot;vouchers&amp;amp;quot;), and withdraw in '''[[Sample Cash|unlinkable digital cash]]'''. The software uses Chaumian-style, blinded tokens courtesy of the [http://anoncvs.aldigital.co.uk/lucre/ Lucre] library by Ben Laurie.&lt;br /&gt;
* It's like '''PGP FOR MONEY'''. The idea is to have many cash algorithms, not just Lucre. I’d like to add Chaum’s version, Brands’ version, etc. So that, just like PGP, the software should support as many of the top algorithms as possible, and make it easy to swap them out when necessary.&lt;br /&gt;
* User accounts are '''pseudonymous'''. '''A user account is a public key'''. (This is like [http://pktp.co.cc/ PKTP] by Andrew McMeikan.) You can open as many user accounts as you want. ''Full anonymity'' is possible only for &amp;quot;cash-only&amp;quot; transactions (where users only perform token exchanges, and do not open accounts), whereas ''pseudonymity'' means that transactions can be linked to the key that signed them. (While the real life identity of the owner is hidden, continuity of reputation becomes possible.) ''See full-color diagrams linked above''.&lt;br /&gt;
* '''Any user can issue new digital currencies''' and digital asset types, by uploading the new [[Sample Currency Contract|currency contract]] to the server. (This functionality is comparable to [http://www.systemics.com/docs/sox/overview.html Ricardo] by [http://financialcryptography.com/ Ian Grigg].)&lt;br /&gt;
* '''Users can open asset accounts of any type.''' You can have as many as you want, associated with each user account. (See [http://loom.cc/ Loom] by Patrick Chkoreff.)&lt;br /&gt;
* [[Triple-Signed Receipts|Triple Signed Receipts / No Account History]]. On OT, entities are able to conduct transactions, verify instruments, ''and'' provably agree on current holdings via ''signed receipts'', all without the need to store any transaction history.'' An ''asset account'' on OT is not according to the traditional sense of the word (an account normally being thought of as, &amp;quot;a list of transactions, with a balance, used in double-entry bookkeeping.&amp;quot;) While the word &amp;quot;account&amp;quot; makes things easy to understand, an ''asset account'' on OT exists only in the mind of the account holder himself. He simply asks the server to agree with him that it exists, and to provide him with a signed receipt to that effect. In the user interface, OT is able to mimic the ''account metaphor'', making usage intuitive, even though ''no actual account exists, or need be stored on either side, other than the signed receipt itself!'' (See Bill St. Clair's excellent [http://truledger.com/ Truledger] for an [http://truledger.com/doc/plain-english.html example of this concept].)&lt;br /&gt;
* Open Transactions also features '''markets'''. Any two asset types can be traded against each other. The [[markets]] are full-featured and include '''limit orders, stop orders, fill-or-kill, day orders''' (date ranges), and '''stop limits'''.&lt;br /&gt;
* Open Transactions also supports '''basket currencies'''. Users can define their own, and the server handles the process of exchanging in and out of basket accounts. Baskets are treated by the software like any other asset type, (you can open accounts, transfer funds, withdraw cash, write cheques, and even '''trade basket currencies on markets'''.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc. This concept was originated by Nick Szabo: [http://szabo.best.vwh.net/contractlanguage.html smart contracts].&lt;br /&gt;
* [[Client-side scripting]]: The entire OT API is now available for use in OTscripts on the client side. Just remember to put this at the top of the file: &amp;lt;pre&amp;gt;#!/usr/local/bin/ot --script&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Open Transactions also supports '''payment plans'''. Users can sign contracts with each other, and the server will carry out the terms and implement the payment plan. (A future goal is to issue new asset types based on revenue from payment plans--so they can also be traded on markets.)&lt;br /&gt;
* '''Contracts''', in general, are very important to Open Transactions; they are the building block of the entire library. Open Transactions uses a Ricardian-style contract, and all the various instruments, data files, and messages resemble '''[[Sample Currency Contract | PGP-signed XML files]]'''. All objects serialize to a string.&lt;br /&gt;
* The philosophy of the software is based around '''separation of powers''' (issuers and transaction servers being separate entities) as well as the '''distribution of risk'''. For example, Asset accounts can be distributed across multiple servers, and asset types can be distributed across multiple issuers (via baskets.) Read about the [[Auditing]] protocol.&lt;br /&gt;
* Potential future instruments include: [http://www.goldstandardinstitute.net/2010/06/what-is-a-real-bill/ Real Bills], dividend-paying stocks (the same mechanism can be used as interest paying bonds) and collateralized debt obligations. (OT supports payment plans, so it would be easy to group tranches of OT's payment plans to pay into a single reserve account, as backing for a new stock offering that could be traded on OT markets.) This is similar to how basket currencies are implemented. Stocks/Bonds would pay shareholders by dropping a cheque into your stock account's inbox. These features aren't available yet, but they are easy to add given the existing OT infrastructure.&lt;br /&gt;
* '''All communications are secured with OpenSSL.''' All messages are also signed and encrypted. All transactions require signatures from relevant parties including the server.&lt;br /&gt;
* Open Transactions is '''open-source''', written in C++, object-oriented, and includes '''Native [[API]]s''' for '''Java, Ruby, Python, PHP, Perl, C, [http://www.digitalmars.com/d/2.0/overview.html D], C++, Objective-C, C#, Tcl, and LISP.''' (Also supporting JRuby, Jython, Scala, Clojure, Groovy, and any other language that works on the JVM.)&lt;br /&gt;
* The software is fully '''cross-platform''': '''Linux, Mac OS X, FreeBSD, Android, and Windows''' are supported with makefiles, project files, and instructions.&lt;br /&gt;
* STORAGE... The library itself is '''storage neutral''', and could be utilized across a variety of different storage systems. All objects serialize to a string, and it is very easy to add support for new storage methods. (Currently OT uses the filesystem with key/value pairs.) '''Adding a new storage method is as easy as subclassing OTDB::Storage and overriding a few methods. Use any DB you want.'''&lt;br /&gt;
* [[Messaging]]... The library itself is '''transfer-protocol neutral''', and can be utilized across a variety of different transfer protocols. The default implementation uses the [http://zeromq.org/ ZeroMQ library] for transport. Transport is implemented as a callback function, so it's very easy (a few dozen lines of code) to swap in some other system, if you wish.&lt;br /&gt;
* OT currently supports '''MsgPack''' and '''protobuf''' for data packing, though new packers can be added by subclassing OTDB::Packer.&lt;br /&gt;
&lt;br /&gt;
The intention is for this software to be integrated as many places as possible... Games, digital cash wallets, distributed data stores, secure voip apps, anonymous bit torrent networks, mixnets, remailers, nym servers, etc. There are many other potential uses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Monetas&amp;diff=3217</id>
		<title>Monetas</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Monetas&amp;diff=3217"/>
		<updated>2015-12-05T01:40:59Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: added link to mplv2 license&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Monetas is a software company based in Zug, Switzerland, that was cofounded by Chris Odom, the creator of Open-Transactions. [http://www.opentransactions.org/open-transactions.pdf (Click for white paper.) ]&lt;br /&gt;
&lt;br /&gt;
Chris Odom [http://opentransactions.org/forum/index.php?topic=11922.0 stepped down] from Monetas in March 2015 and [http://opentransactions.org/forum/index.php?topic=11925.0 cofounded] [http://stashcrypto.com/ Stash]. He said, ''&amp;quot;When I cofounded Monetas in 2012 with Johann Gevers, our vision for the company was of a mobile money app and commercial notary software inspired by Open-Transactions, and with an emphasis on Africa.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Monetas was a major supporter of Open-Transactions development, and spent significant financial and human resources on developing Open-Transactions from 2012 through 2015, while also implementing their own commercial notary and mobile wallet software inspired by Open-Transactions.&lt;br /&gt;
&lt;br /&gt;
Monetas has generously released their improvements to Open-Transactions under the [https://www.mozilla.org/en-US/MPL/2.0/ MPLv2] license, and the company is now focused only on their own commercial implementation.&lt;br /&gt;
&lt;br /&gt;
Monetas' official website: http://monetas.net&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=About&amp;diff=3216</id>
		<title>About</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=About&amp;diff=3216"/>
		<updated>2015-12-05T01:34:05Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: /* Video Walkthrough */ Android video was posted in Jan 2015 at request of Johann Gevers and removed Dec 2015 again at request of Johann Gevers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;plainlinks&amp;quot;&amp;gt;&lt;br /&gt;
{| id=&amp;quot;mp-topbanner&amp;quot; style=&amp;quot;width:100%; background:#f6f6f6; margin-top:1.2em; border:1px solid #ddd;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:61%; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;!--        &amp;quot;Welcome to Open-Transactions&amp;quot;        --&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:100%; border:none; background:none;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; white-space:nowrap; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:162%; border:none; margin:0; padding:.1em; color:#000;&amp;quot;&amp;gt;About the Open-Transactions project.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em; font-size:95%;&amp;quot;&amp;gt;Financial cryptography software.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;articlecount&amp;quot; style=&amp;quot;width:100%; text-align:center; font-size:85%;&amp;quot;&amp;gt;[[Special:Statistics|{{NUMBEROFARTICLES}}]] [[Special:Allpages|articles]].&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; max-width: 550px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What is Open-Transactions?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions is an [[Use Cases|easy-to-use]], financial crypto, [[Sample Cash|digital cash]] and transaction [[List of Classes|library]].&lt;br /&gt;
* Open-Transactions is open-source.&lt;br /&gt;
* Open-Transactions includes a [[API|client API]], a working [[Otserver|server]], a cross-platform [https://github.com/Open-Transactions/Moneychanger GUI] and a [[opentxs|command-line]] wallet utility.&lt;br /&gt;
* Open-Transactions features: a large variety of financial instruments, markets, basket currencies, unforgeable account balances, digital cash, destruction of account history, [http://iang.org/papers/ricardian_contract.html Ricardian contracts], Smart Contracts (scriptable clauses), and more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What does it do?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions allows users to issue and manipulate digital assets.&lt;br /&gt;
* Any issuer can sign and distribute new [[Sample Currency Contract|currency contracts]] in order to create new digital asset types.&lt;br /&gt;
* Users may create many ''pseudonyms'' (public keys), each of which may own ''asset accounts'' of various types, on OT servers.&lt;br /&gt;
* Users can operate '''&amp;amp;quot;cash-only&amp;amp;quot;''' for maximum anonymity, using '''[[Sample Cash|untraceable digital cash]]'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Financial Instruments'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Users can transfer digital assets ''securely and provably'', with [[Triple-Signed Receipts|receipts]] signed by all parties.&lt;br /&gt;
* '''Even an OT server cannot change balances, or forge transactions--since it cannot forge your signature on your receipt.'''&lt;br /&gt;
* Open-Transactions supports a range of '''[[Instruments|financial instruments]]''' such as account transfer, '''[[Sample-Cheque|cheques]]''' and vouchers (aka &amp;amp;quot;cashier's cheques&amp;amp;quot; or &amp;amp;quot;banker's cheques&amp;amp;quot;), in addition to cash.&lt;br /&gt;
* These instruments are all analogous to the same financial instruments that we all use at normal banks today. Everyone already has an intuitive understanding of these financial instruments, because we use them regularly in our normal daily lives.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Markets, Basket Currencies, and Smart Contracts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Open-Transactions also implements higher-level, '''contract-based transactions''' such as '''payment plans''' and '''markets with trades'''.&lt;br /&gt;
* The [[Markets|markets]] on Open-Transactions support ''market orders, limit orders, fill-or-kill orders, day orders, stop orders, and stop limits'', just like trading on a real market.&lt;br /&gt;
* '''Basket currencies''' are also supported, as well as payment plans (recurring payments.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc.&lt;br /&gt;
* [[Client-side scripting]]: &amp;lt;code&amp;gt;!/usr/bin/env ot&amp;lt;/code&amp;gt; The entire (mostly) high and low level OT API is available within your scripts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Triple Signed Receipts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* All of this is accomplished in such a way that all parties are able to ''prove'', at all times, ''which transactions have cleared and which instruments are authorized'', '''without having to store their entire transaction history''', but instead by merely keeping the '''last signed receipt'''.&lt;br /&gt;
* Without the special mechanism that makes this possible, ''all parties would otherwise be forced to store all receipts forever''.&lt;br /&gt;
* Nyms and Asset Types have consistent IDs across all OT servers, since the ID is formed by hashing the relevant contract or public key.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Is Open-Transactions [[CENTRALIZED|centralized]]?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* No—quite the opposite. Open-Transactions is highly '''decentralized'''.&lt;br /&gt;
* Typical centralized servers have power over their users, but in OT, '''no server has power over the clients it serves''', because:&lt;br /&gt;
# An OT server does not control user transactions—it merely notarizes them.&lt;br /&gt;
# Anyone can operate an OT server, and users can go to any OT server to notarize transactions. Thus OT servers compete with each other to attract users to use their notary services.&lt;br /&gt;
# Anyone can download an OT client, and use it to execute transactions on any OT server, or any group of OT servers.&lt;br /&gt;
# OT uses triple-signed receipts, so transaction parties have independent cryptographic proof of transactions and balances.&lt;br /&gt;
# OT servers do not store user assets. Rather, cryptocurrencies are stored in voting pools so the server can't steal them.&lt;br /&gt;
&lt;br /&gt;
In every way, '''the user is in control, not the server'''—even when you're using servers you do not trust. These characteristics generate a '''federated''' network architecture—similar to the internet, and it has the same virtues as the internet—openness, decentralization, resilience, censorship-resistance, and user control.&lt;br /&gt;
&lt;br /&gt;
The community behind OT is strongly committed to developing systems that give users full control over their own assets and information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; max-width: 300px; margin: -20px 10px 0 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== White Paper ==&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf OT White Paper]&lt;br /&gt;
 &lt;br /&gt;
== Diagrams ==&lt;br /&gt;
&lt;br /&gt;
[[Voting_Pool_Deposit_Process|Voting Pools]]&lt;br /&gt;
&lt;br /&gt;
[http://i.imgur.com/HTyAJjg.png Architecture Overview (new)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/ot-diagram.jpg Architecture Overview (old)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg Financial Instruments]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Radio Interviews ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=teNzIFu5L70 &amp;quot;Trust No One&amp;quot; Miami Speech]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=234 AgoristRadio Interview, Part 1]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=246 AgoristRadio Interview, Part 2]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=vtJcUM5-TeA Interview with &amp;quot;Let's Talk Bitcoin&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=HSgpStCTw2g Interview with FutureMoneyTrends.com]&lt;br /&gt;
&lt;br /&gt;
== Video Walkthrough ==&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_SkRjaVliOXJITGM Desktop video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_MEk4ZDNtVGtRMHc Desktop video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://localhost:3000/img/iphone-app.png iPhone App screenshot]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28141679 java testclient video 1]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28142096 java testclient video 2]&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Components and GNU Licensing]]&lt;br /&gt;
&lt;br /&gt;
[[Vulnerabilities|Potential vulnerabilities]] of Open-Transactions&lt;br /&gt;
&lt;br /&gt;
== Related Systems ==&lt;br /&gt;
&lt;br /&gt;
[http://bitcoin.org/ Bitcoin] - A censorship-resistant global ledger&lt;br /&gt;
&lt;br /&gt;
[[Stash]] - Enterprise platform based on OT.&lt;br /&gt;
&lt;br /&gt;
[[Monetas]] - Transaction platform inspired by OT.&lt;br /&gt;
&lt;br /&gt;
[https://loom.cc/help Loom] - Asset issuance and transactions&lt;br /&gt;
&lt;br /&gt;
[http://www.csee.umbc.edu/~woodcock/cmsc482/proj1/magmoney.html Magic Money] - PGP-based Chaumian blinding (unlinkable cash)&lt;br /&gt;
&lt;br /&gt;
[http://opencoin.org/ OpenCoin.org] - REST-based blinded tokens&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransact.org/ OpenTransact] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://payswarm.com/ PaySwarm] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/publickeytransaction PKTP] - Public-Key Transaction Processor&lt;br /&gt;
&lt;br /&gt;
[http://wiki.dgcmagazine.com/index.php?title=Ricardo Ricardo] - Transaction system by Ian Grigg&lt;br /&gt;
&lt;br /&gt;
[https://ripple.com/ Ripple] - Consensus-based debt ledger&lt;br /&gt;
&lt;br /&gt;
[https://www.stellar.org/ Stellar] - Ripple-based&lt;br /&gt;
&lt;br /&gt;
[http://truledger.com/ Truledger] - Destruction of account history&lt;br /&gt;
&lt;br /&gt;
[http://www.voucher-safe.com/index.cfm Voucher-Safe] - Secure asset issuance with auditing&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
Article: [http://pelagic.wavyhill.xsmail.com/Private_Digital_Economy.html Toward a Private Digital Economy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both; padding-top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In More Detail... ==&lt;br /&gt;
&lt;br /&gt;
The server itself is a [[Transactions|transaction processor]] in the cypherpunk tradition. In more detail:&lt;br /&gt;
&lt;br /&gt;
* Many '''financial instruments''' are supported: Users can write '''cheques''', purchase '''cashier's cheques''' (&amp;amp;quot;vouchers&amp;amp;quot;), and withdraw in '''[[Sample Cash|unlinkable digital cash]]'''. The software uses Chaumian-style, blinded tokens courtesy of the [http://anoncvs.aldigital.co.uk/lucre/ Lucre] library by Ben Laurie.&lt;br /&gt;
* It's like '''PGP FOR MONEY'''. The idea is to have many cash algorithms, not just Lucre. I’d like to add Chaum’s version, Brands’ version, etc. So that, just like PGP, the software should support as many of the top algorithms as possible, and make it easy to swap them out when necessary.&lt;br /&gt;
* User accounts are '''pseudonymous'''. '''A user account is a public key'''. (This is like [http://pktp.co.cc/ PKTP] by Andrew McMeikan.) You can open as many user accounts as you want. ''Full anonymity'' is possible only for &amp;quot;cash-only&amp;quot; transactions (where users only perform token exchanges, and do not open accounts), whereas ''pseudonymity'' means that transactions can be linked to the key that signed them. (While the real life identity of the owner is hidden, continuity of reputation becomes possible.) ''See full-color diagrams linked above''.&lt;br /&gt;
* '''Any user can issue new digital currencies''' and digital asset types, by uploading the new [[Sample Currency Contract|currency contract]] to the server. (This functionality is comparable to [http://www.systemics.com/docs/sox/overview.html Ricardo] by [http://financialcryptography.com/ Ian Grigg].)&lt;br /&gt;
* '''Users can open asset accounts of any type.''' You can have as many as you want, associated with each user account. (See [http://loom.cc/ Loom] by Patrick Chkoreff.)&lt;br /&gt;
* [[Triple-Signed Receipts|Triple Signed Receipts / No Account History]]. On OT, entities are able to conduct transactions, verify instruments, ''and'' provably agree on current holdings via ''signed receipts'', all without the need to store any transaction history.'' An ''asset account'' on OT is not according to the traditional sense of the word (an account normally being thought of as, &amp;quot;a list of transactions, with a balance, used in double-entry bookkeeping.&amp;quot;) While the word &amp;quot;account&amp;quot; makes things easy to understand, an ''asset account'' on OT exists only in the mind of the account holder himself. He simply asks the server to agree with him that it exists, and to provide him with a signed receipt to that effect. In the user interface, OT is able to mimic the ''account metaphor'', making usage intuitive, even though ''no actual account exists, or need be stored on either side, other than the signed receipt itself!'' (See Bill St. Clair's excellent [http://truledger.com/ Truledger] for an [http://truledger.com/doc/plain-english.html example of this concept].)&lt;br /&gt;
* Open Transactions also features '''markets'''. Any two asset types can be traded against each other. The [[markets]] are full-featured and include '''limit orders, stop orders, fill-or-kill, day orders''' (date ranges), and '''stop limits'''.&lt;br /&gt;
* Open Transactions also supports '''basket currencies'''. Users can define their own, and the server handles the process of exchanging in and out of basket accounts. Baskets are treated by the software like any other asset type, (you can open accounts, transfer funds, withdraw cash, write cheques, and even '''trade basket currencies on markets'''.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc. This concept was originated by Nick Szabo: [http://szabo.best.vwh.net/contractlanguage.html smart contracts].&lt;br /&gt;
* [[Client-side scripting]]: The entire OT API is now available for use in OTscripts on the client side. Just remember to put this at the top of the file: &amp;lt;pre&amp;gt;#!/usr/local/bin/ot --script&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Open Transactions also supports '''payment plans'''. Users can sign contracts with each other, and the server will carry out the terms and implement the payment plan. (A future goal is to issue new asset types based on revenue from payment plans--so they can also be traded on markets.)&lt;br /&gt;
* '''Contracts''', in general, are very important to Open Transactions; they are the building block of the entire library. Open Transactions uses a Ricardian-style contract, and all the various instruments, data files, and messages resemble '''[[Sample Currency Contract | PGP-signed XML files]]'''. All objects serialize to a string.&lt;br /&gt;
* The philosophy of the software is based around '''separation of powers''' (issuers and transaction servers being separate entities) as well as the '''distribution of risk'''. For example, Asset accounts can be distributed across multiple servers, and asset types can be distributed across multiple issuers (via baskets.) Read about the [[Auditing]] protocol.&lt;br /&gt;
* Potential future instruments include: [http://www.goldstandardinstitute.net/2010/06/what-is-a-real-bill/ Real Bills], dividend-paying stocks (the same mechanism can be used as interest paying bonds) and collateralized debt obligations. (OT supports payment plans, so it would be easy to group tranches of OT's payment plans to pay into a single reserve account, as backing for a new stock offering that could be traded on OT markets.) This is similar to how basket currencies are implemented. Stocks/Bonds would pay shareholders by dropping a cheque into your stock account's inbox. These features aren't available yet, but they are easy to add given the existing OT infrastructure.&lt;br /&gt;
* '''All communications are secured with OpenSSL.''' All messages are also signed and encrypted. All transactions require signatures from relevant parties including the server.&lt;br /&gt;
* Open Transactions is '''open-source''', written in C++, object-oriented, and includes '''Native [[API]]s''' for '''Java, Ruby, Python, PHP, Perl, C, [http://www.digitalmars.com/d/2.0/overview.html D], C++, Objective-C, C#, Tcl, and LISP.''' (Also supporting JRuby, Jython, Scala, Clojure, Groovy, and any other language that works on the JVM.)&lt;br /&gt;
* The software is fully '''cross-platform''': '''Linux, Mac OS X, FreeBSD, Android, and Windows''' are supported with makefiles, project files, and instructions.&lt;br /&gt;
* STORAGE... The library itself is '''storage neutral''', and could be utilized across a variety of different storage systems. All objects serialize to a string, and it is very easy to add support for new storage methods. (Currently OT uses the filesystem with key/value pairs.) '''Adding a new storage method is as easy as subclassing OTDB::Storage and overriding a few methods. Use any DB you want.'''&lt;br /&gt;
* [[Messaging]]... The library itself is '''transfer-protocol neutral''', and can be utilized across a variety of different transfer protocols. The default implementation uses the [http://zeromq.org/ ZeroMQ library] for transport. Transport is implemented as a callback function, so it's very easy (a few dozen lines of code) to swap in some other system, if you wish.&lt;br /&gt;
* OT currently supports '''MsgPack''' and '''protobuf''' for data packing, though new packers can be added by subclassing OTDB::Packer.&lt;br /&gt;
&lt;br /&gt;
The intention is for this software to be integrated as many places as possible... Games, digital cash wallets, distributed data stores, secure voip apps, anonymous bit torrent networks, mixnets, remailers, nym servers, etc. There are many other potential uses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=About&amp;diff=3215</id>
		<title>About</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=About&amp;diff=3215"/>
		<updated>2015-12-05T01:24:29Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: /* Video Walkthrough */ iPhone videos were added Oct 2013 by request of Johann Gevers, and removed Dec 2015, again by request of Johann Gevers.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;plainlinks&amp;quot;&amp;gt;&lt;br /&gt;
{| id=&amp;quot;mp-topbanner&amp;quot; style=&amp;quot;width:100%; background:#f6f6f6; margin-top:1.2em; border:1px solid #ddd;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:61%; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;!--        &amp;quot;Welcome to Open-Transactions&amp;quot;        --&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:100%; border:none; background:none;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; white-space:nowrap; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:162%; border:none; margin:0; padding:.1em; color:#000;&amp;quot;&amp;gt;About the Open-Transactions project.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em; font-size:95%;&amp;quot;&amp;gt;Financial cryptography software.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;articlecount&amp;quot; style=&amp;quot;width:100%; text-align:center; font-size:85%;&amp;quot;&amp;gt;[[Special:Statistics|{{NUMBEROFARTICLES}}]] [[Special:Allpages|articles]].&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; max-width: 550px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What is Open-Transactions?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions is an [[Use Cases|easy-to-use]], financial crypto, [[Sample Cash|digital cash]] and transaction [[List of Classes|library]].&lt;br /&gt;
* Open-Transactions is open-source.&lt;br /&gt;
* Open-Transactions includes a [[API|client API]], a working [[Otserver|server]], a cross-platform [https://github.com/Open-Transactions/Moneychanger GUI] and a [[opentxs|command-line]] wallet utility.&lt;br /&gt;
* Open-Transactions features: a large variety of financial instruments, markets, basket currencies, unforgeable account balances, digital cash, destruction of account history, [http://iang.org/papers/ricardian_contract.html Ricardian contracts], Smart Contracts (scriptable clauses), and more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What does it do?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions allows users to issue and manipulate digital assets.&lt;br /&gt;
* Any issuer can sign and distribute new [[Sample Currency Contract|currency contracts]] in order to create new digital asset types.&lt;br /&gt;
* Users may create many ''pseudonyms'' (public keys), each of which may own ''asset accounts'' of various types, on OT servers.&lt;br /&gt;
* Users can operate '''&amp;amp;quot;cash-only&amp;amp;quot;''' for maximum anonymity, using '''[[Sample Cash|untraceable digital cash]]'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Financial Instruments'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Users can transfer digital assets ''securely and provably'', with [[Triple-Signed Receipts|receipts]] signed by all parties.&lt;br /&gt;
* '''Even an OT server cannot change balances, or forge transactions--since it cannot forge your signature on your receipt.'''&lt;br /&gt;
* Open-Transactions supports a range of '''[[Instruments|financial instruments]]''' such as account transfer, '''[[Sample-Cheque|cheques]]''' and vouchers (aka &amp;amp;quot;cashier's cheques&amp;amp;quot; or &amp;amp;quot;banker's cheques&amp;amp;quot;), in addition to cash.&lt;br /&gt;
* These instruments are all analogous to the same financial instruments that we all use at normal banks today. Everyone already has an intuitive understanding of these financial instruments, because we use them regularly in our normal daily lives.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Markets, Basket Currencies, and Smart Contracts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Open-Transactions also implements higher-level, '''contract-based transactions''' such as '''payment plans''' and '''markets with trades'''.&lt;br /&gt;
* The [[Markets|markets]] on Open-Transactions support ''market orders, limit orders, fill-or-kill orders, day orders, stop orders, and stop limits'', just like trading on a real market.&lt;br /&gt;
* '''Basket currencies''' are also supported, as well as payment plans (recurring payments.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc.&lt;br /&gt;
* [[Client-side scripting]]: &amp;lt;code&amp;gt;!/usr/bin/env ot&amp;lt;/code&amp;gt; The entire (mostly) high and low level OT API is available within your scripts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Triple Signed Receipts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* All of this is accomplished in such a way that all parties are able to ''prove'', at all times, ''which transactions have cleared and which instruments are authorized'', '''without having to store their entire transaction history''', but instead by merely keeping the '''last signed receipt'''.&lt;br /&gt;
* Without the special mechanism that makes this possible, ''all parties would otherwise be forced to store all receipts forever''.&lt;br /&gt;
* Nyms and Asset Types have consistent IDs across all OT servers, since the ID is formed by hashing the relevant contract or public key.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Is Open-Transactions [[CENTRALIZED|centralized]]?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* No—quite the opposite. Open-Transactions is highly '''decentralized'''.&lt;br /&gt;
* Typical centralized servers have power over their users, but in OT, '''no server has power over the clients it serves''', because:&lt;br /&gt;
# An OT server does not control user transactions—it merely notarizes them.&lt;br /&gt;
# Anyone can operate an OT server, and users can go to any OT server to notarize transactions. Thus OT servers compete with each other to attract users to use their notary services.&lt;br /&gt;
# Anyone can download an OT client, and use it to execute transactions on any OT server, or any group of OT servers.&lt;br /&gt;
# OT uses triple-signed receipts, so transaction parties have independent cryptographic proof of transactions and balances.&lt;br /&gt;
# OT servers do not store user assets. Rather, cryptocurrencies are stored in voting pools so the server can't steal them.&lt;br /&gt;
&lt;br /&gt;
In every way, '''the user is in control, not the server'''—even when you're using servers you do not trust. These characteristics generate a '''federated''' network architecture—similar to the internet, and it has the same virtues as the internet—openness, decentralization, resilience, censorship-resistance, and user control.&lt;br /&gt;
&lt;br /&gt;
The community behind OT is strongly committed to developing systems that give users full control over their own assets and information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; max-width: 300px; margin: -20px 10px 0 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== White Paper ==&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf OT White Paper]&lt;br /&gt;
 &lt;br /&gt;
== Diagrams ==&lt;br /&gt;
&lt;br /&gt;
[[Voting_Pool_Deposit_Process|Voting Pools]]&lt;br /&gt;
&lt;br /&gt;
[http://i.imgur.com/HTyAJjg.png Architecture Overview (new)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/ot-diagram.jpg Architecture Overview (old)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg Financial Instruments]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Radio Interviews ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=teNzIFu5L70 &amp;quot;Trust No One&amp;quot; Miami Speech]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=234 AgoristRadio Interview, Part 1]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=246 AgoristRadio Interview, Part 2]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=vtJcUM5-TeA Interview with &amp;quot;Let's Talk Bitcoin&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=HSgpStCTw2g Interview with FutureMoneyTrends.com]&lt;br /&gt;
&lt;br /&gt;
== Video Walkthrough ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=5qtTayW-RyM Android demo video (Monetas)]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_SkRjaVliOXJITGM Desktop video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_MEk4ZDNtVGtRMHc Desktop video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://localhost:3000/img/iphone-app.png iPhone App screenshot]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28141679 java testclient video 1]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28142096 java testclient video 2]&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Components and GNU Licensing]]&lt;br /&gt;
&lt;br /&gt;
[[Vulnerabilities|Potential vulnerabilities]] of Open-Transactions&lt;br /&gt;
&lt;br /&gt;
== Related Systems ==&lt;br /&gt;
&lt;br /&gt;
[http://bitcoin.org/ Bitcoin] - A censorship-resistant global ledger&lt;br /&gt;
&lt;br /&gt;
[[Stash]] - Enterprise platform based on OT.&lt;br /&gt;
&lt;br /&gt;
[[Monetas]] - Transaction platform inspired by OT.&lt;br /&gt;
&lt;br /&gt;
[https://loom.cc/help Loom] - Asset issuance and transactions&lt;br /&gt;
&lt;br /&gt;
[http://www.csee.umbc.edu/~woodcock/cmsc482/proj1/magmoney.html Magic Money] - PGP-based Chaumian blinding (unlinkable cash)&lt;br /&gt;
&lt;br /&gt;
[http://opencoin.org/ OpenCoin.org] - REST-based blinded tokens&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransact.org/ OpenTransact] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://payswarm.com/ PaySwarm] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/publickeytransaction PKTP] - Public-Key Transaction Processor&lt;br /&gt;
&lt;br /&gt;
[http://wiki.dgcmagazine.com/index.php?title=Ricardo Ricardo] - Transaction system by Ian Grigg&lt;br /&gt;
&lt;br /&gt;
[https://ripple.com/ Ripple] - Consensus-based debt ledger&lt;br /&gt;
&lt;br /&gt;
[https://www.stellar.org/ Stellar] - Ripple-based&lt;br /&gt;
&lt;br /&gt;
[http://truledger.com/ Truledger] - Destruction of account history&lt;br /&gt;
&lt;br /&gt;
[http://www.voucher-safe.com/index.cfm Voucher-Safe] - Secure asset issuance with auditing&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
Article: [http://pelagic.wavyhill.xsmail.com/Private_Digital_Economy.html Toward a Private Digital Economy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both; padding-top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In More Detail... ==&lt;br /&gt;
&lt;br /&gt;
The server itself is a [[Transactions|transaction processor]] in the cypherpunk tradition. In more detail:&lt;br /&gt;
&lt;br /&gt;
* Many '''financial instruments''' are supported: Users can write '''cheques''', purchase '''cashier's cheques''' (&amp;amp;quot;vouchers&amp;amp;quot;), and withdraw in '''[[Sample Cash|unlinkable digital cash]]'''. The software uses Chaumian-style, blinded tokens courtesy of the [http://anoncvs.aldigital.co.uk/lucre/ Lucre] library by Ben Laurie.&lt;br /&gt;
* It's like '''PGP FOR MONEY'''. The idea is to have many cash algorithms, not just Lucre. I’d like to add Chaum’s version, Brands’ version, etc. So that, just like PGP, the software should support as many of the top algorithms as possible, and make it easy to swap them out when necessary.&lt;br /&gt;
* User accounts are '''pseudonymous'''. '''A user account is a public key'''. (This is like [http://pktp.co.cc/ PKTP] by Andrew McMeikan.) You can open as many user accounts as you want. ''Full anonymity'' is possible only for &amp;quot;cash-only&amp;quot; transactions (where users only perform token exchanges, and do not open accounts), whereas ''pseudonymity'' means that transactions can be linked to the key that signed them. (While the real life identity of the owner is hidden, continuity of reputation becomes possible.) ''See full-color diagrams linked above''.&lt;br /&gt;
* '''Any user can issue new digital currencies''' and digital asset types, by uploading the new [[Sample Currency Contract|currency contract]] to the server. (This functionality is comparable to [http://www.systemics.com/docs/sox/overview.html Ricardo] by [http://financialcryptography.com/ Ian Grigg].)&lt;br /&gt;
* '''Users can open asset accounts of any type.''' You can have as many as you want, associated with each user account. (See [http://loom.cc/ Loom] by Patrick Chkoreff.)&lt;br /&gt;
* [[Triple-Signed Receipts|Triple Signed Receipts / No Account History]]. On OT, entities are able to conduct transactions, verify instruments, ''and'' provably agree on current holdings via ''signed receipts'', all without the need to store any transaction history.'' An ''asset account'' on OT is not according to the traditional sense of the word (an account normally being thought of as, &amp;quot;a list of transactions, with a balance, used in double-entry bookkeeping.&amp;quot;) While the word &amp;quot;account&amp;quot; makes things easy to understand, an ''asset account'' on OT exists only in the mind of the account holder himself. He simply asks the server to agree with him that it exists, and to provide him with a signed receipt to that effect. In the user interface, OT is able to mimic the ''account metaphor'', making usage intuitive, even though ''no actual account exists, or need be stored on either side, other than the signed receipt itself!'' (See Bill St. Clair's excellent [http://truledger.com/ Truledger] for an [http://truledger.com/doc/plain-english.html example of this concept].)&lt;br /&gt;
* Open Transactions also features '''markets'''. Any two asset types can be traded against each other. The [[markets]] are full-featured and include '''limit orders, stop orders, fill-or-kill, day orders''' (date ranges), and '''stop limits'''.&lt;br /&gt;
* Open Transactions also supports '''basket currencies'''. Users can define their own, and the server handles the process of exchanging in and out of basket accounts. Baskets are treated by the software like any other asset type, (you can open accounts, transfer funds, withdraw cash, write cheques, and even '''trade basket currencies on markets'''.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc. This concept was originated by Nick Szabo: [http://szabo.best.vwh.net/contractlanguage.html smart contracts].&lt;br /&gt;
* [[Client-side scripting]]: The entire OT API is now available for use in OTscripts on the client side. Just remember to put this at the top of the file: &amp;lt;pre&amp;gt;#!/usr/local/bin/ot --script&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Open Transactions also supports '''payment plans'''. Users can sign contracts with each other, and the server will carry out the terms and implement the payment plan. (A future goal is to issue new asset types based on revenue from payment plans--so they can also be traded on markets.)&lt;br /&gt;
* '''Contracts''', in general, are very important to Open Transactions; they are the building block of the entire library. Open Transactions uses a Ricardian-style contract, and all the various instruments, data files, and messages resemble '''[[Sample Currency Contract | PGP-signed XML files]]'''. All objects serialize to a string.&lt;br /&gt;
* The philosophy of the software is based around '''separation of powers''' (issuers and transaction servers being separate entities) as well as the '''distribution of risk'''. For example, Asset accounts can be distributed across multiple servers, and asset types can be distributed across multiple issuers (via baskets.) Read about the [[Auditing]] protocol.&lt;br /&gt;
* Potential future instruments include: [http://www.goldstandardinstitute.net/2010/06/what-is-a-real-bill/ Real Bills], dividend-paying stocks (the same mechanism can be used as interest paying bonds) and collateralized debt obligations. (OT supports payment plans, so it would be easy to group tranches of OT's payment plans to pay into a single reserve account, as backing for a new stock offering that could be traded on OT markets.) This is similar to how basket currencies are implemented. Stocks/Bonds would pay shareholders by dropping a cheque into your stock account's inbox. These features aren't available yet, but they are easy to add given the existing OT infrastructure.&lt;br /&gt;
* '''All communications are secured with OpenSSL.''' All messages are also signed and encrypted. All transactions require signatures from relevant parties including the server.&lt;br /&gt;
* Open Transactions is '''open-source''', written in C++, object-oriented, and includes '''Native [[API]]s''' for '''Java, Ruby, Python, PHP, Perl, C, [http://www.digitalmars.com/d/2.0/overview.html D], C++, Objective-C, C#, Tcl, and LISP.''' (Also supporting JRuby, Jython, Scala, Clojure, Groovy, and any other language that works on the JVM.)&lt;br /&gt;
* The software is fully '''cross-platform''': '''Linux, Mac OS X, FreeBSD, Android, and Windows''' are supported with makefiles, project files, and instructions.&lt;br /&gt;
* STORAGE... The library itself is '''storage neutral''', and could be utilized across a variety of different storage systems. All objects serialize to a string, and it is very easy to add support for new storage methods. (Currently OT uses the filesystem with key/value pairs.) '''Adding a new storage method is as easy as subclassing OTDB::Storage and overriding a few methods. Use any DB you want.'''&lt;br /&gt;
* [[Messaging]]... The library itself is '''transfer-protocol neutral''', and can be utilized across a variety of different transfer protocols. The default implementation uses the [http://zeromq.org/ ZeroMQ library] for transport. Transport is implemented as a callback function, so it's very easy (a few dozen lines of code) to swap in some other system, if you wish.&lt;br /&gt;
* OT currently supports '''MsgPack''' and '''protobuf''' for data packing, though new packers can be added by subclassing OTDB::Packer.&lt;br /&gt;
&lt;br /&gt;
The intention is for this software to be integrated as many places as possible... Games, digital cash wallets, distributed data stores, secure voip apps, anonymous bit torrent networks, mixnets, remailers, nym servers, etc. There are many other potential uses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=About&amp;diff=3214</id>
		<title>About</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=About&amp;diff=3214"/>
		<updated>2015-12-01T00:44:08Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: /* Related Systems */ Changed Monetas link to say &amp;quot;Transaction Platform&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;plainlinks&amp;quot;&amp;gt;&lt;br /&gt;
{| id=&amp;quot;mp-topbanner&amp;quot; style=&amp;quot;width:100%; background:#f6f6f6; margin-top:1.2em; border:1px solid #ddd;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:61%; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;!--        &amp;quot;Welcome to Open-Transactions&amp;quot;        --&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:100%; border:none; background:none;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; white-space:nowrap; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:162%; border:none; margin:0; padding:.1em; color:#000;&amp;quot;&amp;gt;About the Open-Transactions project.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em; font-size:95%;&amp;quot;&amp;gt;Financial cryptography software.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;articlecount&amp;quot; style=&amp;quot;width:100%; text-align:center; font-size:85%;&amp;quot;&amp;gt;[[Special:Statistics|{{NUMBEROFARTICLES}}]] [[Special:Allpages|articles]].&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; max-width: 550px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What is Open-Transactions?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions is an [[Use Cases|easy-to-use]], financial crypto, [[Sample Cash|digital cash]] and transaction [[List of Classes|library]].&lt;br /&gt;
* Open-Transactions is open-source.&lt;br /&gt;
* Open-Transactions includes a [[API|client API]], a working [[Otserver|server]], a cross-platform [https://github.com/Open-Transactions/Moneychanger GUI] and a [[opentxs|command-line]] wallet utility.&lt;br /&gt;
* Open-Transactions features: a large variety of financial instruments, markets, basket currencies, unforgeable account balances, digital cash, destruction of account history, [http://iang.org/papers/ricardian_contract.html Ricardian contracts], Smart Contracts (scriptable clauses), and more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What does it do?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions allows users to issue and manipulate digital assets.&lt;br /&gt;
* Any issuer can sign and distribute new [[Sample Currency Contract|currency contracts]] in order to create new digital asset types.&lt;br /&gt;
* Users may create many ''pseudonyms'' (public keys), each of which may own ''asset accounts'' of various types, on OT servers.&lt;br /&gt;
* Users can operate '''&amp;amp;quot;cash-only&amp;amp;quot;''' for maximum anonymity, using '''[[Sample Cash|untraceable digital cash]]'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Financial Instruments'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Users can transfer digital assets ''securely and provably'', with [[Triple-Signed Receipts|receipts]] signed by all parties.&lt;br /&gt;
* '''Even an OT server cannot change balances, or forge transactions--since it cannot forge your signature on your receipt.'''&lt;br /&gt;
* Open-Transactions supports a range of '''[[Instruments|financial instruments]]''' such as account transfer, '''[[Sample-Cheque|cheques]]''' and vouchers (aka &amp;amp;quot;cashier's cheques&amp;amp;quot; or &amp;amp;quot;banker's cheques&amp;amp;quot;), in addition to cash.&lt;br /&gt;
* These instruments are all analogous to the same financial instruments that we all use at normal banks today. Everyone already has an intuitive understanding of these financial instruments, because we use them regularly in our normal daily lives.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Markets, Basket Currencies, and Smart Contracts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Open-Transactions also implements higher-level, '''contract-based transactions''' such as '''payment plans''' and '''markets with trades'''.&lt;br /&gt;
* The [[Markets|markets]] on Open-Transactions support ''market orders, limit orders, fill-or-kill orders, day orders, stop orders, and stop limits'', just like trading on a real market.&lt;br /&gt;
* '''Basket currencies''' are also supported, as well as payment plans (recurring payments.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc.&lt;br /&gt;
* [[Client-side scripting]]: &amp;lt;code&amp;gt;!/usr/bin/env ot&amp;lt;/code&amp;gt; The entire (mostly) high and low level OT API is available within your scripts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Triple Signed Receipts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* All of this is accomplished in such a way that all parties are able to ''prove'', at all times, ''which transactions have cleared and which instruments are authorized'', '''without having to store their entire transaction history''', but instead by merely keeping the '''last signed receipt'''.&lt;br /&gt;
* Without the special mechanism that makes this possible, ''all parties would otherwise be forced to store all receipts forever''.&lt;br /&gt;
* Nyms and Asset Types have consistent IDs across all OT servers, since the ID is formed by hashing the relevant contract or public key.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Is Open-Transactions [[CENTRALIZED|centralized]]?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* No—quite the opposite. Open-Transactions is highly '''decentralized'''.&lt;br /&gt;
* Typical centralized servers have power over their users, but in OT, '''no server has power over the clients it serves''', because:&lt;br /&gt;
# An OT server does not control user transactions—it merely notarizes them.&lt;br /&gt;
# Anyone can operate an OT server, and users can go to any OT server to notarize transactions. Thus OT servers compete with each other to attract users to use their notary services.&lt;br /&gt;
# Anyone can download an OT client, and use it to execute transactions on any OT server, or any group of OT servers.&lt;br /&gt;
# OT uses triple-signed receipts, so transaction parties have independent cryptographic proof of transactions and balances.&lt;br /&gt;
# OT servers do not store user assets. Rather, cryptocurrencies are stored in voting pools so the server can't steal them.&lt;br /&gt;
&lt;br /&gt;
In every way, '''the user is in control, not the server'''—even when you're using servers you do not trust. These characteristics generate a '''federated''' network architecture—similar to the internet, and it has the same virtues as the internet—openness, decentralization, resilience, censorship-resistance, and user control.&lt;br /&gt;
&lt;br /&gt;
The community behind OT is strongly committed to developing systems that give users full control over their own assets and information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; max-width: 300px; margin: -20px 10px 0 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== White Paper ==&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf OT White Paper]&lt;br /&gt;
 &lt;br /&gt;
== Diagrams ==&lt;br /&gt;
&lt;br /&gt;
[[Voting_Pool_Deposit_Process|Voting Pools]]&lt;br /&gt;
&lt;br /&gt;
[http://i.imgur.com/HTyAJjg.png Architecture Overview (new)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/ot-diagram.jpg Architecture Overview (old)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg Financial Instruments]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Radio Interviews ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=teNzIFu5L70 &amp;quot;Trust No One&amp;quot; Miami Speech]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=234 AgoristRadio Interview, Part 1]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=246 AgoristRadio Interview, Part 2]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=vtJcUM5-TeA Interview with &amp;quot;Let's Talk Bitcoin&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=HSgpStCTw2g Interview with FutureMoneyTrends.com]&lt;br /&gt;
&lt;br /&gt;
== Video Walkthrough ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=5qtTayW-RyM Android demo video (Monetas)]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_SkRjaVliOXJITGM Desktop video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_MEk4ZDNtVGtRMHc Desktop video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_cTl3bXZpWnBBSVE iPhone video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_dS1hd3RYaENQQzg iPhone video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28141679 java testclient video 1]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28142096 java testclient video 2]&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Components and GNU Licensing]]&lt;br /&gt;
&lt;br /&gt;
[[Vulnerabilities|Potential vulnerabilities]] of Open-Transactions&lt;br /&gt;
&lt;br /&gt;
== Related Systems ==&lt;br /&gt;
&lt;br /&gt;
[http://bitcoin.org/ Bitcoin] - A censorship-resistant global ledger&lt;br /&gt;
&lt;br /&gt;
[[Stash]] - Enterprise platform based on OT.&lt;br /&gt;
&lt;br /&gt;
[[Monetas]] - Transaction platform inspired by OT.&lt;br /&gt;
&lt;br /&gt;
[https://loom.cc/help Loom] - Asset issuance and transactions&lt;br /&gt;
&lt;br /&gt;
[http://www.csee.umbc.edu/~woodcock/cmsc482/proj1/magmoney.html Magic Money] - PGP-based Chaumian blinding (unlinkable cash)&lt;br /&gt;
&lt;br /&gt;
[http://opencoin.org/ OpenCoin.org] - REST-based blinded tokens&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransact.org/ OpenTransact] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://payswarm.com/ PaySwarm] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/publickeytransaction PKTP] - Public-Key Transaction Processor&lt;br /&gt;
&lt;br /&gt;
[http://wiki.dgcmagazine.com/index.php?title=Ricardo Ricardo] - Transaction system by Ian Grigg&lt;br /&gt;
&lt;br /&gt;
[https://ripple.com/ Ripple] - Consensus-based debt ledger&lt;br /&gt;
&lt;br /&gt;
[https://www.stellar.org/ Stellar] - Ripple-based&lt;br /&gt;
&lt;br /&gt;
[http://truledger.com/ Truledger] - Destruction of account history&lt;br /&gt;
&lt;br /&gt;
[http://www.voucher-safe.com/index.cfm Voucher-Safe] - Secure asset issuance with auditing&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
Article: [http://pelagic.wavyhill.xsmail.com/Private_Digital_Economy.html Toward a Private Digital Economy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both; padding-top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In More Detail... ==&lt;br /&gt;
&lt;br /&gt;
The server itself is a [[Transactions|transaction processor]] in the cypherpunk tradition. In more detail:&lt;br /&gt;
&lt;br /&gt;
* Many '''financial instruments''' are supported: Users can write '''cheques''', purchase '''cashier's cheques''' (&amp;amp;quot;vouchers&amp;amp;quot;), and withdraw in '''[[Sample Cash|unlinkable digital cash]]'''. The software uses Chaumian-style, blinded tokens courtesy of the [http://anoncvs.aldigital.co.uk/lucre/ Lucre] library by Ben Laurie.&lt;br /&gt;
* It's like '''PGP FOR MONEY'''. The idea is to have many cash algorithms, not just Lucre. I’d like to add Chaum’s version, Brands’ version, etc. So that, just like PGP, the software should support as many of the top algorithms as possible, and make it easy to swap them out when necessary.&lt;br /&gt;
* User accounts are '''pseudonymous'''. '''A user account is a public key'''. (This is like [http://pktp.co.cc/ PKTP] by Andrew McMeikan.) You can open as many user accounts as you want. ''Full anonymity'' is possible only for &amp;quot;cash-only&amp;quot; transactions (where users only perform token exchanges, and do not open accounts), whereas ''pseudonymity'' means that transactions can be linked to the key that signed them. (While the real life identity of the owner is hidden, continuity of reputation becomes possible.) ''See full-color diagrams linked above''.&lt;br /&gt;
* '''Any user can issue new digital currencies''' and digital asset types, by uploading the new [[Sample Currency Contract|currency contract]] to the server. (This functionality is comparable to [http://www.systemics.com/docs/sox/overview.html Ricardo] by [http://financialcryptography.com/ Ian Grigg].)&lt;br /&gt;
* '''Users can open asset accounts of any type.''' You can have as many as you want, associated with each user account. (See [http://loom.cc/ Loom] by Patrick Chkoreff.)&lt;br /&gt;
* [[Triple-Signed Receipts|Triple Signed Receipts / No Account History]]. On OT, entities are able to conduct transactions, verify instruments, ''and'' provably agree on current holdings via ''signed receipts'', all without the need to store any transaction history.'' An ''asset account'' on OT is not according to the traditional sense of the word (an account normally being thought of as, &amp;quot;a list of transactions, with a balance, used in double-entry bookkeeping.&amp;quot;) While the word &amp;quot;account&amp;quot; makes things easy to understand, an ''asset account'' on OT exists only in the mind of the account holder himself. He simply asks the server to agree with him that it exists, and to provide him with a signed receipt to that effect. In the user interface, OT is able to mimic the ''account metaphor'', making usage intuitive, even though ''no actual account exists, or need be stored on either side, other than the signed receipt itself!'' (See Bill St. Clair's excellent [http://truledger.com/ Truledger] for an [http://truledger.com/doc/plain-english.html example of this concept].)&lt;br /&gt;
* Open Transactions also features '''markets'''. Any two asset types can be traded against each other. The [[markets]] are full-featured and include '''limit orders, stop orders, fill-or-kill, day orders''' (date ranges), and '''stop limits'''.&lt;br /&gt;
* Open Transactions also supports '''basket currencies'''. Users can define their own, and the server handles the process of exchanging in and out of basket accounts. Baskets are treated by the software like any other asset type, (you can open accounts, transfer funds, withdraw cash, write cheques, and even '''trade basket currencies on markets'''.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc. This concept was originated by Nick Szabo: [http://szabo.best.vwh.net/contractlanguage.html smart contracts].&lt;br /&gt;
* [[Client-side scripting]]: The entire OT API is now available for use in OTscripts on the client side. Just remember to put this at the top of the file: &amp;lt;pre&amp;gt;#!/usr/local/bin/ot --script&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Open Transactions also supports '''payment plans'''. Users can sign contracts with each other, and the server will carry out the terms and implement the payment plan. (A future goal is to issue new asset types based on revenue from payment plans--so they can also be traded on markets.)&lt;br /&gt;
* '''Contracts''', in general, are very important to Open Transactions; they are the building block of the entire library. Open Transactions uses a Ricardian-style contract, and all the various instruments, data files, and messages resemble '''[[Sample Currency Contract | PGP-signed XML files]]'''. All objects serialize to a string.&lt;br /&gt;
* The philosophy of the software is based around '''separation of powers''' (issuers and transaction servers being separate entities) as well as the '''distribution of risk'''. For example, Asset accounts can be distributed across multiple servers, and asset types can be distributed across multiple issuers (via baskets.) Read about the [[Auditing]] protocol.&lt;br /&gt;
* Potential future instruments include: [http://www.goldstandardinstitute.net/2010/06/what-is-a-real-bill/ Real Bills], dividend-paying stocks (the same mechanism can be used as interest paying bonds) and collateralized debt obligations. (OT supports payment plans, so it would be easy to group tranches of OT's payment plans to pay into a single reserve account, as backing for a new stock offering that could be traded on OT markets.) This is similar to how basket currencies are implemented. Stocks/Bonds would pay shareholders by dropping a cheque into your stock account's inbox. These features aren't available yet, but they are easy to add given the existing OT infrastructure.&lt;br /&gt;
* '''All communications are secured with OpenSSL.''' All messages are also signed and encrypted. All transactions require signatures from relevant parties including the server.&lt;br /&gt;
* Open Transactions is '''open-source''', written in C++, object-oriented, and includes '''Native [[API]]s''' for '''Java, Ruby, Python, PHP, Perl, C, [http://www.digitalmars.com/d/2.0/overview.html D], C++, Objective-C, C#, Tcl, and LISP.''' (Also supporting JRuby, Jython, Scala, Clojure, Groovy, and any other language that works on the JVM.)&lt;br /&gt;
* The software is fully '''cross-platform''': '''Linux, Mac OS X, FreeBSD, Android, and Windows''' are supported with makefiles, project files, and instructions.&lt;br /&gt;
* STORAGE... The library itself is '''storage neutral''', and could be utilized across a variety of different storage systems. All objects serialize to a string, and it is very easy to add support for new storage methods. (Currently OT uses the filesystem with key/value pairs.) '''Adding a new storage method is as easy as subclassing OTDB::Storage and overriding a few methods. Use any DB you want.'''&lt;br /&gt;
* [[Messaging]]... The library itself is '''transfer-protocol neutral''', and can be utilized across a variety of different transfer protocols. The default implementation uses the [http://zeromq.org/ ZeroMQ library] for transport. Transport is implemented as a callback function, so it's very easy (a few dozen lines of code) to swap in some other system, if you wish.&lt;br /&gt;
* OT currently supports '''MsgPack''' and '''protobuf''' for data packing, though new packers can be added by subclassing OTDB::Packer.&lt;br /&gt;
&lt;br /&gt;
The intention is for this software to be integrated as many places as possible... Games, digital cash wallets, distributed data stores, secure voip apps, anonymous bit torrent networks, mixnets, remailers, nym servers, etc. There are many other potential uses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=MediaWiki:Sidebar&amp;diff=3213</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=MediaWiki:Sidebar&amp;diff=3213"/>
		<updated>2015-12-01T00:25:39Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: Removed Monetas link from main sidebar; it was a vestige of the Monetas period.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** About | About Open-Transactions&lt;br /&gt;
** http://opentransactions.org/wiki/ot-docs/ | Documentation&lt;br /&gt;
** portal-url|portal&lt;br /&gt;
** Stash | Stash (commercial)&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Signature_status&amp;diff=3212</id>
		<title>Signature status</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Signature_status&amp;diff=3212"/>
		<updated>2015-11-30T22:23:35Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: /* Schema */ fixed link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[startwithdrawal]] API call returns a list of signatures which can be shared with other members of the voting pool to create an valid withdrawal transaction.&lt;br /&gt;
&lt;br /&gt;
The list is formatted as a JSON object.&lt;br /&gt;
&lt;br /&gt;
==Schema==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;include src=&amp;quot;https://raw.githubusercontent.com/Open-Transactions/rfc/master/json/schema/signaturestatus-01.json&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
* Input 0 is a 2-of-3 multisig script and none of the required signatures have been supplied&lt;br /&gt;
* Input 1 is a 2-of-3 multisig script and all of the required signatures have been supplied&lt;br /&gt;
&lt;br /&gt;
&amp;lt;include src=&amp;quot;https://raw.githubusercontent.com/Monetas/rfc/master/json/data/signaturestatus-01.json&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Voting Pool Technical Specifications]]&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Stash&amp;diff=3211</id>
		<title>Stash</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Stash&amp;diff=3211"/>
		<updated>2015-10-12T02:50:01Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: minor edit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Stash is an Austin based software company that was [http://opentransactions.org/forum/index.php?topic=11925.0 cofounded] in 2015 by Cliff Baltzley, the founder of [https://www.hushmail.com/ Hushmail] and Chris Odom, the creator of Open-Transactions and cofounder of [[Monetas]]. [http://www.opentransactions.org/open-transactions.pdf (Click here for Open-Transactions white paper.) ]&lt;br /&gt;
&lt;br /&gt;
Stash's mission: To give all users full control over their own money.&lt;br /&gt;
&lt;br /&gt;
Official site: http://stashcrypto.com&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Monetas&amp;diff=3210</id>
		<title>Monetas</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Monetas&amp;diff=3210"/>
		<updated>2015-10-12T02:48:46Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: minor edit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Monetas is a software company based in Zug, Switzerland, that was cofounded by Chris Odom, the creator of Open-Transactions. [http://www.opentransactions.org/open-transactions.pdf (Click for white paper.) ]&lt;br /&gt;
&lt;br /&gt;
Chris Odom [http://opentransactions.org/forum/index.php?topic=11922.0 stepped down] from Monetas in March 2015 and [http://opentransactions.org/forum/index.php?topic=11925.0 cofounded] [http://stashcrypto.com/ Stash]. He said, ''&amp;quot;When I cofounded Monetas in 2012 with Johann Gevers, our vision for the company was of a mobile money app and commercial notary software inspired by Open-Transactions, and with an emphasis on Africa.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Monetas was a major supporter of Open-Transactions development, and spent significant financial and human resources on developing Open-Transactions from 2012 through 2015, while also implementing their own commercial notary and mobile wallet software.&lt;br /&gt;
&lt;br /&gt;
Monetas has generously released their improvements to Open-Transactions under the MPLv2 license, and the company is now focused only on their own commercial implementation.&lt;br /&gt;
&lt;br /&gt;
Official site: http://monetas.net&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Stash&amp;diff=3209</id>
		<title>Stash</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Stash&amp;diff=3209"/>
		<updated>2015-10-12T02:47:45Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: added link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Stash is an Austin based software company that was [http://opentransactions.org/forum/index.php?topic=11925.0 cofounded] by Cliff Baltzley, the founder of [https://www.hushmail.com/ Hushmail] and Chris Odom, the creator of Open-Transactions and cofounder of [[Monetas]]. [http://www.opentransactions.org/open-transactions.pdf (Click here for Open-Transactions white paper.) ]&lt;br /&gt;
&lt;br /&gt;
Stash's mission: To give all users full control over their own money.&lt;br /&gt;
&lt;br /&gt;
Official site: http://stashcrypto.com&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Monetas&amp;diff=3208</id>
		<title>Monetas</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Monetas&amp;diff=3208"/>
		<updated>2015-10-12T02:45:11Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: added zug&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Monetas is a software company based in Zug, Switzerland, that was cofounded by Chris Odom, the creator of Open-Transactions. [http://www.opentransactions.org/open-transactions.pdf (Click for white paper.) ]&lt;br /&gt;
&lt;br /&gt;
Chris Odom [http://opentransactions.org/forum/index.php?topic=11922.0 stepped down] from Monetas in March 2015 and [http://opentransactions.org/forum/index.php?topic=11925.0 cofounded] [http://stashcrypto.com/ Stash]. He said, ''&amp;quot;When I cofounded Monetas in 2012 with Johann Gevers, our vision for the company was of a mobile money app and commercial notary software inspired by Open-Transactions, and with an emphasis on Africa.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Monetas was a major supporter of Open-Transactions development, and spent significant financial and human resources on developing Open-Transactions from 2012 through early 2015, while also implementing their own commercial notary and mobile wallet software.&lt;br /&gt;
&lt;br /&gt;
Monetas has generously released their improvements to Open-Transactions under the MPLv2 license, and the company is now focused only on their own commercial implementation.&lt;br /&gt;
&lt;br /&gt;
Official site: http://monetas.net&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Monetas&amp;diff=3207</id>
		<title>Monetas</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Monetas&amp;diff=3207"/>
		<updated>2015-10-12T02:44:16Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: added link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Monetas is a Switzerland based software company that was cofounded by Chris Odom, the creator of Open-Transactions. [http://www.opentransactions.org/open-transactions.pdf (Click for white paper.) ]&lt;br /&gt;
&lt;br /&gt;
Chris Odom [http://opentransactions.org/forum/index.php?topic=11922.0 stepped down] from Monetas in March 2015 and [http://opentransactions.org/forum/index.php?topic=11925.0 cofounded] [http://stashcrypto.com/ Stash]. He said, ''&amp;quot;When I cofounded Monetas in 2012 with Johann Gevers, our vision for the company was of a mobile money app and commercial notary software inspired by Open-Transactions, and with an emphasis on Africa.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Monetas was a major supporter of Open-Transactions development, and spent significant financial and human resources on developing Open-Transactions from 2012 through early 2015, while also implementing their own commercial notary and mobile wallet software.&lt;br /&gt;
&lt;br /&gt;
Monetas has generously released their improvements to Open-Transactions under the MPLv2 license, and the company is now focused only on their own commercial implementation.&lt;br /&gt;
&lt;br /&gt;
Official site: http://monetas.net&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=About&amp;diff=3206</id>
		<title>About</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=About&amp;diff=3206"/>
		<updated>2015-10-11T00:00:39Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: /* Related Systems */ Added Stash link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;plainlinks&amp;quot;&amp;gt;&lt;br /&gt;
{| id=&amp;quot;mp-topbanner&amp;quot; style=&amp;quot;width:100%; background:#f6f6f6; margin-top:1.2em; border:1px solid #ddd;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:61%; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;!--        &amp;quot;Welcome to Open-Transactions&amp;quot;        --&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:100%; border:none; background:none;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; white-space:nowrap; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:162%; border:none; margin:0; padding:.1em; color:#000;&amp;quot;&amp;gt;About the Open-Transactions project.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em; font-size:95%;&amp;quot;&amp;gt;Financial cryptography software.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;articlecount&amp;quot; style=&amp;quot;width:100%; text-align:center; font-size:85%;&amp;quot;&amp;gt;[[Special:Statistics|{{NUMBEROFARTICLES}}]] [[Special:Allpages|articles]].&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; max-width: 550px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What is Open-Transactions?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions is an [[Use Cases|easy-to-use]], financial crypto, [[Sample Cash|digital cash]] and transaction [[List of Classes|library]].&lt;br /&gt;
* Open-Transactions is open-source.&lt;br /&gt;
* Open-Transactions includes a [[API|client API]], a working [[Otserver|server]], a cross-platform [https://github.com/Open-Transactions/Moneychanger GUI] and a [[opentxs|command-line]] wallet utility.&lt;br /&gt;
* Open-Transactions features: a large variety of financial instruments, markets, basket currencies, unforgeable account balances, digital cash, destruction of account history, [http://iang.org/papers/ricardian_contract.html Ricardian contracts], Smart Contracts (scriptable clauses), and more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What does it do?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions allows users to issue and manipulate digital assets.&lt;br /&gt;
* Any issuer can sign and distribute new [[Sample Currency Contract|currency contracts]] in order to create new digital asset types.&lt;br /&gt;
* Users may create many ''pseudonyms'' (public keys), each of which may own ''asset accounts'' of various types, on OT servers.&lt;br /&gt;
* Users can operate '''&amp;amp;quot;cash-only&amp;amp;quot;''' for maximum anonymity, using '''[[Sample Cash|untraceable digital cash]]'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Financial Instruments'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Users can transfer digital assets ''securely and provably'', with [[Triple-Signed Receipts|receipts]] signed by all parties.&lt;br /&gt;
* '''Even an OT server cannot change balances, or forge transactions--since it cannot forge your signature on your receipt.'''&lt;br /&gt;
* Open-Transactions supports a range of '''[[Instruments|financial instruments]]''' such as account transfer, '''[[Sample-Cheque|cheques]]''' and vouchers (aka &amp;amp;quot;cashier's cheques&amp;amp;quot; or &amp;amp;quot;banker's cheques&amp;amp;quot;), in addition to cash.&lt;br /&gt;
* These instruments are all analogous to the same financial instruments that we all use at normal banks today. Everyone already has an intuitive understanding of these financial instruments, because we use them regularly in our normal daily lives.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Markets, Basket Currencies, and Smart Contracts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Open-Transactions also implements higher-level, '''contract-based transactions''' such as '''payment plans''' and '''markets with trades'''.&lt;br /&gt;
* The [[Markets|markets]] on Open-Transactions support ''market orders, limit orders, fill-or-kill orders, day orders, stop orders, and stop limits'', just like trading on a real market.&lt;br /&gt;
* '''Basket currencies''' are also supported, as well as payment plans (recurring payments.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc.&lt;br /&gt;
* [[Client-side scripting]]: &amp;lt;code&amp;gt;!/usr/bin/env ot&amp;lt;/code&amp;gt; The entire (mostly) high and low level OT API is available within your scripts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Triple Signed Receipts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* All of this is accomplished in such a way that all parties are able to ''prove'', at all times, ''which transactions have cleared and which instruments are authorized'', '''without having to store their entire transaction history''', but instead by merely keeping the '''last signed receipt'''.&lt;br /&gt;
* Without the special mechanism that makes this possible, ''all parties would otherwise be forced to store all receipts forever''.&lt;br /&gt;
* Nyms and Asset Types have consistent IDs across all OT servers, since the ID is formed by hashing the relevant contract or public key.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Is Open-Transactions [[CENTRALIZED|centralized]]?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* No—quite the opposite. Open-Transactions is highly '''decentralized'''.&lt;br /&gt;
* Typical centralized servers have power over their users, but in OT, '''no server has power over the clients it serves''', because:&lt;br /&gt;
# An OT server does not control user transactions—it merely notarizes them.&lt;br /&gt;
# Anyone can operate an OT server, and users can go to any OT server to notarize transactions. Thus OT servers compete with each other to attract users to use their notary services.&lt;br /&gt;
# Anyone can download an OT client, and use it to execute transactions on any OT server, or any group of OT servers.&lt;br /&gt;
# OT uses triple-signed receipts, so transaction parties have independent cryptographic proof of transactions and balances.&lt;br /&gt;
# OT servers do not store user assets. Rather, cryptocurrencies are stored in voting pools so the server can't steal them.&lt;br /&gt;
&lt;br /&gt;
In every way, '''the user is in control, not the server'''—even when you're using servers you do not trust. These characteristics generate a '''federated''' network architecture—similar to the internet, and it has the same virtues as the internet—openness, decentralization, resilience, censorship-resistance, and user control.&lt;br /&gt;
&lt;br /&gt;
The community behind OT is strongly committed to developing systems that give users full control over their own assets and information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; max-width: 300px; margin: -20px 10px 0 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== White Paper ==&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf OT White Paper]&lt;br /&gt;
 &lt;br /&gt;
== Diagrams ==&lt;br /&gt;
&lt;br /&gt;
[[Voting_Pool_Deposit_Process|Voting Pools]]&lt;br /&gt;
&lt;br /&gt;
[http://i.imgur.com/HTyAJjg.png Architecture Overview (new)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/ot-diagram.jpg Architecture Overview (old)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg Financial Instruments]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Radio Interviews ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=teNzIFu5L70 &amp;quot;Trust No One&amp;quot; Miami Speech]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=234 AgoristRadio Interview, Part 1]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=246 AgoristRadio Interview, Part 2]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=vtJcUM5-TeA Interview with &amp;quot;Let's Talk Bitcoin&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=HSgpStCTw2g Interview with FutureMoneyTrends.com]&lt;br /&gt;
&lt;br /&gt;
== Video Walkthrough ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=5qtTayW-RyM Android demo video (Monetas)]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_SkRjaVliOXJITGM Desktop video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_MEk4ZDNtVGtRMHc Desktop video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_cTl3bXZpWnBBSVE iPhone video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_dS1hd3RYaENQQzg iPhone video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28141679 java testclient video 1]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28142096 java testclient video 2]&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Components and GNU Licensing]]&lt;br /&gt;
&lt;br /&gt;
[[Vulnerabilities|Potential vulnerabilities]] of Open-Transactions&lt;br /&gt;
&lt;br /&gt;
== Related Systems ==&lt;br /&gt;
&lt;br /&gt;
[http://bitcoin.org/ Bitcoin] - A censorship-resistant global ledger&lt;br /&gt;
&lt;br /&gt;
[[Stash]] - Enterprise platform based on OT.&lt;br /&gt;
&lt;br /&gt;
[[Monetas]] - Mobile payments inspired by OT.&lt;br /&gt;
&lt;br /&gt;
[https://loom.cc/help Loom] - Asset issuance and transactions&lt;br /&gt;
&lt;br /&gt;
[http://www.csee.umbc.edu/~woodcock/cmsc482/proj1/magmoney.html Magic Money] - PGP-based Chaumian blinding (unlinkable cash)&lt;br /&gt;
&lt;br /&gt;
[http://opencoin.org/ OpenCoin.org] - REST-based blinded tokens&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransact.org/ OpenTransact] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://payswarm.com/ PaySwarm] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/publickeytransaction PKTP] - Public-Key Transaction Processor&lt;br /&gt;
&lt;br /&gt;
[http://wiki.dgcmagazine.com/index.php?title=Ricardo Ricardo] - Transaction system by Ian Grigg&lt;br /&gt;
&lt;br /&gt;
[https://ripple.com/ Ripple] - Consensus-based debt ledger&lt;br /&gt;
&lt;br /&gt;
[https://www.stellar.org/ Stellar] - Ripple-based&lt;br /&gt;
&lt;br /&gt;
[http://truledger.com/ Truledger] - Destruction of account history&lt;br /&gt;
&lt;br /&gt;
[http://www.voucher-safe.com/index.cfm Voucher-Safe] - Secure asset issuance with auditing&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
Article: [http://pelagic.wavyhill.xsmail.com/Private_Digital_Economy.html Toward a Private Digital Economy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both; padding-top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In More Detail... ==&lt;br /&gt;
&lt;br /&gt;
The server itself is a [[Transactions|transaction processor]] in the cypherpunk tradition. In more detail:&lt;br /&gt;
&lt;br /&gt;
* Many '''financial instruments''' are supported: Users can write '''cheques''', purchase '''cashier's cheques''' (&amp;amp;quot;vouchers&amp;amp;quot;), and withdraw in '''[[Sample Cash|unlinkable digital cash]]'''. The software uses Chaumian-style, blinded tokens courtesy of the [http://anoncvs.aldigital.co.uk/lucre/ Lucre] library by Ben Laurie.&lt;br /&gt;
* It's like '''PGP FOR MONEY'''. The idea is to have many cash algorithms, not just Lucre. I’d like to add Chaum’s version, Brands’ version, etc. So that, just like PGP, the software should support as many of the top algorithms as possible, and make it easy to swap them out when necessary.&lt;br /&gt;
* User accounts are '''pseudonymous'''. '''A user account is a public key'''. (This is like [http://pktp.co.cc/ PKTP] by Andrew McMeikan.) You can open as many user accounts as you want. ''Full anonymity'' is possible only for &amp;quot;cash-only&amp;quot; transactions (where users only perform token exchanges, and do not open accounts), whereas ''pseudonymity'' means that transactions can be linked to the key that signed them. (While the real life identity of the owner is hidden, continuity of reputation becomes possible.) ''See full-color diagrams linked above''.&lt;br /&gt;
* '''Any user can issue new digital currencies''' and digital asset types, by uploading the new [[Sample Currency Contract|currency contract]] to the server. (This functionality is comparable to [http://www.systemics.com/docs/sox/overview.html Ricardo] by [http://financialcryptography.com/ Ian Grigg].)&lt;br /&gt;
* '''Users can open asset accounts of any type.''' You can have as many as you want, associated with each user account. (See [http://loom.cc/ Loom] by Patrick Chkoreff.)&lt;br /&gt;
* [[Triple-Signed Receipts|Triple Signed Receipts / No Account History]]. On OT, entities are able to conduct transactions, verify instruments, ''and'' provably agree on current holdings via ''signed receipts'', all without the need to store any transaction history.'' An ''asset account'' on OT is not according to the traditional sense of the word (an account normally being thought of as, &amp;quot;a list of transactions, with a balance, used in double-entry bookkeeping.&amp;quot;) While the word &amp;quot;account&amp;quot; makes things easy to understand, an ''asset account'' on OT exists only in the mind of the account holder himself. He simply asks the server to agree with him that it exists, and to provide him with a signed receipt to that effect. In the user interface, OT is able to mimic the ''account metaphor'', making usage intuitive, even though ''no actual account exists, or need be stored on either side, other than the signed receipt itself!'' (See Bill St. Clair's excellent [http://truledger.com/ Truledger] for an [http://truledger.com/doc/plain-english.html example of this concept].)&lt;br /&gt;
* Open Transactions also features '''markets'''. Any two asset types can be traded against each other. The [[markets]] are full-featured and include '''limit orders, stop orders, fill-or-kill, day orders''' (date ranges), and '''stop limits'''.&lt;br /&gt;
* Open Transactions also supports '''basket currencies'''. Users can define their own, and the server handles the process of exchanging in and out of basket accounts. Baskets are treated by the software like any other asset type, (you can open accounts, transfer funds, withdraw cash, write cheques, and even '''trade basket currencies on markets'''.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc. This concept was originated by Nick Szabo: [http://szabo.best.vwh.net/contractlanguage.html smart contracts].&lt;br /&gt;
* [[Client-side scripting]]: The entire OT API is now available for use in OTscripts on the client side. Just remember to put this at the top of the file: &amp;lt;pre&amp;gt;#!/usr/local/bin/ot --script&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Open Transactions also supports '''payment plans'''. Users can sign contracts with each other, and the server will carry out the terms and implement the payment plan. (A future goal is to issue new asset types based on revenue from payment plans--so they can also be traded on markets.)&lt;br /&gt;
* '''Contracts''', in general, are very important to Open Transactions; they are the building block of the entire library. Open Transactions uses a Ricardian-style contract, and all the various instruments, data files, and messages resemble '''[[Sample Currency Contract | PGP-signed XML files]]'''. All objects serialize to a string.&lt;br /&gt;
* The philosophy of the software is based around '''separation of powers''' (issuers and transaction servers being separate entities) as well as the '''distribution of risk'''. For example, Asset accounts can be distributed across multiple servers, and asset types can be distributed across multiple issuers (via baskets.) Read about the [[Auditing]] protocol.&lt;br /&gt;
* Potential future instruments include: [http://www.goldstandardinstitute.net/2010/06/what-is-a-real-bill/ Real Bills], dividend-paying stocks (the same mechanism can be used as interest paying bonds) and collateralized debt obligations. (OT supports payment plans, so it would be easy to group tranches of OT's payment plans to pay into a single reserve account, as backing for a new stock offering that could be traded on OT markets.) This is similar to how basket currencies are implemented. Stocks/Bonds would pay shareholders by dropping a cheque into your stock account's inbox. These features aren't available yet, but they are easy to add given the existing OT infrastructure.&lt;br /&gt;
* '''All communications are secured with OpenSSL.''' All messages are also signed and encrypted. All transactions require signatures from relevant parties including the server.&lt;br /&gt;
* Open Transactions is '''open-source''', written in C++, object-oriented, and includes '''Native [[API]]s''' for '''Java, Ruby, Python, PHP, Perl, C, [http://www.digitalmars.com/d/2.0/overview.html D], C++, Objective-C, C#, Tcl, and LISP.''' (Also supporting JRuby, Jython, Scala, Clojure, Groovy, and any other language that works on the JVM.)&lt;br /&gt;
* The software is fully '''cross-platform''': '''Linux, Mac OS X, FreeBSD, Android, and Windows''' are supported with makefiles, project files, and instructions.&lt;br /&gt;
* STORAGE... The library itself is '''storage neutral''', and could be utilized across a variety of different storage systems. All objects serialize to a string, and it is very easy to add support for new storage methods. (Currently OT uses the filesystem with key/value pairs.) '''Adding a new storage method is as easy as subclassing OTDB::Storage and overriding a few methods. Use any DB you want.'''&lt;br /&gt;
* [[Messaging]]... The library itself is '''transfer-protocol neutral''', and can be utilized across a variety of different transfer protocols. The default implementation uses the [http://zeromq.org/ ZeroMQ library] for transport. Transport is implemented as a callback function, so it's very easy (a few dozen lines of code) to swap in some other system, if you wish.&lt;br /&gt;
* OT currently supports '''MsgPack''' and '''protobuf''' for data packing, though new packers can be added by subclassing OTDB::Packer.&lt;br /&gt;
&lt;br /&gt;
The intention is for this software to be integrated as many places as possible... Games, digital cash wallets, distributed data stores, secure voip apps, anonymous bit torrent networks, mixnets, remailers, nym servers, etc. There are many other potential uses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Stash&amp;diff=3205</id>
		<title>Stash</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Stash&amp;diff=3205"/>
		<updated>2015-10-10T23:59:15Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: added mission&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Stash is an Austin based software company that was [http://opentransactions.org/forum/index.php?topic=11925.0 cofounded] by Cliff Baltzley, the founder of [https://www.hushmail.com/ Hushmail] and Chris Odom, the creator of Open-Transactions. [http://www.opentransactions.org/open-transactions.pdf (Click for white paper.) ]&lt;br /&gt;
&lt;br /&gt;
Stash's mission: To give all users full control over their own money.&lt;br /&gt;
&lt;br /&gt;
Official site: http://stashcrypto.com&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Stash&amp;diff=3204</id>
		<title>Stash</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Stash&amp;diff=3204"/>
		<updated>2015-10-10T23:57:31Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: added press release link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Stash is an Austin based software company that was [http://opentransactions.org/forum/index.php?topic=11925.0 cofounded] by Cliff Baltzley, the founder of [https://www.hushmail.com/ Hushmail] and Chris Odom, the creator of Open-Transactions. [http://www.opentransactions.org/open-transactions.pdf (Click for white paper.) ]&lt;br /&gt;
&lt;br /&gt;
Official site: http://stashcrypto.com&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Stash&amp;diff=3203</id>
		<title>Stash</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Stash&amp;diff=3203"/>
		<updated>2015-10-10T23:55:42Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: created page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Stash is an Austin based software company that was cofounded by Cliff Baltzley, the founder of [https://www.hushmail.com/ Hushmail] and Chris Odom, the creator of Open-Transactions. [http://www.opentransactions.org/open-transactions.pdf (Click for white paper.) ]&lt;br /&gt;
&lt;br /&gt;
Official site: http://stashcrypto.com&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=MediaWiki:Sidebar&amp;diff=3202</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=MediaWiki:Sidebar&amp;diff=3202"/>
		<updated>2015-10-10T23:45:04Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: re-arranged order&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** About | About Open-Transactions&lt;br /&gt;
** http://opentransactions.org/wiki/ot-docs/ | Documentation&lt;br /&gt;
** portal-url|portal&lt;br /&gt;
** Stash | Stash (commercial)&lt;br /&gt;
** Monetas | Monetas (commercial)&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=MediaWiki:Sidebar&amp;diff=3201</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=MediaWiki:Sidebar&amp;diff=3201"/>
		<updated>2015-10-10T23:44:45Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: added Stash&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** About | About Open-Transactions&lt;br /&gt;
** http://opentransactions.org/wiki/ot-docs/ | Documentation&lt;br /&gt;
** portal-url|portal&lt;br /&gt;
** Monetas | Monetas (commercial)&lt;br /&gt;
** Stash | Stash (commercial)&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Monetas&amp;diff=3200</id>
		<title>Monetas</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Monetas&amp;diff=3200"/>
		<updated>2015-10-10T22:38:08Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: added Stash link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Monetas is a Switzerland based software company that was cofounded by Chris Odom, the creator of Open-Transactions. [http://www.opentransactions.org/open-transactions.pdf (Click for white paper.) ]&lt;br /&gt;
&lt;br /&gt;
Chris Odom [http://opentransactions.org/forum/index.php?topic=11922.0 stepped down] from Monetas in March 2015 and [http://opentransactions.org/forum/index.php?topic=11925.0 cofounded Stash]. He said, ''&amp;quot;When I cofounded Monetas in 2012 with Johann Gevers, our vision for the company was of a mobile money app and commercial notary software inspired by Open-Transactions, and with an emphasis on Africa.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Monetas was a major supporter of Open-Transactions development, and spent significant financial and human resources on developing Open-Transactions from 2012 through early 2015, while also implementing their own commercial notary and mobile wallet software.&lt;br /&gt;
&lt;br /&gt;
Monetas has generously released their improvements to Open-Transactions under the MPLv2 license, and the company is now focused only on their own commercial implementation.&lt;br /&gt;
&lt;br /&gt;
Official site: http://monetas.net&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=About&amp;diff=3199</id>
		<title>About</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=About&amp;diff=3199"/>
		<updated>2015-08-01T18:29:54Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: /* Video Walkthrough */ removed a dead link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;plainlinks&amp;quot;&amp;gt;&lt;br /&gt;
{| id=&amp;quot;mp-topbanner&amp;quot; style=&amp;quot;width:100%; background:#f6f6f6; margin-top:1.2em; border:1px solid #ddd;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:61%; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;!--        &amp;quot;Welcome to Open-Transactions&amp;quot;        --&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:100%; border:none; background:none;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; white-space:nowrap; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:162%; border:none; margin:0; padding:.1em; color:#000;&amp;quot;&amp;gt;About the Open-Transactions project.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em; font-size:95%;&amp;quot;&amp;gt;Financial cryptography software.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;articlecount&amp;quot; style=&amp;quot;width:100%; text-align:center; font-size:85%;&amp;quot;&amp;gt;[[Special:Statistics|{{NUMBEROFARTICLES}}]] [[Special:Allpages|articles]].&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; max-width: 550px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What is Open-Transactions?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions is an [[Use Cases|easy-to-use]], financial crypto, [[Sample Cash|digital cash]] and transaction [[List of Classes|library]].&lt;br /&gt;
* Open-Transactions is open-source.&lt;br /&gt;
* Open-Transactions includes a [[API|client API]], a working [[Otserver|server]], a cross-platform [https://github.com/Open-Transactions/Moneychanger GUI] and a [[opentxs|command-line]] wallet utility.&lt;br /&gt;
* Open-Transactions features: a large variety of financial instruments, markets, basket currencies, unforgeable account balances, digital cash, destruction of account history, [http://iang.org/papers/ricardian_contract.html Ricardian contracts], Smart Contracts (scriptable clauses), and more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What does it do?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions allows users to issue and manipulate digital assets.&lt;br /&gt;
* Any issuer can sign and distribute new [[Sample Currency Contract|currency contracts]] in order to create new digital asset types.&lt;br /&gt;
* Users may create many ''pseudonyms'' (public keys), each of which may own ''asset accounts'' of various types, on OT servers.&lt;br /&gt;
* Users can operate '''&amp;amp;quot;cash-only&amp;amp;quot;''' for maximum anonymity, using '''[[Sample Cash|untraceable digital cash]]'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Financial Instruments'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Users can transfer digital assets ''securely and provably'', with [[Triple-Signed Receipts|receipts]] signed by all parties.&lt;br /&gt;
* '''Even an OT server cannot change balances, or forge transactions--since it cannot forge your signature on your receipt.'''&lt;br /&gt;
* Open-Transactions supports a range of '''[[Instruments|financial instruments]]''' such as account transfer, '''[[Sample-Cheque|cheques]]''' and vouchers (aka &amp;amp;quot;cashier's cheques&amp;amp;quot; or &amp;amp;quot;banker's cheques&amp;amp;quot;), in addition to cash.&lt;br /&gt;
* These instruments are all analogous to the same financial instruments that we all use at normal banks today. Everyone already has an intuitive understanding of these financial instruments, because we use them regularly in our normal daily lives.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Markets, Basket Currencies, and Smart Contracts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Open-Transactions also implements higher-level, '''contract-based transactions''' such as '''payment plans''' and '''markets with trades'''.&lt;br /&gt;
* The [[Markets|markets]] on Open-Transactions support ''market orders, limit orders, fill-or-kill orders, day orders, stop orders, and stop limits'', just like trading on a real market.&lt;br /&gt;
* '''Basket currencies''' are also supported, as well as payment plans (recurring payments.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc.&lt;br /&gt;
* [[Client-side scripting]]: &amp;lt;code&amp;gt;!/usr/bin/env ot&amp;lt;/code&amp;gt; The entire (mostly) high and low level OT API is available within your scripts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Triple Signed Receipts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* All of this is accomplished in such a way that all parties are able to ''prove'', at all times, ''which transactions have cleared and which instruments are authorized'', '''without having to store their entire transaction history''', but instead by merely keeping the '''last signed receipt'''.&lt;br /&gt;
* Without the special mechanism that makes this possible, ''all parties would otherwise be forced to store all receipts forever''.&lt;br /&gt;
* Nyms and Asset Types have consistent IDs across all OT servers, since the ID is formed by hashing the relevant contract or public key.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Is Open-Transactions [[CENTRALIZED|centralized]]?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* No—quite the opposite. Open-Transactions is highly '''decentralized'''.&lt;br /&gt;
* Typical centralized servers have power over their users, but in OT, '''no server has power over the clients it serves''', because:&lt;br /&gt;
# An OT server does not control user transactions—it merely notarizes them.&lt;br /&gt;
# Anyone can operate an OT server, and users can go to any OT server to notarize transactions. Thus OT servers compete with each other to attract users to use their notary services.&lt;br /&gt;
# Anyone can download an OT client, and use it to execute transactions on any OT server, or any group of OT servers.&lt;br /&gt;
# OT uses triple-signed receipts, so transaction parties have independent cryptographic proof of transactions and balances.&lt;br /&gt;
# OT servers do not store user assets. Rather, cryptocurrencies are stored in voting pools so the server can't steal them.&lt;br /&gt;
&lt;br /&gt;
In every way, '''the user is in control, not the server'''—even when you're using servers you do not trust. These characteristics generate a '''federated''' network architecture—similar to the internet, and it has the same virtues as the internet—openness, decentralization, resilience, censorship-resistance, and user control.&lt;br /&gt;
&lt;br /&gt;
The community behind OT is strongly committed to developing systems that give users full control over their own assets and information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; max-width: 300px; margin: -20px 10px 0 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== White Paper ==&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf OT White Paper]&lt;br /&gt;
 &lt;br /&gt;
== Diagrams ==&lt;br /&gt;
&lt;br /&gt;
[[Voting_Pool_Deposit_Process|Voting Pools]]&lt;br /&gt;
&lt;br /&gt;
[http://i.imgur.com/HTyAJjg.png Architecture Overview (new)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/ot-diagram.jpg Architecture Overview (old)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg Financial Instruments]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Radio Interviews ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=teNzIFu5L70 &amp;quot;Trust No One&amp;quot; Miami Speech]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=234 AgoristRadio Interview, Part 1]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=246 AgoristRadio Interview, Part 2]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=vtJcUM5-TeA Interview with &amp;quot;Let's Talk Bitcoin&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=HSgpStCTw2g Interview with FutureMoneyTrends.com]&lt;br /&gt;
&lt;br /&gt;
== Video Walkthrough ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=5qtTayW-RyM Android demo video (Monetas)]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_SkRjaVliOXJITGM Desktop video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_MEk4ZDNtVGtRMHc Desktop video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_cTl3bXZpWnBBSVE iPhone video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_dS1hd3RYaENQQzg iPhone video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28141679 java testclient video 1]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28142096 java testclient video 2]&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Components and GNU Licensing]]&lt;br /&gt;
&lt;br /&gt;
[[Vulnerabilities|Potential vulnerabilities]] of Open-Transactions&lt;br /&gt;
&lt;br /&gt;
== Related Systems ==&lt;br /&gt;
&lt;br /&gt;
[http://bitcoin.org/ Bitcoin] - A censorship-resistant global ledger&lt;br /&gt;
&lt;br /&gt;
[[Monetas]] - Enterprise platform inspired by OT.&lt;br /&gt;
&lt;br /&gt;
[https://loom.cc/help Loom] - Asset issuance and transactions&lt;br /&gt;
&lt;br /&gt;
[http://www.csee.umbc.edu/~woodcock/cmsc482/proj1/magmoney.html Magic Money] - PGP-based Chaumian blinding (unlinkable cash)&lt;br /&gt;
&lt;br /&gt;
[http://opencoin.org/ OpenCoin.org] - REST-based blinded tokens&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransact.org/ OpenTransact] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://payswarm.com/ PaySwarm] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/publickeytransaction PKTP] - Public-Key Transaction Processor&lt;br /&gt;
&lt;br /&gt;
[http://wiki.dgcmagazine.com/index.php?title=Ricardo Ricardo] - Transaction system by Ian Grigg&lt;br /&gt;
&lt;br /&gt;
[https://ripple.com/ Ripple] - Consensus-based debt ledger&lt;br /&gt;
&lt;br /&gt;
[https://www.stellar.org/ Stellar] - Ripple-based&lt;br /&gt;
&lt;br /&gt;
[http://truledger.com/ Truledger] - Destruction of account history&lt;br /&gt;
&lt;br /&gt;
[http://www.voucher-safe.com/index.cfm Voucher-Safe] - Secure asset issuance with auditing&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
Article: [http://pelagic.wavyhill.xsmail.com/Private_Digital_Economy.html Toward a Private Digital Economy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both; padding-top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In More Detail... ==&lt;br /&gt;
&lt;br /&gt;
The server itself is a [[Transactions|transaction processor]] in the cypherpunk tradition. In more detail:&lt;br /&gt;
&lt;br /&gt;
* Many '''financial instruments''' are supported: Users can write '''cheques''', purchase '''cashier's cheques''' (&amp;amp;quot;vouchers&amp;amp;quot;), and withdraw in '''[[Sample Cash|unlinkable digital cash]]'''. The software uses Chaumian-style, blinded tokens courtesy of the [http://anoncvs.aldigital.co.uk/lucre/ Lucre] library by Ben Laurie.&lt;br /&gt;
* It's like '''PGP FOR MONEY'''. The idea is to have many cash algorithms, not just Lucre. I’d like to add Chaum’s version, Brands’ version, etc. So that, just like PGP, the software should support as many of the top algorithms as possible, and make it easy to swap them out when necessary.&lt;br /&gt;
* User accounts are '''pseudonymous'''. '''A user account is a public key'''. (This is like [http://pktp.co.cc/ PKTP] by Andrew McMeikan.) You can open as many user accounts as you want. ''Full anonymity'' is possible only for &amp;quot;cash-only&amp;quot; transactions (where users only perform token exchanges, and do not open accounts), whereas ''pseudonymity'' means that transactions can be linked to the key that signed them. (While the real life identity of the owner is hidden, continuity of reputation becomes possible.) ''See full-color diagrams linked above''.&lt;br /&gt;
* '''Any user can issue new digital currencies''' and digital asset types, by uploading the new [[Sample Currency Contract|currency contract]] to the server. (This functionality is comparable to [http://www.systemics.com/docs/sox/overview.html Ricardo] by [http://financialcryptography.com/ Ian Grigg].)&lt;br /&gt;
* '''Users can open asset accounts of any type.''' You can have as many as you want, associated with each user account. (See [http://loom.cc/ Loom] by Patrick Chkoreff.)&lt;br /&gt;
* [[Triple-Signed Receipts|Triple Signed Receipts / No Account History]]. On OT, entities are able to conduct transactions, verify instruments, ''and'' provably agree on current holdings via ''signed receipts'', all without the need to store any transaction history.'' An ''asset account'' on OT is not according to the traditional sense of the word (an account normally being thought of as, &amp;quot;a list of transactions, with a balance, used in double-entry bookkeeping.&amp;quot;) While the word &amp;quot;account&amp;quot; makes things easy to understand, an ''asset account'' on OT exists only in the mind of the account holder himself. He simply asks the server to agree with him that it exists, and to provide him with a signed receipt to that effect. In the user interface, OT is able to mimic the ''account metaphor'', making usage intuitive, even though ''no actual account exists, or need be stored on either side, other than the signed receipt itself!'' (See Bill St. Clair's excellent [http://truledger.com/ Truledger] for an [http://truledger.com/doc/plain-english.html example of this concept].)&lt;br /&gt;
* Open Transactions also features '''markets'''. Any two asset types can be traded against each other. The [[markets]] are full-featured and include '''limit orders, stop orders, fill-or-kill, day orders''' (date ranges), and '''stop limits'''.&lt;br /&gt;
* Open Transactions also supports '''basket currencies'''. Users can define their own, and the server handles the process of exchanging in and out of basket accounts. Baskets are treated by the software like any other asset type, (you can open accounts, transfer funds, withdraw cash, write cheques, and even '''trade basket currencies on markets'''.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc. This concept was originated by Nick Szabo: [http://szabo.best.vwh.net/contractlanguage.html smart contracts].&lt;br /&gt;
* [[Client-side scripting]]: The entire OT API is now available for use in OTscripts on the client side. Just remember to put this at the top of the file: &amp;lt;pre&amp;gt;#!/usr/local/bin/ot --script&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Open Transactions also supports '''payment plans'''. Users can sign contracts with each other, and the server will carry out the terms and implement the payment plan. (A future goal is to issue new asset types based on revenue from payment plans--so they can also be traded on markets.)&lt;br /&gt;
* '''Contracts''', in general, are very important to Open Transactions; they are the building block of the entire library. Open Transactions uses a Ricardian-style contract, and all the various instruments, data files, and messages resemble '''[[Sample Currency Contract | PGP-signed XML files]]'''. All objects serialize to a string.&lt;br /&gt;
* The philosophy of the software is based around '''separation of powers''' (issuers and transaction servers being separate entities) as well as the '''distribution of risk'''. For example, Asset accounts can be distributed across multiple servers, and asset types can be distributed across multiple issuers (via baskets.) Read about the [[Auditing]] protocol.&lt;br /&gt;
* Potential future instruments include: [http://www.goldstandardinstitute.net/2010/06/what-is-a-real-bill/ Real Bills], dividend-paying stocks (the same mechanism can be used as interest paying bonds) and collateralized debt obligations. (OT supports payment plans, so it would be easy to group tranches of OT's payment plans to pay into a single reserve account, as backing for a new stock offering that could be traded on OT markets.) This is similar to how basket currencies are implemented. Stocks/Bonds would pay shareholders by dropping a cheque into your stock account's inbox. These features aren't available yet, but they are easy to add given the existing OT infrastructure.&lt;br /&gt;
* '''All communications are secured with OpenSSL.''' All messages are also signed and encrypted. All transactions require signatures from relevant parties including the server.&lt;br /&gt;
* Open Transactions is '''open-source''', written in C++, object-oriented, and includes '''Native [[API]]s''' for '''Java, Ruby, Python, PHP, Perl, C, [http://www.digitalmars.com/d/2.0/overview.html D], C++, Objective-C, C#, Tcl, and LISP.''' (Also supporting JRuby, Jython, Scala, Clojure, Groovy, and any other language that works on the JVM.)&lt;br /&gt;
* The software is fully '''cross-platform''': '''Linux, Mac OS X, FreeBSD, Android, and Windows''' are supported with makefiles, project files, and instructions.&lt;br /&gt;
* STORAGE... The library itself is '''storage neutral''', and could be utilized across a variety of different storage systems. All objects serialize to a string, and it is very easy to add support for new storage methods. (Currently OT uses the filesystem with key/value pairs.) '''Adding a new storage method is as easy as subclassing OTDB::Storage and overriding a few methods. Use any DB you want.'''&lt;br /&gt;
* [[Messaging]]... The library itself is '''transfer-protocol neutral''', and can be utilized across a variety of different transfer protocols. The default implementation uses the [http://zeromq.org/ ZeroMQ library] for transport. Transport is implemented as a callback function, so it's very easy (a few dozen lines of code) to swap in some other system, if you wish.&lt;br /&gt;
* OT currently supports '''MsgPack''' and '''protobuf''' for data packing, though new packers can be added by subclassing OTDB::Packer.&lt;br /&gt;
&lt;br /&gt;
The intention is for this software to be integrated as many places as possible... Games, digital cash wallets, distributed data stores, secure voip apps, anonymous bit torrent networks, mixnets, remailers, nym servers, etc. There are many other potential uses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=About&amp;diff=3198</id>
		<title>About</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=About&amp;diff=3198"/>
		<updated>2015-08-01T18:29:35Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: /* Video Walkthrough */ updated video links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;plainlinks&amp;quot;&amp;gt;&lt;br /&gt;
{| id=&amp;quot;mp-topbanner&amp;quot; style=&amp;quot;width:100%; background:#f6f6f6; margin-top:1.2em; border:1px solid #ddd;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:61%; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;!--        &amp;quot;Welcome to Open-Transactions&amp;quot;        --&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:100%; border:none; background:none;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; white-space:nowrap; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:162%; border:none; margin:0; padding:.1em; color:#000;&amp;quot;&amp;gt;About the Open-Transactions project.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em; font-size:95%;&amp;quot;&amp;gt;Financial cryptography software.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;articlecount&amp;quot; style=&amp;quot;width:100%; text-align:center; font-size:85%;&amp;quot;&amp;gt;[[Special:Statistics|{{NUMBEROFARTICLES}}]] [[Special:Allpages|articles]].&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; max-width: 550px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What is Open-Transactions?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions is an [[Use Cases|easy-to-use]], financial crypto, [[Sample Cash|digital cash]] and transaction [[List of Classes|library]].&lt;br /&gt;
* Open-Transactions is open-source.&lt;br /&gt;
* Open-Transactions includes a [[API|client API]], a working [[Otserver|server]], a cross-platform [https://github.com/Open-Transactions/Moneychanger GUI] and a [[opentxs|command-line]] wallet utility.&lt;br /&gt;
* Open-Transactions features: a large variety of financial instruments, markets, basket currencies, unforgeable account balances, digital cash, destruction of account history, [http://iang.org/papers/ricardian_contract.html Ricardian contracts], Smart Contracts (scriptable clauses), and more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What does it do?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions allows users to issue and manipulate digital assets.&lt;br /&gt;
* Any issuer can sign and distribute new [[Sample Currency Contract|currency contracts]] in order to create new digital asset types.&lt;br /&gt;
* Users may create many ''pseudonyms'' (public keys), each of which may own ''asset accounts'' of various types, on OT servers.&lt;br /&gt;
* Users can operate '''&amp;amp;quot;cash-only&amp;amp;quot;''' for maximum anonymity, using '''[[Sample Cash|untraceable digital cash]]'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Financial Instruments'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Users can transfer digital assets ''securely and provably'', with [[Triple-Signed Receipts|receipts]] signed by all parties.&lt;br /&gt;
* '''Even an OT server cannot change balances, or forge transactions--since it cannot forge your signature on your receipt.'''&lt;br /&gt;
* Open-Transactions supports a range of '''[[Instruments|financial instruments]]''' such as account transfer, '''[[Sample-Cheque|cheques]]''' and vouchers (aka &amp;amp;quot;cashier's cheques&amp;amp;quot; or &amp;amp;quot;banker's cheques&amp;amp;quot;), in addition to cash.&lt;br /&gt;
* These instruments are all analogous to the same financial instruments that we all use at normal banks today. Everyone already has an intuitive understanding of these financial instruments, because we use them regularly in our normal daily lives.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Markets, Basket Currencies, and Smart Contracts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Open-Transactions also implements higher-level, '''contract-based transactions''' such as '''payment plans''' and '''markets with trades'''.&lt;br /&gt;
* The [[Markets|markets]] on Open-Transactions support ''market orders, limit orders, fill-or-kill orders, day orders, stop orders, and stop limits'', just like trading on a real market.&lt;br /&gt;
* '''Basket currencies''' are also supported, as well as payment plans (recurring payments.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc.&lt;br /&gt;
* [[Client-side scripting]]: &amp;lt;code&amp;gt;!/usr/bin/env ot&amp;lt;/code&amp;gt; The entire (mostly) high and low level OT API is available within your scripts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Triple Signed Receipts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* All of this is accomplished in such a way that all parties are able to ''prove'', at all times, ''which transactions have cleared and which instruments are authorized'', '''without having to store their entire transaction history''', but instead by merely keeping the '''last signed receipt'''.&lt;br /&gt;
* Without the special mechanism that makes this possible, ''all parties would otherwise be forced to store all receipts forever''.&lt;br /&gt;
* Nyms and Asset Types have consistent IDs across all OT servers, since the ID is formed by hashing the relevant contract or public key.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Is Open-Transactions [[CENTRALIZED|centralized]]?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* No—quite the opposite. Open-Transactions is highly '''decentralized'''.&lt;br /&gt;
* Typical centralized servers have power over their users, but in OT, '''no server has power over the clients it serves''', because:&lt;br /&gt;
# An OT server does not control user transactions—it merely notarizes them.&lt;br /&gt;
# Anyone can operate an OT server, and users can go to any OT server to notarize transactions. Thus OT servers compete with each other to attract users to use their notary services.&lt;br /&gt;
# Anyone can download an OT client, and use it to execute transactions on any OT server, or any group of OT servers.&lt;br /&gt;
# OT uses triple-signed receipts, so transaction parties have independent cryptographic proof of transactions and balances.&lt;br /&gt;
# OT servers do not store user assets. Rather, cryptocurrencies are stored in voting pools so the server can't steal them.&lt;br /&gt;
&lt;br /&gt;
In every way, '''the user is in control, not the server'''—even when you're using servers you do not trust. These characteristics generate a '''federated''' network architecture—similar to the internet, and it has the same virtues as the internet—openness, decentralization, resilience, censorship-resistance, and user control.&lt;br /&gt;
&lt;br /&gt;
The community behind OT is strongly committed to developing systems that give users full control over their own assets and information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; max-width: 300px; margin: -20px 10px 0 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== White Paper ==&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf OT White Paper]&lt;br /&gt;
 &lt;br /&gt;
== Diagrams ==&lt;br /&gt;
&lt;br /&gt;
[[Voting_Pool_Deposit_Process|Voting Pools]]&lt;br /&gt;
&lt;br /&gt;
[http://i.imgur.com/HTyAJjg.png Architecture Overview (new)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/ot-diagram.jpg Architecture Overview (old)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg Financial Instruments]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Radio Interviews ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=teNzIFu5L70 &amp;quot;Trust No One&amp;quot; Miami Speech]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=234 AgoristRadio Interview, Part 1]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=246 AgoristRadio Interview, Part 2]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=vtJcUM5-TeA Interview with &amp;quot;Let's Talk Bitcoin&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=HSgpStCTw2g Interview with FutureMoneyTrends.com]&lt;br /&gt;
&lt;br /&gt;
== Video Walkthrough ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=5qtTayW-RyM Android demo video (Monetas)]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_SkRjaVliOXJITGM Desktop video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_MEk4ZDNtVGtRMHc Desktop video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_cTl3bXZpWnBBSVE iPhone video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1PBS_CyC2E_dS1hd3RYaENQQzg iPhone video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28141679 java testclient video 1]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28142096 java testclient video 2]&lt;br /&gt;
&lt;br /&gt;
[http://open-transactions.github.io/tv/ Official video archive (more videos)]&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Components and GNU Licensing]]&lt;br /&gt;
&lt;br /&gt;
[[Vulnerabilities|Potential vulnerabilities]] of Open-Transactions&lt;br /&gt;
&lt;br /&gt;
== Related Systems ==&lt;br /&gt;
&lt;br /&gt;
[http://bitcoin.org/ Bitcoin] - A censorship-resistant global ledger&lt;br /&gt;
&lt;br /&gt;
[[Monetas]] - Enterprise platform inspired by OT.&lt;br /&gt;
&lt;br /&gt;
[https://loom.cc/help Loom] - Asset issuance and transactions&lt;br /&gt;
&lt;br /&gt;
[http://www.csee.umbc.edu/~woodcock/cmsc482/proj1/magmoney.html Magic Money] - PGP-based Chaumian blinding (unlinkable cash)&lt;br /&gt;
&lt;br /&gt;
[http://opencoin.org/ OpenCoin.org] - REST-based blinded tokens&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransact.org/ OpenTransact] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://payswarm.com/ PaySwarm] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/publickeytransaction PKTP] - Public-Key Transaction Processor&lt;br /&gt;
&lt;br /&gt;
[http://wiki.dgcmagazine.com/index.php?title=Ricardo Ricardo] - Transaction system by Ian Grigg&lt;br /&gt;
&lt;br /&gt;
[https://ripple.com/ Ripple] - Consensus-based debt ledger&lt;br /&gt;
&lt;br /&gt;
[https://www.stellar.org/ Stellar] - Ripple-based&lt;br /&gt;
&lt;br /&gt;
[http://truledger.com/ Truledger] - Destruction of account history&lt;br /&gt;
&lt;br /&gt;
[http://www.voucher-safe.com/index.cfm Voucher-Safe] - Secure asset issuance with auditing&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
Article: [http://pelagic.wavyhill.xsmail.com/Private_Digital_Economy.html Toward a Private Digital Economy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both; padding-top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In More Detail... ==&lt;br /&gt;
&lt;br /&gt;
The server itself is a [[Transactions|transaction processor]] in the cypherpunk tradition. In more detail:&lt;br /&gt;
&lt;br /&gt;
* Many '''financial instruments''' are supported: Users can write '''cheques''', purchase '''cashier's cheques''' (&amp;amp;quot;vouchers&amp;amp;quot;), and withdraw in '''[[Sample Cash|unlinkable digital cash]]'''. The software uses Chaumian-style, blinded tokens courtesy of the [http://anoncvs.aldigital.co.uk/lucre/ Lucre] library by Ben Laurie.&lt;br /&gt;
* It's like '''PGP FOR MONEY'''. The idea is to have many cash algorithms, not just Lucre. I’d like to add Chaum’s version, Brands’ version, etc. So that, just like PGP, the software should support as many of the top algorithms as possible, and make it easy to swap them out when necessary.&lt;br /&gt;
* User accounts are '''pseudonymous'''. '''A user account is a public key'''. (This is like [http://pktp.co.cc/ PKTP] by Andrew McMeikan.) You can open as many user accounts as you want. ''Full anonymity'' is possible only for &amp;quot;cash-only&amp;quot; transactions (where users only perform token exchanges, and do not open accounts), whereas ''pseudonymity'' means that transactions can be linked to the key that signed them. (While the real life identity of the owner is hidden, continuity of reputation becomes possible.) ''See full-color diagrams linked above''.&lt;br /&gt;
* '''Any user can issue new digital currencies''' and digital asset types, by uploading the new [[Sample Currency Contract|currency contract]] to the server. (This functionality is comparable to [http://www.systemics.com/docs/sox/overview.html Ricardo] by [http://financialcryptography.com/ Ian Grigg].)&lt;br /&gt;
* '''Users can open asset accounts of any type.''' You can have as many as you want, associated with each user account. (See [http://loom.cc/ Loom] by Patrick Chkoreff.)&lt;br /&gt;
* [[Triple-Signed Receipts|Triple Signed Receipts / No Account History]]. On OT, entities are able to conduct transactions, verify instruments, ''and'' provably agree on current holdings via ''signed receipts'', all without the need to store any transaction history.'' An ''asset account'' on OT is not according to the traditional sense of the word (an account normally being thought of as, &amp;quot;a list of transactions, with a balance, used in double-entry bookkeeping.&amp;quot;) While the word &amp;quot;account&amp;quot; makes things easy to understand, an ''asset account'' on OT exists only in the mind of the account holder himself. He simply asks the server to agree with him that it exists, and to provide him with a signed receipt to that effect. In the user interface, OT is able to mimic the ''account metaphor'', making usage intuitive, even though ''no actual account exists, or need be stored on either side, other than the signed receipt itself!'' (See Bill St. Clair's excellent [http://truledger.com/ Truledger] for an [http://truledger.com/doc/plain-english.html example of this concept].)&lt;br /&gt;
* Open Transactions also features '''markets'''. Any two asset types can be traded against each other. The [[markets]] are full-featured and include '''limit orders, stop orders, fill-or-kill, day orders''' (date ranges), and '''stop limits'''.&lt;br /&gt;
* Open Transactions also supports '''basket currencies'''. Users can define their own, and the server handles the process of exchanging in and out of basket accounts. Baskets are treated by the software like any other asset type, (you can open accounts, transfer funds, withdraw cash, write cheques, and even '''trade basket currencies on markets'''.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc. This concept was originated by Nick Szabo: [http://szabo.best.vwh.net/contractlanguage.html smart contracts].&lt;br /&gt;
* [[Client-side scripting]]: The entire OT API is now available for use in OTscripts on the client side. Just remember to put this at the top of the file: &amp;lt;pre&amp;gt;#!/usr/local/bin/ot --script&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Open Transactions also supports '''payment plans'''. Users can sign contracts with each other, and the server will carry out the terms and implement the payment plan. (A future goal is to issue new asset types based on revenue from payment plans--so they can also be traded on markets.)&lt;br /&gt;
* '''Contracts''', in general, are very important to Open Transactions; they are the building block of the entire library. Open Transactions uses a Ricardian-style contract, and all the various instruments, data files, and messages resemble '''[[Sample Currency Contract | PGP-signed XML files]]'''. All objects serialize to a string.&lt;br /&gt;
* The philosophy of the software is based around '''separation of powers''' (issuers and transaction servers being separate entities) as well as the '''distribution of risk'''. For example, Asset accounts can be distributed across multiple servers, and asset types can be distributed across multiple issuers (via baskets.) Read about the [[Auditing]] protocol.&lt;br /&gt;
* Potential future instruments include: [http://www.goldstandardinstitute.net/2010/06/what-is-a-real-bill/ Real Bills], dividend-paying stocks (the same mechanism can be used as interest paying bonds) and collateralized debt obligations. (OT supports payment plans, so it would be easy to group tranches of OT's payment plans to pay into a single reserve account, as backing for a new stock offering that could be traded on OT markets.) This is similar to how basket currencies are implemented. Stocks/Bonds would pay shareholders by dropping a cheque into your stock account's inbox. These features aren't available yet, but they are easy to add given the existing OT infrastructure.&lt;br /&gt;
* '''All communications are secured with OpenSSL.''' All messages are also signed and encrypted. All transactions require signatures from relevant parties including the server.&lt;br /&gt;
* Open Transactions is '''open-source''', written in C++, object-oriented, and includes '''Native [[API]]s''' for '''Java, Ruby, Python, PHP, Perl, C, [http://www.digitalmars.com/d/2.0/overview.html D], C++, Objective-C, C#, Tcl, and LISP.''' (Also supporting JRuby, Jython, Scala, Clojure, Groovy, and any other language that works on the JVM.)&lt;br /&gt;
* The software is fully '''cross-platform''': '''Linux, Mac OS X, FreeBSD, Android, and Windows''' are supported with makefiles, project files, and instructions.&lt;br /&gt;
* STORAGE... The library itself is '''storage neutral''', and could be utilized across a variety of different storage systems. All objects serialize to a string, and it is very easy to add support for new storage methods. (Currently OT uses the filesystem with key/value pairs.) '''Adding a new storage method is as easy as subclassing OTDB::Storage and overriding a few methods. Use any DB you want.'''&lt;br /&gt;
* [[Messaging]]... The library itself is '''transfer-protocol neutral''', and can be utilized across a variety of different transfer protocols. The default implementation uses the [http://zeromq.org/ ZeroMQ library] for transport. Transport is implemented as a callback function, so it's very easy (a few dozen lines of code) to swap in some other system, if you wish.&lt;br /&gt;
* OT currently supports '''MsgPack''' and '''protobuf''' for data packing, though new packers can be added by subclassing OTDB::Packer.&lt;br /&gt;
&lt;br /&gt;
The intention is for this software to be integrated as many places as possible... Games, digital cash wallets, distributed data stores, secure voip apps, anonymous bit torrent networks, mixnets, remailers, nym servers, etc. There are many other potential uses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=About&amp;diff=3197</id>
		<title>About</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=About&amp;diff=3197"/>
		<updated>2015-08-01T18:12:00Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: /* Related Systems */ changed link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;plainlinks&amp;quot;&amp;gt;&lt;br /&gt;
{| id=&amp;quot;mp-topbanner&amp;quot; style=&amp;quot;width:100%; background:#f6f6f6; margin-top:1.2em; border:1px solid #ddd;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:61%; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;!--        &amp;quot;Welcome to Open-Transactions&amp;quot;        --&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:100%; border:none; background:none;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; white-space:nowrap; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:162%; border:none; margin:0; padding:.1em; color:#000;&amp;quot;&amp;gt;About the Open-Transactions project.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em; font-size:95%;&amp;quot;&amp;gt;Financial cryptography software.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;articlecount&amp;quot; style=&amp;quot;width:100%; text-align:center; font-size:85%;&amp;quot;&amp;gt;[[Special:Statistics|{{NUMBEROFARTICLES}}]] [[Special:Allpages|articles]].&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; max-width: 550px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What is Open-Transactions?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions is an [[Use Cases|easy-to-use]], financial crypto, [[Sample Cash|digital cash]] and transaction [[List of Classes|library]].&lt;br /&gt;
* Open-Transactions is open-source.&lt;br /&gt;
* Open-Transactions includes a [[API|client API]], a working [[Otserver|server]], a cross-platform [https://github.com/Open-Transactions/Moneychanger GUI] and a [[opentxs|command-line]] wallet utility.&lt;br /&gt;
* Open-Transactions features: a large variety of financial instruments, markets, basket currencies, unforgeable account balances, digital cash, destruction of account history, [http://iang.org/papers/ricardian_contract.html Ricardian contracts], Smart Contracts (scriptable clauses), and more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What does it do?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions allows users to issue and manipulate digital assets.&lt;br /&gt;
* Any issuer can sign and distribute new [[Sample Currency Contract|currency contracts]] in order to create new digital asset types.&lt;br /&gt;
* Users may create many ''pseudonyms'' (public keys), each of which may own ''asset accounts'' of various types, on OT servers.&lt;br /&gt;
* Users can operate '''&amp;amp;quot;cash-only&amp;amp;quot;''' for maximum anonymity, using '''[[Sample Cash|untraceable digital cash]]'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Financial Instruments'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Users can transfer digital assets ''securely and provably'', with [[Triple-Signed Receipts|receipts]] signed by all parties.&lt;br /&gt;
* '''Even an OT server cannot change balances, or forge transactions--since it cannot forge your signature on your receipt.'''&lt;br /&gt;
* Open-Transactions supports a range of '''[[Instruments|financial instruments]]''' such as account transfer, '''[[Sample-Cheque|cheques]]''' and vouchers (aka &amp;amp;quot;cashier's cheques&amp;amp;quot; or &amp;amp;quot;banker's cheques&amp;amp;quot;), in addition to cash.&lt;br /&gt;
* These instruments are all analogous to the same financial instruments that we all use at normal banks today. Everyone already has an intuitive understanding of these financial instruments, because we use them regularly in our normal daily lives.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Markets, Basket Currencies, and Smart Contracts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Open-Transactions also implements higher-level, '''contract-based transactions''' such as '''payment plans''' and '''markets with trades'''.&lt;br /&gt;
* The [[Markets|markets]] on Open-Transactions support ''market orders, limit orders, fill-or-kill orders, day orders, stop orders, and stop limits'', just like trading on a real market.&lt;br /&gt;
* '''Basket currencies''' are also supported, as well as payment plans (recurring payments.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc.&lt;br /&gt;
* [[Client-side scripting]]: &amp;lt;code&amp;gt;!/usr/bin/env ot&amp;lt;/code&amp;gt; The entire (mostly) high and low level OT API is available within your scripts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Triple Signed Receipts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* All of this is accomplished in such a way that all parties are able to ''prove'', at all times, ''which transactions have cleared and which instruments are authorized'', '''without having to store their entire transaction history''', but instead by merely keeping the '''last signed receipt'''.&lt;br /&gt;
* Without the special mechanism that makes this possible, ''all parties would otherwise be forced to store all receipts forever''.&lt;br /&gt;
* Nyms and Asset Types have consistent IDs across all OT servers, since the ID is formed by hashing the relevant contract or public key.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Is Open-Transactions [[CENTRALIZED|centralized]]?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* No—quite the opposite. Open-Transactions is highly '''decentralized'''.&lt;br /&gt;
* Typical centralized servers have power over their users, but in OT, '''no server has power over the clients it serves''', because:&lt;br /&gt;
# An OT server does not control user transactions—it merely notarizes them.&lt;br /&gt;
# Anyone can operate an OT server, and users can go to any OT server to notarize transactions. Thus OT servers compete with each other to attract users to use their notary services.&lt;br /&gt;
# Anyone can download an OT client, and use it to execute transactions on any OT server, or any group of OT servers.&lt;br /&gt;
# OT uses triple-signed receipts, so transaction parties have independent cryptographic proof of transactions and balances.&lt;br /&gt;
# OT servers do not store user assets. Rather, cryptocurrencies are stored in voting pools so the server can't steal them.&lt;br /&gt;
&lt;br /&gt;
In every way, '''the user is in control, not the server'''—even when you're using servers you do not trust. These characteristics generate a '''federated''' network architecture—similar to the internet, and it has the same virtues as the internet—openness, decentralization, resilience, censorship-resistance, and user control.&lt;br /&gt;
&lt;br /&gt;
The community behind OT is strongly committed to developing systems that give users full control over their own assets and information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; max-width: 300px; margin: -20px 10px 0 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== White Paper ==&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf OT White Paper]&lt;br /&gt;
 &lt;br /&gt;
== Diagrams ==&lt;br /&gt;
&lt;br /&gt;
[[Voting_Pool_Deposit_Process|Voting Pools]]&lt;br /&gt;
&lt;br /&gt;
[http://i.imgur.com/HTyAJjg.png Architecture Overview (new)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/ot-diagram.jpg Architecture Overview (old)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg Financial Instruments]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Radio Interviews ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=teNzIFu5L70 &amp;quot;Trust No One&amp;quot; Miami Speech]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=234 AgoristRadio Interview, Part 1]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=246 AgoristRadio Interview, Part 2]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=vtJcUM5-TeA Interview with &amp;quot;Let's Talk Bitcoin&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=HSgpStCTw2g Interview with FutureMoneyTrends.com]&lt;br /&gt;
&lt;br /&gt;
== Video Walkthrough ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=5qtTayW-RyM Android demo video (Monetas)]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/Ea6rzq Desktop video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/i0J3AF Desktop video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/8Dxak1 iPhone video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/u6xqHc iPhone video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28141679 java testclient video 1]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28142096 java testclient video 2]&lt;br /&gt;
&lt;br /&gt;
[http://open-transactions.github.io/tv/ Official video archive (more videos)]&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Components and GNU Licensing]]&lt;br /&gt;
&lt;br /&gt;
[[Vulnerabilities|Potential vulnerabilities]] of Open-Transactions&lt;br /&gt;
&lt;br /&gt;
== Related Systems ==&lt;br /&gt;
&lt;br /&gt;
[http://bitcoin.org/ Bitcoin] - A censorship-resistant global ledger&lt;br /&gt;
&lt;br /&gt;
[[Monetas]] - Enterprise platform inspired by OT.&lt;br /&gt;
&lt;br /&gt;
[https://loom.cc/help Loom] - Asset issuance and transactions&lt;br /&gt;
&lt;br /&gt;
[http://www.csee.umbc.edu/~woodcock/cmsc482/proj1/magmoney.html Magic Money] - PGP-based Chaumian blinding (unlinkable cash)&lt;br /&gt;
&lt;br /&gt;
[http://opencoin.org/ OpenCoin.org] - REST-based blinded tokens&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransact.org/ OpenTransact] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://payswarm.com/ PaySwarm] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/publickeytransaction PKTP] - Public-Key Transaction Processor&lt;br /&gt;
&lt;br /&gt;
[http://wiki.dgcmagazine.com/index.php?title=Ricardo Ricardo] - Transaction system by Ian Grigg&lt;br /&gt;
&lt;br /&gt;
[https://ripple.com/ Ripple] - Consensus-based debt ledger&lt;br /&gt;
&lt;br /&gt;
[https://www.stellar.org/ Stellar] - Ripple-based&lt;br /&gt;
&lt;br /&gt;
[http://truledger.com/ Truledger] - Destruction of account history&lt;br /&gt;
&lt;br /&gt;
[http://www.voucher-safe.com/index.cfm Voucher-Safe] - Secure asset issuance with auditing&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
Article: [http://pelagic.wavyhill.xsmail.com/Private_Digital_Economy.html Toward a Private Digital Economy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both; padding-top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In More Detail... ==&lt;br /&gt;
&lt;br /&gt;
The server itself is a [[Transactions|transaction processor]] in the cypherpunk tradition. In more detail:&lt;br /&gt;
&lt;br /&gt;
* Many '''financial instruments''' are supported: Users can write '''cheques''', purchase '''cashier's cheques''' (&amp;amp;quot;vouchers&amp;amp;quot;), and withdraw in '''[[Sample Cash|unlinkable digital cash]]'''. The software uses Chaumian-style, blinded tokens courtesy of the [http://anoncvs.aldigital.co.uk/lucre/ Lucre] library by Ben Laurie.&lt;br /&gt;
* It's like '''PGP FOR MONEY'''. The idea is to have many cash algorithms, not just Lucre. I’d like to add Chaum’s version, Brands’ version, etc. So that, just like PGP, the software should support as many of the top algorithms as possible, and make it easy to swap them out when necessary.&lt;br /&gt;
* User accounts are '''pseudonymous'''. '''A user account is a public key'''. (This is like [http://pktp.co.cc/ PKTP] by Andrew McMeikan.) You can open as many user accounts as you want. ''Full anonymity'' is possible only for &amp;quot;cash-only&amp;quot; transactions (where users only perform token exchanges, and do not open accounts), whereas ''pseudonymity'' means that transactions can be linked to the key that signed them. (While the real life identity of the owner is hidden, continuity of reputation becomes possible.) ''See full-color diagrams linked above''.&lt;br /&gt;
* '''Any user can issue new digital currencies''' and digital asset types, by uploading the new [[Sample Currency Contract|currency contract]] to the server. (This functionality is comparable to [http://www.systemics.com/docs/sox/overview.html Ricardo] by [http://financialcryptography.com/ Ian Grigg].)&lt;br /&gt;
* '''Users can open asset accounts of any type.''' You can have as many as you want, associated with each user account. (See [http://loom.cc/ Loom] by Patrick Chkoreff.)&lt;br /&gt;
* [[Triple-Signed Receipts|Triple Signed Receipts / No Account History]]. On OT, entities are able to conduct transactions, verify instruments, ''and'' provably agree on current holdings via ''signed receipts'', all without the need to store any transaction history.'' An ''asset account'' on OT is not according to the traditional sense of the word (an account normally being thought of as, &amp;quot;a list of transactions, with a balance, used in double-entry bookkeeping.&amp;quot;) While the word &amp;quot;account&amp;quot; makes things easy to understand, an ''asset account'' on OT exists only in the mind of the account holder himself. He simply asks the server to agree with him that it exists, and to provide him with a signed receipt to that effect. In the user interface, OT is able to mimic the ''account metaphor'', making usage intuitive, even though ''no actual account exists, or need be stored on either side, other than the signed receipt itself!'' (See Bill St. Clair's excellent [http://truledger.com/ Truledger] for an [http://truledger.com/doc/plain-english.html example of this concept].)&lt;br /&gt;
* Open Transactions also features '''markets'''. Any two asset types can be traded against each other. The [[markets]] are full-featured and include '''limit orders, stop orders, fill-or-kill, day orders''' (date ranges), and '''stop limits'''.&lt;br /&gt;
* Open Transactions also supports '''basket currencies'''. Users can define their own, and the server handles the process of exchanging in and out of basket accounts. Baskets are treated by the software like any other asset type, (you can open accounts, transfer funds, withdraw cash, write cheques, and even '''trade basket currencies on markets'''.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc. This concept was originated by Nick Szabo: [http://szabo.best.vwh.net/contractlanguage.html smart contracts].&lt;br /&gt;
* [[Client-side scripting]]: The entire OT API is now available for use in OTscripts on the client side. Just remember to put this at the top of the file: &amp;lt;pre&amp;gt;#!/usr/local/bin/ot --script&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Open Transactions also supports '''payment plans'''. Users can sign contracts with each other, and the server will carry out the terms and implement the payment plan. (A future goal is to issue new asset types based on revenue from payment plans--so they can also be traded on markets.)&lt;br /&gt;
* '''Contracts''', in general, are very important to Open Transactions; they are the building block of the entire library. Open Transactions uses a Ricardian-style contract, and all the various instruments, data files, and messages resemble '''[[Sample Currency Contract | PGP-signed XML files]]'''. All objects serialize to a string.&lt;br /&gt;
* The philosophy of the software is based around '''separation of powers''' (issuers and transaction servers being separate entities) as well as the '''distribution of risk'''. For example, Asset accounts can be distributed across multiple servers, and asset types can be distributed across multiple issuers (via baskets.) Read about the [[Auditing]] protocol.&lt;br /&gt;
* Potential future instruments include: [http://www.goldstandardinstitute.net/2010/06/what-is-a-real-bill/ Real Bills], dividend-paying stocks (the same mechanism can be used as interest paying bonds) and collateralized debt obligations. (OT supports payment plans, so it would be easy to group tranches of OT's payment plans to pay into a single reserve account, as backing for a new stock offering that could be traded on OT markets.) This is similar to how basket currencies are implemented. Stocks/Bonds would pay shareholders by dropping a cheque into your stock account's inbox. These features aren't available yet, but they are easy to add given the existing OT infrastructure.&lt;br /&gt;
* '''All communications are secured with OpenSSL.''' All messages are also signed and encrypted. All transactions require signatures from relevant parties including the server.&lt;br /&gt;
* Open Transactions is '''open-source''', written in C++, object-oriented, and includes '''Native [[API]]s''' for '''Java, Ruby, Python, PHP, Perl, C, [http://www.digitalmars.com/d/2.0/overview.html D], C++, Objective-C, C#, Tcl, and LISP.''' (Also supporting JRuby, Jython, Scala, Clojure, Groovy, and any other language that works on the JVM.)&lt;br /&gt;
* The software is fully '''cross-platform''': '''Linux, Mac OS X, FreeBSD, Android, and Windows''' are supported with makefiles, project files, and instructions.&lt;br /&gt;
* STORAGE... The library itself is '''storage neutral''', and could be utilized across a variety of different storage systems. All objects serialize to a string, and it is very easy to add support for new storage methods. (Currently OT uses the filesystem with key/value pairs.) '''Adding a new storage method is as easy as subclassing OTDB::Storage and overriding a few methods. Use any DB you want.'''&lt;br /&gt;
* [[Messaging]]... The library itself is '''transfer-protocol neutral''', and can be utilized across a variety of different transfer protocols. The default implementation uses the [http://zeromq.org/ ZeroMQ library] for transport. Transport is implemented as a callback function, so it's very easy (a few dozen lines of code) to swap in some other system, if you wish.&lt;br /&gt;
* OT currently supports '''MsgPack''' and '''protobuf''' for data packing, though new packers can be added by subclassing OTDB::Packer.&lt;br /&gt;
&lt;br /&gt;
The intention is for this software to be integrated as many places as possible... Games, digital cash wallets, distributed data stores, secure voip apps, anonymous bit torrent networks, mixnets, remailers, nym servers, etc. There are many other potential uses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Sample-Cheque&amp;diff=3196</id>
		<title>Sample-Cheque</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Sample-Cheque&amp;diff=3196"/>
		<updated>2015-07-13T15:04:07Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: fixed unlinkable&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The inclusion of the transaction number onto the cheque was what made it possible to prevent double-spending of cheques (without having to use any other sort of &amp;amp;quot;Cheque ID&amp;amp;quot; or &amp;amp;quot;spent cheque database&amp;amp;quot;.) But the user can request transaction numbers from the server ahead of time, and usually has a few of them sitting in his wallet. That way, he can write a cheque anytime he wants, offline and without any server contact, and the recipient can present it to the bank for payment at his leisure. Later if the recipient tries to present the cheque again, the bank sees that the same transaction number is no longer available on the payer's account (it got used the last time the cheque was presented), so it refuses the cheque.&lt;br /&gt;
&lt;br /&gt;
I find cheques very interesting because you get a built-in receipt, and the money doesn't leave your account unless and until it is actually deposited or cashed. Cheques can even bounce, just like real cheques. Also: If the recipient never cashes your cheque, and it expires, then the money stays in your account. Whereas with [[Sample Cash|cash]], you have to remove it from your account before you can send it anywhere. And though cash is untraceable, the money is also lost if the recipient never deposits it. (Expired cash tokens revert to the server--the user is anonymous!) '''But with a cheque, you would keep that money...'''&lt;br /&gt;
&lt;br /&gt;
All of the financial instruments have different properties... I invite you to check out the chart on the [[Instruments]] page and see for yourself.&lt;br /&gt;
&lt;br /&gt;
SAMPLE CHEQUE:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-----BEGIN SIGNED CHEQUE-----&lt;br /&gt;
Hash: SAMY&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;?xml version=&amp;amp;quot;1.0&amp;amp;quot;?&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;cheque&lt;br /&gt;
 version=&amp;amp;quot;1.0&amp;amp;quot;&lt;br /&gt;
 amount=&amp;amp;quot;72&amp;amp;quot;&lt;br /&gt;
 assetTypeID=&amp;amp;quot;XUHBvdsWAEmErZMzHaRKaNPaAVsUvKwL4uLY4nOY2s4&amp;amp;quot;&lt;br /&gt;
 transactionNum=&amp;amp;quot;343&amp;amp;quot;&lt;br /&gt;
 serverID=&amp;amp;quot;44FmyPAgrmGu671RywGnhrt8aR6tzmNFn9WKQ92BXn&amp;amp;quot;&lt;br /&gt;
 senderAcctID=&amp;amp;quot;PhmhKernutijMa2XXxH1dZnTluIDQUVn1tifSOq9H4x&amp;amp;quot;&lt;br /&gt;
 senderUserID=&amp;amp;quot;Bg2QrSTomOEU5ICfvhfYfBYxQZPktDSnaVPpMLYxUnz&amp;amp;quot;&lt;br /&gt;
 hasRecipient=&amp;amp;quot;true&amp;amp;quot;&lt;br /&gt;
 recipientUserID=&amp;amp;quot;Bg2QrSTomOEU5ICfvhfYfBYxQZPktDSnaVPpMLYxUnz&amp;amp;quot;&lt;br /&gt;
 validFrom=&amp;amp;quot;1281783321&amp;amp;quot;&lt;br /&gt;
 validTo=&amp;amp;quot;1281783921&amp;amp;quot; &amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;memo&amp;amp;gt;&lt;br /&gt;
eJzzSC1KVShPVUjPV0hMT8zMU2QAADncBbg=&lt;br /&gt;
&amp;amp;lt;/memo&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;/cheque&amp;amp;gt;&lt;br /&gt;
-----BEGIN CHEQUE SIGNATURE-----&lt;br /&gt;
DYPJjCc9LIpz/9B8aBPDrVsJBtvjt+737rWiMDDVYAhcnvb+PAuI4K3sM49W/WYJ&lt;br /&gt;
DKVKA9bawxd4w7KWlmibYM5X8nYr40s+H+6dyvD5C1mXAg1jjlm+XWl/JtvVxP2w&lt;br /&gt;
/DCmXPXgukYppTSkgHIrYn7E/Ong3nh62fGDwU+Aqfw=&lt;br /&gt;
-----END CHEQUE SIGNATURE-----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''INVOICES''' An invoice is actually just a cheque with a negative amount. When a creditor hands you an invoice, it's your choice whether to present it at the bank and run it through one of your accounts. (To pay it.) If you do, then the funds are transferred and a receipt is dropped into your inbox.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;'''VOUCHERS''' A voucher is also a cheque, but it's drawn on a server account instead of a personal account. It's like a cashier's cheque. You withdraw funds from your account, but instead of giving you cash, the money is transferred to one of the bank's accounts, and then you are issued a cheque drawn against that account.&lt;br /&gt;
&lt;br /&gt;
Vouchers have slightly different properties than cheques. They are more trusted, because they never bounce. (Often, if you bounce a cheque, a creditor will demand a cashier's cheque to settle payments in the future. Why? Because they are more trusted...) A voucher allows you to &amp;amp;quot;pay by cheque&amp;amp;quot; while at the same time, pulling the money out of your account immediately into a trusted form. Vouchers have the same receipt properties as any other cheque. See the chart on the [[Instruments]] page for more details.&lt;br /&gt;
&lt;br /&gt;
SAMPLE VOUCHER:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-----BEGIN SIGNED VOUCHER-----&lt;br /&gt;
Hash: SAMY&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;?xml version=&amp;amp;quot;1.0&amp;amp;quot;?&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;cheque&lt;br /&gt;
 version=&amp;amp;quot;1.0&amp;amp;quot;&lt;br /&gt;
 amount=&amp;amp;quot;73&amp;amp;quot;&lt;br /&gt;
 assetTypeID=&amp;amp;quot;XUHBvdsWAEmErZMzHaRKaNPaAVsUvKwL4uLY4nOY2s4&amp;amp;quot;&lt;br /&gt;
 transactionNum=&amp;amp;quot;417&amp;amp;quot;&lt;br /&gt;
 serverID=&amp;amp;quot;44FmyPAgrmGu671RywGnhrt8aR6tzmNFn9WKQ92BXn&amp;amp;quot;&lt;br /&gt;
 senderAcctID=&amp;amp;quot;khlj2LLL9EYxPimNR4yAYDDzO5QzSg7LSxxsGc1RpsP&amp;amp;quot;&lt;br /&gt;
 senderUserID=&amp;amp;quot;LG4bi40PAw6vlkU5TXiphXqmEELf3k1gjMsKQVjw7SE&amp;amp;quot;&lt;br /&gt;
 hasRecipient=&amp;amp;quot;false&amp;amp;quot;&lt;br /&gt;
 recipientUserID=&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
 validFrom=&amp;amp;quot;1281868590&amp;amp;quot;&lt;br /&gt;
 validTo=&amp;amp;quot;1297420590&amp;amp;quot; &amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;memo&amp;amp;gt;&lt;br /&gt;
eJwLzyzJSClKLFcIyy9NzkgtslJQ4HIqrczMS1dIVCiDiOkoFGfkl+akKJTnF2Ur&lt;br /&gt;
MgAA18ERtQ==&lt;br /&gt;
&amp;amp;lt;/memo&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;/cheque&amp;amp;gt;&lt;br /&gt;
-----BEGIN VOUCHER SIGNATURE-----&lt;br /&gt;
HNufQ742X0pMwu5rQwtHQVXeQ0rJ9fu2ZirZ0rdTy9RXhSTWQY4YNR6F8YWScIfZ&lt;br /&gt;
/dv+mW8LNg5eUCBmSiDEN0jLLImEnVY2wpVtqAxMGGbXxHxU9yI7RbsvSBxQHKTd&lt;br /&gt;
tok7Sqn2syMlnAufszo+ScRXuvPWC8K51KgPxXTvBJI=&lt;br /&gt;
-----END VOUCHER SIGNATURE-----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Main_Page&amp;diff=3195</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Main_Page&amp;diff=3195"/>
		<updated>2015-07-09T17:44:29Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: added link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Open-Transactions==&lt;br /&gt;
&lt;br /&gt;
'''[http://www.opentransactions.org/open-transactions.pdf Click here for white paper.]'''&lt;br /&gt;
&lt;br /&gt;
The Open-Transactions project is a collaborative effort to develop a robust, commercial-grade, fully-featured, '''free-software toolkit''' implementing the [[OTX|OTX protocol]] as well as a full-strength '''financial cryptography''' [[List_of_Classes|library]], API, GUI, command-line interface, and prototype notary server. The project is managed by a worldwide community of volunteers that use the Internet to communicate, plan, and develop the Open-Transactions toolkit and its related documentation.&lt;br /&gt;
&lt;br /&gt;
===Financial Cryptography===&lt;br /&gt;
&lt;br /&gt;
Financial cryptography means using using strong cryptographic techniques to create secure financial instruments, such as digital signing to create non-repudiable contracts, and encryption to create untraceable digital cash. In OT, transactions are unforgeable, receipts are destructible, and balances cannot be falsified or changed without user consent. OT is able to prove all balances, as well as which instruments are valid, and which transactions have closed, without storing any history except the last signed receipt.&lt;br /&gt;
&lt;br /&gt;
Open-Transactions implements financial instruments as Ricardian Contracts; contracts which can be understood both by humans and manipulated by software. &lt;br /&gt;
&lt;br /&gt;
All contracts in Open-Transactions use the same basic structure: all parties involved sign an agreement which is notarized by an independent third party witness. This technique is known as [[Triple-Signed Receipts]]. Importantly, transactions are formed and signed on the client side first, before being notarized by any server. An OT client is thus ensured that an OT notary server cannot falsify his receipts against his will, since the server can't forge the client's signature.&lt;br /&gt;
&lt;br /&gt;
This basic structure can be built upon to create many types of financial instruments.&lt;br /&gt;
&lt;br /&gt;
===Financial Instruments===&lt;br /&gt;
&lt;br /&gt;
Financial instruments are any representation of a financial agreement between two or more parties.&lt;br /&gt;
&lt;br /&gt;
The simplest financial instrument is a deposit agreement. A custodian of some asset (legal tender, or maybe gold) stores it on behalf of a depositor and agrees to redeem it on demand when presented with proof of a valid claim on the asset.&lt;br /&gt;
&lt;br /&gt;
Other types of financial instruments include securities, of which there can be many variations. A security is an instrument that entitles the bearer to a certain revenue stream, either because it represents a loan or perhaps because it represents equity in a business.&lt;br /&gt;
&lt;br /&gt;
Financial instruments in Open-Transactions have an issuer, who creates the contracts and is responsible for fulfilling the terms, and one or more bearers. Financial instruments are liabilities of the issuer owed to the bearers.&lt;br /&gt;
&lt;br /&gt;
===Working with Financial Instruments===&lt;br /&gt;
&lt;br /&gt;
Open-Transactions is designed to provide the highest security possible for both the issuers and bearers of financial instruments. Servers in Open-Transactions act as notaries which can witness and confirm balances, but cannot change them. Every party associated in a financial instrument can prove their balance to any other party, and no party can alter the balance of any other party without their agreement. Even a malicious notary cannot do this.&lt;br /&gt;
&lt;br /&gt;
Open-Transactions represents quantities of a given unit type as deposit agreements, which are signed by the bearer and a notary.&lt;br /&gt;
&lt;br /&gt;
Portions of a balance may be transferred between users via several asset-independent transaction types, including:&lt;br /&gt;
&lt;br /&gt;
; Transfers&lt;br /&gt;
: An atomic movement of funds from one account to a different account, like a bank account-to-account transfer.&lt;br /&gt;
; Cheques&lt;br /&gt;
: A payment which is not deducted from the sender's account until the recipient claims it.&lt;br /&gt;
; Vouchers&lt;br /&gt;
: A payment which is deducted from the senders account at the time of creation.&lt;br /&gt;
; Invoices&lt;br /&gt;
: A payment request which the recipient can opt to pay from any of his accounts.&lt;br /&gt;
; Cash&lt;br /&gt;
: Anonymous cryptographic tokens which can be securely redeemed by the recipient without revealing the sender.&lt;br /&gt;
; Market offers&lt;br /&gt;
: Open agreements to exchange a given quantity of one instrument type for a given quantity of another instrument type.&lt;br /&gt;
; Smart Contracts&lt;br /&gt;
: Customizable agreements between multiple parties, containing user-defined scripted clauses, hooks, and variables.&lt;br /&gt;
&lt;br /&gt;
==Use Cases==&lt;br /&gt;
&lt;br /&gt;
===Encouraged use cases===&lt;br /&gt;
&lt;br /&gt;
Encouraged uses cases are officially supported by Open-Transactions.&lt;br /&gt;
&lt;br /&gt;
====Deposit accounting====&lt;br /&gt;
&lt;br /&gt;
Entities that hold assets on behalf of depositors can use Open-Transactions to issue promissory notes as negotiable instruments.&lt;br /&gt;
&lt;br /&gt;
Examples of such depositories includes:&lt;br /&gt;
&lt;br /&gt;
* Precious metals&lt;br /&gt;
* Central bank currencies&lt;br /&gt;
* Cryptocurrencies&lt;br /&gt;
&lt;br /&gt;
====Payments====&lt;br /&gt;
&lt;br /&gt;
Users of OT negotiable instruments can authorize recurring payments to pay for services which operate on a billing cycle.&lt;br /&gt;
&lt;br /&gt;
====Bearer Securities====&lt;br /&gt;
&lt;br /&gt;
The negotiable instruments created by Open-Transactions can be used as the basis for financial products such as loans.&lt;br /&gt;
&lt;br /&gt;
===Discouraged use cases===&lt;br /&gt;
&lt;br /&gt;
Discouraged use cases are not supported by Open-Transactions, either because they violate the security requirements, or because they conflict with the philosophical goals of the project.&lt;br /&gt;
&lt;br /&gt;
In many cases, discouraged use cases may be achievable, but users are required to create and support their own smart contracts.&lt;br /&gt;
&lt;br /&gt;
====Third party balance editing====&lt;br /&gt;
&lt;br /&gt;
The only entity in Open-Transactions that can edit a balance is the holder of that balance receipt. Open-Transactions does not and will not include any functionality to bypass this design decision.&lt;br /&gt;
&lt;br /&gt;
------------------&lt;br /&gt;
&lt;br /&gt;
=== More Information ===&lt;br /&gt;
&lt;br /&gt;
[http://opentransactions.org/wiki/index.php/About About Open-Transactions]&lt;br /&gt;
&lt;br /&gt;
This product includes software developed by Ben Laurie for use in the [https://github.com/benlaurie/lucre Lucre] project.&lt;br /&gt;
&lt;br /&gt;
Credit for the OT logo goes to: [http://www.michpalmer.com/ moltenmich]&lt;br /&gt;
&lt;br /&gt;
=== Mailing list and IRC ===&lt;br /&gt;
&lt;br /&gt;
Mailing list: ot-dev@opentransactions.org&lt;br /&gt;
&lt;br /&gt;
[http://opentransactions.org/mailman/listinfo/ot-dev_opentransactions.org Subscribe to mailing list]&lt;br /&gt;
&lt;br /&gt;
IRC channel: '''#opentransactions''' on irc.freenode.net&lt;br /&gt;
&lt;br /&gt;
=== Sponsors and Contributors ===&lt;br /&gt;
&lt;br /&gt;
The OT community gratefully acknowledges the support and contributions of the following individuals and businesses to OT development: Chris Odom, Cameron Garnham, Randy Waterhouse, [[Monetas]].&lt;br /&gt;
&lt;br /&gt;
=== Install Programs ===&lt;br /&gt;
&lt;br /&gt;
[http://nightowl.cc/Moneychanger.dmg Mac OSX install for Moneychanger GUI] Self-contained.&lt;br /&gt;
&amp;lt;br /&amp;gt;Note: This Mac install of Moneychanger includes the notary server as well.&amp;lt;br /&amp;gt;It can be found at: /Applications/moneychanger-qt.app/Contents/MacOS/opentxs-notary&lt;br /&gt;
&lt;br /&gt;
[https://bitcointalk.org/index.php?topic=77301.msg859040#msg859040 (old) Windows binary installer ]&lt;br /&gt;
&lt;br /&gt;
=== White Paper ===&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf Open-Transactions White Paper]&lt;br /&gt;
&lt;br /&gt;
=== Source Code ===&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/opentxs Open-Transactions source code on github] (core library, client API, and 'opentxs' command-line client)&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/opentxs-notary Notary server source code on github] (Install OT core first)&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/Moneychanger Moneychanger GUI source code on github] (Install OT core first, and then build Moneychanger with the latest version of Qt Creator)&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Main_Page&amp;diff=3194</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Main_Page&amp;diff=3194"/>
		<updated>2015-07-09T05:02:36Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: /* Source Code */ wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Open-Transactions==&lt;br /&gt;
&lt;br /&gt;
'''[http://www.opentransactions.org/open-transactions.pdf Click here for white paper.]'''&lt;br /&gt;
&lt;br /&gt;
The Open-Transactions project is a collaborative effort to develop a robust, commercial-grade, fully-featured, '''free-software toolkit''' implementing the [[OTX|OTX protocol]] as well as a full-strength '''financial cryptography''' [[List_of_Classes|library]], API, GUI, command-line interface, and prototype notary server. The project is managed by a worldwide community of volunteers that use the Internet to communicate, plan, and develop the Open-Transactions toolkit and its related documentation.&lt;br /&gt;
&lt;br /&gt;
===Financial Cryptography===&lt;br /&gt;
&lt;br /&gt;
Financial cryptography means using using strong cryptographic techniques to create secure financial instruments, such as digital signing to create non-repudiable contracts, and encryption to create untraceable digital cash. In OT, transactions are unforgeable, receipts are destructible, and balances cannot be falsified or changed without user consent. OT is able to prove all balances, as well as which instruments are valid, and which transactions have closed, without storing any history except the last signed receipt.&lt;br /&gt;
&lt;br /&gt;
Open-Transactions implements financial instruments as Ricardian Contracts; contracts which can be understood both by humans and manipulated by software. &lt;br /&gt;
&lt;br /&gt;
All contracts in Open-Transactions use the same basic structure: all parties involved sign an agreement which is notarized by an independent third party witness. This technique is known as [[Triple-Signed Receipts]]. Importantly, transactions are formed and signed on the client side first, before being notarized by any server. An OT client is thus ensured that an OT notary server cannot falsify his receipts against his will, since the server can't forge the client's signature.&lt;br /&gt;
&lt;br /&gt;
This basic structure can be built upon to create many types of financial instruments.&lt;br /&gt;
&lt;br /&gt;
===Financial Instruments===&lt;br /&gt;
&lt;br /&gt;
Financial instruments are any representation of a financial agreement between two or more parties.&lt;br /&gt;
&lt;br /&gt;
The simplest financial instrument is a deposit agreement. A custodian of some asset (legal tender, or maybe gold) stores it on behalf of a depositor and agrees to redeem it on demand when presented with proof of a valid claim on the asset.&lt;br /&gt;
&lt;br /&gt;
Other types of financial instruments include securities, of which there can be many variations. A security is an instrument that entitles the bearer to a certain revenue stream, either because it represents a loan or perhaps because it represents equity in a business.&lt;br /&gt;
&lt;br /&gt;
Financial instruments in Open-Transactions have an issuer, who creates the contracts and is responsible for fulfilling the terms, and one or more bearers. Financial instruments are liabilities of the issuer owed to the bearers.&lt;br /&gt;
&lt;br /&gt;
===Working with Financial Instruments===&lt;br /&gt;
&lt;br /&gt;
Open-Transactions is designed to provide the highest security possible for both the issuers and bearers of financial instruments. Servers in Open-Transactions act as notaries which can witness and confirm balances, but cannot change them. Every party associated in a financial instrument can prove their balance to any other party, and no party can alter the balance of any other party without their agreement. Even a malicious notary cannot do this.&lt;br /&gt;
&lt;br /&gt;
Open-Transactions represents quantities of a given unit type as deposit agreements, which are signed by the bearer and a notary.&lt;br /&gt;
&lt;br /&gt;
Portions of a balance may be transferred between users via several asset-independent transaction types, including:&lt;br /&gt;
&lt;br /&gt;
; Transfers&lt;br /&gt;
: An atomic movement of funds from one account to a different account, like a bank account-to-account transfer.&lt;br /&gt;
; Cheques&lt;br /&gt;
: A payment which is not deducted from the sender's account until the recipient claims it.&lt;br /&gt;
; Vouchers&lt;br /&gt;
: A payment which is deducted from the senders account at the time of creation.&lt;br /&gt;
; Invoices&lt;br /&gt;
: A payment request which the recipient can opt to pay from any of his accounts.&lt;br /&gt;
; Cash&lt;br /&gt;
: Anonymous cryptographic tokens which can be securely redeemed by the recipient without revealing the sender.&lt;br /&gt;
; Market offers&lt;br /&gt;
: Open agreements to exchange a given quantity of one instrument type for a given quantity of another instrument type.&lt;br /&gt;
; Smart Contracts&lt;br /&gt;
: Customizable agreements between multiple parties, containing user-defined scripted clauses, hooks, and variables.&lt;br /&gt;
&lt;br /&gt;
==Use Cases==&lt;br /&gt;
&lt;br /&gt;
===Encouraged use cases===&lt;br /&gt;
&lt;br /&gt;
Encouraged uses cases are officially supported by Open-Transactions.&lt;br /&gt;
&lt;br /&gt;
====Deposit accounting====&lt;br /&gt;
&lt;br /&gt;
Entities that hold assets on behalf of depositors can use Open-Transactions to issue promissory notes as negotiable instruments.&lt;br /&gt;
&lt;br /&gt;
Examples of such depositories includes:&lt;br /&gt;
&lt;br /&gt;
* Precious metals&lt;br /&gt;
* Central bank currencies&lt;br /&gt;
* Cryptocurrencies&lt;br /&gt;
&lt;br /&gt;
====Payments====&lt;br /&gt;
&lt;br /&gt;
Users of OT negotiable instruments can authorize recurring payments to pay for services which operate on a billing cycle.&lt;br /&gt;
&lt;br /&gt;
====Bearer Securities====&lt;br /&gt;
&lt;br /&gt;
The negotiable instruments created by Open-Transactions can be used as the basis for financial products such as loans.&lt;br /&gt;
&lt;br /&gt;
===Discouraged use cases===&lt;br /&gt;
&lt;br /&gt;
Discouraged use cases are not supported by Open-Transactions, either because they violate the security requirements, or because they conflict with the philosophical goals of the project.&lt;br /&gt;
&lt;br /&gt;
In many cases, discouraged use cases may be achievable, but users are required to create and support their own smart contracts.&lt;br /&gt;
&lt;br /&gt;
====Third party balance editing====&lt;br /&gt;
&lt;br /&gt;
The only entity in Open-Transactions that can edit a balance is the holder of that balance receipt. Open-Transactions does not and will not include any functionality to bypass this design decision.&lt;br /&gt;
&lt;br /&gt;
------------------&lt;br /&gt;
&lt;br /&gt;
This product includes software developed by Ben Laurie for use in the [https://github.com/benlaurie/lucre Lucre] project.&lt;br /&gt;
&lt;br /&gt;
Credit for the OT logo goes to: [http://www.michpalmer.com/ moltenmich]&lt;br /&gt;
&lt;br /&gt;
=== Mailing list and IRC ===&lt;br /&gt;
&lt;br /&gt;
Mailing list: ot-dev@opentransactions.org&lt;br /&gt;
&lt;br /&gt;
[http://opentransactions.org/mailman/listinfo/ot-dev_opentransactions.org Subscribe to mailing list]&lt;br /&gt;
&lt;br /&gt;
IRC channel: '''#opentransactions''' on irc.freenode.net&lt;br /&gt;
&lt;br /&gt;
=== Sponsors and Contributors ===&lt;br /&gt;
&lt;br /&gt;
The OT community gratefully acknowledges the support and contributions of the following individuals and businesses to OT development: Chris Odom, Cameron Garnham, Randy Waterhouse, [[Monetas]].&lt;br /&gt;
&lt;br /&gt;
=== Install Programs ===&lt;br /&gt;
&lt;br /&gt;
[http://nightowl.cc/Moneychanger.dmg Mac OSX install for Moneychanger GUI] Self-contained.&lt;br /&gt;
&amp;lt;br /&amp;gt;Note: This Mac install of Moneychanger includes the notary server as well.&amp;lt;br /&amp;gt;It can be found at: /Applications/moneychanger-qt.app/Contents/MacOS/opentxs-notary&lt;br /&gt;
&lt;br /&gt;
[https://bitcointalk.org/index.php?topic=77301.msg859040#msg859040 (old) Windows binary installer ]&lt;br /&gt;
&lt;br /&gt;
=== White Paper ===&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf Open-Transactions White Paper]&lt;br /&gt;
&lt;br /&gt;
=== Source Code ===&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/opentxs Open-Transactions source code on github] (core library, client API, and 'opentxs' command-line client)&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/opentxs-notary Notary server source code on github] (Install OT core first)&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/Moneychanger Moneychanger GUI source code on github] (Install OT core first, and then build Moneychanger with the latest version of Qt Creator)&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Main_Page&amp;diff=3193</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Main_Page&amp;diff=3193"/>
		<updated>2015-07-09T00:38:20Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: added line&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Open-Transactions==&lt;br /&gt;
&lt;br /&gt;
'''[http://www.opentransactions.org/open-transactions.pdf Click here for white paper.]'''&lt;br /&gt;
&lt;br /&gt;
The Open-Transactions project is a collaborative effort to develop a robust, commercial-grade, fully-featured, '''free-software toolkit''' implementing the [[OTX|OTX protocol]] as well as a full-strength '''financial cryptography''' [[List_of_Classes|library]], API, GUI, command-line interface, and prototype notary server. The project is managed by a worldwide community of volunteers that use the Internet to communicate, plan, and develop the Open-Transactions toolkit and its related documentation.&lt;br /&gt;
&lt;br /&gt;
===Financial Cryptography===&lt;br /&gt;
&lt;br /&gt;
Financial cryptography means using using strong cryptographic techniques to create secure financial instruments, such as digital signing to create non-repudiable contracts, and encryption to create untraceable digital cash. In OT, transactions are unforgeable, receipts are destructible, and balances cannot be falsified or changed without user consent. OT is able to prove all balances, as well as which instruments are valid, and which transactions have closed, without storing any history except the last signed receipt.&lt;br /&gt;
&lt;br /&gt;
Open-Transactions implements financial instruments as Ricardian Contracts; contracts which can be understood both by humans and manipulated by software. &lt;br /&gt;
&lt;br /&gt;
All contracts in Open-Transactions use the same basic structure: all parties involved sign an agreement which is notarized by an independent third party witness. This technique is known as [[Triple-Signed Receipts]]. Importantly, transactions are formed and signed on the client side first, before being notarized by any server. An OT client is thus ensured that an OT notary server cannot falsify his receipts against his will, since the server can't forge the client's signature.&lt;br /&gt;
&lt;br /&gt;
This basic structure can be built upon to create many types of financial instruments.&lt;br /&gt;
&lt;br /&gt;
===Financial Instruments===&lt;br /&gt;
&lt;br /&gt;
Financial instruments are any representation of a financial agreement between two or more parties.&lt;br /&gt;
&lt;br /&gt;
The simplest financial instrument is a deposit agreement. A custodian of some asset (legal tender, or maybe gold) stores it on behalf of a depositor and agrees to redeem it on demand when presented with proof of a valid claim on the asset.&lt;br /&gt;
&lt;br /&gt;
Other types of financial instruments include securities, of which there can be many variations. A security is an instrument that entitles the bearer to a certain revenue stream, either because it represents a loan or perhaps because it represents equity in a business.&lt;br /&gt;
&lt;br /&gt;
Financial instruments in Open-Transactions have an issuer, who creates the contracts and is responsible for fulfilling the terms, and one or more bearers. Financial instruments are liabilities of the issuer owed to the bearers.&lt;br /&gt;
&lt;br /&gt;
===Working with Financial Instruments===&lt;br /&gt;
&lt;br /&gt;
Open-Transactions is designed to provide the highest security possible for both the issuers and bearers of financial instruments. Servers in Open-Transactions act as notaries which can witness and confirm balances, but cannot change them. Every party associated in a financial instrument can prove their balance to any other party, and no party can alter the balance of any other party without their agreement. Even a malicious notary cannot do this.&lt;br /&gt;
&lt;br /&gt;
Open-Transactions represents quantities of a given unit type as deposit agreements, which are signed by the bearer and a notary.&lt;br /&gt;
&lt;br /&gt;
Portions of a balance may be transferred between users via several asset-independent transaction types, including:&lt;br /&gt;
&lt;br /&gt;
; Transfers&lt;br /&gt;
: An atomic movement of funds from one account to a different account, like a bank account-to-account transfer.&lt;br /&gt;
; Cheques&lt;br /&gt;
: A payment which is not deducted from the sender's account until the recipient claims it.&lt;br /&gt;
; Vouchers&lt;br /&gt;
: A payment which is deducted from the senders account at the time of creation.&lt;br /&gt;
; Invoices&lt;br /&gt;
: A payment request which the recipient can opt to pay from any of his accounts.&lt;br /&gt;
; Cash&lt;br /&gt;
: Anonymous cryptographic tokens which can be securely redeemed by the recipient without revealing the sender.&lt;br /&gt;
; Market offers&lt;br /&gt;
: Open agreements to exchange a given quantity of one instrument type for a given quantity of another instrument type.&lt;br /&gt;
; Smart Contracts&lt;br /&gt;
: Customizable agreements between multiple parties, containing user-defined scripted clauses, hooks, and variables.&lt;br /&gt;
&lt;br /&gt;
==Use Cases==&lt;br /&gt;
&lt;br /&gt;
===Encouraged use cases===&lt;br /&gt;
&lt;br /&gt;
Encouraged uses cases are officially supported by Open-Transactions.&lt;br /&gt;
&lt;br /&gt;
====Deposit accounting====&lt;br /&gt;
&lt;br /&gt;
Entities that hold assets on behalf of depositors can use Open-Transactions to issue promissory notes as negotiable instruments.&lt;br /&gt;
&lt;br /&gt;
Examples of such depositories includes:&lt;br /&gt;
&lt;br /&gt;
* Precious metals&lt;br /&gt;
* Central bank currencies&lt;br /&gt;
* Cryptocurrencies&lt;br /&gt;
&lt;br /&gt;
====Payments====&lt;br /&gt;
&lt;br /&gt;
Users of OT negotiable instruments can authorize recurring payments to pay for services which operate on a billing cycle.&lt;br /&gt;
&lt;br /&gt;
====Bearer Securities====&lt;br /&gt;
&lt;br /&gt;
The negotiable instruments created by Open-Transactions can be used as the basis for financial products such as loans.&lt;br /&gt;
&lt;br /&gt;
===Discouraged use cases===&lt;br /&gt;
&lt;br /&gt;
Discouraged use cases are not supported by Open-Transactions, either because they violate the security requirements, or because they conflict with the philosophical goals of the project.&lt;br /&gt;
&lt;br /&gt;
In many cases, discouraged use cases may be achievable, but users are required to create and support their own smart contracts.&lt;br /&gt;
&lt;br /&gt;
====Third party balance editing====&lt;br /&gt;
&lt;br /&gt;
The only entity in Open-Transactions that can edit a balance is the holder of that balance receipt. Open-Transactions does not and will not include any functionality to bypass this design decision.&lt;br /&gt;
&lt;br /&gt;
------------------&lt;br /&gt;
&lt;br /&gt;
This product includes software developed by Ben Laurie for use in the [https://github.com/benlaurie/lucre Lucre] project.&lt;br /&gt;
&lt;br /&gt;
Credit for the OT logo goes to: [http://www.michpalmer.com/ moltenmich]&lt;br /&gt;
&lt;br /&gt;
=== Mailing list and IRC ===&lt;br /&gt;
&lt;br /&gt;
Mailing list: ot-dev@opentransactions.org&lt;br /&gt;
&lt;br /&gt;
[http://opentransactions.org/mailman/listinfo/ot-dev_opentransactions.org Subscribe to mailing list]&lt;br /&gt;
&lt;br /&gt;
IRC channel: '''#opentransactions''' on irc.freenode.net&lt;br /&gt;
&lt;br /&gt;
=== Sponsors and Contributors ===&lt;br /&gt;
&lt;br /&gt;
The OT community gratefully acknowledges the support and contributions of the following individuals and businesses to OT development: Chris Odom, Cameron Garnham, Randy Waterhouse, [[Monetas]].&lt;br /&gt;
&lt;br /&gt;
=== Install Programs ===&lt;br /&gt;
&lt;br /&gt;
[http://nightowl.cc/Moneychanger.dmg Mac OSX install for Moneychanger GUI] Self-contained.&lt;br /&gt;
&amp;lt;br /&amp;gt;Note: This Mac install of Moneychanger includes the notary server as well.&amp;lt;br /&amp;gt;It can be found at: /Applications/moneychanger-qt.app/Contents/MacOS/opentxs-notary&lt;br /&gt;
&lt;br /&gt;
[https://bitcointalk.org/index.php?topic=77301.msg859040#msg859040 (old) Windows binary installer ]&lt;br /&gt;
&lt;br /&gt;
=== White Paper ===&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf Open-Transactions White Paper]&lt;br /&gt;
&lt;br /&gt;
=== Source Code ===&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/opentxs Open-Transactions source code on github] (core library, client API, and 'opentxs' command-line client)&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/opentxs-notary The Open-Transactions notary server on github] (Install OT core first)&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/Moneychanger Moneychanger GUI source code on github] (Install OT core first, and then build Moneychanger with the latest version of Qt Creator)&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Main_Page&amp;diff=3192</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Main_Page&amp;diff=3192"/>
		<updated>2015-07-09T00:37:43Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: /* More Information */ removed old stuff&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Open-Transactions==&lt;br /&gt;
&lt;br /&gt;
'''[http://www.opentransactions.org/open-transactions.pdf Click here for white paper.]'''&lt;br /&gt;
&lt;br /&gt;
The Open-Transactions project is a collaborative effort to develop a robust, commercial-grade, fully-featured, '''free-software toolkit''' implementing the [[OTX|OTX protocol]] as well as a full-strength '''financial cryptography''' [[List_of_Classes|library]], API, GUI, command-line interface, and prototype notary server. The project is managed by a worldwide community of volunteers that use the Internet to communicate, plan, and develop the Open-Transactions toolkit and its related documentation.&lt;br /&gt;
&lt;br /&gt;
===Financial Cryptography===&lt;br /&gt;
&lt;br /&gt;
Financial cryptography means using using strong cryptographic techniques to create secure financial instruments, such as digital signing to create non-repudiable contracts, and encryption to create untraceable digital cash. In OT, transactions are unforgeable, receipts are destructible, and balances cannot be falsified or changed without user consent. OT is able to prove all balances, as well as which instruments are valid, and which transactions have closed, without storing any history except the last signed receipt.&lt;br /&gt;
&lt;br /&gt;
Open-Transactions implements financial instruments as Ricardian Contracts; contracts which can be understood both by humans and manipulated by software. &lt;br /&gt;
&lt;br /&gt;
All contracts in Open-Transactions use the same basic structure: all parties involved sign an agreement which is notarized by an independent third party witness. This technique is known as [[Triple-Signed Receipts]]. Importantly, transactions are formed and signed on the client side first, before being notarized by any server. An OT client is thus ensured that an OT notary server cannot falsify his receipts against his will, since the server can't forge the client's signature.&lt;br /&gt;
&lt;br /&gt;
This basic structure can be built upon to create many types of financial instruments.&lt;br /&gt;
&lt;br /&gt;
===Financial Instruments===&lt;br /&gt;
&lt;br /&gt;
Financial instruments are any representation of a financial agreement between two or more parties.&lt;br /&gt;
&lt;br /&gt;
The simplest financial instrument is a deposit agreement. A custodian of some asset (legal tender, or maybe gold) stores it on behalf of a depositor and agrees to redeem it on demand when presented with proof of a valid claim on the asset.&lt;br /&gt;
&lt;br /&gt;
Other types of financial instruments include securities, of which there can be many variations. A security is an instrument that entitles the bearer to a certain revenue stream, either because it represents a loan or perhaps because it represents equity in a business.&lt;br /&gt;
&lt;br /&gt;
Financial instruments in Open-Transactions have an issuer, who creates the contracts and is responsible for fulfilling the terms, and one or more bearers. Financial instruments are liabilities of the issuer owed to the bearers.&lt;br /&gt;
&lt;br /&gt;
===Working with Financial Instruments===&lt;br /&gt;
&lt;br /&gt;
Open-Transactions is designed to provide the highest security possible for both the issuers and bearers of financial instruments. Servers in Open-Transactions act as notaries which can witness and confirm balances, but cannot change them. Every party associated in a financial instrument can prove their balance to any other party, and no party can alter the balance of any other party without their agreement. Even a malicious notary cannot do this.&lt;br /&gt;
&lt;br /&gt;
Open-Transactions represents quantities of a given unit type as deposit agreements, which are signed by the bearer and a notary.&lt;br /&gt;
&lt;br /&gt;
Portions of a balance may be transferred between users via several asset-independent transaction types, including:&lt;br /&gt;
&lt;br /&gt;
; Transfers&lt;br /&gt;
: An atomic movement of funds from one account to a different account, like a bank account-to-account transfer.&lt;br /&gt;
; Cheques&lt;br /&gt;
: A payment which is not deducted from the sender's account until the recipient claims it.&lt;br /&gt;
; Vouchers&lt;br /&gt;
: A payment which is deducted from the senders account at the time of creation.&lt;br /&gt;
; Invoices&lt;br /&gt;
: A payment request which the recipient can opt to pay from any of his accounts.&lt;br /&gt;
; Cash&lt;br /&gt;
: Anonymous cryptographic tokens which can be securely redeemed by the recipient without revealing the sender.&lt;br /&gt;
; Market offers&lt;br /&gt;
: Open agreements to exchange a given quantity of one instrument type for a given quantity of another instrument type.&lt;br /&gt;
; Smart Contracts&lt;br /&gt;
: Customizable agreements between multiple parties, containing user-defined scripted clauses, hooks, and variables.&lt;br /&gt;
&lt;br /&gt;
==Use Cases==&lt;br /&gt;
&lt;br /&gt;
===Encouraged use cases===&lt;br /&gt;
&lt;br /&gt;
Encouraged uses cases are officially supported by Open-Transactions.&lt;br /&gt;
&lt;br /&gt;
====Deposit accounting====&lt;br /&gt;
&lt;br /&gt;
Entities that hold assets on behalf of depositors can use Open-Transactions to issue promissory notes as negotiable instruments.&lt;br /&gt;
&lt;br /&gt;
Examples of such depositories includes:&lt;br /&gt;
&lt;br /&gt;
* Precious metals&lt;br /&gt;
* Central bank currencies&lt;br /&gt;
* Cryptocurrencies&lt;br /&gt;
&lt;br /&gt;
====Payments====&lt;br /&gt;
&lt;br /&gt;
Users of OT negotiable instruments can authorize recurring payments to pay for services which operate on a billing cycle.&lt;br /&gt;
&lt;br /&gt;
====Bearer Securities====&lt;br /&gt;
&lt;br /&gt;
The negotiable instruments created by Open-Transactions can be used as the basis for financial products such as loans.&lt;br /&gt;
&lt;br /&gt;
===Discouraged use cases===&lt;br /&gt;
&lt;br /&gt;
Discouraged use cases are not supported by Open-Transactions, either because they violate the security requirements, or because they conflict with the philosophical goals of the project.&lt;br /&gt;
&lt;br /&gt;
In many cases, discouraged use cases may be achievable, but users are required to create and support their own smart contracts.&lt;br /&gt;
&lt;br /&gt;
====Third party balance editing====&lt;br /&gt;
&lt;br /&gt;
The only entity in Open-Transactions that can edit a balance is the holder of that balance receipt. Open-Transactions does not and will not include any functionality to bypass this design decision.&lt;br /&gt;
&lt;br /&gt;
This product includes software developed by Ben Laurie for use in the [https://github.com/benlaurie/lucre Lucre] project.&lt;br /&gt;
&lt;br /&gt;
Credit for the OT logo goes to: [http://www.michpalmer.com/ moltenmich]&lt;br /&gt;
&lt;br /&gt;
=== Mailing list and IRC ===&lt;br /&gt;
&lt;br /&gt;
Mailing list: ot-dev@opentransactions.org&lt;br /&gt;
&lt;br /&gt;
[http://opentransactions.org/mailman/listinfo/ot-dev_opentransactions.org Subscribe to mailing list]&lt;br /&gt;
&lt;br /&gt;
IRC channel: '''#opentransactions''' on irc.freenode.net&lt;br /&gt;
&lt;br /&gt;
=== Sponsors and Contributors ===&lt;br /&gt;
&lt;br /&gt;
The OT community gratefully acknowledges the support and contributions of the following individuals and businesses to OT development: Chris Odom, Cameron Garnham, Randy Waterhouse, [[Monetas]].&lt;br /&gt;
&lt;br /&gt;
=== Install Programs ===&lt;br /&gt;
&lt;br /&gt;
[http://nightowl.cc/Moneychanger.dmg Mac OSX install for Moneychanger GUI] Self-contained.&lt;br /&gt;
&amp;lt;br /&amp;gt;Note: This Mac install of Moneychanger includes the notary server as well.&amp;lt;br /&amp;gt;It can be found at: /Applications/moneychanger-qt.app/Contents/MacOS/opentxs-notary&lt;br /&gt;
&lt;br /&gt;
[https://bitcointalk.org/index.php?topic=77301.msg859040#msg859040 (old) Windows binary installer ]&lt;br /&gt;
&lt;br /&gt;
=== White Paper ===&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf Open-Transactions White Paper]&lt;br /&gt;
&lt;br /&gt;
=== Source Code ===&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/opentxs Open-Transactions source code on github] (core library, client API, and 'opentxs' command-line client)&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/opentxs-notary The Open-Transactions notary server on github] (Install OT core first)&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/Moneychanger Moneychanger GUI source code on github] (Install OT core first, and then build Moneychanger with the latest version of Qt Creator)&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=About&amp;diff=3191</id>
		<title>About</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=About&amp;diff=3191"/>
		<updated>2015-07-08T22:57:05Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: unlinkable&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;plainlinks&amp;quot;&amp;gt;&lt;br /&gt;
{| id=&amp;quot;mp-topbanner&amp;quot; style=&amp;quot;width:100%; background:#f6f6f6; margin-top:1.2em; border:1px solid #ddd;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:61%; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;!--        &amp;quot;Welcome to Open-Transactions&amp;quot;        --&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:100%; border:none; background:none;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; white-space:nowrap; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:162%; border:none; margin:0; padding:.1em; color:#000;&amp;quot;&amp;gt;About the Open-Transactions project.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em; font-size:95%;&amp;quot;&amp;gt;Financial cryptography software.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;articlecount&amp;quot; style=&amp;quot;width:100%; text-align:center; font-size:85%;&amp;quot;&amp;gt;[[Special:Statistics|{{NUMBEROFARTICLES}}]] [[Special:Allpages|articles]].&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; max-width: 550px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What is Open-Transactions?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions is an [[Use Cases|easy-to-use]], financial crypto, [[Sample Cash|digital cash]] and transaction [[List of Classes|library]].&lt;br /&gt;
* Open-Transactions is open-source.&lt;br /&gt;
* Open-Transactions includes a [[API|client API]], a working [[Otserver|server]], a cross-platform [https://github.com/Open-Transactions/Moneychanger GUI] and a [[opentxs|command-line]] wallet utility.&lt;br /&gt;
* Open-Transactions features: a large variety of financial instruments, markets, basket currencies, unforgeable account balances, digital cash, destruction of account history, [http://iang.org/papers/ricardian_contract.html Ricardian contracts], Smart Contracts (scriptable clauses), and more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What does it do?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions allows users to issue and manipulate digital assets.&lt;br /&gt;
* Any issuer can sign and distribute new [[Sample Currency Contract|currency contracts]] in order to create new digital asset types.&lt;br /&gt;
* Users may create many ''pseudonyms'' (public keys), each of which may own ''asset accounts'' of various types, on OT servers.&lt;br /&gt;
* Users can operate '''&amp;amp;quot;cash-only&amp;amp;quot;''' for maximum anonymity, using '''[[Sample Cash|untraceable digital cash]]'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Financial Instruments'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Users can transfer digital assets ''securely and provably'', with [[Triple-Signed Receipts|receipts]] signed by all parties.&lt;br /&gt;
* '''Even an OT server cannot change balances, or forge transactions--since it cannot forge your signature on your receipt.'''&lt;br /&gt;
* Open-Transactions supports a range of '''[[Instruments|financial instruments]]''' such as account transfer, '''[[Sample-Cheque|cheques]]''' and vouchers (aka &amp;amp;quot;cashier's cheques&amp;amp;quot; or &amp;amp;quot;banker's cheques&amp;amp;quot;), in addition to cash.&lt;br /&gt;
* These instruments are all analogous to the same financial instruments that we all use at normal banks today. Everyone already has an intuitive understanding of these financial instruments, because we use them regularly in our normal daily lives.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Markets, Basket Currencies, and Smart Contracts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Open-Transactions also implements higher-level, '''contract-based transactions''' such as '''payment plans''' and '''markets with trades'''.&lt;br /&gt;
* The [[Markets|markets]] on Open-Transactions support ''market orders, limit orders, fill-or-kill orders, day orders, stop orders, and stop limits'', just like trading on a real market.&lt;br /&gt;
* '''Basket currencies''' are also supported, as well as payment plans (recurring payments.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc.&lt;br /&gt;
* [[Client-side scripting]]: &amp;lt;code&amp;gt;!/usr/bin/env ot&amp;lt;/code&amp;gt; The entire (mostly) high and low level OT API is available within your scripts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Triple Signed Receipts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* All of this is accomplished in such a way that all parties are able to ''prove'', at all times, ''which transactions have cleared and which instruments are authorized'', '''without having to store their entire transaction history''', but instead by merely keeping the '''last signed receipt'''.&lt;br /&gt;
* Without the special mechanism that makes this possible, ''all parties would otherwise be forced to store all receipts forever''.&lt;br /&gt;
* Nyms and Asset Types have consistent IDs across all OT servers, since the ID is formed by hashing the relevant contract or public key.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Is Open-Transactions [[CENTRALIZED|centralized]]?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* No—quite the opposite. Open-Transactions is highly '''decentralized'''.&lt;br /&gt;
* Typical centralized servers have power over their users, but in OT, '''no server has power over the clients it serves''', because:&lt;br /&gt;
# An OT server does not control user transactions—it merely notarizes them.&lt;br /&gt;
# Anyone can operate an OT server, and users can go to any OT server to notarize transactions. Thus OT servers compete with each other to attract users to use their notary services.&lt;br /&gt;
# Anyone can download an OT client, and use it to execute transactions on any OT server, or any group of OT servers.&lt;br /&gt;
# OT uses triple-signed receipts, so transaction parties have independent cryptographic proof of transactions and balances.&lt;br /&gt;
# OT servers do not store user assets. Rather, cryptocurrencies are stored in voting pools so the server can't steal them.&lt;br /&gt;
&lt;br /&gt;
In every way, '''the user is in control, not the server'''—even when you're using servers you do not trust. These characteristics generate a '''federated''' network architecture—similar to the internet, and it has the same virtues as the internet—openness, decentralization, resilience, censorship-resistance, and user control.&lt;br /&gt;
&lt;br /&gt;
The community behind OT is strongly committed to developing systems that give users full control over their own assets and information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; max-width: 300px; margin: -20px 10px 0 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== White Paper ==&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf OT White Paper]&lt;br /&gt;
 &lt;br /&gt;
== Diagrams ==&lt;br /&gt;
&lt;br /&gt;
[[Voting_Pool_Deposit_Process|Voting Pools]]&lt;br /&gt;
&lt;br /&gt;
[http://i.imgur.com/HTyAJjg.png Architecture Overview (new)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/ot-diagram.jpg Architecture Overview (old)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg Financial Instruments]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Radio Interviews ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=teNzIFu5L70 &amp;quot;Trust No One&amp;quot; Miami Speech]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=234 AgoristRadio Interview, Part 1]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=246 AgoristRadio Interview, Part 2]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=vtJcUM5-TeA Interview with &amp;quot;Let's Talk Bitcoin&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=HSgpStCTw2g Interview with FutureMoneyTrends.com]&lt;br /&gt;
&lt;br /&gt;
== Video Walkthrough ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=5qtTayW-RyM Android demo video (Monetas)]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/Ea6rzq Desktop video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/i0J3AF Desktop video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/8Dxak1 iPhone video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/u6xqHc iPhone video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28141679 java testclient video 1]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28142096 java testclient video 2]&lt;br /&gt;
&lt;br /&gt;
[http://open-transactions.github.io/tv/ Official video archive (more videos)]&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Components and GNU Licensing]]&lt;br /&gt;
&lt;br /&gt;
[[Vulnerabilities|Potential vulnerabilities]] of Open-Transactions&lt;br /&gt;
&lt;br /&gt;
== Related Systems ==&lt;br /&gt;
&lt;br /&gt;
[[Monetas]] - Enterprise platform based on OT.&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
[http://bitcoin.org/ Bitcoin] - A censorship-resistant global ledger&lt;br /&gt;
&lt;br /&gt;
[https://loom.cc/help Loom] - Asset issuance and transactions&lt;br /&gt;
&lt;br /&gt;
[http://www.csee.umbc.edu/~woodcock/cmsc482/proj1/magmoney.html Magic Money] - PGP-based Chaumian blinding (unlinkable cash)&lt;br /&gt;
&lt;br /&gt;
[http://opencoin.org/ OpenCoin.org] - REST-based blinded tokens&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransact.org/ OpenTransact] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://payswarm.com/ PaySwarm] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/publickeytransaction PKTP] - Public-Key Transaction Processor&lt;br /&gt;
&lt;br /&gt;
[http://wiki.dgcmagazine.com/index.php?title=Ricardo Ricardo] - Transaction system by Ian Grigg&lt;br /&gt;
&lt;br /&gt;
[https://ripple.com/ Ripple] - Consensus-based debt ledger&lt;br /&gt;
&lt;br /&gt;
[https://www.stellar.org/ Stellar] - Ripple-based&lt;br /&gt;
&lt;br /&gt;
[http://truledger.com/ Truledger] - Destruction of account history&lt;br /&gt;
&lt;br /&gt;
[http://www.voucher-safe.com/index.cfm Voucher-Safe] - Secure asset issuance with auditing&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
Article: [http://pelagic.wavyhill.xsmail.com/Private_Digital_Economy.html Toward a Private Digital Economy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both; padding-top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In More Detail... ==&lt;br /&gt;
&lt;br /&gt;
The server itself is a [[Transactions|transaction processor]] in the cypherpunk tradition. In more detail:&lt;br /&gt;
&lt;br /&gt;
* Many '''financial instruments''' are supported: Users can write '''cheques''', purchase '''cashier's cheques''' (&amp;amp;quot;vouchers&amp;amp;quot;), and withdraw in '''[[Sample Cash|unlinkable digital cash]]'''. The software uses Chaumian-style, blinded tokens courtesy of the [http://anoncvs.aldigital.co.uk/lucre/ Lucre] library by Ben Laurie.&lt;br /&gt;
* It's like '''PGP FOR MONEY'''. The idea is to have many cash algorithms, not just Lucre. I’d like to add Chaum’s version, Brands’ version, etc. So that, just like PGP, the software should support as many of the top algorithms as possible, and make it easy to swap them out when necessary.&lt;br /&gt;
* User accounts are '''pseudonymous'''. '''A user account is a public key'''. (This is like [http://pktp.co.cc/ PKTP] by Andrew McMeikan.) You can open as many user accounts as you want. ''Full anonymity'' is possible only for &amp;quot;cash-only&amp;quot; transactions (where users only perform token exchanges, and do not open accounts), whereas ''pseudonymity'' means that transactions can be linked to the key that signed them. (While the real life identity of the owner is hidden, continuity of reputation becomes possible.) ''See full-color diagrams linked above''.&lt;br /&gt;
* '''Any user can issue new digital currencies''' and digital asset types, by uploading the new [[Sample Currency Contract|currency contract]] to the server. (This functionality is comparable to [http://www.systemics.com/docs/sox/overview.html Ricardo] by [http://financialcryptography.com/ Ian Grigg].)&lt;br /&gt;
* '''Users can open asset accounts of any type.''' You can have as many as you want, associated with each user account. (See [http://loom.cc/ Loom] by Patrick Chkoreff.)&lt;br /&gt;
* [[Triple-Signed Receipts|Triple Signed Receipts / No Account History]]. On OT, entities are able to conduct transactions, verify instruments, ''and'' provably agree on current holdings via ''signed receipts'', all without the need to store any transaction history.'' An ''asset account'' on OT is not according to the traditional sense of the word (an account normally being thought of as, &amp;quot;a list of transactions, with a balance, used in double-entry bookkeeping.&amp;quot;) While the word &amp;quot;account&amp;quot; makes things easy to understand, an ''asset account'' on OT exists only in the mind of the account holder himself. He simply asks the server to agree with him that it exists, and to provide him with a signed receipt to that effect. In the user interface, OT is able to mimic the ''account metaphor'', making usage intuitive, even though ''no actual account exists, or need be stored on either side, other than the signed receipt itself!'' (See Bill St. Clair's excellent [http://truledger.com/ Truledger] for an [http://truledger.com/doc/plain-english.html example of this concept].)&lt;br /&gt;
* Open Transactions also features '''markets'''. Any two asset types can be traded against each other. The [[markets]] are full-featured and include '''limit orders, stop orders, fill-or-kill, day orders''' (date ranges), and '''stop limits'''.&lt;br /&gt;
* Open Transactions also supports '''basket currencies'''. Users can define their own, and the server handles the process of exchanging in and out of basket accounts. Baskets are treated by the software like any other asset type, (you can open accounts, transfer funds, withdraw cash, write cheques, and even '''trade basket currencies on markets'''.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc. This concept was originated by Nick Szabo: [http://szabo.best.vwh.net/contractlanguage.html smart contracts].&lt;br /&gt;
* [[Client-side scripting]]: The entire OT API is now available for use in OTscripts on the client side. Just remember to put this at the top of the file: &amp;lt;pre&amp;gt;#!/usr/local/bin/ot --script&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Open Transactions also supports '''payment plans'''. Users can sign contracts with each other, and the server will carry out the terms and implement the payment plan. (A future goal is to issue new asset types based on revenue from payment plans--so they can also be traded on markets.)&lt;br /&gt;
* '''Contracts''', in general, are very important to Open Transactions; they are the building block of the entire library. Open Transactions uses a Ricardian-style contract, and all the various instruments, data files, and messages resemble '''[[Sample Currency Contract | PGP-signed XML files]]'''. All objects serialize to a string.&lt;br /&gt;
* The philosophy of the software is based around '''separation of powers''' (issuers and transaction servers being separate entities) as well as the '''distribution of risk'''. For example, Asset accounts can be distributed across multiple servers, and asset types can be distributed across multiple issuers (via baskets.) Read about the [[Auditing]] protocol.&lt;br /&gt;
* Potential future instruments include: [http://www.goldstandardinstitute.net/2010/06/what-is-a-real-bill/ Real Bills], dividend-paying stocks (the same mechanism can be used as interest paying bonds) and collateralized debt obligations. (OT supports payment plans, so it would be easy to group tranches of OT's payment plans to pay into a single reserve account, as backing for a new stock offering that could be traded on OT markets.) This is similar to how basket currencies are implemented. Stocks/Bonds would pay shareholders by dropping a cheque into your stock account's inbox. These features aren't available yet, but they are easy to add given the existing OT infrastructure.&lt;br /&gt;
* '''All communications are secured with OpenSSL.''' All messages are also signed and encrypted. All transactions require signatures from relevant parties including the server.&lt;br /&gt;
* Open Transactions is '''open-source''', written in C++, object-oriented, and includes '''Native [[API]]s''' for '''Java, Ruby, Python, PHP, Perl, C, [http://www.digitalmars.com/d/2.0/overview.html D], C++, Objective-C, C#, Tcl, and LISP.''' (Also supporting JRuby, Jython, Scala, Clojure, Groovy, and any other language that works on the JVM.)&lt;br /&gt;
* The software is fully '''cross-platform''': '''Linux, Mac OS X, FreeBSD, Android, and Windows''' are supported with makefiles, project files, and instructions.&lt;br /&gt;
* STORAGE... The library itself is '''storage neutral''', and could be utilized across a variety of different storage systems. All objects serialize to a string, and it is very easy to add support for new storage methods. (Currently OT uses the filesystem with key/value pairs.) '''Adding a new storage method is as easy as subclassing OTDB::Storage and overriding a few methods. Use any DB you want.'''&lt;br /&gt;
* [[Messaging]]... The library itself is '''transfer-protocol neutral''', and can be utilized across a variety of different transfer protocols. The default implementation uses the [http://zeromq.org/ ZeroMQ library] for transport. Transport is implemented as a callback function, so it's very easy (a few dozen lines of code) to swap in some other system, if you wish.&lt;br /&gt;
* OT currently supports '''MsgPack''' and '''protobuf''' for data packing, though new packers can be added by subclassing OTDB::Packer.&lt;br /&gt;
&lt;br /&gt;
The intention is for this software to be integrated as many places as possible... Games, digital cash wallets, distributed data stores, secure voip apps, anonymous bit torrent networks, mixnets, remailers, nym servers, etc. There are many other potential uses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=About&amp;diff=3190</id>
		<title>About</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=About&amp;diff=3190"/>
		<updated>2015-07-08T22:56:45Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: updated wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;plainlinks&amp;quot;&amp;gt;&lt;br /&gt;
{| id=&amp;quot;mp-topbanner&amp;quot; style=&amp;quot;width:100%; background:#f6f6f6; margin-top:1.2em; border:1px solid #ddd;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:61%; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;!--        &amp;quot;Welcome to Open-Transactions&amp;quot;        --&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:100%; border:none; background:none;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; white-space:nowrap; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:162%; border:none; margin:0; padding:.1em; color:#000;&amp;quot;&amp;gt;About the Open-Transactions project.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em; font-size:95%;&amp;quot;&amp;gt;Financial cryptography software.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;articlecount&amp;quot; style=&amp;quot;width:100%; text-align:center; font-size:85%;&amp;quot;&amp;gt;[[Special:Statistics|{{NUMBEROFARTICLES}}]] [[Special:Allpages|articles]].&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; max-width: 550px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What is Open-Transactions?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions is an [[Use Cases|easy-to-use]], financial crypto, [[Sample Cash|digital cash]] and transaction [[List of Classes|library]].&lt;br /&gt;
* Open-Transactions is open-source.&lt;br /&gt;
* Open-Transactions includes a [[API|client API]], a working [[Otserver|server]], a cross-platform [https://github.com/Open-Transactions/Moneychanger GUI] and a [[opentxs|command-line]] wallet utility.&lt;br /&gt;
* Open-Transactions features: a large variety of financial instruments, markets, basket currencies, unforgeable account balances, digital cash, destruction of account history, [http://iang.org/papers/ricardian_contract.html Ricardian contracts], Smart Contracts (scriptable clauses), and more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What does it do?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions allows users to issue and manipulate digital assets.&lt;br /&gt;
* Any issuer can sign and distribute new [[Sample Currency Contract|currency contracts]] in order to create new digital asset types.&lt;br /&gt;
* Users may create many ''pseudonyms'' (public keys), each of which may own ''asset accounts'' of various types, on OT servers.&lt;br /&gt;
* Users can operate '''&amp;amp;quot;cash-only&amp;amp;quot;''' for maximum anonymity, using '''[[Sample Cash|unlinkable digital cash]]'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Financial Instruments'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Users can transfer digital assets ''securely and provably'', with [[Triple-Signed Receipts|receipts]] signed by all parties.&lt;br /&gt;
* '''Even an OT server cannot change balances, or forge transactions--since it cannot forge your signature on your receipt.'''&lt;br /&gt;
* Open-Transactions supports a range of '''[[Instruments|financial instruments]]''' such as account transfer, '''[[Sample-Cheque|cheques]]''' and vouchers (aka &amp;amp;quot;cashier's cheques&amp;amp;quot; or &amp;amp;quot;banker's cheques&amp;amp;quot;), in addition to cash.&lt;br /&gt;
* These instruments are all analogous to the same financial instruments that we all use at normal banks today. Everyone already has an intuitive understanding of these financial instruments, because we use them regularly in our normal daily lives.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Markets, Basket Currencies, and Smart Contracts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Open-Transactions also implements higher-level, '''contract-based transactions''' such as '''payment plans''' and '''markets with trades'''.&lt;br /&gt;
* The [[Markets|markets]] on Open-Transactions support ''market orders, limit orders, fill-or-kill orders, day orders, stop orders, and stop limits'', just like trading on a real market.&lt;br /&gt;
* '''Basket currencies''' are also supported, as well as payment plans (recurring payments.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc.&lt;br /&gt;
* [[Client-side scripting]]: &amp;lt;code&amp;gt;!/usr/bin/env ot&amp;lt;/code&amp;gt; The entire (mostly) high and low level OT API is available within your scripts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Triple Signed Receipts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* All of this is accomplished in such a way that all parties are able to ''prove'', at all times, ''which transactions have cleared and which instruments are authorized'', '''without having to store their entire transaction history''', but instead by merely keeping the '''last signed receipt'''.&lt;br /&gt;
* Without the special mechanism that makes this possible, ''all parties would otherwise be forced to store all receipts forever''.&lt;br /&gt;
* Nyms and Asset Types have consistent IDs across all OT servers, since the ID is formed by hashing the relevant contract or public key.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Is Open-Transactions [[CENTRALIZED|centralized]]?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* No—quite the opposite. Open-Transactions is highly '''decentralized'''.&lt;br /&gt;
* Typical centralized servers have power over their users, but in OT, '''no server has power over the clients it serves''', because:&lt;br /&gt;
# An OT server does not control user transactions—it merely notarizes them.&lt;br /&gt;
# Anyone can operate an OT server, and users can go to any OT server to notarize transactions. Thus OT servers compete with each other to attract users to use their notary services.&lt;br /&gt;
# Anyone can download an OT client, and use it to execute transactions on any OT server, or any group of OT servers.&lt;br /&gt;
# OT uses triple-signed receipts, so transaction parties have independent cryptographic proof of transactions and balances.&lt;br /&gt;
# OT servers do not store user assets. Rather, cryptocurrencies are stored in voting pools so the server can't steal them.&lt;br /&gt;
&lt;br /&gt;
In every way, '''the user is in control, not the server'''—even when you're using servers you do not trust. These characteristics generate a '''federated''' network architecture—similar to the internet, and it has the same virtues as the internet—openness, decentralization, resilience, censorship-resistance, and user control.&lt;br /&gt;
&lt;br /&gt;
The community behind OT is strongly committed to developing systems that give users full control over their own assets and information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; max-width: 300px; margin: -20px 10px 0 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== White Paper ==&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf OT White Paper]&lt;br /&gt;
 &lt;br /&gt;
== Diagrams ==&lt;br /&gt;
&lt;br /&gt;
[[Voting_Pool_Deposit_Process|Voting Pools]]&lt;br /&gt;
&lt;br /&gt;
[http://i.imgur.com/HTyAJjg.png Architecture Overview (new)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/ot-diagram.jpg Architecture Overview (old)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg Financial Instruments]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Radio Interviews ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=teNzIFu5L70 &amp;quot;Trust No One&amp;quot; Miami Speech]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=234 AgoristRadio Interview, Part 1]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=246 AgoristRadio Interview, Part 2]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=vtJcUM5-TeA Interview with &amp;quot;Let's Talk Bitcoin&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=HSgpStCTw2g Interview with FutureMoneyTrends.com]&lt;br /&gt;
&lt;br /&gt;
== Video Walkthrough ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=5qtTayW-RyM Android demo video (Monetas)]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/Ea6rzq Desktop video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/i0J3AF Desktop video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/8Dxak1 iPhone video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/u6xqHc iPhone video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28141679 java testclient video 1]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28142096 java testclient video 2]&lt;br /&gt;
&lt;br /&gt;
[http://open-transactions.github.io/tv/ Official video archive (more videos)]&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Components and GNU Licensing]]&lt;br /&gt;
&lt;br /&gt;
[[Vulnerabilities|Potential vulnerabilities]] of Open-Transactions&lt;br /&gt;
&lt;br /&gt;
== Related Systems ==&lt;br /&gt;
&lt;br /&gt;
[[Monetas]] - Enterprise platform based on OT.&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
[http://bitcoin.org/ Bitcoin] - A censorship-resistant global ledger&lt;br /&gt;
&lt;br /&gt;
[https://loom.cc/help Loom] - Asset issuance and transactions&lt;br /&gt;
&lt;br /&gt;
[http://www.csee.umbc.edu/~woodcock/cmsc482/proj1/magmoney.html Magic Money] - PGP-based Chaumian blinding (unlinkable cash)&lt;br /&gt;
&lt;br /&gt;
[http://opencoin.org/ OpenCoin.org] - REST-based blinded tokens&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransact.org/ OpenTransact] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://payswarm.com/ PaySwarm] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/publickeytransaction PKTP] - Public-Key Transaction Processor&lt;br /&gt;
&lt;br /&gt;
[http://wiki.dgcmagazine.com/index.php?title=Ricardo Ricardo] - Transaction system by Ian Grigg&lt;br /&gt;
&lt;br /&gt;
[https://ripple.com/ Ripple] - Consensus-based debt ledger&lt;br /&gt;
&lt;br /&gt;
[https://www.stellar.org/ Stellar] - Ripple-based&lt;br /&gt;
&lt;br /&gt;
[http://truledger.com/ Truledger] - Destruction of account history&lt;br /&gt;
&lt;br /&gt;
[http://www.voucher-safe.com/index.cfm Voucher-Safe] - Secure asset issuance with auditing&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
Article: [http://pelagic.wavyhill.xsmail.com/Private_Digital_Economy.html Toward a Private Digital Economy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both; padding-top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In More Detail... ==&lt;br /&gt;
&lt;br /&gt;
The server itself is a [[Transactions|transaction processor]] in the cypherpunk tradition. In more detail:&lt;br /&gt;
&lt;br /&gt;
* Many '''financial instruments''' are supported: Users can write '''cheques''', purchase '''cashier's cheques''' (&amp;amp;quot;vouchers&amp;amp;quot;), and withdraw in '''[[Sample Cash|unlinkable digital cash]]'''. The software uses Chaumian-style, blinded tokens courtesy of the [http://anoncvs.aldigital.co.uk/lucre/ Lucre] library by Ben Laurie.&lt;br /&gt;
* It's like '''PGP FOR MONEY'''. The idea is to have many cash algorithms, not just Lucre. I’d like to add Chaum’s version, Brands’ version, etc. So that, just like PGP, the software should support as many of the top algorithms as possible, and make it easy to swap them out when necessary.&lt;br /&gt;
* User accounts are '''pseudonymous'''. '''A user account is a public key'''. (This is like [http://pktp.co.cc/ PKTP] by Andrew McMeikan.) You can open as many user accounts as you want. ''Full anonymity'' is possible only for &amp;quot;cash-only&amp;quot; transactions (where users only perform token exchanges, and do not open accounts), whereas ''pseudonymity'' means that transactions can be linked to the key that signed them. (While the real life identity of the owner is hidden, continuity of reputation becomes possible.) ''See full-color diagrams linked above''.&lt;br /&gt;
* '''Any user can issue new digital currencies''' and digital asset types, by uploading the new [[Sample Currency Contract|currency contract]] to the server. (This functionality is comparable to [http://www.systemics.com/docs/sox/overview.html Ricardo] by [http://financialcryptography.com/ Ian Grigg].)&lt;br /&gt;
* '''Users can open asset accounts of any type.''' You can have as many as you want, associated with each user account. (See [http://loom.cc/ Loom] by Patrick Chkoreff.)&lt;br /&gt;
* [[Triple-Signed Receipts|Triple Signed Receipts / No Account History]]. On OT, entities are able to conduct transactions, verify instruments, ''and'' provably agree on current holdings via ''signed receipts'', all without the need to store any transaction history.'' An ''asset account'' on OT is not according to the traditional sense of the word (an account normally being thought of as, &amp;quot;a list of transactions, with a balance, used in double-entry bookkeeping.&amp;quot;) While the word &amp;quot;account&amp;quot; makes things easy to understand, an ''asset account'' on OT exists only in the mind of the account holder himself. He simply asks the server to agree with him that it exists, and to provide him with a signed receipt to that effect. In the user interface, OT is able to mimic the ''account metaphor'', making usage intuitive, even though ''no actual account exists, or need be stored on either side, other than the signed receipt itself!'' (See Bill St. Clair's excellent [http://truledger.com/ Truledger] for an [http://truledger.com/doc/plain-english.html example of this concept].)&lt;br /&gt;
* Open Transactions also features '''markets'''. Any two asset types can be traded against each other. The [[markets]] are full-featured and include '''limit orders, stop orders, fill-or-kill, day orders''' (date ranges), and '''stop limits'''.&lt;br /&gt;
* Open Transactions also supports '''basket currencies'''. Users can define their own, and the server handles the process of exchanging in and out of basket accounts. Baskets are treated by the software like any other asset type, (you can open accounts, transfer funds, withdraw cash, write cheques, and even '''trade basket currencies on markets'''.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc. This concept was originated by Nick Szabo: [http://szabo.best.vwh.net/contractlanguage.html smart contracts].&lt;br /&gt;
* [[Client-side scripting]]: The entire OT API is now available for use in OTscripts on the client side. Just remember to put this at the top of the file: &amp;lt;pre&amp;gt;#!/usr/local/bin/ot --script&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Open Transactions also supports '''payment plans'''. Users can sign contracts with each other, and the server will carry out the terms and implement the payment plan. (A future goal is to issue new asset types based on revenue from payment plans--so they can also be traded on markets.)&lt;br /&gt;
* '''Contracts''', in general, are very important to Open Transactions; they are the building block of the entire library. Open Transactions uses a Ricardian-style contract, and all the various instruments, data files, and messages resemble '''[[Sample Currency Contract | PGP-signed XML files]]'''. All objects serialize to a string.&lt;br /&gt;
* The philosophy of the software is based around '''separation of powers''' (issuers and transaction servers being separate entities) as well as the '''distribution of risk'''. For example, Asset accounts can be distributed across multiple servers, and asset types can be distributed across multiple issuers (via baskets.) Read about the [[Auditing]] protocol.&lt;br /&gt;
* Potential future instruments include: [http://www.goldstandardinstitute.net/2010/06/what-is-a-real-bill/ Real Bills], dividend-paying stocks (the same mechanism can be used as interest paying bonds) and collateralized debt obligations. (OT supports payment plans, so it would be easy to group tranches of OT's payment plans to pay into a single reserve account, as backing for a new stock offering that could be traded on OT markets.) This is similar to how basket currencies are implemented. Stocks/Bonds would pay shareholders by dropping a cheque into your stock account's inbox. These features aren't available yet, but they are easy to add given the existing OT infrastructure.&lt;br /&gt;
* '''All communications are secured with OpenSSL.''' All messages are also signed and encrypted. All transactions require signatures from relevant parties including the server.&lt;br /&gt;
* Open Transactions is '''open-source''', written in C++, object-oriented, and includes '''Native [[API]]s''' for '''Java, Ruby, Python, PHP, Perl, C, [http://www.digitalmars.com/d/2.0/overview.html D], C++, Objective-C, C#, Tcl, and LISP.''' (Also supporting JRuby, Jython, Scala, Clojure, Groovy, and any other language that works on the JVM.)&lt;br /&gt;
* The software is fully '''cross-platform''': '''Linux, Mac OS X, FreeBSD, Android, and Windows''' are supported with makefiles, project files, and instructions.&lt;br /&gt;
* STORAGE... The library itself is '''storage neutral''', and could be utilized across a variety of different storage systems. All objects serialize to a string, and it is very easy to add support for new storage methods. (Currently OT uses the filesystem with key/value pairs.) '''Adding a new storage method is as easy as subclassing OTDB::Storage and overriding a few methods. Use any DB you want.'''&lt;br /&gt;
* [[Messaging]]... The library itself is '''transfer-protocol neutral''', and can be utilized across a variety of different transfer protocols. The default implementation uses the [http://zeromq.org/ ZeroMQ library] for transport. Transport is implemented as a callback function, so it's very easy (a few dozen lines of code) to swap in some other system, if you wish.&lt;br /&gt;
* OT currently supports '''MsgPack''' and '''protobuf''' for data packing, though new packers can be added by subclassing OTDB::Packer.&lt;br /&gt;
&lt;br /&gt;
The intention is for this software to be integrated as many places as possible... Games, digital cash wallets, distributed data stores, secure voip apps, anonymous bit torrent networks, mixnets, remailers, nym servers, etc. There are many other potential uses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=About&amp;diff=3189</id>
		<title>About</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=About&amp;diff=3189"/>
		<updated>2015-07-08T22:55:24Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;plainlinks&amp;quot;&amp;gt;&lt;br /&gt;
{| id=&amp;quot;mp-topbanner&amp;quot; style=&amp;quot;width:100%; background:#f6f6f6; margin-top:1.2em; border:1px solid #ddd;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:61%; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;!--        &amp;quot;Welcome to Open-Transactions&amp;quot;        --&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:100%; border:none; background:none;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; white-space:nowrap; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:162%; border:none; margin:0; padding:.1em; color:#000;&amp;quot;&amp;gt;About the Open-Transactions project.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em; font-size:95%;&amp;quot;&amp;gt;Financial cryptography software.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;articlecount&amp;quot; style=&amp;quot;width:100%; text-align:center; font-size:85%;&amp;quot;&amp;gt;[[Special:Statistics|{{NUMBEROFARTICLES}}]] [[Special:Allpages|articles]].&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; max-width: 550px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What is Open-Transactions?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions is an [[Use Cases|easy-to-use]], financial crypto, [[Sample Cash|digital cash]] and transaction [[List of Classes|library]].&lt;br /&gt;
* Open-Transactions is open-source.&lt;br /&gt;
* Open-Transactions includes a [[API|client API]], a working [[Otserver|server]], a cross-platform [https://github.com/Open-Transactions/Moneychanger GUI] and a [[opentxs|command-line]] wallet utility.&lt;br /&gt;
* Open-Transactions features: a large variety of financial instruments, markets, basket currencies, unforgeable account balances, digital cash, destruction of account history, [http://iang.org/papers/ricardian_contract.html Ricardian contracts], Smart Contracts (scriptable clauses), and more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What does it do?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions allows users to issue and manipulate digital assets.&lt;br /&gt;
* Any issuer can sign and distribute new [[Sample Currency Contract|currency contracts]] in order to create new digital asset types.&lt;br /&gt;
* Users may create many ''pseudonyms'' (public keys), each of which may own ''asset accounts'' of various types, on OT servers.&lt;br /&gt;
* Users can operate '''&amp;amp;quot;cash-only&amp;amp;quot;''' ''(without accounts)'' for maximum anonymity, using '''[[Sample Cash|unlinkable digital cash]]'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Financial Instruments'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Users can transfer digital assets ''securely and provably'', with [[Triple-Signed Receipts|receipts]] signed by all parties.&lt;br /&gt;
* '''Even an OT server cannot change balances, or forge transactions--since it cannot forge your signature on your receipt.'''&lt;br /&gt;
* Open-Transactions supports a range of '''[[Instruments|financial instruments]]''' such as account transfer, '''[[Sample-Cheque|cheques]]''' and vouchers (aka &amp;amp;quot;cashier's cheques&amp;amp;quot; or &amp;amp;quot;banker's cheques&amp;amp;quot;), in addition to cash.&lt;br /&gt;
* These instruments are all analogous to the same financial instruments that we all use at normal banks today. Everyone already has an intuitive understanding of these financial instruments, because we use them regularly in our normal daily lives.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Markets, Basket Currencies, and Smart Contracts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Open-Transactions also implements higher-level, '''contract-based transactions''' such as '''payment plans''' and '''markets with trades'''.&lt;br /&gt;
* The [[Markets|markets]] on Open-Transactions support ''market orders, limit orders, fill-or-kill orders, day orders, stop orders, and stop limits'', just like trading on a real market.&lt;br /&gt;
* '''Basket currencies''' are also supported, as well as payment plans (recurring payments.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc.&lt;br /&gt;
* [[Client-side scripting]]: &amp;lt;code&amp;gt;!/usr/bin/env ot&amp;lt;/code&amp;gt; The entire (mostly) high and low level OT API is available within your scripts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Triple Signed Receipts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* All of this is accomplished in such a way that all parties are able to ''prove'', at all times, ''which transactions have cleared and which instruments are authorized'', '''without having to store their entire transaction history''', but instead by merely keeping the '''last signed receipt'''.&lt;br /&gt;
* Without the special mechanism that makes this possible, ''all parties would otherwise be forced to store all receipts forever''.&lt;br /&gt;
* Nyms and Asset Types have consistent IDs across all OT servers, since the ID is formed by hashing the relevant contract or public key.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Is Open-Transactions [[CENTRALIZED|centralized]]?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* No—quite the opposite. Open-Transactions is highly '''decentralized'''.&lt;br /&gt;
* Typical centralized servers have power over their users, but in OT, '''no server has power over the clients it serves''', because:&lt;br /&gt;
# An OT server does not control user transactions—it merely notarizes them.&lt;br /&gt;
# Anyone can operate an OT server, and users can go to any OT server to notarize transactions. Thus OT servers compete with each other to attract users to use their notary services.&lt;br /&gt;
# Anyone can download an OT client, and use it to execute transactions on any OT server, or any group of OT servers.&lt;br /&gt;
# OT uses triple-signed receipts, so transaction parties have independent cryptographic proof of transactions and balances.&lt;br /&gt;
# OT servers do not store user assets. Rather, cryptocurrencies are stored in voting pools so the server can't steal them.&lt;br /&gt;
&lt;br /&gt;
In every way, '''the user is in control, not the server'''—even when you're using servers you do not trust. These characteristics generate a '''federated''' network architecture—similar to the internet, and it has the same virtues as the internet—openness, decentralization, resilience, censorship-resistance, and user control.&lt;br /&gt;
&lt;br /&gt;
The community behind OT is strongly committed to developing systems that give users full control over their own assets and information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; max-width: 300px; margin: -20px 10px 0 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== White Paper ==&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf OT White Paper]&lt;br /&gt;
 &lt;br /&gt;
== Diagrams ==&lt;br /&gt;
&lt;br /&gt;
[[Voting_Pool_Deposit_Process|Voting Pools]]&lt;br /&gt;
&lt;br /&gt;
[http://i.imgur.com/HTyAJjg.png Architecture Overview (new)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/ot-diagram.jpg Architecture Overview (old)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg Financial Instruments]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Radio Interviews ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=teNzIFu5L70 &amp;quot;Trust No One&amp;quot; Miami Speech]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=234 AgoristRadio Interview, Part 1]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=246 AgoristRadio Interview, Part 2]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=vtJcUM5-TeA Interview with &amp;quot;Let's Talk Bitcoin&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=HSgpStCTw2g Interview with FutureMoneyTrends.com]&lt;br /&gt;
&lt;br /&gt;
== Video Walkthrough ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=5qtTayW-RyM Android demo video (Monetas)]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/Ea6rzq Desktop video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/i0J3AF Desktop video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/8Dxak1 iPhone video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/u6xqHc iPhone video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28141679 java testclient video 1]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28142096 java testclient video 2]&lt;br /&gt;
&lt;br /&gt;
[http://open-transactions.github.io/tv/ Official video archive (more videos)]&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Components and GNU Licensing]]&lt;br /&gt;
&lt;br /&gt;
[[Vulnerabilities|Potential vulnerabilities]] of Open-Transactions&lt;br /&gt;
&lt;br /&gt;
== Related Systems ==&lt;br /&gt;
&lt;br /&gt;
[[Monetas]] - Enterprise platform based on OT.&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
[http://bitcoin.org/ Bitcoin] - A censorship-resistant global ledger&lt;br /&gt;
&lt;br /&gt;
[https://loom.cc/help Loom] - Asset issuance and transactions&lt;br /&gt;
&lt;br /&gt;
[http://www.csee.umbc.edu/~woodcock/cmsc482/proj1/magmoney.html Magic Money] - PGP-based Chaumian blinding (unlinkable cash)&lt;br /&gt;
&lt;br /&gt;
[http://opencoin.org/ OpenCoin.org] - REST-based blinded tokens&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransact.org/ OpenTransact] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://payswarm.com/ PaySwarm] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/publickeytransaction PKTP] - Public-Key Transaction Processor&lt;br /&gt;
&lt;br /&gt;
[http://wiki.dgcmagazine.com/index.php?title=Ricardo Ricardo] - Transaction system by Ian Grigg&lt;br /&gt;
&lt;br /&gt;
[https://ripple.com/ Ripple] - Consensus-based debt ledger&lt;br /&gt;
&lt;br /&gt;
[https://www.stellar.org/ Stellar] - Ripple-based&lt;br /&gt;
&lt;br /&gt;
[http://truledger.com/ Truledger] - Destruction of account history&lt;br /&gt;
&lt;br /&gt;
[http://www.voucher-safe.com/index.cfm Voucher-Safe] - Secure asset issuance with auditing&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
Article: [http://pelagic.wavyhill.xsmail.com/Private_Digital_Economy.html Toward a Private Digital Economy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both; padding-top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In More Detail... ==&lt;br /&gt;
&lt;br /&gt;
The server itself is a [[Transactions|transaction processor]] in the cypherpunk tradition. In more detail:&lt;br /&gt;
&lt;br /&gt;
* Many '''financial instruments''' are supported: Users can write '''cheques''', purchase '''cashier's cheques''' (&amp;amp;quot;vouchers&amp;amp;quot;), and withdraw in '''[[Sample Cash|unlinkable digital cash]]'''. The software uses Chaumian-style, blinded tokens courtesy of the [http://anoncvs.aldigital.co.uk/lucre/ Lucre] library by Ben Laurie.&lt;br /&gt;
* It's like '''PGP FOR MONEY'''. The idea is to have many cash algorithms, not just Lucre. I’d like to add Chaum’s version, Brands’ version, etc. So that, just like PGP, the software should support as many of the top algorithms as possible, and make it easy to swap them out when necessary.&lt;br /&gt;
* User accounts are '''pseudonymous'''. '''A user account is a public key'''. (This is like [http://pktp.co.cc/ PKTP] by Andrew McMeikan.) You can open as many user accounts as you want. ''Full anonymity'' is possible only for &amp;quot;cash-only&amp;quot; transactions (where users only perform token exchanges, and do not open accounts), whereas ''pseudonymity'' means that transactions can be linked to the key that signed them. (While the real life identity of the owner is hidden, continuity of reputation becomes possible.) ''See full-color diagrams linked above''.&lt;br /&gt;
* '''Any user can issue new digital currencies''' and digital asset types, by uploading the new [[Sample Currency Contract|currency contract]] to the server. (This functionality is comparable to [http://www.systemics.com/docs/sox/overview.html Ricardo] by [http://financialcryptography.com/ Ian Grigg].)&lt;br /&gt;
* '''Users can open asset accounts of any type.''' You can have as many as you want, associated with each user account. (See [http://loom.cc/ Loom] by Patrick Chkoreff.)&lt;br /&gt;
* [[Triple-Signed Receipts|Triple Signed Receipts / No Account History]]. On OT, entities are able to conduct transactions, verify instruments, ''and'' provably agree on current holdings via ''signed receipts'', all without the need to store any transaction history.'' An ''asset account'' on OT is not according to the traditional sense of the word (an account normally being thought of as, &amp;quot;a list of transactions, with a balance, used in double-entry bookkeeping.&amp;quot;) While the word &amp;quot;account&amp;quot; makes things easy to understand, an ''asset account'' on OT exists only in the mind of the account holder himself. He simply asks the server to agree with him that it exists, and to provide him with a signed receipt to that effect. In the user interface, OT is able to mimic the ''account metaphor'', making usage intuitive, even though ''no actual account exists, or need be stored on either side, other than the signed receipt itself!'' (See Bill St. Clair's excellent [http://truledger.com/ Truledger] for an [http://truledger.com/doc/plain-english.html example of this concept].)&lt;br /&gt;
* Open Transactions also features '''markets'''. Any two asset types can be traded against each other. The [[markets]] are full-featured and include '''limit orders, stop orders, fill-or-kill, day orders''' (date ranges), and '''stop limits'''.&lt;br /&gt;
* Open Transactions also supports '''basket currencies'''. Users can define their own, and the server handles the process of exchanging in and out of basket accounts. Baskets are treated by the software like any other asset type, (you can open accounts, transfer funds, withdraw cash, write cheques, and even '''trade basket currencies on markets'''.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc. This concept was originated by Nick Szabo: [http://szabo.best.vwh.net/contractlanguage.html smart contracts].&lt;br /&gt;
* [[Client-side scripting]]: The entire OT API is now available for use in OTscripts on the client side. Just remember to put this at the top of the file: &amp;lt;pre&amp;gt;#!/usr/local/bin/ot --script&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Open Transactions also supports '''payment plans'''. Users can sign contracts with each other, and the server will carry out the terms and implement the payment plan. (A future goal is to issue new asset types based on revenue from payment plans--so they can also be traded on markets.)&lt;br /&gt;
* '''Contracts''', in general, are very important to Open Transactions; they are the building block of the entire library. Open Transactions uses a Ricardian-style contract, and all the various instruments, data files, and messages resemble '''[[Sample Currency Contract | PGP-signed XML files]]'''. All objects serialize to a string.&lt;br /&gt;
* The philosophy of the software is based around '''separation of powers''' (issuers and transaction servers being separate entities) as well as the '''distribution of risk'''. For example, Asset accounts can be distributed across multiple servers, and asset types can be distributed across multiple issuers (via baskets.) Read about the [[Auditing]] protocol.&lt;br /&gt;
* Potential future instruments include: [http://www.goldstandardinstitute.net/2010/06/what-is-a-real-bill/ Real Bills], dividend-paying stocks (the same mechanism can be used as interest paying bonds) and collateralized debt obligations. (OT supports payment plans, so it would be easy to group tranches of OT's payment plans to pay into a single reserve account, as backing for a new stock offering that could be traded on OT markets.) This is similar to how basket currencies are implemented. Stocks/Bonds would pay shareholders by dropping a cheque into your stock account's inbox. These features aren't available yet, but they are easy to add given the existing OT infrastructure.&lt;br /&gt;
* '''All communications are secured with OpenSSL.''' All messages are also signed and encrypted. All transactions require signatures from relevant parties including the server.&lt;br /&gt;
* Open Transactions is '''open-source''', written in C++, object-oriented, and includes '''Native [[API]]s''' for '''Java, Ruby, Python, PHP, Perl, C, [http://www.digitalmars.com/d/2.0/overview.html D], C++, Objective-C, C#, Tcl, and LISP.''' (Also supporting JRuby, Jython, Scala, Clojure, Groovy, and any other language that works on the JVM.)&lt;br /&gt;
* The software is fully '''cross-platform''': '''Linux, Mac OS X, FreeBSD, Android, and Windows''' are supported with makefiles, project files, and instructions.&lt;br /&gt;
* STORAGE... The library itself is '''storage neutral''', and could be utilized across a variety of different storage systems. All objects serialize to a string, and it is very easy to add support for new storage methods. (Currently OT uses the filesystem with key/value pairs.) '''Adding a new storage method is as easy as subclassing OTDB::Storage and overriding a few methods. Use any DB you want.'''&lt;br /&gt;
* [[Messaging]]... The library itself is '''transfer-protocol neutral''', and can be utilized across a variety of different transfer protocols. The default implementation uses the [http://zeromq.org/ ZeroMQ library] for transport. Transport is implemented as a callback function, so it's very easy (a few dozen lines of code) to swap in some other system, if you wish.&lt;br /&gt;
* OT currently supports '''MsgPack''' and '''protobuf''' for data packing, though new packers can be added by subclassing OTDB::Packer.&lt;br /&gt;
&lt;br /&gt;
The intention is for this software to be integrated as many places as possible... Games, digital cash wallets, distributed data stores, secure voip apps, anonymous bit torrent networks, mixnets, remailers, nym servers, etc. There are many other potential uses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=About&amp;diff=3188</id>
		<title>About</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=About&amp;diff=3188"/>
		<updated>2015-07-08T22:55:00Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: updated GUI link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;plainlinks&amp;quot;&amp;gt;&lt;br /&gt;
{| id=&amp;quot;mp-topbanner&amp;quot; style=&amp;quot;width:100%; background:#f6f6f6; margin-top:1.2em; border:1px solid #ddd;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:61%; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;!--        &amp;quot;Welcome to Open-Transactions&amp;quot;        --&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:100%; border:none; background:none;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; white-space:nowrap; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:162%; border:none; margin:0; padding:.1em; color:#000;&amp;quot;&amp;gt;About the Open-Transactions project.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em; font-size:95%;&amp;quot;&amp;gt;Financial cryptography software.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;articlecount&amp;quot; style=&amp;quot;width:100%; text-align:center; font-size:85%;&amp;quot;&amp;gt;[[Special:Statistics|{{NUMBEROFARTICLES}}]] [[Special:Allpages|articles]].&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; max-width: 550px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What is Open-Transactions?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions is an [[Use Cases|easy-to-use]], financial crypto, [[Sample Cash|digital cash]] and transaction [[List of Classes|library]].&lt;br /&gt;
* Open-Transactions is open-source.&lt;br /&gt;
* Open-Transactions includes a [[API|client API]], a working [[Otserver|server]], a cross-platform [https://github.com/Open-Transactions/Moneychanger desktop GUI] and a [[opentxs|command-line]] wallet utility.&lt;br /&gt;
* Open-Transactions features: a large variety of financial instruments, markets, basket currencies, unforgeable account balances, digital cash, destruction of account history, [http://iang.org/papers/ricardian_contract.html Ricardian contracts], Smart Contracts (scriptable clauses), and more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What does it do?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions allows users to issue and manipulate digital assets.&lt;br /&gt;
* Any issuer can sign and distribute new [[Sample Currency Contract|currency contracts]] in order to create new digital asset types.&lt;br /&gt;
* Users may create many ''pseudonyms'' (public keys), each of which may own ''asset accounts'' of various types, on OT servers.&lt;br /&gt;
* Users can operate '''&amp;amp;quot;cash-only&amp;amp;quot;''' ''(without accounts)'' for maximum anonymity, using '''[[Sample Cash|unlinkable digital cash]]'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Financial Instruments'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Users can transfer digital assets ''securely and provably'', with [[Triple-Signed Receipts|receipts]] signed by all parties.&lt;br /&gt;
* '''Even an OT server cannot change balances, or forge transactions--since it cannot forge your signature on your receipt.'''&lt;br /&gt;
* Open-Transactions supports a range of '''[[Instruments|financial instruments]]''' such as account transfer, '''[[Sample-Cheque|cheques]]''' and vouchers (aka &amp;amp;quot;cashier's cheques&amp;amp;quot; or &amp;amp;quot;banker's cheques&amp;amp;quot;), in addition to cash.&lt;br /&gt;
* These instruments are all analogous to the same financial instruments that we all use at normal banks today. Everyone already has an intuitive understanding of these financial instruments, because we use them regularly in our normal daily lives.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Markets, Basket Currencies, and Smart Contracts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Open-Transactions also implements higher-level, '''contract-based transactions''' such as '''payment plans''' and '''markets with trades'''.&lt;br /&gt;
* The [[Markets|markets]] on Open-Transactions support ''market orders, limit orders, fill-or-kill orders, day orders, stop orders, and stop limits'', just like trading on a real market.&lt;br /&gt;
* '''Basket currencies''' are also supported, as well as payment plans (recurring payments.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc.&lt;br /&gt;
* [[Client-side scripting]]: &amp;lt;code&amp;gt;!/usr/bin/env ot&amp;lt;/code&amp;gt; The entire (mostly) high and low level OT API is available within your scripts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Triple Signed Receipts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* All of this is accomplished in such a way that all parties are able to ''prove'', at all times, ''which transactions have cleared and which instruments are authorized'', '''without having to store their entire transaction history''', but instead by merely keeping the '''last signed receipt'''.&lt;br /&gt;
* Without the special mechanism that makes this possible, ''all parties would otherwise be forced to store all receipts forever''.&lt;br /&gt;
* Nyms and Asset Types have consistent IDs across all OT servers, since the ID is formed by hashing the relevant contract or public key.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Is Open-Transactions [[CENTRALIZED|centralized]]?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* No—quite the opposite. Open-Transactions is highly '''decentralized'''.&lt;br /&gt;
* Typical centralized servers have power over their users, but in OT, '''no server has power over the clients it serves''', because:&lt;br /&gt;
# An OT server does not control user transactions—it merely notarizes them.&lt;br /&gt;
# Anyone can operate an OT server, and users can go to any OT server to notarize transactions. Thus OT servers compete with each other to attract users to use their notary services.&lt;br /&gt;
# Anyone can download an OT client, and use it to execute transactions on any OT server, or any group of OT servers.&lt;br /&gt;
# OT uses triple-signed receipts, so transaction parties have independent cryptographic proof of transactions and balances.&lt;br /&gt;
# OT servers do not store user assets. Rather, cryptocurrencies are stored in voting pools so the server can't steal them.&lt;br /&gt;
&lt;br /&gt;
In every way, '''the user is in control, not the server'''—even when you're using servers you do not trust. These characteristics generate a '''federated''' network architecture—similar to the internet, and it has the same virtues as the internet—openness, decentralization, resilience, censorship-resistance, and user control.&lt;br /&gt;
&lt;br /&gt;
The community behind OT is strongly committed to developing systems that give users full control over their own assets and information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; max-width: 300px; margin: -20px 10px 0 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== White Paper ==&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf OT White Paper]&lt;br /&gt;
 &lt;br /&gt;
== Diagrams ==&lt;br /&gt;
&lt;br /&gt;
[[Voting_Pool_Deposit_Process|Voting Pools]]&lt;br /&gt;
&lt;br /&gt;
[http://i.imgur.com/HTyAJjg.png Architecture Overview (new)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/ot-diagram.jpg Architecture Overview (old)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg Financial Instruments]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Radio Interviews ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=teNzIFu5L70 &amp;quot;Trust No One&amp;quot; Miami Speech]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=234 AgoristRadio Interview, Part 1]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=246 AgoristRadio Interview, Part 2]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=vtJcUM5-TeA Interview with &amp;quot;Let's Talk Bitcoin&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=HSgpStCTw2g Interview with FutureMoneyTrends.com]&lt;br /&gt;
&lt;br /&gt;
== Video Walkthrough ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=5qtTayW-RyM Android demo video (Monetas)]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/Ea6rzq Desktop video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/i0J3AF Desktop video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/8Dxak1 iPhone video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/u6xqHc iPhone video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28141679 java testclient video 1]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28142096 java testclient video 2]&lt;br /&gt;
&lt;br /&gt;
[http://open-transactions.github.io/tv/ Official video archive (more videos)]&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Components and GNU Licensing]]&lt;br /&gt;
&lt;br /&gt;
[[Vulnerabilities|Potential vulnerabilities]] of Open-Transactions&lt;br /&gt;
&lt;br /&gt;
== Related Systems ==&lt;br /&gt;
&lt;br /&gt;
[[Monetas]] - Enterprise platform based on OT.&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
[http://bitcoin.org/ Bitcoin] - A censorship-resistant global ledger&lt;br /&gt;
&lt;br /&gt;
[https://loom.cc/help Loom] - Asset issuance and transactions&lt;br /&gt;
&lt;br /&gt;
[http://www.csee.umbc.edu/~woodcock/cmsc482/proj1/magmoney.html Magic Money] - PGP-based Chaumian blinding (unlinkable cash)&lt;br /&gt;
&lt;br /&gt;
[http://opencoin.org/ OpenCoin.org] - REST-based blinded tokens&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransact.org/ OpenTransact] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://payswarm.com/ PaySwarm] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/publickeytransaction PKTP] - Public-Key Transaction Processor&lt;br /&gt;
&lt;br /&gt;
[http://wiki.dgcmagazine.com/index.php?title=Ricardo Ricardo] - Transaction system by Ian Grigg&lt;br /&gt;
&lt;br /&gt;
[https://ripple.com/ Ripple] - Consensus-based debt ledger&lt;br /&gt;
&lt;br /&gt;
[https://www.stellar.org/ Stellar] - Ripple-based&lt;br /&gt;
&lt;br /&gt;
[http://truledger.com/ Truledger] - Destruction of account history&lt;br /&gt;
&lt;br /&gt;
[http://www.voucher-safe.com/index.cfm Voucher-Safe] - Secure asset issuance with auditing&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
Article: [http://pelagic.wavyhill.xsmail.com/Private_Digital_Economy.html Toward a Private Digital Economy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both; padding-top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In More Detail... ==&lt;br /&gt;
&lt;br /&gt;
The server itself is a [[Transactions|transaction processor]] in the cypherpunk tradition. In more detail:&lt;br /&gt;
&lt;br /&gt;
* Many '''financial instruments''' are supported: Users can write '''cheques''', purchase '''cashier's cheques''' (&amp;amp;quot;vouchers&amp;amp;quot;), and withdraw in '''[[Sample Cash|unlinkable digital cash]]'''. The software uses Chaumian-style, blinded tokens courtesy of the [http://anoncvs.aldigital.co.uk/lucre/ Lucre] library by Ben Laurie.&lt;br /&gt;
* It's like '''PGP FOR MONEY'''. The idea is to have many cash algorithms, not just Lucre. I’d like to add Chaum’s version, Brands’ version, etc. So that, just like PGP, the software should support as many of the top algorithms as possible, and make it easy to swap them out when necessary.&lt;br /&gt;
* User accounts are '''pseudonymous'''. '''A user account is a public key'''. (This is like [http://pktp.co.cc/ PKTP] by Andrew McMeikan.) You can open as many user accounts as you want. ''Full anonymity'' is possible only for &amp;quot;cash-only&amp;quot; transactions (where users only perform token exchanges, and do not open accounts), whereas ''pseudonymity'' means that transactions can be linked to the key that signed them. (While the real life identity of the owner is hidden, continuity of reputation becomes possible.) ''See full-color diagrams linked above''.&lt;br /&gt;
* '''Any user can issue new digital currencies''' and digital asset types, by uploading the new [[Sample Currency Contract|currency contract]] to the server. (This functionality is comparable to [http://www.systemics.com/docs/sox/overview.html Ricardo] by [http://financialcryptography.com/ Ian Grigg].)&lt;br /&gt;
* '''Users can open asset accounts of any type.''' You can have as many as you want, associated with each user account. (See [http://loom.cc/ Loom] by Patrick Chkoreff.)&lt;br /&gt;
* [[Triple-Signed Receipts|Triple Signed Receipts / No Account History]]. On OT, entities are able to conduct transactions, verify instruments, ''and'' provably agree on current holdings via ''signed receipts'', all without the need to store any transaction history.'' An ''asset account'' on OT is not according to the traditional sense of the word (an account normally being thought of as, &amp;quot;a list of transactions, with a balance, used in double-entry bookkeeping.&amp;quot;) While the word &amp;quot;account&amp;quot; makes things easy to understand, an ''asset account'' on OT exists only in the mind of the account holder himself. He simply asks the server to agree with him that it exists, and to provide him with a signed receipt to that effect. In the user interface, OT is able to mimic the ''account metaphor'', making usage intuitive, even though ''no actual account exists, or need be stored on either side, other than the signed receipt itself!'' (See Bill St. Clair's excellent [http://truledger.com/ Truledger] for an [http://truledger.com/doc/plain-english.html example of this concept].)&lt;br /&gt;
* Open Transactions also features '''markets'''. Any two asset types can be traded against each other. The [[markets]] are full-featured and include '''limit orders, stop orders, fill-or-kill, day orders''' (date ranges), and '''stop limits'''.&lt;br /&gt;
* Open Transactions also supports '''basket currencies'''. Users can define their own, and the server handles the process of exchanging in and out of basket accounts. Baskets are treated by the software like any other asset type, (you can open accounts, transfer funds, withdraw cash, write cheques, and even '''trade basket currencies on markets'''.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc. This concept was originated by Nick Szabo: [http://szabo.best.vwh.net/contractlanguage.html smart contracts].&lt;br /&gt;
* [[Client-side scripting]]: The entire OT API is now available for use in OTscripts on the client side. Just remember to put this at the top of the file: &amp;lt;pre&amp;gt;#!/usr/local/bin/ot --script&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Open Transactions also supports '''payment plans'''. Users can sign contracts with each other, and the server will carry out the terms and implement the payment plan. (A future goal is to issue new asset types based on revenue from payment plans--so they can also be traded on markets.)&lt;br /&gt;
* '''Contracts''', in general, are very important to Open Transactions; they are the building block of the entire library. Open Transactions uses a Ricardian-style contract, and all the various instruments, data files, and messages resemble '''[[Sample Currency Contract | PGP-signed XML files]]'''. All objects serialize to a string.&lt;br /&gt;
* The philosophy of the software is based around '''separation of powers''' (issuers and transaction servers being separate entities) as well as the '''distribution of risk'''. For example, Asset accounts can be distributed across multiple servers, and asset types can be distributed across multiple issuers (via baskets.) Read about the [[Auditing]] protocol.&lt;br /&gt;
* Potential future instruments include: [http://www.goldstandardinstitute.net/2010/06/what-is-a-real-bill/ Real Bills], dividend-paying stocks (the same mechanism can be used as interest paying bonds) and collateralized debt obligations. (OT supports payment plans, so it would be easy to group tranches of OT's payment plans to pay into a single reserve account, as backing for a new stock offering that could be traded on OT markets.) This is similar to how basket currencies are implemented. Stocks/Bonds would pay shareholders by dropping a cheque into your stock account's inbox. These features aren't available yet, but they are easy to add given the existing OT infrastructure.&lt;br /&gt;
* '''All communications are secured with OpenSSL.''' All messages are also signed and encrypted. All transactions require signatures from relevant parties including the server.&lt;br /&gt;
* Open Transactions is '''open-source''', written in C++, object-oriented, and includes '''Native [[API]]s''' for '''Java, Ruby, Python, PHP, Perl, C, [http://www.digitalmars.com/d/2.0/overview.html D], C++, Objective-C, C#, Tcl, and LISP.''' (Also supporting JRuby, Jython, Scala, Clojure, Groovy, and any other language that works on the JVM.)&lt;br /&gt;
* The software is fully '''cross-platform''': '''Linux, Mac OS X, FreeBSD, Android, and Windows''' are supported with makefiles, project files, and instructions.&lt;br /&gt;
* STORAGE... The library itself is '''storage neutral''', and could be utilized across a variety of different storage systems. All objects serialize to a string, and it is very easy to add support for new storage methods. (Currently OT uses the filesystem with key/value pairs.) '''Adding a new storage method is as easy as subclassing OTDB::Storage and overriding a few methods. Use any DB you want.'''&lt;br /&gt;
* [[Messaging]]... The library itself is '''transfer-protocol neutral''', and can be utilized across a variety of different transfer protocols. The default implementation uses the [http://zeromq.org/ ZeroMQ library] for transport. Transport is implemented as a callback function, so it's very easy (a few dozen lines of code) to swap in some other system, if you wish.&lt;br /&gt;
* OT currently supports '''MsgPack''' and '''protobuf''' for data packing, though new packers can be added by subclassing OTDB::Packer.&lt;br /&gt;
&lt;br /&gt;
The intention is for this software to be integrated as many places as possible... Games, digital cash wallets, distributed data stores, secure voip apps, anonymous bit torrent networks, mixnets, remailers, nym servers, etc. There are many other potential uses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=API&amp;diff=3187</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=API&amp;diff=3187"/>
		<updated>2015-07-08T22:53:49Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: slight re-arrangement&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== API Docs ===&lt;br /&gt;
* [https://github.com/Open-Transactions/opentxs/blob/develop/include/opentxs/client/OT_ME.hpp#L116 High-level API (C++)]&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Open-Transactions/opentxs/blob/develop/include/opentxs/client/OTAPI.hpp#L71 Low-level API (C++)]&lt;br /&gt;
&lt;br /&gt;
The above two APIs are wrapped with SWIG, and thus available in [https://github.com/Open-Transactions/opentxs/tree/develop/wrappers many other languages.]&lt;br /&gt;
&lt;br /&gt;
The general rule of thumb is: When coding, always prefer the high-level API. Only use the low-level API for functions where no high-level API version is available. If you are writing software that uses OT, and you need to copy some sample code, just get it from [https://github.com/Open-Transactions/Moneychanger the Moneychanger GUI.]&lt;br /&gt;
&lt;br /&gt;
----------------------&lt;br /&gt;
&lt;br /&gt;
NOTE: This page is old, but preserved in case of any usefulness.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
* See the [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTMadeEasy.h#L159 OTMadeEasy] class, as well as the sample scripts provided in [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/demo/php/php_ot_test.php PHP] [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/demo/python/python_ot_test.py Python] and [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/demo/csharp/Main.cs C-Sharp].&lt;br /&gt;
&lt;br /&gt;
* OT's high-level API is also available in OT [https://github.com/FellowTraveler/Open-Transactions/wiki/Client-side-scripting client-side scripts]&lt;br /&gt;
&lt;br /&gt;
* The '''opentxs list''' and [https://github.com/FellowTraveler/Open-Transactions/wiki/opentxs opentxs help] commands display a complete list of all the OT API functions available on the command line. The actual code for those commands, written using the OT high-level API, [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/ot/ot_commands.ot#L1288 is available here for your perusal]. This way, you can test the complete OT functionality at the command line, and then flip through the actual code for each command, and see how the OT API calls are used. '''You might be surprised how simple they really are.'''&lt;br /&gt;
&lt;br /&gt;
* With that as your guide, a general rule of thumb is this: Anytime you need to do something, use the [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTMadeEasy.h#L159 high-level API] to do it. Only if you can't find the function you are looking for, should you next resort to the [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTAPI_Basic.h#L170 low-level API]. And remember, you can always the copy the code you need from the [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/ot/ot_commands.ot#L1288 opentxs] tool, or from the test GUI, [http://github.com/FellowTraveler/otapij otapiJ].&lt;br /&gt;
&lt;br /&gt;
What does this mean for you? It means you no longer have to worry about synchronizing request numbers, or harvesting transaction numbers, or comparing inbox hashes, or downloading your nymbox, or dropped messages, or timeouts, or retries, etc! Instead, you use simple functions like '''send_transfer''' or '''withdraw_cash'''. The high-level API manages everything else behind the scenes.&lt;br /&gt;
&lt;br /&gt;
The OT high-level API (OTMadeEasy) is now available in these languages: [http://www.chaiscript.com/ ChaiScript] ( [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTMadeEasy.h#L159 ot script] ) and Java, CSharp, PHP, Python, D, Perl, and TCL. The [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTAPI_Basic.h#L170 low-level API] is available in D, Python, PHP, Perl, Java, etc. (Via [http://www.swig.org/ SWIG] wrappers.)&lt;br /&gt;
&lt;br /&gt;
=== USE CASES for the OT API ===&lt;br /&gt;
&lt;br /&gt;
* '''(Client software starts up.)''' Initialize the library and load the wallet.&lt;br /&gt;
* Display for user: '''Server Contracts, Nyms, Accounts, and Asset Types.'''&lt;br /&gt;
* Change the wallet's ''display label'' for any server, asset type, account, or nym.&lt;br /&gt;
* Import a server contract (or asset contract) to the wallet.&lt;br /&gt;
* Create a new '''Pseudonym''' (public/private key pair).&lt;br /&gt;
* Register a public key (a ''&amp;quot;Nym&amp;quot;'') at an OT server.&lt;br /&gt;
* '''Issue a new digital Asset Type'''. (Uploading an asset contract.)&lt;br /&gt;
* Retrieve Currency Contract (by ID).&lt;br /&gt;
* '''Create a new Asset Account'''.&lt;br /&gt;
* '''Write a cheque''' (or invoice)&lt;br /&gt;
* '''Send a Message''' to another user (via the server, encrypted to the recipient's public key.)&lt;br /&gt;
* '''Deposit a cheque'''&lt;br /&gt;
* '''Withdraw cash''' . . . . &amp;lt;==== CHAUMIAN DIGITAL CASH!!&lt;br /&gt;
* '''Deposit cash'''&lt;br /&gt;
* Withdraw Voucher&lt;br /&gt;
* '''Account-to-Account Transfer'''&lt;br /&gt;
* Create a new '''Basket Currency'''&lt;br /&gt;
* '''Exchange''' Digital Assets '''in and out of Baskets''' (from your Asset Accounts)&lt;br /&gt;
* '''Process your Inbox''' (Receipts and pending transfers)&lt;br /&gt;
* Set up a '''Payment Plan'''&lt;br /&gt;
* Issue a '''Market Offer'''&lt;br /&gt;
&lt;br /&gt;
-------&lt;br /&gt;
&lt;br /&gt;
'''Initialize the library and Load your Wallet'''&lt;br /&gt;
&lt;br /&gt;
(The user starts up the wallet software.)&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_Init()'''&lt;br /&gt;
&lt;br /&gt;
Then call '''OT_API_LoadWallet()'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(NOTE: these above 2 steps are not necessary in OT-script, only Java and other languages.)&lt;br /&gt;
&lt;br /&gt;
'''Display the current list of server contracts on the screen'''&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_GetServerCount()''', which returns the number of server contracts in your wallet.&lt;br /&gt;
&lt;br /&gt;
For each one, call '''OT_API_GetServer_ID()''' to get the Server ID (which is a hash of the contract.)&lt;br /&gt;
&lt;br /&gt;
Also for each, call '''OT_API_GetServer_Name()''' to get the Display Name from the contract.&lt;br /&gt;
&lt;br /&gt;
In your GUI, display the name on the screen, but use the ID behind the scenes (for your messages to the server.)&lt;br /&gt;
&lt;br /&gt;
'''Do the same thing for Nyms, Accounts, and Asset Types.'''&lt;br /&gt;
&lt;br /&gt;
You can read about them on the [[API]] page, but here are the basic functions:&lt;br /&gt;
&lt;br /&gt;
OT_API_GetNymCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetServerCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAssetTypeCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetNym_ID() and OT_API_GetNym_Name()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetServer_ID() and OT_API_GetServer_Name()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAssetType_ID() and OT_API_GetAssetType_Name()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountWallet_ID() and OT_API_GetAccountWallet_Name()&lt;br /&gt;
&lt;br /&gt;
Also: &lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountWallet_Balance()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountWallet_Type()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountWallet_AssetTypeID()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Add a new server contract (or asset contract) to the wallet'''&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_AddServerContract()''' &lt;br /&gt;
&lt;br /&gt;
or '''OT_API_AddAssetContract()'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Create a new Pseudonym'''&lt;br /&gt;
&lt;br /&gt;
(Each user's wallet may contain many pseudonyms. Each Nym consists of a public and a private key, aka a &amp;quot;key pair&amp;quot;.)&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_CreateNym()'''&lt;br /&gt;
&lt;br /&gt;
This creates a new key pair _(&amp;quot;Nym&amp;quot;)_ in your wallet, which you can use for communications with an OT server.&lt;br /&gt;
&lt;br /&gt;
(That is, for opening asset accounts and performing various other transactions. A Nym is a &amp;quot;user account&amp;quot;.)&lt;br /&gt;
&lt;br /&gt;
(You can create as many of these pseudonyms as you want.)&lt;br /&gt;
&lt;br /&gt;
(You can register the same nyms at multiple servers.)&lt;br /&gt;
&lt;br /&gt;
(The same Nym will have the same Nym ID and public key on every server.)&lt;br /&gt;
&lt;br /&gt;
Example &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def details_create_nym(nKeybits, strName)&lt;br /&gt;
{&lt;br /&gt;
    var madeEasy = OT_ME()    &lt;br /&gt;
    var strNymID = madeEasy.create_pseudonym(nKeybits, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;)  // returns new Nym ID&lt;br /&gt;
    &lt;br /&gt;
    if (!VerifyStringVal(strNymID))&lt;br /&gt;
    {&lt;br /&gt;
        OT_API_Output(0, &amp;quot;details_create_nym: Failed in OT_ME::create_pseudonym(keybits == &amp;quot; + nKeybits.to_string() + &amp;quot;)\n&amp;quot;)&lt;br /&gt;
        return (0)&lt;br /&gt;
    }&lt;br /&gt;
    OT_API_Output(0, &amp;quot;Success creating! &amp;quot; + nKeybits.to_string() + &amp;quot; keybits, new ID: &amp;quot;) // stderr&lt;br /&gt;
    print(strNymID) // stdout&lt;br /&gt;
    OT_API_Output(0, &amp;quot;\n&amp;quot;) //stderr&lt;br /&gt;
    // -------------------&lt;br /&gt;
    var bSetName = OT_API_SetNym_Name(strNymID, // subject&lt;br /&gt;
                                      strNymID, // signer&lt;br /&gt;
                                      strName)&lt;br /&gt;
    if (!bSetName)&lt;br /&gt;
    {&lt;br /&gt;
        OT_API_Output(0, &amp;quot;Failed in OT_API_SetNym_Name(name == &amp;quot; + strName + &amp;quot;)\n&amp;quot;)&lt;br /&gt;
        return (0)&lt;br /&gt;
    }&lt;br /&gt;
    // -------------------    &lt;br /&gt;
    OT_API_Output(0, &amp;quot;Success setting name to: &amp;quot; + strName + &amp;quot;\n\n&amp;quot;) // stderr&lt;br /&gt;
    return 1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Register a public key (aka &amp;quot;Nym&amp;quot;) at an OT server'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    var madeEasy	= OT_ME()&lt;br /&gt;
    if (VerifyExists(&amp;quot;Server&amp;quot;) &amp;amp;&amp;amp; VerifyExists(&amp;quot;MyNym&amp;quot;))&lt;br /&gt;
    {        &lt;br /&gt;
        var strResponse = madeEasy.register_nym(Server, MyNym)&lt;br /&gt;
        var nSuccess    = VerifyMessageSuccess(strResponse)&lt;br /&gt;
        switch(nSuccess)&lt;br /&gt;
        {&lt;br /&gt;
            case (1)&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;quot;\n\n SUCCESS in register_nym! Server response:\n\n&amp;quot;);&lt;br /&gt;
                print(strResponse) // stdout&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
            default&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;quot;\n\n Failure or Error in register_nym!\n&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                if (VerifyStringVal(strResponse))&lt;br /&gt;
                {&lt;br /&gt;
                    OT_API_Output(0, &amp;quot;Server response:\n\n&amp;quot;);&lt;br /&gt;
                    print(strResponse) // stdout&lt;br /&gt;
                }&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Change the wallet's label for any server/asset type/account/nym'''&lt;br /&gt;
&lt;br /&gt;
(This is only a client-side label, for display purposes only.)&lt;br /&gt;
&lt;br /&gt;
'''OT_API_SetNym_Name()'''&lt;br /&gt;
&lt;br /&gt;
'''OT_API_SetAccountWallet_Name()'''&lt;br /&gt;
&lt;br /&gt;
'''OT_API_SetAssetType_Name()'''&lt;br /&gt;
&lt;br /&gt;
'''OT_API_SetServer_Name()'''&lt;br /&gt;
&lt;br /&gt;
----------------------------&lt;br /&gt;
&lt;br /&gt;
'''Issue a new digital Asset Type'''&lt;br /&gt;
&lt;br /&gt;
User uploads a new currency contract to the server, so users can create asset accounts based on that asset type.&lt;br /&gt;
&lt;br /&gt;
Server replies with a new issuer account ID (The new Issuer account appears inside your wallet's account list, so go ahead and iterate the list again, in order to display the updated list of accounts on the screen.)&lt;br /&gt;
&lt;br /&gt;
High-level API version (in OT script):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        var madeEasy	= OT_ME()&lt;br /&gt;
        OT_API_Output(0, &amp;quot;Please paste a currency contract, followed by an EOF or a ~ by itself on a blank line:\n\n&amp;quot;)&lt;br /&gt;
        var strContract = OT_CLI_ReadUntilEOF() &lt;br /&gt;
        var strResponse	= madeEasy.issue_asset_type(Server, MyNym, strContract)&lt;br /&gt;
        var nStatus     = VerifyMessageSuccess(strResponse)&lt;br /&gt;
        &lt;br /&gt;
        switch(nStatus)&lt;br /&gt;
        {&lt;br /&gt;
            case (1)&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;quot;\n\n SUCCESS in issue_asset! Server response:\n\n&amp;quot;);&lt;br /&gt;
                print(strResponse) // stdout&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
            default&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;quot;\n\n Failure or error in issue_asset. nStatus: &amp;quot;+nStatus.to_string()+&amp;quot;\n&amp;quot;)&lt;br /&gt;
                if (VerifyStringVal(strResponse))&lt;br /&gt;
                {&lt;br /&gt;
                    OT_API_Output(0, &amp;quot;Server response:\n\n&amp;quot;);&lt;br /&gt;
                    print(strResponse) // stdout&lt;br /&gt;
                }&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Retrieve Currency Contract (by ID)'''&lt;br /&gt;
&lt;br /&gt;
User wants to download a currency contract from the server (for a given asset type ID.)&lt;br /&gt;
&lt;br /&gt;
(The asset type ID is a hash of the contract, so OT will know if you get the wrong one, since this is verified whenever a contract is loaded up.)&lt;br /&gt;
&lt;br /&gt;
High-level API version (in OT script):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    var madeEasy	= OT_ME()&lt;br /&gt;
    var strRetrieved   = madeEasy.retrieve_contract(Server, MyNym, strContractID)&lt;br /&gt;
    var nRetrieved     = VerifyMessageSuccess(strRetrieved)    &lt;br /&gt;
    var strSuccess = &amp;quot;ERROR&amp;quot;&lt;br /&gt;
    if (1 == nRetrieved)&lt;br /&gt;
    {   strSuccess = &amp;quot;SUCCESS&amp;quot; }&lt;br /&gt;
    else if (0 == nRetrieved)&lt;br /&gt;
    {   strSuccess = &amp;quot;FAILED&amp;quot; }&lt;br /&gt;
    OT_API_Output(0, &amp;quot;\n\n &amp;quot; + strSuccess + &amp;quot; retrieving contract: &amp;quot;+strContractID+&amp;quot;\n\n&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Create a new Asset Account'''&lt;br /&gt;
&lt;br /&gt;
Example in OT Script, from the &amp;quot;sample scripts&amp;quot;:https://github.com/FellowTraveler/Open-Transactions/tree/master/scripts/samples folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def OT_ME::create_asset_acct(SERVER_ID, NYM_ID, ASSET_TYPE_ID) &lt;br /&gt;
    {&lt;br /&gt;
        var ot_Msg := OTAPI_Func()&lt;br /&gt;
        // -------------------------&lt;br /&gt;
        var theRequest := OTAPI_Func(ot_Msg.CREATE_ASSET_ACCT, SERVER_ID, NYM_ID, ASSET_TYPE_ID)&lt;br /&gt;
        var     strResponse = theRequest.SendRequest(theRequest, &amp;quot;CREATE_ASSET_ACCT&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        return strResponse&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it was a SUCCESS, then refresh the list of accounts in your display (from the OT API) since your new asset account should now be there.&lt;br /&gt;
&lt;br /&gt;
(You can also use the &amp;quot;decode&amp;quot; command in the test wallet anytime you want to base64-decode something.)&lt;br /&gt;
&lt;br /&gt;
--------------------------&lt;br /&gt;
&lt;br /&gt;
'''TRANSACTIONS'''&lt;br /&gt;
&lt;br /&gt;
FYI: Balance agreement, combined with transaction numbers, is what makes it possible for the server and all other parties to _eliminate account history, instead storing only the last signed receipt._ (Of course they have the ''choice'' to keep their own records--but they are no longer ''forced'' to do so.)&lt;br /&gt;
&lt;br /&gt;
In order to do any transaction, the wallet's _balance agreement_ process requires that you have the latest copy of your account, inbox, and outbox files. You don't have to worry about this too much, since the high-level API will usually handle it for you.&lt;br /&gt;
&lt;br /&gt;
'''You might ask: ''&amp;quot;But what if I download my account, or my outbox, and the server has maliciously inserted data into them?&amp;quot;'' '''&lt;br /&gt;
''No problem'' -- Open Transactions stores the last signed receipt from the server, and is able to verify the new intermediary files against that last receipt. You can see this happening when you run the command-line test client, and receipts can be verified programmatically using '''OT_API_VerifyAccountReceipt()'''.  &lt;br /&gt;
&lt;br /&gt;
The [[Triple-Signed Receipts]] on Open Transactions ensure that this sort of protection is available to all parties, '''while simultaneously not having to store any transaction history!'''&lt;br /&gt;
&lt;br /&gt;
------------------&lt;br /&gt;
&lt;br /&gt;
'''Write a Cheque'''&lt;br /&gt;
&lt;br /&gt;
Alice writes a cheque (offline):  Call '''OT_API_WriteCheque()'''&lt;br /&gt;
&lt;br /&gt;
Alice then gives cheque to Bob (offline), _or_ online if she prefers via '''OT_API_sendUserMessage()''' function.&lt;br /&gt;
&lt;br /&gt;
If Alice has Bob's UserID but not his public key, her wallet first uses '''OT_API_checkUser()''' to retrieve his public key from the server, and then encrypts the cheque before sending it.&lt;br /&gt;
&lt;br /&gt;
NOTE: a quality wallet software will keep track of ALL instruments! Even when Alice gives a cheque to Bob, her wallet should still store a copy of that cheque. Until when? Until at least after he has cashed it... when he does that, a chequeReceipt will appear in her inbox. Only when she accepts that receipt, signing a new balance agreement, is she finally free of the transaction number that was on that cheque. (It was still signed-out to her, all the way up until that time.) &lt;br /&gt;
&lt;br /&gt;
WHAT IF Bob had never cashed it? WHAT IF he lost it? Is Alice supposed to just keep signing for that number forever? (The chequeReceipt will never appear in her inbox. She is doomed to continue signing for this number on all of her receipts on into the future, ad infinitum, with no hope of ever closing it out!) &lt;br /&gt;
&lt;br /&gt;
Fear not, there is a solution: '''OT_API_DiscardCheque()'''. (Lucky you saved a copy of that cheque in your wallet, eh?) This function will retrieve Alice's transaction # back from the cheque, so that her wallet is free to use it on her next valid transaction, and then close it out normally.&lt;br /&gt;
&lt;br /&gt;
'''Deposit a cheque'''&lt;br /&gt;
&lt;br /&gt;
(A voucher is also a cheque, so you may deposit a voucher here the same as any other cheque.)&lt;br /&gt;
&lt;br /&gt;
Bob sends message to server requesting deposit: &lt;br /&gt;
&lt;br /&gt;
'''(High level API version, in Java.)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    public boolean depositCheque(String serverID, String nymID, String accountID, String cheque) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In depositCheque serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.DEPOSIT_CHEQUE, serverID, nymID, accountID, cheque);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;DEPOSIT_CHEQUE&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in depositCheque.&amp;quot;);&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // -------------------------------------------------------------------------------------- &lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Withdraw cash'''&lt;br /&gt;
&lt;br /&gt;
Alice's wallet first makes sure she has the latest public mint file, by calling '''OT_API_getMint()'''.&lt;br /&gt;
&lt;br /&gt;
(Note: if the mint she already has is within its valid date range, there's no need to do this.)&lt;br /&gt;
&lt;br /&gt;
(Note: If she does call getMint, Alice needs to check the server reply and make sure it was successful before continuing with the withdrawal. The public mint keys are necessary for cash withdrawal.)&lt;br /&gt;
&lt;br /&gt;
Alice then withdraws from her asset account, by messaging server:  '''OT_API_notarizeWithdrawal()'''&lt;br /&gt;
&lt;br /&gt;
Server replies with chaumian cash, which is stored in the purse folder in local storage.&lt;br /&gt;
&lt;br /&gt;
Here is the full Java implementation of Withdraw Cash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    public boolean withdrawCash(String serverID, String nymID, String accountID, String amount) &lt;br /&gt;
    {&lt;br /&gt;
        String serverResponseMessage = null;&lt;br /&gt;
        System.out.println(&amp;quot;In withdrawCash serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
        String assetID = otapi.OT_API_GetAccountWallet_AssetTypeID(accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------- &lt;br /&gt;
        // Make sure we have the proper asset contract for the withdrawal.&lt;br /&gt;
        //&lt;br /&gt;
        String assetContract = otapi.OT_API_LoadAssetContract(assetID);&lt;br /&gt;
        if (assetContract == null) {&lt;br /&gt;
            OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.GET_CONTRACT, serverID, nymID, assetID);&lt;br /&gt;
            String strResponse = OTAPI_Func.SendRequest(theRequest, &amp;quot;GET_CONTRACT&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (null == strResponse) {&lt;br /&gt;
                System.out.println(&amp;quot;IN withdrawCash: OTAPI_Func.SendRequest(GET_CONTRACT) failed. (I give up.) (Unable to find asset contract.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            assetContract = otapi.OT_API_LoadAssetContract(assetID);&lt;br /&gt;
            if (assetContract == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadAssetContract returned null even after OT_API_getContract (Unable to find asset contract.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        // Download the public mintfile if it's not there, or if it's expired.&lt;br /&gt;
        // Also load it up into memory as a string (just to make sure it works.)&lt;br /&gt;
        // Then we can actually send the withdrawal transaction request. (Until&lt;br /&gt;
        // then, why bother?)&lt;br /&gt;
        //&lt;br /&gt;
        String mintFile;&lt;br /&gt;
&lt;br /&gt;
        // expired or missing.&lt;br /&gt;
        if (1 != otapi.OT_API_Mint_IsStillGood(serverID, assetID)) &lt;br /&gt;
        {&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.GET_MINT, serverID, nymID, assetID);&lt;br /&gt;
            String strResponse = OTAPI_Func.SendRequest(theRequest, &amp;quot;GET_MINT&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (null == strResponse) {&lt;br /&gt;
                System.out.println(&amp;quot;IN withdrawCash: OTAPI_Func.SendRequest(GET_MINT) failed. (I give up.) (Unable to get mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            mintFile = otapi.OT_API_LoadMint(serverID, assetID);&lt;br /&gt;
            if (mintFile == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadMint returned null even after OT_API_getMint (I give up.) (Unable to find mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else // current mint IS available already on local storage (and not expired.)&lt;br /&gt;
        {&lt;br /&gt;
            mintFile = otapi.OT_API_LoadMint(serverID, assetID);&lt;br /&gt;
            if (mintFile == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadMint returned null even after successful OT_API_Mint_IsStillGood (I give up.) (Unable to find mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        // By this point, the mintfile is DEFINITELY good (available, not null, &lt;br /&gt;
        // not expired, and loaded up.) Now we know for a fact that when the API&lt;br /&gt;
        // call is made to withdraw cash, that it will find the mint properly.&lt;br /&gt;
        //&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.WITHDRAW_CASH, serverID, nymID, accountID, amount);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;WITHDRAW_CASH&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in withdrawCash.&amp;quot;);&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // --------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deposit cash'''&lt;br /&gt;
&lt;br /&gt;
Here is the complete Java implementation for Deposit Cash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean depositCash(String serverID, String nymID, String accountID, String purse, boolean isToken) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In depositCash serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID + &amp;quot; isToken:&amp;quot; + isToken);&lt;br /&gt;
        Utility.setOtDepositCash(null);&lt;br /&gt;
        String oldPurse = purse;&lt;br /&gt;
        if (isToken) {&lt;br /&gt;
            purse = getNewPurse(purse, serverID, nymID, accountID);&lt;br /&gt;
            System.out.println(&amp;quot;purse after getting from push purse:&amp;quot; + purse);&lt;br /&gt;
            if (purse == null) {&lt;br /&gt;
                Utility.setOtDepositCash(oldPurse);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // ----------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.DEPOSIT_CASH, serverID, nymID, accountID, purse);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;DEPOSIT_CASH&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;IN depositCash: OTAPI_Func.SendTransaction(() failed. (I give up.) &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (isToken) {&lt;br /&gt;
                System.out.println(&amp;quot;IN depositCash, failed action for single token&amp;quot;);&lt;br /&gt;
                String assetID = otapi.OT_API_GetAccountWallet_AssetTypeID(accountID);&lt;br /&gt;
                boolean importStatus = otapi.OT_API_Wallet_ImportPurse(serverID, assetID, nymID, purse) == 1 ? true : false;&lt;br /&gt;
                System.out.println(&amp;quot;Since failure of depositCashPurse, OT_API_Wallet_ImportPurse called, status of import:&amp;quot; + importStatus);&lt;br /&gt;
                if (!importStatus) {&lt;br /&gt;
                    Utility.setOtDepositCash(purse);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // ----------------------------------------&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Note about local storage: Usually whenever something important is downloaded from the server, the OT API will save it automatically to the default storage context, and you can then load it up using another API call. This is usually the most convenient way to do things.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Account-to-Account Transfer'''&lt;br /&gt;
&lt;br /&gt;
A _pending transfer_ will go into your outbox, and the recipient's inbox, pending acceptance by the recipient.&lt;br /&gt;
&lt;br /&gt;
FYI, every asset account has its own inbox and outbox for handling pending transactions, as well as receipts.&lt;br /&gt;
&lt;br /&gt;
FYI, every Nym similarly has its own Nymbox, used for receiving messages from other users, and for receiving new transaction numbers from the server.&lt;br /&gt;
&lt;br /&gt;
Here is the OT Script implementation of Send Transfer, from the &amp;quot;sample scripts&amp;quot;:https://github.com/FellowTraveler/Open-Transactions/tree/master/scripts/samples folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def OT_ME::send_transfer(SERVER_ID, NYM_ID, ACCT_FROM, ACCT_TO, AMOUNT, NOTE) &lt;br /&gt;
    {&lt;br /&gt;
        var ot_Msg := OTAPI_Func()&lt;br /&gt;
        // -------------------------&lt;br /&gt;
        var theRequest := OTAPI_Func(ot_Msg.SEND_TRANSFER, SERVER_ID, NYM_ID, ACCT_FROM, ACCT_TO, AMOUNT, NOTE)&lt;br /&gt;
        var     strResponse = theRequest.SendTransaction(theRequest, &amp;quot;SEND_TRANSFER&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        return strResponse&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Withdraw Voucher'''&lt;br /&gt;
&lt;br /&gt;
A voucher is like a &amp;quot;money order&amp;quot; or &amp;quot;cashier's cheque&amp;quot;.  It's a cheque, but drawn on a server account, instead of your own account.&lt;br /&gt;
&lt;br /&gt;
Withdrawing in voucher form is similar to withdrawing in cash: the server debits your asset account, and then gives you an official cheque.&lt;br /&gt;
&lt;br /&gt;
But with cash, it's automatically saved to your purse, whereas with a voucher, you have to read the voucher out of the server reply, and display it on the screen!&lt;br /&gt;
&lt;br /&gt;
Here is the complete Java code to perform Withdraw Voucher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String withdrawVoucher(String serverID, String nymID, String accountID, String amount, String chequeMemo, String recepientNymID) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In withdrawVoucher serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.WITHDRAW_VOUCHER, serverID, nymID, accountID, recepientNymID, chequeMemo, amount);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;WITHDRAW_VOUCHER&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in withdrawVoucher.&amp;quot;);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        String ledger = otapi.OT_API_Message_GetLedger(strResponse);&lt;br /&gt;
        if (ledger == null) {&lt;br /&gt;
            System.out.println(&amp;quot; ledger is null, returned by OT_API_Message_GetLedger, serverResponseMessage passed as argument&amp;quot;);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        String transaction = otapi.OT_API_Ledger_GetTransactionByIndex(serverID, nymID, accountID, ledger, 0);&lt;br /&gt;
        if (transaction == null) {&lt;br /&gt;
            System.out.println(&amp;quot;withdrawVoucher: transaction is null, returned by OT_API_Ledger_GetTransactionByIndex, argument passed, index 0 and ledger :&amp;quot; + ledger);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        String output = otapi.OT_API_Transaction_GetVoucher(serverID, nymID, accountID, transaction);&lt;br /&gt;
        System.out.println(&amp;quot;output returned by OT_API_Transaction_GetVoucher:&amp;quot; + output);&lt;br /&gt;
&lt;br /&gt;
        return output;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
&lt;br /&gt;
'''BASKET CURRENCIES'''&lt;br /&gt;
&lt;br /&gt;
'''Create a new Basket Currency'''&lt;br /&gt;
&lt;br /&gt;
First, invent the basket in your head. Give it name: _&amp;quot;Clams.&amp;quot;_&lt;br /&gt;
&lt;br /&gt;
Next, give it a ratio in terms of other existing currencies:  _&amp;quot;10 Clams equals a basket of 5 dollars, 3 Euro, and 20 Bitcoin&amp;quot;_&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_GenerateBasketCreation()''' to begin creating the basket. The _&amp;quot;10 Clams&amp;quot;_ from above is set here.&lt;br /&gt;
&lt;br /&gt;
Next, call '''OT_API_AddBasketCreationItem()''' for EACH currency in the basket. In the above example, I would call this function 3 times, in order to set the _&amp;quot;5 dollars&amp;quot;_ the _&amp;quot;3 Euro&amp;quot;_ and the _&amp;quot;20 Bitcoin&amp;quot;_ from above.&lt;br /&gt;
&lt;br /&gt;
Now that the basket has been defined, call '''OT_API_issueBasket()''' to actually create the basket currency on the server.&lt;br /&gt;
&lt;br /&gt;
(Now you have created a new asset type--a basket--which the server will control. Any user may now create accounts using this type!  And from there, they can write cheques, withdraw cash, trade on markets, etc. the same as with any other asset type.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exchange Digital Assets in/out of a Basket Currency (from your Asset Accounts)'''&lt;br /&gt;
&lt;br /&gt;
First, call '''OT_API_GenerateBasketExchange()''' to setup the exchange. You'll need to know the basket's asset type, and you'll need to have an existing asset account of that type. You will also set the &amp;quot;transfer multiple&amp;quot; in that call. &lt;br /&gt;
&lt;br /&gt;
What's the transfer multiple? Remember the ratio above: &amp;quot;10 Clams equals a basket of 5 dollars, 3 Euro, and 20 Bitcoin&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Here are examples of the transfer multiple:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;10 Clams ==    5 USD,   3 EUR,   20 BIT&amp;quot; (Transfer multiple: 1)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;20 Clams ==  10 USD,   6 EUR,   40 BIT&amp;quot; (Transfer multiple: 2)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;30 Clams ==  15 USD,   9 EUR,   60 BIT&amp;quot; (Transfer multiple: 3)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;40 Clams ==  20 USD, 12 EUR,   80 BIT&amp;quot; (Transfer multiple: 4)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;50 Clams ==  25 USD, 15 EUR, 100 BIT&amp;quot; (Transfer multiple: 5)&lt;br /&gt;
&lt;br /&gt;
Next, call '''OT_API_AddBasketExchangeItem()''' for each currency type in the basket. You will need to to pass the asset account ID for an existing asset account, for each currency type (since you are converting in or out, from your basket account, to your asset accounts.)&lt;br /&gt;
&lt;br /&gt;
Therefore you will call this function once for USD, once for EUR, and once for BIT, in that example, passing in your USD asset acct ID, your EUR asset acct ID, and your Bitcoin asset account ID.&lt;br /&gt;
&lt;br /&gt;
Now that it's all set up, call '''OT_API_exchangeBasket()''' to actually message the server and perform the exchange.&lt;br /&gt;
&lt;br /&gt;
'''Interesting''': ''basket currencies themselves require no more additional system resources than normal currencies!'' The magic happens during the exchange process. The server simply stores internal asset accounts for the dollars, euros, and bitcoins (say), and it manages the issuer account for the basket, and it also manages the exchanging in and out, by moving digital assets in or out of the internal backing accounts.  After that point, a basket is just another Asset Type ID, and requires no additional resources.  You can even have baskets made up of other baskets, nested 10 times, and it won't affect the speed of operation of the server!&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''PROCESSING YOUR INBOX'''&lt;br /&gt;
&lt;br /&gt;
'''Process the Receipts and Pending Transfers in your Inbox'''&lt;br /&gt;
&lt;br /&gt;
If you wish, call '''OT_API_getInbox()''' to grab the latest inbox from the server. &lt;br /&gt;
&lt;br /&gt;
In the high-level API, this is often just automated for you, but nevertheless, check out the dl_acct_files.ot script. See also show_inbox.ot, etc.&lt;br /&gt;
 &lt;br /&gt;
 During this time, your user has the opportunity to peruse the inbox, and to decide which transactions therein he wishes to accept or reject. Usually the inbox is display on the screen, then the user selects various items to accept or reject, and then the user clicks &amp;quot;Process Inbox&amp;quot; and then you do this:&lt;br /&gt;
 &lt;br /&gt;
Then call '''OT_API_Ledger_CreateResponse()''' in order to create a 'response' ledger for that inbox, which will be sent to the server to signal your responses to the various inbox transactions.&lt;br /&gt;
&lt;br /&gt;
Then call '''OT_API_Ledger_GetCount()''' (pass it the inbox) to find out how many transactions are inside of it.  Use that count to LOOP through them...&lt;br /&gt;
&lt;br /&gt;
Use '''OT_API_Ledger_GetTransactionByIndex()''' to grab each transaction as you iterate through the inbox. (There are various introspection functions you can use in the API here if you wish to display the inbox items on the screen for the user...) &lt;br /&gt;
&lt;br /&gt;
Next call '''OT_API_Transaction_CreateResponse()''' for each transaction in the inbox, to create a response to it, accepting or rejecting it. This function creates the response and adds it to the response ledger.&lt;br /&gt;
&lt;br /&gt;
Next, call '''OT_API_Ledger_FinalizeResponse()''' which will create a _Balance Agreement_ for the ledger.&lt;br /&gt;
&lt;br /&gt;
Finally, call '''OT_API_processInbox()''' to send your message to the server and process the various items.&lt;br /&gt;
&lt;br /&gt;
(See the accept_inbox.ot script.)&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use '''OT_API_Message_GetBalanceAgreementSuccess()''' and '''OT_API_Message_GetTransactionSuccess()''' to see just _how_ successful.&lt;br /&gt;
&lt;br /&gt;
---------------------------------&lt;br /&gt;
&lt;br /&gt;
'''MARKETS and PAYMENT PLANS'''&lt;br /&gt;
&lt;br /&gt;
'''Setup a Payment Plan'''&lt;br /&gt;
&lt;br /&gt;
The Merchant draws up the Payment Plan using '''OT_API_ProposePaymentPlan'''&lt;br /&gt;
&lt;br /&gt;
Then he sends it to the Customer, who calls '''OT_API_ConfirmPaymentPlan'''&lt;br /&gt;
&lt;br /&gt;
The Customer's wallet activates the payment plan by sending it to the server using this function: '''OT_API_depositPaymentPlan()'''&lt;br /&gt;
&lt;br /&gt;
(Receipts will process into the respective parties' inboxes.)&lt;br /&gt;
&lt;br /&gt;
Use OT_API_cancelCronItem() to cancel any payment plan (or market offer.)&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use '''OT_API_Message_GetBalanceAgreementSuccess()''' and '''OT_API_Message_GetTransactionSuccess()''' as described above in the _deposit cash_ instructions.&lt;br /&gt;
&lt;br /&gt;
'''Issue a [[Markets|Market]] Offer'''&lt;br /&gt;
&lt;br /&gt;
Call this function: '''OT_API_issueMarketOffer()'''&lt;br /&gt;
&lt;br /&gt;
(That's the low-level one. See create_offer.ot script for the high-level version.)&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_Message_GetSuccess''' to find out if the message was a SUCCESS or FAILURE.&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use '''OT_API_Message_GetBalanceAgreementSuccess()''' and '''OT_API_Message_GetTransactionSuccess()''' as described above in the _deposit cash_ instructions.&lt;br /&gt;
See the OTScript and Java versions of these calls.&lt;br /&gt;
&lt;br /&gt;
Once an offer goes onto the market, multiple trades may occur between it and the other offers on the market.&lt;br /&gt;
&lt;br /&gt;
(According to the rules in the offers.) Receipts will process into the respective parties' inboxes after each trade.&lt;br /&gt;
&lt;br /&gt;
'''Cancel a Market Offer'''&lt;br /&gt;
&lt;br /&gt;
Use '''OT_API_cancelNymMarketOffer''' to remove an offer from a market.&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use '''OT_API_Message_GetBalanceAgreementSuccess()''' and '''OT_API_Message_GetTransactionSuccess()'''&lt;br /&gt;
&lt;br /&gt;
'''Retrieving Market Data from OT Server:'''&lt;br /&gt;
&lt;br /&gt;
'''OT_API_getMarketList''' retrieves a list of all the markets available on a specific server, and details for each market. If the server call is a success, the data will be retrieved from the OT server, and written to local storage using the OT Storage API, at this path or key (inside your data_folder location): '''markets/SERVER_ID/market_data.bin'''&lt;br /&gt;
&lt;br /&gt;
If you want to verify whether the data is now available in local storage (after a successful call to getMarketList), your code would look like this: &lt;br /&gt;
&lt;br /&gt;
'''if (otapi.Exists(&amp;quot;markets&amp;quot;, serverID, &amp;quot;market_data.bin&amp;quot;)) bFoundFile = true;'''&lt;br /&gt;
&lt;br /&gt;
Here is some Java code that reads the market list object from local storage, assuming bFoundFile is true:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	MarketList marketList = null;&lt;br /&gt;
	Storable storable = null;&lt;br /&gt;
&lt;br /&gt;
	if (otapi.Exists(&amp;quot;markets&amp;quot;, serverID, &amp;quot;market_data.bin&amp;quot;)) &lt;br /&gt;
	{&lt;br /&gt;
		storable =&lt;br /&gt;
			otapi.QueryObject(StoredObjectType.STORED_OBJ_MARKET_LIST,&lt;br /&gt;
				&amp;quot;markets&amp;quot;, serverID, &amp;quot;market_data.bin&amp;quot;);&lt;br /&gt;
		if (storable==null)&lt;br /&gt;
			return null;&lt;br /&gt;
            marketList = MarketList.ot_dynamic_cast(storable);&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have the market list, here is some sample Java code to read the details of an individual market from that list:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static Object getMarketDetails(String marketID)&lt;br /&gt;
{&lt;br /&gt;
	MarketList marketList = Utility.getMarketList();&lt;br /&gt;
&lt;br /&gt;
	if (marketList == null) &lt;br /&gt;
	{&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for (int i=0; i &amp;lt; marketList.GetMarketDataCount(); i++)&lt;br /&gt;
	{&lt;br /&gt;
		MarketData marketData = marketList.GetMarketData(i);&lt;br /&gt;
&lt;br /&gt;
		if (marketData == null)&lt;br /&gt;
			continue;&lt;br /&gt;
&lt;br /&gt;
		String [] row = new String[2];&lt;br /&gt;
&lt;br /&gt;
		if (marketID.equals(marketData.getMarket_id())) &lt;br /&gt;
		{&lt;br /&gt;
			String[] data = new String[2];&lt;br /&gt;
			marketData.getLast_sale_price();&lt;br /&gt;
			marketData.getCurrent_ask();&lt;br /&gt;
			&lt;br /&gt;
			// Etc!! This is where you get the market details.&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// return custom object here (row/data or whatever), or null if failure..&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OT_API_getMarketOffers''' retrieves publicly-available info for all offers on a specific market, up until maximum depth, and saves the data here: '''markets/SERVER_ID/offers/MARKET_ID.bin'''&lt;br /&gt;
&lt;br /&gt;
(See testwallet/OTAPI.i for ALL DATA OBJECTS that are used in local storage, including market offers, recent trades, etc. See the code above for a sample on how those data objects are used.)&lt;br /&gt;
&lt;br /&gt;
'''OT_API_getMarketRecentTrades''': Retrieves all recent trades on a market (up until maximum depth), and stores them here: '''markets/SERVER_ID/recent/MARKET_ID.bin'''&lt;br /&gt;
&lt;br /&gt;
To retrieve the offers that a specific Nym has out on the market, use: '''OT_API_getNym_MarketOffers'''&lt;br /&gt;
&lt;br /&gt;
This _getNym_MarketOffers_ data is _private_ and thus a lot more detailed than what's retrieved via '''OT_API_Market_GetOffers''', which is more meant for public use. &lt;br /&gt;
&lt;br /&gt;
After a successful retrieval, you can load the data from this location: '''nyms/SERVER_ID/offers/NYM_ID.bin'''&lt;br /&gt;
&lt;br /&gt;
If you want to see the Nym's private list of his ''completed trades'', the path to load it from is here:&lt;br /&gt;
&lt;br /&gt;
'''nyms/trades/SERVER_ID/NYM_ID'''&lt;br /&gt;
&lt;br /&gt;
There is no need to send a server message in this last case--just read the data from local storage directly. (When market trading receipts are accepted and cleared out of your inbox, this is where they will go. So there's no need to download them, since they were already downloaded through your inbox previously.)&lt;br /&gt;
&lt;br /&gt;
As before, the appropriate data object can be found in testwallet/OTAPI.i along with all the others.&lt;br /&gt;
&lt;br /&gt;
----------------------&lt;br /&gt;
&lt;br /&gt;
I will be very responsive to developer needs and questions regarding the OT API, so I encourage you to play with the software and contact me anytime.&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
&lt;br /&gt;
[[Opentxs | opentxs command-line tool]]&lt;br /&gt;
&lt;br /&gt;
[[List of Classes | The OT C++ class library]]&lt;br /&gt;
&lt;br /&gt;
[[OTX | The OTX protocol]]&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=API&amp;diff=3186</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=API&amp;diff=3186"/>
		<updated>2015-07-08T22:50:54Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: /* API Docs */ updated links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NOTE: This page is old, but preserved in case of any usefulness. [http://github.com/Open-Transactions/Moneychanger Moneychanger] is the reference implementation and it shows how to use the OT client API. If you ever need to write code that uses OT, just copy the sample code you need out of Moneychanger itself. It's that easy!&lt;br /&gt;
&lt;br /&gt;
=== API Docs ===&lt;br /&gt;
* [https://github.com/Open-Transactions/opentxs/blob/develop/include/opentxs/client/OT_ME.hpp#L116 High-level API (C++)]&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Open-Transactions/opentxs/blob/develop/include/opentxs/client/OTAPI.hpp#L71 Low-level API (C++)]&lt;br /&gt;
&lt;br /&gt;
The above two APIs are wrapped with SWIG, and thus available in many other languages.&lt;br /&gt;
&lt;br /&gt;
The general rule of thumb is: When coding, always prefer the high-level API. Only use the low-level API for functions where no high-level API version is available.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
* See the [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTMadeEasy.h#L159 OTMadeEasy] class, as well as the sample scripts provided in [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/demo/php/php_ot_test.php PHP] [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/demo/python/python_ot_test.py Python] and [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/demo/csharp/Main.cs C-Sharp].&lt;br /&gt;
&lt;br /&gt;
* OT's high-level API is also available in OT [https://github.com/FellowTraveler/Open-Transactions/wiki/Client-side-scripting client-side scripts]&lt;br /&gt;
&lt;br /&gt;
* The '''opentxs list''' and [https://github.com/FellowTraveler/Open-Transactions/wiki/opentxs opentxs help] commands display a complete list of all the OT API functions available on the command line. The actual code for those commands, written using the OT high-level API, [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/ot/ot_commands.ot#L1288 is available here for your perusal]. This way, you can test the complete OT functionality at the command line, and then flip through the actual code for each command, and see how the OT API calls are used. '''You might be surprised how simple they really are.'''&lt;br /&gt;
&lt;br /&gt;
* With that as your guide, a general rule of thumb is this: Anytime you need to do something, use the [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTMadeEasy.h#L159 high-level API] to do it. Only if you can't find the function you are looking for, should you next resort to the [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTAPI_Basic.h#L170 low-level API]. And remember, you can always the copy the code you need from the [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/ot/ot_commands.ot#L1288 opentxs] tool, or from the test GUI, [http://github.com/FellowTraveler/otapij otapiJ].&lt;br /&gt;
&lt;br /&gt;
What does this mean for you? It means you no longer have to worry about synchronizing request numbers, or harvesting transaction numbers, or comparing inbox hashes, or downloading your nymbox, or dropped messages, or timeouts, or retries, etc! Instead, you use simple functions like '''send_transfer''' or '''withdraw_cash'''. The high-level API manages everything else behind the scenes.&lt;br /&gt;
&lt;br /&gt;
The OT high-level API (OTMadeEasy) is now available in these languages: [http://www.chaiscript.com/ ChaiScript] ( [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTMadeEasy.h#L159 ot script] ) and Java, CSharp, PHP, Python, D, Perl, and TCL. The [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTAPI_Basic.h#L170 low-level API] is available in D, Python, PHP, Perl, Java, etc. (Via [http://www.swig.org/ SWIG] wrappers.)&lt;br /&gt;
&lt;br /&gt;
=== USE CASES for the OT API ===&lt;br /&gt;
&lt;br /&gt;
* '''(Client software starts up.)''' Initialize the library and load the wallet.&lt;br /&gt;
* Display for user: '''Server Contracts, Nyms, Accounts, and Asset Types.'''&lt;br /&gt;
* Change the wallet's ''display label'' for any server, asset type, account, or nym.&lt;br /&gt;
* Import a server contract (or asset contract) to the wallet.&lt;br /&gt;
* Create a new '''Pseudonym''' (public/private key pair).&lt;br /&gt;
* Register a public key (a ''&amp;quot;Nym&amp;quot;'') at an OT server.&lt;br /&gt;
* '''Issue a new digital Asset Type'''. (Uploading an asset contract.)&lt;br /&gt;
* Retrieve Currency Contract (by ID).&lt;br /&gt;
* '''Create a new Asset Account'''.&lt;br /&gt;
* '''Write a cheque''' (or invoice)&lt;br /&gt;
* '''Send a Message''' to another user (via the server, encrypted to the recipient's public key.)&lt;br /&gt;
* '''Deposit a cheque'''&lt;br /&gt;
* '''Withdraw cash''' . . . . &amp;lt;==== CHAUMIAN DIGITAL CASH!!&lt;br /&gt;
* '''Deposit cash'''&lt;br /&gt;
* Withdraw Voucher&lt;br /&gt;
* '''Account-to-Account Transfer'''&lt;br /&gt;
* Create a new '''Basket Currency'''&lt;br /&gt;
* '''Exchange''' Digital Assets '''in and out of Baskets''' (from your Asset Accounts)&lt;br /&gt;
* '''Process your Inbox''' (Receipts and pending transfers)&lt;br /&gt;
* Set up a '''Payment Plan'''&lt;br /&gt;
* Issue a '''Market Offer'''&lt;br /&gt;
&lt;br /&gt;
-------&lt;br /&gt;
&lt;br /&gt;
'''Initialize the library and Load your Wallet'''&lt;br /&gt;
&lt;br /&gt;
(The user starts up the wallet software.)&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_Init()'''&lt;br /&gt;
&lt;br /&gt;
Then call '''OT_API_LoadWallet()'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(NOTE: these above 2 steps are not necessary in OT-script, only Java and other languages.)&lt;br /&gt;
&lt;br /&gt;
'''Display the current list of server contracts on the screen'''&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_GetServerCount()''', which returns the number of server contracts in your wallet.&lt;br /&gt;
&lt;br /&gt;
For each one, call '''OT_API_GetServer_ID()''' to get the Server ID (which is a hash of the contract.)&lt;br /&gt;
&lt;br /&gt;
Also for each, call '''OT_API_GetServer_Name()''' to get the Display Name from the contract.&lt;br /&gt;
&lt;br /&gt;
In your GUI, display the name on the screen, but use the ID behind the scenes (for your messages to the server.)&lt;br /&gt;
&lt;br /&gt;
'''Do the same thing for Nyms, Accounts, and Asset Types.'''&lt;br /&gt;
&lt;br /&gt;
You can read about them on the [[API]] page, but here are the basic functions:&lt;br /&gt;
&lt;br /&gt;
OT_API_GetNymCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetServerCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAssetTypeCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetNym_ID() and OT_API_GetNym_Name()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetServer_ID() and OT_API_GetServer_Name()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAssetType_ID() and OT_API_GetAssetType_Name()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountWallet_ID() and OT_API_GetAccountWallet_Name()&lt;br /&gt;
&lt;br /&gt;
Also: &lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountWallet_Balance()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountWallet_Type()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountWallet_AssetTypeID()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Add a new server contract (or asset contract) to the wallet'''&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_AddServerContract()''' &lt;br /&gt;
&lt;br /&gt;
or '''OT_API_AddAssetContract()'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Create a new Pseudonym'''&lt;br /&gt;
&lt;br /&gt;
(Each user's wallet may contain many pseudonyms. Each Nym consists of a public and a private key, aka a &amp;quot;key pair&amp;quot;.)&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_CreateNym()'''&lt;br /&gt;
&lt;br /&gt;
This creates a new key pair _(&amp;quot;Nym&amp;quot;)_ in your wallet, which you can use for communications with an OT server.&lt;br /&gt;
&lt;br /&gt;
(That is, for opening asset accounts and performing various other transactions. A Nym is a &amp;quot;user account&amp;quot;.)&lt;br /&gt;
&lt;br /&gt;
(You can create as many of these pseudonyms as you want.)&lt;br /&gt;
&lt;br /&gt;
(You can register the same nyms at multiple servers.)&lt;br /&gt;
&lt;br /&gt;
(The same Nym will have the same Nym ID and public key on every server.)&lt;br /&gt;
&lt;br /&gt;
Example &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def details_create_nym(nKeybits, strName)&lt;br /&gt;
{&lt;br /&gt;
    var madeEasy = OT_ME()    &lt;br /&gt;
    var strNymID = madeEasy.create_pseudonym(nKeybits, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;)  // returns new Nym ID&lt;br /&gt;
    &lt;br /&gt;
    if (!VerifyStringVal(strNymID))&lt;br /&gt;
    {&lt;br /&gt;
        OT_API_Output(0, &amp;quot;details_create_nym: Failed in OT_ME::create_pseudonym(keybits == &amp;quot; + nKeybits.to_string() + &amp;quot;)\n&amp;quot;)&lt;br /&gt;
        return (0)&lt;br /&gt;
    }&lt;br /&gt;
    OT_API_Output(0, &amp;quot;Success creating! &amp;quot; + nKeybits.to_string() + &amp;quot; keybits, new ID: &amp;quot;) // stderr&lt;br /&gt;
    print(strNymID) // stdout&lt;br /&gt;
    OT_API_Output(0, &amp;quot;\n&amp;quot;) //stderr&lt;br /&gt;
    // -------------------&lt;br /&gt;
    var bSetName = OT_API_SetNym_Name(strNymID, // subject&lt;br /&gt;
                                      strNymID, // signer&lt;br /&gt;
                                      strName)&lt;br /&gt;
    if (!bSetName)&lt;br /&gt;
    {&lt;br /&gt;
        OT_API_Output(0, &amp;quot;Failed in OT_API_SetNym_Name(name == &amp;quot; + strName + &amp;quot;)\n&amp;quot;)&lt;br /&gt;
        return (0)&lt;br /&gt;
    }&lt;br /&gt;
    // -------------------    &lt;br /&gt;
    OT_API_Output(0, &amp;quot;Success setting name to: &amp;quot; + strName + &amp;quot;\n\n&amp;quot;) // stderr&lt;br /&gt;
    return 1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Register a public key (aka &amp;quot;Nym&amp;quot;) at an OT server'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    var madeEasy	= OT_ME()&lt;br /&gt;
    if (VerifyExists(&amp;quot;Server&amp;quot;) &amp;amp;&amp;amp; VerifyExists(&amp;quot;MyNym&amp;quot;))&lt;br /&gt;
    {        &lt;br /&gt;
        var strResponse = madeEasy.register_nym(Server, MyNym)&lt;br /&gt;
        var nSuccess    = VerifyMessageSuccess(strResponse)&lt;br /&gt;
        switch(nSuccess)&lt;br /&gt;
        {&lt;br /&gt;
            case (1)&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;quot;\n\n SUCCESS in register_nym! Server response:\n\n&amp;quot;);&lt;br /&gt;
                print(strResponse) // stdout&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
            default&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;quot;\n\n Failure or Error in register_nym!\n&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                if (VerifyStringVal(strResponse))&lt;br /&gt;
                {&lt;br /&gt;
                    OT_API_Output(0, &amp;quot;Server response:\n\n&amp;quot;);&lt;br /&gt;
                    print(strResponse) // stdout&lt;br /&gt;
                }&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Change the wallet's label for any server/asset type/account/nym'''&lt;br /&gt;
&lt;br /&gt;
(This is only a client-side label, for display purposes only.)&lt;br /&gt;
&lt;br /&gt;
'''OT_API_SetNym_Name()'''&lt;br /&gt;
&lt;br /&gt;
'''OT_API_SetAccountWallet_Name()'''&lt;br /&gt;
&lt;br /&gt;
'''OT_API_SetAssetType_Name()'''&lt;br /&gt;
&lt;br /&gt;
'''OT_API_SetServer_Name()'''&lt;br /&gt;
&lt;br /&gt;
----------------------------&lt;br /&gt;
&lt;br /&gt;
'''Issue a new digital Asset Type'''&lt;br /&gt;
&lt;br /&gt;
User uploads a new currency contract to the server, so users can create asset accounts based on that asset type.&lt;br /&gt;
&lt;br /&gt;
Server replies with a new issuer account ID (The new Issuer account appears inside your wallet's account list, so go ahead and iterate the list again, in order to display the updated list of accounts on the screen.)&lt;br /&gt;
&lt;br /&gt;
High-level API version (in OT script):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        var madeEasy	= OT_ME()&lt;br /&gt;
        OT_API_Output(0, &amp;quot;Please paste a currency contract, followed by an EOF or a ~ by itself on a blank line:\n\n&amp;quot;)&lt;br /&gt;
        var strContract = OT_CLI_ReadUntilEOF() &lt;br /&gt;
        var strResponse	= madeEasy.issue_asset_type(Server, MyNym, strContract)&lt;br /&gt;
        var nStatus     = VerifyMessageSuccess(strResponse)&lt;br /&gt;
        &lt;br /&gt;
        switch(nStatus)&lt;br /&gt;
        {&lt;br /&gt;
            case (1)&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;quot;\n\n SUCCESS in issue_asset! Server response:\n\n&amp;quot;);&lt;br /&gt;
                print(strResponse) // stdout&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
            default&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;quot;\n\n Failure or error in issue_asset. nStatus: &amp;quot;+nStatus.to_string()+&amp;quot;\n&amp;quot;)&lt;br /&gt;
                if (VerifyStringVal(strResponse))&lt;br /&gt;
                {&lt;br /&gt;
                    OT_API_Output(0, &amp;quot;Server response:\n\n&amp;quot;);&lt;br /&gt;
                    print(strResponse) // stdout&lt;br /&gt;
                }&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Retrieve Currency Contract (by ID)'''&lt;br /&gt;
&lt;br /&gt;
User wants to download a currency contract from the server (for a given asset type ID.)&lt;br /&gt;
&lt;br /&gt;
(The asset type ID is a hash of the contract, so OT will know if you get the wrong one, since this is verified whenever a contract is loaded up.)&lt;br /&gt;
&lt;br /&gt;
High-level API version (in OT script):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    var madeEasy	= OT_ME()&lt;br /&gt;
    var strRetrieved   = madeEasy.retrieve_contract(Server, MyNym, strContractID)&lt;br /&gt;
    var nRetrieved     = VerifyMessageSuccess(strRetrieved)    &lt;br /&gt;
    var strSuccess = &amp;quot;ERROR&amp;quot;&lt;br /&gt;
    if (1 == nRetrieved)&lt;br /&gt;
    {   strSuccess = &amp;quot;SUCCESS&amp;quot; }&lt;br /&gt;
    else if (0 == nRetrieved)&lt;br /&gt;
    {   strSuccess = &amp;quot;FAILED&amp;quot; }&lt;br /&gt;
    OT_API_Output(0, &amp;quot;\n\n &amp;quot; + strSuccess + &amp;quot; retrieving contract: &amp;quot;+strContractID+&amp;quot;\n\n&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Create a new Asset Account'''&lt;br /&gt;
&lt;br /&gt;
Example in OT Script, from the &amp;quot;sample scripts&amp;quot;:https://github.com/FellowTraveler/Open-Transactions/tree/master/scripts/samples folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def OT_ME::create_asset_acct(SERVER_ID, NYM_ID, ASSET_TYPE_ID) &lt;br /&gt;
    {&lt;br /&gt;
        var ot_Msg := OTAPI_Func()&lt;br /&gt;
        // -------------------------&lt;br /&gt;
        var theRequest := OTAPI_Func(ot_Msg.CREATE_ASSET_ACCT, SERVER_ID, NYM_ID, ASSET_TYPE_ID)&lt;br /&gt;
        var     strResponse = theRequest.SendRequest(theRequest, &amp;quot;CREATE_ASSET_ACCT&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        return strResponse&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it was a SUCCESS, then refresh the list of accounts in your display (from the OT API) since your new asset account should now be there.&lt;br /&gt;
&lt;br /&gt;
(You can also use the &amp;quot;decode&amp;quot; command in the test wallet anytime you want to base64-decode something.)&lt;br /&gt;
&lt;br /&gt;
--------------------------&lt;br /&gt;
&lt;br /&gt;
'''TRANSACTIONS'''&lt;br /&gt;
&lt;br /&gt;
FYI: Balance agreement, combined with transaction numbers, is what makes it possible for the server and all other parties to _eliminate account history, instead storing only the last signed receipt._ (Of course they have the ''choice'' to keep their own records--but they are no longer ''forced'' to do so.)&lt;br /&gt;
&lt;br /&gt;
In order to do any transaction, the wallet's _balance agreement_ process requires that you have the latest copy of your account, inbox, and outbox files. You don't have to worry about this too much, since the high-level API will usually handle it for you.&lt;br /&gt;
&lt;br /&gt;
'''You might ask: ''&amp;quot;But what if I download my account, or my outbox, and the server has maliciously inserted data into them?&amp;quot;'' '''&lt;br /&gt;
''No problem'' -- Open Transactions stores the last signed receipt from the server, and is able to verify the new intermediary files against that last receipt. You can see this happening when you run the command-line test client, and receipts can be verified programmatically using '''OT_API_VerifyAccountReceipt()'''.  &lt;br /&gt;
&lt;br /&gt;
The [[Triple-Signed Receipts]] on Open Transactions ensure that this sort of protection is available to all parties, '''while simultaneously not having to store any transaction history!'''&lt;br /&gt;
&lt;br /&gt;
------------------&lt;br /&gt;
&lt;br /&gt;
'''Write a Cheque'''&lt;br /&gt;
&lt;br /&gt;
Alice writes a cheque (offline):  Call '''OT_API_WriteCheque()'''&lt;br /&gt;
&lt;br /&gt;
Alice then gives cheque to Bob (offline), _or_ online if she prefers via '''OT_API_sendUserMessage()''' function.&lt;br /&gt;
&lt;br /&gt;
If Alice has Bob's UserID but not his public key, her wallet first uses '''OT_API_checkUser()''' to retrieve his public key from the server, and then encrypts the cheque before sending it.&lt;br /&gt;
&lt;br /&gt;
NOTE: a quality wallet software will keep track of ALL instruments! Even when Alice gives a cheque to Bob, her wallet should still store a copy of that cheque. Until when? Until at least after he has cashed it... when he does that, a chequeReceipt will appear in her inbox. Only when she accepts that receipt, signing a new balance agreement, is she finally free of the transaction number that was on that cheque. (It was still signed-out to her, all the way up until that time.) &lt;br /&gt;
&lt;br /&gt;
WHAT IF Bob had never cashed it? WHAT IF he lost it? Is Alice supposed to just keep signing for that number forever? (The chequeReceipt will never appear in her inbox. She is doomed to continue signing for this number on all of her receipts on into the future, ad infinitum, with no hope of ever closing it out!) &lt;br /&gt;
&lt;br /&gt;
Fear not, there is a solution: '''OT_API_DiscardCheque()'''. (Lucky you saved a copy of that cheque in your wallet, eh?) This function will retrieve Alice's transaction # back from the cheque, so that her wallet is free to use it on her next valid transaction, and then close it out normally.&lt;br /&gt;
&lt;br /&gt;
'''Deposit a cheque'''&lt;br /&gt;
&lt;br /&gt;
(A voucher is also a cheque, so you may deposit a voucher here the same as any other cheque.)&lt;br /&gt;
&lt;br /&gt;
Bob sends message to server requesting deposit: &lt;br /&gt;
&lt;br /&gt;
'''(High level API version, in Java.)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    public boolean depositCheque(String serverID, String nymID, String accountID, String cheque) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In depositCheque serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.DEPOSIT_CHEQUE, serverID, nymID, accountID, cheque);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;DEPOSIT_CHEQUE&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in depositCheque.&amp;quot;);&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // -------------------------------------------------------------------------------------- &lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Withdraw cash'''&lt;br /&gt;
&lt;br /&gt;
Alice's wallet first makes sure she has the latest public mint file, by calling '''OT_API_getMint()'''.&lt;br /&gt;
&lt;br /&gt;
(Note: if the mint she already has is within its valid date range, there's no need to do this.)&lt;br /&gt;
&lt;br /&gt;
(Note: If she does call getMint, Alice needs to check the server reply and make sure it was successful before continuing with the withdrawal. The public mint keys are necessary for cash withdrawal.)&lt;br /&gt;
&lt;br /&gt;
Alice then withdraws from her asset account, by messaging server:  '''OT_API_notarizeWithdrawal()'''&lt;br /&gt;
&lt;br /&gt;
Server replies with chaumian cash, which is stored in the purse folder in local storage.&lt;br /&gt;
&lt;br /&gt;
Here is the full Java implementation of Withdraw Cash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    public boolean withdrawCash(String serverID, String nymID, String accountID, String amount) &lt;br /&gt;
    {&lt;br /&gt;
        String serverResponseMessage = null;&lt;br /&gt;
        System.out.println(&amp;quot;In withdrawCash serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
        String assetID = otapi.OT_API_GetAccountWallet_AssetTypeID(accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------- &lt;br /&gt;
        // Make sure we have the proper asset contract for the withdrawal.&lt;br /&gt;
        //&lt;br /&gt;
        String assetContract = otapi.OT_API_LoadAssetContract(assetID);&lt;br /&gt;
        if (assetContract == null) {&lt;br /&gt;
            OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.GET_CONTRACT, serverID, nymID, assetID);&lt;br /&gt;
            String strResponse = OTAPI_Func.SendRequest(theRequest, &amp;quot;GET_CONTRACT&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (null == strResponse) {&lt;br /&gt;
                System.out.println(&amp;quot;IN withdrawCash: OTAPI_Func.SendRequest(GET_CONTRACT) failed. (I give up.) (Unable to find asset contract.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            assetContract = otapi.OT_API_LoadAssetContract(assetID);&lt;br /&gt;
            if (assetContract == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadAssetContract returned null even after OT_API_getContract (Unable to find asset contract.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        // Download the public mintfile if it's not there, or if it's expired.&lt;br /&gt;
        // Also load it up into memory as a string (just to make sure it works.)&lt;br /&gt;
        // Then we can actually send the withdrawal transaction request. (Until&lt;br /&gt;
        // then, why bother?)&lt;br /&gt;
        //&lt;br /&gt;
        String mintFile;&lt;br /&gt;
&lt;br /&gt;
        // expired or missing.&lt;br /&gt;
        if (1 != otapi.OT_API_Mint_IsStillGood(serverID, assetID)) &lt;br /&gt;
        {&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.GET_MINT, serverID, nymID, assetID);&lt;br /&gt;
            String strResponse = OTAPI_Func.SendRequest(theRequest, &amp;quot;GET_MINT&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (null == strResponse) {&lt;br /&gt;
                System.out.println(&amp;quot;IN withdrawCash: OTAPI_Func.SendRequest(GET_MINT) failed. (I give up.) (Unable to get mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            mintFile = otapi.OT_API_LoadMint(serverID, assetID);&lt;br /&gt;
            if (mintFile == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadMint returned null even after OT_API_getMint (I give up.) (Unable to find mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else // current mint IS available already on local storage (and not expired.)&lt;br /&gt;
        {&lt;br /&gt;
            mintFile = otapi.OT_API_LoadMint(serverID, assetID);&lt;br /&gt;
            if (mintFile == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadMint returned null even after successful OT_API_Mint_IsStillGood (I give up.) (Unable to find mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        // By this point, the mintfile is DEFINITELY good (available, not null, &lt;br /&gt;
        // not expired, and loaded up.) Now we know for a fact that when the API&lt;br /&gt;
        // call is made to withdraw cash, that it will find the mint properly.&lt;br /&gt;
        //&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.WITHDRAW_CASH, serverID, nymID, accountID, amount);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;WITHDRAW_CASH&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in withdrawCash.&amp;quot;);&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // --------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deposit cash'''&lt;br /&gt;
&lt;br /&gt;
Here is the complete Java implementation for Deposit Cash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean depositCash(String serverID, String nymID, String accountID, String purse, boolean isToken) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In depositCash serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID + &amp;quot; isToken:&amp;quot; + isToken);&lt;br /&gt;
        Utility.setOtDepositCash(null);&lt;br /&gt;
        String oldPurse = purse;&lt;br /&gt;
        if (isToken) {&lt;br /&gt;
            purse = getNewPurse(purse, serverID, nymID, accountID);&lt;br /&gt;
            System.out.println(&amp;quot;purse after getting from push purse:&amp;quot; + purse);&lt;br /&gt;
            if (purse == null) {&lt;br /&gt;
                Utility.setOtDepositCash(oldPurse);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // ----------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.DEPOSIT_CASH, serverID, nymID, accountID, purse);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;DEPOSIT_CASH&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;IN depositCash: OTAPI_Func.SendTransaction(() failed. (I give up.) &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (isToken) {&lt;br /&gt;
                System.out.println(&amp;quot;IN depositCash, failed action for single token&amp;quot;);&lt;br /&gt;
                String assetID = otapi.OT_API_GetAccountWallet_AssetTypeID(accountID);&lt;br /&gt;
                boolean importStatus = otapi.OT_API_Wallet_ImportPurse(serverID, assetID, nymID, purse) == 1 ? true : false;&lt;br /&gt;
                System.out.println(&amp;quot;Since failure of depositCashPurse, OT_API_Wallet_ImportPurse called, status of import:&amp;quot; + importStatus);&lt;br /&gt;
                if (!importStatus) {&lt;br /&gt;
                    Utility.setOtDepositCash(purse);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // ----------------------------------------&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Note about local storage: Usually whenever something important is downloaded from the server, the OT API will save it automatically to the default storage context, and you can then load it up using another API call. This is usually the most convenient way to do things.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Account-to-Account Transfer'''&lt;br /&gt;
&lt;br /&gt;
A _pending transfer_ will go into your outbox, and the recipient's inbox, pending acceptance by the recipient.&lt;br /&gt;
&lt;br /&gt;
FYI, every asset account has its own inbox and outbox for handling pending transactions, as well as receipts.&lt;br /&gt;
&lt;br /&gt;
FYI, every Nym similarly has its own Nymbox, used for receiving messages from other users, and for receiving new transaction numbers from the server.&lt;br /&gt;
&lt;br /&gt;
Here is the OT Script implementation of Send Transfer, from the &amp;quot;sample scripts&amp;quot;:https://github.com/FellowTraveler/Open-Transactions/tree/master/scripts/samples folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def OT_ME::send_transfer(SERVER_ID, NYM_ID, ACCT_FROM, ACCT_TO, AMOUNT, NOTE) &lt;br /&gt;
    {&lt;br /&gt;
        var ot_Msg := OTAPI_Func()&lt;br /&gt;
        // -------------------------&lt;br /&gt;
        var theRequest := OTAPI_Func(ot_Msg.SEND_TRANSFER, SERVER_ID, NYM_ID, ACCT_FROM, ACCT_TO, AMOUNT, NOTE)&lt;br /&gt;
        var     strResponse = theRequest.SendTransaction(theRequest, &amp;quot;SEND_TRANSFER&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        return strResponse&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Withdraw Voucher'''&lt;br /&gt;
&lt;br /&gt;
A voucher is like a &amp;quot;money order&amp;quot; or &amp;quot;cashier's cheque&amp;quot;.  It's a cheque, but drawn on a server account, instead of your own account.&lt;br /&gt;
&lt;br /&gt;
Withdrawing in voucher form is similar to withdrawing in cash: the server debits your asset account, and then gives you an official cheque.&lt;br /&gt;
&lt;br /&gt;
But with cash, it's automatically saved to your purse, whereas with a voucher, you have to read the voucher out of the server reply, and display it on the screen!&lt;br /&gt;
&lt;br /&gt;
Here is the complete Java code to perform Withdraw Voucher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String withdrawVoucher(String serverID, String nymID, String accountID, String amount, String chequeMemo, String recepientNymID) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In withdrawVoucher serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.WITHDRAW_VOUCHER, serverID, nymID, accountID, recepientNymID, chequeMemo, amount);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;WITHDRAW_VOUCHER&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in withdrawVoucher.&amp;quot;);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        String ledger = otapi.OT_API_Message_GetLedger(strResponse);&lt;br /&gt;
        if (ledger == null) {&lt;br /&gt;
            System.out.println(&amp;quot; ledger is null, returned by OT_API_Message_GetLedger, serverResponseMessage passed as argument&amp;quot;);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        String transaction = otapi.OT_API_Ledger_GetTransactionByIndex(serverID, nymID, accountID, ledger, 0);&lt;br /&gt;
        if (transaction == null) {&lt;br /&gt;
            System.out.println(&amp;quot;withdrawVoucher: transaction is null, returned by OT_API_Ledger_GetTransactionByIndex, argument passed, index 0 and ledger :&amp;quot; + ledger);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        String output = otapi.OT_API_Transaction_GetVoucher(serverID, nymID, accountID, transaction);&lt;br /&gt;
        System.out.println(&amp;quot;output returned by OT_API_Transaction_GetVoucher:&amp;quot; + output);&lt;br /&gt;
&lt;br /&gt;
        return output;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
&lt;br /&gt;
'''BASKET CURRENCIES'''&lt;br /&gt;
&lt;br /&gt;
'''Create a new Basket Currency'''&lt;br /&gt;
&lt;br /&gt;
First, invent the basket in your head. Give it name: _&amp;quot;Clams.&amp;quot;_&lt;br /&gt;
&lt;br /&gt;
Next, give it a ratio in terms of other existing currencies:  _&amp;quot;10 Clams equals a basket of 5 dollars, 3 Euro, and 20 Bitcoin&amp;quot;_&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_GenerateBasketCreation()''' to begin creating the basket. The _&amp;quot;10 Clams&amp;quot;_ from above is set here.&lt;br /&gt;
&lt;br /&gt;
Next, call '''OT_API_AddBasketCreationItem()''' for EACH currency in the basket. In the above example, I would call this function 3 times, in order to set the _&amp;quot;5 dollars&amp;quot;_ the _&amp;quot;3 Euro&amp;quot;_ and the _&amp;quot;20 Bitcoin&amp;quot;_ from above.&lt;br /&gt;
&lt;br /&gt;
Now that the basket has been defined, call '''OT_API_issueBasket()''' to actually create the basket currency on the server.&lt;br /&gt;
&lt;br /&gt;
(Now you have created a new asset type--a basket--which the server will control. Any user may now create accounts using this type!  And from there, they can write cheques, withdraw cash, trade on markets, etc. the same as with any other asset type.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exchange Digital Assets in/out of a Basket Currency (from your Asset Accounts)'''&lt;br /&gt;
&lt;br /&gt;
First, call '''OT_API_GenerateBasketExchange()''' to setup the exchange. You'll need to know the basket's asset type, and you'll need to have an existing asset account of that type. You will also set the &amp;quot;transfer multiple&amp;quot; in that call. &lt;br /&gt;
&lt;br /&gt;
What's the transfer multiple? Remember the ratio above: &amp;quot;10 Clams equals a basket of 5 dollars, 3 Euro, and 20 Bitcoin&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Here are examples of the transfer multiple:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;10 Clams ==    5 USD,   3 EUR,   20 BIT&amp;quot; (Transfer multiple: 1)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;20 Clams ==  10 USD,   6 EUR,   40 BIT&amp;quot; (Transfer multiple: 2)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;30 Clams ==  15 USD,   9 EUR,   60 BIT&amp;quot; (Transfer multiple: 3)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;40 Clams ==  20 USD, 12 EUR,   80 BIT&amp;quot; (Transfer multiple: 4)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;50 Clams ==  25 USD, 15 EUR, 100 BIT&amp;quot; (Transfer multiple: 5)&lt;br /&gt;
&lt;br /&gt;
Next, call '''OT_API_AddBasketExchangeItem()''' for each currency type in the basket. You will need to to pass the asset account ID for an existing asset account, for each currency type (since you are converting in or out, from your basket account, to your asset accounts.)&lt;br /&gt;
&lt;br /&gt;
Therefore you will call this function once for USD, once for EUR, and once for BIT, in that example, passing in your USD asset acct ID, your EUR asset acct ID, and your Bitcoin asset account ID.&lt;br /&gt;
&lt;br /&gt;
Now that it's all set up, call '''OT_API_exchangeBasket()''' to actually message the server and perform the exchange.&lt;br /&gt;
&lt;br /&gt;
'''Interesting''': ''basket currencies themselves require no more additional system resources than normal currencies!'' The magic happens during the exchange process. The server simply stores internal asset accounts for the dollars, euros, and bitcoins (say), and it manages the issuer account for the basket, and it also manages the exchanging in and out, by moving digital assets in or out of the internal backing accounts.  After that point, a basket is just another Asset Type ID, and requires no additional resources.  You can even have baskets made up of other baskets, nested 10 times, and it won't affect the speed of operation of the server!&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''PROCESSING YOUR INBOX'''&lt;br /&gt;
&lt;br /&gt;
'''Process the Receipts and Pending Transfers in your Inbox'''&lt;br /&gt;
&lt;br /&gt;
If you wish, call '''OT_API_getInbox()''' to grab the latest inbox from the server. &lt;br /&gt;
&lt;br /&gt;
In the high-level API, this is often just automated for you, but nevertheless, check out the dl_acct_files.ot script. See also show_inbox.ot, etc.&lt;br /&gt;
 &lt;br /&gt;
 During this time, your user has the opportunity to peruse the inbox, and to decide which transactions therein he wishes to accept or reject. Usually the inbox is display on the screen, then the user selects various items to accept or reject, and then the user clicks &amp;quot;Process Inbox&amp;quot; and then you do this:&lt;br /&gt;
 &lt;br /&gt;
Then call '''OT_API_Ledger_CreateResponse()''' in order to create a 'response' ledger for that inbox, which will be sent to the server to signal your responses to the various inbox transactions.&lt;br /&gt;
&lt;br /&gt;
Then call '''OT_API_Ledger_GetCount()''' (pass it the inbox) to find out how many transactions are inside of it.  Use that count to LOOP through them...&lt;br /&gt;
&lt;br /&gt;
Use '''OT_API_Ledger_GetTransactionByIndex()''' to grab each transaction as you iterate through the inbox. (There are various introspection functions you can use in the API here if you wish to display the inbox items on the screen for the user...) &lt;br /&gt;
&lt;br /&gt;
Next call '''OT_API_Transaction_CreateResponse()''' for each transaction in the inbox, to create a response to it, accepting or rejecting it. This function creates the response and adds it to the response ledger.&lt;br /&gt;
&lt;br /&gt;
Next, call '''OT_API_Ledger_FinalizeResponse()''' which will create a _Balance Agreement_ for the ledger.&lt;br /&gt;
&lt;br /&gt;
Finally, call '''OT_API_processInbox()''' to send your message to the server and process the various items.&lt;br /&gt;
&lt;br /&gt;
(See the accept_inbox.ot script.)&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use '''OT_API_Message_GetBalanceAgreementSuccess()''' and '''OT_API_Message_GetTransactionSuccess()''' to see just _how_ successful.&lt;br /&gt;
&lt;br /&gt;
---------------------------------&lt;br /&gt;
&lt;br /&gt;
'''MARKETS and PAYMENT PLANS'''&lt;br /&gt;
&lt;br /&gt;
'''Setup a Payment Plan'''&lt;br /&gt;
&lt;br /&gt;
The Merchant draws up the Payment Plan using '''OT_API_ProposePaymentPlan'''&lt;br /&gt;
&lt;br /&gt;
Then he sends it to the Customer, who calls '''OT_API_ConfirmPaymentPlan'''&lt;br /&gt;
&lt;br /&gt;
The Customer's wallet activates the payment plan by sending it to the server using this function: '''OT_API_depositPaymentPlan()'''&lt;br /&gt;
&lt;br /&gt;
(Receipts will process into the respective parties' inboxes.)&lt;br /&gt;
&lt;br /&gt;
Use OT_API_cancelCronItem() to cancel any payment plan (or market offer.)&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use '''OT_API_Message_GetBalanceAgreementSuccess()''' and '''OT_API_Message_GetTransactionSuccess()''' as described above in the _deposit cash_ instructions.&lt;br /&gt;
&lt;br /&gt;
'''Issue a [[Markets|Market]] Offer'''&lt;br /&gt;
&lt;br /&gt;
Call this function: '''OT_API_issueMarketOffer()'''&lt;br /&gt;
&lt;br /&gt;
(That's the low-level one. See create_offer.ot script for the high-level version.)&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_Message_GetSuccess''' to find out if the message was a SUCCESS or FAILURE.&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use '''OT_API_Message_GetBalanceAgreementSuccess()''' and '''OT_API_Message_GetTransactionSuccess()''' as described above in the _deposit cash_ instructions.&lt;br /&gt;
See the OTScript and Java versions of these calls.&lt;br /&gt;
&lt;br /&gt;
Once an offer goes onto the market, multiple trades may occur between it and the other offers on the market.&lt;br /&gt;
&lt;br /&gt;
(According to the rules in the offers.) Receipts will process into the respective parties' inboxes after each trade.&lt;br /&gt;
&lt;br /&gt;
'''Cancel a Market Offer'''&lt;br /&gt;
&lt;br /&gt;
Use '''OT_API_cancelNymMarketOffer''' to remove an offer from a market.&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use '''OT_API_Message_GetBalanceAgreementSuccess()''' and '''OT_API_Message_GetTransactionSuccess()'''&lt;br /&gt;
&lt;br /&gt;
'''Retrieving Market Data from OT Server:'''&lt;br /&gt;
&lt;br /&gt;
'''OT_API_getMarketList''' retrieves a list of all the markets available on a specific server, and details for each market. If the server call is a success, the data will be retrieved from the OT server, and written to local storage using the OT Storage API, at this path or key (inside your data_folder location): '''markets/SERVER_ID/market_data.bin'''&lt;br /&gt;
&lt;br /&gt;
If you want to verify whether the data is now available in local storage (after a successful call to getMarketList), your code would look like this: &lt;br /&gt;
&lt;br /&gt;
'''if (otapi.Exists(&amp;quot;markets&amp;quot;, serverID, &amp;quot;market_data.bin&amp;quot;)) bFoundFile = true;'''&lt;br /&gt;
&lt;br /&gt;
Here is some Java code that reads the market list object from local storage, assuming bFoundFile is true:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	MarketList marketList = null;&lt;br /&gt;
	Storable storable = null;&lt;br /&gt;
&lt;br /&gt;
	if (otapi.Exists(&amp;quot;markets&amp;quot;, serverID, &amp;quot;market_data.bin&amp;quot;)) &lt;br /&gt;
	{&lt;br /&gt;
		storable =&lt;br /&gt;
			otapi.QueryObject(StoredObjectType.STORED_OBJ_MARKET_LIST,&lt;br /&gt;
				&amp;quot;markets&amp;quot;, serverID, &amp;quot;market_data.bin&amp;quot;);&lt;br /&gt;
		if (storable==null)&lt;br /&gt;
			return null;&lt;br /&gt;
            marketList = MarketList.ot_dynamic_cast(storable);&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have the market list, here is some sample Java code to read the details of an individual market from that list:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static Object getMarketDetails(String marketID)&lt;br /&gt;
{&lt;br /&gt;
	MarketList marketList = Utility.getMarketList();&lt;br /&gt;
&lt;br /&gt;
	if (marketList == null) &lt;br /&gt;
	{&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for (int i=0; i &amp;lt; marketList.GetMarketDataCount(); i++)&lt;br /&gt;
	{&lt;br /&gt;
		MarketData marketData = marketList.GetMarketData(i);&lt;br /&gt;
&lt;br /&gt;
		if (marketData == null)&lt;br /&gt;
			continue;&lt;br /&gt;
&lt;br /&gt;
		String [] row = new String[2];&lt;br /&gt;
&lt;br /&gt;
		if (marketID.equals(marketData.getMarket_id())) &lt;br /&gt;
		{&lt;br /&gt;
			String[] data = new String[2];&lt;br /&gt;
			marketData.getLast_sale_price();&lt;br /&gt;
			marketData.getCurrent_ask();&lt;br /&gt;
			&lt;br /&gt;
			// Etc!! This is where you get the market details.&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// return custom object here (row/data or whatever), or null if failure..&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OT_API_getMarketOffers''' retrieves publicly-available info for all offers on a specific market, up until maximum depth, and saves the data here: '''markets/SERVER_ID/offers/MARKET_ID.bin'''&lt;br /&gt;
&lt;br /&gt;
(See testwallet/OTAPI.i for ALL DATA OBJECTS that are used in local storage, including market offers, recent trades, etc. See the code above for a sample on how those data objects are used.)&lt;br /&gt;
&lt;br /&gt;
'''OT_API_getMarketRecentTrades''': Retrieves all recent trades on a market (up until maximum depth), and stores them here: '''markets/SERVER_ID/recent/MARKET_ID.bin'''&lt;br /&gt;
&lt;br /&gt;
To retrieve the offers that a specific Nym has out on the market, use: '''OT_API_getNym_MarketOffers'''&lt;br /&gt;
&lt;br /&gt;
This _getNym_MarketOffers_ data is _private_ and thus a lot more detailed than what's retrieved via '''OT_API_Market_GetOffers''', which is more meant for public use. &lt;br /&gt;
&lt;br /&gt;
After a successful retrieval, you can load the data from this location: '''nyms/SERVER_ID/offers/NYM_ID.bin'''&lt;br /&gt;
&lt;br /&gt;
If you want to see the Nym's private list of his ''completed trades'', the path to load it from is here:&lt;br /&gt;
&lt;br /&gt;
'''nyms/trades/SERVER_ID/NYM_ID'''&lt;br /&gt;
&lt;br /&gt;
There is no need to send a server message in this last case--just read the data from local storage directly. (When market trading receipts are accepted and cleared out of your inbox, this is where they will go. So there's no need to download them, since they were already downloaded through your inbox previously.)&lt;br /&gt;
&lt;br /&gt;
As before, the appropriate data object can be found in testwallet/OTAPI.i along with all the others.&lt;br /&gt;
&lt;br /&gt;
----------------------&lt;br /&gt;
&lt;br /&gt;
I will be very responsive to developer needs and questions regarding the OT API, so I encourage you to play with the software and contact me anytime.&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
&lt;br /&gt;
[[Opentxs | opentxs command-line tool]]&lt;br /&gt;
&lt;br /&gt;
[[List of Classes | The OT C++ class library]]&lt;br /&gt;
&lt;br /&gt;
[[OTX | The OTX protocol]]&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Use_Cases&amp;diff=3185</id>
		<title>Use Cases</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Use_Cases&amp;diff=3185"/>
		<updated>2015-07-08T22:47:03Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: removed bold&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anytime you need to do something, use the high-level API to do it (OT_ME.) Only if you can't find the function you are looking for, should you next resort to the low-level API (OTAPI.) And remember, you can always the copy the code you need from the test GUI, [http://github.com/Open-Transactions/Moneychanger Moneychanger].&lt;br /&gt;
&lt;br /&gt;
What does this mean for you? It means you no longer have to worry about synchronizing request numbers, or harvesting transaction numbers, or comparing inbox hashes, or downloading your nymbox, or dropped messages, or timeouts, or retries, etc! Instead, you use simple functions like '''send_transfer''' or '''withdraw_cash.''' The high-level API manages everything else behind the scenes. And any sample code you need can be copied right out of Moneychanger's code.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
NOTE: The below notes are old, but preserved for usefulness.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''USE CASES for the OT API, described on this page:'''&lt;br /&gt;
&lt;br /&gt;
* '''(Client software starts up.)''' Initialize the library and load the wallet.&lt;br /&gt;
* Display for user: '''Server Contracts, Nyms, Accounts, and Asset Types.'''&lt;br /&gt;
* Change the wallet's ''display label'' for any server, asset type, account, or nym.&lt;br /&gt;
* Import a server contract (or asset contract) to the wallet.&lt;br /&gt;
* Create a new '''Pseudonym''' (public/private key pair).&lt;br /&gt;
* Register a public key (a ''&amp;amp;quot;Nym&amp;amp;quot;'') at an OT server.&lt;br /&gt;
* '''Issue a new digital Asset Type'''. (Uploading an asset contract.)&lt;br /&gt;
* Retrieve Currency Contract (by ID).&lt;br /&gt;
* '''Create a new Asset Account'''.&lt;br /&gt;
* '''Write a cheque''' (or invoice)&lt;br /&gt;
* '''Send a Message''' to another user (via the server, encrypted to the recipient's public key.)&lt;br /&gt;
* '''Deposit a cheque'''&lt;br /&gt;
* '''Withdraw cash''' . . . . &amp;amp;lt;==== CHAUMIAN DIGITAL CASH!!&lt;br /&gt;
* '''Deposit cash'''&lt;br /&gt;
* Withdraw Voucher&lt;br /&gt;
* '''Account-to-Account Transfer'''&lt;br /&gt;
* Create a new '''Basket Currency'''&lt;br /&gt;
* '''Exchange''' Digital Assets '''in and out of Baskets''' (from your Asset Accounts)&lt;br /&gt;
* '''Process your Inbox''' (Receipts and pending transfers)&lt;br /&gt;
* Set up a '''Payment Plan'''&lt;br /&gt;
* Issue a '''Market Offer'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''USE CASES for the OT API'''&lt;br /&gt;
&lt;br /&gt;
'''Initialize the library and Load your Wallet'''&lt;br /&gt;
(The user starts up the wallet software.) &lt;br /&gt;
Call &amp;lt;code&amp;gt;OT_API_Init()&amp;lt;/code&amp;gt; Then call &amp;lt;code&amp;gt;OT_API_LoadWallet()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(NOTE: these above 2 steps are not necessary in OT-script, only Java and other languages.)&lt;br /&gt;
&lt;br /&gt;
'''Display the current list of server contracts on the screen''' Call &amp;lt;code&amp;gt;OT_API_GetServerCount()&amp;lt;/code&amp;gt;, which returns the number of server contracts in your wallet. For each one, call &amp;lt;code&amp;gt;OT_API_GetServer_ID()&amp;lt;/code&amp;gt; to get the Server ID (which is a hash of the contract.) Also for each, call &amp;lt;code&amp;gt;OT_API_GetServer_Name()&amp;lt;/code&amp;gt; to get the Display Name from the contract. In your GUI, display the name on the screen, but use the ID behind the scenes (for your messages to the server.)&lt;br /&gt;
&lt;br /&gt;
'''Do the same thing for Nyms, Accounts, and Asset Types.''' You can read about them on the [[API]] page, but here are the basic functions:&lt;br /&gt;
&lt;br /&gt;
OT_API_GetNymCount(void); &lt;br /&gt;
OT_API_GetServerCount(void); &lt;br /&gt;
OT_API_GetAssetTypeCount(void); &lt;br /&gt;
OT_API_GetAccountCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetNym_ID() and OT_API_GetNym_Name() &lt;br /&gt;
OT_API_GetServer_ID() and OT_API_GetServer_Name() &lt;br /&gt;
OT_API_GetAssetType_ID() and OT_API_GetAssetType_Name() &lt;br /&gt;
OT_API_GetAccountWallet_ID() and OT_API_GetAccountWallet_Name() &lt;br /&gt;
Also: &lt;br /&gt;
OT_API_GetAccountWallet_Balance() &lt;br /&gt;
OT_API_GetAccountWallet_Type() &lt;br /&gt;
OT_API_GetAccountWallet_AssetTypeID()&lt;br /&gt;
&lt;br /&gt;
'''Add a new server contract (or asset contract) to the wallet''' Call &amp;lt;code&amp;gt;OT_API_AddServerContract()&amp;lt;/code&amp;gt; &lt;br /&gt;
or &amp;lt;code&amp;gt;OT_API_AddAssetContract()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Create a new Pseudonym''' (Each user's wallet may contain many pseudonyms. Each Nym consists of a public and a private key, aka a &amp;amp;quot;key pair&amp;amp;quot;.) Call &amp;lt;code&amp;gt;OT_API_CreateNym()&amp;lt;/code&amp;gt; This creates a new key pair ''(&amp;quot;Nym&amp;quot;)'' in your wallet, which you can use for communications with an OT server. (That is, for opening asset accounts and performing various other transactions. A Nym is a &amp;amp;quot;user account&amp;amp;quot;.) (You can create as many of these pseudonyms as you want.) (You can register the same nyms at multiple servers.) (The same Nym will have the same Nym ID and public key on every server.)&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;def details_create_nym(nKeybits, strName)&lt;br /&gt;
{&lt;br /&gt;
    var madeEasy = OT_ME()    &lt;br /&gt;
    var strNymID = madeEasy.create_pseudonym(nKeybits, &amp;amp;quot;&amp;amp;quot;, &amp;amp;quot;&amp;amp;quot;)  // returns new Nym ID&lt;br /&gt;
    &lt;br /&gt;
    if (!VerifyStringVal(strNymID))&lt;br /&gt;
    {&lt;br /&gt;
        OT_API_Output(0, &amp;amp;quot;details_create_nym: Failed in OT_ME::create_pseudonym(keybits == &amp;amp;quot; + nKeybits.to_string() + &amp;amp;quot;)\n&amp;amp;quot;)&lt;br /&gt;
        return (0)&lt;br /&gt;
    }&lt;br /&gt;
    OT_API_Output(0, &amp;amp;quot;Success creating! &amp;amp;quot; + nKeybits.to_string() + &amp;amp;quot; keybits, new ID: &amp;amp;quot;) // stderr&lt;br /&gt;
    print(strNymID) // stdout&lt;br /&gt;
    OT_API_Output(0, &amp;amp;quot;\n&amp;amp;quot;) //stderr&lt;br /&gt;
    // -------------------&lt;br /&gt;
    var bSetName = OT_API_SetNym_Name(strNymID, // subject&lt;br /&gt;
                                      strNymID, // signer&lt;br /&gt;
                                      strName)&lt;br /&gt;
    if (!bSetName)&lt;br /&gt;
    {&lt;br /&gt;
        OT_API_Output(0, &amp;amp;quot;Failed in OT_API_SetNym_Name(name == &amp;amp;quot; + strName + &amp;amp;quot;)\n&amp;amp;quot;)&lt;br /&gt;
        return (0)&lt;br /&gt;
    }&lt;br /&gt;
    // -------------------    &lt;br /&gt;
    OT_API_Output(0, &amp;amp;quot;Success setting name to: &amp;amp;quot; + strName + &amp;amp;quot;\n\n&amp;amp;quot;) // stderr&lt;br /&gt;
    return 1&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Register a public key (aka &amp;quot;Nym&amp;quot;) at an OT server'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    var madeEasy    = OT_ME()&lt;br /&gt;
    if (VerifyExists(&amp;amp;quot;Server&amp;amp;quot;) &amp;amp;amp;&amp;amp;amp; VerifyExists(&amp;amp;quot;MyNym&amp;amp;quot;))&lt;br /&gt;
    {        &lt;br /&gt;
        var strResponse = madeEasy.register_nym(Server, MyNym)&lt;br /&gt;
        var nSuccess    = VerifyMessageSuccess(strResponse)&lt;br /&gt;
        switch(nSuccess)&lt;br /&gt;
        {&lt;br /&gt;
            case (1)&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;amp;quot;\n\n SUCCESS in register_nym! Server response:\n\n&amp;amp;quot;);&lt;br /&gt;
                print(strResponse) // stdout&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
            default&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;amp;quot;\n\n Failure or Error in register_nym!\n&amp;amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                if (VerifyStringVal(strResponse))&lt;br /&gt;
                {&lt;br /&gt;
                    OT_API_Output(0, &amp;amp;quot;Server response:\n\n&amp;amp;quot;);&lt;br /&gt;
                    print(strResponse) // stdout&lt;br /&gt;
                }&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
        }&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Change the wallet's label for any server/asset type/account/nym'''&amp;lt;br&amp;gt; &lt;br /&gt;
(This is only a client-side label, for display purposes only.)&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_SetNym_Name()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_SetAccountWallet_Name()&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_SetAssetType_Name()&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_SetServer_Name()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''Issue a new digital Asset Type''' User uploads a new currency contract to the server, so users can create asset accounts based on that asset type. Server replies with a new issuer account ID (The new Issuer account appears inside your wallet's account list, so go ahead and iterate the list again, in order to display the updated list of accounts on the screen.)&lt;br /&gt;
&lt;br /&gt;
High-level API version (in OT script):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        var madeEasy    = OT_ME()&lt;br /&gt;
        OT_API_Output(0, &amp;amp;quot;Please paste a currency contract, followed by an EOF or a ~ by itself on a blank line:\n\n&amp;amp;quot;)&lt;br /&gt;
        var strContract = OT_CLI_ReadUntilEOF() &lt;br /&gt;
        var strResponse = madeEasy.issue_asset_type(Server, MyNym, strContract)&lt;br /&gt;
        var nStatus     = VerifyMessageSuccess(strResponse)&lt;br /&gt;
        &lt;br /&gt;
        switch(nStatus)&lt;br /&gt;
        {&lt;br /&gt;
            case (1)&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;amp;quot;\n\n SUCCESS in issue_asset! Server response:\n\n&amp;amp;quot;);&lt;br /&gt;
                print(strResponse) // stdout&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
            default&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;amp;quot;\n\n Failure or error in issue_asset. nStatus: &amp;amp;quot;+nStatus.to_string()+&amp;amp;quot;\n&amp;amp;quot;)&lt;br /&gt;
                if (VerifyStringVal(strResponse))&lt;br /&gt;
                {&lt;br /&gt;
                    OT_API_Output(0, &amp;amp;quot;Server response:\n\n&amp;amp;quot;);&lt;br /&gt;
                    print(strResponse) // stdout&lt;br /&gt;
                }&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
        }&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Retrieve Currency Contract (by ID)''' User wants to download a currency contract from the server (for a given asset type ID.) (The asset type ID is a hash of the contract, so OT will know if you get the wrong one, since this is verified whenever a contract is loaded up.)&lt;br /&gt;
&lt;br /&gt;
High-level API version (in OT script):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    var madeEasy    = OT_ME()&lt;br /&gt;
    var strRetrieved   = madeEasy.retrieve_contract(Server, MyNym, strContractID)&lt;br /&gt;
    var nRetrieved     = VerifyMessageSuccess(strRetrieved)    &lt;br /&gt;
    var strSuccess = &amp;amp;quot;ERROR&amp;amp;quot;&lt;br /&gt;
    if (1 == nRetrieved)&lt;br /&gt;
    {   strSuccess = &amp;amp;quot;SUCCESS&amp;amp;quot; }&lt;br /&gt;
    else if (0 == nRetrieved)&lt;br /&gt;
    {   strSuccess = &amp;amp;quot;FAILED&amp;amp;quot; }&lt;br /&gt;
    OT_API_Output(0, &amp;amp;quot;\n\n &amp;amp;quot; + strSuccess + &amp;amp;quot; retrieving contract: &amp;amp;quot;+strContractID+&amp;amp;quot;\n\n&amp;amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Create a new Asset Account''' Example in OT Script, from the [https://github.com/FellowTraveler/Open-Transactions/tree/master/scripts/samples sample scripts] folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def OT_ME::create_asset_acct(SERVER_ID, NYM_ID, ASSET_TYPE_ID) &lt;br /&gt;
    {&lt;br /&gt;
        var ot_Msg := OTAPI_Func()&lt;br /&gt;
        // -------------------------&lt;br /&gt;
        var theRequest := OTAPI_Func(ot_Msg.CREATE_ASSET_ACCT, SERVER_ID, NYM_ID, ASSET_TYPE_ID)&lt;br /&gt;
        var     strResponse = theRequest.SendRequest(theRequest, &amp;quot;CREATE_ASSET_ACCT&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        return strResponse&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it was a SUCCESS, then refresh the list of accounts in your display (from the OT API) since your new asset account should now be there.&lt;br /&gt;
&lt;br /&gt;
(You can also use the &amp;amp;quot;decode&amp;amp;quot; command in the test wallet anytime you want to base64-decode something.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''TRANSACTIONS'''&lt;br /&gt;
&lt;br /&gt;
FYI: Balance agreement, combined with transaction numbers, is what makes it possible for the server and all other parties to ''eliminate account history, instead storing only the last signed receipt.'' (Of course they have the ''choice'' to keep their own records--but they are no longer ''forced'' to do so.)&lt;br /&gt;
&lt;br /&gt;
In order to do any transaction, the wallet's ''balance agreement'' process requires that you have the latest copy of your account, inbox, and outbox files. You don't have to worry about this too much, since the high-level API will usually handle it for you.&lt;br /&gt;
&lt;br /&gt;
'''You might ask: &amp;quot;But what if I download my account, or my outbox, and the server has maliciously inserted data into them?&amp;quot;''' ''No problem'' -- Open Transactions stores the last signed receipt from the server, and is able to verify the new intermediary files against that last receipt. You can see this happening when you run the command-line test client, and receipts can be verified programmatically using &amp;lt;code&amp;gt;OT_API_VerifyAccountReceipt()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The [[Triple Signed Receipts]] on Open Transactions ensure that this sort of protection is available to all parties, '''while simultaneously not having to store any transaction history!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''Write a Cheque''' Alice writes a cheque (offline): Call &amp;lt;code&amp;gt;OT_API_WriteCheque()&amp;lt;/code&amp;gt; Alice then gives cheque to Bob (offline), ''or'' online if she prefers via &amp;lt;code&amp;gt;OT_API_sendUserMessage()&amp;lt;/code&amp;gt; function. If Alice has Bob's UserID but not his public key, her wallet first uses &amp;lt;code&amp;gt;OT_API_checkUser()&amp;lt;/code&amp;gt; to retrieve his public key from the server, and then encrypts the cheque before sending it.&lt;br /&gt;
&lt;br /&gt;
NOTE: a quality wallet software will keep track of ALL instruments! Even when Alice gives a cheque to Bob, her wallet should still store a copy of that cheque. Until when? Until at least after he has cashed it... when he does that, a chequeReceipt will appear in her inbox. Only when she accepts that receipt, signing a new balance agreement, is she finally free of the transaction number that was on that cheque. (It was still signed-out to her, all the way up until that time.)&lt;br /&gt;
&lt;br /&gt;
WHAT IF Bob had never cashed it? WHAT IF he lost it? Is Alice supposed to just keep signing for that number forever? (The chequeReceipt will never appear in her inbox. She is doomed to continue signing for this number on all of her receipts on into the future, ad infinitum, with no hope of ever closing it out!)&lt;br /&gt;
&lt;br /&gt;
Fear not, there is a solution: &amp;lt;code&amp;gt;OT_API_DiscardCheque()&amp;lt;/code&amp;gt;. (Lucky you saved a copy of that cheque in your wallet, eh?) This function will retrieve Alice's transaction # back from the cheque, so that her wallet is free to use it on her next valid transaction, and then close it out normally.&lt;br /&gt;
&lt;br /&gt;
'''Deposit a cheque''' (A voucher is also a cheque, so you may deposit a voucher here the same as any other cheque.) Bob sends message to server requesting deposit:&lt;br /&gt;
&lt;br /&gt;
'''(High level API version, in Java.)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    public boolean depositCheque(String serverID, String nymID, String accountID, String cheque) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In depositCheque serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.DEPOSIT_CHEQUE, serverID, nymID, accountID, cheque);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;DEPOSIT_CHEQUE&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in depositCheque.&amp;quot;);&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // -------------------------------------------------------------------------------------- &lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Withdraw cash''' Alice's wallet first makes sure she has the latest public mint file, by calling &amp;lt;code&amp;gt;OT_API_getMint()&amp;lt;/code&amp;gt;. (Note: if the mint she already has is within its valid date range, there's no need to do this.) (Note: If she does call getMint, Alice needs to check the server reply and make sure it was successful before continuing with the withdrawal. The public mint keys are necessary for cash withdrawal.) Alice then withdraws from her asset account, by messaging server: &amp;lt;code&amp;gt;OT_API_notarizeWithdrawal()&amp;lt;/code&amp;gt; Server replies with chaumian cash, which is stored in the purse folder in local storage.&lt;br /&gt;
&lt;br /&gt;
Here is the full Java implementation of Withdraw Cash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    public boolean withdrawCash(String serverID, String nymID, String accountID, String amount) &lt;br /&gt;
    {&lt;br /&gt;
        String serverResponseMessage = null;&lt;br /&gt;
        System.out.println(&amp;quot;In withdrawCash serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
        String assetID = otapi.OT_API_GetAccountWallet_AssetTypeID(accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------- &lt;br /&gt;
        // Make sure we have the proper asset contract for the withdrawal.&lt;br /&gt;
        //&lt;br /&gt;
        String assetContract = otapi.OT_API_LoadAssetContract(assetID);&lt;br /&gt;
        if (assetContract == null) {&lt;br /&gt;
            OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.GET_CONTRACT, serverID, nymID, assetID);&lt;br /&gt;
            String strResponse = OTAPI_Func.SendRequest(theRequest, &amp;quot;GET_CONTRACT&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (null == strResponse) {&lt;br /&gt;
                System.out.println(&amp;quot;IN withdrawCash: OTAPI_Func.SendRequest(GET_CONTRACT) failed. (I give up.) (Unable to find asset contract.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            assetContract = otapi.OT_API_LoadAssetContract(assetID);&lt;br /&gt;
            if (assetContract == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadAssetContract returned null even after OT_API_getContract (Unable to find asset contract.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        // Download the public mintfile if it's not there, or if it's expired.&lt;br /&gt;
        // Also load it up into memory as a string (just to make sure it works.)&lt;br /&gt;
        // Then we can actually send the withdrawal transaction request. (Until&lt;br /&gt;
        // then, why bother?)&lt;br /&gt;
        //&lt;br /&gt;
        String mintFile;&lt;br /&gt;
&lt;br /&gt;
        // expired or missing.&lt;br /&gt;
        if (1 != otapi.OT_API_Mint_IsStillGood(serverID, assetID)) &lt;br /&gt;
        {&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.GET_MINT, serverID, nymID, assetID);&lt;br /&gt;
            String strResponse = OTAPI_Func.SendRequest(theRequest, &amp;quot;GET_MINT&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (null == strResponse) {&lt;br /&gt;
                System.out.println(&amp;quot;IN withdrawCash: OTAPI_Func.SendRequest(GET_MINT) failed. (I give up.) (Unable to get mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            mintFile = otapi.OT_API_LoadMint(serverID, assetID);&lt;br /&gt;
            if (mintFile == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadMint returned null even after OT_API_getMint (I give up.) (Unable to find mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else // current mint IS available already on local storage (and not expired.)&lt;br /&gt;
        {&lt;br /&gt;
            mintFile = otapi.OT_API_LoadMint(serverID, assetID);&lt;br /&gt;
            if (mintFile == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadMint returned null even after successful OT_API_Mint_IsStillGood (I give up.) (Unable to find mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        // By this point, the mintfile is DEFINITELY good (available, not null, &lt;br /&gt;
        // not expired, and loaded up.) Now we know for a fact that when the API&lt;br /&gt;
        // call is made to withdraw cash, that it will find the mint properly.&lt;br /&gt;
        //&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.WITHDRAW_CASH, serverID, nymID, accountID, amount);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;WITHDRAW_CASH&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in withdrawCash.&amp;quot;);&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // --------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deposit cash''' Here is the complete Java implementation for Deposit Cash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean depositCash(String serverID, String nymID, String accountID, String purse, boolean isToken) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In depositCash serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID + &amp;quot; isToken:&amp;quot; + isToken);&lt;br /&gt;
        Utility.setOtDepositCash(null);&lt;br /&gt;
        String oldPurse = purse;&lt;br /&gt;
        if (isToken) {&lt;br /&gt;
            purse = getNewPurse(purse, serverID, nymID, accountID);&lt;br /&gt;
            System.out.println(&amp;quot;purse after getting from push purse:&amp;quot; + purse);&lt;br /&gt;
            if (purse == null) {&lt;br /&gt;
                Utility.setOtDepositCash(oldPurse);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // ----------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.DEPOSIT_CASH, serverID, nymID, accountID, purse);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;DEPOSIT_CASH&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;IN depositCash: OTAPI_Func.SendTransaction(() failed. (I give up.) &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (isToken) {&lt;br /&gt;
                System.out.println(&amp;quot;IN depositCash, failed action for single token&amp;quot;);&lt;br /&gt;
                String assetID = otapi.OT_API_GetAccountWallet_AssetTypeID(accountID);&lt;br /&gt;
                boolean importStatus = otapi.OT_API_Wallet_ImportPurse(serverID, assetID, nymID, purse) == 1 ? true : false;&lt;br /&gt;
                System.out.println(&amp;quot;Since failure of depositCashPurse, OT_API_Wallet_ImportPurse called, status of import:&amp;quot; + importStatus);&lt;br /&gt;
                if (!importStatus) {&lt;br /&gt;
                    Utility.setOtDepositCash(purse);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // ----------------------------------------&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
Note about local storage: Usually whenever something important is downloaded from the server, the OT API will save it automatically to the default storage context, and you can then load it up using another API call. This is usually the most convenient way to do things.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''Account-to-Account Transfer''' A ''pending transfer'' will go into your outbox, and the recipient's inbox, pending acceptance by the recipient. FYI, every asset account has its own inbox and outbox for handling pending transactions, as well as receipts. FYI, every Nym similarly has its own Nymbox, used for receiving messages from other users, and for receiving new transaction numbers from the server.&lt;br /&gt;
&lt;br /&gt;
Here is the OT Script implementation of Send Transfer, from the [https://github.com/FellowTraveler/Open-Transactions/tree/master/scripts/samples sample scripts] folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def OT_ME::send_transfer(SERVER_ID, NYM_ID, ACCT_FROM, ACCT_TO, AMOUNT, NOTE) &lt;br /&gt;
    {&lt;br /&gt;
        var ot_Msg := OTAPI_Func()&lt;br /&gt;
        // -------------------------&lt;br /&gt;
        var theRequest := OTAPI_Func(ot_Msg.SEND_TRANSFER, SERVER_ID, NYM_ID, ACCT_FROM, ACCT_TO, AMOUNT, NOTE)&lt;br /&gt;
        var     strResponse = theRequest.SendTransaction(theRequest, &amp;quot;SEND_TRANSFER&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        return strResponse&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Withdraw Voucher''' A voucher is like a &amp;amp;quot;money order&amp;amp;quot; or &amp;amp;quot;cashier's cheque&amp;amp;quot;. It's a cheque, but drawn on a server account, instead of your own account. Withdrawing in voucher form is similar to withdrawing in cash: the server debits your asset account, and then gives you an official cheque.&lt;br /&gt;
&lt;br /&gt;
But with cash, it's automatically saved to your purse, whereas with a voucher, you have to read the voucher out of the server reply, and display it on the screen!&lt;br /&gt;
&lt;br /&gt;
Here is the complete Java code to perform Withdraw Voucher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String withdrawVoucher(String serverID, String nymID, String accountID, String amount, String chequeMemo, String recepientNymID) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In withdrawVoucher serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.WITHDRAW_VOUCHER, serverID, nymID, accountID, recepientNymID, chequeMemo, amount);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;WITHDRAW_VOUCHER&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in withdrawVoucher.&amp;quot;);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        String ledger = otapi.OT_API_Message_GetLedger(strResponse);&lt;br /&gt;
        if (ledger == null) {&lt;br /&gt;
            System.out.println(&amp;quot; ledger is null, returned by OT_API_Message_GetLedger, serverResponseMessage passed as argument&amp;quot;);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        String transaction = otapi.OT_API_Ledger_GetTransactionByIndex(serverID, nymID, accountID, ledger, 0);&lt;br /&gt;
        if (transaction == null) {&lt;br /&gt;
            System.out.println(&amp;quot;withdrawVoucher: transaction is null, returned by OT_API_Ledger_GetTransactionByIndex, argument passed, index 0 and ledger :&amp;quot; + ledger);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        String output = otapi.OT_API_Transaction_GetVoucher(serverID, nymID, accountID, transaction);&lt;br /&gt;
        System.out.println(&amp;quot;output returned by OT_API_Transaction_GetVoucher:&amp;quot; + output);&lt;br /&gt;
&lt;br /&gt;
        return output;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''BASKET CURRENCIES'''&lt;br /&gt;
&lt;br /&gt;
'''Create a new Basket Currency''' First, invent the basket in your head. Give it name: ''&amp;amp;quot;Clams.&amp;amp;quot;'' &lt;br /&gt;
Next, give it a ratio in terms of other existing currencies: ''&amp;amp;quot;10 Clams equals a basket of 5 dollars, 3 Euro, and 20 Bitcoin&amp;amp;quot;.'' Call &amp;lt;code&amp;gt;OT_API_GenerateBasketCreation()&amp;lt;/code&amp;gt; to begin creating the basket. The ''&amp;amp;quot;10 Clams&amp;amp;quot;'' from above is set here. Next, call &amp;lt;code&amp;gt;OT_API_AddBasketCreationItem()&amp;lt;/code&amp;gt; for EACH currency in the basket. In the above example, I would call this function 3 times, in order to set the ''&amp;amp;quot;5 dollars&amp;amp;quot;'' the ''&amp;amp;quot;3 Euro&amp;amp;quot;'' and the ''&amp;amp;quot;20 Bitcoin&amp;amp;quot;'' from above. Now that the basket has been defined, call &amp;lt;code&amp;gt;OT_API_issueBasket()&amp;lt;/code&amp;gt; to actually create the basket currency on the server. (Now you have created a new asset type--a basket--which the server will control. Any user may now create accounts using this type! And from there, they can write cheques, withdraw cash, trade on markets, etc. the same as with any other asset type.)&lt;br /&gt;
&lt;br /&gt;
'''Exchange Digital Assets in/out of a Basket Currency (from your Asset Accounts)''' First, call &amp;lt;code&amp;gt;OT_API_GenerateBasketExchange()&amp;lt;/code&amp;gt; to setup the exchange. You'll need to know the basket's asset type, and you'll need to have an existing asset account of that type. You will also set the &amp;amp;quot;transfer multiple&amp;amp;quot; in that call. What's the transfer multiple? Remember the ratio above: &amp;amp;quot;10 Clams equals a basket of 5 dollars, 3 Euro, and 20 Bitcoin&amp;amp;quot;&lt;br /&gt;
&lt;br /&gt;
Here are examples of the transfer multiple: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;quot;10 Clams == 5 USD, 3 EUR, 20 BIT&amp;amp;quot; (Transfer multiple: 1) &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;quot;20 Clams == 10 USD, 6 EUR, 40 BIT&amp;amp;quot; (Transfer multiple: 2) &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;quot;30 Clams == 15 USD, 9 EUR, 60 BIT&amp;amp;quot; (Transfer multiple: 3) &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;quot;40 Clams == 20 USD, 12 EUR, 80 BIT&amp;amp;quot; (Transfer multiple: 4) &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;quot;50 Clams == 25 USD, 15 EUR, 100 BIT&amp;amp;quot; (Transfer multiple: 5)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, call &amp;lt;code&amp;gt;OT_API_AddBasketExchangeItem()&amp;lt;/code&amp;gt; for each currency type in the basket. You will need to to pass the asset account ID for an existing asset account, for each currency type (since you are converting in or out, from your basket account, to your asset accounts.) Therefore you will call this function once for USD, once for EUR, and once for BIT, in that example, passing in your USD asset acct ID, your EUR asset acct ID, and your Bitcoin asset account ID.&lt;br /&gt;
&lt;br /&gt;
Now that it's all set up, call &amp;lt;code&amp;gt;OT_API_exchangeBasket()&amp;lt;/code&amp;gt; to actually message the server and perform the exchange.&lt;br /&gt;
&lt;br /&gt;
'''Interesting: basket currencies themselves require no more additional system resources than normal currencies!''' The magic happens during the exchange process. The server simply stores internal asset accounts for the dollars, euros, and bitcoins (say), and it manages the issuer account for the basket, and it also manages the exchanging in and out, by moving digital assets in or out of the internal backing accounts. After that point, a basket is just another Asset Type ID, and requires no additional resources. You can even have baskets made up of other baskets, nested 10 times, and it won't affect the speed of operation of the server!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''PROCESSING YOUR INBOX'''&lt;br /&gt;
&lt;br /&gt;
'''Process the Receipts and Pending Transfers in your Inbox''' &amp;lt;br&amp;gt;&lt;br /&gt;
If you wish, call &amp;lt;code&amp;gt;OT_API_getInbox()&amp;lt;/code&amp;gt; to grab the latest inbox from the server. In the high-level API, this is often just automated for you, but nevertheless, check out the dl_acct_files.ot script. See also show_inbox.ot, etc.&lt;br /&gt;
&lt;br /&gt;
During this time, your user has the opportunity to peruse the inbox, and to decide which transactions therein he wishes to accept or reject. Usually the inbox is display on the screen, then the user selects various items to accept or reject, and then the user clicks &amp;amp;quot;Process Inbox&amp;amp;quot; and then you do this:&lt;br /&gt;
&lt;br /&gt;
Then call &amp;lt;code&amp;gt;OT_API_Ledger_CreateResponse()&amp;lt;/code&amp;gt; in order to create a 'response' ledger for that inbox, which will be sent to the server to signal your responses to the various inbox transactions. &amp;lt;br&amp;gt;Then call &amp;lt;code&amp;gt;OT_API_Ledger_GetCount()&amp;lt;/code&amp;gt; (pass it the inbox) to find out how many transactions are inside of it. Use that count to LOOP through them... &lt;br /&gt;
&amp;lt;br&amp;gt;Use &amp;lt;code&amp;gt;OT_API_Ledger_GetTransactionByIndex()&amp;lt;/code&amp;gt; to grab each transaction as you iterate through the inbox. (There are various introspection functions you can use in the API here if you wish to display the inbox items on the screen for the user...) &lt;br /&gt;
&amp;lt;br&amp;gt;Next call &amp;lt;code&amp;gt;OT_API_Transaction_CreateResponse()&amp;lt;/code&amp;gt; for each transaction in the inbox, to create a response to it, accepting or rejecting it. This function creates the response and adds it to the response ledger. &lt;br /&gt;
&amp;lt;br&amp;gt;Next, call &amp;lt;code&amp;gt;OT_API_Ledger_FinalizeResponse()&amp;lt;/code&amp;gt; which will create a ''Balance Agreement'' for the ledger. &lt;br /&gt;
&amp;lt;br&amp;gt;Finally, call &amp;lt;code&amp;gt;OT_API_processInbox()&amp;lt;/code&amp;gt; to send your message to the server and process the various items. (See the accept_inbox.ot script.)&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use &amp;lt;code&amp;gt;OT_API_Message_GetBalanceAgreementSuccess()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;OT_API_Message_GetTransactionSuccess()&amp;lt;/code&amp;gt; to see just ''how'' successful.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''MARKETS and PAYMENT PLANS'''&lt;br /&gt;
&lt;br /&gt;
'''Setup a Payment Plan''' The Merchant draws up the Payment Plan using &amp;lt;code&amp;gt;OT_API_ProposePaymentPlan&amp;lt;/code&amp;gt; Then he sends it to the Customer, who calls &amp;lt;code&amp;gt;OT_API_ConfirmPaymentPlan&amp;lt;/code&amp;gt; The Customer's wallet activates the payment plan by sending it to the server using this function: &amp;lt;code&amp;gt;OT_API_depositPaymentPlan()&amp;lt;/code&amp;gt; (Receipts will process into the respective parties' inboxes.) Use OT_API_cancelCronItem() to cancel any payment plan (or market offer.)&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use &amp;lt;code&amp;gt;OT_API_Message_GetBalanceAgreementSuccess()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;OT_API_Message_GetTransactionSuccess()&amp;lt;/code&amp;gt; as described above in the ''deposit cash'' instructions.&lt;br /&gt;
&lt;br /&gt;
'''Issue a [[Markets|Market]] Offer'''&lt;br /&gt;
&lt;br /&gt;
Call this function: &amp;lt;code&amp;gt;OT_API_issueMarketOffer()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
(That's the low-level one. See create_offer.ot script for the high-level version.)&amp;lt;br&amp;gt; &lt;br /&gt;
Call &amp;lt;code&amp;gt;OT_API_Message_GetSuccess&amp;lt;/code&amp;gt; to find out if the message was a SUCCESS or FAILURE.&amp;lt;br&amp;gt;&lt;br /&gt;
If the message was successful, then use &amp;lt;code&amp;gt;OT_API_Message_GetBalanceAgreementSuccess()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;OT_API_Message_GetTransactionSuccess()&amp;lt;/code&amp;gt; as described above in the ''deposit cash'' instructions.&amp;lt;br&amp;gt; &lt;br /&gt;
See the OTScript and Java versions of these calls.&lt;br /&gt;
&lt;br /&gt;
Once an offer goes onto the market, multiple trades may occur between it and the other offers on the market. (According to the rules in the offers.) Receipts will process into the respective parties' inboxes after each trade.&lt;br /&gt;
&lt;br /&gt;
'''Cancel a Market Offer''' Use &amp;lt;code&amp;gt;OT_API_cancelNymMarketOffer&amp;lt;/code&amp;gt; to remove an offer from a market. If the message was successful, then use &amp;lt;code&amp;gt;OT_API_Message_GetBalanceAgreementSuccess()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;OT_API_Message_GetTransactionSuccess()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Retrieving Market Data from OT Server:''' &amp;lt;code&amp;gt;OT_API_getMarketList&amp;lt;/code&amp;gt; retrieves a list of all the markets available on a specific server, and details for each market. If the server call is a success, the data will be retrieved from the OT server, and written to local storage using the OT Storage API, at this path or key (inside your data_folder location): &amp;lt;code&amp;gt;markets/SERVER_ID/market_data.bin&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
If you want to verify whether the data is now available in local storage (after a successful call to getMarketList), your code would look like this: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;if (otapi.Exists(&amp;amp;quot;markets&amp;amp;quot;, serverID, &amp;amp;quot;market_data.bin&amp;amp;quot;)) bFoundFile = true;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is some Java code that reads the market list object from local storage, assuming bFoundFile is true:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;Java&amp;quot;&amp;gt;    MarketList marketList = null;&lt;br /&gt;
    Storable storable = null;&lt;br /&gt;
&lt;br /&gt;
    if (otapi.Exists(&amp;amp;quot;markets&amp;amp;quot;, serverID, &amp;amp;quot;market_data.bin&amp;amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        storable =&lt;br /&gt;
            otapi.QueryObject(StoredObjectType.STORED_OBJ_MARKET_LIST,&lt;br /&gt;
                &amp;amp;quot;markets&amp;amp;quot;, serverID, &amp;amp;quot;market_data.bin&amp;amp;quot;);&lt;br /&gt;
        if (storable==null)&lt;br /&gt;
            return null;&lt;br /&gt;
            marketList = MarketList.ot_dynamic_cast(storable);&lt;br /&gt;
        }&amp;lt;/pre&amp;gt;&lt;br /&gt;
Once you have the market list, here is some sample Java code to read the details of an individual market from that list:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;Java&amp;quot;&amp;gt;public static Object getMarketDetails(String marketID)&lt;br /&gt;
{&lt;br /&gt;
    MarketList marketList = Utility.getMarketList();&lt;br /&gt;
&lt;br /&gt;
    if (marketList == null) &lt;br /&gt;
    {&lt;br /&gt;
        return null;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (int i=0; i &amp;amp;lt; marketList.GetMarketDataCount(); i++)&lt;br /&gt;
    {&lt;br /&gt;
        MarketData marketData = marketList.GetMarketData(i);&lt;br /&gt;
&lt;br /&gt;
        if (marketData == null)&lt;br /&gt;
            continue;&lt;br /&gt;
&lt;br /&gt;
        String [] row = new String[2];&lt;br /&gt;
&lt;br /&gt;
        if (marketID.equals(marketData.getMarket_id())) &lt;br /&gt;
        {&lt;br /&gt;
            String[] data = new String[2];&lt;br /&gt;
            marketData.getLast_sale_price();&lt;br /&gt;
            marketData.getCurrent_ask();&lt;br /&gt;
            &lt;br /&gt;
            // Etc!! This is where you get the market details.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // return custom object here (row/data or whatever), or null if failure..&lt;br /&gt;
    return null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_getMarketOffers&amp;lt;/code&amp;gt; retrieves publicly-available info for all offers on a specific market, up until maximum depth, and saves the data here: &amp;lt;code&amp;gt;markets/SERVER_ID/offers/MARKET_ID.bin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(See testwallet/OTAPI.i for ALL DATA OBJECTS that are used in local storage, including market offers, recent trades, etc. See the code above for a sample on how those data objects are used.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_getMarketRecentTrades&amp;lt;/code&amp;gt;: Retrieves all recent trades on a market (up until maximum depth), and stores them here: &amp;lt;code&amp;gt;markets/SERVER_ID/recent/MARKET_ID.bin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To retrieve the offers that a specific Nym has out on the market, use: &amp;lt;code&amp;gt;OT_API_getNym_MarketOffers&amp;lt;/code&amp;gt; This ''getNym''MarketOffers_ data is ''private'' and thus a lot more detailed than what's retrieved via &amp;lt;code&amp;gt;OT_API_Market_GetOffers&amp;lt;/code&amp;gt;, which is more meant for public use. After a successful retrieval, you can load the data from this location: &amp;lt;code&amp;gt;nyms/SERVER_ID/offers/NYM_ID.bin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to see the Nym's private list of his '''completed trades''', the path to load it from is here: &amp;lt;code&amp;gt;nyms/trades/SERVER_ID/NYM_ID&amp;lt;/code&amp;gt; There is no need to send a server message in this last case--just read the data from local storage directly. (When market trading receipts are accepted and cleared out of your inbox, this is where they will go. So there's no need to download them, since they were already downloaded through your inbox previously.) As before, the appropriate data object can be found in testwallet/OTAPI.i along with all the others.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
I will be very responsive to developer needs and questions regarding the OT API, so I encourage you to play with the software and contact me anytime.&lt;br /&gt;
&lt;br /&gt;
See also:&amp;lt;br&amp;gt;&lt;br /&gt;
[[API|The OT low-level API]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Install|Installation]] &amp;lt;br&amp;gt;&lt;br /&gt;
[https://github.com/FellowTraveler/Open-Transactions/wiki/opentxs opentxs command-line tool]&lt;br /&gt;
&lt;br /&gt;
[[List of Classes|The OT C++ class library]]&lt;br /&gt;
&lt;br /&gt;
''Diagrams:'' '''[http://billstclair.com/ot/ot-diagram.jpg Architecture Overview]''', '''[http://billstclair.com/ot/OT-Anon-CashOnly.jpg Fully-Anonymous]''' (cash only), and '''[http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg Pseudo-Anonymous]''' (using accounts).&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Use_Cases&amp;diff=3184</id>
		<title>Use Cases</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Use_Cases&amp;diff=3184"/>
		<updated>2015-07-08T22:46:33Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anytime you need to do something, use the high-level API to do it (OT_ME.) Only if you can't find the function you are looking for, should you next resort to the low-level API (OTAPI.) And remember, you can always the copy the code you need from the test GUI, [http://github.com/Open-Transactions/Moneychanger Moneychanger].&lt;br /&gt;
&lt;br /&gt;
'''What does this mean for you? It means you no longer have to worry about synchronizing request numbers, or harvesting transaction numbers, or comparing inbox hashes, or downloading your nymbox, or dropped messages, or timeouts, or retries, etc!''' Instead, you use simple functions like '''send_transfer''' or '''withdraw_cash.''' The high-level API manages everything else behind the scenes. And any sample code you need can be copied right out of Moneychanger's code.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
NOTE: The below notes are old, but preserved for usefulness.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''USE CASES for the OT API, described on this page:'''&lt;br /&gt;
&lt;br /&gt;
* '''(Client software starts up.)''' Initialize the library and load the wallet.&lt;br /&gt;
* Display for user: '''Server Contracts, Nyms, Accounts, and Asset Types.'''&lt;br /&gt;
* Change the wallet's ''display label'' for any server, asset type, account, or nym.&lt;br /&gt;
* Import a server contract (or asset contract) to the wallet.&lt;br /&gt;
* Create a new '''Pseudonym''' (public/private key pair).&lt;br /&gt;
* Register a public key (a ''&amp;amp;quot;Nym&amp;amp;quot;'') at an OT server.&lt;br /&gt;
* '''Issue a new digital Asset Type'''. (Uploading an asset contract.)&lt;br /&gt;
* Retrieve Currency Contract (by ID).&lt;br /&gt;
* '''Create a new Asset Account'''.&lt;br /&gt;
* '''Write a cheque''' (or invoice)&lt;br /&gt;
* '''Send a Message''' to another user (via the server, encrypted to the recipient's public key.)&lt;br /&gt;
* '''Deposit a cheque'''&lt;br /&gt;
* '''Withdraw cash''' . . . . &amp;amp;lt;==== CHAUMIAN DIGITAL CASH!!&lt;br /&gt;
* '''Deposit cash'''&lt;br /&gt;
* Withdraw Voucher&lt;br /&gt;
* '''Account-to-Account Transfer'''&lt;br /&gt;
* Create a new '''Basket Currency'''&lt;br /&gt;
* '''Exchange''' Digital Assets '''in and out of Baskets''' (from your Asset Accounts)&lt;br /&gt;
* '''Process your Inbox''' (Receipts and pending transfers)&lt;br /&gt;
* Set up a '''Payment Plan'''&lt;br /&gt;
* Issue a '''Market Offer'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''USE CASES for the OT API'''&lt;br /&gt;
&lt;br /&gt;
'''Initialize the library and Load your Wallet'''&lt;br /&gt;
(The user starts up the wallet software.) &lt;br /&gt;
Call &amp;lt;code&amp;gt;OT_API_Init()&amp;lt;/code&amp;gt; Then call &amp;lt;code&amp;gt;OT_API_LoadWallet()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(NOTE: these above 2 steps are not necessary in OT-script, only Java and other languages.)&lt;br /&gt;
&lt;br /&gt;
'''Display the current list of server contracts on the screen''' Call &amp;lt;code&amp;gt;OT_API_GetServerCount()&amp;lt;/code&amp;gt;, which returns the number of server contracts in your wallet. For each one, call &amp;lt;code&amp;gt;OT_API_GetServer_ID()&amp;lt;/code&amp;gt; to get the Server ID (which is a hash of the contract.) Also for each, call &amp;lt;code&amp;gt;OT_API_GetServer_Name()&amp;lt;/code&amp;gt; to get the Display Name from the contract. In your GUI, display the name on the screen, but use the ID behind the scenes (for your messages to the server.)&lt;br /&gt;
&lt;br /&gt;
'''Do the same thing for Nyms, Accounts, and Asset Types.''' You can read about them on the [[API]] page, but here are the basic functions:&lt;br /&gt;
&lt;br /&gt;
OT_API_GetNymCount(void); &lt;br /&gt;
OT_API_GetServerCount(void); &lt;br /&gt;
OT_API_GetAssetTypeCount(void); &lt;br /&gt;
OT_API_GetAccountCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetNym_ID() and OT_API_GetNym_Name() &lt;br /&gt;
OT_API_GetServer_ID() and OT_API_GetServer_Name() &lt;br /&gt;
OT_API_GetAssetType_ID() and OT_API_GetAssetType_Name() &lt;br /&gt;
OT_API_GetAccountWallet_ID() and OT_API_GetAccountWallet_Name() &lt;br /&gt;
Also: &lt;br /&gt;
OT_API_GetAccountWallet_Balance() &lt;br /&gt;
OT_API_GetAccountWallet_Type() &lt;br /&gt;
OT_API_GetAccountWallet_AssetTypeID()&lt;br /&gt;
&lt;br /&gt;
'''Add a new server contract (or asset contract) to the wallet''' Call &amp;lt;code&amp;gt;OT_API_AddServerContract()&amp;lt;/code&amp;gt; &lt;br /&gt;
or &amp;lt;code&amp;gt;OT_API_AddAssetContract()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Create a new Pseudonym''' (Each user's wallet may contain many pseudonyms. Each Nym consists of a public and a private key, aka a &amp;amp;quot;key pair&amp;amp;quot;.) Call &amp;lt;code&amp;gt;OT_API_CreateNym()&amp;lt;/code&amp;gt; This creates a new key pair ''(&amp;quot;Nym&amp;quot;)'' in your wallet, which you can use for communications with an OT server. (That is, for opening asset accounts and performing various other transactions. A Nym is a &amp;amp;quot;user account&amp;amp;quot;.) (You can create as many of these pseudonyms as you want.) (You can register the same nyms at multiple servers.) (The same Nym will have the same Nym ID and public key on every server.)&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;def details_create_nym(nKeybits, strName)&lt;br /&gt;
{&lt;br /&gt;
    var madeEasy = OT_ME()    &lt;br /&gt;
    var strNymID = madeEasy.create_pseudonym(nKeybits, &amp;amp;quot;&amp;amp;quot;, &amp;amp;quot;&amp;amp;quot;)  // returns new Nym ID&lt;br /&gt;
    &lt;br /&gt;
    if (!VerifyStringVal(strNymID))&lt;br /&gt;
    {&lt;br /&gt;
        OT_API_Output(0, &amp;amp;quot;details_create_nym: Failed in OT_ME::create_pseudonym(keybits == &amp;amp;quot; + nKeybits.to_string() + &amp;amp;quot;)\n&amp;amp;quot;)&lt;br /&gt;
        return (0)&lt;br /&gt;
    }&lt;br /&gt;
    OT_API_Output(0, &amp;amp;quot;Success creating! &amp;amp;quot; + nKeybits.to_string() + &amp;amp;quot; keybits, new ID: &amp;amp;quot;) // stderr&lt;br /&gt;
    print(strNymID) // stdout&lt;br /&gt;
    OT_API_Output(0, &amp;amp;quot;\n&amp;amp;quot;) //stderr&lt;br /&gt;
    // -------------------&lt;br /&gt;
    var bSetName = OT_API_SetNym_Name(strNymID, // subject&lt;br /&gt;
                                      strNymID, // signer&lt;br /&gt;
                                      strName)&lt;br /&gt;
    if (!bSetName)&lt;br /&gt;
    {&lt;br /&gt;
        OT_API_Output(0, &amp;amp;quot;Failed in OT_API_SetNym_Name(name == &amp;amp;quot; + strName + &amp;amp;quot;)\n&amp;amp;quot;)&lt;br /&gt;
        return (0)&lt;br /&gt;
    }&lt;br /&gt;
    // -------------------    &lt;br /&gt;
    OT_API_Output(0, &amp;amp;quot;Success setting name to: &amp;amp;quot; + strName + &amp;amp;quot;\n\n&amp;amp;quot;) // stderr&lt;br /&gt;
    return 1&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Register a public key (aka &amp;quot;Nym&amp;quot;) at an OT server'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    var madeEasy    = OT_ME()&lt;br /&gt;
    if (VerifyExists(&amp;amp;quot;Server&amp;amp;quot;) &amp;amp;amp;&amp;amp;amp; VerifyExists(&amp;amp;quot;MyNym&amp;amp;quot;))&lt;br /&gt;
    {        &lt;br /&gt;
        var strResponse = madeEasy.register_nym(Server, MyNym)&lt;br /&gt;
        var nSuccess    = VerifyMessageSuccess(strResponse)&lt;br /&gt;
        switch(nSuccess)&lt;br /&gt;
        {&lt;br /&gt;
            case (1)&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;amp;quot;\n\n SUCCESS in register_nym! Server response:\n\n&amp;amp;quot;);&lt;br /&gt;
                print(strResponse) // stdout&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
            default&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;amp;quot;\n\n Failure or Error in register_nym!\n&amp;amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                if (VerifyStringVal(strResponse))&lt;br /&gt;
                {&lt;br /&gt;
                    OT_API_Output(0, &amp;amp;quot;Server response:\n\n&amp;amp;quot;);&lt;br /&gt;
                    print(strResponse) // stdout&lt;br /&gt;
                }&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
        }&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Change the wallet's label for any server/asset type/account/nym'''&amp;lt;br&amp;gt; &lt;br /&gt;
(This is only a client-side label, for display purposes only.)&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_SetNym_Name()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_SetAccountWallet_Name()&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_SetAssetType_Name()&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_SetServer_Name()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''Issue a new digital Asset Type''' User uploads a new currency contract to the server, so users can create asset accounts based on that asset type. Server replies with a new issuer account ID (The new Issuer account appears inside your wallet's account list, so go ahead and iterate the list again, in order to display the updated list of accounts on the screen.)&lt;br /&gt;
&lt;br /&gt;
High-level API version (in OT script):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        var madeEasy    = OT_ME()&lt;br /&gt;
        OT_API_Output(0, &amp;amp;quot;Please paste a currency contract, followed by an EOF or a ~ by itself on a blank line:\n\n&amp;amp;quot;)&lt;br /&gt;
        var strContract = OT_CLI_ReadUntilEOF() &lt;br /&gt;
        var strResponse = madeEasy.issue_asset_type(Server, MyNym, strContract)&lt;br /&gt;
        var nStatus     = VerifyMessageSuccess(strResponse)&lt;br /&gt;
        &lt;br /&gt;
        switch(nStatus)&lt;br /&gt;
        {&lt;br /&gt;
            case (1)&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;amp;quot;\n\n SUCCESS in issue_asset! Server response:\n\n&amp;amp;quot;);&lt;br /&gt;
                print(strResponse) // stdout&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
            default&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;amp;quot;\n\n Failure or error in issue_asset. nStatus: &amp;amp;quot;+nStatus.to_string()+&amp;amp;quot;\n&amp;amp;quot;)&lt;br /&gt;
                if (VerifyStringVal(strResponse))&lt;br /&gt;
                {&lt;br /&gt;
                    OT_API_Output(0, &amp;amp;quot;Server response:\n\n&amp;amp;quot;);&lt;br /&gt;
                    print(strResponse) // stdout&lt;br /&gt;
                }&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
        }&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Retrieve Currency Contract (by ID)''' User wants to download a currency contract from the server (for a given asset type ID.) (The asset type ID is a hash of the contract, so OT will know if you get the wrong one, since this is verified whenever a contract is loaded up.)&lt;br /&gt;
&lt;br /&gt;
High-level API version (in OT script):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    var madeEasy    = OT_ME()&lt;br /&gt;
    var strRetrieved   = madeEasy.retrieve_contract(Server, MyNym, strContractID)&lt;br /&gt;
    var nRetrieved     = VerifyMessageSuccess(strRetrieved)    &lt;br /&gt;
    var strSuccess = &amp;amp;quot;ERROR&amp;amp;quot;&lt;br /&gt;
    if (1 == nRetrieved)&lt;br /&gt;
    {   strSuccess = &amp;amp;quot;SUCCESS&amp;amp;quot; }&lt;br /&gt;
    else if (0 == nRetrieved)&lt;br /&gt;
    {   strSuccess = &amp;amp;quot;FAILED&amp;amp;quot; }&lt;br /&gt;
    OT_API_Output(0, &amp;amp;quot;\n\n &amp;amp;quot; + strSuccess + &amp;amp;quot; retrieving contract: &amp;amp;quot;+strContractID+&amp;amp;quot;\n\n&amp;amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Create a new Asset Account''' Example in OT Script, from the [https://github.com/FellowTraveler/Open-Transactions/tree/master/scripts/samples sample scripts] folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def OT_ME::create_asset_acct(SERVER_ID, NYM_ID, ASSET_TYPE_ID) &lt;br /&gt;
    {&lt;br /&gt;
        var ot_Msg := OTAPI_Func()&lt;br /&gt;
        // -------------------------&lt;br /&gt;
        var theRequest := OTAPI_Func(ot_Msg.CREATE_ASSET_ACCT, SERVER_ID, NYM_ID, ASSET_TYPE_ID)&lt;br /&gt;
        var     strResponse = theRequest.SendRequest(theRequest, &amp;quot;CREATE_ASSET_ACCT&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        return strResponse&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it was a SUCCESS, then refresh the list of accounts in your display (from the OT API) since your new asset account should now be there.&lt;br /&gt;
&lt;br /&gt;
(You can also use the &amp;amp;quot;decode&amp;amp;quot; command in the test wallet anytime you want to base64-decode something.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''TRANSACTIONS'''&lt;br /&gt;
&lt;br /&gt;
FYI: Balance agreement, combined with transaction numbers, is what makes it possible for the server and all other parties to ''eliminate account history, instead storing only the last signed receipt.'' (Of course they have the ''choice'' to keep their own records--but they are no longer ''forced'' to do so.)&lt;br /&gt;
&lt;br /&gt;
In order to do any transaction, the wallet's ''balance agreement'' process requires that you have the latest copy of your account, inbox, and outbox files. You don't have to worry about this too much, since the high-level API will usually handle it for you.&lt;br /&gt;
&lt;br /&gt;
'''You might ask: &amp;quot;But what if I download my account, or my outbox, and the server has maliciously inserted data into them?&amp;quot;''' ''No problem'' -- Open Transactions stores the last signed receipt from the server, and is able to verify the new intermediary files against that last receipt. You can see this happening when you run the command-line test client, and receipts can be verified programmatically using &amp;lt;code&amp;gt;OT_API_VerifyAccountReceipt()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The [[Triple Signed Receipts]] on Open Transactions ensure that this sort of protection is available to all parties, '''while simultaneously not having to store any transaction history!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''Write a Cheque''' Alice writes a cheque (offline): Call &amp;lt;code&amp;gt;OT_API_WriteCheque()&amp;lt;/code&amp;gt; Alice then gives cheque to Bob (offline), ''or'' online if she prefers via &amp;lt;code&amp;gt;OT_API_sendUserMessage()&amp;lt;/code&amp;gt; function. If Alice has Bob's UserID but not his public key, her wallet first uses &amp;lt;code&amp;gt;OT_API_checkUser()&amp;lt;/code&amp;gt; to retrieve his public key from the server, and then encrypts the cheque before sending it.&lt;br /&gt;
&lt;br /&gt;
NOTE: a quality wallet software will keep track of ALL instruments! Even when Alice gives a cheque to Bob, her wallet should still store a copy of that cheque. Until when? Until at least after he has cashed it... when he does that, a chequeReceipt will appear in her inbox. Only when she accepts that receipt, signing a new balance agreement, is she finally free of the transaction number that was on that cheque. (It was still signed-out to her, all the way up until that time.)&lt;br /&gt;
&lt;br /&gt;
WHAT IF Bob had never cashed it? WHAT IF he lost it? Is Alice supposed to just keep signing for that number forever? (The chequeReceipt will never appear in her inbox. She is doomed to continue signing for this number on all of her receipts on into the future, ad infinitum, with no hope of ever closing it out!)&lt;br /&gt;
&lt;br /&gt;
Fear not, there is a solution: &amp;lt;code&amp;gt;OT_API_DiscardCheque()&amp;lt;/code&amp;gt;. (Lucky you saved a copy of that cheque in your wallet, eh?) This function will retrieve Alice's transaction # back from the cheque, so that her wallet is free to use it on her next valid transaction, and then close it out normally.&lt;br /&gt;
&lt;br /&gt;
'''Deposit a cheque''' (A voucher is also a cheque, so you may deposit a voucher here the same as any other cheque.) Bob sends message to server requesting deposit:&lt;br /&gt;
&lt;br /&gt;
'''(High level API version, in Java.)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    public boolean depositCheque(String serverID, String nymID, String accountID, String cheque) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In depositCheque serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.DEPOSIT_CHEQUE, serverID, nymID, accountID, cheque);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;DEPOSIT_CHEQUE&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in depositCheque.&amp;quot;);&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // -------------------------------------------------------------------------------------- &lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Withdraw cash''' Alice's wallet first makes sure she has the latest public mint file, by calling &amp;lt;code&amp;gt;OT_API_getMint()&amp;lt;/code&amp;gt;. (Note: if the mint she already has is within its valid date range, there's no need to do this.) (Note: If she does call getMint, Alice needs to check the server reply and make sure it was successful before continuing with the withdrawal. The public mint keys are necessary for cash withdrawal.) Alice then withdraws from her asset account, by messaging server: &amp;lt;code&amp;gt;OT_API_notarizeWithdrawal()&amp;lt;/code&amp;gt; Server replies with chaumian cash, which is stored in the purse folder in local storage.&lt;br /&gt;
&lt;br /&gt;
Here is the full Java implementation of Withdraw Cash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    public boolean withdrawCash(String serverID, String nymID, String accountID, String amount) &lt;br /&gt;
    {&lt;br /&gt;
        String serverResponseMessage = null;&lt;br /&gt;
        System.out.println(&amp;quot;In withdrawCash serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
        String assetID = otapi.OT_API_GetAccountWallet_AssetTypeID(accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------- &lt;br /&gt;
        // Make sure we have the proper asset contract for the withdrawal.&lt;br /&gt;
        //&lt;br /&gt;
        String assetContract = otapi.OT_API_LoadAssetContract(assetID);&lt;br /&gt;
        if (assetContract == null) {&lt;br /&gt;
            OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.GET_CONTRACT, serverID, nymID, assetID);&lt;br /&gt;
            String strResponse = OTAPI_Func.SendRequest(theRequest, &amp;quot;GET_CONTRACT&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (null == strResponse) {&lt;br /&gt;
                System.out.println(&amp;quot;IN withdrawCash: OTAPI_Func.SendRequest(GET_CONTRACT) failed. (I give up.) (Unable to find asset contract.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            assetContract = otapi.OT_API_LoadAssetContract(assetID);&lt;br /&gt;
            if (assetContract == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadAssetContract returned null even after OT_API_getContract (Unable to find asset contract.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        // Download the public mintfile if it's not there, or if it's expired.&lt;br /&gt;
        // Also load it up into memory as a string (just to make sure it works.)&lt;br /&gt;
        // Then we can actually send the withdrawal transaction request. (Until&lt;br /&gt;
        // then, why bother?)&lt;br /&gt;
        //&lt;br /&gt;
        String mintFile;&lt;br /&gt;
&lt;br /&gt;
        // expired or missing.&lt;br /&gt;
        if (1 != otapi.OT_API_Mint_IsStillGood(serverID, assetID)) &lt;br /&gt;
        {&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.GET_MINT, serverID, nymID, assetID);&lt;br /&gt;
            String strResponse = OTAPI_Func.SendRequest(theRequest, &amp;quot;GET_MINT&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (null == strResponse) {&lt;br /&gt;
                System.out.println(&amp;quot;IN withdrawCash: OTAPI_Func.SendRequest(GET_MINT) failed. (I give up.) (Unable to get mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            mintFile = otapi.OT_API_LoadMint(serverID, assetID);&lt;br /&gt;
            if (mintFile == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadMint returned null even after OT_API_getMint (I give up.) (Unable to find mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else // current mint IS available already on local storage (and not expired.)&lt;br /&gt;
        {&lt;br /&gt;
            mintFile = otapi.OT_API_LoadMint(serverID, assetID);&lt;br /&gt;
            if (mintFile == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadMint returned null even after successful OT_API_Mint_IsStillGood (I give up.) (Unable to find mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        // By this point, the mintfile is DEFINITELY good (available, not null, &lt;br /&gt;
        // not expired, and loaded up.) Now we know for a fact that when the API&lt;br /&gt;
        // call is made to withdraw cash, that it will find the mint properly.&lt;br /&gt;
        //&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.WITHDRAW_CASH, serverID, nymID, accountID, amount);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;WITHDRAW_CASH&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in withdrawCash.&amp;quot;);&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // --------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deposit cash''' Here is the complete Java implementation for Deposit Cash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean depositCash(String serverID, String nymID, String accountID, String purse, boolean isToken) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In depositCash serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID + &amp;quot; isToken:&amp;quot; + isToken);&lt;br /&gt;
        Utility.setOtDepositCash(null);&lt;br /&gt;
        String oldPurse = purse;&lt;br /&gt;
        if (isToken) {&lt;br /&gt;
            purse = getNewPurse(purse, serverID, nymID, accountID);&lt;br /&gt;
            System.out.println(&amp;quot;purse after getting from push purse:&amp;quot; + purse);&lt;br /&gt;
            if (purse == null) {&lt;br /&gt;
                Utility.setOtDepositCash(oldPurse);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // ----------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.DEPOSIT_CASH, serverID, nymID, accountID, purse);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;DEPOSIT_CASH&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;IN depositCash: OTAPI_Func.SendTransaction(() failed. (I give up.) &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (isToken) {&lt;br /&gt;
                System.out.println(&amp;quot;IN depositCash, failed action for single token&amp;quot;);&lt;br /&gt;
                String assetID = otapi.OT_API_GetAccountWallet_AssetTypeID(accountID);&lt;br /&gt;
                boolean importStatus = otapi.OT_API_Wallet_ImportPurse(serverID, assetID, nymID, purse) == 1 ? true : false;&lt;br /&gt;
                System.out.println(&amp;quot;Since failure of depositCashPurse, OT_API_Wallet_ImportPurse called, status of import:&amp;quot; + importStatus);&lt;br /&gt;
                if (!importStatus) {&lt;br /&gt;
                    Utility.setOtDepositCash(purse);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // ----------------------------------------&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
Note about local storage: Usually whenever something important is downloaded from the server, the OT API will save it automatically to the default storage context, and you can then load it up using another API call. This is usually the most convenient way to do things.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''Account-to-Account Transfer''' A ''pending transfer'' will go into your outbox, and the recipient's inbox, pending acceptance by the recipient. FYI, every asset account has its own inbox and outbox for handling pending transactions, as well as receipts. FYI, every Nym similarly has its own Nymbox, used for receiving messages from other users, and for receiving new transaction numbers from the server.&lt;br /&gt;
&lt;br /&gt;
Here is the OT Script implementation of Send Transfer, from the [https://github.com/FellowTraveler/Open-Transactions/tree/master/scripts/samples sample scripts] folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def OT_ME::send_transfer(SERVER_ID, NYM_ID, ACCT_FROM, ACCT_TO, AMOUNT, NOTE) &lt;br /&gt;
    {&lt;br /&gt;
        var ot_Msg := OTAPI_Func()&lt;br /&gt;
        // -------------------------&lt;br /&gt;
        var theRequest := OTAPI_Func(ot_Msg.SEND_TRANSFER, SERVER_ID, NYM_ID, ACCT_FROM, ACCT_TO, AMOUNT, NOTE)&lt;br /&gt;
        var     strResponse = theRequest.SendTransaction(theRequest, &amp;quot;SEND_TRANSFER&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        return strResponse&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Withdraw Voucher''' A voucher is like a &amp;amp;quot;money order&amp;amp;quot; or &amp;amp;quot;cashier's cheque&amp;amp;quot;. It's a cheque, but drawn on a server account, instead of your own account. Withdrawing in voucher form is similar to withdrawing in cash: the server debits your asset account, and then gives you an official cheque.&lt;br /&gt;
&lt;br /&gt;
But with cash, it's automatically saved to your purse, whereas with a voucher, you have to read the voucher out of the server reply, and display it on the screen!&lt;br /&gt;
&lt;br /&gt;
Here is the complete Java code to perform Withdraw Voucher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String withdrawVoucher(String serverID, String nymID, String accountID, String amount, String chequeMemo, String recepientNymID) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In withdrawVoucher serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.WITHDRAW_VOUCHER, serverID, nymID, accountID, recepientNymID, chequeMemo, amount);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;WITHDRAW_VOUCHER&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in withdrawVoucher.&amp;quot;);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        String ledger = otapi.OT_API_Message_GetLedger(strResponse);&lt;br /&gt;
        if (ledger == null) {&lt;br /&gt;
            System.out.println(&amp;quot; ledger is null, returned by OT_API_Message_GetLedger, serverResponseMessage passed as argument&amp;quot;);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        String transaction = otapi.OT_API_Ledger_GetTransactionByIndex(serverID, nymID, accountID, ledger, 0);&lt;br /&gt;
        if (transaction == null) {&lt;br /&gt;
            System.out.println(&amp;quot;withdrawVoucher: transaction is null, returned by OT_API_Ledger_GetTransactionByIndex, argument passed, index 0 and ledger :&amp;quot; + ledger);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        String output = otapi.OT_API_Transaction_GetVoucher(serverID, nymID, accountID, transaction);&lt;br /&gt;
        System.out.println(&amp;quot;output returned by OT_API_Transaction_GetVoucher:&amp;quot; + output);&lt;br /&gt;
&lt;br /&gt;
        return output;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''BASKET CURRENCIES'''&lt;br /&gt;
&lt;br /&gt;
'''Create a new Basket Currency''' First, invent the basket in your head. Give it name: ''&amp;amp;quot;Clams.&amp;amp;quot;'' &lt;br /&gt;
Next, give it a ratio in terms of other existing currencies: ''&amp;amp;quot;10 Clams equals a basket of 5 dollars, 3 Euro, and 20 Bitcoin&amp;amp;quot;.'' Call &amp;lt;code&amp;gt;OT_API_GenerateBasketCreation()&amp;lt;/code&amp;gt; to begin creating the basket. The ''&amp;amp;quot;10 Clams&amp;amp;quot;'' from above is set here. Next, call &amp;lt;code&amp;gt;OT_API_AddBasketCreationItem()&amp;lt;/code&amp;gt; for EACH currency in the basket. In the above example, I would call this function 3 times, in order to set the ''&amp;amp;quot;5 dollars&amp;amp;quot;'' the ''&amp;amp;quot;3 Euro&amp;amp;quot;'' and the ''&amp;amp;quot;20 Bitcoin&amp;amp;quot;'' from above. Now that the basket has been defined, call &amp;lt;code&amp;gt;OT_API_issueBasket()&amp;lt;/code&amp;gt; to actually create the basket currency on the server. (Now you have created a new asset type--a basket--which the server will control. Any user may now create accounts using this type! And from there, they can write cheques, withdraw cash, trade on markets, etc. the same as with any other asset type.)&lt;br /&gt;
&lt;br /&gt;
'''Exchange Digital Assets in/out of a Basket Currency (from your Asset Accounts)''' First, call &amp;lt;code&amp;gt;OT_API_GenerateBasketExchange()&amp;lt;/code&amp;gt; to setup the exchange. You'll need to know the basket's asset type, and you'll need to have an existing asset account of that type. You will also set the &amp;amp;quot;transfer multiple&amp;amp;quot; in that call. What's the transfer multiple? Remember the ratio above: &amp;amp;quot;10 Clams equals a basket of 5 dollars, 3 Euro, and 20 Bitcoin&amp;amp;quot;&lt;br /&gt;
&lt;br /&gt;
Here are examples of the transfer multiple: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;quot;10 Clams == 5 USD, 3 EUR, 20 BIT&amp;amp;quot; (Transfer multiple: 1) &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;quot;20 Clams == 10 USD, 6 EUR, 40 BIT&amp;amp;quot; (Transfer multiple: 2) &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;quot;30 Clams == 15 USD, 9 EUR, 60 BIT&amp;amp;quot; (Transfer multiple: 3) &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;quot;40 Clams == 20 USD, 12 EUR, 80 BIT&amp;amp;quot; (Transfer multiple: 4) &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;quot;50 Clams == 25 USD, 15 EUR, 100 BIT&amp;amp;quot; (Transfer multiple: 5)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, call &amp;lt;code&amp;gt;OT_API_AddBasketExchangeItem()&amp;lt;/code&amp;gt; for each currency type in the basket. You will need to to pass the asset account ID for an existing asset account, for each currency type (since you are converting in or out, from your basket account, to your asset accounts.) Therefore you will call this function once for USD, once for EUR, and once for BIT, in that example, passing in your USD asset acct ID, your EUR asset acct ID, and your Bitcoin asset account ID.&lt;br /&gt;
&lt;br /&gt;
Now that it's all set up, call &amp;lt;code&amp;gt;OT_API_exchangeBasket()&amp;lt;/code&amp;gt; to actually message the server and perform the exchange.&lt;br /&gt;
&lt;br /&gt;
'''Interesting: basket currencies themselves require no more additional system resources than normal currencies!''' The magic happens during the exchange process. The server simply stores internal asset accounts for the dollars, euros, and bitcoins (say), and it manages the issuer account for the basket, and it also manages the exchanging in and out, by moving digital assets in or out of the internal backing accounts. After that point, a basket is just another Asset Type ID, and requires no additional resources. You can even have baskets made up of other baskets, nested 10 times, and it won't affect the speed of operation of the server!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''PROCESSING YOUR INBOX'''&lt;br /&gt;
&lt;br /&gt;
'''Process the Receipts and Pending Transfers in your Inbox''' &amp;lt;br&amp;gt;&lt;br /&gt;
If you wish, call &amp;lt;code&amp;gt;OT_API_getInbox()&amp;lt;/code&amp;gt; to grab the latest inbox from the server. In the high-level API, this is often just automated for you, but nevertheless, check out the dl_acct_files.ot script. See also show_inbox.ot, etc.&lt;br /&gt;
&lt;br /&gt;
During this time, your user has the opportunity to peruse the inbox, and to decide which transactions therein he wishes to accept or reject. Usually the inbox is display on the screen, then the user selects various items to accept or reject, and then the user clicks &amp;amp;quot;Process Inbox&amp;amp;quot; and then you do this:&lt;br /&gt;
&lt;br /&gt;
Then call &amp;lt;code&amp;gt;OT_API_Ledger_CreateResponse()&amp;lt;/code&amp;gt; in order to create a 'response' ledger for that inbox, which will be sent to the server to signal your responses to the various inbox transactions. &amp;lt;br&amp;gt;Then call &amp;lt;code&amp;gt;OT_API_Ledger_GetCount()&amp;lt;/code&amp;gt; (pass it the inbox) to find out how many transactions are inside of it. Use that count to LOOP through them... &lt;br /&gt;
&amp;lt;br&amp;gt;Use &amp;lt;code&amp;gt;OT_API_Ledger_GetTransactionByIndex()&amp;lt;/code&amp;gt; to grab each transaction as you iterate through the inbox. (There are various introspection functions you can use in the API here if you wish to display the inbox items on the screen for the user...) &lt;br /&gt;
&amp;lt;br&amp;gt;Next call &amp;lt;code&amp;gt;OT_API_Transaction_CreateResponse()&amp;lt;/code&amp;gt; for each transaction in the inbox, to create a response to it, accepting or rejecting it. This function creates the response and adds it to the response ledger. &lt;br /&gt;
&amp;lt;br&amp;gt;Next, call &amp;lt;code&amp;gt;OT_API_Ledger_FinalizeResponse()&amp;lt;/code&amp;gt; which will create a ''Balance Agreement'' for the ledger. &lt;br /&gt;
&amp;lt;br&amp;gt;Finally, call &amp;lt;code&amp;gt;OT_API_processInbox()&amp;lt;/code&amp;gt; to send your message to the server and process the various items. (See the accept_inbox.ot script.)&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use &amp;lt;code&amp;gt;OT_API_Message_GetBalanceAgreementSuccess()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;OT_API_Message_GetTransactionSuccess()&amp;lt;/code&amp;gt; to see just ''how'' successful.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''MARKETS and PAYMENT PLANS'''&lt;br /&gt;
&lt;br /&gt;
'''Setup a Payment Plan''' The Merchant draws up the Payment Plan using &amp;lt;code&amp;gt;OT_API_ProposePaymentPlan&amp;lt;/code&amp;gt; Then he sends it to the Customer, who calls &amp;lt;code&amp;gt;OT_API_ConfirmPaymentPlan&amp;lt;/code&amp;gt; The Customer's wallet activates the payment plan by sending it to the server using this function: &amp;lt;code&amp;gt;OT_API_depositPaymentPlan()&amp;lt;/code&amp;gt; (Receipts will process into the respective parties' inboxes.) Use OT_API_cancelCronItem() to cancel any payment plan (or market offer.)&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use &amp;lt;code&amp;gt;OT_API_Message_GetBalanceAgreementSuccess()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;OT_API_Message_GetTransactionSuccess()&amp;lt;/code&amp;gt; as described above in the ''deposit cash'' instructions.&lt;br /&gt;
&lt;br /&gt;
'''Issue a [[Markets|Market]] Offer'''&lt;br /&gt;
&lt;br /&gt;
Call this function: &amp;lt;code&amp;gt;OT_API_issueMarketOffer()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
(That's the low-level one. See create_offer.ot script for the high-level version.)&amp;lt;br&amp;gt; &lt;br /&gt;
Call &amp;lt;code&amp;gt;OT_API_Message_GetSuccess&amp;lt;/code&amp;gt; to find out if the message was a SUCCESS or FAILURE.&amp;lt;br&amp;gt;&lt;br /&gt;
If the message was successful, then use &amp;lt;code&amp;gt;OT_API_Message_GetBalanceAgreementSuccess()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;OT_API_Message_GetTransactionSuccess()&amp;lt;/code&amp;gt; as described above in the ''deposit cash'' instructions.&amp;lt;br&amp;gt; &lt;br /&gt;
See the OTScript and Java versions of these calls.&lt;br /&gt;
&lt;br /&gt;
Once an offer goes onto the market, multiple trades may occur between it and the other offers on the market. (According to the rules in the offers.) Receipts will process into the respective parties' inboxes after each trade.&lt;br /&gt;
&lt;br /&gt;
'''Cancel a Market Offer''' Use &amp;lt;code&amp;gt;OT_API_cancelNymMarketOffer&amp;lt;/code&amp;gt; to remove an offer from a market. If the message was successful, then use &amp;lt;code&amp;gt;OT_API_Message_GetBalanceAgreementSuccess()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;OT_API_Message_GetTransactionSuccess()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Retrieving Market Data from OT Server:''' &amp;lt;code&amp;gt;OT_API_getMarketList&amp;lt;/code&amp;gt; retrieves a list of all the markets available on a specific server, and details for each market. If the server call is a success, the data will be retrieved from the OT server, and written to local storage using the OT Storage API, at this path or key (inside your data_folder location): &amp;lt;code&amp;gt;markets/SERVER_ID/market_data.bin&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
If you want to verify whether the data is now available in local storage (after a successful call to getMarketList), your code would look like this: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;if (otapi.Exists(&amp;amp;quot;markets&amp;amp;quot;, serverID, &amp;amp;quot;market_data.bin&amp;amp;quot;)) bFoundFile = true;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is some Java code that reads the market list object from local storage, assuming bFoundFile is true:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;Java&amp;quot;&amp;gt;    MarketList marketList = null;&lt;br /&gt;
    Storable storable = null;&lt;br /&gt;
&lt;br /&gt;
    if (otapi.Exists(&amp;amp;quot;markets&amp;amp;quot;, serverID, &amp;amp;quot;market_data.bin&amp;amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        storable =&lt;br /&gt;
            otapi.QueryObject(StoredObjectType.STORED_OBJ_MARKET_LIST,&lt;br /&gt;
                &amp;amp;quot;markets&amp;amp;quot;, serverID, &amp;amp;quot;market_data.bin&amp;amp;quot;);&lt;br /&gt;
        if (storable==null)&lt;br /&gt;
            return null;&lt;br /&gt;
            marketList = MarketList.ot_dynamic_cast(storable);&lt;br /&gt;
        }&amp;lt;/pre&amp;gt;&lt;br /&gt;
Once you have the market list, here is some sample Java code to read the details of an individual market from that list:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;Java&amp;quot;&amp;gt;public static Object getMarketDetails(String marketID)&lt;br /&gt;
{&lt;br /&gt;
    MarketList marketList = Utility.getMarketList();&lt;br /&gt;
&lt;br /&gt;
    if (marketList == null) &lt;br /&gt;
    {&lt;br /&gt;
        return null;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (int i=0; i &amp;amp;lt; marketList.GetMarketDataCount(); i++)&lt;br /&gt;
    {&lt;br /&gt;
        MarketData marketData = marketList.GetMarketData(i);&lt;br /&gt;
&lt;br /&gt;
        if (marketData == null)&lt;br /&gt;
            continue;&lt;br /&gt;
&lt;br /&gt;
        String [] row = new String[2];&lt;br /&gt;
&lt;br /&gt;
        if (marketID.equals(marketData.getMarket_id())) &lt;br /&gt;
        {&lt;br /&gt;
            String[] data = new String[2];&lt;br /&gt;
            marketData.getLast_sale_price();&lt;br /&gt;
            marketData.getCurrent_ask();&lt;br /&gt;
            &lt;br /&gt;
            // Etc!! This is where you get the market details.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // return custom object here (row/data or whatever), or null if failure..&lt;br /&gt;
    return null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_getMarketOffers&amp;lt;/code&amp;gt; retrieves publicly-available info for all offers on a specific market, up until maximum depth, and saves the data here: &amp;lt;code&amp;gt;markets/SERVER_ID/offers/MARKET_ID.bin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(See testwallet/OTAPI.i for ALL DATA OBJECTS that are used in local storage, including market offers, recent trades, etc. See the code above for a sample on how those data objects are used.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_getMarketRecentTrades&amp;lt;/code&amp;gt;: Retrieves all recent trades on a market (up until maximum depth), and stores them here: &amp;lt;code&amp;gt;markets/SERVER_ID/recent/MARKET_ID.bin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To retrieve the offers that a specific Nym has out on the market, use: &amp;lt;code&amp;gt;OT_API_getNym_MarketOffers&amp;lt;/code&amp;gt; This ''getNym''MarketOffers_ data is ''private'' and thus a lot more detailed than what's retrieved via &amp;lt;code&amp;gt;OT_API_Market_GetOffers&amp;lt;/code&amp;gt;, which is more meant for public use. After a successful retrieval, you can load the data from this location: &amp;lt;code&amp;gt;nyms/SERVER_ID/offers/NYM_ID.bin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to see the Nym's private list of his '''completed trades''', the path to load it from is here: &amp;lt;code&amp;gt;nyms/trades/SERVER_ID/NYM_ID&amp;lt;/code&amp;gt; There is no need to send a server message in this last case--just read the data from local storage directly. (When market trading receipts are accepted and cleared out of your inbox, this is where they will go. So there's no need to download them, since they were already downloaded through your inbox previously.) As before, the appropriate data object can be found in testwallet/OTAPI.i along with all the others.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
I will be very responsive to developer needs and questions regarding the OT API, so I encourage you to play with the software and contact me anytime.&lt;br /&gt;
&lt;br /&gt;
See also:&amp;lt;br&amp;gt;&lt;br /&gt;
[[API|The OT low-level API]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Install|Installation]] &amp;lt;br&amp;gt;&lt;br /&gt;
[https://github.com/FellowTraveler/Open-Transactions/wiki/opentxs opentxs command-line tool]&lt;br /&gt;
&lt;br /&gt;
[[List of Classes|The OT C++ class library]]&lt;br /&gt;
&lt;br /&gt;
''Diagrams:'' '''[http://billstclair.com/ot/ot-diagram.jpg Architecture Overview]''', '''[http://billstclair.com/ot/OT-Anon-CashOnly.jpg Fully-Anonymous]''' (cash only), and '''[http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg Pseudo-Anonymous]''' (using accounts).&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Use_Cases&amp;diff=3183</id>
		<title>Use Cases</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Use_Cases&amp;diff=3183"/>
		<updated>2015-07-08T22:46:15Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: updated a bit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* With that as your guide, a general rule of thumb is this: Anytime you need to do something, use the high-level API to do it (OT_ME.) Only if you can't find the function you are looking for, should you next resort to the low-level API (OTAPI.) And remember, you can always the copy the code you need from the test GUI, [http://github.com/Open-Transactions/Moneychanger Moneychanger].&lt;br /&gt;
&lt;br /&gt;
'''What does this mean for you? It means you no longer have to worry about synchronizing request numbers, or harvesting transaction numbers, or comparing inbox hashes, or downloading your nymbox, or dropped messages, or timeouts, or retries, etc!''' Instead, you use simple functions like '''send_transfer''' or '''withdraw_cash.''' The high-level API manages everything else behind the scenes. And any sample code you need can be copied right out of Moneychanger's code.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
NOTE: The below notes are old, but preserved for usefulness.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''USE CASES for the OT API, described on this page:'''&lt;br /&gt;
&lt;br /&gt;
* '''(Client software starts up.)''' Initialize the library and load the wallet.&lt;br /&gt;
* Display for user: '''Server Contracts, Nyms, Accounts, and Asset Types.'''&lt;br /&gt;
* Change the wallet's ''display label'' for any server, asset type, account, or nym.&lt;br /&gt;
* Import a server contract (or asset contract) to the wallet.&lt;br /&gt;
* Create a new '''Pseudonym''' (public/private key pair).&lt;br /&gt;
* Register a public key (a ''&amp;amp;quot;Nym&amp;amp;quot;'') at an OT server.&lt;br /&gt;
* '''Issue a new digital Asset Type'''. (Uploading an asset contract.)&lt;br /&gt;
* Retrieve Currency Contract (by ID).&lt;br /&gt;
* '''Create a new Asset Account'''.&lt;br /&gt;
* '''Write a cheque''' (or invoice)&lt;br /&gt;
* '''Send a Message''' to another user (via the server, encrypted to the recipient's public key.)&lt;br /&gt;
* '''Deposit a cheque'''&lt;br /&gt;
* '''Withdraw cash''' . . . . &amp;amp;lt;==== CHAUMIAN DIGITAL CASH!!&lt;br /&gt;
* '''Deposit cash'''&lt;br /&gt;
* Withdraw Voucher&lt;br /&gt;
* '''Account-to-Account Transfer'''&lt;br /&gt;
* Create a new '''Basket Currency'''&lt;br /&gt;
* '''Exchange''' Digital Assets '''in and out of Baskets''' (from your Asset Accounts)&lt;br /&gt;
* '''Process your Inbox''' (Receipts and pending transfers)&lt;br /&gt;
* Set up a '''Payment Plan'''&lt;br /&gt;
* Issue a '''Market Offer'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''USE CASES for the OT API'''&lt;br /&gt;
&lt;br /&gt;
'''Initialize the library and Load your Wallet'''&lt;br /&gt;
(The user starts up the wallet software.) &lt;br /&gt;
Call &amp;lt;code&amp;gt;OT_API_Init()&amp;lt;/code&amp;gt; Then call &amp;lt;code&amp;gt;OT_API_LoadWallet()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(NOTE: these above 2 steps are not necessary in OT-script, only Java and other languages.)&lt;br /&gt;
&lt;br /&gt;
'''Display the current list of server contracts on the screen''' Call &amp;lt;code&amp;gt;OT_API_GetServerCount()&amp;lt;/code&amp;gt;, which returns the number of server contracts in your wallet. For each one, call &amp;lt;code&amp;gt;OT_API_GetServer_ID()&amp;lt;/code&amp;gt; to get the Server ID (which is a hash of the contract.) Also for each, call &amp;lt;code&amp;gt;OT_API_GetServer_Name()&amp;lt;/code&amp;gt; to get the Display Name from the contract. In your GUI, display the name on the screen, but use the ID behind the scenes (for your messages to the server.)&lt;br /&gt;
&lt;br /&gt;
'''Do the same thing for Nyms, Accounts, and Asset Types.''' You can read about them on the [[API]] page, but here are the basic functions:&lt;br /&gt;
&lt;br /&gt;
OT_API_GetNymCount(void); &lt;br /&gt;
OT_API_GetServerCount(void); &lt;br /&gt;
OT_API_GetAssetTypeCount(void); &lt;br /&gt;
OT_API_GetAccountCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetNym_ID() and OT_API_GetNym_Name() &lt;br /&gt;
OT_API_GetServer_ID() and OT_API_GetServer_Name() &lt;br /&gt;
OT_API_GetAssetType_ID() and OT_API_GetAssetType_Name() &lt;br /&gt;
OT_API_GetAccountWallet_ID() and OT_API_GetAccountWallet_Name() &lt;br /&gt;
Also: &lt;br /&gt;
OT_API_GetAccountWallet_Balance() &lt;br /&gt;
OT_API_GetAccountWallet_Type() &lt;br /&gt;
OT_API_GetAccountWallet_AssetTypeID()&lt;br /&gt;
&lt;br /&gt;
'''Add a new server contract (or asset contract) to the wallet''' Call &amp;lt;code&amp;gt;OT_API_AddServerContract()&amp;lt;/code&amp;gt; &lt;br /&gt;
or &amp;lt;code&amp;gt;OT_API_AddAssetContract()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Create a new Pseudonym''' (Each user's wallet may contain many pseudonyms. Each Nym consists of a public and a private key, aka a &amp;amp;quot;key pair&amp;amp;quot;.) Call &amp;lt;code&amp;gt;OT_API_CreateNym()&amp;lt;/code&amp;gt; This creates a new key pair ''(&amp;quot;Nym&amp;quot;)'' in your wallet, which you can use for communications with an OT server. (That is, for opening asset accounts and performing various other transactions. A Nym is a &amp;amp;quot;user account&amp;amp;quot;.) (You can create as many of these pseudonyms as you want.) (You can register the same nyms at multiple servers.) (The same Nym will have the same Nym ID and public key on every server.)&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;def details_create_nym(nKeybits, strName)&lt;br /&gt;
{&lt;br /&gt;
    var madeEasy = OT_ME()    &lt;br /&gt;
    var strNymID = madeEasy.create_pseudonym(nKeybits, &amp;amp;quot;&amp;amp;quot;, &amp;amp;quot;&amp;amp;quot;)  // returns new Nym ID&lt;br /&gt;
    &lt;br /&gt;
    if (!VerifyStringVal(strNymID))&lt;br /&gt;
    {&lt;br /&gt;
        OT_API_Output(0, &amp;amp;quot;details_create_nym: Failed in OT_ME::create_pseudonym(keybits == &amp;amp;quot; + nKeybits.to_string() + &amp;amp;quot;)\n&amp;amp;quot;)&lt;br /&gt;
        return (0)&lt;br /&gt;
    }&lt;br /&gt;
    OT_API_Output(0, &amp;amp;quot;Success creating! &amp;amp;quot; + nKeybits.to_string() + &amp;amp;quot; keybits, new ID: &amp;amp;quot;) // stderr&lt;br /&gt;
    print(strNymID) // stdout&lt;br /&gt;
    OT_API_Output(0, &amp;amp;quot;\n&amp;amp;quot;) //stderr&lt;br /&gt;
    // -------------------&lt;br /&gt;
    var bSetName = OT_API_SetNym_Name(strNymID, // subject&lt;br /&gt;
                                      strNymID, // signer&lt;br /&gt;
                                      strName)&lt;br /&gt;
    if (!bSetName)&lt;br /&gt;
    {&lt;br /&gt;
        OT_API_Output(0, &amp;amp;quot;Failed in OT_API_SetNym_Name(name == &amp;amp;quot; + strName + &amp;amp;quot;)\n&amp;amp;quot;)&lt;br /&gt;
        return (0)&lt;br /&gt;
    }&lt;br /&gt;
    // -------------------    &lt;br /&gt;
    OT_API_Output(0, &amp;amp;quot;Success setting name to: &amp;amp;quot; + strName + &amp;amp;quot;\n\n&amp;amp;quot;) // stderr&lt;br /&gt;
    return 1&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Register a public key (aka &amp;quot;Nym&amp;quot;) at an OT server'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    var madeEasy    = OT_ME()&lt;br /&gt;
    if (VerifyExists(&amp;amp;quot;Server&amp;amp;quot;) &amp;amp;amp;&amp;amp;amp; VerifyExists(&amp;amp;quot;MyNym&amp;amp;quot;))&lt;br /&gt;
    {        &lt;br /&gt;
        var strResponse = madeEasy.register_nym(Server, MyNym)&lt;br /&gt;
        var nSuccess    = VerifyMessageSuccess(strResponse)&lt;br /&gt;
        switch(nSuccess)&lt;br /&gt;
        {&lt;br /&gt;
            case (1)&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;amp;quot;\n\n SUCCESS in register_nym! Server response:\n\n&amp;amp;quot;);&lt;br /&gt;
                print(strResponse) // stdout&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
            default&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;amp;quot;\n\n Failure or Error in register_nym!\n&amp;amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                if (VerifyStringVal(strResponse))&lt;br /&gt;
                {&lt;br /&gt;
                    OT_API_Output(0, &amp;amp;quot;Server response:\n\n&amp;amp;quot;);&lt;br /&gt;
                    print(strResponse) // stdout&lt;br /&gt;
                }&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
        }&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Change the wallet's label for any server/asset type/account/nym'''&amp;lt;br&amp;gt; &lt;br /&gt;
(This is only a client-side label, for display purposes only.)&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_SetNym_Name()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_SetAccountWallet_Name()&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_SetAssetType_Name()&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_SetServer_Name()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''Issue a new digital Asset Type''' User uploads a new currency contract to the server, so users can create asset accounts based on that asset type. Server replies with a new issuer account ID (The new Issuer account appears inside your wallet's account list, so go ahead and iterate the list again, in order to display the updated list of accounts on the screen.)&lt;br /&gt;
&lt;br /&gt;
High-level API version (in OT script):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        var madeEasy    = OT_ME()&lt;br /&gt;
        OT_API_Output(0, &amp;amp;quot;Please paste a currency contract, followed by an EOF or a ~ by itself on a blank line:\n\n&amp;amp;quot;)&lt;br /&gt;
        var strContract = OT_CLI_ReadUntilEOF() &lt;br /&gt;
        var strResponse = madeEasy.issue_asset_type(Server, MyNym, strContract)&lt;br /&gt;
        var nStatus     = VerifyMessageSuccess(strResponse)&lt;br /&gt;
        &lt;br /&gt;
        switch(nStatus)&lt;br /&gt;
        {&lt;br /&gt;
            case (1)&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;amp;quot;\n\n SUCCESS in issue_asset! Server response:\n\n&amp;amp;quot;);&lt;br /&gt;
                print(strResponse) // stdout&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
            default&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;amp;quot;\n\n Failure or error in issue_asset. nStatus: &amp;amp;quot;+nStatus.to_string()+&amp;amp;quot;\n&amp;amp;quot;)&lt;br /&gt;
                if (VerifyStringVal(strResponse))&lt;br /&gt;
                {&lt;br /&gt;
                    OT_API_Output(0, &amp;amp;quot;Server response:\n\n&amp;amp;quot;);&lt;br /&gt;
                    print(strResponse) // stdout&lt;br /&gt;
                }&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
        }&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Retrieve Currency Contract (by ID)''' User wants to download a currency contract from the server (for a given asset type ID.) (The asset type ID is a hash of the contract, so OT will know if you get the wrong one, since this is verified whenever a contract is loaded up.)&lt;br /&gt;
&lt;br /&gt;
High-level API version (in OT script):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    var madeEasy    = OT_ME()&lt;br /&gt;
    var strRetrieved   = madeEasy.retrieve_contract(Server, MyNym, strContractID)&lt;br /&gt;
    var nRetrieved     = VerifyMessageSuccess(strRetrieved)    &lt;br /&gt;
    var strSuccess = &amp;amp;quot;ERROR&amp;amp;quot;&lt;br /&gt;
    if (1 == nRetrieved)&lt;br /&gt;
    {   strSuccess = &amp;amp;quot;SUCCESS&amp;amp;quot; }&lt;br /&gt;
    else if (0 == nRetrieved)&lt;br /&gt;
    {   strSuccess = &amp;amp;quot;FAILED&amp;amp;quot; }&lt;br /&gt;
    OT_API_Output(0, &amp;amp;quot;\n\n &amp;amp;quot; + strSuccess + &amp;amp;quot; retrieving contract: &amp;amp;quot;+strContractID+&amp;amp;quot;\n\n&amp;amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Create a new Asset Account''' Example in OT Script, from the [https://github.com/FellowTraveler/Open-Transactions/tree/master/scripts/samples sample scripts] folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def OT_ME::create_asset_acct(SERVER_ID, NYM_ID, ASSET_TYPE_ID) &lt;br /&gt;
    {&lt;br /&gt;
        var ot_Msg := OTAPI_Func()&lt;br /&gt;
        // -------------------------&lt;br /&gt;
        var theRequest := OTAPI_Func(ot_Msg.CREATE_ASSET_ACCT, SERVER_ID, NYM_ID, ASSET_TYPE_ID)&lt;br /&gt;
        var     strResponse = theRequest.SendRequest(theRequest, &amp;quot;CREATE_ASSET_ACCT&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        return strResponse&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it was a SUCCESS, then refresh the list of accounts in your display (from the OT API) since your new asset account should now be there.&lt;br /&gt;
&lt;br /&gt;
(You can also use the &amp;amp;quot;decode&amp;amp;quot; command in the test wallet anytime you want to base64-decode something.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''TRANSACTIONS'''&lt;br /&gt;
&lt;br /&gt;
FYI: Balance agreement, combined with transaction numbers, is what makes it possible for the server and all other parties to ''eliminate account history, instead storing only the last signed receipt.'' (Of course they have the ''choice'' to keep their own records--but they are no longer ''forced'' to do so.)&lt;br /&gt;
&lt;br /&gt;
In order to do any transaction, the wallet's ''balance agreement'' process requires that you have the latest copy of your account, inbox, and outbox files. You don't have to worry about this too much, since the high-level API will usually handle it for you.&lt;br /&gt;
&lt;br /&gt;
'''You might ask: &amp;quot;But what if I download my account, or my outbox, and the server has maliciously inserted data into them?&amp;quot;''' ''No problem'' -- Open Transactions stores the last signed receipt from the server, and is able to verify the new intermediary files against that last receipt. You can see this happening when you run the command-line test client, and receipts can be verified programmatically using &amp;lt;code&amp;gt;OT_API_VerifyAccountReceipt()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The [[Triple Signed Receipts]] on Open Transactions ensure that this sort of protection is available to all parties, '''while simultaneously not having to store any transaction history!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''Write a Cheque''' Alice writes a cheque (offline): Call &amp;lt;code&amp;gt;OT_API_WriteCheque()&amp;lt;/code&amp;gt; Alice then gives cheque to Bob (offline), ''or'' online if she prefers via &amp;lt;code&amp;gt;OT_API_sendUserMessage()&amp;lt;/code&amp;gt; function. If Alice has Bob's UserID but not his public key, her wallet first uses &amp;lt;code&amp;gt;OT_API_checkUser()&amp;lt;/code&amp;gt; to retrieve his public key from the server, and then encrypts the cheque before sending it.&lt;br /&gt;
&lt;br /&gt;
NOTE: a quality wallet software will keep track of ALL instruments! Even when Alice gives a cheque to Bob, her wallet should still store a copy of that cheque. Until when? Until at least after he has cashed it... when he does that, a chequeReceipt will appear in her inbox. Only when she accepts that receipt, signing a new balance agreement, is she finally free of the transaction number that was on that cheque. (It was still signed-out to her, all the way up until that time.)&lt;br /&gt;
&lt;br /&gt;
WHAT IF Bob had never cashed it? WHAT IF he lost it? Is Alice supposed to just keep signing for that number forever? (The chequeReceipt will never appear in her inbox. She is doomed to continue signing for this number on all of her receipts on into the future, ad infinitum, with no hope of ever closing it out!)&lt;br /&gt;
&lt;br /&gt;
Fear not, there is a solution: &amp;lt;code&amp;gt;OT_API_DiscardCheque()&amp;lt;/code&amp;gt;. (Lucky you saved a copy of that cheque in your wallet, eh?) This function will retrieve Alice's transaction # back from the cheque, so that her wallet is free to use it on her next valid transaction, and then close it out normally.&lt;br /&gt;
&lt;br /&gt;
'''Deposit a cheque''' (A voucher is also a cheque, so you may deposit a voucher here the same as any other cheque.) Bob sends message to server requesting deposit:&lt;br /&gt;
&lt;br /&gt;
'''(High level API version, in Java.)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    public boolean depositCheque(String serverID, String nymID, String accountID, String cheque) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In depositCheque serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.DEPOSIT_CHEQUE, serverID, nymID, accountID, cheque);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;DEPOSIT_CHEQUE&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in depositCheque.&amp;quot;);&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // -------------------------------------------------------------------------------------- &lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Withdraw cash''' Alice's wallet first makes sure she has the latest public mint file, by calling &amp;lt;code&amp;gt;OT_API_getMint()&amp;lt;/code&amp;gt;. (Note: if the mint she already has is within its valid date range, there's no need to do this.) (Note: If she does call getMint, Alice needs to check the server reply and make sure it was successful before continuing with the withdrawal. The public mint keys are necessary for cash withdrawal.) Alice then withdraws from her asset account, by messaging server: &amp;lt;code&amp;gt;OT_API_notarizeWithdrawal()&amp;lt;/code&amp;gt; Server replies with chaumian cash, which is stored in the purse folder in local storage.&lt;br /&gt;
&lt;br /&gt;
Here is the full Java implementation of Withdraw Cash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    public boolean withdrawCash(String serverID, String nymID, String accountID, String amount) &lt;br /&gt;
    {&lt;br /&gt;
        String serverResponseMessage = null;&lt;br /&gt;
        System.out.println(&amp;quot;In withdrawCash serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
        String assetID = otapi.OT_API_GetAccountWallet_AssetTypeID(accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------- &lt;br /&gt;
        // Make sure we have the proper asset contract for the withdrawal.&lt;br /&gt;
        //&lt;br /&gt;
        String assetContract = otapi.OT_API_LoadAssetContract(assetID);&lt;br /&gt;
        if (assetContract == null) {&lt;br /&gt;
            OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.GET_CONTRACT, serverID, nymID, assetID);&lt;br /&gt;
            String strResponse = OTAPI_Func.SendRequest(theRequest, &amp;quot;GET_CONTRACT&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (null == strResponse) {&lt;br /&gt;
                System.out.println(&amp;quot;IN withdrawCash: OTAPI_Func.SendRequest(GET_CONTRACT) failed. (I give up.) (Unable to find asset contract.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            assetContract = otapi.OT_API_LoadAssetContract(assetID);&lt;br /&gt;
            if (assetContract == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadAssetContract returned null even after OT_API_getContract (Unable to find asset contract.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        // Download the public mintfile if it's not there, or if it's expired.&lt;br /&gt;
        // Also load it up into memory as a string (just to make sure it works.)&lt;br /&gt;
        // Then we can actually send the withdrawal transaction request. (Until&lt;br /&gt;
        // then, why bother?)&lt;br /&gt;
        //&lt;br /&gt;
        String mintFile;&lt;br /&gt;
&lt;br /&gt;
        // expired or missing.&lt;br /&gt;
        if (1 != otapi.OT_API_Mint_IsStillGood(serverID, assetID)) &lt;br /&gt;
        {&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.GET_MINT, serverID, nymID, assetID);&lt;br /&gt;
            String strResponse = OTAPI_Func.SendRequest(theRequest, &amp;quot;GET_MINT&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (null == strResponse) {&lt;br /&gt;
                System.out.println(&amp;quot;IN withdrawCash: OTAPI_Func.SendRequest(GET_MINT) failed. (I give up.) (Unable to get mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            mintFile = otapi.OT_API_LoadMint(serverID, assetID);&lt;br /&gt;
            if (mintFile == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadMint returned null even after OT_API_getMint (I give up.) (Unable to find mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else // current mint IS available already on local storage (and not expired.)&lt;br /&gt;
        {&lt;br /&gt;
            mintFile = otapi.OT_API_LoadMint(serverID, assetID);&lt;br /&gt;
            if (mintFile == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadMint returned null even after successful OT_API_Mint_IsStillGood (I give up.) (Unable to find mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        // By this point, the mintfile is DEFINITELY good (available, not null, &lt;br /&gt;
        // not expired, and loaded up.) Now we know for a fact that when the API&lt;br /&gt;
        // call is made to withdraw cash, that it will find the mint properly.&lt;br /&gt;
        //&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.WITHDRAW_CASH, serverID, nymID, accountID, amount);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;WITHDRAW_CASH&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in withdrawCash.&amp;quot;);&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // --------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deposit cash''' Here is the complete Java implementation for Deposit Cash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean depositCash(String serverID, String nymID, String accountID, String purse, boolean isToken) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In depositCash serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID + &amp;quot; isToken:&amp;quot; + isToken);&lt;br /&gt;
        Utility.setOtDepositCash(null);&lt;br /&gt;
        String oldPurse = purse;&lt;br /&gt;
        if (isToken) {&lt;br /&gt;
            purse = getNewPurse(purse, serverID, nymID, accountID);&lt;br /&gt;
            System.out.println(&amp;quot;purse after getting from push purse:&amp;quot; + purse);&lt;br /&gt;
            if (purse == null) {&lt;br /&gt;
                Utility.setOtDepositCash(oldPurse);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // ----------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.DEPOSIT_CASH, serverID, nymID, accountID, purse);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;DEPOSIT_CASH&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;IN depositCash: OTAPI_Func.SendTransaction(() failed. (I give up.) &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (isToken) {&lt;br /&gt;
                System.out.println(&amp;quot;IN depositCash, failed action for single token&amp;quot;);&lt;br /&gt;
                String assetID = otapi.OT_API_GetAccountWallet_AssetTypeID(accountID);&lt;br /&gt;
                boolean importStatus = otapi.OT_API_Wallet_ImportPurse(serverID, assetID, nymID, purse) == 1 ? true : false;&lt;br /&gt;
                System.out.println(&amp;quot;Since failure of depositCashPurse, OT_API_Wallet_ImportPurse called, status of import:&amp;quot; + importStatus);&lt;br /&gt;
                if (!importStatus) {&lt;br /&gt;
                    Utility.setOtDepositCash(purse);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // ----------------------------------------&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
Note about local storage: Usually whenever something important is downloaded from the server, the OT API will save it automatically to the default storage context, and you can then load it up using another API call. This is usually the most convenient way to do things.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''Account-to-Account Transfer''' A ''pending transfer'' will go into your outbox, and the recipient's inbox, pending acceptance by the recipient. FYI, every asset account has its own inbox and outbox for handling pending transactions, as well as receipts. FYI, every Nym similarly has its own Nymbox, used for receiving messages from other users, and for receiving new transaction numbers from the server.&lt;br /&gt;
&lt;br /&gt;
Here is the OT Script implementation of Send Transfer, from the [https://github.com/FellowTraveler/Open-Transactions/tree/master/scripts/samples sample scripts] folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def OT_ME::send_transfer(SERVER_ID, NYM_ID, ACCT_FROM, ACCT_TO, AMOUNT, NOTE) &lt;br /&gt;
    {&lt;br /&gt;
        var ot_Msg := OTAPI_Func()&lt;br /&gt;
        // -------------------------&lt;br /&gt;
        var theRequest := OTAPI_Func(ot_Msg.SEND_TRANSFER, SERVER_ID, NYM_ID, ACCT_FROM, ACCT_TO, AMOUNT, NOTE)&lt;br /&gt;
        var     strResponse = theRequest.SendTransaction(theRequest, &amp;quot;SEND_TRANSFER&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        return strResponse&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Withdraw Voucher''' A voucher is like a &amp;amp;quot;money order&amp;amp;quot; or &amp;amp;quot;cashier's cheque&amp;amp;quot;. It's a cheque, but drawn on a server account, instead of your own account. Withdrawing in voucher form is similar to withdrawing in cash: the server debits your asset account, and then gives you an official cheque.&lt;br /&gt;
&lt;br /&gt;
But with cash, it's automatically saved to your purse, whereas with a voucher, you have to read the voucher out of the server reply, and display it on the screen!&lt;br /&gt;
&lt;br /&gt;
Here is the complete Java code to perform Withdraw Voucher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String withdrawVoucher(String serverID, String nymID, String accountID, String amount, String chequeMemo, String recepientNymID) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In withdrawVoucher serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.WITHDRAW_VOUCHER, serverID, nymID, accountID, recepientNymID, chequeMemo, amount);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;WITHDRAW_VOUCHER&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in withdrawVoucher.&amp;quot;);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        String ledger = otapi.OT_API_Message_GetLedger(strResponse);&lt;br /&gt;
        if (ledger == null) {&lt;br /&gt;
            System.out.println(&amp;quot; ledger is null, returned by OT_API_Message_GetLedger, serverResponseMessage passed as argument&amp;quot;);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        String transaction = otapi.OT_API_Ledger_GetTransactionByIndex(serverID, nymID, accountID, ledger, 0);&lt;br /&gt;
        if (transaction == null) {&lt;br /&gt;
            System.out.println(&amp;quot;withdrawVoucher: transaction is null, returned by OT_API_Ledger_GetTransactionByIndex, argument passed, index 0 and ledger :&amp;quot; + ledger);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        String output = otapi.OT_API_Transaction_GetVoucher(serverID, nymID, accountID, transaction);&lt;br /&gt;
        System.out.println(&amp;quot;output returned by OT_API_Transaction_GetVoucher:&amp;quot; + output);&lt;br /&gt;
&lt;br /&gt;
        return output;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''BASKET CURRENCIES'''&lt;br /&gt;
&lt;br /&gt;
'''Create a new Basket Currency''' First, invent the basket in your head. Give it name: ''&amp;amp;quot;Clams.&amp;amp;quot;'' &lt;br /&gt;
Next, give it a ratio in terms of other existing currencies: ''&amp;amp;quot;10 Clams equals a basket of 5 dollars, 3 Euro, and 20 Bitcoin&amp;amp;quot;.'' Call &amp;lt;code&amp;gt;OT_API_GenerateBasketCreation()&amp;lt;/code&amp;gt; to begin creating the basket. The ''&amp;amp;quot;10 Clams&amp;amp;quot;'' from above is set here. Next, call &amp;lt;code&amp;gt;OT_API_AddBasketCreationItem()&amp;lt;/code&amp;gt; for EACH currency in the basket. In the above example, I would call this function 3 times, in order to set the ''&amp;amp;quot;5 dollars&amp;amp;quot;'' the ''&amp;amp;quot;3 Euro&amp;amp;quot;'' and the ''&amp;amp;quot;20 Bitcoin&amp;amp;quot;'' from above. Now that the basket has been defined, call &amp;lt;code&amp;gt;OT_API_issueBasket()&amp;lt;/code&amp;gt; to actually create the basket currency on the server. (Now you have created a new asset type--a basket--which the server will control. Any user may now create accounts using this type! And from there, they can write cheques, withdraw cash, trade on markets, etc. the same as with any other asset type.)&lt;br /&gt;
&lt;br /&gt;
'''Exchange Digital Assets in/out of a Basket Currency (from your Asset Accounts)''' First, call &amp;lt;code&amp;gt;OT_API_GenerateBasketExchange()&amp;lt;/code&amp;gt; to setup the exchange. You'll need to know the basket's asset type, and you'll need to have an existing asset account of that type. You will also set the &amp;amp;quot;transfer multiple&amp;amp;quot; in that call. What's the transfer multiple? Remember the ratio above: &amp;amp;quot;10 Clams equals a basket of 5 dollars, 3 Euro, and 20 Bitcoin&amp;amp;quot;&lt;br /&gt;
&lt;br /&gt;
Here are examples of the transfer multiple: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;quot;10 Clams == 5 USD, 3 EUR, 20 BIT&amp;amp;quot; (Transfer multiple: 1) &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;quot;20 Clams == 10 USD, 6 EUR, 40 BIT&amp;amp;quot; (Transfer multiple: 2) &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;quot;30 Clams == 15 USD, 9 EUR, 60 BIT&amp;amp;quot; (Transfer multiple: 3) &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;quot;40 Clams == 20 USD, 12 EUR, 80 BIT&amp;amp;quot; (Transfer multiple: 4) &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;quot;50 Clams == 25 USD, 15 EUR, 100 BIT&amp;amp;quot; (Transfer multiple: 5)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, call &amp;lt;code&amp;gt;OT_API_AddBasketExchangeItem()&amp;lt;/code&amp;gt; for each currency type in the basket. You will need to to pass the asset account ID for an existing asset account, for each currency type (since you are converting in or out, from your basket account, to your asset accounts.) Therefore you will call this function once for USD, once for EUR, and once for BIT, in that example, passing in your USD asset acct ID, your EUR asset acct ID, and your Bitcoin asset account ID.&lt;br /&gt;
&lt;br /&gt;
Now that it's all set up, call &amp;lt;code&amp;gt;OT_API_exchangeBasket()&amp;lt;/code&amp;gt; to actually message the server and perform the exchange.&lt;br /&gt;
&lt;br /&gt;
'''Interesting: basket currencies themselves require no more additional system resources than normal currencies!''' The magic happens during the exchange process. The server simply stores internal asset accounts for the dollars, euros, and bitcoins (say), and it manages the issuer account for the basket, and it also manages the exchanging in and out, by moving digital assets in or out of the internal backing accounts. After that point, a basket is just another Asset Type ID, and requires no additional resources. You can even have baskets made up of other baskets, nested 10 times, and it won't affect the speed of operation of the server!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''PROCESSING YOUR INBOX'''&lt;br /&gt;
&lt;br /&gt;
'''Process the Receipts and Pending Transfers in your Inbox''' &amp;lt;br&amp;gt;&lt;br /&gt;
If you wish, call &amp;lt;code&amp;gt;OT_API_getInbox()&amp;lt;/code&amp;gt; to grab the latest inbox from the server. In the high-level API, this is often just automated for you, but nevertheless, check out the dl_acct_files.ot script. See also show_inbox.ot, etc.&lt;br /&gt;
&lt;br /&gt;
During this time, your user has the opportunity to peruse the inbox, and to decide which transactions therein he wishes to accept or reject. Usually the inbox is display on the screen, then the user selects various items to accept or reject, and then the user clicks &amp;amp;quot;Process Inbox&amp;amp;quot; and then you do this:&lt;br /&gt;
&lt;br /&gt;
Then call &amp;lt;code&amp;gt;OT_API_Ledger_CreateResponse()&amp;lt;/code&amp;gt; in order to create a 'response' ledger for that inbox, which will be sent to the server to signal your responses to the various inbox transactions. &amp;lt;br&amp;gt;Then call &amp;lt;code&amp;gt;OT_API_Ledger_GetCount()&amp;lt;/code&amp;gt; (pass it the inbox) to find out how many transactions are inside of it. Use that count to LOOP through them... &lt;br /&gt;
&amp;lt;br&amp;gt;Use &amp;lt;code&amp;gt;OT_API_Ledger_GetTransactionByIndex()&amp;lt;/code&amp;gt; to grab each transaction as you iterate through the inbox. (There are various introspection functions you can use in the API here if you wish to display the inbox items on the screen for the user...) &lt;br /&gt;
&amp;lt;br&amp;gt;Next call &amp;lt;code&amp;gt;OT_API_Transaction_CreateResponse()&amp;lt;/code&amp;gt; for each transaction in the inbox, to create a response to it, accepting or rejecting it. This function creates the response and adds it to the response ledger. &lt;br /&gt;
&amp;lt;br&amp;gt;Next, call &amp;lt;code&amp;gt;OT_API_Ledger_FinalizeResponse()&amp;lt;/code&amp;gt; which will create a ''Balance Agreement'' for the ledger. &lt;br /&gt;
&amp;lt;br&amp;gt;Finally, call &amp;lt;code&amp;gt;OT_API_processInbox()&amp;lt;/code&amp;gt; to send your message to the server and process the various items. (See the accept_inbox.ot script.)&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use &amp;lt;code&amp;gt;OT_API_Message_GetBalanceAgreementSuccess()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;OT_API_Message_GetTransactionSuccess()&amp;lt;/code&amp;gt; to see just ''how'' successful.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
'''MARKETS and PAYMENT PLANS'''&lt;br /&gt;
&lt;br /&gt;
'''Setup a Payment Plan''' The Merchant draws up the Payment Plan using &amp;lt;code&amp;gt;OT_API_ProposePaymentPlan&amp;lt;/code&amp;gt; Then he sends it to the Customer, who calls &amp;lt;code&amp;gt;OT_API_ConfirmPaymentPlan&amp;lt;/code&amp;gt; The Customer's wallet activates the payment plan by sending it to the server using this function: &amp;lt;code&amp;gt;OT_API_depositPaymentPlan()&amp;lt;/code&amp;gt; (Receipts will process into the respective parties' inboxes.) Use OT_API_cancelCronItem() to cancel any payment plan (or market offer.)&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use &amp;lt;code&amp;gt;OT_API_Message_GetBalanceAgreementSuccess()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;OT_API_Message_GetTransactionSuccess()&amp;lt;/code&amp;gt; as described above in the ''deposit cash'' instructions.&lt;br /&gt;
&lt;br /&gt;
'''Issue a [[Markets|Market]] Offer'''&lt;br /&gt;
&lt;br /&gt;
Call this function: &amp;lt;code&amp;gt;OT_API_issueMarketOffer()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
(That's the low-level one. See create_offer.ot script for the high-level version.)&amp;lt;br&amp;gt; &lt;br /&gt;
Call &amp;lt;code&amp;gt;OT_API_Message_GetSuccess&amp;lt;/code&amp;gt; to find out if the message was a SUCCESS or FAILURE.&amp;lt;br&amp;gt;&lt;br /&gt;
If the message was successful, then use &amp;lt;code&amp;gt;OT_API_Message_GetBalanceAgreementSuccess()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;OT_API_Message_GetTransactionSuccess()&amp;lt;/code&amp;gt; as described above in the ''deposit cash'' instructions.&amp;lt;br&amp;gt; &lt;br /&gt;
See the OTScript and Java versions of these calls.&lt;br /&gt;
&lt;br /&gt;
Once an offer goes onto the market, multiple trades may occur between it and the other offers on the market. (According to the rules in the offers.) Receipts will process into the respective parties' inboxes after each trade.&lt;br /&gt;
&lt;br /&gt;
'''Cancel a Market Offer''' Use &amp;lt;code&amp;gt;OT_API_cancelNymMarketOffer&amp;lt;/code&amp;gt; to remove an offer from a market. If the message was successful, then use &amp;lt;code&amp;gt;OT_API_Message_GetBalanceAgreementSuccess()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;OT_API_Message_GetTransactionSuccess()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Retrieving Market Data from OT Server:''' &amp;lt;code&amp;gt;OT_API_getMarketList&amp;lt;/code&amp;gt; retrieves a list of all the markets available on a specific server, and details for each market. If the server call is a success, the data will be retrieved from the OT server, and written to local storage using the OT Storage API, at this path or key (inside your data_folder location): &amp;lt;code&amp;gt;markets/SERVER_ID/market_data.bin&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
If you want to verify whether the data is now available in local storage (after a successful call to getMarketList), your code would look like this: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;if (otapi.Exists(&amp;amp;quot;markets&amp;amp;quot;, serverID, &amp;amp;quot;market_data.bin&amp;amp;quot;)) bFoundFile = true;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is some Java code that reads the market list object from local storage, assuming bFoundFile is true:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;Java&amp;quot;&amp;gt;    MarketList marketList = null;&lt;br /&gt;
    Storable storable = null;&lt;br /&gt;
&lt;br /&gt;
    if (otapi.Exists(&amp;amp;quot;markets&amp;amp;quot;, serverID, &amp;amp;quot;market_data.bin&amp;amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        storable =&lt;br /&gt;
            otapi.QueryObject(StoredObjectType.STORED_OBJ_MARKET_LIST,&lt;br /&gt;
                &amp;amp;quot;markets&amp;amp;quot;, serverID, &amp;amp;quot;market_data.bin&amp;amp;quot;);&lt;br /&gt;
        if (storable==null)&lt;br /&gt;
            return null;&lt;br /&gt;
            marketList = MarketList.ot_dynamic_cast(storable);&lt;br /&gt;
        }&amp;lt;/pre&amp;gt;&lt;br /&gt;
Once you have the market list, here is some sample Java code to read the details of an individual market from that list:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;Java&amp;quot;&amp;gt;public static Object getMarketDetails(String marketID)&lt;br /&gt;
{&lt;br /&gt;
    MarketList marketList = Utility.getMarketList();&lt;br /&gt;
&lt;br /&gt;
    if (marketList == null) &lt;br /&gt;
    {&lt;br /&gt;
        return null;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (int i=0; i &amp;amp;lt; marketList.GetMarketDataCount(); i++)&lt;br /&gt;
    {&lt;br /&gt;
        MarketData marketData = marketList.GetMarketData(i);&lt;br /&gt;
&lt;br /&gt;
        if (marketData == null)&lt;br /&gt;
            continue;&lt;br /&gt;
&lt;br /&gt;
        String [] row = new String[2];&lt;br /&gt;
&lt;br /&gt;
        if (marketID.equals(marketData.getMarket_id())) &lt;br /&gt;
        {&lt;br /&gt;
            String[] data = new String[2];&lt;br /&gt;
            marketData.getLast_sale_price();&lt;br /&gt;
            marketData.getCurrent_ask();&lt;br /&gt;
            &lt;br /&gt;
            // Etc!! This is where you get the market details.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // return custom object here (row/data or whatever), or null if failure..&lt;br /&gt;
    return null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_getMarketOffers&amp;lt;/code&amp;gt; retrieves publicly-available info for all offers on a specific market, up until maximum depth, and saves the data here: &amp;lt;code&amp;gt;markets/SERVER_ID/offers/MARKET_ID.bin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(See testwallet/OTAPI.i for ALL DATA OBJECTS that are used in local storage, including market offers, recent trades, etc. See the code above for a sample on how those data objects are used.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;OT_API_getMarketRecentTrades&amp;lt;/code&amp;gt;: Retrieves all recent trades on a market (up until maximum depth), and stores them here: &amp;lt;code&amp;gt;markets/SERVER_ID/recent/MARKET_ID.bin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To retrieve the offers that a specific Nym has out on the market, use: &amp;lt;code&amp;gt;OT_API_getNym_MarketOffers&amp;lt;/code&amp;gt; This ''getNym''MarketOffers_ data is ''private'' and thus a lot more detailed than what's retrieved via &amp;lt;code&amp;gt;OT_API_Market_GetOffers&amp;lt;/code&amp;gt;, which is more meant for public use. After a successful retrieval, you can load the data from this location: &amp;lt;code&amp;gt;nyms/SERVER_ID/offers/NYM_ID.bin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to see the Nym's private list of his '''completed trades''', the path to load it from is here: &amp;lt;code&amp;gt;nyms/trades/SERVER_ID/NYM_ID&amp;lt;/code&amp;gt; There is no need to send a server message in this last case--just read the data from local storage directly. (When market trading receipts are accepted and cleared out of your inbox, this is where they will go. So there's no need to download them, since they were already downloaded through your inbox previously.) As before, the appropriate data object can be found in testwallet/OTAPI.i along with all the others.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
I will be very responsive to developer needs and questions regarding the OT API, so I encourage you to play with the software and contact me anytime.&lt;br /&gt;
&lt;br /&gt;
See also:&amp;lt;br&amp;gt;&lt;br /&gt;
[[API|The OT low-level API]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Install|Installation]] &amp;lt;br&amp;gt;&lt;br /&gt;
[https://github.com/FellowTraveler/Open-Transactions/wiki/opentxs opentxs command-line tool]&lt;br /&gt;
&lt;br /&gt;
[[List of Classes|The OT C++ class library]]&lt;br /&gt;
&lt;br /&gt;
''Diagrams:'' '''[http://billstclair.com/ot/ot-diagram.jpg Architecture Overview]''', '''[http://billstclair.com/ot/OT-Anon-CashOnly.jpg Fully-Anonymous]''' (cash only), and '''[http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg Pseudo-Anonymous]''' (using accounts).&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Components_and_GNU_Licensing&amp;diff=3182</id>
		<title>Components and GNU Licensing</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Components_and_GNU_Licensing&amp;diff=3182"/>
		<updated>2015-07-08T22:39:51Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: added consortia&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Open-Transactions is available under the '''[https://www.mozilla.org/MPL/2.0/ MPLv2 license.]''' The main components of Open-Transactions are the core library, the client API, the 'opentxs' command-line tool, the opentxs-notary server, and the Moneychanger GUI desktop application.&lt;br /&gt;
&lt;br /&gt;
RELAXATION IN LICENSING: In 2015, the Open-Transactions licensing relaxed from AGPLv3 to MPLv2. What was our rationale for the change?&lt;br /&gt;
&lt;br /&gt;
First, MPLv2 is much more business-friendly than GPL. For example, you can use MPL'd code files inside proprietary software projects. And importantly, you can also use MPL'd code to build apps for the Apple App Store and the Google Play Store. (This is important for making OT available on mobile devices.)&lt;br /&gt;
&lt;br /&gt;
Importantly, MPLv2 is still a copyleft license, similar to GPL. The license terms mandate that improvements made to the OT source code itself ''must'' be released back to the open-source community under the MPLv2 license. This ensures that the open-source community will continue to benefit from any improvements made to OT by commercial entities.&lt;br /&gt;
&lt;br /&gt;
The MPLv2 license is fully-compatible with GPLv3, as well as with BSD/MIT licenses and proprietary licenses. This means OT can be utilized in any software project, including any commercial project, without fear of legal repercussions.&lt;br /&gt;
&lt;br /&gt;
The OT code base has many different contributors, and so the open-source community will never have to worry about a single copyright-holder trying to regain control over how it is used.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
Links: &lt;br /&gt;
&amp;lt;br&amp;gt;[http://www.fsf.org/ Free Software Movement].&lt;br /&gt;
&lt;br /&gt;
Copyleft licenses create a [http://www.dwheeler.com/blog/2006/09/01/#gpl-bsd protective legal buffer zone] so that a long-term community can build around the software, safely contributing to it in a consortia-like arrangement, to the benefit of all, even amongst a large group of business competitors (see Linux, for example.) Copyleft licenses create an incentive for separate entities to plow money into development of the software, without any fear that their competitors will simply copy the code without reciprocating.&lt;br /&gt;
&lt;br /&gt;
----------&lt;br /&gt;
&lt;br /&gt;
David Wheeler explains why a copyleft license like GPL can benefit a software project, on [http://www.dwheeler.com/blog/2006/09/01/#gpl-bsd his blog:]&lt;br /&gt;
&lt;br /&gt;
'''GPL, BSD, and NetBSD - why the GPL rocketed Linux to success'''&lt;br /&gt;
&lt;br /&gt;
Charles M. Hannum (one of the 4 originators of NetBSD) has posted a sad article about serious problems in the NetBSD project, saying &amp;amp;quot;the NetBSD Project has stagnated to the point of irrelevance.&amp;amp;quot; You can see the article or an LWN article about it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;There are still active FreeBSD and OpenBSD communities, and there's much positive to say about FreeBSD and OpenBSD. I use them occasionally, and I always welcome a chance to talk to their developers - they're sharp folks. Perhaps NetBSD will partly revive. But systems based on the Linux kernel (&amp;amp;quot;Linux&amp;amp;quot;) absolutely stomp the *BSDs (FreeBSD, OpenBSD, and NetBSD) in market share. And Linux-based systems will continue to stomp on the *BSDs into the foreseeable future.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;I think there is one primary reason Linux-based systems completely dominate the *BSDs' market share - Linux uses the protective GPL license, and the *BSDs use the permissive (&amp;amp;quot;BSD-style&amp;amp;quot;) licenses. The BSD license has been a lot of trouble for all the *BSDs, even though they keep protesting that it's good for them. But look what happens. Every few years, for many years, someone has said, &amp;amp;quot;Let's start a company based on this BSD code!&amp;amp;quot; BSD/OS in particular comes to mind, but Sun (SunOS) and others have done the same. They pull the *BSD code in, and some of the best BSD developers, and write a proprietary derivative. But as a proprietary vendor, their fork becomes expensive to self-maintain, and eventually the company founders or loses interest in that codebase (BSD/OS is gone; Sun switched to Solaris). All that company work is then lost forever, and good developers were sucked away during that period. Repeat, repeat, repeat. That's enough by itself to explain why the BSDs don't maintain the pace of Linux kernel development. But wait - it gets worse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;In contrast, the GPL has enforced a consortia-like arrangement on any major commercial companies that want to use it. Red Hat, Novell, IBM, and many others are all contributing as a result, and they feel safe in doing so because the others are legally required to do the same. Just look at the domain names on the Linux kernel mailing list - big companies, actively paying for people to contribute. In July 2004, Andrew Morton addressed a forum held by U.S. Senators, and reported that most Linux kernel code was generated by corporate programmers (37,000 of the last 38,000 changes were contributed by those paid by companies to do so; see my report on OSS/FS numbers for more information). BSD license advocates claim that the BSD is more &amp;amp;quot;business friendly&amp;amp;quot;, but if you look at actual practice, that argument doesn't wash. The GPL has created a &amp;amp;quot;safe&amp;amp;quot; zone of cooperation among companies, without anyone having to sign complicated legal documents. A company can't feel safe contributing code to the BSDs, because its competitors might simply copy the code without reciprocating. There's much more corporate cooperation in the GPL'ed kernel code than with the BSD'd kernel code. Which means that in practice, it's actually been the GPL that's most &amp;amp;quot;business-friendly&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;So while the BSDs have lost energy every time a company gets involved, the GPL'ed programs gain every time a company gets involved. And that explains it all.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;That's not the only issue, of course. Linus Torvalds makes mistakes, but in general he's a good leader; leadership issues are clearly an issue for some of the BSDs. And Linux's ability early on to support dual-boot computers turned out to be critical years ago. Some people worried about the legal threats that the BSDs were under early on, though I don't think it had that strong an effect. But the early Linux kernel had a number of problems (nonstandard threads, its early network stack was terrible, etc.), which makes it harder to argue that it was &amp;amp;quot;better&amp;amp;quot; at first. And the Linux kernel came AFTER the *BSDs - the BSDs had a head start, and a lot of really smart people. Yet the Linux kernel, and operating systems based on it, jumped quickly past all of them. I believe that's in large part because Linux didn't suffer the endless draining of people and effort caused by the BSD license.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Clearly, some really excellent projects can work well on BSD-style licenses; witness Apache, for example. It would be a mistake to think that BSD licenses are &amp;amp;quot;bad&amp;amp;quot; licenses, or that the GPL is always the &amp;amp;quot;best&amp;amp;quot; license. But others, like Linux, gcc, etc., have done better with copylefting / &amp;amp;quot;protective&amp;amp;quot; licenses. And some projects, like Wine, have switched to a protective (copylefting) license to stem the tide of loss from the project. Again, it's not as simple as &amp;amp;quot;BSD license bad&amp;amp;quot; - I don't think we fully understand exactly when each license's effects truly have the most effect. But clearly the license matters; this as close to an experiment in competing licenses as you're likely to get.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Obviously, a license choice should depend on your goals. But let's look more carefully at that statement, maybe we can see what type of license tends to be better for different purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;If your goal is to get an idea or approach widely used to the largest possible extent, a permissive license like the BSD (or MIT) license has much to offer. Anyone can quickly snap up the code and use it. Much of the TCP/IP code (at least for tools) in Windows was originally from BSD, I believe; there are even some copyright statements still in it. BSD code is widely used, and even when it isn't used (the Linux kernel developers wrote their own TCP/IP code) it is certainly studied. But don't expect the public BSD-licensed code to be maintained by those with a commercial interest in it. I haven't noticed a large number of Microsoft developers being paid to improve any of the *BSDs, even though they share the same code ancestries in some cases.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;If your goal is to have a useful program that stays useful long-term, then a protective (&amp;amp;quot;copylefting&amp;amp;quot;) license like the LGPL or GPL licenses has much to offer. Protective licenses force the cooperation that is good for everyone in the long term, if a long-term useful project is the goal. For example, I've noticed that GPL projects are far less likely to fork than BSD-licensed projects; the GPL completely eliminates any financial advantage to forking. The power of the GPL license is so strong that even if you choose to not use a copylefting license, it is critically important that an open source software project use a GPL-compatible license.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Yes, companies could voluntarily cooperate without a license forcing them to. The *BSDs try to depend on this. But it today's cutthroat market, that's more like the &amp;amp;quot;Prisoner's Dilemma&amp;amp;quot;. In the dilemma, it's better to cooperate; but since the other guy might choose to not cooperate, and exploit your naivete, you may choose to not cooperate. A way out of this dilemma is to create a situation where you must cooperate, and the GPL does that.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Again, I don't think license selection is all that simple when developing a free-libre/open source software (FLOSS) program. Obviously the Apache web server does well with its BSD-ish license. But packages like Linux, gcc, Samba, and so on all show that the GPL does work. And more interestingly, they show that a lot of competing companies can cooperate, when the license requires them to.&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Components_and_GNU_Licensing&amp;diff=3181</id>
		<title>Components and GNU Licensing</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Components_and_GNU_Licensing&amp;diff=3181"/>
		<updated>2015-07-08T22:36:47Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Open-Transactions is available under the '''[https://www.mozilla.org/MPL/2.0/ MPLv2 license.]''' The main components of Open-Transactions are the core library, the client API, the 'opentxs' command-line tool, the opentxs-notary server, and the Moneychanger GUI desktop application.&lt;br /&gt;
&lt;br /&gt;
RELAXATION IN LICENSING: In 2015, the Open-Transactions licensing relaxed from AGPLv3 to MPLv2. What was our rationale for the change?&lt;br /&gt;
&lt;br /&gt;
First, MPLv2 is much more business-friendly than GPL. For example, you can use MPL'd code files inside proprietary software projects. And importantly, you can also use MPL'd code to build apps for the Apple App Store and the Google Play Store. (This is important for making OT available on mobile devices.)&lt;br /&gt;
&lt;br /&gt;
Importantly, MPLv2 is still a copyleft license, similar to GPL. The license terms mandate that improvements made to the OT source code itself ''must'' be released back to the open-source community under the MPLv2 license. This ensures that the open-source community will continue to benefit from any improvements made to OT by commercial entities.&lt;br /&gt;
&lt;br /&gt;
The MPLv2 license is fully-compatible with GPLv3, as well as with BSD/MIT licenses and proprietary licenses. This means OT can be utilized in any software project, including any commercial project, without fear of legal repercussions.&lt;br /&gt;
&lt;br /&gt;
The OT code base has many different contributors, and so the open-source community will never have to worry about a single copyright-holder trying to regain control over how it is used.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
Links: &lt;br /&gt;
&amp;lt;br&amp;gt;[http://www.fsf.org/ Free Software Movement].&lt;br /&gt;
&lt;br /&gt;
Copyleft licenses create a [http://www.dwheeler.com/blog/2006/09/01/#gpl-bsd protective legal buffer zone] so that a long-term community can build around the software, safely contributing to it, to the benefit of all, even amongst a large group of business competitors (see Linux, for example.) Copyleft licenses create an incentive for separate entities to plow money into development of the software, without any fear that their competitors will simply copy the code without reciprocating.&lt;br /&gt;
&lt;br /&gt;
----------&lt;br /&gt;
&lt;br /&gt;
David Wheeler explains why a copyleft license like GPL can benefit a software project, on [http://www.dwheeler.com/blog/2006/09/01/#gpl-bsd his blog:]&lt;br /&gt;
&lt;br /&gt;
'''GPL, BSD, and NetBSD - why the GPL rocketed Linux to success'''&lt;br /&gt;
&lt;br /&gt;
Charles M. Hannum (one of the 4 originators of NetBSD) has posted a sad article about serious problems in the NetBSD project, saying &amp;amp;quot;the NetBSD Project has stagnated to the point of irrelevance.&amp;amp;quot; You can see the article or an LWN article about it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;There are still active FreeBSD and OpenBSD communities, and there's much positive to say about FreeBSD and OpenBSD. I use them occasionally, and I always welcome a chance to talk to their developers - they're sharp folks. Perhaps NetBSD will partly revive. But systems based on the Linux kernel (&amp;amp;quot;Linux&amp;amp;quot;) absolutely stomp the *BSDs (FreeBSD, OpenBSD, and NetBSD) in market share. And Linux-based systems will continue to stomp on the *BSDs into the foreseeable future.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;I think there is one primary reason Linux-based systems completely dominate the *BSDs' market share - Linux uses the protective GPL license, and the *BSDs use the permissive (&amp;amp;quot;BSD-style&amp;amp;quot;) licenses. The BSD license has been a lot of trouble for all the *BSDs, even though they keep protesting that it's good for them. But look what happens. Every few years, for many years, someone has said, &amp;amp;quot;Let's start a company based on this BSD code!&amp;amp;quot; BSD/OS in particular comes to mind, but Sun (SunOS) and others have done the same. They pull the *BSD code in, and some of the best BSD developers, and write a proprietary derivative. But as a proprietary vendor, their fork becomes expensive to self-maintain, and eventually the company founders or loses interest in that codebase (BSD/OS is gone; Sun switched to Solaris). All that company work is then lost forever, and good developers were sucked away during that period. Repeat, repeat, repeat. That's enough by itself to explain why the BSDs don't maintain the pace of Linux kernel development. But wait - it gets worse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;In contrast, the GPL has enforced a consortia-like arrangement on any major commercial companies that want to use it. Red Hat, Novell, IBM, and many others are all contributing as a result, and they feel safe in doing so because the others are legally required to do the same. Just look at the domain names on the Linux kernel mailing list - big companies, actively paying for people to contribute. In July 2004, Andrew Morton addressed a forum held by U.S. Senators, and reported that most Linux kernel code was generated by corporate programmers (37,000 of the last 38,000 changes were contributed by those paid by companies to do so; see my report on OSS/FS numbers for more information). BSD license advocates claim that the BSD is more &amp;amp;quot;business friendly&amp;amp;quot;, but if you look at actual practice, that argument doesn't wash. The GPL has created a &amp;amp;quot;safe&amp;amp;quot; zone of cooperation among companies, without anyone having to sign complicated legal documents. A company can't feel safe contributing code to the BSDs, because its competitors might simply copy the code without reciprocating. There's much more corporate cooperation in the GPL'ed kernel code than with the BSD'd kernel code. Which means that in practice, it's actually been the GPL that's most &amp;amp;quot;business-friendly&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;So while the BSDs have lost energy every time a company gets involved, the GPL'ed programs gain every time a company gets involved. And that explains it all.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;That's not the only issue, of course. Linus Torvalds makes mistakes, but in general he's a good leader; leadership issues are clearly an issue for some of the BSDs. And Linux's ability early on to support dual-boot computers turned out to be critical years ago. Some people worried about the legal threats that the BSDs were under early on, though I don't think it had that strong an effect. But the early Linux kernel had a number of problems (nonstandard threads, its early network stack was terrible, etc.), which makes it harder to argue that it was &amp;amp;quot;better&amp;amp;quot; at first. And the Linux kernel came AFTER the *BSDs - the BSDs had a head start, and a lot of really smart people. Yet the Linux kernel, and operating systems based on it, jumped quickly past all of them. I believe that's in large part because Linux didn't suffer the endless draining of people and effort caused by the BSD license.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Clearly, some really excellent projects can work well on BSD-style licenses; witness Apache, for example. It would be a mistake to think that BSD licenses are &amp;amp;quot;bad&amp;amp;quot; licenses, or that the GPL is always the &amp;amp;quot;best&amp;amp;quot; license. But others, like Linux, gcc, etc., have done better with copylefting / &amp;amp;quot;protective&amp;amp;quot; licenses. And some projects, like Wine, have switched to a protective (copylefting) license to stem the tide of loss from the project. Again, it's not as simple as &amp;amp;quot;BSD license bad&amp;amp;quot; - I don't think we fully understand exactly when each license's effects truly have the most effect. But clearly the license matters; this as close to an experiment in competing licenses as you're likely to get.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Obviously, a license choice should depend on your goals. But let's look more carefully at that statement, maybe we can see what type of license tends to be better for different purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;If your goal is to get an idea or approach widely used to the largest possible extent, a permissive license like the BSD (or MIT) license has much to offer. Anyone can quickly snap up the code and use it. Much of the TCP/IP code (at least for tools) in Windows was originally from BSD, I believe; there are even some copyright statements still in it. BSD code is widely used, and even when it isn't used (the Linux kernel developers wrote their own TCP/IP code) it is certainly studied. But don't expect the public BSD-licensed code to be maintained by those with a commercial interest in it. I haven't noticed a large number of Microsoft developers being paid to improve any of the *BSDs, even though they share the same code ancestries in some cases.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;If your goal is to have a useful program that stays useful long-term, then a protective (&amp;amp;quot;copylefting&amp;amp;quot;) license like the LGPL or GPL licenses has much to offer. Protective licenses force the cooperation that is good for everyone in the long term, if a long-term useful project is the goal. For example, I've noticed that GPL projects are far less likely to fork than BSD-licensed projects; the GPL completely eliminates any financial advantage to forking. The power of the GPL license is so strong that even if you choose to not use a copylefting license, it is critically important that an open source software project use a GPL-compatible license.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Yes, companies could voluntarily cooperate without a license forcing them to. The *BSDs try to depend on this. But it today's cutthroat market, that's more like the &amp;amp;quot;Prisoner's Dilemma&amp;amp;quot;. In the dilemma, it's better to cooperate; but since the other guy might choose to not cooperate, and exploit your naivete, you may choose to not cooperate. A way out of this dilemma is to create a situation where you must cooperate, and the GPL does that.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Again, I don't think license selection is all that simple when developing a free-libre/open source software (FLOSS) program. Obviously the Apache web server does well with its BSD-ish license. But packages like Linux, gcc, Samba, and so on all show that the GPL does work. And more interestingly, they show that a lot of competing companies can cooperate, when the license requires them to.&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Components_and_GNU_Licensing&amp;diff=3180</id>
		<title>Components and GNU Licensing</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Components_and_GNU_Licensing&amp;diff=3180"/>
		<updated>2015-07-08T22:35:15Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: updated license info to MPLv2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Open-Transactions is available under the '''[https://www.mozilla.org/MPL/2.0/ MPLv2 license.]''' The main components of Open-Transactions are the core library, the client API, the 'opentxs' command-line tool, the opentxs-notary server, and the Moneychanger GUI desktop application.&lt;br /&gt;
&lt;br /&gt;
RELAXATION IN LICENSING: In 2015, the Open-Transactions licensing relaxed from AGPLv3 to MPLv2. What was our rationale for the change?&lt;br /&gt;
&lt;br /&gt;
First, MPLv2 is much more business-friendly than GPL. For example, you can use MPL'd code files inside proprietary software projects. And importantly, you can also use MPL'd code to build apps for the Apple App Store and the Google Play Store. (This is important for making OT available on mobile devices.)&lt;br /&gt;
&lt;br /&gt;
Importantly, MPLv2 is still a copyleft license, similar to GPL. The license terms mandate that improvements made to the OT source code itself ''must'' be released back to the open-source community under the MPLv2 license. This ensures that the open-source community will continue to benefit from any improvements made to OT by commercial entities.&lt;br /&gt;
&lt;br /&gt;
The MPLv2 license is fully-compatible with GPLv3, as well as with BSD/MIT licenses and proprietary licenses. This means OT can be utilized in any software project without fear of legal repercussions.&lt;br /&gt;
&lt;br /&gt;
The OT code base has many different contributors, and so the open-source community will never have to worry about a single copyright-holder trying to regain control over how it is used.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
Links: &lt;br /&gt;
&amp;lt;br&amp;gt;[http://www.fsf.org/ Free Software Movement].&lt;br /&gt;
&lt;br /&gt;
Copyleft licenses create a [http://www.dwheeler.com/blog/2006/09/01/#gpl-bsd protective legal buffer zone] so that a long-term community can build around the software, safely contributing to it, to the benefit of all, even amongst a large group of business competitors (see Linux, for example.) Copyleft licenses create an incentive for separate entities to plow money into development of the software, without any fear that their competitors will simply copy the code without reciprocating.&lt;br /&gt;
&lt;br /&gt;
----------&lt;br /&gt;
&lt;br /&gt;
David Wheeler explains why a copyleft license like GPL can benefit a software project, on [http://www.dwheeler.com/blog/2006/09/01/#gpl-bsd his blog:]&lt;br /&gt;
&lt;br /&gt;
'''GPL, BSD, and NetBSD - why the GPL rocketed Linux to success'''&lt;br /&gt;
&lt;br /&gt;
Charles M. Hannum (one of the 4 originators of NetBSD) has posted a sad article about serious problems in the NetBSD project, saying &amp;amp;quot;the NetBSD Project has stagnated to the point of irrelevance.&amp;amp;quot; You can see the article or an LWN article about it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;There are still active FreeBSD and OpenBSD communities, and there's much positive to say about FreeBSD and OpenBSD. I use them occasionally, and I always welcome a chance to talk to their developers - they're sharp folks. Perhaps NetBSD will partly revive. But systems based on the Linux kernel (&amp;amp;quot;Linux&amp;amp;quot;) absolutely stomp the *BSDs (FreeBSD, OpenBSD, and NetBSD) in market share. And Linux-based systems will continue to stomp on the *BSDs into the foreseeable future.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;I think there is one primary reason Linux-based systems completely dominate the *BSDs' market share - Linux uses the protective GPL license, and the *BSDs use the permissive (&amp;amp;quot;BSD-style&amp;amp;quot;) licenses. The BSD license has been a lot of trouble for all the *BSDs, even though they keep protesting that it's good for them. But look what happens. Every few years, for many years, someone has said, &amp;amp;quot;Let's start a company based on this BSD code!&amp;amp;quot; BSD/OS in particular comes to mind, but Sun (SunOS) and others have done the same. They pull the *BSD code in, and some of the best BSD developers, and write a proprietary derivative. But as a proprietary vendor, their fork becomes expensive to self-maintain, and eventually the company founders or loses interest in that codebase (BSD/OS is gone; Sun switched to Solaris). All that company work is then lost forever, and good developers were sucked away during that period. Repeat, repeat, repeat. That's enough by itself to explain why the BSDs don't maintain the pace of Linux kernel development. But wait - it gets worse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;In contrast, the GPL has enforced a consortia-like arrangement on any major commercial companies that want to use it. Red Hat, Novell, IBM, and many others are all contributing as a result, and they feel safe in doing so because the others are legally required to do the same. Just look at the domain names on the Linux kernel mailing list - big companies, actively paying for people to contribute. In July 2004, Andrew Morton addressed a forum held by U.S. Senators, and reported that most Linux kernel code was generated by corporate programmers (37,000 of the last 38,000 changes were contributed by those paid by companies to do so; see my report on OSS/FS numbers for more information). BSD license advocates claim that the BSD is more &amp;amp;quot;business friendly&amp;amp;quot;, but if you look at actual practice, that argument doesn't wash. The GPL has created a &amp;amp;quot;safe&amp;amp;quot; zone of cooperation among companies, without anyone having to sign complicated legal documents. A company can't feel safe contributing code to the BSDs, because its competitors might simply copy the code without reciprocating. There's much more corporate cooperation in the GPL'ed kernel code than with the BSD'd kernel code. Which means that in practice, it's actually been the GPL that's most &amp;amp;quot;business-friendly&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;So while the BSDs have lost energy every time a company gets involved, the GPL'ed programs gain every time a company gets involved. And that explains it all.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;That's not the only issue, of course. Linus Torvalds makes mistakes, but in general he's a good leader; leadership issues are clearly an issue for some of the BSDs. And Linux's ability early on to support dual-boot computers turned out to be critical years ago. Some people worried about the legal threats that the BSDs were under early on, though I don't think it had that strong an effect. But the early Linux kernel had a number of problems (nonstandard threads, its early network stack was terrible, etc.), which makes it harder to argue that it was &amp;amp;quot;better&amp;amp;quot; at first. And the Linux kernel came AFTER the *BSDs - the BSDs had a head start, and a lot of really smart people. Yet the Linux kernel, and operating systems based on it, jumped quickly past all of them. I believe that's in large part because Linux didn't suffer the endless draining of people and effort caused by the BSD license.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Clearly, some really excellent projects can work well on BSD-style licenses; witness Apache, for example. It would be a mistake to think that BSD licenses are &amp;amp;quot;bad&amp;amp;quot; licenses, or that the GPL is always the &amp;amp;quot;best&amp;amp;quot; license. But others, like Linux, gcc, etc., have done better with copylefting / &amp;amp;quot;protective&amp;amp;quot; licenses. And some projects, like Wine, have switched to a protective (copylefting) license to stem the tide of loss from the project. Again, it's not as simple as &amp;amp;quot;BSD license bad&amp;amp;quot; - I don't think we fully understand exactly when each license's effects truly have the most effect. But clearly the license matters; this as close to an experiment in competing licenses as you're likely to get.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Obviously, a license choice should depend on your goals. But let's look more carefully at that statement, maybe we can see what type of license tends to be better for different purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;If your goal is to get an idea or approach widely used to the largest possible extent, a permissive license like the BSD (or MIT) license has much to offer. Anyone can quickly snap up the code and use it. Much of the TCP/IP code (at least for tools) in Windows was originally from BSD, I believe; there are even some copyright statements still in it. BSD code is widely used, and even when it isn't used (the Linux kernel developers wrote their own TCP/IP code) it is certainly studied. But don't expect the public BSD-licensed code to be maintained by those with a commercial interest in it. I haven't noticed a large number of Microsoft developers being paid to improve any of the *BSDs, even though they share the same code ancestries in some cases.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;If your goal is to have a useful program that stays useful long-term, then a protective (&amp;amp;quot;copylefting&amp;amp;quot;) license like the LGPL or GPL licenses has much to offer. Protective licenses force the cooperation that is good for everyone in the long term, if a long-term useful project is the goal. For example, I've noticed that GPL projects are far less likely to fork than BSD-licensed projects; the GPL completely eliminates any financial advantage to forking. The power of the GPL license is so strong that even if you choose to not use a copylefting license, it is critically important that an open source software project use a GPL-compatible license.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Yes, companies could voluntarily cooperate without a license forcing them to. The *BSDs try to depend on this. But it today's cutthroat market, that's more like the &amp;amp;quot;Prisoner's Dilemma&amp;amp;quot;. In the dilemma, it's better to cooperate; but since the other guy might choose to not cooperate, and exploit your naivete, you may choose to not cooperate. A way out of this dilemma is to create a situation where you must cooperate, and the GPL does that.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Again, I don't think license selection is all that simple when developing a free-libre/open source software (FLOSS) program. Obviously the Apache web server does well with its BSD-ish license. But packages like Linux, gcc, Samba, and so on all show that the GPL does work. And more interestingly, they show that a lot of competing companies can cooperate, when the license requires them to.&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=About&amp;diff=3179</id>
		<title>About</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=About&amp;diff=3179"/>
		<updated>2015-07-08T22:19:36Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: /* Diagrams */ added white paper&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;plainlinks&amp;quot;&amp;gt;&lt;br /&gt;
{| id=&amp;quot;mp-topbanner&amp;quot; style=&amp;quot;width:100%; background:#f6f6f6; margin-top:1.2em; border:1px solid #ddd;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:61%; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;!--        &amp;quot;Welcome to Open-Transactions&amp;quot;        --&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:100%; border:none; background:none;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; white-space:nowrap; color:#000;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:162%; border:none; margin:0; padding:.1em; color:#000;&amp;quot;&amp;gt;About the Open-Transactions project.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em; font-size:95%;&amp;quot;&amp;gt;Financial cryptography software.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;articlecount&amp;quot; style=&amp;quot;width:100%; text-align:center; font-size:85%;&amp;quot;&amp;gt;[[Special:Statistics|{{NUMBEROFARTICLES}}]] [[Special:Allpages|articles]].&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; max-width: 550px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What is Open-Transactions?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions is an [[Use Cases|easy-to-use]], financial crypto, [[Sample Cash|digital cash]] and transaction [[List of Classes|library]].&lt;br /&gt;
* Open-Transactions is open-source.&lt;br /&gt;
* Open-Transactions includes a [[API|client API]], a working [[Otserver|server]], a [[TestGUI|GUI test wallet]] (in Java) and a [[opentxs|command-line]] wallet utility.&lt;br /&gt;
* Open-Transactions features: a large variety of financial instruments, markets, basket currencies, unforgeable account balances, digital cash, destruction of account history, [http://iang.org/papers/ricardian_contract.html Ricardian contracts], Smart Contracts (scriptable clauses), and more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''What does it do?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open-Transactions allows users to issue and manipulate digital assets.&lt;br /&gt;
* Any issuer can sign and distribute new [[Sample Currency Contract|currency contracts]] in order to create new digital asset types.&lt;br /&gt;
* Users may create many ''pseudonyms'' (public keys), each of which may own ''asset accounts'' of various types, on OT servers.&lt;br /&gt;
* Users can operate '''&amp;amp;quot;cash-only&amp;amp;quot;''' ''(without accounts)'' for maximum anonymity, using '''[[Sample Cash|unlinkable digital cash]]'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Financial Instruments'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Users can transfer digital assets ''securely and provably'', with [[Triple-Signed Receipts|receipts]] signed by all parties.&lt;br /&gt;
* '''Even an OT server cannot change balances, or forge transactions--since it cannot forge your signature on your receipt.'''&lt;br /&gt;
* Open-Transactions supports a range of '''[[Instruments|financial instruments]]''' such as account transfer, '''[[Sample-Cheque|cheques]]''' and vouchers (aka &amp;amp;quot;cashier's cheques&amp;amp;quot; or &amp;amp;quot;banker's cheques&amp;amp;quot;), in addition to cash.&lt;br /&gt;
* These instruments are all analogous to the same financial instruments that we all use at normal banks today. Everyone already has an intuitive understanding of these financial instruments, because we use them regularly in our normal daily lives.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Markets, Basket Currencies, and Smart Contracts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* Open-Transactions also implements higher-level, '''contract-based transactions''' such as '''payment plans''' and '''markets with trades'''.&lt;br /&gt;
* The [[Markets|markets]] on Open-Transactions support ''market orders, limit orders, fill-or-kill orders, day orders, stop orders, and stop limits'', just like trading on a real market.&lt;br /&gt;
* '''Basket currencies''' are also supported, as well as payment plans (recurring payments.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc.&lt;br /&gt;
* [[Client-side scripting]]: &amp;lt;code&amp;gt;!/usr/bin/env ot&amp;lt;/code&amp;gt; The entire (mostly) high and low level OT API is available within your scripts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Triple Signed Receipts'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* All of this is accomplished in such a way that all parties are able to ''prove'', at all times, ''which transactions have cleared and which instruments are authorized'', '''without having to store their entire transaction history''', but instead by merely keeping the '''last signed receipt'''.&lt;br /&gt;
* Without the special mechanism that makes this possible, ''all parties would otherwise be forced to store all receipts forever''.&lt;br /&gt;
* Nyms and Asset Types have consistent IDs across all OT servers, since the ID is formed by hashing the relevant contract or public key.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Is Open-Transactions [[CENTRALIZED|centralized]]?'''&amp;lt;/big&amp;gt;&lt;br /&gt;
* No—quite the opposite. Open-Transactions is highly '''decentralized'''.&lt;br /&gt;
* Typical centralized servers have power over their users, but in OT, '''no server has power over the clients it serves''', because:&lt;br /&gt;
# An OT server does not control user transactions—it merely notarizes them.&lt;br /&gt;
# Anyone can operate an OT server, and users can go to any OT server to notarize transactions. Thus OT servers compete with each other to attract users to use their notary services.&lt;br /&gt;
# Anyone can download an OT client, and use it to execute transactions on any OT server, or any group of OT servers.&lt;br /&gt;
# OT uses triple-signed receipts, so transaction parties have independent cryptographic proof of transactions and balances.&lt;br /&gt;
# OT servers do not store user assets. Rather, cryptocurrencies are stored in voting pools so the server can't steal them.&lt;br /&gt;
&lt;br /&gt;
In every way, '''the user is in control, not the server'''—even when you're using servers you do not trust. These characteristics generate a '''federated''' network architecture—similar to the internet, and it has the same virtues as the internet—openness, decentralization, resilience, censorship-resistance, and user control.&lt;br /&gt;
&lt;br /&gt;
The community behind OT is strongly committed to developing systems that give users full control over their own assets and information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; max-width: 300px; margin: -20px 10px 0 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== White Paper ==&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf OT White Paper]&lt;br /&gt;
 &lt;br /&gt;
== Diagrams ==&lt;br /&gt;
&lt;br /&gt;
[[Voting_Pool_Deposit_Process|Voting Pools]]&lt;br /&gt;
&lt;br /&gt;
[http://i.imgur.com/HTyAJjg.png Architecture Overview (new)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/ot-diagram.jpg Architecture Overview (old)]&lt;br /&gt;
&lt;br /&gt;
[http://billstclair.com/ot/OT-Pseudonym-Instruments.jpg Financial Instruments]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Radio Interviews ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=teNzIFu5L70 &amp;quot;Trust No One&amp;quot; Miami Speech]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=234 AgoristRadio Interview, Part 1]&lt;br /&gt;
&lt;br /&gt;
[http://agoristradio.com/?p=246 AgoristRadio Interview, Part 2]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=vtJcUM5-TeA Interview with &amp;quot;Let's Talk Bitcoin&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=HSgpStCTw2g Interview with FutureMoneyTrends.com]&lt;br /&gt;
&lt;br /&gt;
== Video Walkthrough ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=5qtTayW-RyM Android demo video (Monetas)]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/Ea6rzq Desktop video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/i0J3AF Desktop video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/8Dxak1 iPhone video 1 - Introduction]&lt;br /&gt;
&lt;br /&gt;
[http://goo.gl/u6xqHc iPhone video 2 - Advanced]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28141679 java testclient video 1]&lt;br /&gt;
&lt;br /&gt;
[http://vimeo.com/28142096 java testclient video 2]&lt;br /&gt;
&lt;br /&gt;
[http://open-transactions.github.io/tv/ Official video archive (more videos)]&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Components and GNU Licensing]]&lt;br /&gt;
&lt;br /&gt;
[[Vulnerabilities|Potential vulnerabilities]] of Open-Transactions&lt;br /&gt;
&lt;br /&gt;
== Related Systems ==&lt;br /&gt;
&lt;br /&gt;
[[Monetas]] - Enterprise platform based on OT.&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
[http://bitcoin.org/ Bitcoin] - A censorship-resistant global ledger&lt;br /&gt;
&lt;br /&gt;
[https://loom.cc/help Loom] - Asset issuance and transactions&lt;br /&gt;
&lt;br /&gt;
[http://www.csee.umbc.edu/~woodcock/cmsc482/proj1/magmoney.html Magic Money] - PGP-based Chaumian blinding (unlinkable cash)&lt;br /&gt;
&lt;br /&gt;
[http://opencoin.org/ OpenCoin.org] - REST-based blinded tokens&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransact.org/ OpenTransact] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://payswarm.com/ PaySwarm] - REST-based transaction protocol&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/publickeytransaction PKTP] - Public-Key Transaction Processor&lt;br /&gt;
&lt;br /&gt;
[http://wiki.dgcmagazine.com/index.php?title=Ricardo Ricardo] - Transaction system by Ian Grigg&lt;br /&gt;
&lt;br /&gt;
[https://ripple.com/ Ripple] - Consensus-based debt ledger&lt;br /&gt;
&lt;br /&gt;
[https://www.stellar.org/ Stellar] - Ripple-based&lt;br /&gt;
&lt;br /&gt;
[http://truledger.com/ Truledger] - Destruction of account history&lt;br /&gt;
&lt;br /&gt;
[http://www.voucher-safe.com/index.cfm Voucher-Safe] - Secure asset issuance with auditing&lt;br /&gt;
&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
Article: [http://pelagic.wavyhill.xsmail.com/Private_Digital_Economy.html Toward a Private Digital Economy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both; padding-top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In More Detail... ==&lt;br /&gt;
&lt;br /&gt;
The server itself is a [[Transactions|transaction processor]] in the cypherpunk tradition. In more detail:&lt;br /&gt;
&lt;br /&gt;
* Many '''financial instruments''' are supported: Users can write '''cheques''', purchase '''cashier's cheques''' (&amp;amp;quot;vouchers&amp;amp;quot;), and withdraw in '''[[Sample Cash|unlinkable digital cash]]'''. The software uses Chaumian-style, blinded tokens courtesy of the [http://anoncvs.aldigital.co.uk/lucre/ Lucre] library by Ben Laurie.&lt;br /&gt;
* It's like '''PGP FOR MONEY'''. The idea is to have many cash algorithms, not just Lucre. I’d like to add Chaum’s version, Brands’ version, etc. So that, just like PGP, the software should support as many of the top algorithms as possible, and make it easy to swap them out when necessary.&lt;br /&gt;
* User accounts are '''pseudonymous'''. '''A user account is a public key'''. (This is like [http://pktp.co.cc/ PKTP] by Andrew McMeikan.) You can open as many user accounts as you want. ''Full anonymity'' is possible only for &amp;quot;cash-only&amp;quot; transactions (where users only perform token exchanges, and do not open accounts), whereas ''pseudonymity'' means that transactions can be linked to the key that signed them. (While the real life identity of the owner is hidden, continuity of reputation becomes possible.) ''See full-color diagrams linked above''.&lt;br /&gt;
* '''Any user can issue new digital currencies''' and digital asset types, by uploading the new [[Sample Currency Contract|currency contract]] to the server. (This functionality is comparable to [http://www.systemics.com/docs/sox/overview.html Ricardo] by [http://financialcryptography.com/ Ian Grigg].)&lt;br /&gt;
* '''Users can open asset accounts of any type.''' You can have as many as you want, associated with each user account. (See [http://loom.cc/ Loom] by Patrick Chkoreff.)&lt;br /&gt;
* [[Triple-Signed Receipts|Triple Signed Receipts / No Account History]]. On OT, entities are able to conduct transactions, verify instruments, ''and'' provably agree on current holdings via ''signed receipts'', all without the need to store any transaction history.'' An ''asset account'' on OT is not according to the traditional sense of the word (an account normally being thought of as, &amp;quot;a list of transactions, with a balance, used in double-entry bookkeeping.&amp;quot;) While the word &amp;quot;account&amp;quot; makes things easy to understand, an ''asset account'' on OT exists only in the mind of the account holder himself. He simply asks the server to agree with him that it exists, and to provide him with a signed receipt to that effect. In the user interface, OT is able to mimic the ''account metaphor'', making usage intuitive, even though ''no actual account exists, or need be stored on either side, other than the signed receipt itself!'' (See Bill St. Clair's excellent [http://truledger.com/ Truledger] for an [http://truledger.com/doc/plain-english.html example of this concept].)&lt;br /&gt;
* Open Transactions also features '''markets'''. Any two asset types can be traded against each other. The [[markets]] are full-featured and include '''limit orders, stop orders, fill-or-kill, day orders''' (date ranges), and '''stop limits'''.&lt;br /&gt;
* Open Transactions also supports '''basket currencies'''. Users can define their own, and the server handles the process of exchanging in and out of basket accounts. Baskets are treated by the software like any other asset type, (you can open accounts, transfer funds, withdraw cash, write cheques, and even '''trade basket currencies on markets'''.)&lt;br /&gt;
* [[Smart contracts]]: Multi-party agreements with scriptable clauses... including hooks, callbacks, internal state, etc. This concept was originated by Nick Szabo: [http://szabo.best.vwh.net/contractlanguage.html smart contracts].&lt;br /&gt;
* [[Client-side scripting]]: The entire OT API is now available for use in OTscripts on the client side. Just remember to put this at the top of the file: &amp;lt;pre&amp;gt;#!/usr/local/bin/ot --script&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Open Transactions also supports '''payment plans'''. Users can sign contracts with each other, and the server will carry out the terms and implement the payment plan. (A future goal is to issue new asset types based on revenue from payment plans--so they can also be traded on markets.)&lt;br /&gt;
* '''Contracts''', in general, are very important to Open Transactions; they are the building block of the entire library. Open Transactions uses a Ricardian-style contract, and all the various instruments, data files, and messages resemble '''[[Sample Currency Contract | PGP-signed XML files]]'''. All objects serialize to a string.&lt;br /&gt;
* The philosophy of the software is based around '''separation of powers''' (issuers and transaction servers being separate entities) as well as the '''distribution of risk'''. For example, Asset accounts can be distributed across multiple servers, and asset types can be distributed across multiple issuers (via baskets.) Read about the [[Auditing]] protocol.&lt;br /&gt;
* Potential future instruments include: [http://www.goldstandardinstitute.net/2010/06/what-is-a-real-bill/ Real Bills], dividend-paying stocks (the same mechanism can be used as interest paying bonds) and collateralized debt obligations. (OT supports payment plans, so it would be easy to group tranches of OT's payment plans to pay into a single reserve account, as backing for a new stock offering that could be traded on OT markets.) This is similar to how basket currencies are implemented. Stocks/Bonds would pay shareholders by dropping a cheque into your stock account's inbox. These features aren't available yet, but they are easy to add given the existing OT infrastructure.&lt;br /&gt;
* '''All communications are secured with OpenSSL.''' All messages are also signed and encrypted. All transactions require signatures from relevant parties including the server.&lt;br /&gt;
* Open Transactions is '''open-source''', written in C++, object-oriented, and includes '''Native [[API]]s''' for '''Java, Ruby, Python, PHP, Perl, C, [http://www.digitalmars.com/d/2.0/overview.html D], C++, Objective-C, C#, Tcl, and LISP.''' (Also supporting JRuby, Jython, Scala, Clojure, Groovy, and any other language that works on the JVM.)&lt;br /&gt;
* The software is fully '''cross-platform''': '''Linux, Mac OS X, FreeBSD, Android, and Windows''' are supported with makefiles, project files, and instructions.&lt;br /&gt;
* STORAGE... The library itself is '''storage neutral''', and could be utilized across a variety of different storage systems. All objects serialize to a string, and it is very easy to add support for new storage methods. (Currently OT uses the filesystem with key/value pairs.) '''Adding a new storage method is as easy as subclassing OTDB::Storage and overriding a few methods. Use any DB you want.'''&lt;br /&gt;
* [[Messaging]]... The library itself is '''transfer-protocol neutral''', and can be utilized across a variety of different transfer protocols. The default implementation uses the [http://zeromq.org/ ZeroMQ library] for transport. Transport is implemented as a callback function, so it's very easy (a few dozen lines of code) to swap in some other system, if you wish.&lt;br /&gt;
* OT currently supports '''MsgPack''' and '''protobuf''' for data packing, though new packers can be added by subclassing OTDB::Packer.&lt;br /&gt;
&lt;br /&gt;
The intention is for this software to be integrated as many places as possible... Games, digital cash wallets, distributed data stores, secure voip apps, anonymous bit torrent networks, mixnets, remailers, nym servers, etc. There are many other potential uses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=API&amp;diff=3178</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=API&amp;diff=3178"/>
		<updated>2015-07-08T22:18:16Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: added moneychanger link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NOTE: This page is old, but preserved in case of any usefulness. [http://github.com/Open-Transactions/Moneychanger Moneychanger] is the reference implementation and it shows how to use the OT client API. If you ever need to write code that uses OT, just copy the sample code you need out of Moneychanger itself. It's that easy!&lt;br /&gt;
&lt;br /&gt;
=== API Docs ===&lt;br /&gt;
* [http://opentransactions.org/docs/class_o_t___m_e.html High-level API (C++)]&lt;br /&gt;
&lt;br /&gt;
* [http://opentransactions.org/docs/class_o_t_made_easy.html High-level API (all other languages)]&lt;br /&gt;
&lt;br /&gt;
* [http://opentransactions.org/docs/class_o_t_a_p_i___wrap.html Low-level API (C++)]&lt;br /&gt;
&lt;br /&gt;
* [http://opentransactions.org/docs/class_o_t_a_p_i___basic.html Low-level API (all other languages)]&lt;br /&gt;
&lt;br /&gt;
The general rule of thumb is: Always prefer the high-level API. (Only use the low-level API for functions where no high-level API version is available.)&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
* See the [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTMadeEasy.h#L159 OTMadeEasy] class, as well as the sample scripts provided in [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/demo/php/php_ot_test.php PHP] [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/demo/python/python_ot_test.py Python] and [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/demo/csharp/Main.cs C-Sharp].&lt;br /&gt;
&lt;br /&gt;
* OT's high-level API is also available in OT [https://github.com/FellowTraveler/Open-Transactions/wiki/Client-side-scripting client-side scripts]&lt;br /&gt;
&lt;br /&gt;
* The '''opentxs list''' and [https://github.com/FellowTraveler/Open-Transactions/wiki/opentxs opentxs help] commands display a complete list of all the OT API functions available on the command line. The actual code for those commands, written using the OT high-level API, [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/ot/ot_commands.ot#L1288 is available here for your perusal]. This way, you can test the complete OT functionality at the command line, and then flip through the actual code for each command, and see how the OT API calls are used. '''You might be surprised how simple they really are.'''&lt;br /&gt;
&lt;br /&gt;
* With that as your guide, a general rule of thumb is this: Anytime you need to do something, use the [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTMadeEasy.h#L159 high-level API] to do it. Only if you can't find the function you are looking for, should you next resort to the [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTAPI_Basic.h#L170 low-level API]. And remember, you can always the copy the code you need from the [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/ot/ot_commands.ot#L1288 opentxs] tool, or from the test GUI, [http://github.com/FellowTraveler/otapij otapiJ].&lt;br /&gt;
&lt;br /&gt;
What does this mean for you? It means you no longer have to worry about synchronizing request numbers, or harvesting transaction numbers, or comparing inbox hashes, or downloading your nymbox, or dropped messages, or timeouts, or retries, etc! Instead, you use simple functions like '''send_transfer''' or '''withdraw_cash'''. The high-level API manages everything else behind the scenes.&lt;br /&gt;
&lt;br /&gt;
The OT high-level API (OTMadeEasy) is now available in these languages: [http://www.chaiscript.com/ ChaiScript] ( [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTMadeEasy.h#L159 ot script] ) and Java, CSharp, PHP, Python, D, Perl, and TCL. The [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTAPI_Basic.h#L170 low-level API] is available in D, Python, PHP, Perl, Java, etc. (Via [http://www.swig.org/ SWIG] wrappers.)&lt;br /&gt;
&lt;br /&gt;
=== USE CASES for the OT API ===&lt;br /&gt;
&lt;br /&gt;
* '''(Client software starts up.)''' Initialize the library and load the wallet.&lt;br /&gt;
* Display for user: '''Server Contracts, Nyms, Accounts, and Asset Types.'''&lt;br /&gt;
* Change the wallet's ''display label'' for any server, asset type, account, or nym.&lt;br /&gt;
* Import a server contract (or asset contract) to the wallet.&lt;br /&gt;
* Create a new '''Pseudonym''' (public/private key pair).&lt;br /&gt;
* Register a public key (a ''&amp;quot;Nym&amp;quot;'') at an OT server.&lt;br /&gt;
* '''Issue a new digital Asset Type'''. (Uploading an asset contract.)&lt;br /&gt;
* Retrieve Currency Contract (by ID).&lt;br /&gt;
* '''Create a new Asset Account'''.&lt;br /&gt;
* '''Write a cheque''' (or invoice)&lt;br /&gt;
* '''Send a Message''' to another user (via the server, encrypted to the recipient's public key.)&lt;br /&gt;
* '''Deposit a cheque'''&lt;br /&gt;
* '''Withdraw cash''' . . . . &amp;lt;==== CHAUMIAN DIGITAL CASH!!&lt;br /&gt;
* '''Deposit cash'''&lt;br /&gt;
* Withdraw Voucher&lt;br /&gt;
* '''Account-to-Account Transfer'''&lt;br /&gt;
* Create a new '''Basket Currency'''&lt;br /&gt;
* '''Exchange''' Digital Assets '''in and out of Baskets''' (from your Asset Accounts)&lt;br /&gt;
* '''Process your Inbox''' (Receipts and pending transfers)&lt;br /&gt;
* Set up a '''Payment Plan'''&lt;br /&gt;
* Issue a '''Market Offer'''&lt;br /&gt;
&lt;br /&gt;
-------&lt;br /&gt;
&lt;br /&gt;
'''Initialize the library and Load your Wallet'''&lt;br /&gt;
&lt;br /&gt;
(The user starts up the wallet software.)&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_Init()'''&lt;br /&gt;
&lt;br /&gt;
Then call '''OT_API_LoadWallet()'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(NOTE: these above 2 steps are not necessary in OT-script, only Java and other languages.)&lt;br /&gt;
&lt;br /&gt;
'''Display the current list of server contracts on the screen'''&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_GetServerCount()''', which returns the number of server contracts in your wallet.&lt;br /&gt;
&lt;br /&gt;
For each one, call '''OT_API_GetServer_ID()''' to get the Server ID (which is a hash of the contract.)&lt;br /&gt;
&lt;br /&gt;
Also for each, call '''OT_API_GetServer_Name()''' to get the Display Name from the contract.&lt;br /&gt;
&lt;br /&gt;
In your GUI, display the name on the screen, but use the ID behind the scenes (for your messages to the server.)&lt;br /&gt;
&lt;br /&gt;
'''Do the same thing for Nyms, Accounts, and Asset Types.'''&lt;br /&gt;
&lt;br /&gt;
You can read about them on the [[API]] page, but here are the basic functions:&lt;br /&gt;
&lt;br /&gt;
OT_API_GetNymCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetServerCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAssetTypeCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetNym_ID() and OT_API_GetNym_Name()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetServer_ID() and OT_API_GetServer_Name()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAssetType_ID() and OT_API_GetAssetType_Name()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountWallet_ID() and OT_API_GetAccountWallet_Name()&lt;br /&gt;
&lt;br /&gt;
Also: &lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountWallet_Balance()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountWallet_Type()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountWallet_AssetTypeID()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Add a new server contract (or asset contract) to the wallet'''&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_AddServerContract()''' &lt;br /&gt;
&lt;br /&gt;
or '''OT_API_AddAssetContract()'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Create a new Pseudonym'''&lt;br /&gt;
&lt;br /&gt;
(Each user's wallet may contain many pseudonyms. Each Nym consists of a public and a private key, aka a &amp;quot;key pair&amp;quot;.)&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_CreateNym()'''&lt;br /&gt;
&lt;br /&gt;
This creates a new key pair _(&amp;quot;Nym&amp;quot;)_ in your wallet, which you can use for communications with an OT server.&lt;br /&gt;
&lt;br /&gt;
(That is, for opening asset accounts and performing various other transactions. A Nym is a &amp;quot;user account&amp;quot;.)&lt;br /&gt;
&lt;br /&gt;
(You can create as many of these pseudonyms as you want.)&lt;br /&gt;
&lt;br /&gt;
(You can register the same nyms at multiple servers.)&lt;br /&gt;
&lt;br /&gt;
(The same Nym will have the same Nym ID and public key on every server.)&lt;br /&gt;
&lt;br /&gt;
Example &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def details_create_nym(nKeybits, strName)&lt;br /&gt;
{&lt;br /&gt;
    var madeEasy = OT_ME()    &lt;br /&gt;
    var strNymID = madeEasy.create_pseudonym(nKeybits, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;)  // returns new Nym ID&lt;br /&gt;
    &lt;br /&gt;
    if (!VerifyStringVal(strNymID))&lt;br /&gt;
    {&lt;br /&gt;
        OT_API_Output(0, &amp;quot;details_create_nym: Failed in OT_ME::create_pseudonym(keybits == &amp;quot; + nKeybits.to_string() + &amp;quot;)\n&amp;quot;)&lt;br /&gt;
        return (0)&lt;br /&gt;
    }&lt;br /&gt;
    OT_API_Output(0, &amp;quot;Success creating! &amp;quot; + nKeybits.to_string() + &amp;quot; keybits, new ID: &amp;quot;) // stderr&lt;br /&gt;
    print(strNymID) // stdout&lt;br /&gt;
    OT_API_Output(0, &amp;quot;\n&amp;quot;) //stderr&lt;br /&gt;
    // -------------------&lt;br /&gt;
    var bSetName = OT_API_SetNym_Name(strNymID, // subject&lt;br /&gt;
                                      strNymID, // signer&lt;br /&gt;
                                      strName)&lt;br /&gt;
    if (!bSetName)&lt;br /&gt;
    {&lt;br /&gt;
        OT_API_Output(0, &amp;quot;Failed in OT_API_SetNym_Name(name == &amp;quot; + strName + &amp;quot;)\n&amp;quot;)&lt;br /&gt;
        return (0)&lt;br /&gt;
    }&lt;br /&gt;
    // -------------------    &lt;br /&gt;
    OT_API_Output(0, &amp;quot;Success setting name to: &amp;quot; + strName + &amp;quot;\n\n&amp;quot;) // stderr&lt;br /&gt;
    return 1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Register a public key (aka &amp;quot;Nym&amp;quot;) at an OT server'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    var madeEasy	= OT_ME()&lt;br /&gt;
    if (VerifyExists(&amp;quot;Server&amp;quot;) &amp;amp;&amp;amp; VerifyExists(&amp;quot;MyNym&amp;quot;))&lt;br /&gt;
    {        &lt;br /&gt;
        var strResponse = madeEasy.register_nym(Server, MyNym)&lt;br /&gt;
        var nSuccess    = VerifyMessageSuccess(strResponse)&lt;br /&gt;
        switch(nSuccess)&lt;br /&gt;
        {&lt;br /&gt;
            case (1)&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;quot;\n\n SUCCESS in register_nym! Server response:\n\n&amp;quot;);&lt;br /&gt;
                print(strResponse) // stdout&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
            default&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;quot;\n\n Failure or Error in register_nym!\n&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                if (VerifyStringVal(strResponse))&lt;br /&gt;
                {&lt;br /&gt;
                    OT_API_Output(0, &amp;quot;Server response:\n\n&amp;quot;);&lt;br /&gt;
                    print(strResponse) // stdout&lt;br /&gt;
                }&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Change the wallet's label for any server/asset type/account/nym'''&lt;br /&gt;
&lt;br /&gt;
(This is only a client-side label, for display purposes only.)&lt;br /&gt;
&lt;br /&gt;
'''OT_API_SetNym_Name()'''&lt;br /&gt;
&lt;br /&gt;
'''OT_API_SetAccountWallet_Name()'''&lt;br /&gt;
&lt;br /&gt;
'''OT_API_SetAssetType_Name()'''&lt;br /&gt;
&lt;br /&gt;
'''OT_API_SetServer_Name()'''&lt;br /&gt;
&lt;br /&gt;
----------------------------&lt;br /&gt;
&lt;br /&gt;
'''Issue a new digital Asset Type'''&lt;br /&gt;
&lt;br /&gt;
User uploads a new currency contract to the server, so users can create asset accounts based on that asset type.&lt;br /&gt;
&lt;br /&gt;
Server replies with a new issuer account ID (The new Issuer account appears inside your wallet's account list, so go ahead and iterate the list again, in order to display the updated list of accounts on the screen.)&lt;br /&gt;
&lt;br /&gt;
High-level API version (in OT script):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        var madeEasy	= OT_ME()&lt;br /&gt;
        OT_API_Output(0, &amp;quot;Please paste a currency contract, followed by an EOF or a ~ by itself on a blank line:\n\n&amp;quot;)&lt;br /&gt;
        var strContract = OT_CLI_ReadUntilEOF() &lt;br /&gt;
        var strResponse	= madeEasy.issue_asset_type(Server, MyNym, strContract)&lt;br /&gt;
        var nStatus     = VerifyMessageSuccess(strResponse)&lt;br /&gt;
        &lt;br /&gt;
        switch(nStatus)&lt;br /&gt;
        {&lt;br /&gt;
            case (1)&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;quot;\n\n SUCCESS in issue_asset! Server response:\n\n&amp;quot;);&lt;br /&gt;
                print(strResponse) // stdout&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
            default&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;quot;\n\n Failure or error in issue_asset. nStatus: &amp;quot;+nStatus.to_string()+&amp;quot;\n&amp;quot;)&lt;br /&gt;
                if (VerifyStringVal(strResponse))&lt;br /&gt;
                {&lt;br /&gt;
                    OT_API_Output(0, &amp;quot;Server response:\n\n&amp;quot;);&lt;br /&gt;
                    print(strResponse) // stdout&lt;br /&gt;
                }&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Retrieve Currency Contract (by ID)'''&lt;br /&gt;
&lt;br /&gt;
User wants to download a currency contract from the server (for a given asset type ID.)&lt;br /&gt;
&lt;br /&gt;
(The asset type ID is a hash of the contract, so OT will know if you get the wrong one, since this is verified whenever a contract is loaded up.)&lt;br /&gt;
&lt;br /&gt;
High-level API version (in OT script):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    var madeEasy	= OT_ME()&lt;br /&gt;
    var strRetrieved   = madeEasy.retrieve_contract(Server, MyNym, strContractID)&lt;br /&gt;
    var nRetrieved     = VerifyMessageSuccess(strRetrieved)    &lt;br /&gt;
    var strSuccess = &amp;quot;ERROR&amp;quot;&lt;br /&gt;
    if (1 == nRetrieved)&lt;br /&gt;
    {   strSuccess = &amp;quot;SUCCESS&amp;quot; }&lt;br /&gt;
    else if (0 == nRetrieved)&lt;br /&gt;
    {   strSuccess = &amp;quot;FAILED&amp;quot; }&lt;br /&gt;
    OT_API_Output(0, &amp;quot;\n\n &amp;quot; + strSuccess + &amp;quot; retrieving contract: &amp;quot;+strContractID+&amp;quot;\n\n&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Create a new Asset Account'''&lt;br /&gt;
&lt;br /&gt;
Example in OT Script, from the &amp;quot;sample scripts&amp;quot;:https://github.com/FellowTraveler/Open-Transactions/tree/master/scripts/samples folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def OT_ME::create_asset_acct(SERVER_ID, NYM_ID, ASSET_TYPE_ID) &lt;br /&gt;
    {&lt;br /&gt;
        var ot_Msg := OTAPI_Func()&lt;br /&gt;
        // -------------------------&lt;br /&gt;
        var theRequest := OTAPI_Func(ot_Msg.CREATE_ASSET_ACCT, SERVER_ID, NYM_ID, ASSET_TYPE_ID)&lt;br /&gt;
        var     strResponse = theRequest.SendRequest(theRequest, &amp;quot;CREATE_ASSET_ACCT&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        return strResponse&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it was a SUCCESS, then refresh the list of accounts in your display (from the OT API) since your new asset account should now be there.&lt;br /&gt;
&lt;br /&gt;
(You can also use the &amp;quot;decode&amp;quot; command in the test wallet anytime you want to base64-decode something.)&lt;br /&gt;
&lt;br /&gt;
--------------------------&lt;br /&gt;
&lt;br /&gt;
'''TRANSACTIONS'''&lt;br /&gt;
&lt;br /&gt;
FYI: Balance agreement, combined with transaction numbers, is what makes it possible for the server and all other parties to _eliminate account history, instead storing only the last signed receipt._ (Of course they have the ''choice'' to keep their own records--but they are no longer ''forced'' to do so.)&lt;br /&gt;
&lt;br /&gt;
In order to do any transaction, the wallet's _balance agreement_ process requires that you have the latest copy of your account, inbox, and outbox files. You don't have to worry about this too much, since the high-level API will usually handle it for you.&lt;br /&gt;
&lt;br /&gt;
'''You might ask: ''&amp;quot;But what if I download my account, or my outbox, and the server has maliciously inserted data into them?&amp;quot;'' '''&lt;br /&gt;
''No problem'' -- Open Transactions stores the last signed receipt from the server, and is able to verify the new intermediary files against that last receipt. You can see this happening when you run the command-line test client, and receipts can be verified programmatically using '''OT_API_VerifyAccountReceipt()'''.  &lt;br /&gt;
&lt;br /&gt;
The [[Triple-Signed Receipts]] on Open Transactions ensure that this sort of protection is available to all parties, '''while simultaneously not having to store any transaction history!'''&lt;br /&gt;
&lt;br /&gt;
------------------&lt;br /&gt;
&lt;br /&gt;
'''Write a Cheque'''&lt;br /&gt;
&lt;br /&gt;
Alice writes a cheque (offline):  Call '''OT_API_WriteCheque()'''&lt;br /&gt;
&lt;br /&gt;
Alice then gives cheque to Bob (offline), _or_ online if she prefers via '''OT_API_sendUserMessage()''' function.&lt;br /&gt;
&lt;br /&gt;
If Alice has Bob's UserID but not his public key, her wallet first uses '''OT_API_checkUser()''' to retrieve his public key from the server, and then encrypts the cheque before sending it.&lt;br /&gt;
&lt;br /&gt;
NOTE: a quality wallet software will keep track of ALL instruments! Even when Alice gives a cheque to Bob, her wallet should still store a copy of that cheque. Until when? Until at least after he has cashed it... when he does that, a chequeReceipt will appear in her inbox. Only when she accepts that receipt, signing a new balance agreement, is she finally free of the transaction number that was on that cheque. (It was still signed-out to her, all the way up until that time.) &lt;br /&gt;
&lt;br /&gt;
WHAT IF Bob had never cashed it? WHAT IF he lost it? Is Alice supposed to just keep signing for that number forever? (The chequeReceipt will never appear in her inbox. She is doomed to continue signing for this number on all of her receipts on into the future, ad infinitum, with no hope of ever closing it out!) &lt;br /&gt;
&lt;br /&gt;
Fear not, there is a solution: '''OT_API_DiscardCheque()'''. (Lucky you saved a copy of that cheque in your wallet, eh?) This function will retrieve Alice's transaction # back from the cheque, so that her wallet is free to use it on her next valid transaction, and then close it out normally.&lt;br /&gt;
&lt;br /&gt;
'''Deposit a cheque'''&lt;br /&gt;
&lt;br /&gt;
(A voucher is also a cheque, so you may deposit a voucher here the same as any other cheque.)&lt;br /&gt;
&lt;br /&gt;
Bob sends message to server requesting deposit: &lt;br /&gt;
&lt;br /&gt;
'''(High level API version, in Java.)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    public boolean depositCheque(String serverID, String nymID, String accountID, String cheque) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In depositCheque serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.DEPOSIT_CHEQUE, serverID, nymID, accountID, cheque);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;DEPOSIT_CHEQUE&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in depositCheque.&amp;quot;);&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // -------------------------------------------------------------------------------------- &lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Withdraw cash'''&lt;br /&gt;
&lt;br /&gt;
Alice's wallet first makes sure she has the latest public mint file, by calling '''OT_API_getMint()'''.&lt;br /&gt;
&lt;br /&gt;
(Note: if the mint she already has is within its valid date range, there's no need to do this.)&lt;br /&gt;
&lt;br /&gt;
(Note: If she does call getMint, Alice needs to check the server reply and make sure it was successful before continuing with the withdrawal. The public mint keys are necessary for cash withdrawal.)&lt;br /&gt;
&lt;br /&gt;
Alice then withdraws from her asset account, by messaging server:  '''OT_API_notarizeWithdrawal()'''&lt;br /&gt;
&lt;br /&gt;
Server replies with chaumian cash, which is stored in the purse folder in local storage.&lt;br /&gt;
&lt;br /&gt;
Here is the full Java implementation of Withdraw Cash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    public boolean withdrawCash(String serverID, String nymID, String accountID, String amount) &lt;br /&gt;
    {&lt;br /&gt;
        String serverResponseMessage = null;&lt;br /&gt;
        System.out.println(&amp;quot;In withdrawCash serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
        String assetID = otapi.OT_API_GetAccountWallet_AssetTypeID(accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------- &lt;br /&gt;
        // Make sure we have the proper asset contract for the withdrawal.&lt;br /&gt;
        //&lt;br /&gt;
        String assetContract = otapi.OT_API_LoadAssetContract(assetID);&lt;br /&gt;
        if (assetContract == null) {&lt;br /&gt;
            OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.GET_CONTRACT, serverID, nymID, assetID);&lt;br /&gt;
            String strResponse = OTAPI_Func.SendRequest(theRequest, &amp;quot;GET_CONTRACT&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (null == strResponse) {&lt;br /&gt;
                System.out.println(&amp;quot;IN withdrawCash: OTAPI_Func.SendRequest(GET_CONTRACT) failed. (I give up.) (Unable to find asset contract.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            assetContract = otapi.OT_API_LoadAssetContract(assetID);&lt;br /&gt;
            if (assetContract == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadAssetContract returned null even after OT_API_getContract (Unable to find asset contract.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        // Download the public mintfile if it's not there, or if it's expired.&lt;br /&gt;
        // Also load it up into memory as a string (just to make sure it works.)&lt;br /&gt;
        // Then we can actually send the withdrawal transaction request. (Until&lt;br /&gt;
        // then, why bother?)&lt;br /&gt;
        //&lt;br /&gt;
        String mintFile;&lt;br /&gt;
&lt;br /&gt;
        // expired or missing.&lt;br /&gt;
        if (1 != otapi.OT_API_Mint_IsStillGood(serverID, assetID)) &lt;br /&gt;
        {&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.GET_MINT, serverID, nymID, assetID);&lt;br /&gt;
            String strResponse = OTAPI_Func.SendRequest(theRequest, &amp;quot;GET_MINT&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (null == strResponse) {&lt;br /&gt;
                System.out.println(&amp;quot;IN withdrawCash: OTAPI_Func.SendRequest(GET_MINT) failed. (I give up.) (Unable to get mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            mintFile = otapi.OT_API_LoadMint(serverID, assetID);&lt;br /&gt;
            if (mintFile == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadMint returned null even after OT_API_getMint (I give up.) (Unable to find mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else // current mint IS available already on local storage (and not expired.)&lt;br /&gt;
        {&lt;br /&gt;
            mintFile = otapi.OT_API_LoadMint(serverID, assetID);&lt;br /&gt;
            if (mintFile == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadMint returned null even after successful OT_API_Mint_IsStillGood (I give up.) (Unable to find mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        // By this point, the mintfile is DEFINITELY good (available, not null, &lt;br /&gt;
        // not expired, and loaded up.) Now we know for a fact that when the API&lt;br /&gt;
        // call is made to withdraw cash, that it will find the mint properly.&lt;br /&gt;
        //&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.WITHDRAW_CASH, serverID, nymID, accountID, amount);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;WITHDRAW_CASH&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in withdrawCash.&amp;quot;);&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // --------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deposit cash'''&lt;br /&gt;
&lt;br /&gt;
Here is the complete Java implementation for Deposit Cash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean depositCash(String serverID, String nymID, String accountID, String purse, boolean isToken) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In depositCash serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID + &amp;quot; isToken:&amp;quot; + isToken);&lt;br /&gt;
        Utility.setOtDepositCash(null);&lt;br /&gt;
        String oldPurse = purse;&lt;br /&gt;
        if (isToken) {&lt;br /&gt;
            purse = getNewPurse(purse, serverID, nymID, accountID);&lt;br /&gt;
            System.out.println(&amp;quot;purse after getting from push purse:&amp;quot; + purse);&lt;br /&gt;
            if (purse == null) {&lt;br /&gt;
                Utility.setOtDepositCash(oldPurse);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // ----------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.DEPOSIT_CASH, serverID, nymID, accountID, purse);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;DEPOSIT_CASH&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;IN depositCash: OTAPI_Func.SendTransaction(() failed. (I give up.) &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (isToken) {&lt;br /&gt;
                System.out.println(&amp;quot;IN depositCash, failed action for single token&amp;quot;);&lt;br /&gt;
                String assetID = otapi.OT_API_GetAccountWallet_AssetTypeID(accountID);&lt;br /&gt;
                boolean importStatus = otapi.OT_API_Wallet_ImportPurse(serverID, assetID, nymID, purse) == 1 ? true : false;&lt;br /&gt;
                System.out.println(&amp;quot;Since failure of depositCashPurse, OT_API_Wallet_ImportPurse called, status of import:&amp;quot; + importStatus);&lt;br /&gt;
                if (!importStatus) {&lt;br /&gt;
                    Utility.setOtDepositCash(purse);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // ----------------------------------------&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Note about local storage: Usually whenever something important is downloaded from the server, the OT API will save it automatically to the default storage context, and you can then load it up using another API call. This is usually the most convenient way to do things.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Account-to-Account Transfer'''&lt;br /&gt;
&lt;br /&gt;
A _pending transfer_ will go into your outbox, and the recipient's inbox, pending acceptance by the recipient.&lt;br /&gt;
&lt;br /&gt;
FYI, every asset account has its own inbox and outbox for handling pending transactions, as well as receipts.&lt;br /&gt;
&lt;br /&gt;
FYI, every Nym similarly has its own Nymbox, used for receiving messages from other users, and for receiving new transaction numbers from the server.&lt;br /&gt;
&lt;br /&gt;
Here is the OT Script implementation of Send Transfer, from the &amp;quot;sample scripts&amp;quot;:https://github.com/FellowTraveler/Open-Transactions/tree/master/scripts/samples folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def OT_ME::send_transfer(SERVER_ID, NYM_ID, ACCT_FROM, ACCT_TO, AMOUNT, NOTE) &lt;br /&gt;
    {&lt;br /&gt;
        var ot_Msg := OTAPI_Func()&lt;br /&gt;
        // -------------------------&lt;br /&gt;
        var theRequest := OTAPI_Func(ot_Msg.SEND_TRANSFER, SERVER_ID, NYM_ID, ACCT_FROM, ACCT_TO, AMOUNT, NOTE)&lt;br /&gt;
        var     strResponse = theRequest.SendTransaction(theRequest, &amp;quot;SEND_TRANSFER&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        return strResponse&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Withdraw Voucher'''&lt;br /&gt;
&lt;br /&gt;
A voucher is like a &amp;quot;money order&amp;quot; or &amp;quot;cashier's cheque&amp;quot;.  It's a cheque, but drawn on a server account, instead of your own account.&lt;br /&gt;
&lt;br /&gt;
Withdrawing in voucher form is similar to withdrawing in cash: the server debits your asset account, and then gives you an official cheque.&lt;br /&gt;
&lt;br /&gt;
But with cash, it's automatically saved to your purse, whereas with a voucher, you have to read the voucher out of the server reply, and display it on the screen!&lt;br /&gt;
&lt;br /&gt;
Here is the complete Java code to perform Withdraw Voucher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String withdrawVoucher(String serverID, String nymID, String accountID, String amount, String chequeMemo, String recepientNymID) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In withdrawVoucher serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.WITHDRAW_VOUCHER, serverID, nymID, accountID, recepientNymID, chequeMemo, amount);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;WITHDRAW_VOUCHER&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in withdrawVoucher.&amp;quot;);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        String ledger = otapi.OT_API_Message_GetLedger(strResponse);&lt;br /&gt;
        if (ledger == null) {&lt;br /&gt;
            System.out.println(&amp;quot; ledger is null, returned by OT_API_Message_GetLedger, serverResponseMessage passed as argument&amp;quot;);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        String transaction = otapi.OT_API_Ledger_GetTransactionByIndex(serverID, nymID, accountID, ledger, 0);&lt;br /&gt;
        if (transaction == null) {&lt;br /&gt;
            System.out.println(&amp;quot;withdrawVoucher: transaction is null, returned by OT_API_Ledger_GetTransactionByIndex, argument passed, index 0 and ledger :&amp;quot; + ledger);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        String output = otapi.OT_API_Transaction_GetVoucher(serverID, nymID, accountID, transaction);&lt;br /&gt;
        System.out.println(&amp;quot;output returned by OT_API_Transaction_GetVoucher:&amp;quot; + output);&lt;br /&gt;
&lt;br /&gt;
        return output;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
&lt;br /&gt;
'''BASKET CURRENCIES'''&lt;br /&gt;
&lt;br /&gt;
'''Create a new Basket Currency'''&lt;br /&gt;
&lt;br /&gt;
First, invent the basket in your head. Give it name: _&amp;quot;Clams.&amp;quot;_&lt;br /&gt;
&lt;br /&gt;
Next, give it a ratio in terms of other existing currencies:  _&amp;quot;10 Clams equals a basket of 5 dollars, 3 Euro, and 20 Bitcoin&amp;quot;_&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_GenerateBasketCreation()''' to begin creating the basket. The _&amp;quot;10 Clams&amp;quot;_ from above is set here.&lt;br /&gt;
&lt;br /&gt;
Next, call '''OT_API_AddBasketCreationItem()''' for EACH currency in the basket. In the above example, I would call this function 3 times, in order to set the _&amp;quot;5 dollars&amp;quot;_ the _&amp;quot;3 Euro&amp;quot;_ and the _&amp;quot;20 Bitcoin&amp;quot;_ from above.&lt;br /&gt;
&lt;br /&gt;
Now that the basket has been defined, call '''OT_API_issueBasket()''' to actually create the basket currency on the server.&lt;br /&gt;
&lt;br /&gt;
(Now you have created a new asset type--a basket--which the server will control. Any user may now create accounts using this type!  And from there, they can write cheques, withdraw cash, trade on markets, etc. the same as with any other asset type.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exchange Digital Assets in/out of a Basket Currency (from your Asset Accounts)'''&lt;br /&gt;
&lt;br /&gt;
First, call '''OT_API_GenerateBasketExchange()''' to setup the exchange. You'll need to know the basket's asset type, and you'll need to have an existing asset account of that type. You will also set the &amp;quot;transfer multiple&amp;quot; in that call. &lt;br /&gt;
&lt;br /&gt;
What's the transfer multiple? Remember the ratio above: &amp;quot;10 Clams equals a basket of 5 dollars, 3 Euro, and 20 Bitcoin&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Here are examples of the transfer multiple:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;10 Clams ==    5 USD,   3 EUR,   20 BIT&amp;quot; (Transfer multiple: 1)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;20 Clams ==  10 USD,   6 EUR,   40 BIT&amp;quot; (Transfer multiple: 2)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;30 Clams ==  15 USD,   9 EUR,   60 BIT&amp;quot; (Transfer multiple: 3)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;40 Clams ==  20 USD, 12 EUR,   80 BIT&amp;quot; (Transfer multiple: 4)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;50 Clams ==  25 USD, 15 EUR, 100 BIT&amp;quot; (Transfer multiple: 5)&lt;br /&gt;
&lt;br /&gt;
Next, call '''OT_API_AddBasketExchangeItem()''' for each currency type in the basket. You will need to to pass the asset account ID for an existing asset account, for each currency type (since you are converting in or out, from your basket account, to your asset accounts.)&lt;br /&gt;
&lt;br /&gt;
Therefore you will call this function once for USD, once for EUR, and once for BIT, in that example, passing in your USD asset acct ID, your EUR asset acct ID, and your Bitcoin asset account ID.&lt;br /&gt;
&lt;br /&gt;
Now that it's all set up, call '''OT_API_exchangeBasket()''' to actually message the server and perform the exchange.&lt;br /&gt;
&lt;br /&gt;
'''Interesting''': ''basket currencies themselves require no more additional system resources than normal currencies!'' The magic happens during the exchange process. The server simply stores internal asset accounts for the dollars, euros, and bitcoins (say), and it manages the issuer account for the basket, and it also manages the exchanging in and out, by moving digital assets in or out of the internal backing accounts.  After that point, a basket is just another Asset Type ID, and requires no additional resources.  You can even have baskets made up of other baskets, nested 10 times, and it won't affect the speed of operation of the server!&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''PROCESSING YOUR INBOX'''&lt;br /&gt;
&lt;br /&gt;
'''Process the Receipts and Pending Transfers in your Inbox'''&lt;br /&gt;
&lt;br /&gt;
If you wish, call '''OT_API_getInbox()''' to grab the latest inbox from the server. &lt;br /&gt;
&lt;br /&gt;
In the high-level API, this is often just automated for you, but nevertheless, check out the dl_acct_files.ot script. See also show_inbox.ot, etc.&lt;br /&gt;
 &lt;br /&gt;
 During this time, your user has the opportunity to peruse the inbox, and to decide which transactions therein he wishes to accept or reject. Usually the inbox is display on the screen, then the user selects various items to accept or reject, and then the user clicks &amp;quot;Process Inbox&amp;quot; and then you do this:&lt;br /&gt;
 &lt;br /&gt;
Then call '''OT_API_Ledger_CreateResponse()''' in order to create a 'response' ledger for that inbox, which will be sent to the server to signal your responses to the various inbox transactions.&lt;br /&gt;
&lt;br /&gt;
Then call '''OT_API_Ledger_GetCount()''' (pass it the inbox) to find out how many transactions are inside of it.  Use that count to LOOP through them...&lt;br /&gt;
&lt;br /&gt;
Use '''OT_API_Ledger_GetTransactionByIndex()''' to grab each transaction as you iterate through the inbox. (There are various introspection functions you can use in the API here if you wish to display the inbox items on the screen for the user...) &lt;br /&gt;
&lt;br /&gt;
Next call '''OT_API_Transaction_CreateResponse()''' for each transaction in the inbox, to create a response to it, accepting or rejecting it. This function creates the response and adds it to the response ledger.&lt;br /&gt;
&lt;br /&gt;
Next, call '''OT_API_Ledger_FinalizeResponse()''' which will create a _Balance Agreement_ for the ledger.&lt;br /&gt;
&lt;br /&gt;
Finally, call '''OT_API_processInbox()''' to send your message to the server and process the various items.&lt;br /&gt;
&lt;br /&gt;
(See the accept_inbox.ot script.)&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use '''OT_API_Message_GetBalanceAgreementSuccess()''' and '''OT_API_Message_GetTransactionSuccess()''' to see just _how_ successful.&lt;br /&gt;
&lt;br /&gt;
---------------------------------&lt;br /&gt;
&lt;br /&gt;
'''MARKETS and PAYMENT PLANS'''&lt;br /&gt;
&lt;br /&gt;
'''Setup a Payment Plan'''&lt;br /&gt;
&lt;br /&gt;
The Merchant draws up the Payment Plan using '''OT_API_ProposePaymentPlan'''&lt;br /&gt;
&lt;br /&gt;
Then he sends it to the Customer, who calls '''OT_API_ConfirmPaymentPlan'''&lt;br /&gt;
&lt;br /&gt;
The Customer's wallet activates the payment plan by sending it to the server using this function: '''OT_API_depositPaymentPlan()'''&lt;br /&gt;
&lt;br /&gt;
(Receipts will process into the respective parties' inboxes.)&lt;br /&gt;
&lt;br /&gt;
Use OT_API_cancelCronItem() to cancel any payment plan (or market offer.)&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use '''OT_API_Message_GetBalanceAgreementSuccess()''' and '''OT_API_Message_GetTransactionSuccess()''' as described above in the _deposit cash_ instructions.&lt;br /&gt;
&lt;br /&gt;
'''Issue a [[Markets|Market]] Offer'''&lt;br /&gt;
&lt;br /&gt;
Call this function: '''OT_API_issueMarketOffer()'''&lt;br /&gt;
&lt;br /&gt;
(That's the low-level one. See create_offer.ot script for the high-level version.)&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_Message_GetSuccess''' to find out if the message was a SUCCESS or FAILURE.&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use '''OT_API_Message_GetBalanceAgreementSuccess()''' and '''OT_API_Message_GetTransactionSuccess()''' as described above in the _deposit cash_ instructions.&lt;br /&gt;
See the OTScript and Java versions of these calls.&lt;br /&gt;
&lt;br /&gt;
Once an offer goes onto the market, multiple trades may occur between it and the other offers on the market.&lt;br /&gt;
&lt;br /&gt;
(According to the rules in the offers.) Receipts will process into the respective parties' inboxes after each trade.&lt;br /&gt;
&lt;br /&gt;
'''Cancel a Market Offer'''&lt;br /&gt;
&lt;br /&gt;
Use '''OT_API_cancelNymMarketOffer''' to remove an offer from a market.&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use '''OT_API_Message_GetBalanceAgreementSuccess()''' and '''OT_API_Message_GetTransactionSuccess()'''&lt;br /&gt;
&lt;br /&gt;
'''Retrieving Market Data from OT Server:'''&lt;br /&gt;
&lt;br /&gt;
'''OT_API_getMarketList''' retrieves a list of all the markets available on a specific server, and details for each market. If the server call is a success, the data will be retrieved from the OT server, and written to local storage using the OT Storage API, at this path or key (inside your data_folder location): '''markets/SERVER_ID/market_data.bin'''&lt;br /&gt;
&lt;br /&gt;
If you want to verify whether the data is now available in local storage (after a successful call to getMarketList), your code would look like this: &lt;br /&gt;
&lt;br /&gt;
'''if (otapi.Exists(&amp;quot;markets&amp;quot;, serverID, &amp;quot;market_data.bin&amp;quot;)) bFoundFile = true;'''&lt;br /&gt;
&lt;br /&gt;
Here is some Java code that reads the market list object from local storage, assuming bFoundFile is true:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	MarketList marketList = null;&lt;br /&gt;
	Storable storable = null;&lt;br /&gt;
&lt;br /&gt;
	if (otapi.Exists(&amp;quot;markets&amp;quot;, serverID, &amp;quot;market_data.bin&amp;quot;)) &lt;br /&gt;
	{&lt;br /&gt;
		storable =&lt;br /&gt;
			otapi.QueryObject(StoredObjectType.STORED_OBJ_MARKET_LIST,&lt;br /&gt;
				&amp;quot;markets&amp;quot;, serverID, &amp;quot;market_data.bin&amp;quot;);&lt;br /&gt;
		if (storable==null)&lt;br /&gt;
			return null;&lt;br /&gt;
            marketList = MarketList.ot_dynamic_cast(storable);&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have the market list, here is some sample Java code to read the details of an individual market from that list:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static Object getMarketDetails(String marketID)&lt;br /&gt;
{&lt;br /&gt;
	MarketList marketList = Utility.getMarketList();&lt;br /&gt;
&lt;br /&gt;
	if (marketList == null) &lt;br /&gt;
	{&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for (int i=0; i &amp;lt; marketList.GetMarketDataCount(); i++)&lt;br /&gt;
	{&lt;br /&gt;
		MarketData marketData = marketList.GetMarketData(i);&lt;br /&gt;
&lt;br /&gt;
		if (marketData == null)&lt;br /&gt;
			continue;&lt;br /&gt;
&lt;br /&gt;
		String [] row = new String[2];&lt;br /&gt;
&lt;br /&gt;
		if (marketID.equals(marketData.getMarket_id())) &lt;br /&gt;
		{&lt;br /&gt;
			String[] data = new String[2];&lt;br /&gt;
			marketData.getLast_sale_price();&lt;br /&gt;
			marketData.getCurrent_ask();&lt;br /&gt;
			&lt;br /&gt;
			// Etc!! This is where you get the market details.&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// return custom object here (row/data or whatever), or null if failure..&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OT_API_getMarketOffers''' retrieves publicly-available info for all offers on a specific market, up until maximum depth, and saves the data here: '''markets/SERVER_ID/offers/MARKET_ID.bin'''&lt;br /&gt;
&lt;br /&gt;
(See testwallet/OTAPI.i for ALL DATA OBJECTS that are used in local storage, including market offers, recent trades, etc. See the code above for a sample on how those data objects are used.)&lt;br /&gt;
&lt;br /&gt;
'''OT_API_getMarketRecentTrades''': Retrieves all recent trades on a market (up until maximum depth), and stores them here: '''markets/SERVER_ID/recent/MARKET_ID.bin'''&lt;br /&gt;
&lt;br /&gt;
To retrieve the offers that a specific Nym has out on the market, use: '''OT_API_getNym_MarketOffers'''&lt;br /&gt;
&lt;br /&gt;
This _getNym_MarketOffers_ data is _private_ and thus a lot more detailed than what's retrieved via '''OT_API_Market_GetOffers''', which is more meant for public use. &lt;br /&gt;
&lt;br /&gt;
After a successful retrieval, you can load the data from this location: '''nyms/SERVER_ID/offers/NYM_ID.bin'''&lt;br /&gt;
&lt;br /&gt;
If you want to see the Nym's private list of his ''completed trades'', the path to load it from is here:&lt;br /&gt;
&lt;br /&gt;
'''nyms/trades/SERVER_ID/NYM_ID'''&lt;br /&gt;
&lt;br /&gt;
There is no need to send a server message in this last case--just read the data from local storage directly. (When market trading receipts are accepted and cleared out of your inbox, this is where they will go. So there's no need to download them, since they were already downloaded through your inbox previously.)&lt;br /&gt;
&lt;br /&gt;
As before, the appropriate data object can be found in testwallet/OTAPI.i along with all the others.&lt;br /&gt;
&lt;br /&gt;
----------------------&lt;br /&gt;
&lt;br /&gt;
I will be very responsive to developer needs and questions regarding the OT API, so I encourage you to play with the software and contact me anytime.&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
&lt;br /&gt;
[[Opentxs | opentxs command-line tool]]&lt;br /&gt;
&lt;br /&gt;
[[List of Classes | The OT C++ class library]]&lt;br /&gt;
&lt;br /&gt;
[[OTX | The OTX protocol]]&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=API&amp;diff=3177</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=API&amp;diff=3177"/>
		<updated>2015-07-08T22:17:46Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NOTE: This page is old, but preserved in case of any usefulness. [github.com/Open-Transactions/Moneychanger Moneychanger] is the reference implementation and it shows how to use the OT client API. If you ever need to write code that uses OT, just copy the sample code you need out of Moneychanger itself. It's that easy!&lt;br /&gt;
&lt;br /&gt;
=== API Docs ===&lt;br /&gt;
* [http://opentransactions.org/docs/class_o_t___m_e.html High-level API (C++)]&lt;br /&gt;
&lt;br /&gt;
* [http://opentransactions.org/docs/class_o_t_made_easy.html High-level API (all other languages)]&lt;br /&gt;
&lt;br /&gt;
* [http://opentransactions.org/docs/class_o_t_a_p_i___wrap.html Low-level API (C++)]&lt;br /&gt;
&lt;br /&gt;
* [http://opentransactions.org/docs/class_o_t_a_p_i___basic.html Low-level API (all other languages)]&lt;br /&gt;
&lt;br /&gt;
The general rule of thumb is: Always prefer the high-level API. (Only use the low-level API for functions where no high-level API version is available.)&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
* See the [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTMadeEasy.h#L159 OTMadeEasy] class, as well as the sample scripts provided in [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/demo/php/php_ot_test.php PHP] [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/demo/python/python_ot_test.py Python] and [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/demo/csharp/Main.cs C-Sharp].&lt;br /&gt;
&lt;br /&gt;
* OT's high-level API is also available in OT [https://github.com/FellowTraveler/Open-Transactions/wiki/Client-side-scripting client-side scripts]&lt;br /&gt;
&lt;br /&gt;
* The '''opentxs list''' and [https://github.com/FellowTraveler/Open-Transactions/wiki/opentxs opentxs help] commands display a complete list of all the OT API functions available on the command line. The actual code for those commands, written using the OT high-level API, [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/ot/ot_commands.ot#L1288 is available here for your perusal]. This way, you can test the complete OT functionality at the command line, and then flip through the actual code for each command, and see how the OT API calls are used. '''You might be surprised how simple they really are.'''&lt;br /&gt;
&lt;br /&gt;
* With that as your guide, a general rule of thumb is this: Anytime you need to do something, use the [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTMadeEasy.h#L159 high-level API] to do it. Only if you can't find the function you are looking for, should you next resort to the [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTAPI_Basic.h#L170 low-level API]. And remember, you can always the copy the code you need from the [https://github.com/FellowTraveler/Open-Transactions/blob/master/scripts/ot/ot_commands.ot#L1288 opentxs] tool, or from the test GUI, [http://github.com/FellowTraveler/otapij otapiJ].&lt;br /&gt;
&lt;br /&gt;
What does this mean for you? It means you no longer have to worry about synchronizing request numbers, or harvesting transaction numbers, or comparing inbox hashes, or downloading your nymbox, or dropped messages, or timeouts, or retries, etc! Instead, you use simple functions like '''send_transfer''' or '''withdraw_cash'''. The high-level API manages everything else behind the scenes.&lt;br /&gt;
&lt;br /&gt;
The OT high-level API (OTMadeEasy) is now available in these languages: [http://www.chaiscript.com/ ChaiScript] ( [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTMadeEasy.h#L159 ot script] ) and Java, CSharp, PHP, Python, D, Perl, and TCL. The [https://github.com/FellowTraveler/Open-Transactions/blob/master/include/otapi/OTAPI_Basic.h#L170 low-level API] is available in D, Python, PHP, Perl, Java, etc. (Via [http://www.swig.org/ SWIG] wrappers.)&lt;br /&gt;
&lt;br /&gt;
=== USE CASES for the OT API ===&lt;br /&gt;
&lt;br /&gt;
* '''(Client software starts up.)''' Initialize the library and load the wallet.&lt;br /&gt;
* Display for user: '''Server Contracts, Nyms, Accounts, and Asset Types.'''&lt;br /&gt;
* Change the wallet's ''display label'' for any server, asset type, account, or nym.&lt;br /&gt;
* Import a server contract (or asset contract) to the wallet.&lt;br /&gt;
* Create a new '''Pseudonym''' (public/private key pair).&lt;br /&gt;
* Register a public key (a ''&amp;quot;Nym&amp;quot;'') at an OT server.&lt;br /&gt;
* '''Issue a new digital Asset Type'''. (Uploading an asset contract.)&lt;br /&gt;
* Retrieve Currency Contract (by ID).&lt;br /&gt;
* '''Create a new Asset Account'''.&lt;br /&gt;
* '''Write a cheque''' (or invoice)&lt;br /&gt;
* '''Send a Message''' to another user (via the server, encrypted to the recipient's public key.)&lt;br /&gt;
* '''Deposit a cheque'''&lt;br /&gt;
* '''Withdraw cash''' . . . . &amp;lt;==== CHAUMIAN DIGITAL CASH!!&lt;br /&gt;
* '''Deposit cash'''&lt;br /&gt;
* Withdraw Voucher&lt;br /&gt;
* '''Account-to-Account Transfer'''&lt;br /&gt;
* Create a new '''Basket Currency'''&lt;br /&gt;
* '''Exchange''' Digital Assets '''in and out of Baskets''' (from your Asset Accounts)&lt;br /&gt;
* '''Process your Inbox''' (Receipts and pending transfers)&lt;br /&gt;
* Set up a '''Payment Plan'''&lt;br /&gt;
* Issue a '''Market Offer'''&lt;br /&gt;
&lt;br /&gt;
-------&lt;br /&gt;
&lt;br /&gt;
'''Initialize the library and Load your Wallet'''&lt;br /&gt;
&lt;br /&gt;
(The user starts up the wallet software.)&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_Init()'''&lt;br /&gt;
&lt;br /&gt;
Then call '''OT_API_LoadWallet()'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(NOTE: these above 2 steps are not necessary in OT-script, only Java and other languages.)&lt;br /&gt;
&lt;br /&gt;
'''Display the current list of server contracts on the screen'''&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_GetServerCount()''', which returns the number of server contracts in your wallet.&lt;br /&gt;
&lt;br /&gt;
For each one, call '''OT_API_GetServer_ID()''' to get the Server ID (which is a hash of the contract.)&lt;br /&gt;
&lt;br /&gt;
Also for each, call '''OT_API_GetServer_Name()''' to get the Display Name from the contract.&lt;br /&gt;
&lt;br /&gt;
In your GUI, display the name on the screen, but use the ID behind the scenes (for your messages to the server.)&lt;br /&gt;
&lt;br /&gt;
'''Do the same thing for Nyms, Accounts, and Asset Types.'''&lt;br /&gt;
&lt;br /&gt;
You can read about them on the [[API]] page, but here are the basic functions:&lt;br /&gt;
&lt;br /&gt;
OT_API_GetNymCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetServerCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAssetTypeCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountCount(void);&lt;br /&gt;
&lt;br /&gt;
OT_API_GetNym_ID() and OT_API_GetNym_Name()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetServer_ID() and OT_API_GetServer_Name()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAssetType_ID() and OT_API_GetAssetType_Name()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountWallet_ID() and OT_API_GetAccountWallet_Name()&lt;br /&gt;
&lt;br /&gt;
Also: &lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountWallet_Balance()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountWallet_Type()&lt;br /&gt;
&lt;br /&gt;
OT_API_GetAccountWallet_AssetTypeID()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Add a new server contract (or asset contract) to the wallet'''&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_AddServerContract()''' &lt;br /&gt;
&lt;br /&gt;
or '''OT_API_AddAssetContract()'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Create a new Pseudonym'''&lt;br /&gt;
&lt;br /&gt;
(Each user's wallet may contain many pseudonyms. Each Nym consists of a public and a private key, aka a &amp;quot;key pair&amp;quot;.)&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_CreateNym()'''&lt;br /&gt;
&lt;br /&gt;
This creates a new key pair _(&amp;quot;Nym&amp;quot;)_ in your wallet, which you can use for communications with an OT server.&lt;br /&gt;
&lt;br /&gt;
(That is, for opening asset accounts and performing various other transactions. A Nym is a &amp;quot;user account&amp;quot;.)&lt;br /&gt;
&lt;br /&gt;
(You can create as many of these pseudonyms as you want.)&lt;br /&gt;
&lt;br /&gt;
(You can register the same nyms at multiple servers.)&lt;br /&gt;
&lt;br /&gt;
(The same Nym will have the same Nym ID and public key on every server.)&lt;br /&gt;
&lt;br /&gt;
Example &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def details_create_nym(nKeybits, strName)&lt;br /&gt;
{&lt;br /&gt;
    var madeEasy = OT_ME()    &lt;br /&gt;
    var strNymID = madeEasy.create_pseudonym(nKeybits, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;)  // returns new Nym ID&lt;br /&gt;
    &lt;br /&gt;
    if (!VerifyStringVal(strNymID))&lt;br /&gt;
    {&lt;br /&gt;
        OT_API_Output(0, &amp;quot;details_create_nym: Failed in OT_ME::create_pseudonym(keybits == &amp;quot; + nKeybits.to_string() + &amp;quot;)\n&amp;quot;)&lt;br /&gt;
        return (0)&lt;br /&gt;
    }&lt;br /&gt;
    OT_API_Output(0, &amp;quot;Success creating! &amp;quot; + nKeybits.to_string() + &amp;quot; keybits, new ID: &amp;quot;) // stderr&lt;br /&gt;
    print(strNymID) // stdout&lt;br /&gt;
    OT_API_Output(0, &amp;quot;\n&amp;quot;) //stderr&lt;br /&gt;
    // -------------------&lt;br /&gt;
    var bSetName = OT_API_SetNym_Name(strNymID, // subject&lt;br /&gt;
                                      strNymID, // signer&lt;br /&gt;
                                      strName)&lt;br /&gt;
    if (!bSetName)&lt;br /&gt;
    {&lt;br /&gt;
        OT_API_Output(0, &amp;quot;Failed in OT_API_SetNym_Name(name == &amp;quot; + strName + &amp;quot;)\n&amp;quot;)&lt;br /&gt;
        return (0)&lt;br /&gt;
    }&lt;br /&gt;
    // -------------------    &lt;br /&gt;
    OT_API_Output(0, &amp;quot;Success setting name to: &amp;quot; + strName + &amp;quot;\n\n&amp;quot;) // stderr&lt;br /&gt;
    return 1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Register a public key (aka &amp;quot;Nym&amp;quot;) at an OT server'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    var madeEasy	= OT_ME()&lt;br /&gt;
    if (VerifyExists(&amp;quot;Server&amp;quot;) &amp;amp;&amp;amp; VerifyExists(&amp;quot;MyNym&amp;quot;))&lt;br /&gt;
    {        &lt;br /&gt;
        var strResponse = madeEasy.register_nym(Server, MyNym)&lt;br /&gt;
        var nSuccess    = VerifyMessageSuccess(strResponse)&lt;br /&gt;
        switch(nSuccess)&lt;br /&gt;
        {&lt;br /&gt;
            case (1)&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;quot;\n\n SUCCESS in register_nym! Server response:\n\n&amp;quot;);&lt;br /&gt;
                print(strResponse) // stdout&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
            default&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;quot;\n\n Failure or Error in register_nym!\n&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                if (VerifyStringVal(strResponse))&lt;br /&gt;
                {&lt;br /&gt;
                    OT_API_Output(0, &amp;quot;Server response:\n\n&amp;quot;);&lt;br /&gt;
                    print(strResponse) // stdout&lt;br /&gt;
                }&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Change the wallet's label for any server/asset type/account/nym'''&lt;br /&gt;
&lt;br /&gt;
(This is only a client-side label, for display purposes only.)&lt;br /&gt;
&lt;br /&gt;
'''OT_API_SetNym_Name()'''&lt;br /&gt;
&lt;br /&gt;
'''OT_API_SetAccountWallet_Name()'''&lt;br /&gt;
&lt;br /&gt;
'''OT_API_SetAssetType_Name()'''&lt;br /&gt;
&lt;br /&gt;
'''OT_API_SetServer_Name()'''&lt;br /&gt;
&lt;br /&gt;
----------------------------&lt;br /&gt;
&lt;br /&gt;
'''Issue a new digital Asset Type'''&lt;br /&gt;
&lt;br /&gt;
User uploads a new currency contract to the server, so users can create asset accounts based on that asset type.&lt;br /&gt;
&lt;br /&gt;
Server replies with a new issuer account ID (The new Issuer account appears inside your wallet's account list, so go ahead and iterate the list again, in order to display the updated list of accounts on the screen.)&lt;br /&gt;
&lt;br /&gt;
High-level API version (in OT script):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        var madeEasy	= OT_ME()&lt;br /&gt;
        OT_API_Output(0, &amp;quot;Please paste a currency contract, followed by an EOF or a ~ by itself on a blank line:\n\n&amp;quot;)&lt;br /&gt;
        var strContract = OT_CLI_ReadUntilEOF() &lt;br /&gt;
        var strResponse	= madeEasy.issue_asset_type(Server, MyNym, strContract)&lt;br /&gt;
        var nStatus     = VerifyMessageSuccess(strResponse)&lt;br /&gt;
        &lt;br /&gt;
        switch(nStatus)&lt;br /&gt;
        {&lt;br /&gt;
            case (1)&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;quot;\n\n SUCCESS in issue_asset! Server response:\n\n&amp;quot;);&lt;br /&gt;
                print(strResponse) // stdout&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
            default&lt;br /&gt;
            {&lt;br /&gt;
                OT_API_Output(0, &amp;quot;\n\n Failure or error in issue_asset. nStatus: &amp;quot;+nStatus.to_string()+&amp;quot;\n&amp;quot;)&lt;br /&gt;
                if (VerifyStringVal(strResponse))&lt;br /&gt;
                {&lt;br /&gt;
                    OT_API_Output(0, &amp;quot;Server response:\n\n&amp;quot;);&lt;br /&gt;
                    print(strResponse) // stdout&lt;br /&gt;
                }&lt;br /&gt;
                break&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Retrieve Currency Contract (by ID)'''&lt;br /&gt;
&lt;br /&gt;
User wants to download a currency contract from the server (for a given asset type ID.)&lt;br /&gt;
&lt;br /&gt;
(The asset type ID is a hash of the contract, so OT will know if you get the wrong one, since this is verified whenever a contract is loaded up.)&lt;br /&gt;
&lt;br /&gt;
High-level API version (in OT script):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    var madeEasy	= OT_ME()&lt;br /&gt;
    var strRetrieved   = madeEasy.retrieve_contract(Server, MyNym, strContractID)&lt;br /&gt;
    var nRetrieved     = VerifyMessageSuccess(strRetrieved)    &lt;br /&gt;
    var strSuccess = &amp;quot;ERROR&amp;quot;&lt;br /&gt;
    if (1 == nRetrieved)&lt;br /&gt;
    {   strSuccess = &amp;quot;SUCCESS&amp;quot; }&lt;br /&gt;
    else if (0 == nRetrieved)&lt;br /&gt;
    {   strSuccess = &amp;quot;FAILED&amp;quot; }&lt;br /&gt;
    OT_API_Output(0, &amp;quot;\n\n &amp;quot; + strSuccess + &amp;quot; retrieving contract: &amp;quot;+strContractID+&amp;quot;\n\n&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Create a new Asset Account'''&lt;br /&gt;
&lt;br /&gt;
Example in OT Script, from the &amp;quot;sample scripts&amp;quot;:https://github.com/FellowTraveler/Open-Transactions/tree/master/scripts/samples folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def OT_ME::create_asset_acct(SERVER_ID, NYM_ID, ASSET_TYPE_ID) &lt;br /&gt;
    {&lt;br /&gt;
        var ot_Msg := OTAPI_Func()&lt;br /&gt;
        // -------------------------&lt;br /&gt;
        var theRequest := OTAPI_Func(ot_Msg.CREATE_ASSET_ACCT, SERVER_ID, NYM_ID, ASSET_TYPE_ID)&lt;br /&gt;
        var     strResponse = theRequest.SendRequest(theRequest, &amp;quot;CREATE_ASSET_ACCT&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        return strResponse&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it was a SUCCESS, then refresh the list of accounts in your display (from the OT API) since your new asset account should now be there.&lt;br /&gt;
&lt;br /&gt;
(You can also use the &amp;quot;decode&amp;quot; command in the test wallet anytime you want to base64-decode something.)&lt;br /&gt;
&lt;br /&gt;
--------------------------&lt;br /&gt;
&lt;br /&gt;
'''TRANSACTIONS'''&lt;br /&gt;
&lt;br /&gt;
FYI: Balance agreement, combined with transaction numbers, is what makes it possible for the server and all other parties to _eliminate account history, instead storing only the last signed receipt._ (Of course they have the ''choice'' to keep their own records--but they are no longer ''forced'' to do so.)&lt;br /&gt;
&lt;br /&gt;
In order to do any transaction, the wallet's _balance agreement_ process requires that you have the latest copy of your account, inbox, and outbox files. You don't have to worry about this too much, since the high-level API will usually handle it for you.&lt;br /&gt;
&lt;br /&gt;
'''You might ask: ''&amp;quot;But what if I download my account, or my outbox, and the server has maliciously inserted data into them?&amp;quot;'' '''&lt;br /&gt;
''No problem'' -- Open Transactions stores the last signed receipt from the server, and is able to verify the new intermediary files against that last receipt. You can see this happening when you run the command-line test client, and receipts can be verified programmatically using '''OT_API_VerifyAccountReceipt()'''.  &lt;br /&gt;
&lt;br /&gt;
The [[Triple-Signed Receipts]] on Open Transactions ensure that this sort of protection is available to all parties, '''while simultaneously not having to store any transaction history!'''&lt;br /&gt;
&lt;br /&gt;
------------------&lt;br /&gt;
&lt;br /&gt;
'''Write a Cheque'''&lt;br /&gt;
&lt;br /&gt;
Alice writes a cheque (offline):  Call '''OT_API_WriteCheque()'''&lt;br /&gt;
&lt;br /&gt;
Alice then gives cheque to Bob (offline), _or_ online if she prefers via '''OT_API_sendUserMessage()''' function.&lt;br /&gt;
&lt;br /&gt;
If Alice has Bob's UserID but not his public key, her wallet first uses '''OT_API_checkUser()''' to retrieve his public key from the server, and then encrypts the cheque before sending it.&lt;br /&gt;
&lt;br /&gt;
NOTE: a quality wallet software will keep track of ALL instruments! Even when Alice gives a cheque to Bob, her wallet should still store a copy of that cheque. Until when? Until at least after he has cashed it... when he does that, a chequeReceipt will appear in her inbox. Only when she accepts that receipt, signing a new balance agreement, is she finally free of the transaction number that was on that cheque. (It was still signed-out to her, all the way up until that time.) &lt;br /&gt;
&lt;br /&gt;
WHAT IF Bob had never cashed it? WHAT IF he lost it? Is Alice supposed to just keep signing for that number forever? (The chequeReceipt will never appear in her inbox. She is doomed to continue signing for this number on all of her receipts on into the future, ad infinitum, with no hope of ever closing it out!) &lt;br /&gt;
&lt;br /&gt;
Fear not, there is a solution: '''OT_API_DiscardCheque()'''. (Lucky you saved a copy of that cheque in your wallet, eh?) This function will retrieve Alice's transaction # back from the cheque, so that her wallet is free to use it on her next valid transaction, and then close it out normally.&lt;br /&gt;
&lt;br /&gt;
'''Deposit a cheque'''&lt;br /&gt;
&lt;br /&gt;
(A voucher is also a cheque, so you may deposit a voucher here the same as any other cheque.)&lt;br /&gt;
&lt;br /&gt;
Bob sends message to server requesting deposit: &lt;br /&gt;
&lt;br /&gt;
'''(High level API version, in Java.)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    public boolean depositCheque(String serverID, String nymID, String accountID, String cheque) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In depositCheque serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.DEPOSIT_CHEQUE, serverID, nymID, accountID, cheque);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;DEPOSIT_CHEQUE&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in depositCheque.&amp;quot;);&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // -------------------------------------------------------------------------------------- &lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Withdraw cash'''&lt;br /&gt;
&lt;br /&gt;
Alice's wallet first makes sure she has the latest public mint file, by calling '''OT_API_getMint()'''.&lt;br /&gt;
&lt;br /&gt;
(Note: if the mint she already has is within its valid date range, there's no need to do this.)&lt;br /&gt;
&lt;br /&gt;
(Note: If she does call getMint, Alice needs to check the server reply and make sure it was successful before continuing with the withdrawal. The public mint keys are necessary for cash withdrawal.)&lt;br /&gt;
&lt;br /&gt;
Alice then withdraws from her asset account, by messaging server:  '''OT_API_notarizeWithdrawal()'''&lt;br /&gt;
&lt;br /&gt;
Server replies with chaumian cash, which is stored in the purse folder in local storage.&lt;br /&gt;
&lt;br /&gt;
Here is the full Java implementation of Withdraw Cash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    public boolean withdrawCash(String serverID, String nymID, String accountID, String amount) &lt;br /&gt;
    {&lt;br /&gt;
        String serverResponseMessage = null;&lt;br /&gt;
        System.out.println(&amp;quot;In withdrawCash serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
        String assetID = otapi.OT_API_GetAccountWallet_AssetTypeID(accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------- &lt;br /&gt;
        // Make sure we have the proper asset contract for the withdrawal.&lt;br /&gt;
        //&lt;br /&gt;
        String assetContract = otapi.OT_API_LoadAssetContract(assetID);&lt;br /&gt;
        if (assetContract == null) {&lt;br /&gt;
            OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.GET_CONTRACT, serverID, nymID, assetID);&lt;br /&gt;
            String strResponse = OTAPI_Func.SendRequest(theRequest, &amp;quot;GET_CONTRACT&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (null == strResponse) {&lt;br /&gt;
                System.out.println(&amp;quot;IN withdrawCash: OTAPI_Func.SendRequest(GET_CONTRACT) failed. (I give up.) (Unable to find asset contract.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            assetContract = otapi.OT_API_LoadAssetContract(assetID);&lt;br /&gt;
            if (assetContract == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadAssetContract returned null even after OT_API_getContract (Unable to find asset contract.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        // Download the public mintfile if it's not there, or if it's expired.&lt;br /&gt;
        // Also load it up into memory as a string (just to make sure it works.)&lt;br /&gt;
        // Then we can actually send the withdrawal transaction request. (Until&lt;br /&gt;
        // then, why bother?)&lt;br /&gt;
        //&lt;br /&gt;
        String mintFile;&lt;br /&gt;
&lt;br /&gt;
        // expired or missing.&lt;br /&gt;
        if (1 != otapi.OT_API_Mint_IsStillGood(serverID, assetID)) &lt;br /&gt;
        {&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.GET_MINT, serverID, nymID, assetID);&lt;br /&gt;
            String strResponse = OTAPI_Func.SendRequest(theRequest, &amp;quot;GET_MINT&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (null == strResponse) {&lt;br /&gt;
                System.out.println(&amp;quot;IN withdrawCash: OTAPI_Func.SendRequest(GET_MINT) failed. (I give up.) (Unable to get mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            // ----------------------------------------&lt;br /&gt;
            mintFile = otapi.OT_API_LoadMint(serverID, assetID);&lt;br /&gt;
            if (mintFile == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadMint returned null even after OT_API_getMint (I give up.) (Unable to find mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else // current mint IS available already on local storage (and not expired.)&lt;br /&gt;
        {&lt;br /&gt;
            mintFile = otapi.OT_API_LoadMint(serverID, assetID);&lt;br /&gt;
            if (mintFile == null) {&lt;br /&gt;
                System.out.println(&amp;quot;OT_API_LoadMint returned null even after successful OT_API_Mint_IsStillGood (I give up.) (Unable to find mint.)&amp;quot;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        // By this point, the mintfile is DEFINITELY good (available, not null, &lt;br /&gt;
        // not expired, and loaded up.) Now we know for a fact that when the API&lt;br /&gt;
        // call is made to withdraw cash, that it will find the mint properly.&lt;br /&gt;
        //&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.WITHDRAW_CASH, serverID, nymID, accountID, amount);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;WITHDRAW_CASH&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in withdrawCash.&amp;quot;);&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // --------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deposit cash'''&lt;br /&gt;
&lt;br /&gt;
Here is the complete Java implementation for Deposit Cash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean depositCash(String serverID, String nymID, String accountID, String purse, boolean isToken) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In depositCash serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID + &amp;quot; isToken:&amp;quot; + isToken);&lt;br /&gt;
        Utility.setOtDepositCash(null);&lt;br /&gt;
        String oldPurse = purse;&lt;br /&gt;
        if (isToken) {&lt;br /&gt;
            purse = getNewPurse(purse, serverID, nymID, accountID);&lt;br /&gt;
            System.out.println(&amp;quot;purse after getting from push purse:&amp;quot; + purse);&lt;br /&gt;
            if (purse == null) {&lt;br /&gt;
                Utility.setOtDepositCash(oldPurse);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // ----------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.DEPOSIT_CASH, serverID, nymID, accountID, purse);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;DEPOSIT_CASH&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;IN depositCash: OTAPI_Func.SendTransaction(() failed. (I give up.) &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (isToken) {&lt;br /&gt;
                System.out.println(&amp;quot;IN depositCash, failed action for single token&amp;quot;);&lt;br /&gt;
                String assetID = otapi.OT_API_GetAccountWallet_AssetTypeID(accountID);&lt;br /&gt;
                boolean importStatus = otapi.OT_API_Wallet_ImportPurse(serverID, assetID, nymID, purse) == 1 ? true : false;&lt;br /&gt;
                System.out.println(&amp;quot;Since failure of depositCashPurse, OT_API_Wallet_ImportPurse called, status of import:&amp;quot; + importStatus);&lt;br /&gt;
                if (!importStatus) {&lt;br /&gt;
                    Utility.setOtDepositCash(purse);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // ----------------------------------------&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Note about local storage: Usually whenever something important is downloaded from the server, the OT API will save it automatically to the default storage context, and you can then load it up using another API call. This is usually the most convenient way to do things.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Account-to-Account Transfer'''&lt;br /&gt;
&lt;br /&gt;
A _pending transfer_ will go into your outbox, and the recipient's inbox, pending acceptance by the recipient.&lt;br /&gt;
&lt;br /&gt;
FYI, every asset account has its own inbox and outbox for handling pending transactions, as well as receipts.&lt;br /&gt;
&lt;br /&gt;
FYI, every Nym similarly has its own Nymbox, used for receiving messages from other users, and for receiving new transaction numbers from the server.&lt;br /&gt;
&lt;br /&gt;
Here is the OT Script implementation of Send Transfer, from the &amp;quot;sample scripts&amp;quot;:https://github.com/FellowTraveler/Open-Transactions/tree/master/scripts/samples folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def OT_ME::send_transfer(SERVER_ID, NYM_ID, ACCT_FROM, ACCT_TO, AMOUNT, NOTE) &lt;br /&gt;
    {&lt;br /&gt;
        var ot_Msg := OTAPI_Func()&lt;br /&gt;
        // -------------------------&lt;br /&gt;
        var theRequest := OTAPI_Func(ot_Msg.SEND_TRANSFER, SERVER_ID, NYM_ID, ACCT_FROM, ACCT_TO, AMOUNT, NOTE)&lt;br /&gt;
        var     strResponse = theRequest.SendTransaction(theRequest, &amp;quot;SEND_TRANSFER&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        return strResponse&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Withdraw Voucher'''&lt;br /&gt;
&lt;br /&gt;
A voucher is like a &amp;quot;money order&amp;quot; or &amp;quot;cashier's cheque&amp;quot;.  It's a cheque, but drawn on a server account, instead of your own account.&lt;br /&gt;
&lt;br /&gt;
Withdrawing in voucher form is similar to withdrawing in cash: the server debits your asset account, and then gives you an official cheque.&lt;br /&gt;
&lt;br /&gt;
But with cash, it's automatically saved to your purse, whereas with a voucher, you have to read the voucher out of the server reply, and display it on the screen!&lt;br /&gt;
&lt;br /&gt;
Here is the complete Java code to perform Withdraw Voucher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String withdrawVoucher(String serverID, String nymID, String accountID, String amount, String chequeMemo, String recepientNymID) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;In withdrawVoucher serverID:&amp;quot; + serverID + &amp;quot; nymID:&amp;quot; + nymID + &amp;quot; acount ID:&amp;quot; + accountID);&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------&lt;br /&gt;
        OTAPI_Func theRequest = new OTAPI_Func(OTAPI_Func.FT.WITHDRAW_VOUCHER, serverID, nymID, accountID, recepientNymID, chequeMemo, amount);&lt;br /&gt;
        String strResponse = OTAPI_Func.SendTransaction(theRequest, &amp;quot;WITHDRAW_VOUCHER&amp;quot;); // &amp;lt;========================&lt;br /&gt;
&lt;br /&gt;
        if (null == strResponse) {&lt;br /&gt;
            System.out.println(&amp;quot;OTAPI_Func.SendTransaction() failed, in withdrawVoucher.&amp;quot;);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        String ledger = otapi.OT_API_Message_GetLedger(strResponse);&lt;br /&gt;
        if (ledger == null) {&lt;br /&gt;
            System.out.println(&amp;quot; ledger is null, returned by OT_API_Message_GetLedger, serverResponseMessage passed as argument&amp;quot;);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        String transaction = otapi.OT_API_Ledger_GetTransactionByIndex(serverID, nymID, accountID, ledger, 0);&lt;br /&gt;
        if (transaction == null) {&lt;br /&gt;
            System.out.println(&amp;quot;withdrawVoucher: transaction is null, returned by OT_API_Ledger_GetTransactionByIndex, argument passed, index 0 and ledger :&amp;quot; + ledger);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        // ---------------------------------------------------------&lt;br /&gt;
        String output = otapi.OT_API_Transaction_GetVoucher(serverID, nymID, accountID, transaction);&lt;br /&gt;
        System.out.println(&amp;quot;output returned by OT_API_Transaction_GetVoucher:&amp;quot; + output);&lt;br /&gt;
&lt;br /&gt;
        return output;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
&lt;br /&gt;
'''BASKET CURRENCIES'''&lt;br /&gt;
&lt;br /&gt;
'''Create a new Basket Currency'''&lt;br /&gt;
&lt;br /&gt;
First, invent the basket in your head. Give it name: _&amp;quot;Clams.&amp;quot;_&lt;br /&gt;
&lt;br /&gt;
Next, give it a ratio in terms of other existing currencies:  _&amp;quot;10 Clams equals a basket of 5 dollars, 3 Euro, and 20 Bitcoin&amp;quot;_&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_GenerateBasketCreation()''' to begin creating the basket. The _&amp;quot;10 Clams&amp;quot;_ from above is set here.&lt;br /&gt;
&lt;br /&gt;
Next, call '''OT_API_AddBasketCreationItem()''' for EACH currency in the basket. In the above example, I would call this function 3 times, in order to set the _&amp;quot;5 dollars&amp;quot;_ the _&amp;quot;3 Euro&amp;quot;_ and the _&amp;quot;20 Bitcoin&amp;quot;_ from above.&lt;br /&gt;
&lt;br /&gt;
Now that the basket has been defined, call '''OT_API_issueBasket()''' to actually create the basket currency on the server.&lt;br /&gt;
&lt;br /&gt;
(Now you have created a new asset type--a basket--which the server will control. Any user may now create accounts using this type!  And from there, they can write cheques, withdraw cash, trade on markets, etc. the same as with any other asset type.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exchange Digital Assets in/out of a Basket Currency (from your Asset Accounts)'''&lt;br /&gt;
&lt;br /&gt;
First, call '''OT_API_GenerateBasketExchange()''' to setup the exchange. You'll need to know the basket's asset type, and you'll need to have an existing asset account of that type. You will also set the &amp;quot;transfer multiple&amp;quot; in that call. &lt;br /&gt;
&lt;br /&gt;
What's the transfer multiple? Remember the ratio above: &amp;quot;10 Clams equals a basket of 5 dollars, 3 Euro, and 20 Bitcoin&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Here are examples of the transfer multiple:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;10 Clams ==    5 USD,   3 EUR,   20 BIT&amp;quot; (Transfer multiple: 1)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;20 Clams ==  10 USD,   6 EUR,   40 BIT&amp;quot; (Transfer multiple: 2)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;30 Clams ==  15 USD,   9 EUR,   60 BIT&amp;quot; (Transfer multiple: 3)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;40 Clams ==  20 USD, 12 EUR,   80 BIT&amp;quot; (Transfer multiple: 4)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;50 Clams ==  25 USD, 15 EUR, 100 BIT&amp;quot; (Transfer multiple: 5)&lt;br /&gt;
&lt;br /&gt;
Next, call '''OT_API_AddBasketExchangeItem()''' for each currency type in the basket. You will need to to pass the asset account ID for an existing asset account, for each currency type (since you are converting in or out, from your basket account, to your asset accounts.)&lt;br /&gt;
&lt;br /&gt;
Therefore you will call this function once for USD, once for EUR, and once for BIT, in that example, passing in your USD asset acct ID, your EUR asset acct ID, and your Bitcoin asset account ID.&lt;br /&gt;
&lt;br /&gt;
Now that it's all set up, call '''OT_API_exchangeBasket()''' to actually message the server and perform the exchange.&lt;br /&gt;
&lt;br /&gt;
'''Interesting''': ''basket currencies themselves require no more additional system resources than normal currencies!'' The magic happens during the exchange process. The server simply stores internal asset accounts for the dollars, euros, and bitcoins (say), and it manages the issuer account for the basket, and it also manages the exchanging in and out, by moving digital assets in or out of the internal backing accounts.  After that point, a basket is just another Asset Type ID, and requires no additional resources.  You can even have baskets made up of other baskets, nested 10 times, and it won't affect the speed of operation of the server!&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''PROCESSING YOUR INBOX'''&lt;br /&gt;
&lt;br /&gt;
'''Process the Receipts and Pending Transfers in your Inbox'''&lt;br /&gt;
&lt;br /&gt;
If you wish, call '''OT_API_getInbox()''' to grab the latest inbox from the server. &lt;br /&gt;
&lt;br /&gt;
In the high-level API, this is often just automated for you, but nevertheless, check out the dl_acct_files.ot script. See also show_inbox.ot, etc.&lt;br /&gt;
 &lt;br /&gt;
 During this time, your user has the opportunity to peruse the inbox, and to decide which transactions therein he wishes to accept or reject. Usually the inbox is display on the screen, then the user selects various items to accept or reject, and then the user clicks &amp;quot;Process Inbox&amp;quot; and then you do this:&lt;br /&gt;
 &lt;br /&gt;
Then call '''OT_API_Ledger_CreateResponse()''' in order to create a 'response' ledger for that inbox, which will be sent to the server to signal your responses to the various inbox transactions.&lt;br /&gt;
&lt;br /&gt;
Then call '''OT_API_Ledger_GetCount()''' (pass it the inbox) to find out how many transactions are inside of it.  Use that count to LOOP through them...&lt;br /&gt;
&lt;br /&gt;
Use '''OT_API_Ledger_GetTransactionByIndex()''' to grab each transaction as you iterate through the inbox. (There are various introspection functions you can use in the API here if you wish to display the inbox items on the screen for the user...) &lt;br /&gt;
&lt;br /&gt;
Next call '''OT_API_Transaction_CreateResponse()''' for each transaction in the inbox, to create a response to it, accepting or rejecting it. This function creates the response and adds it to the response ledger.&lt;br /&gt;
&lt;br /&gt;
Next, call '''OT_API_Ledger_FinalizeResponse()''' which will create a _Balance Agreement_ for the ledger.&lt;br /&gt;
&lt;br /&gt;
Finally, call '''OT_API_processInbox()''' to send your message to the server and process the various items.&lt;br /&gt;
&lt;br /&gt;
(See the accept_inbox.ot script.)&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use '''OT_API_Message_GetBalanceAgreementSuccess()''' and '''OT_API_Message_GetTransactionSuccess()''' to see just _how_ successful.&lt;br /&gt;
&lt;br /&gt;
---------------------------------&lt;br /&gt;
&lt;br /&gt;
'''MARKETS and PAYMENT PLANS'''&lt;br /&gt;
&lt;br /&gt;
'''Setup a Payment Plan'''&lt;br /&gt;
&lt;br /&gt;
The Merchant draws up the Payment Plan using '''OT_API_ProposePaymentPlan'''&lt;br /&gt;
&lt;br /&gt;
Then he sends it to the Customer, who calls '''OT_API_ConfirmPaymentPlan'''&lt;br /&gt;
&lt;br /&gt;
The Customer's wallet activates the payment plan by sending it to the server using this function: '''OT_API_depositPaymentPlan()'''&lt;br /&gt;
&lt;br /&gt;
(Receipts will process into the respective parties' inboxes.)&lt;br /&gt;
&lt;br /&gt;
Use OT_API_cancelCronItem() to cancel any payment plan (or market offer.)&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use '''OT_API_Message_GetBalanceAgreementSuccess()''' and '''OT_API_Message_GetTransactionSuccess()''' as described above in the _deposit cash_ instructions.&lt;br /&gt;
&lt;br /&gt;
'''Issue a [[Markets|Market]] Offer'''&lt;br /&gt;
&lt;br /&gt;
Call this function: '''OT_API_issueMarketOffer()'''&lt;br /&gt;
&lt;br /&gt;
(That's the low-level one. See create_offer.ot script for the high-level version.)&lt;br /&gt;
&lt;br /&gt;
Call '''OT_API_Message_GetSuccess''' to find out if the message was a SUCCESS or FAILURE.&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use '''OT_API_Message_GetBalanceAgreementSuccess()''' and '''OT_API_Message_GetTransactionSuccess()''' as described above in the _deposit cash_ instructions.&lt;br /&gt;
See the OTScript and Java versions of these calls.&lt;br /&gt;
&lt;br /&gt;
Once an offer goes onto the market, multiple trades may occur between it and the other offers on the market.&lt;br /&gt;
&lt;br /&gt;
(According to the rules in the offers.) Receipts will process into the respective parties' inboxes after each trade.&lt;br /&gt;
&lt;br /&gt;
'''Cancel a Market Offer'''&lt;br /&gt;
&lt;br /&gt;
Use '''OT_API_cancelNymMarketOffer''' to remove an offer from a market.&lt;br /&gt;
&lt;br /&gt;
If the message was successful, then use '''OT_API_Message_GetBalanceAgreementSuccess()''' and '''OT_API_Message_GetTransactionSuccess()'''&lt;br /&gt;
&lt;br /&gt;
'''Retrieving Market Data from OT Server:'''&lt;br /&gt;
&lt;br /&gt;
'''OT_API_getMarketList''' retrieves a list of all the markets available on a specific server, and details for each market. If the server call is a success, the data will be retrieved from the OT server, and written to local storage using the OT Storage API, at this path or key (inside your data_folder location): '''markets/SERVER_ID/market_data.bin'''&lt;br /&gt;
&lt;br /&gt;
If you want to verify whether the data is now available in local storage (after a successful call to getMarketList), your code would look like this: &lt;br /&gt;
&lt;br /&gt;
'''if (otapi.Exists(&amp;quot;markets&amp;quot;, serverID, &amp;quot;market_data.bin&amp;quot;)) bFoundFile = true;'''&lt;br /&gt;
&lt;br /&gt;
Here is some Java code that reads the market list object from local storage, assuming bFoundFile is true:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	MarketList marketList = null;&lt;br /&gt;
	Storable storable = null;&lt;br /&gt;
&lt;br /&gt;
	if (otapi.Exists(&amp;quot;markets&amp;quot;, serverID, &amp;quot;market_data.bin&amp;quot;)) &lt;br /&gt;
	{&lt;br /&gt;
		storable =&lt;br /&gt;
			otapi.QueryObject(StoredObjectType.STORED_OBJ_MARKET_LIST,&lt;br /&gt;
				&amp;quot;markets&amp;quot;, serverID, &amp;quot;market_data.bin&amp;quot;);&lt;br /&gt;
		if (storable==null)&lt;br /&gt;
			return null;&lt;br /&gt;
            marketList = MarketList.ot_dynamic_cast(storable);&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have the market list, here is some sample Java code to read the details of an individual market from that list:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static Object getMarketDetails(String marketID)&lt;br /&gt;
{&lt;br /&gt;
	MarketList marketList = Utility.getMarketList();&lt;br /&gt;
&lt;br /&gt;
	if (marketList == null) &lt;br /&gt;
	{&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for (int i=0; i &amp;lt; marketList.GetMarketDataCount(); i++)&lt;br /&gt;
	{&lt;br /&gt;
		MarketData marketData = marketList.GetMarketData(i);&lt;br /&gt;
&lt;br /&gt;
		if (marketData == null)&lt;br /&gt;
			continue;&lt;br /&gt;
&lt;br /&gt;
		String [] row = new String[2];&lt;br /&gt;
&lt;br /&gt;
		if (marketID.equals(marketData.getMarket_id())) &lt;br /&gt;
		{&lt;br /&gt;
			String[] data = new String[2];&lt;br /&gt;
			marketData.getLast_sale_price();&lt;br /&gt;
			marketData.getCurrent_ask();&lt;br /&gt;
			&lt;br /&gt;
			// Etc!! This is where you get the market details.&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// return custom object here (row/data or whatever), or null if failure..&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OT_API_getMarketOffers''' retrieves publicly-available info for all offers on a specific market, up until maximum depth, and saves the data here: '''markets/SERVER_ID/offers/MARKET_ID.bin'''&lt;br /&gt;
&lt;br /&gt;
(See testwallet/OTAPI.i for ALL DATA OBJECTS that are used in local storage, including market offers, recent trades, etc. See the code above for a sample on how those data objects are used.)&lt;br /&gt;
&lt;br /&gt;
'''OT_API_getMarketRecentTrades''': Retrieves all recent trades on a market (up until maximum depth), and stores them here: '''markets/SERVER_ID/recent/MARKET_ID.bin'''&lt;br /&gt;
&lt;br /&gt;
To retrieve the offers that a specific Nym has out on the market, use: '''OT_API_getNym_MarketOffers'''&lt;br /&gt;
&lt;br /&gt;
This _getNym_MarketOffers_ data is _private_ and thus a lot more detailed than what's retrieved via '''OT_API_Market_GetOffers''', which is more meant for public use. &lt;br /&gt;
&lt;br /&gt;
After a successful retrieval, you can load the data from this location: '''nyms/SERVER_ID/offers/NYM_ID.bin'''&lt;br /&gt;
&lt;br /&gt;
If you want to see the Nym's private list of his ''completed trades'', the path to load it from is here:&lt;br /&gt;
&lt;br /&gt;
'''nyms/trades/SERVER_ID/NYM_ID'''&lt;br /&gt;
&lt;br /&gt;
There is no need to send a server message in this last case--just read the data from local storage directly. (When market trading receipts are accepted and cleared out of your inbox, this is where they will go. So there's no need to download them, since they were already downloaded through your inbox previously.)&lt;br /&gt;
&lt;br /&gt;
As before, the appropriate data object can be found in testwallet/OTAPI.i along with all the others.&lt;br /&gt;
&lt;br /&gt;
----------------------&lt;br /&gt;
&lt;br /&gt;
I will be very responsive to developer needs and questions regarding the OT API, so I encourage you to play with the software and contact me anytime.&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
&lt;br /&gt;
[[Opentxs | opentxs command-line tool]]&lt;br /&gt;
&lt;br /&gt;
[[List of Classes | The OT C++ class library]]&lt;br /&gt;
&lt;br /&gt;
[[OTX | The OTX protocol]]&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Main_Page&amp;diff=3176</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Main_Page&amp;diff=3176"/>
		<updated>2015-07-08T22:15:43Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: /* Source Code */ added white paper&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Open-Transactions==&lt;br /&gt;
&lt;br /&gt;
'''[http://www.opentransactions.org/open-transactions.pdf Click here for white paper.]'''&lt;br /&gt;
&lt;br /&gt;
The Open-Transactions project is a collaborative effort to develop a robust, commercial-grade, fully-featured, '''free-software toolkit''' implementing the [[OTX|OTX protocol]] as well as a full-strength '''financial cryptography''' [[List_of_Classes|library]], API, GUI, command-line interface, and prototype notary server. The project is managed by a worldwide community of volunteers that use the Internet to communicate, plan, and develop the Open-Transactions toolkit and its related documentation.&lt;br /&gt;
&lt;br /&gt;
===Financial Cryptography===&lt;br /&gt;
&lt;br /&gt;
Financial cryptography means using using strong cryptographic techniques to create secure financial instruments, such as digital signing to create non-repudiable contracts, and encryption to create untraceable digital cash. In OT, transactions are unforgeable, receipts are destructible, and balances cannot be falsified or changed without user consent. OT is able to prove all balances, as well as which instruments are valid, and which transactions have closed, without storing any history except the last signed receipt.&lt;br /&gt;
&lt;br /&gt;
Open-Transactions implements financial instruments as Ricardian Contracts; contracts which can be understood both by humans and manipulated by software. &lt;br /&gt;
&lt;br /&gt;
All contracts in Open-Transactions use the same basic structure: all parties involved sign an agreement which is notarized by an independent third party witness. This technique is known as [[Triple-Signed Receipts]]. Importantly, transactions are formed and signed on the client side first, before being notarized by any server. An OT client is thus ensured that an OT notary server cannot falsify his receipts against his will, since the server can't forge the client's signature.&lt;br /&gt;
&lt;br /&gt;
This basic structure can be built upon to create many types of financial instruments.&lt;br /&gt;
&lt;br /&gt;
===Financial Instruments===&lt;br /&gt;
&lt;br /&gt;
Financial instruments are any representation of a financial agreement between two or more parties.&lt;br /&gt;
&lt;br /&gt;
The simplest financial instrument is a deposit agreement. A custodian of some asset (legal tender, or maybe gold) stores it on behalf of a depositor and agrees to redeem it on demand when presented with proof of a valid claim on the asset.&lt;br /&gt;
&lt;br /&gt;
Other types of financial instruments include securities, of which there can be many variations. A security is an instrument that entitles the bearer to a certain revenue stream, either because it represents a loan or perhaps because it represents equity in a business.&lt;br /&gt;
&lt;br /&gt;
Financial instruments in Open-Transactions have an issuer, who creates the contracts and is responsible for fulfilling the terms, and one or more bearers. Financial instruments are liabilities of the issuer owed to the bearers.&lt;br /&gt;
&lt;br /&gt;
===Working with Financial Instruments===&lt;br /&gt;
&lt;br /&gt;
Open-Transactions is designed to provide the highest security possible for both the issuers and bearers of financial instruments. Servers in Open-Transactions act as notaries which can witness and confirm balances, but cannot change them. Every party associated in a financial instrument can prove their balance to any other party, and no party can alter the balance of any other party without their agreement. Even a malicious notary cannot do this.&lt;br /&gt;
&lt;br /&gt;
Open-Transactions represents quantities of a given unit type as deposit agreements, which are signed by the bearer and a notary.&lt;br /&gt;
&lt;br /&gt;
Portions of a balance may be transferred between users via several asset-independent transaction types, including:&lt;br /&gt;
&lt;br /&gt;
; Transfers&lt;br /&gt;
: An atomic movement of funds from one account to a different account, like a bank account-to-account transfer.&lt;br /&gt;
; Cheques&lt;br /&gt;
: A payment which is not deducted from the sender's account until the recipient claims it.&lt;br /&gt;
; Vouchers&lt;br /&gt;
: A payment which is deducted from the senders account at the time of creation.&lt;br /&gt;
; Invoices&lt;br /&gt;
: A payment request which the recipient can opt to pay from any of his accounts.&lt;br /&gt;
; Cash&lt;br /&gt;
: Anonymous cryptographic tokens which can be securely redeemed by the recipient without revealing the sender.&lt;br /&gt;
; Market offers&lt;br /&gt;
: Open agreements to exchange a given quantity of one instrument type for a given quantity of another instrument type.&lt;br /&gt;
; Smart Contracts&lt;br /&gt;
: Customizable agreements between multiple parties, containing user-defined scripted clauses, hooks, and variables.&lt;br /&gt;
&lt;br /&gt;
==Use Cases==&lt;br /&gt;
&lt;br /&gt;
===Encouraged use cases===&lt;br /&gt;
&lt;br /&gt;
Encouraged uses cases are officially supported by Open-Transactions.&lt;br /&gt;
&lt;br /&gt;
====Deposit accounting====&lt;br /&gt;
&lt;br /&gt;
Entities that hold assets on behalf of depositors can use Open-Transactions to issue promissory notes as negotiable instruments.&lt;br /&gt;
&lt;br /&gt;
Examples of such depositories includes:&lt;br /&gt;
&lt;br /&gt;
* Precious metals&lt;br /&gt;
* Central bank currencies&lt;br /&gt;
* Cryptocurrencies&lt;br /&gt;
&lt;br /&gt;
====Payments====&lt;br /&gt;
&lt;br /&gt;
Users of OT negotiable instruments can authorize recurring payments to pay for services which operate on a billing cycle.&lt;br /&gt;
&lt;br /&gt;
====Bearer Securities====&lt;br /&gt;
&lt;br /&gt;
The negotiable instruments created by Open-Transactions can be used as the basis for financial products such as loans.&lt;br /&gt;
&lt;br /&gt;
===Discouraged use cases===&lt;br /&gt;
&lt;br /&gt;
Discouraged use cases are not supported by Open-Transactions, either because they violate the security requirements, or because they conflict with the philosophical goals of the project.&lt;br /&gt;
&lt;br /&gt;
In many cases, discouraged use cases may be achievable, but users are required to create and support their own smart contracts.&lt;br /&gt;
&lt;br /&gt;
====Third party balance editing====&lt;br /&gt;
&lt;br /&gt;
The only entity in Open-Transactions that can edit a balance is the holder of that balance receipt. Open-Transactions does not and will not include any functionality to bypass this design decision.&lt;br /&gt;
&lt;br /&gt;
==More Information==&lt;br /&gt;
&lt;br /&gt;
* [[About|About Open-Transactions]]&lt;br /&gt;
* [[Installation]]&lt;br /&gt;
* [[opentxs|Using the command-line tool]]&lt;br /&gt;
* [[API|Using the API]]&lt;br /&gt;
* [[otserver|Using the server]]&lt;br /&gt;
* [https://github.com/Open-Transactions/Moneychanger Moneychanger (Qt-based Desktop Client)]&lt;br /&gt;
&lt;br /&gt;
This product includes software developed by Ben Laurie for use in the [https://github.com/benlaurie/lucre Lucre] project.&lt;br /&gt;
&lt;br /&gt;
Credit for the OT logo goes to: [http://www.michpalmer.com/ moltenmich]&lt;br /&gt;
&lt;br /&gt;
=== Mailing list and IRC ===&lt;br /&gt;
&lt;br /&gt;
Mailing list: ot-dev@opentransactions.org&lt;br /&gt;
&lt;br /&gt;
[http://opentransactions.org/mailman/listinfo/ot-dev_opentransactions.org Subscribe to mailing list]&lt;br /&gt;
&lt;br /&gt;
IRC channel: '''#opentransactions''' on irc.freenode.net&lt;br /&gt;
&lt;br /&gt;
=== Sponsors and Contributors ===&lt;br /&gt;
&lt;br /&gt;
The OT community gratefully acknowledges the support and contributions of the following individuals and businesses to OT development: Chris Odom, Cameron Garnham, Randy Waterhouse, [[Monetas]].&lt;br /&gt;
&lt;br /&gt;
=== Install Programs ===&lt;br /&gt;
&lt;br /&gt;
[http://nightowl.cc/Moneychanger.dmg Mac OSX install for Moneychanger GUI] Self-contained.&lt;br /&gt;
&amp;lt;br /&amp;gt;Note: This Mac install of Moneychanger includes the notary server as well.&amp;lt;br /&amp;gt;It can be found at: /Applications/moneychanger-qt.app/Contents/MacOS/opentxs-notary&lt;br /&gt;
&lt;br /&gt;
[https://bitcointalk.org/index.php?topic=77301.msg859040#msg859040 (old) Windows binary installer ]&lt;br /&gt;
&lt;br /&gt;
=== White Paper ===&lt;br /&gt;
&lt;br /&gt;
[http://www.opentransactions.org/open-transactions.pdf Open-Transactions White Paper]&lt;br /&gt;
&lt;br /&gt;
=== Source Code ===&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/opentxs Open-Transactions source code on github] (core library, client API, and 'opentxs' command-line client)&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/opentxs-notary The Open-Transactions notary server on github] (Install OT core first)&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/Moneychanger Moneychanger GUI source code on github] (Install OT core first, and then build Moneychanger with the latest version of Qt Creator)&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
	<entry>
		<id>http://opentransactions.org/wiki/index.php?title=Main_Page&amp;diff=3175</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://opentransactions.org/wiki/index.php?title=Main_Page&amp;diff=3175"/>
		<updated>2015-07-08T22:12:56Z</updated>

		<summary type="html">&lt;p&gt;FellowTraveler: /* Open-Transactions */ added bold&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Open-Transactions==&lt;br /&gt;
&lt;br /&gt;
'''[http://www.opentransactions.org/open-transactions.pdf Click here for white paper.]'''&lt;br /&gt;
&lt;br /&gt;
The Open-Transactions project is a collaborative effort to develop a robust, commercial-grade, fully-featured, '''free-software toolkit''' implementing the [[OTX|OTX protocol]] as well as a full-strength '''financial cryptography''' [[List_of_Classes|library]], API, GUI, command-line interface, and prototype notary server. The project is managed by a worldwide community of volunteers that use the Internet to communicate, plan, and develop the Open-Transactions toolkit and its related documentation.&lt;br /&gt;
&lt;br /&gt;
===Financial Cryptography===&lt;br /&gt;
&lt;br /&gt;
Financial cryptography means using using strong cryptographic techniques to create secure financial instruments, such as digital signing to create non-repudiable contracts, and encryption to create untraceable digital cash. In OT, transactions are unforgeable, receipts are destructible, and balances cannot be falsified or changed without user consent. OT is able to prove all balances, as well as which instruments are valid, and which transactions have closed, without storing any history except the last signed receipt.&lt;br /&gt;
&lt;br /&gt;
Open-Transactions implements financial instruments as Ricardian Contracts; contracts which can be understood both by humans and manipulated by software. &lt;br /&gt;
&lt;br /&gt;
All contracts in Open-Transactions use the same basic structure: all parties involved sign an agreement which is notarized by an independent third party witness. This technique is known as [[Triple-Signed Receipts]]. Importantly, transactions are formed and signed on the client side first, before being notarized by any server. An OT client is thus ensured that an OT notary server cannot falsify his receipts against his will, since the server can't forge the client's signature.&lt;br /&gt;
&lt;br /&gt;
This basic structure can be built upon to create many types of financial instruments.&lt;br /&gt;
&lt;br /&gt;
===Financial Instruments===&lt;br /&gt;
&lt;br /&gt;
Financial instruments are any representation of a financial agreement between two or more parties.&lt;br /&gt;
&lt;br /&gt;
The simplest financial instrument is a deposit agreement. A custodian of some asset (legal tender, or maybe gold) stores it on behalf of a depositor and agrees to redeem it on demand when presented with proof of a valid claim on the asset.&lt;br /&gt;
&lt;br /&gt;
Other types of financial instruments include securities, of which there can be many variations. A security is an instrument that entitles the bearer to a certain revenue stream, either because it represents a loan or perhaps because it represents equity in a business.&lt;br /&gt;
&lt;br /&gt;
Financial instruments in Open-Transactions have an issuer, who creates the contracts and is responsible for fulfilling the terms, and one or more bearers. Financial instruments are liabilities of the issuer owed to the bearers.&lt;br /&gt;
&lt;br /&gt;
===Working with Financial Instruments===&lt;br /&gt;
&lt;br /&gt;
Open-Transactions is designed to provide the highest security possible for both the issuers and bearers of financial instruments. Servers in Open-Transactions act as notaries which can witness and confirm balances, but cannot change them. Every party associated in a financial instrument can prove their balance to any other party, and no party can alter the balance of any other party without their agreement. Even a malicious notary cannot do this.&lt;br /&gt;
&lt;br /&gt;
Open-Transactions represents quantities of a given unit type as deposit agreements, which are signed by the bearer and a notary.&lt;br /&gt;
&lt;br /&gt;
Portions of a balance may be transferred between users via several asset-independent transaction types, including:&lt;br /&gt;
&lt;br /&gt;
; Transfers&lt;br /&gt;
: An atomic movement of funds from one account to a different account, like a bank account-to-account transfer.&lt;br /&gt;
; Cheques&lt;br /&gt;
: A payment which is not deducted from the sender's account until the recipient claims it.&lt;br /&gt;
; Vouchers&lt;br /&gt;
: A payment which is deducted from the senders account at the time of creation.&lt;br /&gt;
; Invoices&lt;br /&gt;
: A payment request which the recipient can opt to pay from any of his accounts.&lt;br /&gt;
; Cash&lt;br /&gt;
: Anonymous cryptographic tokens which can be securely redeemed by the recipient without revealing the sender.&lt;br /&gt;
; Market offers&lt;br /&gt;
: Open agreements to exchange a given quantity of one instrument type for a given quantity of another instrument type.&lt;br /&gt;
; Smart Contracts&lt;br /&gt;
: Customizable agreements between multiple parties, containing user-defined scripted clauses, hooks, and variables.&lt;br /&gt;
&lt;br /&gt;
==Use Cases==&lt;br /&gt;
&lt;br /&gt;
===Encouraged use cases===&lt;br /&gt;
&lt;br /&gt;
Encouraged uses cases are officially supported by Open-Transactions.&lt;br /&gt;
&lt;br /&gt;
====Deposit accounting====&lt;br /&gt;
&lt;br /&gt;
Entities that hold assets on behalf of depositors can use Open-Transactions to issue promissory notes as negotiable instruments.&lt;br /&gt;
&lt;br /&gt;
Examples of such depositories includes:&lt;br /&gt;
&lt;br /&gt;
* Precious metals&lt;br /&gt;
* Central bank currencies&lt;br /&gt;
* Cryptocurrencies&lt;br /&gt;
&lt;br /&gt;
====Payments====&lt;br /&gt;
&lt;br /&gt;
Users of OT negotiable instruments can authorize recurring payments to pay for services which operate on a billing cycle.&lt;br /&gt;
&lt;br /&gt;
====Bearer Securities====&lt;br /&gt;
&lt;br /&gt;
The negotiable instruments created by Open-Transactions can be used as the basis for financial products such as loans.&lt;br /&gt;
&lt;br /&gt;
===Discouraged use cases===&lt;br /&gt;
&lt;br /&gt;
Discouraged use cases are not supported by Open-Transactions, either because they violate the security requirements, or because they conflict with the philosophical goals of the project.&lt;br /&gt;
&lt;br /&gt;
In many cases, discouraged use cases may be achievable, but users are required to create and support their own smart contracts.&lt;br /&gt;
&lt;br /&gt;
====Third party balance editing====&lt;br /&gt;
&lt;br /&gt;
The only entity in Open-Transactions that can edit a balance is the holder of that balance receipt. Open-Transactions does not and will not include any functionality to bypass this design decision.&lt;br /&gt;
&lt;br /&gt;
==More Information==&lt;br /&gt;
&lt;br /&gt;
* [[About|About Open-Transactions]]&lt;br /&gt;
* [[Installation]]&lt;br /&gt;
* [[opentxs|Using the command-line tool]]&lt;br /&gt;
* [[API|Using the API]]&lt;br /&gt;
* [[otserver|Using the server]]&lt;br /&gt;
* [https://github.com/Open-Transactions/Moneychanger Moneychanger (Qt-based Desktop Client)]&lt;br /&gt;
&lt;br /&gt;
This product includes software developed by Ben Laurie for use in the [https://github.com/benlaurie/lucre Lucre] project.&lt;br /&gt;
&lt;br /&gt;
Credit for the OT logo goes to: [http://www.michpalmer.com/ moltenmich]&lt;br /&gt;
&lt;br /&gt;
=== Mailing list and IRC ===&lt;br /&gt;
&lt;br /&gt;
Mailing list: ot-dev@opentransactions.org&lt;br /&gt;
&lt;br /&gt;
[http://opentransactions.org/mailman/listinfo/ot-dev_opentransactions.org Subscribe to mailing list]&lt;br /&gt;
&lt;br /&gt;
IRC channel: '''#opentransactions''' on irc.freenode.net&lt;br /&gt;
&lt;br /&gt;
=== Sponsors and Contributors ===&lt;br /&gt;
&lt;br /&gt;
The OT community gratefully acknowledges the support and contributions of the following individuals and businesses to OT development: Chris Odom, Cameron Garnham, Randy Waterhouse, [[Monetas]].&lt;br /&gt;
&lt;br /&gt;
=== Install Programs ===&lt;br /&gt;
&lt;br /&gt;
[http://nightowl.cc/Moneychanger.dmg Mac OSX install for Moneychanger GUI] Self-contained.&lt;br /&gt;
&amp;lt;br /&amp;gt;Note: This Mac install of Moneychanger includes the notary server as well.&amp;lt;br /&amp;gt;It can be found at: /Applications/moneychanger-qt.app/Contents/MacOS/opentxs-notary&lt;br /&gt;
&lt;br /&gt;
[https://bitcointalk.org/index.php?topic=77301.msg859040#msg859040 (old) Windows binary installer ]&lt;br /&gt;
&lt;br /&gt;
=== Source Code ===&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/opentxs Open-Transactions source code on github] (core library, client API, and 'opentxs' command-line client)&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/opentxs-notary The Open-Transactions notary server on github] (Install OT core first)&lt;br /&gt;
&lt;br /&gt;
[http://github.com/Open-Transactions/Moneychanger Moneychanger GUI source code on github] (Install OT core first, and then build Moneychanger with the latest version of Qt Creator)&lt;/div&gt;</summary>
		<author><name>FellowTraveler</name></author>
		
	</entry>
</feed>