Companies as NEP-171 NFTs on NEAR

A company you can sellin one NFT transfer.

Each Incorpr token is an AI service with its own NEAR sub-account, USDC revenue ledger, and Bitcoin, Solana and EVM addresses. The sub-account has no access keys, so there is no seed phrase for a seller to keep.

01The problem

An operating wallet cannot be safely sold.

Whoever generated a private key still has it after the sale, and a buyer cannot prove otherwise. That is why revenue-generating on-chain accounts are hard to sell or lend against.

Selling a walletSelling an Incorpr company
Who holds the keyWhoever generated it, indefinitelyNobody. MPC nodes sign when the vault contract asks
Seller access after the saleCannot be ruled outEnds when the vault records the new shareholder
Signatures issued before the saleInvisible to the buyerCounted on-chain. A company with any this epoch cannot be listed
Revenue figuresSeller-suppliedBooked from USDC transfers. No account can report revenue
FinancingOff-chain, or noneUSDC loans against the NFT, with signing frozen until repayment

02How it works

From incorporation to exit.

Five stages, each a contract call you can read. The registry holds the NFT and the market. Each company's vault holds its money and signing rights.

  1. 01

    Incorporate

    incorporate_company

    Creates c-<id>.<registry>, deploys the vault with no access keys, and mints the NFT only if that succeeds. A failed deployment refunds the deposit. The founder sets the per-call price, a treasury target across BTC, SOL and USDC, a royalty of up to 10%, and a compute reserve of at least 1%.

  2. 02

    Earn

    ft_on_transfer

    Customers pay per call in USDC on NEAR with ft_transfer_call. The vault checks the amount against the price, splits it between compute reserve and retained earnings, and stores the payment. Paying a call does not depend on the operator, and the service route checks the on-chain payment before it runs inference.

  3. 03

    Compound

    agent_swap_intent

    The treasury agent proposes a swap as structured fields. A model in a NEAR AI Cloud TEE approves or rejects a request the vault wrote. The vault verifies that signature on-chain, applies its firewall, then builds and requests signing of a token_diff intent for intents.near. One swap has settled on mainnet: 0.5 USDC to SOL on intents.near. The hosted app only quotes rebalances unless INCORPR_ALLOW_MAINNET_REBALANCE is true.

  4. 04

    Finance

    accept_offer

    Lenders post funded USDC offers against a specific company. When the owner accepts, the vault freezes first and the principal is sent second. Repayment unfreezes it. After a default, a Dutch auction runs from 200% down to 50% of the debt. With no bid, the lender can claim the company.

  5. 05

    Sell

    list_company

    The owner lists at an ask in USDC. The listing activates only after the vault accepts the freeze. On purchase, shareholder rights are suspended, the NFT and funds move, the founder royalty is paid, and only then does the buyer become shareholder. If the vault step fails, the buyer is refunded.

03Company state

Three states decide who can do what.

Listing or pledging freezes the owner's rights. The company keeps taking payments and serving calls, so it keeps earning while it is for sale or in debt.

ActionFREELISTEDPLEDGED
Raw L1 signing by shareholderAllowedFrozenFrozen
Dividend claimsAllowedFrozenFrozen
Policy and operator changesAllowedFrozenFrozen
Agent swaps and depositsAllowedFrozenFrozen
Direct NFT transferAllowedFrozenFrozen
Receiving customer paymentsAllowedAllowedAllowed
Serving paid calls, paying computeAllowedCharter operatorCharter operator

04Security model

A freeze alone does not protect a buyer.

A seller can get a transaction signed, keep it unbroadcast, sell the company, then broadcast it. Freezing signing at listing does not stop that, and neither does a mempool check. Incorpr closes it by tracking what each key has signed.

Pre-signed transaction rule

  1. 01Every raw signature increments raw_sigs_this_epoch before the MPC call is made.
  2. 02Listing or pledging panics while that counter is above zero, with ERR_RAW_SIGNATURES_THIS_EPOCH.
  3. 03rotate_treasury_epoch moves the company to new addresses and resets the counter. The seller moves funds across first.
  4. 04NAV counts only current-epoch addresses and the vault's intents.near balance, so counted assets sit on keys that have never signed a raw payload.

A signature that lands between the registry call and the vault freeze makes the listing fail. Marketplace sales through nft_transfer_payout meet the same check.

Agent firewall

The operator is treated as compromised. It sends structured fields and never bytes to sign. The vault checks them in this order and writes the signed payload itself.

  • Caller is the operator; company is FREEERR_ACCOUNT_ENCUMBERED_AGENT_FROZEN
  • Tokens are on the shareholder's allow listERR_FIREWALL_BLOCKED_TOKEN
  • Withdrawal destination is the company's own addressERR_FIREWALL_BLOCKED_UNWHITELISTED_DESTINATION
  • Per-token spend is inside the 24-hour capERR_FIREWALL_EPOCH_CAP_EXCEEDED
  • Swap rate meets the shareholder's price floorERR_FIREWALL_PRICE_BELOW_FLOOR
  • Nonce has not been usedERR_NONCE_USED
  • Attested model signed exactly APPROVE <hash>ERR_TEE_NOT_APPROVED
  • Recovered signer is a trusted TEE keyERR_TEE_SIGNATURE_UNTRUSTED

Who can do what

ActorCanCannot
ShareholderClaim dividends and sign raw L1 payloads while FREE. Rotate the treasury epoch.Sign, claim or change policy while listed, pledged or in transit.
OperatorRequest vault-built intents inside policy, with a TEE approval. Pay compute to a fixed payee. Mark paid calls as served.Supply bytes to sign, write the model prompt, choose a destination, or report revenue.
RegistryUpdate the vault's owner and encumbrance.Sign anything on the vault's behalf.
AnyoneTrigger key setup, refresh metrics, read all state.Choose which key is registered. The vault reads it from the signer.

Known limits

  • A compromised operator can resubmit a proposal until a nondeterministic model approves it, and a colluding solver can then fill at the minimum price. Loss per window is bounded by the epoch cap and price floor.
  • A price floor is a shareholder-set lower bound, not an oracle. It goes stale when the market moves.
  • 30-day revenue is not sybil-resistant. Only the current shareholder's own payments are excluded, so a seller's second account counts as a customer. Payer concentration is readable through payment_stats.
  • TEE signers, models and the prompt hash are set by the shareholder. A buyer should compare them with the live attestation. None of them widen the set of allowed destinations.
  • While a company is listed, the charter operator can still spend the compute reserve, only to the fixed compute payee.

05Built on

Four NEAR primitives, each doing a specific job.

NEAR sub-accounts

c-<id>.<registry>

One contract per company, isolated state, zero access keys, no upgrade method.

Chain Signatures

v1.signer

Secp256k1 for Bitcoin and EVM, Ed25519 for Solana and intents. The vault composes every derivation path.

NEAR Intents

intents.near, 1Click

Treasury swaps signed under a key only the vault can use, priced against live 1Click quotes. One swap settled on mainnet: 0.5 USDC to SOL.

NEAR AI Cloud

cloud-api.near.ai

Inference in Intel TDX and NVIDIA TEEs. The vault recovers the ECDSA signer with ecrecover before it acts on an approval.

NEP-171NEP-177 on-chain SVG charterNEP-178NEP-181NEP-199 royaltiesNEP-297 events

06Build status

What runs today, and what does not yet.

This list is here so you do not have to work it out from the code.

Contract suite100 tests passing, 77 of them on a local NEAR sandbox node at protocol 87Done
Web suite419 tests passing, 3 skipped, including end-to-end contract actions on a local sandboxDone
Mainnet deploymentincorpr.near and the keyless vault c-1.incorpr.near at protocol 88. Pay, list, sell, lend, borrow, repay, claim dividends and a treasury swap all run on mainnet; 48 transactions re-checked against the chainDone
Rob this companyLive on mainnet. Five attacks sent from real keys, including the agent agreeing in chat, and the vault refused each one on-chainDone
TEE inference end to endA paid call served by NEAR AI Cloud on mainnet; the ECDSA signature recovers to the attested TDX signer and the call is recorded on the vaultDone
Address derivationRead from the live mainnet signer, v1.signer, on this pageDone
App screensExchange, Incorporate, Company, Desk, Rob and Verify, all reading mainnet stateDone
Treasury rebalanceRun on mainnet: TEE approval checked on-chain, intent signed by v1.signer for the vault, settled by a NEAR Intents solver. 0.5 USDC swapped to 0.005545636 SOLDone
Transfer races13 sandbox tests send a payout and a sale, pledge or transfer in the same blocks, including a dividend claim still in flight when the company is sold. In each, the seller ends with at most the dividends accrued before the saleDone
Threat modeldocs/THREAT_MODEL.md lists 17 ways a seller or borrower could try to keep the money, each with the contract rule, its test and the mainnet transaction where one existsDone
Per-company historyThe company page lists payments, payouts, refusals and every holder, rebuilt from contract events and reconciled with the vault counters on 8 fieldsDone
Holder-only owner room/company/1/owner opens only for the account nft_token names, checked on every request. Tested with real NEP-413 signatures and a mocked chain; a wallet sign-in by the mainnet holder has not been runPartial
Scoped operator keyLive on mainnet: the server signs with a function-call key limited to the vault and five methods. The chain refused a transfer, another contract, a deposit and an unlisted method signed with itDone
Bitcoin spend and held signatureRun on mainnet: the owner had the vault sign a BTC transfer and held it; listing was refused with ERR_RAW_SIGNATURES_THIS_EPOCH. The transfer was then broadcast from the keyless address and the epoch rotatedDone
Pay in another tokenRun on mainnet: wNEAR swapped to USDC through NEAR Intents 1Click, then booked by the vault as a paid call. A source token on another chain takes the same 1Click route; not runDone

07Open the registry

Incorporate one,or buy one outright.

Every company on the exchange shows its booked revenue, retained earnings, state and ask, read from its vault.

lifecycleincorpr.near

// the five calls a company passes through

>incorporate_company // incorporate

>ft_on_transfer // earn

>agent_swap_intent // compound

>accept_offer // finance

>list_company // sell