taler-docs

Documentation for GNU Taler components, APIs and protocols
Log | Files | Refs | README | LICENSE

commit 0eb0ba11265e193a95c7f9ef6f42f086a3069ec0
parent 81ca8cb7ee39ef88245e8bfcaa67b1c0ff03c837
Author: Florian Dold <florian@dold.me>
Date:   Sun,  4 May 2025 01:58:47 +0200

tops: procedural description of AML processes

Diffstat:
Mdeployments/tops.rst | 207+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 204 insertions(+), 3 deletions(-)

diff --git a/deployments/tops.rst b/deployments/tops.rst @@ -26,8 +26,8 @@ Regulatory requirements are set by `VQF <https://www.vqf.ch/indexen.html>`_ and detailed in their SRO-Regulation document. Our AML processes are based on their forms ("VQF Document Nr. 902.$x"). -High-Level Processes --------------------- +Overview of High-Level Processes +-------------------------------- Establishing a Business Relationship ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -97,7 +97,6 @@ Terminating a Business Relationship A business relationship is automatically considered terminated if no transactions have been processed with the GNU Taler system for over 12 months. - Credit / Debit Restrictions --------------------------- @@ -337,6 +336,208 @@ Implementation notes: where the context is updated based on documents still required. + +Procedural View +--------------- + +This section provides a procedural view of the AML process defined by the rules +earlier in the document. It is meant to give some further context to the rules +and show how the rules are used in the context of Taler business processes. + +It only takes into account the standard rules. Decisions from the AML +officer can lead to a deviation from the standard process/rules. + +Wallet User: Onboarding and Withdrawal +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +1. User installs the Taler Wallet software on their device of choice. +2. User adds the TOPS Taler Exchange to their Taler Wallet +3. User starts withdrawal via the wallet application. This creates a new + (pending) transaction in the wallet. *Optionally:* If the wallet can deduct + that the user has to complete a KYC process for the withdrawal, it notifies + the user. +4. User follows instructions to send money to the TOPS exchange +5. The wallet waits until the exchange knows about the + user's wire transfer. +5. The user's wallet checks with the exchange whether the withdrawal would + cross the balance threshold. The key/identifier for is the wallet ID for + the exchange (which is typically the reserve public key for P2P + transactions). + + **The TOPS exchange currently has no balance limits set, thus balance limits would + never be crossed.** + + * If the balance limit is not crossed (or the user increased the limit via KYC), continue at (6). + * If no KYC process is started or the KYC process fails or times out, funds + are automatically wired back to the customer after a reserve close + timeout. **Done.** + +6. The wallet attempts to withdraw electronic cash tokens. The exchange + checks the withdrawal limit based on the IBAN that the + customer used to transfer CHF to the exchange: + + * If the customer has already successfully completed + the ``sms-registration`` or ``postal-registration``, + the withdrawal limit is 2500 CHF/month and 15000 CHF/year. + * Otherwise, the limit is 200 CHF per month. If this limit would + be crossed by the withdrawal, the wallet redirects the user to + the exchange's KYC page, where the user can complete the ``sms-registration`` + or ``postal-registration``. + * If no limit would be crossed, continue at (7) + * If a limit would be crossed and the customer is not able to + lift it via the KYC process, funds are wired back automatically + after a reserve close timeout. **Done.** + +8. The wallet receives the (blindly signed) tokens from the exchange, + the withdrawal is done. **Done.** + + +Wallet User: Deposit of E-Money +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This process applies when the user wants to send CHF in their Taler wallet back +to their CHF bank account. Technically, it is the same process as the merchant +accepting a Taler payment. However, it might be treated differently from an +AML perspective. + +1. The user's wallet asks the exchange to deposit a Taler payment + to the user's own bank account. +2. The exchange checks whether the users's public key is associated with the + users's bank account specified in the deposit permission. + + Note that by default, the wallet uses a bank account that has + previously used for withdrawal. The withdrawal already associates + the reserve's public key with the IBAN used for the withdrawal. + Thus *usually* the right associated public key is already present. + + * If the association is missing, the exchange rejects the deposit. The + customer must do a 1 rappen wire transfer to the exchange with a public + key (as shown in the wallet) in the remittance information. **Done.** + * Otherwise, continue at (3). + + +Wallet User: Receiving P2P Payments +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +*Applicable to both receiving P2P payments (push) and getting paid for P2P +payment requests (pull).* + +1. The customer instructs their wallet to accept a P2P payment from another wallet. +2. The wallet tries to receive the P2P payment. + The exchange checks the P2P receive (technically: ``MERGE``) + limit, based on the wallet ID. + + * If the customer has successfully completed ``postal-registration`` or ``sms-registration``, + the limits are 2500 CHF / month and 15000 CHF / year. + * Otherwise, the limit is 0 CHF. The wallet redirects the user to the + exchange's KYC page, where the user can complete the ``sms-registration`` + or ``postal-registration``. + * If P2P receive is below the limits (or the customer increases the limits via KYC), + the P2P recive can proceed. **Done.** + * Otherwise, the P2P payment expires and the sender's wallet reclaims the money. **Done.** +3. The exchange checks the ``DEPOSIT`` limit of the user. The user is identified via their IBAN. + + * Initally, the deposit limit is CHF 0. The user must accept the exchange's + terms of service on the exchange's KYC page to lift this limit to CHF 2500/month + and CHF 15000/year + * If no deposit limit would be crossed, the exchange accepts the deposit from the user. + Continue at (4). + * Otherwise the exchange rejects the payment. The response is relayed to the + wallet, which can (if necessary) refund coins previously deposited for the + same payment and then refresh used coins. **Done.** +4. After the wire transfer deadline for the deposit has passed, the exchange + checks whether the wire transfer would cross the ``AGGREGATE`` threshold for + the merchant. + + * Initally, the aggregate limit is CHF 2500/month and CHF 15000/year. If + that limit would be crossed, the customer must undergo a KYB process. This + KYB process might result in limits being increased, depending on the + details of the user. + * If no aggregation limit would be crossed, the exchange initiates the wire transfer to the user. + * Otherwise the exchange holds the funds until the user completes the necessary AML process. + + + +FIXME: Do withdrawal limits also apply for withdrawal from the merge reserve? + +Wallet User: Sending P2P Payments +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +*Applicable to both sending P2P payments (push) and paying for P2P payment +requests (pull).* + +There are no KYC/AML-relevant steps required for +sending P2P payments. + +Merchant: Onboarding +^^^^^^^^^^^^^^^^^^^^ + +1. The merchant provisions a Taler merchant backend service. +2. A keypair is generated (or imported) for the merchant. +3. The merchant adds their (Swiss) bank account to the merchant backend +4. The merchant backend checks the KYC status of the account with the exchange. +5. The exchange checks if the merchant's public key is already associated with + the merchant's bank account. + + * If not, the merchant needs to make a payment (1 rappen) to the exchange + with the public key in the remittance information. Continue at (4). + * Otherwise, continue at (6). + +6. If the merchant's bank account still has a deposit limit of zero, the + merchant needs to accept the TOPS exchange terms of service on the + exchange's KYC page. + +7. The deposit rule is lifted and the merchant can start accepting Taler payments from customers. + However, initially no aggregated settlement payments (wire transfers) + will be send from the exchange to the merchants, until the merchant + has completed further KYC steps (``vqf_902_1_customer`` etc.). +8. Optionally, the merchant can (via a link in the merchant backend to the KYC page) + and immediately complete the further KYC process steps. + +Merchant: Receiving Payments from Wallets +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +1. The merchant receives a Taler payment (technically: deposit permissions) from a + wallet. +2. The merchant asks the exchange to deposit the Taler payment. +3. The exchange checks whether the merchant's public key is associated with the + merchant's bank account specified (as a salted hash) in the deposit + permission. + + * If the association is missing, the exchange rejects the deposit. **Done.** + * Otherwise, continue at (4). + +4. The exchange checks the ``DEPOSIT`` limit of the merchant. + The merchant is identified via their IBAN. + + * Initally, the deposit limit is CHF 0. The merchant must accept the exchange's + terms of service on the exchange's KYC page to lift this limit to CHF 2500/month + and CHF 15000/year + * If the merchant has accepted the terms of service, the deposit limit + is CHF 2500/month and CHF 15000/year. If that limit + is crossed, the merchant must undergo a KYB process. This KYB + process might result in limits being increased, depending + on the details of the business. + * If no deposit limit would be crossed, the exchange accepts the deposit from the merchant. **Done.** + * Otherwise the exchange rejects the payment. The response is relayed to the + wallet, which can (if necessary) refund coins previously deposited for the + same payment and then refresh used coins. **Done.** + + +Merchant: Receiving Wire Transfers for Taler Payments +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +1. The merchange receives payments from wallets. +2. The exchange waits and aggregates payments until the first wire transfer + deadline set by the merchant has passed. +3. The exchange checks whether the aggregated wire transfer would cross the + ``AGGREGATE`` threshold for the merchant. + + * Initally, the aggregate limit is CHF 2500/month and CHF 15000/year. If + that limit would be crossed, the merchant must undergo a KYB process. This + KYB process might result in limits being increased, depending on the + details of the business. + * If no aggregation limit would be crossed, the exchange initiates the wire transfer to the merchant. + * Otherwise the exchange holds the funds until the merchant completes the necessary AML process. + AML/KYC Forms -------------