Add example wallet def
This commit is contained in:
parent
d9205b6d30
commit
24bdf0a099
|
@ -0,0 +1,162 @@
|
||||||
|
import React from 'react'
|
||||||
|
import { lnbitsSchema } from '@/lib/validate'
|
||||||
|
|
||||||
|
// ~~~
|
||||||
|
// AFTER YOU HAVE FILLED OUT THIS TEMPLATE, IMPORT THIS FILE IN components/wallet/index.js
|
||||||
|
// AND ADD IT TO THE `WALLET_DEFS` array.
|
||||||
|
// DO THE SAME IN api/resolvers/wallet.js WITH THE `SERVER_WALLET_DEFS` ARRAY.
|
||||||
|
// (these arrays are separate to avoid backend imports in frontend)
|
||||||
|
// ~~~
|
||||||
|
|
||||||
|
// This name is used to identify this wallet and thus must be unique.
|
||||||
|
// It is used with the useWallet hook to select this wallet, see components/wallet/index.js.
|
||||||
|
// [required]
|
||||||
|
export const name = 'lnbits-as-an-example'
|
||||||
|
|
||||||
|
// The form to configure this wallet is generated from these fields,
|
||||||
|
// see the component <WalletFields /> in pages/settings/wallets/[wallet].js.
|
||||||
|
//
|
||||||
|
// If you need to include React code, you need to use React.createElement
|
||||||
|
// since the worker will also import this file and does not support JSX syntax.
|
||||||
|
//
|
||||||
|
// If not handled otherwise in <WalletFields />, field properties are simply
|
||||||
|
// passed into <ClientInput /> or <PasswordInput /> as props (component depends on 'type').
|
||||||
|
//
|
||||||
|
// For example, the following fields will generate a config in this shape (depending on user inputs):
|
||||||
|
// {
|
||||||
|
// url: 'https://demo.lnbits.com/',
|
||||||
|
// adminKey: 'a47acd6feba4489e9e99b256b4ae9049'
|
||||||
|
// }
|
||||||
|
// [required]
|
||||||
|
export const fields = [
|
||||||
|
{
|
||||||
|
name: 'url',
|
||||||
|
label: 'lnbits url',
|
||||||
|
// 'type' can be 'text' or 'password'
|
||||||
|
type: 'text'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'adminKey',
|
||||||
|
label: 'admin key',
|
||||||
|
type: 'password'
|
||||||
|
// see other wallets for more complex fields
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
// Used to display information about this wallet to the user in the wallet list or during configuration,
|
||||||
|
// see components/wallet-card.js and pages/settings/wallets/[wallet].js.
|
||||||
|
// [required]
|
||||||
|
export const card = {
|
||||||
|
title: 'LNbits',
|
||||||
|
// as mentioned above, you need to use React.createElement instead of JSX for more complex content
|
||||||
|
subtitle: React.createElement(
|
||||||
|
React.Fragment,
|
||||||
|
{},
|
||||||
|
'use ',
|
||||||
|
React.createElement('a', { href: 'https://lnbits.com/', target: '_blank', rel: 'noreferrer' }, 'LNbits'),
|
||||||
|
' for payments'),
|
||||||
|
badges: ['send only', 'non-custodialish']
|
||||||
|
}
|
||||||
|
|
||||||
|
// The validation schema that will be used on the client and server during save
|
||||||
|
// [required]
|
||||||
|
export const schema = lnbitsSchema
|
||||||
|
|
||||||
|
// This optional function will be called during save to abort the save if the configuration is invalid.
|
||||||
|
// It receives the config and context as arguments.
|
||||||
|
// It must throw an error if validation fails.
|
||||||
|
// [optional]
|
||||||
|
export async function validate (config, context) {
|
||||||
|
// what the config object will contain is determined by the fields array above
|
||||||
|
// const { url, adminKey } = config
|
||||||
|
|
||||||
|
// the context includes the logger and other useful stuff, see save method in components/wallet/index.js
|
||||||
|
const { logger } = context
|
||||||
|
|
||||||
|
// validate should log useful, wallet-specific information for the user
|
||||||
|
logger.info('running some wallet-specific validation')
|
||||||
|
|
||||||
|
// ...
|
||||||
|
// throw error if validation failed
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this wallet supports payments, you need to implement this function:
|
||||||
|
//
|
||||||
|
// sendPayment: (bolt11, config, context) => Promise<{ preimage: string }>
|
||||||
|
//
|
||||||
|
// [required for payments]
|
||||||
|
export async function sendPayment (bolt11, config, context) {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this wallet supports receiving, you need to implement this object.
|
||||||
|
// [required for receiving]
|
||||||
|
export const server = {
|
||||||
|
// This must match a WalletType enum value in the database
|
||||||
|
// since it will be used to fetch this wallet using the WALLET_BY_TYPE GraphQL query,
|
||||||
|
// see `useServerConfig` in components/wallet/index.js.
|
||||||
|
// [required]
|
||||||
|
walletType: 'LNBITS',
|
||||||
|
|
||||||
|
// This used must match a column of the 'Wallet' table
|
||||||
|
// since it will be used to save the wallet configuration.
|
||||||
|
// [required]
|
||||||
|
walletField: 'walletLNbits',
|
||||||
|
|
||||||
|
// This can be any name but it makes sense to use something appropriate here like 'upsertWallet<WalletName>'.
|
||||||
|
// This is used to generate the mutation during save (see `generateMutation` in components/wallets/index.js)
|
||||||
|
// and inject the corresponding resolver into the GraphQL schema
|
||||||
|
// (see `injectResolvers` in pages/api/resolvers/wallet.js.).
|
||||||
|
// [required]
|
||||||
|
resolverName: 'upsertWalletLNbits',
|
||||||
|
|
||||||
|
// Similar to validate above, this function should throw an error if the connection test fails.
|
||||||
|
// It is called on save on the server before writing the configuration to the database.
|
||||||
|
// As the name suggests, a good idea is to try to connect to the wallet and create an invoice in this function.
|
||||||
|
// [required]
|
||||||
|
testConnect: async (
|
||||||
|
// Wallet configuration as entered by the user
|
||||||
|
config,
|
||||||
|
// Context object with useful stuff, see `injectResolvers` in pages/api/resolvers/wallet.js.
|
||||||
|
{
|
||||||
|
me,
|
||||||
|
models,
|
||||||
|
addWalletLog,
|
||||||
|
lnService: { authenticatedLndGrpc, createInvoice },
|
||||||
|
cln: { createInvoice: clnCreateInvoice }
|
||||||
|
}
|
||||||
|
) => {
|
||||||
|
|
||||||
|
// ...
|
||||||
|
// throw error if validation failed
|
||||||
|
// (logging errors is handled by calling context but you can add custom logging on success here)
|
||||||
|
},
|
||||||
|
|
||||||
|
// This function is called during autowithdrawals.
|
||||||
|
// It should return a bolt11 payment request.
|
||||||
|
//
|
||||||
|
// createInvoice: ({ amount, maxFee }, config, context) => Promise<bolt11>
|
||||||
|
//
|
||||||
|
createInvoice: async (
|
||||||
|
{ amount, maxFee },
|
||||||
|
{ socket, rune, cert },
|
||||||
|
// Context object with useful stuff, see `autowithdraw` function in worker/autowithdraw.js.
|
||||||
|
{
|
||||||
|
me,
|
||||||
|
models,
|
||||||
|
// SN LND node instance
|
||||||
|
lnd,
|
||||||
|
lnService: {
|
||||||
|
authenticatedLndGrpc,
|
||||||
|
createInvoice: lndCreateInvoice,
|
||||||
|
getIdentity,
|
||||||
|
decodePaymentRequest
|
||||||
|
},
|
||||||
|
cln: {
|
||||||
|
createInvoice: clnCreateInvoice
|
||||||
|
}
|
||||||
|
}
|
||||||
|
) => {
|
||||||
|
// ... create invoice and return bolt11 that the SN node will pay
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue