@panal/sdk 0.8.0 → 0.10.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/dist/abis.d.ts +52 -0
- package/dist/abis.js +43 -0
- package/dist/chains.d.ts +11 -0
- package/dist/chains.js +2 -0
- package/dist/client.d.ts +56 -1
- package/dist/client.js +125 -3
- package/dist/types.d.ts +8 -1
- package/package.json +3 -2
package/dist/abis.d.ts
CHANGED
|
@@ -240,6 +240,15 @@ export declare const escrowAbi: readonly [{
|
|
|
240
240
|
readonly type: "uint256";
|
|
241
241
|
}];
|
|
242
242
|
readonly outputs: readonly [];
|
|
243
|
+
}, {
|
|
244
|
+
readonly type: "function";
|
|
245
|
+
readonly name: "openDispute";
|
|
246
|
+
readonly stateMutability: "nonpayable";
|
|
247
|
+
readonly inputs: readonly [{
|
|
248
|
+
readonly name: "taskId";
|
|
249
|
+
readonly type: "uint256";
|
|
250
|
+
}];
|
|
251
|
+
readonly outputs: readonly [];
|
|
243
252
|
}];
|
|
244
253
|
export declare const erc20Abi: readonly [{
|
|
245
254
|
readonly type: "function";
|
|
@@ -284,3 +293,46 @@ export declare const erc20Abi: readonly [{
|
|
|
284
293
|
readonly type: "bool";
|
|
285
294
|
}];
|
|
286
295
|
}];
|
|
296
|
+
/**
|
|
297
|
+
* PanalNames, solo las lecturas.
|
|
298
|
+
*
|
|
299
|
+
* Es la parte de la identidad de un agente que no depende de nadie: un nombre
|
|
300
|
+
* lo tiene una sola direccion, y se comprueba con una llamada `view` contra la
|
|
301
|
+
* cadena. La verificacion de dominio prueba mas —control de un servidor que
|
|
302
|
+
* declara esa direccion— pero la hace el indexador contra un tercero, asi que
|
|
303
|
+
* desaparece si el indexador se cae o va atrasado. Esta no.
|
|
304
|
+
*/
|
|
305
|
+
export declare const namesAbi: readonly [{
|
|
306
|
+
readonly type: "function";
|
|
307
|
+
readonly name: "nombreDe";
|
|
308
|
+
readonly stateMutability: "view";
|
|
309
|
+
readonly inputs: readonly [{
|
|
310
|
+
readonly name: "agente";
|
|
311
|
+
readonly type: "address";
|
|
312
|
+
}];
|
|
313
|
+
readonly outputs: readonly [{
|
|
314
|
+
readonly name: "";
|
|
315
|
+
readonly type: "string";
|
|
316
|
+
}];
|
|
317
|
+
}, {
|
|
318
|
+
readonly type: "function";
|
|
319
|
+
readonly name: "fichaDe";
|
|
320
|
+
readonly stateMutability: "view";
|
|
321
|
+
readonly inputs: readonly [{
|
|
322
|
+
readonly name: "nombre";
|
|
323
|
+
readonly type: "string";
|
|
324
|
+
}];
|
|
325
|
+
readonly outputs: readonly [{
|
|
326
|
+
readonly name: "dueno";
|
|
327
|
+
readonly type: "address";
|
|
328
|
+
}, {
|
|
329
|
+
readonly name: "desde";
|
|
330
|
+
readonly type: "uint64";
|
|
331
|
+
}, {
|
|
332
|
+
readonly name: "precio";
|
|
333
|
+
readonly type: "uint256";
|
|
334
|
+
}, {
|
|
335
|
+
readonly name: "transferible";
|
|
336
|
+
readonly type: "bool";
|
|
337
|
+
}];
|
|
338
|
+
}];
|
package/dist/abis.js
CHANGED
|
@@ -172,6 +172,16 @@ export const escrowAbi = [
|
|
|
172
172
|
inputs: [{ name: 'taskId', type: 'uint256' }],
|
|
173
173
|
outputs: [],
|
|
174
174
|
},
|
|
175
|
+
// Lo unico que detiene el autoRelease de 3 dias. Faltaba en este ABI, asi
|
|
176
|
+
// que desde el SDK no habia forma de disputar una entrega: tocaba ir al
|
|
177
|
+
// contrato a mano justo cuando corre el reloj.
|
|
178
|
+
{
|
|
179
|
+
type: 'function',
|
|
180
|
+
name: 'openDispute',
|
|
181
|
+
stateMutability: 'nonpayable',
|
|
182
|
+
inputs: [{ name: 'taskId', type: 'uint256' }],
|
|
183
|
+
outputs: [],
|
|
184
|
+
},
|
|
175
185
|
];
|
|
176
186
|
export const erc20Abi = [
|
|
177
187
|
{
|
|
@@ -202,3 +212,36 @@ export const erc20Abi = [
|
|
|
202
212
|
outputs: [{ name: '', type: 'bool' }],
|
|
203
213
|
},
|
|
204
214
|
];
|
|
215
|
+
/**
|
|
216
|
+
* PanalNames, solo las lecturas.
|
|
217
|
+
*
|
|
218
|
+
* Es la parte de la identidad de un agente que no depende de nadie: un nombre
|
|
219
|
+
* lo tiene una sola direccion, y se comprueba con una llamada `view` contra la
|
|
220
|
+
* cadena. La verificacion de dominio prueba mas —control de un servidor que
|
|
221
|
+
* declara esa direccion— pero la hace el indexador contra un tercero, asi que
|
|
222
|
+
* desaparece si el indexador se cae o va atrasado. Esta no.
|
|
223
|
+
*/
|
|
224
|
+
export const namesAbi = [
|
|
225
|
+
{
|
|
226
|
+
type: 'function',
|
|
227
|
+
name: 'nombreDe',
|
|
228
|
+
stateMutability: 'view',
|
|
229
|
+
inputs: [{ name: 'agente', type: 'address' }],
|
|
230
|
+
outputs: [{ name: '', type: 'string' }],
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
// `desde` es cuando el nombre paso a ser de esta direccion, no cuando se
|
|
234
|
+
// creo: en una venta se reinicia, que es justo el dato que delata a un
|
|
235
|
+
// nombre con historia recien cambiado de manos.
|
|
236
|
+
type: 'function',
|
|
237
|
+
name: 'fichaDe',
|
|
238
|
+
stateMutability: 'view',
|
|
239
|
+
inputs: [{ name: 'nombre', type: 'string' }],
|
|
240
|
+
outputs: [
|
|
241
|
+
{ name: 'dueno', type: 'address' },
|
|
242
|
+
{ name: 'desde', type: 'uint64' },
|
|
243
|
+
{ name: 'precio', type: 'uint256' },
|
|
244
|
+
{ name: 'transferible', type: 'bool' },
|
|
245
|
+
],
|
|
246
|
+
},
|
|
247
|
+
];
|
package/dist/chains.d.ts
CHANGED
|
@@ -119,6 +119,17 @@ export interface PanalAddresses {
|
|
|
119
119
|
panalToken: Address;
|
|
120
120
|
/** Multisig 2-de-3 que resuelve las disputas. Se lee del escrow en caliente. */
|
|
121
121
|
arbitrator: Address;
|
|
122
|
+
/**
|
|
123
|
+
* PanalNames: el nombre único de cada agente.
|
|
124
|
+
*
|
|
125
|
+
* Es la única señal de identidad que vive EN LA CADENA. El nombre del perfil
|
|
126
|
+
* es texto libre y se repite —hoy hay tres direcciones anunciándose como
|
|
127
|
+
* "LexPanal"—, mientras que aquí un nombre lo tiene una sola dirección. Y a
|
|
128
|
+
* diferencia de la verificación de dominio, que la hace el indexador contra
|
|
129
|
+
* un servidor ajeno, esto se lee con una llamada `view`: no depende de que
|
|
130
|
+
* nada esté levantado.
|
|
131
|
+
*/
|
|
132
|
+
names: Address;
|
|
122
133
|
}
|
|
123
134
|
/** Desplegados en Monad mainnet el 2026-07-29 (escrow v2 auditado). */
|
|
124
135
|
export declare const MAINNET_ADDRESSES: PanalAddresses;
|
package/dist/chains.js
CHANGED
|
@@ -32,6 +32,7 @@ export const MAINNET_ADDRESSES = {
|
|
|
32
32
|
escrow: '0xe138A9A492CFe27A13f8b7A6D312DA831791bCe9',
|
|
33
33
|
panalToken: '0x2e2e44e7fa6178822d4397299f719e89d1a67777',
|
|
34
34
|
arbitrator: '0xc384C1F5D6716571DA84329BeAaE6F064C6b1Fe0',
|
|
35
|
+
names: '0xc94a8107C87859cAd2E472e71BbE25c15cdD614A',
|
|
35
36
|
};
|
|
36
37
|
/**
|
|
37
38
|
* En testnet solo hay registry y escrow desplegados. El resto queda a cero: el
|
|
@@ -43,6 +44,7 @@ export const TESTNET_ADDRESSES = {
|
|
|
43
44
|
escrow: '0x0000000000000000000000000000000000000000',
|
|
44
45
|
panalToken: '0x0000000000000000000000000000000000000000',
|
|
45
46
|
arbitrator: '0x0000000000000000000000000000000000000000',
|
|
47
|
+
names: '0x0000000000000000000000000000000000000000',
|
|
46
48
|
};
|
|
47
49
|
/** `address(0)` significa MON nativo en todo el protocolo. */
|
|
48
50
|
export const NATIVE_CURRENCY = '0x0000000000000000000000000000000000000000';
|
package/dist/client.d.ts
CHANGED
|
@@ -91,8 +91,34 @@ export declare class PanalClient {
|
|
|
91
91
|
* ninguno» de «no lo sé», porque en el segundo caso toca leer la cadena.
|
|
92
92
|
*/
|
|
93
93
|
private buscarEnIndice;
|
|
94
|
-
/**
|
|
94
|
+
/**
|
|
95
|
+
* Un agente concreto, con su metadata interpretada y su nombre único.
|
|
96
|
+
*
|
|
97
|
+
* El nombre se lee de PanalNames EN LA CADENA, y por eso está aquí y no solo
|
|
98
|
+
* en la ruta del indexador: el nombre del perfil es texto libre y se repite
|
|
99
|
+
* —ahora mismo hay tres direcciones anunciándose como "LexPanal"—, mientras
|
|
100
|
+
* que un nombre de PanalNames lo tiene una sola dirección. Es la única señal
|
|
101
|
+
* de identidad que sigue en pie si el indexador se cae, porque no depende de
|
|
102
|
+
* que nadie esté levantado: es una llamada `view`.
|
|
103
|
+
*
|
|
104
|
+
* No sustituye a la verificación de dominio, que prueba más: control de un
|
|
105
|
+
* servidor que declara esta misma dirección. Prueba unicidad, no quién hay
|
|
106
|
+
* detrás. Y como los nombres se venden, `desdeTs` importa tanto como el
|
|
107
|
+
* nombre — pero `origen` se queda sin saber por esta ruta, porque sale de los
|
|
108
|
+
* eventos del contrato y no de una lectura.
|
|
109
|
+
*/
|
|
95
110
|
getAgent(address: Address): Promise<Agent>;
|
|
111
|
+
/** La ficha del registry, sin las lecturas de más. Lo que usa `listAgents`. */
|
|
112
|
+
private leerAgente;
|
|
113
|
+
/**
|
|
114
|
+
* El nombre de PanalNames de una dirección, o null si no tiene.
|
|
115
|
+
*
|
|
116
|
+
* Nunca lanza: un agente sin nombre es lo normal, y que el contrato de
|
|
117
|
+
* nombres no esté desplegado —testnet— tampoco puede impedir leer una ficha.
|
|
118
|
+
* Devolver null y seguir es lo correcto; caerse aquí convertiría un dato
|
|
119
|
+
* adicional en un fallo de la operación entera.
|
|
120
|
+
*/
|
|
121
|
+
private nombreEnCadena;
|
|
96
122
|
/**
|
|
97
123
|
* Busca agentes activos por texto libre sobre nombre, descripción y skills.
|
|
98
124
|
*
|
|
@@ -130,6 +156,35 @@ export declare class PanalClient {
|
|
|
130
156
|
* registrada: sin ella el agente no construye reputación.
|
|
131
157
|
*/
|
|
132
158
|
approveTask(taskId: bigint, rating: number): Promise<Hex>;
|
|
159
|
+
/**
|
|
160
|
+
* Cancela una tarea que nunca arrancó y recupera lo bloqueado.
|
|
161
|
+
*
|
|
162
|
+
* El escrow solo lo permite al cliente, con la tarea todavía `Open` —o sea
|
|
163
|
+
* sin entrega— y además vencido el plazo o sin worker asignado. Con worker
|
|
164
|
+
* asignado hay que esperar al deadline: si no, el cliente podría retirarle
|
|
165
|
+
* el encargo a alguien que ya está trabajando.
|
|
166
|
+
*
|
|
167
|
+
* Hace falta cuando el encargo no llegó a su destino y el pago sí: el brief
|
|
168
|
+
* se entrega después de crear la tarea, así que un endpoint caído o un texto
|
|
169
|
+
* que el agente rechaza dejan dinero parado hasta el plazo. Sin esto, la
|
|
170
|
+
* única salida era llamar al contrato a mano.
|
|
171
|
+
*
|
|
172
|
+
* OJO: el escrow es pull payment. Esto ACREDITA el reembolso, no lo envía.
|
|
173
|
+
* Para tenerlo en la wallet hay que llamar después a `withdraw()`.
|
|
174
|
+
*/
|
|
175
|
+
cancelTask(taskId: bigint): Promise<Hex>;
|
|
176
|
+
/**
|
|
177
|
+
* Abre una disputa sobre una entrega, y con ello para el reloj.
|
|
178
|
+
*
|
|
179
|
+
* Urge más de lo que parece: si no apruebas ni disputas, el escrow libera el
|
|
180
|
+
* pago solo a los 3 días de la entrega, con un 5/5 implícito. O sea que ante
|
|
181
|
+
* una entrega mala, no hacer nada NO es neutral: es pagar y además regalar la
|
|
182
|
+
* mejor valoración. Disputar es lo único que detiene esa cuenta atrás.
|
|
183
|
+
*
|
|
184
|
+
* La resuelve el arbitrator repartiendo el importe. Si no lo hace en 14 días,
|
|
185
|
+
* cualquiera puede llamar a `resolveStuckDispute` y el cliente recupera todo.
|
|
186
|
+
*/
|
|
187
|
+
openDispute(taskId: bigint): Promise<Hex>;
|
|
133
188
|
/**
|
|
134
189
|
* Registra tu agente en el marketplace. Lo llama la wallet que trabajará y
|
|
135
190
|
* cobrará: en Panal el agente ES una dirección, no una fila en una base de
|
package/dist/client.js
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* y en uso: el caso de "quiero probar esto ahora" no debería exigir un .env.
|
|
17
17
|
*/
|
|
18
18
|
import { createPublicClient, createWalletClient, formatEther, getAddress, http, keccak256, toBytes } from 'viem';
|
|
19
|
-
import { erc20Abi, escrowAbi, registryAbi } from './abis.js';
|
|
19
|
+
import { erc20Abi, escrowAbi, namesAbi, registryAbi } from './abis.js';
|
|
20
20
|
import { assertPublicUrl, fetchLimited } from './net.js';
|
|
21
21
|
import { X402Error, payAndAsk, quoteAsk } from './x402.js';
|
|
22
22
|
import { descend, newEnvelope, remainingBudget } from './envelope.js';
|
|
@@ -101,7 +101,11 @@ export class PanalClient {
|
|
|
101
101
|
if (page.length < Number(REGISTRY_PAGE))
|
|
102
102
|
break;
|
|
103
103
|
}
|
|
104
|
-
|
|
104
|
+
// `leerAgente` y no `getAgent`: este listado ya son N lecturas en paralelo
|
|
105
|
+
// contra un RPC que corta sobre 50 concurrentes, y buscar el nombre de cada
|
|
106
|
+
// uno las triplicaria. Quien quiera el nombre de uno concreto llama a
|
|
107
|
+
// getAgent(); quien quiera el de todos tiene el indexador, que ya lo trae.
|
|
108
|
+
return Promise.all(addresses.map((address) => this.leerAgente(address)));
|
|
105
109
|
}
|
|
106
110
|
/**
|
|
107
111
|
* Los agentes que dice el indexador, o null si no se puede contar con él.
|
|
@@ -182,8 +186,29 @@ export class PanalClient {
|
|
|
182
186
|
return null;
|
|
183
187
|
}
|
|
184
188
|
}
|
|
185
|
-
/**
|
|
189
|
+
/**
|
|
190
|
+
* Un agente concreto, con su metadata interpretada y su nombre único.
|
|
191
|
+
*
|
|
192
|
+
* El nombre se lee de PanalNames EN LA CADENA, y por eso está aquí y no solo
|
|
193
|
+
* en la ruta del indexador: el nombre del perfil es texto libre y se repite
|
|
194
|
+
* —ahora mismo hay tres direcciones anunciándose como "LexPanal"—, mientras
|
|
195
|
+
* que un nombre de PanalNames lo tiene una sola dirección. Es la única señal
|
|
196
|
+
* de identidad que sigue en pie si el indexador se cae, porque no depende de
|
|
197
|
+
* que nadie esté levantado: es una llamada `view`.
|
|
198
|
+
*
|
|
199
|
+
* No sustituye a la verificación de dominio, que prueba más: control de un
|
|
200
|
+
* servidor que declara esta misma dirección. Prueba unicidad, no quién hay
|
|
201
|
+
* detrás. Y como los nombres se venden, `desdeTs` importa tanto como el
|
|
202
|
+
* nombre — pero `origen` se queda sin saber por esta ruta, porque sale de los
|
|
203
|
+
* eventos del contrato y no de una lectura.
|
|
204
|
+
*/
|
|
186
205
|
async getAgent(address) {
|
|
206
|
+
const base = await this.leerAgente(address);
|
|
207
|
+
const nombre = await this.nombreEnCadena(address);
|
|
208
|
+
return nombre ? { ...base, nombre } : base;
|
|
209
|
+
}
|
|
210
|
+
/** La ficha del registry, sin las lecturas de más. Lo que usa `listAgents`. */
|
|
211
|
+
async leerAgente(address) {
|
|
187
212
|
const raw = (await this.publicClient.readContract({
|
|
188
213
|
address: this.addresses.registry,
|
|
189
214
|
abi: registryAbi,
|
|
@@ -201,6 +226,42 @@ export class PanalClient {
|
|
|
201
226
|
metadata: parseAgentMetadata(raw.metadataURI),
|
|
202
227
|
};
|
|
203
228
|
}
|
|
229
|
+
/**
|
|
230
|
+
* El nombre de PanalNames de una dirección, o null si no tiene.
|
|
231
|
+
*
|
|
232
|
+
* Nunca lanza: un agente sin nombre es lo normal, y que el contrato de
|
|
233
|
+
* nombres no esté desplegado —testnet— tampoco puede impedir leer una ficha.
|
|
234
|
+
* Devolver null y seguir es lo correcto; caerse aquí convertiría un dato
|
|
235
|
+
* adicional en un fallo de la operación entera.
|
|
236
|
+
*/
|
|
237
|
+
async nombreEnCadena(address) {
|
|
238
|
+
const names = this.addresses.names;
|
|
239
|
+
if (!names || names === '0x0000000000000000000000000000000000000000')
|
|
240
|
+
return null;
|
|
241
|
+
try {
|
|
242
|
+
const nombre = (await this.publicClient.readContract({
|
|
243
|
+
address: names,
|
|
244
|
+
abi: namesAbi,
|
|
245
|
+
functionName: 'nombreDe',
|
|
246
|
+
args: [getAddress(address)],
|
|
247
|
+
}));
|
|
248
|
+
if (!nombre)
|
|
249
|
+
return null;
|
|
250
|
+
const ficha = (await this.publicClient.readContract({
|
|
251
|
+
address: names,
|
|
252
|
+
abi: namesAbi,
|
|
253
|
+
functionName: 'fichaDe',
|
|
254
|
+
args: [nombre],
|
|
255
|
+
}));
|
|
256
|
+
// `origen` a propósito ausente: por esta ruta no se sabe, y ponerle
|
|
257
|
+
// 'reclamado' seria inventarse justo la parte que avisa de una compra
|
|
258
|
+
// reciente.
|
|
259
|
+
return { nombre, desdeTs: Number(ficha[1]) };
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
204
265
|
/**
|
|
205
266
|
* Busca agentes activos por texto libre sobre nombre, descripción y skills.
|
|
206
267
|
*
|
|
@@ -341,6 +402,67 @@ export class PanalClient {
|
|
|
341
402
|
await this.publicClient.waitForTransactionReceipt({ hash });
|
|
342
403
|
return hash;
|
|
343
404
|
}
|
|
405
|
+
/**
|
|
406
|
+
* Cancela una tarea que nunca arrancó y recupera lo bloqueado.
|
|
407
|
+
*
|
|
408
|
+
* El escrow solo lo permite al cliente, con la tarea todavía `Open` —o sea
|
|
409
|
+
* sin entrega— y además vencido el plazo o sin worker asignado. Con worker
|
|
410
|
+
* asignado hay que esperar al deadline: si no, el cliente podría retirarle
|
|
411
|
+
* el encargo a alguien que ya está trabajando.
|
|
412
|
+
*
|
|
413
|
+
* Hace falta cuando el encargo no llegó a su destino y el pago sí: el brief
|
|
414
|
+
* se entrega después de crear la tarea, así que un endpoint caído o un texto
|
|
415
|
+
* que el agente rechaza dejan dinero parado hasta el plazo. Sin esto, la
|
|
416
|
+
* única salida era llamar al contrato a mano.
|
|
417
|
+
*
|
|
418
|
+
* OJO: el escrow es pull payment. Esto ACREDITA el reembolso, no lo envía.
|
|
419
|
+
* Para tenerlo en la wallet hay que llamar después a `withdraw()`.
|
|
420
|
+
*/
|
|
421
|
+
async cancelTask(taskId) {
|
|
422
|
+
const wallet = this.wallet();
|
|
423
|
+
const task = await this.getTask(taskId);
|
|
424
|
+
if (task.status !== TaskStatus.Open) {
|
|
425
|
+
throw new Error(`La tarea #${taskId} está "${TaskStatus[task.status]}": solo se cancela lo que sigue abierto.`);
|
|
426
|
+
}
|
|
427
|
+
const hash = await wallet.writeContract({
|
|
428
|
+
address: this.addresses.escrow,
|
|
429
|
+
abi: escrowAbi,
|
|
430
|
+
functionName: 'cancelTask',
|
|
431
|
+
args: [taskId],
|
|
432
|
+
chain: chainFor(this.network),
|
|
433
|
+
account: this.account,
|
|
434
|
+
});
|
|
435
|
+
await this.publicClient.waitForTransactionReceipt({ hash });
|
|
436
|
+
return hash;
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Abre una disputa sobre una entrega, y con ello para el reloj.
|
|
440
|
+
*
|
|
441
|
+
* Urge más de lo que parece: si no apruebas ni disputas, el escrow libera el
|
|
442
|
+
* pago solo a los 3 días de la entrega, con un 5/5 implícito. O sea que ante
|
|
443
|
+
* una entrega mala, no hacer nada NO es neutral: es pagar y además regalar la
|
|
444
|
+
* mejor valoración. Disputar es lo único que detiene esa cuenta atrás.
|
|
445
|
+
*
|
|
446
|
+
* La resuelve el arbitrator repartiendo el importe. Si no lo hace en 14 días,
|
|
447
|
+
* cualquiera puede llamar a `resolveStuckDispute` y el cliente recupera todo.
|
|
448
|
+
*/
|
|
449
|
+
async openDispute(taskId) {
|
|
450
|
+
const wallet = this.wallet();
|
|
451
|
+
const task = await this.getTask(taskId);
|
|
452
|
+
if (task.status !== TaskStatus.Delivered) {
|
|
453
|
+
throw new Error(`La tarea #${taskId} está "${TaskStatus[task.status]}": solo se disputa lo entregado.`);
|
|
454
|
+
}
|
|
455
|
+
const hash = await wallet.writeContract({
|
|
456
|
+
address: this.addresses.escrow,
|
|
457
|
+
abi: escrowAbi,
|
|
458
|
+
functionName: 'openDispute',
|
|
459
|
+
args: [taskId],
|
|
460
|
+
chain: chainFor(this.network),
|
|
461
|
+
account: this.account,
|
|
462
|
+
});
|
|
463
|
+
await this.publicClient.waitForTransactionReceipt({ hash });
|
|
464
|
+
return hash;
|
|
465
|
+
}
|
|
344
466
|
// -------------------------------------------------------------------------
|
|
345
467
|
// Lado del AGENTE — darse de alta, trabajar y entregar.
|
|
346
468
|
// -------------------------------------------------------------------------
|
package/dist/types.d.ts
CHANGED
|
@@ -84,8 +84,15 @@ export interface NombreDeAgente {
|
|
|
84
84
|
* Importa tanto como el nombre: en una venta lo único que viaja es el
|
|
85
85
|
* nombre, y la reputación se queda con el vendedor. Un `lint` comprado la
|
|
86
86
|
* semana pasada no hizo las tareas que hicieron valer ese nombre.
|
|
87
|
+
*
|
|
88
|
+
* OPCIONAL porque no siempre se puede saber. Se deduce de los eventos del
|
|
89
|
+
* contrato de nombres, así que lo tiene el indexador; leyendo la cadena solo
|
|
90
|
+
* hay `nombreDe()` y `fichaDe()`, que dicen cuál es el nombre y desde cuándo
|
|
91
|
+
* es suyo, no cómo llegó a serlo. Cuando falta es `undefined`, y hay que
|
|
92
|
+
* tratarlo como «no lo sé», nunca como «reclamado»: suponer el origen limpio
|
|
93
|
+
* es justo el error que la advertencia existe para evitar.
|
|
87
94
|
*/
|
|
88
|
-
origen
|
|
95
|
+
origen?: 'reclamado' | 'comprado' | 'recibido';
|
|
89
96
|
}
|
|
90
97
|
/** Una tarea del escrow. */
|
|
91
98
|
export interface Task {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@panal/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "SDK de Panal: contrata agentes de IA autonomos on-chain en Monad",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"scripts": {
|
|
46
46
|
"build": "tsc -p tsconfig.json",
|
|
47
47
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
48
|
-
"test": "tsx test/sdk.test.ts && tsx test/x402.test.ts && tsx test/x402-server.test.ts && tsx test/envelope.test.ts && tsx test/files.test.ts"
|
|
48
|
+
"test": "tsx test/sdk.test.ts && tsx test/x402.test.ts && tsx test/x402-server.test.ts && tsx test/envelope.test.ts && tsx test/files.test.ts",
|
|
49
|
+
"test:nombres": "tsx test/nombres.test.ts"
|
|
49
50
|
}
|
|
50
51
|
}
|