nodpay 0.2.40 → 0.2.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodpay",
3
- "version": "0.2.40",
3
+ "version": "0.2.41",
4
4
  "description": "NodPay CLI — propose on-chain payments from agent-human shared wallets",
5
5
  "type": "module",
6
6
  "bin": {
@@ -113,6 +113,18 @@ if (_remoteWalletUrl) {
113
113
  }
114
114
  AGENT_ADDRESS = wallets[0].agentSigner;
115
115
 
116
+ // remote_wallet: extract passkey/recovery from wallet data for approvalContext
117
+ // (CLI args take precedence if provided, but agents in remote_wallet mode don't pass them)
118
+ const rw = wallets[0];
119
+ if (!passkeyX && rw.humanSignerPasskeyX) {
120
+ passkeyX = rw.humanSignerPasskeyX;
121
+ passkeyY = rw.humanSignerPasskeyY;
122
+ isPasskey = true;
123
+ }
124
+ if (!recoverySigner && rw.recoverySigner) {
125
+ recoverySigner = rw.recoverySigner;
126
+ }
127
+
116
128
  signHash = async (hash) => {
117
129
  const signRes = await fetch(`${_remoteWalletUrl.replace(/\/$/, '')}/sign`, {
118
130
  method: 'POST',
@@ -159,12 +171,12 @@ const humanSigner = getArg('--human-signer-eoa');
159
171
  const salt = getArg('--salt') || '1001';
160
172
 
161
173
  // Passkey support
162
- const passkeyX = getArg('--human-signer-passkey-x');
163
- const passkeyY = getArg('--human-signer-passkey-y');
174
+ let passkeyX = getArg('--human-signer-passkey-x');
175
+ let passkeyY = getArg('--human-signer-passkey-y');
164
176
  const passkeyRawId = getArg('--passkey-raw-id');
165
177
  const passkeyVerifier = getArg('--passkey-verifier') || '0x445a0683e494ea0c5AF3E83c5159fBE47Cf9e765';
166
- const recoverySigner = getArg('--recovery-signer');
167
- const isPasskey = !!(passkeyX && passkeyY);
178
+ let recoverySigner = getArg('--recovery-signer');
179
+ let isPasskey = !!(passkeyX && passkeyY);
168
180
 
169
181
  // remote_wallet + --human-signer-eoa is not supported
170
182
  if (_remoteWalletUrl && humanSigner) {
@@ -582,8 +594,28 @@ try {
582
594
  writeFileSync(join(PENDING_DIR, `4337-${shortId}.json`), JSON.stringify(result, null, 2));
583
595
 
584
596
  // Store to op-store API for hash-based web app lookup
585
- // NOTE: signerType intentionally NOT sent it's determined by user's browser
586
- // (localStorage), not by agent. See ARCHITECTURE.md Client Verification Chain.
597
+ // Build approvalContext: server-side approval context (replaces localStorage dependency)
598
+ const approvalContext = isPasskey
599
+ ? {
600
+ version: 1,
601
+ signerType: 'passkey',
602
+ rpId: walletRpId || 'nodpay.ai',
603
+ passkeyX,
604
+ passkeyY,
605
+ recoveryAddress: recoverySigner || null,
606
+ safeAddress,
607
+ chainId: parseInt(CHAIN_ID, 10),
608
+ }
609
+ : humanSigner
610
+ ? {
611
+ version: 1,
612
+ signerType: 'eoa',
613
+ humanSignerAddress: humanSigner,
614
+ safeAddress,
615
+ chainId: parseInt(CHAIN_ID, 10),
616
+ }
617
+ : null;
618
+
587
619
  const storePayload = {
588
620
  safeOperationJson,
589
621
  userOpHash: entryPointUserOpHash,
@@ -596,10 +628,12 @@ try {
596
628
  agent: AGENT_ADDRESS,
597
629
  agentSignature: safeOperationJson.signatures,
598
630
  createdAt: new Date().toISOString(),
599
- // SafeClaw integration: passkey coordinates + recovery for approve page fallback
631
+ // Legacy fields (kept for URL-param fallback during transition)
600
632
  passkeyX: passkeyX || null,
601
633
  passkeyY: passkeyY || null,
602
634
  recoveryAddress: recoverySigner || null,
635
+ // Server-side approval context
636
+ approvalContext,
603
637
  };
604
638
 
605
639
  // Extract raw agent signature for server auth