@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.
- package/README.md +184 -0
- package/dist/agent.d.ts +29 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +95 -0
- package/dist/agreement.d.ts +57 -0
- package/dist/agreement.d.ts.map +1 -0
- package/dist/agreement.js +156 -0
- package/dist/capability.d.ts +17 -0
- package/dist/capability.d.ts.map +1 -0
- package/dist/capability.js +19 -0
- package/dist/channel.d.ts +39 -0
- package/dist/channel.d.ts.map +1 -0
- package/dist/channel.js +160 -0
- package/dist/coldstart.d.ts +15 -0
- package/dist/coldstart.d.ts.map +1 -0
- package/dist/coldstart.js +44 -0
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +2 -0
- package/dist/contractinteraction.d.ts +47 -0
- package/dist/contractinteraction.d.ts.map +1 -0
- package/dist/contractinteraction.js +80 -0
- package/dist/contracts.d.ts +27 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +187 -0
- package/dist/deliverable.d.ts +118 -0
- package/dist/deliverable.d.ts.map +1 -0
- package/dist/deliverable.js +156 -0
- package/dist/dispute-arbitration.d.ts +42 -0
- package/dist/dispute-arbitration.d.ts.map +1 -0
- package/dist/dispute-arbitration.js +160 -0
- package/dist/governance.d.ts +13 -0
- package/dist/governance.d.ts.map +1 -0
- package/dist/governance.js +15 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/intent.d.ts +13 -0
- package/dist/intent.d.ts.map +1 -0
- package/dist/intent.js +26 -0
- package/dist/metadata.d.ts +55 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +106 -0
- package/dist/migration.d.ts +11 -0
- package/dist/migration.d.ts.map +1 -0
- package/dist/migration.js +38 -0
- package/dist/multiparty.d.ts +56 -0
- package/dist/multiparty.d.ts.map +1 -0
- package/dist/multiparty.js +86 -0
- package/dist/negotiation-guard.d.ts +20 -0
- package/dist/negotiation-guard.d.ts.map +1 -0
- package/dist/negotiation-guard.js +96 -0
- package/dist/negotiation.d.ts +25 -0
- package/dist/negotiation.d.ts.map +1 -0
- package/dist/negotiation.js +102 -0
- package/dist/policy.d.ts +33 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +72 -0
- package/dist/reputation.d.ts +13 -0
- package/dist/reputation.d.ts.map +1 -0
- package/dist/reputation.js +21 -0
- package/dist/session-manager.d.ts +13 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +102 -0
- package/dist/settlement.d.ts +14 -0
- package/dist/settlement.d.ts.map +1 -0
- package/dist/settlement.js +35 -0
- package/dist/sponsorship.d.ts +17 -0
- package/dist/sponsorship.d.ts.map +1 -0
- package/dist/sponsorship.js +19 -0
- package/dist/trust.d.ts +22 -0
- package/dist/trust.d.ts.map +1 -0
- package/dist/trust.js +52 -0
- package/dist/types.d.ts +391 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +119 -0
- package/dist/wallet.d.ts +31 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +83 -0
- package/dist/watchtower.d.ts +60 -0
- package/dist/watchtower.d.ts.map +1 -0
- package/dist/watchtower.js +93 -0
- package/package.json +30 -0
- package/src/agent.ts +122 -0
- package/src/agreement.ts +236 -0
- package/src/capability.ts +18 -0
- package/src/channel.ts +203 -0
- package/src/coldstart.ts +52 -0
- package/src/context.ts +2 -0
- package/src/contractinteraction.d.ts +47 -0
- package/src/contractinteraction.d.ts.map +1 -0
- package/src/contractinteraction.js +81 -0
- package/src/contractinteraction.js.map +1 -0
- package/src/contractinteraction.ts +157 -0
- package/src/contracts.d.ts +27 -0
- package/src/contracts.d.ts.map +1 -0
- package/src/contracts.js +188 -0
- package/src/contracts.js.map +1 -0
- package/src/contracts.ts +186 -0
- package/src/deliverable.ts +231 -0
- package/src/demos/demo-insurance.ts +148 -0
- package/src/demos/demo-multiagent.ts +197 -0
- package/src/demos/demo-research.ts +124 -0
- package/src/dispute-arbitration.ts +196 -0
- package/src/governance.ts +14 -0
- package/src/index.ts +31 -0
- package/src/intent.ts +22 -0
- package/src/metadata.ts +158 -0
- package/src/migration.ts +43 -0
- package/src/multiparty.ts +132 -0
- package/src/negotiation-guard.ts +125 -0
- package/src/negotiation.ts +135 -0
- package/src/policy.ts +71 -0
- package/src/reputation.ts +20 -0
- package/src/session-manager.ts +80 -0
- package/src/settlement.ts +31 -0
- package/src/sponsorship.ts +18 -0
- package/src/trust.ts +43 -0
- package/src/types.d.ts +391 -0
- package/src/types.d.ts.map +1 -0
- package/src/types.js +113 -0
- package/src/types.js.map +1 -0
- package/src/types.ts +484 -0
- package/src/wallet.ts +86 -0
- package/src/watchtower.ts +124 -0
- package/test/negotiation-signing.test.js +157 -0
- package/test/sdk.test.js +19 -0
- package/tsconfig.json +17 -0
package/src/types.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DisputeClass = exports.DisputeMode = exports.IdentityTier = exports.ReputationSignalType = exports.ArbitrationVote = exports.DirectDisputeReason = exports.EvidenceType = exports.DisputeOutcome = exports.ProviderResponseType = exports.AgreementStatus = exports.NETWORKS = void 0;
|
|
4
|
+
exports.NETWORKS = {
|
|
5
|
+
"base-sepolia": {
|
|
6
|
+
chainId: 84532,
|
|
7
|
+
rpc: "https://sepolia.base.org",
|
|
8
|
+
contracts: {
|
|
9
|
+
policyEngine: "0x6B89621c94a7105c3D8e0BD8Fb06814931CA2CB2",
|
|
10
|
+
trustRegistry: "0xdA1D377991B2E580991B0DD381CdD635dd71aC39",
|
|
11
|
+
intentAttestation: "0xbB5E1809D4a94D08Bf1143131312858143D018f1",
|
|
12
|
+
settlementCoordinator: "0x7ad8db6C5f394542E8e9658F86C85cC99Cf6D460",
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
base: {
|
|
16
|
+
chainId: 8453,
|
|
17
|
+
rpc: "https://mainnet.base.org",
|
|
18
|
+
contracts: {
|
|
19
|
+
policyEngine: "0x0000000000000000000000000000000000000000",
|
|
20
|
+
trustRegistry: "0x0000000000000000000000000000000000000000",
|
|
21
|
+
intentAttestation: "0x0000000000000000000000000000000000000000",
|
|
22
|
+
settlementCoordinator: "0x0000000000000000000000000000000000000000",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
var AgreementStatus;
|
|
27
|
+
(function (AgreementStatus) {
|
|
28
|
+
AgreementStatus[AgreementStatus["PROPOSED"] = 0] = "PROPOSED";
|
|
29
|
+
AgreementStatus[AgreementStatus["ACCEPTED"] = 1] = "ACCEPTED";
|
|
30
|
+
AgreementStatus[AgreementStatus["PENDING_VERIFICATION"] = 2] = "PENDING_VERIFICATION";
|
|
31
|
+
AgreementStatus[AgreementStatus["FULFILLED"] = 3] = "FULFILLED";
|
|
32
|
+
AgreementStatus[AgreementStatus["DISPUTED"] = 4] = "DISPUTED";
|
|
33
|
+
AgreementStatus[AgreementStatus["CANCELLED"] = 5] = "CANCELLED";
|
|
34
|
+
AgreementStatus[AgreementStatus["REVISION_REQUESTED"] = 6] = "REVISION_REQUESTED";
|
|
35
|
+
AgreementStatus[AgreementStatus["REVISED"] = 7] = "REVISED";
|
|
36
|
+
AgreementStatus[AgreementStatus["PARTIAL_SETTLEMENT"] = 8] = "PARTIAL_SETTLEMENT";
|
|
37
|
+
AgreementStatus[AgreementStatus["MUTUAL_CANCEL"] = 9] = "MUTUAL_CANCEL";
|
|
38
|
+
AgreementStatus[AgreementStatus["ESCALATED_TO_HUMAN"] = 10] = "ESCALATED_TO_HUMAN";
|
|
39
|
+
AgreementStatus[AgreementStatus["ESCALATED_TO_ARBITRATION"] = 11] = "ESCALATED_TO_ARBITRATION";
|
|
40
|
+
})(AgreementStatus || (exports.AgreementStatus = AgreementStatus = {}));
|
|
41
|
+
var ProviderResponseType;
|
|
42
|
+
(function (ProviderResponseType) {
|
|
43
|
+
ProviderResponseType[ProviderResponseType["NONE"] = 0] = "NONE";
|
|
44
|
+
ProviderResponseType[ProviderResponseType["REVISE"] = 1] = "REVISE";
|
|
45
|
+
ProviderResponseType[ProviderResponseType["DEFEND"] = 2] = "DEFEND";
|
|
46
|
+
ProviderResponseType[ProviderResponseType["COUNTER"] = 3] = "COUNTER";
|
|
47
|
+
ProviderResponseType[ProviderResponseType["PARTIAL_SETTLEMENT"] = 4] = "PARTIAL_SETTLEMENT";
|
|
48
|
+
ProviderResponseType[ProviderResponseType["REQUEST_HUMAN_REVIEW"] = 5] = "REQUEST_HUMAN_REVIEW";
|
|
49
|
+
ProviderResponseType[ProviderResponseType["ESCALATE"] = 6] = "ESCALATE";
|
|
50
|
+
})(ProviderResponseType || (exports.ProviderResponseType = ProviderResponseType = {}));
|
|
51
|
+
var DisputeOutcome;
|
|
52
|
+
(function (DisputeOutcome) {
|
|
53
|
+
DisputeOutcome[DisputeOutcome["NONE"] = 0] = "NONE";
|
|
54
|
+
DisputeOutcome[DisputeOutcome["PENDING"] = 1] = "PENDING";
|
|
55
|
+
DisputeOutcome[DisputeOutcome["PROVIDER_WINS"] = 2] = "PROVIDER_WINS";
|
|
56
|
+
DisputeOutcome[DisputeOutcome["CLIENT_REFUND"] = 3] = "CLIENT_REFUND";
|
|
57
|
+
DisputeOutcome[DisputeOutcome["PARTIAL_PROVIDER"] = 4] = "PARTIAL_PROVIDER";
|
|
58
|
+
DisputeOutcome[DisputeOutcome["PARTIAL_CLIENT"] = 5] = "PARTIAL_CLIENT";
|
|
59
|
+
DisputeOutcome[DisputeOutcome["MUTUAL_CANCEL"] = 6] = "MUTUAL_CANCEL";
|
|
60
|
+
DisputeOutcome[DisputeOutcome["HUMAN_REVIEW_REQUIRED"] = 7] = "HUMAN_REVIEW_REQUIRED";
|
|
61
|
+
})(DisputeOutcome || (exports.DisputeOutcome = DisputeOutcome = {}));
|
|
62
|
+
var EvidenceType;
|
|
63
|
+
(function (EvidenceType) {
|
|
64
|
+
EvidenceType[EvidenceType["NONE"] = 0] = "NONE";
|
|
65
|
+
EvidenceType[EvidenceType["TRANSCRIPT"] = 1] = "TRANSCRIPT";
|
|
66
|
+
EvidenceType[EvidenceType["DELIVERABLE"] = 2] = "DELIVERABLE";
|
|
67
|
+
EvidenceType[EvidenceType["ACCEPTANCE_CRITERIA"] = 3] = "ACCEPTANCE_CRITERIA";
|
|
68
|
+
EvidenceType[EvidenceType["COMMUNICATION"] = 4] = "COMMUNICATION";
|
|
69
|
+
EvidenceType[EvidenceType["EXTERNAL_REFERENCE"] = 5] = "EXTERNAL_REFERENCE";
|
|
70
|
+
EvidenceType[EvidenceType["OTHER"] = 6] = "OTHER";
|
|
71
|
+
})(EvidenceType || (exports.EvidenceType = EvidenceType = {}));
|
|
72
|
+
var DirectDisputeReason;
|
|
73
|
+
(function (DirectDisputeReason) {
|
|
74
|
+
DirectDisputeReason[DirectDisputeReason["NONE"] = 0] = "NONE";
|
|
75
|
+
DirectDisputeReason[DirectDisputeReason["NO_DELIVERY"] = 1] = "NO_DELIVERY";
|
|
76
|
+
DirectDisputeReason[DirectDisputeReason["HARD_DEADLINE_BREACH"] = 2] = "HARD_DEADLINE_BREACH";
|
|
77
|
+
DirectDisputeReason[DirectDisputeReason["INVALID_OR_FRAUDULENT_DELIVERABLE"] = 3] = "INVALID_OR_FRAUDULENT_DELIVERABLE";
|
|
78
|
+
DirectDisputeReason[DirectDisputeReason["SAFETY_CRITICAL_VIOLATION"] = 4] = "SAFETY_CRITICAL_VIOLATION";
|
|
79
|
+
})(DirectDisputeReason || (exports.DirectDisputeReason = DirectDisputeReason = {}));
|
|
80
|
+
var ArbitrationVote;
|
|
81
|
+
(function (ArbitrationVote) {
|
|
82
|
+
ArbitrationVote[ArbitrationVote["NONE"] = 0] = "NONE";
|
|
83
|
+
ArbitrationVote[ArbitrationVote["PROVIDER_WINS"] = 1] = "PROVIDER_WINS";
|
|
84
|
+
ArbitrationVote[ArbitrationVote["CLIENT_REFUND"] = 2] = "CLIENT_REFUND";
|
|
85
|
+
ArbitrationVote[ArbitrationVote["SPLIT"] = 3] = "SPLIT";
|
|
86
|
+
ArbitrationVote[ArbitrationVote["HUMAN_REVIEW_REQUIRED"] = 4] = "HUMAN_REVIEW_REQUIRED";
|
|
87
|
+
})(ArbitrationVote || (exports.ArbitrationVote = ArbitrationVote = {}));
|
|
88
|
+
var ReputationSignalType;
|
|
89
|
+
(function (ReputationSignalType) {
|
|
90
|
+
ReputationSignalType[ReputationSignalType["ENDORSE"] = 0] = "ENDORSE";
|
|
91
|
+
ReputationSignalType[ReputationSignalType["WARN"] = 1] = "WARN";
|
|
92
|
+
ReputationSignalType[ReputationSignalType["BLOCK"] = 2] = "BLOCK";
|
|
93
|
+
})(ReputationSignalType || (exports.ReputationSignalType = ReputationSignalType = {}));
|
|
94
|
+
var IdentityTier;
|
|
95
|
+
(function (IdentityTier) {
|
|
96
|
+
IdentityTier[IdentityTier["NONE"] = 0] = "NONE";
|
|
97
|
+
IdentityTier[IdentityTier["SPONSORED"] = 1] = "SPONSORED";
|
|
98
|
+
IdentityTier[IdentityTier["VERIFIED_PROVIDER"] = 2] = "VERIFIED_PROVIDER";
|
|
99
|
+
IdentityTier[IdentityTier["ENTERPRISE_PROVIDER"] = 3] = "ENTERPRISE_PROVIDER";
|
|
100
|
+
})(IdentityTier || (exports.IdentityTier = IdentityTier = {}));
|
|
101
|
+
// ─── DisputeArbitration types ─────────────────────────────────────────────────
|
|
102
|
+
var DisputeMode;
|
|
103
|
+
(function (DisputeMode) {
|
|
104
|
+
DisputeMode[DisputeMode["UNILATERAL"] = 0] = "UNILATERAL";
|
|
105
|
+
DisputeMode[DisputeMode["MUTUAL"] = 1] = "MUTUAL";
|
|
106
|
+
})(DisputeMode || (exports.DisputeMode = DisputeMode = {}));
|
|
107
|
+
var DisputeClass;
|
|
108
|
+
(function (DisputeClass) {
|
|
109
|
+
DisputeClass[DisputeClass["HARD_FAILURE"] = 0] = "HARD_FAILURE";
|
|
110
|
+
DisputeClass[DisputeClass["AMBIGUITY_QUALITY"] = 1] = "AMBIGUITY_QUALITY";
|
|
111
|
+
DisputeClass[DisputeClass["HIGH_SENSITIVITY"] = 2] = "HIGH_SENSITIVITY";
|
|
112
|
+
})(DisputeClass || (exports.DisputeClass = DisputeClass = {}));
|
|
113
|
+
//# sourceMappingURL=types.js.map
|
package/src/types.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"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"}
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
export type Address = string;
|
|
2
|
+
export type Hex = string;
|
|
3
|
+
|
|
4
|
+
export interface CategoryLimit {
|
|
5
|
+
limitPerTx: bigint;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface Policy {
|
|
9
|
+
walletAddress: Address;
|
|
10
|
+
policyHash?: Hex;
|
|
11
|
+
categories: Record<string, CategoryLimit>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface Context {
|
|
15
|
+
contextId: Hex;
|
|
16
|
+
taskType: string;
|
|
17
|
+
openedAt: number;
|
|
18
|
+
isOpen: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface TrustScore {
|
|
22
|
+
score: number;
|
|
23
|
+
level: "probationary" | "restricted" | "standard" | "elevated" | "autonomous";
|
|
24
|
+
nextLevelAt: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface Intent {
|
|
28
|
+
attestationId: Hex;
|
|
29
|
+
action: string;
|
|
30
|
+
reason: string;
|
|
31
|
+
recipient: Address;
|
|
32
|
+
amount: bigint;
|
|
33
|
+
wallet: Address;
|
|
34
|
+
timestamp: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export type SettlementStatus = "PENDING" | "ACCEPTED" | "REJECTED" | "EXECUTED" | "EXPIRED";
|
|
38
|
+
|
|
39
|
+
export interface SettlementProposal {
|
|
40
|
+
proposalId: Hex;
|
|
41
|
+
from: Address;
|
|
42
|
+
to: Address;
|
|
43
|
+
amount: bigint;
|
|
44
|
+
intentId: Hex;
|
|
45
|
+
expiresAt: number;
|
|
46
|
+
status: SettlementStatus;
|
|
47
|
+
rejectionReason?: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface ContractAddresses {
|
|
51
|
+
policyEngine: Address;
|
|
52
|
+
trustRegistry: Address;
|
|
53
|
+
intentAttestation: Address;
|
|
54
|
+
settlementCoordinator: Address;
|
|
55
|
+
walletFactory?: Address;
|
|
56
|
+
agentRegistry?: Address;
|
|
57
|
+
serviceAgreement?: Address;
|
|
58
|
+
reputationOracle?: Address;
|
|
59
|
+
sponsorshipAttestation?: Address;
|
|
60
|
+
capabilityRegistry?: Address;
|
|
61
|
+
governance?: Address;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface NetworkConfig {
|
|
65
|
+
chainId: number;
|
|
66
|
+
rpc: string;
|
|
67
|
+
contracts: ContractAddresses;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export const NETWORKS: Record<string, NetworkConfig> = {
|
|
71
|
+
"base-sepolia": {
|
|
72
|
+
chainId: 84532,
|
|
73
|
+
rpc: "https://sepolia.base.org",
|
|
74
|
+
contracts: {
|
|
75
|
+
policyEngine: "0x6B89621c94a7105c3D8e0BD8Fb06814931CA2CB2",
|
|
76
|
+
trustRegistry: "0xdA1D377991B2E580991B0DD381CdD635dd71aC39",
|
|
77
|
+
intentAttestation: "0xbB5E1809D4a94D08Bf1143131312858143D018f1",
|
|
78
|
+
settlementCoordinator: "0x7ad8db6C5f394542E8e9658F86C85cC99Cf6D460",
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
base: {
|
|
82
|
+
chainId: 8453,
|
|
83
|
+
rpc: "https://mainnet.base.org",
|
|
84
|
+
contracts: {
|
|
85
|
+
policyEngine: "0xAA5Ef3489C929bFB3BFf5D5FE15aa62d3763c847",
|
|
86
|
+
trustRegistry: "0x22366D6dabb03062Bc0a5E893EfDff15D8E329b1", // TrustRegistryV3 — v2
|
|
87
|
+
intentAttestation: "0x7ad8db6C5f394542E8e9658F86C85cC99Cf6D460",
|
|
88
|
+
settlementCoordinator: "0xd52d8Be9728976E0D70C89db9F8ACeb5B5e97cA2", // SettlementCoordinatorV2 ← active
|
|
89
|
+
walletFactory: "0xcB52B5d746eEc05e141039E92e3dBefeAe496051", // WalletFactory v5 ← active (redeployed 2026-03-19, optimized bytecode, passkey P256)
|
|
90
|
+
agentRegistry: "0xD5c2851B00090c92Ba7F4723FB548bb30C9B6865", // AgentRegistry ← discovery directory
|
|
91
|
+
serviceAgreement: "0xC98B402CAB9156da68A87a69E3B4bf167A3CCcF6",
|
|
92
|
+
reputationOracle: "0x359F76a54F9A345546E430e4d6665A7dC9DaECd4",
|
|
93
|
+
sponsorshipAttestation: "0xD6c2edE89Ea71aE19Db2Be848e172b444Ed38f22",
|
|
94
|
+
capabilityRegistry: "0x7becb642668B80502dD957A594E1dD0aC414c1a3",
|
|
95
|
+
governance: "0xE931DD2EEb9Af9353Dd5E2c1250492A0135E0EC4",
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export interface AgentInfo {
|
|
101
|
+
wallet: Address;
|
|
102
|
+
name: string;
|
|
103
|
+
capabilities: string[];
|
|
104
|
+
serviceType: string;
|
|
105
|
+
endpoint: string;
|
|
106
|
+
metadataURI: string;
|
|
107
|
+
active: boolean;
|
|
108
|
+
registeredAt: bigint;
|
|
109
|
+
endpointChangedAt: bigint;
|
|
110
|
+
endpointChangeCount: bigint;
|
|
111
|
+
trustScore?: bigint;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export interface OperationalMetrics {
|
|
115
|
+
heartbeatInterval: bigint;
|
|
116
|
+
heartbeatGracePeriod: bigint;
|
|
117
|
+
lastHeartbeatAt: bigint;
|
|
118
|
+
rollingLatency: bigint;
|
|
119
|
+
heartbeatCount: bigint;
|
|
120
|
+
missedHeartbeatCount: bigint;
|
|
121
|
+
uptimeScore: bigint;
|
|
122
|
+
responseScore: bigint;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export enum AgreementStatus {
|
|
126
|
+
PROPOSED = 0,
|
|
127
|
+
ACCEPTED = 1,
|
|
128
|
+
PENDING_VERIFICATION = 2,
|
|
129
|
+
FULFILLED = 3,
|
|
130
|
+
DISPUTED = 4,
|
|
131
|
+
CANCELLED = 5,
|
|
132
|
+
REVISION_REQUESTED = 6,
|
|
133
|
+
REVISED = 7,
|
|
134
|
+
PARTIAL_SETTLEMENT = 8,
|
|
135
|
+
MUTUAL_CANCEL = 9,
|
|
136
|
+
ESCALATED_TO_HUMAN = 10,
|
|
137
|
+
ESCALATED_TO_ARBITRATION = 11,
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export enum ProviderResponseType {
|
|
141
|
+
NONE = 0,
|
|
142
|
+
REVISE = 1,
|
|
143
|
+
DEFEND = 2,
|
|
144
|
+
COUNTER = 3,
|
|
145
|
+
PARTIAL_SETTLEMENT = 4,
|
|
146
|
+
REQUEST_HUMAN_REVIEW = 5,
|
|
147
|
+
ESCALATE = 6,
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export enum DisputeOutcome {
|
|
151
|
+
NONE = 0,
|
|
152
|
+
PENDING = 1,
|
|
153
|
+
PROVIDER_WINS = 2,
|
|
154
|
+
CLIENT_REFUND = 3,
|
|
155
|
+
PARTIAL_PROVIDER = 4,
|
|
156
|
+
PARTIAL_CLIENT = 5,
|
|
157
|
+
MUTUAL_CANCEL = 6,
|
|
158
|
+
HUMAN_REVIEW_REQUIRED = 7,
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export enum EvidenceType {
|
|
162
|
+
NONE = 0,
|
|
163
|
+
TRANSCRIPT = 1,
|
|
164
|
+
DELIVERABLE = 2,
|
|
165
|
+
ACCEPTANCE_CRITERIA = 3,
|
|
166
|
+
COMMUNICATION = 4,
|
|
167
|
+
EXTERNAL_REFERENCE = 5,
|
|
168
|
+
OTHER = 6,
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export enum DirectDisputeReason {
|
|
172
|
+
NONE = 0,
|
|
173
|
+
NO_DELIVERY = 1,
|
|
174
|
+
HARD_DEADLINE_BREACH = 2,
|
|
175
|
+
INVALID_OR_FRAUDULENT_DELIVERABLE = 3,
|
|
176
|
+
SAFETY_CRITICAL_VIOLATION = 4,
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export interface Agreement {
|
|
180
|
+
id: bigint;
|
|
181
|
+
client: Address;
|
|
182
|
+
provider: Address;
|
|
183
|
+
serviceType: string;
|
|
184
|
+
description: string;
|
|
185
|
+
price: bigint;
|
|
186
|
+
token: Address;
|
|
187
|
+
deadline: bigint;
|
|
188
|
+
deliverablesHash: Hex;
|
|
189
|
+
status: AgreementStatus;
|
|
190
|
+
createdAt: bigint;
|
|
191
|
+
resolvedAt: bigint;
|
|
192
|
+
verifyWindowEnd: bigint;
|
|
193
|
+
committedHash: Hex;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export interface ProposeParams {
|
|
197
|
+
provider: Address;
|
|
198
|
+
serviceType: string;
|
|
199
|
+
description: string;
|
|
200
|
+
price: bigint;
|
|
201
|
+
token: Address;
|
|
202
|
+
deadline: number;
|
|
203
|
+
deliverablesHash: Hex;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export interface RemediationCase {
|
|
207
|
+
cycleCount: number;
|
|
208
|
+
openedAt: bigint;
|
|
209
|
+
deadlineAt: bigint;
|
|
210
|
+
lastActionAt: bigint;
|
|
211
|
+
latestTranscriptHash: Hex;
|
|
212
|
+
active: boolean;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export interface RemediationFeedback {
|
|
216
|
+
cycle: number;
|
|
217
|
+
author: Address;
|
|
218
|
+
feedbackHash: Hex;
|
|
219
|
+
feedbackURI: string;
|
|
220
|
+
previousTranscriptHash: Hex;
|
|
221
|
+
transcriptHash: Hex;
|
|
222
|
+
timestamp: bigint;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export interface RemediationResponse {
|
|
226
|
+
cycle: number;
|
|
227
|
+
author: Address;
|
|
228
|
+
responseType: ProviderResponseType;
|
|
229
|
+
proposedProviderPayout: bigint;
|
|
230
|
+
responseHash: Hex;
|
|
231
|
+
responseURI: string;
|
|
232
|
+
previousTranscriptHash: Hex;
|
|
233
|
+
transcriptHash: Hex;
|
|
234
|
+
timestamp: bigint;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export interface DisputeCase {
|
|
238
|
+
agreementId: bigint;
|
|
239
|
+
openedAt: bigint;
|
|
240
|
+
responseDeadlineAt: bigint;
|
|
241
|
+
outcome: DisputeOutcome;
|
|
242
|
+
providerAward: bigint;
|
|
243
|
+
clientAward: bigint;
|
|
244
|
+
humanReviewRequested: boolean;
|
|
245
|
+
evidenceCount: bigint;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export interface DisputeEvidence {
|
|
249
|
+
submitter: Address;
|
|
250
|
+
evidenceType: EvidenceType;
|
|
251
|
+
evidenceHash: Hex;
|
|
252
|
+
evidenceURI: string;
|
|
253
|
+
timestamp: bigint;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
export enum ArbitrationVote {
|
|
257
|
+
NONE = 0,
|
|
258
|
+
PROVIDER_WINS = 1,
|
|
259
|
+
CLIENT_REFUND = 2,
|
|
260
|
+
SPLIT = 3,
|
|
261
|
+
HUMAN_REVIEW_REQUIRED = 4,
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export interface ArbitrationCase {
|
|
265
|
+
agreementId: bigint;
|
|
266
|
+
arbitrators: Address[];
|
|
267
|
+
arbitratorCount: number;
|
|
268
|
+
providerVotes: number;
|
|
269
|
+
clientVotes: number;
|
|
270
|
+
splitVotes: number;
|
|
271
|
+
humanVotes: number;
|
|
272
|
+
selectionDeadlineAt: bigint;
|
|
273
|
+
decisionDeadlineAt: bigint;
|
|
274
|
+
splitProviderAward: bigint;
|
|
275
|
+
splitClientAward: bigint;
|
|
276
|
+
finalized: boolean;
|
|
277
|
+
humanBackstopUsed: boolean;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export enum ReputationSignalType {
|
|
281
|
+
ENDORSE = 0,
|
|
282
|
+
WARN = 1,
|
|
283
|
+
BLOCK = 2,
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
export interface ReputationSignal {
|
|
287
|
+
publisher: Address;
|
|
288
|
+
subject: Address;
|
|
289
|
+
signalType: ReputationSignalType;
|
|
290
|
+
capabilityHash: Hex;
|
|
291
|
+
reason: string;
|
|
292
|
+
publisherTrustAtTime: bigint;
|
|
293
|
+
timestamp: bigint;
|
|
294
|
+
autoPublished: boolean;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
export interface ReputationSummary {
|
|
298
|
+
endorsements: bigint;
|
|
299
|
+
warnings: bigint;
|
|
300
|
+
blocks: bigint;
|
|
301
|
+
weightedScore: bigint;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
export enum IdentityTier {
|
|
305
|
+
NONE = 0,
|
|
306
|
+
SPONSORED = 1,
|
|
307
|
+
VERIFIED_PROVIDER = 2,
|
|
308
|
+
ENTERPRISE_PROVIDER = 3,
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
export interface SponsorshipAttestationRecord {
|
|
312
|
+
sponsor: Address;
|
|
313
|
+
agent: Address;
|
|
314
|
+
issuedAt: bigint;
|
|
315
|
+
expiresAt: bigint;
|
|
316
|
+
revoked: boolean;
|
|
317
|
+
tier: IdentityTier;
|
|
318
|
+
evidenceURI: string;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
export interface CapabilityRoot {
|
|
322
|
+
root: string;
|
|
323
|
+
rootId: Hex;
|
|
324
|
+
active: boolean;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
export interface GovernanceTransaction {
|
|
328
|
+
target: Address;
|
|
329
|
+
value: bigint;
|
|
330
|
+
data: Hex;
|
|
331
|
+
executed: boolean;
|
|
332
|
+
confirmationCount: bigint;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
export interface NegotiationMessageBase {
|
|
336
|
+
from: Address;
|
|
337
|
+
to: Address;
|
|
338
|
+
timestamp: number; // Unix seconds — receiver rejects if |now - timestamp| > 60
|
|
339
|
+
sig: Hex; // ECDSA signature over message digest (see signNegotiationMessage)
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
export interface NegotiationProposal extends NegotiationMessageBase {
|
|
343
|
+
type: "PROPOSE";
|
|
344
|
+
serviceType: string;
|
|
345
|
+
price: string;
|
|
346
|
+
token: Address;
|
|
347
|
+
deadline: string;
|
|
348
|
+
spec: string;
|
|
349
|
+
specHash: Hex;
|
|
350
|
+
nonce: Hex;
|
|
351
|
+
expiresAt: number; // Unix seconds, required, max timestamp + 86400
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
export interface NegotiationCounter extends NegotiationMessageBase {
|
|
355
|
+
type: "COUNTER";
|
|
356
|
+
price?: string;
|
|
357
|
+
deadline?: string;
|
|
358
|
+
justification: string;
|
|
359
|
+
refNonce: Hex;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export interface NegotiationAccept extends NegotiationMessageBase {
|
|
363
|
+
type: "ACCEPT";
|
|
364
|
+
agreedPrice: string;
|
|
365
|
+
agreedDeadline: string;
|
|
366
|
+
refNonce: Hex;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
export interface NegotiationReject extends NegotiationMessageBase {
|
|
370
|
+
type: "REJECT";
|
|
371
|
+
reason: string;
|
|
372
|
+
refNonce?: Hex;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
export type NegotiationMessage =
|
|
376
|
+
| NegotiationProposal
|
|
377
|
+
| NegotiationCounter
|
|
378
|
+
| NegotiationAccept
|
|
379
|
+
| NegotiationReject;
|
|
380
|
+
|
|
381
|
+
export interface NegotiationSession {
|
|
382
|
+
sessionId: Hex; // keccak256(initiator + responder + timestamp + nonce)
|
|
383
|
+
initiator: Address;
|
|
384
|
+
responder: Address;
|
|
385
|
+
createdAt: number; // Unix seconds
|
|
386
|
+
messages: NegotiationMessage[];
|
|
387
|
+
state: "OPEN" | "ACCEPTED" | "REJECTED" | "EXPIRED";
|
|
388
|
+
transcriptHash?: Hex; // set after session closes
|
|
389
|
+
agreedPrice?: string;
|
|
390
|
+
agreedDeadline?: string;
|
|
391
|
+
onChainAgreementId?: string; // set after propose() is called
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
export interface SignedNegotiationMessage<T extends NegotiationMessage = NegotiationMessage> {
|
|
395
|
+
message: T;
|
|
396
|
+
recoveredSigner: Address;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
export type NegotiationVerificationError =
|
|
400
|
+
| "INVALID_SIGNATURE"
|
|
401
|
+
| "SIGNER_NOT_REGISTERED"
|
|
402
|
+
| "TIMESTAMP_TOO_OLD"
|
|
403
|
+
| "TIMESTAMP_IN_FUTURE"
|
|
404
|
+
| "NONCE_REPLAYED"
|
|
405
|
+
| "MESSAGE_EXPIRED"
|
|
406
|
+
| "MESSAGE_TOO_LARGE"
|
|
407
|
+
| "SCHEMA_INVALID";
|
|
408
|
+
|
|
409
|
+
export interface NegotiationVerificationResult {
|
|
410
|
+
valid: boolean;
|
|
411
|
+
error?: NegotiationVerificationError;
|
|
412
|
+
recoveredSigner?: Address;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
// ─── DisputeArbitration types ─────────────────────────────────────────────────
|
|
417
|
+
|
|
418
|
+
export enum DisputeMode {
|
|
419
|
+
UNILATERAL = 0,
|
|
420
|
+
MUTUAL = 1,
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
export enum DisputeClass {
|
|
424
|
+
HARD_FAILURE = 0,
|
|
425
|
+
AMBIGUITY_QUALITY = 1,
|
|
426
|
+
HIGH_SENSITIVITY = 2,
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
export interface DisputeFeeState {
|
|
430
|
+
mode: DisputeMode;
|
|
431
|
+
disputeClass: DisputeClass;
|
|
432
|
+
opener: string;
|
|
433
|
+
client: string;
|
|
434
|
+
provider: string;
|
|
435
|
+
token: string;
|
|
436
|
+
agreementPrice: bigint;
|
|
437
|
+
feeRequired: bigint;
|
|
438
|
+
openerPaid: bigint;
|
|
439
|
+
respondentPaid: bigint;
|
|
440
|
+
openedAt: bigint;
|
|
441
|
+
active: boolean;
|
|
442
|
+
resolved: boolean;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
export interface ArbitratorBondState {
|
|
446
|
+
bondAmount: bigint;
|
|
447
|
+
lockedAt: bigint;
|
|
448
|
+
locked: boolean;
|
|
449
|
+
slashed: boolean;
|
|
450
|
+
returned: boolean;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
export type ChannelStatus = 'OPEN' | 'CLOSING' | 'CHALLENGED' | 'SETTLED';
|
|
454
|
+
|
|
455
|
+
export interface ChannelState {
|
|
456
|
+
channelId: string
|
|
457
|
+
sequenceNumber: number
|
|
458
|
+
callCount: number
|
|
459
|
+
cumulativePayment: bigint
|
|
460
|
+
token: string
|
|
461
|
+
timestamp: number
|
|
462
|
+
clientSig?: string
|
|
463
|
+
providerSig?: string
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
export interface Channel {
|
|
467
|
+
client: string
|
|
468
|
+
provider: string
|
|
469
|
+
token: string
|
|
470
|
+
depositAmount: bigint
|
|
471
|
+
settledAmount: bigint
|
|
472
|
+
lastSequenceNumber: number
|
|
473
|
+
deadline: number
|
|
474
|
+
challengeExpiry: number
|
|
475
|
+
status: ChannelStatus
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
export interface OpenChannelParams {
|
|
479
|
+
provider: string
|
|
480
|
+
token: string
|
|
481
|
+
maxAmount: bigint
|
|
482
|
+
ratePerCall: bigint
|
|
483
|
+
deadline: number
|
|
484
|
+
}
|
package/src/wallet.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { ContractRunner, ethers } from "ethers";
|
|
2
|
+
import { ARC402_WALLET_ABI, INTENT_ATTESTATION_ABI, WALLET_FACTORY_ABI } from "./contracts";
|
|
3
|
+
import { Context, ContractAddresses, Intent, NETWORKS, TrustScore } from "./types";
|
|
4
|
+
import { PolicyClient } from "./policy";
|
|
5
|
+
import { TrustClient } from "./trust";
|
|
6
|
+
import { IntentAttestationClient } from "./intent";
|
|
7
|
+
|
|
8
|
+
function resolveContracts(network: string): ContractAddresses {
|
|
9
|
+
const config = NETWORKS[network];
|
|
10
|
+
if (!config) throw new Error(`Unknown network: ${network}`);
|
|
11
|
+
return config.contracts;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export class ARC402WalletClient {
|
|
15
|
+
private walletContract: ethers.Contract;
|
|
16
|
+
private intentContract: ethers.Contract;
|
|
17
|
+
public policy: PolicyClient;
|
|
18
|
+
public trust: TrustClient;
|
|
19
|
+
public intent: IntentAttestationClient;
|
|
20
|
+
|
|
21
|
+
constructor(public walletAddress: string, private signer: ContractRunner, network = "base-sepolia") {
|
|
22
|
+
const contracts = resolveContracts(network);
|
|
23
|
+
this.walletContract = new ethers.Contract(walletAddress, ARC402_WALLET_ABI, signer);
|
|
24
|
+
this.intentContract = new ethers.Contract(contracts.intentAttestation, INTENT_ATTESTATION_ABI, signer);
|
|
25
|
+
this.policy = new PolicyClient(contracts.policyEngine, signer);
|
|
26
|
+
this.trust = new TrustClient(contracts.trustRegistry, signer);
|
|
27
|
+
this.intent = new IntentAttestationClient(contracts.intentAttestation, signer, walletAddress);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
static async deploy(signer: ContractRunner, network = "base-sepolia") {
|
|
31
|
+
const contracts = resolveContracts(network);
|
|
32
|
+
if (!contracts.walletFactory) throw new Error(`WalletFactory not deployed on ${network}`);
|
|
33
|
+
const factory = new ethers.Contract(contracts.walletFactory, WALLET_FACTORY_ABI, signer);
|
|
34
|
+
const tx = await factory.createWallet();
|
|
35
|
+
const receipt = await tx.wait();
|
|
36
|
+
const iface = new ethers.Interface(WALLET_FACTORY_ABI);
|
|
37
|
+
for (const log of receipt.logs) {
|
|
38
|
+
try {
|
|
39
|
+
const parsed = iface.parseLog(log);
|
|
40
|
+
if (parsed?.name === "WalletCreated") return new ARC402WalletClient(parsed.args.walletAddress, signer, network);
|
|
41
|
+
} catch {}
|
|
42
|
+
}
|
|
43
|
+
throw new Error("Could not parse wallet address from WalletCreated event");
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
setPolicy(categories: Record<string, bigint>) { return this.policy.set(this.walletAddress, categories); }
|
|
47
|
+
getPolicy() { return this.policy.get(this.walletAddress); }
|
|
48
|
+
|
|
49
|
+
async openContext(taskType: string): Promise<{ contextId: string; close: () => Promise<void> }> {
|
|
50
|
+
const contextId = ethers.keccak256(ethers.toUtf8Bytes(`${taskType}:${Date.now()}:${this.walletAddress}`));
|
|
51
|
+
const tx = await this.walletContract.openContext(contextId, taskType);
|
|
52
|
+
await tx.wait();
|
|
53
|
+
return { contextId, close: () => this.closeContext() };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async closeContext() { const tx = await this.walletContract.closeContext(); return tx.wait(); }
|
|
57
|
+
|
|
58
|
+
async getActiveContext(): Promise<Context | null> {
|
|
59
|
+
const [contextId, taskType, openedAt, isOpen] = await this.walletContract.getActiveContext();
|
|
60
|
+
if (!isOpen) return null;
|
|
61
|
+
return { contextId, taskType, openedAt: Number(openedAt), isOpen };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async spend(recipient: string, amount: bigint, category: string, action: string, reason: string): Promise<string> {
|
|
65
|
+
const attestationId = await this.intent.create(action, reason, recipient, amount);
|
|
66
|
+
const tx = await this.walletContract.executeSpend(recipient, amount, category, attestationId);
|
|
67
|
+
await tx.wait();
|
|
68
|
+
return attestationId;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
getTrustScore(): Promise<TrustScore> { return this.trust.getScore(this.walletAddress); }
|
|
72
|
+
|
|
73
|
+
async getAttestations(limit = 50): Promise<Intent[]> {
|
|
74
|
+
const provider = (this.signer as ethers.Signer).provider;
|
|
75
|
+
if (!provider) return [];
|
|
76
|
+
const iface = new ethers.Interface(INTENT_ATTESTATION_ABI);
|
|
77
|
+
const event = iface.getEvent("AttestationCreated");
|
|
78
|
+
const logs = await provider.getLogs({ address: this.intentContract.target as string, topics: [event.topicHash, null, ethers.zeroPadValue(this.walletAddress, 32)], fromBlock: 0 });
|
|
79
|
+
return logs.slice(-limit).reverse().map((log) => {
|
|
80
|
+
const parsed = iface.parseLog(log);
|
|
81
|
+
return { attestationId: parsed.args.id, wallet: parsed.args.wallet, action: parsed.args.action, reason: parsed.args.reason, recipient: parsed.args.recipient, amount: BigInt(parsed.args.amount), timestamp: Number(parsed.args.timestamp) };
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export class ARC402Wallet extends ARC402WalletClient {}
|
|
86
|
+
export type ContextBinding = Awaited<ReturnType<ARC402WalletClient["openContext"]>>;
|