@xfuel/verify 0.1.0 → 0.1.1
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/README.md +22 -4
- package/dist/base-payer.d.ts +58 -0
- package/dist/base-payer.d.ts.map +1 -0
- package/dist/base-payer.js +178 -0
- package/dist/base-payer.js.map +1 -0
- package/dist/cli.js +38 -3
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +47 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +141 -15
- package/dist/index.js.map +1 -1
- package/dist/jws.d.ts +23 -0
- package/dist/jws.d.ts.map +1 -0
- package/dist/jws.js +59 -0
- package/dist/jws.js.map +1 -0
- package/dist/payer.d.ts +54 -0
- package/dist/payer.d.ts.map +1 -0
- package/dist/payer.js +136 -0
- package/dist/payer.js.map +1 -0
- package/dist/solana-payer.d.ts +99 -0
- package/dist/solana-payer.d.ts.map +1 -0
- package/dist/solana-payer.js +258 -0
- package/dist/solana-payer.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -48,14 +48,32 @@ curl -s https://api.xfuel.app/receipt/task-123?format=json | npx xfuel-verify -
|
|
|
48
48
|
| Check | Requires Network? | Description |
|
|
49
49
|
|-------|-------------------|-------------|
|
|
50
50
|
| Payment binding | No | Recompute commitment from receipt fields |
|
|
51
|
-
| Issuer signature | No | ES256
|
|
51
|
+
| Issuer signature | No | ES256 verification — pinned `issuer_jwk` on receipt, or JWKS file |
|
|
52
52
|
| Output hash | No | Hash is on the receipt |
|
|
53
53
|
| On-chain settlement | Yes | Query Base RPC for tx |
|
|
54
54
|
| Nullifier anchor | Yes | Query ZKVerifierSP1 contract |
|
|
55
55
|
|
|
56
|
-
## Issuer Signature Verification (ES256
|
|
56
|
+
## Issuer Signature Verification (ES256)
|
|
57
57
|
|
|
58
|
-
Receipts
|
|
58
|
+
Receipts include an `issuer_signature` signed with ES256 (P-256). Verify offline:
|
|
59
|
+
|
|
60
|
+
### Pin-first (receipts with `issuer_signature.issuer_jwk`)
|
|
61
|
+
|
|
62
|
+
Newer receipts pin the issuer public key directly in the receipt. No JWKS file needed:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Offline verify — uses pinned issuer_jwk from the receipt
|
|
66
|
+
npx xfuel-verify receipt.json
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
import { verifyReceipt } from '@xfuel/verify';
|
|
71
|
+
|
|
72
|
+
const result = await verifyReceipt(receipt); // no jwks option required
|
|
73
|
+
console.log(result.issuer_signature.valid); // true when signature intact
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Legacy JWKS file (older receipts without pin)
|
|
59
77
|
|
|
60
78
|
```bash
|
|
61
79
|
# Download JWKS once (or obtain from trusted source)
|
|
@@ -65,7 +83,7 @@ curl -o issuer-jwks.json https://api.chit402.com/.well-known/jwks.json
|
|
|
65
83
|
npx xfuel-verify receipt.json --jwks-file issuer-jwks.json
|
|
66
84
|
```
|
|
67
85
|
|
|
68
|
-
The CLI does **not** automatically fetch JWKS to ensure offline verification.
|
|
86
|
+
The CLI does **not** automatically fetch JWKS to ensure offline verification. For pinned receipts, `--jwks-file` is optional. Exit code 1 (failed) is returned if the signature is invalid or tampered.
|
|
69
87
|
|
|
70
88
|
## Frozen Fields
|
|
71
89
|
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Offline Base (EVM) payer verification for Chit402 receipts.
|
|
3
|
+
*
|
|
4
|
+
* When payment.ref starts with `base:` or `eip155:8453:`, read the USDC Transfer
|
|
5
|
+
* event and confirm the sender matches caller_binding.payer_wallet (EIP-3009
|
|
6
|
+
* transferWithAuthorization records `from` as the payer).
|
|
7
|
+
*/
|
|
8
|
+
import { type TransactionReceipt } from 'ethers';
|
|
9
|
+
/** ERC-20 Transfer(address,address,uint256) topic. */
|
|
10
|
+
export declare const ERC20_TRANSFER_TOPIC = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef";
|
|
11
|
+
/** Known USDC contract addresses by network key. */
|
|
12
|
+
export declare const USDC_ADDRESSES: Record<string, string>;
|
|
13
|
+
/** Default Base mainnet RPC. */
|
|
14
|
+
export declare const BASE_RPC_URL = "https://mainnet.base.org";
|
|
15
|
+
export interface BasePayerVerification {
|
|
16
|
+
checked: boolean;
|
|
17
|
+
valid: boolean;
|
|
18
|
+
txHash?: string;
|
|
19
|
+
payerWallet?: string;
|
|
20
|
+
expectedAmount?: string;
|
|
21
|
+
transferredAmount?: string;
|
|
22
|
+
network?: string;
|
|
23
|
+
reason?: string;
|
|
24
|
+
}
|
|
25
|
+
export type BaseReceiptFetcher = (txHash: string, rpcUrl: string) => Promise<TransactionReceipt | null>;
|
|
26
|
+
/**
|
|
27
|
+
* True for a valid EVM address (0x + 40 hex).
|
|
28
|
+
*/
|
|
29
|
+
export declare function isEvmAddress(value: unknown): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Parse Base payment.ref into { network, txHash }.
|
|
32
|
+
* Supports `base:0x…`, `base-sepolia:0x…`, `eip155:8453:0x…`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseBasePaymentRef(paymentRef: string | null | undefined): {
|
|
35
|
+
network: string;
|
|
36
|
+
txHash: string;
|
|
37
|
+
} | null;
|
|
38
|
+
/**
|
|
39
|
+
* Sum USDC Transfer amounts from payer in a transaction receipt.
|
|
40
|
+
*/
|
|
41
|
+
export declare function sumUsdcTransfersFromPayer(receipt: TransactionReceipt, payerWallet: string, usdcAddress: string): bigint;
|
|
42
|
+
/**
|
|
43
|
+
* Default ethers provider fetcher for getTransactionReceipt.
|
|
44
|
+
*/
|
|
45
|
+
export declare function fetchBaseTransactionReceipt(txHash: string, rpcUrl?: string): Promise<TransactionReceipt | null>;
|
|
46
|
+
export interface VerifyBasePayerInput {
|
|
47
|
+
paymentRef: string;
|
|
48
|
+
payerWallet: string;
|
|
49
|
+
grossAmount: string | number | bigint;
|
|
50
|
+
network?: string;
|
|
51
|
+
rpcUrl?: string;
|
|
52
|
+
fetchReceipt?: BaseReceiptFetcher;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Verify caller_binding.payer_wallet against a Base USDC settlement tx.
|
|
56
|
+
*/
|
|
57
|
+
export declare function verifyBasePayer(input: VerifyBasePayerInput): Promise<BasePayerVerification>;
|
|
58
|
+
//# sourceMappingURL=base-payer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-payer.d.ts","sourceRoot":"","sources":["../src/base-payer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAA+B,KAAK,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAE9E,sDAAsD;AACtD,eAAO,MAAM,oBAAoB,uEAAuE,CAAC;AAEzG,oDAAoD;AACpD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKjD,CAAC;AAEF,gCAAgC;AAChC,eAAO,MAAM,YAAY,6BAA6B,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,kBAAkB,GAAG,CAC/B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;AAMxC;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEpD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACpC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA2B5C;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,kBAAkB,EAC3B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,MAAM,CAgBR;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAMpC;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAiFjG"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Offline Base (EVM) payer verification for Chit402 receipts.
|
|
4
|
+
*
|
|
5
|
+
* When payment.ref starts with `base:` or `eip155:8453:`, read the USDC Transfer
|
|
6
|
+
* event and confirm the sender matches caller_binding.payer_wallet (EIP-3009
|
|
7
|
+
* transferWithAuthorization records `from` as the payer).
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.BASE_RPC_URL = exports.USDC_ADDRESSES = exports.ERC20_TRANSFER_TOPIC = void 0;
|
|
11
|
+
exports.isEvmAddress = isEvmAddress;
|
|
12
|
+
exports.parseBasePaymentRef = parseBasePaymentRef;
|
|
13
|
+
exports.sumUsdcTransfersFromPayer = sumUsdcTransfersFromPayer;
|
|
14
|
+
exports.fetchBaseTransactionReceipt = fetchBaseTransactionReceipt;
|
|
15
|
+
exports.verifyBasePayer = verifyBasePayer;
|
|
16
|
+
const ethers_1 = require("ethers");
|
|
17
|
+
/** ERC-20 Transfer(address,address,uint256) topic. */
|
|
18
|
+
exports.ERC20_TRANSFER_TOPIC = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
|
|
19
|
+
/** Known USDC contract addresses by network key. */
|
|
20
|
+
exports.USDC_ADDRESSES = {
|
|
21
|
+
base: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
|
|
22
|
+
'base-sepolia': '0x036CbD53842c5426634e7929541eC2318f3dCF7e',
|
|
23
|
+
'eip155:8453': '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
|
|
24
|
+
'eip155:84532': '0x036CbD53842c5426634e7929541eC2318f3dCF7e',
|
|
25
|
+
};
|
|
26
|
+
/** Default Base mainnet RPC. */
|
|
27
|
+
exports.BASE_RPC_URL = 'https://mainnet.base.org';
|
|
28
|
+
function resolveRpcUrl(override) {
|
|
29
|
+
return override || process.env.BASE_RPC_URL || exports.BASE_RPC_URL;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* True for a valid EVM address (0x + 40 hex).
|
|
33
|
+
*/
|
|
34
|
+
function isEvmAddress(value) {
|
|
35
|
+
return typeof value === 'string' && /^0x[0-9a-fA-F]{40}$/.test(value);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Parse Base payment.ref into { network, txHash }.
|
|
39
|
+
* Supports `base:0x…`, `base-sepolia:0x…`, `eip155:8453:0x…`.
|
|
40
|
+
*/
|
|
41
|
+
function parseBasePaymentRef(paymentRef) {
|
|
42
|
+
if (!paymentRef || typeof paymentRef !== 'string')
|
|
43
|
+
return null;
|
|
44
|
+
const trimmed = paymentRef.trim();
|
|
45
|
+
const lower = trimmed.toLowerCase();
|
|
46
|
+
if (lower.startsWith('eip155:')) {
|
|
47
|
+
const parts = trimmed.split(':');
|
|
48
|
+
if (parts.length < 3)
|
|
49
|
+
return null;
|
|
50
|
+
const txHash = parts.slice(2).join(':');
|
|
51
|
+
if (!/^0x[0-9a-fA-F]{64}$/.test(txHash))
|
|
52
|
+
return null;
|
|
53
|
+
const network = `${parts[0]}:${parts[1]}`.toLowerCase();
|
|
54
|
+
return { network, txHash };
|
|
55
|
+
}
|
|
56
|
+
if (lower.startsWith('base-sepolia:')) {
|
|
57
|
+
const txHash = trimmed.slice('base-sepolia:'.length);
|
|
58
|
+
if (!/^0x[0-9a-fA-F]{64}$/.test(txHash))
|
|
59
|
+
return null;
|
|
60
|
+
return { network: 'base-sepolia', txHash };
|
|
61
|
+
}
|
|
62
|
+
if (lower.startsWith('base:')) {
|
|
63
|
+
const txHash = trimmed.slice('base:'.length);
|
|
64
|
+
if (!/^0x[0-9a-fA-F]{64}$/.test(txHash))
|
|
65
|
+
return null;
|
|
66
|
+
return { network: 'base', txHash };
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Sum USDC Transfer amounts from payer in a transaction receipt.
|
|
72
|
+
*/
|
|
73
|
+
function sumUsdcTransfersFromPayer(receipt, payerWallet, usdcAddress) {
|
|
74
|
+
const expectedFrom = (0, ethers_1.getAddress)(payerWallet).toLowerCase();
|
|
75
|
+
const usdcLower = usdcAddress.toLowerCase();
|
|
76
|
+
let total = 0n;
|
|
77
|
+
for (const log of receipt.logs || []) {
|
|
78
|
+
if (log.address?.toLowerCase() !== usdcLower)
|
|
79
|
+
continue;
|
|
80
|
+
if (log.topics?.[0] !== exports.ERC20_TRANSFER_TOPIC)
|
|
81
|
+
continue;
|
|
82
|
+
if ((log.topics?.length || 0) < 3)
|
|
83
|
+
continue;
|
|
84
|
+
const from = ('0x' + log.topics[1].slice(26)).toLowerCase();
|
|
85
|
+
if (from !== expectedFrom)
|
|
86
|
+
continue;
|
|
87
|
+
total += BigInt(log.data || '0');
|
|
88
|
+
}
|
|
89
|
+
return total;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Default ethers provider fetcher for getTransactionReceipt.
|
|
93
|
+
*/
|
|
94
|
+
async function fetchBaseTransactionReceipt(txHash, rpcUrl) {
|
|
95
|
+
const provider = new ethers_1.JsonRpcProvider(resolveRpcUrl(rpcUrl), undefined, {
|
|
96
|
+
staticNetwork: true,
|
|
97
|
+
batchMaxCount: 1,
|
|
98
|
+
});
|
|
99
|
+
return provider.getTransactionReceipt(txHash);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Verify caller_binding.payer_wallet against a Base USDC settlement tx.
|
|
103
|
+
*/
|
|
104
|
+
async function verifyBasePayer(input) {
|
|
105
|
+
const parsed = parseBasePaymentRef(input.paymentRef);
|
|
106
|
+
if (!parsed) {
|
|
107
|
+
return { checked: false, valid: false, reason: 'not_base_payment_ref' };
|
|
108
|
+
}
|
|
109
|
+
const payerWallet = String(input.payerWallet || '').trim();
|
|
110
|
+
if (!isEvmAddress(payerWallet)) {
|
|
111
|
+
return { checked: false, valid: false, reason: 'invalid_evm_payer_wallet' };
|
|
112
|
+
}
|
|
113
|
+
const expectedAmount = BigInt(String(input.grossAmount ?? '0'));
|
|
114
|
+
if (expectedAmount <= 0n) {
|
|
115
|
+
return { checked: false, valid: false, reason: 'invalid_gross_amount' };
|
|
116
|
+
}
|
|
117
|
+
const network = (input.network || parsed.network).toLowerCase();
|
|
118
|
+
const usdcAddress = exports.USDC_ADDRESSES[network];
|
|
119
|
+
if (!usdcAddress) {
|
|
120
|
+
return { checked: false, valid: false, reason: `unknown_network: ${network}` };
|
|
121
|
+
}
|
|
122
|
+
const fetcher = input.fetchReceipt || fetchBaseTransactionReceipt;
|
|
123
|
+
const rpcUrl = resolveRpcUrl(input.rpcUrl);
|
|
124
|
+
let receipt;
|
|
125
|
+
try {
|
|
126
|
+
receipt = await fetcher(parsed.txHash, rpcUrl);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
return {
|
|
130
|
+
checked: true,
|
|
131
|
+
valid: false,
|
|
132
|
+
txHash: parsed.txHash,
|
|
133
|
+
payerWallet: (0, ethers_1.getAddress)(payerWallet),
|
|
134
|
+
expectedAmount: expectedAmount.toString(),
|
|
135
|
+
network,
|
|
136
|
+
reason: `rpc_error: ${err.message}`,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
if (!receipt) {
|
|
140
|
+
return {
|
|
141
|
+
checked: true,
|
|
142
|
+
valid: false,
|
|
143
|
+
txHash: parsed.txHash,
|
|
144
|
+
payerWallet: (0, ethers_1.getAddress)(payerWallet),
|
|
145
|
+
expectedAmount: expectedAmount.toString(),
|
|
146
|
+
network,
|
|
147
|
+
reason: 'transaction_not_found',
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
if (receipt.status === 0) {
|
|
151
|
+
return {
|
|
152
|
+
checked: true,
|
|
153
|
+
valid: false,
|
|
154
|
+
txHash: parsed.txHash,
|
|
155
|
+
payerWallet: (0, ethers_1.getAddress)(payerWallet),
|
|
156
|
+
expectedAmount: expectedAmount.toString(),
|
|
157
|
+
network,
|
|
158
|
+
reason: 'transaction_reverted',
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const transferred = sumUsdcTransfersFromPayer(receipt, payerWallet, usdcAddress);
|
|
162
|
+
const valid = transferred >= expectedAmount;
|
|
163
|
+
return {
|
|
164
|
+
checked: true,
|
|
165
|
+
valid,
|
|
166
|
+
txHash: parsed.txHash,
|
|
167
|
+
payerWallet: (0, ethers_1.getAddress)(payerWallet),
|
|
168
|
+
expectedAmount: expectedAmount.toString(),
|
|
169
|
+
transferredAmount: transferred.toString(),
|
|
170
|
+
network,
|
|
171
|
+
reason: valid
|
|
172
|
+
? undefined
|
|
173
|
+
: transferred > 0n
|
|
174
|
+
? `transferred_${transferred}_lt_expected_${expectedAmount}`
|
|
175
|
+
: `no_usdc_transfer_from_${(0, ethers_1.getAddress)(payerWallet)}`,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=base-payer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-payer.js","sourceRoot":"","sources":["../src/base-payer.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -33,6 +33,8 @@ Usage:
|
|
|
33
33
|
Options:
|
|
34
34
|
--jwks-file <path> JWKS file for issuer signature verification (no network)
|
|
35
35
|
--check-nullifier Query Base RPC for nullifier anchor (requires network)
|
|
36
|
+
--check-payer Query Base or Solana RPC to confirm payer_wallet on-chain
|
|
37
|
+
--solana-rpc <url> Solana RPC URL (default: https://api.mainnet-beta.solana.com or SOLANA_RPC_URL)
|
|
36
38
|
--rpc <url> Custom RPC URL (default: https://mainnet.base.org)
|
|
37
39
|
--json Output JSON instead of human-readable
|
|
38
40
|
--quiet Only output errors
|
|
@@ -46,9 +48,13 @@ Exit codes:
|
|
|
46
48
|
Network behavior:
|
|
47
49
|
By default, no network requests are made. Network is only used when:
|
|
48
50
|
- --check-nullifier is passed (queries Base RPC for on-chain anchor)
|
|
51
|
+
- --check-payer is passed (queries Base or Solana RPC for USDC settlement)
|
|
49
52
|
|
|
50
|
-
JWKS must be provided as a local file (--jwks-file)
|
|
51
|
-
automatically fetch JWKS from a URL
|
|
53
|
+
JWKS must be provided as a local file (--jwks-file) for legacy receipts without
|
|
54
|
+
issuer_signature.issuer_jwk. The CLI does not automatically fetch JWKS from a URL.
|
|
55
|
+
Pinned receipts (issuer_jwk present) verify offline without --jwks-file.
|
|
56
|
+
|
|
57
|
+
Solana payer verify uses SOLANA_RPC_URL when set, else the public mainnet RPC.
|
|
52
58
|
|
|
53
59
|
Examples:
|
|
54
60
|
# Local binding verification (no network)
|
|
@@ -68,7 +74,9 @@ function parseArgs(args) {
|
|
|
68
74
|
file: null,
|
|
69
75
|
jwksFile: null,
|
|
70
76
|
checkNullifier: false,
|
|
77
|
+
checkPayer: false,
|
|
71
78
|
rpcUrl: null,
|
|
79
|
+
solanaRpcUrl: null,
|
|
72
80
|
json: false,
|
|
73
81
|
quiet: false,
|
|
74
82
|
help: false,
|
|
@@ -81,12 +89,18 @@ function parseArgs(args) {
|
|
|
81
89
|
else if (arg === '--check-nullifier') {
|
|
82
90
|
result.checkNullifier = true;
|
|
83
91
|
}
|
|
92
|
+
else if (arg === '--check-payer') {
|
|
93
|
+
result.checkPayer = true;
|
|
94
|
+
}
|
|
84
95
|
else if (arg === '--jwks-file' && args[i + 1]) {
|
|
85
96
|
result.jwksFile = args[++i];
|
|
86
97
|
}
|
|
87
98
|
else if (arg === '--rpc' && args[i + 1]) {
|
|
88
99
|
result.rpcUrl = args[++i];
|
|
89
100
|
}
|
|
101
|
+
else if (arg === '--solana-rpc' && args[i + 1]) {
|
|
102
|
+
result.solanaRpcUrl = args[++i];
|
|
103
|
+
}
|
|
90
104
|
else if (arg === '--json') {
|
|
91
105
|
result.json = true;
|
|
92
106
|
}
|
|
@@ -151,7 +165,9 @@ async function main() {
|
|
|
151
165
|
const result = await (0, index_js_1.verifyReceipt)(receipt, {
|
|
152
166
|
jwks,
|
|
153
167
|
checkNullifier: args.checkNullifier,
|
|
168
|
+
checkPayer: args.checkPayer,
|
|
154
169
|
rpcUrl: args.rpcUrl || undefined,
|
|
170
|
+
solanaRpcUrl: args.solanaRpcUrl || undefined,
|
|
155
171
|
});
|
|
156
172
|
if (args.json) {
|
|
157
173
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -191,7 +207,26 @@ async function main() {
|
|
|
191
207
|
else {
|
|
192
208
|
console.log(` Status: ${result.issuer_signature.reason || 'Not checked'}`);
|
|
193
209
|
if (receipt.issuer_signature && !args.jwksFile) {
|
|
194
|
-
|
|
210
|
+
const hasPin = receipt.issuer_signature.issuer_jwk && receipt.issuer_signature.jws;
|
|
211
|
+
console.log(hasPin
|
|
212
|
+
? ` (pinned issuer_jwk on receipt — signature verified offline)`
|
|
213
|
+
: ` (receipt has signature — pass --jwks-file to verify)`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
console.log('');
|
|
217
|
+
console.log(` Payer (on-chain)`);
|
|
218
|
+
console.log(` ─────────────────────────────────────────────────`);
|
|
219
|
+
if (result.payer.checked) {
|
|
220
|
+
console.log(` Rail: ${result.payer.rail || '—'}`);
|
|
221
|
+
console.log(` Valid: ${result.payer.valid ? '✓ YES' : '✗ NO'}`);
|
|
222
|
+
if (!result.payer.valid && result.payer.reason) {
|
|
223
|
+
console.log(` Reason: ${result.payer.reason}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
console.log(` Status: ${result.payer.reason || 'Not checked'}`);
|
|
228
|
+
if (receipt.caller_binding?.payer_wallet && receipt.payment?.ref && !args.checkPayer) {
|
|
229
|
+
console.log(` (pass --check-payer to verify on-chain)`);
|
|
195
230
|
}
|
|
196
231
|
}
|
|
197
232
|
console.log('');
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;;;;;GAcG;;AAEH,qCAAuC;AACvC,yCAAwF;AAExF,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,11 +11,13 @@
|
|
|
11
11
|
* See docs/specs/RECEIPT_V2_SEMANTICS.md for the verification algorithm.
|
|
12
12
|
*/
|
|
13
13
|
import { computePaymentCommitment, computeInferenceBinding, type PaymentCommitmentInput, type InferenceBindingInput } from './binding.js';
|
|
14
|
-
|
|
14
|
+
import { verifyBasePayer, parseBasePaymentRef, isEvmAddress, sumUsdcTransfersFromPayer, fetchBaseTransactionReceipt, USDC_ADDRESSES, ERC20_TRANSFER_TOPIC, BASE_RPC_URL, type BasePayerVerification, type BaseReceiptFetcher } from './base-payer.js';
|
|
15
|
+
import { verifySolanaPayer, parseSolanaPaymentRef, isSolanaBase58Pubkey, extractUsdcTransfersFromTx, inferUsdcOutflowFromBalances, fetchSolanaTransaction, SOLANA_RPC_URL, SOLANA_USDC_MINT_MAINNET, SOLANA_USDC_MINT_DEVNET, type SolanaPayerVerification, type SolanaRpcFetcher, type SolanaRpcGetTransactionResult } from './solana-payer.js';
|
|
16
|
+
import { verifyPayerBinding, receiptPayerClaimsFromEnvelope, decodeJwsPayload, type PayerBindingVerification, type ReceiptPayerClaims, type PayerRail } from './payer.js';
|
|
17
|
+
import { resolvePinnedIssuerJwk, verifyIssuerJws } from './jws.js';
|
|
18
|
+
export { computePaymentCommitment, computeInferenceBinding, type PaymentCommitmentInput, type InferenceBindingInput, verifyBasePayer, parseBasePaymentRef, isEvmAddress, sumUsdcTransfersFromPayer, fetchBaseTransactionReceipt, USDC_ADDRESSES, ERC20_TRANSFER_TOPIC, BASE_RPC_URL, type BasePayerVerification, type BaseReceiptFetcher, verifySolanaPayer, parseSolanaPaymentRef, isSolanaBase58Pubkey, extractUsdcTransfersFromTx, inferUsdcOutflowFromBalances, fetchSolanaTransaction, SOLANA_RPC_URL, SOLANA_USDC_MINT_MAINNET, SOLANA_USDC_MINT_DEVNET, type SolanaPayerVerification, type SolanaRpcFetcher, type SolanaRpcGetTransactionResult, verifyPayerBinding, receiptPayerClaimsFromEnvelope, decodeJwsPayload, type PayerBindingVerification, type ReceiptPayerClaims, type PayerRail, };
|
|
15
19
|
/** ZKVerifierSP1 contract on Base mainnet. */
|
|
16
20
|
export declare const ZK_VERIFIER_ADDRESS = "0x9373499645292715a2275A78eD65B14215C41c06";
|
|
17
|
-
/** Default Base mainnet RPC. */
|
|
18
|
-
export declare const BASE_RPC_URL = "https://mainnet.base.org";
|
|
19
21
|
/** Base Sepolia testnet RPC. */
|
|
20
22
|
export declare const BASE_SEPOLIA_RPC_URL = "https://sepolia.base.org";
|
|
21
23
|
/** Chit402 receipt (v2/v3 compatible). */
|
|
@@ -42,7 +44,12 @@ export interface XFuelReceipt {
|
|
|
42
44
|
protocol_fee_bps?: number;
|
|
43
45
|
platform_fee?: string;
|
|
44
46
|
platform_fee_bps?: number;
|
|
47
|
+
asset?: string | null;
|
|
48
|
+
payee?: string | null;
|
|
45
49
|
};
|
|
50
|
+
payment_meta?: {
|
|
51
|
+
network?: string;
|
|
52
|
+
} | null;
|
|
46
53
|
provider_cogs?: {
|
|
47
54
|
actual?: string;
|
|
48
55
|
};
|
|
@@ -73,7 +80,21 @@ export interface XFuelReceipt {
|
|
|
73
80
|
alg?: string;
|
|
74
81
|
value?: string;
|
|
75
82
|
kid?: string;
|
|
83
|
+
jws?: string;
|
|
84
|
+
issuer_jwk?: Es256Jwk;
|
|
85
|
+
payload_version?: number;
|
|
86
|
+
};
|
|
87
|
+
verification?: {
|
|
88
|
+
source_of_truth?: string;
|
|
89
|
+
jwks_uri?: string;
|
|
90
|
+
issuer_jwk_pin?: string;
|
|
91
|
+
offline_key_source?: string;
|
|
76
92
|
};
|
|
93
|
+
caller_binding?: {
|
|
94
|
+
payer_wallet?: string | null;
|
|
95
|
+
agent_pubkey?: string | null;
|
|
96
|
+
api_key_hash?: string | null;
|
|
97
|
+
} | null;
|
|
77
98
|
}
|
|
78
99
|
/** JWK public key for ES256 verification. */
|
|
79
100
|
export interface Es256Jwk {
|
|
@@ -114,10 +135,17 @@ export interface NullifierVerification {
|
|
|
114
135
|
anchored: boolean | null;
|
|
115
136
|
reason?: string;
|
|
116
137
|
}
|
|
138
|
+
export interface PayerVerification {
|
|
139
|
+
checked: boolean;
|
|
140
|
+
valid: boolean;
|
|
141
|
+
rail?: PayerRail;
|
|
142
|
+
reason?: string;
|
|
143
|
+
}
|
|
117
144
|
export interface ReceiptVerification {
|
|
118
145
|
receipt_id: string;
|
|
119
146
|
binding: BindingVerification;
|
|
120
147
|
issuer_signature: IssuerSignatureVerification;
|
|
148
|
+
payer: PayerVerification;
|
|
121
149
|
nullifier: NullifierVerification;
|
|
122
150
|
output_hash: string | null;
|
|
123
151
|
hub: string | null;
|
|
@@ -203,18 +231,33 @@ export declare function hashCanonicalPayload(receipt: XFuelReceipt): string;
|
|
|
203
231
|
* @param options.checkNullifier Whether to verify nullifier on-chain (requires network)
|
|
204
232
|
* @param options.rpcUrl RPC URL for on-chain checks
|
|
205
233
|
*/
|
|
234
|
+
/** Extract JWS claims for payer binding when present. */
|
|
235
|
+
export declare function receiptPayerClaims(receipt: XFuelReceipt): ReceiptPayerClaims;
|
|
206
236
|
export declare function verifyReceipt(receipt: XFuelReceipt, options?: {
|
|
207
237
|
jwks?: Jwks;
|
|
208
238
|
checkNullifier?: boolean;
|
|
239
|
+
checkPayer?: boolean;
|
|
209
240
|
rpcUrl?: string;
|
|
241
|
+
solanaRpcUrl?: string;
|
|
210
242
|
verifierAddress?: string;
|
|
243
|
+
fetchSolanaTransaction?: SolanaRpcFetcher;
|
|
244
|
+
fetchBaseReceipt?: BaseReceiptFetcher;
|
|
211
245
|
}): Promise<ReceiptVerification>;
|
|
246
|
+
export { resolvePinnedIssuerJwk, verifyIssuerJws, } from './jws.js';
|
|
212
247
|
declare const _default: {
|
|
213
248
|
verifyBinding: typeof verifyBinding;
|
|
214
249
|
verifyIssuerSignature: typeof verifyIssuerSignature;
|
|
215
250
|
verifyIssuerSignatureWithJwks: typeof verifyIssuerSignatureWithJwks;
|
|
251
|
+
verifyIssuerJws: typeof verifyIssuerJws;
|
|
252
|
+
resolvePinnedIssuerJwk: typeof resolvePinnedIssuerJwk;
|
|
216
253
|
verifyNullifier: typeof verifyNullifier;
|
|
254
|
+
verifyPayerBinding: typeof verifyPayerBinding;
|
|
255
|
+
verifySolanaPayer: typeof verifySolanaPayer;
|
|
256
|
+
verifyBasePayer: typeof verifyBasePayer;
|
|
217
257
|
verifyReceipt: typeof verifyReceipt;
|
|
258
|
+
receiptPayerClaims: typeof receiptPayerClaims;
|
|
259
|
+
receiptPayerClaimsFromEnvelope: typeof receiptPayerClaimsFromEnvelope;
|
|
260
|
+
decodeJwsPayload: typeof decodeJwsPayload;
|
|
218
261
|
computePaymentCommitment: typeof computePaymentCommitment;
|
|
219
262
|
computeInferenceBinding: typeof computeInferenceBinding;
|
|
220
263
|
canonicalIssuerPayload: typeof canonicalIssuerPayload;
|
|
@@ -223,6 +266,7 @@ declare const _default: {
|
|
|
223
266
|
ZK_VERIFIER_ADDRESS: string;
|
|
224
267
|
BASE_RPC_URL: string;
|
|
225
268
|
BASE_SEPOLIA_RPC_URL: string;
|
|
269
|
+
SOLANA_RPC_URL: string;
|
|
226
270
|
};
|
|
227
271
|
export default _default;
|
|
228
272
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|