Qurion Contracts
Solidity 0.8.24 protocol for Qurion on BNB Smart Chain. Hardhat.
Launching a meme token mints a fixed supply to the human caller, registers an agent, and opens an empty agent wallet. Studio records Build → Publish → Launch. An optional board sells owner inventory at a fixed BNB price. The default mandate is paper-only. executeLive always reverts. The session key cannot withdraw.
This is not a Binance CEX listing, not Flap Portal, and not audited.
The production console at app.qurion.xyz launches originals through Flap (Portal.newTokenV6 on BNB). These contracts are the optional Qurion factory path: they only apply after you deploy them and set NEXT_PUBLIC_FACTORY_ADDRESS (and related addresses) in the app.
Status
| | |
| --- | --- |
| Compiler | Solidity 0.8.24, optimizer 200 runs |
| Networks in config | Hardhat local, BSC testnet (97), BSC (56) |
| Audit | None |
| Mainnet factory | Not assumed. Do not treat empty .env.example addresses as deployed. |
| License | MIT (SPDX-License-Identifier: MIT on sources) |
Experimental. Meme tokens are high-risk. Do not point deploy:testnet at a funded mainnet key until mandates have been reviewed.
Architecture
TokenFactory.launch(name, symbol, supply, agentURI)
│
├─► MemeToken fixed supply → msg.sender
├─► AgentWallet empty; session cannot withdraw
├─► AgentRegistry (owner, token, wallet, uri)
└─► MandateManager paper, approval on, autoExecute forced off
Studio.create → publish → bindLaunch(productId, agentId)
└─► BoardSale owner parks tokens; buyers pay BNB to the owner
Contracts
| Contract | Responsibility |
| --- | --- |
| core/MemeToken.sol | Minimal ERC-20-like token. Supply minted once to the recipient. No later mint, tax, or blacklist. |
| core/TokenFactory.sol | Deploys token + wallet, registers the agent, writes the initial mandate. |
| core/AgentRegistry.sol | Agent identity. Factory is one-shot. |
| core/AgentWallet.sol | Paper buy/sell intents only. No execute(address,bytes). No ERC-20 approve for a router. executeLive reverts. |
| core/MandateManager.sol | Size cap, daily cap, stop, allowlist, pause, revoke. Owner-only setMandate. consume() accounts paper notional; it never transfers. |
| core/Studio.sol | Product stages: draft → published → launched. Optional startSale. |
| core/BoardSale.sol | Fixed BNB price. Proceeds to the owner, not the agent. |
| interfaces/ | Stable ABI surface for the app and this repo’s tests. |
Mandate defaults (factory)
| Field | Default |
| --- | --- |
| maxPosition | 0.05 BNB |
| dailyLimit | 0.2 BNB |
| stopLoss | 15% (1500 bps) |
| approvalRequired | true |
| autoExecute | false (cannot be enabled in this version) |
| paperOnly | true |
MAX_TOKENS on a mandate is 16. Stop must be in (0, 10000] bps.
Invariants (do not weaken)
- Mint to the human.
MemeTokenbalance ofmsg.senderequalssupply. Agent wallet token balance is 0 at launch. - No withdraw from the agent path. Wallet has no owner-drain called by the session key.
- No live.
executeLivereverts. There is no generic call target. - Paper consume is accounting.
MandateManager.consumedoes not move ERC-20 or BNB. - Pause / revoke are owner acts. They clear the right to submit. They are not an agent privilege.
- Board proceeds are owner proceeds. The agent cannot start or skim a sale.
- Not a CEX listing. Nothing here lists a token on Binance the exchange.
Layout
core/ Implementations
interfaces/ ITokenFactory, IAgentRegistry, IAgentWallet, IMandateManager, IStudio, IERC20
scripts/ deploy.js — deploys registry, mandates, factory, studio; links factory
test/ AgentProtocol.js, Studio.js
hardhat.config.js
.env.example Empty DEPLOYER_PRIVATE_KEY. Copy locally. Never commit a filled copy.
paths.sources is the repo root; Hardhat is told to ignore node_modules, artifacts, and cache.
Develop
Node 20+.
npm install
npm test
npm run build
Tests cover:
- Supply mints to the caller; agent wallet stays empty.
- Studio walk: create → publish →
TokenFactory.launch→bindLaunch→ BNB board buy.
Deploy
Local:
npx hardhat node # other terminal
npm run deploy:local
Testnet:
cp .env.example .env # fill DEPLOYER_PRIVATE_KEY locally only
.env is gitignored
npm run deploy:testnet
hardhat.config.js reads DEPLOYER_PRIVATE_KEY, BSC_TESTNET_RPC, and BSC_RPC from the environment. Empty accounts array if no key — compile and tests still work.
The script prints:
{
"chainId": 97,
"registry": "0x…",
"mandates": "0x…",
"factory": "0x…",
"studio": "0x…",
"note": "Live execution is disabled. Default mandates are paper-only. Studio is Build → Publish → Launch on BNB."
}
Wire those into the console as public addresses (not keys):
NEXT_PUBLIC_FACTORY_ADDRESS=
NEXT_PUBLIC_MANDATE_ADDRESS=
NEXT_PUBLIC_WALLET_ADDRESS=
NEXT_PUBLIC_STUDIO_ADDRESS=
Until those are set, Launch in the app still uses Flap, and the factory button stays disabled.
Do not run this against BSC mainnet from a key you cannot afford to lose. There is no audit and no bug bounty in this repo.
Public GitHub
Safe to publish if .env stays out of git (it is gitignored) and you never paste a deployer key into hardhat.config.js.
Check before push:
git status
git check-ignore -v .env
git grep -E 'DEPLOYER_PRIVATE_KEY=0x' || true
Also gitignored: node_modules/, cache/, artifacts/. Recompile after clone. Do not commit a keystore JSON.
On-chain bytecode is public once deployed anyway. The risk of a public repo is keys, false “audited / listed” claims, and people forking the factory as if it were Flap.
Flap Portal on BNB (0xe2cE6ab80874Fa9Fa2aAE65D277Dd6B8e65C9De0) is not in this repository.
Related
| Surface | Role |
| --- | --- |
| Qurion agent | Local TS layer: paper intents, architect draft, factory args only |
| main-app | Next console; Flap launch; optional factory if addresses are set |
| landing-page | qurion.xyz |
Experimental software. High-risk if used with real meme inventory. The agent cannot withdraw. Live stays off.