From 040fe1c2a43bd43f3ae29294b0a6a9daafd6563a Mon Sep 17 00:00:00 2001 From: Jan Marcano Date: Fri, 3 Jun 2022 17:36:34 -0300 Subject: [PATCH 01/10] Update documentation --- README.md | 34 +-- docs/connection-issues.md | 36 +++ docs/connection_images/connect.png | Bin 0 -> 3771 bytes docs/connection_images/disconnect.png | Bin 0 -> 12769 bytes docs/connection_images/logout.png | Bin 0 -> 25816 bytes docs/connection_images/open-config.png | Bin 0 -> 31981 bytes docs/connection_images/reload.png | Bin 0 -> 4420 bytes docs/dApp-guide.md | 10 +- docs/dApp-integration.md | 2 - docs/extension-developers.md | 19 +- docs/legacy-dApp-integration.md | 293 ------------------------- docs/legacy-signing.md | 26 --- 12 files changed, 58 insertions(+), 362 deletions(-) create mode 100644 docs/connection-issues.md create mode 100644 docs/connection_images/connect.png create mode 100644 docs/connection_images/disconnect.png create mode 100644 docs/connection_images/logout.png create mode 100644 docs/connection_images/open-config.png create mode 100644 docs/connection_images/reload.png delete mode 100644 docs/legacy-dApp-integration.md delete mode 100644 docs/legacy-signing.md diff --git a/README.md b/README.md index d3771ba0..c11f663e 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,9 @@ _This is the preferred solution for end-users, updates will be automatically ins Developers working with dApps may also install directly from the release package, or by downloading the project and building it. -# `AlgoSigner.sign()` and `AlgoSigner.signMultisig()` have been officially deprecated. +## `AlgoSigner.sign()` and `AlgoSigner.signMultisig()` have been officially deprecated. + +An interactive transition guide is available [here](https://purestake.github.io/algosigner-dapp-example/v1v2TransitionGuide.html). ## 1.9.0 Release @@ -19,39 +21,23 @@ This update adds supports for easier transfers with the new autocomplete feature - Autocomplete support for UI-made transfers - `AlgoSigner.sign()` and `AlgoSigner.signMultisig()` have been deprecated - ## New Users - Watch [Getting Started with AlgoSigner](https://youtu.be/tG-xzG8r770) -- [Ledger Readme](docs/ledger.md) - -## Adding Custom Networks - -AlgoSigner users may add their own networks to the extension, for example BetaNet or the sandbox private network - [Instructions](docs/add-network.md) +- [Using a Ledger device](docs/ledger.md) +- [Adding Custom Networks](docs/add-network.md) (such as BetaNet or a private network) +- [Troubleshooting Connection issues](docs/connection-issues.md) ## dApp Developers For teams looking to integrate AlgoSigner into a project: -Developing with v2 Transaction Signing - -- [dApp development guide](docs/dApp-guide.md) -- [v2 AlgoSigner methods](docs/dApp-integration.md) - -Legacy v1 Transaction Signing is going to be deprecated soon and is available only for reference purposes. -Please use v2 when developing new apps and migrate existing apps that are still using v1 to v2 as soon as possible. - -- [v1 Guide](docs/legacy-signing.md) -- [v1 AlgoSigner methods](docs/legacy-dApp-integration.md) - -## Roadmap - -- UI improvements -- Contribution guidelines +- [dApp Development guide](docs/dApp-guide.md) +- [AlgoSigner dApp Integration Guide](docs/dApp-integration.md) -### AlgoSigner development +## AlgoSigner development -For developers interested in working with AlgoSigner [Extension Guide](docs/extension-developers.md). A contribution guide is in development. +For developers interested in working with AlgoSigner, an [Extension Guide](docs/extension-developers.md) is available. A contribution guide is in development. ## License diff --git a/docs/connection-issues.md b/docs/connection-issues.md new file mode 100644 index 00000000..29d50318 --- /dev/null +++ b/docs/connection-issues.md @@ -0,0 +1,36 @@ +# AlgoSigner Connection Issues + +If you're having issues accessing a dApp using AlgoSigner, you can try the following steps in order to delete any old existing connection that you may have lingering on the browser/website. + +## Connection Troubleshooting + +Find and press any disconnect button present on the dApp. + + +
+
+ +Open the config menu and log out of AlgoSigner. + + + +
+
+ +Reload the tab/window where the dApp is open and attempt to connect again. + + + + +
+
+
+ +## Additional steps + +If the issue persists, try deleting your local browser cache and cookies before attempting to connect to the dApp again. + +[Steps for Chrome](https://support.google.com/accounts/answer/32050) + +[Steps for Brave](https://support.brave.com/hc/en-us/articles/360048833872-How-Do-I-Clear-Cookies-And-Site-Data-In-Brave-) + diff --git a/docs/connection_images/connect.png b/docs/connection_images/connect.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c8e99503441a0c69c4270822dde162bab0d7dc GIT binary patch literal 3771 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

^1!HA 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 Rz>fj&R1`H7%H>Rg{sr{90$Kn7 literal 0 HcmV?d00001 diff --git a/docs/connection_images/open-config.png b/docs/connection_images/open-config.png new file mode 100644 index 0000000000000000000000000000000000000000..dff0b1a7158f7a3eff3e1df6b16248e5815d47ba GIT binary patch literal 31981 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%0DV~2%8ulth>o#oL}4AR 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 UN8{8wbk|^zn4D;Zuzuiw0a3xQ7ytkO literal 0 HcmV?d00001 diff --git a/docs/connection_images/reload.png b/docs/connection_images/reload.png new file mode 100644 index 0000000000000000000000000000000000000000..5786d7a163d8b917b1987e553f04dad8c64b49c1 GIT binary patch literal 4420 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 KMNUMnLSTXr4{h=Q literal 0 HcmV?d00001 diff --git a/docs/dApp-guide.md b/docs/dApp-guide.md index d86b80bd..5d598544 100644 --- a/docs/dApp-guide.md +++ b/docs/dApp-guide.md @@ -10,13 +10,9 @@ DApp users can trust AlgoSigner to: - Authorize transactions without giving dApps direct access to their keys - Sign and approve transactions when using dApps -## v2 Signing +## Signing transactions with AlgoSigner -With the release of v2 signing, developers coding to the standard will be able to use the same code with any Algorand Wallet. +You can start by looking at examples of how to sign transactions with AlgoSigner in the [example dapp](https://purestake.github.io/algosigner-dapp-example/index.html). -- Examples of signing with v2 are available in the [dapp examples repo](https://purestake.github.io/algosigner-dapp-example/index.html). -- An interactive transition guide that demonstrates the differences between v1 and v2 signing is available as a link from the dapp examples repo or directly access the [transition guide](https://purestake.github.io/algosigner-dapp-example/v1v2TransitionGuide.html). +Also available to read is our [dApp integration guide](dApp-integration.md). -### Developing a dApp - -- Read [v2 dApp Integration Guide](dApp-integration.md) diff --git a/docs/dApp-integration.md b/docs/dApp-integration.md index 4f73adee..79d53fc1 100644 --- a/docs/dApp-integration.md +++ b/docs/dApp-integration.md @@ -4,8 +4,6 @@ AlgoSigner injects a JavaScript library into every web page the browser user visits, which allows the site to interact with the extension. The dApp can use the injected library to connect to the user's Wallet, discover account addresses it holds, query the Network (make calls to AlgoD v2 or the Indexer) and request AlgoSigner to request for the user to sign a transaction initiated by the application. **All methods of the injected library return a Promise that needs to be handled by the dApp.** -This guide covers the new v2 Transactions Signing method, docs for the legacy v1 signing are [here](legacy-dApp-integration.md) - ## Methods - [AlgoSigner.connect()](#algosignerconnect) diff --git a/docs/extension-developers.md b/docs/extension-developers.md index 8681e5b1..1f4e88ac 100644 --- a/docs/extension-developers.md +++ b/docs/extension-developers.md @@ -10,21 +10,20 @@ There are multiple packages in the project that combine to build the overall ext *https://github.com/PureStake* -- algosigner-> // Base project folder - - dist-> // Folder containing the combined distribution components, used to install the extension, created on build - - packages-> // Folder for scripts components that support the extension - - common-> // Contains core elements used in other packages - - crypto-> // Wrapper for encrypting and decrypting account information - - dapp-> // AlgoSigner library that gets injected in dApps - - extension-> // Extension definition and core files +- algosigner -> // Base project folder + - dist -> // Folder containing the combined distribution components, used to install the extension, created on build + - packages -> // Folder for scripts components that support the extension + - common -> // Contains core elements used in other packages + - crypto -> // Wrapper for encrypting and decrypting account information + - dapp -> // AlgoSigner library that gets injected in dApps + - extension -> // Extension definition and core files - storage -> // Handles saving and loading of account information - test-project -> // Test wrapper for the package files - - ui-> // Front end application for interaction within the extension interface + - ui -> // Front end application for interaction within the extension interface - manifest.json // Extension definition file - - package.json // Algosigner package, required packages, and scripts to build the project + - package.json // AlgoSigner package, required packages, and scripts to build the project - readme.md // Project overview - docs -> // Guides and how-to's - - dApp-integration.md // Guide to integrating dApps with AlgoSigner - media -> // Supporting images for this repository - LICENSE.txt // License for this repository diff --git a/docs/legacy-dApp-integration.md b/docs/legacy-dApp-integration.md deleted file mode 100644 index 52b9f822..00000000 --- a/docs/legacy-dApp-integration.md +++ /dev/null @@ -1,293 +0,0 @@ -# ![AlgoSigner](/media/algosigner-wallet-banner-3.png) - -# Integrating AlgoSigner to add Transaction Capabilities for dApps on Algorand - -AlgoSigner injects a JavaScript library into every web page the browser user visits, which allows the site to interact with the extension. The dApp can use the injected library to connect to the user's Wallet, discover account addresses it holds, query the Network (make calls to AlgoD v2 or the Indexer) and request AlgoSigner to inquire the user to sign a transaction initiated by the application. **All methods of the injected library return a Promise that needs to be handled by the dApp.** - -A sample dApp was created to showcase the methods described here, you can find it at: - -- [Website](https://purestake.github.io/algosigner-dapp-example/) | [GitHub ](https://github.com/PureStake/algosigner-dapp-example) - -Sent in transactions will be validated against the Algorand JS SDK transaction types - field names must match, and the whole transaction will be rejected otherwise. - -Proxied requests are passed through to an API service - currently set to the PureStake API service. Endpoints available are limited to what the service exposes. The API backend may be configured by advanced users and is not guaranteed to respond as expected. - -This page documents the legacy AlgoSigner.sign() method, will be deprecated in a future release in favor of AlgoSigner.signTxn() covered [here](dApp-integration.md). - -_The v1 Atomic transaction functionality will start warning extension users in the next major release and be deprecated entirely in two releases._ - -## [Existing Methods](#existing-methods) - -- [AlgoSigner.connect()](#algosignerconnect) -- [AlgoSigner.accounts({ ledger: ‘MainNet|TestNet’ })](#algosigneraccounts-ledger-mainnettestnet-) -- [AlgoSigner.algod({ ledger: ‘MainNet|TestNet’, path: ‘algod v2 path’, ... })](#algosigneralgod-ledger-mainnettestnet-path-algod-v2-path--) -- [AlgoSigner.indexer({ ledger: ‘MainNet|TestNet’, path: ‘indexer v2 path’ })](#algosignerindexer-ledger-mainnettestnet-path-indexer-v2-path-) -- [AlgoSigner.sign(txnObject)](#algosignersigntxnobject) - - [Transaction Requirements](#transaction-requirements) - - [Atomic Transactions](#atomic-transactions) -- [AlgoSigner.signMultisig(txn)](#algosignersignmultisigtxn) -- [Custom Networks](#custom-networks) -- [AlgoSigner.send({ ledger: ‘MainNet|TestNet’, txBlob })](#algosignersend-ledger-mainnettestnet-txblob-) -- [Rejection Messages](#rejection-messages) - -### AlgoSigner.connect() - -Requests access to the Wallet for the dApp, may be rejected or approved. Every access to the extension begins with a connect request, which if approved by the user, allows the dApp to follow-up with other requests. - - - -### AlgoSigner.accounts({ ledger: ‘MainNet|TestNet’ }) - -Returns an array of accounts present in the Wallet for the given Network. - -**Request** - -```js -AlgoSigner.accounts({ ledger: 'TestNet' }); -``` - -**Response** - -```json -[ - { - "address": "U2VHSZL3LNGATL3IBCXFCPBTYSXYZBW2J4OGMPLTA4NA2CB4PR7AW7C77E" - }, - { - "address": "MTHFSNXBMBD4U46Z2HAYAOLGD2EV6GQBPXVTL727RR3G44AJ3WVFMZGSBE" - } -] -``` - -### AlgoSigner.algod({ ledger: ‘MainNet|TestNet’, path: ‘algod v2 path’, ... }) - -Proxies the requested path to the Algod v2 API. Is limited to endpoints made available by the API server. By default, all calls to the AlgoSigner.algod method are GET. - -**Request (GET)** - -```js -AlgoSigner.algod({ - ledger: 'TestNet', - path: '/v2/transactions/params', -}); -``` - -**Response** - -```json -{ - "consensus-version": "https://github.com/algorandfoundation/specs/tree/e5f565421d720c6f75cdd186f7098495caf9101f", - "fee": 1, - "genesis-hash": "SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=", - "genesis-id": "testnet-v1.0", - "last-round": 8271323, - "min-fee": 1000 -} -``` - -To make a POST requests, more details need to be included in as input. More information can be found [here](https://developer.algorand.org/docs/reference/rest-apis/algod/v2/). - -**Request (POST)** - -```js -AlgoSigner.algod({ - ledger: 'TestNet', - path: '/v2/teal/compile', - body: 'int 0', - method: 'POST', - contentType: 'text/plain', -}); -``` - -**Response** - -```json -{ - "hash": "KI4DJG2OOFJGUERJGSWCYGFZWDNEU2KWTU56VRJHITP62PLJ5VYMBFDBFE", - "result": "ASABACI=" -} -``` - -### AlgoSigner.indexer({ ledger: ‘MainNet|TestNet’, path: ‘indexer v2 path’ }) - -Proxies the requested path to the Indexer v2 API. Is limited to endpoints made available by the API server. The API backend may be configured by advanced users and is not guaranteed to respond as expected. More information can be found [here](https://developer.algorand.org/docs/reference/rest-apis/algod/v2/). - -**Request** - -```js -AlgoSigner.indexer({ - ledger: 'TestNet', - path: '/v2/assets/150821', -}); -``` - -**Response** - -```json -{ - "asset": { - "index": 150821, - "params": { - "clawback": "Q2SLSQTBMVJYVT2AANUAXY4A5G7A3Y6L2M6L3WIXKNYBTMMQFGUOQGKSRQ", - "creator": "Q2SLSQTBMVJYVT2AANUAXY4A5G7A3Y6L2M6L3WIXKNYBTMMQFGUOQGKSRQ", - "decimals": 15, - "default-frozen": false, - "freeze": "Q2SLSQTBMVJYVT2AANUAXY4A5G7A3Y6L2M6L3WIXKNYBTMMQFGUOQGKSRQ", - "manager": "Q2SLSQTBMVJYVT2AANUAXY4A5G7A3Y6L2M6L3WIXKNYBTMMQFGUOQGKSRQ", - "name": "decimal Test", - "reserve": "Q2SLSQTBMVJYVT2AANUAXY4A5G7A3Y6L2M6L3WIXKNYBTMMQFGUOQGKSRQ", - "total": 1000, - "unit-name": "dectest" - } - }, - "current-round": 8271410 -} -``` - -### AlgoSigner.sign(txnObject) - -Send a transaction object, conforming to the Algorand JS SDK, to AlgoSigner for approval. The Network is determined from the 'genesis-id' property. If approved, the response is a signed transaction object, with the binary blob field base64 encoded to prevent transmission issues. - -#### Transaction Requirements - -- Must have a valid type ('pay', 'keyreg', 'acfg', 'axfer', 'afrz', 'appl') -- Must not have additional unknown fields -- Must not have any value in the 'rekey' field -- When provided, address 'to' must be a valid address -- Numeric fields must have values that are considered safe and non-negative -- Fees above 1000 Micro Algos and any usage of 'close' fields ('CloseRemainderTo') will have internal warnings created for display purposes -- Note field must be a string (you may encrypt it) - not an Uint8, to prevent transmission errors -- Application transactions must have the appApprovalProgram, appClearProgram, and elements of the appArgs array be 64bit encoded strings, which will decode and cast back to uint8 - -These restrictions can be seen in [this link](https://github.com/PureStake/algosigner/blob/master/packages/extension/src/background/utils/validator.ts). - -In the following example, _txParams_ is set by a previous call to _AlgoSigner.algod()_. - -**Request** - -```js -let txn = { - from: accounts[0].address, - to: 'PBZHOKKNBUCCDJB7KB2KLHUMWCGAMBXZKGBFGGBHYNNXFIBOYI7ONYBWK4', - fee: txParams['fee'], - type: 'pay', - amount: amount, - firstRound: txParams['last-round'], - lastRound: txParams['last-round'] + 1000, - genesisID: txParams['genesis-id'], - genesisHash: txParams['genesis-hash'], - note: 'NOTE is a string', -}; - -AlgoSigner.sign(txn); -``` - -Different transaction objects can be created for other purposes, for example: send Algos, create an Algorand Standard Asset (ASA) and opt-in an asset. You can see snippets for each of these cases in the [exampe dApp website](https://purestake.github.io/algosigner-dapp-example/). - -**Response** - -```json -{ - "txID": "4F6GE5EBTBJ7DOTWKA3GK4JYARFDCVR5CYEXP6O27FUCE5SGFDYQ", - "blob": "gqNzaWfEQL6mW/7ss2HKAqsuHN/7ePx11wKSAvFocw5QEDvzSvrvJdzWYvT7ua8Lc0SS0zOmUDDaHQC/pGJ0PNqnu7W3qQKjdHhuiaNhbXQGo2ZlZc4AA7U4omZ2zgB+OrujZ2VurHRlc3RuZXQtdjEuMKJnaMQgSGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiKibHbOAH4+o6NyY3bEIHhydylNDQQhpD9QdKWejLCMBgb5UYJTGCfDW3KgLsI+o3NuZMQgZM5ZNuFgR8pz2dHBgDlmHolfGgF96zX/X4x2bnAJ3aqkdHlwZaNwYXk=" -} -``` - -Due to limitations in Chrome internal messaging, AlgoSigner encodes the transaction blob in base64 strings. If interrogation of the blob is needed, we have provided helper functions in the AlgoSigner repository: - -- [Python](https://github.com/PureStake/algosigner-dapp-example/blob/master/python/pythonTransaction.py) -- [NodeJS](https://github.com/PureStake/algosigner-dapp-example/blob/master/nodeJs/nodeJsTransaction.js) - -#### Atomic Transactions - -- Grouped transactions intended for atomic transaction functionality are no longer accepted using these methods. - -### AlgoSigner.signMultisig(txn) - -- Multisig transactions can be signed individually through AlgoSigner. - - Using the associated msig for the transaction an available matching unsigned address will be selected if possible to sign the txn component. - - The resulting sign will return the a msig with only this signature in the blob and will need to be merged with other signatures before sending to the network. -- An example of this can be seen in the [existing sample dApp multisig test](https://purestake.github.io/algosigner-dapp-example/tx-test/signTesting.html). - -### Custom Networks - -- Custom networks beta support is now in AlgoSigner. -- AlgoSigner.accounts(ledger) has changed such that calls now accept names that have been added to the user's custom network list as valid ledger names. - - A non-matching ledger name will result in a error: - - [RequestError.UnsupportedLedger] The provided ledger is not supported. - - An empty request will result with an error: - - Ledger not provided. Please use a base ledger: [TestNet,MainNet] or an available custom one [{"name":"Theta","genesisId":"testnet-v1.0"}]. -- Transaction requests will require a valid matching "genesisId", even for custom networks. - -**Request** - -```js -let msig = { - subsig: [ - { - pk: ms.account1.addr, - }, - { - pk: ms.account2.addr, - }, - { - pk: ms.account3.addr, - }, - ], - thr: 2, - v: 1, -}; - -let mstx = { - msig: msig, - txn: { - type: 'pay', - from: ms.multisigAddr, - to: '7GBK5IJCWFPRWENNUEZI3K4CSE5KDIRSR55KWTSDDOBH3E3JJCKGCSFDGQ', - amount: amount, - fee: txParams['fee'], - firstRound: txParams['last-round'], - lastRound: txParams['last-round'] + 1000, - genesisID: txParams['genesis-id'], - genesisHash: txParams['genesis-hash'], - }, -}; -``` - -The merge is complex, review: - -- [Multi-sig example](https://github.com/PureStake/algosigner-dapp-example/blob/master/tx-test/types/multisig.js) -- [Signing function](https://github.com/PureStake/algosigner-dapp-example/blob/master/tx-test/common/sign.js) - -### AlgoSigner.send({ ledger: ‘MainNet|TestNet’, txBlob }) - -Send a base64 encoded signed transaction blob to AlgoSigner to transmit to the Network. - -**Request** - -```js -AlgoSigner.send({ - ledger: 'TestNet', - tx: signedTx.blob, -}); -``` - -**Response** - -```json -{ "txId": "OKU6A2QYMRSZAUEJUZL3PW5XKLTA6TKWQHIIBXDCO3KT5OHCULBA" } -``` - -## Rejection Messages - -The dApp may return the following errors in case of users rejecting requests, or errors in the request: - -``` - UserRejected = '[RequestError.UserRejected] The extension user does not authorize the request.', - NotAuthorized = '[RequestError.NotAuthorized] The extension user does not authorize the request.', - UnsupportedAlgod = '[RequestError.UnsupportedAlgod] The provided method is not supported.', - UnsupportedLedger = '[RequestError.UnsupportedLedger] The provided ledger is not supported.', - Undefined = '[RequestError.Undefined] An undefined error occurred.', -``` - -Errors may be passed back to the dApp from the Algorand JS SDK if a transaction is valid, but has some other issue - for example, insufficient funds in the sending account. diff --git a/docs/legacy-signing.md b/docs/legacy-signing.md deleted file mode 100644 index 03da3986..00000000 --- a/docs/legacy-signing.md +++ /dev/null @@ -1,26 +0,0 @@ -# AlgoSigner Legacy Signing - -AlgoSigner launched in September 2020 with support for basic transaction signing. Over the following releases additional support for Multisig, Atomic, and Application transactions were added. - -The combination of the complexity of working with non-basic transaction and the creation of a new standard for Wallets by Foundation led to the creation of [v2 signing](dApp-guide.md). - -The initial, v1, transaction signing will be deprecated in a future release and is documented only for reference purposes. - -[v1 dApp integration](legacy-dApp-integration.md) - -### Transition to v2 -- Examples of signing with v2 are available in the [dapp examples repo](https://purestake.github.io/algosigner-dapp-example/index.html). -- An interactive transition guide that demonstrates the differences between v1 and v2 signing is available as a link from the dapp examples repo or directly access the [transition guide](https://purestake.github.io/algosigner-dapp-example/v1v2TransitionGuide.html). - -### Multisig Transactions - -- Multisig transactions can be signed individually through AlgoSigner. - - Using the associated msig for the transaction an available matching unsigned address will be selected if possible to sign the txn component. - - The resulting sign will return the a msig with only this signature in the blob and will need to be merged with other signatures before sending to the network. -- An example of this can be seen in the [existing sample dApp multisig test](https://purestake.github.io/algosigner-dapp-example/tx-test/signTesting.html). - -### Atomic Transactions - -- Grouped transactions intended for atomic transaction functionality need to be grouped outside of AlgoSigner, but can be signed individually. -- The grouped transactions need to have their binary components concatenated to be accepted in the AlgoSigner send method. -- An example of this can be seen in the [existing sample dApp group test](https://purestake.github.io/algosigner-dapp-example/tx-test/signTesting.html). From 7159da73d398e0c5bd2bf60690629b601964ee9c Mon Sep 17 00:00:00 2001 From: Jan Marcano Date: Mon, 6 Jun 2022 15:04:26 -0300 Subject: [PATCH 02/10] Query Namespace APIs for Aliases --- packages/common/src/config.ts | 48 +++++++++++++--- packages/common/src/types.ts | 8 +++ .../background/messaging/internalMethods.ts | 52 +++++++++++++++--- packages/ui/src/assets/ans.svg | 14 +++++ packages/ui/src/assets/nfd.png | Bin 0 -> 28098 bytes packages/ui/src/pages/SendAlgos.ts | 19 +++---- packages/ui/src/services/common.ts | 8 ++- 7 files changed, 121 insertions(+), 28 deletions(-) create mode 100755 packages/ui/src/assets/ans.svg create mode 100644 packages/ui/src/assets/nfd.png diff --git a/packages/common/src/config.ts b/packages/common/src/config.ts index d51cec8c..69efb286 100644 --- a/packages/common/src/config.ts +++ b/packages/common/src/config.ts @@ -1,10 +1,10 @@ -import { Namespace } from './types'; +import { Namespace, Ledger, Alias } from './types'; interface ConfigTemplate { name: string; // Formatted name, used for titles - ledgers: Array | null; // Ledgers supported, null if there's no restriction - api: string; // Templated URL to call for uncached aliases - findAliasedAddresses: Function; // How to process the API response to get the aliased address + ledgers: any; // Object holding supported Ledgers as keys, templated API URL as value + findAliasedAddresses: Function; // How to process the API response to get the aliased addresses array + apiTimeout: number; // Amount in ms to wait for the API to respond // @TODO: add caching/expiry } @@ -16,23 +16,55 @@ export class AliasConfig { static [Namespace.AlgoSigner_Contacts]: ConfigTemplate = { name: 'AlgoSigner Contact', ledgers: null, - api: '', findAliasedAddresses: noop, + apiTimeout: 0, }; static [Namespace.AlgoSigner_Accounts]: ConfigTemplate = { name: 'AlgoSigner Account', ledgers: null, - api: '', findAliasedAddresses: noop, + apiTimeout: 0, }; - public static getMatchingNamespaces(ledger: string): Array { + static [Namespace.NFD]: ConfigTemplate = { + name: 'NFDomains', + ledgers: { + [Ledger.TestNet]: 'https://api.testnet.nf.domains/nfd?prefix=${term}&requireAddresses=true', + [Ledger.MainNet]: 'https://api.nf.domains/nfd?prefix=${term}&requireAddresses=true', + }, + findAliasedAddresses: (response): Array => + response.map((o) => ({ + name: o['name'], + address: o['caAlgo'][0], + namespace: Namespace.NFD, + })), + apiTimeout: 2000, + }; + + static [Namespace.ANS]: ConfigTemplate = { + name: 'Algorand Namespace Service', + ledgers: { + [Ledger.TestNet]: 'https://testnet.api.algonameservice.com/names?pattern=${term}', + [Ledger.MainNet]: 'https://api.algonameservice.com/names?pattern=${term}', + }, + findAliasedAddresses: (response): Array => + response + .sort((a1, a2) => a1.name.localeCompare(a2.name)) + .map((o) => ({ + name: o['name'], + address: o['address'], + namespace: Namespace.ANS, + })), + apiTimeout: 2000, + }; + + public static getMatchingNamespaces(ledger: string): Array { const matchingNamespaces: Array = []; for (const n in Namespace) { if ( AliasConfig[n] && - (AliasConfig[n].ledgers === null || AliasConfig[n].ledgers.includes(ledger)) + (AliasConfig[n].ledgers === null || Object.keys(AliasConfig[n].ledgers).includes(ledger)) ) { matchingNamespaces.push(n); } diff --git a/packages/common/src/types.ts b/packages/common/src/types.ts index 6d4189b5..dbbc6a21 100644 --- a/packages/common/src/types.ts +++ b/packages/common/src/types.ts @@ -71,7 +71,15 @@ export type WalletTransaction = { readonly authAddr?: string; }; +export type Alias = { + readonly name: string; + readonly address: string; + readonly namespace: string; +}; + export enum Namespace { AlgoSigner_Contacts = 'AlgoSigner_Contacts', AlgoSigner_Accounts = 'AlgoSigner_Accounts', + NFD = 'NFD', + ANS = 'ANS', } diff --git a/packages/extension/src/background/messaging/internalMethods.ts b/packages/extension/src/background/messaging/internalMethods.ts index 8b52c1d8..857afb15 100644 --- a/packages/extension/src/background/messaging/internalMethods.ts +++ b/packages/extension/src/background/messaging/internalMethods.ts @@ -2,11 +2,11 @@ import algosdk from 'algosdk'; import { JsonRpcMethod } from '@algosigner/common/messaging/types'; import { logging } from '@algosigner/common/logging'; import { ExtensionStorage } from '@algosigner/storage/src/extensionStorage'; -import { Ledger, Namespace } from '@algosigner/common/types'; +import { Alias, Ledger, Namespace } from '@algosigner/common/types'; import { AliasConfig } from '@algosigner/common/config'; import { Task } from './task'; import { API, Cache } from './types'; -import { Settings, } from '../config'; +import { Settings } from '../config'; import encryptionWrap from '../encryptionWrap'; import Session from '../utils/session'; import AssetsDetailsHelper from '../utils/assetsDetailsHelper'; @@ -223,7 +223,7 @@ export class InternalMethods { } } } - + // Setup session session.wallet = wallet; session.ledger = Ledger.MainNet; @@ -1238,14 +1238,15 @@ export class InternalMethods { const matchingNamespaces = AliasConfig.getMatchingNamespaces(ledger); const extensionStorage = new ExtensionStorage(); - extensionStorage.getStorage('aliases', (response: any) => { + extensionStorage.getStorage('aliases', async (response: any) => { // aliases: { ledger: { namespace: [...aliases] } } const aliases = response; // Search the storage for the aliases stored for the matching namespaces - const returnedAliasedAddresses = {}; + const returnedAliasedAddresses: Record> = {}; + const apiFetches = []; for (const namespace of matchingNamespaces) { - const aliasesMatchingInNamespace = []; + const aliasesMatchingInNamespace: Array = []; if (aliases[ledger][namespace]) { for (const alias of aliases[ledger][namespace]) { if (alias.name.toLowerCase().includes(searchTerm.toLowerCase())) { @@ -1258,10 +1259,45 @@ export class InternalMethods { } } - // Fallback to an api call goes here + if ( + searchTerm && + AliasConfig[namespace].apiTimeout > 0 && + AliasConfig[namespace].ledgers && + AliasConfig[namespace].ledgers[ledger]?.length > 0 + ) { + // If we find namespaces with APIs in the selected ledger, we prepare an API fetch + const apiURL = AliasConfig[namespace].ledgers[ledger].replace('${term}', searchTerm); + const apiTimeout = AliasConfig[namespace].apiTimeout; + + // We set a max timeout for each call + const controller = new AbortController(); + const timerId = setTimeout(() => controller.abort(), apiTimeout); + const handleResponse = async (response) => { + if (response.ok) { + await response.json().then((json) => { + const aliasesFromAPI = AliasConfig[namespace].findAliasedAddresses(json); + if (aliasesFromAPI && aliasesFromAPI.length) { + const aliasesInMemory: Array = aliasesMatchingInNamespace; + + // We add any new aliases to end of the namespace list + aliasesInMemory.push(...aliasesFromAPI); - returnedAliasedAddresses[namespace] = aliasesMatchingInNamespace; + // We add the updated aliases from the API to the response + returnedAliasedAddresses[namespace] = aliasesInMemory; + } + }); + } + clearTimeout(timerId); + }; + // We save the fetch request to later execute all in parallel + const apiCall = fetch(apiURL, { signal: controller.signal }).then(handleResponse); + apiFetches.push(apiCall); + } else { + returnedAliasedAddresses[namespace] = aliasesMatchingInNamespace; + } } + + await Promise.all(apiFetches); sendResponse(returnedAliasedAddresses); }); diff --git a/packages/ui/src/assets/ans.svg b/packages/ui/src/assets/ans.svg new file mode 100755 index 00000000..da485f5a --- /dev/null +++ b/packages/ui/src/assets/ans.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/ui/src/assets/nfd.png b/packages/ui/src/assets/nfd.png new file mode 100644 index 0000000000000000000000000000000000000000..754fdcccd2196aa38b6b2f630b264d12d58daf1e GIT binary patch literal 28098 zcmd43c{J6}8vs0_&>~VQWl4o7Nfg;`QL-y7mP8>$y4fyY+YLpFsK}P3g|rCSt}Ub@ zvSg2ot3p{WC2kSknfcuMy~{c8Iq!e(=bTPHGtWHp?9VgvnYmX?jC7VQ7G4YhSf+bW z`!E0t>F6KNBG{s=WMBvX<0T(7cL!j}3iOYosXO2g0OCMbd+!nNyCdD*=T3ZVP3dbj zN>LVwykXPa?!MP+f!3Y{-+_CtfsMSd!Ga&N+$&Xsj_EXx@VviTeuPWwK>6NQ6_-OR z=AYK9%nbSfj$Vg#Uz>WC6%Y3}b!v8ZcP|7$F;m}H;KHx!9qTnOC=Sn$^z5w4pJT0# z6CFOMeL{U=tXFMf%v$3|rqvra&zuJhklZ&b=o}!uGNR(ojQE_ta)U}(3^O}rUcMzz z?B_yX0G^1`I6>qiIrXIj4YR%XeXK;^PA5pskM$1~^7;c1dx^mZ%5#f6G@SzE|6Jv6 z9vq$z>K%sbK~uM(xo09TzE_?vTUxe-OY0}hy!?ELGvA-Es81S zzWpsUt+{VI%k;-AIZ#cn9Bh;~1Gdn;t zHNYiv&ylg(V5eVC`}&Rveg_~<5Q@&NDRpLYdzEC{MIE)fVP)(0{mBbn0IGu_9r7^& zBJV4LJ>|WgagJS>vDsWVt5}k!2*6H$I54fTYBKaxcgr66{MOwYPKI!UHHmOgmb3qf zf)$IZKNQG1X+x?Lk$&<|xrs<8>%vzN0r-0Iss8fH>1-O`5f>%3n*YT5GEeLR<+WTC zK&|p{8ry58IhC@dk=9k#)<_Ti)jyOrsl@?)A<^(Bln0Dko!DK$;#v&Ksnt1gV0?%Nkj|^LyNe!R=oY6nUF!?P|B|YYX!)4%bleB>S?;n@*nMBWk`Hzc*L5enN zU8LHowpJWEXF5Lom27u@qt)KmD*mQLkR*2OTjmN_!fKh7av## zv7~rOsDk%~e%#apP$ni1GM6VOT^j+B(Vl+uUn-7*^xF_^-Y?;g?PW%ESztHDGW1^E z%aI}sB_H)%pEZ0MVv}wkOUT<<+v-5!0sRQ6w$&a{iJ3k5+vyv?kr3@XFTik`D&-`lL2*^@kKq$D$my!(10`RkDq3cun-@@jL)ptq$=U*Hcb3~Cpa4Tq z`TA$qIlx=n{-xl(Hkq6H*yEeHME%CoB3-ORsL~hP1+s52lTSl??f~){P{D88QfH!f z=+p~?*mud5Ei;#v0P1%r8TreZ%_E|ug}}{izVXRp3RrUy5?pK-F9M`P;cLeZI5^)P zy(XYn0r=Wes|Zb2%ybN7Ekv*Plh2ebADyY^1L-X>r-o)9+w?izn zgDG$XP|tU}-k+IHj(L^hGv27O?HEBrF?>!o!RctRXr}NTavd zJrO{ihBUgsti%{C^4R4kAOML;|1f$c%dW79TntKJ(k&mJyysu~$iMe72WX^juMD6- z>W)LV^fr&V5qf3nOD+J8jb~%M%RGJqH64h`$=}i1I9E(%GXPH6GS zj`Iu;02th5e0{T>AHaAdoZz@s=em6}+l^pZaq?&8hLT=o8366f=E3sO!OF}_Fr`qB z7mM_$PH!sVgdUpvT;HMc$V|Yn4hI01zZ49Lt(CQ@UT}ttAu(+$<4>Ccmjh5<|7=&F zTTA5=Uei5gdAyL-@z;m}QMrxePI_ zQlTymVB=QiGG|^g@8AYx9A1f}oS99UTC)890zeXaxzzd02!%U6ios{H(HF{0++nJi z^N1dqJN=3})UL^jnQjgl+fY@~whVPE7pK#JMZFy(?? zkrbC8n8l{mM~5eOh{5Ow!(aQUy6dw{un-ci*OD5M@GU0n(hMh{4$)obRt~#OerR0~ z1$8E^Tc$A}Au-jx4h|aA*S>4MlhcH+LL`N2b~<)4X-bdg~!`WD`GB+}qfaDLf zWJZ{4`u)5H3p|kjGqaAh#Q6+31MT;Hs{SK^@9!R@LtK0rVn@{@`iF9~7RJKpCZ8uK zvh-eek{19rTg#S1L*eB#sCw`im=1|479r}XHxpf6`g$K(Wph}P&XLAA1a)YmA$oLS zY#1D#Hg~9HQv2P!S3Si2e$II7aWSg}<=$KrYPQEW@7S{}X&C?_uWhf)ok?BC(V<=; zV$(kTcxtkxdV9SP0M#vJyLv6}JYBb%D@!#6cZ~97Erj+kcIt@;fGN|7LfsZi=JsA<3S~=DH7MpRxyehRwkx#q0g(G9SG9ay z9PGaG7-9s?Opu9isiZ;61FvA`FdBOuby6S2dU1OPG5E$yNfK1eqk&A`fAK z_S33RX`62B>aCa_I}Hrw`}kTilh0af_Do#sf~$zwH&8jXP(IOu^ovD4YgWOUZnfx< zg-;w(mzreG-AoEZ)(OlHCX6}4W*KPQ=@Frapq$(W_a05rlZ2zZ(Wn$IGzzA~$*)b1 z!hUU&5OPJhe6Q6}XmiEuNvobkan!V@2A{fg-3no}w^$~7=6Sc6i2@|`W08lDz;Q$> z=|j^%vDLiD@)R?OT48eegXi-decZcwU=WD5-uQ_g{DgFci;|*dwdZ;m)-GtZ$c$CF z)<0CUigR=J;YHH=^Hoc>BU7P1Nv)%3%ATRVg6gcXxwI6bfBGzz<0`Dke&_6i+^2XR zdk^+!9bQzOuu1_EWwwKJC3L??DOt1-^uD`lCn=wcBCdI?8orLJK~!7Kw{U)Wvv@6h zKY8ZO(ny$9t94@9WbN(wD zl|0az`ZUiZOu;aBg`eK_*(jDUUd>MyS@*z8ffZm={@TqY$JjpD363-+HJ4>XnBZijwz` zZD36=A1>#AJ*;=c85)tzKB$=wbE;d)zmAZ(-?ol9IF%pI&*3PaKcr;bSX{*r3 zcl}XsG-Y!>w5`aC59%mKAO`}x%yQ+IOy^$8E6A_i>E4qR8-pO#EZ-^QijmtP$cK(T zz7eCc%vlKuqq{ITfQ7%*CF(~!xxL8 za!&j1TQ|>d3of36y35CM(L%PLVgt$Ul1nVqwpj-agf-mspY;s46f_Ug{($g)J#X$F z7|DB{2d?*=ts1%23@J+42NT0otjzeaV>RG>v*spu%#TTS?r-Msj-!llE()ss_ZZ}l zsVYHQWeUoE^U(uWFY;bhA>y4lccGaUVa-+SU*c~q?Yk8VOF1BBcLw@BO}OsvHqn# zr;FJZ&Ywjd0s>-pp(%rskD1vg;=H)ID2^vl&6-n%ywpZE5J#%rHv~F2)3j=*J6;B? zSNc5z2Y~#1VNugn-S-Z8(X^fxd8{FV1sE~t^lN99xpTtR$-Vt>9UfZ9RZ)7qmEr=IWL+qnevOxs z9*!knXu0$@Gt_nQkOWQ3u*gFa36~_md@vI?9P}TQV&2zz?*G1NKpIk%t+pOt{d`#s zEKtshW4L#BB)jkNNz(6mSXs<-{R#Hvf`tv$7p9W+wRothU-9{_d+H6xGE>%7d!b$DX$q_2E&E9e`ftoC3Y zsK;p$%tw4netd84?oJ%0uK$_s|4j}eq3#}n3pBE$yrv*Cl9L!)*54>ZjpJp?@5b*P z5Z79M`Y9t6#6gzoebx7nxWX_L>dTo|nDQGdLzmq^=}h!U)6v_4&8ADO+nJormTr$ z@YxC=Wl;ZwG36yHMBWk;{$A02YEzKvNIah6i?K(j01q=uA0sv4`yk>4DYYU7{s?1c zX`wAS72}R$F-99d?H+`o1+07m^UJIL3NJ1SZ06heNkKxW9_|kU6sXo$xq0?4=$m~O zb@3eLmn0&T@b*IiA0v^A;=LVnl78(gpXCaApE{;J#pu4O%U*J50jj+Kwde|S+(^{$ zQo+}zlSDNLNStlUAB(C0@)s22WJ{X~VA9jOaZ^&Cb@)Or2N5Q7ixlHh~Bb75IaO^E8`knIeS z3nDMQNo)OCw+I$Yra6L9fo2+k#9!7e4O>Zv<^*b6 zqh%i~I#y#6DktJ{vJhp96vY^=u8W^|nNe`#xpKH|NdYfxHM#pHZS-e2_f<)nX|Sh@ zu`9Ci6f-ABH50{(#221Uv*~YdTEYMbq2*uF6tBiD`Ayp&s|UKOwFoHY&vlj`8hD`5VPQ4sYQOYepa^iT{uFbxN(^w z&sA}n>E$`kq2+Lg0g|jDc6k@q$DGQAW^(}@`Qqj*H z5=L~Cn?SG1+D-vGxSaa(2(7>p5)e&{we#2eYq|pM_LHTy&sMIEnL@b)j0bgvDc^vl z>fW16;Cw%qpL{mI#H}|2;Tc~Hci!dUGAVRF-w0VsDjAiqaMfTF=%^RDup&|I=W?s{ zh0Ac;*XoT=zP!>~J1}??uGC;A9~3xxMvAs`d&EOz9$D)|57~PitC3HhyV*iG1XaY$ z#lp1ru8mNTs=Gzi)E8s~pyQ^Zq7?iRP_I_xAu1qcgt9zUM0IVapg}z!C9NIX{X0at z{QYE@w>-)Xbjc1DvwRuOz9@8oH6N!1T7#jM)+?H3AHMw9iqMjQ&5m5@*z1gXkD{ON zHa>=cz(9JL;bO^CsY{!`HkoU0P27bVcYZ~AW&FA!*}>0hPp%#!in=y~RVapH>WVeD zqZO_{4cs(Ige{u`*9;#FS+2T%fb8Hx2sAQSF;`|yIHTTsx^z_Rt~^2-2dz+c%_R}$ z^~xSB!XI|YstUp zYWpdPQ4cr5u7yo9ANxN-UIDgGuMh~$KGCf#16}9k#37tjsK>j+;)Pve$&VbO;Q|rX z(J`$GE<8+n=B+}}lV;dWdIn$=e|D!rZ*7|#PT;`1;7wzP<6TBikzC?|*Sf=1Xe6-Q zv({qWvYf+d_Q&3#_i{P&ZOzJp%yT)|vVm9C*|@j7%#0Vr>sy;VgUV-7PB)KYcH||W z+6&viDm7#e_I`H9DT>h}{1mN4fz9G$wTjhxad*r%BYy;@FD%mFLZa(5LA3!w&BM&d zB2W)N)LIbrMK)?Fi2Bs4(q(Maeh_sCUkhIJ*Wxifd^?cl~yH$o5s~Nzqeyu$mJkdIjCN zWixvU>lv-e2MWh(TGEgaj>$%JyG>rXrS9wCu4 z_o52!;iN4BrS3~y8Xob=e2Zz3+~~5Wc2kyY6df_A^4^E*Z;jz){qSFjqgsmhjMnf2 z8%er8P7@TidRP6{*?RoAT&{s6z1Hi)H0FS0uUHnu%S=UC@FANkncJ7AbS^%N+Hz># zWXMzdFR|&3kXUb0o*EqPu>t!9DNpEFZPdFEU#B9E^#Xyp0oVc?sW{et=$G$1DXRGq z*)DaL$*=YgMMBtF$Jajd`iRAI3<6mZ9_d5L;0t?>;mNy`wUcmTO+Yp5LQo z`96e^6fBph^E%)!Q0-jfnz%R})4{gX(lDCn$yM0by(3_X4(lI!`>n1jWaf_sk2?E(V%TMzE3D{xl$Yb0CDhGTI(XcBdhpf#Z4^JeD^(I$9ME7Sj=xdt=eJmLa!(~G5a z{QDb|`Mj;S%Ma}rvb z`+H}<#sWcRu|p9`_@Fv*3rirD+`G9Mmy{$GgTk>`URL+CGyR0_SXXQWHD_x4xncL^WI%K`D^tot zX7br|c*^&`+$_lKnz)S$Es(OvV(^Xu?R+J{s>y0orlow}OA*cQc<|Z#KCTrZGrn;I z?jgIH*+c_cS#mP241iLTM(;b=&7OMbOwFta?2bqtN4SAfGpQGjwq%d)w5gd5huw+E zBe;88os|5A=x#b-4d-_DfCclM z^_0-8o@)=vw=*i+V&3eM>fpN2m*ali) zCafSXM74+Fa8X_Jq4BT}i9COERtrt21YFo!9TRgrhK)ke4?}|U-;q%ynl*&X z6#UV~F2|TuY=uV9yOW4;X51e2 zg;*;(&9)iPSoK6Mqf*S5hUfVN`8J68U?}ghfpyM2%mhz`;pCDLhjCrps+Xsk+m^=5 zoJ+@|DVJ01wdmqwTJ5YPN@Y+&pJjSGmz`<-5v?wE;h#AFt&`CWU0eapN9Zz8%j6Lh`3 z-v-Afl6QCWm8)U4yq8s!@`&m$v~eXM9@apByJVJ`44A;;U~F#9qYDQYdn$l0doksM zN7~(n7c=1?@!fckT51s-lz_030tl>E8A+QVYmqxKd7`GRpC2n3(tNkBqLyI6jmMtt zbTzD)RfNU>8iXQrtZX##bOQQ~z7_AqWwZ$N9KeKXNNs)=z2y`ZLP<1c$N$CoH=DUw6NsHC9SkM+vEWllurCsZ zJ&bKB2AF`!gIYW5k1++AZSO#NK0*CW&z<$^v}F77wea8?L1uN)+QD`7jN2U4ZX6b* zt=pXK-I9<)053y~-|u7o=eyX9CRW7 zp0L`EgSs2by}D{7!>0#^-r%rqFQ?iDw!%|( z#dt#bvI9`{u-tXbFVg^7zIfEc9^uZ3tph|bYB`9sXmc_rZ%_qm(L@$Y?f3h(Bq%kT z^~4aztuzYUn-$9WlLt=|;+YK2?@;{uu1=}X71jY3#B`CVT)14dYMZ}Zl~|Fla>LeUZUVZq5i*G)jvv!_yvUPMeklF1FCurJ!I zcXDjL9qabW|HtZ69MmAp$aUKnyVUKm($EJS^m)awEzJ-L(FePJM@Ee#oSt7`=JuaF zK>cxrIiFnWtLkj~QApmRr`M-oXVy;swd+G)tgN`e)3cVr^PdXmZ4Nt<16Z5Fqnw#|jed=$wL%TrV{g}d&BX{EQv}>?Kizn?Do;-}5z(yG>L0QPDB?uk| z-G$%2E#_r*)y-Y5^M=jet6)1YyNum1FelF$&MzH|-!vf)<>pwi zgZ4u7Q8;HCj`-wG7hn2dJXYZ|9IhC-=EC_N$q6uk%>4ln$)%fS!Vpw#yLM&=7xPkpxEP|HGwP?84`$(zRNR<1-H|scecFhY0GAj)un=2hEV_iyNo8V`o&rs$v~Cr!S%q<)yPr3z zT;X5*d*!|k?ce4AIOCjs_Qf}0mR&ZXQ+sTMXIG?Ns3JtrPc#UmUVt$QJR%Sul%ZK} zfl(hTQ`$;G);>RBHrQ|LpDYe)C$@^sGaY$M-O~n`xFH;#q70yunMENjnLODPRJ_EL zgIa{~ZH}iG*>bTAZ|W=o8feQvuS`$Q~f${8#K-Z)lNcZE!;+rP4cW0kd$ zKB_-{%~LQ9DxQTa$|_7zp@sdc*=rF?KshfK-HihUV_Pb^FFgiekN{ZQ{jzEyp5-Tw z8(-}0IK@=^Tmzx`@#8T@2b9RjD7N4?IWBli{0o+iikTvy+ z(M*3VPeF^2sxww$n|y5uoOClNufdb1PP%@EC)R-5MwGC&I^Bs@NG`nuz!glvou=Y& z))Hn{I84jnF*d_HA98N8pbfx^Kzu)9t$c;XOOf<=1tfu#=$2X3xqwnsKgj=LolkQ(zs~e!q-onIAy^EW^PdfJdOVWM2UoHlu zeHcqeef|%PirJ?H3*m+-7OH`RrB5=Uwi8&b*>}(NBT5J*uDQ=eiGeow#R%yuR;DKP zu~;eG(qD*qOH=NuF-DUji`tBNd#l>~zQK?d=ms|kE)gwzKE7{QNST4VntE93*Dt(? zOJ2fsIBx~1Fva}C^K^w!`6jqVw+Yj&=+=X5G+~1L4K21zeAvMWj^L>C^|RehO;LJ5 zLgtOtAVmTX_mS%S{g{_!d_xGNDBu_5F3Z9d_ zhS6!Wu6btS!QnuN~5BDZMi zv(n$)2M-qGn$%>2Dm0u}OjA@wJ0FX(`{@EuE{!NRc~03jYeJs?1TB}Oh+EQ#mXSJ0 zGWHtjhT=QSrXv8{!4=CT-*rg(J!AmSd?JhA{QK!+RC(Cod}Wee7L0--h)qVMMD-b( z!VCb+@bq8C>>wbuAK52q?;Iaf&Tt`nT;z6SXOU|Vd(u=92=EZE@qW0wh0Zvfho6z3 zB6FgalsFB+GgKf_2tii2BtzAl@D}6%2ZPXjUp^hR3{>x%d$*1UkQ9)J#g~_L6-7hm zdx+z_!jC;T>XZJ%o#!wv0fg&d41%)5g~bYZ^bmmG$jYfd;prSeO2gpWF!&A(9*Mxe z;H=w3Ca1pFIS=PI$3#xfx(;JVTu&c-?GAImiCE}{FA)|SLo3@rSn|RgK&(N_|4R}s zM%ajw>li%22uv`4W>;`CPR@5G&!k@0hms|ho?8d&QlZNOjaTEVS|seQ5YqaVky95E%?L;RN|(2-mW^SP+mZ4#gji79cT_jtYYVp{|FBb z!u^JQD0)bui%Sf=GFhXG%%BYUcR5cGq;fqjZa7C_G!KOvSlrk^0qhos&z@BlF`k6rqS1fuLNhP#ZAxuZyvvKY<06&X1do`HZnI4hB;;jsq@d2NRjCjt%=5ZBcj>o_lGp>bFut*;w-l-!9b0pr@d4VvKa5|~Rm~l1| z*GHHiqBRY51Yssp<%=JhJ#x?|Iy8`ro5Lf!Fnb|N#Frp=_-G?}!-vH6|Cfdt#!Gkn zDFDd7a}}eXPuzg$0|su+$eH2u|Apik#vDT&?vg-vy%p+DF7v#M{)U({kYeG(kFNfp z2Oi|Y|NlQ5Dxevv9>kroUpnEk06qUNL_m`o{yS&ad`Ox7(`1)nem^mNt#4MTw&KL3|~P38af zmvONy9q@+^@IXz;OV%Di1MvmO5#S>M&n@FW(tPp`r#V^0(e*!}V7ktDQpacpZo4dDF z>2QgUp08CX`of35tBcW-ixL@ps2X!;hyD%=(yEy4sla>m<+@`Q)Atz6PcV(bM|spr zUvnj0Y`p}2z5DZds@P&?K|McyHTti;>8~UO)-PtZ^Wj4f0JWot2p21a zd$c&=D5j8loGT@*#;fq>1RW(=9&x;UTm0ZA;)N(dg zJ<6T+f2j}rCnER>(9n1E3nrcsEjaq8C1j?jUWE|a?b~&KPLK<#2wO`^bQu^7nn~2c z-*l)_M9qlkm^E0;Wb3dzM_1Nfl+B=;%E$MxK20n2BK(N_GA=oR+}ow1gQ=IHGH*2iq2yC-@;ha4aRn9Y@)G>F5$1^U@=@~Eazpm5teL{ z&~wi3AbHGli7bX*`H-@%fbFR_5>7!ci6{I%MUJ!c7yQUw+NOgwO4TD)PQ z2g5ajh@z>&t>tXNdBZDlXb6=@Xz4#OAKAF>R|hYP!FIUCibej$yiAIQE=IocjK@sU ziobyE9QYhud<~!F0n&ANovlt&#*(H68Jz7g4K7wE94G4Z;R&=? z0UriD`-`y)JX`aRtu2zf#vThYE7-AZrH$M04FS4gA@<_P;&&OU2mTs3m2T+T&CaEp z1n3D~^Zcsk2{(@G^vv+RwFcseBG_Mht%+v4@HHvxH4IPqEWqFBANf=|9PKB-C&f#5 zA%(4=>ZAK)?c=95gft#NdnWM7x|{Dzzx^hjygZGdzuF`>Ut}k(>oewp)_!6WY>|VOf_XZs1m6nV@ z8v@h1rmVrmOg8BUTemLzI}BaGM2~jlA@cc7?!OpJx|Bw~4*ZYXgN-hu7Hm1eli=(j zr~WA;_kDhu`g^rLQ3JNFBF*7uU&UIbSd4qc2OG-}p z7{*35J#)TQpNnEjSjw|=Q^&TkLrw60a_sCXY&dg;mt|9f zBOZ0twx)Epk?S2lLQeMIO&Hkv?1K+ZO2V*j#nTsXvlmMm1kx$t|9R;f(zu=NF-EhB z)93zs_b=4wTRt;nXZsYpg+_3+7SBDa5p=x|R<_0Y&dt}%++L}h$zszi4-z`p#1>1c zj535i$8)OS>lpU@lmo@jb+@1S_CHD&Ztc0>&cnRc&4bkg&lH{iz>e|Khv20+!x{d4 zj;rTOF<~wDM=gHdZ;SnBd9fd4mi^U*;;Mx(U@zM+a_o0EhK_P+SNi%UL+PI;-g*a4un1s`QATK5xh%3aaX^p$wl{nD7fWgme!z zVBwLTds#W3Jh~XVXFpLB7({B@vgfEyWXxGM&%HQ?J(()tWo3KP3Z5$8aA}<#9$jsu za84!lpPIBbH{W6F+)a{J)||V1L&#IRBqGAKSb3gP;oSmt%r>f}kw;AbP87`uXqosL zn9#BlMQc@*HY>QHse0TZo8FB%;v+~vnDZv#<JsA+P_Zhmu!K9al#S@Q_Mn_w zpF@1fJ~;i8KD=-#XFK0x0s3mf2(~5@QNi?i(W1MF@ateOQPxotQ{`tSS^M1u11!zfgi#O1v*!o!N-mBCz z60Okp^7!j@IES0Wo$hqit(aA~=zyoSiG}YfgbVKeE5cd2$GHNY%~0$y#CpaqH9gJp z7>wn!2|0h+Q$E+O)O|W?*T0}(caL_*@-&&k7U1+%=feJl6gGy3&(muUTSqDPi9REY z@u0=cWd-jUOv1^jM^;hHhprv|pF}sU>T=bGyHmzEv>r6h9?hr!gKk;r1EFvI&ysbw z6n(rSLQh^j*87+DyyESXFIrZo8vpZDUFnyti-}CIbuYQ0XJWzJ(@)k?NDic;=Xx)< zPVQeO$n=fjRU-=gj34BH{q0wSH zCvEexO32u!4rMBK_CH&!trg=>opX++JN=98S?N#WU9A4EVkdobEt0eh?}X^(*wKR8 zbhQ2S@DiqBaqs7VuTgK4q_PTy64VW zt-r^A{W2ST@s*@UNZ`FE+UQGfqXN zVil!jV})wch)$Arr=xL@ueG7C15w$ezi)UR-W1HxxPIOZ0Z`)|?{o4nwb(=tohtGd zukcsy{fat)QsX}E74%RA!r-DBJZ5-;W|UvT-xh(7UfRVQ;2QR@Ik)Yd>)ZVF#`t-=%Ev_{F(KXp zjt+jgPz2}AxJht1;x@8UbNa2p3NSzxxN}S(Kzs$eOzU&}s6z4qW z*tz6;lvkO^uOm~6)KH-^7N&Rtj1|_6En>@`u#z&_2p7Lt~_3`W+4w# z-+ON0tHbZ@D-o`PjmFKRwfyv$&+BliwprHsWgizSRS^}iIwITg_Qt{25zh@@fC_)} zne(^2luB*TNE;<6q}mnqm=;tA)&6%<9<^rOuYIojg1^Gw2kw|zcU{B9jgaU0UlgC9 znWm(&LqE=A#>(%$OmMaCL6Yb^=?*2)#s4a8$`+vj_nozxPb#*FmnZwEP)@lfhKXHHtZNt#eclEwshsLmmfxzt7 z_>Hmx^mdkdNY>L?ypu!Kg@vKr{-Bx8_^App9B<@5u%0WuxW7CiBBEY%Av~L4t*+6| zKAdjDy604;oIe>yHV&=Dv4OfH_l-6W^RZ*+F#jt>B<6`|8r4;tI2k@YYA`5+4y9SKO4c!y{yuEBuSJQW| zPKAxz_o4#oL@Qwrk&mA~|9%seN9$*{u>Ptr?&C+BLwpsbD`70H5=0p727TM7q|2d^ z>x|jz!V?VJ-u@+2p%D>!Ai6Td*JtiAp+a#%i<76gSWVDcUd@)}5tmywG0UuKABZ2T zi8>22rvE?f1YzyGjj9UqE&QX3H)mMCbRPDWtyMB{H9SnE zYzu6_ckH4K?73K-X4`Ns(9hCK+ZW`U`0NfcGU{)$&8Ax_N)H^XMVQO)KD+f8vL*Wz zubpl9j=ehq=}BnC`(XSLM-||2lQ^Ft=6MYf_d~?y1mYcLn}Zqkg6xrMPwl)VXcP0J z-J?g>z00Tesow^6HVTfeT*nqwhL?MA1#eXL;;PbajO4Hb0w-iRtHJ(qs|>m8fOEyI z=?R~<(}@wkk1N%NwI^6bJhi{E9+v=qHSmH~2&4Y|(W0wirrg-goK@=1ErWO8ehUat zZs6o`%q=ECcqRool5 zFsEy4_t_y>M)b;~dpx$5*u6?DXnATsV1(meQk-S&drL0L+%vu1qJ9XDdOYBZ*P=|b zEtNAh_j|M^Tel#Il1}JEpSf|dAeKD1QHL$n`!_{Y7WHhTO}v!p?!wns!G*h)YfE&= zgSJPD!op0Y5O?L;i30}~jjf=YADyM1b+bTo7#P%?TdMKp!;xdhh2UkaKqI7KD(~;) z^rrA74yz>T=2jEjwG@1juw2`3b(eW4FQx6c&~bt9t?v*y@~7JmrN%8eBO*!vef>dL ztf~q^d*E!+x;4-ClO6nz7Da^FN+Ax*4~h&fTI4K1|9w}+O8fO=^m`q^#?HunCMfS? zU;UYy`vHpg$yd?v>!hnPB1H!^YC}{L_T)F9^%zwks~|C)m+6wGHyJW>#S|&RhGBGH zuR!jmArI5#xt@c-1?DD1(wg)MI?ZNdkZPCPi;fFeua&o4$Tm>8`49A1Q+T6EUVdVK z^Vv=z7Xz|`?}$4h(8kQjtvM)zpZ-y92CqcdEb{I8xThk~DvKaNBc~uS5q4`3-CwuE z?zI((-R$mw7qDA^{!xV8y&86JfunQSqag!{g7lBu*xgB`qq+OY4lH8w6w9gn=EW6> zUW&!pM#PQTZK`<%iTQsf$Hy62PR8affw#?+FF-nhMdW?GP`>zlc#-kkP6C@_g<65M zV>rX8I6idCjk|jgn5x&8n@2h&Y0WQXtoFaANTGtO{Dxn{vc(qmp{m_muEC$_sKN`= zto<>EHm?)<8p2B{@+k49VY|=Y*gwDp+5Kjeqcz;I5yx+r3cnBWBj+Az1*vvFX$mj% z#A;Y_!`(Tko`>m?sW&OdN_IuVsm9ZB>jXV&9z6c3W8Sh|C(v^vqUl-Ro+pa#Ha{=& zQl=jUs8832qt>kZ#q_9@)m)V62R@CT;Du)lYV*=jS5!Au2R6T9H@)5X_~#9V(Y&`d zN={Uk&!*^;KOALdj|xqS#n00=pmBFj9EgS_#u(6=9VXAh>-MOz`j+SGpK%PMK&9m; z*ZUHq>0vk2Z|NoTGJjf5j9;=AKx8wj;S7mzhNItPBwiLH-=@Bkao-qpa>7xj@{o{& z!1p?Q6WyT3=g7MruSI*w4rVp?=ko5og1>AE{b?Vv+_RVAt<%eAgajzANWL~dnQlvh zD){MZ?+mOOdhka^2{wYyiVYDDdy1_uYm*(kr~yBd~>ukhP6K7XJms%zi) zEb7$KA)O<)@fEE#&!W~XUkY!-zrDAWPvU;SLEDCKG~Ln~H3_~4dIitJ@9pfXS5^!Z zpNU3_qV~mI8NCi~i+dk=oJ8J^e_o*6CaUmTxik;+x_)%M#HUC2mk7R=CKvXXJ9faq z(femZCwJptGHBEvJd|pCys`rVA2&a-|Ml_RD6lljwjbJj{`(F+cwhaDj=)ViDlxi zu+i&x8TG%8etVlKgJk3}B)waBjZ#ITQ~F^T-oE9dMvLPEyEq@f+wvku;cq7-yP|S6 zMM=~B_C?)sN10|*Xf{83>8RQ)H%iorz9F*1RD!nC(Efsez&y<#Hd7O6*JXT6Bi^AK z?@#8vlnQZchJImb`4=9hfoU{z<7r9s?H;%swNQ*ngUv8t=SIKTt4-H_-P00*q->)F zS-CFLz2{&WWTm;yk2ALaJg!sx>eY<%uZB5p&;V?Xo>nb^KlGtrxBII5AeweO z4PLi8DM;@#e&Vqe)A;9ukE>KUJX%nK58VN8U6)V_jxc@!d#Xp=Dv>`O zkv;o%bLD?rlwV6RPiv&IMRq}+9MBmOP)-XQ&Du~QvI`$00iVV5D}~^%yF4CP_u+~= zibRV>%v?h2c$rztkh+`9kq|hK9Eg@XvEBuW^Bfj1wQq}iGsq{wcYMx}3V%-MR4x3q z7kri(eAUbr@q(RJ_~;#VZbjEA7=b$Q`5f?740axboy5pFII;?M;=?xJEBtAcZT$3m z%kHDk9E~E`A{G)fElYH21f=+%R?US2cVR|IzEGR+GuAnL6pq?0*maLHNYw)$!~$MA zE}=Jgn2p4Y9U9ppdp6OuVlWyTIPhyMgU^Z>Sa)T#5f1!$5o^N_&ab|Kre&?zyJmj3 z!~heC#0*C46>v~^nW(5JebG-{^YsT_AJrZyTn#%J%RF6@_eZ;~=l==Q`qzYkb^Y%j zBI3svWsCf$M-J5>_|$|1LO#FZ1Ngw($R#vMkbbX$;A}&FC4l5o>UKB5I{-{ny-IG` z)=BN)E0v;E@*nx8VO(?#sZV~}7UTThV#-&|3X#kBs1o(DK-Vc7F3K8wrv#+!a|z|Z z^-^gCKN0AV?Bw^LVA8(0^8e`R%EOvGw*IgQdT9_5#LCj5#j*$yp;|#nD@s+=QWjA` zq85}&RfGgO^Af=_i~@-`}3W7 z=e%cT&N*{t-ZQ_0Xu{}Q)3p)9N|Z7^YgmSKP;#S!p15m4NeW73vK1kHCeRP2ct^2u z^d6uFW8-TP^Z#SB7xa7Y!1K7V zV|}4k?b8d6F}uco3lD6h^elX5@TEV1R1}kPQZjKf;+JZaiLHW0*Og0XSqPtq*|%@7 zXTt7c1iWMJi)^PiQF2RW8i0M096A69YL_@nIn^7_Sloa5A^Fs${4aSk!m*RXD^R%q ztclk~)*wB~{M{kTl#_$bZR=55+Mg?-H640loReeSfAYTx5mbM#TV?Gy8oN9Ps%K%z z3olY^#hh~RwxkTG3tJNkjn=sFq%;pNxOE}(;obu8hOzFv^|AUnb+ofdw`42kzHwPK zN2#&E`=(ITdf3qo;YuFf*$QDtnX9j23N_@bU#_oyD>q*0hM+x0mUX|YZ`Ie-lIHW4 z?b#@-2}jd3cF(sI3-+f z28=QyMD0Y1)=jaCoQ`B`kL({i*GaD~q{^MP^D>f!EU6Bl+C;Zbmw$LWBTG1gip=Td z>}#CB1!2M+%cVyG+~rvc*-exu@k8UXR83*2A`7M&qix$U`E>UVA&Uw3^;~m;(A_1C z?FL@BSMp3YJ=A$p}~jmz4x%w~b)tH;KY z>m?iN(udFEW?bt!e!1`SBC^N3WV}d5vA~L z#YM))5ENfpcaY+*HNf9dYzZDF?M+Vw0v?2NC>^gEIG?{d#NYvw(XXMfVq=;AMmEY> z|Jc>B6s_mH5$<<7*Lt^ESM>=LbJxt6c+I?LoU_pyW;}RyBb`;ve+>oVe$ot{Z|vAh zThe<~N;^%B^$jJ%^C2Zyn>$1N6_rob%2qv8n{_vsDEc@%unpxtPlG)BYR;+rDt+mh z>71hTU4YVof$}g>z+-Zrb)Q!FqagS)^kvUAY5>CZJ(VM19qK#+FKW{bA!vt+4@2RZmIc47EC7;kblp{`Ikyke&aluBWQ8t)U0cQ;xX^%2Lef2<0&N0+SN5>jT!a@*3}0sYl}yL@l&#`xJ-r zzyz6T+Y)yBE~hU5zN1Y*NW7`%J?f*G9kS^|ul_Zq4u_2vvj^r!f1Q7u4QATbuSef* zs!-EV@3FCAQAr->i_z*6xG0dhx5_mk>d_KrjQUyTI}BS<(rBh78a(*n;OC*;Cfwqg zw+*UUEs?*ct}*GvcxGDV@-iA~Sj>Oi9;!8Uegh@o-Uoze($dGqNd`K%U`tDdPxC0B zNMP@vb4y7df_U=Jj0r^tOtxv5e|JhV=lS_t7_hgpL!Qh=0Lqr+t!|rJHyw&HNxdkq zQRk?Z8`i|dyxz^vn}+? zVkSp^ST_{)Kc?0<>tvY#X<9^KzUEI0!WQc$zQ7ns6P^o2ZigKOR`_4u?qT4{eo!6+ zQD^qc*n1ViS30WFHB?Pguzn`o{*6dVE2*RcJn21`7Evj^w~^`vskTwdyhdBiPs9`s^3MSwi*+Y7+c{~QFpnz}bwieTm7Nig zApk#@{b1nwbwz|HY^vm1xlyZa+LsK4k|iU?L7U0z^0qyGkQlxOBxY?5i~9nd?p2GU zL?olf-IJS+_~eDkvZq&A)kbmLVmP-j8BkEt3Rn2UnN0DVS$a^SDp0tVuDw=@?d=R0#bp_f4Q z(;l8^x}}b2|A}^|8&ZX#h2dTN za58SMes~nK`VL*4ELDpEMmAjo=-7mj2rTR*Ek^)03!)%=y;nC45xv8ZlAnO34agWt z6OH~2y5tG+0~V=ID6l-fgN4~{s+~Ddn)_kr|C{udz26AI4 zXe2^rnP&n*(pI-uZ*YLmD7D#Bn(-)@cw?F6SD9D5){{r<*1^F~O3xM6U&h>fi2se; zy>HMqN-L=90tTU$nXb7rYHPwUY~uie>?JWHG$I%Q?O+Ofon_xy*)CTW>EY@FWA|7( zMFR&&BzW&Wqkl$}4S%Z=@sXadOFPO|k^2CWWv-`)&TK~)kE)*~tes(q?Ki!^A}k~r z$uxd~WwLE?s|pTTXpC~|)m8w`i#MXzCjbOb2BXC^2Gy|aiwZTuH~!X<;Iv1jSF;mA z{33wE_kMy`qjcMGN#i%XDo1z5J@yT{)@)a{hVDclRgIHb)S9YWr{xUNyMlUG5AWiO zhFW+y6t+lSr#mXdDTCV+SPAq}o9g9AyfCDF3>f<)rpd2e6eWvNFqp8t}A08~iRks({d&I+^dlGXB**|5FjWi1yiZ?1r_8=H^e6qrHYmE*P z7GMi(!$~jWXBcxWFoaU~eMax|&r%iMq1SWY*rqMRhJ%dkzk5RFnjZP!!~!CHG=2Eb zN@c~5$hP1FlP5TU#0njz>D>S$hkRE=1VE^o@y7`JN>qJe1 z)oypy1c4Y@i8)2(R8pWOcMZ5^E_16?BePV_3hWp)xqj;=XymlW-jS429Nl-?Rf+B{ z>p@->!cr5~5;2w6V>~%w9br6u zW=ISPVh*Ek;4G+Xm05q^lVM$%CuA1cO9a@3S?{SdeKSQPS$3j7 zD${?g{^cH_TZ5Li-(7j7az_#y?t9!kGhmvFEH1t_s^ypVsBm$V zNTffDx)s*gZ5R+e`?$+iAoT$d_oSfEI`*1s#Rr-osUcBSaWQqlyvZRM9tM}#J&O8v zB#AJ4zkTv9yvLmyq~!|)6Q)LlpT4J@>32~v{CyyMJ1Z_-m8`%@$Q}A=vPx8tu9BIX z?k#-PG&otTMh?JtCFRWp>FgM}w+J&@YA-zDrA_!)>4-QzaAx*ckSdkrrkp;v>2bRY z%VUttr}@Zq%;`{(m{5;B=s>1vx;(0AZj6_zA~il+y;?GKSd)Y!y91fYx29d|Qq<2Z z=l-4ABTzmxm$CZsw_-dF{nLKhG?TosigV^T`Om4!r4nS;A>mXqpy+(-Yp+F;IU1c7 z6tuNI!BK-m1Bo0fR?wWnjjL%GUs`HjYr-PT5qzB)sUF6yy0y3Foz@_f1EMdmx3@YL z$P%cP_J>;(9?*r!p(2dkJoKbGiDn(>>g;W7G#kH#Gf z)`!g2UQ{EI)P-P4O_R-sEw_(x&+VvwTGlo|=4XN2ADTX2plRkLUU|m1dV+631e8{g zpXm#AN=5%{Bn%wy5N@Hpu2Q=7@)X^QUpRf2e{c_<2Ld?ZRv|Mtt!ckp;G|uC@aF=b z$%jj1=0z9tyJzm`sghnwe3@F$x=sasstmDH^2*P@EQ`2*ymH~d`ob0Py(!Y4A8%%j#G@{9>*>Y4?o%<>yr$xT20Ha6E7TrOV z+a(N>#3s78m2M;gb!v2+*e2bHSrxyIj+E}LywZ0A%d9Qcp@JODyLne)_2kfRM_2to z>w8dy^7XcZ*g)*df}$sxz4+DT-&ovcyoT)5$n~7fXe4X zTAK^*T*+QI?Xzh7iPJ#1c3<&Q@k!1cr==1{8S}T!qAYoJeII;M;^&$;Q<8y)^@-+U zdB;b&S6T9tLvW8M3qZO@BC~f@XpI%yZ>|0)63(>w#LD8Xt!|L}e+;$qgHJ>y;vrpe zkCiW { ${!selectedDestination && html`