Skip to content

Commit e5847ac

Browse files
Docs: explicit session permissions deep dive + token directory + fee options (#215)
* Docs: add permissions deep dive + token directory + fee option clarification * chore(i18n): update translations [en] Sync file structure, format locales. Branch: 215/merge --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent fe14baf commit e5847ac

12 files changed

Lines changed: 722 additions & 67 deletions

File tree

es/sdk/web/wallet-sdk/ecosystem/getting-started.mdx

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ Primero, asegúrese de haber creado una cuenta de Sequence Project. Si aún no t
1515
<Steps>
1616
<Step title="Instale las librerías requeridas">
1717
```bash
18-
npm install @0xsequence/connect@v6-beta wagmi viem
18+
npm install @0xsequence/connect@v6-beta wagmi viem
1919
# or
20-
pnpm install @0xsequence/connect@v6-beta wagmi viem
20+
pnpm install @0xsequence/connect@v6-beta wagmi viem
2121
# or
22-
yarn add @0xsequence/connect@v6-beta wagmi viem
22+
yarn add @0xsequence/connect@v6-beta wagmi viem
2323
```
2424
</Step>
2525

@@ -36,17 +36,17 @@ Primero, asegúrese de haber creado una cuenta de Sequence Project. Si aún no t
3636
- `dappOrigin`
3737
- `signIn.projectName`, `appName`
3838
- `chainIds`, `defaultChainId`
39-
- `explicitSessionParams` (opcional; `nativeTokenSpending` por defecto es `valueLimit: 0`)
39+
- `explicitSession` (opcional; solicita permisos y límites explícitos de sesión)
4040
- `includeFeeOptionPermissions`, `enableImplicitSession`
4141
- `nodesUrl`, `relayerUrl`
4242
- `walletConnect`
4343

4444
```typescript [config.ts]
45-
import { createConfig } from "@0xsequence/connect";
45+
import { createConfig, createExplicitSession } from "@0xsequence/connect";
4646

4747
export const config: any = createConfig({
4848
projectAccessKey: "AQAAAAAAAABtDHG1It7lxRF_9bbxw4diip8",
49-
walletUrl: 'https://next-acme-wallet.sequence-dev.app',
49+
walletUrl: 'https://acme-wallet.ecosystem-demo.xyz',
5050
// Optional
5151
dappOrigin: window.location.origin,
5252
signIn: {
@@ -58,18 +58,29 @@ Primero, asegúrese de haber creado una cuenta de Sequence Project. Si aún no t
5858
google: true,
5959
apple: true,
6060
email: true,
61-
explicitSessionParams: { ... }
61+
explicitSession: createExplicitSession({ ... })
6262
});
6363
```
6464

65-
El `walletUrl` es la URL del Ecosystem Wallet que su dApp usará. Para nuestra demo, estamos usando el [Acme Ecosystem Wallet](https://next-acme-wallet.sequence-dev.app).
65+
El `walletUrl` es la URL del Ecosystem Wallet que su dApp utilizará. Para nuestra demostración, estamos usando el [Acme Ecosystem Wallet](https://acme-wallet.ecosystem-demo.xyz).
6666

6767
El `dappOrigin` es el origen de su dapp, usado para verificar de dónde proviene el usuario.
6868

69-
El objeto `explicitSessionParams` permite que su dapp solicite permisos específicos al usuario al conectarse.
70-
Estos permisos pueden autorizar a su dapp a realizar ciertas acciones en nombre del usuario durante un período definido, creando una experiencia más fluida sin solicitudes de transacción o permitiendo automatizaciones.
69+
El objeto `explicitSession` permite que su dapp solicite permisos específicos al usuario al conectarse.
70+
Estos permisos pueden autorizar a su dapp a realizar ciertas acciones en nombre del usuario durante un período definido, creando una experiencia más fluida sin avisos de transacción o permitiendo automatizaciones.
71+
72+
Ver: [Análisis profundo de permisos](/sdk/web/wallet-sdk/ecosystem/permissions-deep-dive) y [Directorio de tokens](/sdk/web/wallet-sdk/ecosystem/token-directory).
73+
74+
### Comportamiento de las opciones de comisión (importante)
75+
76+
Cuando su aplicación envía transacciones mediante el relayer de Sequence, este necesita determinar **cómo se pagan las comisiones**.
77+
78+
- Si desea que el SDK solicite automáticamente los permisos necesarios relacionados con comisiones al crear una sesión explícita, active `includeFeeOptionPermissions`.
79+
- Si lo desactiva, usted es responsable de incluir los permisos relacionados con comisiones que requiera la opción de comisión que espera usar.
80+
81+
Si no se puede cubrir el pago de la comisión, las transacciones pueden fallar al momento de enviarse, incluso si el permiso principal de llamada al contrato parece correcto.
7182

72-
`nativeTokenSpending` es opcional. Si se omite, la sesión tendrá por defecto un `valueLimit` de token nativo de `0`.
83+
`nativeTokenSpending` es opcional. Si se omite, la sesión no tendrá asignado un límite de gasto de tokens nativos.
7384

7485
Por ejemplo, creemos una sesión explícita que permita a su dapp `depositar 100 USDC en el pool de AAVE V3 en Arbitrum, en nombre del usuario durante las próximas 24 horas`
7586

@@ -82,7 +93,7 @@ Primero, asegúrese de haber creado una cuenta de Sequence Project. Si aún no t
8293

8394
export const config: any = createConfig({
8495
projectAccessKey: "AQAAAAAAAABtDHG1It7lxRF_9bbxw4diip8",
85-
walletUrl: 'https://next-acme-wallet.sequence-dev.app',
96+
walletUrl: 'https://acme-wallet.ecosystem-demo.xyz',
8697
// Optional
8798
dappOrigin: window.location.origin,
8899
signIn: {
@@ -94,7 +105,7 @@ Primero, asegúrese de haber creado una cuenta de Sequence Project. Si aún no t
94105
google: true,
95106
apple: true,
96107
email: true,
97-
explicitSessionParams: {
108+
explicitSession: createExplicitSession({
98109
chainId: 42161,
99110
nativeTokenSpending: {
100111
valueLimit: parseEther('0.01'), // Allow spending up to 0.01 ETH for gas fees
@@ -123,7 +134,7 @@ Primero, asegúrese de haber creado una cuenta de Sequence Project. Si aún no t
123134
]
124135
})
125136
]
126-
}
137+
})
127138
});
128139
```
129140

@@ -213,39 +224,39 @@ Primero, asegúrese de haber creado una cuenta de Sequence Project. Si aún no t
213224
- `dappOrigin`
214225
- `signIn.projectName`, `appName`
215226
- `chainIds`, `defaultChainId`
216-
- `explicitSessionParams` (opcional; `nativeTokenSpending` por defecto es `valueLimit: 0`)
227+
- `explicitSession` (opcional; solicita permisos y límites explícitos de sesión)
217228
- `includeFeeOptionPermissions`, `enableImplicitSession`
218229
- `nodesUrl`, `relayerUrl`
219230
- `walletConnect`
220231

221232
```typescript [config.ts]
222-
import { createConfig } from "@0xsequence/connect";
233+
import { createConfig, createExplicitSession } from "@0xsequence/connect";
223234

224235
export const config: any = createConfig({
225236
projectAccessKey: "AQAAAAAAAABtDHG1It7lxRF_9bbxw4diip8",
226237
signIn: {
227238
projectName: 'Sequence Web SDK Demo',
228239
},
229-
walletUrl: 'https://next-acme-wallet.sequence-dev.app',
240+
walletUrl: 'https://acme-wallet.ecosystem-demo.xyz',
230241
dappOrigin: window.location.origin,
231242
appName: 'Sequence Web SDK Demo',
232243
chainIds: [42161],
233244
defaultChainId: 42161,
234245
google: true,
235246
apple: true,
236247
email: true,
237-
explicitSessionParams: { ... }
248+
explicitSession: createExplicitSession({ ... })
238249
});
239250
```
240251

241-
El `walletUrl` es la URL del Ecosystem Wallet que su dApp usará. Para nuestra demo, estamos usando el [Acme Ecosystem Wallet](https://next-acme-wallet.sequence-dev.app).
252+
El `walletUrl` es la URL del Ecosystem Wallet que su dApp utilizará. Para nuestra demostración, estamos usando el [Acme Ecosystem Wallet](https://acme-wallet.ecosystem-demo.xyz).
242253

243254
El `dappOrigin` es el origen de su dapp, usado para verificar de dónde proviene el usuario.
244255

245-
El objeto `explicitSessionParams` permite que su dapp solicite permisos específicos al usuario al conectarse.
246-
Estos permisos pueden autorizar a su dapp a realizar ciertas acciones en nombre del usuario durante un período definido, creando una experiencia más fluida sin solicitudes de transacción.
256+
El objeto `explicitSession` permite que su dapp solicite permisos específicos al usuario al conectarse.
257+
Estos permisos pueden autorizar a su dapp a realizar ciertas acciones en nombre del usuario por un periodo definido, creando una experiencia más fluida sin ventanas emergentes de transacción.
247258

248-
`nativeTokenSpending` es opcional. Si se omite, la sesión tendrá por defecto un `valueLimit` de token nativo de `0`.
259+
`nativeTokenSpending` es opcional. Si se omite, la sesión no tendrá asignado un límite de gasto de tokens nativos.
249260

250261
Por ejemplo, creemos una sesión explícita que permita a su dapp `depositar 100 USDC en el pool de AAVE V3 en Arbitrum, en nombre del usuario durante las próximas 24 horas`
251262

@@ -261,15 +272,15 @@ Primero, asegúrese de haber creado una cuenta de Sequence Project. Si aún no t
261272
signIn: {
262273
projectName: 'Sequence Web SDK Demo',
263274
},
264-
walletUrl: 'https://next-acme-wallet.sequence-dev.app',
275+
walletUrl: 'https://acme-wallet.ecosystem-demo.xyz',
265276
dappOrigin: window.location.origin,
266277
appName: 'Sequence Web SDK Demo',
267278
chainIds: [42161],
268279
defaultChainId: 42161,
269280
google: true,
270281
apple: true,
271282
email: true,
272-
explicitSessionParams: {
283+
explicitSession: createExplicitSession({
273284
chainId: 42161,
274285
nativeTokenSpending: {
275286
valueLimit: parseEther('0.01'), // Allow spending up to 0.01 ETH for gas fees
@@ -298,7 +309,7 @@ Primero, asegúrese de haber creado una cuenta de Sequence Project. Si aún no t
298309
]
299310
})
300311
]
301-
}
312+
})
302313
});
303314
```
304315

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
---
2+
description: Guía práctica para construir permisos de sesión explícitos para Ecosystem Wallet (Web SDK)
3+
sidebarTitle: Análisis profundo de permisos
4+
---
5+
6+
Esta página recopila orientación práctica y errores comunes al construir **permisos de sesión explícitos** para Ecosystem Wallet (Web SDK / `@0xsequence/connect`).
7+
8+
Si aún no ha configurado Connect, comience con [Primeros pasos](/sdk/web/wallet-sdk/ecosystem/getting-started).
9+
10+
---
11+
12+
## Modelo mental
13+
Una sesión explícita es una _concesión de autoridad limitada_:
14+
- **Alcance:** qué llamadas están permitidas (destinos + firmas de función + reglas de parámetros)
15+
- **Presupuesto:** cuánto valor puede moverse (límite de gasto nativo, límites ERC20)
16+
- **Tiempo:** ventana de expiración
17+
18+
Cuando solicita una sesión explícita, el usuario aprueba ese conjunto de permisos en la interfaz de la wallet. Después de la aprobación, su dApp (o una automatización del lado del servidor, según su arquitectura) puede ejecutar transacciones dentro de esos límites sin solicitar repetidamente la aprobación del usuario.
19+
20+
---
21+
22+
## Patrones para construir permisos
23+
24+
### 1) Permisos específicos por destino (recomendado cuando sea posible)
25+
Si su caso de uso tiene un contrato de destino conocido (por ejemplo, “depositar en un pool de Aave”, “mintear desde este contrato NFT”), prefiera un permiso restringido con:
26+
- una sola `address`
27+
- una `functionSignature` concreta
28+
- reglas de parámetros
29+
30+
Este es el método más seguro y fácil de razonar.
31+
32+
### 2) Transferencias a destinatarios abiertos (requiere una construcción diferente)
33+
Si su experiencia de usuario es “enviar tokens a **cualquier** destinatario” (por ejemplo, una app de wallet), está otorgando una autoridad más amplia.
34+
35+
**Recomendación:**
36+
- Para **transferencias ERC20** abiertas, el enfoque estándar es permitir el contrato de token `transfer(address to, uint256 value)` con una regla de **límite de valor** (y _sin_ regla `to=EQUAL`).
37+
- Para **envíos de tokens nativos** abiertos, use un patrón de **forwarder**. En configuraciones de wallet Sequence, un enfoque común es otorgar permiso de destino al `ValueForwarder` de la cadena y enviar tokens nativos mediante una llamada forward.
38+
39+
> Si su dApp no necesita destinatarios abiertos, no los otorgue.
40+
41+
---
42+
43+
## Opciones de comisión y por qué importan (comportamiento de envío)
44+
Al enviar una transacción mediante el relay de Sequence, se selecciona una **opción de comisión** para pagar la ejecución.
45+
46+
### Comportamientos clave
47+
48+
- Si su aplicación depende de transacciones relayed, el relayer debe poder determinar _cómo se pagan las comisiones_.
49+
- En la práctica, su aplicación debe hacer una de las siguientes:
50+
- activar la inclusión automática de permisos de comisión (ver `includeFeeOptionPermissions`), o
51+
- incluir explícitamente los permisos necesarios relacionados con comisiones en la sesión.
52+
53+
### Error común
54+
Los desarrolladores suelen construir un permiso de llamada válido (por ejemplo, ERC20 `transfer`) pero omiten los permisos relacionados con comisiones. La transacción puede fallar al enviarse porque el relayer no puede seleccionar una vía válida de pago de comisión.
55+
56+
**Recomendación:** para la mayoría de las dApps, active `includeFeeOptionPermissions` a menos que tenga una razón para controlar completamente la forma de los permisos de comisión.
57+
58+
---
59+
60+
## Depuración de bajo nivel con `@0xsequence/dapp-client-cli`
61+
El Web SDK abstrae gran parte de la maquinaria subyacente. Cuando necesite depurar "¿qué está haciendo el relayer?", la CLI puede ser una herramienta útil.
62+
63+
### Flujos de trabajo útiles
64+
65+
1. **Inspeccionar opciones de comisión** para un paquete de transacciones:
66+
67+
```bash
68+
npx @0xsequence/dapp-client-cli fee-options \
69+
--chain-id <chainId> \
70+
--transactions '<json array of {to,data,value}>'
71+
```
72+
73+
2. **Enviar una transacción** con una opción de comisión elegida explícitamente:
74+
75+
```bash
76+
npx @0xsequence/dapp-client-cli send-transaction \
77+
--chain-id <chainId> \
78+
--transactions '<json array of {to,data,value}>' \
79+
--fee-option '<json object from fee-options>'
80+
```
81+
82+
3. **Comparar el conjunto de permisos** que solicitó versus las llamadas que intenta realizar.
83+
84+
Consejo: comience con un conjunto de permisos específicos por destino y amplíe el alcance según sea necesario.
85+
86+
---
87+
88+
## Lecturas recomendadas
89+
90+
- [Resolución de direcciones de tokens con el Sequence Token Directory](/sdk/web/wallet-sdk/ecosystem/token-directory)
91+
- [Primeros pasos](/sdk/web/wallet-sdk/ecosystem/getting-started)
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
---
2+
description: Resuelva direcciones y decimales de tokens por cadena usando el Sequence Token Directory
3+
sidebarTitle: Directorio de Tokens
4+
---
5+
6+
Cuando un usuario dice “enviar **USDC en Base**” necesita mapear:
7+
- `(chainId, symbol)``tokenAddress`
8+
- `symbol``decimals` (para `parseUnits`)
9+
10+
Sequence mantiene un registro validado y multichain de tokens: **Sequence Token Directory**:
11+
- Repositorio: [https://github.com/0xsequence/token-directory](https://github.com/0xsequence/token-directory)
12+
- Índice: `index/index.json`
13+
- Lista ERC20 por cadena: `index/<chainName>/erc20.json`
14+
15+
Esta página muestra una implementación mínima y amigable con el caché.
16+
17+
---
18+
19+
## Modelo de datos
20+
21+
### 1) Cargue el índice maestro
22+
Obtener:
23+
- `https://raw.githubusercontent.com/0xsequence/token-directory/main/index/index.json`
24+
25+
Este archivo le indica qué carpetas de cadenas existen e incluye hashes de contenido.
26+
27+
### 2) Elija la carpeta de la cadena y obtenga la lista ERC20
28+
Obtener:
29+
- `https://raw.githubusercontent.com/0xsequence/token-directory/main/index/<chainName>/erc20.json`
30+
31+
Esta lista sigue el esquema de listas de tokens de Uniswap (los tokens incluyen `address`, `symbol`, `decimals`, etc.).
32+
33+
---
34+
35+
## Ejemplo en Node.js (con caché)
36+
37+
```ts
38+
import fs from 'node:fs'
39+
import os from 'node:os'
40+
import path from 'node:path'
41+
42+
const BASE = 'https://raw.githubusercontent.com/0xsequence/token-directory/main'
43+
44+
function cacheDir() {
45+
return path.join(os.homedir(), '.cache', 'sequence-token-directory')
46+
}
47+
48+
async function fetchJson(url: string) {
49+
const res = await fetch(url)
50+
if (!res.ok) throw new Error(`fetch failed: ${res.status} ${url}`)
51+
return res.json()
52+
}
53+
54+
export async function resolveErc20BySymbol(chainId: number, symbol: string) {
55+
const indexUrl = `${BASE}/index/index.json`
56+
const index = await fetchJson(indexUrl)
57+
58+
// Find chain folder by chainId
59+
let chainName: string | null = null
60+
let sha256: string | null = null
61+
62+
for (const [name, meta] of Object.entries<any>(index.index)) {
63+
if (name === '_external') continue
64+
if (String(meta?.chainId) !== String(chainId)) continue
65+
chainName = name
66+
sha256 = meta?.tokenLists?.['erc20.json'] || null
67+
break
68+
}
69+
70+
if (!chainName || !sha256) throw new Error(`No ERC20 list for chainId=${chainId}`)
71+
72+
// Cache per-chain list by hash
73+
const fp = path.join(cacheDir(), `${chainId}.erc20.${String(sha256).slice(0, 12)}.json`)
74+
if (fs.existsSync(fp)) {
75+
const cached = JSON.parse(fs.readFileSync(fp, 'utf8'))
76+
return cached.tokens.find((t: any) => String(t.symbol).toUpperCase() === symbol.toUpperCase()) || null
77+
}
78+
79+
const listUrl = `${BASE}/index/${chainName}/erc20.json`
80+
const list = await fetchJson(listUrl)
81+
82+
fs.mkdirSync(path.dirname(fp), { recursive: true })
83+
fs.writeFileSync(fp, JSON.stringify(list), 'utf8')
84+
85+
return list.tokens.find((t: any) => String(t.symbol).toUpperCase() === symbol.toUpperCase()) || null
86+
}
87+
```
88+
89+
---
90+
91+
## Cómo usarlo en permisos
92+
Una vez que resuelva:
93+
- `token.address`
94+
- `token.decimals`
95+
96+
Puede:
97+
- construir un permiso para `transfer(address to, uint256 value)`
98+
- construir una interfaz que acepte símbolos en lugar de direcciones
99+
100+
Ejemplo de regla de permiso (ERC20):
101+
- permitir `transfer(to=ANY, value<=limit)` usando una regla de límite de valor
102+
103+
---
104+
105+
## Dónde se referencia esto
106+
107+
- [Análisis profundo de permisos](/sdk/web/wallet-sdk/ecosystem/permissions-deep-dive)
108+
- [Primeros pasos](/sdk/web/wallet-sdk/ecosystem/getting-started)

es/solutions/wallets/developers/ecosystem-wallet/react_quickstart.mdx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ El Sequence SDK ahora es una dependencia en su proyecto, listo para usarse.
2727
## 🔗 Paso 3: Integre con su app React
2828
Finalmente, envuelva su aplicación con nuestro proveedor de wallet. Esto hace que todas las funciones de conexión estén disponibles para cualquier componente dentro de su dApp.
2929

30-
También estamos creando una sesión que solicita permiso para gastar hasta 100 tokens en nombre del usuario, lo que abre la puerta a automatizaciones y mejoras en la experiencia de usuario.
30+
También estamos creando una sesión explícita que solicita permiso para gastar hasta 100 tokens en nombre del usuario, abriendo la puerta a automatizaciones y mejoras de experiencia de usuario.
31+
32+
Ver: [Análisis profundo de permisos](/sdk/web/wallet-sdk/ecosystem/permissions-deep-dive) y [Directorio de tokens](/sdk/web/wallet-sdk/ecosystem/token-directory).
3133

3234
```tsx
3335
import { SequenceConnect, createConfig, createContractPermission, createExplicitSession, useOpenConnectModal, type SequenceConnectConfig } from "@0xsequence/connect";

0 commit comments

Comments
 (0)