![]() |
VOOZH | about |
dotnet add package R3E.WebGUI.Service --version 2.1.0
NuGet\Install-Package R3E.WebGUI.Service -Version 2.1.0
<PackageReference Include="R3E.WebGUI.Service" Version="2.1.0" />
<PackageVersion Include="R3E.WebGUI.Service" Version="2.1.0" />Directory.Packages.props
<PackageReference Include="R3E.WebGUI.Service" />Project file
paket add R3E.WebGUI.Service --version 2.1.0
#r "nuget: R3E.WebGUI.Service, 2.1.0"
#:package R3E.WebGUI.Service@2.1.0
#addin nuget:?package=R3E.WebGUI.Service&version=2.1.0Install as a Cake Addin
#tool nuget:?package=R3E.WebGUI.Service&version=2.1.0Install as a Cake Tool
👁 Docker Pulls
👁 Docker Image Version
👁 NuGet
A modern hosting service for Neo smart contract WebGUIs with JSON-based configuration, signature authentication, and automatic interface generation.
The R3E WebGUI Service provides a complete solution for Neo smart contract developers to deploy beautiful, interactive web interfaces without writing frontend code. The service automatically generates modern WebGUIs from contract manifests and uses JSON configuration files (contractaddress.webgui.json) for dynamic content.
mycontract.r3e-gui.com)The service uses a modern JSON-based architecture where each contract's WebGUI is defined by a contractaddress.webgui.json file containing:
# Pull the Docker image
docker pull r3enetwork/r3e-webgui-service:latest
# Download docker-compose configuration
curl -O https://raw.githubusercontent.com/r3e-network/r3e-devpack-dotnet/r3e/src/R3E.WebGUI.Service/docker-compose.hub.yml
# Create environment file
cat > .env << EOF
DB_PASSWORD=YourSecurePassword
BASE_DOMAIN=service.neoservicelayer.com
EOF
# Start the service
docker-compose -f docker-compose.hub.yml up -d
# Access the service
# - API: https://service.neoservicelayer.com
# - Swagger: https://service.neoservicelayer.com/swagger
# - Health: https://service.neoservicelayer.com/health
cd src/R3E.WebGUI.Service
dotnet run
The service will be available at http://localhost:8888
./deploy-contract-webgui.sh \
-p MyContract.csproj \
-a 0x1234567890abcdef1234567890abcdef12345678 \
-d NPvKVTGZapmFWABLsyvfreuqn73jCjJtN5 \
-e "My awesome NEP-17 token contract"
The script will:
// 1. Create the deployment message
const timestamp = Math.floor(Date.now() / 1000);
const message = `Deploy WebGUI for contract ${contractAddress} by ${deployerAddress} at ${timestamp}`;
// 2. Sign with your wallet (e.g., NeoLine)
const signResult = await neoline.signMessage({
message: message,
isBase64: false
});
// 3. Deploy the WebGUI
const response = await fetch('http://localhost:8888/api/webgui/deploy-from-manifest', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
contractAddress: '0x1234567890abcdef1234567890abcdef12345678',
contractName: 'MyToken',
network: 'testnet',
deployerAddress: 'NPvKVTGZapmFWABLsyvfreuqn73jCjJtN5',
description: 'My awesome NEP-17 token',
timestamp: timestamp,
signature: signResult.signature,
publicKey: signResult.publicKey
})
});
Your WebGUI will be instantly available at:
https://mytoken.service.neoservicelayer.com
# or via path-based routing:
https://service.neoservicelayer.com/contracts/mytoken
The WebGUI includes:
If you have a Neo plugin for your contract:
# Calculate plugin hash
PLUGIN_HASH=$(sha256sum MyTokenPlugin.zip | awk '{print $1}')
TIMESTAMP=$(date +%s)
# Create and sign message
MESSAGE="Upload plugin for contract 0x1234... with hash $PLUGIN_HASH at $TIMESTAMP"
# Sign with your wallet...
# Upload plugin
curl -X POST "https://service.neoservicelayer.com/api/webgui/0x1234.../plugin" \
-H "X-Timestamp: $TIMESTAMP" \
-H "X-Signature: $YOUR_SIGNATURE" \
-H "X-Public-Key: $YOUR_PUBLIC_KEY" \
-F "pluginFile=@MyTokenPlugin.zip"
Each contract's WebGUI is powered by a JSON configuration file that's automatically generated from the contract manifest:
{
"contractAddress": "0x1234567890abcdef1234567890abcdef12345678",
"contractName": "MyToken",
"network": "testnet",
"deployerAddress": "NPvKVTGZapmFWABLsyvfreuqn73jCjJtN5",
"description": "NEP-17 Token with full WebGUI interface",
"version": "1.0.0",
"pluginDownloadUrl": "https://service.neoservicelayer.com/api/webgui/0x1234.../plugin/download",
"methods": [
{
"name": "transfer",
"displayName": "Transfer Tokens",
"description": "Transfer tokens between addresses",
"safe": false,
"parameters": [
{
"name": "from",
"type": "hash160",
"displayName": "From Address",
"required": true
},
{
"name": "to",
"type": "hash160",
"displayName": "To Address",
"required": true
},
{
"name": "amount",
"type": "integer",
"displayName": "Amount",
"required": true,
"validation": {
"min": "1"
}
}
],
"returnType": "boolean"
}
],
"events": [
{
"name": "Transfer",
"displayName": "Transfer Event",
"parameters": [
{
"name": "from",
"type": "hash160"
},
{
"name": "to",
"type": "hash160"
},
{
"name": "amount",
"type": "integer"
}
]
}
],
"theme": {
"primaryColor": "#667eea",
"secondaryColor": "#00d4aa"
},
"walletSettings": {
"supportedWallets": ["neoline", "o3", "walletconnect"],
"defaultNetwork": "testnet",
"allowNetworkSwitch": true
}
}
Here's a complete example of deploying a NEP-17 token contract with WebGUI:
# 1. Compile your contract
neo-express compile MyToken.csproj --output ./build
# 2. Deploy contract to Neo network
neo-express contract deploy ./build/MyToken.nef --network testnet
# Note the contract address: 0x1234567890abcdef1234567890abcdef12345678
# 3. Deploy WebGUI with plugin
./deploy-contract-webgui.sh \
-p MyToken.csproj \
-a 0x1234567890abcdef1234567890abcdef12345678 \
-d NPvKVTGZapmFWABLsyvfreuqn73jCjJtN5 \
-n "MyToken" \
-w testnet \
-g \ # Generate plugin
-e "NEP-17 Token with full WebGUI"
# 4. Access your WebGUI
open https://mytoken.service.neoservicelayer.com
Each automatically generated WebGUI includes:
All deployment endpoints require signature authentication. See for detailed signing instructions.
POST /api/webgui/deploy-from-manifest
Content-Type: application/json
{
"contractAddress": "string", // Contract address (0x + 40 hex chars)
"contractName": "string", // Contract name (optional)
"network": "string", // "testnet" or "mainnet"
"deployerAddress": "string", // Neo address of deployer
"description": "string", // Contract description (optional)
"timestamp": number, // Unix timestamp
"signature": "string", // Hex signature
"publicKey": "string" // Hex public key
}
Response:
{
"success": true,
"subdomain": "mytoken",
"url": "http://mytoken.localhost:8888",
"contractAddress": "0x1234567890abcdef1234567890abcdef12345678",
"contractName": "MyToken",
"configGenerated": true,
"methodsFound": 5,
"eventsFound": 3
}
GET /api/webgui/{contractAddress}/config
Returns the complete JSON configuration including methods, events, theme, and wallet settings.
POST /api/webgui/{contractAddress}/plugin
Headers:
X-Timestamp: {unix_timestamp}
X-Signature: {signature_hex}
X-Public-Key: {public_key_hex}
Body:
pluginFile: (ZIP file, max 10MB)
Signature Message Format:
Upload plugin for contract {contractAddress} with hash {sha256_hash} at {timestamp}
GET /api/webgui/{contractAddress}/plugin/download
Returns the plugin ZIP file for download.
GET /api/webgui/search?contractAddress={address}&network={network}
Find deployed WebGUIs by contract address.
GET /api/webgui/list?page={page}&pageSize={pageSize}&network={network}
Get paginated list of all deployed WebGUIs.
GET /api/webgui/{subdomain}
Get WebGUI details by subdomain.
The R3E WebGUI Service is available on Docker Hub for easy deployment:
# Pull the latest image
docker pull r3enetwork/r3e-webgui-service:latest
# Download docker-compose configuration
curl -O https://raw.githubusercontent.com/r3e-network/r3e-devpack-dotnet/r3e/src/R3E.WebGUI.Service/docker-compose.hub.yml
# Create environment file
cat > .env << EOF
DB_PASSWORD=YourSecurePassword
BASE_DOMAIN=service.neoservicelayer.com
EOF
# Start the service
docker-compose -f docker-compose.hub.yml up -d
This will start:
docker-compose.hub.yml - Production deployment with Docker Hub imagesdocker-compose.simple.yml - Minimal setup (service + database only)docker-compose.local.yml - Local development setupdocker-compose.production.hub.yml - Full production stack with monitoringFor production environments:
# Using pre-built Docker Hub image
docker run -d \
-p 8888:8080 \
-e ConnectionStrings__DefaultConnection="Server=your-db;Database=R3EWebGUI;User Id=sa;Password=YourPassword;TrustServerCertificate=true" \
-e R3EWebGUI__BaseDomain="your-domain.com" \
-e NEO_RPC_TESTNET="https://test1.neo.coz.io:443" \
-e NEO_RPC_MAINNET="https://mainnet1.neo.coz.io:443" \
-v webgui-storage:/app/webgui-storage \
r3enetwork/r3e-webgui-service:latest
# Database
ConnectionStrings__DefaultConnection="Server=localhost;Database=R3EWebGUI;..."
# Service Settings
R3EWebGUI__BaseDomain="localhost" # Domain for subdomains
R3EWebGUI__StorageBasePath="/app/webgui-storage"
R3EWebGUI__MaxFileSizeKB=5120 # Max file size in KB
R3EWebGUI__AllowedNetworks=["testnet","mainnet"]
# Neo RPC Endpoints
NEO_RPC_TESTNET="https://test1.neo.coz.io:443"
NEO_RPC_MAINNET="https://mainnet1.neo.coz.io:443"
# Rate Limiting
R3EWebGUI__RateLimiting__EnableRateLimiting=true
R3EWebGUI__RateLimiting__PermitLimit=100
R3EWebGUI__RateLimiting__WindowMinutes=1
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=R3EWebGUIService;Trusted_Connection=true"
},
"R3EWebGUI": {
"BaseDomain": "localhost",
"StorageBasePath": "./webgui-storage",
"MaxFileSizeKB": 5120,
"AllowedNetworks": ["testnet", "mainnet"],
"SignatureExpiryMinutes": 5,
"RpcEndpoints": {
"Testnet": "https://test1.neo.coz.io:443",
"Mainnet": "https://mainnet1.neo.coz.io:443"
}
},
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
}
}
}
# Clone the repository
git clone https://github.com/r3e-network/r3e-devpack-dotnet.git
cd neo-devpack-dotnet/src/R3E.WebGUI.Service
# Initialize database
dotnet ef database update
# Run the service
dotnet run
# Service will be available at http://localhost:8888
# Run unit tests
dotnet test
# Run with coverage
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
# Add a new migration
dotnet ef migrations add MigrationName
# Update database
dotnet ef database update
WebGUI not loading at subdomain:
127.0.0.1 mycontract.localhostSignature validation failing:
Contract not found on network:
Plugin upload failing:
We welcome contributions! Please:
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)This project is licensed under the MIT License - see the file for details.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0 net9.0 is compatible. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 was computed. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
This package is not used by any NuGet packages.
This package is not used by any popular GitHub repositories.