Quick Start
Build your first GLIN Network application in 5 minutes.
What We'll Buildā
A simple app that:
- Connects to GLIN Network
- Creates an account
- Queries account balance
- Sends a transaction
Step 1: Create a New Projectā
- TypeScript
- Rust
mkdir my-glin-app
cd my-glin-app
npm init -y
npm install @glin-ai/sdk typescript tsx
Create index.ts
:
index.ts
// We'll add code here
cargo new my-glin-app
cd my-glin-app
cargo add glin-client glin-types tokio --features tokio/full
cargo add anyhow
Your Cargo.toml
should look like:
Cargo.toml
[dependencies]
glin-client = "0.1"
glin-types = "0.1"
tokio = { version = "1", features = ["full"] }
anyhow = "1"
Step 2: Connect to GLIN Networkā
- TypeScript
- Rust
index.ts
import { GlinClient } from '@glin-ai/sdk';
async function main() {
// Connect to GLIN testnet
console.log('š Connecting to GLIN Network...');
const client = await GlinClient.connect('wss://testnet.glin.ai');
console.log('ā
Connected!');
// Get chain info
const chain = await client.getChain();
const version = await client.getRuntimeVersion();
console.log(`Chain: ${chain}`);
console.log(`Runtime version: ${version.specVersion}`);
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
Run it:
npx tsx index.ts
src/main.rs
use glin_client::create_client;
use anyhow::Result;
#[tokio::main]
async fn main() -> Result<()> {
// Connect to GLIN testnet
println!("š Connecting to GLIN Network...");
let client = create_client("wss://testnet.glin.ai").await?;
println!("ā
Connected!");
// Get chain info
let chain = client.rpc().system_chain().await?;
let version = client.rpc().system_version().await?;
println!("Chain: {}", chain);
println!("Runtime version: {}", version);
Ok(())
}
Run it:
cargo run
Expected output:
š Connecting to GLIN Network...
ā
Connected!
Chain: GLIN Testnet
Runtime version: 1.0.0
Step 3: Create an Accountā
- TypeScript
- Rust
index.ts
import { GlinClient, Keyring } from '@glin-ai/sdk';
async function main() {
const client = await GlinClient.connect('wss://testnet.glin.ai');
// Create a keyring to manage accounts
const keyring = new Keyring({ type: 'sr25519' });
// Add Alice (for testing)
const alice = keyring.addFromUri('//Alice');
console.log('š¤ Alice address:', alice.address);
// Get balance
const balance = await client.getBalance(alice.address);
console.log('š° Balance:', balance.free.toString(), 'GLIN');
}
main().catch(console.error);
src/main.rs
use glin_client::{create_client, get_dev_account, get_address};
use anyhow::Result;
#[tokio::main]
async fn main() -> Result<()> {
let client = create_client("wss://testnet.glin.ai").await?;
// Get Alice's development account
let alice = get_dev_account("alice")?;
let address = get_address(&alice);
println!("š¤ Alice address: {}", address);
// Get balance
let balance = client.get_balance(&address).await?;
println!("š° Balance: {} GLIN", balance);
Ok(())
}
Development Accounts
For testing, GLIN provides development accounts (Alice, Bob, Charlie, etc.) with pre-funded balances. Never use these in production!
Step 4: Send a Transactionā
- TypeScript
- Rust
index.ts
import { GlinClient, Keyring } from '@glin-ai/sdk';
async function main() {
const client = await GlinClient.connect('wss://testnet.glin.ai');
const keyring = new Keyring({ type: 'sr25519' });
const alice = keyring.addFromUri('//Alice');
const bob = keyring.addFromUri('//Bob');
console.log('š¤ Sending 100 GLIN from Alice to Bob...');
// Create and send transfer
const transfer = client.api.tx.balances.transfer(
bob.address,
100n * 10n**18n // 100 GLIN (18 decimals)
);
const hash = await transfer.signAndSend(alice);
console.log('ā
Transaction sent! Hash:', hash.toHex());
// Wait for finalization
await client.waitForFinalization(hash);
console.log('ā
Transaction finalized!');
// Check Bob's new balance
const bobBalance = await client.getBalance(bob.address);
console.log('š° Bob\'s balance:', bobBalance.free.toString(), 'GLIN');
}
main().catch(console.error);
src/main.rs
use glin_client::{create_client, get_dev_account, get_address};
use subxt::tx::PairSigner;
use anyhow::Result;
#[tokio::main]
async fn main() -> Result<()> {
let client = create_client("wss://testnet.glin.ai").await?;
let alice = get_dev_account("alice")?;
let bob = get_dev_account("bob")?;
let bob_address = get_address(&bob);
println!("š¤ Sending 100 GLIN from Alice to Bob...");
// Create transfer transaction
let amount = 100u128 * 10u128.pow(18); // 100 GLIN (18 decimals)
let transfer_tx = subxt::dynamic::tx(
"Balances",
"transfer",
vec![
subxt::dynamic::Value::from_bytes(&bob_address),
subxt::dynamic::Value::u128(amount),
],
);
let signer = PairSigner::new(alice);
let hash = client
.tx()
.sign_and_submit_default(&transfer_tx, &signer)
.await?;
println!("ā
Transaction sent! Hash: {:?}", hash);
// Wait for finalization
let events = client.wait_for_finalization(hash).await?;
println!("ā
Transaction finalized!");
// Check Bob's new balance
let bob_balance = client.get_balance(&bob_address).await?;
println!("š° Bob's balance: {} GLIN", bob_balance);
Ok(())
}
Expected output:
š¤ Sending 100 GLIN from Alice to Bob...
ā
Transaction sent! Hash: 0x1234...
ā
Transaction finalized!
š° Bob's balance: 100000000000000000000 GLIN
Complete Exampleā
Here's the full working code:
- TypeScript
- Rust
index.ts
import { GlinClient, Keyring } from '@glin-ai/sdk';
async function main() {
// 1. Connect
console.log('š Connecting...');
const client = await GlinClient.connect('wss://testnet.glin.ai');
console.log('ā
Connected!');
// 2. Create accounts
const keyring = new Keyring({ type: 'sr25519' });
const alice = keyring.addFromUri('//Alice');
const bob = keyring.addFromUri('//Bob');
// 3. Check initial balances
const aliceBalance = await client.getBalance(alice.address);
const bobBalance = await client.getBalance(bob.address);
console.log('\nš° Initial balances:');
console.log('Alice:', aliceBalance.free.toString());
console.log('Bob:', bobBalance.free.toString());
// 4. Send transaction
console.log('\nš¤ Sending 100 GLIN from Alice to Bob...');
const transfer = client.api.tx.balances.transfer(
bob.address,
100n * 10n**18n
);
const hash = await transfer.signAndSend(alice);
console.log('Transaction hash:', hash.toHex());
await client.waitForFinalization(hash);
console.log('ā
Transaction finalized!');
// 5. Check final balances
const bobFinalBalance = await client.getBalance(bob.address);
console.log('\nš° Bob\'s final balance:', bobFinalBalance.free.toString());
}
main().catch(console.error);
src/main.rs
use glin_client::{create_client, get_dev_account, get_address};
use subxt::tx::PairSigner;
use anyhow::Result;
#[tokio::main]
async fn main() -> Result<()> {
// 1. Connect
println!("š Connecting...");
let client = create_client("wss://testnet.glin.ai").await?;
println!("ā
Connected!");
// 2. Create accounts
let alice = get_dev_account("alice")?;
let bob = get_dev_account("bob")?;
let bob_address = get_address(&bob);
// 3. Check initial balances
let alice_balance = client.get_balance(&get_address(&alice)).await?;
let bob_balance = client.get_balance(&bob_address).await?;
println!("\nš° Initial balances:");
println!("Alice: {}", alice_balance);
println!("Bob: {}", bob_balance);
// 4. Send transaction
println!("\nš¤ Sending 100 GLIN from Alice to Bob...");
let amount = 100u128 * 10u128.pow(18);
let transfer_tx = subxt::dynamic::tx(
"Balances",
"transfer",
vec![
subxt::dynamic::Value::from_bytes(&bob_address),
subxt::dynamic::Value::u128(amount),
],
);
let signer = PairSigner::new(alice);
let hash = client
.tx()
.sign_and_submit_default(&transfer_tx, &signer)
.await?;
println!("Transaction hash: {:?}", hash);
client.wait_for_finalization(hash).await?;
println!("ā
Transaction finalized!");
// 5. Check final balances
let bob_final_balance = client.get_balance(&bob_address).await?;
println!("\nš° Bob's final balance: {}", bob_final_balance);
Ok(())
}
Next Stepsā
Congratulations! š You've just:
- ā Connected to GLIN Network
- ā Created accounts
- ā Queried balances
- ā Sent a transaction
Learn Moreā
- Authentication ā - Implement "Sign in with GLIN"
- Deploy Contracts ā - Deploy your first smart contract
- Examples ā - Explore more examples
Example Applicationsā
Check out these real-world examples:
Troubleshootingā
Connection Failedā
If you can't connect to the network:
- Check your internet connection
- Try a different RPC endpoint
- Make sure the testnet is running
Transaction Failedā
Common reasons:
- Insufficient balance
- Invalid recipient address
- Network congestion
Check the transaction error message for details.
Need help? Join our Discord or email us.