Open Source · MIT · All EVM Chains

The complete
wallet infrastructure
for Web3

Smart accounts, session keys, gasless Permit2 approvals, batch execution, and EIP-7702 delegation — all from one SDK. Same contract addresses on every chain.

Option A — script tag (no build step)
<!-- Drop this into any HTML page -->
<script src="https://yourdomain.com/sdk/dist/script.js"></script>

<!-- Or self-host from the repo -->
<script src="./dist/script.js"></script>
Option B — ES module import
// Import directly from the SDK source
import { initSDK, loadContract, writeContract } from "./sdk/index.js";

const { wallet } = initSDK({
  projectId: "YOUR_WALLETCONNECT_PROJECT_ID",
  chains: [1, 56, 137, 42161, 8453],
});

const { account } = await wallet.connect();
const signer = await wallet.getSigner();
const contract = loadContract("0x...", abi, signer);
await writeContract(contract, "mint", [account, 1000n]);
10Deployed contracts
6+EVM chains
0Gas for users
1SDK

Full-stack wallet infrastructure

Everything you need to ship Web3 products — from smart accounts to gasless UX.

🔑

Session Keys

On-chain session key validation with contract/function allowlists and spending limits. Users sign once — your app acts within those bounds.

SessionManager contract

Gasless Transactions

Permit2 and ERC-2612 executors collect token approvals without users paying gas. Backend sponsorship submits transactions on their behalf.

Permit2Executor · ERC2612Executor
📦

Batch Execution

Bundle any number of reads or writes into a single transaction via Multicall3 and BatchMulticall with per-call ETH forwarding.

Multicall3 · BatchMulticall

EIP-7702 Delegation

Turn any existing EOA into a smart account without deploying a new wallet. Users keep their address — gain smart account features.

EIP7702Module
🌐

Multi-Chain

Same contract addresses on Ethereum, BSC, Polygon, Avalanche, Arbitrum, Base, and Optimism. Deploy once, work everywhere.

CREATE2 singletons

10 production contracts

CREATE2 deployed — identical addresses on every EVM chain. Fully verified on Etherscan.

Contract Address Purpose
Factory 0x653c…ceF Smart account deployment via CREATE2
ERC4337FactoryWrapper 0xC67c…1ff9 ERC-4337 UserOp account factory
SessionManager 0x4AE4…5cb On-chain session key validation
BatchMulticall 0xF93E…54D Batch execution with per-call ETH
Permit2Executor 0x4593…773 Gasless Permit2 token collection
ERC2612Executor 0xb8eF…900 ERC-2612 permit + collection
EIP7702Module 0x1f82…E5d EOA → smart account delegation
Stage1Module 0xfBC5…99f4 Initial account logic module
Stage2Module 0x5C9C…94f Upgraded account logic module
Guest 0x2d21…0Ee6 Gasless guest session entry
Ethereum BSC Polygon Avalanche Arbitrum Base Optimism

One SDK, all primitives

Import only what you need. Every module works standalone or composed together.

🔗

wallet.js

WalletConnect v2 / Reown AppKit integration. Connect, disconnect, switch chains — event-driven.

await wallet.connect();
📝

contract.js

Load any contract by address + ABI. Read/write with event bus, transaction previews, and error handling.

await writeContract(c, "mint", [to, amt]);
✍️

permit2.js

Gasless ERC-20 approvals via EIP-712 signed messages. Single or batch permits with MAX defaults.

await signPermitSingle(provider, acct, 1, permit);
📦

multicall.js

Batch reads and writes into a single RPC call. Supports per-call ETH value via BatchMulticall.

await multicallWrite(signer, calls);
🔏

eip712.js

EIP-712 typed data construction and signing. Domain builders, type encoders, signature splitting.

await signTypedData(provider, acct, data);
🛠️

utils.js

Chain info, address validation, amount parsing, explorer URLs, deadlines — zero-dependency helpers.

getExplorerUrl(137, addr);

Smart contract interactions

Read, write, and listen to events on any EVM contract — with automatic previews and error handling.

Read state

import { loadContract, readContract } from "@integrateddex/waas-sdk";

const token = loadContract(tokenAddr, erc20Abi, provider);
const balance = await readContract(token, "balanceOf", [account]);
const symbol = await readContract(token, "symbol");

Write transactions

import { loadContract, writeContract } from "@integrateddex/waas-sdk";

const signer = await wallet.getSigner();
const nft = loadContract(nftAddr, nftAbi, signer);

// Transaction preview logged before signing
const receipt = await writeContract(nft, "mint", [to, tokenId]);

Batch calls

import { multicallWrite, buildCall } from "@integrateddex/waas-sdk";

const calls = [
  buildCall(tokenA, approveData),
  buildCall(router, swapData),
  buildCall(vault, depositData),
];

// One transaction — three operations
await multicallWrite(signer, calls);

Listen to events

import { contractEvents } from "@integrateddex/waas-sdk";

contractEvents.on("contractCallSuccess", (detail) => {
  console.log(`✅ ${detail.functionName}`, detail.txHash);
});

contractEvents.on("contractCallError", (detail) => {
  console.error(`❌ ${detail.functionName}`, detail.error);
});

Gas sponsorship

Pay gas on behalf of your users. Estimate costs, submit sponsored transactions, monitor balance.

💰

Estimate

Get gas cost estimates before submitting. Know exactly what a sponsored transaction will cost you.

POST /api/sponsor/estimate
🚀

Submit

Submit sponsored transactions from your backend wallet. Users never see gas prompts.

POST /api/sponsor/submit
📊

Monitor

Track your sponsor wallet balance across chains. Set up alerts when running low.

GET /api/sponsor/balance
1
User signs transaction intent
2
Backend estimates & sponsors gas
3
Transaction submitted on-chain
4
User gets confirmed result

Session keys

Users sign once. Your app transacts within scoped permissions — contracts, functions, spending limits, and expiry.

🎯

Scoped permissions

Restrict session keys to specific contracts and function signatures.

💳

Spending limits

Cap the total value a session key can spend — in ETH or any ERC-20.

Time-bound

Sessions auto-expire. Revoke any session instantly from the backend.

📡

On-chain validation

The SessionManager contract validates every session key usage on-chain.

session-flow.js
// 1. Create a session key with scoped permissions
const session = {
  id: crypto.randomUUID(),
  userAddress: account,
  sessionKey: sessionKeyPair.address,
  allowedContracts: ["0xF93E...54D"],
  allowedFunctions: ["batch", "batchStatic"],
  spendingLimit: "1000000000000000000", // 1 ETH
  expiresAt: Math.floor(Date.now() / 1000) + 86400, // 24 hours
  chainId: 1,
};

// 2. Register on-chain via SessionManager
await writeContract(sessionManager, "registerSession", [session]);

// 3. Your app uses the session key for subsequent transactions
await writeContract(contract, "executeWithSession", [sessionId, calldata]);

Production backend

Fastify + MongoDB + Telegram alerts. Deploy with Docker in minutes.

Sessions API

POST/api/sessions
GET/api/sessions/active
GET/api/sessions/address/:addr
DELETE/api/sessions/:id

Transactions API

POST/api/transactions
GET/api/transactions
GET/api/transactions/address/:addr
PATCH/api/transactions/tx/:hash

Gas Sponsorship

POST/api/sponsor/estimate
POST/api/sponsor/submit
GET/api/sponsor/balance

Monitoring

GET/api/health
GET/api/analytics
POST/api/webhook
Fastify v5 MongoDB Docker Nginx Telegram Alerts Rate Limiting Auth Middleware

Get started in 60 seconds

1

Install the SDK

npm install @integrateddex/waas-sdk ethers
2

Initialize & connect

import { initSDK } from "@integrateddex/waas-sdk";
const { wallet } = initSDK({ projectId: "...", chains: [1, 137] });
await wallet.connect();
3

Interact with contracts

import { loadContract, writeContract, CONTRACTS } from "@integrateddex/waas-sdk";
const signer = await wallet.getSigner();
const factory = loadContract(CONTRACTS.Factory.address, CONTRACTS.Factory.abi, signer);
await writeContract(factory, "deploy", [owner, salt]);
4

Deploy the backend

cd backend && docker compose up -d

Documentation

Ship Web3 in minutes,
not months

Open-source wallet infrastructure. No vendor lock-in. No token gates. Just code.