@sequence0/sdk 1.1.2 → 2.0.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 (126) hide show
  1. package/README.md +1 -1
  2. package/dist/chains/algorand.d.ts +44 -0
  3. package/dist/chains/algorand.d.ts.map +1 -0
  4. package/dist/chains/algorand.js +148 -0
  5. package/dist/chains/algorand.js.map +1 -0
  6. package/dist/chains/aptos.d.ts +39 -0
  7. package/dist/chains/aptos.d.ts.map +1 -0
  8. package/dist/chains/aptos.js +168 -0
  9. package/dist/chains/aptos.js.map +1 -0
  10. package/dist/chains/cardano.d.ts +42 -0
  11. package/dist/chains/cardano.d.ts.map +1 -0
  12. package/dist/chains/cardano.js +188 -0
  13. package/dist/chains/cardano.js.map +1 -0
  14. package/dist/chains/cosmos.d.ts +42 -0
  15. package/dist/chains/cosmos.d.ts.map +1 -0
  16. package/dist/chains/cosmos.js +216 -0
  17. package/dist/chains/cosmos.js.map +1 -0
  18. package/dist/chains/dogecoin-litecoin.d.ts +57 -0
  19. package/dist/chains/dogecoin-litecoin.d.ts.map +1 -0
  20. package/dist/chains/dogecoin-litecoin.js +521 -0
  21. package/dist/chains/dogecoin-litecoin.js.map +1 -0
  22. package/dist/chains/ethereum.d.ts.map +1 -1
  23. package/dist/chains/ethereum.js +16 -0
  24. package/dist/chains/ethereum.js.map +1 -1
  25. package/dist/chains/hedera.d.ts +113 -0
  26. package/dist/chains/hedera.d.ts.map +1 -0
  27. package/dist/chains/hedera.js +302 -0
  28. package/dist/chains/hedera.js.map +1 -0
  29. package/dist/chains/icp.d.ts +95 -0
  30. package/dist/chains/icp.d.ts.map +1 -0
  31. package/dist/chains/icp.js +520 -0
  32. package/dist/chains/icp.js.map +1 -0
  33. package/dist/chains/kaspa.d.ts +152 -0
  34. package/dist/chains/kaspa.d.ts.map +1 -0
  35. package/dist/chains/kaspa.js +790 -0
  36. package/dist/chains/kaspa.js.map +1 -0
  37. package/dist/chains/multiversx.d.ts +143 -0
  38. package/dist/chains/multiversx.d.ts.map +1 -0
  39. package/dist/chains/multiversx.js +524 -0
  40. package/dist/chains/multiversx.js.map +1 -0
  41. package/dist/chains/near.d.ts +40 -0
  42. package/dist/chains/near.d.ts.map +1 -0
  43. package/dist/chains/near.js +170 -0
  44. package/dist/chains/near.js.map +1 -0
  45. package/dist/chains/polkadot.d.ts +43 -0
  46. package/dist/chains/polkadot.d.ts.map +1 -0
  47. package/dist/chains/polkadot.js +179 -0
  48. package/dist/chains/polkadot.js.map +1 -0
  49. package/dist/chains/ripple.d.ts +41 -0
  50. package/dist/chains/ripple.d.ts.map +1 -0
  51. package/dist/chains/ripple.js +190 -0
  52. package/dist/chains/ripple.js.map +1 -0
  53. package/dist/chains/stellar.d.ts +40 -0
  54. package/dist/chains/stellar.d.ts.map +1 -0
  55. package/dist/chains/stellar.js +156 -0
  56. package/dist/chains/stellar.js.map +1 -0
  57. package/dist/chains/sui.d.ts +44 -0
  58. package/dist/chains/sui.d.ts.map +1 -0
  59. package/dist/chains/sui.js +157 -0
  60. package/dist/chains/sui.js.map +1 -0
  61. package/dist/chains/tezos.d.ts +43 -0
  62. package/dist/chains/tezos.d.ts.map +1 -0
  63. package/dist/chains/tezos.js +162 -0
  64. package/dist/chains/tezos.js.map +1 -0
  65. package/dist/chains/ton.d.ts +40 -0
  66. package/dist/chains/ton.d.ts.map +1 -0
  67. package/dist/chains/ton.js +168 -0
  68. package/dist/chains/ton.js.map +1 -0
  69. package/dist/chains/tron.d.ts +41 -0
  70. package/dist/chains/tron.d.ts.map +1 -0
  71. package/dist/chains/tron.js +124 -0
  72. package/dist/chains/tron.js.map +1 -0
  73. package/dist/core/atomic.d.ts +76 -0
  74. package/dist/core/atomic.d.ts.map +1 -0
  75. package/dist/core/atomic.js +39 -0
  76. package/dist/core/atomic.js.map +1 -0
  77. package/dist/core/client.d.ts +238 -0
  78. package/dist/core/client.d.ts.map +1 -1
  79. package/dist/core/client.js +536 -4
  80. package/dist/core/client.js.map +1 -1
  81. package/dist/core/delegation.d.ts +184 -0
  82. package/dist/core/delegation.d.ts.map +1 -0
  83. package/dist/core/delegation.js +37 -0
  84. package/dist/core/delegation.js.map +1 -0
  85. package/dist/core/programmable.d.ts +66 -0
  86. package/dist/core/programmable.d.ts.map +1 -0
  87. package/dist/core/programmable.js +36 -0
  88. package/dist/core/programmable.js.map +1 -0
  89. package/dist/core/solvency.d.ts +223 -0
  90. package/dist/core/solvency.d.ts.map +1 -0
  91. package/dist/core/solvency.js +267 -0
  92. package/dist/core/solvency.js.map +1 -0
  93. package/dist/core/types.d.ts +172 -1
  94. package/dist/core/types.d.ts.map +1 -1
  95. package/dist/core/universal-account.d.ts +438 -0
  96. package/dist/core/universal-account.d.ts.map +1 -0
  97. package/dist/core/universal-account.js +597 -0
  98. package/dist/core/universal-account.js.map +1 -0
  99. package/dist/core/witness.d.ts +197 -0
  100. package/dist/core/witness.d.ts.map +1 -0
  101. package/dist/core/witness.js +298 -0
  102. package/dist/core/witness.js.map +1 -0
  103. package/dist/erc4337/types.js +2 -2
  104. package/dist/index.d.ts +30 -2
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +91 -4
  107. package/dist/index.js.map +1 -1
  108. package/dist/settlement/settlement.d.ts +152 -0
  109. package/dist/settlement/settlement.d.ts.map +1 -0
  110. package/dist/settlement/settlement.js +172 -0
  111. package/dist/settlement/settlement.js.map +1 -0
  112. package/dist/utils/eip712.js +2 -2
  113. package/dist/utils/fee.d.ts +2 -2
  114. package/dist/utils/fee.js +2 -2
  115. package/dist/utils/optional-deps.d.ts +9 -0
  116. package/dist/utils/optional-deps.d.ts.map +1 -0
  117. package/dist/utils/optional-deps.js +21 -0
  118. package/dist/utils/optional-deps.js.map +1 -0
  119. package/dist/utils/validation.d.ts.map +1 -1
  120. package/dist/utils/validation.js +6 -1
  121. package/dist/utils/validation.js.map +1 -1
  122. package/dist/wallet/wallet.d.ts +52 -0
  123. package/dist/wallet/wallet.d.ts.map +1 -1
  124. package/dist/wallet/wallet.js +265 -33
  125. package/dist/wallet/wallet.js.map +1 -1
  126. package/package.json +35 -1
@@ -0,0 +1,223 @@
1
+ /**
2
+ * K5: Verifiable Solvency Protocol
3
+ *
4
+ * Continuous, cryptographic proof-of-reserves across 81 chains.
5
+ * Exchanges prove solvency in real-time via threshold attestations
6
+ * and ZK range proofs. WASM policies prevent transactions that
7
+ * would cause insolvency.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { SolvencyClient } from '@sequence0/sdk';
12
+ *
13
+ * const solvency = new SolvencyClient({ baseUrl: 'http://agent:8080' });
14
+ * const exchange = await solvency.registerExchange({
15
+ * name: 'MyExchange',
16
+ * chains: ['ethereum', 'bitcoin', 'solana'],
17
+ * });
18
+ *
19
+ * const attestation = await solvency.requestAttestation({
20
+ * exchangeId: exchange.exchangeId,
21
+ * addresses: {
22
+ * ethereum: ['0x...hot', '0x...cold'],
23
+ * bitcoin: ['bc1q...'],
24
+ * solana: ['DYw8j...'],
25
+ * },
26
+ * liabilitiesRoot: '0x...',
27
+ * });
28
+ * ```
29
+ */
30
+ /**
31
+ * Options for registering an exchange with the Verifiable Solvency Protocol.
32
+ */
33
+ export interface RegisterExchangeOptions {
34
+ /** Human-readable exchange name */
35
+ name: string;
36
+ /** Chains the exchange operates on (e.g., ['ethereum', 'bitcoin', 'solana']) */
37
+ chains: string[];
38
+ }
39
+ /**
40
+ * Information about a registered exchange.
41
+ */
42
+ export interface ExchangeInfo {
43
+ /** Unique exchange identifier */
44
+ exchangeId: string;
45
+ /** Human-readable exchange name */
46
+ name: string;
47
+ /** On-chain owner address of the exchange registration */
48
+ ownerAddress: string;
49
+ /** Chains the exchange has registered for solvency proofs */
50
+ chains: string[];
51
+ /** ISO 8601 timestamp of registration */
52
+ registeredAt: string;
53
+ /** Whether the exchange is currently active */
54
+ isActive: boolean;
55
+ /** Total number of attestations completed */
56
+ totalAttestations: number;
57
+ /** ISO 8601 timestamp of the most recent attestation (undefined if none) */
58
+ lastAttestationAt?: string;
59
+ }
60
+ /**
61
+ * Request for a solvency attestation across multiple chains.
62
+ * The exchange provides its addresses on each chain and a
63
+ * Merkle root of its liabilities for ZK verification.
64
+ */
65
+ export interface AttestationRequest {
66
+ /** Exchange ID to attest solvency for */
67
+ exchangeId: string;
68
+ /** Map of chain name to list of addresses (hot + cold wallets) */
69
+ addresses: Record<string, string[]>;
70
+ /** Hex-encoded Merkle root of the exchange's liabilities tree */
71
+ liabilitiesRoot: string;
72
+ }
73
+ /**
74
+ * Cryptographic proof of a balance on a single chain/address.
75
+ * Verified by threshold agents reading on-chain state.
76
+ */
77
+ export interface BalanceProof {
78
+ /** Chain the balance was verified on */
79
+ chain: string;
80
+ /** Address whose balance was verified */
81
+ address: string;
82
+ /** Verified balance in the chain's smallest denomination */
83
+ balance: string;
84
+ /** Block number at which the balance was read */
85
+ blockNumber: number;
86
+ /** Whether the balance proof was verified by threshold agents */
87
+ verified: boolean;
88
+ }
89
+ /**
90
+ * A completed solvency attestation — the cryptographic proof that
91
+ * an exchange's total assets exceed its total liabilities across
92
+ * all registered chains.
93
+ */
94
+ export interface SolvencyAttestation {
95
+ /** Unique attestation identifier */
96
+ attestationId: string;
97
+ /** Exchange this attestation is for */
98
+ exchangeId: string;
99
+ /** Hex-encoded hash of the aggregated asset proofs */
100
+ assetsHash: string;
101
+ /** Hex-encoded hash of the liabilities Merkle root */
102
+ liabilitiesHash: string;
103
+ /** Whether assets >= liabilities (the solvency verdict) */
104
+ isSolvent: boolean;
105
+ /** Unix timestamp of the attestation */
106
+ timestamp: number;
107
+ /** Block number on the Sequence0 chain where the attestation was anchored */
108
+ blockNumber: number;
109
+ /** Number of chains included in the attestation */
110
+ totalChains: number;
111
+ /** Hex-encoded threshold signature from the agent committee */
112
+ signature: string;
113
+ }
114
+ /**
115
+ * Status of an in-progress solvency attestation.
116
+ *
117
+ * - `pending` — request received, agents are being coordinated
118
+ * - `verifying` — agents are reading on-chain balances and computing proofs
119
+ * - `complete` — attestation is finalized with a threshold signature
120
+ * - `failed` — attestation could not be completed (e.g., insufficient agents)
121
+ */
122
+ export type AttestationStatus = 'pending' | 'verifying' | 'complete' | 'failed';
123
+ /**
124
+ * Response for polling the status of an attestation request.
125
+ */
126
+ export interface AttestationStatusResponse {
127
+ /** The attestation request ID */
128
+ attestationId: string;
129
+ /** Current status of the attestation process */
130
+ status: AttestationStatus;
131
+ /** Number of chains verified so far (only during 'verifying' status) */
132
+ chainsVerified?: number;
133
+ /** Total number of chains to verify (only during 'verifying' status) */
134
+ chainsTotal?: number;
135
+ /** The completed attestation (only when status is 'complete') */
136
+ attestation?: SolvencyAttestation;
137
+ }
138
+ /**
139
+ * Client for the K5 Verifiable Solvency Protocol.
140
+ *
141
+ * Communicates with solvency endpoints on the agent node to register
142
+ * exchanges, request attestations, and query attestation history.
143
+ */
144
+ export declare class SolvencyClient {
145
+ private baseUrl;
146
+ /**
147
+ * Create a new SolvencyClient.
148
+ *
149
+ * @param options - Client configuration
150
+ * @param options.baseUrl - Agent node REST API URL (e.g., 'http://agent:8080')
151
+ */
152
+ constructor(options: {
153
+ baseUrl: string;
154
+ });
155
+ /**
156
+ * Register a new exchange with the Verifiable Solvency Protocol.
157
+ *
158
+ * @param options - Exchange registration details
159
+ * @returns The registered exchange information
160
+ *
161
+ * @throws {Sequence0Error} If the registration parameters are invalid
162
+ * @throws {NetworkError} If the agent is unreachable
163
+ */
164
+ registerExchange(options: RegisterExchangeOptions): Promise<ExchangeInfo>;
165
+ /**
166
+ * Request a solvency attestation for an exchange.
167
+ *
168
+ * Agents will read on-chain balances for all provided addresses,
169
+ * verify the liabilities root, and produce a threshold-signed
170
+ * attestation if the exchange is solvent.
171
+ *
172
+ * @param request - Attestation request details
173
+ * @returns The attestation request ID for polling status
174
+ *
175
+ * @throws {Sequence0Error} If the request parameters are invalid
176
+ * @throws {NetworkError} If the agent is unreachable
177
+ */
178
+ requestAttestation(request: AttestationRequest): Promise<{
179
+ attestationId: string;
180
+ }>;
181
+ /**
182
+ * Get the current status of an attestation request.
183
+ *
184
+ * @param attestationId - The attestation request ID
185
+ * @returns Current status and, if complete, the attestation
186
+ *
187
+ * @throws {Sequence0Error} If the attestation ID is invalid
188
+ * @throws {NetworkError} If the agent is unreachable
189
+ */
190
+ getAttestationStatus(attestationId: string): Promise<AttestationStatusResponse>;
191
+ /**
192
+ * Get the latest completed solvency attestation for an exchange.
193
+ *
194
+ * @param exchangeId - The exchange ID
195
+ * @returns The latest attestation, or null if no attestations exist
196
+ *
197
+ * @throws {NetworkError} If the agent is unreachable
198
+ */
199
+ getLatestAttestation(exchangeId: string): Promise<SolvencyAttestation | null>;
200
+ /**
201
+ * Get attestation history for an exchange.
202
+ *
203
+ * @param exchangeId - The exchange ID
204
+ * @param limit - Max number of attestations to return (default: 20)
205
+ * @returns Array of attestations, most recent first
206
+ *
207
+ * @throws {NetworkError} If the agent is unreachable
208
+ */
209
+ getAttestationHistory(exchangeId: string, limit?: number): Promise<SolvencyAttestation[]>;
210
+ /**
211
+ * List all registered exchanges.
212
+ *
213
+ * @returns Array of exchange info objects
214
+ *
215
+ * @throws {NetworkError} If the agent is unreachable
216
+ */
217
+ listExchanges(): Promise<ExchangeInfo[]>;
218
+ private get;
219
+ private post;
220
+ private mapExchangeResponse;
221
+ private mapAttestationResponse;
222
+ }
223
+ //# sourceMappingURL=solvency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solvency.d.ts","sourceRoot":"","sources":["../../src/core/solvency.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+ /**
3
+ * K5: Verifiable Solvency Protocol
4
+ *
5
+ * Continuous, cryptographic proof-of-reserves across 81 chains.
6
+ * Exchanges prove solvency in real-time via threshold attestations
7
+ * and ZK range proofs. WASM policies prevent transactions that
8
+ * would cause insolvency.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { SolvencyClient } from '@sequence0/sdk';
13
+ *
14
+ * const solvency = new SolvencyClient({ baseUrl: 'http://agent:8080' });
15
+ * const exchange = await solvency.registerExchange({
16
+ * name: 'MyExchange',
17
+ * chains: ['ethereum', 'bitcoin', 'solana'],
18
+ * });
19
+ *
20
+ * const attestation = await solvency.requestAttestation({
21
+ * exchangeId: exchange.exchangeId,
22
+ * addresses: {
23
+ * ethereum: ['0x...hot', '0x...cold'],
24
+ * bitcoin: ['bc1q...'],
25
+ * solana: ['DYw8j...'],
26
+ * },
27
+ * liabilitiesRoot: '0x...',
28
+ * });
29
+ * ```
30
+ */
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ exports.SolvencyClient = void 0;
33
+ const errors_1 = require("../utils/errors");
34
+ // ── Solvency Client ──
35
+ /**
36
+ * Client for the K5 Verifiable Solvency Protocol.
37
+ *
38
+ * Communicates with solvency endpoints on the agent node to register
39
+ * exchanges, request attestations, and query attestation history.
40
+ */
41
+ class SolvencyClient {
42
+ /**
43
+ * Create a new SolvencyClient.
44
+ *
45
+ * @param options - Client configuration
46
+ * @param options.baseUrl - Agent node REST API URL (e.g., 'http://agent:8080')
47
+ */
48
+ constructor(options) {
49
+ this.baseUrl = options.baseUrl.replace(/\/+$/, '');
50
+ }
51
+ /**
52
+ * Register a new exchange with the Verifiable Solvency Protocol.
53
+ *
54
+ * @param options - Exchange registration details
55
+ * @returns The registered exchange information
56
+ *
57
+ * @throws {Sequence0Error} If the registration parameters are invalid
58
+ * @throws {NetworkError} If the agent is unreachable
59
+ */
60
+ async registerExchange(options) {
61
+ if (!options.name || typeof options.name !== 'string') {
62
+ throw new errors_1.Sequence0Error('name must be a non-empty string');
63
+ }
64
+ if (!Array.isArray(options.chains) || options.chains.length === 0) {
65
+ throw new errors_1.Sequence0Error('chains must be a non-empty array of chain names');
66
+ }
67
+ const response = await this.post('/solvency/register', {
68
+ name: options.name,
69
+ chains: options.chains,
70
+ });
71
+ return this.mapExchangeResponse(response);
72
+ }
73
+ /**
74
+ * Request a solvency attestation for an exchange.
75
+ *
76
+ * Agents will read on-chain balances for all provided addresses,
77
+ * verify the liabilities root, and produce a threshold-signed
78
+ * attestation if the exchange is solvent.
79
+ *
80
+ * @param request - Attestation request details
81
+ * @returns The attestation request ID for polling status
82
+ *
83
+ * @throws {Sequence0Error} If the request parameters are invalid
84
+ * @throws {NetworkError} If the agent is unreachable
85
+ */
86
+ async requestAttestation(request) {
87
+ if (!request.exchangeId || typeof request.exchangeId !== 'string') {
88
+ throw new errors_1.Sequence0Error('exchangeId must be a non-empty string');
89
+ }
90
+ if (!request.addresses || typeof request.addresses !== 'object') {
91
+ throw new errors_1.Sequence0Error('addresses must be a non-empty object mapping chains to address arrays');
92
+ }
93
+ if (!request.liabilitiesRoot || typeof request.liabilitiesRoot !== 'string') {
94
+ throw new errors_1.Sequence0Error('liabilitiesRoot must be a non-empty hex string');
95
+ }
96
+ const response = await this.post('/solvency/attest', {
97
+ exchange_id: request.exchangeId,
98
+ addresses: request.addresses,
99
+ liabilities_root: request.liabilitiesRoot,
100
+ });
101
+ if (!response || typeof response.attestation_id !== 'string') {
102
+ throw new errors_1.Sequence0Error('Invalid response from /solvency/attest: missing attestation_id');
103
+ }
104
+ return { attestationId: response.attestation_id };
105
+ }
106
+ /**
107
+ * Get the current status of an attestation request.
108
+ *
109
+ * @param attestationId - The attestation request ID
110
+ * @returns Current status and, if complete, the attestation
111
+ *
112
+ * @throws {Sequence0Error} If the attestation ID is invalid
113
+ * @throws {NetworkError} If the agent is unreachable
114
+ */
115
+ async getAttestationStatus(attestationId) {
116
+ if (!attestationId || typeof attestationId !== 'string') {
117
+ throw new errors_1.Sequence0Error('attestationId must be a non-empty string');
118
+ }
119
+ const response = await this.get(`/solvency/attestation/${attestationId}/status`);
120
+ const validStatuses = ['pending', 'verifying', 'complete', 'failed'];
121
+ const status = validStatuses.includes(response.status)
122
+ ? response.status
123
+ : 'pending';
124
+ return {
125
+ attestationId: response.attestation_id,
126
+ status,
127
+ chainsVerified: response.chains_verified,
128
+ chainsTotal: response.chains_total,
129
+ attestation: response.attestation
130
+ ? this.mapAttestationResponse(response.attestation)
131
+ : undefined,
132
+ };
133
+ }
134
+ /**
135
+ * Get the latest completed solvency attestation for an exchange.
136
+ *
137
+ * @param exchangeId - The exchange ID
138
+ * @returns The latest attestation, or null if no attestations exist
139
+ *
140
+ * @throws {NetworkError} If the agent is unreachable
141
+ */
142
+ async getLatestAttestation(exchangeId) {
143
+ if (!exchangeId || typeof exchangeId !== 'string') {
144
+ throw new errors_1.Sequence0Error('exchangeId must be a non-empty string');
145
+ }
146
+ try {
147
+ const response = await this.get(`/solvency/exchange/${exchangeId}/latest`);
148
+ if (!response || !response.attestation_id) {
149
+ return null;
150
+ }
151
+ return this.mapAttestationResponse(response);
152
+ }
153
+ catch (err) {
154
+ // 404 means no attestations exist yet
155
+ if (err instanceof errors_1.NetworkError && err.statusCode === 404) {
156
+ return null;
157
+ }
158
+ throw err;
159
+ }
160
+ }
161
+ /**
162
+ * Get attestation history for an exchange.
163
+ *
164
+ * @param exchangeId - The exchange ID
165
+ * @param limit - Max number of attestations to return (default: 20)
166
+ * @returns Array of attestations, most recent first
167
+ *
168
+ * @throws {NetworkError} If the agent is unreachable
169
+ */
170
+ async getAttestationHistory(exchangeId, limit) {
171
+ if (!exchangeId || typeof exchangeId !== 'string') {
172
+ throw new errors_1.Sequence0Error('exchangeId must be a non-empty string');
173
+ }
174
+ const queryLimit = limit && limit > 0 ? limit : 20;
175
+ const response = await this.get(`/solvency/exchange/${exchangeId}/history?limit=${queryLimit}`);
176
+ if (!response || !Array.isArray(response.attestations)) {
177
+ throw new errors_1.Sequence0Error('Invalid response from /solvency/exchange/history: missing attestations array');
178
+ }
179
+ return response.attestations.map((a) => this.mapAttestationResponse(a));
180
+ }
181
+ /**
182
+ * List all registered exchanges.
183
+ *
184
+ * @returns Array of exchange info objects
185
+ *
186
+ * @throws {NetworkError} If the agent is unreachable
187
+ */
188
+ async listExchanges() {
189
+ const response = await this.get('/solvency/exchanges');
190
+ if (!response || !Array.isArray(response.exchanges)) {
191
+ throw new errors_1.Sequence0Error('Invalid response from /solvency/exchanges: missing exchanges array');
192
+ }
193
+ return response.exchanges.map((e) => this.mapExchangeResponse(e));
194
+ }
195
+ // ── Internal HTTP helpers ──
196
+ async get(path) {
197
+ const url = `${this.baseUrl}${path}`;
198
+ let res;
199
+ try {
200
+ res = await fetch(url, {
201
+ method: 'GET',
202
+ headers: { 'Content-Type': 'application/json' },
203
+ });
204
+ }
205
+ catch (err) {
206
+ throw new errors_1.NetworkError(`Failed to reach agent at ${url}: ${err.message}`);
207
+ }
208
+ if (!res.ok) {
209
+ const body = await res.text().catch(() => '');
210
+ throw new errors_1.NetworkError(`GET ${path} failed with status ${res.status}: ${body}`, res.status);
211
+ }
212
+ return res.json();
213
+ }
214
+ async post(path, body) {
215
+ const url = `${this.baseUrl}${path}`;
216
+ let res;
217
+ try {
218
+ res = await fetch(url, {
219
+ method: 'POST',
220
+ headers: { 'Content-Type': 'application/json' },
221
+ body: JSON.stringify(body),
222
+ });
223
+ }
224
+ catch (err) {
225
+ throw new errors_1.NetworkError(`Failed to reach agent at ${url}: ${err.message}`);
226
+ }
227
+ if (!res.ok) {
228
+ const errBody = await res.text().catch(() => '');
229
+ throw new errors_1.NetworkError(`POST ${path} failed with status ${res.status}: ${errBody}`, res.status);
230
+ }
231
+ return res.json();
232
+ }
233
+ // ── Response Mappers ──
234
+ mapExchangeResponse(response) {
235
+ if (!response || typeof response.exchange_id !== 'string') {
236
+ throw new errors_1.Sequence0Error('Invalid exchange response: missing exchange_id');
237
+ }
238
+ return {
239
+ exchangeId: response.exchange_id,
240
+ name: response.name,
241
+ ownerAddress: response.owner_address,
242
+ chains: response.chains ?? [],
243
+ registeredAt: response.registered_at,
244
+ isActive: response.is_active ?? true,
245
+ totalAttestations: response.total_attestations ?? 0,
246
+ lastAttestationAt: response.last_attestation_at,
247
+ };
248
+ }
249
+ mapAttestationResponse(response) {
250
+ if (!response || typeof response.attestation_id !== 'string') {
251
+ throw new errors_1.Sequence0Error('Invalid attestation response: missing attestation_id');
252
+ }
253
+ return {
254
+ attestationId: response.attestation_id,
255
+ exchangeId: response.exchange_id,
256
+ assetsHash: response.assets_hash,
257
+ liabilitiesHash: response.liabilities_hash,
258
+ isSolvent: response.is_solvent,
259
+ timestamp: response.timestamp,
260
+ blockNumber: response.block_number,
261
+ totalChains: response.total_chains,
262
+ signature: response.signature,
263
+ };
264
+ }
265
+ }
266
+ exports.SolvencyClient = SolvencyClient;
267
+ //# sourceMappingURL=solvency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solvency.js","sourceRoot":"","sources":["../../src/core/solvency.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;;;AAEH,4CAA6E;AAiI7E,wBAAwB;AAExB;;;;;GAKG;AACH,MAAa,cAAc;IAGvB;;;;;OAKG;IACH,YAAY,OAA4B;QACpC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,gBAAgB,CAAC,OAAgC;QACnD,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpD,MAAM,IAAI,uBAAc,CAAC,iCAAiC,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,uBAAc,CAAC,iDAAiD,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAS7B,oBAAoB,EAAE;YACrB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;SACzB,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,kBAAkB,CAAC,OAA2B;QAChD,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAChE,MAAM,IAAI,uBAAc,CAAC,uCAAuC,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC9D,MAAM,IAAI,uBAAc,CAAC,uEAAuE,CAAC,CAAC;QACtG,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,OAAO,OAAO,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;YAC1E,MAAM,IAAI,uBAAc,CAAC,gDAAgD,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAE7B,kBAAkB,EAAE;YACnB,WAAW,EAAE,OAAO,CAAC,UAAU;YAC/B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,gBAAgB,EAAE,OAAO,CAAC,eAAe;SAC5C,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;YAC3D,MAAM,IAAI,uBAAc,CACpB,gEAAgE,CACnE,CAAC;QACN,CAAC;QAED,OAAO,EAAE,aAAa,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC;IACtD,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,oBAAoB,CAAC,aAAqB;QAC5C,IAAI,CAAC,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACtD,MAAM,IAAI,uBAAc,CAAC,0CAA0C,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAM5B,yBAAyB,aAAa,SAAS,CAAC,CAAC;QAEpD,MAAM,aAAa,GAAwB,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC1F,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAA2B,CAAC;YACvE,CAAC,CAAE,QAAQ,CAAC,MAA4B;YACxC,CAAC,CAAC,SAAS,CAAC;QAEhB,OAAO;YACH,aAAa,EAAE,QAAQ,CAAC,cAAc;YACtC,MAAM;YACN,cAAc,EAAE,QAAQ,CAAC,eAAe;YACxC,WAAW,EAAE,QAAQ,CAAC,YAAY;YAClC,WAAW,EAAE,QAAQ,CAAC,WAAW;gBAC7B,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,WAAW,CAAC;gBACnD,CAAC,CAAC,SAAS;SAClB,CAAC;IACN,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,oBAAoB,CAAC,UAAkB;QACzC,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,uBAAc,CAAC,uCAAuC,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAC3B,sBAAsB,UAAU,SAAS,CAC5C,CAAC;YAEF,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,OAAO,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,sCAAsC;YACtC,IAAI,GAAG,YAAY,qBAAY,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBACxD,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,MAAM,GAAG,CAAC;QACd,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,qBAAqB,CAAC,UAAkB,EAAE,KAAc;QAC1D,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,uBAAc,CAAC,uCAAuC,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAE5B,sBAAsB,UAAU,kBAAkB,UAAU,EAAE,CAAC,CAAC;QAEnE,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,uBAAc,CACpB,8EAA8E,CACjF,CAAC;QACN,CAAC;QAED,OAAO,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,aAAa;QACf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAW5B,qBAAqB,CAAC,CAAC;QAE1B,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,uBAAc,CACpB,oEAAoE,CACvE,CAAC;QACN,CAAC;QAED,OAAO,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,8BAA8B;IAEtB,KAAK,CAAC,GAAG,CAAI,IAAY;QAC7B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,IAAI,GAAa,CAAC;QAElB,IAAI,CAAC;YACD,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBACnB,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAClD,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,IAAI,qBAAY,CAClB,4BAA4B,GAAG,KAAM,GAAa,CAAC,OAAO,EAAE,CAC/D,CAAC;QACN,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,qBAAY,CAClB,OAAO,IAAI,uBAAuB,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,EACvD,GAAG,CAAC,MAAM,CACb,CAAC;QACN,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;IACpC,CAAC;IAEO,KAAK,CAAC,IAAI,CAAI,IAAY,EAAE,IAAa;QAC7C,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,IAAI,GAAa,CAAC;QAElB,IAAI,CAAC;YACD,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBACnB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC7B,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,IAAI,qBAAY,CAClB,4BAA4B,GAAG,KAAM,GAAa,CAAC,OAAO,EAAE,CAC/D,CAAC;QACN,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACjD,MAAM,IAAI,qBAAY,CAClB,QAAQ,IAAI,uBAAuB,GAAG,CAAC,MAAM,KAAK,OAAO,EAAE,EAC3D,GAAG,CAAC,MAAM,CACb,CAAC;QACN,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;IACpC,CAAC;IAED,yBAAyB;IAEjB,mBAAmB,CAAC,QAS3B;QACG,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YACxD,MAAM,IAAI,uBAAc,CACpB,gDAAgD,CACnD,CAAC;QACN,CAAC;QAED,OAAO;YACH,UAAU,EAAE,QAAQ,CAAC,WAAW;YAChC,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,YAAY,EAAE,QAAQ,CAAC,aAAa;YACpC,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,EAAE;YAC7B,YAAY,EAAE,QAAQ,CAAC,aAAa;YACpC,QAAQ,EAAE,QAAQ,CAAC,SAAS,IAAI,IAAI;YACpC,iBAAiB,EAAE,QAAQ,CAAC,kBAAkB,IAAI,CAAC;YACnD,iBAAiB,EAAE,QAAQ,CAAC,mBAAmB;SAClD,CAAC;IACN,CAAC;IAEO,sBAAsB,CAAC,QAAgC;QAC3D,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;YAC3D,MAAM,IAAI,uBAAc,CACpB,sDAAsD,CACzD,CAAC;QACN,CAAC;QAED,OAAO;YACH,aAAa,EAAE,QAAQ,CAAC,cAAc;YACtC,UAAU,EAAE,QAAQ,CAAC,WAAW;YAChC,UAAU,EAAE,QAAQ,CAAC,WAAW;YAChC,eAAe,EAAE,QAAQ,CAAC,gBAAgB;YAC1C,SAAS,EAAE,QAAQ,CAAC,UAAU;YAC9B,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,WAAW,EAAE,QAAQ,CAAC,YAAY;YAClC,WAAW,EAAE,QAAQ,CAAC,YAAY;YAClC,SAAS,EAAE,QAAQ,CAAC,SAAS;SAChC,CAAC;IACN,CAAC;CACJ;AAhUD,wCAgUC"}