@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
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getGovernance = exports.getCapabilityRegistry = exports.getSponsorshipAttestation = exports.getReputationOracle = exports.getServiceAgreement = exports.getAgentRegistry = exports.getWalletFactory = exports.getSettlementCoordinator = exports.getARC402Wallet = exports.getIntentAttestation = exports.getTrustRegistry = exports.getPolicyEngine = exports.AGREEMENT_TREE_ABI = exports.GOVERNANCE_ABI = exports.CAPABILITY_REGISTRY_ABI = exports.SPONSORSHIP_ATTESTATION_ABI = exports.REPUTATION_ORACLE_ABI = exports.SERVICE_AGREEMENT_ABI = exports.AGENT_REGISTRY_ABI = exports.WALLET_FACTORY_ABI = exports.SETTLEMENT_COORDINATOR_ABI = exports.ARC402_WALLET_ABI = exports.INTENT_ATTESTATION_ABI = exports.TRUST_REGISTRY_ABI = exports.POLICY_ENGINE_ABI = void 0;
4
+ const ethers_1 = require("ethers");
5
+ exports.POLICY_ENGINE_ABI = [
6
+ "function setPolicy(bytes32 policyHash, bytes policyData) external",
7
+ "function getPolicy(address wallet) external view returns (bytes32, bytes)",
8
+ "function setCategoryLimit(string category, uint256 limitPerTx) external",
9
+ "function setCategoryLimitFor(address wallet, string category, uint256 limitPerTx) external",
10
+ "function validateSpend(address wallet, string category, uint256 amount, bytes32 contextId) external view returns (bool, string)",
11
+ "function categoryLimits(address wallet, string category) external view returns (uint256)",
12
+ "function registerWallet(address wallet, address owner) external",
13
+ "function freezeSpend(address wallet) external",
14
+ "function unfreeze(address wallet) external",
15
+ "function authorizeFreezeAgent(address agent) external",
16
+ "function revokeFreezeAgent(address agent) external",
17
+ "function queueCapReduction(address wallet, string category, uint256 newCap) external",
18
+ "function applyCapReduction(address wallet, string category) external",
19
+ ];
20
+ exports.TRUST_REGISTRY_ABI = [
21
+ "function getScore(address wallet) external view returns (uint256)",
22
+ "function getEffectiveScore(address wallet) external view returns (uint256)",
23
+ "function getTrustLevel(address wallet) external view returns (string)",
24
+ "function initWallet(address wallet) external",
25
+ "function recordSuccess(address wallet) external",
26
+ "function recordAnomaly(address wallet) external",
27
+ ];
28
+ exports.INTENT_ATTESTATION_ABI = [
29
+ "function attest(bytes32 attestationId, string action, string reason, address recipient, uint256 amount) external",
30
+ "function verify(bytes32 attestationId, address wallet) external view returns (bool)",
31
+ "function getAttestation(bytes32 attestationId) external view returns (bytes32, address, string, string, address, uint256, uint256)",
32
+ "event AttestationCreated(bytes32 indexed id, address indexed wallet, string action, string reason, address recipient, uint256 amount, uint256 timestamp)",
33
+ ];
34
+ exports.ARC402_WALLET_ABI = [
35
+ "function openContext(bytes32 contextId, string taskType) external",
36
+ "function closeContext() external",
37
+ "function executeSpend(address recipient, uint256 amount, string category, bytes32 attestationId) external",
38
+ "function getTrustScore() external view returns (uint256)",
39
+ "function getActiveContext() external view returns (bytes32, string, uint256, bool)",
40
+ "function updatePolicy(bytes32 newPolicyId) external",
41
+ ];
42
+ exports.SETTLEMENT_COORDINATOR_ABI = [
43
+ "function propose(address fromWallet, address toWallet, uint256 amount, bytes32 intentId, uint256 expiresAt) external returns (bytes32)",
44
+ "function accept(bytes32 proposalId) external",
45
+ "function reject(bytes32 proposalId, string reason) external",
46
+ "function execute(bytes32 proposalId) external payable",
47
+ "function checkExpiry(bytes32 proposalId) external",
48
+ "function getProposal(bytes32 proposalId) external view returns (address, address, uint256, bytes32, uint256, uint8, string)",
49
+ "event ProposalCreated(bytes32 indexed proposalId, address indexed from, address indexed to, uint256 amount)",
50
+ ];
51
+ exports.WALLET_FACTORY_ABI = [
52
+ "function createWallet() external returns (address)",
53
+ "function getWallets(address owner) external view returns (address[])",
54
+ "event WalletCreated(address indexed owner, address indexed walletAddress)",
55
+ ];
56
+ exports.AGENT_REGISTRY_ABI = [
57
+ "function register(string name, string[] capabilities, string serviceType, string endpoint, string metadataURI) external",
58
+ "function update(string name, string[] capabilities, string serviceType, string endpoint, string metadataURI) external",
59
+ "function deactivate() external",
60
+ "function reactivate() external",
61
+ "function submitHeartbeat(uint32 latencyMs) external",
62
+ "function setHeartbeatPolicy(uint64 interval, uint64 gracePeriod) external",
63
+ "function getAgent(address wallet) external view returns (tuple(address wallet, string name, string[] capabilities, string serviceType, string endpoint, string metadataURI, bool active, uint256 registeredAt, uint256 endpointChangedAt, uint256 endpointChangeCount))",
64
+ "function getOperationalMetrics(address wallet) external view returns (tuple(uint64 heartbeatInterval, uint64 heartbeatGracePeriod, uint64 lastHeartbeatAt, uint64 rollingLatency, uint32 heartbeatCount, uint32 missedHeartbeatCount, uint32 uptimeScore, uint32 responseScore))",
65
+ "function isRegistered(address wallet) external view returns (bool)",
66
+ "function isActive(address wallet) external view returns (bool)",
67
+ "function getCapabilities(address wallet) external view returns (string[])",
68
+ "function getTrustScore(address wallet) external view returns (uint256)",
69
+ "function getEndpointStability(address wallet) external view returns (uint256)",
70
+ "function agentCount() external view returns (uint256)",
71
+ "function getAgentAtIndex(uint256 index) external view returns (address)",
72
+ ];
73
+ exports.SERVICE_AGREEMENT_ABI = [
74
+ "function propose(address provider, string serviceType, string description, uint256 price, address token, uint256 deadline, bytes32 deliverablesHash) external payable returns (uint256)",
75
+ "function accept(uint256 agreementId) external",
76
+ "function fulfill(uint256 agreementId, bytes32 actualDeliverablesHash) external",
77
+ "function commitDeliverable(uint256 agreementId, bytes32 deliverableHash) external",
78
+ "function verifyDeliverable(uint256 agreementId) external",
79
+ "function autoRelease(uint256 agreementId) external",
80
+ "function dispute(uint256 agreementId, string reason) external",
81
+ "function directDispute(uint256 agreementId, uint8 directReason, string reason) external",
82
+ "function requestRevision(uint256 agreementId, bytes32 feedbackHash, string feedbackURI, bytes32 previousTranscriptHash) external",
83
+ "function respondToRevision(uint256 agreementId, uint8 responseType, uint256 proposedProviderPayout, bytes32 responseHash, string responseURI, bytes32 previousTranscriptHash) external",
84
+ "function escalateToDispute(uint256 agreementId, string reason) external",
85
+ "function canDirectDispute(uint256 agreementId, uint8 directReason) external view returns (bool)",
86
+ "function submitDisputeEvidence(uint256 agreementId, uint8 evidenceType, bytes32 evidenceHash, string evidenceURI) external",
87
+ "function nominateArbitrator(uint256 agreementId, address arbitrator) external",
88
+ "function castArbitrationVote(uint256 agreementId, uint8 vote, uint256 providerAward, uint256 clientAward) external",
89
+ "function requestHumanEscalation(uint256 agreementId, string reason) external",
90
+ "function resolveDisputeDetailed(uint256 agreementId, uint8 outcome, uint256 providerAward, uint256 clientAward) external",
91
+ "function cancel(uint256 agreementId) external",
92
+ "function expiredCancel(uint256 agreementId) external",
93
+ "function resolveDispute(uint256 agreementId, bool favorProvider) external",
94
+ "function getAgreement(uint256 id) external view returns (tuple(uint256 id, address client, address provider, string serviceType, string description, uint256 price, address token, uint256 deadline, bytes32 deliverablesHash, uint8 status, uint256 createdAt, uint256 resolvedAt, uint256 verifyWindowEnd, bytes32 committedHash))",
95
+ "function getRemediationCase(uint256 agreementId) external view returns (tuple(uint8 cycleCount, uint256 openedAt, uint256 deadlineAt, uint256 lastActionAt, bytes32 latestTranscriptHash, bool active))",
96
+ "function getRemediationFeedback(uint256 agreementId, uint256 index) external view returns (tuple(uint8 cycle, address author, bytes32 feedbackHash, string feedbackURI, bytes32 previousTranscriptHash, bytes32 transcriptHash, uint256 timestamp))",
97
+ "function getRemediationResponse(uint256 agreementId, uint256 index) external view returns (tuple(uint8 cycle, address author, uint8 responseType, uint256 proposedProviderPayout, bytes32 responseHash, string responseURI, bytes32 previousTranscriptHash, bytes32 transcriptHash, uint256 timestamp))",
98
+ "function getDisputeCase(uint256 agreementId) external view returns (tuple(uint256 agreementId, uint256 openedAt, uint256 responseDeadlineAt, uint8 outcome, uint256 providerAward, uint256 clientAward, bool humanReviewRequested, uint256 evidenceCount))",
99
+ "function getDisputeEvidence(uint256 agreementId, uint256 index) external view returns (tuple(address submitter, uint8 evidenceType, bytes32 evidenceHash, string evidenceURI, uint256 timestamp))",
100
+ "function getArbitrationCase(uint256 agreementId) external view returns (tuple(uint256 agreementId, address[3] arbitrators, uint8 arbitratorCount, uint8 providerVotes, uint8 clientVotes, uint8 splitVotes, uint8 humanVotes, uint256 selectionDeadlineAt, uint256 decisionDeadlineAt, uint256 splitProviderAward, uint256 splitClientAward, bool finalized, bool humanBackstopUsed))",
101
+ "function getAgreementsByClient(address client) external view returns (uint256[])",
102
+ "function getAgreementsByProvider(address provider) external view returns (uint256[])",
103
+ "function agreementCount() external view returns (uint256)",
104
+ "function openSessionChannel(address provider, address token, uint256 maxAmount, uint256 ratePerCall, uint256 deadline) external payable returns (bytes32 channelId)",
105
+ "function closeChannel(bytes32 channelId, bytes finalState) external",
106
+ "function challengeChannel(bytes32 channelId, bytes latestState) external",
107
+ "function finaliseChallenge(bytes32 channelId) external",
108
+ "function reclaimExpiredChannel(bytes32 channelId) external",
109
+ "function getChannel(bytes32 channelId) external view returns (tuple(address client, address provider, address token, uint256 depositAmount, uint256 settledAmount, uint256 lastSequenceNumber, uint256 deadline, uint256 challengeExpiry, uint8 status))",
110
+ "function getChannelsByClient(address client) external view returns (bytes32[])",
111
+ "function getChannelsByProvider(address provider) external view returns (bytes32[])",
112
+ "function resolveFromArbitration(uint256 agreementId, address recipient, uint256 providerAmount, uint256 clientAmount) external",
113
+ "function ownerResolveDispute(uint256 agreementId, bool favorProvider) external",
114
+ "event AgreementProposed(uint256 indexed id, address indexed client, address indexed provider, string serviceType, uint256 price, address token, uint256 deadline)",
115
+ ];
116
+ exports.REPUTATION_ORACLE_ABI = [
117
+ "function publishSignal(address subject, uint8 signalType, bytes32 capabilityHash, string reason) external",
118
+ "function getReputation(address subject) external view returns (uint256, uint256, uint256, uint256)",
119
+ "function getCapabilityReputation(address subject, bytes32 capabilityHash) external view returns (uint256)",
120
+ "function getSignalCount(address subject) external view returns (uint256)",
121
+ "function getSignal(address subject, uint256 index) external view returns (tuple(address publisher, address subject, uint8 signalType, bytes32 capabilityHash, string reason, uint256 publisherTrustAtTime, uint256 timestamp, bool autoPublished))",
122
+ ];
123
+ exports.SPONSORSHIP_ATTESTATION_ABI = [
124
+ "function publish(address agent, uint256 expiresAt) external returns (bytes32)",
125
+ "function publishWithTier(address agent, uint256 expiresAt, uint8 tier, string evidenceURI) external returns (bytes32)",
126
+ "function revoke(bytes32 attestationId) external",
127
+ "function isActive(bytes32 attestationId) external view returns (bool)",
128
+ "function getActiveAttestation(address sponsor, address agent) external view returns (bytes32)",
129
+ "function getAttestation(bytes32 attestationId) external view returns (tuple(address sponsor, address agent, uint256 issuedAt, uint256 expiresAt, bool revoked, uint8 tier, string evidenceURI))",
130
+ "function getSponsorAttestations(address sponsor) external view returns (bytes32[])",
131
+ "function getAgentAttestations(address agent) external view returns (bytes32[])",
132
+ "function activeSponsorCount(address sponsor) external view returns (uint256)",
133
+ "function getHighestTier(address agent) external view returns (uint8)",
134
+ ];
135
+ exports.CAPABILITY_REGISTRY_ABI = [
136
+ "function registerRoot(string root) external returns (bytes32)",
137
+ "function setRootStatus(string root, bool active) external",
138
+ "function claim(string capability) external",
139
+ "function revoke(string capability) external",
140
+ "function isRootActive(string root) external view returns (bool)",
141
+ "function getRoot(string root) external view returns (tuple(bytes32 rootId, string root, bool active))",
142
+ "function rootCount() external view returns (uint256)",
143
+ "function getRootAt(uint256 index) external view returns (tuple(bytes32 rootId, string root, bool active))",
144
+ "function getCapabilities(address agent) external view returns (string[])",
145
+ "function capabilityCount(address agent) external view returns (uint256)",
146
+ "function isCapabilityClaimed(address agent, string capability) external view returns (bool)",
147
+ ];
148
+ exports.GOVERNANCE_ABI = [
149
+ "function submitTransaction(address target, uint256 value, bytes data) external returns (uint256)",
150
+ "function confirmTransaction(uint256 txId) external",
151
+ "function revokeConfirmation(uint256 txId) external",
152
+ "function executeTransaction(uint256 txId) external returns (bytes)",
153
+ "function getTransaction(uint256 txId) external view returns (tuple(address target, uint256 value, bytes data, bool executed, uint256 confirmationCount))",
154
+ "function transactionCount() external view returns (uint256)",
155
+ ];
156
+ exports.AGREEMENT_TREE_ABI = [
157
+ "function registerSubAgreement(uint256 parentAgreementId, uint256 childAgreementId) external",
158
+ "function getChildren(uint256 agreementId) external view returns (uint256[])",
159
+ "function getRoot(uint256 agreementId) external view returns (uint256)",
160
+ "function getPath(uint256 agreementId) external view returns (uint256[])",
161
+ "function allChildrenSettled(uint256 agreementId) external view returns (bool)",
162
+ "function getDepth(uint256 agreementId) external view returns (uint256)",
163
+ ];
164
+ const getPolicyEngine = (address, runner) => new ethers_1.Contract(address, exports.POLICY_ENGINE_ABI, runner);
165
+ exports.getPolicyEngine = getPolicyEngine;
166
+ const getTrustRegistry = (address, runner) => new ethers_1.Contract(address, exports.TRUST_REGISTRY_ABI, runner);
167
+ exports.getTrustRegistry = getTrustRegistry;
168
+ const getIntentAttestation = (address, runner) => new ethers_1.Contract(address, exports.INTENT_ATTESTATION_ABI, runner);
169
+ exports.getIntentAttestation = getIntentAttestation;
170
+ const getARC402Wallet = (address, runner) => new ethers_1.Contract(address, exports.ARC402_WALLET_ABI, runner);
171
+ exports.getARC402Wallet = getARC402Wallet;
172
+ const getSettlementCoordinator = (address, runner) => new ethers_1.Contract(address, exports.SETTLEMENT_COORDINATOR_ABI, runner);
173
+ exports.getSettlementCoordinator = getSettlementCoordinator;
174
+ const getWalletFactory = (address, runner) => new ethers_1.Contract(address, exports.WALLET_FACTORY_ABI, runner);
175
+ exports.getWalletFactory = getWalletFactory;
176
+ const getAgentRegistry = (address, runner) => new ethers_1.Contract(address, exports.AGENT_REGISTRY_ABI, runner);
177
+ exports.getAgentRegistry = getAgentRegistry;
178
+ const getServiceAgreement = (address, runner) => new ethers_1.Contract(address, exports.SERVICE_AGREEMENT_ABI, runner);
179
+ exports.getServiceAgreement = getServiceAgreement;
180
+ const getReputationOracle = (address, runner) => new ethers_1.Contract(address, exports.REPUTATION_ORACLE_ABI, runner);
181
+ exports.getReputationOracle = getReputationOracle;
182
+ const getSponsorshipAttestation = (address, runner) => new ethers_1.Contract(address, exports.SPONSORSHIP_ATTESTATION_ABI, runner);
183
+ exports.getSponsorshipAttestation = getSponsorshipAttestation;
184
+ const getCapabilityRegistry = (address, runner) => new ethers_1.Contract(address, exports.CAPABILITY_REGISTRY_ABI, runner);
185
+ exports.getCapabilityRegistry = getCapabilityRegistry;
186
+ const getGovernance = (address, runner) => new ethers_1.Contract(address, exports.GOVERNANCE_ABI, runner);
187
+ exports.getGovernance = getGovernance;
188
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["contracts.ts"],"names":[],"mappings":";;;AAAA,mCAAkD;AAErC,QAAA,iBAAiB,GAAG;IAC/B,mEAAmE;IACnE,2EAA2E;IAC3E,yEAAyE;IACzE,4FAA4F;IAC5F,iIAAiI;IACjI,0FAA0F;IAC1F,iEAAiE;IACjE,+CAA+C;IAC/C,4CAA4C;IAC5C,uDAAuD;IACvD,oDAAoD;IACpD,sFAAsF;IACtF,sEAAsE;CAC9D,CAAC;AAEE,QAAA,kBAAkB,GAAG;IAChC,mEAAmE;IACnE,4EAA4E;IAC5E,uEAAuE;IACvE,8CAA8C;IAC9C,iDAAiD;IACjD,iDAAiD;CACzC,CAAC;AAEE,QAAA,sBAAsB,GAAG;IACpC,kHAAkH;IAClH,qFAAqF;IACrF,oIAAoI;IACpI,0JAA0J;CAClJ,CAAC;AAEE,QAAA,iBAAiB,GAAG;IAC/B,mEAAmE;IACnE,kCAAkC;IAClC,2GAA2G;IAC3G,0DAA0D;IAC1D,oFAAoF;IACpF,qDAAqD;CAC7C,CAAC;AAEE,QAAA,0BAA0B,GAAG;IACxC,wIAAwI;IACxI,8CAA8C;IAC9C,6DAA6D;IAC7D,uDAAuD;IACvD,mDAAmD;IACnD,6HAA6H;IAC7H,6GAA6G;CACrG,CAAC;AAEE,QAAA,kBAAkB,GAAG;IAChC,oDAAoD;IACpD,sEAAsE;IACtE,2EAA2E;CACnE,CAAC;AAEE,QAAA,kBAAkB,GAAG;IAChC,yHAAyH;IACzH,uHAAuH;IACvH,gCAAgC;IAChC,gCAAgC;IAChC,qDAAqD;IACrD,2EAA2E;IAC3E,yQAAyQ;IACzQ,kRAAkR;IAClR,oEAAoE;IACpE,gEAAgE;IAChE,2EAA2E;IAC3E,wEAAwE;IACxE,+EAA+E;IAC/E,uDAAuD;IACvD,yEAAyE;CACjE,CAAC;AAEE,QAAA,qBAAqB,GAAG;IACnC,yLAAyL;IACzL,+CAA+C;IAC/C,gFAAgF;IAChF,mFAAmF;IACnF,0DAA0D;IAC1D,oDAAoD;IACpD,+DAA+D;IAC/D,yFAAyF;IACzF,kIAAkI;IAClI,wLAAwL;IACxL,yEAAyE;IACzE,iGAAiG;IACjG,4HAA4H;IAC5H,+EAA+E;IAC/E,oHAAoH;IACpH,8EAA8E;IAC9E,0HAA0H;IAC1H,+CAA+C;IAC/C,sDAAsD;IACtD,2EAA2E;IAC3E,sUAAsU;IACtU,yMAAyM;IACzM,qPAAqP;IACrP,ySAAyS;IACzS,4PAA4P;IAC5P,mMAAmM;IACnM,uXAAuX;IACvX,kFAAkF;IAClF,sFAAsF;IACtF,2DAA2D;IAC3D,qKAAqK;IACrK,qEAAqE;IACrE,0EAA0E;IAC1E,wDAAwD;IACxD,4DAA4D;IAC5D,0PAA0P;IAC1P,gFAAgF;IAChF,oFAAoF;IACpF,gIAAgI;IAChI,gFAAgF;IAChF,mKAAmK;CAC3J,CAAC;AAEE,QAAA,qBAAqB,GAAG;IACnC,2GAA2G;IAC3G,oGAAoG;IACpG,2GAA2G;IAC3G,0EAA0E;IAC1E,oPAAoP;CAC5O,CAAC;AAEE,QAAA,2BAA2B,GAAG;IACzC,+EAA+E;IAC/E,uHAAuH;IACvH,iDAAiD;IACjD,uEAAuE;IACvE,+FAA+F;IAC/F,iMAAiM;IACjM,oFAAoF;IACpF,gFAAgF;IAChF,8EAA8E;IAC9E,sEAAsE;CAC9D,CAAC;AAEE,QAAA,uBAAuB,GAAG;IACrC,+DAA+D;IAC/D,2DAA2D;IAC3D,4CAA4C;IAC5C,6CAA6C;IAC7C,iEAAiE;IACjE,uGAAuG;IACvG,sDAAsD;IACtD,2GAA2G;IAC3G,0EAA0E;IAC1E,yEAAyE;IACzE,6FAA6F;CACrF,CAAC;AAEE,QAAA,cAAc,GAAG;IAC5B,kGAAkG;IAClG,oDAAoD;IACpD,oDAAoD;IACpD,oEAAoE;IACpE,0JAA0J;IAC1J,6DAA6D;CACrD,CAAC;AAEE,QAAA,kBAAkB,GAAG;IAChC,6FAA6F;IAC7F,6EAA6E;IAC7E,uEAAuE;IACvE,yEAAyE;IACzE,+EAA+E;IAC/E,wEAAwE;CAChE,CAAC;AAEJ,MAAM,eAAe,GAAG,CAAC,OAAe,EAAE,MAAsB,EAAE,EAAE,CAAC,IAAI,iBAAQ,CAAC,OAAO,EAAE,yBAAiB,EAAE,MAAM,CAAC,CAAC;AAAhH,QAAA,eAAe,mBAAiG;AACtH,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,MAAsB,EAAE,EAAE,CAAC,IAAI,iBAAQ,CAAC,OAAO,EAAE,0BAAkB,EAAE,MAAM,CAAC,CAAC;AAAlH,QAAA,gBAAgB,oBAAkG;AACxH,MAAM,oBAAoB,GAAG,CAAC,OAAe,EAAE,MAAsB,EAAE,EAAE,CAAC,IAAI,iBAAQ,CAAC,OAAO,EAAE,8BAAsB,EAAE,MAAM,CAAC,CAAC;AAA1H,QAAA,oBAAoB,wBAAsG;AAChI,MAAM,eAAe,GAAG,CAAC,OAAe,EAAE,MAAsB,EAAE,EAAE,CAAC,IAAI,iBAAQ,CAAC,OAAO,EAAE,yBAAiB,EAAE,MAAM,CAAC,CAAC;AAAhH,QAAA,eAAe,mBAAiG;AACtH,MAAM,wBAAwB,GAAG,CAAC,OAAe,EAAE,MAAsB,EAAE,EAAE,CAAC,IAAI,iBAAQ,CAAC,OAAO,EAAE,kCAA0B,EAAE,MAAM,CAAC,CAAC;AAAlI,QAAA,wBAAwB,4BAA0G;AACxI,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,MAAsB,EAAE,EAAE,CAAC,IAAI,iBAAQ,CAAC,OAAO,EAAE,0BAAkB,EAAE,MAAM,CAAC,CAAC;AAAlH,QAAA,gBAAgB,oBAAkG;AACxH,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,MAAsB,EAAE,EAAE,CAAC,IAAI,iBAAQ,CAAC,OAAO,EAAE,0BAAkB,EAAE,MAAM,CAAC,CAAC;AAAlH,QAAA,gBAAgB,oBAAkG;AACxH,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAE,MAAsB,EAAE,EAAE,CAAC,IAAI,iBAAQ,CAAC,OAAO,EAAE,6BAAqB,EAAE,MAAM,CAAC,CAAC;AAAxH,QAAA,mBAAmB,uBAAqG;AAC9H,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAE,MAAsB,EAAE,EAAE,CAAC,IAAI,iBAAQ,CAAC,OAAO,EAAE,6BAAqB,EAAE,MAAM,CAAC,CAAC;AAAxH,QAAA,mBAAmB,uBAAqG;AAC9H,MAAM,yBAAyB,GAAG,CAAC,OAAe,EAAE,MAAsB,EAAE,EAAE,CAAC,IAAI,iBAAQ,CAAC,OAAO,EAAE,mCAA2B,EAAE,MAAM,CAAC,CAAC;AAApI,QAAA,yBAAyB,6BAA2G;AAC1I,MAAM,qBAAqB,GAAG,CAAC,OAAe,EAAE,MAAsB,EAAE,EAAE,CAAC,IAAI,iBAAQ,CAAC,OAAO,EAAE,+BAAuB,EAAE,MAAM,CAAC,CAAC;AAA5H,QAAA,qBAAqB,yBAAuG;AAClI,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,MAAsB,EAAE,EAAE,CAAC,IAAI,iBAAQ,CAAC,OAAO,EAAE,sBAAc,EAAE,MAAM,CAAC,CAAC;AAA3G,QAAA,aAAa,iBAA8F"}
@@ -0,0 +1,186 @@
1
+ import { Contract, ContractRunner } from "ethers";
2
+
3
+ export const POLICY_ENGINE_ABI = [
4
+ "function setPolicy(bytes32 policyHash, bytes policyData) external",
5
+ "function getPolicy(address wallet) external view returns (bytes32, bytes)",
6
+ "function setCategoryLimit(string category, uint256 limitPerTx) external",
7
+ "function setCategoryLimitFor(address wallet, string category, uint256 limitPerTx) external",
8
+ "function validateSpend(address wallet, string category, uint256 amount, bytes32 contextId) external view returns (bool, string)",
9
+ "function categoryLimits(address wallet, string category) external view returns (uint256)",
10
+ "function registerWallet(address wallet, address owner) external",
11
+ "function freezeSpend(address wallet) external",
12
+ "function unfreeze(address wallet) external",
13
+ "function authorizeFreezeAgent(address agent) external",
14
+ "function revokeFreezeAgent(address agent) external",
15
+ "function queueCapReduction(address wallet, string category, uint256 newCap) external",
16
+ "function applyCapReduction(address wallet, string category) external",
17
+ ] as const;
18
+
19
+ export const TRUST_REGISTRY_ABI = [
20
+ "function getScore(address wallet) external view returns (uint256)",
21
+ "function getEffectiveScore(address wallet) external view returns (uint256)",
22
+ "function getTrustLevel(address wallet) external view returns (string)",
23
+ "function initWallet(address wallet) external",
24
+ "function recordSuccess(address wallet) external",
25
+ "function recordAnomaly(address wallet) external",
26
+ ] as const;
27
+
28
+ export const INTENT_ATTESTATION_ABI = [
29
+ "function attest(bytes32 attestationId, string action, string reason, address recipient, uint256 amount) external",
30
+ "function verify(bytes32 attestationId, address wallet) external view returns (bool)",
31
+ "function getAttestation(bytes32 attestationId) external view returns (bytes32, address, string, string, address, uint256, uint256)",
32
+ "event AttestationCreated(bytes32 indexed id, address indexed wallet, string action, string reason, address recipient, uint256 amount, uint256 timestamp)",
33
+ ] as const;
34
+
35
+ export const ARC402_WALLET_ABI = [
36
+ "function openContext(bytes32 contextId, string taskType) external",
37
+ "function closeContext() external",
38
+ "function executeSpend(address recipient, uint256 amount, string category, bytes32 attestationId) external",
39
+ "function getTrustScore() external view returns (uint256)",
40
+ "function getActiveContext() external view returns (bytes32, string, uint256, bool)",
41
+ "function updatePolicy(bytes32 newPolicyId) external",
42
+ ] as const;
43
+
44
+ export const SETTLEMENT_COORDINATOR_ABI = [
45
+ "function propose(address fromWallet, address toWallet, uint256 amount, bytes32 intentId, uint256 expiresAt) external returns (bytes32)",
46
+ "function accept(bytes32 proposalId) external",
47
+ "function reject(bytes32 proposalId, string reason) external",
48
+ "function execute(bytes32 proposalId) external payable",
49
+ "function checkExpiry(bytes32 proposalId) external",
50
+ "function getProposal(bytes32 proposalId) external view returns (address, address, uint256, bytes32, uint256, uint8, string)",
51
+ "event ProposalCreated(bytes32 indexed proposalId, address indexed from, address indexed to, uint256 amount)",
52
+ ] as const;
53
+
54
+ export const WALLET_FACTORY_ABI = [
55
+ "function createWallet() external returns (address)",
56
+ "function getWallets(address owner) external view returns (address[])",
57
+ "event WalletCreated(address indexed owner, address indexed walletAddress)",
58
+ ] as const;
59
+
60
+ export const AGENT_REGISTRY_ABI = [
61
+ "function register(string name, string[] capabilities, string serviceType, string endpoint, string metadataURI) external",
62
+ "function update(string name, string[] capabilities, string serviceType, string endpoint, string metadataURI) external",
63
+ "function deactivate() external",
64
+ "function reactivate() external",
65
+ "function submitHeartbeat(uint32 latencyMs) external",
66
+ "function setHeartbeatPolicy(uint64 interval, uint64 gracePeriod) external",
67
+ "function getAgent(address wallet) external view returns (tuple(address wallet, string name, string[] capabilities, string serviceType, string endpoint, string metadataURI, bool active, uint256 registeredAt, uint256 endpointChangedAt, uint256 endpointChangeCount))",
68
+ "function getOperationalMetrics(address wallet) external view returns (tuple(uint64 heartbeatInterval, uint64 heartbeatGracePeriod, uint64 lastHeartbeatAt, uint64 rollingLatency, uint32 heartbeatCount, uint32 missedHeartbeatCount, uint32 uptimeScore, uint32 responseScore))",
69
+ "function isRegistered(address wallet) external view returns (bool)",
70
+ "function isActive(address wallet) external view returns (bool)",
71
+ "function getCapabilities(address wallet) external view returns (string[])",
72
+ "function getTrustScore(address wallet) external view returns (uint256)",
73
+ "function getEndpointStability(address wallet) external view returns (uint256)",
74
+ "function agentCount() external view returns (uint256)",
75
+ "function getAgentAtIndex(uint256 index) external view returns (address)",
76
+ ] as const;
77
+
78
+ export const SERVICE_AGREEMENT_ABI = [
79
+ "function propose(address provider, string serviceType, string description, uint256 price, address token, uint256 deadline, bytes32 deliverablesHash) external payable returns (uint256)",
80
+ "function accept(uint256 agreementId) external",
81
+ "function fulfill(uint256 agreementId, bytes32 actualDeliverablesHash) external",
82
+ "function commitDeliverable(uint256 agreementId, bytes32 deliverableHash) external",
83
+ "function verifyDeliverable(uint256 agreementId) external",
84
+ "function autoRelease(uint256 agreementId) external",
85
+ "function dispute(uint256 agreementId, string reason) external",
86
+ "function directDispute(uint256 agreementId, uint8 directReason, string reason) external",
87
+ "function requestRevision(uint256 agreementId, bytes32 feedbackHash, string feedbackURI, bytes32 previousTranscriptHash) external",
88
+ "function respondToRevision(uint256 agreementId, uint8 responseType, uint256 proposedProviderPayout, bytes32 responseHash, string responseURI, bytes32 previousTranscriptHash) external",
89
+ "function escalateToDispute(uint256 agreementId, string reason) external",
90
+ "function canDirectDispute(uint256 agreementId, uint8 directReason) external view returns (bool)",
91
+ "function submitDisputeEvidence(uint256 agreementId, uint8 evidenceType, bytes32 evidenceHash, string evidenceURI) external",
92
+ "function nominateArbitrator(uint256 agreementId, address arbitrator) external",
93
+ "function castArbitrationVote(uint256 agreementId, uint8 vote, uint256 providerAward, uint256 clientAward) external",
94
+ "function requestHumanEscalation(uint256 agreementId, string reason) external",
95
+ "function resolveDisputeDetailed(uint256 agreementId, uint8 outcome, uint256 providerAward, uint256 clientAward) external",
96
+ "function cancel(uint256 agreementId) external",
97
+ "function expiredCancel(uint256 agreementId) external",
98
+ "function resolveDispute(uint256 agreementId, bool favorProvider) external",
99
+ "function getAgreement(uint256 id) external view returns (tuple(uint256 id, address client, address provider, string serviceType, string description, uint256 price, address token, uint256 deadline, bytes32 deliverablesHash, uint8 status, uint256 createdAt, uint256 resolvedAt, uint256 verifyWindowEnd, bytes32 committedHash))",
100
+ "function getRemediationCase(uint256 agreementId) external view returns (tuple(uint8 cycleCount, uint256 openedAt, uint256 deadlineAt, uint256 lastActionAt, bytes32 latestTranscriptHash, bool active))",
101
+ "function getRemediationFeedback(uint256 agreementId, uint256 index) external view returns (tuple(uint8 cycle, address author, bytes32 feedbackHash, string feedbackURI, bytes32 previousTranscriptHash, bytes32 transcriptHash, uint256 timestamp))",
102
+ "function getRemediationResponse(uint256 agreementId, uint256 index) external view returns (tuple(uint8 cycle, address author, uint8 responseType, uint256 proposedProviderPayout, bytes32 responseHash, string responseURI, bytes32 previousTranscriptHash, bytes32 transcriptHash, uint256 timestamp))",
103
+ "function getDisputeCase(uint256 agreementId) external view returns (tuple(uint256 agreementId, uint256 openedAt, uint256 responseDeadlineAt, uint8 outcome, uint256 providerAward, uint256 clientAward, bool humanReviewRequested, uint256 evidenceCount))",
104
+ "function getDisputeEvidence(uint256 agreementId, uint256 index) external view returns (tuple(address submitter, uint8 evidenceType, bytes32 evidenceHash, string evidenceURI, uint256 timestamp))",
105
+ "function getArbitrationCase(uint256 agreementId) external view returns (tuple(uint256 agreementId, address[3] arbitrators, uint8 arbitratorCount, uint8 providerVotes, uint8 clientVotes, uint8 splitVotes, uint8 humanVotes, uint256 selectionDeadlineAt, uint256 decisionDeadlineAt, uint256 splitProviderAward, uint256 splitClientAward, bool finalized, bool humanBackstopUsed))",
106
+ "function getAgreementsByClient(address client) external view returns (uint256[])",
107
+ "function getAgreementsByProvider(address provider) external view returns (uint256[])",
108
+ "function agreementCount() external view returns (uint256)",
109
+ "function openSessionChannel(address provider, address token, uint256 maxAmount, uint256 ratePerCall, uint256 deadline) external payable returns (bytes32 channelId)",
110
+ "function closeChannel(bytes32 channelId, bytes finalState) external",
111
+ "function challengeChannel(bytes32 channelId, bytes latestState) external",
112
+ "function finaliseChallenge(bytes32 channelId) external",
113
+ "function reclaimExpiredChannel(bytes32 channelId) external",
114
+ "function getChannel(bytes32 channelId) external view returns (tuple(address client, address provider, address token, uint256 depositAmount, uint256 settledAmount, uint256 lastSequenceNumber, uint256 deadline, uint256 challengeExpiry, uint8 status))",
115
+ "function getChannelsByClient(address client) external view returns (bytes32[])",
116
+ "function getChannelsByProvider(address provider) external view returns (bytes32[])",
117
+ "function resolveFromArbitration(uint256 agreementId, address recipient, uint256 providerAmount, uint256 clientAmount) external",
118
+ "function ownerResolveDispute(uint256 agreementId, bool favorProvider) external",
119
+ "event AgreementProposed(uint256 indexed id, address indexed client, address indexed provider, string serviceType, uint256 price, address token, uint256 deadline)",
120
+ ] as const;
121
+
122
+ export const REPUTATION_ORACLE_ABI = [
123
+ "function publishSignal(address subject, uint8 signalType, bytes32 capabilityHash, string reason) external",
124
+ "function getReputation(address subject) external view returns (uint256, uint256, uint256, uint256)",
125
+ "function getCapabilityReputation(address subject, bytes32 capabilityHash) external view returns (uint256)",
126
+ "function getSignalCount(address subject) external view returns (uint256)",
127
+ "function getSignal(address subject, uint256 index) external view returns (tuple(address publisher, address subject, uint8 signalType, bytes32 capabilityHash, string reason, uint256 publisherTrustAtTime, uint256 timestamp, bool autoPublished))",
128
+ ] as const;
129
+
130
+ export const SPONSORSHIP_ATTESTATION_ABI = [
131
+ "function publish(address agent, uint256 expiresAt) external returns (bytes32)",
132
+ "function publishWithTier(address agent, uint256 expiresAt, uint8 tier, string evidenceURI) external returns (bytes32)",
133
+ "function revoke(bytes32 attestationId) external",
134
+ "function isActive(bytes32 attestationId) external view returns (bool)",
135
+ "function getActiveAttestation(address sponsor, address agent) external view returns (bytes32)",
136
+ "function getAttestation(bytes32 attestationId) external view returns (tuple(address sponsor, address agent, uint256 issuedAt, uint256 expiresAt, bool revoked, uint8 tier, string evidenceURI))",
137
+ "function getSponsorAttestations(address sponsor) external view returns (bytes32[])",
138
+ "function getAgentAttestations(address agent) external view returns (bytes32[])",
139
+ "function activeSponsorCount(address sponsor) external view returns (uint256)",
140
+ "function getHighestTier(address agent) external view returns (uint8)",
141
+ ] as const;
142
+
143
+ export const CAPABILITY_REGISTRY_ABI = [
144
+ "function registerRoot(string root) external returns (bytes32)",
145
+ "function setRootStatus(string root, bool active) external",
146
+ "function claim(string capability) external",
147
+ "function revoke(string capability) external",
148
+ "function isRootActive(string root) external view returns (bool)",
149
+ "function getRoot(string root) external view returns (tuple(bytes32 rootId, string root, bool active))",
150
+ "function rootCount() external view returns (uint256)",
151
+ "function getRootAt(uint256 index) external view returns (tuple(bytes32 rootId, string root, bool active))",
152
+ "function getCapabilities(address agent) external view returns (string[])",
153
+ "function capabilityCount(address agent) external view returns (uint256)",
154
+ "function isCapabilityClaimed(address agent, string capability) external view returns (bool)",
155
+ ] as const;
156
+
157
+ export const GOVERNANCE_ABI = [
158
+ "function submitTransaction(address target, uint256 value, bytes data) external returns (uint256)",
159
+ "function confirmTransaction(uint256 txId) external",
160
+ "function revokeConfirmation(uint256 txId) external",
161
+ "function executeTransaction(uint256 txId) external returns (bytes)",
162
+ "function getTransaction(uint256 txId) external view returns (tuple(address target, uint256 value, bytes data, bool executed, uint256 confirmationCount))",
163
+ "function transactionCount() external view returns (uint256)",
164
+ ] as const;
165
+
166
+ export const AGREEMENT_TREE_ABI = [
167
+ "function registerSubAgreement(uint256 parentAgreementId, uint256 childAgreementId) external",
168
+ "function getChildren(uint256 agreementId) external view returns (uint256[])",
169
+ "function getRoot(uint256 agreementId) external view returns (uint256)",
170
+ "function getPath(uint256 agreementId) external view returns (uint256[])",
171
+ "function allChildrenSettled(uint256 agreementId) external view returns (bool)",
172
+ "function getDepth(uint256 agreementId) external view returns (uint256)",
173
+ ] as const;
174
+
175
+ export const getPolicyEngine = (address: string, runner: ContractRunner) => new Contract(address, POLICY_ENGINE_ABI, runner);
176
+ export const getTrustRegistry = (address: string, runner: ContractRunner) => new Contract(address, TRUST_REGISTRY_ABI, runner);
177
+ export const getIntentAttestation = (address: string, runner: ContractRunner) => new Contract(address, INTENT_ATTESTATION_ABI, runner);
178
+ export const getARC402Wallet = (address: string, runner: ContractRunner) => new Contract(address, ARC402_WALLET_ABI, runner);
179
+ export const getSettlementCoordinator = (address: string, runner: ContractRunner) => new Contract(address, SETTLEMENT_COORDINATOR_ABI, runner);
180
+ export const getWalletFactory = (address: string, runner: ContractRunner) => new Contract(address, WALLET_FACTORY_ABI, runner);
181
+ export const getAgentRegistry = (address: string, runner: ContractRunner) => new Contract(address, AGENT_REGISTRY_ABI, runner);
182
+ export const getServiceAgreement = (address: string, runner: ContractRunner) => new Contract(address, SERVICE_AGREEMENT_ABI, runner);
183
+ export const getReputationOracle = (address: string, runner: ContractRunner) => new Contract(address, REPUTATION_ORACLE_ABI, runner);
184
+ export const getSponsorshipAttestation = (address: string, runner: ContractRunner) => new Contract(address, SPONSORSHIP_ATTESTATION_ABI, runner);
185
+ export const getCapabilityRegistry = (address: string, runner: ContractRunner) => new Contract(address, CAPABILITY_REGISTRY_ABI, runner);
186
+ export const getGovernance = (address: string, runner: ContractRunner) => new Contract(address, GOVERNANCE_ABI, runner);
@@ -0,0 +1,231 @@
1
+ import { ContractRunner, ethers } from "ethers";
2
+ import { readFile } from "fs/promises";
3
+ import nacl from "tweetnacl";
4
+ import { SERVICE_AGREEMENT_ABI } from "./contracts";
5
+
6
+ // ─── Deliverable Types ────────────────────────────────────────────────────────
7
+
8
+ export enum DeliverableType {
9
+ text = "text",
10
+ code = "code",
11
+ data = "data",
12
+ media = "media",
13
+ api = "api",
14
+ composite = "composite",
15
+ null = "null",
16
+ }
17
+
18
+ export interface DeliverableManifestEntry {
19
+ path: string;
20
+ hash: string; // keccak256 hex
21
+ size: number;
22
+ type?: DeliverableType;
23
+ }
24
+
25
+ export interface DeliverableManifest {
26
+ type: DeliverableType.composite;
27
+ version: string;
28
+ files: DeliverableManifestEntry[];
29
+ metadata?: Record<string, unknown>;
30
+ }
31
+
32
+ // ─── Encrypted Deliverable ────────────────────────────────────────────────────
33
+
34
+ /**
35
+ * The encrypted structure returned by encryptDeliverable.
36
+ * encryptedBuffer contains the nonce (24 bytes) followed by the box ciphertext.
37
+ * ephemeralPublicKey is the sender's one-time public key; the recipient needs it
38
+ * along with their own private key to decrypt.
39
+ */
40
+ export interface EncryptedDeliverable {
41
+ encryptedBuffer: Buffer;
42
+ ephemeralPublicKey: Uint8Array;
43
+ }
44
+
45
+ /**
46
+ * Encrypt a buffer for a recipient using NaCl box (X25519-XSalsa20-Poly1305).
47
+ * An ephemeral keypair is generated per call so encryptions are unlinkable.
48
+ */
49
+ export async function encryptDeliverable(
50
+ buffer: Buffer,
51
+ recipientPublicKey: Uint8Array,
52
+ ): Promise<EncryptedDeliverable> {
53
+ const ephemeralKeyPair = nacl.box.keyPair();
54
+ const nonce = nacl.randomBytes(nacl.box.nonceLength);
55
+ const ciphertext = nacl.box(buffer, nonce, recipientPublicKey, ephemeralKeyPair.secretKey);
56
+ const encryptedBuffer = Buffer.concat([Buffer.from(nonce), Buffer.from(ciphertext)]);
57
+ return { encryptedBuffer, ephemeralPublicKey: ephemeralKeyPair.publicKey };
58
+ }
59
+
60
+ /**
61
+ * Decrypt a buffer produced by encryptDeliverable.
62
+ * secretKey is the recipient's NaCl box secret key (32 bytes).
63
+ */
64
+ export async function decryptDeliverable(
65
+ encryptedBuffer: Buffer,
66
+ ephemeralPublicKey: Uint8Array,
67
+ secretKey: Uint8Array,
68
+ ): Promise<Buffer> {
69
+ const nonce = encryptedBuffer.subarray(0, nacl.box.nonceLength);
70
+ const ciphertext = encryptedBuffer.subarray(nacl.box.nonceLength);
71
+ const plaintext = nacl.box.open(ciphertext, nonce, ephemeralPublicKey, secretKey);
72
+ if (!plaintext) throw new Error("Decryption failed: invalid ciphertext or wrong keys");
73
+ return Buffer.from(plaintext);
74
+ }
75
+
76
+ // ─── IPFS helpers ─────────────────────────────────────────────────────────────
77
+
78
+ export interface IPFSUploadOptions {
79
+ /** IPFS HTTP API base URL. Defaults to https://ipfs.io/api/v0.
80
+ * Override with a pinning service endpoint (e.g. Infura, Pinata) for persistence. */
81
+ apiEndpoint?: string;
82
+ }
83
+
84
+ export interface IPFSUploadResult {
85
+ cid: string;
86
+ uri: string; // ipfs://<cid>
87
+ }
88
+
89
+ // ─── Standalone functions ─────────────────────────────────────────────────────
90
+
91
+ /** Compute keccak256 over arbitrary bytes. Returns 0x-prefixed hex. */
92
+ export async function hashDeliverable(buffer: Buffer): Promise<string> {
93
+ return ethers.keccak256(buffer);
94
+ }
95
+
96
+ /** Read a file and return its keccak256 hash. */
97
+ export async function hashDeliverableFile(filePath: string): Promise<string> {
98
+ const buffer = await readFile(filePath);
99
+ return hashDeliverable(buffer);
100
+ }
101
+
102
+ /**
103
+ * Upload a buffer to IPFS via the HTTP API.
104
+ * Returns the CID and an ipfs:// URI.
105
+ *
106
+ * The default endpoint (https://ipfs.io/api/v0) is a public gateway — it may
107
+ * not persist content long-term. Pass a dedicated pinning service endpoint via
108
+ * options.apiEndpoint for production use.
109
+ */
110
+ export async function uploadToIPFS(buffer: Buffer, options?: IPFSUploadOptions): Promise<IPFSUploadResult> {
111
+ const apiEndpoint = options?.apiEndpoint ?? "https://ipfs.io/api/v0";
112
+ const form = new FormData();
113
+ form.append("file", new Blob([buffer]));
114
+ const response = await fetch(`${apiEndpoint}/add`, { method: "POST", body: form });
115
+ if (!response.ok) throw new Error(`IPFS upload failed: ${response.status} ${response.statusText}`);
116
+ const data = (await response.json()) as { Hash: string };
117
+ const cid = data.Hash;
118
+ return { cid, uri: `ipfs://${cid}` };
119
+ }
120
+
121
+ /**
122
+ * Encrypt a buffer with the recipient's public key, then upload the packed
123
+ * ciphertext to IPFS. The IPFS blob format is:
124
+ * magic "ARC1" (4 bytes) | ephemeral public key (32 bytes) | nonce (24 bytes) | ciphertext
125
+ * This self-contained layout lets the recipient recover all decryption inputs
126
+ * from the CID alone (plus their own private key).
127
+ */
128
+ export async function uploadEncryptedIPFS(
129
+ buffer: Buffer,
130
+ recipientPublicKey: Uint8Array,
131
+ options?: IPFSUploadOptions,
132
+ ): Promise<IPFSUploadResult> {
133
+ const { encryptedBuffer, ephemeralPublicKey } = await encryptDeliverable(buffer, recipientPublicKey);
134
+ const MAGIC = Buffer.from("ARC1");
135
+ const packed = Buffer.concat([MAGIC, Buffer.from(ephemeralPublicKey), encryptedBuffer]);
136
+ return uploadToIPFS(packed, options);
137
+ }
138
+
139
+ // ─── DeliverableClient ────────────────────────────────────────────────────────
140
+
141
+ export class DeliverableClient {
142
+ private contract: ethers.Contract;
143
+
144
+ constructor(address: string, runner: ContractRunner) {
145
+ this.contract = new ethers.Contract(address, SERVICE_AGREEMENT_ABI, runner);
146
+ }
147
+
148
+ /** Compute keccak256 over a buffer. Returns 0x-prefixed hex. */
149
+ async hashDeliverable(buffer: Buffer): Promise<string> {
150
+ return hashDeliverable(buffer);
151
+ }
152
+
153
+ /** Read a file and return its keccak256 hash. */
154
+ async hashDeliverableFile(filePath: string): Promise<string> {
155
+ return hashDeliverableFile(filePath);
156
+ }
157
+
158
+ /**
159
+ * Commit a deliverable hash on-chain via ServiceAgreement.commitDeliverable().
160
+ * metadataURI is accepted for caller convenience but is not forwarded to the
161
+ * contract (the current ABI takes only agreementId + hash).
162
+ */
163
+ async commitDeliverable(
164
+ agreementId: bigint,
165
+ hash: string,
166
+ metadataURI: string,
167
+ signer?: ContractRunner,
168
+ ): Promise<ethers.TransactionReceipt | null> {
169
+ const contract = signer ? this.contract.connect(signer) : this.contract;
170
+ const tx = await (contract as any).commitDeliverable(agreementId, hash);
171
+ return tx.wait();
172
+ }
173
+
174
+ /**
175
+ * Fetch the on-chain committed hash and compare it against a local buffer.
176
+ * Does NOT release escrow — call ServiceAgreementClient.verifyDeliverable()
177
+ * separately once satisfied.
178
+ */
179
+ async verifyDeliverable(
180
+ agreementId: bigint,
181
+ localBuffer: Buffer,
182
+ signer?: ContractRunner,
183
+ ): Promise<{ match: boolean; onChainHash: string; localHash: string }> {
184
+ const contract = signer ? this.contract.connect(signer) : this.contract;
185
+ const agreement = await (contract as any).getAgreement(agreementId);
186
+ const onChainHash = agreement.deliverableHash as string;
187
+ const localHash = await hashDeliverable(localBuffer);
188
+ const match = onChainHash.toLowerCase() === localHash.toLowerCase();
189
+ return { match, onChainHash, localHash };
190
+ }
191
+
192
+ /** Upload a buffer to IPFS. See uploadToIPFS for endpoint notes. */
193
+ async uploadToIPFS(buffer: Buffer, options?: IPFSUploadOptions): Promise<IPFSUploadResult> {
194
+ return uploadToIPFS(buffer, options);
195
+ }
196
+
197
+ /**
198
+ * Upload buffer to IPFS then commit the hash + URI in one call.
199
+ * Returns the committed hash, IPFS URI, and the on-chain transaction receipt.
200
+ */
201
+ async commitDeliverableIPFS(
202
+ agreementId: bigint,
203
+ buffer: Buffer,
204
+ options?: IPFSUploadOptions,
205
+ signer?: ContractRunner,
206
+ ): Promise<{ hash: string; uri: string; receipt: ethers.TransactionReceipt }> {
207
+ const [hash, { uri }] = await Promise.all([hashDeliverable(buffer), uploadToIPFS(buffer, options)]);
208
+ const receipt = await this.commitDeliverable(agreementId, hash, uri, signer);
209
+ return { hash, uri, receipt };
210
+ }
211
+
212
+ /**
213
+ * Encrypt buffer for recipientPublicKey, upload the ciphertext to IPFS, then
214
+ * commit the plaintext hash on-chain. The on-chain hash covers plaintext so
215
+ * the client can verify integrity after decryption.
216
+ */
217
+ async commitDeliverableIPFSEncrypted(
218
+ agreementId: bigint,
219
+ buffer: Buffer,
220
+ recipientPublicKey: Uint8Array,
221
+ options?: IPFSUploadOptions,
222
+ signer?: ContractRunner,
223
+ ): Promise<{ hash: string; uri: string; receipt: ethers.TransactionReceipt }> {
224
+ const [hash, { uri }] = await Promise.all([
225
+ hashDeliverable(buffer),
226
+ uploadEncryptedIPFS(buffer, recipientPublicKey, options),
227
+ ]);
228
+ const receipt = await this.commitDeliverable(agreementId, hash, uri, signer);
229
+ return { hash, uri, receipt };
230
+ }
231
+ }