twzrd-x402-gate 0.6.0 → 0.7.0
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 +56 -4
- package/bin/twzrd-safe-fetch.js +0 -0
- package/dist/decision-token.d.ts +18 -0
- package/dist/decision-token.d.ts.map +1 -1
- package/dist/decision-token.js +99 -1
- package/dist/decision-token.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/intelligence.d.ts +51 -0
- package/dist/intelligence.d.ts.map +1 -0
- package/dist/intelligence.js +119 -0
- package/dist/intelligence.js.map +1 -0
- package/dist/intent-adapters.d.ts +6 -0
- package/dist/intent-adapters.d.ts.map +1 -1
- package/dist/intent-adapters.js +20 -3
- package/dist/intent-adapters.js.map +1 -1
- package/dist/mpp-hook.d.ts +205 -0
- package/dist/mpp-hook.d.ts.map +1 -0
- package/dist/mpp-hook.js +336 -0
- package/dist/mpp-hook.js.map +1 -0
- package/dist/x402-client-hook.d.ts +34 -10
- package/dist/x402-client-hook.d.ts.map +1 -1
- package/dist/x402-client-hook.js +31 -27
- package/dist/x402-client-hook.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -172,13 +172,65 @@ installTwzrdX402ClientHook(client, {
|
|
|
172
172
|
legacy preflight allowed; it never loosens a legacy denial.
|
|
173
173
|
- **Opt-in:** with `paymentControl` unset the hook behaves exactly as before.
|
|
174
174
|
- x402 wire amounts (USDC micro units) are converted to the decimal USD the
|
|
175
|
-
runtime expects
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
a follow-up.)
|
|
175
|
+
runtime expects by `x402RequirementsToIntent` (`decimals` defaults to 6;
|
|
176
|
+
override via the intent context for other assets), so amount-based policies
|
|
177
|
+
are not mis-scaled.
|
|
179
178
|
- Hook binding test:
|
|
180
179
|
[`test/intent-binding.test.ts`](./test/intent-binding.test.ts).
|
|
181
180
|
|
|
181
|
+
### On MPP (Machine Payments Protocol) — Solana charge only
|
|
182
|
+
|
|
183
|
+
`createTwzrdMppOnChallenge` guards `Mppx.create({ onChallenge })`. The mppx
|
|
184
|
+
Solana method signs AND broadcasts the transaction inside `createCredential()`,
|
|
185
|
+
so `onChallenge` is the last deterministic checkpoint before money moves - and
|
|
186
|
+
mppx re-throws `onChallenge` errors, so a TWZRD block is an exception that means
|
|
187
|
+
**`createCredential()` never runs and nothing signs**. On allow, the guard
|
|
188
|
+
creates the credential for the exact challenge it evaluated; non-`solana/charge`
|
|
189
|
+
challenges fail closed (`allowUnevaluated: true` to opt out).
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
import { Mppx } from "mppx/client";
|
|
193
|
+
import { client as solanaClient } from "mppx-solana";
|
|
194
|
+
import { createTwzrdMppOnChallenge, createLocalDecisionSigner } from "twzrd-x402-gate";
|
|
195
|
+
|
|
196
|
+
const mppx = Mppx.create({
|
|
197
|
+
methods: [solanaClient({ signer: wallet })],
|
|
198
|
+
onChallenge: createTwzrdMppOnChallenge({
|
|
199
|
+
signer: createLocalDecisionSigner(),
|
|
200
|
+
policy: { maxAmountUsd: "1.00" },
|
|
201
|
+
}),
|
|
202
|
+
});
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**Scope limit (honest):** the guard is authoritative only when no
|
|
206
|
+
`onChallengeReceived` event handler supplies a credential. mppx resolves
|
|
207
|
+
`eventCredential ?? onChallenge(...)`, so an event handler returning a credential
|
|
208
|
+
short-circuits the guard and pays ungated. Do not register both on one client.
|
|
209
|
+
|
|
210
|
+
**What it refuses, and why.** Each of these is a case where the transaction mppx
|
|
211
|
+
would actually sign is *not* the transaction the decision covers - so the guard
|
|
212
|
+
fails closed rather than approve a payment it cannot bind:
|
|
213
|
+
|
|
214
|
+
| Case | Code | Reason |
|
|
215
|
+
|---|---|---|
|
|
216
|
+
| Sponsored charge | `SPONSORED_CHARGE` | `sponsored` / `sponsorPath` / `feeTokenAmount` make mppx-solana build a **second transfer** to the sponsor on top of the advertised amount. PaymentIntent v1 binds one amount to one payTo, so approving it would authorize strictly more value than the decision covers. |
|
|
217
|
+
| Non-USD-pegged asset | `UNPRICED_ASSET` | Policy ceilings are USD; the wire amount is base-unit tokens. Pricing SOL would store `asset: solana:native` beside a **dollar** `amount` and lose the token quantity actually transferred. (A 1.5 SOL charge of `1500000000` at 9 decimals would otherwise evaluate as "$1.50" and sail under a $5 ceiling while moving ~$270.) USDC/USDT only until an intent version carries token amount + quote. |
|
|
218
|
+
| Unknown cluster | `UNKNOWN_CLUSTER` | mppx-solana's `resolveEndpoint` returns an unrecognized `cluster` **verbatim as the RPC endpoint URL**, and a network string containing "solana" is otherwise scored as mainnet - so `solana:https://seller-rpc.example` would inherit mainnet reputation for a chain never observed. Known cluster names only. |
|
|
219
|
+
| Misdeclared decimals | `MALFORMED_CHALLENGE` | A known stablecoin declaring the wrong decimals is a discount attempt, not a rounding error. |
|
|
220
|
+
|
|
221
|
+
The intent binds a **digest of the entire normalized challenge**, not just
|
|
222
|
+
`realm:id` - swapping `recipient` or `amount` under the same challenge id changes
|
|
223
|
+
the intent hash, so the decision no longer matches.
|
|
224
|
+
|
|
225
|
+
**Verdicts:** `block` throws. `warn` **proceeds to pay** by default - set
|
|
226
|
+
`treatWarnAsBlock: true` to refuse on warn too.
|
|
227
|
+
|
|
228
|
+
- `mppChallengeToIntent` binds the challenge id + realm into the intent
|
|
229
|
+
(`resource.operation`), so the signed decision covers this exact challenge.
|
|
230
|
+
- Cluster names stay honest: `solana:devnet` classifies recognized-but-unscored.
|
|
231
|
+
- Proof: [`test/mpp-hook.test.ts`](./test/mpp-hook.test.ts) - block means
|
|
232
|
+
credential count 0 and signer count 0.
|
|
233
|
+
|
|
182
234
|
### Experimental CLI: `twzrd-safe-fetch` (AgentCash advisory pre-check)
|
|
183
235
|
|
|
184
236
|
> **Not a challenge-bound firewall.** Classification: `advisory_precheck`.
|
package/bin/twzrd-safe-fetch.js
CHANGED
|
File without changes
|
package/dist/decision-token.d.ts
CHANGED
|
@@ -49,6 +49,24 @@ export declare function createLocalDecisionSigner(options?: {
|
|
|
49
49
|
}): DecisionSigner & {
|
|
50
50
|
publicKeyPem: string;
|
|
51
51
|
};
|
|
52
|
+
/**
|
|
53
|
+
* Deterministic Ed25519 signer derived from high-entropy key material
|
|
54
|
+
* (issuer==verifier semantics with real signatures). The same secret always
|
|
55
|
+
* yields the same keypair, so an issuer can re-derive its signer across
|
|
56
|
+
* restarts without a keystore.
|
|
57
|
+
*
|
|
58
|
+
* The secret MUST be 32+ bytes of random material, hex or base64 encoded:
|
|
59
|
+
*
|
|
60
|
+
* openssl rand -hex 32
|
|
61
|
+
*
|
|
62
|
+
* Verifiers receive `publicKeyPem` — never the secret. Anyone holding the
|
|
63
|
+
* secret can mint ALLOW decisions, so it is signing key material, not a
|
|
64
|
+
* shared password. Prefer createLocalDecisionSigner with a managed key for
|
|
65
|
+
* anything beyond single-operator deployments.
|
|
66
|
+
*/
|
|
67
|
+
export declare function createSeededDecisionSigner(secret: string, keyId?: string): DecisionSigner & {
|
|
68
|
+
publicKeyPem: string;
|
|
69
|
+
};
|
|
52
70
|
export declare function signDecision(unsigned: Omit<PaymentDecision, "signature" | "keyId">, signer: DecisionSigner): Promise<PaymentDecision>;
|
|
53
71
|
export declare function verifyDecisionSignature(token: PaymentDecision, publicKeyPem: string): boolean;
|
|
54
72
|
export type BindingErrorCode = "INTENT_HASH_MISMATCH" | "DECISION_EXPIRED" | "DECISION_NOT_ALLOW" | "DECISION_REPLAYED" | "BAD_SIGNATURE";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision-token.d.ts","sourceRoot":"","sources":["../src/decision-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"decision-token.d.ts","sourceRoot":"","sources":["../src/decision-token.ts"],"names":[],"mappings":"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"}
|
package/dist/decision-token.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* plus expiry, decision === allow, signature, and consume-once. Any mismatch
|
|
11
11
|
* means refuse — the signer is never invoked.
|
|
12
12
|
*/
|
|
13
|
-
import { createPrivateKey, createPublicKey, generateKeyPairSync, randomUUID, sign as edSign, verify as edVerify, } from "node:crypto";
|
|
13
|
+
import { createPrivateKey, createPublicKey, generateKeyPairSync, hkdfSync, randomUUID, sign as edSign, verify as edVerify, } from "node:crypto";
|
|
14
14
|
import { canonicalJson, intentHash } from "./intent.js";
|
|
15
15
|
const DECISION_DOMAIN = "twzrd-decision-v1\n";
|
|
16
16
|
/** Everything signed — the token minus the signature itself. */
|
|
@@ -41,6 +41,104 @@ export function createLocalDecisionSigner(options) {
|
|
|
41
41
|
sign: (preimage) => edSign(null, Buffer.from(preimage), privateKey),
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
|
+
/** HKDF domain separation for the seeded signer (never reuse this IKM elsewhere). */
|
|
45
|
+
const SEED_SALT = "twzrd-payment-control/decision-signer";
|
|
46
|
+
const SEED_INFO = "ed25519-seed/v1";
|
|
47
|
+
/** Ed25519 seeds are 32 bytes; we demand at least that much real key material. */
|
|
48
|
+
const MIN_SECRET_BYTES = 32;
|
|
49
|
+
/**
|
|
50
|
+
* Decode supplied key material. We accept ONLY encoded random bytes (hex or
|
|
51
|
+
* base64/base64url) — never an arbitrary passphrase.
|
|
52
|
+
*
|
|
53
|
+
* The decision public key is published to verifiers, so a passphrase-derived
|
|
54
|
+
* key is guessable offline: an attacker enumerates candidate passphrases,
|
|
55
|
+
* derives each candidate's public key, and compares. Whoever wins that race
|
|
56
|
+
* can forge ALLOW decisions. Requiring 32 bytes of real entropy makes the
|
|
57
|
+
* search space infeasible rather than merely inconvenient.
|
|
58
|
+
*/
|
|
59
|
+
function decodeKeyMaterial(secret) {
|
|
60
|
+
if (/^[0-9a-fA-F]+$/.test(secret) && secret.length % 2 === 0) {
|
|
61
|
+
return Buffer.from(secret, "hex");
|
|
62
|
+
}
|
|
63
|
+
if (/^[A-Za-z0-9+/_-]+={0,2}$/.test(secret)) {
|
|
64
|
+
const buf = Buffer.from(secret, "base64");
|
|
65
|
+
if (buf.length < MIN_SECRET_BYTES)
|
|
66
|
+
return Buffer.alloc(0);
|
|
67
|
+
// Round-trip guard: a genuine base64 encoding re-encodes to itself, but a
|
|
68
|
+
// memorable passphrase that merely happens to use the base64 alphabet
|
|
69
|
+
// (e.g. "MySuperSecretSigningKey2026Production") does NOT — it round-trips
|
|
70
|
+
// to different bytes. Without this check the length + byte-entropy floors
|
|
71
|
+
// both pass for such a passphrase (ASCII text looks high-entropy per byte),
|
|
72
|
+
// and a guessable secret is exactly the offline-forgery target we reject.
|
|
73
|
+
const normalize = (s) => s.replace(/-/g, "+").replace(/_/g, "/").replace(/=+$/, "");
|
|
74
|
+
if (buf.toString("base64").replace(/=+$/, "") !== normalize(secret)) {
|
|
75
|
+
return Buffer.alloc(0);
|
|
76
|
+
}
|
|
77
|
+
return buf;
|
|
78
|
+
}
|
|
79
|
+
return Buffer.alloc(0);
|
|
80
|
+
}
|
|
81
|
+
/** Shannon entropy per byte. Real random material sits near 8; "aaaa…" sits at 0. */
|
|
82
|
+
function entropyBitsPerByte(buf) {
|
|
83
|
+
if (buf.length === 0)
|
|
84
|
+
return 0;
|
|
85
|
+
const counts = new Map();
|
|
86
|
+
for (const b of buf)
|
|
87
|
+
counts.set(b, (counts.get(b) ?? 0) + 1);
|
|
88
|
+
let h = 0;
|
|
89
|
+
for (const n of counts.values()) {
|
|
90
|
+
const p = n / buf.length;
|
|
91
|
+
h -= p * Math.log2(p);
|
|
92
|
+
}
|
|
93
|
+
return h;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Deterministic Ed25519 signer derived from high-entropy key material
|
|
97
|
+
* (issuer==verifier semantics with real signatures). The same secret always
|
|
98
|
+
* yields the same keypair, so an issuer can re-derive its signer across
|
|
99
|
+
* restarts without a keystore.
|
|
100
|
+
*
|
|
101
|
+
* The secret MUST be 32+ bytes of random material, hex or base64 encoded:
|
|
102
|
+
*
|
|
103
|
+
* openssl rand -hex 32
|
|
104
|
+
*
|
|
105
|
+
* Verifiers receive `publicKeyPem` — never the secret. Anyone holding the
|
|
106
|
+
* secret can mint ALLOW decisions, so it is signing key material, not a
|
|
107
|
+
* shared password. Prefer createLocalDecisionSigner with a managed key for
|
|
108
|
+
* anything beyond single-operator deployments.
|
|
109
|
+
*/
|
|
110
|
+
export function createSeededDecisionSigner(secret, keyId) {
|
|
111
|
+
if (!secret)
|
|
112
|
+
throw new Error("[twzrd] decision secret must be non-empty");
|
|
113
|
+
const ikm = decodeKeyMaterial(secret);
|
|
114
|
+
if (ikm.length < MIN_SECRET_BYTES) {
|
|
115
|
+
throw new Error(`[twzrd] decision secret must carry >=${MIN_SECRET_BYTES} bytes of high-entropy key material, ` +
|
|
116
|
+
"hex or base64 encoded (generate with: openssl rand -hex 32). " +
|
|
117
|
+
"Passphrases are rejected: the decision public key is published, so a guessable " +
|
|
118
|
+
"secret lets an attacker brute-force the signing key offline and forge ALLOW decisions.");
|
|
119
|
+
}
|
|
120
|
+
if (entropyBitsPerByte(ikm) < 3) {
|
|
121
|
+
throw new Error("[twzrd] decision secret decodes to low-entropy material (repeated/patterned bytes). " +
|
|
122
|
+
"Generate real key material: openssl rand -hex 32");
|
|
123
|
+
}
|
|
124
|
+
// Domain-separated derivation: this IKM cannot collide with any other TWZRD
|
|
125
|
+
// key derived from the same secret.
|
|
126
|
+
const seed = Buffer.from(hkdfSync("sha256", ikm, Buffer.from(SEED_SALT), Buffer.from(SEED_INFO), 32));
|
|
127
|
+
// PKCS#8 DER envelope for a raw Ed25519 seed (RFC 8410).
|
|
128
|
+
const pkcs8 = Buffer.concat([
|
|
129
|
+
Buffer.from("302e020100300506032b657004220420", "hex"),
|
|
130
|
+
seed,
|
|
131
|
+
]);
|
|
132
|
+
const privateKey = createPrivateKey({ key: pkcs8, format: "der", type: "pkcs8" });
|
|
133
|
+
const publicKeyPem = createPublicKey(privateKey)
|
|
134
|
+
.export({ type: "spki", format: "pem" })
|
|
135
|
+
.toString();
|
|
136
|
+
return {
|
|
137
|
+
keyId: keyId ?? "seeded-ed25519",
|
|
138
|
+
publicKeyPem,
|
|
139
|
+
sign: (preimage) => edSign(null, Buffer.from(preimage), privateKey),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
44
142
|
export async function signDecision(unsigned, signer) {
|
|
45
143
|
const payload = { ...unsigned, keyId: signer.keyId };
|
|
46
144
|
const signature = Buffer.from(await signer.sign(decisionPreimage(payload))).toString("base64");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision-token.js","sourceRoot":"","sources":["../src/decision-token.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"decision-token.js","sourceRoot":"","sources":["../src/decision-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,QAAQ,EACR,UAAU,EACV,IAAI,IAAI,MAAM,EACd,MAAM,IAAI,QAAQ,GAEnB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAsB,MAAM,aAAa,CAAC;AAE5E,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAmC9C,gEAAgE;AAChE,MAAM,UAAU,gBAAgB,CAAC,KAAyC;IACxE,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;KAC1C,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAGzC;IACC,IAAI,UAAqB,CAAC;IAC1B,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;QAC3B,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,CAAC,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,YAAY,GAAG,eAAe,CAAC,UAAU,CAAC;SAC7C,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;SACvC,QAAQ,EAAE,CAAC;IACd,OAAO;QACL,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,eAAe;QACxC,YAAY;QACZ,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;KACpE,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,MAAM,SAAS,GAAG,uCAAuC,CAAC;AAC1D,MAAM,SAAS,GAAG,iBAAiB,CAAC;AAEpC,kFAAkF;AAClF,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B;;;;;;;;;GASG;AACH,SAAS,iBAAiB,CAAC,MAAc;IACvC,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7D,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1C,IAAI,GAAG,CAAC,MAAM,GAAG,gBAAgB;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1D,0EAA0E;QAC1E,sEAAsE;QACtE,2EAA2E;QAC3E,0EAA0E;QAC1E,4EAA4E;QAC5E,0EAA0E;QAC1E,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5F,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACpE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC;AAED,qFAAqF;AACrF,SAAS,kBAAkB,CAAC,GAAW;IACrC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,GAAG;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;QACzB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAAc,EACd,KAAc;IAEd,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAE1E,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,GAAG,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,wCAAwC,gBAAgB,uCAAuC;YAC7F,+DAA+D;YAC/D,iFAAiF;YACjF,wFAAwF,CAC3F,CAAC;IACJ,CAAC;IACD,IAAI,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,sFAAsF;YACpF,kDAAkD,CACrD,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,oCAAoC;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CACtB,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAC5E,CAAC;IAEF,yDAAyD;IACzD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,CAAC;QACtD,IAAI;KACL,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAClF,MAAM,YAAY,GAAG,eAAe,CAAC,UAAU,CAAC;SAC7C,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;SACvC,QAAQ,EAAE,CAAC;IACd,OAAO;QACL,KAAK,EAAE,KAAK,IAAI,gBAAgB;QAChC,YAAY;QACZ,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;KACpE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAsD,EACtD,MAAsB;IAEtB,MAAM,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IACrD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAClF,QAAQ,CACT,CAAC;IACF,OAAO,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAAsB,EACtB,YAAoB;IAEpB,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,QAAQ,CACb,IAAI,EACJ,gBAAgB,CAAC,OAAO,CAAC,EACzB,eAAe,CAAC,YAAY,CAAC,EAC7B,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CACjC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAaD,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IACvC,IAAI,CAAmB;IACvB,UAAU,CAAS;IAC5B,YAAY,IAAsB,EAAE,UAAkB,EAAE,MAAc;QACpE,KAAK,CAAC,WAAW,IAAI,KAAK,MAAM,gBAAgB,UAAU,GAAG,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAOD,sEAAsE;AACtE,MAAM,UAAU,sBAAsB;IACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,OAAO;QACL,OAAO,CAAC,UAAkB;YACxB,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC3C,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAUD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAqB,EACrB,KAAsB,EACtB,OAAqC;IAErC,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvC,IAAI,OAAO,EAAE,YAAY,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,uBAAuB,CAC/B,eAAe,EACf,KAAK,CAAC,UAAU,EAChB,yCAAyC,CAC1C,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC5D,MAAM,IAAI,uBAAuB,CAC/B,oBAAoB,EACpB,KAAK,CAAC,UAAU,EAChB,eAAe,KAAK,CAAC,QAAQ,EAAE,CAChC,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,uBAAuB,CAC/B,kBAAkB,EAClB,KAAK,CAAC,UAAU,EAChB,cAAc,KAAK,CAAC,SAAS,EAAE,CAChC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,MAAM,KAAK,KAAK,CAAC,UAAU,EAAE,CAAC;QAChC,MAAM,IAAI,uBAAuB,CAC/B,sBAAsB,EACtB,KAAK,CAAC,UAAU,EAChB,YAAY,KAAK,CAAC,UAAU,gBAAgB,MAAM,EAAE,CACrD,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,EAAE,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,uBAAuB,CAC/B,mBAAmB,EACnB,KAAK,CAAC,UAAU,EAChB,iCAAiC,CAClC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -16,7 +16,9 @@ export { quickCheck, QUICK_PRICE_USDC, type QuickCheckResult, type QuickCheckOpt
|
|
|
16
16
|
export { createSponsoredX402Fetch, type SponsorSettle, type SponsoredX402Options, } from "./sponsored.js";
|
|
17
17
|
export type { TwzrdDecision, TwzrdReadinessCard, TwzrdPreflightInput, TwzrdGateConfig, TwzrdApproveContext, TwzrdApprovalResult, TwzrdUpsellContext, X402PaymentRequirements, X402PaymentRequiredBody, X402McpPaymentRequest, X402McpPaymentRequestedContext, } from "./types.js";
|
|
18
18
|
export { canonicalJson, intentHash, toMicroUsd, INTENT_HASH_PREFIX, type PaymentIntent, type PaymentProtocol, } from "./intent.js";
|
|
19
|
-
export { assertIntentApproved, createDecisionRegistry, createLocalDecisionSigner, decisionPreimage, newDecisionId, signDecision, verifyDecisionSignature, TwzrdIntentBindingError, type AssertIntentApprovedOptions, type BindingErrorCode, type DecisionConstraints, type DecisionRegistry, type DecisionSigner, type PaymentDecision, type PaymentDecisionVerdict, } from "./decision-token.js";
|
|
19
|
+
export { assertIntentApproved, createDecisionRegistry, createLocalDecisionSigner, createSeededDecisionSigner, decisionPreimage, newDecisionId, signDecision, verifyDecisionSignature, TwzrdIntentBindingError, type AssertIntentApprovedOptions, type BindingErrorCode, type DecisionConstraints, type DecisionRegistry, type DecisionSigner, type PaymentDecision, type PaymentDecisionVerdict, } from "./decision-token.js";
|
|
20
20
|
export { createMemorySpendLedger, evaluateIntent, POLICY_VERSION, type CounterpartyIntelligence, type EvaluateIntentOptions, type IntelligenceProvider, type Mandate, type SpendLedger, type SpendPolicy, } from "./policy-runtime.js";
|
|
21
21
|
export { ap2CheckoutToIntent, x402RequirementsToIntent, type Ap2Cart, type Ap2UserMandate, type X402IntentContext, } from "./intent-adapters.js";
|
|
22
|
+
export { createTwzrdMppOnChallenge, mppChallengeToIntent, mppChallengeDigest, NATIVE_SOL_CURRENCY, TwzrdMppBlockError, type MppChallenge, type MppIntentContext, type MppOnChallengeHelpers, type MppOnChallengeOptions, type MppSolanaChargeRequest, } from "./mpp-hook.js";
|
|
23
|
+
export { approvalToIntelligence, counterpartyKnownFromApproval, createTwzrdIntelligenceProvider, intentAmountToPriceUsd, type TwzrdIntelligenceOptions, } from "./intelligence.js";
|
|
22
24
|
//# 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":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -19,7 +19,9 @@ export { quickCheck, QUICK_PRICE_USDC, } from "./quick.js";
|
|
|
19
19
|
export { createSponsoredX402Fetch, } from "./sponsored.js";
|
|
20
20
|
/* ── TWZRD Payment Control (protocol-neutral authorization core) ── */
|
|
21
21
|
export { canonicalJson, intentHash, toMicroUsd, INTENT_HASH_PREFIX, } from "./intent.js";
|
|
22
|
-
export { assertIntentApproved, createDecisionRegistry, createLocalDecisionSigner, decisionPreimage, newDecisionId, signDecision, verifyDecisionSignature, TwzrdIntentBindingError, } from "./decision-token.js";
|
|
22
|
+
export { assertIntentApproved, createDecisionRegistry, createLocalDecisionSigner, createSeededDecisionSigner, decisionPreimage, newDecisionId, signDecision, verifyDecisionSignature, TwzrdIntentBindingError, } from "./decision-token.js";
|
|
23
23
|
export { createMemorySpendLedger, evaluateIntent, POLICY_VERSION, } from "./policy-runtime.js";
|
|
24
24
|
export { ap2CheckoutToIntent, x402RequirementsToIntent, } from "./intent-adapters.js";
|
|
25
|
+
export { createTwzrdMppOnChallenge, mppChallengeToIntent, mppChallengeDigest, NATIVE_SOL_CURRENCY, TwzrdMppBlockError, } from "./mpp-hook.js";
|
|
26
|
+
export { approvalToIntelligence, counterpartyKnownFromApproval, createTwzrdIntelligenceProvider, intentAmountToPriceUsd, } from "./intelligence.js";
|
|
25
27
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,qFAAqF;AACrF,uFAAuF;AACvF,qFAAqF;AACrF,OAAO,EAAE,eAAe,EAAE,WAAW,EAAkB,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,aAAa,EAAgC,MAAM,aAAa,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,YAAY,GAKb,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,sBAAsB,GAIvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACL,sBAAsB,GAGvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAA0B,MAAM,iBAAiB,CAAC;AACzE,OAAO,EACL,oBAAoB,GAGrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,IAAI,IAAI,aAAa,GAGtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,GAO3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,gBAAgB,GAIjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,wBAAwB,GAGzB,MAAM,gBAAgB,CAAC;AAexB,uEAAuE;AACvE,OAAO,EACL,aAAa,EACb,UAAU,EACV,UAAU,EACV,kBAAkB,GAGnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,uBAAuB,EACvB,uBAAuB,GAQxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,cAAc,GAOf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,wBAAwB,GAIzB,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,qFAAqF;AACrF,uFAAuF;AACvF,qFAAqF;AACrF,OAAO,EAAE,eAAe,EAAE,WAAW,EAAkB,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,aAAa,EAAgC,MAAM,aAAa,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,YAAY,GAKb,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,sBAAsB,GAIvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACL,sBAAsB,GAGvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAA0B,MAAM,iBAAiB,CAAC;AACzE,OAAO,EACL,oBAAoB,GAGrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,IAAI,IAAI,aAAa,GAGtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,GAO3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,gBAAgB,GAIjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,wBAAwB,GAGzB,MAAM,gBAAgB,CAAC;AAexB,uEAAuE;AACvE,OAAO,EACL,aAAa,EACb,UAAU,EACV,UAAU,EACV,kBAAkB,GAGnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,EAC1B,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,uBAAuB,EACvB,uBAAuB,GAQxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,cAAc,GAOf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,wBAAwB,GAIzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GAMnB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAC7B,+BAA+B,EAC/B,sBAAsB,GAEvB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TWZRD Payment Control — the live TWZRD preflight as an IntelligenceProvider.
|
|
3
|
+
*
|
|
4
|
+
* The x402 client hook feeds its own preflight into evaluateIntent inline;
|
|
5
|
+
* this module gives every OTHER core consumer (AP2/UCP adapters, direct
|
|
6
|
+
* evaluateIntent callers, future protocol surfaces) the same live pipeline
|
|
7
|
+
* (network classify -> free preflight -> readiness policy -> merchant_card
|
|
8
|
+
* wash refuse) as an injectable intelligence provider, without duplicating
|
|
9
|
+
* its behavior.
|
|
10
|
+
*/
|
|
11
|
+
import type { PaymentIntent } from "./intent.js";
|
|
12
|
+
import type { CounterpartyIntelligence, IntelligenceProvider } from "./policy-runtime.js";
|
|
13
|
+
import type { TwzrdApprovalResult, TwzrdGateConfig } from "./types.js";
|
|
14
|
+
/**
|
|
15
|
+
* Is this counterparty KNOWN to us — did the score rest on observed evidence
|
|
16
|
+
* about this specific wallet?
|
|
17
|
+
*
|
|
18
|
+
* Deliberately NOT `reputationScored`. That flag only says TWZRD ran Solana
|
|
19
|
+
* behavioral scoring on the payment path; it is true even for a wallet we have
|
|
20
|
+
* never seen — precisely the case a caller most needs flagged. Reading it as
|
|
21
|
+
* "known" marks every scored Solana recipient known:true and silently disables
|
|
22
|
+
* the unknownCounterparty policy, which fires only on `known === false`.
|
|
23
|
+
*
|
|
24
|
+
* Ground truth is `trust_score_basis`, published in `card.caveats[]`:
|
|
25
|
+
* corpus_teaser_v1:provider_reputation_v1 -> evidence -> true
|
|
26
|
+
* corpus_teaser_v1:insufficient_free_evidence -> none -> false
|
|
27
|
+
* absent / unrecognized -> ambiguous -> undefined
|
|
28
|
+
*
|
|
29
|
+
* `undefined` ("we cannot say") must never collapse into `false` ("we looked,
|
|
30
|
+
* and there is nothing"). Only `false` may drive a policy.
|
|
31
|
+
*/
|
|
32
|
+
export declare function counterpartyKnownFromApproval(approval: TwzrdApprovalResult): boolean | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Intent amounts are canonical decimal strings, and the deterministic money
|
|
35
|
+
* policy already runs on bigint micro-units. This Number() conversion exists
|
|
36
|
+
* only to price the preflight call — so guard the boundary rather than letting
|
|
37
|
+
* NaN or Infinity reach the network.
|
|
38
|
+
*/
|
|
39
|
+
export declare function intentAmountToPriceUsd(amount: string): number;
|
|
40
|
+
/** Map a gate approval onto the core intelligence shape. Pure. */
|
|
41
|
+
export declare function approvalToIntelligence(approval: TwzrdApprovalResult): CounterpartyIntelligence;
|
|
42
|
+
export type TwzrdIntelligenceOptions = TwzrdGateConfig & {
|
|
43
|
+
/** Observe the full approval (telemetry / audit). Never throws into evaluation. */
|
|
44
|
+
onApproval?: (approval: TwzrdApprovalResult, intent: PaymentIntent) => void;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Wrap the existing preflight path as an IntelligenceProvider for
|
|
48
|
+
* `evaluateIntent`. `intent.amount` is the canonical decimal asset string.
|
|
49
|
+
*/
|
|
50
|
+
export declare function createTwzrdIntelligenceProvider(options?: TwzrdIntelligenceOptions): IntelligenceProvider;
|
|
51
|
+
//# sourceMappingURL=intelligence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intelligence.d.ts","sourceRoot":"","sources":["../src/intelligence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EACV,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAcvE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,mBAAmB,GAC5B,OAAO,GAAG,SAAS,CAiBrB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAe7D;AAED,kEAAkE;AAClE,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,mBAAmB,GAC5B,wBAAwB,CAgB1B;AAED,MAAM,MAAM,wBAAwB,GAAG,eAAe,GAAG;IACvD,mFAAmF;IACnF,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,EAAE,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CAC7E,CAAC;AAEF;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,CAAC,EAAE,wBAAwB,GACjC,oBAAoB,CAoBtB"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TWZRD Payment Control — the live TWZRD preflight as an IntelligenceProvider.
|
|
3
|
+
*
|
|
4
|
+
* The x402 client hook feeds its own preflight into evaluateIntent inline;
|
|
5
|
+
* this module gives every OTHER core consumer (AP2/UCP adapters, direct
|
|
6
|
+
* evaluateIntent callers, future protocol surfaces) the same live pipeline
|
|
7
|
+
* (network classify -> free preflight -> readiness policy -> merchant_card
|
|
8
|
+
* wash refuse) as an injectable intelligence provider, without duplicating
|
|
9
|
+
* its behavior.
|
|
10
|
+
*/
|
|
11
|
+
import { resolveConfig } from "./config.js";
|
|
12
|
+
import { twzrdApprovePayment } from "./policy.js";
|
|
13
|
+
/** Prefix of the readiness-card caveat that carries the scoring basis. */
|
|
14
|
+
const BASIS_PREFIX = "trust_score_basis:";
|
|
15
|
+
/**
|
|
16
|
+
* Basis markers meaning "we hold no real evidence on this wallet". The server
|
|
17
|
+
* states this explicitly rather than leaving it to be inferred from a low score.
|
|
18
|
+
*/
|
|
19
|
+
const NO_EVIDENCE = ["insufficient_free_evidence", "default_no_data"];
|
|
20
|
+
/** Basis markers meaning "this verdict rests on observed behavior". */
|
|
21
|
+
const HAS_EVIDENCE = ["provider_reputation"];
|
|
22
|
+
/**
|
|
23
|
+
* Is this counterparty KNOWN to us — did the score rest on observed evidence
|
|
24
|
+
* about this specific wallet?
|
|
25
|
+
*
|
|
26
|
+
* Deliberately NOT `reputationScored`. That flag only says TWZRD ran Solana
|
|
27
|
+
* behavioral scoring on the payment path; it is true even for a wallet we have
|
|
28
|
+
* never seen — precisely the case a caller most needs flagged. Reading it as
|
|
29
|
+
* "known" marks every scored Solana recipient known:true and silently disables
|
|
30
|
+
* the unknownCounterparty policy, which fires only on `known === false`.
|
|
31
|
+
*
|
|
32
|
+
* Ground truth is `trust_score_basis`, published in `card.caveats[]`:
|
|
33
|
+
* corpus_teaser_v1:provider_reputation_v1 -> evidence -> true
|
|
34
|
+
* corpus_teaser_v1:insufficient_free_evidence -> none -> false
|
|
35
|
+
* absent / unrecognized -> ambiguous -> undefined
|
|
36
|
+
*
|
|
37
|
+
* `undefined` ("we cannot say") must never collapse into `false` ("we looked,
|
|
38
|
+
* and there is nothing"). Only `false` may drive a policy.
|
|
39
|
+
*/
|
|
40
|
+
export function counterpartyKnownFromApproval(approval) {
|
|
41
|
+
// Unscored network (Base/EVM, Stripe deposit addresses): no reputation ran at
|
|
42
|
+
// all, so we know nothing about the recipient. Never imply otherwise.
|
|
43
|
+
if (approval.reputationScored !== true)
|
|
44
|
+
return undefined;
|
|
45
|
+
const caveats = approval.card?.caveats;
|
|
46
|
+
if (!Array.isArray(caveats))
|
|
47
|
+
return undefined;
|
|
48
|
+
const basis = caveats
|
|
49
|
+
.filter((c) => typeof c === "string")
|
|
50
|
+
.find((c) => c.trim().toLowerCase().startsWith(BASIS_PREFIX));
|
|
51
|
+
if (!basis)
|
|
52
|
+
return undefined;
|
|
53
|
+
const b = basis.toLowerCase();
|
|
54
|
+
if (NO_EVIDENCE.some((m) => b.includes(m)))
|
|
55
|
+
return false;
|
|
56
|
+
if (HAS_EVIDENCE.some((m) => b.includes(m)))
|
|
57
|
+
return true;
|
|
58
|
+
return undefined; // an unrecognized basis is ambiguous, not evidence
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Intent amounts are canonical decimal strings, and the deterministic money
|
|
62
|
+
* policy already runs on bigint micro-units. This Number() conversion exists
|
|
63
|
+
* only to price the preflight call — so guard the boundary rather than letting
|
|
64
|
+
* NaN or Infinity reach the network.
|
|
65
|
+
*/
|
|
66
|
+
export function intentAmountToPriceUsd(amount) {
|
|
67
|
+
// Number("") and Number(" ") are 0, not NaN — an empty amount would price
|
|
68
|
+
// the call as free instead of being rejected. Reject before coercing.
|
|
69
|
+
if (typeof amount !== "string" || amount.trim() === "") {
|
|
70
|
+
throw new Error(`[twzrd] intent.amount is not a finite, non-negative decimal: ${JSON.stringify(amount)}`);
|
|
71
|
+
}
|
|
72
|
+
const price = Number(amount);
|
|
73
|
+
if (!Number.isFinite(price) || price < 0) {
|
|
74
|
+
throw new Error(`[twzrd] intent.amount is not a finite, non-negative decimal: ${JSON.stringify(amount)}`);
|
|
75
|
+
}
|
|
76
|
+
return price;
|
|
77
|
+
}
|
|
78
|
+
/** Map a gate approval onto the core intelligence shape. Pure. */
|
|
79
|
+
export function approvalToIntelligence(approval) {
|
|
80
|
+
return {
|
|
81
|
+
known: counterpartyKnownFromApproval(approval),
|
|
82
|
+
washFlagged: approval.washFlagged ?? undefined,
|
|
83
|
+
// Any gate DENIAL is a block for the runtime, even when the card verdict
|
|
84
|
+
// was "warn" (can_spend gate, score floor, wash refuse). The verdict only
|
|
85
|
+
// grades approved outcomes.
|
|
86
|
+
decision: !approval.approved
|
|
87
|
+
? "block"
|
|
88
|
+
: approval.verdict === "warn"
|
|
89
|
+
? "warn"
|
|
90
|
+
: approval.verdict === "allow"
|
|
91
|
+
? "allow"
|
|
92
|
+
: undefined,
|
|
93
|
+
trustScore: approval.score ?? undefined,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Wrap the existing preflight path as an IntelligenceProvider for
|
|
98
|
+
* `evaluateIntent`. `intent.amount` is the canonical decimal asset string.
|
|
99
|
+
*/
|
|
100
|
+
export function createTwzrdIntelligenceProvider(options) {
|
|
101
|
+
const cfg = resolveConfig(options);
|
|
102
|
+
return async (intent) => {
|
|
103
|
+
const approval = await twzrdApprovePayment({
|
|
104
|
+
resourceUrl: intent.resource?.url,
|
|
105
|
+
payTo: intent.payTo,
|
|
106
|
+
priceUsdc: intentAmountToPriceUsd(intent.amount),
|
|
107
|
+
agentIntent: `${intent.protocol}_payment_control`,
|
|
108
|
+
chain: intent.network,
|
|
109
|
+
}, cfg);
|
|
110
|
+
try {
|
|
111
|
+
options?.onApproval?.(approval, intent);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// observation must never alter the decision path
|
|
115
|
+
}
|
|
116
|
+
return approvalToIntelligence(approval);
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=intelligence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intelligence.js","sourceRoot":"","sources":["../src/intelligence.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,12 @@ export type X402IntentContext = {
|
|
|
17
17
|
facilitator?: string;
|
|
18
18
|
agent?: PaymentIntent["agent"];
|
|
19
19
|
purpose?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Decimals of the wire asset, for converting the x402 base-unit amount into
|
|
22
|
+
* the decimal-USD string PaymentIntent.amount requires. Default 6 (USDC),
|
|
23
|
+
* matching the gate's Solana-USDC assumption.
|
|
24
|
+
*/
|
|
25
|
+
decimals?: number;
|
|
20
26
|
};
|
|
21
27
|
/** Normalize a selected x402 payment requirement (v1 or v2 field names). */
|
|
22
28
|
export declare function x402RequirementsToIntent(req: X402SelectedRequirements, ctx?: X402IntentContext): PaymentIntent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent-adapters.d.ts","sourceRoot":"","sources":["../src/intent-adapters.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAMtE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"intent-adapters.d.ts","sourceRoot":"","sources":["../src/intent-adapters.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAMtE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAmBF,4EAA4E;AAC5E,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,wBAAwB,EAC7B,GAAG,CAAC,EAAE,iBAAiB,GACtB,aAAa,CAmBf;AAMD;;;;GAIG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,gFAAgF;AAChF,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CA+B7C"}
|
package/dist/intent-adapters.js
CHANGED
|
@@ -7,19 +7,36 @@
|
|
|
7
7
|
* non-x402 reference — it exists to prove the runtime combines a USER MANDATE
|
|
8
8
|
* with counterparty risk, not merely that it parses another crypto request.
|
|
9
9
|
*/
|
|
10
|
+
/**
|
|
11
|
+
* Convert an integer base-unit (micro) amount into a decimal string.
|
|
12
|
+
* x402 wire amounts are base units (USDC = 6dp micro); PaymentIntent.amount is
|
|
13
|
+
* a decimal-USD string that the policy runtime runs through toMicroUsd(), so
|
|
14
|
+
* passing the raw micro value straight through mis-scales every amount policy
|
|
15
|
+
* by 10^decimals. Non-integer input is returned as-is (already decimal).
|
|
16
|
+
*/
|
|
17
|
+
function microUnitsToDecimal(units, decimals) {
|
|
18
|
+
const t = units.trim();
|
|
19
|
+
if (!/^\d+$/.test(t) || decimals <= 0)
|
|
20
|
+
return t;
|
|
21
|
+
const scale = 10n ** BigInt(decimals);
|
|
22
|
+
const value = BigInt(t);
|
|
23
|
+
const whole = value / scale;
|
|
24
|
+
const frac = (value % scale).toString().padStart(decimals, "0").replace(/0+$/, "");
|
|
25
|
+
return frac ? `${whole}.${frac}` : `${whole}`;
|
|
26
|
+
}
|
|
10
27
|
/** Normalize a selected x402 payment requirement (v1 or v2 field names). */
|
|
11
28
|
export function x402RequirementsToIntent(req, ctx) {
|
|
12
29
|
const payTo = req.payTo ?? req.pay_to;
|
|
13
|
-
const
|
|
30
|
+
const amountUnits = req.amount ?? req.maxAmountRequired;
|
|
14
31
|
if (!payTo)
|
|
15
32
|
throw new Error("[twzrd] x402 requirement missing payTo");
|
|
16
|
-
if (!
|
|
33
|
+
if (!amountUnits)
|
|
17
34
|
throw new Error("[twzrd] x402 requirement missing amount");
|
|
18
35
|
return {
|
|
19
36
|
protocol: "x402",
|
|
20
37
|
network: req.network ?? "unknown",
|
|
21
38
|
asset: req.asset ?? "unknown",
|
|
22
|
-
amount,
|
|
39
|
+
amount: microUnitsToDecimal(amountUnits, ctx?.decimals ?? 6),
|
|
23
40
|
payTo,
|
|
24
41
|
resource: {
|
|
25
42
|
url: req.resource ?? ctx?.resourceUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent-adapters.js","sourceRoot":"","sources":["../src/intent-adapters.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"intent-adapters.js","sourceRoot":"","sources":["../src/intent-adapters.ts"],"names":[],"mappings":"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"}
|