solana-docs 0.0.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of solana-docs might be problematic. Click here for more details.
- package/index.js +47 -0
- package/package.json +7 -45
- package/.eslintignore +0 -8
- package/.eslintrc +0 -21
- package/.prettierignore +0 -7
- package/.travis/before_install.sh +0 -9
- package/.travis/script.sh +0 -4
- package/README.md +0 -59
- package/art/data-plane-fanout.bob +0 -19
- package/art/data-plane-neighborhood.bob +0 -25
- package/art/data-plane-seeding.bob +0 -15
- package/art/data-plane.bob +0 -18
- package/art/fork-generation.bob +0 -13
- package/art/forks-pruned.bob +0 -9
- package/art/forks-pruned2.bob +0 -11
- package/art/forks.bob +0 -13
- package/art/passive-staking-callflow.msc +0 -30
- package/art/retransmit_stage.bob +0 -45
- package/art/runtime.bob +0 -10
- package/art/sdk-tools.bob +0 -20
- package/art/spv-bank-hash.bob +0 -19
- package/art/spv-block-merkle.bob +0 -19
- package/art/tpu.bob +0 -19
- package/art/tvu.bob +0 -37
- package/art/validator-proposal.bob +0 -60
- package/art/validator.bob +0 -30
- package/babel.config.js +0 -3
- package/build-cli-usage.sh +0 -42
- package/build.sh +0 -40
- package/convert-ascii-to-svg.sh +0 -21
- package/crowdin.yml +0 -16
- package/docusaurus.config.js +0 -161
- package/offline-cmd-md-links.sh +0 -11
- package/publish-docs.sh +0 -56
- package/set-solana-release-tag.sh +0 -20
- package/sidebars.js +0 -210
- package/src/cli/.usage.md.header +0 -59
- package/src/cli/choose-a-cluster.md +0 -43
- package/src/cli/conventions.md +0 -80
- package/src/cli/delegate-stake.md +0 -206
- package/src/cli/deploy-a-program.md +0 -302
- package/src/cli/install-solana-cli-tools.md +0 -164
- package/src/cli/transfer-tokens.md +0 -158
- package/src/cli.md +0 -22
- package/src/cluster/bench-tps.md +0 -129
- package/src/cluster/fork-generation.md +0 -64
- package/src/cluster/leader-rotation.md +0 -88
- package/src/cluster/managing-forks.md +0 -36
- package/src/cluster/overview.md +0 -39
- package/src/cluster/performance-metrics.md +0 -25
- package/src/cluster/rpc-endpoints.md +0 -50
- package/src/cluster/stake-delegation-and-rewards.md +0 -197
- package/src/cluster/synchronization.md +0 -28
- package/src/cluster/turbine-block-propagation.md +0 -101
- package/src/cluster/vote-signing.md +0 -59
- package/src/clusters.md +0 -173
- package/src/css/custom.css +0 -73
- package/src/developing/backwards-compatibility.md +0 -151
- package/src/developing/clients/javascript-api.md +0 -332
- package/src/developing/clients/javascript-reference.md +0 -750
- package/src/developing/clients/jsonrpc-api.md +0 -5173
- package/src/developing/clients/rust-api.md +0 -36
- package/src/developing/on-chain-programs/debugging.md +0 -110
- package/src/developing/on-chain-programs/deploying.md +0 -24
- package/src/developing/on-chain-programs/developing-c.md +0 -202
- package/src/developing/on-chain-programs/developing-rust.md +0 -406
- package/src/developing/on-chain-programs/examples.md +0 -61
- package/src/developing/on-chain-programs/faq.md +0 -81
- package/src/developing/on-chain-programs/overview.md +0 -218
- package/src/developing/plugins/accountsdb_plugin.md +0 -360
- package/src/developing/programming-model/accounts.md +0 -231
- package/src/developing/programming-model/calling-between-programs.md +0 -351
- package/src/developing/programming-model/overview.md +0 -17
- package/src/developing/programming-model/runtime.md +0 -131
- package/src/developing/programming-model/transactions.md +0 -210
- package/src/developing/runtime-facilities/programs.md +0 -168
- package/src/developing/runtime-facilities/sysvars.md +0 -142
- package/src/developing/test-validator.md +0 -153
- package/src/economics_overview.md +0 -20
- package/src/history.md +0 -60
- package/src/icons/Archivers.inline.svg +0 -11
- package/src/icons/Bulb.inline.svg +0 -13
- package/src/icons/Chat.inline.svg +0 -10
- package/src/icons/Clipboard.inline.svg +0 -13
- package/src/icons/Cloudbreak.inline.svg +0 -11
- package/src/icons/Code.inline.svg +0 -11
- package/src/icons/Fire.inline.svg +0 -10
- package/src/icons/Gamepad.inline.svg +0 -11
- package/src/icons/Globe.inline.svg +0 -1
- package/src/icons/Gulfstream.inline.svg +0 -11
- package/src/icons/History.inline.svg +0 -11
- package/src/icons/Money.inline.svg +0 -11
- package/src/icons/Pipeline.inline.svg +0 -15
- package/src/icons/PoH.inline.svg +0 -11
- package/src/icons/Sealevel.inline.svg +0 -11
- package/src/icons/Tools.inline.svg +0 -11
- package/src/icons/Tower.inline.svg +0 -11
- package/src/icons/Turbine.inline.svg +0 -12
- package/src/icons/duotone-icons/Clothes/Brassiere.svg +0 -10
- package/src/icons/duotone-icons/Clothes/Briefcase.svg +0 -11
- package/src/icons/duotone-icons/Clothes/Cap.svg +0 -11
- package/src/icons/duotone-icons/Clothes/Crown.svg +0 -11
- package/src/icons/duotone-icons/Clothes/Dress.svg +0 -11
- package/src/icons/duotone-icons/Clothes/Hanger.svg +0 -10
- package/src/icons/duotone-icons/Clothes/Hat.svg +0 -11
- package/src/icons/duotone-icons/Clothes/Panties.svg +0 -10
- package/src/icons/duotone-icons/Clothes/Shirt.svg +0 -11
- package/src/icons/duotone-icons/Clothes/Shoes.svg +0 -11
- package/src/icons/duotone-icons/Clothes/Shorts.svg +0 -10
- package/src/icons/duotone-icons/Clothes/Sneakers.svg +0 -11
- package/src/icons/duotone-icons/Clothes/Socks.svg +0 -11
- package/src/icons/duotone-icons/Clothes/Sun-glasses.svg +0 -11
- package/src/icons/duotone-icons/Clothes/T-Shirt.svg +0 -10
- package/src/icons/duotone-icons/Clothes/Tie.svg +0 -11
- package/src/icons/duotone-icons/Code/Backspace.svg +0 -11
- package/src/icons/duotone-icons/Code/CMD.svg +0 -10
- package/src/icons/duotone-icons/Code/Code.inline.svg +0 -11
- package/src/icons/duotone-icons/Code/Commit.svg +0 -11
- package/src/icons/duotone-icons/Code/Compiling.inline.svg +0 -11
- package/src/icons/duotone-icons/Code/Control.svg +0 -10
- package/src/icons/duotone-icons/Code/Done-circle.svg +0 -11
- package/src/icons/duotone-icons/Code/Error-circle.svg +0 -11
- package/src/icons/duotone-icons/Code/Git#1.svg +0 -12
- package/src/icons/duotone-icons/Code/Git#2.svg +0 -15
- package/src/icons/duotone-icons/Code/Git#3.svg +0 -13
- package/src/icons/duotone-icons/Code/Git#4.svg +0 -13
- package/src/icons/duotone-icons/Code/Github.svg +0 -11
- package/src/icons/duotone-icons/Code/Info-circle.svg +0 -12
- package/src/icons/duotone-icons/Code/Left-circle.svg +0 -11
- package/src/icons/duotone-icons/Code/Loading.svg +0 -12
- package/src/icons/duotone-icons/Code/Lock-circle.svg +0 -11
- package/src/icons/duotone-icons/Code/Lock-overturning.svg +0 -11
- package/src/icons/duotone-icons/Code/Minus.svg +0 -11
- package/src/icons/duotone-icons/Code/Option.svg +0 -11
- package/src/icons/duotone-icons/Code/Plus.svg +0 -11
- package/src/icons/duotone-icons/Code/Puzzle.svg +0 -10
- package/src/icons/duotone-icons/Code/Question-circle.svg +0 -11
- package/src/icons/duotone-icons/Code/Right-circle.svg +0 -11
- package/src/icons/duotone-icons/Code/Settings#4.svg +0 -11
- package/src/icons/duotone-icons/Code/Shift.svg +0 -10
- package/src/icons/duotone-icons/Code/Spy.svg +0 -11
- package/src/icons/duotone-icons/Code/Stop.svg +0 -10
- package/src/icons/duotone-icons/Code/Terminal.svg +0 -11
- package/src/icons/duotone-icons/Code/Thunder-circle.svg +0 -11
- package/src/icons/duotone-icons/Code/Time-schedule.svg +0 -11
- package/src/icons/duotone-icons/Code/Warning-1-circle.svg +0 -12
- package/src/icons/duotone-icons/Code/Warning-2.svg +0 -12
- package/src/icons/duotone-icons/Communication/Active-call.svg +0 -11
- package/src/icons/duotone-icons/Communication/Add-user.svg +0 -11
- package/src/icons/duotone-icons/Communication/Address-card.svg +0 -10
- package/src/icons/duotone-icons/Communication/Adress-book#1.svg +0 -11
- package/src/icons/duotone-icons/Communication/Adress-book#2.svg +0 -11
- package/src/icons/duotone-icons/Communication/Archive.svg +0 -10
- package/src/icons/duotone-icons/Communication/Call#1.svg +0 -10
- package/src/icons/duotone-icons/Communication/Call.svg +0 -10
- package/src/icons/duotone-icons/Communication/Chat#1.svg +0 -11
- package/src/icons/duotone-icons/Communication/Chat#2.svg +0 -11
- package/src/icons/duotone-icons/Communication/Chat#4.svg +0 -10
- package/src/icons/duotone-icons/Communication/Chat#5.svg +0 -11
- package/src/icons/duotone-icons/Communication/Chat#6.svg +0 -11
- package/src/icons/duotone-icons/Communication/Chat-check.svg +0 -11
- package/src/icons/duotone-icons/Communication/Chat-error.svg +0 -11
- package/src/icons/duotone-icons/Communication/Chat-locked.svg +0 -11
- package/src/icons/duotone-icons/Communication/Chat-smile.svg +0 -11
- package/src/icons/duotone-icons/Communication/Clipboard-check.svg +0 -12
- package/src/icons/duotone-icons/Communication/Clipboard-list.svg +0 -17
- package/src/icons/duotone-icons/Communication/Contact#1.svg +0 -11
- package/src/icons/duotone-icons/Communication/Delete-user.svg +0 -11
- package/src/icons/duotone-icons/Communication/Dial-numbers.svg +0 -18
- package/src/icons/duotone-icons/Communication/Flag.svg +0 -11
- package/src/icons/duotone-icons/Communication/Forward.svg +0 -10
- package/src/icons/duotone-icons/Communication/Group-chat.svg +0 -11
- package/src/icons/duotone-icons/Communication/Group.svg +0 -11
- package/src/icons/duotone-icons/Communication/Incoming-box.svg +0 -12
- package/src/icons/duotone-icons/Communication/Incoming-call.svg +0 -11
- package/src/icons/duotone-icons/Communication/Incoming-mail.svg +0 -11
- package/src/icons/duotone-icons/Communication/Mail-@.svg +0 -10
- package/src/icons/duotone-icons/Communication/Mail-attachment.svg +0 -11
- package/src/icons/duotone-icons/Communication/Mail-box.svg +0 -11
- package/src/icons/duotone-icons/Communication/Mail-error.svg +0 -11
- package/src/icons/duotone-icons/Communication/Mail-heart.svg +0 -11
- package/src/icons/duotone-icons/Communication/Mail-locked.svg +0 -11
- package/src/icons/duotone-icons/Communication/Mail-notification.svg +0 -11
- package/src/icons/duotone-icons/Communication/Mail-opened.svg +0 -11
- package/src/icons/duotone-icons/Communication/Mail-unocked.svg +0 -11
- package/src/icons/duotone-icons/Communication/Mail.svg +0 -10
- package/src/icons/duotone-icons/Communication/Missed-call.svg +0 -11
- package/src/icons/duotone-icons/Communication/Outgoing-box.svg +0 -12
- package/src/icons/duotone-icons/Communication/Outgoing-call.svg +0 -11
- package/src/icons/duotone-icons/Communication/Outgoing-mail.svg +0 -11
- package/src/icons/duotone-icons/Communication/RSS.svg +0 -12
- package/src/icons/duotone-icons/Communication/Readed-mail.svg +0 -11
- package/src/icons/duotone-icons/Communication/Reply-all.svg +0 -11
- package/src/icons/duotone-icons/Communication/Reply.svg +0 -10
- package/src/icons/duotone-icons/Communication/Right.svg +0 -10
- package/src/icons/duotone-icons/Communication/Safe-chat.svg +0 -11
- package/src/icons/duotone-icons/Communication/Send.svg +0 -10
- package/src/icons/duotone-icons/Communication/Sending mail.svg +0 -11
- package/src/icons/duotone-icons/Communication/Sending.svg +0 -11
- package/src/icons/duotone-icons/Communication/Share.svg +0 -11
- package/src/icons/duotone-icons/Communication/Shield-thunder.svg +0 -11
- package/src/icons/duotone-icons/Communication/Shield-user.svg +0 -12
- package/src/icons/duotone-icons/Communication/Snoozed-mail.svg +0 -11
- package/src/icons/duotone-icons/Communication/Spam.svg +0 -10
- package/src/icons/duotone-icons/Communication/Thumbtack.svg +0 -11
- package/src/icons/duotone-icons/Communication/Urgent-mail.svg +0 -11
- package/src/icons/duotone-icons/Communication/Write.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Baking-glove.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Bowl.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Chef.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Cooking-book.svg +0 -17
- package/src/icons/duotone-icons/Cooking/Cooking-pot.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Cutting board.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Dinner.svg +0 -14
- package/src/icons/duotone-icons/Cooking/Dish.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Dishes.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Fork-spoon-knife.svg +0 -15
- package/src/icons/duotone-icons/Cooking/Fork-spoon.svg +0 -13
- package/src/icons/duotone-icons/Cooking/Fork.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Frying-pan.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Grater.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Kitchen-scale.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Knife#1.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Knife#2.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Knife&fork#1.svg +0 -13
- package/src/icons/duotone-icons/Cooking/Knife&fork#2.svg +0 -13
- package/src/icons/duotone-icons/Cooking/Ladle.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Rolling-pin.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Saucepan.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Shovel.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Sieve.svg +0 -11
- package/src/icons/duotone-icons/Cooking/Spoon.svg +0 -12
- package/src/icons/duotone-icons/Design/Adjust.svg +0 -10
- package/src/icons/duotone-icons/Design/Anchor-center-down.svg +0 -14
- package/src/icons/duotone-icons/Design/Anchor-center-up.svg +0 -14
- package/src/icons/duotone-icons/Design/Anchor-center.svg +0 -11
- package/src/icons/duotone-icons/Design/Anchor-left-down.svg +0 -14
- package/src/icons/duotone-icons/Design/Anchor-left-up.svg +0 -14
- package/src/icons/duotone-icons/Design/Anchor-left.svg +0 -14
- package/src/icons/duotone-icons/Design/Anchor-right-down.svg +0 -14
- package/src/icons/duotone-icons/Design/Anchor-right-up.svg +0 -14
- package/src/icons/duotone-icons/Design/Anchor-right.svg +0 -14
- package/src/icons/duotone-icons/Design/Arrows.svg +0 -11
- package/src/icons/duotone-icons/Design/Bezier-curve.svg +0 -11
- package/src/icons/duotone-icons/Design/Border.svg +0 -10
- package/src/icons/duotone-icons/Design/Brush.svg +0 -11
- package/src/icons/duotone-icons/Design/Bucket.svg +0 -11
- package/src/icons/duotone-icons/Design/Cap-1.svg +0 -11
- package/src/icons/duotone-icons/Design/Cap-2.svg +0 -10
- package/src/icons/duotone-icons/Design/Cap-3.svg +0 -11
- package/src/icons/duotone-icons/Design/Circle.svg +0 -10
- package/src/icons/duotone-icons/Design/Color-profile.svg +0 -11
- package/src/icons/duotone-icons/Design/Color.svg +0 -10
- package/src/icons/duotone-icons/Design/Component.svg +0 -10
- package/src/icons/duotone-icons/Design/Crop.svg +0 -11
- package/src/icons/duotone-icons/Design/Difference.svg +0 -11
- package/src/icons/duotone-icons/Design/Edit.svg +0 -11
- package/src/icons/duotone-icons/Design/Eraser.svg +0 -10
- package/src/icons/duotone-icons/Design/Flatten.svg +0 -11
- package/src/icons/duotone-icons/Design/Flip-horizontal.svg +0 -12
- package/src/icons/duotone-icons/Design/Flip-vertical.svg +0 -12
- package/src/icons/duotone-icons/Design/Horizontal.svg +0 -11
- package/src/icons/duotone-icons/Design/Image.svg +0 -10
- package/src/icons/duotone-icons/Design/Interselect.svg +0 -11
- package/src/icons/duotone-icons/Design/Join-1.svg +0 -11
- package/src/icons/duotone-icons/Design/Join-2.svg +0 -11
- package/src/icons/duotone-icons/Design/Join-3.svg +0 -11
- package/src/icons/duotone-icons/Design/Layers.svg +0 -11
- package/src/icons/duotone-icons/Design/Line.svg +0 -12
- package/src/icons/duotone-icons/Design/Magic.svg +0 -11
- package/src/icons/duotone-icons/Design/Mask.svg +0 -11
- package/src/icons/duotone-icons/Design/Patch.svg +0 -12
- package/src/icons/duotone-icons/Design/Pen&ruller.svg +0 -11
- package/src/icons/duotone-icons/Design/Pen-tool-vector.svg +0 -11
- package/src/icons/duotone-icons/Design/Pencil.svg +0 -11
- package/src/icons/duotone-icons/Design/Picker.svg +0 -11
- package/src/icons/duotone-icons/Design/Pixels.svg +0 -15
- package/src/icons/duotone-icons/Design/Polygon.svg +0 -10
- package/src/icons/duotone-icons/Design/Position.svg +0 -10
- package/src/icons/duotone-icons/Design/Rectangle.svg +0 -10
- package/src/icons/duotone-icons/Design/Saturation.svg +0 -11
- package/src/icons/duotone-icons/Design/Select.svg +0 -11
- package/src/icons/duotone-icons/Design/Sketch.svg +0 -11
- package/src/icons/duotone-icons/Design/Stamp.svg +0 -11
- package/src/icons/duotone-icons/Design/Substract.svg +0 -11
- package/src/icons/duotone-icons/Design/Target.svg +0 -11
- package/src/icons/duotone-icons/Design/Triangle.svg +0 -10
- package/src/icons/duotone-icons/Design/Union.svg +0 -10
- package/src/icons/duotone-icons/Design/Vertical.svg +0 -11
- package/src/icons/duotone-icons/Design/Zoom minus.svg +0 -12
- package/src/icons/duotone-icons/Design/Zoom plus.svg +0 -12
- package/src/icons/duotone-icons/Devices/Airpods.svg +0 -13
- package/src/icons/duotone-icons/Devices/Android.svg +0 -11
- package/src/icons/duotone-icons/Devices/Apple-Watch.svg +0 -11
- package/src/icons/duotone-icons/Devices/Battery-charging.svg +0 -12
- package/src/icons/duotone-icons/Devices/Battery-empty.svg +0 -11
- package/src/icons/duotone-icons/Devices/Battery-full.svg +0 -11
- package/src/icons/duotone-icons/Devices/Battery-half.svg +0 -11
- package/src/icons/duotone-icons/Devices/Bluetooth.svg +0 -11
- package/src/icons/duotone-icons/Devices/CPU#1.svg +0 -17
- package/src/icons/duotone-icons/Devices/CPU#2.svg +0 -23
- package/src/icons/duotone-icons/Devices/Camera.svg +0 -12
- package/src/icons/duotone-icons/Devices/Cardboard-vr.svg +0 -11
- package/src/icons/duotone-icons/Devices/Cassete.svg +0 -12
- package/src/icons/duotone-icons/Devices/Diagnostics.svg +0 -12
- package/src/icons/duotone-icons/Devices/Display#1.svg +0 -11
- package/src/icons/duotone-icons/Devices/Display#2.svg +0 -12
- package/src/icons/duotone-icons/Devices/Display#3.svg +0 -12
- package/src/icons/duotone-icons/Devices/Gameboy.svg +0 -11
- package/src/icons/duotone-icons/Devices/Gamepad#1.svg +0 -11
- package/src/icons/duotone-icons/Devices/Gamepad#2.svg +0 -11
- package/src/icons/duotone-icons/Devices/Generator.svg +0 -13
- package/src/icons/duotone-icons/Devices/Hard-drive.svg +0 -11
- package/src/icons/duotone-icons/Devices/Headphones.svg +0 -11
- package/src/icons/duotone-icons/Devices/Homepod.svg +0 -11
- package/src/icons/duotone-icons/Devices/Keyboard.svg +0 -11
- package/src/icons/duotone-icons/Devices/LTE#1.svg +0 -11
- package/src/icons/duotone-icons/Devices/LTE#2.svg +0 -11
- package/src/icons/duotone-icons/Devices/Laptop-macbook.svg +0 -11
- package/src/icons/duotone-icons/Devices/Laptop.svg +0 -11
- package/src/icons/duotone-icons/Devices/Mic.svg +0 -11
- package/src/icons/duotone-icons/Devices/Midi.svg +0 -16
- package/src/icons/duotone-icons/Devices/Mouse.svg +0 -12
- package/src/icons/duotone-icons/Devices/Phone.svg +0 -12
- package/src/icons/duotone-icons/Devices/Printer.svg +0 -11
- package/src/icons/duotone-icons/Devices/Radio.svg +0 -14
- package/src/icons/duotone-icons/Devices/Router#1.svg +0 -11
- package/src/icons/duotone-icons/Devices/Router#2.svg +0 -11
- package/src/icons/duotone-icons/Devices/SD-card.svg +0 -10
- package/src/icons/duotone-icons/Devices/Server.svg +0 -12
- package/src/icons/duotone-icons/Devices/Speaker.svg +0 -11
- package/src/icons/duotone-icons/Devices/TV#1.svg +0 -12
- package/src/icons/duotone-icons/Devices/TV#2.svg +0 -11
- package/src/icons/duotone-icons/Devices/Tablet.svg +0 -11
- package/src/icons/duotone-icons/Devices/USB.svg +0 -12
- package/src/icons/duotone-icons/Devices/Usb-storage.svg +0 -11
- package/src/icons/duotone-icons/Devices/Video-camera.svg +0 -11
- package/src/icons/duotone-icons/Devices/Watch#1.svg +0 -13
- package/src/icons/duotone-icons/Devices/Watch#2.svg +0 -13
- package/src/icons/duotone-icons/Devices/Wi-fi.svg +0 -11
- package/src/icons/duotone-icons/Devices/iMac.svg +0 -12
- package/src/icons/duotone-icons/Devices/iPhone-X.svg +0 -11
- package/src/icons/duotone-icons/Devices/iPhone-back.svg +0 -10
- package/src/icons/duotone-icons/Devices/iPhone-x-back.svg +0 -10
- package/src/icons/duotone-icons/Electric/Air-conditioning.svg +0 -11
- package/src/icons/duotone-icons/Electric/Blender.svg +0 -10
- package/src/icons/duotone-icons/Electric/Fan.svg +0 -12
- package/src/icons/duotone-icons/Electric/Fridge.svg +0 -10
- package/src/icons/duotone-icons/Electric/Gas-stove.svg +0 -11
- package/src/icons/duotone-icons/Electric/Hair-dryer.svg +0 -11
- package/src/icons/duotone-icons/Electric/Highvoltage.svg +0 -10
- package/src/icons/duotone-icons/Electric/Iron.svg +0 -11
- package/src/icons/duotone-icons/Electric/Kettle.svg +0 -11
- package/src/icons/duotone-icons/Electric/Mixer.svg +0 -11
- package/src/icons/duotone-icons/Electric/Outlet.svg +0 -11
- package/src/icons/duotone-icons/Electric/Range-hood.svg +0 -11
- package/src/icons/duotone-icons/Electric/Shutdown.svg +0 -11
- package/src/icons/duotone-icons/Electric/Socket-eu.svg +0 -10
- package/src/icons/duotone-icons/Electric/Socket-us.svg +0 -10
- package/src/icons/duotone-icons/Electric/Washer.svg +0 -11
- package/src/icons/duotone-icons/Files/Cloud-download.svg +0 -11
- package/src/icons/duotone-icons/Files/Cloud-upload.svg +0 -11
- package/src/icons/duotone-icons/Files/Compilation.svg +0 -14
- package/src/icons/duotone-icons/Files/Compiled-file.svg +0 -14
- package/src/icons/duotone-icons/Files/Deleted-file.svg +0 -11
- package/src/icons/duotone-icons/Files/Deleted-folder.svg +0 -11
- package/src/icons/duotone-icons/Files/Download.inline.svg +0 -12
- package/src/icons/duotone-icons/Files/Downloaded file.svg +0 -11
- package/src/icons/duotone-icons/Files/Downloads-folder.svg +0 -11
- package/src/icons/duotone-icons/Files/Export.svg +0 -12
- package/src/icons/duotone-icons/Files/File-cloud.svg +0 -11
- package/src/icons/duotone-icons/Files/File-done.svg +0 -11
- package/src/icons/duotone-icons/Files/File-minus.svg +0 -11
- package/src/icons/duotone-icons/Files/File-plus.svg +0 -11
- package/src/icons/duotone-icons/Files/File.svg +0 -12
- package/src/icons/duotone-icons/Files/Folder-check.svg +0 -11
- package/src/icons/duotone-icons/Files/Folder-cloud.svg +0 -11
- package/src/icons/duotone-icons/Files/Folder-error.svg +0 -11
- package/src/icons/duotone-icons/Files/Folder-heart.svg +0 -11
- package/src/icons/duotone-icons/Files/Folder-minus.svg +0 -11
- package/src/icons/duotone-icons/Files/Folder-plus.svg +0 -11
- package/src/icons/duotone-icons/Files/Folder-solid.svg +0 -10
- package/src/icons/duotone-icons/Files/Folder-star.svg +0 -11
- package/src/icons/duotone-icons/Files/Folder-thunder.svg +0 -11
- package/src/icons/duotone-icons/Files/Folder.svg +0 -10
- package/src/icons/duotone-icons/Files/Group-folders.svg +0 -11
- package/src/icons/duotone-icons/Files/Import.svg +0 -12
- package/src/icons/duotone-icons/Files/Locked-folder.svg +0 -11
- package/src/icons/duotone-icons/Files/Media-folder.svg +0 -11
- package/src/icons/duotone-icons/Files/Media.svg +0 -11
- package/src/icons/duotone-icons/Files/Music.svg +0 -11
- package/src/icons/duotone-icons/Files/Pictures#1.svg +0 -13
- package/src/icons/duotone-icons/Files/Pictures#2.svg +0 -15
- package/src/icons/duotone-icons/Files/Protected-file.svg +0 -11
- package/src/icons/duotone-icons/Files/Selected-file.svg +0 -11
- package/src/icons/duotone-icons/Files/Share.svg +0 -13
- package/src/icons/duotone-icons/Files/Upload-folder.svg +0 -11
- package/src/icons/duotone-icons/Files/Upload.svg +0 -12
- package/src/icons/duotone-icons/Files/Uploaded-file.svg +0 -11
- package/src/icons/duotone-icons/Files/User-folder.svg +0 -12
- package/src/icons/duotone-icons/Food/Beer.svg +0 -14
- package/src/icons/duotone-icons/Food/Bottle#1.svg +0 -11
- package/src/icons/duotone-icons/Food/Bottle#2.svg +0 -11
- package/src/icons/duotone-icons/Food/Bread.svg +0 -11
- package/src/icons/duotone-icons/Food/Bucket.svg +0 -11
- package/src/icons/duotone-icons/Food/Burger.svg +0 -12
- package/src/icons/duotone-icons/Food/Cake.svg +0 -12
- package/src/icons/duotone-icons/Food/Carrot.svg +0 -13
- package/src/icons/duotone-icons/Food/Cheese.svg +0 -11
- package/src/icons/duotone-icons/Food/Chicken.svg +0 -13
- package/src/icons/duotone-icons/Food/Coffee#1.svg +0 -14
- package/src/icons/duotone-icons/Food/Coffee#2.svg +0 -12
- package/src/icons/duotone-icons/Food/Cookie.svg +0 -13
- package/src/icons/duotone-icons/Food/Dinner.svg +0 -11
- package/src/icons/duotone-icons/Food/Fish.svg +0 -11
- package/src/icons/duotone-icons/Food/French Bread.svg +0 -10
- package/src/icons/duotone-icons/Food/Glass-martini.svg +0 -11
- package/src/icons/duotone-icons/Food/Ice-cream#1.svg +0 -11
- package/src/icons/duotone-icons/Food/Ice-cream#2.svg +0 -11
- package/src/icons/duotone-icons/Food/Miso-soup.svg +0 -11
- package/src/icons/duotone-icons/Food/Orange.svg +0 -11
- package/src/icons/duotone-icons/Food/Pizza.svg +0 -13
- package/src/icons/duotone-icons/Food/Sushi.svg +0 -11
- package/src/icons/duotone-icons/Food/Two-bottles.svg +0 -11
- package/src/icons/duotone-icons/Food/Wine.svg +0 -11
- package/src/icons/duotone-icons/General/Attachment#1.svg +0 -11
- package/src/icons/duotone-icons/General/Attachment#2.svg +0 -13
- package/src/icons/duotone-icons/General/Binocular.svg +0 -10
- package/src/icons/duotone-icons/General/Bookmark.svg +0 -10
- package/src/icons/duotone-icons/General/Clip.svg +0 -10
- package/src/icons/duotone-icons/General/Clipboard.svg +0 -13
- package/src/icons/duotone-icons/General/Cursor.svg +0 -10
- package/src/icons/duotone-icons/General/Dislike.svg +0 -11
- package/src/icons/duotone-icons/General/Duplicate.svg +0 -11
- package/src/icons/duotone-icons/General/Edit.svg +0 -10
- package/src/icons/duotone-icons/General/Expand-arrows.svg +0 -11
- package/src/icons/duotone-icons/General/Fire.svg +0 -10
- package/src/icons/duotone-icons/General/Folder.svg +0 -10
- package/src/icons/duotone-icons/General/Half-heart.svg +0 -11
- package/src/icons/duotone-icons/General/Half-star.svg +0 -11
- package/src/icons/duotone-icons/General/Heart.svg +0 -10
- package/src/icons/duotone-icons/General/Hidden.svg +0 -12
- package/src/icons/duotone-icons/General/Like.svg +0 -11
- package/src/icons/duotone-icons/General/Lock.svg +0 -16
- package/src/icons/duotone-icons/General/Notification#2.svg +0 -11
- package/src/icons/duotone-icons/General/Notifications#1.svg +0 -10
- package/src/icons/duotone-icons/General/Other#1.svg +0 -12
- package/src/icons/duotone-icons/General/Other#2.svg +0 -12
- package/src/icons/duotone-icons/General/Sad.svg +0 -11
- package/src/icons/duotone-icons/General/Save.svg +0 -11
- package/src/icons/duotone-icons/General/Scale.svg +0 -11
- package/src/icons/duotone-icons/General/Scissors.svg +0 -11
- package/src/icons/duotone-icons/General/Search.svg +0 -11
- package/src/icons/duotone-icons/General/Settings#3.svg +0 -11
- package/src/icons/duotone-icons/General/Settings-1.inline.svg +0 -11
- package/src/icons/duotone-icons/General/Settings-2.svg +0 -10
- package/src/icons/duotone-icons/General/Shield-check.svg +0 -11
- package/src/icons/duotone-icons/General/Shield-disabled.svg +0 -11
- package/src/icons/duotone-icons/General/Shield-protected.svg +0 -11
- package/src/icons/duotone-icons/General/Size.svg +0 -11
- package/src/icons/duotone-icons/General/Smile.svg +0 -11
- package/src/icons/duotone-icons/General/Star.svg +0 -10
- package/src/icons/duotone-icons/General/Thunder-move.svg +0 -11
- package/src/icons/duotone-icons/General/Thunder.svg +0 -10
- package/src/icons/duotone-icons/General/Trash.svg +0 -11
- package/src/icons/duotone-icons/General/Unlock.svg +0 -16
- package/src/icons/duotone-icons/General/Update.svg +0 -10
- package/src/icons/duotone-icons/General/User.svg +0 -11
- package/src/icons/duotone-icons/General/Visible.svg +0 -11
- package/src/icons/duotone-icons/Home/Air-ballon.svg +0 -11
- package/src/icons/duotone-icons/Home/Alarm-clock.svg +0 -12
- package/src/icons/duotone-icons/Home/Armchair.svg +0 -11
- package/src/icons/duotone-icons/Home/Bag-chair.svg +0 -11
- package/src/icons/duotone-icons/Home/Bath.svg +0 -11
- package/src/icons/duotone-icons/Home/Bed.svg +0 -12
- package/src/icons/duotone-icons/Home/Book-open.svg +0 -11
- package/src/icons/duotone-icons/Home/Book.svg +0 -16
- package/src/icons/duotone-icons/Home/Box.svg +0 -11
- package/src/icons/duotone-icons/Home/Broom.svg +0 -11
- package/src/icons/duotone-icons/Home/Building.svg +0 -12
- package/src/icons/duotone-icons/Home/Bulb#1.svg +0 -13
- package/src/icons/duotone-icons/Home/Bulb#2.svg +0 -13
- package/src/icons/duotone-icons/Home/Chair#1.svg +0 -11
- package/src/icons/duotone-icons/Home/Chair#2.svg +0 -11
- package/src/icons/duotone-icons/Home/Clock.svg +0 -11
- package/src/icons/duotone-icons/Home/Commode#1.svg +0 -11
- package/src/icons/duotone-icons/Home/Commode#2.svg +0 -11
- package/src/icons/duotone-icons/Home/Couch.svg +0 -11
- package/src/icons/duotone-icons/Home/Cupboard.svg +0 -11
- package/src/icons/duotone-icons/Home/Curtains.svg +0 -11
- package/src/icons/duotone-icons/Home/Deer.svg +0 -11
- package/src/icons/duotone-icons/Home/Door-open.svg +0 -11
- package/src/icons/duotone-icons/Home/Earth.svg +0 -11
- package/src/icons/duotone-icons/Home/Fireplace.svg +0 -11
- package/src/icons/duotone-icons/Home/Flashlight.svg +0 -11
- package/src/icons/duotone-icons/Home/Flower#1.svg +0 -13
- package/src/icons/duotone-icons/Home/Flower#2.svg +0 -14
- package/src/icons/duotone-icons/Home/Flower#3.svg +0 -12
- package/src/icons/duotone-icons/Home/Globe.svg +0 -11
- package/src/icons/duotone-icons/Home/Home-heart.svg +0 -11
- package/src/icons/duotone-icons/Home/Home.svg +0 -10
- package/src/icons/duotone-icons/Home/Key.svg +0 -11
- package/src/icons/duotone-icons/Home/Ladder.svg +0 -11
- package/src/icons/duotone-icons/Home/Lamp#1.svg +0 -13
- package/src/icons/duotone-icons/Home/Lamp#2.svg +0 -12
- package/src/icons/duotone-icons/Home/Library.svg +0 -11
- package/src/icons/duotone-icons/Home/Mailbox.svg +0 -11
- package/src/icons/duotone-icons/Home/Mirror.svg +0 -11
- package/src/icons/duotone-icons/Home/Picture.svg +0 -13
- package/src/icons/duotone-icons/Home/Ruller.svg +0 -10
- package/src/icons/duotone-icons/Home/Stairs.svg +0 -10
- package/src/icons/duotone-icons/Home/Timer.svg +0 -13
- package/src/icons/duotone-icons/Home/Toilet.svg +0 -11
- package/src/icons/duotone-icons/Home/Towel.svg +0 -10
- package/src/icons/duotone-icons/Home/Trash.svg +0 -11
- package/src/icons/duotone-icons/Home/Water-mixer.svg +0 -12
- package/src/icons/duotone-icons/Home/Weight#1.svg +0 -11
- package/src/icons/duotone-icons/Home/Weight#2.svg +0 -11
- package/src/icons/duotone-icons/Home/Wood#1.svg +0 -11
- package/src/icons/duotone-icons/Home/Wood#2.svg +0 -11
- package/src/icons/duotone-icons/Home/Wood-horse.svg +0 -10
- package/src/icons/duotone-icons/Layout/Layout-3d.svg +0 -11
- package/src/icons/duotone-icons/Layout/Layout-4-blocks.svg +0 -11
- package/src/icons/duotone-icons/Layout/Layout-arrange.inline.svg +0 -11
- package/src/icons/duotone-icons/Layout/Layout-grid.svg +0 -11
- package/src/icons/duotone-icons/Layout/Layout-horizontal.svg +0 -11
- package/src/icons/duotone-icons/Layout/Layout-left-panel-1.svg +0 -11
- package/src/icons/duotone-icons/Layout/Layout-left-panel-2.svg +0 -11
- package/src/icons/duotone-icons/Layout/Layout-right-panel-1.svg +0 -11
- package/src/icons/duotone-icons/Layout/Layout-right-panel-2.svg +0 -11
- package/src/icons/duotone-icons/Layout/Layout-top-panel-1.svg +0 -11
- package/src/icons/duotone-icons/Layout/Layout-top-panel-2.svg +0 -11
- package/src/icons/duotone-icons/Layout/Layout-top-panel-3.svg +0 -11
- package/src/icons/duotone-icons/Layout/Layout-top-panel-4.svg +0 -11
- package/src/icons/duotone-icons/Layout/Layout-top-panel-5.svg +0 -11
- package/src/icons/duotone-icons/Layout/Layout-top-panel-6.svg +0 -11
- package/src/icons/duotone-icons/Layout/Layout-vertical.svg +0 -11
- package/src/icons/duotone-icons/Map/Compass.svg +0 -10
- package/src/icons/duotone-icons/Map/Direction#1.svg +0 -10
- package/src/icons/duotone-icons/Map/Direction#2.svg +0 -10
- package/src/icons/duotone-icons/Map/Location-arrow.svg +0 -10
- package/src/icons/duotone-icons/Map/Marker#1.svg +0 -10
- package/src/icons/duotone-icons/Map/Marker#2.svg +0 -10
- package/src/icons/duotone-icons/Map/Position.svg +0 -12
- package/src/icons/duotone-icons/Media/Add-music.svg +0 -11
- package/src/icons/duotone-icons/Media/Airplay-video.svg +0 -11
- package/src/icons/duotone-icons/Media/Airplay.svg +0 -11
- package/src/icons/duotone-icons/Media/Back.svg +0 -11
- package/src/icons/duotone-icons/Media/Backward.svg +0 -11
- package/src/icons/duotone-icons/Media/CD.svg +0 -11
- package/src/icons/duotone-icons/Media/DVD.svg +0 -11
- package/src/icons/duotone-icons/Media/Eject.svg +0 -11
- package/src/icons/duotone-icons/Media/Equalizer.svg +0 -13
- package/src/icons/duotone-icons/Media/Forward.svg +0 -11
- package/src/icons/duotone-icons/Media/Media-library#1.svg +0 -13
- package/src/icons/duotone-icons/Media/Media-library#2.svg +0 -11
- package/src/icons/duotone-icons/Media/Media-library#3.svg +0 -17
- package/src/icons/duotone-icons/Media/Movie-Lane #2.svg +0 -11
- package/src/icons/duotone-icons/Media/Movie-lane#1.svg +0 -11
- package/src/icons/duotone-icons/Media/Music-cloud.svg +0 -11
- package/src/icons/duotone-icons/Media/Music-note.svg +0 -10
- package/src/icons/duotone-icons/Media/Music.svg +0 -10
- package/src/icons/duotone-icons/Media/Mute.svg +0 -11
- package/src/icons/duotone-icons/Media/Next.svg +0 -11
- package/src/icons/duotone-icons/Media/Pause.svg +0 -10
- package/src/icons/duotone-icons/Media/Play.svg +0 -10
- package/src/icons/duotone-icons/Media/Playlist#1.svg +0 -11
- package/src/icons/duotone-icons/Media/Playlist#2.svg +0 -11
- package/src/icons/duotone-icons/Media/Rec.svg +0 -10
- package/src/icons/duotone-icons/Media/Repeat-one.svg +0 -11
- package/src/icons/duotone-icons/Media/Repeat.svg +0 -11
- package/src/icons/duotone-icons/Media/Shuffle.svg +0 -11
- package/src/icons/duotone-icons/Media/Volume-down.svg +0 -11
- package/src/icons/duotone-icons/Media/Volume-full.svg +0 -11
- package/src/icons/duotone-icons/Media/Volume-half.svg +0 -11
- package/src/icons/duotone-icons/Media/Volume-up.svg +0 -11
- package/src/icons/duotone-icons/Media/Vynil.svg +0 -11
- package/src/icons/duotone-icons/Media/Youtube.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Angle-double-down.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Angle-double-left.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Angle-double-right.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Angle-double-up.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Angle-down.svg +0 -10
- package/src/icons/duotone-icons/Navigation/Angle-left.svg +0 -10
- package/src/icons/duotone-icons/Navigation/Angle-right.svg +0 -10
- package/src/icons/duotone-icons/Navigation/Angle-up.svg +0 -10
- package/src/icons/duotone-icons/Navigation/Arrow-down.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Arrow-from-bottom.svg +0 -12
- package/src/icons/duotone-icons/Navigation/Arrow-from-left.svg +0 -12
- package/src/icons/duotone-icons/Navigation/Arrow-from-right.svg +0 -12
- package/src/icons/duotone-icons/Navigation/Arrow-from-top.svg +0 -12
- package/src/icons/duotone-icons/Navigation/Arrow-left.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Arrow-right.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Arrow-to-bottom.svg +0 -12
- package/src/icons/duotone-icons/Navigation/Arrow-to-left.svg +0 -12
- package/src/icons/duotone-icons/Navigation/Arrow-to-right.svg +0 -12
- package/src/icons/duotone-icons/Navigation/Arrow-to-up.svg +0 -12
- package/src/icons/duotone-icons/Navigation/Arrow-up.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Arrows-h.svg +0 -12
- package/src/icons/duotone-icons/Navigation/Arrows-v.svg +0 -12
- package/src/icons/duotone-icons/Navigation/Check.svg +0 -10
- package/src/icons/duotone-icons/Navigation/Close.svg +0 -12
- package/src/icons/duotone-icons/Navigation/Double-check.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Down-2.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Down-left.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Down-right.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Exchange.svg +0 -13
- package/src/icons/duotone-icons/Navigation/Left 3.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Left-2.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Minus.svg +0 -9
- package/src/icons/duotone-icons/Navigation/Plus.svg +0 -10
- package/src/icons/duotone-icons/Navigation/Right 3.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Right-2.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Route.svg +0 -12
- package/src/icons/duotone-icons/Navigation/Sign-in.svg +0 -12
- package/src/icons/duotone-icons/Navigation/Sign-out.svg +0 -12
- package/src/icons/duotone-icons/Navigation/Up-2.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Up-down.svg +0 -13
- package/src/icons/duotone-icons/Navigation/Up-left.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Up-right.svg +0 -11
- package/src/icons/duotone-icons/Navigation/Waiting.svg +0 -10
- package/src/icons/duotone-icons/Shopping/ATM.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Bag#1.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Bag#2.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Barcode-read.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Barcode-scan.svg +0 -12
- package/src/icons/duotone-icons/Shopping/Barcode.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Bitcoin.svg +0 -12
- package/src/icons/duotone-icons/Shopping/Box#1.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Box#3.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Box2.inline.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Calculator.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Cart#1.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Cart#2.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Cart#3.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Chart-bar#1.svg +0 -13
- package/src/icons/duotone-icons/Shopping/Chart-bar#2.svg +0 -13
- package/src/icons/duotone-icons/Shopping/Chart-bar#3.svg +0 -13
- package/src/icons/duotone-icons/Shopping/Chart-line#1.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Chart-line#2.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Chart-pie.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Credit-card.svg +0 -12
- package/src/icons/duotone-icons/Shopping/Dollar.svg +0 -12
- package/src/icons/duotone-icons/Shopping/Euro.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Gift.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Loader.svg +0 -12
- package/src/icons/duotone-icons/Shopping/MC.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Money.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Pound.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Price #1.svg +0 -10
- package/src/icons/duotone-icons/Shopping/Price #2.svg +0 -14
- package/src/icons/duotone-icons/Shopping/Rouble.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Safe.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Sale#1.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Sale#2.svg +0 -13
- package/src/icons/duotone-icons/Shopping/Settings.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Sort#1.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Sort#2.svg +0 -10
- package/src/icons/duotone-icons/Shopping/Sort#3.svg +0 -10
- package/src/icons/duotone-icons/Shopping/Ticket.svg +0 -10
- package/src/icons/duotone-icons/Shopping/Wallet#2.svg +0 -11
- package/src/icons/duotone-icons/Shopping/Wallet#3.svg +0 -12
- package/src/icons/duotone-icons/Shopping/Wallet.svg +0 -12
- package/src/icons/duotone-icons/Text/Align-auto.svg +0 -11
- package/src/icons/duotone-icons/Text/Align-center.svg +0 -11
- package/src/icons/duotone-icons/Text/Align-justify.svg +0 -11
- package/src/icons/duotone-icons/Text/Align-left.svg +0 -12
- package/src/icons/duotone-icons/Text/Align-right.svg +0 -11
- package/src/icons/duotone-icons/Text/Article.svg +0 -11
- package/src/icons/duotone-icons/Text/Bold.svg +0 -10
- package/src/icons/duotone-icons/Text/Bullet-list.svg +0 -11
- package/src/icons/duotone-icons/Text/Code.svg +0 -10
- package/src/icons/duotone-icons/Text/Edit-text.svg +0 -11
- package/src/icons/duotone-icons/Text/Filter.svg +0 -10
- package/src/icons/duotone-icons/Text/Font.svg +0 -11
- package/src/icons/duotone-icons/Text/H1.svg +0 -11
- package/src/icons/duotone-icons/Text/H2.svg +0 -11
- package/src/icons/duotone-icons/Text/Itallic.svg +0 -10
- package/src/icons/duotone-icons/Text/Menu.svg +0 -11
- package/src/icons/duotone-icons/Text/Paragraph.svg +0 -10
- package/src/icons/duotone-icons/Text/Quote#1.svg +0 -11
- package/src/icons/duotone-icons/Text/Quote#2.svg +0 -11
- package/src/icons/duotone-icons/Text/Redo.svg +0 -10
- package/src/icons/duotone-icons/Text/Strikethrough.svg +0 -11
- package/src/icons/duotone-icons/Text/Text-height.svg +0 -11
- package/src/icons/duotone-icons/Text/Text-width.svg +0 -11
- package/src/icons/duotone-icons/Text/Text.svg +0 -10
- package/src/icons/duotone-icons/Text/Underline.svg +0 -11
- package/src/icons/duotone-icons/Text/Undo.svg +0 -10
- package/src/icons/duotone-icons/Tools/Angle Grinder.svg +0 -12
- package/src/icons/duotone-icons/Tools/Axe.svg +0 -11
- package/src/icons/duotone-icons/Tools/Brush.svg +0 -11
- package/src/icons/duotone-icons/Tools/Compass.svg +0 -11
- package/src/icons/duotone-icons/Tools/Hummer#2.svg +0 -12
- package/src/icons/duotone-icons/Tools/Hummer.svg +0 -11
- package/src/icons/duotone-icons/Tools/Pantone.svg +0 -12
- package/src/icons/duotone-icons/Tools/Road-Cone.svg +0 -11
- package/src/icons/duotone-icons/Tools/Roller.svg +0 -12
- package/src/icons/duotone-icons/Tools/Roulette.svg +0 -11
- package/src/icons/duotone-icons/Tools/Screwdriver.svg +0 -11
- package/src/icons/duotone-icons/Tools/Shovel.svg +0 -11
- package/src/icons/duotone-icons/Tools/Spatula.svg +0 -11
- package/src/icons/duotone-icons/Tools/Swiss-knife.svg +0 -11
- package/src/icons/duotone-icons/Tools/Tools.svg +0 -11
- package/src/icons/duotone-icons/Weather/Celcium.svg +0 -11
- package/src/icons/duotone-icons/Weather/Cloud#1.svg +0 -10
- package/src/icons/duotone-icons/Weather/Cloud#2.svg +0 -11
- package/src/icons/duotone-icons/Weather/Cloud-fog.svg +0 -11
- package/src/icons/duotone-icons/Weather/Cloud-sun.svg +0 -11
- package/src/icons/duotone-icons/Weather/Cloud-wind.svg +0 -12
- package/src/icons/duotone-icons/Weather/Cloudy-night.svg +0 -11
- package/src/icons/duotone-icons/Weather/Cloudy.svg +0 -11
- package/src/icons/duotone-icons/Weather/Day-rain.svg +0 -11
- package/src/icons/duotone-icons/Weather/Fahrenheit.svg +0 -11
- package/src/icons/duotone-icons/Weather/Fog.svg +0 -15
- package/src/icons/duotone-icons/Weather/Moon.svg +0 -10
- package/src/icons/duotone-icons/Weather/Night-fog.svg +0 -11
- package/src/icons/duotone-icons/Weather/Night-rain.svg +0 -11
- package/src/icons/duotone-icons/Weather/Rain#1.svg +0 -11
- package/src/icons/duotone-icons/Weather/Rain#2.svg +0 -11
- package/src/icons/duotone-icons/Weather/Rain#5.svg +0 -11
- package/src/icons/duotone-icons/Weather/Rainbow.svg +0 -12
- package/src/icons/duotone-icons/Weather/Snow#1.svg +0 -11
- package/src/icons/duotone-icons/Weather/Snow#2.svg +0 -11
- package/src/icons/duotone-icons/Weather/Snow#3.svg +0 -11
- package/src/icons/duotone-icons/Weather/Snow.svg +0 -11
- package/src/icons/duotone-icons/Weather/Storm.svg +0 -11
- package/src/icons/duotone-icons/Weather/Sun-fog.svg +0 -11
- package/src/icons/duotone-icons/Weather/Sun.svg +0 -11
- package/src/icons/duotone-icons/Weather/Suset#1.svg +0 -11
- package/src/icons/duotone-icons/Weather/Suset#2.svg +0 -11
- package/src/icons/duotone-icons/Weather/Temperature-empty.svg +0 -10
- package/src/icons/duotone-icons/Weather/Temperature-full.svg +0 -10
- package/src/icons/duotone-icons/Weather/Temperature-half.svg +0 -10
- package/src/icons/duotone-icons/Weather/Thunder-night.svg +0 -11
- package/src/icons/duotone-icons/Weather/Thunder.svg +0 -11
- package/src/icons/duotone-icons/Weather/Umbrella.svg +0 -11
- package/src/icons/duotone-icons/Weather/Wind.svg +0 -11
- package/src/icons/social/facebook.svg +0 -10
- package/src/icons/social/instagram.svg +0 -10
- package/src/icons/social/pinterest.svg +0 -3
- package/src/icons/social/twitter.svg +0 -10
- package/src/implemented-proposals/abi-management.md +0 -161
- package/src/implemented-proposals/bank-timestamp-correction.md +0 -77
- package/src/implemented-proposals/commitment.md +0 -92
- package/src/implemented-proposals/durable-tx-nonces.md +0 -131
- package/src/implemented-proposals/ed_overview/ed_economic_sustainability.md +0 -9
- package/src/implemented-proposals/ed_overview/ed_mvp.md +0 -24
- package/src/implemented-proposals/ed_overview/ed_overview.md +0 -19
- package/src/implemented-proposals/ed_overview/ed_references.md +0 -7
- package/src/implemented-proposals/ed_overview/ed_storage_rent_economics.md +0 -17
- package/src/implemented-proposals/ed_overview/ed_validation_client_economics/ed_vce_overview.md +0 -9
- package/src/implemented-proposals/ed_overview/ed_validation_client_economics/ed_vce_state_validation_protocol_based_rewards.md +0 -64
- package/src/implemented-proposals/ed_overview/ed_validation_client_economics/ed_vce_state_validation_transaction_fees.md +0 -20
- package/src/implemented-proposals/ed_overview/ed_validation_client_economics/ed_vce_validation_stake_delegation.md +0 -28
- package/src/implemented-proposals/implemented-proposals.md +0 -9
- package/src/implemented-proposals/installer.md +0 -216
- package/src/implemented-proposals/instruction_introspection.md +0 -28
- package/src/implemented-proposals/leader-leader-transition.md +0 -55
- package/src/implemented-proposals/leader-validator-transition.md +0 -52
- package/src/implemented-proposals/persistent-account-storage.md +0 -83
- package/src/implemented-proposals/readonly-accounts.md +0 -25
- package/src/implemented-proposals/reliable-vote-transmission.md +0 -60
- package/src/implemented-proposals/rent.md +0 -69
- package/src/implemented-proposals/repair-service.md +0 -108
- package/src/implemented-proposals/rpc-transaction-history.md +0 -107
- package/src/implemented-proposals/snapshot-verification.md +0 -56
- package/src/implemented-proposals/staking-rewards.md +0 -33
- package/src/implemented-proposals/testing-programs.md +0 -53
- package/src/implemented-proposals/tower-bft.md +0 -138
- package/src/implemented-proposals/transaction-fees.md +0 -32
- package/src/implemented-proposals/validator-timestamp-oracle.md +0 -107
- package/src/inflation/adjusted_staking_yield.md +0 -118
- package/src/inflation/inflation_schedule.md +0 -40
- package/src/inflation/terminology.md +0 -54
- package/src/integrations/exchange.md +0 -753
- package/src/introduction.md +0 -33
- package/src/offline-signing/durable-nonce.md +0 -247
- package/src/offline-signing.md +0 -174
- package/src/pages/index.js +0 -160
- package/src/pages/styles.module.css +0 -41
- package/src/proposals/accepted-design-proposals.md +0 -11
- package/src/proposals/accounts-db-replication.md +0 -185
- package/src/proposals/bankless-leader.md +0 -57
- package/src/proposals/block-confirmation.md +0 -85
- package/src/proposals/cluster-test-framework.md +0 -102
- package/src/proposals/comprehensive-compute-fees.md +0 -164
- package/src/proposals/embedding-move.md +0 -37
- package/src/proposals/interchain-transaction-verification.md +0 -105
- package/src/proposals/ledger-replication-to-implement.md +0 -417
- package/src/proposals/log_data.md +0 -146
- package/src/proposals/optimistic-confirmation-and-slashing.md +0 -89
- package/src/proposals/optimistic-transaction-propagation-signal.md +0 -109
- package/src/proposals/optimistic_confirmation.md +0 -408
- package/src/proposals/program-instruction-macro.md +0 -226
- package/src/proposals/return-data.md +0 -144
- package/src/proposals/rip-curl.md +0 -56
- package/src/proposals/rust-clients.md +0 -54
- package/src/proposals/simple-payment-and-state-verification.md +0 -258
- package/src/proposals/slashing.md +0 -60
- package/src/proposals/snapshot-verification.md +0 -11
- package/src/proposals/tick-verification.md +0 -70
- package/src/proposals/transactions-v2.md +0 -334
- package/src/proposals/validator-proposal.md +0 -54
- package/src/proposals/vote-signing-to-implement.md +0 -116
- package/src/running-validator/restart-cluster.md +0 -117
- package/src/running-validator/validator-failover.md +0 -146
- package/src/running-validator/validator-info.md +0 -64
- package/src/running-validator/validator-monitor.md +0 -47
- package/src/running-validator/validator-reqs.md +0 -115
- package/src/running-validator/validator-stake.md +0 -132
- package/src/running-validator/validator-start.md +0 -492
- package/src/running-validator/validator-troubleshoot.md +0 -17
- package/src/running-validator/vote-accounts.md +0 -219
- package/src/running-validator.md +0 -7
- package/src/staking/stake-accounts.md +0 -141
- package/src/staking/stake-programming.md +0 -27
- package/src/staking.md +0 -117
- package/src/storage_rent_economics.md +0 -17
- package/src/terminology.md +0 -346
- package/src/theme/Footer/index.js +0 -126
- package/src/theme/Footer/styles.module.css +0 -15
- package/src/transaction_fees.md +0 -21
- package/src/validator/anatomy.md +0 -13
- package/src/validator/blockstore.md +0 -91
- package/src/validator/gossip.md +0 -90
- package/src/validator/runtime.md +0 -69
- package/src/validator/tpu.md +0 -5
- package/src/validator/tvu.md +0 -9
- package/src/wallet-guide/apps.md +0 -74
- package/src/wallet-guide/cli.md +0 -67
- package/src/wallet-guide/file-system-wallet.md +0 -65
- package/src/wallet-guide/hardware-wallets/ledger.md +0 -219
- package/src/wallet-guide/hardware-wallets.md +0 -53
- package/src/wallet-guide/ledger-live.md +0 -77
- package/src/wallet-guide/paper-wallet.md +0 -203
- package/src/wallet-guide/solflare.md +0 -201
- package/src/wallet-guide/support.md +0 -16
- package/src/wallet-guide/web-wallets.md +0 -52
- package/src/wallet-guide.md +0 -63
- package/static/.nojekyll +0 -0
- package/static/img/favicon.ico +0 -0
- package/static/katex/README.md +0 -91
- package/static/katex/contrib/auto-render.js +0 -350
- package/static/katex/contrib/auto-render.min.js +0 -1
- package/static/katex/contrib/auto-render.mjs +0 -226
- package/static/katex/contrib/copy-tex.css +0 -13
- package/static/katex/contrib/copy-tex.js +0 -213
- package/static/katex/contrib/copy-tex.min.css +0 -1
- package/static/katex/contrib/copy-tex.min.js +0 -1
- package/static/katex/contrib/copy-tex.mjs +0 -85
- package/static/katex/contrib/mathtex-script-type.js +0 -137
- package/static/katex/contrib/mathtex-script-type.min.js +0 -1
- package/static/katex/contrib/mathtex-script-type.mjs +0 -24
- package/static/katex/contrib/mhchem.js +0 -3241
- package/static/katex/contrib/mhchem.min.js +0 -1
- package/static/katex/contrib/mhchem.mjs +0 -3109
- package/static/katex/contrib/render-a11y-string.js +0 -870
- package/static/katex/contrib/render-a11y-string.min.js +0 -1
- package/static/katex/contrib/render-a11y-string.mjs +0 -753
- package/static/katex/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/static/katex/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/static/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/static/katex/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/static/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/static/katex/fonts/KaTeX_Main-Bold.woff +0 -0
- package/static/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/static/katex/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/static/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/static/katex/fonts/KaTeX_Main-Italic.woff +0 -0
- package/static/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Main-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/static/katex/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/static/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/static/katex/fonts/KaTeX_Math-Italic.woff +0 -0
- package/static/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Script-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/static/katex/katex.css +0 -1034
- package/static/katex/katex.js +0 -17308
- package/static/katex/katex.min.css +0 -1
- package/static/katex/katex.min.js +0 -1
- package/static/katex/katex.mjs +0 -16911
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Solana ABI management process
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
This document proposes the Solana ABI management process. The ABI management
|
|
6
|
-
process is an engineering practice and a supporting technical framework to avoid
|
|
7
|
-
introducing unintended incompatible ABI changes.
|
|
8
|
-
|
|
9
|
-
# Problem
|
|
10
|
-
|
|
11
|
-
The Solana ABI (binary interface to the cluster) is currently only defined
|
|
12
|
-
implicitly by the implementation and requires a very careful eye to notice
|
|
13
|
-
breaking changes. This makes it extremely difficult to upgrade the software
|
|
14
|
-
on an existing cluster without rebooting the ledger.
|
|
15
|
-
|
|
16
|
-
# Requirements and objectives
|
|
17
|
-
|
|
18
|
-
- Unintended ABI changes can be detected as CI failures mechanically.
|
|
19
|
-
- Newer implementation must be able to process the oldest data (since genesis)
|
|
20
|
-
once we go mainnet.
|
|
21
|
-
- The objective of this proposal is to protect the ABI while sustaining rather
|
|
22
|
-
rapid development by opting for a mechanical process rather than a very long
|
|
23
|
-
human-driven auditing process.
|
|
24
|
-
- Once signed cryptographically, data blob must be identical, so no
|
|
25
|
-
in-place data format update is possible regardless of inbound and outbound of
|
|
26
|
-
the online system. Also, considering the sheer volume of transactions we're
|
|
27
|
-
aiming to handle, retrospective in-place update is undesirable at best.
|
|
28
|
-
|
|
29
|
-
# Solution
|
|
30
|
-
|
|
31
|
-
Instead of natural human's eye due-diligence, which should be assumed to fail
|
|
32
|
-
regularly, we need a systematic assurance of not breaking the cluster when
|
|
33
|
-
changing the source code.
|
|
34
|
-
|
|
35
|
-
For that purpose, we introduce a mechanism of marking every ABI-related things
|
|
36
|
-
in source code (`struct`s, `enum`s) with the new `#[frozen_abi]` attribute. This
|
|
37
|
-
takes hard-coded digest value derived from types of its fields via
|
|
38
|
-
`ser::Serialize`. And the attribute automatically generates a unit test to try
|
|
39
|
-
to detect any unsanctioned changes to the marked ABI-related things.
|
|
40
|
-
|
|
41
|
-
However, the detection cannot be complete; no matter how hard we statically
|
|
42
|
-
analyze the source code, it's still possible to break ABI. For example, this
|
|
43
|
-
includes not-`derive`d hand-written `ser::Serialize`, underlying library's
|
|
44
|
-
implementation changes (for example `bincode`), CPU architecture differences.
|
|
45
|
-
The detection of these possible ABI incompatibilities is out-of-scope for this
|
|
46
|
-
ABI management.
|
|
47
|
-
|
|
48
|
-
# Definitions
|
|
49
|
-
|
|
50
|
-
ABI item/type: various types to be used for serialization, which collectively
|
|
51
|
-
comprises the whole ABI for any system components. For example, those types
|
|
52
|
-
include `struct`s and `enum`s.
|
|
53
|
-
|
|
54
|
-
ABI item digest: Some fixed hash derived from type information of ABI item's
|
|
55
|
-
fields.
|
|
56
|
-
|
|
57
|
-
# Example
|
|
58
|
-
|
|
59
|
-
```patch
|
|
60
|
-
+#[frozen_abi(digest="eXSMM7b89VY72V...")]
|
|
61
|
-
#[derive(Serialize, Default, Deserialize, Debug, PartialEq, Eq, Clone)]
|
|
62
|
-
pub struct Vote {
|
|
63
|
-
/// A stack of votes starting with the oldest vote
|
|
64
|
-
pub slots: Vec<Slot>,
|
|
65
|
-
/// signature of the bank's state at the last slot
|
|
66
|
-
pub hash: Hash,
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
# Developer's workflow
|
|
71
|
-
|
|
72
|
-
To know the digest for new ABI items, developers can add `frozen_abi` with a
|
|
73
|
-
random digest value and run the unit tests and replace it with the correct
|
|
74
|
-
digest from the assertion test error message.
|
|
75
|
-
|
|
76
|
-
In general, once we add `frozen_abi` and its change is published in the stable
|
|
77
|
-
release channel, its digest should never change. If such a change is needed, we
|
|
78
|
-
should opt for defining a new `struct` like `FooV1`. And special release flow
|
|
79
|
-
like hard forks should be approached.
|
|
80
|
-
|
|
81
|
-
# Implementation remarks
|
|
82
|
-
|
|
83
|
-
We use some degree of macro machinery to automatically generate unit tests
|
|
84
|
-
and calculate a digest from ABI items. This is doable by clever use of
|
|
85
|
-
`serde::Serialize` (`[1]`) and `any::type_name` (`[2]`). For a precedent for similar
|
|
86
|
-
implementation, `ink` from the Parity Technologies `[3]` could be informational.
|
|
87
|
-
|
|
88
|
-
# Implementation details
|
|
89
|
-
|
|
90
|
-
The implementation's goal is to detect unintended ABI changes automatically as
|
|
91
|
-
much as possible. To that end, the digest of structural ABI information is
|
|
92
|
-
calculated with best-effort accuracy and stability.
|
|
93
|
-
|
|
94
|
-
When the ABI digest check is run, it dynamically computes an ABI digest by
|
|
95
|
-
recursively digesting the ABI of fields of the ABI item, by re-using the
|
|
96
|
-
`serde`'s serialization functionality, proc macro and generic specialization.
|
|
97
|
-
And then, the check `assert!`s that its finalized digest value is identical as
|
|
98
|
-
what is specified in the `frozen_abi` attribute.
|
|
99
|
-
|
|
100
|
-
To realize that, it creates an example instance of the type and a custom
|
|
101
|
-
`Serializer` instance for `serde` to recursively traverse its fields as if
|
|
102
|
-
serializing the example for real. This traversing must be done via `serde` to
|
|
103
|
-
really capture what kinds of data actually would be serialized by `serde`, even
|
|
104
|
-
considering custom non-`derive`d `Serialize` trait implementations.
|
|
105
|
-
|
|
106
|
-
# The ABI digesting process
|
|
107
|
-
|
|
108
|
-
This part is a bit complex. There is three inter-depending parts: `AbiExample`,
|
|
109
|
-
`AbiDigester` and `AbiEnumVisitor`.
|
|
110
|
-
|
|
111
|
-
First, the generated test creates an example instance of the digested type with
|
|
112
|
-
a trait called `AbiExample`, which should be implemented for all of digested
|
|
113
|
-
types like the `Serialize` and return `Self` like the `Default` trait. Usually,
|
|
114
|
-
it's provided via generic trait specialization for most of common types. Also
|
|
115
|
-
it is possible to `derive` for `struct` and `enum` and can be hand-written if
|
|
116
|
-
needed.
|
|
117
|
-
|
|
118
|
-
The custom `Serializer` is called `AbiDigester`. And when it's called by `serde`
|
|
119
|
-
to serialize some data, it recursively collects ABI information as much as
|
|
120
|
-
possible. `AbiDigester`'s internal state for the ABI digest is updated
|
|
121
|
-
differentially depending on the type of data. This logic is specifically
|
|
122
|
-
redirected via with a trait called `AbiEnumVisitor` for each `enum` type. As the
|
|
123
|
-
name suggests, there is no need to implement `AbiEnumVisitor` for other types.
|
|
124
|
-
|
|
125
|
-
To summarize this interplay, `serde` handles the recursive serialization control
|
|
126
|
-
flow in tandem with `AbiDigester`. The initial entry point in tests and child
|
|
127
|
-
`AbiDigester`s use `AbiExample` recursively to create an example object
|
|
128
|
-
hierarchal graph. And `AbiDigester` uses `AbiEnumVisitor` to inquiry the actual
|
|
129
|
-
ABI information using the constructed sample.
|
|
130
|
-
|
|
131
|
-
`Default` isn't enough for `AbiExample`. Various collection's `::default()` is
|
|
132
|
-
empty, yet, we want to digest them with actual items. And, ABI digesting can't
|
|
133
|
-
be realized only with `AbiEnumVisitor`. `AbiExample` is required because an
|
|
134
|
-
actual instance of type is needed to actually traverse the data via `serde`.
|
|
135
|
-
|
|
136
|
-
On the other hand, ABI digesting can't be done only with `AbiExample`, either.
|
|
137
|
-
`AbiEnumVisitor` is required because all variants of an `enum` cannot be
|
|
138
|
-
traversed just with a single variant of it as a ABI example.
|
|
139
|
-
|
|
140
|
-
Digestable information:
|
|
141
|
-
|
|
142
|
-
- rust's type name
|
|
143
|
-
- `serde`'s data type name
|
|
144
|
-
- all fields in `struct`
|
|
145
|
-
- all variants in `enum`
|
|
146
|
-
- `struct`: normal(`struct {...}`) and tuple-style (`struct(...)`)
|
|
147
|
-
- `enum`: normal variants and `struct`- and `tuple`- styles.
|
|
148
|
-
- attributes: `serde(serialize_with=...)` and `serde(skip)`
|
|
149
|
-
|
|
150
|
-
Not digestable information:
|
|
151
|
-
|
|
152
|
-
- Any custom serialize code path not touched by the sample provided by
|
|
153
|
-
`AbiExample`. (technically not possible)
|
|
154
|
-
- generics (must be a concrete type; use `frozen_abi` on concrete type
|
|
155
|
-
aliases)
|
|
156
|
-
|
|
157
|
-
# References
|
|
158
|
-
|
|
159
|
-
1. [(De)Serialization with type info · Issue #1095 · serde-rs/serde](https://github.com/serde-rs/serde/issues/1095#issuecomment-345483479)
|
|
160
|
-
2. [`std::any::type_name` - Rust](https://doc.rust-lang.org/std/any/fn.type_name.html)
|
|
161
|
-
3. [Parity's ink to write smart contracts](https://github.com/paritytech/ink)
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Bank Timestamp Correction
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
Each Bank has a timestamp that is stashed in the Clock sysvar and used to assess
|
|
6
|
-
time-based stake account lockups. However, since genesis, this value has been
|
|
7
|
-
based on a theoretical slots-per-second instead of reality, so it's quite
|
|
8
|
-
inaccurate. This poses a problem for lockups, since the accounts will not
|
|
9
|
-
register as lockup-free on (or anytime near) the date the lockup is set to
|
|
10
|
-
expire.
|
|
11
|
-
|
|
12
|
-
Block times are already being estimated to cache in Blockstore and long-term
|
|
13
|
-
storage using a [validator timestamp oracle](validator-timestamp-oracle.md);
|
|
14
|
-
this data provides an opportunity to align the bank timestamp more closely with
|
|
15
|
-
real-world time.
|
|
16
|
-
|
|
17
|
-
The general outline of the proposed implementation is as follows:
|
|
18
|
-
|
|
19
|
-
- Correct each Bank timestamp using the validator-provided timestamp.
|
|
20
|
-
- Update the validator-provided timestamp calculation to use a stake-weighted
|
|
21
|
-
median, rather than a stake-weighted mean.
|
|
22
|
-
- Bound the timestamp correction so that it cannot deviate too far from the
|
|
23
|
-
expected theoretical estimate
|
|
24
|
-
|
|
25
|
-
## Timestamp Correction
|
|
26
|
-
|
|
27
|
-
On every new Bank, the runtime calculates a realistic timestamp estimate using
|
|
28
|
-
validator timestamp-oracle data. The Bank timestamp is corrected to this value
|
|
29
|
-
if it is greater than or equal to the previous Bank's timestamp. That is, time
|
|
30
|
-
should not ever go backward, so that locked up accounts may be released by the
|
|
31
|
-
correction, but once released, accounts can never be relocked by a time
|
|
32
|
-
correction.
|
|
33
|
-
|
|
34
|
-
### Calculating Stake-Weighted Median Timestamp
|
|
35
|
-
|
|
36
|
-
In order to calculate the estimated timestamp for a particular Bank, the runtime
|
|
37
|
-
first needs to get the most recent vote timestamps from the active validator
|
|
38
|
-
set. The `Bank::vote_accounts()` method provides the vote accounts state, and
|
|
39
|
-
these can be filtered to all accounts whose most recent timestamp was provided
|
|
40
|
-
within the last epoch.
|
|
41
|
-
|
|
42
|
-
From each vote timestamp, an estimate for the current Bank is calculated using
|
|
43
|
-
the epoch's target ns_per_slot for any delta between the Bank slot and the
|
|
44
|
-
timestamp slot. Each timestamp estimate is associated with the stake delegated
|
|
45
|
-
to that vote account, and all the timestamps are collected to create a
|
|
46
|
-
stake-weighted timestamp distribution.
|
|
47
|
-
|
|
48
|
-
From this set, the stake-weighted median timestamp -- that is, the timestamp at
|
|
49
|
-
which 50% of the stake estimates a greater-or-equal timestamp and 50% of the
|
|
50
|
-
stake estimates a lesser-or-equal timestamp -- is selected as the potential
|
|
51
|
-
corrected timestamp.
|
|
52
|
-
|
|
53
|
-
This stake-weighted median timestamp is preferred over the stake-weighted mean
|
|
54
|
-
because the multiplication of stake by proposed timestamp in the mean
|
|
55
|
-
calculation allows a node with very small stake to still have a large effect on
|
|
56
|
-
the resulting timestamp by proposing a timestamp that is very large or very
|
|
57
|
-
small. For example, using the previous `calculate_stake_weighted_timestamp()`
|
|
58
|
-
method, a node with 0.00003% of the stake proposing a timestamp of `i64::MAX`
|
|
59
|
-
can shift the timestamp forward 97k years!
|
|
60
|
-
|
|
61
|
-
### Bounding Timestamps
|
|
62
|
-
|
|
63
|
-
In addition to preventing time moving backward, we can prevent malicious
|
|
64
|
-
activity by bounding the corrected timestamp to an acceptable level of deviation
|
|
65
|
-
from the theoretical expected time.
|
|
66
|
-
|
|
67
|
-
This proposal suggests that each timestamp be allowed to deviate up to 25% from
|
|
68
|
-
the expected time since the start of the epoch.
|
|
69
|
-
|
|
70
|
-
In order to calculate the timestamp deviation, each Bank needs to log the
|
|
71
|
-
`epoch_start_timestamp` in the Clock sysvar. This value is set to the
|
|
72
|
-
`Clock::unix_timestamp` on the first slot of each epoch.
|
|
73
|
-
|
|
74
|
-
Then, the runtime compares the expected elapsed time since the start of the
|
|
75
|
-
epoch with the proposed elapsed time based on the corrected timestamp. If the
|
|
76
|
-
corrected elapsed time is within +/- 25% of expected, the corrected timestamp is
|
|
77
|
-
accepted. Otherwise, it is bounded to the acceptable deviation.
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Commitment
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
The commitment metric aims to give clients a measure of the network confirmation
|
|
6
|
-
and stake levels on a particular block. Clients can then use this information to
|
|
7
|
-
derive their own measures of commitment.
|
|
8
|
-
|
|
9
|
-
# Calculation RPC
|
|
10
|
-
|
|
11
|
-
Clients can request commitment metrics from a validator for a signature `s`
|
|
12
|
-
through `get_block_commitment(s: Signature) -> BlockCommitment` over RPC. The
|
|
13
|
-
`BlockCommitment` struct contains an array of u64 `[u64, MAX_CONFIRMATIONS]`. This
|
|
14
|
-
array represents the commitment metric for the particular block `N` that
|
|
15
|
-
contains the signature `s` as of the last block `M` that the validator voted on.
|
|
16
|
-
|
|
17
|
-
An entry `s` at index `i` in the `BlockCommitment` array implies that the
|
|
18
|
-
validator observed `s` total stake in the cluster reaching `i` confirmations on
|
|
19
|
-
block `N` as observed in some block `M`. There will be `MAX_CONFIRMATIONS` elements in
|
|
20
|
-
this array, representing all the possible number of confirmations from 1 to
|
|
21
|
-
`MAX_CONFIRMATIONS`.
|
|
22
|
-
|
|
23
|
-
# Computation of commitment metric
|
|
24
|
-
|
|
25
|
-
Building this `BlockCommitment` struct leverages the computations already being
|
|
26
|
-
performed for building consensus. The `collect_vote_lockouts` function in
|
|
27
|
-
`consensus.rs` builds a HashMap, where each entry is of the form `(b, s)`
|
|
28
|
-
where `s` is the amount of stake on a bank `b`.
|
|
29
|
-
|
|
30
|
-
This computation is performed on a votable candidate bank `b` as follows.
|
|
31
|
-
|
|
32
|
-
```text
|
|
33
|
-
let output: HashMap<b, Stake> = HashMap::new();
|
|
34
|
-
for vote_account in b.vote_accounts {
|
|
35
|
-
for v in vote_account.vote_stack {
|
|
36
|
-
for a in ancestors(v) {
|
|
37
|
-
f(*output.get_mut(a), vote_account, v);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
where `f` is some accumulation function that modifies the `Stake` entry
|
|
44
|
-
for slot `a` with some data derivable from vote `v` and `vote_account`
|
|
45
|
-
(stake, lockout, etc.). Note here that the `ancestors` here only includes
|
|
46
|
-
slots that are present in the current status cache. Signatures for banks earlier
|
|
47
|
-
than those present in the status cache would not be queryable anyway, so those
|
|
48
|
-
banks are not included in the commitment calculations here.
|
|
49
|
-
|
|
50
|
-
Now we can naturally augment the above computation to also build a
|
|
51
|
-
`BlockCommitment` array for every bank `b` by:
|
|
52
|
-
|
|
53
|
-
1. Adding a `ForkCommitmentCache` to collect the `BlockCommitment` structs
|
|
54
|
-
2. Replacing `f` with `f'` such that the above computation also builds this
|
|
55
|
-
`BlockCommitment` for every bank `b`.
|
|
56
|
-
|
|
57
|
-
We will proceed with the details of 2) as 1) is trivial.
|
|
58
|
-
|
|
59
|
-
Before continuing, it is noteworthy that for some validator's vote account `a`,
|
|
60
|
-
the number of local confirmations for that validator on slot `s` is
|
|
61
|
-
`v.num_confirmations`, where `v` is the smallest vote in the stack of votes
|
|
62
|
-
`a.votes` such that `v.slot >= s` (i.e. there is no need to look at any
|
|
63
|
-
votes > v as the number of confirmations will be lower).
|
|
64
|
-
|
|
65
|
-
Now more specifically, we augment the above computation to:
|
|
66
|
-
|
|
67
|
-
```text
|
|
68
|
-
let output: HashMap<b, Stake> = HashMap::new();
|
|
69
|
-
let fork_commitment_cache = ForkCommitmentCache::default();
|
|
70
|
-
for vote_account in b.vote_accounts {
|
|
71
|
-
// vote stack is sorted from oldest vote to newest vote
|
|
72
|
-
for (v1, v2) in vote_account.vote_stack.windows(2) {
|
|
73
|
-
for a in ancestors(v1).difference(ancestors(v2)) {
|
|
74
|
-
f'(*output.get_mut(a), *fork_commitment_cache.get_mut(a), vote_account, v);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
where `f'` is defined as:
|
|
81
|
-
|
|
82
|
-
```text
|
|
83
|
-
fn f`(
|
|
84
|
-
stake: &mut Stake,
|
|
85
|
-
some_ancestor: &mut BlockCommitment,
|
|
86
|
-
vote_account: VoteAccount,
|
|
87
|
-
v: Vote, total_stake: u64
|
|
88
|
-
){
|
|
89
|
-
f(stake, vote_account, v);
|
|
90
|
-
*some_ancestor.commitment[v.num_confirmations] += vote_account.stake;
|
|
91
|
-
}
|
|
92
|
-
```
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Durable Transaction Nonces
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
## Problem
|
|
6
|
-
|
|
7
|
-
To prevent replay, Solana transactions contain a nonce field populated with a
|
|
8
|
-
"recent" blockhash value. A transaction containing a blockhash that is too old
|
|
9
|
-
(~2min as of this writing) is rejected by the network as invalid. Unfortunately
|
|
10
|
-
certain use cases, such as custodial services, require more time to produce a
|
|
11
|
-
signature for the transaction. A mechanism is needed to enable these potentially
|
|
12
|
-
offline network participants.
|
|
13
|
-
|
|
14
|
-
## Requirements
|
|
15
|
-
|
|
16
|
-
1. The transaction's signature needs to cover the nonce value
|
|
17
|
-
2. The nonce must not be reusable, even in the case of signing key disclosure
|
|
18
|
-
|
|
19
|
-
## A Contract-based Solution
|
|
20
|
-
|
|
21
|
-
Here we describe a contract-based solution to the problem, whereby a client can
|
|
22
|
-
"stash" a nonce value for future use in a transaction's `recent_blockhash`
|
|
23
|
-
field. This approach is akin to the Compare and Swap atomic instruction,
|
|
24
|
-
implemented by some CPU ISAs.
|
|
25
|
-
|
|
26
|
-
When making use of a durable nonce, the client must first query its value from
|
|
27
|
-
account data. A transaction is now constructed in the normal way, but with the
|
|
28
|
-
following additional requirements:
|
|
29
|
-
|
|
30
|
-
1. The durable nonce value is used in the `recent_blockhash` field
|
|
31
|
-
2. An `AdvanceNonceAccount` instruction is the first issued in the transaction
|
|
32
|
-
|
|
33
|
-
### Contract Mechanics
|
|
34
|
-
|
|
35
|
-
TODO: svgbob this into a flowchart
|
|
36
|
-
|
|
37
|
-
```text
|
|
38
|
-
Start
|
|
39
|
-
Create Account
|
|
40
|
-
state = Uninitialized
|
|
41
|
-
NonceInstruction
|
|
42
|
-
if state == Uninitialized
|
|
43
|
-
if account.balance < rent_exempt
|
|
44
|
-
error InsufficientFunds
|
|
45
|
-
state = Initialized
|
|
46
|
-
elif state != Initialized
|
|
47
|
-
error BadState
|
|
48
|
-
if sysvar.recent_blockhashes.is_empty()
|
|
49
|
-
error EmptyRecentBlockhashes
|
|
50
|
-
if !sysvar.recent_blockhashes.contains(stored_nonce)
|
|
51
|
-
error NotReady
|
|
52
|
-
stored_hash = sysvar.recent_blockhashes[0]
|
|
53
|
-
success
|
|
54
|
-
WithdrawInstruction(to, lamports)
|
|
55
|
-
if state == Uninitialized
|
|
56
|
-
if !signers.contains(owner)
|
|
57
|
-
error MissingRequiredSignatures
|
|
58
|
-
elif state == Initialized
|
|
59
|
-
if !sysvar.recent_blockhashes.contains(stored_nonce)
|
|
60
|
-
error NotReady
|
|
61
|
-
if lamports != account.balance && lamports + rent_exempt > account.balance
|
|
62
|
-
error InsufficientFunds
|
|
63
|
-
account.balance -= lamports
|
|
64
|
-
to.balance += lamports
|
|
65
|
-
success
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
A client wishing to use this feature starts by creating a nonce account under
|
|
69
|
-
the system program. This account will be in the `Uninitialized` state with no
|
|
70
|
-
stored hash, and thus unusable.
|
|
71
|
-
|
|
72
|
-
To initialize a newly created account, an `InitializeNonceAccount` instruction must be
|
|
73
|
-
issued. This instruction takes one parameter, the `Pubkey` of the account's
|
|
74
|
-
[authority](../offline-signing/durable-nonce.md#nonce-authority). Nonce accounts
|
|
75
|
-
must be [rent-exempt](rent.md#two-tiered-rent-regime) to meet the data-persistence
|
|
76
|
-
requirements of the feature, and as such, require that sufficient lamports be
|
|
77
|
-
deposited before they can be initialized. Upon successful initialization, the
|
|
78
|
-
cluster's most recent blockhash is stored along with specified nonce authority
|
|
79
|
-
`Pubkey`.
|
|
80
|
-
|
|
81
|
-
The `AdvanceNonceAccount` instruction is used to manage the account's stored nonce
|
|
82
|
-
value. It stores the cluster's most recent blockhash in the account's state data,
|
|
83
|
-
failing if that matches the value already stored there. This check prevents
|
|
84
|
-
replaying transactions within the same block.
|
|
85
|
-
|
|
86
|
-
Due to nonce accounts' [rent-exempt](rent.md#two-tiered-rent-regime) requirement,
|
|
87
|
-
a custom withdraw instruction is used to move funds out of the account.
|
|
88
|
-
The `WithdrawNonceAccount` instruction takes a single argument, lamports to withdraw,
|
|
89
|
-
and enforces rent-exemption by preventing the account's balance from falling
|
|
90
|
-
below the rent-exempt minimum. An exception to this check is if the final balance
|
|
91
|
-
would be zero lamports, which makes the account eligible for deletion. This
|
|
92
|
-
account closure detail has an additional requirement that the stored nonce value
|
|
93
|
-
must not match the cluster's most recent blockhash, as per `AdvanceNonceAccount`.
|
|
94
|
-
|
|
95
|
-
The account's [nonce authority](../offline-signing/durable-nonce.md#nonce-authority)
|
|
96
|
-
can be changed using the `AuthorizeNonceAccount` instruction. It takes one parameter,
|
|
97
|
-
the `Pubkey` of the new authority. Executing this instruction grants full
|
|
98
|
-
control over the account and its balance to the new authority.
|
|
99
|
-
|
|
100
|
-
> `AdvanceNonceAccount`, `WithdrawNonceAccount` and `AuthorizeNonceAccount` all require the current [nonce authority](../offline-signing/durable-nonce.md#nonce-authority) for the account to sign the transaction.
|
|
101
|
-
|
|
102
|
-
### Runtime Support
|
|
103
|
-
|
|
104
|
-
The contract alone is not sufficient for implementing this feature. To enforce
|
|
105
|
-
an extant `recent_blockhash` on the transaction and prevent fee theft via
|
|
106
|
-
failed transaction replay, runtime modifications are necessary.
|
|
107
|
-
|
|
108
|
-
Any transaction failing the usual `check_hash_age` validation will be tested
|
|
109
|
-
for a Durable Transaction Nonce. This is signaled by including a `AdvanceNonceAccount`
|
|
110
|
-
instruction as the first instruction in the transaction.
|
|
111
|
-
|
|
112
|
-
If the runtime determines that a Durable Transaction Nonce is in use, it will
|
|
113
|
-
take the following additional actions to validate the transaction:
|
|
114
|
-
|
|
115
|
-
1. The `NonceAccount` specified in the `Nonce` instruction is loaded.
|
|
116
|
-
2. The `NonceState` is deserialized from the `NonceAccount`'s data field and
|
|
117
|
-
confirmed to be in the `Initialized` state.
|
|
118
|
-
3. The nonce value stored in the `NonceAccount` is tested to match against the
|
|
119
|
-
one specified in the transaction's `recent_blockhash` field.
|
|
120
|
-
|
|
121
|
-
If all three of the above checks succeed, the transaction is allowed to continue
|
|
122
|
-
validation.
|
|
123
|
-
|
|
124
|
-
Since transactions that fail with an `InstructionError` are charged a fee and
|
|
125
|
-
changes to their state rolled back, there is an opportunity for fee theft if an
|
|
126
|
-
`AdvanceNonceAccount` instruction is reverted. A malicious validator could replay the
|
|
127
|
-
failed transaction until the stored nonce is successfully advanced. Runtime
|
|
128
|
-
changes prevent this behavior. When a durable nonce transaction fails with an
|
|
129
|
-
`InstructionError` aside from the `AdvanceNonceAccount` instruction, the nonce account
|
|
130
|
-
is rolled back to its pre-execution state as usual. Then the runtime advances
|
|
131
|
-
its nonce value and the advanced nonce account stored as if it succeeded.
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Economic Sustainability
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
**Subject to change.**
|
|
6
|
-
|
|
7
|
-
Long term economic sustainability is one of the guiding principles of Solana’s economic design. While it is impossible to predict how decentralized economies will develop over time, especially economies with flexible decentralized governances, we can arrange economic components such that, under certain conditions, a sustainable economy may take shape in the long term. In the case of Solana’s network, these components take the form of token issuance \(via inflation\) and token burning.
|
|
8
|
-
|
|
9
|
-
The dominant remittances from the Solana mining pool are validator rewards. The disinflationary mechanism is a flat, protocol-specified and adjusted, % of each transaction fee.
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Economic Design MVP
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
**Subject to change.**
|
|
6
|
-
|
|
7
|
-
The preceding sections, outlined in the
|
|
8
|
-
[Economic Design Overview](ed_overview.md),
|
|
9
|
-
describe a long-term vision of a sustainable Solana economy.
|
|
10
|
-
Of course, we don't expect the final implementation to perfectly match what has
|
|
11
|
-
been described above. We intend to fully engage with network stakeholders
|
|
12
|
-
throughout the implementation phases \(i.e. pre-testnet, testnet, mainnet\)
|
|
13
|
-
to ensure the system supports, and is representative of, the various network
|
|
14
|
-
participants' interests. The first step toward this goal, however, is outlining
|
|
15
|
-
a some desired MVP economic features to be available for early pre-testnet and
|
|
16
|
-
testnet participants. Below is a rough sketch outlining basic economic
|
|
17
|
-
functionality from which a more complete and functional system can be developed.
|
|
18
|
-
|
|
19
|
-
## MVP Economic Features
|
|
20
|
-
|
|
21
|
-
- Faucet to deliver testnet SOLs to validators for staking and application development.
|
|
22
|
-
- Mechanism by which validators are rewarded via network inflation.
|
|
23
|
-
- Ability to delegate tokens to validator nodes
|
|
24
|
-
- Validator set commission fees on interest from delegated tokens.
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Cluster Economics
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
**Subject to change. Follow most recent economic discussions in the Solana forums: https://forums.solana.com**
|
|
6
|
-
|
|
7
|
-
Solana’s crypto-economic system is designed to promote a healthy, long term self-sustaining economy with participant incentives aligned to the security and decentralization of the network. The main participants in this economy are validation-clients. Their contributions to the network, state validation, and their requisite incentive mechanisms are discussed below.
|
|
8
|
-
|
|
9
|
-
The main channels of participant remittances are referred to as protocol-based (inflationary) rewards and transaction fees. Protocol-based rewards are issuances from a global, protocol-defined, inflation rate. These rewards will constitute the total reward delivered to validation clients, the remaining sourced from transaction fees. In the early days of the network, it is likely that protocol-based rewards, deployed based on predefined issuance schedule, will drive the majority of participant incentives to participate in the network.
|
|
10
|
-
|
|
11
|
-
These protocol-based rewards, to be distributed across the actively staked tokens on the network, are to be a result of a global supply inflation rate, calculated per Solana epoch and distributed amongst the active validator set. As discussed further below, the per annum inflation rate is based on a pre-determined disinflationary schedule. This provides the network with monetary supply predictability which supports long term economic stability and security.
|
|
12
|
-
|
|
13
|
-
Transaction fees are market-based participant-to-participant transfers, attached to network interactions as a necessary motivation and compensation for the inclusion and execution of a proposed transaction. A mechanism for long-term economic stability and forking protection through partial burning of each transaction fee is also discussed below.
|
|
14
|
-
|
|
15
|
-
A high-level schematic of Solana’s crypto-economic design is shown below in **Figure 1**. The specifics of validation-client economics are described in sections: [Validation-client Economics](ed_validation_client_economics/ed_vce_overview.md), [Inflation Schedule](ed_validation_client_economics/ed_vce_state_validation_protocol_based_rewards.md), and [Transaction Fees](ed_validation_client_economics/ed_vce_state_validation_transaction_fees.md). Also, the section titled [Validation Stake Delegation](ed_validation_client_economics/ed_vce_validation_stake_delegation.md) closes with a discussion of validator delegation opportunities and marketplace. Additionally, in [Storage Rent Economics](ed_storage_rent_economics.md), we describe an implementation of storage rent to account for the externality costs of maintaining the active state of the ledger. An outline of features for an MVP economic design is discussed in the [Economic Design MVP](ed_mvp.md) section.
|
|
16
|
-
|
|
17
|
-

|
|
18
|
-
|
|
19
|
-
**Figure 1**: Schematic overview of Solana economic incentive design.
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: References
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
1. [https://blog.ethereum.org/2016/07/27/inflation-transaction-fees-cryptocurrency-monetary-policy/](https://blog.ethereum.org/2016/07/27/inflation-transaction-fees-cryptocurrency-monetary-policy/)
|
|
6
|
-
2. [https://medium.com/solana-labs/how-to-create-decentralized-storage-for-a-multi-petabyte-digital-ledger-2499a3a8c281](https://medium.com/solana-labs/how-to-create-decentralized-storage-for-a-multi-petabyte-digital-ledger-2499a3a8c281)
|
|
7
|
-
3. [https://medium.com/solana-labs/how-to-create-decentralized-storage-for-a-multi-petabyte-digital-ledger-2499a3a8c281](https://medium.com/solana-labs/how-to-create-decentralized-storage-for-a-multi-petabyte-digital-ledger-2499a3a8c281)
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Storage Rent Economics
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
Each transaction that is submitted to the Solana ledger imposes costs. Transaction fees paid by the submitter, and collected by a validator, in theory, account for the acute, transactional, costs of validating and adding that data to the ledger. Unaccounted in this process is the mid-term storage of active ledger state, necessarily maintained by the rotating validator set. This type of storage imposes costs not only to validators but also to the broader network as active state grows so does data transmission and validation overhead. To account for these costs, we describe here our preliminary design and implementation of storage rent.
|
|
6
|
-
|
|
7
|
-
Storage rent can be paid via one of two methods:
|
|
8
|
-
|
|
9
|
-
Method 1: Set it and forget it
|
|
10
|
-
|
|
11
|
-
With this approach, accounts with two-years worth of rent deposits secured are exempt from network rent charges. By maintaining this minimum-balance, the broader network benefits from reduced liquidity and the account holder can rest assured that their `Account::data` will be retained for continual access/usage.
|
|
12
|
-
|
|
13
|
-
Method 2: Pay per byte
|
|
14
|
-
|
|
15
|
-
If an account has less than two-years worth of deposited rent the network charges rent on a per-epoch basis, in credit for the next epoch. This rent is deducted at a rate specified in genesis, in lamports per kilobyte-year.
|
|
16
|
-
|
|
17
|
-
For information on the technical implementation details of this design, see the [Rent](../rent.md) section.
|
package/src/implemented-proposals/ed_overview/ed_validation_client_economics/ed_vce_overview.md
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Validation-client Economics
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
**Subject to change. Follow most recent economic discussions in the Solana forums: https://forums.solana.com**
|
|
6
|
-
|
|
7
|
-
Validator-clients are eligible to charge commission on inflationary rewards distributed to staked tokens. This compensation is for providing compute \(CPU+GPU\) resources to validate and vote on a given PoH state. These protocol-based rewards are determined through an algorithmic disinflationary schedule as a function of total token supply. The network is expected to launch with an annual inflation rate around 8%, set to decrease by 15% per year until a long-term stable rate of 1.5% is reached, however these parameters are yet to be finalized by the community. These issuances are to be split and distributed to participating validators, with around 95% of the issued tokens allocated for validator rewards initiall (the remaining 5% reserved for Foundation operating expenses). Because the network will be distributing a fixed amount of inflation rewards across the stake-weighted validator set, the yield observed for staked tokens will be primarily a function of the amount of staked tokens in relation to the total token supply.
|
|
8
|
-
|
|
9
|
-
Additionally, validator clients may earn revenue through fees via state-validation transactions. For clarity, we separately describe the design and motivation of these revenue distributions for validation-clients below: state-validation protocol-based rewards and state-validation transaction fees and rent.
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Inflation Schedule
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
**Subject to change. Follow most recent economic discussions in the Solana forums: https://forums.solana.com**
|
|
6
|
-
|
|
7
|
-
Validator-clients have two functional roles in the Solana network:
|
|
8
|
-
|
|
9
|
-
- Validate \(vote\) the current global state of their observed PoH.
|
|
10
|
-
- Be elected as ‘leader’ on a stake-weighted round-robin schedule during which time they are responsible for collecting outstanding transactions and incorporating them into their observed PoH, thus updating the global state of the network and providing chain continuity.
|
|
11
|
-
|
|
12
|
-
Validator-client rewards for these services are to be distributed at the end of each Solana epoch. As previously discussed, compensation for validator-clients is provided via a commission charged on the protocol-based annual inflation rate dispersed in proportion to the stake-weight of each validator-node \(see below\) along with leader-claimed transaction fees available during each leader rotation. I.e. during the time a given validator-client is elected as leader, it has the opportunity to keep a portion of each transaction fee, less a protocol-specified amount that is destroyed \(see [Validation-client State Transaction Fees](ed_vce_state_validation_transaction_fees.md)\).
|
|
13
|
-
|
|
14
|
-
The effective protocol-based annual staking yield \(%\) per epoch received by validation-clients is to be a function of:
|
|
15
|
-
|
|
16
|
-
- the current global inflation rate, derived from the pre-determined dis-inflationary issuance schedule \(see [Validation-client Economics](ed_vce_overview.md)\)
|
|
17
|
-
- the fraction of staked SOLs out of the current total circulating supply,
|
|
18
|
-
- the commission charged by the validation service,
|
|
19
|
-
- the up-time/participation \[% of available slots that validator had opportunity to vote on\] of a given validator over the previous epoch.
|
|
20
|
-
|
|
21
|
-
The first factor is a function of protocol parameters only \(i.e. independent of validator behavior in a given epoch\) and results in an inflation schedule designed to incentivize early participation, provide clear monetary stability and provide optimal security in the network.
|
|
22
|
-
|
|
23
|
-
As a first step to understanding the impact of the _Inflation Schedule_ on the Solana economy, we’ve simulated the upper and lower ranges of what token issuance over time might look like given the current ranges of Inflation Schedule parameters under study.
|
|
24
|
-
|
|
25
|
-
Specifically:
|
|
26
|
-
|
|
27
|
-
- _Initial Inflation Rate_: 7-9%
|
|
28
|
-
- _Dis-inflation Rate_: -14-16%
|
|
29
|
-
- _Long-term Inflation Rate_: 1-2%
|
|
30
|
-
|
|
31
|
-
Using these ranges to simulate a number of possible Inflation Schedules, we can explore inflation over time:
|
|
32
|
-
|
|
33
|
-

|
|
34
|
-
|
|
35
|
-
In the above graph, the average values of the range are identified to illustrate the contribution of each parameter.
|
|
36
|
-
From these simulated _Inflation Schedules_, we can also project ranges for token issuance over time.
|
|
37
|
-
|
|
38
|
-

|
|
39
|
-
|
|
40
|
-
Finally we can estimate the _Staked Yield_ on staked SOL, if we introduce an additional parameter, previously discussed, _% of Staked SOL_:
|
|
41
|
-
|
|
42
|
-
$$
|
|
43
|
-
\%~\text{SOL Staked} = \frac{\text{Total SOL Staked}}{\text{Total Current Supply}}
|
|
44
|
-
$$
|
|
45
|
-
|
|
46
|
-
In this case, because _% of Staked SOL_ is a parameter that must be estimated (unlike the _Inflation Schedule_ parameters), it is easier to use specific _Inflation Schedule_ parameters and explore a range of _% of Staked SOL_. For the below example, we’ve chosen the middle of the parameter ranges explored above:
|
|
47
|
-
|
|
48
|
-
- _Initial Inflation Rate_: 8%
|
|
49
|
-
- _Dis-inflation Rate_: -15%
|
|
50
|
-
- _Long-term Inflation Rate_: 1.5%
|
|
51
|
-
|
|
52
|
-
The values of _% of Staked SOL_ range from 60% - 90%, which we feel covers the likely range we expect to observe, based on feedback from the investor and validator communities as well as what is observed on comparable Proof-of-Stake protocols.
|
|
53
|
-
|
|
54
|
-

|
|
55
|
-
|
|
56
|
-
Again, the above shows an example _Staked Yield_ that a staker might expect over time on the Solana network with the _Inflation Schedule_ as specified. This is an idealized _Staked Yield_ as it neglects validator uptime impact on rewards, validator commissions, potential yield throttling and potential slashing incidents. It additionally ignores that _% of Staked SOL_ is dynamic by design - the economic incentives set up by this _Inflation Schedule_.
|
|
57
|
-
|
|
58
|
-
### Adjusted Staking Yield
|
|
59
|
-
|
|
60
|
-
A complete appraisal of earning potential from staking tokens should take into account staked _Token Dilution_ and its impact on staking yield. For this, we define _adjusted staking yield_ as the change in fractional token supply ownership of staked tokens due to the distribution of inflation issuance. I.e. the positive dilutive effects of inflation.
|
|
61
|
-
|
|
62
|
-
We can examine the _adjusted staking yield_ as a function of the inflation rate and the percent of staked tokens on the network. We can see this plotted for various staking fractions here:
|
|
63
|
-
|
|
64
|
-

|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: State-validation Transaction Fees
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
**Subject to change.**
|
|
6
|
-
|
|
7
|
-
Each transaction sent through the network, to be processed by the current leader validation-client and confirmed as a global state transaction, must contain a transaction fee. Transaction fees offer many benefits in the Solana economic design, for example they:
|
|
8
|
-
|
|
9
|
-
- provide unit compensation to the validator network for the CPU/GPU resources necessary to process the state transaction,
|
|
10
|
-
- reduce network spam by introducing real cost to transactions,
|
|
11
|
-
- open avenues for a transaction market to incentivize validation-client to collect and process submitted transactions in their function as leader,
|
|
12
|
-
- and provide potential long-term economic stability of the network through a protocol-captured minimum fee amount per transaction, as described below.
|
|
13
|
-
|
|
14
|
-
Many current blockchain economies \(e.g. Bitcoin, Ethereum\), rely on protocol-based rewards to support the economy in the short term, with the assumption that the revenue generated through transaction fees will support the economy in the long term, when the protocol derived rewards expire. In an attempt to create a sustainable economy through protocol-based rewards and transaction fees, a fixed portion of each transaction fee is destroyed, with the remaining fee going to the current leader processing the transaction. A scheduled global inflation rate provides a source for rewards distributed to validation-clients, through the process described above.
|
|
15
|
-
|
|
16
|
-
Transaction fees are set by the network cluster based on recent historical throughput, see [Congestion Driven Fees](../../transaction-fees.md#congestion-driven-fees). This minimum portion of each transaction fee can be dynamically adjusted depending on historical gas usage. In this way, the protocol can use the minimum fee to target a desired hardware utilization. By monitoring a protocol specified gas usage with respect to a desired, target usage amount, the minimum fee can be raised/lowered which should, in turn, lower/raise the actual gas usage per block until it reaches the target amount. This adjustment process can be thought of as similar to the difficulty adjustment algorithm in the Bitcoin protocol, however in this case it is adjusting the minimum transaction fee to guide the transaction processing hardware usage to a desired level.
|
|
17
|
-
|
|
18
|
-
As mentioned, a fixed-proportion of each transaction fee is to be destroyed. The intent of this design is to retain leader incentive to include as many transactions as possible within the leader-slot time, while providing an inflation limiting mechanism that protects against "tax evasion" attacks \(i.e. side-channel fee payments\)[1](../ed_references.md).
|
|
19
|
-
|
|
20
|
-
Additionally, the burnt fees can be a consideration in fork selection. In the case of a PoH fork with a malicious, censoring leader, we would expect the total fees destroyed to be less than a comparable honest fork, due to the fees lost from censoring. If the censoring leader is to compensate for these lost protocol fees, they would have to replace the burnt fees on their fork themselves, thus potentially reducing the incentive to censor in the first place.
|