フリマ用レジ・在庫管理システム 要件(iPad1台・1人運用・PWA/ネイティブ併記)

フリマ用レジ・在庫管理システム 要件(iPad1台・1人運用・ネイティブ)

0. 前提

項目 内容
運用者 1人(店主=売り子=責任者=開発者)。レジ操作、WoSでの入金確認、アプリ開発を本人が行う
主機能 レジ・在庫管理(A)。現金会計は通信不要
付随機能 公開Webアプリ(B)。Aの在庫情報を表示するだけ。無くてもAは成立する。更新遅延を許容。Aからの反映手段は Cloudflare KV
運用端末 iPad 1台(レジアプリ、WoS、カメラ読み取りを同居)
通信手段 スマホのテザリング(sats決済・Bへの送信用)
WoS本体のiPad導入 手元のiPad所持者からの伝聞で「App Storeから入手可能」。App Store記載は iPhone専用(対応端末:iPhone、Mac(M1以降)、Vision)。iPad実機での入手・表示・動作は要確認(Q5)
WoSのモード 日本で提供が確認できているのは自己管理型(公式FAQ:自己管理型は全地域、カストディ型は対応地域のみ)。自己管理型を前提とする(Q6)
価格 登録商品:円価格・sats価格を商品ごとに事前確定し、おしながきで周知済み。営業中の改定・セット割なし。レジはレート換算を行わない。野良商品(登録外):営業中に金額を入力(A-1)。上限なし
商品画像 ビルド時にアプリへ同梱(A-1)。実行時の取り込み・差し替えは行わない
sats決済 WoSでInvoiceを作成し客が支払う。WoSの動作には通信が必要と見込まれる(C-1 #1)
実装形態 ネイティブアプリ(確定)。macOS+Xcodeで開発(A-16)

A. レジ・在庫管理(主機能)

A-1. 商品管理

登録商品

区分 ID範囲 在庫 QR カート挙動
ステッカー ST-001〜003 0以上の整数 種類ごとに1種 同一IDの追加で数量+1。画面の+/-で調整。在庫超過はエラー
キーホルダー KH-001〜020 0 または 1 個体ごとに1種 同一IDの2回目の追加はエラー(カート追加済み)。数量は常に1
  • 保持項目:商品ID、商品名、円価格、sats価格、在庫数、色、模様、画像(アプリに同梱)、公開状態。
  • 商品マスタは事前に端末内へ登録(CSV取り込み)。
  • 在庫0の商品は、追加経路(QR・手動入力・商品パネル)によらずカートに追加しない(SOLD OUT表示)。
  • 上記のカート挙動(キーホルダーの重複エラー、ステッカーの在庫超過エラー)は、追加経路によらず同一。
  • 登録商品の価格は事前登録のみ。営業中の価格編集機能は設けない。
  • CSVの再取り込みは営業前(待機中)のみ、PIN必須。取り込み時の扱い(仮置き、Q17):
    • 既存の商品ID:価格・商品名・色・模様・公開状態を更新する。在庫は変更しない。
    • 新規の商品ID:CSVの在庫値で登録し、stock_movements に initial で記録する。
    • CSVに含まれない既存商品:変更しない。
    • 既存商品の在庫をCSVの値で上書きするのは、取り込み時に明示的に選択した場合のみ。差分一覧を表示し、確認ダイアログを経て adjust で記録する。
  • 価格一覧:全登録商品の 商品ID・商品名・円価格・sats価格 を一覧表示し、CSVで出力できる。おしながきとの照合に使用する。野良商品は含めない。

商品画像

  • 商品画像は、ビルド時にアプリへ同梱する(確定)。商品IDと同名のファイルをプロジェクトのリソースに置く。サムネイル用への縮小は開発側で行う。
  • 実行時の画像の取り込み・登録・差し替え機能は設けない。画像の追加・差し替えは、再ビルド・再導入で行う(A-16)。
  • レジ画面に商品画像(サムネイル)を表示する:商品追加直後の確認表示、商品パネル、カート各行。
  • 画像がない商品は、商品名・色・模様の文字表示で代替する。
  • 営業前の確認:商品マスタの商品IDと、同梱画像のファイル名を突合する。アプリは、画像が同梱されていない登録商品のID一覧を表示できる(営業前の確認用。仮置き)。

野良商品(登録外商品)

  • 他者作品の販売代行等、商品マスタに未登録の品を会計に含めるための機能。
  • カート画面(A-3)から営業中に追加できる。事前登録は不要。
  • 入力項目:
項目 必須 内容
円価格 必須 1以上の整数。上限は設けない(確定)
sats価格 任意 未入力の場合、この野良商品を含むカートはsats決済を選択不可(支払方法選択画面でsatsを無効化し、理由を表示)。Q12
品名 任意 未入力時は既定名「野良」。委託元等を記載する用途にも使える
数量 必須 既定1。カート上で+/-により増減
  • 入力後、金額を大きく表示した確認を経てカートに追加する。桁の誤りは、この確認表示で検出する。カート行に「野良」の表示を付ける。
  • 在庫管理の対象外。stock_movements に記録しない。
  • 追加後の金額修正は、行を削除して再追加する。
  • 公開対象外(Bへ送信しない)。価格一覧に含めない。
  • 登録商品の「営業中の価格編集なし」の方針とは別機能として扱う。

A-2. 商品の追加経路(QR・手動入力・商品パネル・野良)

追加経路は4つ。いずれもレジ画面(A-3)から使え、同一のカートに反映される。

経路 対象 操作
QR読み取り 登録商品 カメラでQRを読み取る
ID手動入力 登録商品 商品IDを入力する
商品パネル 登録商品 レジ画面の商品をタップする
野良追加 野良商品 金額等を入力する(A-1)

QR・ID表示

  • 各商品にQRと商品ID文字を併記する(商品本体、またはタグ・台紙等のラベル)。ラベルはアプリで生成して印刷する(C-5 P1)。
  • QR内容は商品ID文字列のみ(例:KH-008)。
  • 読み取りはiPadのカメラと端末内の読み取り処理で行う(OS標準機能またはライブラリ。Q9)。通信不要。
  • 連続読み取り時、同一QRは1〜2秒のクールダウンで重複追加を防止。

手動入力

  • 全角→半角、小文字→大文字、空白除去、kh8 → KH-008 に正規化。
  • 存在しないIDはエラー表示、カートに追加しない。入力中に在庫ありの候補をサジェスト。

商品パネル

  • レジ画面に全登録商品を一覧表示する(商品画像、商品ID、商品名)。
  • 商品のタップで、QR読み取りと同じ追加処理を行う(ステッカーは数量+1、キーホルダーは1回のみ)。
  • 在庫0の商品はSOLD OUT表示とし、タップしても追加しない。カート追加済みのキーホルダーは追加済みの表示とし、タップ時はエラーを表示する。
  • 画像がない商品は、商品ID・商品名・色・模様の文字表示とする。

A-3. レジ画面・カート・会計状態の保持

レジ画面の構成(仮置き、Q16)

  • レジ画面は、商品パネル(A-2)とカート(カート画面)を同一画面に並べて表示する。
  • カメラ読み取り、ID手動入力、野良追加、会計へ進む、会計中断は、ボタンから起動する。
  • 画面の向き(横/縦)と配置は、P0で実機確認して決める。

カート画面

  • カートに追加された商品を一覧表示する:商品画像、商品名、円単価、sats単価、数量、小計。野良商品には「野良」の表示を付ける。
  • 合計は 円合計(Σ 円単価×数量)と sats合計(Σ sats単価×数量)を並記。自動計算。野良商品を含む。
  • sats単価が未入力の野良商品がある場合、sats合計は「算出不可」と表示する。
  • カート画面から行える操作:
操作 内容 確認ダイアログ
追加 QR読み取り、ID手動入力、商品パネル、野良追加(A-2) なし(野良追加は金額確認表示あり)
削除 行ごとの削除(全商品種別) あり(商品名・数量を表示)
数量増減 ステッカー・野良商品は+/-。キーホルダーは数量1固定 数量が0になる操作のみあり(行の削除として扱う)
  • 追加・削除・数量増減は「スキャン中」状態でのみ可能(A-4)。
  • 会計中断(A-4)も確認ダイアログを表示する(カートの行数・合計を表示)。キャンセルで元の状態に戻る。

状態の保持

  • カート、会計状態、選択した支払い方法、請求額は、更新のたびに端末内へ保存する。野良商品の明細を含む。
  • アプリ切替(WoSへの移動)、OSによるアプリ終了、強制終了、iPad再起動の後、直前の状態(sats待ちを含む)に復元する。
  • 復元後、カメラ読み取りが再開できること(再開できない場合は再起動を促す表示を出す)。

A-4. 会計状態

stateDiagram-v2
    [*] --> 待機中
    待機中 --> スキャン中: 初回の商品追加
    スキャン中 --> スキャン中: 商品追加・取消
    スキャン中 --> 待機中: カートが空
    スキャン中 --> 中断: 会計中断(確認あり)
    スキャン中 --> 支払方法選択: 会計へ進む
    支払方法選択 --> スキャン中: 戻る
    支払方法選択 --> 現金入力中: 現金
    支払方法選択 --> sats待ち: sats
    現金入力中 --> 完了: 受取額が請求額以上で確定
    現金入力中 --> 中断: 会計中断(確認あり)
    sats待ち --> 完了: 済ボタン確認後
    sats待ち --> 支払方法選択: 方法選び直し
    sats待ち --> 中断: キャンセル(確認あり)
    完了 --> 待機中
    中断 --> 待機中
状態 商品追加・取消 中断 在庫変動
待機中 商品追加で「スキャン中」へ遷移。取消の対象なし 不可(カートが空) なし
スキャン中 可 可 なし
支払方法選択 不可(戻るで可) 可 なし
現金入力中 不可 可 なし
sats待ち 不可(請求額固定) 可 なし
完了 不可 不可 減算済み
  • 「商品追加」は、QR読み取り、ID手動入力、商品パネル、野良追加のいずれか。
  • 中断:販売確定なし、在庫変動なし、記録なし、売上集計の対象外。中断時はカートの内容が破棄されるため、確認ダイアログを経る。
  • 在庫の減算は「完了」遷移時のみ。完了処理は端末内DBの単一トランザクションで行う(在庫検証→在庫減算→販売確定→在庫変動ログ)。在庫減算の対象は登録商品のみ。
  • 支払方法選択画面に、円合計とsats合計を並記して表示。

A-5. 現金決済

  • 請求額(円合計)表示、受取額入力(数字キー+1,000 / 5,000 / 10,000円ボタン)。
  • お釣り = 受取額 − 請求額。自動計算。
  • 受取額 < 請求額の間は確定ボタン無効。
  • 確定で完了処理。受取額・お釣りを販売記録に保存。
  • 通信不要。

A-6. sats / Lightning決済(WoS)

A-6-1. 請求sats額

  • 請求sats額 = Σ(販売時点のsats単価 × 数量)。野良商品を含む。レート換算を行わない。通信不要で確定する。
  • sats単価が未入力の野良商品を含むカートでは、sats決済を選択できない(A-1)。
  • sats待ち画面に請求sats額を大きく表示。
  • 店主がWoSの受取画面へ同額を入力する。
  • 入力ミス対策:
    • 営業前にWoSの表示単位(₿ 等の設定)を確認し、少額のテスト請求で桁を確認する(WoSの更新履歴に、新規インストールの既定表示単位を ₿ にした旨の記載あり。単位の意味と切替方法は実機確認)。
    • レジの請求sats額とWoS側の入力額を、手順に目視照合として含める。
  • WoSの入力単位(sats/円)の選択可否と最小受取額は、公式ヘルプに記載なし。実機で確認(Q7)。

A-6-2. Invoice作成(外部Invoice・固定)

手順(自己管理型WoSの公式ヘルプに基づく):

  1. レジで「sats」を選択し、請求sats額を表示。
  2. 「sats額をコピー」ボタンでクリップボードへコピー(A-6-4)。
  3. WoSを開き、Receive 画面の Amount/Note ボタンから金額(と任意のメモ)を入力。Lightning Invoice のQRが生成される。
  4. 客のウォレットがWoSのInvoice QRを読み取り、支払う。
  • Invoiceは会計ごとに新規作成する。以前のInvoiceを再利用しない(二重支払いの挙動は受取側の実装に依存するため)。
  • レジアプリはInvoice文字列を保持しない。
  • WoSをレジアプリから自動で起動・操作する方法は、公式記載・第三者資料とも見つからず、手動で切り替える。受取画面を金額指定で開くリンクは確認できていない。
  • WoSの支払い用スキーム(walletofsatoshi:)が第三者コード(2023年)にあるが、請求書を渡す用途で、現行版での動作は未検証。想定しない。

A-6-3. 支払い確認(手動・固定)

  1. 店主本人がWoSの入金通知・履歴で入金を確認する。通知が出ない場合は履歴画面で確認する。
  2. レジへ戻り、sats待ち画面の「済」ボタンを押す。
  3. 確認ダイアログに請求sats額を表示し、「WoSで入金を確認済み」を再確認。
  4. 承認で完了処理。販売記録に確認時刻を保存。
  • 誤押下対策:確認ダイアログ、完了後の販売取消(A-9)、終了時のWoS履歴との照合(A-8)。
  • 自動確認は想定しない。WoSはBusiness APIを提供しておらず、NWC(Nostr Wallet Connect)対応は資料間で記述が矛盾し、現行は未確認。
  • sats待ち中に方法選び直し・キャンセルした場合、作成済みInvoiceはWoS側で放置し失効を待つ。取消操作の有無は不明(非公式メモに「時間経過でのみ失効」との記述)。入金が確認できた場合は「済」で完了する。
  • 同一Invoiceへの二重支払いの挙動は受取側の実装に依存する。LNDでは同一ノードからの再払いは失敗し、複数ノードからの支払いは成立し得たとの報告がある。WoSの挙動は不明。1会計1Invoice運用で回避する。

A-6-4. 操作補助

  • 「sats額をコピー」:請求sats額をOS標準のクリップボード機能でコピー。WoSの入力欄へ貼り付けられるかは実機確認。
  • sats待ち画面に、請求sats額・経過時間を常時表示。

A-7. 在庫管理

  • 現在庫は端末内DBが唯一の正。管理対象は登録商品のみ。野良商品は対象外。
  • 完了時のみ減算。中断・商品取消では減算しない。
  • 在庫0 = SOLD OUT。
  • 在庫変動は stock_movements に全件記録(初期登録、販売、販売取消、手動調整)。
  • 手動調整:棚卸し時の数量修正(理由付き、PIN必須)。

A-8. 集計・バックアップ

項目 内容
日次集計 現金:件数・円合計。sats:件数・sats合計。いずれも内訳として「登録商品」「野良商品」の金額を分けて表示(件数は会計単位)。在庫一覧。円とsatsは合算しない
現金照合 釣銭準備金の入力、終了時に(準備金+現金売上)と実残高を比較
sats照合 sats決済の一覧(時刻・請求sats額・販売ID)を出力し、WoS履歴と照合
自動保存 販売確定ごとに端末内DBへ即時保存
エクスポート 販売・在庫のCSV/JSONを書き出し(明細の区分 item_type を含む)。終了時に必須、営業中も任意タイミングで実行可(PIN必須)。保存先は iPad内ファイルまたは共有機能(ファイルアプリへの書き出し・共有シート)。外部へ退避する手段は Q4

A-9. 販売取消(完了後)

  • 管理操作。PIN認証の後、確認ダイアログ(販売ID・決済方法・金額を表示)を経て実行する。キャンセルで販売記録・在庫は変化しない。
  • status = voided、登録商品の在庫を戻す(stock_movements に +qty)。野良商品は在庫を戻さない(在庫管理対象外)。
  • Lightning決済の返金はシステム外(WoS操作)で手動対応。販売記録に返金済みフラグを保持。

A-10. 通信非依存要件

# 要件
1 機内モードで、商品登録・QR読み取り・手動入力・商品パネル・野良追加・カート編集・円/sats合計の算出・画像表示・現金会計・中断・取消・在庫・集計・エクスポートが動作する
2 読み取り処理・画面資源・商品データ(価格・画像を含む)はすべて端末内(アプリ内)に保持し、起動時に通信しない
3 通信の成否は現金会計の完了可否に影響しない
4 sats決済は、WoSの動作が通信を要すると見込まれるため、通信可能時のみ受付。可否はOSが報告する接続状態で判定し、接続なしの場合はsats選択肢を無効化して現金のみ受付(Q1)。接続ありでもWoSが動作しない場合は、sats待ち画面の「方法選び直し」で現金へ切り替える(仮置き)
5 アプリ切替・OSによるアプリ終了・強制終了・電源断・iPad再起動の後、保存済み販売と会計状態が復元される
6 会場到着前に、全機能の事前動作確認と初期データ投入を行う

A-11. 認証

  • 運用者は1人。PINは誤操作防止と、置き忘れ時の不正操作防止を目的とする。
  • 販売取消・在庫手動調整・CSV再取り込み・エクスポートはPIN必須。
  • 野良商品の追加、カートの追加・削除はPIN不要(削除は確認ダイアログあり。A-3)。

A-12. iPad端末運用

項目 内容
自動ロック 営業中は無効(設定で「しない」)
電源 営業開始前に満充電。モバイルバッテリーを併用
通信手段 スマホのテザリング。iPadがWi-Fiモデルでも利用可(モデルは Q2)
画面 画面輝度を上げ、反射対策をする。QR読み取り時のiPad固定方法(スタンド等)を事前に確認
WoSの表示 iPhone専用表記のため、iPad上でiPhone用の画面(互換表示)になる可能性がある。表示サイズ・操作性・カメラ・通知を実機確認(Q5)
通知 WoSの入金通知を許可(自己管理型での通知仕様は未確認。Q7)
アプリ切替 レジ⇄WoSの切替を事前に練習し、状態復元(A-3)とカメラ復帰を確認
Split View / Slide Over 両アプリが対応している場合のみ使用。WoSの対応は未確認
WoSのバックアップ 自己管理型のバックアップ語を、iPadとは別の場所に保管(A-15)

A-13. データ構成

products

項目 内容
product_id PK(ST-001 形式)
kind sticker / keychain
name 商品名
price_jpy 円価格
price_sats sats価格
stock 在庫数
color / pattern 色・模様
image_ref アプリに同梱した画像(サムネイル)への参照。アプリ内のみで使用し、Bへは送らない
is_public 公開状態
updated_at 更新日時
  • Bへ送る has_image(画像の有無)は、image_ref の有無から導出する。保持項目ではない。

sales

項目 内容
sale_id PK
status completed / voided
method cash / lightning
total_jpy 請求額(現金会計時。sats決済時は空)
total_sats 請求額(sats決済時。現金会計時は空)
received_jpy / change_jpy 受取額・お釣り(現金)
confirmed_at sats入金の確認時刻(済ボタン押下時刻)
refunded 返金済みフラグ
completed_at 完了日時

sale_items

項目 内容
item_id PK
sale_id FK
item_type registered / adhoc
product_id FK(registered のみ。adhoc は空)
qty 数量
unit_price_jpy 販売時点の円単価
unit_price_sats 販売時点のsats単価(adhoc でsats価格未入力の場合は空。sats決済の会計には含まれない)
name_snapshot 販売時点の商品名(adhoc は入力した品名、未入力時は「野良」)

stock_movements

項目 内容
id PK
product_id FK
delta 増減数
reason initial / sale / void / adjust
sale_id FK(任意)
at 日時

sync_log

項目 内容
id PK
at 送信試行日時
result success / failed
detail エラー内容
  • 円換算レートは保持しない。sats受領額の円換算・記帳に必要な項目の要否は Q8。
  • 野良商品の委託元別集計に必要な項目(委託元名の独立保持等)の要否は Q13。

A-14. Bへの連携インターフェース(Cloudflare KV)

  • 反映先:Cloudflare KV。Bの閲覧ページはKVの内容を表示する。
  • 書き込み経路(案、Q14):Aが認証付きHTTPSでCloudflare Workerの受信エンドポイントへスナップショットを送り、WorkerがKVへ書き込む。
    • REST APIによる端末からの直接書き込みは採用しない。理由:管理用APIトークンを端末内に持つことになる。トークンの権限は「Workers KV Storage: Edit」とする資料があり(第三者)、名前空間単位かキー単位かは未確認。REST APIの書き込みレート制限はWorkerバインディング経由より低いとされる(公式FAQ、数値は未確認)。
  • 認証:書き込み専用のシークレットを使用する。端末のセキュア領域(Keychain等)への保管を想定する。漏えい時は再発行する(C-1 #19)。

送信内容(スナップショット)

  • 対象:公開対象(is_public)の登録商品。野良商品は含めない。
  • 項目:商品ID、名前、円価格、sats価格、色、模様、在庫、画像の有無(has_image、真偽値)、スナップショット作成時刻。
  • 画像データ(バイナリ、Base64等)は含めない。端末内の image_ref も含めない。
  • 全商品を毎回送る方式のため、送信失敗の再試行・順序管理が不要。
  • 保存形式:スナップショット全体を1キーに保存する。値サイズ上限は25 MiB(公式)。画像を含まないテキストのみのため、23商品では上限に対して十分小さい。

画像の扱い(仮置き、Q15)

  • Bの画像は、アプリから送らない。アプリに同梱した画像(A-1)と同じ元ファイルを、開発者がPCからBの配信先へデプロイする。営業中は画像を扱わない。
  • 配信方式の候補:
    1. Workers の静的アセット:静的アセットへのリクエストは無料・無制限とされる(公式)。ファイルサイズ上限・デプロイ手順は未確認。
    2. KVの別キー:PCから投入する。閲覧ごとに、KVの読み取りとWorkerのリクエストを消費する。
    3. R2:無料枠(Class A 100万回/月、Class B 1,000万回/月、外部への転送料無料)の範囲で収まる見込み。ストレージ無料枠は公式での再確認が必要。
  • ファイル名・キー名は商品IDから決める(例:KH-008.jpg、KVの場合は img:KH-008。仮置き)。Bは商品IDから画像の名前を導出して取得する。スナップショットに画像の保存先は含めない。
  • has_image が真の商品のみ、Bが画像を取得する。偽の場合、Bは文字表示とする(B-1)。
  • 画像を差し替えた場合は、アプリの再ビルドと、Bへのデプロイの両方が必要。対応関係の整合を C-6 #47 で確認する。
  • 画像の消費の目安(配信方式が KVの別キー、または Worker経由の場合):1閲覧あたり最大24回(スナップショット1+画像23)の読み取り・リクエスト。無料プランの上限(下表)をキャッシュなしで割ると、約4,100閲覧/日が目安(計算値)。

送信契機・制限

  • 送信契機:①完了処理後・販売取消後・手動在庫調整後に、通信可能なら自動(連続する変更はまとめて送信する) ②「公開サイトへ送信」ボタン ③通信回復時。送信対象はスナップショットのみ。
  • 送信間隔:同一キーへの書き込みは1秒に1回以下(公式の上限)。実運用ではまとめ送信の間隔を数秒以上とする。具体値は P0 で決める。
  • KVの制限(無料プラン、公式):
項目 上限
読み取り 1日100,000回
異なるキーへの書き込み 1日1,000回
同一キーへの書き込み 1秒に1回
値サイズ/キーサイズ 25 MiB/512バイト
ストレージ 1 GB(アカウント・名前空間ごと)
  • Workers の制限(無料プラン、公式):
項目 上限
リクエスト 1日100,000回(UTC 0時にリセット)
CPU時間 1リクエストあたり10 ms
サブリクエスト 1リクエストあたり50回(KVなどの内部サービスは1,000回)
静的アセットへのリクエスト 無料・無制限
  • 旧版の資料に、無料プランの1,000リクエスト/分のバースト制限の記載がある。現行版では確認できていない(未確認)。
  • 1キー保存方式では、送信1回=書き込み1回。1日1,000回の上限に対し、会計・取消・調整の回数が下回る見込み。超過する場合はまとめ送信の間隔を延ばす。
  • 反映遅延:他の拠点で変更が見えるまで60秒以上かかる場合がある。上限値は公式に記載なし。直近に同じキーを読んだ拠点では、反映がさらに遅れる(公式)。
  • 送信・反映が遅延しても許容する(遅延の上限は設けない)。
  • 送信失敗は sync_log に記録するのみ。会計・在庫に影響しない。
  • Bからの書き込みをAは受け付けない(一方向)。

A-15. WoS(自己管理型)の運用要件

  • 開始時にバックアップ語を控え、iPadとは別の場所に保管する。バックアップ語を失うと、iPad故障・紛失時に資金へアクセスできない。
  • 営業前に、別端末でのバックアップ語による復元を1回確認する。
  • 営業中の受取額が増えた場合の別ウォレットへの退避方法・タイミングは Q6 で決める。
  • 日本でカストディ型が使えるかは未確認。使えるとしても、現行の2モードで復元方法が異なる(カストディ型はメール認証での復元、自己管理型はバックアップ語)。

A-16. 実装要件(ネイティブアプリ)

項目 内容
導入 Xcodeでビルドして実機へ導入。macOS+Xcodeが必要。無料のPersonal Teamは署名が7日で失効し再導入が必要。有料Developer Program(年額99ドルの記載)は1年。他の配布手段(TestFlight等)は未調査(C-3)
開発環境 macOS+Xcode。言語・フレームワークは Q9
更新の反映 再ビルド・再導入。商品マスタ(CSV)の更新は再ビルド不要。画像の追加・差し替えは再ビルドが必要。再導入後に端末内データ(商品マスタ・販売・在庫)が保持されることを確認(C-6 N-3)
オフライン起動 通信不要で起動
データ保存 端末内SQLite等。アプリ削除時はデータも削除される想定(要確認)
画像保持 ビルド時にアプリへ同梱(リソース)。実行時の保存・取り込みはしない
カメラ読み取り OS標準のカメラ・スキャン機能、またはライブラリ(Q9)
接続状態の取得 OSが報告する接続状態を取得し、sats選択の可否判定に使う(A-10 #4)。取得方法はP0で確認
アプリ切替後の復帰 状態を保存。復帰時にカメラセッションを再開。復帰しない場合は再起動手順を表示。レジ⇄WoS往復後の復帰はP0で実機確認
クリップボード OS標準機能
エクスポート ファイルアプリへの書き出し・共有シート
Bへの送信 HTTPSクライアント(A-14)
主なリスク 署名失効(無料時)、macOS・Xcode環境、導入・更新の手間、画像差し替えにビルドが必要、アプリ切替後のカメラ復帰(未検証)

B. 公開Webアプリ(付随機能)

B-1. 表示

  • 商品画像、商品名、円価格、sats価格、色・模様、在庫数。
  • 商品画像は、スナップショットとは別に配信された画像を、商品IDから導出した名前で取得して表示する(A-14)。スナップショットに画像データは含まれない。
  • has_image が偽の商品、または画像の取得に失敗した場合は、商品名・色・模様の文字表示とする。
  • ステッカー:「残り N個」。在庫0で「SOLD OUT」。
  • キーホルダー:在庫1で「1点もの」。在庫0で「SOLD OUT」。
  • 公開状態が非公開の商品は表示しない。野良商品は表示しない。
  • ページに「最終更新時刻」を表示。Aからの送信が遅れている間、在庫表示が古い可能性があることを明記。

B-2. 更新

  • Aから受信したスナップショットで全商品を置き換える(KVの1キーへの書き込み。A-14)。
  • 閲覧側の更新は再読み込みのみで可。自動取得は任意(実装する場合の間隔は任意)。
  • KVの反映遅延(60秒以上。上限は公式に記載なし)により、Aの送信から表示更新までに時間差が生じうる。許容する。
  • 閲覧ごとにKVの読み取りとWorkerのリクエストが発生しうる。無料プランの上限は、KVの読み取りが1日100,000回、Workerのリクエストが1日100,000回(A-14)。画像の配信方式によっては、1閲覧あたりの消費が最大24回になる。

B-3. 非機能

  • 閲覧のみ・認証なし。閲覧者向けの書き込み機能を持たない。
  • Aからのスナップショット受信用のエンドポイントのみ、認証付きで持つ(A-14)。画像用の書き込み経路は持たない(画像は開発者がPCからデプロイする)。
  • 通信環境・稼働状況によらず、Aの動作に影響しない。
  • Bが停止していても、Aの運用は継続できる。

C. 評価・提案

C-1. 評価

# 項目 内容 重大度
1 sats決済の通信 WoS固有のオフライン挙動の記載は見つからず。一般説明では、受取側はInvoice生成と入金受取にオンラインが必要。圏外ではsats決済は成立しない見込み 高
2 WoSの利用条件 iPad導入は伝聞(App Store記載はiPhone専用)。日本でのカストディ型は未確認。最小受取額・入力単位・Invoice取消・通知仕様は未確認 高
3 自己管理型の鍵管理 バックアップ語の紛失・漏えいが資金喪失に直結する。iPad故障時の復元はバックアップ語のみ 高
4 端末故障・紛失 正データがiPad内のみのため、故障時に販売・在庫が失われる。WoS残高の管理も同一端末に集中する 高
5 署名失効 無料のPersonal Teamでは導入したアプリが7日で動作しなくなる。営業日の直前に再導入が必要。有料プログラムなら1年 高
6 価格表と登録値の不一致 おしながきの円価格・sats価格と、商品マスタの登録値がずれると、掲示価格と請求額が一致しない 高
7 1人運用の操作負荷 商品追加、WoS操作、入金確認、客対応を1人で行う。客がInvoice QRを読み取る間、レジ画面を表示できない 中
8 sats額の手入力 WoSへの手入力ミス・表示単位の取り違えで請求額の誤りが起こりうる 中
9 手動確認 済ボタン押下の誤り・押し忘れが起こりうる。確認者は店主本人のみで、第三者によるチェックがない。WoS履歴との終了時照合で検出する 中
10 WoSの通知 更新履歴から通知機能の存在は確認できるが、自己管理型での入金通知の仕様・遅延は未確認 中
11 バッテリー iPad 1台に機能が集中するため、電源切れで会計とsats決済が同時に停止する 中
12 税務・記帳 国税庁FAQでは、暗号資産で商品を購入した場合は暗号資産の譲渡として所得を計算する設問がある。販売側が暗号資産で対価を受けた場合の直接の設問は目次上なし。sats受領額の円換算基準は確定できない 中
13 二重支払い 同一Invoiceへの二重支払いの挙動は受取側の実装依存。WoSの挙動は不明 中
14 実勢との乖離 sats価格は事前固定のため、営業中にBTC価格が動いても請求額は固定。価格設定は店側の決定事項であり、システムでは扱わない 低
15 Bの在庫遅延・無料枠の消費 通信不通の間、およびKVの反映遅延(60秒以上、上限は公式に記載なし)の間、Bの在庫が実際より多く表示される。遅延は許容。最終更新時刻の表示で緩和。閲覧数が多い場合、KVの読み取り・Workerのリクエスト(いずれも無料プランで1日100,000回)を消費する。画像の配信方式により、1閲覧あたり最大24回 低
16 野良商品の金額誤入力 営業中に金額を手入力するため、桁・数量の誤りが請求額の誤りになる。登録商品と違い、価格の照合元がない。円価格に上限を設けない(確定)ため、極端な桁の誤りも入力できる 中
17 他者作品の売上の混在 野良商品(他者作品)の売上が自分の売上と同一の会計・集計に入る。委託元への精算に分離が必要になる可能性がある(Q13) 中
18 商品パネルの誤タップ タップ1回で追加されるため、誤追加が起こりうる。カート画面で確認・削除できる(削除は確認ダイアログあり) 低
19 Cloudflare書き込みシークレット 端末内に保持するシークレットが漏えいした場合、Bの表示を第三者が書き換えられる可能性がある。REST API直接書き込みを採用した場合は、名前空間に対する編集権限のトークンを端末に置くことになる(権限の絞り込み可否は未確認) 中
20 アプリ切替後のカメラ復帰 ネイティブでの、レジ⇄WoS往復後のカメラ復帰・状態復元は未検証。レジ⇄WoS往復運用に直結 中
21 画像の差し替えにビルドが必要 画像をアプリに同梱するため、追加・差し替えに再ビルド・再導入が必要。営業日の直前は差し替えできない。商品マスタ(実行時のCSV)と画像(ビルド時)の更新経路が分かれ、商品IDと画像ファイル名の不一致が起こりうる 低

C-2. 対策案

評価# 対策
1, 2 事前に、会場想定の通信条件で WoS の Receive → Amount/Note → Invoice QR → 客側ウォレットで支払い → WoS履歴で入金確認、までを通しで確認。利用不可時は現金のみで運用
3 バックアップ語を別保管し、事前に別端末で復元確認(A-15)。営業中の受取額が増えた場合の退避方法を事前に決める
4 販売確定ごとの追記ログ、定期エクスポート。紙の控えを併用
5 有料Developer Programに加入する、または営業日の直前に再導入する日程を確保
6 価格一覧の出力(A-1)とおしながきの照合を、営業開始前の手順に含める。価格はCSV取り込みで一括登録
7 iPad用スタンドで固定。客へはWoSのInvoice QRを提示する間、画面をWoSに固定する運用を手順化。QR読み取りが不調な場合の代替として、商品パネル・ID手動入力を使用
8 営業前にWoSの表示単位を確認、少額テストで桁を確認。請求額の大型表示と目視照合
9 確認ダイアログ、販売取消、終了時照合
10 通知を許可し、通知が出ない場合は履歴画面を目視確認
11 モバイルバッテリー、営業中の随時充電
12 販売記録(請求sats額・完了日時・確認時刻)を保存済み。円換算基準は税理士・税務署に確認(Q8)
13 1会計1Invoice。再利用しない
14 対策なし。価格設定は店側の決定事項であり、システムでは扱わない
15 最終更新時刻の表示、反映遅延の許容(B-1、B-2)。スナップショットを1キーに保存し、同一キーへの書き込みを1秒に1回以下に抑える(A-14)。連続する変更はまとめて送信する。画像の配信を静的アセットにする、またはキャッシュを使うことで、読み取り・リクエストの消費を抑える(Q15)
16 追加時に金額を大きく表示した確認を挟む(桁の誤りはこの確認で検出する)。カート行に「野良」表示を付ける。誤りは行の削除→再追加で修正。会計前にカート一覧を確認。上限は設けない(確定)
17 野良明細を item_type で区別し、集計で登録商品と分けて表示(A-8)。品名に委託元を記載。終了時に野良分を分けて照合
18 カート画面で行ごとの削除(確認ダイアログあり)、会計前にカート一覧を確認
19 Worker側で書き込み専用の認証を行う。シークレットは端末のセキュア領域に保管。書き込み範囲をスナップショットに限定(画像用の書き込み経路は持たない)。REST API直接書き込みは採用しない。漏えい時は再発行
20 P0で実機検証。復帰時にカメラセッションを再開。復帰しない場合は再起動手順を表示・運用に組み込む
21 営業日の直前に画像を差し替えない日程を確保する。営業前に、商品IDと画像ファイル名の突合を行い、アプリの「画像なしの商品ID一覧」を確認する(A-1)。再導入のタイミングに画像の更新を合わせる

C-3. 署名方式の判断材料

実装はネイティブに確定済み。以下は署名・配布方式の判断材料。

判断項目 無料(Personal Team) 有料(Developer Program)
署名期限 7日 1年
費用 無料 年額99ドルの記載
再導入 営業日の直前に必要 年1回
他の配布手段 未調査 TestFlight等は未調査
共通 macOS+Xcodeが必要 同左

決定は Q3 に基づく。

C-4. WoS構成案

WoS POSの説明:

種類 内容
本体アプリ内の Point of Sale 本体のメインメニューから開く簡易機能。金額を入力するとLightning Invoiceが生成される。日本でPOSの項目が表示されるかは未確認(地域規制で表示が切り替わる旨の記載あり)
専用の WoS POS アプリ 別アプリ。受取専用・ログイン不要。LNURLとNFCのBolt Cardに対応。iPad対応(iPadOS 14以上)。商品選択・カート・端末内の取引履歴を持つ。受取先は店舗用WoSのLightning Address。スタッフに残高を見せずに受取を任せたい場合向け
項目 案1:WoS本体のReceive画面(標準) 案2:WoS POSアプリ(代替)
iPad対応 App Store記載はiPhone専用。iPad導入は伝聞(Q5) App Store記載でiPad対応
金額指定 Receive → Amount/Note で金額入力 → Invoice QR キーパッド入力 → Invoice生成
支払い確認の表示 履歴・通知(Q7) 仕様は未確認
1人運用での利点 追加アプリ不要 スタッフ権限分離の利点は対象外(運用者1人)
本要件での扱い 標準構成 本体がiPadで使えない場合の代替(Q10)。採用する場合は A-6-2・A-6-3 を再整理
  • レジ機能は自作アプリが担う。WoS側は Invoice を表示する画面としてのみ使用する。

C-5. 実装フェーズ

フェーズ 内容 到達状態
P0 技術検証(ネイティブ):QR読み取り、レジ⇄WoS往復後のカメラ復帰、状態復元、再導入後のデータ保持、クリップボードからWoSへの貼り付け、エクスポート、WoS本体のiPad導入と表示、署名方式(無料/有料)の確認、レジ画面の配置・向きの決定(Q16)、OSの接続状態の取得(A-10 #4)、画像同梱ビルドの確認、Cloudflare Worker経由のKV書き込みと実測の反映遅延、同一キーへの書き込み間隔(まとめ送信の間隔)の決定、Workers静的アセットのデプロイと上限の確認 実装方式・構成の決定材料
P1 商品登録(CSV取り込み・再取り込み、円・sats価格、同梱画像、画像なしIDの一覧)、価格一覧出力、QRラベル生成(QR+ID文字)、レジ画面(商品パネル・カート)、QR読み取り、手動入力、野良商品、現金決済、在庫減算、会計中断・商品削除(確認ダイアログ)、会計状態の永続化、PIN、エクスポート、現金の日次集計・現金照合 現金のみで当日運用可能
P2 sats決済(請求sats額表示・コピー、済ボタン確認、sats照合出力)、sats選択可否の判定、WoSの事前確認(A-15、C-2 #1〜3) WoSと組み合わせてsats決済を記録可能
P3 日次集計の整備(sats集計、登録商品/野良の内訳)、販売取消(PIN+確認ダイアログ)、手動在庫調整(PIN) 運用整備
P4 公開Webアプリ(B):Cloudflare Worker+KV(1キー保存)、スナップショット連携(A-14)、画像のデプロイ(PCから。Q15) 付随機能

C-6. 受け入れテスト項目

共通

  1. 機内モードで、P1の全機能(QR読み取り・手動入力・商品パネル・野良追加・カート編集・円/sats合計・画像表示・現金会計・中断・在庫反映)が動作する
  2. レジ→WoS→レジの切替後、sats待ち状態・請求sats額が復元される
  3. レジ→WoS→レジの切替後、カメラ読み取りが再開できる(再開できない場合は再起動手順で復旧できる)
  4. アプリ強制終了・iPad再起動後、スキャン中のカート(野良商品を含む)と完了済み販売・在庫が保持されている
  5. 存在しないIDの手動入力でエラーになり、カートが変化しない
  6. KH-xxxを同一会計で2回追加するとエラーになる
  7. ST-xxxを在庫数を超えて追加するとエラーになる
  8. 会計中断後、在庫・販売記録が変化しない(中断の記録が残らない)
  9. カートの円合計・sats合計が、商品マスタの単価×数量の合計(野良商品は入力値の単価×数量)と一致する(ステッカーの複数枚を含む)
  10. 同梱した商品画像が、追加直後・商品パネル・カートに表示される。画像がない商品は文字表示になる
  11. 価格一覧のCSV出力が、おしながきの円価格・sats価格と一致する
  12. 営業中に登録商品の価格編集の操作が提供されていない。CSV再取り込みはPINなしでは行えない
  13. 現金:受取額 < 請求額で確定できない/お釣りが正しい
  14. sats選択時、請求sats額が大きく表示される
  15. 「sats額をコピー」でWoSの入力欄へ貼り付けられる
  16. WoSの表示単位を確認し、少額のテスト請求で入力した額と表示額の桁が一致する
  17. WoSで Receive → Amount/Note → Invoice QR を作成し、別端末のウォレットで支払うと、WoS履歴に入金が表示される
  18. WoSの最小受取額を確認し、結果を記録する
  19. 会計ごとにInvoiceを新規作成し、以前のInvoiceを再利用していない
  20. 別端末で、バックアップ語によるWoSの復元ができる
  21. WoSの入金通知が表示される(表示されない場合は履歴画面で確認できる)
  22. 機内モードでsats選択が無効化され、現金のみ受付になる。接続状態が「あり」でWoSが使えない場合に、sats待ち画面の「方法選び直し」で現金へ切り替えられる
  23. 済ボタンで完了でき、確認ダイアログを経ずに完了しない
  24. 済ボタン完了後の販売取消で在庫が戻る
  25. 通信不可の状態でBへの送信が失敗しても、会計・在庫は正常に完了する
  26. 通信回復後、KVへのスナップショット送信が成功し、反映遅延の後にBの在庫・円価格・sats価格・最終更新時刻が更新される。反映までの所要時間を複数回計測して記録する
  27. エクスポートしたCSV/JSONの販売合計(現金・sats別)が日次集計と一致する
  28. 表記ゆれ(kh8、全角)で正しい商品が追加される
  29. バッテリー低下(20%以下)時の動作と、充電しながらの運用に問題がない
  30. iPadの自動ロックが無効の状態で、営業想定時間(連続数時間)画面が維持される
  31. 全商品(ステッカー3・キーホルダー20)の画像を同梱したビルドで、起動・スキャンの応答に問題がない。アプリのサイズが許容範囲である
  32. 商品パネルに画像・商品ID・商品名が表示され、タップでカートに追加される(ステッカーは数量+1)
  33. 商品パネルで、在庫0の商品はSOLD OUT表示でタップしても追加されない。カート内のKH-xxxをタップするとエラーになる
  34. カート画面で、追加された商品の一覧が確認でき、行ごとの削除・ステッカーと野良商品の数量増減ができる
  35. レジ画面から、QR読み取り・ID手動入力・商品パネル・野良追加のいずれでも追加できる
  36. 野良商品を、円価格のみ(品名・sats価格なし)で追加でき、現金会計が完了する
  37. sats価格が未入力の野良商品がカートにある場合、sats選択が無効化され理由が表示される。sats価格を入力した野良商品はsats決済に含められる
  38. 野良商品は在庫・stock_movements に影響せず、日次集計で登録商品と分けて表示される。販売取消でも在庫が変化しない
  39. 登録商品と野良商品が混在する会計で、円合計・sats合計が正しい
  40. 各商品のラベルにQRとID文字が印字され、QR読み取りとID手入力の双方で同一商品が追加される
  41. 野良商品の金額入力後に確認表示が出る。誤入力時は行の削除→再追加で修正できる
  42. KVへ送信したスナップショットに、非公開商品・野良商品が含まれず、Bにも表示されない
  43. 認証のない書き込み要求が、Bの受信エンドポイントで拒否される
  44. 同一キーへの連続した変更(短時間に複数回の会計)が、1秒に1回以下の書き込みにまとめられ、書き込みエラーが発生しない
  45. スナップショットが1キーに保存され、Bが全商品を1回の読み取りで表示できる
  46. 送信するスナップショットに画像データ(バイナリ、Base64等)が含まれず、画像関連の項目は has_image のみである。画像の有無にかかわらず、スナップショットのサイズが画像の影響を受けない
  47. 同梱画像のファイル名と商品マスタのIDを突合し、画像なしのID一覧がアプリに表示される。Bへ画像をデプロイした後、has_image が真の全商品について、Bが商品IDから導出した名前で画像を取得できる。画像のない商品は has_image が偽で、Bに文字表示される
  48. 営業中の会計・取消・在庫調整後の送信で、画像の送信・書き込みが発生しない
  49. カート行の削除で確認ダイアログが表示される。キャンセルで行が残る
  50. ステッカー・野良商品の数量を「-」で0にする操作で確認ダイアログが表示される。数量が0にならない増減では表示されない
  51. 会計中断で確認ダイアログが表示される。キャンセルでカート・会計状態が変化しない
  52. 販売取消で、PIN認証の後に確認ダイアログが表示される。キャンセルで在庫・販売記録が変化しない
  53. 野良商品に、大きな円価格(例:7桁)を入力でき、上限エラーが出ない。金額確認表示で桁を確認できる
  54. CSV再取り込み時:既存IDの在庫が変化しない。新規IDは initial で記録される。在庫の上書きを選んだ場合のみ、差分一覧と確認ダイアログを経て adjust で記録される。CSVにない既存商品は変化しない
  55. レジ画面で、商品パネルとカートが同一画面に表示され、カートの操作(追加・削除・数量増減)がそのまま行える。向き(横・縦)を変えても表示が崩れない

ネイティブ

  • N-1. 署名期限(無料なら7日、有料なら1年)の残りを営業日の前に確認し、再導入の手順を実施できる
  • N-2. 機内モードで、導入済みアプリが全機能で動作する
  • N-3. アプリ更新(再導入)後も、端末内の商品マスタ・販売・在庫が保持される。同梱画像は新しいビルドの内容になる
  • N-4. エクスポートがファイルアプリまたは共有シートへ書き出せる
  • N-5. 同梱画像を差し替えて再ビルド・再導入すると、新しい画像が表示される。画像なしのID一覧が更新される

D. 要確認事項

# 質問 影響範囲
Q1 会場でテザリングも含め通信が使えない場合、sats決済を受け付けず現金のみにする運用でよいか A-10
Q2 iPadのモデル(Wi-Fi/Cellular)とiPadOSバージョン A-12、A-16(ビルドの対応OS条件)
Q3 macOS・Xcode環境の有無。有料Developer Programへの加入意向。無料署名(7日失効)で運用できるか A-16、C-3
Q4 エクスポートの外部退避先(クラウド/別端末) A-8
Q5 WoS本体のiPad導入を実機で確認(入手可否、表示、カメラ、通知)。伝聞のため未確認 0、A-12、C-1 #2
Q6 自己管理型WoSで運用してよいか。バックアップ語の保管方法。受取額が増えた場合の退避方法 A-15、C-1 #3
Q7 WoSの入力単位、最小受取額、Invoice取消操作、入金通知の仕様(実機で確認) A-6、C-1 #2、#10
Q8 sats受領額の円換算・記帳方法(税理士・税務署に確認)。円換算に必要な項目(受領時レート等)を保持する要否 A-13、C-1 #12
Q9 開発に使う言語・フレームワークの希望(Swift/Flutter/React Native 等)。QR読み取りにOS標準機能とライブラリのどちらを使うか A-2、A-16
Q10 WoS本体がiPadで使えない場合、WoS POSアプリを代替に使う意向はあるか C-4
Q11 商品画像の用意状況(23点分の撮影済みか、形式・サイズ)。ビルド時に同梱するため、営業日の何日前に画像を確定するか A-1、C-1 #21
Q12 野良商品のsats価格の扱い。任意入力(未入力ならsats決済不可)の仮置きでよいか。野良商品は現金のみとする運用か A-1、A-6-1
Q13 野良商品(他者作品)の集計・精算。委託元別の集計が必要か。必要な場合、委託元名を品名と別に保持するか A-8、A-13、C-1 #17
Q14 書き込み経路をWorker経由の案としてよいか。Cloudflareのプラン(無料/有料)。REST APIの書き込みレート制限の数値(未確認)。旧版資料にある1,000リクエスト/分のバースト制限の現行での有無(未確認)。KVの制限値・反映遅延(60秒以上)、Workers無料プランの上限は調査済み(A-14) A-14、C-1 #15、#19
Q15 Bの画像の配信方式。①Workers静的アセット(サイズ上限・デプロイ手順は未確認)/KVの別キー/R2。②Bの画像をPCからデプロイする運用でよいか(仮置き。アプリから送らない)。③ファイル名・キー名の規則(商品ID.jpg、img:商品ID は仮置き)。④画像の解像度(アプリのサムネイルと同一にするか、Bに適した別サイズを用意するか)。R2のストレージ無料枠(10 GBの記載は第三者資料のみ)は公式での再確認が必要 A-14、B-1、B-3
Q16 レジ画面の配置・向き(横/縦)。商品パネルとカートの同一画面表示でよいか(仮置き)。P0で実機確認して決める A-3
Q17 CSV再取り込み時の在庫の扱い(既存在庫を維持、新規は initial 記録、上書きは明示選択のみ。仮置き)でよいか A-1

E. 調査結果と出典

項目 結果 出典
WoSのモード カストディ型と自己管理型の2モード。自己管理型は全地域、カストディ型は対応地域のみ https://walletofsatoshi.com/
日本での提供 iOSの提供国一覧に日本あり(2024年3月更新の記事)。日本でのカストディ型・POS機能は未確認 https://support.walletofsatoshi.com/en/support/solutions/articles/36000493699-which-countries-is-wallet-of-satoshi-available-in-
受取Invoice作成 Receive → Amount/Note で金額入力 → Invoice QR。最小額・入力単位の記載なし https://support.walletofsatoshi.com/en/support/solutions/articles/36000579025-how-to-send-and-receive-bitcoin-in-the-self-custody-wos-wallet
自己管理型の概要 鍵はユーザーが保持。バックアップ語が復元手段 https://support.walletofsatoshi.com/en/support/solutions/articles/36000578784-what-is-self-custody-and-how-is-it-different-from-classic-wallet-of-satoshi-
WoS本体のiPad対応 App Store記載は iPhone専用(対応:iPhone、Mac(M1以降)、Vision)。更新履歴に通知・POS・表示単位の記載 https://apps.apple.com/au/app/wallet-of-satoshi/id1438599608
本体アプリ内のPOS メインメニューの「Point of Sale」 https://support.walletofsatoshi.com/en/support/solutions/articles/36000507276-how-do-i-open-the-point-of-sale-in-my-wos-wallet-
WoS POSアプリ 受取専用、ログイン不要、iPad対応。アイテム選択・カート・端末内履歴 https://apps.apple.com/au/app/wallet-of-satoshi-pos/id6470433713 、 https://support.walletofsatoshi.com/en/support/solutions/articles/36000564790-dedicated-wos-point-of-sale-app 、 https://www.walletofsatoshi.com/pos
スタッフ向けの利用 POSアプリでは従業員が残高にアクセスせず受取可(解説記事) https://coincharge.io/en/wallet-of-satoshi/
Business API WoSは提供していない https://support.walletofsatoshi.com/en/support/solutions/articles/36000493463-do-you-have-a-business-api-
NWC対応 2024年12月の公式投票・2025年の記事は未対応の趣旨。別資料は対応と記載。現行は未確認 https://x.com/nwc_dev/status/1865191908386988422 、 https://www.nostr-reviews.com/post/965f1ea6bc/ 、 https://www.spark.money/glossary/zap
ウォレット起動(iOS) lightning: 等のスキームは使えるが、どのウォレットが開くかの制御が限られる https://design.voltage.cloud/guide/lightning-wallet-selector
WoS固有スキーム walletofsatoshi: を使う第三者コード(2023年)。請求書を渡す用途 https://gist.github.com/benthecarman/95286e69bf4a420fc398651cba5caa9b
税務 暗号資産で商品を購入した場合は譲渡として所得計算。販売側の直接の設問は目次上なし https://www.nta.go.jp/publication/pamph/pdf/virtual_currency_faq_03.pdf
ネイティブの署名期限 無料(Personal Team)は7日、有料は1年。導入にはmacOSのXcodeが必要。有料は年額99ドルの記載 https://developer.apple.com/forums/thread/712540 、 https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0079/
二重支払い 実装依存。LNDで複数ノードからの支払いが成立した報告 https://github.com/lightningnetwork/lnd/issues/2208
Cloudflare KV の制限(無料) 読み取り1日100,000回。異なるキーへの書き込み1日1,000回。同一キーへの書き込み1秒に1回。値25 MiB、キー512バイト。ストレージ1 GB(アカウント・名前空間ごと) https://developers.cloudflare.com/kv/platform/limits
Cloudflare KV の反映遅延 他の拠点で変更が見えるまで60秒以上かかる場合がある。直近に読んだ拠点では、存在しないことの読み取りを含め、さらに遅れる。上限値の記載なし https://developers.cloudflare.com/kv/concepts/how-kv-works/
Cloudflare KV の REST API Workersバインディング経由より書き込みレート制限が低い。数値は取得できず(未確認) https://developers.cloudflare.com/kv/reference/faq/
Cloudflare API トークン権限 「Workers KV Storage: Edit」を使う記載(第三者資料)。名前空間単位・キー単位の絞り込みは未確認 https://smithery.ai/skills/joaquimcassano/cloudflare-manager 、 https://rhumb.dev/service/cloudflare-kv
Cloudflare Workers の制限(無料) リクエスト1日100,000回、CPU時間10 ms/リクエスト、サブリクエスト50回/リクエスト(KVなど内部サービスは1,000回)。静的アセットへのリクエストは無料・無制限。旧版資料に1,000リクエスト/分のバースト制限の記載(現行では未確認) https://developers.cloudflare.com/workers/platform/limits/ 、 https://developers.cloudflare.com/workers/platform/pricing/ 、 https://developers.cloudflare.com/workers/about/limits
Cloudflare R2 の料金 無料枠:Class A 100万回/月、Class B 1,000万回/月。外部への転送料は無料(公式)。ストレージ10 GBの無料枠は第三者資料のみ(要再確認) https://developers.cloudflare.com/r2/pricing/ 、 https://www.spendbase.co/?p=35561

Write a comment