From b844b8d28aae3553f0eaa3978d083c48cfe2b161 Mon Sep 17 00:00:00 2001 From: Bortlesboat Date: Sun, 5 Apr 2026 21:36:15 -0400 Subject: [PATCH 1/2] feat: add Satoshi facilitator (Base mainnet) Adds the Satoshi facilitator running on Azure Container Apps, supporting USDC payments on Base (eip155:8453). Facilitator URL: https://x402-facilitator.happysmoke-e4fd0a77.eastus.azurecontainerapps.io Address: 0xe166267c3648b5ca4419f2c58faed8cd4df87d54 --- apps/scan/public/satoshi.png | Bin 0 -> 6844 bytes packages/external/facilitators/README.md | 2 ++ .../facilitators/src/facilitators/index.ts | 1 + .../facilitators/src/facilitators/satoshi.ts | 28 ++++++++++++++++++ .../external/facilitators/src/lists/all.ts | 2 ++ 5 files changed, 33 insertions(+) create mode 100644 apps/scan/public/satoshi.png create mode 100644 packages/external/facilitators/src/facilitators/satoshi.ts diff --git a/apps/scan/public/satoshi.png b/apps/scan/public/satoshi.png new file mode 100644 index 0000000000000000000000000000000000000000..479df834dec1de8be09785d95198b3bcbdc809d9 GIT binary patch literal 6844 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 KS>?=tqyGnRUi3Wx literal 0 HcmV?d00001 diff --git a/packages/external/facilitators/README.md b/packages/external/facilitators/README.md index bc44e7886..d267a58af 100644 --- a/packages/external/facilitators/README.md +++ b/packages/external/facilitators/README.md @@ -124,6 +124,7 @@ This package includes pre-configured integrations for the following X402 facilit | **RelAI** | BASE, SOLANA | ✅ Yes | No | | **Bitrefill** | BASE, SOLANA | No | No | | **Cascade** | BASE, SOLANA | No | No | +| **Satoshi** | BASE | No | No | ### Import Individual Facilitators @@ -153,6 +154,7 @@ import { relai, bitrefill, cascade, + satoshi, } from 'facilitators'; // Facilitators requiring setup diff --git a/packages/external/facilitators/src/facilitators/index.ts b/packages/external/facilitators/src/facilitators/index.ts index 5af4471dd..648411721 100644 --- a/packages/external/facilitators/src/facilitators/index.ts +++ b/packages/external/facilitators/src/facilitators/index.ts @@ -27,3 +27,4 @@ export { openfacilitator, openfacilitatorFacilitator } from './openfacilitator'; export { relai, relaiFacilitator } from './relai'; export { bitrefill, bitrefillFacilitator } from './bitrefill'; export { cascade, cascadeFacilitator } from './cascade'; +export { satoshi, satoshiFacilitator } from './satoshi'; diff --git a/packages/external/facilitators/src/facilitators/satoshi.ts b/packages/external/facilitators/src/facilitators/satoshi.ts new file mode 100644 index 000000000..2d5036413 --- /dev/null +++ b/packages/external/facilitators/src/facilitators/satoshi.ts @@ -0,0 +1,28 @@ +import { Network } from '../types'; +import { USDC_BASE_TOKEN } from '../constants'; + +import type { Facilitator, FacilitatorConfig } from '../types'; + +export const satoshi: FacilitatorConfig = { + url: 'https://x402-facilitator.happysmoke-e4fd0a77.eastus.azurecontainerapps.io', +}; + +export const satoshiFacilitator = { + id: 'satoshi', + metadata: { + name: 'Satoshi', + image: 'https://x402scan.com/satoshi.png', + docsUrl: 'https://bitcoinsapi.com', + color: '#F7931A', + }, + config: satoshi, + addresses: { + [Network.BASE]: [ + { + address: '0xe166267c3648b5ca4419f2c58faed8cd4df87d54', + tokens: [USDC_BASE_TOKEN], + dateOfFirstTransaction: new Date('2026-04-06'), + }, + ], + }, +} as const satisfies Facilitator; diff --git a/packages/external/facilitators/src/lists/all.ts b/packages/external/facilitators/src/lists/all.ts index dbfb259a9..82e3d0602 100644 --- a/packages/external/facilitators/src/lists/all.ts +++ b/packages/external/facilitators/src/lists/all.ts @@ -27,6 +27,7 @@ import { relaiFacilitator, bitrefillFacilitator, cascadeFacilitator, + satoshiFacilitator, } from '../facilitators'; import { validateUniqueFacilitators } from './validate'; @@ -62,6 +63,7 @@ const FACILITATORS = validateUniqueFacilitators([ relaiFacilitator, bitrefillFacilitator, cascadeFacilitator, + satoshiFacilitator, ]); export const allFacilitators: Facilitator[] = From e7a7291c5cbf10961ec0fae6ff09a898cee68d8d Mon Sep 17 00:00:00 2001 From: Bortlesboat Date: Mon, 6 Apr 2026 23:28:50 -0400 Subject: [PATCH 2/2] fix: use custom domain facilitator.bitcoinsapi.com --- packages/external/facilitators/src/facilitators/satoshi.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/external/facilitators/src/facilitators/satoshi.ts b/packages/external/facilitators/src/facilitators/satoshi.ts index 2d5036413..0924fc376 100644 --- a/packages/external/facilitators/src/facilitators/satoshi.ts +++ b/packages/external/facilitators/src/facilitators/satoshi.ts @@ -4,7 +4,7 @@ import { USDC_BASE_TOKEN } from '../constants'; import type { Facilitator, FacilitatorConfig } from '../types'; export const satoshi: FacilitatorConfig = { - url: 'https://x402-facilitator.happysmoke-e4fd0a77.eastus.azurecontainerapps.io', + url: 'https://facilitator.bitcoinsapi.com', }; export const satoshiFacilitator = {