# Smart Contract Stack

### Runtime Architecture

UOMI's runtime is built on Substrate and incorporates `pallet-contracts`, providing a sandboxed environment for WebAssembly smart contracts. While any language that compiles to Wasm can potentially be used, the code must be compatible with the `pallet-contracts` API.

> 💡 **Tip**\
> For efficient development, it's recommended to use an eDSL (embedded Domain-Specific Language) targeting `pallet-contracts`, such as:
>
> * ink! (Rust-based)
> * ask! (AssemblyScript-based)

### Execution Environment

#### Interpreter

The `pallet-contracts` uses the `wasmi` interpreter to execute Wasm smart contracts.

> ℹ️ **Note**\
> While faster JIT interpreters like `wasmtime` exist, `wasmi` is chosen for its higher degree of interpretation correctness, which is crucial for the untrusted environment of smart contracts.

#### Contract Deployment Process

Contract deployment follows a two-step process:

1. **Code Upload**
   * Upload Wasm contract code to the blockchain
   * Each contract receives a unique `code_hash` identifier
2. **Contract Instantiation**
   * Create contract address and storage
   * Anyone can instantiate a contract using its `code_hash`

**Benefits of Two-Step Deployment**

1. **Storage Efficiency**
   * Multiple instances can share the same code
   * Reduces on-chain storage requirements
   * Particularly efficient for standard tokens (like PSP22 & PSP34)
2. **Flexible Deployment**
   * Create new instances from existing contracts
   * Use `code_hash` for contract instantiation within other contracts
   * Single upload for standard contracts, reducing gas costs
3. **Upgradability**
   * Update contract code while preserving storage and balances
   * Use `set_code_hash` to replace contract code at specific addresses

### Development Tools

#### Client APIs

> 🔧 **Available Tools**
>
> * Polkadot.js API for blockchain interaction via JavaScript
> * contracts-ui web application for contract interaction

### Comparison with Ethereum

| Feature             | Ethereum                    | UOMI                                  |
| ------------------- | --------------------------- | ------------------------------------- |
| Architecture        | Ethereum clients            | Substrate                             |
| Runtime Environment | EVM                         | Wasm pallet-contract + EVM frontier   |
| Gas Model           | Fixed price per instruction | Weight + storage fees + loading fees  |
| Smart Contract DSLs | Solidity and Vyper          | ink! (Rust) and ask! (AssemblyScript) |
| Standards           | EIPs                        | PSPs                                  |

### Additional Resources

* pallet-contracts Rust Documentation
* pallet-contracts GitHub Repository
* Polkadot.js API Documentation

> 📚 **Further Reading**\
> For more detailed information about `pallet-contracts`, visit the Rust docs or GitHub repository.


---

# 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.uomi.ai/build/wasm-smart-contracts/smart-contract-stack.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.
