Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
171 changes: 137 additions & 34 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand All @@ -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,
Expand Down Expand Up @@ -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
},
{
Expand All @@ -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
Expand All @@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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",
Expand All @@ -288,14 +367,22 @@ 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",
"uri": "ethereum:0x9C2242a0B71FD84661Fd4bC56b75c90Fac6d10FC@1?value=660720000000000",
"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",
Expand All @@ -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.
Expand All @@ -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)

Expand All @@ -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).
Expand Down
57 changes: 56 additions & 1 deletion ecosystem.html
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,25 @@
</div>
</div>
</a>
<a data-w-id="2784a533-0aff-7c45-973b-7713dfb7acf1" href="https://www.mtpelerin.com" target="_blank" class="card-ecosystem w-inline-block">
<div class="header-2">
<div class="div-block-41"><img src="images/bridge-wallet-logo.svg" loading="lazy" width="Auto" height="Auto" alt="" class="vectors-wrapper-23">
<div class="wallet-name">Bridge Wallet</div>
</div>
<div class="badge">
<div class="text-17">Payment App</div>
</div>
</div>
<div class="about">
<div class="description-2">
<div class="paragraph gray">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.</div>
<div class="paragraph gray">Available on iOS and Android.</div>
</div>
<div data-w-id="f0c3cdce-2bbb-e4d3-f8e4-45cb9271048c" class="link-2">
<div class="headline-15">mtpelerin.com/bridge-wallet</div><img src="images/arrow_outward-2.svg" loading="lazy" alt="" class="image-20">
</div>
</div>
</a>
<a data-w-id="2784a533-0aff-7c45-973b-7713dfb7acf1" href="https://www.shopware.com/en/" target="_blank" class="card-ecosystem w-inline-block">
<div class="header-2">
<div class="div-block-41"><img src="images/shopware-logo.svg" loading="lazy" width="Auto" height="Auto" alt="" class="vectors-wrapper-23"></div>
Expand Down Expand Up @@ -556,6 +575,24 @@
</div>
</div>
</a>
<a data-w-id="2784a533-0aff-7c45-973b-7713dfb7acf1" href="https://urble.com" target="_blank" class="card-ecosystem w-inline-block">
<div class="header-2">
<div class="div-block-41"><img src="images/urble-logo.jpeg" loading="lazy" alt="urble" class="vectors-wrapper-23" style="width: 42px; height: 42px; border-radius: 8px;">
<div class="wallet-name">urble</div>
</div>
<div class="badge">
<div class="text-17">Payment App</div>
</div>
</div>
<div class="about">
<div class="description-2">
<div class="paragraph gray">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.</div>
</div>
<div data-w-id="f0c3cdce-2bbb-e4d3-f8e4-45cb9271048c" class="link-2">
<div class="headline-15">urble.com</div><img src="images/arrow_outward-2.svg" loading="lazy" alt="" class="image-20">
</div>
</div>
</a>
<a data-w-id="2784a533-0aff-7c45-973b-7713dfb7acf1" href="#" target="_blank" class="card-ecosystem w-inline-block">
<div class="header-2">
<div class="div-block-41"><img src="images/F-Merch-shop.svg" loading="lazy" width="Auto" height="Auto" alt="" class="vectors-wrapper-23"></div>
Expand Down Expand Up @@ -987,6 +1024,24 @@
</div>
</div>
</a>
<a data-w-id="2784a533-0aff-7c45-973b-7713dfb7acf1" href="https://urble.com" target="_blank" class="card-ecosystem w-inline-block">
<div class="header-2">
<div class="div-block-41"><img src="images/urble-logo.jpeg" loading="lazy" alt="urble" class="vectors-wrapper-23" style="width: 42px; height: 42px; border-radius: 8px;">
<div class="wallet-name">urble</div>
</div>
<div class="badge">
<div class="text-17">Payment App</div>
</div>
</div>
<div class="about">
<div class="description-2">
<div class="paragraph gray">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.</div>
</div>
<div data-w-id="f0c3cdce-2bbb-e4d3-f8e4-45cb9271048c" class="link-2">
<div class="headline-15">urble.com</div><img src="images/arrow_outward-2.svg" loading="lazy" alt="" class="image-20">
</div>
</div>
</a>
</div>
<div data-w-tab="Tab 5" class="w-tab-pane">
<a data-w-id="2784a533-0aff-7c45-973b-7713dfb7acf1" href="https://www.spar.ch" target="_blank" class="card-ecosystem w-inline-block">
Expand Down Expand Up @@ -1083,4 +1138,4 @@
<script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=670cd765309520b679461de0" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<script src="js/webflow.js" type="text/javascript"></script>
</body>
</html>
</html>
Loading
Loading