A complete blockchain implementation featuring: - synord: Full node with GHOSTDAG consensus - explorer-web: Modern React blockchain explorer with 3D DAG visualization - CLI wallet and tools - Smart contract SDK and example contracts (DEX, NFT, token) - WASM crypto library for browser/mobile
145 lines
3.1 KiB
Markdown
145 lines
3.1 KiB
Markdown
# Synor Smart Contracts
|
|
|
|
This directory contains example smart contracts for the Synor blockchain.
|
|
|
|
## Building Contracts
|
|
|
|
Contracts are compiled to WebAssembly using the `wasm32-unknown-unknown` target:
|
|
|
|
```bash
|
|
# Install the wasm target
|
|
rustup target add wasm32-unknown-unknown
|
|
|
|
# Build the token contract
|
|
cargo build --manifest-path contracts/token/Cargo.toml --target wasm32-unknown-unknown --release
|
|
|
|
# Build the NFT contract
|
|
cargo build --manifest-path contracts/nft/Cargo.toml --target wasm32-unknown-unknown --release
|
|
```
|
|
|
|
The compiled WASM files will be in `target/wasm32-unknown-unknown/release/`.
|
|
|
|
## Optimizing Contract Size
|
|
|
|
For production, use `wasm-opt` to further reduce contract size:
|
|
|
|
```bash
|
|
# Install wasm-opt (part of binaryen)
|
|
brew install binaryen # macOS
|
|
apt install binaryen # Ubuntu
|
|
|
|
# Optimize the contract
|
|
wasm-opt -Oz -o optimized.wasm target/wasm32-unknown-unknown/release/synor_token.wasm
|
|
```
|
|
|
|
## Example Contracts
|
|
|
|
### SYN-20 Token (`token/`)
|
|
|
|
A fungible token contract similar to ERC-20:
|
|
|
|
- Minting (owner only)
|
|
- Burning
|
|
- Transfers
|
|
- Allowances (approve/transferFrom)
|
|
- Ownership management
|
|
|
|
### SYN-721 NFT (`nft/`)
|
|
|
|
A non-fungible token contract similar to ERC-721:
|
|
|
|
- Minting NFTs with metadata URI
|
|
- Burning
|
|
- Transfers
|
|
- Approvals (per-token and operator)
|
|
- Ownership management
|
|
|
|
### AMM DEX (`dex/`)
|
|
|
|
A Uniswap V2-style automated market maker:
|
|
|
|
- Liquidity pools for token pairs
|
|
- Constant product formula (x * y = k)
|
|
- LP tokens for liquidity providers
|
|
- Swap with 0.3% fee
|
|
- Quote/preview swaps
|
|
|
|
### Staking (`staking/`)
|
|
|
|
A token staking contract with rewards:
|
|
|
|
- Stake tokens for rewards
|
|
- Lock periods with bonus multipliers (1x to 3x)
|
|
- Claim rewards anytime
|
|
- Emergency unstake with 10% penalty
|
|
- Pausable by owner
|
|
|
|
## Creating Your Own Contract
|
|
|
|
### Using the Template Generator
|
|
|
|
The fastest way to create a new contract:
|
|
|
|
```bash
|
|
./scripts/new-contract.sh my-contract --description "My custom contract"
|
|
```
|
|
|
|
This creates a new contract in `contracts/my-contract/` with boilerplate code.
|
|
|
|
### Manual Setup
|
|
|
|
1. Create a new contract directory:
|
|
```bash
|
|
mkdir -p contracts/my_contract/src
|
|
```
|
|
|
|
2. Create `Cargo.toml`:
|
|
```toml
|
|
[package]
|
|
name = "my-contract"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
|
|
[lib]
|
|
crate-type = ["cdylib"]
|
|
|
|
[dependencies]
|
|
synor-sdk = { path = "../../crates/synor-sdk", default-features = false }
|
|
borsh = { version = "1.3", default-features = false, features = ["derive"] }
|
|
|
|
[profile.release]
|
|
opt-level = "z"
|
|
lto = true
|
|
panic = "abort"
|
|
strip = true
|
|
```
|
|
|
|
3. Create `src/lib.rs`:
|
|
```rust
|
|
#![no_std]
|
|
extern crate alloc;
|
|
|
|
use synor_sdk::prelude::*;
|
|
|
|
synor_sdk::entry_point!(init, call);
|
|
|
|
fn init(_params: &[u8]) -> Result<()> {
|
|
Ok(())
|
|
}
|
|
|
|
fn call(selector: &[u8], params: &[u8]) -> Result<Vec<u8>> {
|
|
// Handle method calls
|
|
Err(Error::InvalidMethod)
|
|
}
|
|
```
|
|
|
|
4. Build:
|
|
```bash
|
|
cargo build --manifest-path contracts/my_contract/Cargo.toml \
|
|
--target wasm32-unknown-unknown --release
|
|
```
|
|
|
|
## Host Function ABI
|
|
|
|
See [HOST_FUNCTIONS.md](./HOST_FUNCTIONS.md) for the complete list of host functions
|
|
available to contracts.
|