Setup and Installation
Project Setup
# Create a new project
mkdir iota-sdk-examples
cd iota-sdk-examples
# Initialize package.json
npm init -y
# Install SDK
npm install @iota/iota-sdk
# Install TypeScript (optional)
npm install -D typescript @types/node
Basic Configuration
import { getFullnodeUrl, IotaClient } from '@iota/iota-sdk/client';
import { Ed25519Keypair } from '@iota/iota-sdk/keypairs/ed25519';
import { Transaction } from '@iota/iota-sdk/transactions';
// Initialize client
const client = new IotaClient({ url: getFullnodeUrl('devnet') });
// Generate or import keypair
const keypair = new Ed25519Keypair();
const address = keypair.getPublicKey().toIotaAddress();
console.log('Address:', address);
Example 1: Transfer Objects
import { getFullnodeUrl, IotaClient } from '@iota/iota-sdk/client';
import { Ed25519Keypair } from '@iota/iota-sdk/keypairs/ed25519';
import { Transaction } from '@iota/iota-sdk/transactions';
async function transferObjectExample() {
const client = new IotaClient({ url: getFullnodeUrl('testnet') });
const keypair = new Ed25519Keypair();
const tx = new Transaction();
// Transfer objects to recipient
tx.transferObjects(
['0xe19739da1a701eadc21683c5b127e62b553e833e8a15a4f292f4f48b4afea3f2'],
'0x1d20dcdb2bca4f508ea9613994683eb4e76e9c4ed371169677c1be02aaf0b12a',
);
const result = await client.signAndExecuteTransaction({
signer: keypair,
transaction: tx,
});
console.log('Transaction digest:', result.digest);
return result;
}
transferObjectExample().catch(console.error);
Example 2: Transfer IOTA Tokens
import { getFullnodeUrl, IotaClient } from '@iota/iota-sdk/client';
import { Ed25519Keypair } from '@iota/iota-sdk/keypairs/ed25519';
import { Transaction } from '@iota/iota-sdk/transactions';
async function transferIotaExample() {
const client = new IotaClient({ url: getFullnodeUrl('testnet') });
const keypair = new Ed25519Keypair();
const tx = new Transaction();
// Split 1000 NANOS from gas coin
const [coin] = tx.splitCoins(tx.gas, [1000]);
// Transfer to recipient
const recipientAddress = keypair.getPublicKey().toIotaAddress();
tx.transferObjects([coin], recipientAddress);
const result = await client.signAndExecuteTransaction({
signer: keypair,
transaction: tx,
});
console.log('Transfer completed:', result.digest);
return result;
}
transferIotaExample().catch(console.error);
Example 3: Merge Coins
import { getFullnodeUrl, IotaClient } from '@iota/iota-sdk/client';
import { Ed25519Keypair } from '@iota/iota-sdk/keypairs/ed25519';
import { Transaction } from '@iota/iota-sdk/transactions';
async function mergeCoinsExample() {
const client = new IotaClient({ url: getFullnodeUrl('testnet') });
const keypair = new Ed25519Keypair();
const tx = new Transaction();
// Merge multiple coins into one
tx.mergeCoins(
'0xe19739da1a701eadc21683c5b127e62b553e833e8a15a4f292f4f48b4afea3f2',
['0x127a8975134a4824d9288722c4ee4fc824cd22502ab4ad9f6617f3ba19229c1b'],
);
const result = await client.signAndExecuteTransaction({
signer: keypair,
transaction: tx,
});
console.log('Coins merged:', result.digest);
return result;
}
mergeCoinsExample().catch(console.error);
Example 4: Call Move Function
import { getFullnodeUrl, IotaClient } from '@iota/iota-sdk/client';
import { Ed25519Keypair } from '@iota/iota-sdk/keypairs/ed25519';
import { Transaction } from '@iota/iota-sdk/transactions';
async function moveCallExample() {
const client = new IotaClient({ url: getFullnodeUrl('testnet') });
const keypair = new Ed25519Keypair();
const packageObjectId = '0x...';
const tx = new Transaction();
// Call a Move function
tx.moveCall({
target: `${packageObjectId}::nft::mint`,
arguments: [tx.pure.string('Example NFT')],
});
const result = await client.signAndExecuteTransaction({
signer: keypair,
transaction: tx,
});
console.log('Move call executed:', result.digest);
return result;
}
moveCallExample().catch(console.error);
Example 5: Query Account Data
import { getFullnodeUrl, IotaClient } from '@iota/iota-sdk/client';
async function queryAccountExample() {
const client = new IotaClient({ url: getFullnodeUrl('testnet') });
const address = '0xcc2bd176a478baea9a0de7a24cd927661cc6e860d5bacecb9a138ef20dbab231';
// Get owned objects
const objects = await client.getOwnedObjects({ owner: address });
console.log('Owned objects:', objects.data.length);
// Get coins
const coins = await client.getCoins({ owner: address });
console.log('Coins:', coins.data.length);
// Get IOTA balance
const balance = await client.getBalance({ owner: address });
console.log('IOTA balance:', balance.totalBalance);
// Get all balances
const allBalances = await client.getAllBalances({ owner: address });
console.log('All balances:', allBalances);
return { objects, coins, balance, allBalances };
}
queryAccountExample().catch(console.error);
Example 6: Query Events
import { getFullnodeUrl, IotaClient } from '@iota/iota-sdk/client';
async function queryEventsExample() {
const client = new IotaClient({ url: getFullnodeUrl('testnet') });
const address = '0xcc2bd176a478baea9a0de7a24cd927661cc6e860d5bacecb9a138ef20dbab231';
// Query events from sender
const events = await client.queryEvents({
query: { Sender: address },
limit: 10,
});
console.log('Events:', events.data.length);
events.data.forEach((event) => {
console.log('Event type:', event.type);
console.log('Sender:', event.sender);
console.log('Data:', event.parsedJson);
});
return events;
}
queryEventsExample().catch(console.error);
Example 7: Subscribe to Events
import { getFullnodeUrl, IotaClient } from '@iota/iota-sdk/client';
async function subscribeEventsExample() {
const client = new IotaClient({ url: getFullnodeUrl('testnet') });
const address = '0xcc2bd176a478baea9a0de7a24cd927661cc6e860d5bacecb9a138ef20dbab231';
console.log('Subscribing to events from:', address);
const unsubscribe = await client.subscribeEvent({
filter: { Sender: address },
onMessage: (event) => {
console.log('\nNew event received:');
console.log('Type:', event.type);
console.log('Timestamp:', event.timestampMs);
console.log('Data:', event.parsedJson);
},
});
// Unsubscribe after 60 seconds
setTimeout(() => {
console.log('\nUnsubscribing...');
unsubscribe();
}, 60000);
}
subscribeEventsExample().catch(console.error);
Example 8: Multisig Transaction
import { getFullnodeUrl, IotaClient } from '@iota/iota-sdk/client';
import { MultiSigPublicKey, MultiSigSigner } from '@iota/iota-sdk/multisig';
import { Ed25519Keypair } from '@iota/iota-sdk/keypairs/ed25519';
import { Transaction } from '@iota/iota-sdk/transactions';
async function multisigExample() {
const client = new IotaClient({ url: getFullnodeUrl('testnet') });
// Create three keypairs
const keypair1 = new Ed25519Keypair();
const keypair2 = new Ed25519Keypair();
const keypair3 = new Ed25519Keypair();
// Create 2-of-3 multisig
const multisigPublicKey = MultiSigPublicKey.fromPublicKeys({
threshold: 2,
publicKeys: [
{ publicKey: keypair1.getPublicKey(), weight: 1 },
{ publicKey: keypair2.getPublicKey(), weight: 1 },
{ publicKey: keypair3.getPublicKey(), weight: 1 },
],
});
const multisigAddress = multisigPublicKey.toIotaAddress();
console.log('Multisig address:', multisigAddress);
// Create transaction
const tx = new Transaction();
tx.transferObjects(['0x...'], '0x...');
// Sign with 2 out of 3 keys
const multiSigSigner = new MultiSigSigner({
multisigPublicKey,
signers: [keypair1, keypair2],
});
const result = await client.signAndExecuteTransaction({
signer: multiSigSigner,
transaction: tx,
});
console.log('Multisig transaction executed:', result.digest);
return result;
}
multisigExample().catch(console.error);
Example 9: Derive Multiple Accounts
import { Ed25519Keypair } from '@iota/iota-sdk/keypairs/ed25519';
import { generateMnemonic } from '@iota/iota-sdk/cryptography';
async function deriveAccountsExample() {
// Generate mnemonic
const mnemonic = generateMnemonic();
console.log('Mnemonic:', mnemonic);
console.log('\nDerived accounts:');
// Derive multiple accounts from same mnemonic
for (let i = 0; i < 5; i++) {
const path = `m/44'/4218'/0'/0'/${i}'`;
const keypair = Ed25519Keypair.deriveKeypair(mnemonic, path);
const address = keypair.getPublicKey().toIotaAddress();
console.log(`Account ${i}:`, address);
}
}
deriveAccountsExample().catch(console.error);
Example 10: Request from Faucet
import { getFaucetHost, requestIotaFromFaucetV0 } from '@iota/iota-sdk/faucet';
import { Ed25519Keypair } from '@iota/iota-sdk/keypairs/ed25519';
import { getFullnodeUrl, IotaClient } from '@iota/iota-sdk/client';
async function faucetExample() {
const client = new IotaClient({ url: getFullnodeUrl('testnet') });
const keypair = new Ed25519Keypair();
const address = keypair.getPublicKey().toIotaAddress();
console.log('Address:', address);
// Check balance before
const balanceBefore = await client.getBalance({ owner: address });
console.log('Balance before:', balanceBefore.totalBalance);
// Request tokens from faucet
console.log('Requesting tokens from faucet...');
await requestIotaFromFaucetV0({
host: getFaucetHost('testnet'),
recipient: address,
});
// Wait a bit for transaction to process
await new Promise(resolve => setTimeout(resolve, 5000));
// Check balance after
const balanceAfter = await client.getBalance({ owner: address });
console.log('Balance after:', balanceAfter.totalBalance);
return { address, balanceBefore, balanceAfter };
}
faucetExample().catch(console.error);
Example 11: GraphQL Query
import { IotaGraphQLClient } from '@iota/iota-sdk/graphql';
async function graphqlExample() {
const client = new IotaGraphQLClient({
url: 'https://api.devnet.iota.cafe/graphql',
});
const address = '0xcc2bd176a478baea9a0de7a24cd927661cc6e860d5bacecb9a138ef20dbab231';
const result = await client.query({
query: `
query GetAccountData($address: IotaAddress!) {
owner(address: $address) {
address
objects {
nodes {
address
version
digest
}
}
coins {
nodes {
coinType
totalBalance
}
}
}
}
`,
variables: { address },
});
console.log('GraphQL result:', result.data);
return result;
}
graphqlExample().catch(console.error);
Example 12: Dry Run Transaction
import { getFullnodeUrl, IotaClient } from '@iota/iota-sdk/client';
import { Ed25519Keypair } from '@iota/iota-sdk/keypairs/ed25519';
import { Transaction } from '@iota/iota-sdk/transactions';
async function dryRunExample() {
const client = new IotaClient({ url: getFullnodeUrl('testnet') });
const keypair = new Ed25519Keypair();
const tx = new Transaction();
const [coin] = tx.splitCoins(tx.gas, [1000]);
tx.transferObjects([coin], keypair.getPublicKey().toIotaAddress());
// Build transaction
const txBytes = await tx.build({ client });
// Dry run to simulate execution
console.log('Running dry run...');
const dryRunResult = await client.dryRunTransactionBlock({
transactionBlock: txBytes,
});
console.log('Status:', dryRunResult.effects.status);
console.log('Gas used:', dryRunResult.effects.gasUsed);
if (dryRunResult.effects.status.status === 'success') {
console.log('Transaction will succeed!');
// Execute for real
const result = await client.signAndExecuteTransaction({
signer: keypair,
transaction: tx,
});
console.log('Executed:', result.digest);
return result;
} else {
console.error('Transaction would fail:', dryRunResult.effects.status.error);
}
}
dryRunExample().catch(console.error);
Example 13: Get Checkpoints
import { getFullnodeUrl, IotaClient } from '@iota/iota-sdk/client';
async function checkpointsExample() {
const client = new IotaClient({ url: getFullnodeUrl('testnet') });
// Get latest checkpoints
const checkpoints = await client.getCheckpoints({
descendingOrder: true,
limit: 10,
});
console.log('Latest checkpoints:');
checkpoints.data.forEach((checkpoint) => {
console.log('\n-----------------------------------');
console.log('Sequence:', checkpoint.sequenceNumber);
console.log('Timestamp:', new Date(Number(checkpoint.timestampMs)));
console.log('Transactions:', checkpoint.transactions.length);
});
// Get specific checkpoint
const checkpoint = await client.getCheckpoint({ id: '1994010' });
console.log('\nCheckpoint 1994010:');
console.log('Sequence:', checkpoint.sequenceNumber);
console.log('Timestamp:', checkpoint.timestampMs);
console.log('Transactions:', checkpoint.transactions.length);
return { checkpoints, checkpoint };
}
checkpointsExample().catch(console.error);
Example 14: Publish Move Package
import { getFullnodeUrl, IotaClient } from '@iota/iota-sdk/client';
import { Ed25519Keypair } from '@iota/iota-sdk/keypairs/ed25519';
import { Transaction } from '@iota/iota-sdk/transactions';
import { execSync } from 'child_process';
async function publishPackageExample() {
const client = new IotaClient({ url: getFullnodeUrl('testnet') });
const keypair = new Ed25519Keypair();
const cliPath = 'iota';
const packagePath = './my_move_package';
// Build Move package
console.log('Building Move package...');
const { modules, dependencies } = JSON.parse(
execSync(
`${cliPath} move build --dump-bytecode-as-base64 --path ${packagePath}`,
{ encoding: 'utf-8' },
),
);
const tx = new Transaction();
// Publish package
const [upgradeCap] = tx.publish({
modules,
dependencies,
});
// Transfer upgrade capability to publisher
tx.transferObjects([upgradeCap], keypair.getPublicKey().toIotaAddress());
console.log('Publishing package...');
const result = await client.signAndExecuteTransaction({
signer: keypair,
transaction: tx,
});
console.log('Package published!');
console.log('Transaction:', result.digest);
return result;
}
publishPackageExample().catch(console.error);
Example 15: Full Application
import { getFullnodeUrl, IotaClient } from '@iota/iota-sdk/client';
import { Ed25519Keypair } from '@iota/iota-sdk/keypairs/ed25519';
import { Transaction } from '@iota/iota-sdk/transactions';
import { getFaucetHost, requestIotaFromFaucetV0 } from '@iota/iota-sdk/faucet';
class IotaWallet {
private client: IotaClient;
private keypair: Ed25519Keypair;
private address: string;
constructor(network: 'localnet' | 'devnet' | 'testnet' = 'testnet') {
this.client = new IotaClient({ url: getFullnodeUrl(network) });
this.keypair = new Ed25519Keypair();
this.address = this.keypair.getPublicKey().toIotaAddress();
}
getAddress(): string {
return this.address;
}
async getBalance(): Promise<string> {
const balance = await this.client.getBalance({ owner: this.address });
return balance.totalBalance;
}
async requestFaucet(): Promise<void> {
await requestIotaFromFaucetV0({
host: getFaucetHost('testnet'),
recipient: this.address,
});
}
async transfer(recipient: string, amount: number): Promise<string> {
const tx = new Transaction();
const [coin] = tx.splitCoins(tx.gas, [amount]);
tx.transferObjects([coin], recipient);
const result = await this.client.signAndExecuteTransaction({
signer: this.keypair,
transaction: tx,
});
return result.digest;
}
async getTransactionHistory(limit = 10) {
const txs = await this.client.queryTransactions({
filter: { FromAddress: this.address },
options: { showEffects: true },
limit,
});
return txs.data;
}
}
// Usage
async function main() {
const wallet = new IotaWallet('testnet');
console.log('Wallet address:', wallet.getAddress());
// Request from faucet
console.log('Requesting tokens...');
await wallet.requestFaucet();
// Wait for tokens
await new Promise(resolve => setTimeout(resolve, 5000));
// Check balance
const balance = await wallet.getBalance();
console.log('Balance:', balance);
// Transfer tokens
if (BigInt(balance) > 0) {
console.log('Transferring tokens...');
const digest = await wallet.transfer(wallet.getAddress(), 1000);
console.log('Transfer completed:', digest);
}
// Get transaction history
const history = await wallet.getTransactionHistory();
console.log('Transaction history:', history.length, 'transactions');
}
main().catch(console.error);
Running Examples
With TypeScript
# Install dependencies
npm install @iota/iota-sdk typescript tsx
# Run example
npx tsx example.ts
With JavaScript (Node.js)
# Install SDK
npm install @iota/iota-sdk
# Run example
node example.js
Next Steps
Installation
Install the SDK in your project
API Reference
Explore the complete API
Transactions
Learn about transaction building
Client Setup
Configure the IotaClient