@arc402/sdk 0.2.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.
Files changed (128) hide show
  1. package/README.md +184 -0
  2. package/dist/agent.d.ts +29 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +95 -0
  5. package/dist/agreement.d.ts +57 -0
  6. package/dist/agreement.d.ts.map +1 -0
  7. package/dist/agreement.js +156 -0
  8. package/dist/capability.d.ts +17 -0
  9. package/dist/capability.d.ts.map +1 -0
  10. package/dist/capability.js +19 -0
  11. package/dist/channel.d.ts +39 -0
  12. package/dist/channel.d.ts.map +1 -0
  13. package/dist/channel.js +160 -0
  14. package/dist/coldstart.d.ts +15 -0
  15. package/dist/coldstart.d.ts.map +1 -0
  16. package/dist/coldstart.js +44 -0
  17. package/dist/context.d.ts +2 -0
  18. package/dist/context.d.ts.map +1 -0
  19. package/dist/context.js +2 -0
  20. package/dist/contractinteraction.d.ts +47 -0
  21. package/dist/contractinteraction.d.ts.map +1 -0
  22. package/dist/contractinteraction.js +80 -0
  23. package/dist/contracts.d.ts +27 -0
  24. package/dist/contracts.d.ts.map +1 -0
  25. package/dist/contracts.js +187 -0
  26. package/dist/deliverable.d.ts +118 -0
  27. package/dist/deliverable.d.ts.map +1 -0
  28. package/dist/deliverable.js +156 -0
  29. package/dist/dispute-arbitration.d.ts +42 -0
  30. package/dist/dispute-arbitration.d.ts.map +1 -0
  31. package/dist/dispute-arbitration.js +160 -0
  32. package/dist/governance.d.ts +13 -0
  33. package/dist/governance.d.ts.map +1 -0
  34. package/dist/governance.js +15 -0
  35. package/dist/index.d.ts +31 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +92 -0
  38. package/dist/intent.d.ts +13 -0
  39. package/dist/intent.d.ts.map +1 -0
  40. package/dist/intent.js +26 -0
  41. package/dist/metadata.d.ts +55 -0
  42. package/dist/metadata.d.ts.map +1 -0
  43. package/dist/metadata.js +106 -0
  44. package/dist/migration.d.ts +11 -0
  45. package/dist/migration.d.ts.map +1 -0
  46. package/dist/migration.js +38 -0
  47. package/dist/multiparty.d.ts +56 -0
  48. package/dist/multiparty.d.ts.map +1 -0
  49. package/dist/multiparty.js +86 -0
  50. package/dist/negotiation-guard.d.ts +20 -0
  51. package/dist/negotiation-guard.d.ts.map +1 -0
  52. package/dist/negotiation-guard.js +96 -0
  53. package/dist/negotiation.d.ts +25 -0
  54. package/dist/negotiation.d.ts.map +1 -0
  55. package/dist/negotiation.js +102 -0
  56. package/dist/policy.d.ts +33 -0
  57. package/dist/policy.d.ts.map +1 -0
  58. package/dist/policy.js +72 -0
  59. package/dist/reputation.d.ts +13 -0
  60. package/dist/reputation.d.ts.map +1 -0
  61. package/dist/reputation.js +21 -0
  62. package/dist/session-manager.d.ts +13 -0
  63. package/dist/session-manager.d.ts.map +1 -0
  64. package/dist/session-manager.js +102 -0
  65. package/dist/settlement.d.ts +14 -0
  66. package/dist/settlement.d.ts.map +1 -0
  67. package/dist/settlement.js +35 -0
  68. package/dist/sponsorship.d.ts +17 -0
  69. package/dist/sponsorship.d.ts.map +1 -0
  70. package/dist/sponsorship.js +19 -0
  71. package/dist/trust.d.ts +22 -0
  72. package/dist/trust.d.ts.map +1 -0
  73. package/dist/trust.js +52 -0
  74. package/dist/types.d.ts +391 -0
  75. package/dist/types.d.ts.map +1 -0
  76. package/dist/types.js +119 -0
  77. package/dist/wallet.d.ts +31 -0
  78. package/dist/wallet.d.ts.map +1 -0
  79. package/dist/wallet.js +83 -0
  80. package/dist/watchtower.d.ts +60 -0
  81. package/dist/watchtower.d.ts.map +1 -0
  82. package/dist/watchtower.js +93 -0
  83. package/package.json +30 -0
  84. package/src/agent.ts +122 -0
  85. package/src/agreement.ts +236 -0
  86. package/src/capability.ts +18 -0
  87. package/src/channel.ts +203 -0
  88. package/src/coldstart.ts +52 -0
  89. package/src/context.ts +2 -0
  90. package/src/contractinteraction.d.ts +47 -0
  91. package/src/contractinteraction.d.ts.map +1 -0
  92. package/src/contractinteraction.js +81 -0
  93. package/src/contractinteraction.js.map +1 -0
  94. package/src/contractinteraction.ts +157 -0
  95. package/src/contracts.d.ts +27 -0
  96. package/src/contracts.d.ts.map +1 -0
  97. package/src/contracts.js +188 -0
  98. package/src/contracts.js.map +1 -0
  99. package/src/contracts.ts +186 -0
  100. package/src/deliverable.ts +231 -0
  101. package/src/demos/demo-insurance.ts +148 -0
  102. package/src/demos/demo-multiagent.ts +197 -0
  103. package/src/demos/demo-research.ts +124 -0
  104. package/src/dispute-arbitration.ts +196 -0
  105. package/src/governance.ts +14 -0
  106. package/src/index.ts +31 -0
  107. package/src/intent.ts +22 -0
  108. package/src/metadata.ts +158 -0
  109. package/src/migration.ts +43 -0
  110. package/src/multiparty.ts +132 -0
  111. package/src/negotiation-guard.ts +125 -0
  112. package/src/negotiation.ts +135 -0
  113. package/src/policy.ts +71 -0
  114. package/src/reputation.ts +20 -0
  115. package/src/session-manager.ts +80 -0
  116. package/src/settlement.ts +31 -0
  117. package/src/sponsorship.ts +18 -0
  118. package/src/trust.ts +43 -0
  119. package/src/types.d.ts +391 -0
  120. package/src/types.d.ts.map +1 -0
  121. package/src/types.js +113 -0
  122. package/src/types.js.map +1 -0
  123. package/src/types.ts +484 -0
  124. package/src/wallet.ts +86 -0
  125. package/src/watchtower.ts +124 -0
  126. package/test/negotiation-signing.test.js +157 -0
  127. package/test/sdk.test.js +19 -0
  128. package/tsconfig.json +17 -0
package/dist/index.js ADDED
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.MigrationClient = exports.ColdStartClient = exports.AGENT_METADATA_SCHEMA = exports.uploadMetadata = exports.decodeMetadata = exports.encodeMetadata = exports.validateMetadata = exports.buildMetadata = exports.uploadEncryptedIPFS = exports.decryptDeliverable = exports.encryptDeliverable = exports.uploadToIPFS = exports.hashDeliverableFile = exports.hashDeliverable = exports.DeliverableType = exports.DeliverableClient = exports.WatchtowerClient = exports.AgreementTreeClient = exports.ChannelClient = exports.SessionManager = exports.NegotiationGuard = exports.parseNegotiationMessage = exports.createNegotiationReject = exports.createNegotiationAccept = exports.createNegotiationCounter = exports.createNegotiationProposal = exports.createSignedReject = exports.createSignedAccept = exports.createSignedCounter = exports.createSignedProposal = exports.signNegotiationMessage = exports.GovernanceClient = exports.CapabilityRegistryClient = exports.SponsorshipAttestationClient = exports.ReputationOracleClient = exports.DisputeArbitrationClient = exports.ServiceAgreementClient = exports.AgentRegistryClient = exports.MultiAgentSettlement = exports.SettlementClient = exports.IntentAttestation = exports.IntentAttestationClient = exports.TrustPrimitive = exports.TrustClient = exports.PolicyValidator = exports.PolicyObject = exports.PolicyClient = exports.ContractInteractionClient = exports.ARC402Wallet = exports.ARC402WalletClient = void 0;
18
+ var wallet_1 = require("./wallet");
19
+ Object.defineProperty(exports, "ARC402WalletClient", { enumerable: true, get: function () { return wallet_1.ARC402WalletClient; } });
20
+ Object.defineProperty(exports, "ARC402Wallet", { enumerable: true, get: function () { return wallet_1.ARC402Wallet; } });
21
+ var contractinteraction_1 = require("./contractinteraction");
22
+ Object.defineProperty(exports, "ContractInteractionClient", { enumerable: true, get: function () { return contractinteraction_1.ContractInteractionClient; } });
23
+ var policy_1 = require("./policy");
24
+ Object.defineProperty(exports, "PolicyClient", { enumerable: true, get: function () { return policy_1.PolicyClient; } });
25
+ Object.defineProperty(exports, "PolicyObject", { enumerable: true, get: function () { return policy_1.PolicyObject; } });
26
+ Object.defineProperty(exports, "PolicyValidator", { enumerable: true, get: function () { return policy_1.PolicyValidator; } });
27
+ var trust_1 = require("./trust");
28
+ Object.defineProperty(exports, "TrustClient", { enumerable: true, get: function () { return trust_1.TrustClient; } });
29
+ Object.defineProperty(exports, "TrustPrimitive", { enumerable: true, get: function () { return trust_1.TrustPrimitive; } });
30
+ var intent_1 = require("./intent");
31
+ Object.defineProperty(exports, "IntentAttestationClient", { enumerable: true, get: function () { return intent_1.IntentAttestationClient; } });
32
+ Object.defineProperty(exports, "IntentAttestation", { enumerable: true, get: function () { return intent_1.IntentAttestation; } });
33
+ var settlement_1 = require("./settlement");
34
+ Object.defineProperty(exports, "SettlementClient", { enumerable: true, get: function () { return settlement_1.SettlementClient; } });
35
+ Object.defineProperty(exports, "MultiAgentSettlement", { enumerable: true, get: function () { return settlement_1.MultiAgentSettlement; } });
36
+ var agent_1 = require("./agent");
37
+ Object.defineProperty(exports, "AgentRegistryClient", { enumerable: true, get: function () { return agent_1.AgentRegistryClient; } });
38
+ var agreement_1 = require("./agreement");
39
+ Object.defineProperty(exports, "ServiceAgreementClient", { enumerable: true, get: function () { return agreement_1.ServiceAgreementClient; } });
40
+ var dispute_arbitration_1 = require("./dispute-arbitration");
41
+ Object.defineProperty(exports, "DisputeArbitrationClient", { enumerable: true, get: function () { return dispute_arbitration_1.DisputeArbitrationClient; } });
42
+ var reputation_1 = require("./reputation");
43
+ Object.defineProperty(exports, "ReputationOracleClient", { enumerable: true, get: function () { return reputation_1.ReputationOracleClient; } });
44
+ var sponsorship_1 = require("./sponsorship");
45
+ Object.defineProperty(exports, "SponsorshipAttestationClient", { enumerable: true, get: function () { return sponsorship_1.SponsorshipAttestationClient; } });
46
+ var capability_1 = require("./capability");
47
+ Object.defineProperty(exports, "CapabilityRegistryClient", { enumerable: true, get: function () { return capability_1.CapabilityRegistryClient; } });
48
+ var governance_1 = require("./governance");
49
+ Object.defineProperty(exports, "GovernanceClient", { enumerable: true, get: function () { return governance_1.GovernanceClient; } });
50
+ var negotiation_1 = require("./negotiation");
51
+ Object.defineProperty(exports, "signNegotiationMessage", { enumerable: true, get: function () { return negotiation_1.signNegotiationMessage; } });
52
+ Object.defineProperty(exports, "createSignedProposal", { enumerable: true, get: function () { return negotiation_1.createSignedProposal; } });
53
+ Object.defineProperty(exports, "createSignedCounter", { enumerable: true, get: function () { return negotiation_1.createSignedCounter; } });
54
+ Object.defineProperty(exports, "createSignedAccept", { enumerable: true, get: function () { return negotiation_1.createSignedAccept; } });
55
+ Object.defineProperty(exports, "createSignedReject", { enumerable: true, get: function () { return negotiation_1.createSignedReject; } });
56
+ Object.defineProperty(exports, "createNegotiationProposal", { enumerable: true, get: function () { return negotiation_1.createNegotiationProposal; } });
57
+ Object.defineProperty(exports, "createNegotiationCounter", { enumerable: true, get: function () { return negotiation_1.createNegotiationCounter; } });
58
+ Object.defineProperty(exports, "createNegotiationAccept", { enumerable: true, get: function () { return negotiation_1.createNegotiationAccept; } });
59
+ Object.defineProperty(exports, "createNegotiationReject", { enumerable: true, get: function () { return negotiation_1.createNegotiationReject; } });
60
+ Object.defineProperty(exports, "parseNegotiationMessage", { enumerable: true, get: function () { return negotiation_1.parseNegotiationMessage; } });
61
+ var negotiation_guard_1 = require("./negotiation-guard");
62
+ Object.defineProperty(exports, "NegotiationGuard", { enumerable: true, get: function () { return negotiation_guard_1.NegotiationGuard; } });
63
+ var session_manager_1 = require("./session-manager");
64
+ Object.defineProperty(exports, "SessionManager", { enumerable: true, get: function () { return session_manager_1.SessionManager; } });
65
+ var channel_1 = require("./channel");
66
+ Object.defineProperty(exports, "ChannelClient", { enumerable: true, get: function () { return channel_1.ChannelClient; } });
67
+ var multiparty_1 = require("./multiparty");
68
+ Object.defineProperty(exports, "AgreementTreeClient", { enumerable: true, get: function () { return multiparty_1.AgreementTreeClient; } });
69
+ var watchtower_1 = require("./watchtower");
70
+ Object.defineProperty(exports, "WatchtowerClient", { enumerable: true, get: function () { return watchtower_1.WatchtowerClient; } });
71
+ var deliverable_1 = require("./deliverable");
72
+ Object.defineProperty(exports, "DeliverableClient", { enumerable: true, get: function () { return deliverable_1.DeliverableClient; } });
73
+ Object.defineProperty(exports, "DeliverableType", { enumerable: true, get: function () { return deliverable_1.DeliverableType; } });
74
+ Object.defineProperty(exports, "hashDeliverable", { enumerable: true, get: function () { return deliverable_1.hashDeliverable; } });
75
+ Object.defineProperty(exports, "hashDeliverableFile", { enumerable: true, get: function () { return deliverable_1.hashDeliverableFile; } });
76
+ Object.defineProperty(exports, "uploadToIPFS", { enumerable: true, get: function () { return deliverable_1.uploadToIPFS; } });
77
+ Object.defineProperty(exports, "encryptDeliverable", { enumerable: true, get: function () { return deliverable_1.encryptDeliverable; } });
78
+ Object.defineProperty(exports, "decryptDeliverable", { enumerable: true, get: function () { return deliverable_1.decryptDeliverable; } });
79
+ Object.defineProperty(exports, "uploadEncryptedIPFS", { enumerable: true, get: function () { return deliverable_1.uploadEncryptedIPFS; } });
80
+ __exportStar(require("./contracts"), exports);
81
+ __exportStar(require("./types"), exports);
82
+ var metadata_1 = require("./metadata");
83
+ Object.defineProperty(exports, "buildMetadata", { enumerable: true, get: function () { return metadata_1.buildMetadata; } });
84
+ Object.defineProperty(exports, "validateMetadata", { enumerable: true, get: function () { return metadata_1.validateMetadata; } });
85
+ Object.defineProperty(exports, "encodeMetadata", { enumerable: true, get: function () { return metadata_1.encodeMetadata; } });
86
+ Object.defineProperty(exports, "decodeMetadata", { enumerable: true, get: function () { return metadata_1.decodeMetadata; } });
87
+ Object.defineProperty(exports, "uploadMetadata", { enumerable: true, get: function () { return metadata_1.uploadMetadata; } });
88
+ Object.defineProperty(exports, "AGENT_METADATA_SCHEMA", { enumerable: true, get: function () { return metadata_1.AGENT_METADATA_SCHEMA; } });
89
+ var coldstart_1 = require("./coldstart");
90
+ Object.defineProperty(exports, "ColdStartClient", { enumerable: true, get: function () { return coldstart_1.ColdStartClient; } });
91
+ var migration_1 = require("./migration");
92
+ Object.defineProperty(exports, "MigrationClient", { enumerable: true, get: function () { return migration_1.MigrationClient; } });
@@ -0,0 +1,13 @@
1
+ import { ContractRunner } from "ethers";
2
+ import { Intent } from "./types";
3
+ export declare class IntentAttestationClient {
4
+ private walletAddress;
5
+ private contract;
6
+ constructor(address: string, runner: ContractRunner, walletAddress: string);
7
+ create(action: string, reason: string, recipient: string, amount: bigint): Promise<string>;
8
+ verify(attestationId: string, walletAddress: string): Promise<any>;
9
+ get(attestationId: string): Promise<Intent>;
10
+ }
11
+ export declare class IntentAttestation extends IntentAttestationClient {
12
+ }
13
+ //# sourceMappingURL=intent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../src/intent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAU,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,qBAAa,uBAAuB;IAEmB,OAAO,CAAC,aAAa;IAD1E,OAAO,CAAC,QAAQ,CAAkB;gBACtB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAU,aAAa,EAAE,MAAM;IAG5E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMhG,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IAC7C,GAAG,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAIlD;AACD,qBAAa,iBAAkB,SAAQ,uBAAuB;CAAG"}
package/dist/intent.js ADDED
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IntentAttestation = exports.IntentAttestationClient = void 0;
4
+ const ethers_1 = require("ethers");
5
+ const contracts_1 = require("./contracts");
6
+ class IntentAttestationClient {
7
+ constructor(address, runner, walletAddress) {
8
+ this.walletAddress = walletAddress;
9
+ this.contract = new ethers_1.ethers.Contract(address, contracts_1.INTENT_ATTESTATION_ABI, runner);
10
+ }
11
+ async create(action, reason, recipient, amount) {
12
+ const attestationId = ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(`${this.walletAddress}:${action}:${reason}:${recipient}:${amount}:${Date.now()}`));
13
+ const tx = await this.contract.attest(attestationId, action, reason, recipient, amount);
14
+ await tx.wait();
15
+ return attestationId;
16
+ }
17
+ verify(attestationId, walletAddress) { return this.contract.verify(attestationId, walletAddress); }
18
+ async get(attestationId) {
19
+ const [id, wallet, action, reason, recipient, amount, timestamp] = await this.contract.getAttestation(attestationId);
20
+ return { attestationId: id, wallet, action, reason, recipient, amount: BigInt(amount), timestamp: Number(timestamp) };
21
+ }
22
+ }
23
+ exports.IntentAttestationClient = IntentAttestationClient;
24
+ class IntentAttestation extends IntentAttestationClient {
25
+ }
26
+ exports.IntentAttestation = IntentAttestation;
@@ -0,0 +1,55 @@
1
+ export declare const AGENT_METADATA_SCHEMA = "arc402.agent-metadata.v1";
2
+ export interface AgentMetadataModel {
3
+ family?: string;
4
+ version?: string;
5
+ provider?: string;
6
+ contextWindow?: number;
7
+ multimodal?: boolean;
8
+ }
9
+ export interface AgentMetadataTraining {
10
+ disclosure?: string;
11
+ dataCutoff?: string;
12
+ specialisations?: string[];
13
+ synopsis?: string;
14
+ verified?: boolean;
15
+ attestations?: unknown[];
16
+ }
17
+ export interface AgentMetadataPricing {
18
+ base?: string;
19
+ token?: string;
20
+ currency?: string;
21
+ per?: string;
22
+ }
23
+ export interface AgentMetadataSla {
24
+ turnaroundHours?: number;
25
+ availability?: string;
26
+ maxConcurrentJobs?: number;
27
+ }
28
+ export interface AgentMetadataContact {
29
+ endpoint?: string;
30
+ relay?: string;
31
+ relayFallbacks?: string[];
32
+ }
33
+ export interface AgentMetadataSecurity {
34
+ injectionProtection?: boolean;
35
+ envLeakProtection?: boolean;
36
+ attestedSecurityPolicy?: boolean;
37
+ }
38
+ export interface AgentMetadata {
39
+ schema: string;
40
+ name?: string;
41
+ description?: string;
42
+ capabilities?: string[];
43
+ model?: AgentMetadataModel;
44
+ training?: AgentMetadataTraining;
45
+ pricing?: AgentMetadataPricing;
46
+ sla?: AgentMetadataSla;
47
+ contact?: AgentMetadataContact;
48
+ security?: AgentMetadataSecurity;
49
+ }
50
+ export declare function validateMetadata(obj: unknown): AgentMetadata;
51
+ export declare function buildMetadata(input: Partial<AgentMetadata>): AgentMetadata;
52
+ export declare function encodeMetadata(metadata: AgentMetadata): string;
53
+ export declare function decodeMetadata(uri: string): Promise<AgentMetadata>;
54
+ export declare function uploadMetadata(metadata: AgentMetadata, pinataJwt?: string): Promise<string>;
55
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB,6BAA6B,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,GAAG,CAAC,EAAE,gBAAgB,CAAC;IACvB,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAuB5D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAmB1E;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAE9D;AASD,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAgBxE;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBjG"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ // ARC-402 Spec 23: Agent Metadata Standard
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AGENT_METADATA_SCHEMA = void 0;
5
+ exports.validateMetadata = validateMetadata;
6
+ exports.buildMetadata = buildMetadata;
7
+ exports.encodeMetadata = encodeMetadata;
8
+ exports.decodeMetadata = decodeMetadata;
9
+ exports.uploadMetadata = uploadMetadata;
10
+ exports.AGENT_METADATA_SCHEMA = "arc402.agent-metadata.v1";
11
+ function validateMetadata(obj) {
12
+ if (typeof obj !== "object" || obj === null) {
13
+ throw new Error("metadata must be an object");
14
+ }
15
+ const m = obj;
16
+ if (typeof m["schema"] !== "string") {
17
+ throw new Error("metadata.schema must be a string");
18
+ }
19
+ if (m["schema"] !== exports.AGENT_METADATA_SCHEMA) {
20
+ throw new Error(`metadata.schema must be "${exports.AGENT_METADATA_SCHEMA}", got "${m["schema"]}"`);
21
+ }
22
+ if (m["name"] !== undefined && typeof m["name"] !== "string") {
23
+ throw new Error("metadata.name must be a string");
24
+ }
25
+ if (m["description"] !== undefined && typeof m["description"] !== "string") {
26
+ throw new Error("metadata.description must be a string");
27
+ }
28
+ if (m["capabilities"] !== undefined) {
29
+ if (!Array.isArray(m["capabilities"]) || !m["capabilities"].every((c) => typeof c === "string")) {
30
+ throw new Error("metadata.capabilities must be a string array");
31
+ }
32
+ }
33
+ return m;
34
+ }
35
+ function buildMetadata(input) {
36
+ const meta = {
37
+ schema: exports.AGENT_METADATA_SCHEMA,
38
+ ...input,
39
+ };
40
+ if (meta.training) {
41
+ meta.training = {
42
+ verified: false,
43
+ attestations: [],
44
+ ...meta.training,
45
+ };
46
+ }
47
+ if (meta.security) {
48
+ meta.security = {
49
+ attestedSecurityPolicy: false,
50
+ ...meta.security,
51
+ };
52
+ }
53
+ return meta;
54
+ }
55
+ function encodeMetadata(metadata) {
56
+ return JSON.stringify(metadata, null, 2);
57
+ }
58
+ function resolveIpfsUri(uri) {
59
+ if (uri.startsWith("ipfs://")) {
60
+ return `https://ipfs.io/ipfs/${uri.slice(7)}`;
61
+ }
62
+ return uri;
63
+ }
64
+ async function decodeMetadata(uri) {
65
+ if (uri.startsWith("data:")) {
66
+ // data:application/json;base64,<b64> or data:application/json,<encoded>
67
+ const commaIdx = uri.indexOf(",");
68
+ if (commaIdx === -1)
69
+ throw new Error("malformed data URI");
70
+ const header = uri.slice(5, commaIdx);
71
+ const payload = uri.slice(commaIdx + 1);
72
+ const isBase64 = header.includes(";base64");
73
+ const json = isBase64 ? Buffer.from(payload, "base64").toString("utf-8") : decodeURIComponent(payload);
74
+ return validateMetadata(JSON.parse(json));
75
+ }
76
+ const url = resolveIpfsUri(uri);
77
+ const res = await fetch(url);
78
+ if (!res.ok)
79
+ throw new Error(`failed to fetch metadata from ${url}: ${res.status} ${res.statusText}`);
80
+ const json = await res.json();
81
+ return validateMetadata(json);
82
+ }
83
+ async function uploadMetadata(metadata, pinataJwt) {
84
+ if (pinataJwt) {
85
+ const res = await fetch("https://api.pinata.cloud/pinning/pinJSONToIPFS", {
86
+ method: "POST",
87
+ headers: {
88
+ "Content-Type": "application/json",
89
+ "Authorization": `Bearer ${pinataJwt}`,
90
+ },
91
+ body: JSON.stringify({
92
+ pinataContent: metadata,
93
+ pinataMetadata: { name: `arc402-agent-metadata-${metadata.name ?? "unknown"}` },
94
+ }),
95
+ });
96
+ if (!res.ok) {
97
+ const text = await res.text();
98
+ throw new Error(`Pinata upload failed: ${res.status} ${text}`);
99
+ }
100
+ const data = await res.json();
101
+ return `ipfs://${data.IpfsHash}`;
102
+ }
103
+ // Fallback: data URI (no IPFS credentials configured)
104
+ const b64 = Buffer.from(encodeMetadata(metadata), "utf-8").toString("base64");
105
+ return `data:application/json;base64,${b64}`;
106
+ }
@@ -0,0 +1,11 @@
1
+ import { ContractRunner, ethers } from "ethers";
2
+ export declare class MigrationClient {
3
+ private address;
4
+ private runner?;
5
+ constructor(address: string, runner?: ContractRunner);
6
+ registerMigration(oldWallet: string, newWallet: string, signer: ContractRunner): Promise<ethers.TransactionReceipt>;
7
+ resolveActiveWallet(wallet: string): Promise<string>;
8
+ getLineage(wallet: string): Promise<string[]>;
9
+ approveMigrationTarget(impl: string, signer: ContractRunner): Promise<ethers.TransactionReceipt>;
10
+ }
11
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../src/migration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAWhD,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,CAAiB;gBAEpB,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc;IAK9C,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC;IAMnH,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKpD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAM7C,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC;CAKvG"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MigrationClient = void 0;
4
+ const ethers_1 = require("ethers");
5
+ const MIGRATION_REGISTRY_ABI = [
6
+ "function registerMigration(address oldWallet, address newWallet) external",
7
+ "function resolveActiveWallet(address wallet) external view returns (address)",
8
+ "function getLineage(address wallet) external view returns (address[])",
9
+ "function approveMigrationTarget(address implementation) external",
10
+ "function migratedTo(address wallet) external view returns (address)",
11
+ "function migratedFrom(address wallet) external view returns (address)",
12
+ ];
13
+ class MigrationClient {
14
+ constructor(address, runner) {
15
+ this.address = address;
16
+ this.runner = runner;
17
+ }
18
+ async registerMigration(oldWallet, newWallet, signer) {
19
+ const contract = new ethers_1.ethers.Contract(this.address, MIGRATION_REGISTRY_ABI, signer);
20
+ const tx = await contract.registerMigration(oldWallet, newWallet);
21
+ return tx.wait();
22
+ }
23
+ async resolveActiveWallet(wallet) {
24
+ const contract = new ethers_1.ethers.Contract(this.address, MIGRATION_REGISTRY_ABI, this.runner);
25
+ return contract.resolveActiveWallet(wallet);
26
+ }
27
+ async getLineage(wallet) {
28
+ const contract = new ethers_1.ethers.Contract(this.address, MIGRATION_REGISTRY_ABI, this.runner);
29
+ const result = await contract.getLineage(wallet);
30
+ return [...result];
31
+ }
32
+ async approveMigrationTarget(impl, signer) {
33
+ const contract = new ethers_1.ethers.Contract(this.address, MIGRATION_REGISTRY_ABI, signer);
34
+ const tx = await contract.approveMigrationTarget(impl);
35
+ return tx.wait();
36
+ }
37
+ }
38
+ exports.MigrationClient = MigrationClient;
@@ -0,0 +1,56 @@
1
+ import { ContractRunner, ethers } from "ethers";
2
+ import { ProposeParams } from "./types";
3
+ export interface AgreementTree {
4
+ root: bigint;
5
+ path: bigint[];
6
+ children: bigint[];
7
+ depth: number;
8
+ allSettled: boolean;
9
+ }
10
+ export interface PaymentSplit {
11
+ address: string;
12
+ percentage: number;
13
+ }
14
+ export interface PaymentDistribution {
15
+ total: bigint;
16
+ distributions: Array<{
17
+ address: string;
18
+ amount: bigint;
19
+ percentage: number;
20
+ }>;
21
+ }
22
+ export interface CreateAgreementResult {
23
+ rootAgreementId: bigint;
24
+ childAgreementIds: bigint[];
25
+ }
26
+ export declare class AgreementTreeClient {
27
+ private treeContract;
28
+ private agreementClient;
29
+ constructor(treeAddress: string, agreementAddress: string, runner: ContractRunner);
30
+ registerSubAgreement(params: {
31
+ parentAgreementId: bigint;
32
+ childAgreementId: bigint;
33
+ }): Promise<ethers.TransactionReceipt>;
34
+ /**
35
+ * Propose the root agreement, then propose each child agreement and register
36
+ * them all under the root in the AgreementTree contract.
37
+ *
38
+ * The caller must be the client for the root agreement AND the provider for
39
+ * all child agreements (i.e. the middle-layer agent that subcontracts work).
40
+ */
41
+ createAgreement(rootTerms: ProposeParams, childAgreements: ProposeParams[]): Promise<CreateAgreementResult>;
42
+ getAgreementTree(rootAgreementId: bigint): Promise<AgreementTree>;
43
+ /** Alias for getAgreementTree — matches spec SDK interface. */
44
+ getTree(agreementId: bigint): Promise<AgreementTree>;
45
+ treeStatus(agreementId: bigint): Promise<{
46
+ allSettled: boolean;
47
+ childCount: number;
48
+ }>;
49
+ /**
50
+ * Off-chain payment distribution helper.
51
+ * Splits paymentAmount across recipients according to their percentage shares.
52
+ * Percentages must sum to 100. This does not touch the chain.
53
+ */
54
+ splitPayment(paymentAmount: bigint, splits: PaymentSplit[]): PaymentDistribution;
55
+ }
56
+ //# sourceMappingURL=multiparty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiparty.d.ts","sourceRoot":"","sources":["../src/multiparty.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,eAAe,CAAyB;gBAEpC,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc;IAK3E,oBAAoB,CAAC,MAAM,EAAE;QACjC,iBAAiB,EAAE,MAAM,CAAC;QAC1B,gBAAgB,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC;IAQtC;;;;;;OAMG;IACG,eAAe,CACnB,SAAS,EAAE,aAAa,EACxB,eAAe,EAAE,aAAa,EAAE,GAC/B,OAAO,CAAC,qBAAqB,CAAC;IAgB3B,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAkBvE,+DAA+D;IACzD,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpD,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAW3F;;;;OAIG;IACH,YAAY,CACV,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,YAAY,EAAE,GACrB,mBAAmB;CAevB"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AgreementTreeClient = void 0;
4
+ const ethers_1 = require("ethers");
5
+ const contracts_1 = require("./contracts");
6
+ const agreement_1 = require("./agreement");
7
+ class AgreementTreeClient {
8
+ constructor(treeAddress, agreementAddress, runner) {
9
+ this.treeContract = new ethers_1.ethers.Contract(treeAddress, contracts_1.AGREEMENT_TREE_ABI, runner);
10
+ this.agreementClient = new agreement_1.ServiceAgreementClient(agreementAddress, runner);
11
+ }
12
+ async registerSubAgreement(params) {
13
+ const tx = await this.treeContract.registerSubAgreement(params.parentAgreementId, params.childAgreementId);
14
+ return tx.wait();
15
+ }
16
+ /**
17
+ * Propose the root agreement, then propose each child agreement and register
18
+ * them all under the root in the AgreementTree contract.
19
+ *
20
+ * The caller must be the client for the root agreement AND the provider for
21
+ * all child agreements (i.e. the middle-layer agent that subcontracts work).
22
+ */
23
+ async createAgreement(rootTerms, childAgreements) {
24
+ const { agreementId: rootAgreementId } = await this.agreementClient.propose(rootTerms);
25
+ const childAgreementIds = [];
26
+ for (const child of childAgreements) {
27
+ const { agreementId: childId } = await this.agreementClient.propose(child);
28
+ await this.registerSubAgreement({
29
+ parentAgreementId: rootAgreementId,
30
+ childAgreementId: childId,
31
+ });
32
+ childAgreementIds.push(childId);
33
+ }
34
+ return { rootAgreementId, childAgreementIds };
35
+ }
36
+ async getAgreementTree(rootAgreementId) {
37
+ const id = BigInt(rootAgreementId);
38
+ const [root, path, children, depth, allSettled] = await Promise.all([
39
+ this.treeContract.getRoot(id),
40
+ this.treeContract.getPath(id),
41
+ this.treeContract.getChildren(id),
42
+ this.treeContract.getDepth(id),
43
+ this.treeContract.allChildrenSettled(id),
44
+ ]);
45
+ return {
46
+ root: BigInt(root),
47
+ path: path.map(BigInt),
48
+ children: children.map(BigInt),
49
+ depth: Number(depth),
50
+ allSettled: Boolean(allSettled),
51
+ };
52
+ }
53
+ /** Alias for getAgreementTree — matches spec SDK interface. */
54
+ async getTree(agreementId) {
55
+ return this.getAgreementTree(agreementId);
56
+ }
57
+ async treeStatus(agreementId) {
58
+ const [allSettled, children] = await Promise.all([
59
+ this.treeContract.allChildrenSettled(BigInt(agreementId)),
60
+ this.treeContract.getChildren(BigInt(agreementId)),
61
+ ]);
62
+ return {
63
+ allSettled: Boolean(allSettled),
64
+ childCount: children.length,
65
+ };
66
+ }
67
+ /**
68
+ * Off-chain payment distribution helper.
69
+ * Splits paymentAmount across recipients according to their percentage shares.
70
+ * Percentages must sum to 100. This does not touch the chain.
71
+ */
72
+ splitPayment(paymentAmount, splits) {
73
+ const totalPct = splits.reduce((sum, s) => sum + s.percentage, 0);
74
+ if (Math.abs(totalPct - 100) > 0.001) {
75
+ throw new Error(`Split percentages must sum to 100 (got ${totalPct})`);
76
+ }
77
+ const distributions = splits.map((s) => ({
78
+ address: s.address,
79
+ percentage: s.percentage,
80
+ // Use integer basis points (x100) to avoid floating-point in BigInt arithmetic
81
+ amount: (paymentAmount * BigInt(Math.round(s.percentage * 100))) / 10000n,
82
+ }));
83
+ return { total: paymentAmount, distributions };
84
+ }
85
+ }
86
+ exports.AgreementTreeClient = AgreementTreeClient;
@@ -0,0 +1,20 @@
1
+ import type { ContractRunner } from "ethers";
2
+ import type { NegotiationVerificationResult } from "./types";
3
+ export interface NegotiationGuardOptions {
4
+ agentRegistryAddress: string;
5
+ runner: ContractRunner;
6
+ timestampToleranceSeconds?: number;
7
+ nonceCacheTtlMs?: number;
8
+ maxMessageBytes?: number;
9
+ }
10
+ export declare class NegotiationGuard {
11
+ private registry;
12
+ private nonceCache;
13
+ private opts;
14
+ constructor(options: NegotiationGuardOptions);
15
+ verify(rawJson: string): Promise<NegotiationVerificationResult>;
16
+ private pruneNonceCache;
17
+ /** Reset nonce cache (testing / restart) */
18
+ clearNonceCache(): void;
19
+ }
20
+ //# sourceMappingURL=negotiation-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"negotiation-guard.d.ts","sourceRoot":"","sources":["../src/negotiation-guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAsB,6BAA6B,EAAE,MAAM,SAAS,CAAC;AAOjF,MAAM,WAAW,uBAAuB;IACtC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,IAAI,CAAoC;gBAEpC,OAAO,EAAE,uBAAuB;IActC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,6BAA6B,CAAC;IA6ErE,OAAO,CAAC,eAAe;IAOvB,4CAA4C;IAC5C,eAAe,IAAI,IAAI;CAGxB"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NegotiationGuard = void 0;
4
+ const ethers_1 = require("ethers");
5
+ const negotiation_1 = require("./negotiation");
6
+ const AGENT_REGISTRY_ABI = [
7
+ "function isRegistered(address wallet) view returns (bool)",
8
+ ];
9
+ class NegotiationGuard {
10
+ constructor(options) {
11
+ this.nonceCache = new Map(); // nonceKey -> expiry timestamp (ms)
12
+ this.opts = {
13
+ timestampToleranceSeconds: 60,
14
+ nonceCacheTtlMs: 24 * 60 * 60 * 1000,
15
+ maxMessageBytes: 64 * 1024,
16
+ ...options,
17
+ };
18
+ this.registry = new ethers_1.ethers.Contract(options.agentRegistryAddress, AGENT_REGISTRY_ABI, options.runner);
19
+ }
20
+ async verify(rawJson) {
21
+ // 1. Size check
22
+ if (Buffer.byteLength(rawJson, "utf8") > this.opts.maxMessageBytes) {
23
+ return { valid: false, error: "MESSAGE_TOO_LARGE" };
24
+ }
25
+ // 2. Parse
26
+ let message;
27
+ try {
28
+ message = JSON.parse(rawJson);
29
+ }
30
+ catch {
31
+ return { valid: false, error: "SCHEMA_INVALID" };
32
+ }
33
+ // 3. Required fields
34
+ if (!message.sig || message.timestamp == null || !message.from) {
35
+ return { valid: false, error: "SCHEMA_INVALID" };
36
+ }
37
+ // 4. Timestamp check
38
+ const now = Math.floor(Date.now() / 1000);
39
+ const delta = now - message.timestamp;
40
+ if (Math.abs(delta) > this.opts.timestampToleranceSeconds) {
41
+ return { valid: false, error: delta < 0 ? "TIMESTAMP_IN_FUTURE" : "TIMESTAMP_TOO_OLD" };
42
+ }
43
+ // 5. Expiry check (PROPOSE only)
44
+ if (message.type === "PROPOSE" && message.expiresAt != null && now > message.expiresAt) {
45
+ return { valid: false, error: "MESSAGE_EXPIRED" };
46
+ }
47
+ // 6. Signature recovery
48
+ let recoveredSigner;
49
+ try {
50
+ const digest = (0, negotiation_1.computeMessageDigest)(message);
51
+ recoveredSigner = ethers_1.ethers.recoverAddress(ethers_1.ethers.hashMessage(ethers_1.ethers.getBytes(digest)), message.sig);
52
+ }
53
+ catch {
54
+ return { valid: false, error: "INVALID_SIGNATURE" };
55
+ }
56
+ // 7. Signer must match from
57
+ if (recoveredSigner.toLowerCase() !== message.from.toLowerCase()) {
58
+ return { valid: false, error: "INVALID_SIGNATURE" };
59
+ }
60
+ // 8. Registry check (fail open on registry downtime)
61
+ try {
62
+ const registered = await this.registry.isRegistered(recoveredSigner);
63
+ if (!registered) {
64
+ return { valid: false, error: "SIGNER_NOT_REGISTERED" };
65
+ }
66
+ }
67
+ catch {
68
+ console.warn("NegotiationGuard: AgentRegistry check failed — proceeding with signature-only verification");
69
+ }
70
+ // 9. Nonce replay check
71
+ const nonceVal = "nonce" in message && message.nonce
72
+ ? message.nonce
73
+ : "refNonce" in message && message.refNonce
74
+ ? message.refNonce
75
+ : "";
76
+ const nonceKey = `${message.from.toLowerCase()}:${nonceVal}:${message.timestamp}`;
77
+ this.pruneNonceCache();
78
+ if (this.nonceCache.has(nonceKey)) {
79
+ return { valid: false, error: "NONCE_REPLAYED" };
80
+ }
81
+ this.nonceCache.set(nonceKey, Date.now() + this.opts.nonceCacheTtlMs);
82
+ return { valid: true, recoveredSigner: recoveredSigner };
83
+ }
84
+ pruneNonceCache() {
85
+ const now = Date.now();
86
+ for (const [key, expiry] of this.nonceCache) {
87
+ if (now > expiry)
88
+ this.nonceCache.delete(key);
89
+ }
90
+ }
91
+ /** Reset nonce cache (testing / restart) */
92
+ clearNonceCache() {
93
+ this.nonceCache.clear();
94
+ }
95
+ }
96
+ exports.NegotiationGuard = NegotiationGuard;