diff --git a/es/sdk/unity/onboard/recovering-sessions.mdx b/es/sdk/unity/onboard/recovering-sessions.mdx
new file mode 100644
index 00000000..6f3170f8
--- /dev/null
+++ b/es/sdk/unity/onboard/recovering-sessions.mdx
@@ -0,0 +1,120 @@
+---
+title: Recuperación segura de sesión
+description: El SDK ofrece la opción de almacenar la información de la wallet de sesión de forma segura en ciertas plataformas utilizando el almacenamiento seguro nativo.
+---
+
+# Recuperación de sesiones
+Por defecto, el SDK requerirá que los usuarios inicien sesión cada vez que la aplicación se cierre completamente. Esto se debe a que, por defecto, no guardamos la información de la wallet de sesión (por ejemplo, claves privadas) en ningún tipo de almacenamiento persistente para proteger la seguridad del usuario.
+
+Sin embargo, en ciertas plataformas, hemos integrado el almacenamiento seguro nativo de la plataforma.
+
+Si habilita `StoreSessionPrivateKeyInSecureStorage` en su ScriptableObject `SequenceConfig`, almacenaremos automáticamente la información de la wallet de sesión (en plataformas compatibles) y expondremos la opción de intentar recuperar la sesión en `SequenceLogin`. La `SequenceLoginWindow` predeterminada gestionará automáticamente este flujo de UI también (consulte [Autenticación](/sdk/unity/onboard/authentication/intro)). Si la plataforma no es compatible, esta opción no tendrá efecto.
+
+A continuación puede ver las plataformas compatibles y aprender sobre la solución de almacenamiento seguro de cada una; es importante entender los conceptos básicos de cómo funcionan estos sistemas y pensar cuidadosamente en las implicaciones de seguridad de almacenar claves privadas (o cualquier secreto) en almacenamiento persistente.
+
+## Integración
+Tiene dos opciones para recuperar una wallet desde el almacenamiento. La primera es usar la clase `EmbeddedWalletAdapter`. Si esta llamada tiene éxito, el `EmbeddedWalletAdapter` contendrá la instancia de Wallet.
+
+```csharp
+bool recovered = await EmbeddedWalletAdapter.GetInstance().TryRecoverWalletFromStorage();
+```
+
+De lo contrario, utilice la clase subyacente `SequenceLogin`.
+
+```csharp
+(bool storageEnabled, IWallet wallet) = await SequenceLogin.GetInstance().TryToRestoreSessionAsync();
+```
+
+En ambos casos, puede escuchar el evento `SequenceWallet.OnWalletCreated` cada vez que una wallet se recupere del almacenamiento o se cree durante el proceso de inicio de sesión.
+
+## Detalles de la plataforma
+
+### Editor
+En el editor, usamos PlayerPrefs para almacenar la clave privada. También deberá habilitar `EditorStoreSessionPrivateKeyInSecureStorage` en SequenceConfig para usar el almacenamiento seguro y recuperar sesiones dentro del editor. Esta bandera separada le facilita probar ambos flujos sin modificar el comportamiento de sus builds. El almacenamiento seguro en el editor es solo para fines de desarrollo y no debe considerarse seguro para almacenamiento a largo plazo.
+
+### iOS
+En iOS, utilizamos el [iOS Keychain](https://developer.apple.com/documentation/security/keychain_services?language=objc).
+
+### MacOS
+En MacOS, utilizamos el [MacOS Keychain](https://developer.apple.com/documentation/security/keychain_services?language=objc).
+
+### Windows
+En PCs con Windows, utilizamos la [Crypto: Next Generation - Data Protection API (CNG DPAPI)](https://learn.microsoft.com/en-us/windows/win32/seccng/cng-dpapi)
+
+### Web
+En compilaciones Web, utilizamos [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) a través de [PlayerPrefs](https://docs.unity3d.com/ScriptReference/PlayerPrefs.html).
+
+### Android
+En compilaciones Android, utilizamos el [Android Keystore](https://developer.android.com/privacy-and-security/keystore).
+
+El primer paso es importar el plugin `AndroidKeyBridge.java` en su carpeta Assets. Esto se hace fácilmente desde Samples en el package manager; simplemente importe el sample titulado `Android Secure Storage`.
+
+Nuestro plugin Keystore para Unity (incluido en el SDK) requiere una Plantilla Gradle Principal personalizada. Por favor, vaya a la configuración de su proyecto y, en `Player > Publishing Settings`, habilite `Custom Main Gradle Template`. Esto creará un archivo `Assets/Plugins/Android/mainTemplate.gradle` (o similar; el editor le mostrará la ruta) si aún no tiene uno. Aquí tiene un ejemplo de archivo `mainTemplate.gradle`; por favor, copie/pegue (o incorpore en su archivo existente).
+
+```
+apply plugin: 'com.android.library'
+**APPLY_PLUGINS**
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation 'androidx.security:security-crypto:1.1.0-alpha03'
+
+**DEPS**}
+
+android {
+ compileSdkVersion **APIVERSION**
+ buildToolsVersion '**BUILDTOOLS**'
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ defaultConfig {
+ minSdkVersion **MINSDKVERSION**
+ targetSdkVersion **TARGETSDKVERSION**
+ ndk {
+ abiFilters **ABIFILTERS**
+ }
+ versionCode **VERSIONCODE**
+ versionName '**VERSIONNAME**'
+ consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD**
+ }
+
+ lintOptions {
+ abortOnError false
+ }
+
+ aaptOptions {
+ noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ')
+ ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
+ }**PACKAGING_OPTIONS**
+}**REPOSITORIES**
+**IL_CPP_BUILD_SETUP**
+**SOURCE_BUILD_SETUP**
+**EXTERNAL_SOURCES**
+```
+
+Nuestro plugin Keystore también requiere una Plantilla de Propiedades Gradle personalizada. Nuevamente, vaya a la configuración de su proyecto y, en `Player > Publishing Settings`, habilite `Custom Gradle Properties Template`. Esto creará un archivo `Assets/Plugins/Android/gradleTemplate.properties` (o similar; el editor le mostrará la ruta) si aún no tiene uno. Aquí tiene un ejemplo de archivo `gradleTemplate.properties`; por favor, copie/pegue (o incorpore en su archivo existente).
+
+```
+org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M
+org.gradle.parallel=true
+android.enableJetifier=true
+android.useAndroidX=true
+unityStreamingAssets=**STREAMING_ASSETS**
+**ADDITIONAL_PROPERTIES**
+
+android.enableR8=**MINIFY_WITH_R_EIGHT**
+```
+
+## Solución de problemas
+Si tiene problemas con el almacenamiento seguro o Google Sign-In en Android, siga estos pasos de solución de problemas.
+- **Google Sign-In:** Asegúrese de que el valor `data android:scheme` en su archivo `AndroidManifest.xml` coincida con el `Url Scheme` en su archivo
+ `SequenceConfig.asset`. Verifique que esté todo en minúsculas.
+- **Almacenamiento seguro:** Asegúrese de que su `mainTemplate.gradle` defina correctamente el plugin `androidx.security:security-crypto` y que no sea
+ sobrescrito por otro plugin o por el Android Plugin Resolver.
+- **Pruebe nuestra demo:** [Instale nuestra build de demostración](https://drive.google.com/file/d/1rAvnPu56Hj3yDRL32_lr887xt-xMQoYK/view?usp=sharing)
+ y asegúrese de que funcione correctamente en su dispositivo.
+ - Compare la configuración de su proyecto Unity (AndroidManifest, archivos gradle, configuración del reproductor de Android) con nuestro [proyecto sdk.](https://github.com/0xsequence/sequence-unity)
+- **Ideas adicionales:** Desinstale la app antes de instalar una nueva build, cambie su esquema de URL o el bundle id.
\ No newline at end of file
diff --git a/es/sdk/unity/onboard/session-management.mdx b/es/sdk/unity/onboard/session-management.mdx
index bc557c70..d2b2f6e4 100644
--- a/es/sdk/unity/onboard/session-management.mdx
+++ b/es/sdk/unity/onboard/session-management.mdx
@@ -1,5 +1,5 @@
---
-title: Gestión de sesiones en Unity — Documentación de Sequence
+title: Gestión de Sesiones
---
Una vez que haya autenticado a su usuario con las APIs de Sequence y establecido una sesión, tiene disponibles varios métodos para gestionar la sesión.
diff --git a/es/sdk/unity/power/advanced/contracts.mdx b/es/sdk/unity/power/advanced/contracts.mdx
new file mode 100644
index 00000000..4d91c64a
--- /dev/null
+++ b/es/sdk/unity/power/advanced/contracts.mdx
@@ -0,0 +1,156 @@
+---
+title: Smart Contracts
+---
+
+Crear un objeto `Contract` para un contrato ya desplegado es bastante sencillo.
+
+```csharp
+Contract contract = new Contract(contractAddress, abi);
+```
+
+Aunque no es estrictamente necesario, se recomienda encarecidamente proporcionar el ABI del contrato como una cadena al crear un objeto contract. Si no lo hace, no podrá aprovechar completamente nuestra codificación y decodificación ABI.
+Si decide seguir este camino, deberá proporcionar la firma completa de la función (nombre de la función + tipos de parámetros entre paréntesis - por ejemplo, transfer(address,uint256) para el método transfer de ERC20) al llamar a una función o consultar el contrato, y solo recibirá una cadena como respuesta a las consultas.
+
+## Llamar funciones de Smart Contract
+Para llamar a un smart contract, usará el método `CallFunction` para crear un objeto `CallContractFunction`, que determinará el gasPrice, gasLimit, nonce y data apropiados para incluir en un nuevo `EthTransaction` al proporcionarle un cliente y un objeto `ContractCall` al método `Create` async Task
+
+Un ejemplo de cómo llamar a un smart contract sería el siguiente:
+
+```csharp
+Contract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case
+TransactionReceipt receipt = await erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger).SendTransactionMethodAndWaitForReceipt(wallet, client);
+```
+
+Nota: si no desea esperar el recibo, puede usar `SendTransactionMethod` en su lugar.
+
+Alternativamente, si solo quiere crear el `EthTransaction` y enviarlo más tarde, puede usar directamente el objeto `CallContractFunction` de `CallFunction`.
+
+```csharp
+Contract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case
+EthTransaction transaction = await erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger).Create(client, new ContractCall(wallet.GetAddress()));
+TransactionReceipt receipt = await wallet.SendTransactionAndWaitForReceipt(client, transaction);
+
+// or
+CallContractFunction transactionCreator = erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger);
+EthTransaction transaction = await transactionCreator.Create(client, new ContractCall(wallet.GetAddress()));
+TransactionReceipt receipt = await wallet.SendTransactionAndWaitForReceipt(client, transaction);
+
+// or
+CallContractFunction transactionCreator = erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger);
+TransactionReceipt receipt = await transactionCreator.SendTransactionMethodAndWaitForReceipt(wallet, client);
+```
+
+Notará que el método `CallFunction` acepta un número arbitrario de argumentos. Debe proporcionar los argumentos en el orden en que aparecen en el ABI/firma de la función.
+
+## Comprendiendo los mapeos de tipos de datos
+Al interactuar con smart contracts, es importante entender cómo los tipos de datos de EVM se mapean a los tipos de datos de C# en la librería SequenceEthereum.
+
+Por ejemplo, si proporciona una cadena donde el ABI espera un entero, recibirá una excepción, incluso si esa cadena podría convertirse en un entero.
+
+### Address
+En C# puede usar un tipo `string` o crear una instancia de `Address`. Asegúrese de que su cadena sea hexadecimal,
+comience con `0x` y tenga una longitud fija de 42 caracteres.
+
+```csharp
+Address address = new Address("0x123...");
+```
+
+### Enteros
+Para tipos de enteros como `int256`, `uint8` o `uint256` use el tipo `BigInteger` de System.Numerics.
+
+```csharp
+// Simple number
+BigInteger number = new BigInteger(10000);
+
+// From hex
+string hexString = "0x0000000...01";
+BigInteger number = hexString.HexStringToBigInteger();
+```
+
+### Bytes
+Para definir tipos de datos byte de Solidity en C#, tiene la opción de crear un `FixedByte` para tipos como `byte16` o `byte32`.
+Cuando su contrato requiera `bytes`, puede convertir cualquier valor en un `byte[]` de cualquier longitud.
+
+Si sus datos están representados como una cadena hexadecimal en C#, asegúrese de usar nuestra función `HexStringToByteArray()` para convertir
+el valor hexadecimal de vuelta al arreglo de bytes original.
+
+Para arreglos de bytes como `byte32[]`, simplemente cree un `FixedByte[]` en C#.
+
+```csharp
+// byte16 or byte32
+new FixedByte(16, new byte[] {});
+
+// bytes
+string someString = "abc0123456789";
+byte[] bytes = someString.ToByteArray();
+
+// signature
+string signature = "0x0ab123...";
+byte[] bytes = signature.HexStringToByteArray();
+```
+
+### Structs
+Use Tuples para llamar una función on-chain con un struct. Aquí hay un ejemplo de un struct en Solidity y cómo definirlo
+usando el SDK de Unity de Sequence y pasarlo como argumento en una función `Contract.CallFunction`.
+
+Struct de Solidity
+
+```solidity
+struct ExampleStruct {
+ address wallet;
+ uint256 amount;
+ byte32 data;
+}
+```
+
+Equivalente en C#
+
+```csharp
+Address wallet = new Address("0x...");
+BigInteger amount = new BigInteger(10000);
+FixedByte data = new FixedByte(32, byteArrayData);
+var arg = new Tuple
(wallet, amount, data);
+```
+
+### Otros tipos
+Para tipos de datos tradicionales en Solidity como `string` o `bool`, puede usar los mismos tipos de datos en C#.
+
+### Tipos de retorno
+Cuando lea datos de un smart contract y utilice la función `Contract.SendQuery()`, puede usar TType para tipos de retorno simples como `string`, `BigInteger` o `bool`. Para tipos de retorno complejos como structs, use un `object[]` y analice manualmente los valores en su struct de C#.
+
+```csharp
+// Let's consider a struct with the following variables: SomeStruct { address value1; uint256 value2; }
+object[] structValues = Contract.SendQuery