diff --git a/README.md b/README.md index 0db1541..08b2bed 100644 --- a/README.md +++ b/README.md @@ -74,11 +74,16 @@ A GET HTTP call to either of these endpoints will return a JSON with the followi "houseNumber": "7", "zip": "6300", "city": "Zug", - "country": "Switzerland" + "country": "CH" }, "phone": "+123456789", "mail": "mail@my-company.com", - "website": "https://my-company.com/" + "website": "https://my-company.com/", + "registrationNumber": "CHE-123.456.789", + "storeType": "Physical", + "merchantCategory": "RetailTradeOthers", + "goodsType": "Tangible", + "goodsCategory": "FoodGroceryHealthProducts" }, "route": "DFX VM 01", "quote": { @@ -102,6 +107,30 @@ A GET HTTP call to either of these endpoints will return a JSON with the followi ], "available": true }, + { + "method": "Polygon", + "minFee": 36000000139, + "assets": [ ... ], + "available": true + }, + { + "method": "Arbitrum", + "minFee": 12000000, + "assets": [ ... ], + "available": true + }, + { + "method": "Optimism", + "minFee": 1200769, + "assets": [ ... ], + "available": true + }, + { + "method": "Base", + "minFee": 5233418, + "assets": [ ... ], + "available": true + }, { "method": "Ethereum", "minFee": 1682009661, @@ -138,27 +167,48 @@ A GET HTTP call to either of these endpoints will return a JSON with the followi "available": true }, { - "method": "Polygon", - "minFee": 36000000139, - "assets": [ ... ], - "available": true - }, - { - "method": "Arbitrum", - "minFee": 12000000, - "assets": [ ... ], + "method": "BinanceSmartChain", + "minFee": 1000000000, + "assets": [ + { + "asset": "USDT", + "amount": "1.26157" + }, + { + "asset": "USDC", + "amount": "1.261582" + }, + { + "asset": "DAI", + "amount": "1.26158231" + }, + { + "asset": "BNB", + "amount": "0.00168" + } + ], "available": true }, { - "method": "Optimism", - "minFee": 1200769, - "assets": [ ... ], + "method": "Bitcoin", + "minFee": 4.5, + "assets": [ + { + "asset": "BTC", + "amount": "0.00001069" + } + ], "available": true }, { - "method": "Base", - "minFee": 5233418, - "assets": [ ... ], + "method": "Firo", + "minFee": 0, + "assets": [ + { + "asset": "FIRO", + "amount": "0.58823529" + } + ], "available": true }, { @@ -173,12 +223,12 @@ A GET HTTP call to either of these endpoints will return a JSON with the followi "available": true }, { - "method": "Bitcoin", - "minFee": 4.5, + "method": "Zano", + "minFee": 0, "assets": [ { - "asset": "BTC", - "amount": "0.00001069" + "asset": "ZANO", + "amount": "0.58823529" } ], "available": true @@ -189,6 +239,23 @@ A GET HTTP call to either of these endpoints will return a JSON with the followi "assets": [ ... ], "available": true }, + { + "method": "Tron", + "minFee": 0, + "assets": [ ... ], + "available": true + }, + { + "method": "Cardano", + "minFee": 0, + "assets": [ + { + "asset": "ADA", + "amount": "4.883112" + } + ], + "available": true + }, { "method": "BinancePay", "minFee": 0, @@ -201,13 +268,13 @@ A GET HTTP call to either of these endpoints will return a JSON with the followi "available": true }, { - "method": "KuCoinPay", + "method": "TaprootAsset", "minFee": 0, "assets": [], "available": false }, { - "method": "BitcoinOnChainTaprootAsset", + "method": "Spark", "minFee": 0, "assets": [], "available": false @@ -243,6 +310,13 @@ A GET HTTP call to either of these endpoints will return a JSON with the followi } ``` +The `recipient` object includes additional fields describing the merchant: +- `registrationNumber`: Company registration number (e.g. Swiss UID) +- `storeType`: Type of store (`Physical`, `Online`, etc.) +- `merchantCategory`: Category of the merchant +- `goodsType`: Type of goods (`Tangible`, `Intangible`) +- `goodsCategory`: Category of goods being sold + Please note that the offer has an expiry date after which it can no longer be used. If a quote has expired, the wallet should fetch a new one (as explained above) to get the latest exchange rates. #### Exceptions @@ -266,11 +340,16 @@ If there is still no payment pending after the waiting time has elapsed, an HTTP "houseNumber": "7", "zip": "6300", "city": "Zug", - "country": "Switzerland" + "country": "CH" }, "phone": "+123456789", "mail": "mail@my-company.com", - "website": "https://my-company.com/" + "website": "https://my-company.com/", + "registrationNumber": "CHE-123.456.789", + "storeType": "Physical", + "merchantCategory": "RetailTradeOthers", + "goodsType": "Tangible", + "goodsCategory": "FoodGroceryHealthProducts" }, "statusCode": 404, "message": "No pending payment found", @@ -288,7 +367,7 @@ In our example the URL to fetch the transaction details for a payment in ETH on A GET HTTP call to this endpoint will return a JSON with the following structure. ```JSON -// EVM, Bitcoin and Monero +// EVM chains (Ethereum, Polygon, Arbitrum, Optimism, Base, BinanceSmartChain), Bitcoin and Firo { "expiryDate": "2025-05-01T14:34:40.881Z", "blockchain": "Ethereum", @@ -296,6 +375,14 @@ A GET HTTP call to this endpoint will return a JSON with the following structure "hint": "Use this data to create a transaction and sign it. Send the signed transaction back as HEX via the endpoint https://api.dfx.swiss/v1/lnurlp/tx/plp_f1ba466e2f1c0a4e. We check the transferred HEX and broadcast the transaction to the blockchain." } +// Monero, Zano, Solana, Tron and Cardano +{ + "expiryDate": "2025-05-01T14:34:40.881Z", + "blockchain": "Cardano", + "uri": "cardano:addr1qyqjzchnayplhgueg33gukpp2max9gkge4gh6jly93a0dzcm67tl9f0pkykty8my4j4hg8e9suj8nzdrjygmfy6c8d0skmaq5q?amount=4.883112", + "hint": "Use this data to create a transaction and sign it. Broadcast the signed transaction to the blockchain and send the transaction hash back via the endpoint https://api.dfx.swiss/v1/lnurlp/tx/plp_f1ba466e2f1c0a4e" +} + // Internet Computer (ICP) { "expiryDate": "2025-05-01T14:34:40.881Z", @@ -308,6 +395,13 @@ A GET HTTP call to this endpoint will return a JSON with the following structure { "pr": "lnbc12590n1p5p8p66pp5eh5manf8yj39ktlfm7h9y4uzph0wjnt6ngu2c709s9z5wndrfxkshp5kyucf7yxx97e0axrwke7xdy599csdhy67jd5pysz2n3m4d636cgqcqzzsxqzgvsp5wl7m20pwux8p49cumznt2vk3p6x08h0vshnpf2ckqzkwfw6fjdms9qyyssqy4mtye0fekxpgcjftmtqqre43xewmnsu94xmkq4yr8yfuj8se4ynd57s3etcdt3qwrrzx9x2qfm0kpz6kj9wy6ys328znrdvsq6mzrcpw0nfqs" } + +// BinancePay +{ + "expiryDate": "2025-05-01T14:34:40.881Z", + "uri": "bnc://app.binance.com/payment/secpay?tempToken=IzjFLlGOoHAdeUth9FurNGjONDeI5Hq9", + "hint": "Pay in the Binance app by following the deep link bnc://app.binance.com/payment/secpay?tempToken=IzjFLlGOoHAdeUth9FurNGjONDeI5Hq9." +} ``` Please note that the transaction details received belong to the quote from [step 2](#2-payment-details) and have the same expiration date. @@ -321,26 +415,31 @@ The API URL to send the transaction proof back to the payment provider (see belo **Important:** All transaction submission endpoints require the following query parameters: - `quote`: The quote ID from [step 2](#2-payment-details) - `method`: The blockchain/payment method name (must match exactly the method name from the `transferAmounts` array, e.g., "Ethereum", "BinanceSmartChain", "Polygon", etc.) -- `hex`: The raw signed transaction in hexadecimal format -- `tx`: The transaction ID after broadcasting (only for Monero and certain other blockchains) -- `asset`: The asset name (required for Internet Computer, e.g. "ICP", "ckBTC", "ckUSDC") -- `sender`: The sender's Principal ID (only for Internet Computer ICRC-2 approve flow) +- For EVM, Bitcoin and Firo: `hex` — the raw signed transaction in hexadecimal format +- For Monero, Zano, Solana, Tron and Cardano: `tx` — the transaction hash after broadcasting +- For Internet Computer: `asset` — the asset name (e.g. "ICP", "ckBTC", "ckUSDC") and either `sender` (Principal ID, for ICRC-2 approve flow) or `tx` (transaction ID, for direct transfer) +- For Lightning and BinancePay: no transaction submission needed (handled differently) -#### EVM and Bitcoin +#### EVM, Bitcoin and Firo Use the `uri` field from [step 3](#3-transaction-details) to construct and sign a valid transaction. Do not broadcast the transaction but send the raw signed transaction HEX to the payment provider with a GET HTTP request to the URL specified above. You must include the `quote` ID from [step 2](#2-payment-details) and the `method` parameter (blockchain name) in the request. If the call returns a success HTTP code, the Open CryptoPay payment has been successfully completed. +Note that BinanceSmartChain uses the `ethereum:` URI scheme (EIP-681 format with chain ID 56). + In our example the URL would be https://api.dfx.swiss/v1/lnurlp/tx/plp_f1ba466e2f1c0a4e?quote={quote-id}&method={selected-method}&hex={raw-tx-hex}. Further examples: - Ethereum payment: https://api.dfx.swiss/v1/lnurlp/tx/plp_f1ba466e2f1c0a4e?quote=plq_9af8927afe14f2d0&method=Ethereum&hex={raw-tx-hex}. - BNB Smart Chain payment: https://api.dfx.swiss/v1/lnurlp/tx/plp_f1ba466e2f1c0a4e?quote=plq_9af8927afe14f2d0&method=BinanceSmartChain&hex={raw-tx-hex}. +- Firo payment: https://api.dfx.swiss/v1/lnurlp/tx/plp_f1ba466e2f1c0a4e?quote=plq_9af8927afe14f2d0&method=Firo&hex={raw-tx-hex}. -#### Monero +#### Monero, Zano, Solana, Tron and Cardano -Use the `uri` field from [step 3](#3-transaction-details) to construct a valid transaction. Broadcast this transaction to the network and send the resulting raw transaction HEX and the transaction ID to the payment provider with a GET HTTP request to the URL specified above. You must include the `quote` ID from [step 2](#2-payment-details) and the `method` parameter in the request. If the call returns a success HTTP code, the Open CryptoPay payment has been successfully completed. +Use the `uri` field from [step 3](#3-transaction-details) to construct a valid transaction. Broadcast the signed transaction to the blockchain yourself and then send the resulting transaction hash to the payment provider with a GET HTTP request to the URL specified above. You must include the `quote` ID from [step 2](#2-payment-details) and the `method` parameter in the request. If the call returns a success HTTP code, the Open CryptoPay payment has been successfully completed. -In our example the URL would be https://api.dfx.swiss/v1/lnurlp/tx/plp_f1ba466e2f1c0a4e?quote={quote-id}&method=Monero&hex={raw-tx-hex}&tx={tx-id}. +The URL format is `{tx-url}?quote={quote-id}&method={method}&tx={tx-hash}`. + +In our example the URL would be https://api.dfx.swiss/v1/lnurlp/tx/plp_f1ba466e2f1c0a4e?quote=plq_9af8927afe14f2d0&method=Cardano&tx={tx-hash}. #### Internet Computer (ICP) @@ -366,6 +465,10 @@ In our example the URL would be https://api.dfx.swiss/v1/lnurlp/tx/plp_f1ba466e2 Use the invoice from the `pr` field from [step 3](#3-transaction-details) to execute the transaction. The Open CryptoPay payment will be completed as soon as the transaction has been successfully executed. +#### BinancePay + +Use the deep link from the `uri` field from [step 3](#3-transaction-details) to open the Binance app. The payment will be completed within the Binance app. + ### Simplified Flow To simplify the process, steps 2 and 3 can be done with a single HTTP call by adding the `method` and `asset` query parameters to the API URL used to fetch the payment details (in [step 2](#2-payment-details)). This call will return the transaction details as shown in [step 3](#3-transaction-details) or an error code, if the selected method and asset are not available with the payment provider. The simplified flow can be used with both approaches described in [step 2](#2-payment-details). diff --git a/ecosystem.html b/ecosystem.html index bc24c25..1b9843e 100644 --- a/ecosystem.html +++ b/ecosystem.html @@ -181,6 +181,25 @@ + +
+
+
Bridge Wallet
+
+
+
Payment App
+
+
+
+
+
Bridge Wallet is the self-custodial mobile wallet developed by Mt Pelerin, a regulated Swiss cryptocurrency exchange service. It supports 15 blockchains and more than 30 crypto-assets that can be used to pay via Open Cryptopay. With this app, users can also easily buy crypto, swap & bridge funds across supported chains, and cash out back on a bank account easily.
+
Available on iOS and Android.
+
+ +
+
@@ -556,6 +575,24 @@
+ +
+
urble +
urble
+
+
+
Payment App
+
+
+
+
+
urble is a mobile savings and payments app by Brick Towers, built on Bitcoin, Cardano, Ethereum and Midnight. It enables users to create personalized savings plans for themselves or loved ones, with contributions from friends and family. Through Open CryptoPay, urble users can also spend from their self-custodial wallet in everyday life, including at SPAR stores across Switzerland – connecting digital assets with real-world usage.
+
+ +
+
@@ -987,6 +1024,24 @@
+ +
+
urble +
urble
+
+
+
Payment App
+
+
+
+
+
urble is a mobile savings and payments app by Brick Towers, built on Bitcoin, Cardano, Ethereum and Midnight. It enables users to create personalized savings plans for themselves or loved ones, with contributions from friends and family. Through Open CryptoPay, urble users can also spend from their self-custodial wallet in everyday life, including at SPAR stores across Switzerland – connecting digital assets with real-world usage.
+
+ +
+
@@ -1083,4 +1138,4 @@ - \ No newline at end of file + diff --git a/images/bridge-wallet-logo.svg b/images/bridge-wallet-logo.svg new file mode 100644 index 0000000..b939f95 --- /dev/null +++ b/images/bridge-wallet-logo.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/images/urble-logo.jpeg b/images/urble-logo.jpeg new file mode 100644 index 0000000..8b135f2 Binary files /dev/null and b/images/urble-logo.jpeg differ