# First Steps in Development

## First Steps with æternity Blockchain Development

### Setting Up Your First Project

Getting started with æternity blockchain development is straightforward with the æternity project tool (aeproject). This command-line utility helps you initialize projects, compile smart contracts, run tests, and deploy to the blockchain.

To begin your journey, create a new project directory and initialize it with the aeproject tool:

```bash
mkdir my-aepp
cd my-aepp
aeproject init
```

The initialization process creates a well-organized project structure with dedicated directories for your smart contracts, deployment scripts, tests, and Docker configuration.\
\
The initialization process creates a well-organized project structure:\
\
my-aepp/

```
├── contracts/       # Sophia smart contracts
├── deployment/      # Deployment scripts
├── test/           # Test files
└── docker/         # Docker configuration
```

Now it's time to write your first smart contract in the Sophia language:

```sophia
// contracts/HelloWorld.aes
contract HelloWorld =
  entrypoint sayHello(name : string) : string =
    String.concat("Hello, ", name)
```

To ensure your contract works as expected, write a test file:

```javascript
// test/helloWorldTest.js
const { assert } = require('chai')
const { utils } = require('@aeternity/aeproject')

describe('HelloWorld', () => {
  let contract
  
  before(async () => {
    contract = await utils.deployContract('HelloWorld')
  })
  
  it('should say hello', async () => {
    const result = await contract.sayHello('æternity')
    assert.equal(result, 'Hello, æternity')
  })
})
```

Run your tests with `aeproject test`.

### Wallet Setup and Acquiring Test Tokens

To interact with the æternity blockchain, you'll need a wallet. The [**Base æpp (Mobile Wallet)**](https://base.aepps.com/) is a comprehensive mobile wallet for iOS and Android. Create a new account and securely store your seed phrase.

For browser-based development, install the [**SuperHero Wallet (Browser Extension)**](https://wallet.superhero.com/). It allows easy switching between mainnet and testnet environments.

Before deploying to mainnet, develop on the testnet using free test tokens. Visit <https://faucet.aeternity.io> or use the command:

```bash
curl -X POST -H "Content-Type: application/json" \
  -d '{"address": "YOUR_PUBLIC_KEY"}' \
  https://faucet.aeternity.io/account/balance
```

### Environment Configuration

Configure your environment to connect to the appropriate æternity network:

```javascript
// config/network.js
module.exports = {
  networks: {
    testnet: {
      node: "https://testnet.aeternity.io",
      compilerUrl: "https://compiler.aeternity.io"
    },
    local: {
      node: "http://localhost:3001",
      compilerUrl: "http://localhost:3080"
    }
  }
}
```

During development, use a local node with `aeproject node` for faster testing.

### Next Steps

Explore æternity's advanced features like [state channels ](/developer-documentation/protocol/channels.md)for off-chain scaling, [oracles ](/developer-documentation/protocol/oracles.md)for accessing external data, and the [AENS naming system ](/developer-documentation/aepp-sdk-js/docs/guides/aens.md)for human-readable addresses.

Join the[ æternity Forum](https://forum.aeternity.com/) to connect with the community.&#x20;

Always develop on testnet before moving to mainnet, and carefully review your code for security vulnerabilities.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.aeternity.com/aeternity-developer-tools/quick-start-guide/first-steps-in-development.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
