s402 0.2.0 → 0.2.2

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.
@@ -0,0 +1,259 @@
1
+ [
2
+ {
3
+ "description": "x402 V1 flat format → s402",
4
+ "input": {
5
+ "x402Version": 1,
6
+ "scheme": "exact",
7
+ "network": "sui:mainnet",
8
+ "asset": "0x2::sui::SUI",
9
+ "amount": "1000000",
10
+ "payTo": "0xrecipient123",
11
+ "maxTimeoutSeconds": 60
12
+ },
13
+ "expected": {
14
+ "s402Version": "1",
15
+ "accepts": [
16
+ "exact"
17
+ ],
18
+ "network": "sui:mainnet",
19
+ "asset": "0x2::sui::SUI",
20
+ "amount": "1000000",
21
+ "payTo": "0xrecipient123"
22
+ },
23
+ "shouldReject": false
24
+ },
25
+ {
26
+ "description": "x402 V2 envelope (single offer) → s402",
27
+ "input": {
28
+ "x402Version": 2,
29
+ "accepts": [
30
+ {
31
+ "scheme": "exact",
32
+ "network": "sui:mainnet",
33
+ "asset": "0x2::sui::SUI",
34
+ "amount": "2000000",
35
+ "payTo": "0xrecipient456"
36
+ }
37
+ ]
38
+ },
39
+ "expected": {
40
+ "s402Version": "1",
41
+ "accepts": [
42
+ "exact"
43
+ ],
44
+ "network": "sui:mainnet",
45
+ "asset": "0x2::sui::SUI",
46
+ "amount": "2000000",
47
+ "payTo": "0xrecipient456"
48
+ },
49
+ "shouldReject": false
50
+ },
51
+ {
52
+ "description": "x402 V2 envelope (multiple offers) → s402 (first offer taken)",
53
+ "input": {
54
+ "x402Version": 2,
55
+ "accepts": [
56
+ {
57
+ "scheme": "exact",
58
+ "network": "sui:mainnet",
59
+ "asset": "0x2::sui::SUI",
60
+ "amount": "1000000",
61
+ "payTo": "0xrecipientFirst"
62
+ },
63
+ {
64
+ "scheme": "exact",
65
+ "network": "eip155:8453",
66
+ "asset": "USDC",
67
+ "amount": "500000",
68
+ "payTo": "0xrecipientSecond"
69
+ }
70
+ ]
71
+ },
72
+ "expected": {
73
+ "s402Version": "1",
74
+ "accepts": [
75
+ "exact"
76
+ ],
77
+ "network": "sui:mainnet",
78
+ "asset": "0x2::sui::SUI",
79
+ "amount": "1000000",
80
+ "payTo": "0xrecipientFirst"
81
+ },
82
+ "shouldReject": false
83
+ },
84
+ {
85
+ "description": "x402 V1 with maxAmountRequired → amount",
86
+ "input": {
87
+ "x402Version": 1,
88
+ "scheme": "exact",
89
+ "network": "eip155:8453",
90
+ "asset": "USDC",
91
+ "maxAmountRequired": "7500000",
92
+ "payTo": "0xethRecipient"
93
+ },
94
+ "expected": {
95
+ "s402Version": "1",
96
+ "accepts": [
97
+ "exact"
98
+ ],
99
+ "network": "eip155:8453",
100
+ "asset": "USDC",
101
+ "amount": "7500000",
102
+ "payTo": "0xethRecipient"
103
+ },
104
+ "shouldReject": false
105
+ },
106
+ {
107
+ "description": "Native s402 passed through unchanged",
108
+ "input": {
109
+ "s402Version": "1",
110
+ "accepts": [
111
+ "exact"
112
+ ],
113
+ "network": "sui:mainnet",
114
+ "asset": "0x2::sui::SUI",
115
+ "amount": "1000000",
116
+ "payTo": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890"
117
+ },
118
+ "expected": {
119
+ "s402Version": "1",
120
+ "accepts": [
121
+ "exact"
122
+ ],
123
+ "network": "sui:mainnet",
124
+ "asset": "0x2::sui::SUI",
125
+ "amount": "1000000",
126
+ "payTo": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890"
127
+ },
128
+ "shouldReject": false
129
+ },
130
+ {
131
+ "description": "x402 V1 with extra unknown fields (stripped)",
132
+ "input": {
133
+ "x402Version": 1,
134
+ "scheme": "exact",
135
+ "network": "sui:mainnet",
136
+ "asset": "0x2::sui::SUI",
137
+ "amount": "1000000",
138
+ "payTo": "0xrecipient789",
139
+ "unknownField": "should be stripped",
140
+ "anotherRandom": 42
141
+ },
142
+ "expected": {
143
+ "s402Version": "1",
144
+ "accepts": [
145
+ "exact"
146
+ ],
147
+ "network": "sui:mainnet",
148
+ "asset": "0x2::sui::SUI",
149
+ "amount": "1000000",
150
+ "payTo": "0xrecipient789"
151
+ },
152
+ "shouldReject": false
153
+ },
154
+ {
155
+ "description": "x402 with facilitatorUrl (SSRF-safe HTTPS)",
156
+ "input": {
157
+ "x402Version": 1,
158
+ "scheme": "exact",
159
+ "network": "sui:mainnet",
160
+ "asset": "0x2::sui::SUI",
161
+ "amount": "1000000",
162
+ "payTo": "0xrecipientUrl",
163
+ "facilitatorUrl": "https://safe-facilitator.example.com/settle"
164
+ },
165
+ "expected": {
166
+ "s402Version": "1",
167
+ "accepts": [
168
+ "exact"
169
+ ],
170
+ "network": "sui:mainnet",
171
+ "asset": "0x2::sui::SUI",
172
+ "amount": "1000000",
173
+ "payTo": "0xrecipientUrl",
174
+ "facilitatorUrl": "https://safe-facilitator.example.com/settle"
175
+ },
176
+ "shouldReject": false
177
+ },
178
+ {
179
+ "description": "x402 V1 with both amount and maxAmountRequired (amount wins)",
180
+ "input": {
181
+ "x402Version": 1,
182
+ "scheme": "exact",
183
+ "network": "sui:mainnet",
184
+ "asset": "0x2::sui::SUI",
185
+ "amount": "2000000",
186
+ "maxAmountRequired": "1000000",
187
+ "payTo": "0xrecipientBoth"
188
+ },
189
+ "expected": {
190
+ "s402Version": "1",
191
+ "accepts": [
192
+ "exact"
193
+ ],
194
+ "network": "sui:mainnet",
195
+ "asset": "0x2::sui::SUI",
196
+ "amount": "2000000",
197
+ "payTo": "0xrecipientBoth"
198
+ },
199
+ "shouldReject": false
200
+ },
201
+ {
202
+ "description": "x402 V2 envelope with resource metadata",
203
+ "input": {
204
+ "x402Version": 2,
205
+ "accepts": [
206
+ {
207
+ "scheme": "exact",
208
+ "network": "sui:mainnet",
209
+ "asset": "0x2::sui::SUI",
210
+ "amount": "3000000",
211
+ "payTo": "0xrecipientRes"
212
+ }
213
+ ],
214
+ "resource": {
215
+ "url": "https://api.example.com/data",
216
+ "mimeType": "application/json"
217
+ }
218
+ },
219
+ "expected": {
220
+ "s402Version": "1",
221
+ "accepts": [
222
+ "exact"
223
+ ],
224
+ "network": "sui:mainnet",
225
+ "asset": "0x2::sui::SUI",
226
+ "amount": "3000000",
227
+ "payTo": "0xrecipientRes"
228
+ },
229
+ "shouldReject": false
230
+ },
231
+ {
232
+ "description": "x402 V1 with extensions preserved",
233
+ "input": {
234
+ "x402Version": 1,
235
+ "scheme": "exact",
236
+ "network": "sui:mainnet",
237
+ "asset": "0x2::sui::SUI",
238
+ "amount": "1000000",
239
+ "payTo": "0xrecipientExt",
240
+ "extensions": {
241
+ "custom": "data"
242
+ }
243
+ },
244
+ "expected": {
245
+ "s402Version": "1",
246
+ "accepts": [
247
+ "exact"
248
+ ],
249
+ "network": "sui:mainnet",
250
+ "asset": "0x2::sui::SUI",
251
+ "amount": "1000000",
252
+ "payTo": "0xrecipientExt",
253
+ "extensions": {
254
+ "custom": "data"
255
+ }
256
+ },
257
+ "shouldReject": false
258
+ }
259
+ ]
@@ -0,0 +1,110 @@
1
+ [
2
+ {
3
+ "description": "Decode minimal exact payload",
4
+ "input": {
5
+ "header": "eyJzNDAyVmVyc2lvbiI6IjEiLCJzY2hlbWUiOiJleGFjdCIsInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJkSGhmWW5sMFpYTT0iLCJzaWduYXR1cmUiOiJjMmxuWDJKNWRHVnoifX0="
6
+ },
7
+ "expected": {
8
+ "s402Version": "1",
9
+ "scheme": "exact",
10
+ "payload": {
11
+ "transaction": "dHhfYnl0ZXM=",
12
+ "signature": "c2lnX2J5dGVz"
13
+ }
14
+ },
15
+ "shouldReject": false
16
+ },
17
+ {
18
+ "description": "Decode prepaid payload",
19
+ "input": {
20
+ "header": "eyJzNDAyVmVyc2lvbiI6IjEiLCJzY2hlbWUiOiJwcmVwYWlkIiwicGF5bG9hZCI6eyJ0cmFuc2FjdGlvbiI6ImRIaGZZbmwwWlhNPSIsInNpZ25hdHVyZSI6ImMybG5YMko1ZEdWeiIsInJhdGVQZXJDYWxsIjoiNTAwMCIsIm1heENhbGxzIjoiMTAwIn19"
21
+ },
22
+ "expected": {
23
+ "s402Version": "1",
24
+ "scheme": "prepaid",
25
+ "payload": {
26
+ "transaction": "dHhfYnl0ZXM=",
27
+ "signature": "c2lnX2J5dGVz",
28
+ "ratePerCall": "5000",
29
+ "maxCalls": "100"
30
+ }
31
+ },
32
+ "shouldReject": false
33
+ },
34
+ {
35
+ "description": "Decode unlock payload",
36
+ "input": {
37
+ "header": "eyJzNDAyVmVyc2lvbiI6IjEiLCJzY2hlbWUiOiJ1bmxvY2siLCJwYXlsb2FkIjp7InRyYW5zYWN0aW9uIjoiZFc1c2IyTnJYM1I0Iiwic2lnbmF0dXJlIjoiZFc1c2IyTnJYM05wWnc9PSIsImVuY3J5cHRpb25JZCI6ImVuYy1hYmMtMTIzIn19"
38
+ },
39
+ "expected": {
40
+ "s402Version": "1",
41
+ "scheme": "unlock",
42
+ "payload": {
43
+ "transaction": "dW5sb2NrX3R4",
44
+ "signature": "dW5sb2NrX3NpZw==",
45
+ "encryptionId": "enc-abc-123"
46
+ }
47
+ },
48
+ "shouldReject": false
49
+ },
50
+ {
51
+ "description": "Decode stream payload",
52
+ "input": {
53
+ "header": "eyJzNDAyVmVyc2lvbiI6IjEiLCJzY2hlbWUiOiJzdHJlYW0iLCJwYXlsb2FkIjp7InRyYW5zYWN0aW9uIjoiYzNSeVpXRnRYM1I0Iiwic2lnbmF0dXJlIjoiYzNSeVpXRnRYM05wWnc9PSJ9fQ=="
54
+ },
55
+ "expected": {
56
+ "s402Version": "1",
57
+ "scheme": "stream",
58
+ "payload": {
59
+ "transaction": "c3RyZWFtX3R4",
60
+ "signature": "c3RyZWFtX3NpZw=="
61
+ }
62
+ },
63
+ "shouldReject": false
64
+ },
65
+ {
66
+ "description": "Decode escrow payload",
67
+ "input": {
68
+ "header": "eyJzNDAyVmVyc2lvbiI6IjEiLCJzY2hlbWUiOiJlc2Nyb3ciLCJwYXlsb2FkIjp7InRyYW5zYWN0aW9uIjoiWlhOamNtOTNYM1I0Iiwic2lnbmF0dXJlIjoiWlhOamNtOTNYM05wWnc9PSJ9fQ=="
69
+ },
70
+ "expected": {
71
+ "s402Version": "1",
72
+ "scheme": "escrow",
73
+ "payload": {
74
+ "transaction": "ZXNjcm93X3R4",
75
+ "signature": "ZXNjcm93X3NpZw=="
76
+ }
77
+ },
78
+ "shouldReject": false
79
+ },
80
+ {
81
+ "description": "Decode large transaction",
82
+ "input": {
83
+ "header": "eyJzNDAyVmVyc2lvbiI6IjEiLCJzY2hlbWUiOiJleGFjdCIsInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIiwic2lnbmF0dXJlIjoiQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkIifX0="
84
+ },
85
+ "expected": {
86
+ "s402Version": "1",
87
+ "scheme": "exact",
88
+ "payload": {
89
+ "transaction": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
90
+ "signature": "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
91
+ }
92
+ },
93
+ "shouldReject": false
94
+ },
95
+ {
96
+ "description": "Decode strips unknown top-level keys from payload",
97
+ "input": {
98
+ "header": "eyJzNDAyVmVyc2lvbiI6IjEiLCJzY2hlbWUiOiJleGFjdCIsInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJkSGhmWW5sMFpYTT0iLCJzaWduYXR1cmUiOiJjMmxuWDJKNWRHVnoifSwidW5rbm93blRvcExldmVsIjoic2hvdWxkIGJlIHN0cmlwcGVkIiwieDQwMlZlcnNpb24iOjF9"
99
+ },
100
+ "expected": {
101
+ "s402Version": "1",
102
+ "scheme": "exact",
103
+ "payload": {
104
+ "transaction": "dHhfYnl0ZXM=",
105
+ "signature": "c2lnX2J5dGVz"
106
+ }
107
+ },
108
+ "shouldReject": false
109
+ }
110
+ ]
@@ -0,0 +1,127 @@
1
+ [
2
+ {
3
+ "description": "Minimal exact payload",
4
+ "input": {
5
+ "s402Version": "1",
6
+ "scheme": "exact",
7
+ "payload": {
8
+ "transaction": "dHhfYnl0ZXM=",
9
+ "signature": "c2lnX2J5dGVz"
10
+ }
11
+ },
12
+ "expected": {
13
+ "header": "eyJzNDAyVmVyc2lvbiI6IjEiLCJzY2hlbWUiOiJleGFjdCIsInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJkSGhmWW5sMFpYTT0iLCJzaWduYXR1cmUiOiJjMmxuWDJKNWRHVnoifX0="
14
+ },
15
+ "shouldReject": false
16
+ },
17
+ {
18
+ "description": "Prepaid payload with ratePerCall",
19
+ "input": {
20
+ "s402Version": "1",
21
+ "scheme": "prepaid",
22
+ "payload": {
23
+ "transaction": "dHhfYnl0ZXM=",
24
+ "signature": "c2lnX2J5dGVz",
25
+ "ratePerCall": "5000",
26
+ "maxCalls": "100"
27
+ }
28
+ },
29
+ "expected": {
30
+ "header": "eyJzNDAyVmVyc2lvbiI6IjEiLCJzY2hlbWUiOiJwcmVwYWlkIiwicGF5bG9hZCI6eyJ0cmFuc2FjdGlvbiI6ImRIaGZZbmwwWlhNPSIsInNpZ25hdHVyZSI6ImMybG5YMko1ZEdWeiIsInJhdGVQZXJDYWxsIjoiNTAwMCIsIm1heENhbGxzIjoiMTAwIn19"
31
+ },
32
+ "shouldReject": false
33
+ },
34
+ {
35
+ "description": "Stream payload",
36
+ "input": {
37
+ "s402Version": "1",
38
+ "scheme": "stream",
39
+ "payload": {
40
+ "transaction": "c3RyZWFtX3R4",
41
+ "signature": "c3RyZWFtX3NpZw=="
42
+ }
43
+ },
44
+ "expected": {
45
+ "header": "eyJzNDAyVmVyc2lvbiI6IjEiLCJzY2hlbWUiOiJzdHJlYW0iLCJwYXlsb2FkIjp7InRyYW5zYWN0aW9uIjoiYzNSeVpXRnRYM1I0Iiwic2lnbmF0dXJlIjoiYzNSeVpXRnRYM05wWnc9PSJ9fQ=="
46
+ },
47
+ "shouldReject": false
48
+ },
49
+ {
50
+ "description": "Escrow payload",
51
+ "input": {
52
+ "s402Version": "1",
53
+ "scheme": "escrow",
54
+ "payload": {
55
+ "transaction": "ZXNjcm93X3R4",
56
+ "signature": "ZXNjcm93X3NpZw=="
57
+ }
58
+ },
59
+ "expected": {
60
+ "header": "eyJzNDAyVmVyc2lvbiI6IjEiLCJzY2hlbWUiOiJlc2Nyb3ciLCJwYXlsb2FkIjp7InRyYW5zYWN0aW9uIjoiWlhOamNtOTNYM1I0Iiwic2lnbmF0dXJlIjoiWlhOamNtOTNYM05wWnc9PSJ9fQ=="
61
+ },
62
+ "shouldReject": false
63
+ },
64
+ {
65
+ "description": "Unlock payload with encryptionId",
66
+ "input": {
67
+ "s402Version": "1",
68
+ "scheme": "unlock",
69
+ "payload": {
70
+ "transaction": "dW5sb2NrX3R4",
71
+ "signature": "dW5sb2NrX3NpZw==",
72
+ "encryptionId": "enc-abc-123"
73
+ }
74
+ },
75
+ "expected": {
76
+ "header": "eyJzNDAyVmVyc2lvbiI6IjEiLCJzY2hlbWUiOiJ1bmxvY2siLCJwYXlsb2FkIjp7InRyYW5zYWN0aW9uIjoiZFc1c2IyTnJYM1I0Iiwic2lnbmF0dXJlIjoiZFc1c2IyTnJYM05wWnc9PSIsImVuY3J5cHRpb25JZCI6ImVuYy1hYmMtMTIzIn19"
77
+ },
78
+ "shouldReject": false
79
+ },
80
+ {
81
+ "description": "Payload with extra x402Version field (encoded but stripped on decode)",
82
+ "input": {
83
+ "s402Version": "1",
84
+ "scheme": "exact",
85
+ "payload": {
86
+ "transaction": "dHhfYnl0ZXM=",
87
+ "signature": "c2lnX2J5dGVz"
88
+ },
89
+ "x402Version": 1
90
+ },
91
+ "expected": {
92
+ "header": "eyJzNDAyVmVyc2lvbiI6IjEiLCJzY2hlbWUiOiJleGFjdCIsInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJkSGhmWW5sMFpYTT0iLCJzaWduYXR1cmUiOiJjMmxuWDJKNWRHVnoifSwieDQwMlZlcnNpb24iOjF9"
93
+ },
94
+ "shouldReject": false
95
+ },
96
+ {
97
+ "description": "Large transaction bytes (base64)",
98
+ "input": {
99
+ "s402Version": "1",
100
+ "scheme": "exact",
101
+ "payload": {
102
+ "transaction": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
103
+ "signature": "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
104
+ }
105
+ },
106
+ "expected": {
107
+ "header": "eyJzNDAyVmVyc2lvbiI6IjEiLCJzY2hlbWUiOiJleGFjdCIsInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIiwic2lnbmF0dXJlIjoiQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkIifX0="
108
+ },
109
+ "shouldReject": false
110
+ },
111
+ {
112
+ "description": "Prepaid payload with ratePerCall only (no maxCalls)",
113
+ "input": {
114
+ "s402Version": "1",
115
+ "scheme": "prepaid",
116
+ "payload": {
117
+ "transaction": "cHJlcGFpZF90eA==",
118
+ "signature": "cHJlcGFpZF9zaWc=",
119
+ "ratePerCall": "10000"
120
+ }
121
+ },
122
+ "expected": {
123
+ "header": "eyJzNDAyVmVyc2lvbiI6IjEiLCJzY2hlbWUiOiJwcmVwYWlkIiwicGF5bG9hZCI6eyJ0cmFuc2FjdGlvbiI6ImNISmxjR0ZwWkY5MGVBPT0iLCJzaWduYXR1cmUiOiJjSEpsY0dGcFpGOXphV2M9IiwicmF0ZVBlckNhbGwiOiIxMDAwMCJ9fQ=="
124
+ },
125
+ "shouldReject": false
126
+ }
127
+ ]