Network-Funded Account Onboarding
VP-0001
Summary
This program lets wallets and applications give their users Vaulta accounts free and instantly. The RAM each new account needs is gifted from a network-owned endowment, so the wallet or app pays nothing for it. Any wallet or app can apply to become a creator, and producers admit each one with its own 15/21 MSIG and a daily byte quota, 256 KiB by default, that caps what it can gift.
Producers are asked to approve two 15/21 MSIGs. Together they create the account gift.vaulta, move 1,000,000,000 bytes of RAM (worth about 338,800 EOS at the 2026-10-17 price) to it from admin.grants, and deploy a contract that lets approved creators gift that RAM to the accounts they create. admin.grants is the former Foundation account, holding RAM bought with network funds. Gifted RAM never reaches the market: a recipient cannot sell or transfer it, and its only exit is a return to gift.vaulta, which can gift it again. Two security reviews of the contract and its permissions found no critical or high issue. The program launches with no creators. Questions and answers covers the program's effect on RAM price, fund.wram, and account farming.
Contract source
You can read the gift contract's full source code at greymass/vaulta-contracts, contracts/gift, commit 6fad4b0. This is the exact code vp1deploy deploys to gift.vaulta, and Enactment shows how to rebuild it and check its hashes.
Rationale
- Free accounts: A bare account uses 2,996 bytes of RAM, 1,400 of them free, so whoever creates it buys at least 1,596 bytes, about 0.54 EOS at the 2026-10-17 price, or about 1.0 EOS for the 3,000 bytes this proposal recommends. A wallet or app admitted as a creator gives its users accounts free and at once, paid from network-owned RAM held in
admin.grants. - Market neutrality: Nobody can sell gifted RAM, creator or recipient, so it never re-enters the RAM market and mass account creation cannot be turned into tokens. A creator could still direct its quota into accounts it controls and use the RAM as storage, and the daily quota caps how fast that can happen.
- Cost at observed volume: If every one of the 11,082 accounts created on Vaulta in the 90 days to 2026-10-17 had been created through this program, at the RAM each actually received plus the 136-byte overhead, the program would have spent 28.4 MB, which is 2.8% of the seed.
Enactment
Enactment is two MSIGs, each 15/21, proposed by Greymass and executed in order:
vp1createcreatesgift.vaultawitheosio::newaccountand buys it 4,096 bytes of RAM paid byeosio.vp1deploy, proposed oncegift.vaultaexists, transfers the 1,000,000,000-byte seed fromadmin.grantswithramtransfer, creates thehaltandsuspendpermissions and links their actions, runslimitauthchg, sets the contract code and ABI, and ends withenable.
Both are declared as planned msigs entries and built by this proposal's msig/index.ts, and each is proposed with a 180-day expiration.
The gift contract's source code is contracts/gift in greymass/vaulta-contracts at commit 6fad4b08cebfc922b80d09f86cb2590505c22a06, which differs from a9a9a59, the commit the second security review read, only in its README. Built with Antelope CDT v4.1.1 by make build/gift/production, that commit produces a 20,977-byte gift.wasm with sha256 27ed7ecee18f1a81ec7e9ed4aeacdd76de6e1431f66eb62d363067480ddd3072 and a gift.abi with sha256 17d1ccd52f99782cee42a619dd02cd75c9567d1f716969334ec7f7cf7fbc07f8. vp1deploy sets that code, and the binary ABI it sets has sha256 4f39f95e9c4d7d0efb65407ea599f4336656b5075d3d72b3447289b8107590ab, the ABI hash the chain reports for gift.vaulta once vp1deploy executes. Anyone with Docker and make can reproduce these bytes: at that commit, make build/gift/production builds inside a container holding the official CDT 4.1.1 release package and writes gift.wasm and gift.abi to contracts/gift/build/. The same build runs on the Jungle 4 testnet at gift.gm.
Greymass ran two security reviews of the contract and the permission design, at commit a23b756 and at the pinned commit. Anthropic's Claude Mythos, Fable and Opus found the issues and showed each one with a test, and Fable and Opus re-ran every test to confirm, correct or refute each finding. Greymass wrote the contract and ran both reviews, so neither is independent of the author. Neither found a critical or high issue, and every finding is closed in this proposal's text, its enactment steps or its operating rules, or accepted with its reason. The security review lists every finding. Producers are welcome to fund a further review from the network, and any team can review the source at the pinned commit.
How a gift works
A creator creates an account and gifts it RAM in one transaction:
eosio::newaccount, signed by whichever account owns the new name's suffix under the usual premium-name rules (gmcreatingfoo.gm).gift.vaulta::giftacct(creator, account, bytes, memo), signed by the creator. The contract checks the creator and its quota, then sends an inlineeosio::giftramofbytesfromgift.vaultato the new account.
The contract accepts a gift only for an account that a top-level newaccount in the same transaction creates, so the program reaches only new accounts, and accounts created by contract code or inside an msig exec cannot receive a gift (the giftacct itself may arrive inline; see Technical notes). It does not check who signed the newaccount. A creator can therefore fund names under a suffix it does not own when the suffix's owner signs, and one creator can use any number of suffixes against one quota: a creator registered as gm that also owns jm creates bob.jm by signing newaccount as jm and giftacct as gm, and the gift debits gm's quota.
The smallest gift that creates an account is 1,596 bytes, because a bare account uses 2,996 bytes and the system adds 1,400 free bytes once an account holds any RAM. Creators should gift at least 3,000 bytes, which also covers the account's own EOS and A token balances (240 and 241 bytes) and a first REX stake (489 bytes) with about 434 bytes to spare. The creator chooses each gift's size and may gift more, for example enough for an app's own state.
A new account starts with no NET or CPU, since the gift raises only its RAM. A creator stakes, powers up or pays for its users' transactions as it does for any account it creates.
Quota
Each creator has a daily byte quota, and each gift debits it by the gifted bytes plus 136 bytes, the row the system contract bills the gifter for each giftee, a fixed constant in the contract. The quota therefore bounds what the endowment actually spends.
- The default quota for a newly admitted creator is 262,144 bytes (256 KiB) a day: about 150 accounts at the smallest gift, or about 83 at 3,000 bytes. In the 90 days to 2026-10-17 the busiest steady account creator on Vaulta,
pcash, created at most 59 accounts in a day, which at its 1,600 bytes each plus 136 would use 102,424 bytes of quota, andgmcreated at most 29 at 3,000 bytes each, which would use 90,944. A creator that shows a larger need asks for a larger quota in its application, and any later change is a 15/21setquota. - A quota must be at least 1,972 bytes: one 1,836-byte gift, which creates a bare account with room for one token balance of its own, plus 136.
- A creator's 24-hour window starts at its first gift and resets at its first gift 24 hours or more later, counted in whole seconds. A creator can therefore spend two full quotas within one block interval, one just before the reset and one just after.
- No cap applies across creators. The most the program can spend in a day is the sum of all quotas, which grows only when producers admit a creator or raise a quota, both at 15/21.
- Removing and re-admitting a creator resets its usage for the current window and clears any suspension, and
setquotakeeps both. - When a gift would exceed the remaining quota, or the program is disabled or the creator suspended, the creator creates the account the classic way and pays for its RAM itself, by
buyrambytesor its owngiftram, so its users' sign-ups continue.
Contract actions
| Action | Auth | Purpose |
|---|---|---|
giftacct(creator, account, bytes, memo) |
creator |
Gift bytes from gift.vaulta to an account created in the same transaction, debiting the creator's quota |
addcreator(creator, daily_quota_bytes) |
gift.vaulta@active (15/21) |
Register a creator with a daily quota |
rmcreator(creator) |
gift.vaulta@active (15/21) |
Remove a creator |
setquota(creator, daily_quota_bytes) |
gift.vaulta@active (15/21) |
Change a creator's quota |
enable() |
gift.vaulta@active (15/21) |
Allow registered creators to gift RAM |
disable() |
gift.vaulta@halt (11/21) |
Stop all gifting and keep every registration |
suspend(creator) |
gift.vaulta@suspend (8/21) |
Stop one creator's gifting and keep its registration |
resume(creator) |
gift.vaulta@halt (11/21) |
Lift a creator's suspension |
The contract keeps an enabled flag that is off at deployment, so it gifts nothing until enable passes. giftacct checks the creator's authority and then the flag, so disable stops every creator at once. A suspended creator's gifts fail. Its registration, quota, usage and window start are unchanged, resume lets it gift again, and rmcreator deletes its row. Each creator's quota, usage and suspended field are public in the contract's creators table, and every gift is a public giftacct action.
Endowment
The seed is 1,000,000,000 bytes, transferred from admin.grants with ramtransfer. It takes over a third of the 2,812,891,144-byte RAM quota admin.grants held on 2026-10-17, and admin.grants had moved RAM to other accounts by ramtransfer 281 times by that date. Every later refill also uses ramtransfer, since RAM sent to gift.vaulta with giftram stays locked there and cannot be gifted on. Releasing such RAM takes a 15/21 ungiftram, which returns the whole gift to its gifter. If gift.vaulta's own RAM would then no longer cover its usage beyond 1,400 bytes, the same transaction first sends it that RAM by ramtransfer.
A bare account needs about 1,600 gifted bytes and creators that leave users room to work give up to about 3,300, so with the 136-byte overhead the seed covers about 290,000 to 580,000 accounts. Larger gifts cover fewer: at the 6,144 bytes signup.xsat gives each account it funds with giftram, about 159,000. At the volume Vaulta saw in the 90 days to 2026-10-17, across every creator on the chain, it lasts nearly nine years. The worst case is self-dealing, where every creator spends its full quota every day on accounts it controls: ten creators at the 256 KiB default drain the seed in about 380 days, and producers can suspend any one of them well before that.
A refill would be a further 15/21 MSIG, decided on its own merits. Producers can also end the program with disable and return its RAM to admin.grants with a 15/21 ramtransfer from gift.vaulta. That moves everything except the larger of two amounts: the bytes covering gift.vaulta's own usage beyond its 1,400 free bytes (its code, ABI and tables, and a 136-byte row for each outstanding gift), or any RAM gifted to it. Gifts returned later land in gift.vaulta and move with a further ramtransfer.
The quotas bound the daily drain, and gifting stops once the seed is spent. gift.vaulta pays for its own code, ABI and tables, 216,918 bytes at launch, so the largest gift that lands is gift.vaulta's RAM balance plus its 1,400 free bytes, less that usage and the 136-byte overhead, and 215,654 bytes of gift.vaulta's balance are never giftable. A gift one byte larger fails with account gift.vaulta has insufficient ram. Every creator's gifting then stops at once, so one creator's spending can end another's service. addcreator fails too, since a new registry row needs RAM, while disable, enable, suspend, resume, setquota and rmcreator keep working.
Becoming a creator
Admission needs a passed 15/21 BP MSIG carrying addcreator(creator, daily_quota_bytes), whose first action is a msigmessager::message linking the creator's application.
An application may be published anywhere. Filing it as a creator VP in the greymass/vaulta-proposals GitHub repository is recommended, since a VP gives producers a reviewable, permanent document and gives the msig its citation; that repository's template/creator/ holds the application form and an addcreator msig builder. Every application answers six required sections:
- Identity: the account to be registered and who operates it.
- Use and quota: the products that will call
giftacct, the bytes it plans to gift per account and why, the free and paid share of expected volume, and the requested daily quota with evidence of current creation volume. - Real users: what an end user must present and how the creator's server verifies it, the caps applied per person, device, IP address and day with the identifier each keys on, how aliased and disposable identities are handled, and the naming rules enforced.
- Transaction shape: a top-level
eosio::newaccountfollowed bygiftacct; howgiftacctis sent (signed by the creator's key, through an msig it approves, or by a contract it deploys, and for a contract who can call it and what bounds those callers); whether the creator funds accounts whosenewaccounta third party signs; how retries stay idempotent so a request never spends quota twice; and how the creator pays for accounts above its quota. - Self-dealing: how the operator's own, staff and partner accounts are kept apart from gifted RAM.
- Accountability: the alerts that fire on unusual volume, the creator's own stop, and its response to a compromised signing key and how long that takes.
Each producer judges an application on its answers to these sections.
A Jungle 4 transaction showing the creator's production flow calling giftacct is recommended. The gift contract's README at the pinned commit is the integration guide and carries a worked transaction.
A quota increase or a re-admission uses a short change request, published anywhere and linked from the first action of its msig: a link to the original application, the current and requested quota, usage since admission, the reason, and any changed answers. A re-admission adds what caused the removal and what has been fixed. Lowering a quota, suspending a creator and resuming one need no change request.
Stopping a creator or the program
Two child permissions of gift.vaulta@active let smaller groups of producers stop gifting, each bound to its actions with eosio::linkauth:
gift.vaulta@halthas the single authority entryeosio.prods@prod.major(11 of 21 producers) and is linked todisableandresume.gift.vaulta@suspendhas the single authority entryeosio.prods@prod.minor(8 of 21 producers) and is linked tosuspend.
Both are used through eosio.msig, which is how prod.major and prod.minor sign, so the account that executes a stop pays its CPU and NET. active (15/21) can run any action, and enable, addcreator, rmcreator and setquota need it.
- Suspending one creator or all: Eight producers can suspend any creator, and one msig carrying a
suspendfor each can stop every creator. While the msig gathers approvals, a creator whose key is compromised can spend(days the msig takes + 1) × quota, because the window already open adds one quota: at the default quota and a five-day msig, 1,572,864 bytes (about 1.5 MiB), an accepted loss. Theenabledflag still reads true while creators are suspended, so a client reads a creator'ssuspendedfield together withenabledto tell whether that creator's gifts run. - Halting the program: Eleven producers can
disablethe whole program. Restarting it withenabletakes 15/21. - Removing a creator:
rmcreatorat 15/21 removes a malicious or defunct creator, andsetquotalowers a quota. Since a quota cannot go below 1,972 bytes,suspendandrmcreatorare how a single creator is stopped. - Compromised creator keys: The creator rotates its own keys, which evicts the attacker at once and leaves its registration intact.
- Minority stops: The fast stops also let a minority hold a stop in place. A suspension lasts while any eight producers keep approving a further
suspend: aresumeby eleven holds only until the nextsuspendexecutes, which can be in the same block, and any account can execute asuspendproposal the eight approved in advance, including against a creator admitted after they approved it. Eleven producers who stockresumeproposals can likewise undo everysuspend. A dispute between the two groups is settled at 15/21 by changing thesuspendpermission's authority or links, withauthorized_byset toactive(see Account authority). Any 15 of 21 includes at least two of the eight, so eight producers acting together can also block that change, and the hold then ends when voters change the producer schedule. Seven producers can keep a disabled program off by withholding approval ofenable. Producers accept this in exchange for stops that do not wait for full consensus. - Recovery: A gift leaves an account only through
ungiftram, which returns the whole gift togift.vaulta, once the account holds RAM of its own (see Known Constraints). Producers could force a return with a 15/21ungiftramthrougheosio.wrap, but the same msig would have to give the account that RAM first. For a 3,000-byte gift to a bare account the top-up is 1,596 bytes, so the network gets back 1,540 of the 3,136 bytes the gift cost and the account holder ends up owning the 1,596 bytes its account occupies. Forcing returns from farmed accounts would hand the farmer accounts backed by RAM it owns, so the program answers abuse at the creator, and every byte gifted and occupied before a stop lands stays spent.
A running program needs no msigs. Producers act when a creator joins, asks for more, or misbehaves: one 15/21 msig per admission and one per quota increase. Any producer or community member can watch for misbehavior in the public record described in How a gift works.
Account authority
ownerandactiveboth delegate toeosio.prods@active, which resolves to 15/21 BP consensus.activealso carriesgift.vaulta@eosio.code, so the contract can send its inlinegiftramunder its own authority.ownerdoes not carry it, so the contract's code can never drive the account's highest authority.gift.vaultais an ordinary, unprivileged account.giftramrequires only the gifter's authority, and the contract calls no privileged host function. This proposal requires no change toeosio.system.- Creators hold no permission on
gift.vaulta. They are rows in the contract's registry, managed by MSIG through the admin actions. - The last authority step of
vp1deployiseosio::limitauthchg(gift.vaulta, [owner, active], []). A link restricts which permission an ordinary action needs and leaves the native permission actions open, so without this step either child permission could change its own authority, re-link its actions, or create further permissions billed togift.vaulta. With it, everyupdateauth,deleteauth,linkauthandunlinkauthongift.vaultamust carry anauthorized_byofowneroractiveand be authorized by the permission it names, or the system contract rejects it: a change authorized byactivethat namesownerfails. This confineshaltandsuspendto their linked actions and applies to every later 15/21 authority change, including any run througheosio.wrap. - Producers can hand governance of the program to another body with one 15/21 MSIG that changes
gift.vaulta'sownerandactiveauthorities, and thehaltandsuspendpermissions if the stops move too. The contract checks onlygift.vaulta's own authority, so it needs no change.
Operating rules
Producers, and whoever assembles their msigs, keep these rules, which the security review cites as closing its findings:
- Every transfer into
gift.vaultausesramtransfer, andgift.vaultastays unmanaged: nosetacctramfixes its RAM limit, which would stop the limit tracking its balance. disable,suspendandresumemsigs carry short expirations, and producers watcheosio.msigfor standing proposals that namegift.vaulta.- The account executing an
enablemsig executes every standingdisableproposal first, in the same transaction, so none is left to undo it. After any msig that sets code or theenabledflag executes, its proposer reads the flag. - A child permission of
gift.vaultais retired under a new name. Deleting one and re-creating it under the same name revives every proposal approved under the old one, because Spring resolves a permission by name. - Invalidating a producer's approvals through
eosio.wrapvoids every approval that producer holds on the chain, so producers weigh it as a chain-wide act. - Every contract upgrade that changes a table's layout uses
binary_extensionor ships with a migration, and every upgrade msig ends with a state-preserving action on each table:disablethenenablewhen the program is on,enablethendisablewhen it is off, andsetquotafor one creator at its own quota. A schema break then reverts the whole upgrade. - Once the endowment nears exhaustion, a refill msig runs before any admission msig.
Technical notes
- Routes for
giftacct:giftacctmay be sent as a top-level action or inline: by the creator's key, by aneosio.msigproposal the creator approved, by a creator contract holdingcreator@eosio.code, or by producers at 15/21 througheosio.wrap::exec. Every route debits the named creator's quota, so the creator answers for every gift made under its authority. Any account can execute an approved msig proposal, aneosio.wrapone included, and the account that executes it writes the top-levelnewaccountand chooses the new account's keys, so a creator using the msig route sends the last approval, thenewaccountand the execution in one transaction, or gifts only names under a suffix whose owner signs thenewaccountitself. - Indexing: Every field an indexer wants is an explicit input to
giftacct, which names the creator whichever route sent it. An indexer readsgiftacctfrom inline traces as well as from the transaction's own actions, and needs inline traces to reconcile RAM balances, sincegiftramis sent inline. Thecreatorthatnewaccountrecords names the signer, which can differ from the creator whose quota paid, so endowment spending is read fromgiftacct. - Two gifts to one account: A second
giftacctfor the same account in one transaction is charged the 136 bytes again, although the system contract keeps one row, so the extra charge only overstates spending. - No griefing: Nobody outside the creating transaction can gift a new account first, and the program cannot reach existing accounts.
gift.vaultacannot be blocked: another party'sgiftramto it only adds locked RAM, and the contract has no notification handlers, so it never refuses a giftee's return. - Verification: Checked against Spring source and the system contracts at release v3.10.0, which the 2025-07-15 Vaulta transition msig deployed to
eosioand which matches the commit each citation links.giftramrequires only the gifter's authority (delegate_bandwidth.cpp), which the contract satisfies inline througheosio.code, and checks that the recipient exists, whichnewaccountearlier in the transaction ensures. New-account RAM is checked at the end of the transaction (Springtransaction_context::finalize), so the inline gift covers the account's footprint, the same mechanismnewaccountplusbuyrambytesrelies on. The 1,400 free bytes are the system'sram_gift_bytes. The 136-byte row overhead was confirmed on mainnet in transactionf2c6200c1add5ffc74837bcae1731ff5a66e259376eee6a4d4d7580f044a0b4c, where a 3,000-byte gift billed exactly 136 bytes to the gifter.
Disclosure
Greymass wrote this proposal and the gift contract, and operates gm, the account-creation service behind Anchor and the Greymass account portal. As of 2026-10-17 Greymass is not among the top 30 producers, so it signs no admission msig, its own included. Greymass intends to apply for gm as a creator, as Next Steps describes.
Scope Boundaries
- Gifts happen only at account creation, and the contract enforces it, so creators cannot top up an existing account.
- This program serves registered creators, with the network covering RAM. Self-serve, paid account creation is
new.vaulta(VP-0002).
Known Constraints
- One gifter per account: The system contract allows a single RAM gifter per account at a time. Accounts created under this program cannot receive another party's
giftram(for example from an app) until they return the network's gift in full. Buying their own RAM, or receiving it byramtransfer, is unaffected. - Full-return only:
ungiftramreturns the entire gift. A giftee can return its gift only once it holds RAM of its own covering its usage beyond 1,400 bytes, and the NET and CPU to sign the return.
Open Questions
None.
Next Steps
- Greymass proposes
vp1create. It is done when it executes. - Greymass proposes
vp1deployoncegift.vaultaexists. It is done when it executes withenableas its last action. - Greymass publishes
gm's creator application. Its admission MSIG can execute only aftervp1deploy. - Further creators apply as described in Becoming a creator, each admitted by its own 15/21 MSIG.