Overview
This guide walks through the Giza Agent SDK from installation to a running agent. You’ll create a smart account, activate an agent, and start yield optimization.
This quickstart focuses on the Agentic integration — Giza handles smart accounts, execution, gas, and optimization. If you have your own execution infrastructure and just want optimization intelligence, see the IaaS Integration Guide .
What Giza Manages vs What You Build
Giza manages You build Smart account creation (ZeroDev) User interface Session key management Deposit flow Transaction execution Performance display Gas payment Withdrawal requests Continuous optimization Notification systems Protocol rebalancing User authentication
Architecture
Prerequisites
Check your version: node --version Download from nodejs.org if needed.
The SDK is built for TypeScript. JavaScript works too, but without type safety.
Installation
npm install @gizatech/agent-sdk
Environment Setup
Create a .env file in your project root:
GIZA_API_KEY = ...
GIZA_API_URL = ...
GIZA_PARTNER_NAME = ...
Never commit your .env file to version control! Add it to .gitignore.
Complete Integration Flow
Step 1: Initialize the SDK
import { Giza , Chain } from '@gizatech/agent-sdk' ;
// Initialize once, reuse throughout your app
const giza = new Giza ({
chain: Chain . BASE ,
timeout: 60000 , // Optional: 60s timeout
enableRetry: true , // Optional: retry failed requests
});
Step 2: Create a Smart Account
Generate a smart account for your user. This is where they’ll deposit funds.
async function onboardUser ( userWallet : `0x ${ string } ` ) {
const agent = await giza . createAgent ( userWallet );
console . log ( 'Smart Account:' , agent . wallet );
console . log ( 'Deposit funds to this address' );
return agent ;
}
The smart account address is deterministic - calling giza.createAgent with the same EOA always returns the same address.
Step 3: Get Available Protocols
Check which DeFi protocols are available for the token you want to optimize:
const USDC_BASE = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' ;
const { protocols } = await giza . protocols ( USDC_BASE );
console . log ( 'Available protocols:' , protocols );
// ['aave', 'compound', 'moonwell', 'fluid', ...]
Step 4: User Deposits Funds
User sends tokens to smart account
User transfers USDC (or supported token) to the agent.wallet address from Step 2.
Wait for confirmation
Wait for the transaction to be confirmed on-chain.
// Example: User deposits via your UI
const depositTxHash = await userWallet . sendTransaction ({
to: agent . wallet ,
value: parseUnits ( '1000' , 6 ), // 1000 USDC (6 decimals)
});
Step 5: Activate the Agent
After the user deposits, activate the agent to start optimization:
await agent . activate ({
owner: userWallet ,
token: USDC_BASE ,
protocols: [ 'aave' , 'compound' , 'moonwell' ],
txHash: depositTxHash ,
constraints: [
{
kind: 'min_protocols' ,
params: { min_protocols: 2 } // Always diversify
}
]
});
Once activated, the agent automatically:
Monitors APRs across selected protocols
Rebalances capital for optimal yield
Handles all gas costs internally
Continues optimizing until deactivated
Track the agent’s performance:
// Get current portfolio status
const info = await agent . portfolio ();
console . log ( 'Status:' , info . status );
// Get APR
const { apr } = await agent . apr ();
console . log ( `Current APR: ${ apr . toFixed ( 2 ) } %` );
// Get performance history
const { performance } = await agent . performance ();
performance . forEach ( point => {
console . log ( ` ${ point . date } : $ ${ point . value_in_usd } ` );
});
Step 7: Withdraw Funds
Users can withdraw partially or fully at any time:
Full Withdrawal
Partial Withdrawal
// Withdraw everything and deactivate agent
await agent . withdraw ();
// Wait for completion
await agent . waitForDeactivation ({
interval: 5000 ,
timeout: 300000 ,
onUpdate : ( status ) => console . log ( 'Status:' , status ),
});
// Withdraw specific amount, agent stays active
await agent . withdraw ( '500000000' ); // 500 USDC (6 decimals)
// Agent continues optimizing remaining balance
Additional Operations
Top-Up Active Agent
await agent . topUp ( newDepositTxHash );
Update Protocols
await agent . updateProtocols ([ 'aave' , 'compound' , 'moonwell' , 'fluid' ]);
Manual Rebalance
Multi-Chain Management
Run agents on multiple chains simultaneously:
import { Giza , Chain } from '@gizatech/agent-sdk' ;
const baseGiza = new Giza ({ chain: Chain . BASE });
const arbGiza = new Giza ({ chain: Chain . ARBITRUM });
const baseAgent = await baseGiza . createAgent ( userWallet );
const arbAgent = await arbGiza . createAgent ( userWallet );
const [ baseApr , arbApr ] = await Promise . all ([
baseAgent . apr (),
arbAgent . apr (),
]);
console . log ( 'Base APR:' , baseApr . apr );
console . log ( 'Arbitrum APR:' , arbApr . apr );
Constraint-Based Risk Management
Use constraints to control agent behavior:
await agent . activate ({
owner: userWallet ,
token: USDC ,
protocols: [ 'aave' , 'compound' , 'moonwell' , 'fluid' ],
txHash: depositTxHash ,
constraints: [
// Diversify across at least 3 protocols
{ kind: 'min_protocols' , params: { min_protocols: 3 } },
// Cap newer protocol at 30%
{
kind: 'max_amount_per_protocol' ,
params: { protocol: 'fluid' , max_ratio: 0.3 },
},
// No dust allocations
{ kind: 'min_amount' , params: { min_amount: '100000000' } },
],
});
Error Handling
Wrap SDK calls in try-catch blocks:
import { ValidationError , GizaAPIError , TimeoutError } from '@gizatech/agent-sdk' ;
try {
const agent = await giza . createAgent ( userWallet );
} catch ( error ) {
if ( error instanceof ValidationError ) {
console . error ( 'Invalid input:' , error . message );
} else if ( error instanceof GizaAPIError ) {
console . error ( 'API error:' , error . statusCode , error . message );
} else if ( error instanceof TimeoutError ) {
console . error ( 'Request timed out' );
}
}
Error Handling Guide Error types, retry patterns, and user-friendly messages
Next Steps