# User Smart Contract

Este contrato almacena dos cosas diferentes:

### Data del usuario

Esta es una forma on-chain de almacenar información básica del usuario (nombre, biografía, redes sociales, foto). No es obligatorio, es solo otra opción. El usuario puede optar por usar diferentes fuentes para mostrar su información (es decir, ENS, NFTs, LinkedIn u otras fuentes on-chain u off-chain).

#### Estructura

```solidity
struct UserInfo {
    address user;
    string name;
    string bio;
    string[] networkLinks;
    string profilePicture;
    string moreInfoLink;
}  
```

Ejemplo:

```json
{
  "user": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
  "name": "John Doe",
  "bio": "I am a developer with 5 years of experience...",
  "networkLinks": [
    "twitter.com/johndoe",
    "linkedin.com/in/johndoe"
  ],
  "profilePicture": "https://i.pravatar.cc/300",
  "moreInfoLink": "ipfs://ipfs.io/XXXXXXX"
}
```

### Permisos

Los permisos son una herramienta que permite al usuario delegar en un operador la capacidad de registrar un registro en su nombre. Esto es necesario si el usuario desea utilizar la [API de Prutopia](/arquitectura/api.md) o eventualmente otra herramienta de terceros.

#### Tipos

Hay dos tipos de permisos: Generales y de Experiencia. Los primeros son permisos relativos a acciones generales y los segundos son permisos relativos a una experiencia específica.

#### Estructura

````solidity
```solidity
struct GeneralPermission {
    bool updateInfo;
    bool addExperience;
    bool editExperience;
    bool endExperience;
    bool deleteExperience;
    bool addCompanyValidation;
    bool updateWorkRecordValidation;
    bool usePlatformAddress;
    bool total;
}
```
````

Cada nombre de permiso describe la acción que se permite ejecutar por el operador. El usuario puede optar por configurar permisos "totales", que actúan como superpermisos para todas las operaciones.

````solidity
```solidity
struct ExperiencePermission {
    bool addWorkRecord;
    bool editWorkRecord;
    bool endWorkRecord;
    bool deleteWorkRecord;
    bool cancelWorkRecord;
}
```
````

Los Experience Permission (Permisos de Experiencia) se utilizan para las experiencias como freelancer y permiten realizar funciones de Work Record (registro de trabajo) para un Experience (Experiencia) específico. Para entenderlo mejor, imagina a un usuario que realiza trabajos regulares en una plataforma de servicios freelance y desea permitir que esa plataforma registre esos servicios, pero específicamente para esa experiencia y no para otra.

### Funciones

**updateInfo:** Utilizado para insertar/actualizar su perfil.

**updateGeneralPermissions:** Utilizado para actualizar los GeneralPermission (Permisos Generales).

**updateGeneralPermissionsWithSig:** Utilizados para actualizar GeneralPermission con firma del usuario. Esto habilita al usuario a configurar GeneralPermission delegando la transacción de la blockchain a una tercera parte.

**updateExperiencePermissions:** Utilizado para actualizar ExperiencePermissions.

**updateExperiencePermissionsWithSig:** Utilizado para actualizar ExperiencePermissions con firma del usuario. Esto habilita a los usuarios a configurar Experience Permissions delegando la transacción de la blockchain a una tercera parte.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://documentacion.prutopia.io/arquitectura/protocolo/user-smart-contract.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
