Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e02a720
feat: add TRON substreams for ERC20FeeProxy payment detection
rodrigopavezi Jan 29, 2026
8deb691
fix: correct rust-toolchain action name
rodrigopavezi Jan 29, 2026
95f4ffc
feat: add automated subgraph deployment to The Graph Studio
rodrigopavezi Jan 29, 2026
6dd2aed
feat: auto-deploy testnet on merge, mainnet on release
rodrigopavezi Jan 29, 2026
24e7bf3
feat: add comprehensive unit tests for event parsing
rodrigopavezi Jan 29, 2026
ec1da40
fix: address PR review comments
rodrigopavezi Jan 29, 2026
d05e0bb
feat: configure TRON substream for mainnet-only deployment via Stream…
rodrigopavezi Feb 5, 2026
a89be03
Prepare for Easypanel production deployment
rodrigopavezi Feb 5, 2026
720ba6e
Prepare for Easypanel production deployment with new docker compose
rodrigopavezi Feb 5, 2026
a2217ad
Add compiled substreams package for production deployment
rodrigopavezi Feb 5, 2026
47480a8
Use single DSN environment variable for Easypanel compatibility
rodrigopavezi Feb 5, 2026
8e1b8db
Fix environment variable passthrough for Easypanel
rodrigopavezi Feb 5, 2026
aa4fa7d
Add Easypanel network for cross-service communication
rodrigopavezi Feb 5, 2026
f516c22
Remove hardcoded container_name to avoid Easypanel conflicts
rodrigopavezi Feb 5, 2026
8424ce3
Add chain field to payments for multi-network support
rodrigopavezi Feb 5, 2026
e47d133
Add comprehensive README with development and deployment guide
rodrigopavezi Feb 5, 2026
a26168a
Add The Graph Network integration for decentralized indexing
rodrigopavezi Feb 5, 2026
38b2180
Add automated subgraph deployment to GitHub Actions
rodrigopavezi Feb 5, 2026
9e6e175
Update subgraph naming to match Request Network convention
rodrigopavezi Feb 5, 2026
ba3e510
Remove The Graph subgraph integration (not supported for native TRON)
rodrigopavezi Feb 5, 2026
4dba197
Add 0x prefix to payment_reference and document Hasura integration
rodrigopavezi Feb 5, 2026
56aaf4f
Add TRON-native resource fields (energy_used, energy_fee, net_fee)
rodrigopavezi Feb 5, 2026
0904a84
Fix extract_owner_address to properly decode protobuf TriggerSmartCon…
rodrigopavezi Feb 9, 2026
b96459b
Use multi-stage Docker build to compile .spkg from source
rodrigopavezi Feb 9, 2026
47b0342
Add log_index to payment key to prevent collisions on duplicate payme…
rodrigopavezi Feb 9, 2026
4d2b169
Add Easypanel deployment workflows for staging and production
rodrigopavezi Feb 9, 2026
5a29500
Fix hardcoded .spkg filename and incorrect DB connection scheme
rodrigopavezi Feb 9, 2026
4a907d6
Add replay.log to .gitignore
rodrigopavezi Feb 9, 2026
ce5ce36
Fix endpoint mismatch, timestamp cast, and missing db primary key
rodrigopavezi Feb 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Streamingfast API Token
# Get from: https://app.streamingfast.io/
SUBSTREAMS_API_TOKEN=your-streamingfast-api-token

# PostgreSQL Password (for local development)
POSTGRES_PASSWORD=changeme

# PostgreSQL Port (optional, defaults to 5432)
# Use a different port if 5432 is already in use
POSTGRES_PORT=5433
13 changes: 13 additions & 0 deletions .env.prod.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Production Environment Variables for Easypanel
# Copy this to .env.prod and fill in the values

# PostgreSQL connection (from Easypanel's built-in PostgreSQL service)
POSTGRES_HOST=your-project-postgres.internal
POSTGRES_PORT=5432
POSTGRES_DB=tron_payments
POSTGRES_USER=postgres
POSTGRES_PASSWORD=your-secure-password-here

# Streamingfast API Token
# Get from: https://app.streamingfast.io/
SUBSTREAMS_API_TOKEN=your-streamingfast-api-token
14 changes: 14 additions & 0 deletions .github/workflows/deploy-to-production.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
name: Deploy to production

on:
workflow_dispatch:
release:
types: [published]

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Webhook request
run: |
curl -X GET https://prod.request.network/api/deploy/${{ secrets.EASYPANEL_DEPLOY_KEY_PRODUCTION }}
14 changes: 14 additions & 0 deletions .github/workflows/deploy-to-staging.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
name: Deploy to staging

on:
workflow_dispatch:
push:
branches: [main]

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Webhook request
run: |
curl -X GET https://stage.request.network/api/deploy/${{ secrets.EASYPANEL_DEPLOY_KEY_STAGING }}
262 changes: 262 additions & 0 deletions .github/workflows/tron-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,262 @@
name: Tron Substreams Build

on:
pull_request:
branches:
- main
paths:
- 'tron/**'
- '.github/workflows/tron-build.yml'
push:
branches:
- main
paths:
- 'tron/**'
- '.github/workflows/tron-build.yml'
workflow_dispatch:
inputs:
run_integration_tests:
description: 'Run integration tests against live endpoints'
required: false
default: false
type: boolean
publish_package:
description: 'Build and publish package artifact'
required: false
default: false
type: boolean

jobs:
build-and-test:
name: Build and Test Tron Substreams
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown

- name: Cache Cargo dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
tron/target/
key: ${{ runner.os }}-cargo-${{ hashFiles('tron/Cargo.toml') }}
restore-keys: |
${{ runner.os }}-cargo-

- name: Build WASM module
working-directory: tron
run: make build

- name: Run unit tests
working-directory: tron
run: make test

- name: Verify build artifacts
working-directory: tron
run: |
echo "Checking build artifacts..."
if [ ! -f "target/wasm32-unknown-unknown/release/request_network_tron.wasm" ]; then
echo "ERROR: WASM file not found!"
exit 1
fi
echo "Build artifacts verified successfully"

integration-test-mainnet:
name: Integration Test (Mainnet)
runs-on: ubuntu-latest
needs: build-and-test
# Run on: push to main (merge) or manual trigger
# PRs only run unit tests (no API key needed)
if: |
github.event.inputs.run_integration_tests == 'true' ||
github.event.inputs.publish_package == 'true' ||
(github.event_name == 'push' && github.ref == 'refs/heads/main')

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown

- name: Cache Cargo dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
tron/target/
key: ${{ runner.os }}-cargo-${{ hashFiles('tron/Cargo.toml') }}
restore-keys: |
${{ runner.os }}-cargo-

- name: Install Substreams CLI
run: |
curl -sSL https://github.com/streamingfast/substreams/releases/latest/download/substreams_linux_x86_64.tar.gz | tar xz
sudo mv substreams /usr/local/bin/
substreams --version

- name: Build WASM module
working-directory: tron
run: make build

- name: Package Substreams
working-directory: tron
run: make package

- name: Verify package created
working-directory: tron
run: |
SPKG_FILE=$(ls -1 *.spkg 2>/dev/null | head -1)
if [ -z "$SPKG_FILE" ]; then
echo "ERROR: No .spkg package file found!"
exit 1
fi
echo "✅ Package created: $SPKG_FILE"

- name: Deploy and test against Mainnet (Streamingfast)
working-directory: tron
env:
SUBSTREAMS_API_TOKEN: ${{ secrets.SUBSTREAMS_API_TOKEN }}
run: |
echo "=== Deploying to TRON Mainnet (Streamingfast) ==="
echo "Endpoint: mainnet.tron.streamingfast.io:443"
echo "Block range: 79216121 to 79216221 (100 blocks from mainnet deployment)"
echo ""

SPKG_FILE=$(ls -1 *.spkg | head -1)
echo "Using package: $SPKG_FILE"

# Run substreams and capture JSON output
if ! substreams run "$SPKG_FILE" map_erc20_fee_proxy_payments \
-e mainnet.tron.streamingfast.io:443 \
--start-block 79216121 \
--stop-block +100 \
-o json 2>&1 | tee output_mainnet.log; then
echo ""
echo "❌ FAILED: Substreams command returned non-zero exit code"
echo "Output:"
cat output_mainnet.log
exit 1
fi

echo ""
echo "=== Validating Results ==="

# If any payments were found, validate the structure
if grep -q '"payments"' output_mainnet.log; then
echo "✅ Payments data structure detected in output"

# Extract and validate payment fields if present
if grep -q '"token_address"' output_mainnet.log; then
echo "✅ Payment fields present: token_address"
fi
if grep -q '"payment_reference"' output_mainnet.log; then
echo "✅ Payment fields present: payment_reference"
fi
if grep -q '"amount"' output_mainnet.log; then
echo "✅ Payment fields present: amount"
fi
else
echo "ℹ️ No payments found in block range (expected if no transactions in these blocks)"
fi

echo ""
echo "=== Mainnet Integration Test PASSED ==="
echo "The substreams module successfully:"
echo " - Loaded WASM module"
echo " - Connected to TRON Mainnet endpoint via Streamingfast"
echo " - Processed 100 blocks without errors"
echo " - Output valid JSON structure"

# Publish package artifact for download/deployment
publish-package:
name: Publish Mainnet Package
runs-on: ubuntu-latest
needs: [build-and-test, integration-test-mainnet]
# Publish on: push to main (merge) or manual publish selection
if: |
(github.event_name == 'push' && github.ref == 'refs/heads/main') ||
github.event.inputs.publish_package == 'true'

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown

- name: Cache Cargo dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
tron/target/
key: ${{ runner.os }}-cargo-${{ hashFiles('tron/Cargo.toml') }}
restore-keys: |
${{ runner.os }}-cargo-

- name: Install Substreams CLI
run: |
curl -sSL https://github.com/streamingfast/substreams/releases/latest/download/substreams_linux_x86_64.tar.gz | tar xz
sudo mv substreams /usr/local/bin/

- name: Build WASM module
working-directory: tron
run: make build

- name: Package Substreams
working-directory: tron
run: make package

- name: Get package info
id: package_info
working-directory: tron
run: |
SPKG_FILE=$(ls -1 *.spkg 2>/dev/null | head -1)
if [ -z "$SPKG_FILE" ]; then
echo "ERROR: No .spkg package file found!"
exit 1
fi
echo "spkg_file=$SPKG_FILE" >> $GITHUB_OUTPUT

VERSION=$(grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')
echo "version=$VERSION" >> $GITHUB_OUTPUT

echo "Package created successfully: $SPKG_FILE (version: $VERSION)"

- name: Upload package artifact
uses: actions/upload-artifact@v4
with:
name: request-network-tron-${{ steps.package_info.outputs.version }}
path: tron/${{ steps.package_info.outputs.spkg_file }}
retention-days: 90

- name: Package ready for deployment
run: |
echo "=============================================="
echo "📦 Substreams Package Ready"
echo "=============================================="
echo ""
echo "Package: ${{ steps.package_info.outputs.spkg_file }}"
echo "Version: ${{ steps.package_info.outputs.version }}"
echo "=============================================="
22 changes: 22 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Rust build artifacts
target/

# Substreams packages (built during Docker/CI)
*.spkg

# Substreams replay log
replay.log

# IDE
.idea/
.vscode/
*.swp
*.swo

# OS
.DS_Store
Thumbs.db

# Environment
.env
.env.local
Loading