-
-
Notifications
You must be signed in to change notification settings - Fork 114
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
e4ca2d6
commit 2d0c49a
Showing
10 changed files
with
207 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
24 changes: 24 additions & 0 deletions
24
prisma/migrations/20241219120508_zebedee_attachment/migration.sql
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
-- AlterEnum | ||
ALTER TYPE "WalletType" ADD VALUE 'ZEBEDEE'; | ||
|
||
-- CreateTable | ||
CREATE TABLE "WalletZebedee" ( | ||
"id" SERIAL NOT NULL, | ||
"walletId" INTEGER NOT NULL, | ||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
"gamerTagId" TEXT, | ||
|
||
CONSTRAINT "WalletZebedee_pkey" PRIMARY KEY ("id") | ||
); | ||
|
||
-- CreateIndex | ||
CREATE UNIQUE INDEX "WalletZebedee_walletId_key" ON "WalletZebedee"("walletId"); | ||
|
||
-- AddForeignKey | ||
ALTER TABLE "WalletZebedee" ADD CONSTRAINT "WalletZebedee_walletId_fkey" FOREIGN KEY ("walletId") REFERENCES "Wallet"("id") ON DELETE CASCADE ON UPDATE CASCADE; | ||
|
||
-- Update wallet json | ||
CREATE TRIGGER wallet_zebedee_as_jsonb | ||
AFTER INSERT OR UPDATE ON "WalletZebedee" | ||
FOR EACH ROW EXECUTE PROCEDURE wallet_wallet_type_as_jsonb(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
import { API_URL, PREIMAGE_AWAIT_TIMEOUT_MS } from '@/wallets/zebedee' | ||
import { assertContentTypeJson } from '@/lib/url' | ||
import { callWithTimeout } from '@/lib/time' | ||
import { fetchWithTimeout } from '@/lib/fetch' | ||
|
||
export * from '@/wallets/zebedee' | ||
|
||
export async function testSendPayment ({ apiKey }, { signal }) { | ||
const wallet = await apiCall('wallet', { apiKey, method: 'GET' }, { signal }) | ||
if (!wallet.data) throw new Error('wallet not found') | ||
} | ||
|
||
export async function sendPayment (bolt11, { apiKey }, { signal }) { | ||
const res = await apiCall('payments', { body: { invoice: bolt11 }, apiKey }, { signal }) | ||
const { id, preimage } = res?.data | ||
if (preimage) return preimage | ||
// the api might return before the invoice is paid, so we'll wait for the preimage | ||
return await waitForPreimage(id, { apiKey }, { signal }) | ||
} | ||
|
||
async function waitForPreimage (id, { apiKey }, { signal }) { | ||
return await callWithTimeout(async () => { | ||
let preimage | ||
while (true) { | ||
const res = await apiCall('payments/{id}', { body: { id }, apiKey, method: 'GET' }, { signal }) | ||
preimage = res?.data?.preimage | ||
if (preimage) break | ||
await new Promise(resolve => setTimeout(resolve, 10)) | ||
} | ||
return preimage | ||
}, PREIMAGE_AWAIT_TIMEOUT_MS) | ||
} | ||
|
||
export async function apiCall (api, { body, apiKey, method = 'POST' }, { signal }) { | ||
const headers = { | ||
apikey: apiKey, | ||
'Content-Type': 'application/json' | ||
} | ||
if (method === 'GET' && body) { | ||
for (const [k, v] of Object.entries(body)) { | ||
api = api.replace('{' + k + '}', v) | ||
} | ||
} | ||
const res = await fetchWithTimeout(API_URL + api, { | ||
method, | ||
headers, | ||
signal, | ||
body: method === 'POST' ? JSON.stringify(body) : undefined | ||
}) | ||
// https://zbd.dev/api-reference/errors | ||
if (res.status !== 200) { | ||
let error | ||
try { | ||
assertContentTypeJson(res) | ||
const json = await res.json() | ||
if (json?.message) error = json.message | ||
} catch (e) { | ||
error = res.statusText || 'error ' + res.status | ||
} | ||
throw new Error(error) | ||
} | ||
return res.json() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
import { string } from '@/lib/yup' | ||
|
||
export const PREIMAGE_AWAIT_TIMEOUT_MS = 1_200 | ||
export const STATIC_CHARGE_URL = 'https://api.zebedee.io/v0/process-static-charges/' | ||
export const DASHBOARD_URL = 'https://dashboard.zebedee.io/' | ||
export const GAMER_TAG_LNADDR_BASEURL = 'https://zbd.gg/.well-known/lnurlp/' | ||
export const API_URL = 'https://api.zebedee.io/v0/' | ||
export const ZEBEDEE_LNDOMAIN = 'zbd.gg' | ||
|
||
export const name = 'zebedee' | ||
export const walletType = 'ZEBEDEE' | ||
export const walletField = 'walletZebedee' | ||
|
||
export const fields = [ | ||
{ | ||
name: 'apiKey', | ||
label: 'api key', | ||
type: 'password', | ||
optional: 'for sending', | ||
help: `you can get an API key from [Zebedee Dashboard](${DASHBOARD_URL}) from \n\`Project->API->Live\``, | ||
clientOnly: true, | ||
requiredWithout: 'gamerTagId', | ||
validate: string() | ||
}, | ||
{ | ||
name: 'gamerTagId', | ||
label: 'gamer tag or id', | ||
type: 'text', | ||
optional: 'for receiving', | ||
help: `you can find your Gamertag in the [Zebedee Dashboard](${DASHBOARD_URL}) under \n\`Account->Gamertag\`\n section, or in the Zebedee app on the Wallet card.\nNote: You can also use your \`@${ZEBEDEE_LNDOMAIN}\` Lightning address here.`, | ||
serverOnly: true, | ||
requiredWithout: 'apiKey', | ||
validate: string() | ||
} | ||
] | ||
|
||
export const card = { | ||
title: 'Zebedee', | ||
subtitle: 'use [Zebedee](https://zebedee.io) for payments', | ||
image: { src: '/wallets/zbd.svg' } | ||
|
||
} |
Oops, something went wrong.