From 14a1fc84d795da7d5d558b13ee0093cbd44255d1 Mon Sep 17 00:00:00 2001 From: mDuo13 Date: Tue, 18 Jan 2022 19:04:34 -0800 Subject: [PATCH] Build a Wallet tutorial: text for first few steps --- .../build-a-wallet/py/1_hello.py | 10 +- .../build-a-wallet/py/2_threaded.py | 19 +-- .../build-a-wallet/py/3_account.py | 11 +- .../build-a-wallet/py/4_tx_history.py | 11 +- .../build-a-wallet/py/5_send_xrp.py | 12 +- .../py/6_verification_and_polish.py | 12 +- .../build-a-wallet/py/requirements.txt | 6 +- .../build-a-desktop-wallet-in-python.md | 154 ++++++++++++++++++ dactyl-config.yml | 12 ++ img/python-wallet-1.png | Bin 0 -> 4179 bytes img/python-wallet-preview.png | Bin 0 -> 43037 bytes 11 files changed, 209 insertions(+), 38 deletions(-) create mode 100644 content/tutorials/build-apps/build-a-desktop-wallet-in-python.md create mode 100644 img/python-wallet-1.png create mode 100644 img/python-wallet-preview.png diff --git a/content/_code-samples/build-a-wallet/py/1_hello.py b/content/_code-samples/build-a-wallet/py/1_hello.py index bc176a9d53..b9e52f94d8 100644 --- a/content/_code-samples/build-a-wallet/py/1_hello.py +++ b/content/_code-samples/build-a-wallet/py/1_hello.py @@ -9,16 +9,13 @@ class TWaXLFrame(wx.Frame): user interface, main frame. """ def __init__(self, url): - super(TWaXLFrame, self).__init__(None, title="TWaXL") + wx.Frame.__init__(self, None, title="TWaXL", size=wx.Size(800,400)) self.client = xrpl.clients.JsonRpcClient(url) main_panel = wx.Panel(self) - main_sizer = wx.BoxSizer(wx.VERTICAL) - main_panel.SetSizer(main_sizer) - - st = wx.StaticText(main_panel, label=self.get_validated_ledger()) - main_sizer.Add(st, wx.SizerFlags().Border(wx.TOP|wx.LEFT, 25)) + self.ledger_info = wx.StaticText(main_panel, + label=self.get_validated_ledger()) def get_validated_ledger(self): try: @@ -38,7 +35,6 @@ class TWaXLFrame(wx.Frame): if __name__ == "__main__": JSON_RPC_URL = "https://s.altnet.rippletest.net:51234/" - app = wx.App() frame = TWaXLFrame(JSON_RPC_URL) frame.Show() diff --git a/content/_code-samples/build-a-wallet/py/2_threaded.py b/content/_code-samples/build-a-wallet/py/2_threaded.py index 526b3bfee0..f0b52eec18 100644 --- a/content/_code-samples/build-a-wallet/py/2_threaded.py +++ b/content/_code-samples/build-a-wallet/py/2_threaded.py @@ -1,10 +1,8 @@ # "Build a Wallet" tutorial, step 2: Watch ledger closes from a worker thread. import xrpl - -import asyncio -import re import wx +import asyncio from threading import Thread class XRPLMonitorThread(Thread): @@ -15,6 +13,8 @@ class XRPLMonitorThread(Thread): """ def __init__(self, url, gui, loop): Thread.__init__(self, daemon=True) + # Note: For thread safety, this thread should treat self.gui as + # read-only; to modify the GUI, use wx.CallAfter(...) self.gui = gui self.url = url self.loop = loop @@ -47,8 +47,7 @@ class XRPLMonitorThread(Thread): Set up initial subscriptions and populate the GUI with data from the ledger on startup. Requires that self.client be connected first. """ - # Set up 2 subscriptions: all new ledgers, and any new transactions that - # affect the chosen account. + # Set up a subscriptions for new ledgers response = await self.client.request(xrpl.models.requests.Subscribe( streams=["ledger"] )) @@ -63,11 +62,9 @@ class TWaXLFrame(wx.Frame): Tutorial Wallet for the XRP Ledger (TWaXL) user interface, main frame. """ - def __init__(self, url, test_network=True): + def __init__(self, url): wx.Frame.__init__(self, None, title="TWaXL", size=wx.Size(800,400)) - self.test_network = test_network - self.build_ui() # Start background thread for updates from the ledger ------------------ @@ -77,8 +74,10 @@ class TWaXLFrame(wx.Frame): self.run_bg_job(self.worker.watch_xrpl()) def build_ui(self): + """ + Called during __init__ to set up all the GUI components. + """ main_panel = wx.Panel(self) - self.ledger_info = wx.StaticText(main_panel, label="Not connected") main_sizer = wx.BoxSizer(wx.VERTICAL) @@ -107,6 +106,6 @@ class TWaXLFrame(wx.Frame): if __name__ == "__main__": WS_URL = "wss://s.altnet.rippletest.net:51233" # Testnet app = wx.App() - frame = TWaXLFrame(WS_URL, test_network=True) + frame = TWaXLFrame(WS_URL) frame.Show() app.MainLoop() diff --git a/content/_code-samples/build-a-wallet/py/3_account.py b/content/_code-samples/build-a-wallet/py/3_account.py index 4dc6269626..f1e7889983 100644 --- a/content/_code-samples/build-a-wallet/py/3_account.py +++ b/content/_code-samples/build-a-wallet/py/3_account.py @@ -1,10 +1,8 @@ # "Build a Wallet" tutorial, step 3: Take account input & show account info import xrpl - -import asyncio -import re import wx +import asyncio from threading import Thread from decimal import Decimal @@ -16,6 +14,8 @@ class XRPLMonitorThread(Thread): """ def __init__(self, url, gui, loop): Thread.__init__(self, daemon=True) + # Note: For thread safety, this thread should treat self.gui as + # read-only; to modify the GUI, use wx.CallAfter(...) self.gui = gui self.url = url self.loop = loop @@ -129,6 +129,9 @@ class TWaXLFrame(wx.Frame): self.run_bg_job(self.worker.watch_xrpl_account(address, wallet)) def build_ui(self): + """ + Called during __init__ to set up all the GUI components. + """ main_panel = wx.Panel(self) self.acct_info_area = wx.StaticBox(main_panel, label="Account Info") @@ -148,7 +151,6 @@ class TWaXLFrame(wx.Frame): (lbl_xrp_bal, self.st_xrp_balance), (lbl_reserve, self.st_reserve)) ) - # Ledger info text. One multi-line static text, unlike the account area. self.ledger_info = wx.StaticText(main_panel, label="Not connected") main_sizer = wx.BoxSizer(wx.VERTICAL) @@ -156,7 +158,6 @@ class TWaXLFrame(wx.Frame): main_sizer.Add(self.ledger_info, 1, flag=wx.EXPAND|wx.ALL, border=5) main_panel.SetSizer(main_sizer) - def run_bg_job(self, job): """ Schedules a job to run asynchronously in the XRPL worker thread. diff --git a/content/_code-samples/build-a-wallet/py/4_tx_history.py b/content/_code-samples/build-a-wallet/py/4_tx_history.py index 8455c803a8..bebeebc81f 100644 --- a/content/_code-samples/build-a-wallet/py/4_tx_history.py +++ b/content/_code-samples/build-a-wallet/py/4_tx_history.py @@ -1,12 +1,11 @@ # "Build a Wallet" tutorial, step 4: Show transaction history import xrpl - -import asyncio -import re import wx import wx.dataview import wx.adv +import asyncio +import re from threading import Thread from decimal import Decimal @@ -18,6 +17,8 @@ class XRPLMonitorThread(Thread): """ def __init__(self, url, gui, loop): Thread.__init__(self, daemon=True) + # Note: For thread safety, this thread should treat self.gui as + # read-only; to modify the GUI, use wx.CallAfter(...) self.gui = gui self.url = url self.loop = loop @@ -139,6 +140,9 @@ class TWaXLFrame(wx.Frame): self.run_bg_job(self.worker.watch_xrpl_account(address, wallet)) def build_ui(self): + """ + Called during __init__ to set up all the GUI components. + """ self.tabs = wx.Notebook(self, style=wx.BK_DEFAULT) # Tab 1: "Summary" pane ------------------------------------------------ main_panel = wx.Panel(self.tabs) @@ -161,7 +165,6 @@ class TWaXLFrame(wx.Frame): (lbl_xrp_bal, self.st_xrp_balance), (lbl_reserve, self.st_reserve)) ) - # Ledger info text. One multi-line static text, unlike the account area. self.ledger_info = wx.StaticText(main_panel, label="Not connected") main_sizer = wx.BoxSizer(wx.VERTICAL) diff --git a/content/_code-samples/build-a-wallet/py/5_send_xrp.py b/content/_code-samples/build-a-wallet/py/5_send_xrp.py index d0823df653..f0ac2548c4 100644 --- a/content/_code-samples/build-a-wallet/py/5_send_xrp.py +++ b/content/_code-samples/build-a-wallet/py/5_send_xrp.py @@ -2,12 +2,11 @@ # This step finally introduces events from the GUI to the worker thread. import xrpl - -import asyncio -import re import wx import wx.dataview import wx.adv +import asyncio +import re from threading import Thread from decimal import Decimal @@ -19,6 +18,8 @@ class XRPLMonitorThread(Thread): """ def __init__(self, url, gui, loop): Thread.__init__(self, daemon=True) + # Note: For thread safety, this thread should treat self.gui as + # read-only; to modify the GUI, use wx.CallAfter(...) self.gui = gui self.url = url self.loop = loop @@ -244,6 +245,9 @@ class TWaXLFrame(wx.Frame): self.run_bg_job(self.worker.watch_xrpl_account(address, wallet)) def build_ui(self): + """ + Called during __init__ to set up all the GUI components. + """ self.tabs = wx.Notebook(self, style=wx.BK_DEFAULT) # Tab 1: "Summary" pane ------------------------------------------------ main_panel = wx.Panel(self.tabs) @@ -273,8 +277,6 @@ class TWaXLFrame(wx.Frame): self.sxb.Disable() self.Bind(wx.EVT_BUTTON, self.click_send_xrp, source=self.sxb) - - # Ledger info text. One multi-line static text, unlike the account area. self.ledger_info = wx.StaticText(main_panel, label="Not connected") main_sizer = wx.BoxSizer(wx.VERTICAL) diff --git a/content/_code-samples/build-a-wallet/py/6_verification_and_polish.py b/content/_code-samples/build-a-wallet/py/6_verification_and_polish.py index 3e9a9d7262..3151445ece 100644 --- a/content/_code-samples/build-a-wallet/py/6_verification_and_polish.py +++ b/content/_code-samples/build-a-wallet/py/6_verification_and_polish.py @@ -2,12 +2,11 @@ # This step adds sanity checks to the Send XRP dialog, along with some other # small improvements. import xrpl - -import asyncio -import re import wx import wx.dataview import wx.adv +import asyncio +import re from threading import Thread from decimal import Decimal @@ -21,6 +20,8 @@ class XRPLMonitorThread(Thread): """ def __init__(self, url, gui, loop): Thread.__init__(self, daemon=True) + # Note: For thread safety, this thread should treat self.gui as + # read-only; to modify the GUI, use wx.CallAfter(...) self.gui = gui self.url = url self.loop = loop @@ -393,6 +394,9 @@ class TWaXLFrame(wx.Frame): self.run_bg_job(self.worker.watch_xrpl_account(address, wallet)) def build_ui(self): + """ + Called during __init__ to set up all the GUI components. + """ self.tabs = wx.Notebook(self, style=wx.BK_DEFAULT) # Tab 1: "Summary" pane ------------------------------------------------ main_panel = wx.Panel(self.tabs) @@ -422,8 +426,6 @@ class TWaXLFrame(wx.Frame): self.sxb.Disable() self.Bind(wx.EVT_BUTTON, self.click_send_xrp, source=self.sxb) - - # Ledger info text. One multi-line static text, unlike the account area. self.ledger_info = wx.StaticText(main_panel, label="Not connected") main_sizer = wx.BoxSizer(wx.VERTICAL) diff --git a/content/_code-samples/build-a-wallet/py/requirements.txt b/content/_code-samples/build-a-wallet/py/requirements.txt index 33dd9d6a9b..785d88ee1d 100644 --- a/content/_code-samples/build-a-wallet/py/requirements.txt +++ b/content/_code-samples/build-a-wallet/py/requirements.txt @@ -1,2 +1,4 @@ -xrpl-py==1.1.1 -wxPython=4.1.1 +xrpl-py==1.3.0 +wxPython==4.1.1 +toml==0.10.2 +requests==2.25.1 diff --git a/content/tutorials/build-apps/build-a-desktop-wallet-in-python.md b/content/tutorials/build-apps/build-a-desktop-wallet-in-python.md new file mode 100644 index 0000000000..5175066c9a --- /dev/null +++ b/content/tutorials/build-apps/build-a-desktop-wallet-in-python.md @@ -0,0 +1,154 @@ +--- +parent: build-apps.html +filters: + - include_code +targets: + - en + - ja # TODO: translate this page +blurb: Build a graphical desktop wallet for the XRPL using Python. +--- +# Build a Desktop Wallet in Python + +This tutorial demonstrates how to build a desktop wallet for the XRP Ledger using the Python programming language and various libraries. This application can be used as a starting point for building a more complete and powerful application, as a reference point for building comparable apps, or as a learning experience to better understand how to integrate XRP Ledger functionality into a larger project. + +## Prerequisites + +To complete this tutorial, you should meet the following guidelines: + +- You have Python 3.7 or higher installed. +- You are somewhat familiar with object-oriented programming in Python and have completed the [Get Started Using Python tutorial](get-started-using-python.html). +- You have some understanding of what the XRP Ledger can do and of cryptocurrency in general. You don't need to be an expert. + +## Source Code + +You can find the complete source code for all of this tutorial's examples in the [code samples section of this website's repository]({{target.github_forkurl}}//tree/{{target.github_branch}}/content/_code-samples/build-a-wallet/py/). + +## Goals + +At the end of this tutorial, you should have a Python application that looks something like this: + +![Desktop wallet screenshot](img/python-wallet-preview.png) + +The exact look and feel of the user interface depend on your computer's operating system. This application is capable of the following: + +- Shows updates to the XRP Ledger in real-time. +- Can view any XRP Ledger account's activity "read-only" including showing how much XRP was delivered by each transaction. +- Shows how much XRP is set aside for the account's [reserve requirement](reserves.html). +- Can send [direct XRP payments](direct-xrp-payments.html), and provides feedback about the intended destination address, including: + - Whether the intended destination already exists in the XRP Ledger, or the payment would have to fund its creation. + - If the address doesn't want to receive XRP (DisallowXRP flag enabled). + - If the address a [verified domain name](https://xrpl.org/xrp-ledger-toml.html#account-verification) associated with it. + +The application in this tutorial _doesn't_ have the ability to send or trade [tokens](issued-currencies.html) or use other [payment types](payment-types.html) like Escrow or Payment Channels. However, it provides a foundation that you can implement those and other features on top of. + +In addition to the above features, you'll also learn a little bit about graphical user interface (GUI) programming, threading, and asynchronous (async) code in Python. + +## Steps + +### Install Dependencies + +This tutorial depends on various programming libraries. Before you get started coding, you should install all of them as follows: + +```sh +pip3 install --upgrade xrpl-py wxPython requests toml +``` + +This installs and upgrades the following Python libraries: + +- [xrpl-py](https://xrpl-py.readthedocs.io/), a client library for the XRP Ledger. This tutorial requires **version 1.3.0 or higher**. +- [wxPython](https://wxpython.org/), a cross-platform graphical toolkit. +- [Requests](https://docs.python-requests.org/), a library for easily making HTTP requests. +- [toml](https://github.com/uiri/toml), a library for parsing TOML-formatted files. + +The `requests` and `toml` libraries are only needed for the [domain verification in step 6](TODO:link), but you can install them now while you're installing other dependencies. + +### 1. Hello World + +The first step is to build an app that combines the "hello world" equivalents for the XRP Ledger and wxPython programming. The code is as follows: + +{{ include_code("_code-samples/build-a-wallet/py/1_hello.py", language="py") }} + +When you run this script, it displays a single window that (hopefully) shows the latest validated ledger index on the XRP Ledger Testnet. It looks like this: + +![Screenshot: Step 1, hello world equivalent](img/python-wallet-1.png) + +Under the hood, the code makes a JSON-RPC client, connects to a public Testnet server, and uses the [ledger method][] to get this information. Meanwhile, it creates a [`wx.Frame`](https://docs.wxpython.org/wx.Frame.html) subclass as the base of the user interface. This class makes a window the user can see, with a [`wx.StaticText`](https://docs.wxpython.org/wx.StaticText.html) widget to display text to the user, and a [`wx.Panel`](https://docs.wxpython.org/wx.Panel.html) to hold that widget. + +### 2. Showing Updates + +**Full code for this step:** [`2_threaded.py`](TODO:link). + +You may have noticed that the app in step 1 only shows the latest validated ledger at the time you opened it: the app doesn't keep watching for updates. If you want to continually watch the ledger for updates (for example, waiting to see when new transactions have been confirmed), then you need to change the architecture of your app slightly. For reasons specific to Python, it's best to use two _threads_: a "GUI" thread to handle user input and display, and a "worker" thread for XRP Ledger network connectivity. The operating system can switch quickly between the two threads at any time, so user interface can remain responsive while the background thread waits on information from the network that may take a while to arrive. + +The main challenge with threads is that you have to be careful not to access data from one thread that another thread may be in the middle of changing. A straightforward way to do this is to design your program so that you each thread has variables it "owns" and doesn't write to the other thread's variables. In this program, the class attributes (anything starting with `self.`) are When the threads need to communicate, they use specific, "threadsafe" methods of communication, namely: + +- For GUI to worker thread, use [`asyncio.run_coroutine_threadsafe()`](https://docs.python.org/3/library/asyncio-task.html#asyncio.run_coroutine_threadsafe). +- For worker to GUI communications, use [`wx.CallAfter()`](https://docs.wxpython.org/wx.functions.html#wx.CallAfter). + +To make full use of the XRP Ledger's ability to push messages to the client, use [xrpl-py's `AsyncWebsocketClient`](https://xrpl-py.readthedocs.io/en/stable/source/xrpl.asyncio.clients.html#xrpl.asyncio.clients.AsyncWebsocketClient) instead of `JsonRpcClient`. This lets you "subscribe" to updates using asynchronous code, while also performing other request/response actions in response to various events such as user input. + +**Note:** While you can, technically, use the synchronous (that is, non-async) WebSocket client, it gets significantly more complicated to manage these things while also handling input from the GUI. Even if writing async code is unfamiliar to you, it can be worth it to reduce the overall complexity of the code you have to write later. + +Add these imports to the top of the file: + +{{ include_code("_code-samples/build-a-wallet/py/2_threaded.py", language="py", start_with="import async", end_before="class XRPLMonitorThread") }} + +Then, the code for the monitor thread is as follows (put this in the same file as the rest of the app): + +{{ include_code("_code-samples/build-a-wallet/py/2_threaded.py", language="py", start_with="class XRPLMonitorThread", end_before="class TWaXLFrame") }} + +This code defines a `Thread` subclass for the worker. When the thread is created, it starts an event loop, which means it's waiting for async tasks and functions to be created. The `watch_xrpl()` function is an example of a such a task (which the GUI thread starts when it's ready): connects to the XRP Ledger, then calls the [subscribe method][] to be notified whenever a new ledger is validated. It uses the immediate response _and_ all later subscription stream messages to trigger updates of the GUI. + +**Tip: Define worker jobs like this using `async def` instead of `def` so that you can use the `await` keyword in them; you need to use `await` to get the response to the [`AsyncWebsocketClient.request()` method](https://xrpl-py.readthedocs.io/en/stable/source/xrpl.asyncio.clients.html#xrpl.asyncio.clients.AsyncWebsocketClient.request). + +Update the code for the main thread and GUI frame to look like this: + +{{ include_code("_code-samples/build-a-wallet/py/2_threaded.py", language="py", start_with="class TWaXLFrame", end_before="if __name__") }} + +The part that builds the GUI has been moved to a separate method, `build_ui(self)`. This helps to divide the code into chunks that are easier to understand, because the `__init__()` constructor has other work to do now, too: it starts the worker thread, and gives it its first job. The GUI setup also now uses a [sizer](https://docs.wxpython.org/sizers_overview.html) to control placement of the text within the frame. + +**Tip:** In this tutorial, all the GUI code is written by hand, but you may find it easier to create powerful GUIs using a "builder" tool such as [wxGlade](http://wxglade.sourceforge.net/). Separating the GUI code from the constructor may make it easier to switch to this type of approach later. + +There's a new helper method, `run_bg_job()`, which runs an asynchronous function (defined with `async def`) in the worker thread. Use this method any time you want the worker thread to interact with the XRP Ledger network. + +Instead of a `get_validated_ledger()` method, the GUI class now has an `update_ledger()` method, which takes an object in the format of a [ledger stream message](subscribe.html#ledger-stream) and displays some of that information to the user. The worker thread calls this method using `wx.CallAfter()` whenever it gets a `ledgerClosed` event from the ledger. + +Finally, change the code to start the app (at the end of the file) slightly: + +{{ include_code("_code-samples/build-a-wallet/py/2_threaded.py", language="py", start_with="if __name__") }} + +Since the app uses a WebSocket client instead of the JSON-RPC client now, the code has to be use WebSocket URL to connect. + +**Tip:** If you [run your own `rippled` server](the-rippled-server.html#reasons-to-run-your-own-server) you can connect to it using `ws://localhost:6006` as the URL. You can also use the WebSocket URLs of [public servers](public-servers.html) to connect to the Mainnet or other test networks. + + +### 3. Viewing an Account + +**Full code for this step:** [`3_account.py`](TODO:link) + +A "wallet" application is one that lets you manage your account. Now that we have a working, ongoing connection to the XRP Ledger, it's time to start adding details for a specific account. For this step, you should prompt the user to input their address or master seed, then use that to display information about their account including how much XRP is set aside for the [reserve requirement](reserves.html). + +When you do math on XRP amounts, you should import the `Decimal` class so that you don't get rounding errors. Add this to the top of the file: + +{{ include_code("_code-samples/build-a-wallet/py/3_account.py", language="py", start_with="from decimal", end_before="class XRPLMonitorThread") }} + +Update the `watch_xrpl()` and `on_connected()` methods as follows: + +{{ include_code("_code-samples/build-a-wallet/py/3_account.py", language="py", start_with="async def watch_xrpl", end_before="class AutoGridBagSizer") }} + +The `watch_xrpl()` method has been renamed to `watch_xrpl_account()` because now it takes an address and optional wallet and saves them for later. (The GUI thread provides these based on user input.) This method also adds a new case for [transaction stream messages](subscribe.html#transaction-streams), because the `on_connected()` method now also subscribes to transactions for the provided account. When it sees a new transaction, the worker does not yet do anything with the transaction itself, but it uses that as a trigger to get the account's latest XRP balance and other info using the [account_info method][]. The `on_connected()` method now also calls [account_info][account_info method] on startup. In both cases, the worker passes the `account_data` object from the response back to the GUI using `wx.CallAfter()`. + +The new GUI has a lot more fields that need to be laid out in two dimensions. The following subclass of [`wx.GridBagSizer`](https://docs.wxpython.org/wx.GridBagSizer.html) provides a quick way to do so, setting the appropriate padding and sizing values for a two-dimensional list of widgets. Add this code to the same file: + +{{ include_code("_code-samples/build-a-wallet/py/3_account.py", language="py", start_with="class AutoGridBagSizer", end_before="class TWaXLFrame") }} + + + + +***TODO*** + + + +{% include '_snippets/rippled-api-links.md' %} +{% include '_snippets/tx-type-links.md' %} +{% include '_snippets/rippled_versions.md' %} diff --git a/dactyl-config.yml b/dactyl-config.yml index 0ce32208ee..03f7026fc9 100644 --- a/dactyl-config.yml +++ b/dactyl-config.yml @@ -11,6 +11,7 @@ default_pdf_template: pdf-doc.html.jinja # MD files should be here (and in subdirs) content_path: content +default_html_names: tail # Custom filters live here and start with filter_ filter_paths: @@ -1102,6 +1103,17 @@ pages: - en - ja + - name: Build Apps + html: build-apps.html + parent: tutorials.html + template: pagetype-category.html.jinja + blurb: Develop applications and services that use the XRP Ledger. + targets: + - en + - ja + + - md: tutorials/build-apps/build-a-desktop-wallet-in-python.md + # TODO: translate this page name and blurb - name: Production Readiness html: production-readiness.html diff --git a/img/python-wallet-1.png b/img/python-wallet-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b53a07f9dcea7b7357e09dd8aca15b71bf6cc157 GIT binary patch literal 4179 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 LN0$A5=iz?<;g_{l literal 0 HcmV?d00001 diff --git a/img/python-wallet-preview.png b/img/python-wallet-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..0d203f075e49c6c3aa8eab89c9e3b99135c61d5c GIT binary patch literal 43037 zcma&N2RPUL8#er-kVqnAlbKma2qD=cdsDLa-a;rPD`fAiY_eCf_s-sXhh+0yzq|YY zf1dYw-se5u`#$dD=;rtPem~>7&g(qS>+1b;Iq@6UNvx3O!RJ_5AVG9n%mMms$j0LX0N#K@gu#kCfGsP9^Nu1?zhFxDpv3GN1 z>($AT<+D7GF0y*vBx>5rgB;I`YUlFK#Dr}*8iIMHY3_r%=9NcQ@mE_C%L(e3FFEQ* zR;u@>&VF@182QsFU#GT8jlTcrOJU=+NAW8w*8}M?T=bWWKQfQo=V=59u!U(9+eb_UY-A z^%dN^%RMagcZh${spHTck-SQ$W#QiARCncynx{phUa8P9lri#O{FYVeDu1K5_Cf22 zp=N-n0kf*4Y`Jj0Vn=p`vQpYxv9fr(9=ef9yWTW)NxCRSGX?fwvxmdl(s`xBy5c3D zHLcQze`;Dc9*hR*cGvzM*V^&KrYHZ%?{aA3i^VAyXS%FmlwkRXmvE_Mpd%-@YJAV)JfkJ3$v$a!=ziS zHoI)*p5LZgbW1++crxf3YVb65^lUB+xx^S4sZ!E>FHR+0ak)EC7A3cxWLS?oT~u|IehBPA+MLqZaLFgZt}n5a;N{| zsZ&qWFLi*f#oRJ>BKRdsuJ|Xn7Q1c33%|L-XQYFB)Ge(e8$0@OrVL-xD9z0$PqZ0| zGuf&iQ#=V|9_k~r=Xky#Qls1|U>xOPzcr=DG)h1BAS)uyTpD$&NpOsrW|?5GXk)-6 zr_5vUqwfhd>TlG;J4#zxEu6YJkHyuKw?m!NYK_*qTc%x)3$<1Rwi6R?4_1iZV_Eww z__%1xr=Na?`CU@0)PY~|jp#jvM*mf&_^XY#=A7apAEqfVKAe| z;uDOTyRafp>a_7H5AHRrsMl&;;h3Dsd)mopej1}KI-$wr?iA5y#n9E~^CfoEW~R=S zh1okqZ7{>C>)A+B!|lh;d`1&h1s!Fat1sKG--vmPRqef}qa{uDQZC=x=-x0PKL_az zqfdhlG=U$^QB$_6IH~xSS89z9})p>rd7DF?6Go>nT=p*RcTw}%Z@UEBX zj%ghq*P4&SbJEsK{lLS0Ey=fK*+d5D2Eq@$t}!^0mN(ig0qN=vG%j7*^Z$tP+1Kv79k9CH(G3Zr>CX&sZ!ExF`WL)>UQ^0AahB(Blp{KjVa z-|s{OJjt_5XjC3f)Lt?3k)i6rseNm&-vL_DKnt$IC+DuB~ z_O{D4reiTj$*)h&YN-O*js-d;qcq6!(Mo@m&8nE;2&d?{^4y*dde!^0@YXf55BWLK z5oPua$NYtpu8dhzYjrwzT0|}HumrPpHf1G=2_%dYs=RDsP-@XpY-7Qxa6udH3eKN% zeob+C`iu0BI8~PR`T55b&+`e}mqz~nKTpzj&&)*+&j*r1)?Vu_Cgt^?*R*++w)j+S z8eUN;x>lHf9j~{2qG!G9K5p_4o~yzUX8icgr(9^{J5Q^rQ}1hvRBDNk>0Y(`{p<=g ziy4k3D#2InDwNHqS}EBwHeY eces-%~Y<9i+L0ev}aUA{$Dd(6->eIMo&};eJyk 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 literal 0 HcmV?d00001