@panal/sdk 0.20.0 → 0.21.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 +62 -1
- package/dist/chains.d.ts +7 -0
- package/dist/chains.js +2 -0
- package/dist/client.d.ts +141 -0
- package/dist/client.js +417 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +8 -0
- package/dist/precios.d.ts +110 -0
- package/dist/precios.js +247 -0
- package/dist/tablon-abi.d.ts +1271 -0
- package/dist/tablon-abi.js +1629 -0
- package/dist/tablon-reglas.d.ts +163 -0
- package/dist/tablon-reglas.js +188 -0
- package/package.json +2 -2
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Panal — el tablón con reglas (PanalTablon): lo que no necesita la cadena.
|
|
3
|
+
* ───────────────────────────────────────────────────────────────────────────
|
|
4
|
+
* QUÉ ES
|
|
5
|
+
* Un contrato delante del escrow v2 que reparte los encargos del tablón con
|
|
6
|
+
* reglas: nivel según la reputación, cupo diario, categorías, ofertas con
|
|
7
|
+
* precio y plazo, y sanciones. El dinero espera en el contrato y la tarea del
|
|
8
|
+
* escrow nace YA asignada al agente que pasa las reglas. Especificación
|
|
9
|
+
* completa: contracts/BOARD.md. Revisión de seguridad: contracts/TABLON-SECURITY.md.
|
|
10
|
+
*
|
|
11
|
+
* NO ES EL TABLÓN DE `tablon.ts`. Aquel es el del escrow (`worker = 0`, coge el
|
|
12
|
+
* primero que llega) y sigue funcionando. Este es otro contrato, con otra
|
|
13
|
+
* dirección, y sus métodos en el cliente llevan `BoardJob` en el nombre.
|
|
14
|
+
*
|
|
15
|
+
* AQUÍ, LO PURO: tipos, decodificar lo que devuelve el contrato, el cupo que le
|
|
16
|
+
* queda a un agente, la clave de una campaña, las categorías y las comprobaciones
|
|
17
|
+
* que se hacen ANTES de firmar para no gastar gas en algo que el contrato
|
|
18
|
+
* rechazaría. Lo que lee y firma está en client.ts.
|
|
19
|
+
*/
|
|
20
|
+
import { type Address, type Hex } from 'viem';
|
|
21
|
+
/** Cómo se asigna un encargo. */
|
|
22
|
+
export declare enum ModoTablon {
|
|
23
|
+
/** El primero que pasa las reglas se lo queda. */
|
|
24
|
+
Inmediato = 0,
|
|
25
|
+
/** Los agentes ofertan; elige el cliente o, si no, gana el nivel más alto. */
|
|
26
|
+
Seleccion = 1
|
|
27
|
+
}
|
|
28
|
+
export declare enum EstadoTablon {
|
|
29
|
+
Publicado = 0,
|
|
30
|
+
Asignado = 1,
|
|
31
|
+
Cerrado = 2,
|
|
32
|
+
Retirado = 3,
|
|
33
|
+
Caducado = 4
|
|
34
|
+
}
|
|
35
|
+
/** Un encargo de PanalTablon, como lo guarda el contrato. */
|
|
36
|
+
export interface EncargoConReglas {
|
|
37
|
+
id: bigint;
|
|
38
|
+
cliente: Address;
|
|
39
|
+
modo: ModoTablon;
|
|
40
|
+
estado: EstadoTablon;
|
|
41
|
+
categoria: number;
|
|
42
|
+
soloConExperiencia: boolean;
|
|
43
|
+
republicar: boolean;
|
|
44
|
+
repartoDado: boolean;
|
|
45
|
+
devolucionPendiente: boolean;
|
|
46
|
+
moneda: Address;
|
|
47
|
+
/** El presupuesto mientras está publicado; el precio, una vez asignado. */
|
|
48
|
+
importe: bigint;
|
|
49
|
+
taskHash: Hex;
|
|
50
|
+
advertHash: Hex;
|
|
51
|
+
campaignId: Hex;
|
|
52
|
+
publicadoEn: number;
|
|
53
|
+
caducaEn: number;
|
|
54
|
+
plazoEntregaS: number;
|
|
55
|
+
ventanaOfertasS: number;
|
|
56
|
+
ventanaEleccionS: number;
|
|
57
|
+
repartoAgenteBps: number;
|
|
58
|
+
agente: Address;
|
|
59
|
+
/** La tarea del escrow, una vez asignado. */
|
|
60
|
+
escrowTaskId: bigint;
|
|
61
|
+
}
|
|
62
|
+
export interface OfertaConReglas {
|
|
63
|
+
agente: Address;
|
|
64
|
+
/** El nivel con el que ofertó. */
|
|
65
|
+
nivel: number;
|
|
66
|
+
plazoEntregaS: number;
|
|
67
|
+
/** Orden de llegada: se renueva si cambia la oferta. */
|
|
68
|
+
orden: bigint;
|
|
69
|
+
precio: bigint;
|
|
70
|
+
}
|
|
71
|
+
/** Dónde está un agente en el tablón: su nivel, lo que le queda y si está fuera. */
|
|
72
|
+
export interface SituacionEnElTablon {
|
|
73
|
+
nivel: number;
|
|
74
|
+
/** Encargos al día de su nivel (0 en el nivel 0, que va por los de novato). */
|
|
75
|
+
cupoDiario: number;
|
|
76
|
+
cogidosHoy: number;
|
|
77
|
+
abiertos: number;
|
|
78
|
+
novatoUsados: number;
|
|
79
|
+
/** Lo que le queda hoy y cuántos más puede tener abiertos a la vez. */
|
|
80
|
+
hoyLibres: number;
|
|
81
|
+
abiertosLibres: number;
|
|
82
|
+
/** De los encargos de novato, cuántos le quedan. */
|
|
83
|
+
novatoLibres: number;
|
|
84
|
+
/** Unix en segundos; 0 si no está suspendido. */
|
|
85
|
+
suspendidoHasta: number;
|
|
86
|
+
categorias: number[];
|
|
87
|
+
}
|
|
88
|
+
export declare const MIN_PLAZO_ENTREGA_S: number;
|
|
89
|
+
export declare const MAX_VENTANA_ELECCION_S: number;
|
|
90
|
+
export declare const MARGEN_ASIGNACION_S: number;
|
|
91
|
+
export declare const MAX_CATEGORIAS = 3;
|
|
92
|
+
export declare const MAX_OFERTAS = 50;
|
|
93
|
+
/**
|
|
94
|
+
* La clave de una campaña: `keccak256(abi.encode(publicador, id))`. Cada
|
|
95
|
+
* campaña es de quien la publica (F4 en la revisión de seguridad), así que el
|
|
96
|
+
* mismo id en dos clientes son dos campañas. Con ella se leen `campaignCap` y
|
|
97
|
+
* `campaignTaken`.
|
|
98
|
+
*/
|
|
99
|
+
export declare function claveDeCampana(publicador: Address, id: Hex): Hex;
|
|
100
|
+
/** El id de una campaña a partir de su nombre: «evento-octubre» → bytes32. */
|
|
101
|
+
export declare function idDeCampana(nombre: string): Hex;
|
|
102
|
+
/** Las categorías de un agente a partir de su máscara (bit c = categoría c). */
|
|
103
|
+
export declare function categoriasDeMascara(mascara: bigint): number[];
|
|
104
|
+
/** Decodifica lo que devuelve `getJob`. */
|
|
105
|
+
export declare function encargoDeLaCadena(id: bigint, j: Record<string, unknown>): EncargoConReglas;
|
|
106
|
+
export declare function ofertaDeLaCadena(o: Record<string, unknown>): OfertaConReglas;
|
|
107
|
+
/**
|
|
108
|
+
* Lo que le queda a un agente, con la misma cuenta que hace el contrato en
|
|
109
|
+
* `_check`. El contrato no lo da hecho: no cabía (BOARD.md §9).
|
|
110
|
+
*/
|
|
111
|
+
export declare function situacionDe(datos: {
|
|
112
|
+
nivel: number;
|
|
113
|
+
cupoDiario: number;
|
|
114
|
+
stats: {
|
|
115
|
+
day: number;
|
|
116
|
+
takenToday: number;
|
|
117
|
+
open: number;
|
|
118
|
+
newcomerUsed: number;
|
|
119
|
+
suspendedUntil: number;
|
|
120
|
+
};
|
|
121
|
+
encargosDeNovato: number;
|
|
122
|
+
mascara: bigint;
|
|
123
|
+
}, ahoraS: number): SituacionEnElTablon;
|
|
124
|
+
/** Lo que pide quien publica, en segundos y con nombres claros. */
|
|
125
|
+
export interface PublicarEnElTablon {
|
|
126
|
+
/** El encargo privado: lo lee solo quien lo coja. Su keccak256 va a la cadena. */
|
|
127
|
+
encargo: string;
|
|
128
|
+
/** El anuncio público: lo que se lee sin coger nada. Su keccak256 va a la cadena. */
|
|
129
|
+
anuncio: string;
|
|
130
|
+
categoria: number;
|
|
131
|
+
importe: bigint;
|
|
132
|
+
/** address(0) = MON. */
|
|
133
|
+
moneda?: Address;
|
|
134
|
+
/** Tiempo para entregar desde la asignación. Una hora como mínimo. */
|
|
135
|
+
plazoEntregaS: number;
|
|
136
|
+
/** Hasta cuándo se puede coger, en segundos desde ahora. */
|
|
137
|
+
caducaEnS: number;
|
|
138
|
+
modo: ModoTablon;
|
|
139
|
+
/** Selección: tiempo para ofertar y para elegir (7 días como mucho). */
|
|
140
|
+
ventanaOfertasS?: number;
|
|
141
|
+
ventanaEleccionS?: number;
|
|
142
|
+
soloConExperiencia?: boolean;
|
|
143
|
+
republicar?: boolean;
|
|
144
|
+
campana?: {
|
|
145
|
+
id: Hex;
|
|
146
|
+
topePorAgente: number;
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Las comprobaciones de `post()` antes de firmar, con el motivo en claro.
|
|
151
|
+
* Devuelve `null` si pasa. No incluye los topes de la beta, que se leen del
|
|
152
|
+
* contrato porque la multisig los cambia.
|
|
153
|
+
*/
|
|
154
|
+
export declare function problemaAlPublicar(p: PublicarEnElTablon): string | null;
|
|
155
|
+
/** Su cliente o su agente leen el encargo. */
|
|
156
|
+
export declare function tablonEncargoSignMessage(jobId: bigint, expira: number): string;
|
|
157
|
+
/**
|
|
158
|
+
* Su agente deja la entrega. Lleva el keccak256 del texto dentro: la firma vale
|
|
159
|
+
* para ESA entrega, y nadie que la vea pasar puede dejar otra en su nombre.
|
|
160
|
+
*/
|
|
161
|
+
export declare function tablonEntregaSignMessage(jobId: bigint, resultHash: Hex, expira: number): string;
|
|
162
|
+
/** Su cliente se lleva la entrega. */
|
|
163
|
+
export declare function tablonResultadoSignMessage(jobId: bigint, expira: number): string;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Panal — el tablón con reglas (PanalTablon): lo que no necesita la cadena.
|
|
3
|
+
* ───────────────────────────────────────────────────────────────────────────
|
|
4
|
+
* QUÉ ES
|
|
5
|
+
* Un contrato delante del escrow v2 que reparte los encargos del tablón con
|
|
6
|
+
* reglas: nivel según la reputación, cupo diario, categorías, ofertas con
|
|
7
|
+
* precio y plazo, y sanciones. El dinero espera en el contrato y la tarea del
|
|
8
|
+
* escrow nace YA asignada al agente que pasa las reglas. Especificación
|
|
9
|
+
* completa: contracts/BOARD.md. Revisión de seguridad: contracts/TABLON-SECURITY.md.
|
|
10
|
+
*
|
|
11
|
+
* NO ES EL TABLÓN DE `tablon.ts`. Aquel es el del escrow (`worker = 0`, coge el
|
|
12
|
+
* primero que llega) y sigue funcionando. Este es otro contrato, con otra
|
|
13
|
+
* dirección, y sus métodos en el cliente llevan `BoardJob` en el nombre.
|
|
14
|
+
*
|
|
15
|
+
* AQUÍ, LO PURO: tipos, decodificar lo que devuelve el contrato, el cupo que le
|
|
16
|
+
* queda a un agente, la clave de una campaña, las categorías y las comprobaciones
|
|
17
|
+
* que se hacen ANTES de firmar para no gastar gas en algo que el contrato
|
|
18
|
+
* rechazaría. Lo que lee y firma está en client.ts.
|
|
19
|
+
*/
|
|
20
|
+
import { encodeAbiParameters, keccak256, toBytes } from 'viem';
|
|
21
|
+
/** Cómo se asigna un encargo. */
|
|
22
|
+
export var ModoTablon;
|
|
23
|
+
(function (ModoTablon) {
|
|
24
|
+
/** El primero que pasa las reglas se lo queda. */
|
|
25
|
+
ModoTablon[ModoTablon["Inmediato"] = 0] = "Inmediato";
|
|
26
|
+
/** Los agentes ofertan; elige el cliente o, si no, gana el nivel más alto. */
|
|
27
|
+
ModoTablon[ModoTablon["Seleccion"] = 1] = "Seleccion";
|
|
28
|
+
})(ModoTablon || (ModoTablon = {}));
|
|
29
|
+
export var EstadoTablon;
|
|
30
|
+
(function (EstadoTablon) {
|
|
31
|
+
EstadoTablon[EstadoTablon["Publicado"] = 0] = "Publicado";
|
|
32
|
+
EstadoTablon[EstadoTablon["Asignado"] = 1] = "Asignado";
|
|
33
|
+
EstadoTablon[EstadoTablon["Cerrado"] = 2] = "Cerrado";
|
|
34
|
+
EstadoTablon[EstadoTablon["Retirado"] = 3] = "Retirado";
|
|
35
|
+
EstadoTablon[EstadoTablon["Caducado"] = 4] = "Caducado";
|
|
36
|
+
})(EstadoTablon || (EstadoTablon = {}));
|
|
37
|
+
// Los límites del contrato (BOARD.md). Los que no se leen de él son internos
|
|
38
|
+
// allí para que quepa en 24.576 bytes; aquí se repiten para comprobar antes.
|
|
39
|
+
export const MIN_PLAZO_ENTREGA_S = 60 * 60;
|
|
40
|
+
export const MAX_VENTANA_ELECCION_S = 7 * 24 * 60 * 60;
|
|
41
|
+
export const MARGEN_ASIGNACION_S = 24 * 60 * 60;
|
|
42
|
+
export const MAX_CATEGORIAS = 3;
|
|
43
|
+
export const MAX_OFERTAS = 50;
|
|
44
|
+
/**
|
|
45
|
+
* La clave de una campaña: `keccak256(abi.encode(publicador, id))`. Cada
|
|
46
|
+
* campaña es de quien la publica (F4 en la revisión de seguridad), así que el
|
|
47
|
+
* mismo id en dos clientes son dos campañas. Con ella se leen `campaignCap` y
|
|
48
|
+
* `campaignTaken`.
|
|
49
|
+
*/
|
|
50
|
+
export function claveDeCampana(publicador, id) {
|
|
51
|
+
return keccak256(encodeAbiParameters([{ type: 'address' }, { type: 'bytes32' }], [publicador, id]));
|
|
52
|
+
}
|
|
53
|
+
/** El id de una campaña a partir de su nombre: «evento-octubre» → bytes32. */
|
|
54
|
+
export function idDeCampana(nombre) {
|
|
55
|
+
return keccak256(toBytes(nombre));
|
|
56
|
+
}
|
|
57
|
+
/** Las categorías de un agente a partir de su máscara (bit c = categoría c). */
|
|
58
|
+
export function categoriasDeMascara(mascara) {
|
|
59
|
+
const out = [];
|
|
60
|
+
for (let c = 0; c < 256 && mascara > 0n; c++, mascara >>= 1n) {
|
|
61
|
+
if (mascara & 1n)
|
|
62
|
+
out.push(c);
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
/** Decodifica lo que devuelve `getJob`. */
|
|
67
|
+
export function encargoDeLaCadena(id, j) {
|
|
68
|
+
return {
|
|
69
|
+
id,
|
|
70
|
+
cliente: j.client,
|
|
71
|
+
modo: Number(j.mode),
|
|
72
|
+
estado: Number(j.state),
|
|
73
|
+
categoria: Number(j.category),
|
|
74
|
+
soloConExperiencia: Boolean(j.experiencedOnly),
|
|
75
|
+
republicar: Boolean(j.relist),
|
|
76
|
+
repartoDado: Boolean(j.attested),
|
|
77
|
+
devolucionPendiente: Boolean(j.refundPending),
|
|
78
|
+
moneda: j.currency,
|
|
79
|
+
importe: j.amount,
|
|
80
|
+
taskHash: j.taskHash,
|
|
81
|
+
advertHash: j.advertHash,
|
|
82
|
+
campaignId: j.campaignId,
|
|
83
|
+
publicadoEn: Number(j.postedAt),
|
|
84
|
+
caducaEn: Number(j.expiresAt),
|
|
85
|
+
plazoEntregaS: Number(j.workDuration),
|
|
86
|
+
ventanaOfertasS: Number(j.applyWindow),
|
|
87
|
+
ventanaEleccionS: Number(j.chooseWindow),
|
|
88
|
+
repartoAgenteBps: Number(j.workerShareBps),
|
|
89
|
+
agente: j.agent,
|
|
90
|
+
escrowTaskId: j.escrowTaskId,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export function ofertaDeLaCadena(o) {
|
|
94
|
+
return {
|
|
95
|
+
agente: o.agent,
|
|
96
|
+
nivel: Number(o.level),
|
|
97
|
+
plazoEntregaS: Number(o.workDuration),
|
|
98
|
+
orden: o.seq,
|
|
99
|
+
precio: o.price,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Lo que le queda a un agente, con la misma cuenta que hace el contrato en
|
|
104
|
+
* `_check`. El contrato no lo da hecho: no cabía (BOARD.md §9).
|
|
105
|
+
*/
|
|
106
|
+
export function situacionDe(datos, ahoraS) {
|
|
107
|
+
const { nivel, cupoDiario, stats, encargosDeNovato } = datos;
|
|
108
|
+
const hoy = Math.floor(ahoraS / 86_400);
|
|
109
|
+
const cogidosHoy = stats.day === hoy ? stats.takenToday : 0;
|
|
110
|
+
const novatoLibres = Math.max(0, encargosDeNovato - stats.newcomerUsed);
|
|
111
|
+
const base = {
|
|
112
|
+
nivel,
|
|
113
|
+
cupoDiario,
|
|
114
|
+
cogidosHoy,
|
|
115
|
+
abiertos: stats.open,
|
|
116
|
+
novatoUsados: stats.newcomerUsed,
|
|
117
|
+
novatoLibres,
|
|
118
|
+
suspendidoHasta: stats.suspendedUntil > ahoraS ? stats.suspendedUntil : 0,
|
|
119
|
+
categorias: categoriasDeMascara(datos.mascara),
|
|
120
|
+
};
|
|
121
|
+
if (nivel === 0) {
|
|
122
|
+
// De uno en uno, y de los de novato.
|
|
123
|
+
const libre = stats.open === 0 && novatoLibres > 0 ? 1 : 0;
|
|
124
|
+
return { ...base, hoyLibres: libre, abiertosLibres: stats.open === 0 ? 1 : 0 };
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
...base,
|
|
128
|
+
hoyLibres: Math.max(0, cupoDiario - cogidosHoy),
|
|
129
|
+
abiertosLibres: Math.max(0, cupoDiario - stats.open),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Las comprobaciones de `post()` antes de firmar, con el motivo en claro.
|
|
134
|
+
* Devuelve `null` si pasa. No incluye los topes de la beta, que se leen del
|
|
135
|
+
* contrato porque la multisig los cambia.
|
|
136
|
+
*/
|
|
137
|
+
export function problemaAlPublicar(p) {
|
|
138
|
+
if (!p.encargo.trim())
|
|
139
|
+
return 'El encargo está vacío.';
|
|
140
|
+
if (!p.anuncio.trim())
|
|
141
|
+
return 'El anuncio está vacío: es lo único que se lee antes de coger.';
|
|
142
|
+
if (!Number.isInteger(p.categoria) || p.categoria < 0 || p.categoria > 255)
|
|
143
|
+
return 'La categoría es un número de 0 a 255.';
|
|
144
|
+
if (p.importe <= 0n)
|
|
145
|
+
return 'El importe tiene que ser mayor que cero.';
|
|
146
|
+
if (p.plazoEntregaS < MIN_PLAZO_ENTREGA_S)
|
|
147
|
+
return 'El plazo de entrega es de una hora como mínimo.';
|
|
148
|
+
if (p.caducaEnS <= 0)
|
|
149
|
+
return 'Tiene que caducar en el futuro.';
|
|
150
|
+
if (p.modo === ModoTablon.Seleccion) {
|
|
151
|
+
const ofertas = p.ventanaOfertasS ?? 0;
|
|
152
|
+
const eleccion = p.ventanaEleccionS ?? 0;
|
|
153
|
+
if (ofertas <= 0)
|
|
154
|
+
return 'En selección hace falta un tiempo para ofertar.';
|
|
155
|
+
if (eleccion > MAX_VENTANA_ELECCION_S)
|
|
156
|
+
return 'El cliente tiene 7 días como mucho para elegir.';
|
|
157
|
+
if (p.caducaEnS < ofertas + eleccion)
|
|
158
|
+
return 'Caduca antes de que acabe el tiempo de elegir.';
|
|
159
|
+
}
|
|
160
|
+
if (p.campana && (p.campana.topePorAgente < 1 || p.campana.topePorAgente > 255)) {
|
|
161
|
+
return 'El tope de una campaña es de 1 a 255 encargos por agente.';
|
|
162
|
+
}
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
/*
|
|
166
|
+
* Lo que se firma para el buzón (bot/src/buzon.ts). IDÉNTICO byte a byte a lo
|
|
167
|
+
* que comprueba él: una diferencia y toda firma sale inválida sin que nada
|
|
168
|
+
* diga por qué. Van por número de ENCARGO y dicen de qué tablón son: una firma
|
|
169
|
+
* de la tarea #7 del escrow no abre el encargo #7.
|
|
170
|
+
*
|
|
171
|
+
* El anuncio y el encargo NO se firman al dejarlos: PanalTablon guarda su
|
|
172
|
+
* keccak256 y el buzón solo acepta el texto que da ese hash.
|
|
173
|
+
*/
|
|
174
|
+
/** Su cliente o su agente leen el encargo. */
|
|
175
|
+
export function tablonEncargoSignMessage(jobId, expira) {
|
|
176
|
+
return `Panal tablón con reglas · encargo #${jobId.toString()} · ${expira}`;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Su agente deja la entrega. Lleva el keccak256 del texto dentro: la firma vale
|
|
180
|
+
* para ESA entrega, y nadie que la vea pasar puede dejar otra en su nombre.
|
|
181
|
+
*/
|
|
182
|
+
export function tablonEntregaSignMessage(jobId, resultHash, expira) {
|
|
183
|
+
return `Panal tablón con reglas · entrega #${jobId.toString()} · ${resultHash.toLowerCase()} · ${expira}`;
|
|
184
|
+
}
|
|
185
|
+
/** Su cliente se lleva la entrega. */
|
|
186
|
+
export function tablonResultadoSignMessage(jobId, expira) {
|
|
187
|
+
return `Panal tablón con reglas · resultado #${jobId.toString()} · ${expira}`;
|
|
188
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@panal/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.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,7 +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/currencies.test.ts && tsx test/x402.test.ts && tsx test/x402-server.test.ts && tsx test/envelope.test.ts && tsx test/files.test.ts && tsx test/attachments.test.ts && tsx test/llm.test.ts && tsx test/skill.test.ts && tsx test/agent-card.test.ts && tsx test/niveles.test.ts && tsx test/ejemplos.test.ts && tsx test/tablon.test.ts && tsx test/reserva.test.ts",
|
|
48
|
+
"test": "tsx test/sdk.test.ts && tsx test/currencies.test.ts && tsx test/x402.test.ts && tsx test/x402-server.test.ts && tsx test/envelope.test.ts && tsx test/files.test.ts && tsx test/attachments.test.ts && tsx test/llm.test.ts && tsx test/skill.test.ts && tsx test/agent-card.test.ts && tsx test/niveles.test.ts && tsx test/ejemplos.test.ts && tsx test/tablon.test.ts && tsx test/reserva.test.ts && tsx test/precios.test.ts && tsx test/tablon-reglas.test.ts",
|
|
49
49
|
"test:nombres": "tsx test/nombres.test.ts"
|
|
50
50
|
}
|
|
51
51
|
}
|