One Wallet. Every App.
Your Rules.

Every app gives you a new wallet. New balance. New headache. We thought that was broken. So we built one wallet that works everywhere, where every app plays by your rules. Set what it can spend, how long it has access, and revoke it anytime.

Get Started
Try Live Demo

*No account required

Get Started
Try Live Demo

*No account required


Feels like (software),not (crypto).

Why MOSS Changes Everything

Every app built on MOSS removes the friction users hate and gives developers the primitives they actually need. Build apps that feel like software, not crypto.

Without MOSS

Feels like crypto

X

Multiple wallets and fragmented balances

X

Repeated signing and approval prompts

X

Users need ETH to transact

X

Complex onboarding and funding flows

X

Users constantly leave your app

With MOSS

Feels like software, not crypto

One wallet across every app

Approve once, then interact continuously

Gas handled: sponsor or pay with any token

Built-in funding rails for every entry point

Users stay inside your app

Connect. Sign. Transfer.In 3 lines of code

MOSS handles the wallet iframe, secure messaging, session keys, and sponsored gas so you ship features, not plumbing.

Without MOSS

18 Lines,~60 min to integrate

// Raw ERC-4337 path
const bundler = createBundlerClient({
  transport: http(bundlerUrl),
  chain: megaeth,
});
const account = await toSmartAccount({
  owner,
  factory,
});
const userOp = await buildUserOp({
  account,
  calls,
});
const signature = await owner.signMessage(
  hashUserOp(userOp),
);
const receipt = await bundler.waitForUserOpReceipt({
  hash: await bundler.sendUserOp({ ...userOp, signature }),
});

With MOSS

3 Lines, <10 min to integrate

import { mega } from '@megaeth-labs/wallet-sdk'; await mega.initialise({ network: 'mainnet' }); const result = await mega.transfer({ type: 'native', to: '0xRecipient', amount: parseEther('1'), });
// result.status === 'approved' // result.receipt.hash ready

Give your AI agents
a wallet they can
actually use.

MOSS is the execution and permission layer for AI agents in crypto applications. No private key exposure. No escrow contracts. No human approval loops.

No private key exposureNo escrow contractsNo approval popups

One permission grant. Agent runs within bounds until it expires or you revoke it.

1

Raw EOA + private key

  • xOne leaked key means total, irreversible loss
  • xNo permission layer, no spend limits, no revocation
  • xAgent has unconstrained access to all funds
2

Custom escrow contracts

  • xUsers must deposit funds before agent can operate
  • xEvery new rule needs a contract deployment
  • xNew attack surface, weeks of engineering overhead
3

Human wallet SDKs

  • xEvery action needs a human to click Confirm
  • xSession keys grafted on, not first-class
  • xCross-app execution requires separate connections
const wallet = new ethers.Wallet(process.env.AGENT_KEY); //
key leaks = total loss. no limits.
const wallet = new ethers.Wallet(process.env.AGENT_KEY); //
key leaks = total loss. no limits.
// the footgun everyone starts with
const wallet = new ethers.Wallet(process.env.AGENT_KEY); //
key leaks = total loss. no limits.
1

No key management

  • Session keys live in MOSS infrastructure.
  • Your agent never touches them.
  • Call mega.revokePermissions() to stop the agent immediately.
2

No escrow contracts

  • Permissions apply directly to the wallet.
  • Zero contract deployment.
  • Reduced attack surface compared to escrow systems.
3

Scoped and time-bound

  • Per-app spend limits, daily caps, and automatic expiry in every grant.
  • Transactions confirm in under 10ms on MegaETH.
  • Temporary access windows reduce long-term risk exposure.
// Grant scoped permissions once. Agent runs silently.
await mega.grantPermissions({
permissions: {
expiry: now + 86400,
permissions: {
calls: [{ to: wcmContractAddress, signature: 'executeLimitOrder(uint256)' }],
spend: [{ limit: Value.fromEther('5'), period: 'day' }],
}
}
});
// Agent executes. No popup. No user present.
const result = await mega.callContract({
address: wcmContractAddress,
abi: wcmAbi,
functionName: 'executeLimitOrder',
args: [orderId],
silent: true, // key line
});
# CONFIRMED