Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

nested Timepoint/Duration in struct args rejected by from_json

Abierto Apto para principiantes
#2,753 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 2 días

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
75/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
rust
Área
cli

Línea de trabajo

El problema está en cmd/crates/soroban-spec-tools/src/lib.rs. Consulta la función from_json alrededor de la línea 328 y la función from_json_primitives alrededor de la línea 937. La corrección consiste en añadir ScType::Timepoint y ScType::Duration a la rama match que dirige a primitives y, luego, asegurarse de que produzcan la variante ScVal correcta (ScVal::Timepoint y ScVal::Duration) en lugar de ScVal::U64. Para probarlo, compila la CLI y ejecuta el comando de reproducción proporcionado.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Problem

When a contract function takes a struct with a `Timepoint` or `Duration` field, `stellar contract invoke` fails to parse the JSON argument. Top-level Timepoint/Duration args work fine.

Root cause

Two bugs in `cmd/crates/soroban-spec-tools/src/lib.rs`:

1. `from_json` does not route Timepoint/Duration to primitive parsing

The match arm at line ~328 that dispatches to `from_json_primitives` lists:
`Bool, U128, I128, U256, I256, I32, I64, U32, U64, String, Symbol, Address, MuxedAddress, Bytes, BytesN`

`Timepoint` and `Duration` are missing. When a struct field has type `Timepoint`, `parse_strukt` calls `from_json(Value::Number(1234), ScType::Timepoint)`. Since Timepoint is not in the list, it falls through to the serde catch-all which tries to deserialize a bare JSON number as `ScVal` -- this fails because `ScVal` expects tagged format (`{"timepoint": 1234}`).

Top-level args work because `from_string` pre-wraps the value as `{"timepoint": "value"}` before calling `from_json`.

2. `from_json_primitives` constructs `ScVal::U64` instead of `ScVal::Timepoint`

Line ~937:
```rust
(ScType::U64 | ScType::Timepoint | ScType::Duration, Value::Number(n)) => ScVal::U64(...)
```

This produces `ScVal::U64` for all three types. The Soroban VM distinguishes `SCV_U64` from `SCV_TIMEPOINT` and `SCV_DURATION` -- passing the wrong discriminant causes a host argument type mismatch at runtime.

Reproduce

Contract:
```rust
#[contracttype]
pub struct TimedAction {
pub deadline: Timepoint,
pub name: Symbol,
}

pub fn schedule(env: Env, action: TimedAction) -> TimedAction { action }
```

Invoke:
```
stellar contract invoke --id -- schedule --action '{"deadline": 1760501234, "name": "test"}'
```

Fails with a serde deserialization error on the `deadline` field.

Fix
  1. Add `| ScType::Timepoint | ScType::Duration` to the `from_json` primitives routing arm
  2. Split the `from_json_primitives` match so Timepoint produces `ScVal::Timepoint(TimePoint(...))` and Duration produces `ScVal::Duration(Duration(...))`
Lenguaje dominante
Rust
Estrellas
123
Forks
147
Merge medio
3 d 11 h
PR fusionados (30 d)
39

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de stellar/stellar-cli

Todos los issues de stellar/stellar-cli

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.