User Journey
This page describes the end-to-end flow from a new user signing up to having DeFi positions executed on their behalf by an approved operator.
The Two User Paths
NMT supports two distinct user types with different onboarding flows:
NEW USER
|
+-- "I want an operator to execute DeFi on my behalf" → SAFE PATH (Delegated)
|
+-- "I want to execute directly" → EOA PATH (Self-Directed)
Safe Path: Delegated Execution
This is the primary flow — a user delegates DeFi strategy execution to an approved operator. The operator executes within the bounds of user-granted permissions. NMT operators do not provide investment advice and do not act as fiduciaries.
Step 1: Sign Up & Connect Wallet
- User visits the platform and clicks "Connect Wallet"
- Dynamic Labs SDK presents wallet options (MetaMask, WalletConnect, Coinbase, email, Google)
- User connects and signs a message to authenticate
- Dynamic Labs issues a JWT → frontend creates an
iron-sessioncookie - A
userrecord is created in PostgreSQL (or matched to an existing one)
Step 2: Operator Assignment
- A platform administrator (super/admin role) assigns the user to an operator via the Admin panel
- The user's
advisor_idis set in the database, linking them to their assigned operator - Both user and operator can now see each other in the platform
Step 3: Safe Deployment (All Chains)
- The operator (or user) initiates Safe creation from the platform
- The frontend deploys a Gnosis Safe on all 4 supported chains (Base, Ethereum, Arbitrum, Optimism) using ERC-4337 Account Abstraction:
- A
saltNonceis used for deterministic addresses — the Safe gets the same address on every chain (via CREATE2) - The deployment is submitted as a UserOperation to Gelato's ERC-4337 bundler
- Gelato sponsors the gas (zero cost to the user)
- A
- In a single atomic UserOperation per chain, the following is set up:
- Safe contract is deployed
- Protocol modules are enabled (Aave, Uniswap V3, Morpho, Yearn, Aerodrome, Relay, Cow, Krystal)
- Permissions are granted to both the owner and the delegate (operator)
- On Base chain: subscription is initialized (first month free)
- Database records are created:
safe_account,safe_delegate, module status records
Step 4: Fund the Safe
- User transfers tokens (USDC, ETH, etc.) to their Safe address from their personal wallet or an exchange
- The frontend displays the Safe's token balances (read from blockchain via Viem)
Step 5: Subscribe
- User navigates to the subscription page
- Approves the SubscriptionManager contract to spend USDC from the Safe
- Clicks "Subscribe" — first month is free
- After 30 days, the backend auto-renews by calling
payForSubscription()via Gelato Relay - The operator may apply a discount voucher (signed via EIP-712)
Step 6: Operator Executes Strategies
- Operator browses the Earn page to find available DeFi pools and vaults
- Selects a pool/vault and builds a transaction (e.g., "Deposit 1,000 USDC into Aave on Base")
- The frontend encodes the calls via DeFi adapters and the DelegateBundler
- Operator signs an EIP-712 message (not a blockchain transaction)
- The signed message is submitted to Gelato Relay (gasless)
- On-chain: DelegateBundler verifies signature → checks permissions → executes through protocol modules → Safe interacts with the DeFi protocol
- Backend workers detect the on-chain events and create position records in PostgreSQL
Step 7: Monitor & Manage
- Portfolio dashboard shows all positions, P&L, and historical performance
- Backend workers recalculate position valuations every 24 hours
- User and operator communicate via built-in CometChat messaging
- Operator can adjust positions, rebalance, or close strategies as needed within granted permissions
Disclaimer: Past performance of any DeFi position does not indicate or guarantee future results. All DeFi activities involve risk, including the potential loss of deposited assets. Users should independently evaluate any position before granting execution permissions.
EOA Path: Self-Directed Trading
For users who want direct control without delegation.
Step 1: Sign Up & Connect Wallet
Same as the Safe path — connect wallet via Dynamic Labs.
Step 2: Trade Directly
- User browses the Earn page or goes to a specific protocol section
- Selects a pool/vault and builds a transaction
- Signs and submits the transaction directly from their wallet (
walletClient.sendTransaction()) - User pays their own gas
Step 3: Portfolio View
- Token balances and DeFi positions are fetched via Zerion API (not tracked by the backend)
- P&L and portfolio charts come from Zerion
- EOA positions do not appear in
nmt_positiontable — they are display-only from Zerion
Revenue Model
NMT monetizes through monthly USDC subscription fees paid from each delegated Safe:
| Aspect | Detail |
|---|---|
| Payment token | USDC on Base chain |
| Billing cycle | Monthly (30 days) |
| First month | Free |
| Renewal | Automated via backend worker + Gelato Relay |
| Pricing | Set on-chain in the SubscriptionManager contract (read dynamically, not hardcoded) |
| Discounts | Operators can create EIP-712 signed discount vouchers for their clients |
| Fee collection | Backend calls withdrawFees() after each renewal cycle to collect protocol revenue |
Revenue breakdown per renewal:
| Field | Meaning |
|---|---|
usdc_price |
Full undiscounted cost |
usdc_discount |
Discount amount (if voucher applied) |
usdc_payment |
Amount actually charged |
Subscription expiry: If a subscription lapses, the frontend shows warning alerts but delegate operations are not blocked at the smart contract level. The subscription is a platform service agreement — the PermissionsManager and protocol modules do not check subscription status. The on-chain infrastructure continues to function regardless of payment status.