Update docs vis-a-vis prohibition of RentPaying accounts (#22438)
* Rent-exempt docs for exchange integrations * Remove discussion of rent-paying accounts from developing docs * Improve verbiage
This commit is contained in:
parent
4854fadc44
commit
b27333e52d
|
@ -135,72 +135,13 @@ blockchain cluster must actively maintain the data to process any future transac
|
||||||
This is different from Bitcoin and Ethereum, where storing accounts doesn't
|
This is different from Bitcoin and Ethereum, where storing accounts doesn't
|
||||||
incur any costs.
|
incur any costs.
|
||||||
|
|
||||||
The rent is debited from an account's balance by the runtime upon the first
|
Currently, all new accounts are required to be rent-exempt.
|
||||||
access (including the initial account creation) in the current epoch by
|
|
||||||
transactions or once per an epoch if there are no transactions. The fee is
|
|
||||||
currently a fixed rate, measured in bytes-times-epochs. The fee may change in
|
|
||||||
the future.
|
|
||||||
|
|
||||||
For the sake of simple rent calculation, rent is always collected for a single,
|
|
||||||
full epoch. Rent is not pro-rated, meaning there are neither fees nor refunds
|
|
||||||
for partial epochs. This means that, on account creation, the first rent
|
|
||||||
collected isn't for the current partial epoch, but collected up front for the
|
|
||||||
next full epoch. Subsequent rent collections are for further future epochs. On
|
|
||||||
the other end, if the balance of an already-rent-collected account drops below
|
|
||||||
another rent fee mid-epoch, the account will continue to exist through the
|
|
||||||
current epoch and be purged immediately at the start of the upcoming epoch.
|
|
||||||
|
|
||||||
Accounts can be exempt from paying rent if they maintain a minimum balance. This
|
|
||||||
rent-exemption is described below.
|
|
||||||
|
|
||||||
### Calculation of rent
|
|
||||||
|
|
||||||
Note: The rent rate can change in the future.
|
|
||||||
|
|
||||||
As of writing, the fixed rent fee is 19.055441478439427 lamports per byte-epoch
|
|
||||||
on the testnet and mainnet-beta clusters. An [epoch](terminology.md#epoch) is
|
|
||||||
targeted to be 2 days (For devnet, the rent fee is 0.3608183131797095 lamports
|
|
||||||
per byte-epoch with its 54m36s-long epoch).
|
|
||||||
|
|
||||||
This value is calculated to target 0.01 SOL per mebibyte-day (exactly matching
|
|
||||||
to 3.56 SOL per mebibyte-year):
|
|
||||||
|
|
||||||
```text
|
|
||||||
Rent fee: 19.055441478439427 = 10_000_000 (0.01 SOL) * 365(approx. day in a year) / (1024 * 1024)(1 MiB) / (365.25/2)(epochs in 1 year)
|
|
||||||
```
|
|
||||||
|
|
||||||
And rent calculation is done with the `f64` precision and the final result is
|
|
||||||
truncated to `u64` in lamports.
|
|
||||||
|
|
||||||
The rent calculation includes account metadata (address, owner, lamports, etc)
|
|
||||||
in the size of an account. Therefore the smallest an account can be for rent
|
|
||||||
calculations is 128 bytes.
|
|
||||||
|
|
||||||
For example, an account is created with the initial transfer of 10,000 lamports
|
|
||||||
and no additional data. Rent is immediately debited from it on creation,
|
|
||||||
resulting in a balance of 7,561 lamports:
|
|
||||||
|
|
||||||
```text
|
|
||||||
Rent: 2,439 = 19.055441478439427 (rent rate) * 128 bytes (minimum account size) * 1 (epoch)
|
|
||||||
Account Balance: 7,561 = 10,000 (transfered lamports) - 2,439 (this account's rent fee for an epoch)
|
|
||||||
```
|
|
||||||
|
|
||||||
The account balance will be reduced to 5,122 lamports at the next epoch even if
|
|
||||||
there is no activity:
|
|
||||||
|
|
||||||
```text
|
|
||||||
Account Balance: 5,122 = 7,561 (current balance) - 2,439 (this account's rent fee for an epoch)
|
|
||||||
```
|
|
||||||
|
|
||||||
Accordingly, a minimum-size account will be immediately removed after creation
|
|
||||||
if the transferred lamports are less than or equal to 2,439.
|
|
||||||
|
|
||||||
### Rent exemption
|
### Rent exemption
|
||||||
|
|
||||||
Alternatively, an account can be made entirely exempt from rent collection by
|
An account is considered rent-exempt if it holds at least 2 years worth of rent.
|
||||||
depositing at least 2 years worth of rent. This is checked every time an
|
This is checked every time an account's balance is reduced, and transactions
|
||||||
account's balance is reduced, and rent is immediately debited once the balance
|
that would reduce the balance to below the minimum amount will fail.
|
||||||
goes below the minimum amount.
|
|
||||||
|
|
||||||
Program executable accounts are required by the runtime to be rent-exempt to
|
Program executable accounts are required by the runtime to be rent-exempt to
|
||||||
avoid being purged.
|
avoid being purged.
|
||||||
|
|
|
@ -153,10 +153,9 @@ generate a Solana keypair using any of our [wallet tools](../wallet-guide/cli.md
|
||||||
|
|
||||||
We recommend using a unique deposit account for each of your users.
|
We recommend using a unique deposit account for each of your users.
|
||||||
|
|
||||||
Solana accounts are charged [rent](developing/programming-model/accounts.md#rent) on creation and once per
|
Solana accounts must be made rent-exempt by containing 2-years worth of
|
||||||
epoch, but they can be made rent-exempt if they contain 2-years worth of rent in
|
[rent](developing/programming-model/accounts.md#rent) in SOL. In order to find
|
||||||
SOL. In order to find the minimum rent-exempt balance for your deposit accounts,
|
the minimum rent-exempt balance for your deposit accounts, query the
|
||||||
query the
|
|
||||||
[`getMinimumBalanceForRentExemption` endpoint](developing/clients/jsonrpc-api.md#getminimumbalanceforrentexemption):
|
[`getMinimumBalanceForRentExemption` endpoint](developing/clients/jsonrpc-api.md#getminimumbalanceforrentexemption):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
@ -567,6 +566,20 @@ public class PubkeyValidator
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Minimum Deposit & Withdrawal Amounts
|
||||||
|
|
||||||
|
Every deposit and withdrawal of SOL must be greater or equal to the minimum
|
||||||
|
rent-exempt balance for the account at the wallet address (a basic SOL account
|
||||||
|
holding no data), currently: 0.000890880 SOL
|
||||||
|
|
||||||
|
Similarly, every deposit account must contain at least this balance.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","id":1,"method":"getMinimumBalanceForRentExemption","params":[0]}' localhost:8899
|
||||||
|
|
||||||
|
{"jsonrpc":"2.0","result":890880,"id":1}
|
||||||
|
```
|
||||||
|
|
||||||
## Supporting the SPL Token Standard
|
## Supporting the SPL Token Standard
|
||||||
|
|
||||||
[SPL Token](https://spl.solana.com/token) is the standard for wrapped/synthetic
|
[SPL Token](https://spl.solana.com/token) is the standard for wrapped/synthetic
|
||||||
|
@ -750,4 +763,4 @@ Be sure to test your complete workflow on Solana devnet and testnet
|
||||||
[clusters](../clusters.md) before moving to production on mainnet-beta. Devnet
|
[clusters](../clusters.md) before moving to production on mainnet-beta. Devnet
|
||||||
is the most open and flexible, and ideal for initial development, while testnet
|
is the most open and flexible, and ideal for initial development, while testnet
|
||||||
offers more realistic cluster configuration. Both devnet and testnet support a faucet,
|
offers more realistic cluster configuration. Both devnet and testnet support a faucet,
|
||||||
run `solana airdrop 1` to obtain some devnet or testnet SOL for developement and testing.
|
run `solana airdrop 1` to obtain some devnet or testnet SOL for development and testing.
|
||||||
|
|
Loading…
Reference in New Issue