# SDK: ix-mapper GLAM vaults execute DeFi operations through integration programs that enforce access control and policy checks. This SDK transforms standard Solana instructions into their GLAM-proxied equivalents by remapping accounts and instruction discriminators according to predefined mapping configurations. ## Installation ```bash npm install @glamsystems/ix-mapper ``` ## Usage ```typescript import { PublicKey, SystemProgram } from "@solana/web3.js"; import { getVaultPda, mapToGlamIx } from "@glamsystems/ix-mapper"; // GLAM state PDA (identifies the vault) const glamState = new PublicKey("..."); // Signer should be the vault owner or a delegate const glamSigner = new PublicKey("..."); // The vault PDA is derived from the state PDA internally const glamVault = getVaultPda(glamState); // Build a standard Solana instruction as if signing from the vault PDA const transferIx = SystemProgram.transfer({ fromPubkey: glamVault, toPubkey: recipient, lamports, }); // Transform to a GLAM proxy instruction const glamInstruction = mapToGlamIx(transferIx, glamState, glamSigner); // glamInstruction can now be added to a transaction ``` ### Exceptions Do **not** use `ix-mapper` for: - Jupiter swap instructions - SOL wrapping or unwrapping instructions (`WSOL` flow) These should be passed through as regular instructions and handled outside `mapToGlamIx(...)`. ### Staging Environment To use staging program deployments, pass `staging = true`: ```typescript const glamInstruction = mapToGlamIx(transferIx, glamState, glamSigner, true); ``` ## API ### `mapToGlamIx(ix, glamState, glamSigner, staging?)` Transforms a standard Solana `TransactionInstruction` into a GLAM proxy instruction. **Parameters:** | Parameter | Type | Description | | ------------ | ------------------------ | ------------------------------------------------- | | `ix` | `TransactionInstruction` | The original Solana instruction to transform | | `glamState` | `PublicKey` | The GLAM state PDA that identifies the vault | | `glamSigner` | `PublicKey` | The vault owner or delegate signing the operation | | `staging` | `boolean` (optional) | Use staging program IDs (default: `false`) | **Returns:** `TransactionInstruction | null` - The transformed instruction, or `null` if the program/instruction is not supported or does not require remapping. ### `getVaultPda(statePda, staging?)` Derives the vault PDA from a state PDA. ### `getIntegrationAuthority(integrationProgram)` Derives the integration authority PDA for a given proxy program. ## How It Works ```mermaid flowchart TD subgraph input["Standard Solana Instruction"] direction LR I1["programId: TargetProgram"] I2["disc: src_discriminator"] I3["accounts: [user, market, vault, ...]"] I4["data: payload"] end input -->|"mapToGlamIx(ix, glamState, glamSigner)"| lookup lookup["Lookup mapping config by programId"] --> match match["Match instruction by src_discriminator"] --> transform subgraph transform["Build Proxy Instruction"] direction LR subgraph disc["Discriminator"] T1["src_disc --> dst_disc"] end subgraph accounts["Accounts"] direction TB T2["Inject dynamic accounts
state, vault, signer, integration_authority"] T3["Add static accounts from config"] T4["Reorder original accounts via index_map
drop accounts where index = -1"] T5["Append remaining accounts as-is"] T2 --> T3 --> T4 --> T5 end end transform --> output subgraph output["GLAM Proxy Instruction"] direction LR O1["programId: ext_integration"] O2["disc: dst_discriminator"] O3["accounts: [state, vault, signer, auth, ..., user, market, ...]"] O4["data: payload (unchanged)"] end ```