@absol-labs/agent 0.11.0 → 0.12.0-rc.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.
- package/README.md +43 -51
- package/dist/capability/invocation-capability.d.ts +2 -2
- package/dist/capability/probe-capability.d.ts +225 -0
- package/dist/capability/probe-capability.d.ts.map +1 -0
- package/dist/capability/probe-capability.js +248 -0
- package/dist/capability/probe-capability.js.map +1 -0
- package/dist/cli/args.d.ts +11 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +23 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/claim.d.ts +32 -0
- package/dist/cli/commands/claim.d.ts.map +1 -1
- package/dist/cli/commands/claim.js +116 -28
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/close.d.ts.map +1 -1
- package/dist/cli/commands/close.js +35 -3
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/invoke.d.ts +2 -0
- package/dist/cli/commands/invoke.d.ts.map +1 -1
- package/dist/cli/commands/invoke.js +2 -2
- package/dist/cli/commands/invoke.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +15 -2
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/open.d.ts.map +1 -1
- package/dist/cli/commands/open.js +58 -4
- package/dist/cli/commands/open.js.map +1 -1
- package/dist/cli/commands/pay.d.ts +34 -0
- package/dist/cli/commands/pay.d.ts.map +1 -0
- package/dist/cli/commands/pay.js +479 -0
- package/dist/cli/commands/pay.js.map +1 -0
- package/dist/cli/commands/reclaim-unverified.d.ts.map +1 -1
- package/dist/cli/commands/reclaim-unverified.js +3 -2
- package/dist/cli/commands/reclaim-unverified.js.map +1 -1
- package/dist/cli/commands/reclaim.d.ts +23 -2
- package/dist/cli/commands/reclaim.d.ts.map +1 -1
- package/dist/cli/commands/reclaim.js +204 -20
- package/dist/cli/commands/reclaim.js.map +1 -1
- package/dist/cli/commands/refund.d.ts +31 -0
- package/dist/cli/commands/refund.d.ts.map +1 -0
- package/dist/cli/commands/refund.js +397 -0
- package/dist/cli/commands/refund.js.map +1 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +21 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/streams.js +8 -12
- package/dist/cli/commands/streams.js.map +1 -1
- package/dist/cli/commands/watch.d.ts.map +1 -1
- package/dist/cli/commands/watch.js +4 -1
- package/dist/cli/commands/watch.js.map +1 -1
- package/dist/cli/config.d.ts +44 -26
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +88 -38
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/context.d.ts +19 -0
- package/dist/cli/context.d.ts.map +1 -1
- package/dist/cli/deps.d.ts +53 -0
- package/dist/cli/deps.d.ts.map +1 -1
- package/dist/cli/deps.js +51 -1
- package/dist/cli/deps.js.map +1 -1
- package/dist/cli/errors.d.ts.map +1 -1
- package/dist/cli/errors.js +21 -1
- package/dist/cli/errors.js.map +1 -1
- package/dist/cli/escape-hatch.d.ts +6 -4
- package/dist/cli/escape-hatch.d.ts.map +1 -1
- package/dist/cli/escape-hatch.js +6 -2
- package/dist/cli/escape-hatch.js.map +1 -1
- package/dist/cli/listings.d.ts +18 -0
- package/dist/cli/listings.d.ts.map +1 -1
- package/dist/cli/listings.js +22 -12
- package/dist/cli/listings.js.map +1 -1
- package/dist/cli/preflight.d.ts +20 -14
- package/dist/cli/preflight.d.ts.map +1 -1
- package/dist/cli/preflight.js +34 -20
- package/dist/cli/preflight.js.map +1 -1
- package/dist/cli/privy.d.ts.map +1 -1
- package/dist/cli/privy.js +4 -2
- package/dist/cli/privy.js.map +1 -1
- package/dist/cli/progress.d.ts +13 -1
- package/dist/cli/progress.d.ts.map +1 -1
- package/dist/cli/progress.js +7 -1
- package/dist/cli/progress.js.map +1 -1
- package/dist/cli/reclaimability.d.ts +82 -0
- package/dist/cli/reclaimability.d.ts.map +1 -0
- package/dist/cli/reclaimability.js +80 -0
- package/dist/cli/reclaimability.js.map +1 -0
- package/dist/cli/run.d.ts +2 -1
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +62 -21
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/scan-range.d.ts +2 -2
- package/dist/cli/scan-range.js +2 -2
- package/dist/cli/status.d.ts +106 -1
- package/dist/cli/status.d.ts.map +1 -1
- package/dist/cli/status.js +325 -44
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/wallet.d.ts +2 -2
- package/dist/cli/wallet.d.ts.map +1 -1
- package/dist/cli/wallet.js +29 -5
- package/dist/cli/wallet.js.map +1 -1
- package/dist/discovery/rate-band.d.ts +74 -0
- package/dist/discovery/rate-band.d.ts.map +1 -0
- package/dist/discovery/rate-band.js +114 -0
- package/dist/discovery/rate-band.js.map +1 -0
- package/dist/escrow-generation.d.ts +81 -0
- package/dist/escrow-generation.d.ts.map +1 -0
- package/dist/escrow-generation.js +76 -0
- package/dist/escrow-generation.js.map +1 -0
- package/dist/frameworks/agentkit.d.ts +8 -4
- package/dist/frameworks/agentkit.d.ts.map +1 -1
- package/dist/frameworks/agentkit.js +27 -10
- package/dist/frameworks/agentkit.js.map +1 -1
- package/dist/frameworks/eliza.d.ts +3 -3
- package/dist/frameworks/eliza.d.ts.map +1 -1
- package/dist/frameworks/eliza.js +15 -6
- package/dist/frameworks/eliza.js.map +1 -1
- package/dist/frameworks/langchain.d.ts.map +1 -1
- package/dist/frameworks/langchain.js +8 -0
- package/dist/frameworks/langchain.js.map +1 -1
- package/dist/gateway/caller-auth-gateway.d.ts +83 -31
- package/dist/gateway/caller-auth-gateway.d.ts.map +1 -1
- package/dist/gateway/caller-auth-gateway.js +180 -27
- package/dist/gateway/caller-auth-gateway.js.map +1 -1
- package/dist/gateway/http-server.d.ts +128 -44
- package/dist/gateway/http-server.d.ts.map +1 -1
- package/dist/gateway/http-server.js +506 -155
- package/dist/gateway/http-server.js.map +1 -1
- package/dist/gateway/probe-auth.d.ts +112 -0
- package/dist/gateway/probe-auth.d.ts.map +1 -0
- package/dist/gateway/probe-auth.js +127 -0
- package/dist/gateway/probe-auth.js.map +1 -0
- package/dist/gateway/signed-rate-bounds.d.ts +51 -0
- package/dist/gateway/signed-rate-bounds.d.ts.map +1 -0
- package/dist/gateway/signed-rate-bounds.js +94 -0
- package/dist/gateway/signed-rate-bounds.js.map +1 -0
- package/dist/gateway/x402-opener-mode.d.ts +252 -0
- package/dist/gateway/x402-opener-mode.d.ts.map +1 -0
- package/dist/gateway/x402-opener-mode.js +772 -0
- package/dist/gateway/x402-opener-mode.js.map +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -5
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +64 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +247 -37
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/x402-tools.d.ts +109 -0
- package/dist/mcp/x402-tools.d.ts.map +1 -0
- package/dist/mcp/x402-tools.js +554 -0
- package/dist/mcp/x402-tools.js.map +1 -0
- package/dist/network.d.ts +119 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +199 -0
- package/dist/network.js.map +1 -0
- package/dist/sdk/client.d.ts +13 -0
- package/dist/sdk/client.d.ts.map +1 -1
- package/dist/sdk/client.js +15 -0
- package/dist/sdk/client.js.map +1 -1
- package/dist/sdk/invoke.d.ts +4 -0
- package/dist/sdk/invoke.d.ts.map +1 -1
- package/dist/sdk/invoke.js +2 -5
- package/dist/sdk/invoke.js.map +1 -1
- package/dist/wallet/autonomous-wallet-broker.d.ts +3 -0
- package/dist/wallet/autonomous-wallet-broker.d.ts.map +1 -1
- package/dist/wallet/autonomous-wallet-broker.js +27 -23
- package/dist/wallet/autonomous-wallet-broker.js.map +1 -1
- package/dist/wallet/autonomous-wallet-protocol.d.ts +8 -2
- package/dist/wallet/autonomous-wallet-protocol.d.ts.map +1 -1
- package/dist/wallet/autonomous-wallet-protocol.js +9 -2
- package/dist/wallet/autonomous-wallet-protocol.js.map +1 -1
- package/dist/wallet/autonomous-wallet.d.ts.map +1 -1
- package/dist/wallet/autonomous-wallet.js +3 -2
- package/dist/wallet/autonomous-wallet.js.map +1 -1
- package/dist/wallet/broker-escrows.d.ts +222 -0
- package/dist/wallet/broker-escrows.d.ts.map +1 -0
- package/dist/wallet/broker-escrows.js +36 -0
- package/dist/wallet/broker-escrows.js.map +1 -0
- package/dist/wallet/lifecycle.d.ts +21 -5
- package/dist/wallet/lifecycle.d.ts.map +1 -1
- package/dist/wallet/lifecycle.js +32 -12
- package/dist/wallet/lifecycle.js.map +1 -1
- package/dist/wallet/privy-broker-server.d.ts.map +1 -1
- package/dist/wallet/privy-broker-server.js +31 -26
- package/dist/wallet/privy-broker-server.js.map +1 -1
- package/dist/wallet/privy-session-broker.d.ts +14 -5
- package/dist/wallet/privy-session-broker.d.ts.map +1 -1
- package/dist/wallet/privy-session-broker.js +29 -17
- package/dist/wallet/privy-session-broker.js.map +1 -1
- package/dist/wallet/privy-session-provider.d.ts +3 -1
- package/dist/wallet/privy-session-provider.d.ts.map +1 -1
- package/dist/wallet/privy-session-provider.js +5 -3
- package/dist/wallet/privy-session-provider.js.map +1 -1
- package/dist/wallet/provider.d.ts.map +1 -1
- package/dist/wallet/provider.js +15 -8
- package/dist/wallet/provider.js.map +1 -1
- package/dist/x402/facilitator.d.ts +3 -30
- package/dist/x402/facilitator.d.ts.map +1 -1
- package/dist/x402/facilitator.js +0 -27
- package/dist/x402/facilitator.js.map +1 -1
- package/dist/x402-buyer/guarded-fetch.d.ts +51 -0
- package/dist/x402-buyer/guarded-fetch.d.ts.map +1 -0
- package/dist/x402-buyer/guarded-fetch.js +147 -0
- package/dist/x402-buyer/guarded-fetch.js.map +1 -0
- package/dist/x402-buyer/index.d.ts +10 -0
- package/dist/x402-buyer/index.d.ts.map +1 -0
- package/dist/x402-buyer/index.js +10 -0
- package/dist/x402-buyer/index.js.map +1 -0
- package/dist/x402-buyer/pay.d.ts +157 -0
- package/dist/x402-buyer/pay.d.ts.map +1 -0
- package/dist/x402-buyer/pay.js +366 -0
- package/dist/x402-buyer/pay.js.map +1 -0
- package/dist/x402-opener/abi.d.ts +684 -0
- package/dist/x402-opener/abi.d.ts.map +1 -0
- package/dist/x402-opener/abi.js +880 -0
- package/dist/x402-opener/abi.js.map +1 -0
- package/dist/x402-opener/facilitator-entry.d.ts +3 -0
- package/dist/x402-opener/facilitator-entry.d.ts.map +1 -0
- package/dist/x402-opener/facilitator-entry.js +40 -0
- package/dist/x402-opener/facilitator-entry.js.map +1 -0
- package/dist/x402-opener/facilitator-server.d.ts +209 -0
- package/dist/x402-opener/facilitator-server.d.ts.map +1 -0
- package/dist/x402-opener/facilitator-server.js +762 -0
- package/dist/x402-opener/facilitator-server.js.map +1 -0
- package/dist/x402-opener/index.d.ts +14 -0
- package/dist/x402-opener/index.d.ts.map +1 -0
- package/dist/x402-opener/index.js +14 -0
- package/dist/x402-opener/index.js.map +1 -0
- package/dist/x402-opener/listing-resolver.d.ts +55 -0
- package/dist/x402-opener/listing-resolver.d.ts.map +1 -0
- package/dist/x402-opener/listing-resolver.js +125 -0
- package/dist/x402-opener/listing-resolver.js.map +1 -0
- package/dist/x402-opener/refund-relay.d.ts +266 -0
- package/dist/x402-opener/refund-relay.d.ts.map +1 -0
- package/dist/x402-opener/refund-relay.js +1341 -0
- package/dist/x402-opener/refund-relay.js.map +1 -0
- package/dist/x402-opener/relayer-queue.d.ts +14 -0
- package/dist/x402-opener/relayer-queue.d.ts.map +1 -0
- package/dist/x402-opener/relayer-queue.js +18 -0
- package/dist/x402-opener/relayer-queue.js.map +1 -0
- package/dist/x402-opener/scheme.d.ts +296 -0
- package/dist/x402-opener/scheme.d.ts.map +1 -0
- package/dist/x402-opener/scheme.js +1035 -0
- package/dist/x402-opener/scheme.js.map +1 -0
- package/dist/x402-opener/terms.d.ts +165 -0
- package/dist/x402-opener/terms.d.ts.map +1 -0
- package/dist/x402-opener/terms.js +304 -0
- package/dist/x402-opener/terms.js.map +1 -0
- package/dist/zktls/reclaim.d.ts +2 -2
- package/dist/zktls/t2-delivery-proof.d.ts +6 -6
- package/docs/agent-layer.md +3 -2
- package/docs/autonomous-privy-wallet.md +188 -0
- package/docs/cli.md +265 -34
- package/docs/langchain.md +5 -0
- package/docs/mcp-reference.md +91 -5
- package/docs/probe-capability.md +191 -0
- package/docs/quickstart.md +39 -4
- package/docs/threat-model.md +20 -0
- package/docs/x402.md +766 -593
- package/package.json +19 -17
- package/src/capability/probe-capability.ts +355 -0
- package/src/cli/args.ts +29 -0
- package/src/cli/commands/claim.ts +168 -33
- package/src/cli/commands/close.ts +36 -3
- package/src/cli/commands/invoke.ts +5 -2
- package/src/cli/commands/mcp.ts +18 -2
- package/src/cli/commands/open.ts +75 -4
- package/src/cli/commands/pay.ts +584 -0
- package/src/cli/commands/reclaim-unverified.ts +8 -2
- package/src/cli/commands/reclaim.ts +277 -19
- package/src/cli/commands/refund.ts +475 -0
- package/src/cli/commands/status.ts +28 -2
- package/src/cli/commands/streams.ts +10 -14
- package/src/cli/commands/watch.ts +11 -1
- package/src/cli/config.ts +139 -52
- package/src/cli/context.ts +16 -0
- package/src/cli/deps.ts +111 -1
- package/src/cli/errors.ts +24 -1
- package/src/cli/escape-hatch.ts +19 -5
- package/src/cli/listings.ts +43 -10
- package/src/cli/preflight.ts +36 -21
- package/src/cli/privy.ts +4 -2
- package/src/cli/progress.ts +21 -2
- package/src/cli/reclaimability.ts +154 -0
- package/src/cli/run.ts +77 -21
- package/src/cli/scan-range.ts +2 -2
- package/src/cli/status.ts +454 -44
- package/src/cli/wallet.ts +45 -8
- package/src/discovery/rate-band.ts +172 -0
- package/src/escrow-generation.ts +135 -0
- package/src/frameworks/agentkit.ts +45 -11
- package/src/frameworks/eliza.ts +27 -5
- package/src/frameworks/langchain.ts +14 -0
- package/src/gateway/caller-auth-gateway.ts +320 -68
- package/src/gateway/http-server.ts +717 -220
- package/src/gateway/probe-auth.ts +191 -0
- package/src/gateway/signed-rate-bounds.ts +164 -0
- package/src/gateway/x402-opener-mode.ts +1171 -0
- package/src/index.ts +82 -19
- package/src/mcp/server.ts +351 -42
- package/src/mcp/x402-tools.ts +785 -0
- package/src/network.ts +302 -0
- package/src/sdk/client.ts +25 -0
- package/src/sdk/invoke.ts +6 -5
- package/src/wallet/autonomous-wallet-broker.ts +46 -20
- package/src/wallet/autonomous-wallet-protocol.ts +11 -2
- package/src/wallet/autonomous-wallet.ts +4 -2
- package/src/wallet/broker-escrows.ts +66 -0
- package/src/wallet/lifecycle.ts +53 -18
- package/src/wallet/privy-broker-server.ts +35 -25
- package/src/wallet/privy-session-broker.ts +58 -25
- package/src/wallet/privy-session-provider.ts +7 -3
- package/src/wallet/provider.ts +20 -15
- package/src/x402/facilitator.ts +3 -43
- package/src/x402-buyer/guarded-fetch.ts +213 -0
- package/src/x402-buyer/index.ts +9 -0
- package/src/x402-buyer/pay.ts +555 -0
- package/src/x402-opener/abi.ts +881 -0
- package/src/x402-opener/facilitator-entry.ts +48 -0
- package/src/x402-opener/facilitator-server.ts +1114 -0
- package/src/x402-opener/index.ts +13 -0
- package/src/x402-opener/listing-resolver.ts +202 -0
- package/src/x402-opener/refund-relay.ts +1873 -0
- package/src/x402-opener/relayer-queue.ts +18 -0
- package/src/x402-opener/scheme.ts +1551 -0
- package/src/x402-opener/terms.ts +453 -0
- package/dist/gateway/x402-mode.d.ts +0 -123
- package/dist/gateway/x402-mode.d.ts.map +0 -1
- package/dist/gateway/x402-mode.js +0 -212
- package/dist/gateway/x402-mode.js.map +0 -1
- package/dist/x402/delivery-oracle.d.ts +0 -108
- package/dist/x402/delivery-oracle.d.ts.map +0 -1
- package/dist/x402/delivery-oracle.js +0 -174
- package/dist/x402/delivery-oracle.js.map +0 -1
- package/dist/x402/facilitator-server-entry.d.ts +0 -3
- package/dist/x402/facilitator-server-entry.d.ts.map +0 -1
- package/dist/x402/facilitator-server-entry.js +0 -27
- package/dist/x402/facilitator-server-entry.js.map +0 -1
- package/dist/x402/facilitator-server.d.ts +0 -73
- package/dist/x402/facilitator-server.d.ts.map +0 -1
- package/dist/x402/facilitator-server.js +0 -305
- package/dist/x402/facilitator-server.js.map +0 -1
- package/dist/x402/payment-requirements.d.ts +0 -106
- package/dist/x402/payment-requirements.d.ts.map +0 -1
- package/dist/x402/payment-requirements.js +0 -138
- package/dist/x402/payment-requirements.js.map +0 -1
- package/dist/x402/relayer.d.ts +0 -41
- package/dist/x402/relayer.d.ts.map +0 -1
- package/dist/x402/relayer.js +0 -64
- package/dist/x402/relayer.js.map +0 -1
- package/dist/x402/resource-index.d.ts +0 -75
- package/dist/x402/resource-index.d.ts.map +0 -1
- package/dist/x402/resource-index.js +0 -126
- package/dist/x402/resource-index.js.map +0 -1
- package/dist/x402/verified-delivery-facilitator.d.ts +0 -285
- package/dist/x402/verified-delivery-facilitator.d.ts.map +0 -1
- package/dist/x402/verified-delivery-facilitator.js +0 -423
- package/dist/x402/verified-delivery-facilitator.js.map +0 -1
- package/src/gateway/x402-mode.ts +0 -350
- package/src/x402/delivery-oracle.ts +0 -285
- package/src/x402/facilitator-server-entry.ts +0 -35
- package/src/x402/facilitator-server.ts +0 -445
- package/src/x402/payment-requirements.ts +0 -231
- package/src/x402/relayer.ts +0 -122
- package/src/x402/resource-index.ts +0 -228
- package/src/x402/verified-delivery-facilitator.ts +0 -744
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
import { verifyMandateOwnerSignature } from "../../mandates/mandate.js";
|
|
2
|
+
import { booleanFlag, integerFlag, stringFlag } from "../args.js";
|
|
3
|
+
import { formatUsdc } from "../amounts.js";
|
|
4
|
+
import { assertTestnetRpc, parseBytes32 } from "../config.js";
|
|
5
|
+
import { CliError, configError, usageError } from "../errors.js";
|
|
6
|
+
import { signRecoveryMandate } from "../mandate.js";
|
|
7
|
+
import { CDP_ENV_VARS, PRIVATE_KEY_ENV, isPrivyWalletSource, resolveCliWallet, } from "../wallet.js";
|
|
8
|
+
/** Environment fallback for `--refund-url`. */
|
|
9
|
+
export const REFUND_URL_ENV = "METRIK_AGENT_REFUND_URL";
|
|
10
|
+
const DEFAULT_ATTEMPTS = 5;
|
|
11
|
+
const DEFAULT_MAX_WAIT_SECONDS = 60;
|
|
12
|
+
export const refundCommand = {
|
|
13
|
+
name: "refund",
|
|
14
|
+
summary: "Recover the unearned part of an x402 payment through the gasless refund relay",
|
|
15
|
+
usage: "metrik refund <streamId> --refund-url <url> [--close] [--reclaim] [--attempts 5] [--max-wait 60]",
|
|
16
|
+
flags: ["refund-url", "close", "reclaim", "attempts", "max-wait"],
|
|
17
|
+
// `--close` signs the payer's EIP-712 Close (off-chain); the RELAY broadcasts
|
|
18
|
+
// and pays the gas. `--reclaim` needs no wallet at all: `opener.reclaim` is
|
|
19
|
+
// permissionless and always pays `payerOf(streamId)`.
|
|
20
|
+
signs: false,
|
|
21
|
+
requiresKey: false,
|
|
22
|
+
walletHelp: {
|
|
23
|
+
tag: "[--close needs the payer's key]",
|
|
24
|
+
text: "Broadcasts nothing itself: the seller's refund relay broadcasts and pays the gas. Status and --reclaim need no wallet. " +
|
|
25
|
+
"--close signs the payer's off-chain EIP-712 Close message, so it needs the key that paid (no ETH or USDC needed) in the environment: " +
|
|
26
|
+
`${PRIVATE_KEY_ENV} or ${CDP_ENV_VARS.join(" + ")}. A Privy wallet cannot sign the Close.`,
|
|
27
|
+
},
|
|
28
|
+
async run(context) {
|
|
29
|
+
const { args, config, env, out, deps } = context;
|
|
30
|
+
if (deps.x402 === undefined) {
|
|
31
|
+
throw new CliError("this CLI build has no x402 dependency wired (CliDependencies.x402)", { exitCode: 4 });
|
|
32
|
+
}
|
|
33
|
+
const x402 = deps.x402;
|
|
34
|
+
const [streamIdArg] = args.positionals;
|
|
35
|
+
if (streamIdArg === undefined) {
|
|
36
|
+
throw usageError("metrik refund requires a <streamId>");
|
|
37
|
+
}
|
|
38
|
+
const streamId = parseBytes32(streamIdArg, "<streamId>");
|
|
39
|
+
if (/^0x0{64}$/i.test(streamId)) {
|
|
40
|
+
// Stream id 0 = an upfront-only payment (`metrik pay` printed no stream):
|
|
41
|
+
// nothing was escrowed. A FINISHED state, not a failure — and nothing is
|
|
42
|
+
// read, requested, signed or sent for it.
|
|
43
|
+
reportNothingToRefund(context, streamId);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const refundUrl = resolveRefundUrl(stringFlag(args, "refund-url") ?? env[REFUND_URL_ENV], streamId);
|
|
47
|
+
const doClose = booleanFlag(args, "close");
|
|
48
|
+
const doReclaim = booleanFlag(args, "reclaim");
|
|
49
|
+
const attempts = integerFlag(args, "attempts") ?? DEFAULT_ATTEMPTS;
|
|
50
|
+
const maxWait = integerFlag(args, "max-wait") ?? DEFAULT_MAX_WAIT_SECONDS;
|
|
51
|
+
if (attempts < 1)
|
|
52
|
+
throw usageError("--attempts must be at least 1");
|
|
53
|
+
const read = deps.createReadClient(config);
|
|
54
|
+
await assertTestnetRpc(config, () => read.getChainId());
|
|
55
|
+
// Bind the relay to the stream AS THE CHAIN SEES IT: the opener comes from
|
|
56
|
+
// `factory.isOpener(buyer)` on-chain, never from the relay's answer.
|
|
57
|
+
const stream = await read.getStreamV2(streamId);
|
|
58
|
+
const opener = stream.opener ?? null;
|
|
59
|
+
if (opener === null) {
|
|
60
|
+
throw configError(`stream ${streamId} was not opened by an x402 opener, so the refund relay does not serve it`, `the buyer is ${stream.buyer}, an ordinary wallet: use \`metrik close ${streamId}\` and \`metrik reclaim ${streamId}\` with that wallet.`);
|
|
61
|
+
}
|
|
62
|
+
const refunds = await x402.refundClient(config, {
|
|
63
|
+
refundUrl,
|
|
64
|
+
streamId,
|
|
65
|
+
opener,
|
|
66
|
+
maxAttempts: attempts,
|
|
67
|
+
maxDelayMs: maxWait * 1_000,
|
|
68
|
+
});
|
|
69
|
+
let closeResult = null;
|
|
70
|
+
let closeSkipped = null;
|
|
71
|
+
// Set when the relay itself says there is nothing left: the stream was
|
|
72
|
+
// already reclaimed, or the verified delivery covers the whole deposit.
|
|
73
|
+
// Those are FINISHED recoveries, not failures — a second
|
|
74
|
+
// `--close --reclaim` on a done stream must exit 0 and must never point
|
|
75
|
+
// the payer at a gas-spending on-chain recovery that cannot recover a cent.
|
|
76
|
+
let finishedByRelay = null;
|
|
77
|
+
if (doClose) {
|
|
78
|
+
// Ask first: a stream that is already closed (or already finished) needs
|
|
79
|
+
// no Close, so there is nothing to sign and no wallet is needed.
|
|
80
|
+
const before = await relay(() => refunds.status());
|
|
81
|
+
const finishedBefore = finishedReason(before);
|
|
82
|
+
if (finishedBefore !== null || before.status === "closed") {
|
|
83
|
+
closeSkipped = finishedBefore ?? "already-closed";
|
|
84
|
+
finishedByRelay = finishedBefore;
|
|
85
|
+
out.note(finishedBefore === null
|
|
86
|
+
? "stream is already closed — no Close to sign."
|
|
87
|
+
: `stream is already closed and ${finishedBefore === "reclaimed" ? "reclaimed" : "has nothing left to reclaim"} — no Close to sign.`);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
const wallet = await resolveCliWallet(env, {
|
|
91
|
+
purpose: "payer-close",
|
|
92
|
+
note: out.note,
|
|
93
|
+
rpcUrl: config.rpcUrl,
|
|
94
|
+
});
|
|
95
|
+
if (isPrivyWalletSource(wallet.source)) {
|
|
96
|
+
throw configError("metrik refund --close cannot sign with a Privy wallet", "the payer signs the opener's EIP-712 Close, which the Privy broker's typed-data policy does not allow. Use the key that paid.");
|
|
97
|
+
}
|
|
98
|
+
// Buyer recovery: authorized on the mandate OWNER's signature alone,
|
|
99
|
+
// like `metrik close` — never on caps or expiry, so nothing can strand
|
|
100
|
+
// the payer's own money. The SDK then refuses a signer that is not
|
|
101
|
+
// `payerOf(streamId)` before anything is signed for the relay.
|
|
102
|
+
const mandate = await signRecoveryMandate(wallet.account, config.chainId);
|
|
103
|
+
const decision = await verifyMandateOwnerSignature(mandate);
|
|
104
|
+
if (!decision.allowed) {
|
|
105
|
+
throw new CliError(`mandate denied: ${decision.reason}`, {
|
|
106
|
+
exitCode: 3,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
closeResult = await relay(() => refunds.close({
|
|
111
|
+
signer: wallet.account,
|
|
112
|
+
}));
|
|
113
|
+
out.note(`close relayed in ${closeResult.transaction}${closeResult.verified ? " (receipt verified on-chain)" : ""}`);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
// The status read above said "active", but the stream closed in the
|
|
117
|
+
// meantime (it reached expiresAt, or another close landed): the
|
|
118
|
+
// state the payer asked for. Anything else is a real failure.
|
|
119
|
+
if (relayCode(error) !== "already-closed")
|
|
120
|
+
throw error;
|
|
121
|
+
closeSkipped = "already-closed";
|
|
122
|
+
out.note("stream was already closed — no Close was needed.");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
let reclaimResult = null;
|
|
127
|
+
let reclaimSkipped = null;
|
|
128
|
+
if (doReclaim) {
|
|
129
|
+
if (finishedByRelay !== null) {
|
|
130
|
+
reclaimSkipped = finishedByRelay;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
context.progress?.setActivity(`waiting on the refund relay's reclaim (it retries up to ${attempts} time${attempts === 1 ? "" : "s"} while the settlement window is open, at most ${maxWait}s per wait)`);
|
|
134
|
+
try {
|
|
135
|
+
reclaimResult = await relay(() => refunds.reclaim());
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
const finished = finishedFromRelayCode(relayCode(error));
|
|
139
|
+
if (finished === null)
|
|
140
|
+
throw error;
|
|
141
|
+
reclaimSkipped = finished;
|
|
142
|
+
finishedByRelay = finished;
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
context.progress?.setActivity(null);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const status = await relay(() => refunds.status());
|
|
150
|
+
// A reclaim THIS run performed is reported as a reclaim, not as "already
|
|
151
|
+
// finished".
|
|
152
|
+
const finished = reclaimResult === null
|
|
153
|
+
? (finishedReason(status) ?? finishedByRelay)
|
|
154
|
+
: null;
|
|
155
|
+
out.result({
|
|
156
|
+
streamId,
|
|
157
|
+
opener,
|
|
158
|
+
payer: status.payer,
|
|
159
|
+
status: status.status,
|
|
160
|
+
reclaimed: status.reclaimed,
|
|
161
|
+
reclaimable: status.reclaimable,
|
|
162
|
+
next: status.next,
|
|
163
|
+
close: closeResult === null
|
|
164
|
+
? null
|
|
165
|
+
: {
|
|
166
|
+
transaction: closeResult.transaction,
|
|
167
|
+
verified: closeResult.verified,
|
|
168
|
+
},
|
|
169
|
+
reclaim: reclaimResult === null
|
|
170
|
+
? null
|
|
171
|
+
: {
|
|
172
|
+
transaction: reclaimResult.transaction,
|
|
173
|
+
amount: reclaimResult.amount,
|
|
174
|
+
verified: reclaimResult.verified,
|
|
175
|
+
},
|
|
176
|
+
// Why a requested `--close` / `--reclaim` sent nothing (null when it was
|
|
177
|
+
// sent, or not requested).
|
|
178
|
+
closeSkipped,
|
|
179
|
+
reclaimSkipped,
|
|
180
|
+
// True when the recovery is over: nothing is left for the payer to get
|
|
181
|
+
// back (already reclaimed, or the verified delivery covers the deposit).
|
|
182
|
+
finished: finished !== null,
|
|
183
|
+
finishedReason: finished,
|
|
184
|
+
nothingToRecover: finished !== null,
|
|
185
|
+
refundIsAutomatic: false,
|
|
186
|
+
});
|
|
187
|
+
out.print(`x402 stream ${streamId}`);
|
|
188
|
+
out.table(statusRows(status, closeResult, reclaimResult, closeSkipped, finished));
|
|
189
|
+
out.print("");
|
|
190
|
+
out.print(finished === null
|
|
191
|
+
? nextStep(status, streamId, refundUrl)
|
|
192
|
+
: describeFinished(finished));
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
/**
|
|
196
|
+
* Whether the relay's status says nothing is left to recover. `reclaimed` is
|
|
197
|
+
* the chain's one-reclaim-per-stream flag; `next: none` with `reclaimable: 0`
|
|
198
|
+
* is the relay's "the verified delivery covers the whole deposit".
|
|
199
|
+
*/
|
|
200
|
+
export function finishedReason(status) {
|
|
201
|
+
if (status.reclaimed)
|
|
202
|
+
return "reclaimed";
|
|
203
|
+
if (status.next.action === "none" && status.reclaimable === 0n) {
|
|
204
|
+
return "nothing-to-reclaim";
|
|
205
|
+
}
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
/** The relay's 409 codes that mean "finished", not "failed". */
|
|
209
|
+
function finishedFromRelayCode(code) {
|
|
210
|
+
if (code === "already-reclaimed")
|
|
211
|
+
return "reclaimed";
|
|
212
|
+
if (code === "nothing-to-reclaim")
|
|
213
|
+
return "nothing-to-reclaim";
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
function relayCode(error) {
|
|
217
|
+
for (let current = error, depth = 0; depth < 4; depth++) {
|
|
218
|
+
if (!(current instanceof Error))
|
|
219
|
+
return null;
|
|
220
|
+
const code = current.code;
|
|
221
|
+
if (current.name === "RefundRelayError" && typeof code === "string") {
|
|
222
|
+
return code;
|
|
223
|
+
}
|
|
224
|
+
current = current.cause;
|
|
225
|
+
}
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
/** The `metrik refund` answer for an upfront-only payment (exit 0). */
|
|
229
|
+
function reportNothingToRefund(context, streamId) {
|
|
230
|
+
context.out.result({
|
|
231
|
+
streamId,
|
|
232
|
+
opener: null,
|
|
233
|
+
payer: null,
|
|
234
|
+
status: null,
|
|
235
|
+
reclaimed: false,
|
|
236
|
+
reclaimable: null,
|
|
237
|
+
next: { action: "none" },
|
|
238
|
+
close: null,
|
|
239
|
+
reclaim: null,
|
|
240
|
+
closeSkipped: null,
|
|
241
|
+
reclaimSkipped: null,
|
|
242
|
+
finished: true,
|
|
243
|
+
finishedReason: "upfront-only",
|
|
244
|
+
nothingToRecover: true,
|
|
245
|
+
nothingToRefund: true,
|
|
246
|
+
refundIsAutomatic: false,
|
|
247
|
+
});
|
|
248
|
+
context.out.print("Nothing to refund: this was an upfront-only payment. The whole price was a non-refundable per-call charge paid to the seller at settlement, no escrow stream was opened, and the payment is final. Nothing was requested, signed or sent.");
|
|
249
|
+
}
|
|
250
|
+
export function describeFinished(reason) {
|
|
251
|
+
return reason === "reclaimed"
|
|
252
|
+
? "Already finished: the stream is closed and was already reclaimed — the unearned remainder went to the payer. Nothing left to recover."
|
|
253
|
+
: "Already finished: nothing to recover — the verified delivery covers the whole deposit, so none of it is unearned.";
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Accepts the relay's full stream URL, a `{streamId}` template, or the relay's
|
|
257
|
+
* base origin (`https://relay.example` -> `https://relay.example/streams/<id>`).
|
|
258
|
+
*/
|
|
259
|
+
export function resolveRefundUrl(raw, streamId) {
|
|
260
|
+
if (raw === undefined || raw.trim().length === 0) {
|
|
261
|
+
throw usageError(`metrik refund needs the seller's refund relay: pass --refund-url (printed by \`metrik pay\`) or set ${REFUND_URL_ENV}`);
|
|
262
|
+
}
|
|
263
|
+
const value = raw.trim();
|
|
264
|
+
if (value.includes("{streamId}"))
|
|
265
|
+
return value;
|
|
266
|
+
let url;
|
|
267
|
+
try {
|
|
268
|
+
url = new URL(value);
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
throw usageError(`--refund-url must be an absolute http(s) URL (got "${value}")`);
|
|
272
|
+
}
|
|
273
|
+
if (/\/streams\/0x[0-9a-fA-F]{64}\/?$/.test(url.pathname))
|
|
274
|
+
return value;
|
|
275
|
+
url.pathname = `${url.pathname.replace(/\/+$/, "")}/streams/${streamId}`;
|
|
276
|
+
return url.toString();
|
|
277
|
+
}
|
|
278
|
+
async function relay(task) {
|
|
279
|
+
try {
|
|
280
|
+
return await task();
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
throw explainRefundFailure(error);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
export function explainRefundFailure(error) {
|
|
287
|
+
if (!(error instanceof Error))
|
|
288
|
+
return error;
|
|
289
|
+
switch (error.name) {
|
|
290
|
+
case "NothingToRefundError":
|
|
291
|
+
return new CliError(error.message, {
|
|
292
|
+
exitCode: 3,
|
|
293
|
+
hint: "this is an upfront-only payment (stream id 0): nothing was escrowed and there is nothing to refund. Run `metrik refund 0x0000…0000` to confirm; it exits 0.",
|
|
294
|
+
cause: error,
|
|
295
|
+
});
|
|
296
|
+
case "RefundNotReadyError": {
|
|
297
|
+
const retryAt = error.retryAt;
|
|
298
|
+
return new CliError(error.message, {
|
|
299
|
+
exitCode: 3,
|
|
300
|
+
hint: retryAt === undefined || retryAt === null
|
|
301
|
+
? "the relay is not ready to reclaim yet (the settlement window is open). Re-run later with --reclaim."
|
|
302
|
+
: `the relay can reclaim from ${new Date(retryAt * 1000).toISOString()}. Re-run then with --reclaim (or raise --max-wait to wait here).`,
|
|
303
|
+
cause: error,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
case "RefundRelayError": {
|
|
307
|
+
const code = error.code;
|
|
308
|
+
return new CliError(error.message, {
|
|
309
|
+
exitCode: 3,
|
|
310
|
+
hint: relayRefusalHint(code),
|
|
311
|
+
cause: error,
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
case "NotStreamPayerError":
|
|
315
|
+
return new CliError(error.message, {
|
|
316
|
+
exitCode: 3,
|
|
317
|
+
hint: "only the address that paid (payerOf(streamId)) can sign the close. Nothing was signed.",
|
|
318
|
+
cause: error,
|
|
319
|
+
});
|
|
320
|
+
default:
|
|
321
|
+
return error;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* What to do after a relay refusal. The on-chain fallback is only offered
|
|
326
|
+
* where it can still recover something: never "close it (needs gas)" for a
|
|
327
|
+
* stream that is already closed, and never any recovery at all for one with
|
|
328
|
+
* nothing left in it.
|
|
329
|
+
*/
|
|
330
|
+
export function relayRefusalHint(code) {
|
|
331
|
+
const label = `relay refusal${code === undefined ? "" : ` (${code})`}`;
|
|
332
|
+
switch (code) {
|
|
333
|
+
case "already-reclaimed":
|
|
334
|
+
case "nothing-to-reclaim":
|
|
335
|
+
return `${label}. Nothing is left to recover for this stream, on-chain or through the relay.`;
|
|
336
|
+
case "already-closed":
|
|
337
|
+
return `${label}. The stream is already closed, so no close is needed: reclaim the unearned remainder with --reclaim (no wallet, no gas), or \`metrik reclaim\` (anyone).`;
|
|
338
|
+
case "not-closable":
|
|
339
|
+
return `${label}. The relay's next step is not a close (the stream may have reached expiresAt by itself): run without --close to see the next step.`;
|
|
340
|
+
default:
|
|
341
|
+
return `${label}. The payer can always recover on-chain without the relay: \`metrik close\` (as the payer, needs gas) and \`metrik reclaim\` (anyone).`;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
function statusRows(status, closeResult, reclaimResult, closeSkipped, finished) {
|
|
345
|
+
const rows = [
|
|
346
|
+
[
|
|
347
|
+
"status",
|
|
348
|
+
status.reclaimed ? `${status.status} (reclaimed)` : status.status,
|
|
349
|
+
],
|
|
350
|
+
...(finished === null
|
|
351
|
+
? []
|
|
352
|
+
: [["recovery", "finished — nothing to recover"]]),
|
|
353
|
+
["payer", status.payer],
|
|
354
|
+
["opener", status.opener],
|
|
355
|
+
[
|
|
356
|
+
"reclaimable",
|
|
357
|
+
status.reclaimable === null ? "-" : formatUsdc(status.reclaimable),
|
|
358
|
+
],
|
|
359
|
+
["next", status.next.action],
|
|
360
|
+
];
|
|
361
|
+
if (closeResult === null && closeSkipped !== null) {
|
|
362
|
+
rows.push(["close", "skipped — already closed"]);
|
|
363
|
+
}
|
|
364
|
+
if (closeResult !== null) {
|
|
365
|
+
rows.push([
|
|
366
|
+
"close tx",
|
|
367
|
+
`${closeResult.transaction}${closeResult.verified ? " (verified)" : " (relay-reported)"}`,
|
|
368
|
+
]);
|
|
369
|
+
}
|
|
370
|
+
if (reclaimResult !== null) {
|
|
371
|
+
rows.push([
|
|
372
|
+
"reclaim tx",
|
|
373
|
+
`${reclaimResult.transaction}${reclaimResult.verified ? " (verified)" : " (relay-reported)"}`,
|
|
374
|
+
]);
|
|
375
|
+
if (reclaimResult.amount !== null) {
|
|
376
|
+
rows.push(["refunded to payer", formatUsdc(reclaimResult.amount)]);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
return rows;
|
|
380
|
+
}
|
|
381
|
+
function nextStep(status, streamId, refundUrl) {
|
|
382
|
+
if (status.reclaimed) {
|
|
383
|
+
return "Reclaimed: the unearned remainder was returned to the payer.";
|
|
384
|
+
}
|
|
385
|
+
const base = `metrik refund ${streamId} --refund-url ${refundUrl}`;
|
|
386
|
+
switch (status.next.action) {
|
|
387
|
+
case "close":
|
|
388
|
+
return `Refunds are NOT automatic. The stream is still running: stop it with ${base} --close --reclaim`;
|
|
389
|
+
case "reclaim":
|
|
390
|
+
return `Refunds are NOT automatic. Reclaim the unearned remainder with ${base} --reclaim`;
|
|
391
|
+
case "wait":
|
|
392
|
+
return `Refunds are NOT automatic, and the settlement window is still open${status.next.retryAt === undefined ? "" : ` until ${new Date(status.next.retryAt * 1000).toISOString()}`}. Then run ${base} --reclaim`;
|
|
393
|
+
default:
|
|
394
|
+
return `Refunds are NOT automatic. The relay says: ${status.next.message ?? status.next.action}.`;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
//# sourceMappingURL=refund.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refund.js","sourceRoot":"","sources":["../../../src/cli/commands/refund.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjE,eAAO,MAAM,aAAa,EAAE,WAsE3B,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { attesterDisclosure } from "../attesters.js";
|
|
|
2
2
|
import { assertTestnetRpc, parseBytes32 } from "../config.js";
|
|
3
3
|
import { usageError } from "../errors.js";
|
|
4
4
|
import { readStreamReport, streamReportJson, streamReportRows, } from "../status.js";
|
|
5
|
+
import { escrowGenerationFor } from "../../escrow-generation.js";
|
|
5
6
|
export const statusCommand = {
|
|
6
7
|
name: "status",
|
|
7
8
|
summary: "Show a stream's on-chain state and its oracle-verified accrual",
|
|
@@ -21,7 +22,7 @@ export const statusCommand = {
|
|
|
21
22
|
// diverge from index 5 onward, so a wrong-chain read does not revert — it
|
|
22
23
|
// silently decodes something else into fields with the right names.
|
|
23
24
|
await assertTestnetRpc(config, () => read.getChainId());
|
|
24
|
-
const report = await readStreamReport(read, streamId, deps.nowSeconds());
|
|
25
|
+
const report = await readStreamReport(read, streamId, deps.nowSeconds(), escrowGenerationFor(config.chainId, config.escrow));
|
|
25
26
|
out.result(streamReportJson(report));
|
|
26
27
|
// Who attests, before the numbers. Printed on stderr so it survives `--json`
|
|
27
28
|
// and cannot be lost by a consumer that only parses stdout.
|
|
@@ -30,11 +31,29 @@ export const statusCommand = {
|
|
|
30
31
|
out.note(disclosure);
|
|
31
32
|
out.print(`Stream ${streamId}`);
|
|
32
33
|
out.table(streamReportRows(report));
|
|
34
|
+
// A finished stream — reclaimed, or stopped with the whole deposit already
|
|
35
|
+
// the operator's — has nothing pending on the buyer's side: the close /
|
|
36
|
+
// reclaim / refund guidance and the "no checkpoint yet" note below would all
|
|
37
|
+
// read as money still pending.
|
|
38
|
+
if (report.finalSettlement !== null)
|
|
39
|
+
return;
|
|
40
|
+
const opener = report.stream.opener ?? null;
|
|
41
|
+
if (opener !== null) {
|
|
42
|
+
out.print("");
|
|
43
|
+
out.print(`Bought over x402: the escrow accepts close/reclaim only from the opener ${opener}. ` +
|
|
44
|
+
`\`metrik close ${streamId}\` (signed by the payer ${report.stream.payer}) routes through it; ` +
|
|
45
|
+
`\`metrik reclaim ${streamId}\` sends the permissionless opener.reclaim, and the refund always goes to the payer. ` +
|
|
46
|
+
"A payer with no gas can use the seller's relay instead: `metrik refund <streamId> --refund-url <url> --close --reclaim`. Nothing refunds automatically.");
|
|
47
|
+
}
|
|
33
48
|
if (report.settlement.pending) {
|
|
34
49
|
out.print("");
|
|
35
50
|
out.print("This stream has stopped but its final checkpoint has not landed, so there is no settled reclaimable figure yet — reclaim reverts until the oracle publishes a checkpoint reaching the stop time. `metrik reclaim <streamId>` waits for exactly that.");
|
|
36
51
|
}
|
|
37
|
-
|
|
52
|
+
// A V3 stream the latest checkpoint no longer lists may still have value
|
|
53
|
+
// proven on-chain; the verified-accrual row states it, so "no checkpoint
|
|
54
|
+
// covers this stream yet" would contradict the row above it.
|
|
55
|
+
const provenOnChain = report.provenCumulative !== null && report.provenCumulative > 0n;
|
|
56
|
+
if (report.proof === null && !provenOnChain) {
|
|
38
57
|
out.print("");
|
|
39
58
|
out.print("No checkpoint covers this stream yet. Accrual is published by the oracle roughly every 15-22s; funds are earned only for intervals that verified.");
|
|
40
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { BASE_SEPOLIA_ESCROW_V2 } from "@absol-labs/sdk";
|
|
2
1
|
import { getAddress, isAddress } from "viem";
|
|
3
2
|
import { integerFlag, stringFlag } from "../args.js";
|
|
4
3
|
import { formatUsdc } from "../amounts.js";
|
|
5
|
-
import {
|
|
4
|
+
import { assertTestnetRpc, escrowDeployBlock, } from "../config.js";
|
|
6
5
|
import { CliError, configError, usageError } from "../errors.js";
|
|
7
6
|
import { escrowScanRange } from "../scan-range.js";
|
|
8
7
|
import { optionalCliWallet, PRIVATE_KEY_ENV } from "../wallet.js";
|
|
@@ -18,7 +17,7 @@ const SCAN_CONCURRENCY = 6;
|
|
|
18
17
|
/**
|
|
19
18
|
* Attempts per window before it is reported as unscanned. A public RPC answers
|
|
20
19
|
* a burst of `eth_getLogs` with an occasional 429 — measured against
|
|
21
|
-
*
|
|
20
|
+
* the network's public RPC, 2 of 212 windows on a full-history scan — and a transient
|
|
22
21
|
* rate-limit is NOT a window that cannot be scanned. Declaring it one would
|
|
23
22
|
* make the "this scan is incomplete" warning routine, and a warning that fires
|
|
24
23
|
* on every healthy run is a warning nobody reads on the run that matters.
|
|
@@ -49,7 +48,7 @@ export const streamsCommand = {
|
|
|
49
48
|
// index 5 onward — a wrong-chain read does not revert, it decodes something
|
|
50
49
|
// else into fields with the right names.
|
|
51
50
|
await assertTestnetRpc(config, () => read.getChainId());
|
|
52
|
-
const anchor = resolveAnchorBlock(args, config
|
|
51
|
+
const anchor = resolveAnchorBlock(args, config);
|
|
53
52
|
const head = await read.blockNumber();
|
|
54
53
|
const range = escrowScanRange(head, anchor.block);
|
|
55
54
|
// Retention canary, before the scan is believed. A node that has pruned its
|
|
@@ -184,19 +183,16 @@ async function resolveScanAddress(context) {
|
|
|
184
183
|
* constant for — so an overridden `--escrow` or `--from-block` scans without a
|
|
185
184
|
* canary rather than with a meaningless one.
|
|
186
185
|
*/
|
|
187
|
-
function resolveAnchorBlock(args,
|
|
186
|
+
function resolveAnchorBlock(args, config) {
|
|
188
187
|
const override = integerFlag(args, "from-block");
|
|
189
|
-
const
|
|
188
|
+
const deployBlock = escrowDeployBlock(config);
|
|
190
189
|
if (override !== undefined) {
|
|
191
190
|
return { block: BigInt(override), canary: null };
|
|
192
191
|
}
|
|
193
|
-
if (
|
|
194
|
-
throw configError(`no scan anchor is known for escrow ${escrow}`,
|
|
192
|
+
if (deployBlock === undefined) {
|
|
193
|
+
throw configError(`no scan anchor is known for escrow ${config.escrow}`, `the scan is anchored at the escrow's deploy block, and the network registry only records it for ${config.network.name}'s registered escrow (${config.network.escrow.address}). Pass --from-block <deploy block> for a different escrow.`);
|
|
195
194
|
}
|
|
196
|
-
return {
|
|
197
|
-
block: BASE_SEPOLIA_ESCROW_V2_DEPLOY_BLOCK,
|
|
198
|
-
canary: BASE_SEPOLIA_ESCROW_V2_DEPLOY_BLOCK,
|
|
199
|
-
};
|
|
195
|
+
return { block: deployBlock, canary: deployBlock };
|
|
200
196
|
}
|
|
201
197
|
/**
|
|
202
198
|
* Page every window for every selected role filter, bounded concurrency.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streams.js","sourceRoot":"","sources":["../../../src/cli/commands/streams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"streams.js","sourceRoot":"","sources":["../../../src/cli/commands/streams.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,eAAe,CAAC;AAKjE,eAAO,MAAM,YAAY,EAAE,WAkE1B,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { integerFlag } from "../args.js";
|
|
|
2
2
|
import { assertTestnetRpc, parseBytes32 } from "../config.js";
|
|
3
3
|
import { describeError, usageError } from "../errors.js";
|
|
4
4
|
import { readStreamReport, streamReportJson, streamReportRows, } from "../status.js";
|
|
5
|
+
import { escrowGenerationFor } from "../../escrow-generation.js";
|
|
5
6
|
const DEFAULT_INTERVAL_SECONDS = 15;
|
|
6
7
|
export const watchCommand = {
|
|
7
8
|
name: "watch",
|
|
@@ -25,12 +26,14 @@ export const watchCommand = {
|
|
|
25
26
|
// Same chain allowlist as the signing paths — see `status`.
|
|
26
27
|
await assertTestnetRpc(config, () => read.getChainId());
|
|
27
28
|
out.note(`watching ${streamId} every ${interval}s — the oracle checkpoints roughly every 15-22s.`);
|
|
29
|
+
// `watch` IS a poll: the heartbeat says so rather than blaming a slow RPC.
|
|
30
|
+
context.progress?.setActivity(`polling ${streamId} every ${interval}s until it closes${maxPolls === undefined ? "" : ` (at most ${maxPolls} polls)`}`);
|
|
28
31
|
for (let poll = 0; maxPolls === undefined || poll < maxPolls; poll++) {
|
|
29
32
|
if (poll > 0)
|
|
30
33
|
await deps.sleep(interval * 1_000);
|
|
31
34
|
let report;
|
|
32
35
|
try {
|
|
33
|
-
report = await readStreamReport(read, streamId, deps.nowSeconds());
|
|
36
|
+
report = await readStreamReport(read, streamId, deps.nowSeconds(), escrowGenerationFor(config.chainId, config.escrow));
|
|
34
37
|
}
|
|
35
38
|
catch (error) {
|
|
36
39
|
// A transient RPC blip must not end a long watch.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"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"}
|