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
1 change: 1 addition & 0 deletions lightning-config.dist.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
->setReceiver('default-receiver')
->setDescriptionTemplate('Pay to %s')
->setSuccessMessage('Payment received!')
->setInvoiceMemo('')
->setSendableRange(min: 100_000, max: 10_000_000_000)
->setCallbackUrl('localhost:8000/callback')
->addBackendsFile(getcwd() . DIRECTORY_SEPARATOR . 'nostr.json');
10 changes: 10 additions & 0 deletions src/Config/LightningConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ final class LightningConfig implements JsonSerializable
private ?string $callbackUrl = null;
private ?string $descriptionTemplate = null;
private ?string $successMessage = null;
private ?string $invoiceMemo = null;

public function setDomain(string $domain): self
{
Expand Down Expand Up @@ -56,6 +57,12 @@ public function setSuccessMessage(string $message): self
return $this;
}

public function setInvoiceMemo(string $memo): self
{
$this->invoiceMemo = $memo;
return $this;
}

public function addBackendsFile(string $path): self
{
$this->backends ??= new BackendsConfig();
Expand Down Expand Up @@ -112,6 +119,9 @@ public function jsonSerialize(): array
if ($this->successMessage !== null) {
$result['success-message'] = $this->successMessage;
}
if ($this->invoiceMemo !== null) {
$result['invoice-memo'] = $this->invoiceMemo;
}

return $result;
}
Expand Down
3 changes: 2 additions & 1 deletion src/Invoice/Application/InvoiceGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public function __construct(
private string $lnAddress,
private string $descriptionTemplate,
private string $successMessage,
private string $memo,
) {
}

Expand All @@ -36,7 +37,7 @@ public function generateInvoice(int $milliSats): array
$imageMetadata = '';
$metadata = '[["text/plain","' . $description . '"],["text/identifier","' . $this->lnAddress . '"]' . $imageMetadata . ']';

$invoice = $this->backendInvoice->requestInvoice((int)($milliSats / 1000), $metadata);
$invoice = $this->backendInvoice->requestInvoice((int)($milliSats / 1000), $metadata, $this->memo);

return $this->mapResponseAsArray($invoice);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@

interface BackendInvoiceInterface
{
public function requestInvoice(int $satsAmount, string $metadata): InvoiceTransfer;
public function requestInvoice(int $satsAmount, string $metadata, string $memo = ''): InvoiceTransfer;
}
2 changes: 1 addition & 1 deletion src/Invoice/Domain/BackendInvoice/EmptyBackendInvoice.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public function __construct(private string $name)
{
}

public function requestInvoice(int $satsAmount, string $metadata): InvoiceTransfer
public function requestInvoice(int $satsAmount, string $metadata, string $memo = ''): InvoiceTransfer
{
return new InvoiceTransfer(status: 'ERROR', error: 'Unknown Backend: ' . $this->name);
}
Expand Down
3 changes: 2 additions & 1 deletion src/Invoice/Domain/BackendInvoice/LnbitsBackendInvoice.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,14 @@ public function __construct(
) {
}

public function requestInvoice(int $satsAmount, string $metadata = ''): InvoiceTransfer
public function requestInvoice(int $satsAmount, string $metadata = '', string $memo = ''): InvoiceTransfer
{
$endpoint = $this->options['api_endpoint'] . '/api/v1/payments';

$content = [
'out' => false,
'amount' => $satsAmount,
'memo' => $memo,
'unhashed_description' => bin2hex($metadata),
'description_hash' => hash('sha256', $metadata),
];
Expand Down
5 changes: 5 additions & 0 deletions src/Invoice/InvoiceConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@ public function getSuccessMessage(): string
return (string)$this->get('success-message', 'Payment received!');
}

public function getInvoiceMemo(): string
{
return (string)$this->get('invoice-memo', '');
}

public function getDomain(): string
{
return (string)$this->get('domain', $_SERVER['HTTP_HOST'] ?? 'localhost');
Expand Down
1 change: 1 addition & 0 deletions src/Invoice/InvoiceFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public function createInvoiceGenerator(string $username): InvoiceGenerator
$this->getConfig()->getDefaultLnAddress(),
$this->getConfig()->getDescriptionTemplate(),
$this->getConfig()->getSuccessMessage(),
$this->getConfig()->getInvoiceMemo(),
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public function test_request_invoice_when_api_returns_null(): void
'api_key' => 'key',
]);

$actual = $invoice->requestInvoice(100);
$actual = $invoice->requestInvoice(100, '', '');
$expected = new InvoiceTransfer(error: 'Backend "LnBits" unreachable', status: 'ERROR');

self::assertEquals($expected, $actual);
Expand All @@ -40,7 +40,7 @@ public function test_request_invoice_when_api_returns_payment_request(): void
'api_key' => 'key',
]);

$actual = $invoice->requestInvoice(100);
$actual = $invoice->requestInvoice(100, '', '');
$expected = new InvoiceTransfer(bolt11: 'ln1234567890');

self::assertEquals($expected, $actual);
Expand Down
23 changes: 23 additions & 0 deletions tests/Unit/Invoice/Domain/LnAddress/InvoiceGeneratorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public function test_invalid_amount(): void
'ln@address',
'Pay to %s',
'Payment received!',
'',
);
$actual = $invoice->generateInvoice(100);

Expand All @@ -44,6 +45,7 @@ public function test_unknown_backend(): void
'ln@address',
'Pay to %s',
'Payment received!',
'',
);
$actual = $invoice->generateInvoice(2_000);

Expand Down Expand Up @@ -73,6 +75,7 @@ public function test_successful_payment_request_with_amount(): void
'ln@address',
'Pay to %s',
'Payment received!',
'',
);
$actual = $invoice->generateInvoice(2_000);

Expand All @@ -89,4 +92,24 @@ public function test_successful_payment_request_with_amount(): void
'error' => null,
], $actual);
}

public function test_passes_memo_to_backend(): void
{
$backend = $this->createMock(BackendInvoiceInterface::class);
$backend->expects(self::once())
->method('requestInvoice')
->with(2, $this->anything(), 'Custom memo')
->willReturn(new InvoiceTransfer());

$invoice = new InvoiceGenerator(
$backend,
SendableRange::withMinMax(1_000, 3_000),
'ln@address',
'Pay to %s',
'Payment received!',
'Custom memo',
);

$invoice->generateInvoice(2_000);
}
}
Loading