From 07dbdc631c5b1a6c68e45a565ab4079ab35f9626 Mon Sep 17 00:00:00 2001 From: bitzoic Date: Thu, 28 Mar 2024 16:57:46 +0900 Subject: [PATCH 01/18] Create the book --- .docs/book/.DS_Store | Bin 0 -> 6148 bytes .docs/book/.gitignore | 1 + .docs/book/README.md | 28 ++ .docs/book/book.toml | 0 .docs/book/src/.DS_Store | Bin 0 -> 6148 bytes .docs/book/src/SUMMARY.md | 24 ++ .docs/book/src/documentation/.DS_Store | Bin 0 -> 6148 bytes .../documentation/getting_started/index.md | 71 ++++ .../getting_started/running_tests.md | 22 + .../src/documentation/libraries/.DS_Store | Bin 0 -> 6148 bytes .../libraries/access_security/admin/index.md | 103 +++++ .../libraries/access_security/index.md | 19 + .../access_security/ownership/index.md | 72 ++++ .../access_security/pausable/index.md | 121 ++++++ .../access_security/reentrancy/index.md | 60 +++ .../documentation/libraries/asset/.DS_Store | Bin 0 -> 6148 bytes .../libraries/asset/asset/base.md | 162 ++++++++ .../libraries/asset/asset/index.md | 20 + .../libraries/asset/asset/metadata.md | 162 ++++++++ .../libraries/asset/asset/supply.md | 79 ++++ .../documentation/libraries/asset/index.md | 7 + .../libraries/cryptography/bytecode/index.md | 143 +++++++ .../libraries/cryptography/index.md | 11 + .../libraries/cryptography/merkle/index.md | 127 ++++++ .../libraries/data_structures/index.md | 7 + .../libraries/data_structures/queue/index.md | 66 +++ .../book/src/documentation/libraries/index.md | 63 +++ .../libraries/math/fixed_point/index.md | 117 ++++++ .../src/documentation/libraries/math/index.md | 11 + .../libraries/math/signed_integers/index.md | 60 +++ .docs/book/src/documentation/welcome.md | 3 + .docs/book/theme/highlight.js | 392 ++++++++++++++++++ 32 files changed, 1951 insertions(+) create mode 100644 .docs/book/.DS_Store create mode 100644 .docs/book/.gitignore create mode 100644 .docs/book/README.md create mode 100644 .docs/book/book.toml create mode 100644 .docs/book/src/.DS_Store create mode 100644 .docs/book/src/SUMMARY.md create mode 100644 .docs/book/src/documentation/.DS_Store create mode 100644 .docs/book/src/documentation/getting_started/index.md create mode 100644 .docs/book/src/documentation/getting_started/running_tests.md create mode 100644 .docs/book/src/documentation/libraries/.DS_Store create mode 100644 .docs/book/src/documentation/libraries/access_security/admin/index.md create mode 100644 .docs/book/src/documentation/libraries/access_security/index.md create mode 100644 .docs/book/src/documentation/libraries/access_security/ownership/index.md create mode 100644 .docs/book/src/documentation/libraries/access_security/pausable/index.md create mode 100644 .docs/book/src/documentation/libraries/access_security/reentrancy/index.md create mode 100644 .docs/book/src/documentation/libraries/asset/.DS_Store create mode 100644 .docs/book/src/documentation/libraries/asset/asset/base.md create mode 100644 .docs/book/src/documentation/libraries/asset/asset/index.md create mode 100644 .docs/book/src/documentation/libraries/asset/asset/metadata.md create mode 100644 .docs/book/src/documentation/libraries/asset/asset/supply.md create mode 100644 .docs/book/src/documentation/libraries/asset/index.md create mode 100644 .docs/book/src/documentation/libraries/cryptography/bytecode/index.md create mode 100644 .docs/book/src/documentation/libraries/cryptography/index.md create mode 100644 .docs/book/src/documentation/libraries/cryptography/merkle/index.md create mode 100644 .docs/book/src/documentation/libraries/data_structures/index.md create mode 100644 .docs/book/src/documentation/libraries/data_structures/queue/index.md create mode 100644 .docs/book/src/documentation/libraries/index.md create mode 100644 .docs/book/src/documentation/libraries/math/fixed_point/index.md create mode 100644 .docs/book/src/documentation/libraries/math/index.md create mode 100644 .docs/book/src/documentation/libraries/math/signed_integers/index.md create mode 100644 .docs/book/src/documentation/welcome.md create mode 100644 .docs/book/theme/highlight.js diff --git a/.docs/book/.DS_Store b/.docs/book/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c19ea15685da1b93815474188f424f34d4c83f82 GIT binary patch literal 6148 zcmeHK%}T>S5Z<-brW7Fug&r5Y7Ob@vikA@U3mDOZN=;1BV9b^zHHT8jSzpK}@p+ut z-GIfMMeGdhe)GGV{UH0p7~}3DJYvjdj9JhSIVv@R?%L3nNk-&2Mm7&(8G!W>%uVdC z1AcphWh`Y6LGk_j<0#Af{ZGEtXm0Pctd`ZW?z|^ic)6c1GS^RU(7Kc|4l3ObuA*5n zwfD|slKW9IOI1M>&LHLXI!Z!WxN?z%nX2`4z-n9Vsoh;J2jfvs3{Hlto>-0t{hk;e zk5;R;wSRDUdNF;DUlRGI>Eyt+l3jxpyn|v^^XjEZER#p@RM}M)Au&J<5Cg=(W;0;U z1*@~!G|=ja0b-zr0o)%1G(^W>sZnhm(BbtN<4r^q(D5ySC=5CVON|f#;kp!1mvZyO z;JO_A!sIyyOO3jmaWylHV`i=%FI>$IexcGCcQjH@3=jkB3^cT9#GAOVD08;{SRS6W0@^(^6wE780ResO5&#D7BV85Lae+GIIR;COI12hz QIUrpG6d}|R1HZt)7l%_xi2wiq literal 0 HcmV?d00001 diff --git a/.docs/book/.gitignore b/.docs/book/.gitignore new file mode 100644 index 00000000..7585238e --- /dev/null +++ b/.docs/book/.gitignore @@ -0,0 +1 @@ +book diff --git a/.docs/book/README.md b/.docs/book/README.md new file mode 100644 index 00000000..6f852de0 --- /dev/null +++ b/.docs/book/README.md @@ -0,0 +1,28 @@ +## Installation + +If you wish to alter the documentation presented in this book then follow the following instructions. + +1. Install [Rust](https://www.rust-lang.org/tools/install) if it's not installed. +2. Install [mdbook](https://rust-lang.github.io/mdBook/). + + ```bash + cargo install mdbook + ``` + +3. To [build](https://rust-lang.github.io/mdBook/cli/build.html) the book make sure that you are in `/.docs/book` and run + + ```bash + mdbook build + ``` + +4. To develop the book in real time, in the browser, run + + ```bash + mdbook serve --open + ``` + +## How to edit the book + +Each page is written in markdown so there's not much to learn specifically for `mdbook` but you're free to read their documentation for additional information. + +If you wish to add a new page then it must be listed in the [SUMMARY.md](src/SUMMARY.md). diff --git a/.docs/book/book.toml b/.docs/book/book.toml new file mode 100644 index 00000000..e69de29b diff --git a/.docs/book/src/.DS_Store b/.docs/book/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..438ff1c5a25017abda18d974ce7c19fead9129d8 GIT binary patch literal 6148 zcmeHK%}N6?5T3MEw@9G}g&qT53)Wf%@v>BX0ax^(Qg_`&7uQ7Etv!^&p7n)%5}(JJ zBr6tw4ju%{3{1YsWF{fsE|~-XM1LG_0W<-?LnW-#vH3!1ob;1aoQF`DIqo3=1v!MM zEdPN4`gRS7LBlnS;p6v9(Wj!x=po8r5`^)7>3JqhwK zACLOs@SJ)lT4zydhtX-8Oa{%h1FiBfRmspKq;Y~F7iX!8^`x)IDju2Kzz%qIuRdtD zrqk};Zd-PDdb75i?sYqD+1uWo&FbFz#^(O<;4ZsY`pMEP@DDW7a9F}K8b9ptF&L^$ zs~e0eXDBlnnE_^i8CX;X+e2}PwzQe+zIXbYR>m!ZV2uaYU zw*;Yd=sPSd;s}bcsfadJxF?3N>FAd(&UaW?wCNzs$~cc(S-2O9Fsq|qns5-lMQ)h^ zW?-Iys_izZ{vUn+{-00c9y7oUEEEHxb{HJ?aZ9eYe%c(>T8VmvNmqi|9e&i-4hl8)o278F&M?6;Ocy literal 0 HcmV?d00001 diff --git a/.docs/book/src/SUMMARY.md b/.docs/book/src/SUMMARY.md new file mode 100644 index 00000000..9b90be02 --- /dev/null +++ b/.docs/book/src/SUMMARY.md @@ -0,0 +1,24 @@ +# Summary + +- [Welcome](./documentation/welcome.md) +- [Getting Started](./documentation/getting_started/index.md) + - [Running Tests](./documentation/getting_started/running_tests.md) +- [Libraries](./documentation/libraries/index.md) + - [Asset Libraries](./documentation/libraries/asset/index.md) + - [Asset Library](./documentation/libraries/asset/asset/index.md) + - [Base](./documentation/libraries/asset/asset/base.md) + - [Supply](./documentation/libraries/asset/asset/supply.md) + - [Metadata](./documentation/libraries/asset/asset/metadata.md) + - [Access Control and Secutiry Libraries](./documentation/libraries/access_security/index.md) + - [Admin Library](./documentation/libraries/access_security/admin/index.md) + - [Ownership Library](./documentation/libraries/access_security/ownership/index.md) + - [Pausable Library](./documentation/libraries/access_security/pausable/index.md) + - [Reentrancy Guard Library](./documentation/libraries/access_security/reentrancy/index.md) + - [Cryptography Libraries](./documentation/libraries/cryptography/index.md) + - [Bytecode Library](./documentation/libraries/cryptography/bytecode/index.md) + - [Merkle Library](./documentation/libraries/cryptography/merkle/index.md) + - [Math Libraries](./documentation/libraries/math/index.md) + - [Fixed Point Number Library](./documentation/libraries/math/fixed_point/index.md) + - [Signed Integers Library](./documentation/libraries/math/signed_integers/index.md) + - [Data Structure Libraries](./documentation/libraries/data_structures/index.md) + - [Queue Library](./documentation/libraries/data_structures/queue/index.md) diff --git a/.docs/book/src/documentation/.DS_Store b/.docs/book/src/documentation/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..81d4e66851e06ae600e9de1367774c2f94224a11 GIT binary patch literal 6148 zcmeHKPfNov6i>G4Qijlj!j1v21LvHB;ic611+3^nWwvZ+u{LAf++hrQ)-U8I@$>jz zl8R#!Jc+pX;N_RRKMnb%G9J$Q?(V5dCt;ip$2uV%3?by^DozJ#=BsHs$aHRC9KsP!->uK* zt!}3wTgUB1L(aRcW<$1*I*WxP_Vy1>&ijwaQ>tDJogDr=Ejtzqc!kcIl|2XJG*Rh2 zc#F&;gOC^?28e-8VZfe$qP8gurgahn#K4ak!1F{5p_?ir+(7$63g z87P~fi}nBP`}hBH5{-xfV&Gpfz$?9==fje0ZCzO$)>;XA2a1AmxxvpA=;%@mu~>@h bpjyB#u>"] +entry = "main.sw" +license = "Apache-2.0" +name = "MyProject" + +[dependencies] +sway_libs = { git = "https://github.com/FuelLabs/sway-libs", tag = "v0.1.0" } +``` + +> **NOTE:** Be sure to set the tag to the latest release. + +## Importing Sway Libs to Your Project + +Once Sway Libs is a dependency to your project, you may then import your desired library in your Sway Smart Contract as so: + +```sway +use sway_libs::::; +``` + +For example, to import the `only_owner()` from the Ownership Library function use the following statement at the top of your Sway file: + +```sway +use sway_libs::ownership::only_owner; +``` + +> **NOTE:** +> All projects currently use `forc v0.50.0`, `fuels-rs v0.53.0` and `fuel-core 0.22.0`. + +## Using Sway Libs + +Once the library you require has been imported to your project, you may call or use any functions and structures the library provides. + +In the following example, we import the Pausable Library and implement the `Pausable` abi with it's associated functions. + +```sway +use sway_libs::pausable::{_is_paused, _pause, _unpause, Pausable}; + +// Implement the Pausable ABI for our contract +impl Pausable for Contract { + #[storage(write)] + fn pause() { + _pause(); // Call the provided pause function. + } + + #[storage(write)] + fn unpause() { + _unpause(); // Call the provided unpause function. + } + + #[storage(read)] + fn is_paused() -> bool { + _is_paused() // Call the provided is paused function. + } +} +``` + +Any instructions related to using a specific library should be found within the README.md of that library. diff --git a/.docs/book/src/documentation/getting_started/running_tests.md b/.docs/book/src/documentation/getting_started/running_tests.md new file mode 100644 index 00000000..e4984ee4 --- /dev/null +++ b/.docs/book/src/documentation/getting_started/running_tests.md @@ -0,0 +1,22 @@ +# Running Tests + +There are two sets of tests that should be run: inline tests and sdk-harness tests. + +In order to run the inline tests, make sure you are in the `libs/` folder of this repository `sway-libs/libs/`. + +Run the tests: + +```bash +forc test +``` + +Once these tests have passed, make sure you are in the `tests/` folder of this repository `sway-libs/tests/`. + +Run the tests: + +```bash +forc test && cargo test +``` + +> **NOTE:** +> This may take a while depending on your hardware, future improvements to Sway will decrease build times. After this has been run once, indiviual test projects may be built on their own to save time. diff --git a/.docs/book/src/documentation/libraries/.DS_Store b/.docs/book/src/documentation/libraries/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0b3749de8fad37ca5828683e64f0202dde7e8989 GIT binary patch literal 6148 zcmeHK%}T>S5Z<+|O({YS3Oz1(Em&(U6fYsx7cim+m70*C!I&*gY7eE5v%Zi|;`2DO zyMY#iM-e+ycE8#A+0A^={b7u8cOD)yW;4btXowt@3PE$FYsUm5ay3UDEV5~k$e?1H zziGm6Z!n)_@Qc{`_kRS_B+l|)@00J;>W$r|)wJ5yz4s&+Uhe1f%=KrtIJ%ND2}<1$ zuH$GivG>nqn)`7Y%~V1hMi6p$6Q`kExN@F`nacIF!)jTriQQQ)`=eo3^iKz?u2_!x zy{;IX3|Fg`b#Qoeb~$-YUQ+p{iR8ezl0AbZyo0h<(W^I06PZ4Owah3Z35fw>fEXYK zwvz#K9$4+|ET5_-28e+l7{L8OKtps478=#o0UchS(O*YI0Uh5Gh{B*_u+Rt|5Ux`J zbt*Sc46f6`E=-(bu+XT}8CNUAJZ9zc@xs;WU>7Q!aYrNd!~ij{$v{mHZ9M-k;4f48 z$lpw%5ivjv{4)l4ee8{0D9W6z-^# literal 0 HcmV?d00001 diff --git a/.docs/book/src/documentation/libraries/access_security/admin/index.md b/.docs/book/src/documentation/libraries/access_security/admin/index.md new file mode 100644 index 00000000..b8b6ab3d --- /dev/null +++ b/.docs/book/src/documentation/libraries/access_security/admin/index.md @@ -0,0 +1,103 @@ +# Admin Library + +The Admin library provides a way to block users without an "adimistrative status" from calling functions within a contract. The Admin Library differs from the [Ownership Library](../ownership/index.md) as multiple users may have adimistrative status. The Admin Library is often used when needing administrative calls on a contract that involve multiple users or a whitelist. + +This library extends the [Ownership Library](../ownership/index.md). The Ownership library must be imported and used to enable the Admin library. Only the contract's owner may add and remove administrative users. + +# Using the Library + +## Importing the Admin Library + +In order to use the Admin Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). + +To import the Admin Library, be sure to include both the Admin and Ownership Libraries in your import statements. + +```sway +use sway_libs::{admin::*, ownership::*}; +``` + +## Integrating the Admin Library into the Ownership Library + +To use the Admin library, be sure to set a contract owner for your contract. The following demonstrates setting a contract owner using the [Ownership Library](../ownership/). + +```sway +use sway_libs::{admin::add_admin, ownership::initialize_ownership}; + +#[storage(read, write)] +fn my_constructor(new_owner: Identity) { + initialize_ownership(new_owner); +} + +#[storage(read, write)] +fn add_a_admin(new_admin: Identity) { + // Can only be called by contract's owner set in the constructor above. + add_admin(new_admin); +} +``` + +## Basic Functionality + +### Adding an Admin + +To add a new admin to a contract, call the `add_admin()` function. + +```sway +#[storage(read, write)] +fn add_a_admin(new_admin: Identity) { + // Can only be called by contract's owner. + add_admin(new_admin); +} +``` +> **NOTE** Only the contract's owner may call this function. Please see the example above to set a contract owner. + +### Removing an Admin + +To remove an admin from a contract, call the `remove_admin()` function. + +```sway +#[storage(read, write)] +fn remove_a_admin(old_admin: Identity) { + // Can only be called by contract's owner. + remove_admin(old_admin); +} +``` + +> **NOTE** Only the contract's owner may call this function. Please see the example above to set a contract owner. + +### Applying Restrictions + +To restrict a function to only an admin, call the `only_admin()` function. + +```sway +#[storage(read)] +fn only_owner_may call() { + only_admin(); + // Only an admin may reach this line. +} +``` + +> **NOTE:** Admins and the contract's owner are independent of one another. `only_admin()` will revert if called by the contract's owner. + +To restrict a function to only an admin or the contract's owner, call the `only_owner_or_admin()` function. + +```sway +#[storage(read)] +fn both_owner_or_admin_may_call() { + only_owner_or_admin(); + // Only an admin may reach this line. +} +``` + +### Checking Admin Status + +To check the administrative privledges of a user, call the `is_admin()` function. + +```sway +#[storage(read)] +fn check_if_admin(admin: Identity) { + let status = is_admin(admin); + assert(status); +} +``` + +For more information please see the [specification](../../../../../../../libs/admin/SPECIFICATION.md). diff --git a/.docs/book/src/documentation/libraries/access_security/index.md b/.docs/book/src/documentation/libraries/access_security/index.md new file mode 100644 index 00000000..43e9d86c --- /dev/null +++ b/.docs/book/src/documentation/libraries/access_security/index.md @@ -0,0 +1,19 @@ +# Access Control and Security Libraries + +Access Control and Security Libraries are any libraries that are built and intended to provide additional saftey when developing smart contracts. + +## Ownership Library + +The [Ownership](./ownership/index.md) Library is used to apply restrictions on functions such that only a **single** user may call them. + +## Admin Library + +The [Admin](./admin/index.md) Library is used to apply restrictions on functions such that only a select few users may call them like a whitelist. + +## Pausable Library + +The [Pausable](./pausable/index.md) Library allows contracts to implement an emergency stop mechanism. + +## Reentrancy Guard Library + +The [Reentrancy Guard](./reentrancy/index.md) Library is used to detect and prevent reentrancy attacks. diff --git a/.docs/book/src/documentation/libraries/access_security/ownership/index.md b/.docs/book/src/documentation/libraries/access_security/ownership/index.md new file mode 100644 index 00000000..0e7f2ff7 --- /dev/null +++ b/.docs/book/src/documentation/libraries/access_security/ownership/index.md @@ -0,0 +1,72 @@ +# Ownership Library + +The Ownership Library provides a way to block anyone other than a **single** "owner" from calling functions. The Ownership Library is often used when needing administrative calls on a contract by a single user. + +# Using the Library + +## Importing the Ownership Library + +In order to use the Ownership library, Sway Libs and [Sway Standards]() must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). To add Sway Standards as a dependency please see the [Sway Standards Book](). + +To import the Ownership Library and [SRC-5](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_5) Standard to your Sway Smart Contract, add the following to your Sway file: + +```sway +use sway_libs::ownership::*; +use standards::src5::*; +``` + +## Integrating the Ownership Library into the SRC-5 Standard + +To implement the [SRC-5](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_5) standard with the Ownership library, be sure to add the Sway Standards dependency to your contract. The following demonstrates the integration of the Ownership library with the SRC-5 standard. + +```sway +use sway_libs::ownership::_owner; +use standards::src_5::{State, SRC5}; + +impl SRC5 for Contract { + #[storage(read)] + fn owner() -> State { + _owner() + } +} +``` + +> **NOTE** A constructor method must be implemented to initialize the owner. + +## Basic Functionality + +### Setting a Contract Owner + +Once imported, the Ownership Library's functions will be available. To use them initialize the owner for your contract by calling the `initialize_ownership()` function in your own constructor method. + +```sway +#[storage(read, write)] +fn my_constructor(new_owner: Identity) { + initialize_ownership(new_owner); +} +``` + +### Applying Restrictions + +To restrict a function to only the owner, call the `only_owner()` function. + +```sway +#[storage(read)] +fn only_owner_may_call() { + only_owner(); + // Only the contract's owner may reach this line. +} +``` + +### Checking the Ownership Status + +To return the ownership state from storage, call the `_owner()` function. + +```sway +#[storage(read)] +fn get_owner_state() { + let owner: State = _owner(); +} +``` + +For more information please see the [specification](../../../../../../../libs/ownership/SPECIFICATION.md). diff --git a/.docs/book/src/documentation/libraries/access_security/pausable/index.md b/.docs/book/src/documentation/libraries/access_security/pausable/index.md new file mode 100644 index 00000000..0e6a1b58 --- /dev/null +++ b/.docs/book/src/documentation/libraries/access_security/pausable/index.md @@ -0,0 +1,121 @@ +# Pausable Library + +The Pausable library allows contracts to implement an emergency stop mechanism. This can be useful for scenarios such as having an emergency switch to freeze all transactions in the event of a large bug. + +It is highly encouraged to use the [Ownership Library](../ownership/index.md) in combination with the Pausable Library to ensure that only a single administrative user has the ability to pause your contract. + +# Using the Library + +## Importing the Pausable Library + +In order to use the Pausable library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). + +To import the Pausable Library to your Sway Smart Contract, add the following to your Sway file: + +```sway +use sway_libs::pausable::*; +``` + +## Basic Functionality + +### Implementing the `Pausable` abi + +The Pausable Library has two states: + +- `Paused` +- `Unpaused` + +By default, your contract will start in the `Unpaused` state. To pause your contract, you may call the `_pause()` function. The example below provides a basic pausable contract using the Pausable Library's `Pausable` abi without any restrictions such as an administrator. + +```sway +use sway_libs::pausable::{_is_paused, _pause, _unpause, Pausable}; + +impl Pausable for Contract { + #[storage(write)] + fn pause() { + _pause(); + } + + #[storage(write)] + fn unpause() { + _unpause(); + } + + #[storage(read)] + fn is_paused() -> bool { + _is_paused() + } +} +``` + +## Applying Paused Restrictions + +When developing a contract, you may want to lock functions down to a specific state. To do this, you may call either of the `require_paused()` or `require_not_paused()` functions. The example below shows these functions in use. + +```sway +use sway_libs::pausable::require_paused; + +#[storage(read)] +fn require_paused_state() { + require_paused(); + // This comment will only ever be reached if the contract is in the paused state +} +``` + +```sway +use sway_libs::pausable::require_not_paused; + +#[storage(read)] +fn require_not_paused_state() { + require_not_paused(); + // This comment will only ever be reached if the contract is in the unpaused state +} +``` + +## Using the Ownership Library with the Pausable Library + +It is highly recommended to integrate the [Ownership Library](../ownership/index.md) with the Pausable Library and apply restrictions the `pause()` and `unpause()` functions. This will ensure that only a single user may pause and unpause a contract in cause of emergency. Failure to apply this restriction will allow any user to obstruct a contract's functionalty. + +The follow example implements the `Pausable` abi and applies restrictions to it's pause/unpause functions. The owner of the contract must be set in an constructor defined by `MyConstructor` in this example. + +```sway +use sway_libs::{ + pausable::{_is_paused, _pause, _unpause, Pausable}, + ownership::{initialize_ownership, only_owner} +}; + +abi MyConstructor { + #[storage(read, write)] + fn my_constructor(new_owner: Identity); +} + +impl MyConstructor for Contract { + #[storage(read, write)] + fn my_constructor(new_owner: Identity) { + initialize_ownership(new_owner); + } +} + +impl Pausable for Contract { + #[storage(write)] + fn pause() { + // Add the `only_owner()` check to ensure only the owner may unpause this contract. + only_owner(); + _pause(); + } + + #[storage(write)] + fn unpause() { + // Add the `only_owner()` check to ensure only the owner may unpause this contract. + only_owner(); + _unpause(); + } + + #[storage(read)] + fn is_paused() -> bool { + _is_paused() + } +} +``` + +More information can be found in the [specification](../../../../../../../libs/pausable/SPECIFICATION.md). diff --git a/.docs/book/src/documentation/libraries/access_security/reentrancy/index.md b/.docs/book/src/documentation/libraries/access_security/reentrancy/index.md new file mode 100644 index 00000000..fb6a9bf0 --- /dev/null +++ b/.docs/book/src/documentation/libraries/access_security/reentrancy/index.md @@ -0,0 +1,60 @@ +# Reentrancy Guard Library + +The Reentrancy Guard Library provides an API to check for and disallow reentrancy on a contract. A reentrancy attack happens when a function is externally invoked during its execution, allowing it to be run multiple times in a single transaction + +# Known Issues + +While this can protect against both single-function reentrancy and cross-function reentrancy attacks, it WILL NOT PREVENT a cross-contract reentrancy attack. + +# Using the Library + +## Importing the Reentrancy Guard Library + +In order to use the Reentrancy Guard library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). + +To import the Reentrancy Guard Library to your Sway Smart Contract, add the following to your Sway file: + +```sway +use sway_libs::reentrancy::*; +``` + +## Basic Functionality + +Once imported, using the Reentrancy Library can be done by calling one of the two functions: + +- `is_reentrant() -> bool` +- `reentrancy_guard()` + +### Using the Reentrancy Guard + +Once imported, using the Reentrancy Guard Library can be used by calling the `reentrancy_guard()` in your Sway Smart Contract. The following shows a Sway Smart Contract that applies the Reentrancy Guard Library: + +```sway +use sway_libs::reentrancy::reentrancy_guard; + +abi MyContract { + fn my_non_reentrant_function(); +} + +impl MyContract for Contract { + fn my_non_reentrant_function() { + reentrancy_guard(); + + // my code here + } +} +``` + +### Checking Reentrancy Status + +To check if the current caller is a reentrant, you may call the `is_reentrant()` function. + +```sway +use sway_libs::reentrancy::is_reentrant; + +fn check_if_reentrant() { + assert(!is_reentrant()); +} +``` + +More information can be found in the [specification](../../../../../../../libs/reentrancy/SPECIFICATION.md). diff --git a/.docs/book/src/documentation/libraries/asset/.DS_Store b/.docs/book/src/documentation/libraries/asset/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0b3749de8fad37ca5828683e64f0202dde7e8989 GIT binary patch literal 6148 zcmeHK%}T>S5Z<+|O({YS3Oz1(Em&(U6fYsx7cim+m70*C!I&*gY7eE5v%Zi|;`2DO zyMY#iM-e+ycE8#A+0A^={b7u8cOD)yW;4btXowt@3PE$FYsUm5ay3UDEV5~k$e?1H zziGm6Z!n)_@Qc{`_kRS_B+l|)@00J;>W$r|)wJ5yz4s&+Uhe1f%=KrtIJ%ND2}<1$ zuH$GivG>nqn)`7Y%~V1hMi6p$6Q`kExN@F`nacIF!)jTriQQQ)`=eo3^iKz?u2_!x zy{;IX3|Fg`b#Qoeb~$-YUQ+p{iR8ezl0AbZyo0h<(W^I06PZ4Owah3Z35fw>fEXYK zwvz#K9$4+|ET5_-28e+l7{L8OKtps478=#o0UchS(O*YI0Uh5Gh{B*_u+Rt|5Ux`J zbt*Sc46f6`E=-(bu+XT}8CNUAJZ9zc@xs;WU>7Q!aYrNd!~ij{$v{mHZ9M-k;4f48 z$lpw%5ivjv{4)l4ee8{0D9W6z-^# literal 0 HcmV?d00001 diff --git a/.docs/book/src/documentation/libraries/asset/asset/base.md b/.docs/book/src/documentation/libraries/asset/asset/base.md new file mode 100644 index 00000000..14852408 --- /dev/null +++ b/.docs/book/src/documentation/libraries/asset/asset/base.md @@ -0,0 +1,162 @@ +# Base Functionality + +## Importing the Asset Library Base Functionality + +To import the Asset Library Base Functionality and [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset) Standard to your Sway Smart Contract, add the following to your Sway file: + +```sway +use sway_libs::asset::base::*; +use standards::src20::*; +``` + +## Integration with the SRC-20 Standard + +The [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset) definition states that the following abi implementation is required for any Native Asset on Fuel: + +```sway +abi SRC20 { + #[storage(read)] + fn total_assets() -> u64; + #[storage(read)] + fn total_supply(asset: AssetId) -> Option; + #[storage(read)] + fn name(asset: AssetId) -> Option; + #[storage(read)] + fn symbol(asset: AssetId) -> Option; + #[storage(read)] + fn decimals(asset: AssetId) -> Option; +} +``` + +The Asset Library has the following complimentary functions for each function in the `SRC20` abi: + +- `_total_assets()` +- `_total_supply()` +- `_name()` +- `_symbol()` +- `_decimals()` + +The following ABI and functions are also provided to set your [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset) standard storage values: + +```sway +abi SetAssetAttributes { + #[storage(write)] + fn set_name(asset: AssetId, name: String); + #[storage(write)] + fn set_symbol(asset: AssetId, symbol: String); + #[storage(write)] + fn set_decimals(asset: AssetId, decimals: u8); +} +``` + +- `_set_name()` +- `_set_symbol()` +- `_set_decimals()` + +> **NOTE** The `_set_name()`, `_set_symbol()`, and `_set_decimals()` functions will set the attributes of an asset *unconditionally*. External checks should be applied to restrict the setting of attributes. + +## Setting Up Storage + +Once imported, the Asset Library's base functionality should be available. To use them, be sure to add the storage block bellow to your contract which enables the [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset) standard. + +```sway +storage { + total_assets: u64 = 0, + total_supply: StorageMap = StorageMap {}, + name: StorageMap = StorageMap {}, + symbol: StorageMap = StorageMap {}, + decimals: StorageMap = StorageMap {}, +} +``` + +## Implementing the SRC-20 Standard with the Asset Library + +To use the Asset Library's base functionly, simply pass the `StorageKey` from the prescribed storage block. The example below shows the implementation of the [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset) standard in combination with the Asset Library with no user defined restrictions or custom functionality. + +```sway +use sway_libs::asset::base::{ + _total_assets, + _total_supply, + _name, + _symbol, + _decimals +}; +use standards::src20::SRC20; +use std::{string::String, storage::storage_string::*}; + +// The SRC-20 storage block +storage { + total_assets: u64 = 0, + total_supply: StorageMap = StorageMap {}, + name: StorageMap = StorageMap {}, + symbol: StorageMap = StorageMap {}, + decimals: StorageMap = StorageMap {}, +} + +// Implement the SRC-20 Standard for this contract +impl SRC20 for Contract { + #[storage(read)] + fn total_assets() -> u64 { + // Pass the `total_assets` StorageKey to `_total_assets()` from the Asset Library. + _total_assets(storage.total_assets) + } + + #[storage(read)] + fn total_supply(asset: AssetId) -> Option { + // Pass the `total_supply` StorageKey to `_total_supply()` from the Asset Library. + _total_supply(storage.total_supply, asset) + } + + #[storage(read)] + fn name(asset: AssetId) -> Option { + // Pass the `name` StorageKey to `_name_()` from the Asset Library. + _name(storage.name, asset) + } + + #[storage(read)] + fn symbol(asset: AssetId) -> Option { + // Pass the `symbol` StorageKey to `_symbol_()` function from the Asset Library. + _symbol(storage.symbol, asset) + } + + #[storage(read)] + fn decimals(asset: AssetId) -> Option { + // Pass the `decimals` StorageKey to `_decimals_()` function from the Asset Library. + _decimals(storage.decimals, asset) + } +} +``` + +## Setting an Asset's SRC-20 Attributes + +To set some the asset attributes for an Asset, use the `SetAssetAttributes` ABI provided by the Asset Library. TThe example below shows the implementation of the `SetAssetAttributes` ABI with no user defined restrictions or custom functionality. It is recommended that the [Ownership Library](../../access_security/ownership/) is used in conjunction with the `SetAssetAttributes` ABI to ensure only a single user has permissions to set an Asset's attributes. + +```sway +use sway_libs::asset::base::*; +use std::{string::String, storage::storage_string::*}; + +storage { + name: StorageMap = StorageMap {}, + symbol: StorageMap = StorageMap {}, + decimals: StorageMap = StorageMap {}, +} + +impl SetAssetAttributes for Contract { + #[storage(write)] + fn set_name(asset: AssetId, name: String) { + _set_name(storage.name, asset, name); + } + + #[storage(write)] + fn set_symbol(asset: AssetId, symbol: String) { + _set_symbol(storage.symbol, asset, symbol); + } + + #[storage(write)] + fn set_decimals(asset: AssetId, decimals: u8) { + _set_decimals(storage.decimals, asset, decimals); + } +} +``` + +> **NOTE** The `_set_name()`, `_set_symbol()`, and `_set_decimals()` functions will set the attributes of an asset *unconditionally*. External checks should be applied to restrict the setting of attributes. diff --git a/.docs/book/src/documentation/libraries/asset/asset/index.md b/.docs/book/src/documentation/libraries/asset/asset/index.md new file mode 100644 index 00000000..2e1cd8a0 --- /dev/null +++ b/.docs/book/src/documentation/libraries/asset/asset/index.md @@ -0,0 +1,20 @@ +# Asset Library + +The Asset Library provides basic helper functions for the [SRC-20; Native Asset Standard](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset), [SRC-3; Mint and Burn Standard](https://github.com/FuelLabs/sway-standards/tree/master/standards/src3-mint-burn), and the [SRC-7; Arbitrary Asset Metadata Standard](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata). It is intended to make develpment of Native Assets using Sway quick and easy while following the standard's specifications. + +# Using the Library + +## [SRC-20 Functionality](./base.md) + +The Base or core of any Asset on the Fuel Network must follow the [SRC-20; Native Asset Standard](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset). The Asset Library's [Base](./base.md) section supports the [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset)'s implementation. + +## [SRC-3 Functionaltity](supply.md) + +The [SRC-3; Mint and Burn Standard](https://github.com/FuelLabs/sway-standards/tree/master/standards/src3-mint-burn) prescribes an ABI for how Native Assets on the Fuel Network are minted and burned. The Asset Library's [suppy](./supply.md) section supports the [SRC-3](https://github.com/FuelLabs/sway-standards/tree/master/standards/src3-mint-burn)'s implementation. + +## [SRC-7 Functionaltity](./metadata.md) + +The [SRC-7; Arbitrary Asset Metadata Standard](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata) prescribes an ABI for metadat associated with Native Assets on the Fuel Network. The Asset Library's [metadata](./metadata.md) section supports the [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata)'s implementation. + + +For more information please see the [specification](../../../../../../../libs/native_asset/2/SPECIFICATION.md). diff --git a/.docs/book/src/documentation/libraries/asset/asset/metadata.md b/.docs/book/src/documentation/libraries/asset/asset/metadata.md new file mode 100644 index 00000000..55aa2cd2 --- /dev/null +++ b/.docs/book/src/documentation/libraries/asset/asset/metadata.md @@ -0,0 +1,162 @@ +# Metadata Functionality + +## Importing the Asset Library Metadata Functionality + +To import the Asset Library Base Functionality and [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata) Standard to your Sway Smart Contract, add the following to your Sway file: + +```sway +use sway_libs::asset::metadata::*; +use standards::src7::*; +``` + +## Integration with the SRC-7 Standard + +The [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata) definition states that the following abi implementation is required for any Native Asset on Fuel: + +```sway +abi SRC7 { + #[storage(read)] + fn metadata(asset: AssetId, key: String) -> Option; +} +``` + +The Asset Library has the following complimentary data type for the [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata) standard: + +- `StorageMetadata` + +The following additional functionality for the [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata)'s `Metadata` type is provided: + +- `as_string()` +- `is_string()` +- `as_u64()` +- `is_u64()` +- `as_bytes()` +- `is_bytes()` +- `as_b256()` +- `is_b256()` + +## Setting Up Storage + +Once imported, the Asset Library's metadata functionality should be available. To use them, be sure to add the storage block bellow to your contract which enables the [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata) standard. + +```sway +storage { + metadata: StorageMetadata = StorageMetadata {}, +} +``` + +## Using the `StorageMetadata` Type + +### Setting Metadata + +To set some metadata for an Asset, use the `SetAssetMetadata` ABI provided by the Asset Library. Be sure to follow the [SRC-9](https://github.com/FuelLabs/sway-standards/tree/master/standards/src9-metadata-keys) standard for your `key`. It is recommended that the [Ownership Library](../../access_security/ownership/) is used in conjunction with the `SetAssetMetadata` ABI to ensure only a single user has permissions to set an Asset's metadata. + +```sway +use sway_libs::asset::metadata::*; + +storage { + metadata: StorageMetadata = StorageMetadata {}, +} + +impl SetAssetMetadata for Contract { + #[storage(read, write)] + fn set_metadata(asset: AssetId, key: String, metadata: Metadata) { + _set_metadata(storage.metadata, asset, key, metadata); + } +} +``` + +> **NOTE** The `_set_metadata()` function will set the metdata of an asset *unconditionally*. External checks should be applied to restrict the setting of metadata. + +### Implementing the SRC-7 Standard with StorageMetadata + +To use the `StorageMetadata` type, simply get the stored metadata with the associated `key` and `AssetId`. The example below shows the implementation of the [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata) standard in combination with the Asset Library's `StorageMetadata` type with no user defined restrictions or custom functionality. + +```sway +use sway_libs::asset::metadata::*; +use standards::src7::SRC7; + +storage { + metadata: StorageMetadata = StorageMetadata {}, +} + +// Implement the SRC-7 Standard for this contract +impl SRC7 for Contract { + #[storage(read)] + fn metadata(asset: AssetId, key: String) -> Option { + // Return the stored metadata + storage.metadata.get(asset, key) + } +} +``` + +## Using the `Metadata` Extensions + +The `Metadata` type defined by the [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata) standard can be one of 4 states: + +```sway +pub enum Metadata { + B256: b256, + Bytes: Bytes, + Int: u64, + String: String, +} +``` + +The Asset Library enables the following functionality for the `Metadata` type: + +### `is_b256()` and `as_b256()` + +The `is_b256()` check enables checking whether the `Metadata` type is a `b256`. +The `as_b256()` returns the `b256` of the `Metadata` type. + + +```sway +fn b256_type(my_metadata: Metadata) { + assert(my_metadata.is_b256()); + + let my_b256: b256 = my_metadata.as_b256(); +} +``` + +### `is_bytes()` and `as_bytes()` + +The `is_bytes()` check enables checking whether the `Metadata` type is a `Bytes`. +The `as_bytes()` returns the `Bytes` of the `Metadata` type. + + +```sway +fn bytes_type(my_metadata: Metadata) { + assert(my_metadata.is_bytes()); + + let my_bytes: Bytes = my_metadata.as_bytes(); +} +``` + +### `is_u64()` and `as_u64()` + +The `is_u64()` check enables checking whether the `Metadata` type is a `u64`. +The `as_u64()` returns the `u64` of the `Metadata` type. + + +```sway +fn u64_type(my_metadata: Metadata) { + assert(my_metadata.is_u64()); + + let my_u64: u64 = my_metadata.as_u64(); +} +``` + +### `is_string()` and `as_string()` + +The `is_string()` check enables checking whether the `Metadata` type is a `String`. +The `as_string()` returns the `String` of the `Metadata` type. + + +```sway +fn string_type(my_metadata: Metadata) { + assert(my_metadata.is_string()); + + let my_string: String = my_metadata.as_string(); +} +``` diff --git a/.docs/book/src/documentation/libraries/asset/asset/supply.md b/.docs/book/src/documentation/libraries/asset/asset/supply.md new file mode 100644 index 00000000..ef2e3536 --- /dev/null +++ b/.docs/book/src/documentation/libraries/asset/asset/supply.md @@ -0,0 +1,79 @@ +# Supply Functionality + +## Importing the Asset Library Supply Functionality + +To import the Asset Library Supply Functionality and [SRC-3](https://github.com/FuelLabs/sway-standards/tree/master/standards/src3-mint-burn) Standard to your Sway Smart Contract, add the following to your Sway file: + +```sway +use sway_libs::asset::supply::*; +use standards::src3::*; +``` + +## Integration with the SRC-3 Standard + +The [SRC-3](https://github.com/FuelLabs/sway-standards/tree/master/standards/src3-mint-burn) definition states that the following abi implementation is required for any Native Asset on Fuel which mints and burns tokens: + +```sway +abi SRC3 { + #[storage(read, write)] + fn mint(recipient: Identity, vault_sub_id: SubId, amount: u64); + #[storage(read, write)] + fn burn(vault_sub_id: SubId, amount: u64); +} +``` + +The Asset Library has the following complimentary functions for each function in the `SRC3` abi: + +- `_mint()` +- `_burn()` + +> **NOTE** The `_mint()` and `_burn()` functions will mint and burn assets *unconditionally*. External checks should be applied to restrict the minting and burning of assets. + +## Setting Up Storage + +Once imported, the Asset Library's supply functionality should be available. To use them, be sure to add the storage block bellow to your contract which enables the [SRC-3](https://github.com/FuelLabs/sway-standards/tree/master/standards/src3-mint-burn) standard. + +```sway +storage { + total_assets: u64 = 0, + total_supply: StorageMap = StorageMap {}, +} +``` + +## Implementing the SRC-3 Standard with the Asset Library + +To use a base function, simply pass the `StorageKey` from the prescribed storage block. The example below shows the implementation of the [SRC-3](https://github.com/FuelLabs/sway-standards/tree/master/standards/src3-mint-burn) standard in combination with the Asset Library with no user defined restrictions or custom functionality. It is recommended that the [Ownership Library](../../access_security/ownership/) is used in conjunction with the Asset Library;s supply functionality to ensure only a single user has permissions to mint an Asset. + + +```sway +use sway_libs::asset::supply::{_mint, _burn}; +use standards::src3::SRC3; + +storage { + total_assets: u64 = 0, + total_supply: StorageMap = StorageMap {}, +} + +// Implement the SRC-3 Standard for this contract +impl SRC3 for Contract { + #[storage(read, write)] + fn mint(recipient: Identity, sub_id: SubId, amount: u64) { + // Pass the StorageKeys to the `_mint()` function from the Asset Library. + _mint( + storage.total_assets, + storage.total_supply, + recipient, + sub_id, + amount, + ); + } + + // Pass the StorageKeys to the `_burn_()` function from the Asset Library. + #[storage(read, write)] + fn burn(sub_id: SubId, amount: u64) { + _burn(storage.total_supply, sub_id, amount); + } +} +``` + +> **NOTE** The `_mint()` and `_burn()` functions will mint and burn assets *unconditionally*. External checks should be applied to restrict the minting and burning of assets. diff --git a/.docs/book/src/documentation/libraries/asset/index.md b/.docs/book/src/documentation/libraries/asset/index.md new file mode 100644 index 00000000..785a67b8 --- /dev/null +++ b/.docs/book/src/documentation/libraries/asset/index.md @@ -0,0 +1,7 @@ +# Assets Libraries + +Asset Libraries are any libraries that use [Native Assets](https://docs.fuel.network/docs/sway/blockchain-development/native_assets) on the Fuel Network. + +## Asset Library + +The [Asset](./asset/index.md) Library provides helper functions for the [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset), [SRC-3](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_3), and [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_7) standards. diff --git a/.docs/book/src/documentation/libraries/cryptography/bytecode/index.md b/.docs/book/src/documentation/libraries/cryptography/bytecode/index.md new file mode 100644 index 00000000..e6c509d9 --- /dev/null +++ b/.docs/book/src/documentation/libraries/cryptography/bytecode/index.md @@ -0,0 +1,143 @@ +# Bytecode Library + +The Bytecode Library allows for on-chain verification and computation of bytecode roots for contracts and predicates. + +A bytecode root for a contract and predicate is the Merkle root of the [binary Merkle tree](https://github.com/FuelLabs/fuel-specs/blob/master/src/protocol/cryptographic-primitives.md#binary-merkle-tree) with each leaf being 16KiB of instructions. This library will compute any contract's or predicate's bytecode root/address allowing for the verification of deployed contracts and generation of predicate addresses on-chain. + +More information can be found in the [specification](../../../../../../../libs/bytecode/SPECIFICATION.md). + +# Using the Library + +## Importing the Bytecode Library + +In order to use the Bytecode Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). + +To import the Bytecode Library to your Sway Smart Contract, add the following to your Sway file: + +```sway +use sway_libs::bytecode::*; +``` + +## Using the Bytecode Library In Sway + +Once imported, using the Bytecode Library is as simple as calling the desired function. Here is a list of function definitions that you may use. + +- `compute_bytecode_root()` +- `compute_bytecode_root_with_configurables()` +- `compute_predicate_address()` +- `compute_predicate_address_with_configurables()` +- `predicate_address_from_root()` +- `swap_configurables()` +- `verify_contract_bytecode()` +- `verify_contract_bytecode_with_configurables()` +- `verify_predicate_address()` +- `verify_predicate_address_with_configurables()` + +## Known Issues + +Please note that if you are passing the bytecode from the SDK and are including configurable values, the `Vec` bytecode provided must be copied to be mutable. The following can be added to make your bytecode mutable: + +```sway +fn foo(not_mutable_bytecode: Vec) { + // Copy the bytecode to a newly allocated memory to avoid memory ownership error. + let mut bytecode_slice = raw_slice::from_parts::(alloc_bytes(not_mutable_bytecode.len()), not_mutable_bytecode.len()); + not_mutable_bytecode + .ptr() + .copy_bytes_to(bytecode_slice.ptr(), not_mutable_bytecode.len()); + let mut bytecode_vec = Vec::from(bytecode_slice); + // You may not used `bytecode_vec` in your computation and verification function calls +} +``` + +## Basic Functionality + +The examples below are intended for internal contract calls. If you are passing bytecode from the SDK, please follow the steps listed above in known issues to avoid the memory ownership error. + +## Swapping Configurables + +Given some bytecode, you may swap the configurables of both Contracts and Predicates by calling the `swap_configurables()` function. + +```sway +fn foo(my_bytecode: Vec, my_configurables: Vec<(u64, Vec)>) { + let mut my_bytecode = my_bytecode; + let resulting_bytecode: Vec = swap_configurables(my_bytecode, my_configurables); +} +``` + +## Contracts + +### Computing the Bytecode Root + +To compute a contract's bytecode root you may call the `compute_bytecode_root()` or `compute_bytecode_root_with_configurables()` functions. + +```sway +fn foo(my_bytecode: Vec) { + let root: b256 = compute_bytecode_root(my_bytecode); +} + +fn bar(my_bytecode: Vec, my_configurables: Vec<(u64, Vec)>) { + let mut my_bytecode = my_bytecode; + let root: b256 = compute_bytecode_root_with_configurables(my_bytecode, my_configurables); +} +``` + +### Verifying a Contract's Bytecode Root + +To verify a contract's bytecode root you may call `verify_bytecode_root()` or `verify_contract_bytecode_with_configurables()` functions. + +```sway +fn foo(my_contract: ContractId, my_bytecode: Vec) { + verify_contract_bytecode(my_contract, my_bytecode); + // By reaching this line the contract has been verified to match the bytecode provided. +} + +fn bar(my_contract: ContractId, my_bytecode: Vec, my_configurables: Vec<(u64, Vec)>) { + let mut my_bytecode = my_bytecode; + verify_contract_bytecode_with_configurables(my_contract, my_bytecode, my_configurables); + // By reaching this line the contract has been verified to match the bytecode provided. +} +``` + +## Predicates + +### Computing the Address from Bytecode + +To compute a predicates's address you may call the `compute_predicate_address()` or `compute_predicate_address_with_configurables()` functions. + +```sway +fn foo(my_bytecode: Vec) { + let address: Address = compute_predicate_address(my_bytecode); +} + +fn bar(my_bytecode: Vec, my_configurables: Vec<(u64, Vec)>) { + let mut my_bytecode = my_bytecode; + let address: Address = compute_predicate_address_with_configurables(my_bytecode, my_configurables); +} +``` + +### Computing the Address from a Root + +If you have the root of a predicate, you may compute it's corresponding predicate address by calling the `predicate_address_from_root()` function. + +```sway +fn foo(my_root: b256) { + let address: Address = predicate_address_from_root(my_root); +} +``` + +### Verifying the Address + +To verify a predicates's address you may call `verify_predicate_address()` or `verify_predicate_address_with_configurables()` functions. + +```sway +fn foo(my_predicate: Address, my_bytecode: Vec) { + verify_predicate_address(my_predicate, my_bytecode); + // By reaching this line the predicate bytecode matches the address provided. +} + +fn bar(my_predicate: Address, my_bytecode: Vec, my_configurables: Vec<(u64, Vec)>) { + let mut my_bytecode = my_bytecode; + verify_predicate_bytecode_with_configurables(my_predicate, my_bytecode, my_configurables); + // By reaching this line the predicate bytecode matches the address provided. +} +``` diff --git a/.docs/book/src/documentation/libraries/cryptography/index.md b/.docs/book/src/documentation/libraries/cryptography/index.md new file mode 100644 index 00000000..033d9ef5 --- /dev/null +++ b/.docs/book/src/documentation/libraries/cryptography/index.md @@ -0,0 +1,11 @@ +# Cryptography Libraries + +Cryptography Libraries are any libraries that provided cryptographic functionality beyond what the std-lib provides. + +## Bytecode Library + +The [Bytecode](./bytecode/index.md) Library is used for on-chain verification and computation of bytecode roots for contracts and predicates. + +## Merkle Library + +The [Merkle Proof](./merkle/index.md) Library is used to verify Binary Merkle Trees computed off-chain. diff --git a/.docs/book/src/documentation/libraries/cryptography/merkle/index.md b/.docs/book/src/documentation/libraries/cryptography/merkle/index.md new file mode 100644 index 00000000..4e1d6a4b --- /dev/null +++ b/.docs/book/src/documentation/libraries/cryptography/merkle/index.md @@ -0,0 +1,127 @@ +# Merkle Library + +Merkle trees allow for on-chain verification of off-chain data. With the merkle root posted on-chain, the generation of proofs off-chain can provide verifibly true data. + +More information can be found in the [specification](../../../../../../../libs/merkle_proof/SPECIFICATION.md). + +# Using the Library + +## Importing the Merkle Library + +In order to use the Merkle Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). + +To import the Merkle Library to your Sway Smart Contract, add the following to your Sway file: + +```sway +use sway_libs::merkle::binary_proof::*; +``` + +## Using the Merkle Proof Library In Sway + +Once imported, using the Merkle Proof library is as simple as calling the desired function. Here is a list of function definitions that you may use. For more information please see the [specification](./SPECIFICATION.md). + +- `leaf_digest()` +- `node_digest()` +- `process_proof()` +- `verify_proof()` + +## Basic Functionality + +### Computing Leaves and Nodes + +The Binary Proof currently allows for you to compute leaves and nodes of a merkle tree given the appropriate hash digest. + +To compute a leaf use the `leaf_digest()` function: + +```sway +fn foo(hashed_data: b256) { + let leaf: b256 = leaf_digest(hashed_data); +} +``` + +To compute a node given two leaves, use the `node_digest()` function: + +```sway +fn foo(leaf_a: b256, leaf_b: b256) { + let node: b256 = node_digest(leaf_a, leaf_b); +} +``` + +> **NOTE** Order matters when computing a node. + +### Computing the Merkle Root + +To compute a Merkle root given a proof, use the `process_proof()` function. + +```sway +fn foo(key: u64, leaf: b256, num_leaves: u64, proof: Vec) { + let merkle_root: b256 = process_proof(key, leaf, num_leaves, proof); +} +``` + +### Verifying a Proof + +To verify a proof against a merkle root, use the `verify_proof()` function. + +```sway +fn foo(merkle_roof: b256, key: u64, leaf: b256, num_leaves: u64, proof: Vec) { + assert(verify_proof(key, leaf, merkle_root, num_leaves, proof)); +} +``` + +## Using the Merkle Proof Library with Fuels-rs + +To generate a Merkle Tree and corresponding proof for your Sway Smart Contract, use the [Fuel-Merkle](https://github.com/FuelLabs/fuel-vm/tree/master/fuel-merkle) crate. + +### Importing Into Your Project + +The import the Fuel-Merkle crate, the following should be added to the project's `Cargo.toml` file under `[dependencies]`: + +``` +fuel-merkle = { version = "0.33.0" } +``` + +### Importing Into Your Rust File + +The following should be added to your Rust file to use the Fuel-Merkle crate. + +```rust +use fuel_merkle::{ + binary::in_memory::MerkleTree, + common::Bytes32, +}; +``` + +### Using Fuel-Merkle + +#### Generating A Tree + +To create a merkle tree using Fuel-Merkle is as simple as pushing your leaves in increasing order. + +```rust +let mut tree = MerkleTree::new(); +let leaves = ["A".as_bytes(), "B".as_bytes(), "C".as_bytes()].to_vec(); +for datum in leaves.iter() { + let mut hasher = Sha256::new(); + hasher.update(&datum); + let hash: Bytes32 = hasher.finalize().try_into().unwrap(); + tree.push(hash); +} +``` + +#### Generating And Verifying A Proof + +To generate a proof for a specific leaf, you must have the index or key of the leaf. Simply call the prove function: + +```rust +let mut proof = tree.prove(key).unwrap(); +``` + +Once the proof has been generated, you may call the Sway Smart Contract's `verify_proof` function: + +```rust +let merkle_root = proof.0; +let merkle_leaf = proof.1[0]; +proof.1.remove(0); +contract_instance.verify_proof(key, merkle_leaf, merkle_root, num_leaves, proof.1).call().await; +``` diff --git a/.docs/book/src/documentation/libraries/data_structures/index.md b/.docs/book/src/documentation/libraries/data_structures/index.md new file mode 100644 index 00000000..9942c55b --- /dev/null +++ b/.docs/book/src/documentation/libraries/data_structures/index.md @@ -0,0 +1,7 @@ +## Data Structures Libraries + +Data Structure Libraries are libraries which provide complex data structures which unlock additional functionality for Smart Contracts. + +### Queue + +The [Queue](./queue/index.md) Library is a linear data structure that provides First-In-First-Out (FIFO) operations. \ No newline at end of file diff --git a/.docs/book/src/documentation/libraries/data_structures/queue/index.md b/.docs/book/src/documentation/libraries/data_structures/queue/index.md new file mode 100644 index 00000000..439f9cd0 --- /dev/null +++ b/.docs/book/src/documentation/libraries/data_structures/queue/index.md @@ -0,0 +1,66 @@ +# Queue Library + +A Queue is a linear structure which follows the First-In-First-Out (FIFO) principle. This means that the elements added first are the ones that get removed first. + +For more information about implementation and specifications, please see the [SPECIFICATION.md](../../../../../../../libs/queue/SPECIFICATION.md). + +# Using the Library + +## Importing the Queue Library + +In order to use the Queue Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). + +To import the Queue Library to your Sway Smart Contract, add the following to your Sway file: + +```sway +use sway_libs::queue::*; +``` + +## Basic Functionality + +### Instantiating a New Queue + +Once the `Queue` has been imported, you can create a new queue instance by calling the `new` function. + +```sway +let mut queue = Queue::new(); +``` + +## Enqueuing elements + +Adding elements to the `Queue` can be done using the `enqueue` function. + +```sway +// Enqueue an element to the queue +queue.enqueue(10u8); +``` + +### Dequeuing Elements + +To remove elements from the `Queue`, the `dequeue` function is used. This function follows the FIFO principle. + +```rust +// Dequeue the first element and unwrap the value +let first_item = queue.dequeue().unwrap(); +``` + +### Fetching the Head Element + +To retrieve the element at the head of the `Queue` without removing it, you can use the `peek` function. + +```rust +// Peek at the head of the queue +let head_item = queue.peek(); +``` + +### Checking the Queue's Length + +The `is_empty` and `len` functions can be used to check if the queue is empty and to get the number of elements in the queue respectively. + +```rust +// Checks if queue is empty (returns True or False) +let is_queue_empty = queue.is_empty(); + +// Returns length of queue +let queue_length = queue.len(); +``` diff --git a/.docs/book/src/documentation/libraries/index.md b/.docs/book/src/documentation/libraries/index.md new file mode 100644 index 00000000..6686dda3 --- /dev/null +++ b/.docs/book/src/documentation/libraries/index.md @@ -0,0 +1,63 @@ +# Libraries + +There are several types of libraries that Sway Libs encompases. These include libraries that provide convienence functions, standards supporting libraries, data type libraries, security functionality libraries. + +## Assets Libraries + +Asset Libraries are any libraries that use [Native Assets](https://docs.fuel.network/docs/sway/blockchain-development/native_assets) on the Fuel Network. + +### Asset Library + +The [Asset](./asset/asset/index.md) Library provides helper functions for the [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset), [SRC-3](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_3), and [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_7) standards. + +## Access Control and Security Libraries + +Access Control and Security Libraries are any libraries that are built and intended to provide additional saftey when developing smart contracts. + +### Ownership Library + +The [Ownership](./access_security/ownership/index.md) Library is used to apply restrictions on functions such that only a **single** user may call them. + +### Admin Library + +The [Admin](./access_security/admin/index.md) Library is used to apply restrictions on functions such that only a select few users may call them like a whitelist. + +### Pausable Library + +The [Pausable](./access_security/pausable/index.md) Library allows contracts to implement an emergency stop mechanism. + +### Reentrancy Guard Library + +The [Reentrancy Guard](./access_security/reentrancy/index.md) Library is used to detect and prevent reentrancy attacks. + +## Cryptography Libraries + +Cryptography Libraries are any libraries that provided cryptographic functionality beyond what the std-lib provides. + +### Bytecode Library + +The [Bytecode](./cryptography/bytecode/index.md) Library is used for on-chain verification and computation of bytecode roots for contracts and predicates. + +### Merkle Library + +The [Merkle Proof](./cryptography/merkle/index.md) Library is used to verify Binary Merkle Trees computed off-chain. + +## Math Libraries + +Math Libraries are libraries which provide mathematic functions or number types that are outside of the std-lib's scope. + +### Fixed Point Number Library + +The [Fixed Point Number](./math/fixed_point/index.md) Library is an interface to implement fixed-point numbers. + +### Signed Integers + +The [Signed Integers](./math/signed_integers/index.md) Library is an interface to implement signed integers. + +## Data Structures Libraries + +Data Structure Libraries are libraries which provide complex data structures which unlock additional functionality for Smart Contracts. + +### Queue + +The [Queue](./data_structures/queue/index.md) Library is a linear data structure that provides First-In-First-Out (FIFO) operations. diff --git a/.docs/book/src/documentation/libraries/math/fixed_point/index.md b/.docs/book/src/documentation/libraries/math/fixed_point/index.md new file mode 100644 index 00000000..af846e27 --- /dev/null +++ b/.docs/book/src/documentation/libraries/math/fixed_point/index.md @@ -0,0 +1,117 @@ +# Fixed Point Number Library + +The Fixed Point Number Library provides a library to use fixed-point numbers in Sway. It has 3 distinct unsigned types: `UFP32`, `UFP64` and `UFP128` as well as 3 signed types `IFP64`, `IFP128` and `IFP256`. These types are stack allocated. + +This type is stored as a `u32`, `u64` or `U128` under the hood. Therefore the size can be known at compile time and the length is static. + +For more information please see the [specification](../../../../../../../libs/fixed_point/SPECIFICATION.md). + +# Using the Library + +## Importing the Fixed Point Number Library + +In order to use the Fixed Point Number Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). + +To import the Fixed Point Number Library to your Sway Smart Contract, add the following to your Sway file: + +```sway +use sway_libs::fixed_point::*; +``` + +## Supported Fixed Point Numbers + +### Signed Fixed Point Numbers + +We currently support the following signed Fixed Point numbers: + +- `IFP64` +- `IFP128` +- `IFP256` + +In order to use the `IFP64`, `IFP128` or `IFP256` types, import them into your Sway project like so: + +```sway +use sway_libs::fixed_point::{ + ifp64::IFP64, + ifp128::IFP128, + ifp256::IFP256, +}; +``` + +### Unsigned Fixed Point Numbers + +We currently support the following unsigned Fixed Point numbers: + +- `UFP32` +- `UFP64` +- `UFP128` + +In order to use the `UFP32`, `UFP64` or `UFP128` types, import them into your Sway project like so: + +```sway +use sway_libs::fixed_point::{ + ufp32::UFP32, + ufp64::UFP64, + ufp128::UFP128, +}; +``` + +## Basic Functionality + +### Instantiating a New Fixed Point Number + +Once imported, any signed or unsigned Fixed Point number type can be instantiated by defining a new variable and calling the `from` function. + +```sway +let mut ufp32_value = UFP32::from(0); +let mut ufp64_value = UFP64::from(0); +let mut ufp128_value = UFP128::from(0); +``` + +### Basic Mathematical Functions + +Basic arithmetic operations are working as usual. + +```sway +fn add_ufp(val1: UFP64, val2: UFP64) { + let result: UFP64 = val1 + val2; +} + +fn subtract_ufp(val1: UFP64, val2: UFP64) { + let result: UFP64 = val1 - val2; +} + +fn multiply_ufp(val1: UFP64, val2: UFP64) { + let result: UFP64 = val1 * val2; +} + +fn divide_ufp(val1: UFP64, val2: UFP64) { + let result: UFP64 = val1 / val2; +} +``` + +### Advanced Mathematical Functions Supported + +We currently support the following advanced mathematical functions: + +#### Exponential + +```sway +let ten = UFP64::from_uint(10); +let res = UFP64::exp(ten); +``` + +#### Square Root + +```sway +let ufp64_169 = UFP64::from_uint(169); +let res = UFP64::sqrt(ufp64_169); +``` + +#### Power + +```sway +let three = UFP64::from_uint(3); +let five = UFP64::from_uint(5); +let res = five.pow(three); +``` \ No newline at end of file diff --git a/.docs/book/src/documentation/libraries/math/index.md b/.docs/book/src/documentation/libraries/math/index.md new file mode 100644 index 00000000..a60f5f96 --- /dev/null +++ b/.docs/book/src/documentation/libraries/math/index.md @@ -0,0 +1,11 @@ +# Math Libraries + +Math Libraries are libraries which provide mathematic functions or number types that are outside of the std-lib's scope. + +## Fixed Point Number Library + +The [Fixed Point Number](./math/fixed_point/index.md) Library is an interface to implement fixed-point numbers. + +## Signed Integers + +The [Signed Integers](./math/signed_integers/index.md) Library is an interface to implement signed integers. diff --git a/.docs/book/src/documentation/libraries/math/signed_integers/index.md b/.docs/book/src/documentation/libraries/math/signed_integers/index.md new file mode 100644 index 00000000..a6434728 --- /dev/null +++ b/.docs/book/src/documentation/libraries/math/signed_integers/index.md @@ -0,0 +1,60 @@ +# Overview + +The Signed Integers library provides a library to use signed numbers in Sway. It has 6 distinct types: `I8`, `I16`, `I32`, `I64`, `I128`, `I256`. These types are stack allocated. + +These types are stored as unsigned integers, therefore either `u64` or a number of them. Therefore the size can be known at compile time and the length is static. + +For more information please see the [specification](./SPECIFICATION.md). + +# Using the Library + +## Importing the Signed Integer Library + +In order to use the Signed Integer Number Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). + +To import the Signed Integer Number Library to your Sway Smart Contract, add the following to your Sway file: + +```sway +use sway_libs::signed_integer::*; +``` + +In order to use the any of the Signed Integer types, import them into your Sway project like so: + +```sway +use sway_libs::signed_integers::i8::I8; +``` + +## Basic Functionality + +### Instantiating a New Fixed Point Number + +Once imported, a `Signed Integer` type can be instantiated defining a new variable and calling the `new` function. + +```rust +let mut i8_value = I8::new(); +``` + +### Basic Mathematical Functions + +Basic arithmetic operations are working as usual. + +```sway +fn add_signed_int(val1: i8, val2: i8) { + let result: i8 = val1 + val2; +} + +fn subtract_signed_int(val1: i8, val2: i8) { + let result: i8 = val1 - val2; +} + +fn multiply_signed_int(val1: i8, val2: i8) { + let result: i8 = val1 * val2; +} + +fn divide_signed_int(val1: i8, val2: i8) { + let result: i8 = val1 / val2; +} +``` + +## Known Issues +The current implementation of `U128` will compile large bytecode sizes when performing mathematical computations. As a result, `I128` and `I256` inherit the same issue and could cause high transaction costs. This should be resolved with future optimizations of the Sway compiler. diff --git a/.docs/book/src/documentation/welcome.md b/.docs/book/src/documentation/welcome.md new file mode 100644 index 00000000..d7ce205e --- /dev/null +++ b/.docs/book/src/documentation/welcome.md @@ -0,0 +1,3 @@ +# Welcome + + diff --git a/.docs/book/theme/highlight.js b/.docs/book/theme/highlight.js new file mode 100644 index 00000000..453f50c3 --- /dev/null +++ b/.docs/book/theme/highlight.js @@ -0,0 +1,392 @@ +/*! + Highlight.js v11.3.1 (git: 2a972d8658) + (c) 2006-2022 Ivan Sagalaev and other contributors + License: BSD-3-Clause + */ +var hljs=function(){"use strict";var e={exports:{}};function t(e){ +return e instanceof Map?e.clear=e.delete=e.set=()=>{ +throw Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach((n=>{var s=e[n] +;"object"!=typeof s||Object.isFrozen(s)||t(s)})),e} +e.exports=t,e.exports.default=t;var n=e.exports;class s{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function i(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function a(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] +;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const r=e=>!!e.kind +;class o{constructor(e,t){ +this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ +this.buffer+=i(e)}openNode(e){if(!r(e))return;let t=e.kind +;t=e.sublanguage?"language-"+t:((e,{prefix:t})=>{if(e.includes(".")){ +const n=e.split(".") +;return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${"_".repeat(t+1)}`))].join(" ") +}return`${t}${e}`})(t,{prefix:this.classPrefix}),this.span(t)}closeNode(e){ +r(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}class l{constructor(){this.rootNode={ +children:[]},this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const t={kind:e,children:[]} +;this.add(t),this.stack.push(t)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ +return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), +t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +l._collapse(e)})))}}class c extends l{constructor(e){super(),this.options=e} +addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} +addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root +;n.kind=t,n.sublanguage=!0,this.add(n)}toHTML(){ +return new o(this,this.options).value()}finalize(){return!0}}function d(e){ +return e?"string"==typeof e?e:e.source:null}function u(e){return b("(?=",e,")")} +function g(e){return b("(?:",e,")*")}function h(e){return b("(?:",e,")?")} +function b(...e){return e.map((e=>d(e))).join("")}function p(...e){const t=(e=>{ +const t=e[e.length-1] +;return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{} +})(e);return"("+(t.capture?"":"?:")+e.map((e=>d(e))).join("|")+")"} +function f(e){return RegExp(e.toString()+"|").exec("").length-1} +const m=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ +;function E(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n +;let s=d(e),i="";for(;s.length>0;){const e=m.exec(s);if(!e){i+=s;break} +i+=s.substring(0,e.index), +s=s.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?i+="\\"+(Number(e[1])+t):(i+=e[0], +"("===e[0]&&n++)}return i})).map((e=>`(${e})`)).join(t)} +const _="[a-zA-Z]\\w*",w="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",N="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",x="\\b(0b[01]+)",k={ +begin:"\\\\[\\s\\S]",relevance:0},v={scope:"string",begin:"'",end:"'", +illegal:"\\n",contains:[k]},O={scope:"string",begin:'"',end:'"',illegal:"\\n", +contains:[k]},S=(e,t,n={})=>{const s=a({scope:"comment",begin:e,end:t, +contains:[]},n);s.contains.push({scope:"doctag", +begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", +end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) +;const i=p("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) +;return s.contains.push({begin:b(/[ ]+/,"(",i,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),s +},R=S("//","$"),M=S("/\\*","\\*/"),I=S("#","$");var A=Object.freeze({ +__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:_,UNDERSCORE_IDENT_RE:w, +NUMBER_RE:y,C_NUMBER_RE:N,BINARY_NUMBER_RE:x, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const t=/^#![ ]*\// +;return e.binary&&(e.begin=b(t,/.*\b/,e.binary,/\b.*/)),a({scope:"meta",begin:t, +end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)}, +BACKSLASH_ESCAPE:k,APOS_STRING_MODE:v,QUOTE_STRING_MODE:O,PHRASAL_WORDS_MODE:{ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},COMMENT:S,C_LINE_COMMENT_MODE:R,C_BLOCK_COMMENT_MODE:M,HASH_COMMENT_MODE:I, +NUMBER_MODE:{scope:"number",begin:y,relevance:0},C_NUMBER_MODE:{scope:"number", +begin:N,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:x,relevance:0}, +REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//, +end:/\/[gimuy]*/,illegal:/\n/,contains:[k,{begin:/\[/,end:/\]/,relevance:0, +contains:[k]}]}]},TITLE_MODE:{scope:"title",begin:_,relevance:0}, +UNDERSCORE_TITLE_MODE:{scope:"title",begin:w,relevance:0},METHOD_GUARD:{ +begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ +t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function T(e,t){ +"."===e.input[e.index-1]&&t.ignoreMatch()}function D(e,t){ +void 0!==e.className&&(e.scope=e.className,delete e.className)}function j(e,t){ +t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=T,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function C(e,t){ +Array.isArray(e.illegal)&&(e.illegal=p(...e.illegal))}function B(e,t){ +if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function L(e,t){ +void 0===e.relevance&&(e.relevance=1)}const z=(e,t)=>{if(!e.beforeMatch)return +;if(e.starts)throw Error("beforeMatch cannot be used with starts") +;const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t] +})),e.keywords=n.keywords,e.begin=b(n.beforeMatch,u(n.begin)),e.starts={ +relevance:0,contains:[Object.assign(n,{endsParent:!0})] +},e.relevance=0,delete n.beforeMatch +},$=["of","and","for","in","not","or","if","then","parent","list","value"] +;function U(e,t,n="keyword"){const s=Object.create(null) +;return"string"==typeof e?i(n,e.split(" ")):Array.isArray(e)?i(n,e):Object.keys(e).forEach((n=>{ +Object.assign(s,U(e[n],t,n))})),s;function i(e,n){ +t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") +;s[n[0]]=[e,H(n[0],n[1])]}))}}function H(e,t){ +return t?Number(t):(e=>$.includes(e.toLowerCase()))(e)?0:1}const P={},K=e=>{ +console.error(e)},G=(e,...t)=>{console.log("WARN: "+e,...t)},F=(e,t)=>{ +P[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),P[`${e}/${t}`]=!0) +},Z=Error();function W(e,t,{key:n}){let s=0;const i=e[n],a={},r={} +;for(let e=1;e<=t.length;e++)r[e+s]=i[e],a[e+s]=!0,s+=f(t[e-1]) +;e[n]=r,e[n]._emit=a,e[n]._multi=!0}function X(e){(e=>{ +e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, +delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ +_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope +}),(e=>{if(Array.isArray(e.begin)){ +if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), +Z +;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), +Z;W(e,e.begin,{key:"beginScope"}),e.begin=E(e.begin,{joinWith:""})}})(e),(e=>{ +if(Array.isArray(e.end)){ +if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), +Z +;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), +Z;W(e,e.end,{key:"endScope"}),e.end=E(e.end,{joinWith:""})}})(e)}function q(e){ +function t(t,n){ +return RegExp(d(t),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(n?"g":"")) +}class n{constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,t){ +t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), +this.matchAt+=f(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=t(E(e,{joinWith:"|" +}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex +;const t=this.matcherRe.exec(e);if(!t)return null +;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),s=this.matchIndexes[n] +;return t.splice(0,n),Object.assign(t,s)}}class s{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n +;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), +t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ +this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ +const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex +;let n=t.exec(e) +;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ +const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} +return n&&(this.regexIndex+=n.position+1, +this.regexIndex===this.count&&this.considerAll()),n}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=a(e.classNameAliases||{}),function n(i,r){const o=i +;if(i.isCompiled)return o +;[D,B,X,z].forEach((e=>e(i,r))),e.compilerExtensions.forEach((e=>e(i,r))), +i.__beforeBegin=null,[j,C,L].forEach((e=>e(i,r))),i.isCompiled=!0;let l=null +;return"object"==typeof i.keywords&&i.keywords.$pattern&&(i.keywords=Object.assign({},i.keywords), +l=i.keywords.$pattern, +delete i.keywords.$pattern),l=l||/\w+/,i.keywords&&(i.keywords=U(i.keywords,e.case_insensitive)), +o.keywordPatternRe=t(l,!0), +r&&(i.begin||(i.begin=/\B|\b/),o.beginRe=t(o.begin),i.end||i.endsWithParent||(i.end=/\B|\b/), +i.end&&(o.endRe=t(o.end)), +o.terminatorEnd=d(o.end)||"",i.endsWithParent&&r.terminatorEnd&&(o.terminatorEnd+=(i.end?"|":"")+r.terminatorEnd)), +i.illegal&&(o.illegalRe=t(i.illegal)), +i.contains||(i.contains=[]),i.contains=[].concat(...i.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>a(e,{ +variants:null},t)))),e.cachedVariants?e.cachedVariants:V(e)?a(e,{ +starts:e.starts?a(e.starts):null +}):Object.isFrozen(e)?a(e):e))("self"===e?i:e)))),i.contains.forEach((e=>{n(e,o) +})),i.starts&&n(i.starts,r),o.matcher=(e=>{const t=new s +;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(o),o}(e)}function V(e){ +return!!e&&(e.endsWithParent||V(e.starts))}class Q extends Error{ +constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}} +const J=i,Y=a,ee=Symbol("nomatch");var te=(e=>{ +const t=Object.create(null),i=Object.create(null),a=[];let r=!0 +;const o="Could not find the language '{}', did you forget to load/include a language module?",l={ +disableAutodetect:!0,name:"Plain text",contains:[]};let d={ +ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +cssSelector:"pre code",languages:null,__emitter:c};function f(e){ +return d.noHighlightRe.test(e)}function m(e,t,n){let s="",i="" +;"object"==typeof t?(s=e, +n=t.ignoreIllegals,i=t.language):(F("10.7.0","highlight(lang, code, ...args) has been deprecated."), +F("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +i=e,s=t),void 0===n&&(n=!0);const a={code:s,language:i};O("before:highlight",a) +;const r=a.result?a.result:E(a.language,a.code,n) +;return r.code=a.code,O("after:highlight",r),r}function E(e,n,i,a){ +const l=Object.create(null);function c(){if(!v.keywords)return void S.addText(R) +;let e=0;v.keywordPatternRe.lastIndex=0;let t=v.keywordPatternRe.exec(R),n="" +;for(;t;){n+=R.substring(e,t.index) +;const i=y.case_insensitive?t[0].toLowerCase():t[0],a=(s=i,v.keywords[s]);if(a){ +const[e,s]=a +;if(S.addText(n),n="",l[i]=(l[i]||0)+1,l[i]<=7&&(M+=s),e.startsWith("_"))n+=t[0];else{ +const n=y.classNameAliases[e]||e;S.addKeyword(t[0],n)}}else n+=t[0] +;e=v.keywordPatternRe.lastIndex,t=v.keywordPatternRe.exec(R)}var s +;n+=R.substr(e),S.addText(n)}function u(){null!=v.subLanguage?(()=>{ +if(""===R)return;let e=null;if("string"==typeof v.subLanguage){ +if(!t[v.subLanguage])return void S.addText(R) +;e=E(v.subLanguage,R,!0,O[v.subLanguage]),O[v.subLanguage]=e._top +}else e=_(R,v.subLanguage.length?v.subLanguage:null) +;v.relevance>0&&(M+=e.relevance),S.addSublanguage(e._emitter,e.language) +})():c(),R=""}function g(e,t){let n=1;for(;void 0!==t[n];){if(!e._emit[n]){n++ +;continue}const s=y.classNameAliases[e[n]]||e[n],i=t[n] +;s?S.addKeyword(i,s):(R=i,c(),R=""),n++}}function h(e,t){ +return e.scope&&"string"==typeof e.scope&&S.openNode(y.classNameAliases[e.scope]||e.scope), +e.beginScope&&(e.beginScope._wrap?(S.addKeyword(R,y.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), +R=""):e.beginScope._multi&&(g(e.beginScope,t),R="")),v=Object.create(e,{parent:{ +value:v}}),v}function b(e,t,n){let i=((e,t)=>{const n=e&&e.exec(t) +;return n&&0===n.index})(e.endRe,n);if(i){if(e["on:end"]){const n=new s(e) +;e["on:end"](t,n),n.isMatchIgnored&&(i=!1)}if(i){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return b(e.parent,t,n)}function p(e){ +return 0===v.matcher.regexIndex?(R+=e[0],1):(T=!0,0)}function f(e){ +const t=e[0],s=n.substr(e.index),i=b(v,e,s);if(!i)return ee;const a=v +;v.endScope&&v.endScope._wrap?(u(), +S.addKeyword(t,v.endScope._wrap)):v.endScope&&v.endScope._multi?(u(), +g(v.endScope,e)):a.skip?R+=t:(a.returnEnd||a.excludeEnd||(R+=t), +u(),a.excludeEnd&&(R=t));do{ +v.scope&&S.closeNode(),v.skip||v.subLanguage||(M+=v.relevance),v=v.parent +}while(v!==i.parent);return i.starts&&h(i.starts,e),a.returnEnd?0:t.length} +let m={};function w(t,a){const o=a&&a[0];if(R+=t,null==o)return u(),0 +;if("begin"===m.type&&"end"===a.type&&m.index===a.index&&""===o){ +if(R+=n.slice(a.index,a.index+1),!r){const t=Error(`0 width match regex (${e})`) +;throw t.languageName=e,t.badRule=m.rule,t}return 1} +if(m=a,"begin"===a.type)return(e=>{ +const t=e[0],n=e.rule,i=new s(n),a=[n.__beforeBegin,n["on:begin"]] +;for(const n of a)if(n&&(n(e,i),i.isMatchIgnored))return p(t) +;return n.skip?R+=t:(n.excludeBegin&&(R+=t), +u(),n.returnBegin||n.excludeBegin||(R=t)),h(n,e),n.returnBegin?0:t.length})(a) +;if("illegal"===a.type&&!i){ +const e=Error('Illegal lexeme "'+o+'" for mode "'+(v.scope||"")+'"') +;throw e.mode=v,e}if("end"===a.type){const e=f(a);if(e!==ee)return e} +if("illegal"===a.type&&""===o)return 1 +;if(A>1e5&&A>3*a.index)throw Error("potential infinite loop, way more iterations than matches") +;return R+=o,o.length}const y=x(e) +;if(!y)throw K(o.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const N=q(y);let k="",v=a||N;const O={},S=new d.__emitter(d);(()=>{const e=[] +;for(let t=v;t!==y;t=t.parent)t.scope&&e.unshift(t.scope) +;e.forEach((e=>S.openNode(e)))})();let R="",M=0,I=0,A=0,T=!1;try{ +for(v.matcher.considerAll();;){ +A++,T?T=!1:v.matcher.considerAll(),v.matcher.lastIndex=I +;const e=v.matcher.exec(n);if(!e)break;const t=w(n.substring(I,e.index),e) +;I=e.index+t}return w(n.substr(I)),S.closeAllNodes(),S.finalize(),k=S.toHTML(),{ +language:e,value:k,relevance:M,illegal:!1,_emitter:S,_top:v}}catch(t){ +if(t.message&&t.message.includes("Illegal"))return{language:e,value:J(n), +illegal:!0,relevance:0,_illegalBy:{message:t.message,index:I, +context:n.slice(I-100,I+100),mode:t.mode,resultSoFar:k},_emitter:S};if(r)return{ +language:e,value:J(n),illegal:!1,relevance:0,errorRaised:t,_emitter:S,_top:v} +;throw t}}function _(e,n){n=n||d.languages||Object.keys(t);const s=(e=>{ +const t={value:J(e),illegal:!1,relevance:0,_top:l,_emitter:new d.__emitter(d)} +;return t._emitter.addText(e),t})(e),i=n.filter(x).filter(v).map((t=>E(t,e,!1))) +;i.unshift(s);const a=i.sort(((e,t)=>{ +if(e.relevance!==t.relevance)return t.relevance-e.relevance +;if(e.language&&t.language){if(x(e.language).supersetOf===t.language)return 1 +;if(x(t.language).supersetOf===e.language)return-1}return 0})),[r,o]=a,c=r +;return c.secondBest=o,c}function w(e){let t=null;const n=(e=>{ +let t=e.className+" ";t+=e.parentNode?e.parentNode.className:"" +;const n=d.languageDetectRe.exec(t);if(n){const t=x(n[1]) +;return t||(G(o.replace("{}",n[1])), +G("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"} +return t.split(/\s+/).find((e=>f(e)||x(e)))})(e);if(f(n))return +;if(O("before:highlightElement",{el:e,language:n +}),e.children.length>0&&(d.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), +console.warn("https://github.com/highlightjs/highlight.js/issues/2886"), +console.warn(e)), +d.throwUnescapedHTML))throw new Q("One of your code blocks includes unescaped HTML.",e.innerHTML) +;t=e;const s=t.textContent,a=n?m(s,{language:n,ignoreIllegals:!0}):_(s) +;e.innerHTML=a.value,((e,t,n)=>{const s=t&&i[t]||n +;e.classList.add("hljs"),e.classList.add("language-"+s) +})(e,n,a.language),e.result={language:a.language,re:a.relevance, +relevance:a.relevance},a.secondBest&&(e.secondBest={ +language:a.secondBest.language,relevance:a.secondBest.relevance +}),O("after:highlightElement",{el:e,result:a,text:s})}let y=!1;function N(){ +"loading"!==document.readyState?document.querySelectorAll(d.cssSelector).forEach(w):y=!0 +}function x(e){return e=(e||"").toLowerCase(),t[e]||t[i[e]]} +function k(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +i[e.toLowerCase()]=t}))}function v(e){const t=x(e) +;return t&&!t.disableAutodetect}function O(e,t){const n=e;a.forEach((e=>{ +e[n]&&e[n](t)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +y&&N()}),!1),Object.assign(e,{highlight:m,highlightAuto:_,highlightAll:N, +highlightElement:w, +highlightBlock:e=>(F("10.7.0","highlightBlock will be removed entirely in v12.0"), +F("10.7.0","Please use highlightElement now."),w(e)),configure:e=>{d=Y(d,e)}, +initHighlighting:()=>{ +N(),F("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, +initHighlightingOnLoad:()=>{ +N(),F("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") +},registerLanguage:(n,s)=>{let i=null;try{i=s(e)}catch(e){ +if(K("Language definition for '{}' could not be registered.".replace("{}",n)), +!r)throw e;K(e),i=l} +i.name||(i.name=n),t[n]=i,i.rawDefinition=s.bind(null,e),i.aliases&&k(i.aliases,{ +languageName:n})},unregisterLanguage:e=>{delete t[e] +;for(const t of Object.keys(i))i[t]===e&&delete i[t]}, +listLanguages:()=>Object.keys(t),getLanguage:x,registerAliases:k, +autoDetection:v,inherit:Y,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ +e["before:highlightBlock"](Object.assign({block:t.el},t)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ +e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),a.push(e)} +}),e.debugMode=()=>{r=!1},e.safeMode=()=>{r=!0 +},e.versionString="11.3.1",e.regex={concat:b,lookahead:u,either:p,optional:h, +anyNumberOfTimes:g};for(const e in A)"object"==typeof A[e]&&n(A[e]) +;return Object.assign(e,A),e})({}),ne=Object.freeze({__proto__:null, +grmr_sway:e=>{const t={className:"title.function.invoke",relevance:0, +begin:b(/\b/,/(?!let\b)/,e.IDENT_RE,u(/\s*\(/))},n="([u](8|16|32|64))?";return{ +name:"Sway",aliases:["sw"],keywords:{$pattern:e.IDENT_RE+"!?", +keyword:["abi","as","asm","break","const","continue","contract","dep","deref","else","enum","fn","for","if","impl","let","library","match","mut","predicate","pub","ref","return","script","Self","self","storage","str","struct","trait","use","where","while"], +literal:["true","false","Some","None","Ok","Err"], +built_in:["bool","char","u8","u16","u32","u64","b256","str","Self"]}, +illegal:""},t]}}, +grmr_rust:e=>{const t=e.regex,n={className:"title.function.invoke",relevance:0, +begin:t.concat(/\b/,/(?!let\b)/,e.IDENT_RE,t.lookahead(/\s*\(/)) +},s="([ui](8|16|32|64|128|size)|f(32|64))?",i=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","panic!","file!","format!","format_args!","include_bin!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"] +;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?", +type:["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"], +keyword:["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","unsafe","unsized","use","virtual","where","while","yield"], +literal:["true","false","Some","None","Ok","Err"],built_in:i},illegal:""},n]}}, +grmr_ini:e=>{const t=e.regex,n={className:"number",relevance:0,variants:[{ +begin:/([+-]+)?[\d]+_[\d_]+/},{begin:e.NUMBER_RE}]},s=e.COMMENT();s.variants=[{ +begin:/;/,end:/$/},{begin:/#/,end:/$/}];const i={className:"variable", +variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)\}/}]},a={ +className:"literal",begin:/\bon|off|true|false|yes|no\b/},r={className:"string", +contains:[e.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{ +begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}] +},o={begin:/\[/,end:/\]/,contains:[s,a,i,r,n,"self"],relevance:0 +},l=t.either(/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/);return{ +name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/, +contains:[s,{className:"section",begin:/\[+/,end:/\]+/},{ +begin:t.concat(l,"(\\s*\\.\\s*",l,")*",t.lookahead(/\s*=\s*[^#\s]/)), +className:"attr",starts:{end:/$/,contains:[s,o,a,i,r,n]}}]}},grmr_bash:e=>{ +const t=e.regex,n={},s={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/, +contains:[n]}]};Object.assign(n,{className:"variable",variants:[{ +begin:t.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},s]});const i={ +className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},a={ +begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/, +end:/(\w+)/,className:"string"})]}},r={className:"string",begin:/"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,n,i]};i.contains.push(r);const o={begin:/\$\(\(/, +end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,n] +},l=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 +}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, +contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ +name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z._-]+\b/, +keyword:["if","then","else","elif","fi","for","while","in","do","done","case","esac","function"], +literal:["true","false"], +built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"] +},contains:[l,e.SHEBANG(),c,o,e.HASH_COMMENT_MODE,a,{match:/(\/[a-z._-]+)+/},r,{ +className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},n]}}, +grmr_shell:e=>({name:"Shell Session",aliases:["console","shellsession"], +contains:[{className:"meta",begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{ +end:/[^\\](?=\s*$)/,subLanguage:"bash"}}]}),grmr_json:e=>({name:"JSON", +contains:[{className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01 +},{match:/[{}[\],:]/,className:"punctuation",relevance:0},e.QUOTE_STRING_MODE,{ +beginKeywords:"true false null" +},e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],illegal:"\\S"}) +});const se=te;for(const e of Object.keys(ne)){ +const t=e.replace("grmr_","").replace("_","-");se.registerLanguage(t,ne[e])} +return se}() +;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); \ No newline at end of file From 305f7ed5908e471ab8be2dbda5533460c7ec571d Mon Sep 17 00:00:00 2001 From: bitzoic Date: Fri, 29 Mar 2024 12:05:24 +0900 Subject: [PATCH 02/18] Update book links and structure --- .docs/book/src/SUMMARY.md | 1 - .../documentation/getting_started/index.md | 10 +++--- .../libraries/access_security/admin/index.md | 4 +-- .../libraries/access_security/index.md | 2 ++ .../access_security/ownership/index.md | 8 ++--- .../access_security/pausable/index.md | 4 +-- .../access_security/reentrancy/index.md | 11 ++++-- .../libraries/asset/asset/base.md | 12 ++++--- .../libraries/asset/asset/index.md | 10 +++--- .../libraries/asset/asset/metadata.md | 18 +++++----- .../libraries/asset/asset/supply.md | 10 +++--- .../documentation/libraries/asset/index.md | 4 ++- .../libraries/cryptography/bytecode/index.md | 2 +- .../libraries/cryptography/index.md | 2 ++ .../libraries/cryptography/merkle/index.md | 2 +- .../libraries/data_structures/index.md | 2 ++ .../libraries/data_structures/queue/index.md | 2 +- .../book/src/documentation/libraries/index.md | 34 ++++++++++--------- .../libraries/math/fixed_point/index.md | 2 +- .../src/documentation/libraries/math/index.md | 2 ++ .../libraries/math/signed_integers/index.md | 4 +-- .docs/book/src/documentation/welcome.md | 3 -- 22 files changed, 86 insertions(+), 63 deletions(-) delete mode 100644 .docs/book/src/documentation/welcome.md diff --git a/.docs/book/src/SUMMARY.md b/.docs/book/src/SUMMARY.md index 9b90be02..9b389281 100644 --- a/.docs/book/src/SUMMARY.md +++ b/.docs/book/src/SUMMARY.md @@ -1,6 +1,5 @@ # Summary -- [Welcome](./documentation/welcome.md) - [Getting Started](./documentation/getting_started/index.md) - [Running Tests](./documentation/getting_started/running_tests.md) - [Libraries](./documentation/libraries/index.md) diff --git a/.docs/book/src/documentation/getting_started/index.md b/.docs/book/src/documentation/getting_started/index.md index f047ab14..d9b4dbf6 100644 --- a/.docs/book/src/documentation/getting_started/index.md +++ b/.docs/book/src/documentation/getting_started/index.md @@ -4,13 +4,13 @@ To import any library, the following dependency should be added to the project's `Forc.toml` file under `[dependencies]`. -```rust +```sway sway_libs = { git = "https://github.com/FuelLabs/sway-libs", tag = "v0.1.0" } ``` For reference, here is a complete `Forc.toml` file: -```rust +```sway [project] authors = ["Fuel Labs "] entry = "main.sw" @@ -25,13 +25,13 @@ sway_libs = { git = "https://github.com/FuelLabs/sway-libs", tag = "v0.1.0" } ## Importing Sway Libs to Your Project -Once Sway Libs is a dependency to your project, you may then import your desired library in your Sway Smart Contract as so: +Once Sway Libs is a dependency to your project, you may then import a library in your Sway Smart Contract as so: ```sway use sway_libs::::; ``` -For example, to import the `only_owner()` from the Ownership Library function use the following statement at the top of your Sway file: +For example, to import the `only_owner()` from the Ownership Library, use the following statement at the top of your Sway file: ```sway use sway_libs::ownership::only_owner; @@ -69,3 +69,5 @@ impl Pausable for Contract { ``` Any instructions related to using a specific library should be found within the README.md of that library. + +For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). diff --git a/.docs/book/src/documentation/libraries/access_security/admin/index.md b/.docs/book/src/documentation/libraries/access_security/admin/index.md index b8b6ab3d..17a632ca 100644 --- a/.docs/book/src/documentation/libraries/access_security/admin/index.md +++ b/.docs/book/src/documentation/libraries/access_security/admin/index.md @@ -4,6 +4,8 @@ The Admin library provides a way to block users without an "adimistrative status This library extends the [Ownership Library](../ownership/index.md). The Ownership library must be imported and used to enable the Admin library. Only the contract's owner may add and remove administrative users. +For implementation details on the Admin Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/admin/index.html). + # Using the Library ## Importing the Admin Library @@ -99,5 +101,3 @@ fn check_if_admin(admin: Identity) { assert(status); } ``` - -For more information please see the [specification](../../../../../../../libs/admin/SPECIFICATION.md). diff --git a/.docs/book/src/documentation/libraries/access_security/index.md b/.docs/book/src/documentation/libraries/access_security/index.md index 43e9d86c..d17b94df 100644 --- a/.docs/book/src/documentation/libraries/access_security/index.md +++ b/.docs/book/src/documentation/libraries/access_security/index.md @@ -2,6 +2,8 @@ Access Control and Security Libraries are any libraries that are built and intended to provide additional saftey when developing smart contracts. +For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). + ## Ownership Library The [Ownership](./ownership/index.md) Library is used to apply restrictions on functions such that only a **single** user may call them. diff --git a/.docs/book/src/documentation/libraries/access_security/ownership/index.md b/.docs/book/src/documentation/libraries/access_security/ownership/index.md index 0e7f2ff7..75730d9c 100644 --- a/.docs/book/src/documentation/libraries/access_security/ownership/index.md +++ b/.docs/book/src/documentation/libraries/access_security/ownership/index.md @@ -2,13 +2,15 @@ The Ownership Library provides a way to block anyone other than a **single** "owner" from calling functions. The Ownership Library is often used when needing administrative calls on a contract by a single user. +For implementation details on the Ownership Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/ownership/index.html). + # Using the Library ## Importing the Ownership Library In order to use the Ownership library, Sway Libs and [Sway Standards]() must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). To add Sway Standards as a dependency please see the [Sway Standards Book](). -To import the Ownership Library and [SRC-5](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_5) Standard to your Sway Smart Contract, add the following to your Sway file: +To import the Ownership Library and [SRC-5](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-5.md) Standard to your Sway Smart Contract, add the following to your Sway file: ```sway use sway_libs::ownership::*; @@ -17,7 +19,7 @@ use standards::src5::*; ## Integrating the Ownership Library into the SRC-5 Standard -To implement the [SRC-5](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_5) standard with the Ownership library, be sure to add the Sway Standards dependency to your contract. The following demonstrates the integration of the Ownership library with the SRC-5 standard. +To implement the [SRC-5](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-5.md) standard with the Ownership library, be sure to add the Sway Standards dependency to your contract. The following demonstrates the integration of the Ownership library with the SRC-5 standard. ```sway use sway_libs::ownership::_owner; @@ -68,5 +70,3 @@ fn get_owner_state() { let owner: State = _owner(); } ``` - -For more information please see the [specification](../../../../../../../libs/ownership/SPECIFICATION.md). diff --git a/.docs/book/src/documentation/libraries/access_security/pausable/index.md b/.docs/book/src/documentation/libraries/access_security/pausable/index.md index 0e6a1b58..8a730be2 100644 --- a/.docs/book/src/documentation/libraries/access_security/pausable/index.md +++ b/.docs/book/src/documentation/libraries/access_security/pausable/index.md @@ -4,6 +4,8 @@ The Pausable library allows contracts to implement an emergency stop mechanism. It is highly encouraged to use the [Ownership Library](../ownership/index.md) in combination with the Pausable Library to ensure that only a single administrative user has the ability to pause your contract. +For implementation details on the Pausable Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/pausable/index.html). + # Using the Library ## Importing the Pausable Library @@ -117,5 +119,3 @@ impl Pausable for Contract { } } ``` - -More information can be found in the [specification](../../../../../../../libs/pausable/SPECIFICATION.md). diff --git a/.docs/book/src/documentation/libraries/access_security/reentrancy/index.md b/.docs/book/src/documentation/libraries/access_security/reentrancy/index.md index fb6a9bf0..9a987ab9 100644 --- a/.docs/book/src/documentation/libraries/access_security/reentrancy/index.md +++ b/.docs/book/src/documentation/libraries/access_security/reentrancy/index.md @@ -1,6 +1,13 @@ # Reentrancy Guard Library -The Reentrancy Guard Library provides an API to check for and disallow reentrancy on a contract. A reentrancy attack happens when a function is externally invoked during its execution, allowing it to be run multiple times in a single transaction +The Reentrancy Guard Library provides an API to check for and disallow reentrancy on a contract. A reentrancy attack happens when a function is externally invoked during its execution, allowing it to be run multiple times in a single transaction. + +The reentrancy check is used to check if a contract ID has been called more than +once in the current call stack. + +A reentrancy, or "recursive call" attack can cause some functions to behave in unexpected ways. This can be prevented by asserting a contract has not yet been called in the current transaction. An example can be found [here](https://swcregistry.io/docs/SWC-107). + +For implementation details on the Reentrancy Guard Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/reentrancy/index.html). # Known Issues @@ -56,5 +63,3 @@ fn check_if_reentrant() { assert(!is_reentrant()); } ``` - -More information can be found in the [specification](../../../../../../../libs/reentrancy/SPECIFICATION.md). diff --git a/.docs/book/src/documentation/libraries/asset/asset/base.md b/.docs/book/src/documentation/libraries/asset/asset/base.md index 14852408..8e1f7abf 100644 --- a/.docs/book/src/documentation/libraries/asset/asset/base.md +++ b/.docs/book/src/documentation/libraries/asset/asset/base.md @@ -1,8 +1,10 @@ # Base Functionality +For implementation details on the Asset Library base functionality please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/asset/base/index.html). + ## Importing the Asset Library Base Functionality -To import the Asset Library Base Functionality and [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset) Standard to your Sway Smart Contract, add the following to your Sway file: +To import the Asset Library Base Functionality and [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md) Standard to your Sway Smart Contract, add the following to your Sway file: ```sway use sway_libs::asset::base::*; @@ -11,7 +13,7 @@ use standards::src20::*; ## Integration with the SRC-20 Standard -The [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset) definition states that the following abi implementation is required for any Native Asset on Fuel: +The [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md) definition states that the following abi implementation is required for any Native Asset on Fuel: ```sway abi SRC20 { @@ -36,7 +38,7 @@ The Asset Library has the following complimentary functions for each function in - `_symbol()` - `_decimals()` -The following ABI and functions are also provided to set your [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset) standard storage values: +The following ABI and functions are also provided to set your [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md) standard storage values: ```sway abi SetAssetAttributes { @@ -57,7 +59,7 @@ abi SetAssetAttributes { ## Setting Up Storage -Once imported, the Asset Library's base functionality should be available. To use them, be sure to add the storage block bellow to your contract which enables the [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset) standard. +Once imported, the Asset Library's base functionality should be available. To use them, be sure to add the storage block bellow to your contract which enables the [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md) standard. ```sway storage { @@ -71,7 +73,7 @@ storage { ## Implementing the SRC-20 Standard with the Asset Library -To use the Asset Library's base functionly, simply pass the `StorageKey` from the prescribed storage block. The example below shows the implementation of the [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset) standard in combination with the Asset Library with no user defined restrictions or custom functionality. +To use the Asset Library's base functionly, simply pass the `StorageKey` from the prescribed storage block. The example below shows the implementation of the [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md) standard in combination with the Asset Library with no user defined restrictions or custom functionality. ```sway use sway_libs::asset::base::{ diff --git a/.docs/book/src/documentation/libraries/asset/asset/index.md b/.docs/book/src/documentation/libraries/asset/asset/index.md index 2e1cd8a0..225d885d 100644 --- a/.docs/book/src/documentation/libraries/asset/asset/index.md +++ b/.docs/book/src/documentation/libraries/asset/asset/index.md @@ -1,20 +1,22 @@ # Asset Library -The Asset Library provides basic helper functions for the [SRC-20; Native Asset Standard](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset), [SRC-3; Mint and Burn Standard](https://github.com/FuelLabs/sway-standards/tree/master/standards/src3-mint-burn), and the [SRC-7; Arbitrary Asset Metadata Standard](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata). It is intended to make develpment of Native Assets using Sway quick and easy while following the standard's specifications. +The Asset Library provides basic helper functions for the [SRC-20; Native Asset Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md), [SRC-3; Mint and Burn Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md), and the [SRC-7; Arbitrary Asset Metadata Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md). It is intended to make develpment of Native Assets using Sway quick and easy while following the standard's specifications. + +For implementation details on the Asset Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/asset/index.html). # Using the Library ## [SRC-20 Functionality](./base.md) -The Base or core of any Asset on the Fuel Network must follow the [SRC-20; Native Asset Standard](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset). The Asset Library's [Base](./base.md) section supports the [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset)'s implementation. +The Base or core of any Asset on the Fuel Network must follow the [SRC-20; Native Asset Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md). The Asset Library's [Base](./base.md) section supports the [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md)'s implementation. ## [SRC-3 Functionaltity](supply.md) -The [SRC-3; Mint and Burn Standard](https://github.com/FuelLabs/sway-standards/tree/master/standards/src3-mint-burn) prescribes an ABI for how Native Assets on the Fuel Network are minted and burned. The Asset Library's [suppy](./supply.md) section supports the [SRC-3](https://github.com/FuelLabs/sway-standards/tree/master/standards/src3-mint-burn)'s implementation. +The [SRC-3; Mint and Burn Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md) prescribes an ABI for how Native Assets on the Fuel Network are minted and burned. The Asset Library's [suppy](./supply.md) section supports the [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md)'s implementation. ## [SRC-7 Functionaltity](./metadata.md) -The [SRC-7; Arbitrary Asset Metadata Standard](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata) prescribes an ABI for metadat associated with Native Assets on the Fuel Network. The Asset Library's [metadata](./metadata.md) section supports the [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata)'s implementation. +The [SRC-7; Arbitrary Asset Metadata Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) prescribes an ABI for metadat associated with Native Assets on the Fuel Network. The Asset Library's [metadata](./metadata.md) section supports the [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md)'s implementation. For more information please see the [specification](../../../../../../../libs/native_asset/2/SPECIFICATION.md). diff --git a/.docs/book/src/documentation/libraries/asset/asset/metadata.md b/.docs/book/src/documentation/libraries/asset/asset/metadata.md index 55aa2cd2..4e0a11df 100644 --- a/.docs/book/src/documentation/libraries/asset/asset/metadata.md +++ b/.docs/book/src/documentation/libraries/asset/asset/metadata.md @@ -1,8 +1,10 @@ # Metadata Functionality +For implementation details on the Asset Library metadata functionality please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/asset/metadata/index.html). + ## Importing the Asset Library Metadata Functionality -To import the Asset Library Base Functionality and [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata) Standard to your Sway Smart Contract, add the following to your Sway file: +To import the Asset Library Base Functionality and [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) Standard to your Sway Smart Contract, add the following to your Sway file: ```sway use sway_libs::asset::metadata::*; @@ -11,7 +13,7 @@ use standards::src7::*; ## Integration with the SRC-7 Standard -The [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata) definition states that the following abi implementation is required for any Native Asset on Fuel: +The [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) definition states that the following abi implementation is required for any Native Asset on Fuel: ```sway abi SRC7 { @@ -20,11 +22,11 @@ abi SRC7 { } ``` -The Asset Library has the following complimentary data type for the [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata) standard: +The Asset Library has the following complimentary data type for the [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) standard: - `StorageMetadata` -The following additional functionality for the [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata)'s `Metadata` type is provided: +The following additional functionality for the [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md)'s `Metadata` type is provided: - `as_string()` - `is_string()` @@ -37,7 +39,7 @@ The following additional functionality for the [SRC-7](https://github.com/FuelLa ## Setting Up Storage -Once imported, the Asset Library's metadata functionality should be available. To use them, be sure to add the storage block bellow to your contract which enables the [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata) standard. +Once imported, the Asset Library's metadata functionality should be available. To use them, be sure to add the storage block bellow to your contract which enables the [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) standard. ```sway storage { @@ -49,7 +51,7 @@ storage { ### Setting Metadata -To set some metadata for an Asset, use the `SetAssetMetadata` ABI provided by the Asset Library. Be sure to follow the [SRC-9](https://github.com/FuelLabs/sway-standards/tree/master/standards/src9-metadata-keys) standard for your `key`. It is recommended that the [Ownership Library](../../access_security/ownership/) is used in conjunction with the `SetAssetMetadata` ABI to ensure only a single user has permissions to set an Asset's metadata. +To set some metadata for an Asset, use the `SetAssetMetadata` ABI provided by the Asset Library. Be sure to follow the [SRC-9](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-9.md) standard for your `key`. It is recommended that the [Ownership Library](../../access_security/ownership/) is used in conjunction with the `SetAssetMetadata` ABI to ensure only a single user has permissions to set an Asset's metadata. ```sway use sway_libs::asset::metadata::*; @@ -70,7 +72,7 @@ impl SetAssetMetadata for Contract { ### Implementing the SRC-7 Standard with StorageMetadata -To use the `StorageMetadata` type, simply get the stored metadata with the associated `key` and `AssetId`. The example below shows the implementation of the [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata) standard in combination with the Asset Library's `StorageMetadata` type with no user defined restrictions or custom functionality. +To use the `StorageMetadata` type, simply get the stored metadata with the associated `key` and `AssetId`. The example below shows the implementation of the [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) standard in combination with the Asset Library's `StorageMetadata` type with no user defined restrictions or custom functionality. ```sway use sway_libs::asset::metadata::*; @@ -92,7 +94,7 @@ impl SRC7 for Contract { ## Using the `Metadata` Extensions -The `Metadata` type defined by the [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata) standard can be one of 4 states: +The `Metadata` type defined by the [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) standard can be one of 4 states: ```sway pub enum Metadata { diff --git a/.docs/book/src/documentation/libraries/asset/asset/supply.md b/.docs/book/src/documentation/libraries/asset/asset/supply.md index ef2e3536..0304ecd1 100644 --- a/.docs/book/src/documentation/libraries/asset/asset/supply.md +++ b/.docs/book/src/documentation/libraries/asset/asset/supply.md @@ -1,8 +1,10 @@ # Supply Functionality +Forimplementation details on the Asset Library supply functionality please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/asset/supply/index.html). + ## Importing the Asset Library Supply Functionality -To import the Asset Library Supply Functionality and [SRC-3](https://github.com/FuelLabs/sway-standards/tree/master/standards/src3-mint-burn) Standard to your Sway Smart Contract, add the following to your Sway file: +To import the Asset Library Supply Functionality and [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md) Standard to your Sway Smart Contract, add the following to your Sway file: ```sway use sway_libs::asset::supply::*; @@ -11,7 +13,7 @@ use standards::src3::*; ## Integration with the SRC-3 Standard -The [SRC-3](https://github.com/FuelLabs/sway-standards/tree/master/standards/src3-mint-burn) definition states that the following abi implementation is required for any Native Asset on Fuel which mints and burns tokens: +The [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md) definition states that the following abi implementation is required for any Native Asset on Fuel which mints and burns tokens: ```sway abi SRC3 { @@ -31,7 +33,7 @@ The Asset Library has the following complimentary functions for each function in ## Setting Up Storage -Once imported, the Asset Library's supply functionality should be available. To use them, be sure to add the storage block bellow to your contract which enables the [SRC-3](https://github.com/FuelLabs/sway-standards/tree/master/standards/src3-mint-burn) standard. +Once imported, the Asset Library's supply functionality should be available. To use them, be sure to add the storage block bellow to your contract which enables the [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md) standard. ```sway storage { @@ -42,7 +44,7 @@ storage { ## Implementing the SRC-3 Standard with the Asset Library -To use a base function, simply pass the `StorageKey` from the prescribed storage block. The example below shows the implementation of the [SRC-3](https://github.com/FuelLabs/sway-standards/tree/master/standards/src3-mint-burn) standard in combination with the Asset Library with no user defined restrictions or custom functionality. It is recommended that the [Ownership Library](../../access_security/ownership/) is used in conjunction with the Asset Library;s supply functionality to ensure only a single user has permissions to mint an Asset. +To use a base function, simply pass the `StorageKey` from the prescribed storage block. The example below shows the implementation of the [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md) standard in combination with the Asset Library with no user defined restrictions or custom functionality. It is recommended that the [Ownership Library](../../access_security/ownership/) is used in conjunction with the Asset Library;s supply functionality to ensure only a single user has permissions to mint an Asset. ```sway diff --git a/.docs/book/src/documentation/libraries/asset/index.md b/.docs/book/src/documentation/libraries/asset/index.md index 785a67b8..d58f5ab9 100644 --- a/.docs/book/src/documentation/libraries/asset/index.md +++ b/.docs/book/src/documentation/libraries/asset/index.md @@ -2,6 +2,8 @@ Asset Libraries are any libraries that use [Native Assets](https://docs.fuel.network/docs/sway/blockchain-development/native_assets) on the Fuel Network. +For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). + ## Asset Library -The [Asset](./asset/index.md) Library provides helper functions for the [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset), [SRC-3](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_3), and [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_7) standards. +The [Asset](./asset/index.md) Library provides helper functions for the [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md), [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md), and [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) standards. diff --git a/.docs/book/src/documentation/libraries/cryptography/bytecode/index.md b/.docs/book/src/documentation/libraries/cryptography/bytecode/index.md index e6c509d9..e1d3fb15 100644 --- a/.docs/book/src/documentation/libraries/cryptography/bytecode/index.md +++ b/.docs/book/src/documentation/libraries/cryptography/bytecode/index.md @@ -4,7 +4,7 @@ The Bytecode Library allows for on-chain verification and computation of bytecod A bytecode root for a contract and predicate is the Merkle root of the [binary Merkle tree](https://github.com/FuelLabs/fuel-specs/blob/master/src/protocol/cryptographic-primitives.md#binary-merkle-tree) with each leaf being 16KiB of instructions. This library will compute any contract's or predicate's bytecode root/address allowing for the verification of deployed contracts and generation of predicate addresses on-chain. -More information can be found in the [specification](../../../../../../../libs/bytecode/SPECIFICATION.md). +For implementation details on the Bytecode Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/bytecode/index.html). # Using the Library diff --git a/.docs/book/src/documentation/libraries/cryptography/index.md b/.docs/book/src/documentation/libraries/cryptography/index.md index 033d9ef5..b261fb28 100644 --- a/.docs/book/src/documentation/libraries/cryptography/index.md +++ b/.docs/book/src/documentation/libraries/cryptography/index.md @@ -2,6 +2,8 @@ Cryptography Libraries are any libraries that provided cryptographic functionality beyond what the std-lib provides. +For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). + ## Bytecode Library The [Bytecode](./bytecode/index.md) Library is used for on-chain verification and computation of bytecode roots for contracts and predicates. diff --git a/.docs/book/src/documentation/libraries/cryptography/merkle/index.md b/.docs/book/src/documentation/libraries/cryptography/merkle/index.md index 4e1d6a4b..42792e56 100644 --- a/.docs/book/src/documentation/libraries/cryptography/merkle/index.md +++ b/.docs/book/src/documentation/libraries/cryptography/merkle/index.md @@ -2,7 +2,7 @@ Merkle trees allow for on-chain verification of off-chain data. With the merkle root posted on-chain, the generation of proofs off-chain can provide verifibly true data. -More information can be found in the [specification](../../../../../../../libs/merkle_proof/SPECIFICATION.md). +For implementation details on the Merkle Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/merkle/index.html). # Using the Library diff --git a/.docs/book/src/documentation/libraries/data_structures/index.md b/.docs/book/src/documentation/libraries/data_structures/index.md index 9942c55b..2130a0a6 100644 --- a/.docs/book/src/documentation/libraries/data_structures/index.md +++ b/.docs/book/src/documentation/libraries/data_structures/index.md @@ -2,6 +2,8 @@ Data Structure Libraries are libraries which provide complex data structures which unlock additional functionality for Smart Contracts. +For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). + ### Queue The [Queue](./queue/index.md) Library is a linear data structure that provides First-In-First-Out (FIFO) operations. \ No newline at end of file diff --git a/.docs/book/src/documentation/libraries/data_structures/queue/index.md b/.docs/book/src/documentation/libraries/data_structures/queue/index.md index 439f9cd0..3802cb93 100644 --- a/.docs/book/src/documentation/libraries/data_structures/queue/index.md +++ b/.docs/book/src/documentation/libraries/data_structures/queue/index.md @@ -2,7 +2,7 @@ A Queue is a linear structure which follows the First-In-First-Out (FIFO) principle. This means that the elements added first are the ones that get removed first. -For more information about implementation and specifications, please see the [SPECIFICATION.md](../../../../../../../libs/queue/SPECIFICATION.md). +For implementation details on the Queue Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/queue/index.html). # Using the Library diff --git a/.docs/book/src/documentation/libraries/index.md b/.docs/book/src/documentation/libraries/index.md index 6686dda3..e6288f91 100644 --- a/.docs/book/src/documentation/libraries/index.md +++ b/.docs/book/src/documentation/libraries/index.md @@ -2,62 +2,64 @@ There are several types of libraries that Sway Libs encompases. These include libraries that provide convienence functions, standards supporting libraries, data type libraries, security functionality libraries. -## Assets Libraries +For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). + +## [Assets Libraries](./asset/index.md) Asset Libraries are any libraries that use [Native Assets](https://docs.fuel.network/docs/sway/blockchain-development/native_assets) on the Fuel Network. -### Asset Library +#### [Asset Library](./asset/asset/index.md) -The [Asset](./asset/asset/index.md) Library provides helper functions for the [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset), [SRC-3](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_3), and [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_7) standards. +The [Asset](./asset/asset/index.md) Library provides helper functions for the [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md), [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md), and [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) standards. -## Access Control and Security Libraries +## [Access Control and Security Libraries](./access_security/index.md) Access Control and Security Libraries are any libraries that are built and intended to provide additional saftey when developing smart contracts. -### Ownership Library +#### [Ownership Library](./access_security/ownership/index.md) The [Ownership](./access_security/ownership/index.md) Library is used to apply restrictions on functions such that only a **single** user may call them. -### Admin Library +#### [Admin Library](./access_security/admin/index.md) The [Admin](./access_security/admin/index.md) Library is used to apply restrictions on functions such that only a select few users may call them like a whitelist. -### Pausable Library +#### [Pausable Library](./access_security/pausable/index.md) The [Pausable](./access_security/pausable/index.md) Library allows contracts to implement an emergency stop mechanism. -### Reentrancy Guard Library +#### [Reentrancy Guard Library](./access_security/reentrancy/index.md) The [Reentrancy Guard](./access_security/reentrancy/index.md) Library is used to detect and prevent reentrancy attacks. -## Cryptography Libraries +## [Cryptography Libraries](./cryptography/index.md) Cryptography Libraries are any libraries that provided cryptographic functionality beyond what the std-lib provides. -### Bytecode Library +#### [Bytecode Library](./cryptography/bytecode/index.md) The [Bytecode](./cryptography/bytecode/index.md) Library is used for on-chain verification and computation of bytecode roots for contracts and predicates. -### Merkle Library +#### [Merkle Library](./cryptography/merkle/index.md) The [Merkle Proof](./cryptography/merkle/index.md) Library is used to verify Binary Merkle Trees computed off-chain. -## Math Libraries +## [Math Libraries](./math/index.md) Math Libraries are libraries which provide mathematic functions or number types that are outside of the std-lib's scope. -### Fixed Point Number Library +#### [Fixed Point Number Library](./math/fixed_point/index.md) The [Fixed Point Number](./math/fixed_point/index.md) Library is an interface to implement fixed-point numbers. -### Signed Integers +#### [Signed Integers](./math/signed_integers/index.md) The [Signed Integers](./math/signed_integers/index.md) Library is an interface to implement signed integers. -## Data Structures Libraries +## [Data Structures Libraries](./data_structures/index.md) Data Structure Libraries are libraries which provide complex data structures which unlock additional functionality for Smart Contracts. -### Queue +#### [Queue](./data_structures/queue/index.md) The [Queue](./data_structures/queue/index.md) Library is a linear data structure that provides First-In-First-Out (FIFO) operations. diff --git a/.docs/book/src/documentation/libraries/math/fixed_point/index.md b/.docs/book/src/documentation/libraries/math/fixed_point/index.md index af846e27..099d114c 100644 --- a/.docs/book/src/documentation/libraries/math/fixed_point/index.md +++ b/.docs/book/src/documentation/libraries/math/fixed_point/index.md @@ -4,7 +4,7 @@ The Fixed Point Number Library provides a library to use fixed-point numbers in This type is stored as a `u32`, `u64` or `U128` under the hood. Therefore the size can be known at compile time and the length is static. -For more information please see the [specification](../../../../../../../libs/fixed_point/SPECIFICATION.md). +For implementation details on the Fixed Point Number Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/fixed_point/index.html). # Using the Library diff --git a/.docs/book/src/documentation/libraries/math/index.md b/.docs/book/src/documentation/libraries/math/index.md index a60f5f96..2c80d496 100644 --- a/.docs/book/src/documentation/libraries/math/index.md +++ b/.docs/book/src/documentation/libraries/math/index.md @@ -2,6 +2,8 @@ Math Libraries are libraries which provide mathematic functions or number types that are outside of the std-lib's scope. +For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). + ## Fixed Point Number Library The [Fixed Point Number](./math/fixed_point/index.md) Library is an interface to implement fixed-point numbers. diff --git a/.docs/book/src/documentation/libraries/math/signed_integers/index.md b/.docs/book/src/documentation/libraries/math/signed_integers/index.md index a6434728..d28752c3 100644 --- a/.docs/book/src/documentation/libraries/math/signed_integers/index.md +++ b/.docs/book/src/documentation/libraries/math/signed_integers/index.md @@ -1,10 +1,10 @@ -# Overview +# Signed Integers Library The Signed Integers library provides a library to use signed numbers in Sway. It has 6 distinct types: `I8`, `I16`, `I32`, `I64`, `I128`, `I256`. These types are stack allocated. These types are stored as unsigned integers, therefore either `u64` or a number of them. Therefore the size can be known at compile time and the length is static. -For more information please see the [specification](./SPECIFICATION.md). +For implementation details on the Signed Integers Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/signed_integers/index.html). # Using the Library diff --git a/.docs/book/src/documentation/welcome.md b/.docs/book/src/documentation/welcome.md deleted file mode 100644 index d7ce205e..00000000 --- a/.docs/book/src/documentation/welcome.md +++ /dev/null @@ -1,3 +0,0 @@ -# Welcome - - From 8ff3d17a7d75b53fbd47da234bbed056cfca4f3f Mon Sep 17 00:00:00 2001 From: bitzoic Date: Fri, 29 Mar 2024 12:05:39 +0900 Subject: [PATCH 03/18] Remove README and SPECIFICATION --- .../src/admin/.docs/admin-logo-dark-theme.png | Bin 15838 -> 0 bytes .../admin/.docs/admin-logo-light-theme.png | Bin 17527 -> 0 bytes libs/src/admin/README.md | 85 --------------- libs/src/admin/SPECIFICATION.md | 31 ------ .../src/asset/.docs/asset-logo-dark-theme.png | Bin 19627 -> 0 bytes .../asset/.docs/asset-logo-light-theme.png | Bin 22279 -> 0 bytes libs/src/asset/README.md | 91 ---------------- libs/src/asset/SPECIFICATION.md | 94 ---------------- .../.docs/bytecode-logo-dark-theme.png | Bin 18430 -> 0 bytes .../.docs/bytecode-logo-light-theme.png | Bin 20681 -> 0 bytes libs/src/bytecode/README.md | 103 ------------------ libs/src/bytecode/SPECIFICATION.md | 51 --------- .../.docs/fixedpoint-logo-dark-theme.png | Bin 25889 -> 0 bytes .../.docs/fixedpoint-logo-light-theme.png | Bin 25625 -> 0 bytes libs/src/fixed_point/README.md | 67 ------------ libs/src/fixed_point/SPECIFICATION.md | 86 --------------- .../merkle/.docs/merkle-logo-dark-theme.png | Bin 24302 -> 0 bytes .../merkle/.docs/merkle-logo-light-theme.png | Bin 25289 -> 0 bytes libs/src/merkle/README.md | 88 --------------- libs/src/merkle/SPECIFICATION.md | 47 -------- .../.docs/ownership-logo-dark-theme.png | Bin 27701 -> 0 bytes .../.docs/ownership-logo-light-theme.png | Bin 27491 -> 0 bytes libs/src/ownership/README.md | 70 ------------ libs/src/ownership/SPECIFICATION.md | 33 ------ .../.docs/pausable-logo-dark-theme.png | Bin 17858 -> 0 bytes .../.docs/pausable-logo-light-theme.png | Bin 20068 -> 0 bytes libs/src/pausable/README.md | 87 --------------- libs/src/pausable/SPECIFICATION.md | 31 ------ .../src/queue/.docs/queue-logo-dark-theme.png | Bin 16773 -> 0 bytes .../queue/.docs/queue-logo-light-theme.png | Bin 18554 -> 0 bytes libs/src/queue/.gitignore | 2 - libs/src/queue/README.md | 66 ----------- .../.docs/reentrancy-logo-dark-theme.png | Bin 26556 -> 0 bytes .../.docs/reentrancy-logo-light-theme.png | Bin 26100 -> 0 bytes libs/src/reentrancy/README.md | 57 ---------- libs/src/reentrancy/SPECIFICATION.md | 25 ----- .../.docs/signedints-logo-dark-theme.png | Bin 27957 -> 0 bytes .../.docs/signedints-logo-light-theme.png | Bin 28043 -> 0 bytes libs/src/signed_integers/README.md | 57 ---------- libs/src/signed_integers/SPECIFICATION.md | 31 ------ 40 files changed, 1202 deletions(-) delete mode 100644 libs/src/admin/.docs/admin-logo-dark-theme.png delete mode 100644 libs/src/admin/.docs/admin-logo-light-theme.png delete mode 100644 libs/src/admin/README.md delete mode 100644 libs/src/admin/SPECIFICATION.md delete mode 100644 libs/src/asset/.docs/asset-logo-dark-theme.png delete mode 100644 libs/src/asset/.docs/asset-logo-light-theme.png delete mode 100644 libs/src/asset/README.md delete mode 100644 libs/src/asset/SPECIFICATION.md delete mode 100644 libs/src/bytecode/.docs/bytecode-logo-dark-theme.png delete mode 100644 libs/src/bytecode/.docs/bytecode-logo-light-theme.png delete mode 100644 libs/src/bytecode/README.md delete mode 100644 libs/src/bytecode/SPECIFICATION.md delete mode 100644 libs/src/fixed_point/.docs/fixedpoint-logo-dark-theme.png delete mode 100644 libs/src/fixed_point/.docs/fixedpoint-logo-light-theme.png delete mode 100644 libs/src/fixed_point/README.md delete mode 100644 libs/src/fixed_point/SPECIFICATION.md delete mode 100644 libs/src/merkle/.docs/merkle-logo-dark-theme.png delete mode 100644 libs/src/merkle/.docs/merkle-logo-light-theme.png delete mode 100644 libs/src/merkle/README.md delete mode 100644 libs/src/merkle/SPECIFICATION.md delete mode 100644 libs/src/ownership/.docs/ownership-logo-dark-theme.png delete mode 100644 libs/src/ownership/.docs/ownership-logo-light-theme.png delete mode 100644 libs/src/ownership/README.md delete mode 100644 libs/src/ownership/SPECIFICATION.md delete mode 100644 libs/src/pausable/.docs/pausable-logo-dark-theme.png delete mode 100644 libs/src/pausable/.docs/pausable-logo-light-theme.png delete mode 100644 libs/src/pausable/README.md delete mode 100644 libs/src/pausable/SPECIFICATION.md delete mode 100644 libs/src/queue/.docs/queue-logo-dark-theme.png delete mode 100644 libs/src/queue/.docs/queue-logo-light-theme.png delete mode 100644 libs/src/queue/.gitignore delete mode 100644 libs/src/queue/README.md delete mode 100644 libs/src/reentrancy/.docs/reentrancy-logo-dark-theme.png delete mode 100644 libs/src/reentrancy/.docs/reentrancy-logo-light-theme.png delete mode 100644 libs/src/reentrancy/README.md delete mode 100644 libs/src/reentrancy/SPECIFICATION.md delete mode 100644 libs/src/signed_integers/.docs/signedints-logo-dark-theme.png delete mode 100644 libs/src/signed_integers/.docs/signedints-logo-light-theme.png delete mode 100644 libs/src/signed_integers/README.md delete mode 100644 libs/src/signed_integers/SPECIFICATION.md diff --git a/libs/src/admin/.docs/admin-logo-dark-theme.png b/libs/src/admin/.docs/admin-logo-dark-theme.png deleted file mode 100644 index 2428d4aa5a06f716735385d962d325414eac442a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15838 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
  • hg}Ye$YDY^a2@5 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 diff --git a/libs/src/admin/README.md b/libs/src/admin/README.md deleted file mode 100644 index 008bdf4f..00000000 --- a/libs/src/admin/README.md +++ /dev/null @@ -1,85 +0,0 @@ -

    - - - SwayApps logo - -

    - -# Overview - -The Admin library provides a way to block users without an "adimistrative status" from calling functions within a contract. Admin is often used when needing administrative calls on a contract that involve multiple users or a whitelist. - -This library extends the [Ownership Library](../ownership/). The Ownership library must be imported and used to enable the Admin library. Only the contract's owner may add and remove administrative users. - -For more information please see the [specification](./SPECIFICATION.md). - -# Using the Library - -## Getting Started - -In order to use the Admin library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [README.md](../../README.md). - -You may import the Admin library's functionalities like so: - -```sway -use sway_libs::admin::*; -``` - -Once imported, the Admin library's functions will be available. To use them, the contract's owner must add a user as an admin with the `add_admin()` function. There is no limit to the number of admins a contract may have. - -```sway -#[storage(read, write)] -fn add_a_admin(new_admin: Identity) { - // Can only be called by the Ownership Library's Owner - add_admin(new_admin); -} -``` - -## Basic Functionality - -To restrict a function to only an admin, call the `only_admin()` function. - -```sway -only_admin(); -// Only an admin may reach this line. -``` - -> **NOTE:** Admins and the contract's owner are independent of one another. `only_admin()` will revert if called by the contract's owner. - -To restrict a function to only an admin or the contract's owner, call the `only_owner_or_admin()` function. - -```sway -only_owner_or_admin(); -// Only an admin may reach this line. -``` - -To check the administrative privledges of a user, call the `is_admin()` function. - -```sway -#[storage(read)] -fn check_if_admin(admin: Identity) { - let status = is_admin(admin); - assert(status); -} -``` - -## Integrating the Admin Library into the Ownership Library - -To implement the Ownership library with the Admin library, be sure to set a contract owner for your contract. The following demonstrates the integration of the Ownership library with the Admin library. - -```sway -use sway_libs::{admin::add_admin, ownership::initialize_ownership}; - -#[storage(read, write)] -fn my_constructor(new_owner: Identity) { - initialize_ownership(new_owner); -} - -#[storage(read, write)] -fn add_a_admin(new_admin: Identity) { - // Can only be called by contract's owner set in the constructor above. - add_admin(new_admin); -} -``` - -For more information please see the [specification](./SPECIFICATION.md). diff --git a/libs/src/admin/SPECIFICATION.md b/libs/src/admin/SPECIFICATION.md deleted file mode 100644 index c09acdb2..00000000 --- a/libs/src/admin/SPECIFICATION.md +++ /dev/null @@ -1,31 +0,0 @@ -# Overview - -This document provides an overview of the Admin library. - -It outlines the use cases, i.e. specification, and describes how to implement the library. - -## Use Cases - -The Admin library can be used anytime a function should be restricted to **multiple** users. - -## Public Functions - -### `only_admin()` - -This function will ensure that the current caller is an admin. - -### `only_owner_or_admin()` - -This function will ensure that the current caller is an admin or the contract's owner. - -### `is_admin()` - -Returns whether a user is an admin. - -### `add_admin()` - -Only callable by the current owner, this function will add a new admin. - -### `revoke_admin()` - -Only callable by the current owner, this function will remove an admin. diff --git a/libs/src/asset/.docs/asset-logo-dark-theme.png b/libs/src/asset/.docs/asset-logo-dark-theme.png deleted file mode 100644 index 08fcce987415d9fe21b8ebce7bbc6f08ee326a2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19627 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 diff --git a/libs/src/asset/.docs/asset-logo-light-theme.png b/libs/src/asset/.docs/asset-logo-light-theme.png deleted file mode 100644 index aa7cf51a66ae6a55fd63e177c6ca32052cd65877..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22279 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 TVNo;iBoqcuS3j3^P6 - - - SwayApps logo - -

    - -# Overview - -The Native Asset Library provides basic helper functions for the [SRC-20; Native Asset Standard](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset), [SRC-3; Mint and Burn Standard](https://github.com/FuelLabs/sway-standards/tree/master/standards/src3-mint-burn), and the [SRC-7; Arbitrary Asset Metadata Standard](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata). It is intended to make develpment of Native Assets using Sway quick and easy while following the standard's specifications. - -For more information please see the [specification](./SPECIFICATION.md). - -# Using the Library - -## Getting Started - -In order to use the Native Asset Library, Sway Libs must be added to the Forc.toml file and then imported into your Sway project. To add Sway Libs as a dependency to the Forc.toml file in your project please see the [README.md](../../README.md). - -You may import the Native Asset Library's functionalities like so: - -```rust -use sway_libs::asset::*; -``` - -Once imported, the Native Asset Library's functions should be available. To use them, be sure to add the storage block bellow to your contract which enables the [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset) standard. - -```rust -storage { - total_assets: u64 = 0, - total_supply: StorageMap = StorageMap {}, - name: StorageMap = StorageMap {}, - symbol: StorageMap = StorageMap {}, - decimals: StorageMap = StorageMap {}, -} -``` - -## Basic Functionality - -To use a function, simply pass the `StorageKey` from the prescribed storage block above. The example below shows the implementation of the [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset) standard in combination with the Native Asset Library with no user defined restrictions or custom functionality. - -```rust -use admin::add_admin::asset::base::{ - _total_assets, - _total_supply, - _name, - _symbol, - _decimals -}; -use standards::src_20::SRC20; -use std::{hash::Hash, string::String, storage::storage_string::*}; - -storage { - total_assets: u64 = 0, - total_supply: StorageMap = StorageMap {}, - name: StorageMap = StorageMap {}, - symbol: StorageMap = StorageMap {}, - decimals: StorageMap = StorageMap {}, -} - -impl SRC20 for Contract { - #[storage(read)] - fn total_assets() -> u64 { - _total_assets(storage.total_assets) - } - - #[storage(read)] - fn total_supply(asset: AssetId) -> Option { - _total_supply(storage.total_supply, asset) - } - - #[storage(read)] - fn name(asset: AssetId) -> Option { - _name(storage.name, asset) - } - - #[storage(read)] - fn symbol(asset: AssetId) -> Option { - _symbol(storage.symbol, asset) - } - - #[storage(read)] - fn decimals(asset: AssetId) -> Option { - _decimals(storage.decimals, asset) - } -} -``` - -For more information please see the [specification](./SPECIFICATION.md). - -> **NOTE** Until [Issue #5025](https://github.com/FuelLabs/sway/issues/5025) is resolved, in order to use the SRC-7 portion of the library, you must also add the [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src7-metadata) standard as a dependency. diff --git a/libs/src/asset/SPECIFICATION.md b/libs/src/asset/SPECIFICATION.md deleted file mode 100644 index fdb07a98..00000000 --- a/libs/src/asset/SPECIFICATION.md +++ /dev/null @@ -1,94 +0,0 @@ -# Overview - -This document provides an overview of the Native Asset Library. - -It outlines the use cases, i.e. specification, and describes how to implement the library. - -## Use Cases - -The Native Asset Library can be used anytime a contract needs a basic implementation of the [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_20) and [SRC-3](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_3) standards. - -## Public Functions - -### SRC-20 - -#### `_total_assets()` - -This function will return the total number of individual assets for a contract. - -#### `_total_supply()` - -This function will return the total supply of coins for an asset. - -#### `_name()` - -This function will return the name of an asset, such as “Ether”. - -#### `_symbol()` - -This function will return the symbol of an asset, such as “ETH”. - -#### `_decimals()` - -This function will return the number of decimals an asset uses. - -#### `_set_name()` - -This function will unconditionally set the name of an asset. - -#### `_set_symbol()` - -This function will unconditionally set the symbol of an asset. - -#### `_set_decimals` - -This function will unconditionally set the decimals of an asset. - -### SRC-3 - -#### `_mint()` - -This function will unconditionally mint new assets using a sub-identifier. - -#### `_burn()` - -This function will burns assets with the given sub-identifier. - -### SRC-7 - -### `_set_metadata()` - -This function will set metdata for an asset. - -#### `as_string()` - -This function will return the metadata as a string. - -#### `as_int()` - -This function will return the metadata as an int. - -#### `as_bytes()` - -This function will return the metadata as bytes. - -#### `as_b256()` - -This function will return the metadata as a b256. - -#### `is_string()` - -This function will return whether the metadata is a string. - -#### `is_int()` - -This function will return the whether metadata is an int. - -#### `is_bytes()` - -This function will return the whether metadata are bytes. - -#### `is_b256()` - -This function will return the whether metadata is a b256. - diff --git a/libs/src/bytecode/.docs/bytecode-logo-dark-theme.png b/libs/src/bytecode/.docs/bytecode-logo-dark-theme.png deleted file mode 100644 index 21a5e14b3baf9d21cf13440f268f0f8275519109..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18430 zcmeIZcQoAJ);K)6(R&2ZOQJK%5G6(nq9#g|FqqMMk2*qvC=nrgjY!lHy^l_`M2OCW zh&~8GqU8O^_ul*5yWZz{-*wme{hq%r%g209*=O&4_Sx<1i8avEq$Fb@1A#!4TDR4V zKp=cG;PVhEG4OmxzQYXs>v?$3%-0AW!0GAjfpl_3aQX&$A~+F&PDl_aaMsPhf{K8P z^z4{H5nqfkX+|vtouK35n0h?jrMNkr7>?y;-dwY`PtqE7*csP>a zr)&xN27$lhegDTx@}?jV-XkYfRRb+m)xXmNP>~&)ta!Wo7F)0NUG=w&PyA`T1`Kkx z3%L{P$kgA^I7gdYyCZrY$xo>j_p}IW?zv}Iy@_2eFMCwRNg5Uby$QY1d^`5H4w;Cp z0ud0a%58rlqHuc;TZCw!nwtSi*RsqSLEJp>EPycvRC9bmDUy4 z^;AVTI^BNgjkxh2>SsL1^Xt~~JhvRRCq z^Un}p7e#I}T?0;44{rpgl&F-bxQKe7lfNXl5*eq0w>?tcNKNB!Ab>YTZbx5VPkAx1 zfPete0EnoEw}Y63oSdAPxTKh*qzEuV#3#tz7al0$?!$8l;x8C#2p>CdCr@7|4|mQ> zm~dMUKVL;|ZlIs@@A$cS>gxUjyt~iexB&1&ED-J~CLt;==H@2$&og{{)%^h=e?#cM zo#As2IHh7n2pLY=bu4nYUvvM1HvUq4o+^Ke~1E@_b-dt+x=slr=Pd$ zpE34!VhC4+8vxV?z)#{|#``)U|BG4wg4<=!A9DT~5n#E0!2g%gf2aM=U|^K4uDqIu zo!{l6T55{im-x!td)PVI%m4W(D`hVyDTNRhk%A(Dhm0IV1PTRSC8h0=wo(wNguN`} zpFnB3`}o4$?GTrs0N|od0311lq^%u78YyBcAucB(C2lV#Vk?QT6Ok2%NZL!v+Cm_b z@P7iK@9hLgCEWF&vAP6h4}g*p7e^rNW#J;ScF;>~?4?BD2nl-;DY&$h6cQ>8he-T| z&E-DGs~Bi0a!ZPe{{jA|#lRKri}dhzQ{>i#+i~jO{jZ*TPHu?1zVJ(~Nyv)J%0eWe zl9IAAPzjlT0%(Hp_5mdB5~zf@C`9VdbbC8_4FDt@kQ^sBxC27W)7{}u$K}4r1JnSV zgm6w3XOGyZc%gT%Y(|8YiCuGq7-{{NJ!>RDsp5J!z0oD)t)AZMox{L7o>+P>s zSEoN`iIelssgQ@;{Y8Qg+#g~82TuUjUtM;NaCZj;pg#U4uYYfM`fp@G79s(akdTlO zv4=|lvLK0&6@g0H*^59Ba9c@nh^-u4LiS&w`*vx>o z{Q__N>*xSS#O3ygOF~4%B}F7}cOG?N~O9=rV0EUVEFOUd`H9}4fDk1}smKBk* zm6j2K+ses`*h|WZ%fgXT;^MY{iTgho_&<|q>f~BR?fi72>ubLv_ampIlYd`UhTubC{AR+e6b z<(6>p`E7lE>!ZJL(6$>ic1*+-MFS)KKk|rCiJx387YkivmULw>nWlFQM=PTCu{;q4 z`#wXV_5D-ljQu;?9UE)YFAh>q&lG-@?5-i4g2R8e)f@%)`5zrGyw5pJ-JO{UH$7c2 zQeF}~)NQ(uwGr|p&ndAg$!nv5#XN-YPSv>mLVekKqUxn^!fQk9NqAz9ZbM06#Pe0H z#8?zYr}}@3q4=U`3VR8eWC+h_u#RZEh#MFj2D+zbb7hlJn!Zr7dx8j{*<8oQFSLx_ zxXC#viFvapU4f&(RoA@28OM}1o~B7GKv>n+8Zi`yc@BC z>P9V0)Lrt9xtzgUeoP5-2TNKjeEpK2;Bq$cEbtwIz5-tVOWxkLS?%)0a(XYN{^^zo zB>EhN$)z*9oK5o+Tn>&}Rk<2N2E5pQNHOhk;uW`CxN!+6IS(T^dF2wHDCWbjb!ykW z0MdZw8Vuc^xqk!k-~NN)>s*2_oN=rhm!UcYsarK${u(F6of0`W%wF$vS&^=PDJHl#8EB(j2kV>}z~CKGK=nlT`c>Fo(^Iyd2-8|96MdgO_f`WaZ=gE%+p$Po%3a zFR=%gXK%!&9PvOqdbUl_{i+N)LQ%$X#yrApx|ki$;U}QGZ`f`Ks+ZQ|iQ!Qb1mGV( zs)$IO#30v?1m}!F8fw+D)ag-$rU2Hw=*=#EEIZa5D+^5;|0yQ6@qBXNagBg&`;~81 zL`b|MxRnZ2Rmh} z09$j~@@sOoSsCZTRAQglDP1uGv1$Lzc~z`SB!-^^8j@&#0EC3b zyW(}<(J)bB%y0g`c%w=ep$scHxj8JmX*9`ONs$g3?g}wvkUTY%t8QcNoeYIuiCl`D z`9#6mjCYD&`|vI~>doXnCN^qSd-VaBE9x1hl*gj;Vju?cc~cSq@L0{u5Blu@Wd|PI zN$oL~eb574bJ28Q zpFYw_*%6k#m{(w%PIaSBbQqGIf}GhcG+SPsM%NNdQ>G{U)WWc$LcxostLyy2sweVWS)u4*DPQ=Gm(IPWy=%GONz`kLIp9}l) z@dS&>fhTQ9|E!0)wS&`nWUV*$_gIIw;Xlkz$;#<+(m8HbJA}g`>j+H*vtIfe*qdf& zq>shIzHz=6BTp-5{)|rzGF^!tnvt<*RDI}d%{1Tm%D&h0I$X<>oy&U?Cud5Is-nQ? z`d!=O^rYVt!tz57RL;r*8TayH`$dU((P}N8_a0aO#_MwT`uGjsg?E$!3&viJ6i9p1 z^Sbyk1kaBDgd3LlsU1Ake0#64nWK^BIBOkFNw4%yq+tvE2_+YWP~oecdbuCXno*~FZDiOopG)Y9D3R#m);N(>r>&d`8wHDg@ZX3jtdc{01n$t!~|@P;um4v=)PT zA@s+sn6kwv|KpU16;j%#F9s&%BN@Ak8<%=MSLloXItJAShg*QMsufohVcMIeg!-9`2ru3}1_pM4iEjF~<-OM3nS)9}4l} zf0ST17r=17&SUruU2ovT1+ zLFfZZrfl}#x^liF{l^QTk87go{~Dmsw+ zbz(jUif*W)2)vZZ#Bl0UUQp>$Bn1O7z_F(?`JJ@oK>dK{Kiwq$m;Kl`<)18 zE|s4M>KJ`` zCCnWuOZkB}NO;fRCJdGpJb%swlk$_>(}B!QV~_NRFC-UlCcXBa=;&YAP1tE07?t{HZ65Qfp@%;m=^3UWoOZXvjp$T%%pOn@tZRe0b6`np{R8y zvL%wmm!EWJB7To>#xD}Pa!pv2r#8J>ePyMYYUmpfPSVM4_waGU{j-V@kkU6?63Cip zRJz7CM_>?tPZT@6_bh88R}pg2c4giB7=f7@-hM0J5X4pR;b*n+FhsMbZrGs?Aw7B4vP2Z}c{prl?Z;!yXmhvtsYfPrUl7$J^eEH2dxH!i%sT^# zbwpR_{DZD#dX8xG7j_VcCW3eL?{06v&jh}|vrUIp#jd-2cxTgsegu-Oslbd$w*Ky6 zoAb6O_No(AYLivODNQbT5RDE&_qXG3VB|2NxG?)`b0JW!CkIci_8NzCUl3q;a2Ij` z97a!$*y(&|!i}RFXRm&;Q(oG|RaMz3C;1=yM7T)Cm6>`IdSl zChs#>b*5{Obk70DwL+wkG!Vk2rV#nveZ6=#vV%yp>zu#dBRo#R!PPctY*Mrm(9RSO z>1Rvmx<FS(9U5y9vW;+oX3ls{uUlasZCvsCDY%S$8H>ValZkfTZ8I~ligW9)o zOJjE50|I=GJ@A&wJ$K)x@}TDCLyf3*tnklde~b``fbu|L-*DYNEUY91vORJl9({OM zl5>Zkj+dwMHw9iFK8b<7{9H&tb6RbC0m6(a8?Zq+cg(zJlCbvHqTa^wAD;w+>xime zn_2cwLmIw){jjJ7sDD$p&id5?$*P>W+bBkXxvQ~Hs>Ew7EN)qbma1?B2<}y|jUGs2 zc_^I^!Z4G#2SWsNvZNOt3CnI6{guid^S(a9uIJbXez{@-j`2D+2>8pBZUwrA^L6I& zS$rYhT76#L+A+SU#=HLCQk}^cb#FUbkAAL5!nW6alOdx2C=r#zQ5x^uj4%4es3$GD;G7tZ&^1F$hEeBFnw3& zq3^Eh)c9wez@_SXY%E}a9^HNlL>BXa8aig3dAI7Nk(ZnF*4o3ZQ!dn*JW;)l$YQlm zHVT`U;#>E&m0V0G_mh@%ZLsedu!{bM%&4en}Wg# z*qEbdNMTAJ_c3dO^(y$VuS!2Uv7z=2cmqs8O(hjHh>L2PtiISnk8eiMUL@?yv(CxtG*kkI*&@P>qzSbx6oNcm}boU z>N(H@AII{hWzINBlg&Q?vn$;w$6s_on%;x%ieo7v+f+&;+9rn|yqw0(-9EN{NEhf( zOi7GWdSRpYtBK-ZJKb(da|5!ZGXd#2~C~VegQ?NCYQ)o zZEYn|?f8)LvAs5sD>MUk_nCpko?vr>vM!f^(Bo&;#-$?AE31~$nK!Q*TaQ8qTbmJVb5bKh|rbfa2LREfT6v^X#(okhU-B(3+I9`_hlT| zgB5&6;4~EGF~(W>8LvNUrY+XZn*1!KMVUBT_uT(s!#pzw=`2^?YfwDV97%foTzlir zcx}Z_g$R`XIK{RW{u}!2{WN+CjCPjcOS_yM$4m;XTGf%?8oSdMNu%@TE_t3v}4rwF?E6B}Lu_N(?h3lkvK$A@@YgN7Db>1fn;6D4tEYS$gB^&yeqMtF*S=4Z&qCjM*_CJP=z}^e z#45jeogWadk(2jD#Z0E(4h&5H_)|dT7vuRQ~$R z#FpR~Fj~s58E23rnp$25zPodE^r>ytRk^f7tH8Ah@qLdWPJe3u<8#57jEUx?waE{% z_xmj5ie_X}+G&@Ud>UUbtup$_523~3A+J7BvR`yjRP9-{i82Y(mw|qce;lh zl5D%jzj?AygLjGtCI_Rg(VzCpluR(SlAp-oWIrsNOWBQ1_eANh8e4esx3v)I)DbZ@ zIeV~^h`#y$IzVji*7BFZp{Q!h+s=BL5HV`@mx1$7kw>=@^8BnG+a*r`x!TFQ=ajx1E3HDi zY+!+Y;UoP7{aU%G>+YSU*+^;{XYvPn0mpU>WIrNl{4nIT_s19>`muf2#Hk+} zJu8CXHxoHr@bH{F+r+QS`QuhipJtJL5orfx>)*cDO!6G>v?yZRKL=y_16*Y)7+(?kGc1Z__ zvaVUwE97RyI-22cyY!0F1EG&eA3=xjanZ8m?M=0&_X|~cOuTGiMtmqntBR#(o|W8t zMaZ2y0eR_g7&M~K+Dv`RevT(Zr%6$Dbos4bkyPXzsaX*qgj$ykHPN#m$ zEJMP%N2(E_@ZgouZ2xkRKz#UUq-UGP2#oj~fcjY;;_85vm>^`B5$Cn9_t&adKv;t52cV&$<1VT z{ANu1zJql7ndiI;PN}I&;_Xkbf2l@s#wG6F}RLAI}BUvhcj{GB6j<0r>_+?bw zTetR#I**av&--FxI4iXQwu0v-O76BZJ1s>WJ&7p0&Lmb);y?uC4TQ;=eoZiCKdJ@= ziojJP97WSC5_%kacwtQ$nvx+$Ys+*Rv(&;9qOIcldto~)wu33r;I(!9u*I)aRT(d5 zPY;M)>rQV8O{iVV+F!DWHDLq11G!Il+e9)1u5{vQFSmr>0j{+JeVo21FT+~aMJ#to^=y?vx5{c|qI03=Hu zBuw8f;r0A?bcUaF(6Ow~DuGL5n?1Uy1VKoS~Z)>p7RqPTl_Xw$+)ODv8_U0U%6JZAXrH`x|$??#vsf31YKrtwL2% zLFcV$wqtv2o^IraKkAv-I2J@cFPf~cRJchg&FGT=R)Fv(-r_}D|?8)$@97`$h3 zHu6dTLZk=xHq)??#h&-PhyBnuM%USN2e(cqz!MCrrtaI=urqkR`WTu^!WcQy%U1t;Tb8>fEnZ-xK?275zBwj}~O za^B-c1)5uW-y; zSgSjT@-nAZ@>}{lgO_v^dfo(}BgqD30E9E|Y|U7S7Nr@UngYf`I2yLY&d2(afz+@R za9$N6V;u!x_C=Xiur-3EeDAKqSU}-iE4WLxB#6Ve&XK`I8DoTKn-yDVxBMGQi{CT$8J5c+(Be|bw>1G3p8|txa zUGHqP-8z3@9sxP7rI=H}zHsiUfl1O!eZ*|e#4wpGr{6RD!1s6vrCjB?u7$aB8dISy zhg!hsn-{MPmk%xE6{)yS;gr};<|bl44vQ{nWi_;%ro3A1TIK3eqGZbo+zvWF-2X&z zXE1{y?y#oE9f`wrlZ0bxV7ct&dE`jC~q74=f9FX=^i9no5ERu99t z3pue6@$uG7s~iWt;dQ=Rjz4y!_VLv`M?IN)Kid&t{H@yoOC!S%INgHwN+s2OvQkOt z1@aUM$?j@Z{Wzk}?-*SBqJ~P)HGpEQS9ERDHP^OBW=|O*)eG!pWLP|S^ zya;RqESGqUf9g+zz4OkbuDH_=bc29J$QCpEm^gY9hexppeSZHJP|o9YZ9nfR~6uQ zoSCz<5Gv259EeWx0+-8wq9vLAh(Vc2j2H)W&s<}eCRm&Fy1zHFzu`o2omyg?O9kp;$W(s&|?f>1%OL903l&Yk$*6qSJ_)My|-|oZZ!3riy^MF;98#M^>E0e z?}M#+RjQ}w7-NQWqxxe7jRJ$Lw@X7hWUiKy*_C{75Ci|YIM5sEYeFYAmV`q-#3;FKqfO~-=ezJ28 z??D_es~n}@u~@Rn z?WW9G5bf@A8 z`zS`XM+vl1>(tn}>#jMsrpB*y5q)=`j|@or3GH%kouUn?H1e+GbnOm}G-&;)g7%|e zl}yvssfiKdc_F;P`QqwTJu{;jf)KK4)=mff;7g_i)*@;oYi~+lJte_Bp-WO! zOso2()+H@m7pmY%^kbo7I_^?>@O)`P%Be{FNx~VnxnONIl_$S&Ue7b{0GAgMDwc9w zPY?uLDn5+JV0e6)cj0_AO$Ljq=hR}}v(q}+lS;ya#)5HPx84^NvKy`U!DsSM4$flG zuZ(nj&orw%Lp-Ev=%R6>A(`Seb94(kvFC?5(1MV~VRuo;1{-NMUbc3<<CBd zDS?FZbMNq9?uWI%US*tD<{kO>X`MWcT3+A*s__}8FKYoL@4U@U`LIZ`aIQVhQyWgs zwuZANO8e39NlbLG?b?Z&t@Vq*sGe)CNdKyqr8~cH?VoIU*K06*=cx&sc20Xu&?l1# zfd4|EqBNv!rQ^;uB88q==SuHTR3FHgWfR*B?2?&S7(@mc@NTn&M4*cb1jwqKD~AkV zfek6xwmK4c(A^foGCLmhi_uR?a|6_V#}HIi?XBM-UBm6qKLtFXVzchPK_y+Yv=(yh z^|Jy(1Ma&c+sR={9#o#XjBA!Ex0k~r4fv}L&0-$$}newLA8 zl?hiEE&Go8_7keap5XHt4Hdh?7>Us4q(#Y#n4JIBrM0k7)Y)43wmd|}>G9~!_)wzCtL5%NIwEmIS zah!G#_S9yx#}0X=>6G#nD=H0VSd|bS3BZ#`G_NLSDzo zRK?JT7X?wBY?U_!d^GvG6EzX9QFHA?2x4KpdUDbY`tc*59ne@nfyG_IQSq8$KlyO! zLRj280fhkRJycjnZAuBM&o8RU`j{*7=80wtU#<_5C< zZJ$i|W7oN_Wvg;nUF4Asa3_)R>}Gu_o*Ryvw=OU5)5(dc^WLU5mTQyki%T!y`S3*z zq)=j}P&bhNh#Zebb!`9D#dm4^LKB%j;n^guw1KU99Mvp=B^l?s55jICkJMqXAHU@5 zemY}GA;Fv_M~jrL&7&*pde}Oof6(a43J*qeF#PQfcckH_S%Mc(5TMr104_FA!ryj4 zI;77$CJyyaQz$>MSbcrJo6wh}vmIM@>j5I7IU+o%@Mo)h?N9tjiGwk3g&m(LI#Kdc zD<vDk~~>k)|?W5+^I>VMxXFu^Uz#U=-2%vgYBsE88w`#zD$P!`XI z%`IE&vo84Lptn4soo2NJsjaj#{U7QBA;A)hW_i4UN(+?p_Q)-gH*T6hz&>NsXy!$L zxsSWBf<+#@B}{55S0FsQ(kbN=nlpDMwfB2IRH7ho&$=(z#KfJeG5zb>*nF;-S_C7ky$j~z!IkT*qqxr)7s3HT*kp!=DbBY!Da>DRkT zjUtPco_*Jl?=w-s)?=lg6GhV#@Ts^aiDd!RXS;@tW zTEw4sMUGM1WF2z`*0hNp?W+)~Zs@^$OP-<`ei0VX_3vQ3A;I1e{rv@)La4@Tyx_i| z!dv1SArgsCgGu{}8>l=Pqw1Mgf<6wX1nFlp}BoQFXqUIJX%- zn(!5#y#w9OyIz^En=(hAcN81}@V~6K>8ZgME{@6hfCVO(dSLDvqM)(0E9u%Kp~Ou1 znJKdPqAuNvDOWgzm8+!3qIK!odJi=F*^)TQM!Yl|`cbr%r`zL;=B6lc=WVhwO*&8I zPsxCD_^Mpxk@aBLT!DC+HJwN%>sizrNvN$jSvgSQaKrB~a$bdo_76EiUoxh)}8@U%Fw`mdT zhN0yM9+Ji%O)6p5G(G&lME0_rhDDRMRp89S0{E&(X_E~(>aF8_gBYJlpj--E-nZiR zvD@ltKRvgpkKI>iGI)PJ&7+J-!X@_0f)!`+3ODZAx@jQ7c#Anp_mL)0uZ#knXdU*` z0+WT4W2-T~u&>TaTm@EgrZB?VU<07&h))u@zr9(MpGj^aNS(hB2_s||uQ{Ed{4*mu znb4z54sa>S0LQmbEDk7)0ctgfo0*dAfcwX8(jy93%q{9YJHJPlSKC19F`1C3FG#{$ zno@*3PNr+P^3|kl9#8>AXrdEa<`vpAsQ|l}yzUqOr`(C}9eEi(m$r0qQe$QU_hl{7 zWu-zUaI1Nxa5nPt6{x{^Zo@4vLskm7AB>?*yg0$c{dy4+O&`u?h%V!T-;a$SfR zs3QWd!i~Ag$)W}(8EjO9!y)7uF>yIqoGOZ3knN~EBlHbb-gy&LW@w)ZGWRa!IE*IU z^joM{#>~v6UhDRA9oA`fdNO<;PaVicjD6Vmhhgc%c z2B-`oG@0yr|1bOW?6RB;TwZ#0DDN}Vz0p(}b8evK3|u}O6?HUv{mnPj2ypKbz5bN@ zvSJODngO%{nb3)M`9S5=UoC)Rd$+JrKG)zvgKDR6RlKIjPoXW1G#c0%p$yu?Z^z%~>+eGM0(IV18r>d4y{vOlzU$YV7Y|fdXcYoy--K zi^mSCl&Av6w6v@!{SQt zk_b3-X-sLHA)@$|KF8z>p$*7iMmVM31rLyWT%?5Gnx|&t6HmOo{1%R-S5t1(*gE6( z<2Pi>WY{yoo??LEZt7FZ_`o^TP?0XtckA3|p@QABhk8Hf?7K!J#aGFxFjlaY_ zIZ|I@1ieVn^9vn|ucq7$Q+IV@(dP!rlw8Cu7&4s*NCdqt?DP&G+G>IvB#YVIK}T`6 z_P5m2TEbaQ0&HF?oDM8>NPw(MjNI?n;cvYlt5SAG2CSEG_1G|(0r@C?aaoPZ*EDpd zKL4~!YYgVum006v^D*l4F)?Qs z##bH}XR<|;mD3bI^yBc7j>h^F52Vr%jI}JB`%zvDi%DbgT=cPdEGIdl#Gg%}{9BT6 zKGY9ZNU(;gSxhHC8o1|7zy1a&4XQDKwa^6ZE5I{$%)0bytVngj@1pLaSm{RL7*iL= zZgZWIxdlx;4}IwF!v4({>;v+oElD~{JMB?EXMPFiS*tB>gkdIMLVV^!1K*RhoDxQM z+?Pw+5a8^wVK9Tg{3LvtB+QTU=lZ_Ph6O=R<1-c+OSl$f~m#Sk)Qk5q?j35Lo>hIS?}jzYQ@1Y}M!?==g&HrL8# zP)Bqmp)q4WAT+jUa5+%!lJh|5@!S1Db0t&QSMlVmnWc=G*V-hRGtp7SueJGK?m8RH zmGH71NJHixd}K&Z9NuQa9y3zuSn-$FDxCO0w#M~UVmf&*xdcDVj2Y#R zI*O*LtD!rw>5C1Q^9+mbUi_SYw43TVyc4_DEc7K^ku@Y#aA&hDeI1AEj`%4ZmUt~$ereL15J)x_wn83x>MuBoq#)h&GFOGX= z#}*t+p#9lo)Wu_lYj-kOw zEO;k{uQF=j8VP&l_cldv|8Qjkrj+y51Krz^c}%-p!5XyEmA#dpPrww~ z;ZIHW@d&@nrJDBnl)$H~4@#7)mS98b&sq2NuZ?wR7IhfZikvWaKKz1}Y0~QeT|ByI zYftn(jzu2z=d>QNykC2};Eqh%Ea6lOn&lF6B7`?w(!~@901?Bm1Yd?r^O0`u>rsW@@ZNqZmPDnB5bTY#XleVV#*FX+0@_MZXH@zX3dCrd? z7oY$R&Fk^=pObNoLsj$Mi_F-Bs*?uop-11_>9~_W$Js;=Ouhk*7kCFkdXqHzx~A-E z8%oV*&xk+?@UfMQ+XDzX9e*^Pbd;e!Wi~3mq@DkE8hm0&XgRmmF*E}?qdiG|{Dx-d zI=YJvEBvs6`E@=*#V~^#o$*YW+u80;&R9ofu0X)CRUt;OU)9i8;gn3`ho$hF`Qs4! z%=3gv>*>tW+KrhJVQ<_nn_FgWZsB(sSh_qaF{@ef(9FHzT&u8Z^Jc8Nh zOMBA*4oFPo@pIz}7)a)PmG4<)#C{EMur z3W%=!+)vw^7V;xkex7EY+x8+x$cMn?jlRwK!xDfy^pPKb2>hc(n`(zIuWSYrXeE=J z{IW9_^uWOMYZvSM`NGxS0e6hD33R)ZxHc39+_bbLE0eL!a!-}d<2qzP9tFQ&Jmu~j z2P%E}@yqU6puYlw%~$($(~PWXLbMS)l< z3o|>nAU3)mGL|)?EcIrG2laH}+!D)*^k33b8>qyzMCjwS7(q79+aEOwu>Tu}P=phym^ ze1Ns;o4buD8pAw7HnU!bun!B?_tTKE84DBGtsmWz_+`p6peq|D+-kw3!hrw4^Wk~^ zn*`ClU<@v@%Uq*Pz1VxR-~C>q(U1O6Ot|!$oGF4af))X`7R|G=)S3M%G0Lhn2V_#q zscuwu**#Hl$WA+B;d=oCu31U}Gl;??A4u=AB141Ab4R^qRJdeKE^%zUJC^)WW5?KF zU@M@30C%~ED&@!yLy5_0R8F|Ey1bYTJJ}uCP9qM-9Y@^sX7`Y7xSjVq-ljRLD`j7n z7jU!aBHakb$}Bo7d&z{DeST^5WiJ+04n_+NRz1KfXU#MvT;NN@)x|u6q>~Yc?dq9+^ZRho48L zkn^Q23mm5NX=Hm7b-|51(uDDD?G8L3*q6sbA*Zies0ogo3tR$43^qDfm>?DfUqsb@ zP#9i`Vd_V*NA^#8poAnkSPrBqTx z&3NlyLQ|Jdn&yb8r{y*c0Cf;oI(*G^K=%S_{-g44`Q9%+I#a+7#dhl4aa?P_6k~ML ztCAb(3d83^S;ULF;M(q2E^Bm+>gl*m8wgDC8peZWQ#P5n@K!yD7OlQL(_+-C=D&D- z`E>vfY2XIh6~`pZ>R)MU}mX_}g|pM7Z0{NnIl z?OsgC2i)bx^l)|+HJa-VG&QrFnfuSwKhNa?oMCPboa~?2>k>oNWWc4+L0L%TI;;yk z-DKhNR{bdSXR0lE+fd{bsNqAzkBiVYsvUi}Kg5&oq{1LXWr0Tx zXNf?%0O1?}^60gF_g*ko6f1*e*KiG^I<55vtT0EAH8>d}n94&OXY`_!`FAszwrs?v z3`OGA!E`1%ocqdP8WR)#(Om@yu0&KG(3VsA6~6%t9XK-XM^wzD4<-dehGxX1Fg$f( zKG;vV48Ca|8QP@Q9|?AG8ud=f*wB91pR&1IPP gzxN;*`%SXp@I0t|q-7uY3K&RBT~DnNW)u1U01`phi~s-t diff --git a/libs/src/bytecode/.docs/bytecode-logo-light-theme.png b/libs/src/bytecode/.docs/bytecode-logo-light-theme.png deleted file mode 100644 index b02a071f20d7cd60d267a5b81102315027f81279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20681 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 - - - Bytecode logo - -

    - -# Overview - -The Bytecode Library allows for on-chain verification and computation of bytecode roots for contracts and predicates. - -A bytecode root for a contract and predicate is the Merkle root of the [binary Merkle tree](https://github.com/FuelLabs/fuel-specs/blob/master/src/protocol/cryptographic-primitives.md#binary-merkle-tree) with each leaf being 16KiB of instructions. This library will compute any contract's or predicate's bytecode root/address allowing for the verification of deployed contracts and generation of predicate addresses on-chain. - -More information can be found in the [specification](./SPECIFICATION.md). - -# Using the Library - -## Using the Bytecode Library In Sway - -In order to use the Bytecode Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway-libs as a dependency to the `Forc.toml` file in your project please see the [README.md](../../README.md). - -You may import the Bytecode Library's functionalities like so: - -```sway -use sway_libs::bytecode::*; -``` - -Once imported, using the Bytecode Library is as simple as calling the desired function. Here is a list of function definitions that you may use. For more information please see the [specification](./SPECIFICATION.md). - -- `compute_bytecode_root()` -- `compute_bytecode_root_with_configurables()` -- `compute_predicate_address()` -- `compute_predicate_address_with_configurables()` -- `predicate_address_from_root()` -- `swap_configurables()` -- `verify_contract_bytecode()` -- `verify_contract_bytecode_with_configurables()` -- `verify_predicate_address()` -- `verify_predicate_address_with_configurables()` - -## Basic Functionality - -Please note that if you are passing the bytecode from the SDK and are including configurable values, the `Vec` bytecode provided must be copied to be mutable. The examples below are intended for internal contract calls. - -## Contracts - -To compute a contract's bytecode root you may call the `compute_bytecode_root()` or `compute_bytecode_root_with_configurables()` functions. - -```sway -fn foo(my_bytecode: Vec) { - let root: b256 = compute_bytecode_root(my_bytecode); -} - -fn bar(my_bytecode: Vec, my_configurables: Vec<(u64, Vec)>) { - let mut my_bytecode = my_bytecode; - let root: b256 = compute_bytecode_root_with_configurables(my_bytecode, my_configurables); -} -``` - -To verify a contract's bytecode root you may call `compute_bytecode_root()` or `verify_contract_bytecode_with_configurables()` functions. - -```sway -fn foo(my_contract: ContractId, my_bytecode: Vec) { - verify_contract_bytecode(my_contract, my_bytecode); - // By reaching this line the contract has been verified to match the bytecode provided. -} - -fn bar(my_contract: ContractId, my_bytecode: Vec, my_configurables: Vec<(u64, Vec)>) { - let mut my_bytecode = my_bytecode; - verify_contract_bytecode_with_configurables(my_contract, my_bytecode, my_configurables); - // By reaching this line the contract has been verified to match the bytecode provided. -} -``` - -## Predicates - -To compute a predicates's address you may call the `compute_predicate_address()` or `compute_predicate_address_with_configurables()` functions. - -```sway -fn foo(my_bytecode: Vec) { - let address: Address = compute_predicate_address(my_bytecode); -} - -fn bar(my_bytecode: Vec, my_configurables: Vec<(u64, Vec)>) { - let mut my_bytecode = my_bytecode; - let address: Address = compute_predicate_address_with_configurables(my_bytecode, my_configurables); -} -``` - -To verify a predicates's address you may call `verify_predicate_address()` or `verify_predicate_address_with_configurables()` functions. - -```sway -fn foo(my_predicate: Address, my_bytecode: Vec) { - verify_predicate_address(my_predicate, my_bytecode); - // By reaching this line the predicate bytecode matches the address provided. -} - -fn bar(my_predicate: Address, my_bytecode: Vec, my_configurables: Vec<(u64, Vec)>) { - let mut my_bytecode = my_bytecode; - verify_predicate_bytecode_with_configurables(my_predicate, my_bytecode, my_configurables); - // By reaching this line the predicate bytecode matches the address provided. -} -``` diff --git a/libs/src/bytecode/SPECIFICATION.md b/libs/src/bytecode/SPECIFICATION.md deleted file mode 100644 index 8b7d4602..00000000 --- a/libs/src/bytecode/SPECIFICATION.md +++ /dev/null @@ -1,51 +0,0 @@ -# Overview - -This document provides an overview of the Bytecode Library. - -It outlines the use cases, i.e. specification, and describes how to implement the library. - -## Use Cases - -The Bytecode Library can be used anytime some contract or predicate bytecode must be verified, manipulated, or the bytecode root must be computed. - -## Public Functions - -### `compute_bytecode_root()` - -Takes the bytecode of a contract or predicate and computes the bytecode root. - -### `compute_bytecode_root_with_configurables()` - -Takes the bytecode of a contract or predicate and configurables and computes the bytecode root. - -### `compute_predicate_address()` - -Takes the bytecode of a predicate and computes the address of a predicate. - -### `compute_predicate_address_with_configurables()` - -Takes the bytecode of a predicate and configurables and computes the address of a predicate. - -### `predicate_address_from_root()` - -Takes the bytecode root of predicate generates the address of a predicate. - -### `swap_configurables()` - -Swaps out configurable values in a contract or predicate's bytecode. - -### `verify_contract_bytecode()` - -Asserts that a contract's bytecode and the given bytecode match. - -### `verify_contract_bytecode_with_configurables()` - -Asserts that a contract's bytecode and the given bytecode and configurable values match. - -### `verify_predicate_address()` - -Asserts that a predicates's address from some bytecode and the given address match. - -### `verify_predicate_address_with_configurables()` - -Asserts that a predicates's address from some bytecode and configurables and the given address match. diff --git a/libs/src/fixed_point/.docs/fixedpoint-logo-dark-theme.png b/libs/src/fixed_point/.docs/fixedpoint-logo-dark-theme.png deleted file mode 100644 index 04a24bd8567e0cd338de8f2c2972b31387efa548..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25889 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 diff --git a/libs/src/fixed_point/.docs/fixedpoint-logo-light-theme.png b/libs/src/fixed_point/.docs/fixedpoint-logo-light-theme.png deleted file mode 100644 index 61deb38333713d87c72c2a9dadc530524fbef9cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25625 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 J6=$4d{}&;`1@Qm? diff --git a/libs/src/fixed_point/README.md b/libs/src/fixed_point/README.md deleted file mode 100644 index 8d2b1ce9..00000000 --- a/libs/src/fixed_point/README.md +++ /dev/null @@ -1,67 +0,0 @@ -

    - - - SwayApps logo - -

    - -# Overview - -The Fixed Point Number library provides a library to use fixed-point numbers in Sway. It has 3 distinct unsigned types: `UFP32`, `UFP64` and `UFP128` as well as 3 signed types `IFP64`, `IFP128` and `IFP256`. These types are stack allocated. - -This type is stored as a `u32`, `u64` or `U128` under the hood. Therefore the size can be known at compile time and the length is static. - -For more information please see the [specification](./SPECIFICATION.md). - -# Using the Library - -## Getting Started - -In order to use the Fixed Point library, Sway Libs it must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [README.md](../../README.md). - -In order to use the `UFP32`, `UFP64` or `UFP128` types, import them into your Sway project like so. - -```sway -use sway_libs::fixed_point::{ufp32::UFP32, ufp64::UFP64, ufp128::UFP128}; -``` - -Once imported, a `UFP64` or `UFP128` type can be instantiated by defining a new variable and calling the `from` function. - -```sway -let mut ufp32_value = UFP32::from(0); -let mut ufp64_value = UFP64::from(0); -let mut ufp128_value = UFP128::from(0); -``` - -## Basic Functionality - -Basic arithmetic operations are working as usual - -```sway -// Add 2 signed values -let ufp_value_3 = ufp_value_1 + ufp_value_2; - -// Subtract one signed value from another -let ufp_value_3 = ufp_value_1 - ufp_value_2; -``` - -Mathematical functions - -Exponential Function -```sway -let ten = UFP64::from_uint(10); -let res = UFP64::exp(ten); -``` - -Square Root function -```sway -let ufp64_169 = UFP64::from_uint(169); -let res = UFP64::sqrt(ufp64_169); -``` - -Power Function -```sway -let three = UFP64::from_uint(3); -let five = UFP64::from_uint(5); -let res = five.pow(three); -``` \ No newline at end of file diff --git a/libs/src/fixed_point/SPECIFICATION.md b/libs/src/fixed_point/SPECIFICATION.md deleted file mode 100644 index 5c1aded1..00000000 --- a/libs/src/fixed_point/SPECIFICATION.md +++ /dev/null @@ -1,86 +0,0 @@ -# Overview - -This document provides an overview of the Fixed Number Point library. - -It outlines the use cases, i.e. specification, and describes how to implement the library. - -## Use Cases - -The Fixed Point type can be used anytime a developer needs fixed-point numbers. - -## Public Functions - -### `bits()` - -The size of this type in bits. - -### `max()` - -The largest value that can be represented by this fixed-point type. - -### `min()` - -The smallest value that can be represented by this fixed-point type. - -### `round()` - -Returns the nearest integer to this fixed-point type. - -### `recip()` - -Takes the reciprocal (inverse) of a number, `1/x`. - -### `trunc()` - -Returns the integer part of a fixed-point number. - -### `from()` - -Creates a fixed-point value from the underlying type, as is. - -### `into()` - -Returns a the underlying value of a fixed-point number, as is. - -### `denominator()` - -Returns a the value of the standard denominator of a fixed-point number, in the underlying type. - -### `zero()` - -Returns a zero value of type. - -### `from_uint()` - -Returns a fixed-point value equal to some unsigned value. - -### `floor()` - -Returns the biggest integer fixed-point value, that is smaller than the argument. - -### `fract()` - -Returns the fractional part of the fixed-point value. - -### `ceil()` - -Returns the smallest integer fixed-point value, that is bigger than the argument. - - -### Basic arithmetic operations - -`+`, `-`, `*`, `/` - -### Mathematical functions - -### `sqrt` - -Square root of a fixed-point number. - -### `exp` - -Exponent of a fixed-point number. - -### `pow` - -Power of a fixed-point number. diff --git a/libs/src/merkle/.docs/merkle-logo-dark-theme.png b/libs/src/merkle/.docs/merkle-logo-dark-theme.png deleted file mode 100644 index f6d5621c74a9237230794344678516b221db3fba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24302 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 OQd(Q!%^#TgUHKo$3)^@A diff --git a/libs/src/merkle/.docs/merkle-logo-light-theme.png b/libs/src/merkle/.docs/merkle-logo-light-theme.png deleted file mode 100644 index ecaa232a8e679b9cc62532529b27852cfe2caf45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25289 zcmeFZWl&tt_AWfQdvGTK65JUa0tpfz!Ci*I-Q7uW4er6+-Q6t&cL>2f5G2^$i)l-DWLZB?!9*R>ZQ+GMaTzvNeomHR1gS+AuT1L2m--T0oNnQh``?j(yLk! z2(#T?S=~_);zDI>Z)0p`X+-7dW@|)crl^SlR`0;#=_l_{?n}m3L`Iu&yV6nB%o4`|vG~i^NUH*!5=kh5St#L7ms?RMh4gns;kK7yZqMXmh*BsGd*dZ*n~!(p>?C zGyJO7#tygzmoJ}1L~>6+n>A(gvbTB-Y!f^89{2R_)a&;nuJec|Y;v7=C`&;pV^8IgGMiG(wgtC+D zg+-f%;u{Z{8|J~IomSTA>Z0X@NG`nVMLxVkXQ#anLm7VO zxFNA|AJ95|!*y%rS8tc{hlLQ;-_&;Q^L1FjQHMZ z?Qc^8-0!w+*TIHw>2hno4MoI@Rh#3VPL=p)QNJk;=Gx0P;LtRyleQ@1rSF@3SCRG3 zrp@JOHi)2%VX?NPc(2kD;oCEdS-CMw^lh?m!A5u6ZX(VJj)OS1r9-8Hu`1t*;&-ZA zUVGKt&Z|Z}lr2Z?PD>Q@WnASc9=*m)Lzs`ouwW9AbuY3 zE0>A)eo$vHGu(aqLC+1X?csC7U8XUM>;3~|`$5RYXL!+>Sd$f+$#C(d|MjmGLtc5k z8|`>LV&1w<=|U@|`#wXPoe`*-Q<~DTpHI5I6k~;K7n?~$GJnTKi{r%d$#G7rUYuMy zo3Hwkgw=p0Wr>;?gVFh#TsA?*LU}K%aQq z8Izf`>2=0XH=%^WDb-wE$$cx5yq2rBo2gUB^W%p#^@4e2L(mX`?Fwz3QG-m%x}BOp zvWAIVj-@ft*ctdr2%eF4Mm4nGjK0);r1`MqAllkKSWiQ=Hqxy@J2ka(O+|EVd3Nq6 za&*ZW2dQ`N>^!gj=NXlLtJ_0b0lBtgI+p7Up|Z{SLkHBJiZ|}KQJ)ji@$cSW4(1-F?6cbGtZ?W@;WuveAb#0G?M&I0{7>(ch8v4^z^DLVOc z_AG&O{vnQg_@U+zqRc0W;ce6TstPhe^e;H2R1&S4-j*RHP>~%fG=8+Q@AJbrf$Q5B z3purRF6Av3jpA}aH#atSu3dRV{-BLgEG^Vcp~1=&vZSw4vsxVbLSrz<={1CY3{$LM zDNqjs@3%FCBw8+pLXneRL9}d+1@U&2)+qpExV9gWik-EH!l>&i>GsC~T@mH0mRFZa z2oUz!e&4~;kHsEwUrfBC8Bbfc`Qh?lyBZ+i>LQA^?#^b2s+6yar@m;FIDN(VH>%H2 z=Eh*`xMf>e#Q;*(V5d>Lpg}s=qt~%Q8pi1=1D#ykLO9Q0i_&z2=9?Ep$&PI8TbWsd zBZ}7G@4x37^Lg$nKR=LZFX8b0QiGO;65AXbw79U~YoWz1fNx+f_KeUZ40QF@@nt2P z0|^&O?lIDcE~i`MQ1`2h<(DxL<5CnTAL81+HBu|s{tTueWW8nFQ8*yCESzA7_z}CH zwLJtY9p{kG`Jz|ai1p{(7o|eyEkx?@kBJ{ivz*A73Ht-2phnuk0onLoo^9 zk!Gg~uQ{tv1RG#3TfWN7>cZ#zjQJ23*I``8=%SzgH zWAJ*Pi+Z-&B6-bGJ!FXVaD|%md>-W2({}w?wc0PWA2wbTrxE>VUMbnrK_YeJ&Encs zZ_%6>?8W5Z*X?6BmWgRQ9NIiAp@6NnEBHjVN?5!|P<0%OhW_)HBF^HfeVx(VM30dx zqAfIp8in<3hzP7HEMNP5e)RFe=F@*q6;)`1=Q?=#5rmq@sF9^`hD7Qx%iLXz6d@as zMTIW(rVk;sIy-*rS%8ngY!?5-Qb|$sOCn^EZ>ZRwxDmjSwU7Pku!%P!=bR4U~6_Le8N;nWWApo?BBW9SbE%~6CbF| z9=)EVd4Tt6rvBr0;8?d)_cBcPtFZgp?J>}JWkqQG$0V&L$_&`mUqjpyeS$#-Nw`+e zMW++i+0#PeSw$0U9-B^SEqAV%q7w-ihAj}H%Y&lb`U zx(vdveXnhunF@*FZa}c+*}(5vx(Ioo9mb#HuO1O28ntL%V_J{ z=cBb)jrp~k2(gQdJY>Cz<0@c>G(TzQ=b>+m9wGR)5<)t^du5glzw1BOMUJSz8?!Hg zUC=3vYw$zMneko1JnMIe(JgH&1&LE<43cnXN5|cEhLxR>DiLM|e|eLF6oq2mFn&5b z_JMd74lAkBw6Z!9G(kxBHXPG(S6auTR>oxtuhoDQbN?DAEl5$NCFa$1?&s<4D~6Y@ z%;V7@t8;aW=Qg&Kqq&U*vJE(pw{uRC3;WxkwNXc739dxm$9mJkF)vTF41$!n4hxJ+ zQ3FI-J9;KkYL;OGl2GwqJeb>O?4 zkrT1Jkr+|E4@Lj3q|SZB?^_X@bbB8wm5!Q}g%T&G=4aDyxDt-}#aewSki~xQk(n3H!=nGB@U~^dx31i?Z>R=%99m&@=)vaZ&Wsg@?OMb_Y_wuK4Su;E)_`6Cgf^{XHAFu$N1yBfK~Vd4A>K zmjG8#E;W$5&>zvgqFeq!$`7&y^y8d^$2P;iamCzMXPf`~K?pOQk>?^fK*<&VY|VUm@E z6OKYo7o0>@-`iP>@|_%kdGOSLlp#*fl^kSg$KySRxPpT)3|2O>w+Nf?`&k4Fa~0A^ zZ!8sX^3seq5!tO#PI) zmVU>Yy;|F$?4{{WT)lG)v%&2d^|jP4R2k|FPGXk3RK@P`Tv8!V^$HbcXKKzdL=szsfWw*JT_&A}_8YtbNB&2DQSQf z?7bt~Db@8*w0y}E(&vukmdC%kTSEU#jAgwRA^ofLUK!dJJ%2V zOPn6bH|ir|h3-Z#=GY93->ZJ9kUQ~b%R)`wwndbHy+Pc&P_paJMOCdyd&b z=*M{TmBRfKw6xZ|!serU6Q+ZcyLxT>g(cF@K8mmA(=dy4_X8J0nmgI>j(S>t1lezG zqElS8W}SrD8`$nxqIexv$4$M1m~VxAQ`d(AuJ}*+`o3J)$W^#hM|~clo4U}vFXOvA z%AVSp9dSXifx&ETfG=#pCQOjV=*pD(@WuILz@aiE?tVF2-m#QxN&yFfgmY0t&`)+6 zH8nKi%HpgVX=utN=oL}q$UXV52xUhDaZ+KBqlD{bR%?w%8x#>;J_8%|tugH9k%b7q z7~x$ySqT#V0gEnXZq5@id{H6u)X`5(AK=`+e&Ra7##07i627x%c_GsY^BJ{}YZisY zF0X6!jb_rG%kVm}JbAm&dKZ3hK$lrSeN11I-D?>bQc=$M&fXLR#;DI?bo2SSHF!hf zpCnQQPI$lm4$^ByUb+;PG(Ew;YSSpj`AGg#!fp@MwgGvgjsOd11$v8-@y+Y!_7UI0 zo4eEdI!t7_O4h~-jXhSEy2;nCw@!;*c;1XXll{(V9u5Cl7Jn8KChFLQY%i7n#j>4o zSOT`SzMH^|PHTXKhTXj*R!sfs;9yJ4>wuTUdnK#mD!C|Tm)%IH3w2H3@LfQaNeP1q zTmcj7h6>A+n5?P`iY#a8v4j5cdx2|@L4E1*-*Bcj^n0tlh^4B!47$K=1QL;Wgr9K)JB!OVCVc~au zvC`liIU!=u9fB*ink$~(@y_CNZe6YXHfb366Rn8(G%A)xF@$>62 zBCN>Uv*XpxV{$4k23hVFIvACjaAiR{V}}xh3C26*FO-|XGNaRYdwuAF19L*2o^4^L zOeYRLk;1e#9G&#I6YMLM!MwpHJk06m!gj&&FFswTxpsd+!xgdDalVOgn1uM51cu9+ zXMiP`2n5uR^;J2Pzngup%r=i>HPlfB+t{fxa?du?`#{(#%5t0J9pLSlsQq3@3>IdE zqcTaD&PcJxWZx$R`OKfu57EY!pudeoP|kX7f4A;)+M-p1oo*lN&;I4MuU_P>Uxv;X zjfSHW=#q5?=)q)N#^SaFL;o`N!d(lE5(aLmv(HH@_R4pJTz^+O5q&7;j_cEF7*~-T zn_-xM2GNt0B`pie0xZ$MX3cgOOiaHj8lwu2R)MbzOC2Vf_xGS0KKrf`*7=_Rw4h-I zKnv<}viwjRD;9{Mje!x1tCcMPJ%B)hBCfU&sD+Uum4T6onY9qjNlOO}m6@RsjT*Nc zo1CqgL&C@bYHw!iXl7$g z^+Xe5VB_Q{L_-7Ir~3Q)tZe1v{z2Z_;cr|3_`&K5v1MgvVPmzjV*S@A930;`14RC| zp#SX?4$1&R!>VZHVB=&DHG1Q0WbOF;Ur883|M9%7lfC7i?HEE?jVz6ofeC6OaG&bPk z1hX6Ra{db`X=?{Zh&9yci4;Jb#SEas%L`$H@UXElv+)>nF>`UU88Cx6pa#rbM%>1{ zY!EQmn49ZgNW8Z<1EdmS`LC;bB4r4W0;m`n8}dS!d7|8Cx-KjeUKKS;b39==g0?3h@&y^0H6bA z)`m7N4*$HRY-VMon1hdtg9FS1=4R*S`R626BYOux7N4lHv$1e;{JHaV zF#N!F0MoH*~Z3Fh~{ZgR8LR-#ti-Q;4;R5nw<5Ca`}WH~ZfS11CF} zot>SB*$~3c$IQiH#QP)+hRmEs5CaZ2P6Iv&JMX_!cd#*bbb;6#iJ1U=1b77q=pSBD zy_7Yxc5;37@3UP@jh;>cU>GwS2Qvq+G8@1xfM;Bczy-iC*8lk}au^#MLwWdkm^mO^ zP-ZS(LpEkGAfU`#d>mjd10Ev|UJmYmU-bX~7XK!V|A$Qi`}~Jgfd9TdLDnau`1b=9 zWc~jf`Ck+M#fk!K`D+ZY&VaFJ{fD*x8^50H>i^*9Z=&`;_y&OVe_!$+@%O*%`Y*fw zBM$sWlm9DS|7F*I#DV{4@_(i4{~5bb|CuiuSpz|y3y=*~S|)n{nIxjYJ4uN@IVI>u zyu}B&La~+7Z~%eO@Sc8QKq+ZNz#x*NwA>q{9XMoc4ze$^t_L6x6-Zh_OxbnuXvNKy zOfC83?4-!tD#2>VnV>qhH}YsuQSF@}dkL zh&Ye6EPqZb)O_?tLPCO0KD*Ro=}IVIWd(VIsgfS%NR)8?Mn4kH7#72~M2U4%d%|Vl zQ4i*6bA!1kqHHLY=e{*vOo#*^NtiPIR6loynFE^7dI9o&PcsZrM1Mcl5x3mJug`R% zuFI|)@%Jgx+LIBH(9r-NZgSs?3OoI43H?{L6t;+L?+Vm_HAqMdQ~Ih4z(EN>JFu_T zrP4KVo<44`3S@8jD0V^3Un?2^j1-xI3}lhMBGzWVaQOQGY?!aotJ_k|C-OAepdatk zk;!sEf2d0IKL;g?bKS|Hp@;riKP0|nz<}gy;nb@?vo~>kr?Y zjd{#g=!twOp^80p6YeN4FE=1Zgb-mGawG>m^9@$c)I$)9X6o_2baHW-*xTD9P78kh z0yl&gUhK4nhp2<*N7i)twSuV^iUy*&N>qv- zbPULi*Wbf*);)D#aFRny>*zt5=>F>&h8#B{IyyQ9`=!AzK{&|_BL0l@-#r?vmgi1-fm$|PkD=X7A zk;rAMOMo-*10g%@4coI|Oz!`}gl5X{g;zw7Z?Z>BkJyt<{qXi!2bcIpY~Ix|I&Hs^ z(EYh-bd)(aH`n0o;?e=hrbEV204Y8MRwD$mqZ<%|0v-4IM?n~!=wE~}B|_WicrXR+ zJE_<{1X8`gp;W4Yjc!$i(Icr~wXm@fK>+I%=t%sC78?w0Z*PBmU6UU&?FlmQGw~zu z6z_}`6=5rVr&i5|362D90~!U5nfpPkPk$B~;}`44qo2Z}qMKf% zygx5XcYf{anS9Vp;!R7#(cF-ySR}xiJle6R96W6d!tIS%ysgv@U_aW=p-9WvX4WYF=q>}oF zRYV?$(JxYV1T(Sc@sKDQ-ufY7fdsk)#m^-#BlnVi&vD`X@^l1I*v7#|`|EH~zzp8q zoST3uX7&hhhD!L5{e2Kui2(l3)a1-)0~w$gFTF;3k^6Cr0l1{x2|LqpvAA$zCK>Kimwx$M%)2 z$|pGTEuY}vXXD)ccg(g$@}H(FHQGe0>Try7Io7eXF?CR*TA353Mr!PzcGadQyg-F}WU@Cs{q#`s`d)p5~pkA?(%&_2R zx0c>DfC?_6h`#-t$4nG-iil*ATs{5{O&EQ0R8cxyM=ValQ}BlH3;OqUC}%=R)wm7H z5niLw@WY87XN2ke%(q6!Qlz_Z|Ig%4f)%5N4O zlF`U891RW`*2&gCUbjXjtP6cRwjDa}64}>zOBQRG5(bY+7HkCDBu! zuV$u`_LcIRzYP&ociU~1k%4Hvw7AzUELgb&gOo>bZE2~c>+1eJIP#q2OK#SB`9Zs; ziPDevDh@sE#L)M2=(_T8p!BINhOeDQEYvksj{1k68>@U6a=sW}6bS zdgXDu=7V&ObT~O?j?E;5C`Wwdr_b%c$zV2t=3uIg^3YZswtS$tQh~Ip$4K9llatew zl?8c=4L=pZE*=mN;6X}CdX+n6R>u9JI0siKoHMyaXyTUabj+ZkZk7eHT|i}GrH@eW zQ24YHZpxu)*>TP(H83#nk`#J5J2!Wd&gA6E5NB76Ks8la3+Dq*L9K}=@pHi?xr+ly z9BDpYf{%dynQfVPHn*_5A7kYu53Do$PLH@zOGYKK`fIL38I+xz5~Om(RW<$SO4RGu zO;|MXGUqTj1aLAn;<8m49GSX@|Gl-FK`B_+?1VGrC^p`Fea zM|9B96Tb`@+V5?-Rc@X-Ix81v{Pa!QEThIXOT|Z;PEJnbVzuh#(t$xiR=`Q~FmN&1 zG0aWAI<#LWeYU2xCaiLNdvm@sVQOyfURHNWHeg4fVXHsO3o*KF9X87}E{mmW37W6jM41qC!h)sdT? zyvY7&163JE^dt!y-2D9f@|gbmLI{@+(P9RJcR$x(_wx%JA}5khZmo#$b6 zv%fIEX+JqWmcRJ*tL%llMm?+)5%lNGS`5FZ_Fch}=B-QQ=DOReJ9P94kQ48EqmhK- zYoVe~9CWxL6G&pGeyGnL$6?_TQ~i#!y-$j-y({Qb7@T2jX`JNI-iA#@;Cd#3uXj5a z&;91$9MF)3VKGasAKsPTRO30fOB0(7xME?2*Ptzc=R zXiK^2nzPo=KBxiGmXopLRSzhZhEZBt8iPpv+jUoTiby^bB-$KG{%hM1<5xc`FT260 zLQTGb-k7eDro}5IfF@j?JU-_X*2s8sbXjf&v*=4pl;EIWtfNNAToIU&ks-F;@CKgQ zNT(#HtjvmEfmJhW%_n{nj7QY91OYk_8FcEWAaq(S{su+m}a6HT_ACbnXh;D9oLY&SX0e z$_&5g;uT;9C6WR*WYN*sZge)5i^de|@BK zt&ET7Z5H|LpKYzxVbWk~_xA%oLN*Tl zJoICSY@i7+*W!8UIDwG<^VX}9=E$)p?gm1xm7t>w(D^Y8adGhzs$r87)#4nb=(@|o zp>M{rd5U@=K}+=!Q!W%%Wo_N(t(m>7eadeUs5XrW5-^$0yJ|TuPTW1bsjk^1LQ*JZ zbtSlX&fv2*EOIc^NQs@}VY~zDcyR)wChhmA$}(97Doc#B@y8_tb(ljR<;8bV=RoVt z$J}SX7)(i_qd%+b;zEhMx4`4g*Fny&b#ZI!>SjDLuEe3EYD8&a-B&+NrDnFUaVaqUh4R(e}6e`PhCpW*byx{G9M^~=h-^{slel@y}n3|>7< z4}iQ{$6*e9NefT4=lI)9-;35i5HIww)uo-Wk8@JO zyOGKBNvUb0CiEVe>|7bzv?yv&2tFtJLAU+#TzY!C3G63KQrB-+_X6K37tb(7WwGHC zNulE<{uY;WKp@Ci-2CYsUF=EKthX6@i|eS<%9h<1-7;m#Jmax+frhO1c5iZ9<9K)n zdUXq*RGGX;Wnz5a@HxATXKImnT}7GQU6THAC_6iF6$sln7I#(EeX?dJOTu z1y2cQ>?eW4`z3htT4n7{aH6G?=sXiT-v?;VR^Pag$f~krpIw@trqJc~_O^|d#Y9f!0dUIO9bR3g)SSS_KrR6eVlE1mOb?R^?U!5+a*7bFl371$xqs+!fylh z`W}6j-9;6PrY*|q^a`sFjD1H4nKd12i%$!?28cT+UI`HzWU?C@(Zx0u3$hu2`8PD+9#R(ui;`yU8L>lC6VTJVi#qg9Um_Iz35E5{H zAx6y3*N{np*Wj0>h#pclHp;-`r%6$-WWbr@gQz=`l_e~3wz@2==|iRK5cS!`%c>WZ zw74Pua7572h&@O5HL*t_7MQ_{y(w1eVGo8Gz*N2KVG~?(T7d=y1(5=3z0+9Ug6&Fp z3bi;|C%Sx0Bqt{~DI)1mXNc$LK=wa)CD^fxJ+sulbak)y$JB0p3Uc$h}B1q_)U zF;t+0@*3q-O$^)dhka9GQ@NI&o}SOggJ!e{b{kqv-}54NPswhgbGi5`o|(mNZwv_` zs`vV1%!hZgJzU$bjlHHhG{~jEHc=kJ3D{dbKU$or6}oTevNNKzs+{R-gq6z87*fAe z?Jm0(uS_X)yJ-Mfa}?8CDZ1DNzz?&aYE$!51pYdqtv^*IhN9jds<7UigzoqPCT$E+ zSm*mTsc+OxyU#84!_mU^gqMW4vT%mf3tQOjA&~GJ zTO8F%g#Cyo@$wW*9eXHT94Y4KFVaKDx0nmWAkC=AyKQf4yMHE=nQR?ZcS#w+{MNt}Oam9{1O`B}kt ztpg`Nd}A5{D>fccuxJ&vMq`>D#j#jp^1kOC>~IO1wMHBmol$qNvgPZgeyjbjE{xvL zE8pq4IUir#z!M^9`{d%{@BJRG!-wAOu~e6v_D6P$BR7eI?PmwwfL&}h=K$7EPd0GF zr{Jw#)HNVtQnTPw6rx(ZziVjd3w>AEkgUmQ3W)g2JPh)?0QP*L)G_a}uWv2hzn}PW za{K7w>gpQ9zMV*`Lj)Br=a{7^K%@jcZ^BLoI}1mqr5^B|M}UyaOHbIL7f;L5>u#+P194dDi^uGepz1kig*Lg!mO9`0^9L%pfM z(nu0AB%7|xXOzs*Of!l4Z9I){$rhDODYvomu|a=pYRuUB4`h#J6;*UWrX) zN#-uJwwQoo(xJWscc3-mTG&8cuc?i_%_${)%nrLGr_U!bnYt?d3keMoXOayy&b!$> z6`N3nuqJ)S%>s3 zqosxujDxuf$^*xqtdrZ5`q@=Lsk}>`Jfh$z)i9qrGMU(M^$;hm%`?yN3r{AP@#n*J zL{^7IwEH)%1oP<2qC~oHuq}I>9H7GaFE?6~P1|B();IBG^Fly$qBJqC3by1s0eAJm zK`K=}mFSbN13&R-&ys&XVYq+2&P;20&i>s=rawC`Z!1-_%0iw@E7D2BJbuT`$Eu8c zgzIxdZGC;a(a~a^7zVzUlcT+z;Kc3Q5H#saEG(=w-FKhrW*;ORBX)9p$2cicqs2Y(olmMu68D3^2qHnhaIO4csf zN#`m%CWOd5uL`gtS^Le+%>;2p)T<i40KZ|B1c5iuKWDff`W zhNu4YOP6B9ZPj4y>hZ(68o`t;zqYVUA8a%bZ7UN6mi1XGjsAXxfcWWvY~WSBoeRrp ze37z?0H7?GJ*Ne6!h+|1z?ROBn-9uYxK*uZCPSPIu;H%~9D-&e%`SdEmgL3qLi@vO zLeqzUtmIsVER21-K;pS5YSaVyj#KAsk#4`HyOvT3x-D5!U*{`*a~Go7FuZYA!24#t zgD|FD!D#vF862so-x4_pC+7T`+5$WU4as&rde0|O`u!Us-k^OL>4K^Ea0o7Ygq)V|Z zvfc^f8lgJJ&e_GexXOikRPyml+o3XdU_S%3lkt&Q2aAdD05yX{(GhhZc_8r*6a0#9%1Bne8 zmMg;X`Odw z@@y1`D@=f~+Z~rI)g>o6ij5l=j zO|oo%#Rf-VBxz+t*fy?)291I|0 zdW_CJqT82~jg5=QqS@=4$N(tNfeH4zV=UVaRs~Oh)F4M?@LkYa?`G|IJ4C>s(%PL) z1_tWL1@~Z>{Pgni;7D$rAX55})919J(%G?nQ*MyIrjxkiUHWwdaXZl#lNHPV3rYEw zUGZd2LvmT2&&KV;7`Ha!i~@}7IMI2#rois;@v#Jei7#u~O!07Yrz2XX6dRS+AsLrB zgv<^~!4A}%9LOEsx;rH@k~nh*z1;A8RrzsuOrw2+@i}AKZD+*CjbG?kD?#kgOrz&1 z=2v+rJL#R4_ZiA+AlP-V{6ZiE2m|Hd#+hwh#BVQ;TD)7~q5=FQr|6XAIlgnL`9QW0N~R3=qKG6vgnPC4XF8@eKFzLsqp6QgU^gRwX$S^ zAX+Oc5C_#0V6EDvLFszlAorXm6=^@ErpxkSkE1Y~etd0;5nnjqDUs;YG9|eV_iJG( z?ttq@L<<{;zP^CCIGhn*Ilw$>BzNJ(VB;;t?welz!=-6ix*C|5TyAwNi6i9B#T^EL zdidDa%0DnF51J+CetzQWf0-mwyX3X@STOVfduH;L)gaNi>e>}6AZcXW#4I1#w|8IZ z0t>;@=bu#er%2k@D)`>1+;XJeLe_|^E(%dP5|-pr*_`>f5&v;R94z07lS%0@F|f)l zC$X832m!F*PYz}03glSHlO*R^b(bkLmv!cGp!W5d383`iP6LZ={&-~BW`054_U*hi zj9yv;;K#PZ?-(}pM8E}S&blh(%Y8mzw+ekaA$Zdlnn||8vt$$JYf0l7BeE)F8gaJ5 z-_EN-OHm+U(ZTgbwizL=P!&UI{?&4ig6$|H+aWG)gEfX292DK%=_iT2XEI0nUex8-<0-x8HmBMu1ZwKoT3-#2;TuexVZ^8?p(`x%4g7>+lA>1aF+N)j$B7b*lgu z4WQtGs2O39nP6!v1(w8H>xi|A;+)tep-wfOIiazudzA%C9?qd*UM^x($lFYOM~1j6 z;}>)r;s%(L=<*tDE>n+XCZ-P`z%W44{c;CtSiCX^Rh-y3Ng zp5`eXIe$ruGWQx$kP7f7KMjO+X+pj39rOW0GH95($}h;;m81?8AmQ9ViBBdyOl&52 zXpHDQ5x_~X7A!ACEH1oN$jhu?*hHsG?%+==*^NnU6YDN9fl5c(kE^wZp%0iAN1e(n zIk3?o-07y8OKzPgY=X###5+J9yU_|~F@eMq9GUm!MGK{-&GmfqKg}8j2{8veF^@M|Zn(?s#PIK0#M!4{99l@0YuxTSF-ASzMa$c#ImoHgsdqjI(VI zHvM$I)w$O>3hPhvYK*jBI|fZE>D`kvZy>~(F6B3UG$Qpzh#uKu07`-oMS%~0?*%CH zl2IwgTvSYHP>s_@(VMI9NSlpvFFZW&@PoPltRP)?6tL4)q{y?Kksc?)~2-bs_p zvlNI#)Fvc)0cke}|u`WULhtO0Jr`taaDOL6_drKNmHsZ+eF%ZU+h0)T+&We#=t z2CnWYRPxTa!QkuT{QUgO>n5er#Fp|~xa^`~tFkx^CuQ?ig_fzL#Z2Ter0pa=`uCeQv>UoBt@<-4s+u2(tr(uf;i)A00AZZrsszpW11%kmmxC(Dj)W z-S9b)#tu~B&LzdZs`{?#_)8~QbPOo>Lxr`CO(s4PB?3ZLf6~FXJ;zn}B?+3z4_)U? zv8KV<)4pX|4aX=wr*d(^OlEmIZkgp(1|^X)WBf<8QyCz0Z<f_*!P_W1h<5MjFjW%^ZRv@I3#c+Gm} zqeY+&eq^_lr@Cd|w0!x;L(M#QzqN6V-aS&jfr}=jPtyaHQl*$TBz-&wYBk18QJl99 zTcP8me)ZsMb>cN!z{krEb3tXg`0yh)OKWBcaDDZ|n+7#+i(gYZcUGV++d#9#L zW!b4+x~-89EMUWT#q?QDO;6X7HA0G4kN}OA1lkL5uUl|=T*wD*GL;$PhYdNR=A>d& zB=ZthlwNPP(pXr;HO}_cGi%kO7lqeBsw-Sqh}5{SdT`(^$Pnk^Y<3j@xqJ~FYSQAa zbGJFAEt+$zv2MMtS=tugO94ewnSV66z652)-cti0181 z=NSS;5A&z-ZIvO4X!XhSV=ap)mK~VUOc9^Ao)d&~pPg4E^UZ}QC@3C~Cx4LSfrmA3 zYk)vV(@i6vpP}w9RcZLpVL)Y9U1s5Ag#oZT<_hnpNvp6&P|(?9D`kyVU6OnJKAsy% zSTH@~IAowoIohXK*X%x(={}8W4Dn6$a60f9XygM zSdRpWA0s?tIsG|_bG)(Pyb8A9@aTICwgb*Bq85$-Q>&;vqVX`Bl)b{8998_OFIZ)D zb8)wzZZ;+`XsE&dRvkgi7U>Ngwx)%i-Z<1&r=jKJ7{w9*0<0Ek$4mjW_1VP+9Jyu% znVwxJV9q0EbOC^`$f*2a^-YZU41j(WNs#ssozLQWSGYex`7_2m32Gp;PU0m^1i+^* zNIW@TBMHuT5wq9T0K_+eOPluigzyn@UZzF0S&&_pCy)E#k0;{D)d^@tO{b_T>(tGb zGwuMeGS9Ee%ZIAq6PwZ>L%T;uM@XSw*Uq%DL&{B&U7EMsxZ|5|Rg4CWYv$neh{e6` zd@^>%O13$QBV{5wUJ@aCD;atTbe*?0#GQkmkPk#%rNfh%e7RJL4*=+_oT?gr#%4^N zlq`6qmlrPpxZN?oj3|{(X^Ek`oBYKU3`<1s$hwZM#q`nNqu9)e2{}7CuQ2@+ppDp4 zfM5=NDWv!WAjYJxPRvK&AaHF)!@=6VL5V1Nd^u24o|Chwo&BmT%nCbSCH^^pi7jY) z=!B$Bz?ZAHy4oql6Dk4bF@b&Cgx2zM48Y@ZhR^O-R#qY)MBY&}iKvyc56Vwx9zo&< z^=(SBWpSElAZQEn8^I+ba;}4QWv=`SHIpH0#@wlG3gYkRVtH5tLE z4h0o&vH7oGPo38{6qn}V;NaGZwqXH=%JC+UkXGbfdzL*16y8cpYboiiPA}Sz@|^3m zFaS`80?@8he6^Fl9_A&JtgGOC37THg>CFiG<)!hoe zh@lU&=dB}~#Qvcc#2G*%Kv!26V~BAA<17@gNh~T`gnHuZW1>Y$((NNaRZ7L-1}HqJ zmI0v?)o~1?Do2de9Uu>!GB>&t=i5S8%MKk#35m8R+A%|h6pBwW!I=0`;m&gXnXI}x z)NF!Rn=G>b8!=W3e~{_C3f>JKfK#S;|4dZ(KTdNfpU0Un=DGHz+-B zn|-!(Kw-!S5N$$&YB``4CIqNwkq?qU$62=Q^usmEIA$|?pEVbt+diAb&U>S7LV909 zNtZS|5spRndt<4C4rYU_RN7w$F%2m#r69&8#9cUpZuq7#hmPtcRNhF> zE{*^#W$njqt4?QefmqGux9A^C%B(PYY_r(6OM$wrif9-+ZItn{N%&2^`A^8fzE5x1 zv-Y-+Z$+Qme%f)<`BbjNnE{+$0$>7!iFuPc)VsG?PSqep?Gxv%Eq-gH&|}z)(JlLl zrgDL5c{x-tJ+i+Vdp%)+$N~_;X+9|r+LjRRE@BPkXhoOx=IIn2#Z&(Wf5ySry|WZc zm4a7SJNy_t11bQwQ(9ECcK~SB2_4Cq!ngNCll+Dz>K2m6SN4?Kx)w(TPX?6RLGP@a ziP{<2UFq6xH)=jgY^S|@oKwFs{fr#y$?o!{3b#iX3(c}yxDcJ(*Q2|bBjd;``pQV71Rd>qdbs< zC;aWq($Z}q5FLTqb>a!flOmXzne~+LDRhALq(oV|wPzhdOh#SPVSu%uuUW91Nw;{i z|4(*BDo^pGa&}eX7v|B!2cA?f*(a_uYJZ6@v^acOsnul(LlNeWy}WzE$BfA@Pn~kl zpmz!h>0dp8sfQ6@-&RL2qb17;feSM`i~2d@n>e8G+fLsEkC{!qVBp7(dcYsP4b`3p zir+_o-)VO(HJ_A`Go-8_iw+pRA)h!OM^aT?F!ET`yv+wH?P=z=-V2t_S`6{-K*1su z_h3aNALv2jNS2)`!!89_&lEef{8=Wi-LmXn5ual9z319vJCHEuCL}d(2$Pz^M8bQ( zDvbAo`kN)D<|!zVXgI^>E2#I&z|_{mP6qEtNZ9PdF(hg<$LRJWMR3RLx$|T*h1;kx z&BMNf$N4R+UcpEK#pgO&3hN%%%uJwbqTy(*OTb z^T^*7WG_b)SOLVQK&?t(9NMuj9hJMxb7y~0wMc_GQJoWgX_f)2us^*?KHyt#m z140sJemGCM-=8ExzaPWWM-Oz6cyTAl0S;Mv_x3^3*9B%G>fB|=mvs!-H3on(+yn6; zHcrt6UPmuQG?+?V?Z?i^2+)=!bKlM`OR8OtsM`V57&!V{iRbw+^_qy)k8dAZ^1GLc z&v5BueTCcv0HDp z9*X$=C$2Ean{)kjUS(Ps=#VgE=)KW=tPLF{^p)Xi_FT6*-yS;$NQu?e(qQ;jz;!U# zohMKsmp>(KrL#YuV#p<+ZUjUg6TSH;Pw8D%+#+2F zQNnVtW{3B^?~Ypst!7~vb}S9Z&(sTLoe@CL5`i?M0kC#(X>xmbe1fRjKsyB%ul2I4 z1i`KbGHtN*p7gnI6_y>$=`-~?gWke z=shQZJzp*6khk8_;4bwUJL)u8iB#;ngiW0E93pgL$fuh)*DR~sA%c#x^^Z2pW*Ct6lWa{ldXrz%ZHhCs|t@(dcKeZ$Hak5R;_4 zUU*--y?EZAgyi?XiaGN~sP_Ml&k~cZ5hXjRNM+xKteGT4s7P75V~ZlLJ$uR(qJg#sXw*8)0)$}SX*3}Eu ze7a&RxH#%YQqNWROtQ+KGNjYl2Z9YEgTEH7XlqK99Bd+(*Tm+X%TBtg!zEDxIuC!= ztK;-@F>8tr374R&mrfiJ6(~bgW$#pS*>3vKGLVX zhEo0ND!#MQ3)X50j$C0!xv{v%?;X^4X>q`P8GG)%<@^4!)ZV?2d8A?VaO&Ynj|o-j z4usV9>D^;MB^1tBY5$2dickB+Ulb%@_?V_9po`Kc6(VLiFBI*LDidLgLdV4`C$1Vj zm^d=Go`O6D)aNnH(|ynS=%c0&+kCHLSRr|VLRX%{ z3V(m_(C+x2D5X1w7sTJEtuw3JHb?WweS(5!n6mz1h*^kSkh$UOW2Ck+kk^BBzTM6( zXQ3=OG|2VmhX*8NKX739k1$c_qcymIR$=&aSIbiAcCatL+%lh{{qmJoItqROPh5Pf zz+wN4|EWiJ)w%x3_p)OyA9{uPGXXCNFWv#Kj|*{#9R#TUErqZBH7a*+1XtOoW0ev_>R=0Wi2DcY4VfNkX zrF0p4NZtDhoiDFTdiTRVEu+A8{Q=k+d?6*hJ@6_3v5k!l6LLy<5mAhrFl+AYfPxg( zgN#LcW7*hpDsPRHRlXlC(=|iwoa}LMp#=n8$hQXIU)`lB;6ld43Jaf-%lu&a37EyU za}PMW)24z6JSjQB5%x8YdF_fW@DQwms)Cfrs;1!!J~#FbL1JDi1G_+fb7Ny{U#ASY z_Gh`&@7Ld}Lm*PhkPE@5Rx-=Z_Fd39k{re>Q^*fj@nwcFs zn$X4v`>0yckA0h znL?7xA2Rb+{o%6=DS)0WfS0{-U*op`Wf`UZrYtc4c+m~iT-QwX-QBopcfoDZ&FT|v z^2IYOyoDvg2ti4_Vb%iZV2u;Y8DOC(MZ_J(fn>MJ=ZmTf)}m$CZ*XtNsVYm6Q=S|f zih8*0Z|kg>R%hxROP}ZY;;BxnE`^wL4vC~8GF*G(}dk~gr$J9u% z3BG(Kvb9;c+wB>XQ072ipIe#CY}&!?R0TkdpUZ^2>*U+ZO^`fg9|5TH_+o){a>thL z;B{C)t(W8lz8>ZEB8ED4#ojzl(az?rZKBnh8Gdc*bK8#3Q>u6zbMw|M{~i33QoscC zY`ilN*?Bk2*X`%ZhPDGCzsKf1co=D5Y3j;52DB*;2_V`#V=?aP`1YCe&Q$LrqEh&c zs-hP!CPzT@OzfD6>6&q;XM0Yc+uL4+>lBoFa*tg7f{^jN4s`zXhbSHD{V>KIK3NGS zA+XnXkER=9y*xbR2L}h!*^^hAG-Zwcp(#!{+u;_@CKGdW9eM%KLr=I-+@uZ35xVPmhnoecuZwGSw z2v%X&7645JzmMnVh0Nx8@+i?Cf?`Z#bgSh5*Jf0pU}oC^gEeeak(ik zq@DKu5$n*I;@0F??r_!lV@-8+j4tTrMgt0b5(wnWm6errmftGlF+g`o9Zj`bzq4^q zcrDC@6MAxPJFzvw3O@~P2293MtpeR{h$K*MnPm`98u>r@9L zrc;>e1J@t-(L^(Q0E=w2s8KaiR@j96W$;vKM=pw^`&?)&172HWfOgn~k(}as5SkSt z5d_PO*a``&+NztV_5@e0cZ=Pp7yRGE1?2R9qp+-fsEDc!e0%)|Cc0jT7tstve+cqI*BYKhO)^GlS;Oil#x#y&c82b&lrW{JGNA z`m}WM!y!A_r&y%W3Hvm#@)hM36$LMwnR!pl+`^YI-Az3Uq><_$E0~E>{j}1hF zT%)hLe~3KEYKE%IN}LpNraCsxV%y}Vp=5%BiLoDM$$6M1h-1$lCZ<`I*fgqv3xC2- zyTvV3nw6%|T?as^PJdrt-?!=?1;L8WRR4(-T&v?FzR@Esmd?XVn|CN3^px?;dm%A>3E{}%x77zM7ED$|~IGD+*VkNzxj@aiJhhgxAYcu#f!|h}0(EvEnTwYT)~wT-1JP z)swG4j#j+xG`qOC=xpU4u*}x*eiX*PEJA#Kf2?5?AyJE)tYw3`&44RlYAcMKf(5l* z%8jN*nj)vP6cS_6Mu_AAgFSyyvB6TPS!v{?-o(p$+jE)5UaJ*TxCY~cT>InO4hG}< z=OjfeDB5a5B2%w3%R9nutbOv~dI{y$n8oI#s?f*3it5_9X^#B1s`f4HNNP|+laA)>(e z;>HN+M=fjEe=U0uT~G~MFaorSb?eQ4a(i~SrCb^oq{B65$~4o1v5#Q8yolRk!(yLb zzc>7I*%%e)3z|d4EyWtJu2^(71>7vn%B`a!Tc2;g8FrkQ>}{x~*RA)i8Yb?%@Km>z zw+MTCCR7-gn@Igv`kAFBI&cbih~gQh8pd4gG2}Hoy239gSTAD4bI!hrS7L|IL4L&7 zUwxXs6!!=lOPv!d5wW5WkbNa5v-D5M9^Ni)rdmCrj0=s^**~{OCPiv5qHE+x)`O$( zq9fuh-9DV*DKCTDrtZfml;o!Y=iz|!^t5#1Cb-YzTru|FO!Nemg$HitrI_WK=hfpuqKC1*oL5rsu^xD1{Fy!z{yc4(xD5Pf3bjY{31c{1fGd>l;J^n|Y=&3!0WfAyI1K7oG03ta_n|V}Ed?E1{hMdwPG&_EdMUeO_ zA~JHo2l2k4S{xo^i?Yz%dfZ>E$eJiWtyf(hI!4nHL)x6z1u;Ik#9!%P+A-Y1WI!tl zs)dIzdq~B<&0@31fYgj6r$8a}yp2{mRYX+Fpiogij#zAF@!-T+n@siAMzKB_mCMIw ztP{HIUDJAnBJp3Ah4-pkPut&3O-(HxAe_VFon#QDnz}o4T$!HgNg-Et23Xz~>WjU* zUqYI)+3+|)9*kcSiWc_^jGTwLu-(79<)-m9DJdxpB2dPjm=hCI=URfu?GJbOBd7T( zxtsw=@NBlAQe&*GjzqXnH&(u5E^VE~Pv3dv=@ZOw9cl>mvhIioj_w?vo_p&@784E6 zUT8%wSc3#1z2ADQzdxaTDDZ6ZWLWT*&9g3biO5h(>w`r-~lI@EjQi#4H9_2{W9iv1uhm(-WKYzmDPCmRTdPcX;7%5+|AqF zV(RgaB=5iV{63^cdcu%Ii*Rf-+P^=)50TA;W5gu@;R5>%@o>`oo^tfm7?zgNC!SAY zbM7=8_OwPu=L~-_ws{NSu7$)5_>@L(i#PQqh6${p4XIuBJ4$!l*{r7)4lOGWdn){f z&8CwqBINi^R@8BftLH01jU)ux|HU%PJE@#cy_y4?&I4|+uWRYz(%drKYR z-{SfCZ2iLc#oKmtXMeN4fx}1Xj%$3{>iruZsGHjklxpY!*p?L&os+~>v)yh z)V|OAMMNGOoypY{J}T=^+TQ%~I?^-+ugDLizZW2TZ6_S+)&{Bi zwJ#ms^B>$|h+fBf?TXT!qi-VTg6r^g0x%Di6y@a$YiQl43+f!&H|lo+CYEhwN2s{& zw?m_5XtDi8VSW6`-^FcM?$ms*HltsKj+gZ9(TZf#CT(5labX%79r0CvNrZTkEj+WX zHE;d*=@Ro?(^t*XB?qgRIxPO}#W1F=BcN(+d@6~FZJ z^ewW8X&3_vIun1OilKc|+ABE}8~>ZXMY+pjb3Ix1{*=>z{V6gT;- zCb%H@OkTIG9cMHz*nJvD zU!J=A?SD_>#NbfWy;w1y8y}w3#caH2Vd6+48;LK#-Nk3?e<}e>VB}_M36&rec>pF1hQEHRdYlG66KSiy!I$^Hu2I6b;01h$VK?R0ZA{NFOsC zZ=3p=s>xf0Ztay{`2Xoo*K=)0T24PfZ@NpC{!WkcXASYiXKX_M E4 - - - SwayApps logo - -

    - -# Overview - -Merkle trees allow for on-chain verification of off-chain data. With the merkle root posted on-chain, the generation of proofs off-chain can provide verifibly true data. - -More information can be found in the [specification](./SPECIFICATION.md). - -# Using the Library - -## Using the Merkle Proof Library In Sway - -In order to use the Merkle library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [README.md](../../README.md). - -You may import the Merkle library's functionalities like so: - -```sway -use sway_libs::merkle::binary_proof::*; -``` - -Once imported, using the Merkle Proof library is as simple as calling the desired function. Here is a list of function definitions that you may use. For more information please see the [specification](./SPECIFICATION.md). - -- `leaf_digest(data: b256) -> b256` -- `node_digest(left: b256, right: b256) -> b256` -- `process_proof(key: u64, merkle_leaf: b256, num_leaves: u64, proof: [b256; 2]) -> b256` -- `verify_proof(key: u64, merkle_leaf: b256, merkle_root: b256, num_leaves: u64, proof: [b256; 2]) -> bool` - -## Using the Merkle Proof Library in Fuels-rs - -To generate a Merkle Tree and corresponding proof for your Sway Smart Contract, use the [Fuel-Merkle](https://github.com/FuelLabs/fuel-vm/tree/master/fuel-merkle) crate. - -### Importing Into Your Project - -The import the Fuel-Merkle crate, the following should be added to the project's `Cargo.toml` file under `[dependencies]`: - -``` -fuel-merkle = { version = "0.33.0" } -``` - -### Importing Into Your Rust File - -The following should be added to your Rust file to use the Fuel-Merkle crate. - -```rust -use fuel_merkle::{ - binary::in_memory::MerkleTree, - common::Bytes32, -}; -``` - -### Using Fuel-Merkle - -#### Generating A Tree - -To create a merkle tree using Fuel-Merkle is as simple as pushing your leaves in increasing order. - -```rust -let mut tree = MerkleTree::new(); -let leaves = ["A".as_bytes(), "B".as_bytes(), "C".as_bytes()].to_vec(); -for datum in leaves.iter() { - let mut hasher = Sha256::new(); - hasher.update(&datum); - let hash: Bytes32 = hasher.finalize().try_into().unwrap(); - tree.push(hash); -} -``` - -#### Generating And Verifying A Proof - -To generate a proof for a specific leaf, you must have the index or key of the leaf. Simply call the prove function: - -```rust -let mut proof = tree.prove(key).unwrap(); -``` - -Once the proof has been generated, you may call the Sway Smart Contract's `verify_proof` function: - -```rust -let merkle_root = proof.0; -let merkle_leaf = proof.1[0]; -proof.1.remove(0); -contract_instance.verify_proof(key, merkle_leaf, merkle_root, num_leaves, proof.1).call().await; -``` diff --git a/libs/src/merkle/SPECIFICATION.md b/libs/src/merkle/SPECIFICATION.md deleted file mode 100644 index 8aa5c7e9..00000000 --- a/libs/src/merkle/SPECIFICATION.md +++ /dev/null @@ -1,47 +0,0 @@ -# Overview - -This document provides an overview of the Merkle Proof library. - -It outlines the use cases, i.e. specification, and describes how to implement the library. - -# Use Cases - -A common use case for Merkle Tree verification is airdrops. An airdrop is a method of distribution a set amount of assets to a specified number of users. These often include a list of addresses and amounts. By posting the root hash, users can provide a proof and claim their airdrop. - -## Public Functions - -### `leaf_digest` - -The `leaf_digest` function is used to compute leaf hash of a Merkle Tree. Given the data provided, it returns the leaf hash following [RFC-6962](https://tools.ietf.org/html/rfc6962) as described by `MTH({d(0)}) = SHA-256(0x00 || d(0))`. - -### `node_digest` - -The `node_digest` function is used to complute a node within a Merkle Tree. Given a left and right node, it returns the node hash following [RFC-6962](https://tools.ietf.org/html/rfc6962) as described by `MTH(D[n]) = SHA-256(0x01 || MTH(D[0:k]) || MTH(D[k:n]))`. - -### `process_proof` - -The `process_proof` function will compute the Merkle root from a Merkle Proof. Given a leaf, the key for the leaf, the corresponding proof, and number of leaves in the Merkle Tree, the root of the Merkle Tree will be returned. - -### `verify_proof` - -The `verify_proof` function will verify a Merkle Proof against a Merkle root. Given a Merkle root, a leaf, the key for the leaf, the corresponding proof, and the number of leaves in the Merkle Tree, a `bool` will be returned as to whether the proof is valid. - -# Specification - -All cryptographic primitives follow the [Fuel Specs](https://github.com/FuelLabs/fuel-specs/blob/master/specs/protocol/cryptographic_primitives.md). - -## Hashing - -All hashing is done with SHA-2-256 (also known as SHA-256), defined in [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf). - -## Merkle Trees - -Currently only one tree structure is supported, the Binary Merkle Tree. Implementation for a Binary Merkle Sum Tree and Sparse Merkle Tree found in the [fuel-merkle](https://github.com/FuelLabs/fuel-merkle) repository will be added soon. - -A Sparse Merkle Tree proof can be tracked [here](https://github.com/FuelLabs/sway-libs/issues/18) and Sum Merkle Tree proof can be tracked [here](https://github.com/FuelLabs/sway-libs/issues/17). - -### Binary Merkle Tree - -Binary Merkle trees are constructed in the same fashion as described in [Certificate Transparency (RFC-6962)](https://tools.ietf.org/html/rfc6962). Leaves are hashed once to get leaf node values and internal node values are the hash of the concatenation of their children (either leaf nodes or other internal nodes). - -For more information please check out the offical [Fuel Specs](https://github.com/FuelLabs/fuel-specs/blob/master/specs/protocol/cryptographic_primitives.md#binary-merkle-tree). diff --git a/libs/src/ownership/.docs/ownership-logo-dark-theme.png b/libs/src/ownership/.docs/ownership-logo-dark-theme.png deleted file mode 100644 index 0fe0ac2ed0f3567d8c56eb74b90406dc62835ccc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27701 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 WRF{trN~T;Ca!ub@uS&-;=Kld06MZWH diff --git a/libs/src/ownership/.docs/ownership-logo-light-theme.png b/libs/src/ownership/.docs/ownership-logo-light-theme.png deleted file mode 100644 index f20790bf6d1df2522062a663aa2c22acb37e5a3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27491 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 uD - - - SwayApps logo - -

    - -# Overview - -The Ownership library provides a way to block users other than a **single** "owner" from calling functions. Ownership is often used when needing administrative calls on a contract. - -For more information please see the [specification](./SPECIFICATION.md). - -# Using the Library - -## Getting Started - -In order to use the Ownership library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [README.md](../../README.md). - -> **NOTE** Until [Issue #5025](https://github.com/FuelLabs/sway/issues/5025) is resolved, in order to use the Ownership Library you must also add the [SRC-5](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_5) standard as a dependencies. - -You may import the Ownership library's functionalities like so: - -```sway -use sway_libs::ownership::*; -``` - -Once imported, the Ownership library's functions will be available. To use them initialize the owner for your contract by calling the `initialize_ownership()` function in your own constructor method. - -```sway -#[storage(read, write)] -fn my_constructor(new_owner: Identity) { - initialize_ownership(new_owner); -} -``` - -## Basic Functionality - -To restrict a function to only the owner, call the `only_owner()` function. - -```sway -only_owner(); -// Only the contract's owner may reach this line. -``` - -To return the ownership state from storage, call the `_owner()` function. - -```sway -let owner: State = _owner(); -``` - -## Integrating the Ownership Library into the SRC-5 Standard - -To implement the SRC-5 standard with the Ownership library, be sure to add the [SRC-5](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_5) abi to your contract. The following demonstrates the integration of the Ownership library with the SRC-5 standard. - -```sway -use sway_libs::ownership::_owner; -use standards::src_5::{State, SRC5}; - -impl SRC5 for Contract { - #[storage(read)] - fn owner() -> State { - _owner() - } -} -``` - -> **NOTE** A constructor method must be implemented to initialize the owner. - -For more information please see the [specification](./SPECIFICATION.md). diff --git a/libs/src/ownership/SPECIFICATION.md b/libs/src/ownership/SPECIFICATION.md deleted file mode 100644 index 7de88528..00000000 --- a/libs/src/ownership/SPECIFICATION.md +++ /dev/null @@ -1,33 +0,0 @@ -# Overview - -This document provides an overview of the Ownership library. - -It outlines the use cases, i.e. specification, and describes how to implement the library. - -## Use Cases - -The Ownership library can be used anytime a function should be restricted to a single user. - -## Public Functions - -### `only_owner()` - -This function will ensure that the current caller is the owner. - -### `_owner()` - -Returns the owner stored in storage. - -### `renounce_ownership()` - -Only callable by the current owner, this function will remove the owner. - -### `initialize_ownership()` - -This function will store a new owner if one has not been set. - -### `transfer_ownership()` - -Only callable by the current owner, this function will transfer ownership to another user. - -> **Note** Once the ownership has been revoked it cannot be set or transferred again. diff --git a/libs/src/pausable/.docs/pausable-logo-dark-theme.png b/libs/src/pausable/.docs/pausable-logo-dark-theme.png deleted file mode 100644 index d1cb394d42b8ed449d317b253462d355b18c778f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17858 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 diff --git a/libs/src/pausable/.docs/pausable-logo-light-theme.png b/libs/src/pausable/.docs/pausable-logo-light-theme.png deleted file mode 100644 index 52e256ed0c30c13589b4607e44c38ccc2aaec445..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20068 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 - - - pausable_logo_light - -

    - -# Overview - -The Pausable library allows contracts to implement an emergency stop mechanism. This can be useful for scenarios such as having an emergency switch to freeze all transactions in the event of a large bug. - -> **NOTE** It is highly encouraged to use the [Ownership Library](../ownership/) in combination with the Pausable Library to ensure that only a single administrative user has the ability to pause your contract. - -More information can be found in the [specification](./SPECIFICATION.md). - -# Using the Library - -## Getting Started - -In order to use the Pausable library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [README.md](../../README.md). - -You may import the Pausable library's functionalities like so: - -```sway -use sway_libs::pausable::*; -``` - -## Basic Functionality - -Once imported, the Pausable library's functions should be available. Using the Pausable Library is as simple as calling your desired function. - -The Pausable Library has two states: - -- `Paused` -- `Unpaused` - -By default, your contract will start in the `Unpaused` state. To pause your contract, you may call the `_pause()` function. The example below provides a basic pausable contract using the Pausable Library's `Pausable` abi without any restrictions such as an administrator. - -```sway -use sway_libs::pausable::{_is_paused, _pause, _unpause, Pausable}; - -impl Pausable for Contract { - #[storage(write)] - fn pause() { - _pause(); - } - - #[storage(write)] - fn unpause() { - _unpause(); - } - - #[storage(read)] - fn is_paused() -> bool { - _is_paused() - } -} -``` - -## Requiring A State - -When developing a contract, you may want to lock functions down to a specific state. To do this, you may call either of the `require_paused()` or `require_not_paused()` functions. The example below shows these functions in use. - -```sway -use sway_libs::pausable::{require_not_paused, require_paused}; - -abi MyAbi { - #[storage(read)] - fn require_paused_state(); - #[storage(read)] - fn require_not_paused_state(); -} - -impl MyAbi for Contract { - #[storage(read)] - fn require_paused_state() { - require_paused(); - // This comment will only ever be reached if the contract is in the paused state - } - - #[storage(read)] - fn require_not_paused_state() { - require_not_paused(); - // This comment will only ever be reached if the contract is in the unpaused state - } -} -``` diff --git a/libs/src/pausable/SPECIFICATION.md b/libs/src/pausable/SPECIFICATION.md deleted file mode 100644 index 1062aa8f..00000000 --- a/libs/src/pausable/SPECIFICATION.md +++ /dev/null @@ -1,31 +0,0 @@ -# Overview - -This document provides an overview of the Pausable library. - -It outlines the use cases, i.e. specification, and describes how to implement the library. - -## Use Cases - -The Pausable library can be used anytime a contract needs a basic paused and unpased state, such as in the case of an emergency when a major bug is found. - -## Public Functions - -### `_pause()` - -This function will unconditionally set the contract to the paused state. - -### `_unpause()` - -This function will unconditionally set the contract to the unpaused state. - -### `_is_paused()` - -This function will return whether the contract is in the paused state. - -### `require_paused()` - -This function will ensure the contract is in the paused state before continuing. - -### `require_not_paused()` - -This function will ensure the contract is in the unpaused state before continuing. diff --git a/libs/src/queue/.docs/queue-logo-dark-theme.png b/libs/src/queue/.docs/queue-logo-dark-theme.png deleted file mode 100644 index 3bab08031710efb14f3e8557dc195882c0c52532..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16773 zcmeIZXH-+&x;9KF6zNJ;2pu61Lhnisy$XUz4@62r4ZRr@K?DJ*0*VwtMWh!Ap(r3A zRp}7v3IqfdkoGQop0m&1<89-N?>q0WEyKlHbIoLM9B{_kpN@t6h?<4DhQf%*r;(e0bAMMeJzc0N!dw=Oi#~b#`Eo~8;*EOy@d-haHp~6?& zGk%R~07uzm&=mb;txC%~{;EXyw8ml4XiFMSD49&CWVyb1lYs{P?AP9Hi+6y)2432TOlc7~=l+A&;S~E( zS%m8+LD3JM+tqR~G2Kh=hx#m>TgWkx3L> znXG(~2h2&!m#&3nTN@>Z!y0KI5lW zWOIXSd9?T;2()VD=c|ARqttwQtsiDcsPE!Ka;nE8=Vs@p8=}3Gj}J*{6#XMSP%glD zFsdQ}e%TruDZ8S4B%R$*F7A>cK4^e=BqXXDA!uh;FZVz`7k3Y&uNwbWOB+8Q(oK!u zM$Q;&jMj4ZMCyn6yIY2tShLtTEuX5t8$#JaTla4fz>^xkXJ8;& zSxO3n!AN3cBvJkzQqoFFN>Wgm6buFdYCr-)eFL3CAieW@SRB2m74 zXEL2#P(gue{QSUszW?Z-58BxHAL4xj{zd`7Ln_1>EhQ}pmGbeC`sXhK0(F7`A%A!1 zfB8j#6=0@P7VZJ4Ab(ePonUw0K!JZ2p$9iM`-g-xl{}C>=s!vU;QdQuZm$2RhYs@h z{!_=zRm$Dl-3JgF0Q67#U+M=U5&sF+zx3_w%^!9Cxg$Vx|B(MLwf{r+Kb3)6#>UFp zDA%B~M&a6O{Ac}Dc0;)$-IV{_D#*Gi!DQW`5Lrb8aFJJ%fhZ~hk1#nmgo~_?lQ7aIT<+!LO~V*k#%)efH*t5C_vm1N-nO7(z0@L zFz0^~Vd{?rSn2Hj&%HVm8M*7A3E4n+A|p-|px{AXR`I}`bj*T#T7xj6?qYdZ(J1Fb<}GRjZ| zWvHB$w5&2zNm&Le4wY7h{!@LF8xj%vf2)0FJ$$Nvjk!KD0BAq-Ptji{W$Ets*VA8* z-pD_;#K-r?DwLgF|572qIoRFpPd@=!f4y?`boTXd2i(WseEpAd+v9b9IBrxI4SRpfWB>&e971Dm?&&2*f!1yI=JHa0IXd`1uDbK2am2 zZ%~NXzt+Zhx}OaX02l-cgTNH5pipI)w6dJ6IB)|1CiVY7MW_tST}eq1A}=GS0FiZ( zlZQCFC@DbPU`kL0XM`*i>hc%e{{i6tUPT+EuNw*z@PAMe&{NS0poE-^GEDyeg?dUZ zPz5zMrS)%(i`{}0+JK>m~Su)jI~ z_YkT|o%#L$Ag!v@|3vG*D*RKR0EYgrG9Ul}@l5I;0qt*20ORrB`R{LY`tNLlkMG}& z{Fm_kH(dXQ>%WA+f2s1n+4XO@{!0k_mn#38UH`wqMf;yqVs~F4k;MQL-fQp=(!gYy z%EeGmo8I#5D`*1sM=LPE!S_Mem__b~@hNF4|_)}dadraVW(_k_3P76}O- z30(WCRmjw4erUFX^`nOQpcgRf6;dXB&>b*M4k@P<1&o~3yRNYQ)925`&%Udq=SjDjUNo{LG^wx{xn=UHh>-M;St;l}dNq#NrT~yn7 zj=YFP6yAgoOjQ_A;~NgfK6kLQRGa?A%ZYR6bJL4Up)MuujxnWB;ozX6C$W?LQIzs} z7xI0JMOYIwEZafhMX5oiNV=iz#8RaJC5wO#6&i#hv7-GX=VF;OWs{)D)0Fo8Oh5d3 zEG6C#|3bE_NO!Hs;~pFY*4Cm+|0TpZ5d?y=+k)Owag={K58$IcPsh6VG~1XAL0%Jc zEL(d9ndl=UgH=vCBkBiN`xMR!o>xGn^B9asb)OKfogr#vosG95KrQB%1?!qv;>+KO@^j`#QAN2ROp#;pOp(UAT723AbZN&k z$9Z@e{4#!0EFo#%E3JC1XkHyd4Z9Zg=6^S)vxg4~2p6W5}jZLEX z%(38gKrLr}?cKz*(U@+Uxg@Z)@5l8R``KfD46pDy2rOuX^}KWy)-&72ctdaVQ+}Ap zc1%m#)l3#m{cOid-0V-lIeW?vz&b`1?{ibe}Gm=H*k4|AC0 zfRb>~{wS;UC&NvfURWawCb=kme-faA?Ab3-$xt$UzwLCd@jK|`9gLX@xFq?4GU<%pIb4K6{ zB~L2z5vm*3cZ&qOZDx*XWLmTvGMS2o3`EjIIgWx5-iM-iAh>gWg`KFG9q=GEbekKtW?l z#*LSk*?%_u;g;oLT04blZ=jPf*io;OjumstPB1<<^e7fTI1_m%CumLh54|R7XDD$z zi_%nuH99MoZ~L&x5S5qxl~WZJj5$%(hqvY929d;?>J*lALY!J=b3GVqUuact@Pz~|gaCUIjPhTfaVnbDl>v>m=@qB}psjT~aA>IhRr-5ukY}a*WBN?io zC8MvXaCAo#{X3!O8{QYn;dx_D@A)W!!<6P8ckJS0Q188rKwuX0B%04}S55m;9V!IT zy*l@pgPZ&D5u|A0_$(Bk#Jo4vrH-at?-hgU9J$(JwxAhYadN?O-e}CT@~EkwIKkx2 zxoCTM!M4WV^iji?>96TWcRU|-c>d4w2A zvKDZ0zVfi&o%!XHtfgcDpgx5Gwzb^w9v;ra!i$p-OR6B+weVi`#T`CSp!fy2e` z@b^gh-Z+0L>6%Tk$y@4ZvpB72BtqqoV0VksM6m1f0GL9SQEZ{{CteMojEBjDH>OlZ zPS&=2PrdALGmCJwPYw`~idYP_llfR>s$8UCK4LHtDowuEgzq&cVPjq63ZBPX%%Bk6 z4@8hY@J>q?^RKI94y)R+uv!|(5B0QFj{~@4LfULsZvYV|s=l4(Js*|S65Z9GCP5d; zp{UaC*9SUC86jBG=q$-yc_%E5(I5#yz0G7WK_}i`7|i(|u}6B!xSx~b^NJuOlqX+c zEUpWAy}p-18_t3T9m6``tcZQf?6G9g?hTwVO=67gOkxt6{oxkSO1~$Lj=m#Zxarar zicG*?#a9i2-B|a%eXcBf(tt37y~{}QaU?lsYDunZw#{fF{^u5r zNL8dX-M$n7jyX+e*&FxlD`gQrn3iYaNRm#!pDc1a&S?)~U>9>7lY_m;T*d?|zraG` zfKS3g+HJnz;__7rUDnD*LbWFA-4xp|Dp9+ttJ%ld=MHES)svQ#v?QM|DHuGM=`tZf>C!4NIvf4srT^m zv5mQl`T4=FV+qZhseV}Zst9%`--8u(!g!;UNS;IYb^r#tAcF)9P1r4P05Wfsd^+CG z*i1>2(xUhZ((b-(nD**T!&5gexJZ>V{wJQgV*4iqzZ&D%*m9G~-I69f5}I1|D_C)# zqFMRwR~8ZWHRU@6SH>p+YSl#4a5nNbKJ*S2%g;|?zD!;AMU0cyh{EJuwxQ?;g^FHY zeR7cfv-Iu5TMZh%dPiCvoplmszkkAL8y}^HKhJ%8zHwysu=g?mVz2mDY9st{h-x^~ zCcAt?lHZ}DOtVRfw2%k0i$Nky;H;)C?%*8JW)W9lzPjbI--HY?pkm28X>qj@2kGIP!LBZK%%q7+(5yq<6l`3O zdUt%Gxw*i3qD+M&D2l63L5n7~GC=x*?$a^ZI#l9P54JmKY~;Lc{E5OSg*=VzjZWhY z>Z6|7x`QicEhOELpKvW&eR5qJF0Ljm)TAt9`AqcdPuvrcp`TZsI43uPHm2&*j1V@H zKD4owT0QQ8=lT@7hn8Y1bF=q)wH?SP4;UWxc|5!@8XNtn+-=mr5=GNT#iS}cxDYJP zjcd3Q>u_B+>ZRZ4*d9f*Nm4=wl|ojw-u)js!$0G4^uE@ih}4;1qUbJOeBtS1{NmRDR1?3s(I^zc zl_>T#*^i6t{VmYW&Lm9awJCYlUfLGI;i!pqzqG{^T&!WrwFjjNVcd?)F_wSD_Om|2 z_0525%(LEoZP>Y763@XY1v;7>trUq4MAH&7h0Lbw%D9|cOABY{O*{KIk>PaJP205d zpgu*7FHAyp(;%J(Z@k-^HSyR~>6*u*>RxaIPap4jscU^0) z@~dY6c(t3+PkMpHMQLZ*ce3@@fEM1Odh*2@G3s$<=1x|V=96`&j-7$WwudXWxnd+r zN{2|0pix+8jjupvh15gp*ge5~d~jZmBsuQk_I5*G+?jb7)RJ|^+N8T*&c|tN8h(oo zzh#T#G}bQ&7JkY%561d99Mn^IJS$s@(%j4|ajW6xh$4Q>fHgA+cRlR4+00AhtOPqf zPkXtUt|Mqqb^Ii!8l8N&W7IA1cl;JT0li#rKMP%|F)kQ*rROkJ}QW zXrAl&n4j_mSF<4>zl7`r0&>%paZXP|boqGskm5#?3=7Y0Le6aNHFB4W#YwC@%5$@f z=`?4Kuk}5zA_p*SBeOl0T;1SY3sVLU{X{4Bt^Hh=}6K4sGpX15JvGj&O#tkkL)J?Z?>8uS71x!+7%bN@{?T zy_C(Dbo~m_*kf8^z0hsR7gY+J*2?P3Mk))Y6as=@M9T2E2Y$l7^b_UA@S0Xz9j9D- zq68mQGR({{7QgD1??}hFU1iyo!{ALWKlV_xm+98MrCak7WDJlFNkC7%*!hP8H*X)_ zVcX51=l3@LSdycmd{XF%3pZLc<9q-Qx$$jKL1ub|I1MThG;nV27tQZf$%VZa2wd-a#(eG*=i#!8S=Tv zNP>}|Urq)cizY#PT9=0kyyIMjd+(od0EYxO4kAcgCr<`MV)APvFWc8Z=476&^JwNC zz}apJ16ZhQKaUI`cWC*X3P&2EnfRIj5X_C>TpMFd`cFy}?>U%hMRF_>j|YtE9|3^= z;wPu4=B86;ZV-u;!$06UFVr%QQ@U-Iic)QIM(RK3XgCQ$*Jbou#T*&G1Zm;Uv8h7mXp1**!p} z6zU0XeDeObX?w_}#d5_a8_SFhheL$=(-k9i(|fG^6^?ve84^Nyt(in(kQ)q1+02l* znSGIN=i+TuAr|3BS8qPE!D-8l1lar$28vaAe=qyB07d&X(`+ED=3Ho?7zEOM+T`%c zUjyX$lE&BgNUcQsxM|Q&UqttEUN4);nsC}1b1l5xxvQNfE}HVj`MUJJ^g7!FP?d9S z^lRnFnVMe%5rDgKOQZ{&H3AXGIFs zPq^MtgHo_5Tt~Xb1mkEdD#Pc@f5pDc-ST0U?vHE^aLg`f`+Dld(e9$+_yS0~2U8+{ zYwp6W`M01Wnnsqr^BXeJ&3bE|UdyX1vVHL!Iyy5T|41h*Mp$~%O11{t zdoP`aAQHpd|5+$f=HM3)0Xril+bv<|du$FSzLrPsLeb>^$P<&N6gcZ4NP#88-c4NS zxeppcS*n@ajbOR4yTv|!nlCffp5DGiy?o~WiZ7!u)Un3o+>G?A%d|=9Kz5eXSV$=$ zC^7#-Ao@sGa_DE&-`U{c-`Svd&?Tb;fgJWMRO$OuOC$KaAEsmR7iQ1y%_u2NN_a>A z%}T92Ywvrb{XCnW(~Naq%ieltnv}k!=*0hCfFp%`^E``CIACgzs;n&Z>6ghIcm>CB z*FRK#EJGrVfl<>YjB%_f*Sw$W$ctC`!1TzqJlO#PPYR#4DU*LutM~nSnmeu9a6fSj z0?Zd+$p!wZA$0ez+s3op-8}QN=nK%;5i$oLo4NJ)=ly0U_Rc}$PD@y7s$JBj_xzgI zZcsK~(-O*4)7kOq6#1mDkXFAaZ|rjDmQ19dwA#q~Otm$SUu&|x{avp)%iD$hBR*iH zmx^0e=-HX~hqUXlNml~SF+9e-asK^-2iAc>B{i>PDVm8lh4w|+EG>Mlk)TY_GuQD_ z6_aR;M%>b+^t^AII(@Tu%@2Moq>!OrK1v#$ozEt44*MY3`%2Fe4&)CJLD{_fG7n4& z+9wUTLWKaQ24tA3KsQw6wvEApMn}tWQIaV8dxlVAI ztVQ}Sp~hP*=crPazkbxabah96?ymdAI&v0P@F)Jg|22!<$;-g$7Stahfbd9@8@`| zNV&JNoXE&+Me^k9fcafbMjdZ_fCQ8Vwp_wMyp98mC`WJNE9?n=S`*;gATX0#pQ!T^ zLM*c{(b>n{9jb|tk-~xRYmVK~l%J+Q0)P3kh1qkh82ho6HnSLv>{wK0xugItQ9sq< zy}vFX_yR0jPUfQ|`NePDZM3u=066D9-dh-v-hSu%!l~)!Ev7Z)#Hzy;qp(bro!DEU z5V~z9G!3z>Gm>0jaNS63C)t=vPYS}|RPHkyp3^DBJbfm}> zQkDPuYoS-{$AMdig=a~8g$P?kv`y@agnr13!DMYY0Ih{Ec`SKs=bMc$Kf;@SP)BrM zszY5MK_wV8OiU?Y$j2AYGRc(DPjv#13gWMf-^e{^!piOnm=~nkEwN+sZQO}vi#;{`XT@|KiMa?{=t!IZ0gWb;zbXyCi`JX^%Y5BqbBWZipT zg#46x7iOc@h)BpNj(wty5%5^G-@O59kwLH|pIBpPZ0j5K*Iv!v0(X)s>H*%{lBQ4L zHf@NIe?giCY1Wr0@s?nR&+p|79&|^(_uDjQ;lZ- zR!8S}_T*wU(sCMzgUMdP6+KA2m1=cKv+?lBDPyqZ<87`Ics0k#sSsXX|~2FmHQU>MtQ@Ju}ZiBz8(cKyGzBetZc|i2k5D0MhL5 z4I)O}qK$LQXel&Ih`l^sGDG^$K%tQuj z<`vRPh#XXAiMx-MHULaDsAai)T0j;|<@WyeYPgIli6Xm$O*expx_3td9KoJD@VszS-j_%xQzgjXC1n;H;_N z9xv0(hGWv6Zc`x3LemFkl!Kt@V&T1_%@;)VT0DmlX75F;qeasVmUl)}@K!_C81C8Q z9T#C449ah>>CIqYU+t)r`{+tNvZNKXJc?Tij!SB~)Z^|DNz%x*p{~jQJa}7jMw7_8 z%Zyd!dwou`^m#T5Xm~Y+tk18K>{|L8Ujsv^8}`Yo3!2RMSaV8VCTv1Jh5ALsMgtVZ z&mMV#CRO2Xyq)L$mT0d1FiMlw+$xhJ!76pyCz2f_i~1e@E9Tg)@JESyVVsJc{ns+2 z)eA{7GbSHg#AfVA^M^nibiM~cp?5!Qj7<#o7f8K%y+sxExC4XY-=GZ@{e=mS@ZHdx zD97-CW7=-`%G4R?lZbkWFZ(>S zs#lLggVK#$azuqa#^Agjd6UM~<=%E;Txz>sD3_Oxk7w>uFMnMu;@ZT&6~bMAAk65zL#iP}BaVrC!JN%)VWL)0aURt1 ztJXDmw^)!_c;j>CO!b4{8QIUB>wcJMMsOQkAPh%ElGSuL-7f*ZF!62xdheZ=b9_rQ z`M%LPg+)8jyKGCiwdx6r7{DN>Dl|03|>Tm9z&7UHb$g`IFYvkzT(-AAcv%CYyDlEqEb z>E0IZz&bxG&j;`A8uDZ%Rq##WtRO1clXiq4{HAsNr&hdI|Hen!ALjBt&^!ZRSEq4d zi5d&(N|8e=v~3U_;lKwI)INP=yyQ{F2`S~DgSN?@9=%Ju{Prt`)REK#S|fMZ2iq$9~(t_$}sgbY}E1_OexRYYD4 z%$*dWxz~B=>$BIbq}k30_OAT|gS|gJDZQ%Z&HhnHd;Pw~tSo~Gh@MBkhcFe#QhINj zWSvBvNSqgFd@_Hn#OoRNz9T_ZCj8?piXzJN;On|0S*1QyvMqS;JeKV@%Jl2<2O8@_ zjV62kSI=&(*){ggmXU9P$H2<9WS8Q-Vo=$Wo7QUp$WHQ*@CXYfLwA`rqTpCT=$+K^ zAQfWEDo?pbb@n;Z2YiC=+=>2uR*AVEj_h_U<*m*gvlA`~N+EC3+Q$}>&QG>1czXB2 zG%qX^7r7PW%sQ-O8wqBFoQ9`;0!>ogAUkr}s&71$TFi?m&v-0U+okRSip@Bs?-vMd zua`hGJ{_7J?Duv^zOh=3yggYvjD=&~_7n(@)m^{$hGB10(P2!%#1vNFDXl`2E#b`X zY|*9lk{3<&G-h55|4^&|unYmT96CRzZWY=6^m`3!1=!%%tt4iP=t6BCO((x{p3wcnECz&8&&#XivlnXbU8!OJbr$(4G>Xg|STM1dP6^5Q`$;Fu&zb zk3Ensb>rH}NO;dKa{USb!!Wv|c#f07NGQZ$g_UJlwDfHMIu-g=3z#MnM73Aq287(8 z-lK%GeQXxtNMmlWLhoZB521m~|6OEqxWK&81SI-t>~1W;M!BGowhORRYDBuCV|uoT zake|IpKWzDif6TZjh4iiV_Npeqbv!ogV~eR;uCkI zSmIvqe!nI&{cx3s7c`D}{nia}Dw;$GG*B^^x<52X*=&*_%G@$c_Sk_SBQ8F3XFPtr z=H)8>CE2m9faRZhaQy;#RoaKZyy2`Px#f*o9T;0LZ>u4h`>BSyQUiWGZjGP z@(YKRkO2 z;E>=|n;~%4b`_s=oQ)d{s_{Ok6;ntvYW@rwWo#s9_hMX|o7P&v7^0CtlOMHp3d@hxd%r3liVvue#L8 z-Pqk<|1%b1_{E=qqK!br=Rm}swHA_?T;6^&m@`S=Ox{mPxxJG zrhG6U7Sa7+R`{6>=_=V)0&9>u5OOhi7MYe3&13O+dNZ@^#>4fPXv#UOrJASHvsq*s zWRD>;TFvj*V!0d6Ym%-!4Lyy=kvg1)68O&+$qn2Rl_^iq_+VmRQqo|UcWAlaw zsnAJwXTxoyFc$-1mg={+ys@G;C(7QT2?m(?HeK!B@R;b=Ltiz%5m7I$&G&m>tg6L# zBbpA|g&s^gQ=|l_FF}}Dgb$enIj7jqwidf*6>1i4n}f{N7^o_6V_%4`sc@EGUSD4z zev%-wyMIOTSy#XXyZ60h8l&!#f<`xcnL4h$kC!&>b?f-u=wg6yowMjV*h-Gf)lM+?3O6r9(qvDwHPFU}~WgK{|1^pl0Skrdiw(Mj#h5Nl+kb18hpcrd)&i{P&!e zMAdOMKq&t5^lLLF?{*Sf3@=H))NVM|lgqRns`AOshqugGxd4VqyG-ZQdJvKW; z=(F)RE$4AQ|CP*y4Djh#ED+m1yr5}hTPVB;t6?PNy}X>gCOuJ@`XO?QH*wA56SSs| z7-h-E-uedAV}pKeW>J@vJ~j(rm8@&e#vkDFWL=PL?Xvci;(4*8MJB^l@`Pogdq46VAy>{!s!QwfUaeSkedpL_4gW!cKLl&ymEm z7RIL5JBmn)-n0Zgd`zS*Y^x{$VG0eOcOBMIT@dQxcskFPEoHK`jEN6k?6K$1wavy} zZm$8=p;nkPQFopI-uc_33L4-DOgKT=DI)!T&{GG%yg}(Ev|Biqh1aqlElfax13ok# z@1^C44p}FJl{w1c#%4{yV}Z!htla4sk(kb~gJUwxRzvtnrmdytt%87?t_Z0$*oAi^ z`U*2nab<4Kz*4?Jk#@ozCqu{Rr!6TYlD;r=%^A6L)TBEHdgSJ*jVGsGlc6?ztgX8k z2*Kab8<*CUDc@y)hDG06#cv%!q4Hne*wfIgetxG>Ncpk++4mDMu)Pn8(wLpJ4|9mY z`E(4Dw~Y!(bwG44igEl=vl}BXN;};8fz2AHK<|?;? zX-8N8wU$E&UMv*b+wD59yJNukfp}D8HWdZt0t7+Y)1Qgv7$!)W=Z1oRXGRgDp5*vE zA3EUOTs(P9a$j;gCmL4cVmZ>*%-|Dde#zM%+ro=Pq_75mUCPs|<<`qEimWWGm-;w_ z3qiB-?_yp=K2sIq-|DNn^Tg$G?slU&!1y_JVqfn&)p!HNd9fhRK|{J9(hVvijuE|` zh~O08bHh9xf+0Ho!19lF?1=7`SCMAIhaD8KR_YKt|5~9YIdUe;uUza)D)UdrZv)wW zO5a8zIs_#{Aw9dCp@!P5pmc&5=Y@EE$)O-Fs6{CoSR3E%j5?d@>YK0xxdaD<_me(T_|dghl2w1NgrPzcPM*0rBDRD z{^WM*8r$`@#h7An(Dv*s|~g2Mx{NzvpZb zi1i@D1i>-W?H54MTnZ$ej?I^wsJ}gXoX9rV(Az&}UxKS8wP`$jhi@3z7(C2=sYkj+ zB1!T~9F42<^WX3)5L=L$_un%{1ox@`4pH2O6AH^0RYegi#1l(GO>2Z;;d3h@%P^s% zIP&`wASLV0W&zR`u|Srzz@Raw={shMSFOcV9hOhrVlbpz{(Gx2ZA|rt3=|9xq}bm{ z-i}ZcKKkaBNxpi1zu%UCz|8AEe^&D-b;(Z^3U0?l;b-?u_HY1QtR@TCmzjlI-<)r} zk#Z3@T-6mT0jviBhewu1`c3aMl7JI4>+xY#S+Z=AAEMZPCH{C{7<*c2(SjnCCp~2U zK1r@$_WOJPevOLtYbjTRY2zWSrV;$j(ffYoz=I_JIp15>8MQ;{!*W?=Zo;&I=Sy~B z6PEY@uEgdibRlhkk67#*cuBXP*1v5NWwEeY$E_#(63WT*XNb?Tgx(1<9POa*nAw;r z!`tqD-`D;sQJ^Df_cuT9D%bT2VL4v8*q)oI=(Cm0g-Um@jB*g_{)+!kRE3IUtG~xK zldk$*=_rQXFb(_Zt&Tvj+q7s6dsQbe38Ygw7MrjhuZj*5E*k(_$6#n4zLM_2-rD@^vpKEVP>-Nx8R4a?))(QWOuzVjXNi{feav<9h{ zfnxpbR7Tf|9LTGysPa@{UJMb8Yhff|sBq<$qNb%eoF4Fgk#G$Irj8$#qCN303i|D!A3`kzb@gv}(Acn?PYOe|&@B6{=p%8uBQoeko}ONS|f7 z^6^wvDlyC1uUsaSre!5GGu}eBOz>qm!`Ic*v$% zzZoIAW(}MdeZxL%+2MfS!V?krBI8;UGyDstgZS>en21MDyV(`r=~h@$+5z><^9HS- zsHpRtQrt*6u;^DX$N-tM=~>)tEp_aAD|L4Alv$@&Su^wFi&&K^Vlut59-{&HHx&@1 zfJ|OnnFd&DC2OPhed@Dl=lw=iNb|=z#_Y*LIeJZCeWH!3c}IkB*@<$6TgU*rX89)} z(`51&_7((oz)5D>2?5uf$qeg~+mA)A##O3>9 zz=X(hl=7uWh(RSKk#F=^f_%_g*9QFi(y}Dbks{=GQG)^@U~7=l(d6{w&%lPurP>KF zXw7SK$8miS4J$ZN#BeZ^@FGS9DnGn+^zx4GpX0V`hQYudKn;Cke*3Cwi8C`WHDLw+ zrY#eBwmzDDOxk$qh@nTl?91QfX*0ouHj+IO4B4LabJvT%t^*MWd^Rm9Pv1>+TQp^F z*BT-HC9%y!>}%g5y_VkV{Ydoe({vZ)uvsEShnpS~zc)BU|1;@}SZk*jF~DXkH|MWj zA1=wW*`iqdjaL-Q=}hku(@dOHh8Vmb6fKE8wjQd^&3rTH+F3*YSVRh#0iDhI{`)T{ ajAG0UUw`J=Spo;~N#Hsr+LfA4asLC=Xf$X5 diff --git a/libs/src/queue/.docs/queue-logo-light-theme.png b/libs/src/queue/.docs/queue-logo-light-theme.png deleted file mode 100644 index 97512e645fabfe4bfcd36b5e20f17b5359110f8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18554 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 diff --git a/libs/src/queue/.gitignore b/libs/src/queue/.gitignore deleted file mode 100644 index 77d3844f..00000000 --- a/libs/src/queue/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -out -target diff --git a/libs/src/queue/README.md b/libs/src/queue/README.md deleted file mode 100644 index a7d77233..00000000 --- a/libs/src/queue/README.md +++ /dev/null @@ -1,66 +0,0 @@ -

    - - - SwayApps logo - -

    - - -# Overview - -A Queue is a linear structure which follows the First-In-First-Out (FIFO) principle. This means that the elements added first are the ones that get removed first. - -For more information about implementation and specifications, please see the [SPECIFICATION.md](./SPECIFICATION.md). - -# Using the Library - -## Getting Started - -In order to use the Queue library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [README.md](../../README.md). - -You may then import the Queue library's functionalities like so: - -```sway -use sway_libs::queue::Queue; -``` - -Once the `Queue` has been imported, you can create a new queue instance by calling the `new` function. - -```sway -let mut queue = Queue::new(); -``` - -## Basic Functionality - -Adding elements to the `Queue` can be done using the `enqueue` function. - -```sway -// Enqueue an element to the queue -queue.enqueue(10u8); -``` - -To remove elements from the `Queue`, the `dequeue` function is used. This function follows the FIFO principle. - -```sway -// Dequeue the first element and unwrap the value -let first_item = queue.dequeue().unwrap(); -``` - -To retrieve the element at the head of the `Queue` without removing it, you can use the `peek` function. - -```sway -// Peek at the head of the queue -let head_item = queue.peek(); -``` - -The `is_empty` and `len` functions can be used to check if the queue is empty and to get the number of elements in the queue respectively. - -```sway -// Checks if queue is empty (returns True or False) -let is_queue_empty = queue.is_empty(); - -// Returns length of queue -let queue_length = queue.len(); -``` - -For more information please see the [specification](./SPECIFICATION.md). diff --git a/libs/src/reentrancy/.docs/reentrancy-logo-dark-theme.png b/libs/src/reentrancy/.docs/reentrancy-logo-dark-theme.png deleted file mode 100644 index 1b19d69ff320824a8f2538c71a258449c3ff307a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26556 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
    kz_|?JGH9`$}p3WIYyq_T@%RCG)wP?hq8y zwNvBFuFhzDr7zooT#3FIb(RU#p=6S-B0-dIAF!@6v%uv1-gJD-lu&2b`x$IDL@|4SjSaMC$0mh;X-%)pJN3X2te|{7!>;3@i-wNnjnYkha zbMk}yuH5qdO1x3laS}H2t{C?lE*chB6I5m_K!Hy%Cd zw)k49m5}j#pxQ>k2H~+JwQCoNvur03iw}^wR<4aDfd&%7(^QGWzFikUUG){07Y(a( z%!uUtd~=Zp`{9E?Z4eD5JtP})u7*FOi}Y=w7=L;gh<2$OH}7*6hk1TWWw`q8tDp-aYv%+8Dg?r(DF?# zlNFUb;YsG>B}=QvY~=xX??un_2DD&bo;KmXYT`l5Ol2;{JM&Bi>cRpv7qn4^fyS?= zi(ebgS(JgWl@^}>w;I2<34pzPk5u!BE~q35du3nUtaH`WtZ=d8ecAVp8kQGezH{;XxYw0TVQq}lxjE2sFK;92H(kiW2v)Y#B*ns38mUxxjj^=_fJ@pt__jN zgbcPW3PW3}wj#d1WFD>OW0+TNc7OYhciZCzaON2ot1Qd z62T@3C4rURk*%rdejSvGriLY#{(j>aezX}v4XU$Rc;v_dq*`wDd#Ut)rCYGb>ek!9 zM$%FnuZy1~s}G}qRV7r->F}HCLA{s<+S;-f4Q1iJ1|5gP4F}Pwxh~c9_K+5K|KOhL zTFSs$AJ@3k00mMT3dJ42>e-5pk%MpX*FQJbv6e;-pc6}7h6n42vd0oz{@qQnJtm?w zS@;*CA~_MuBk_gjWo?HlhLp=dHvfeW^i%lyw@E4$UTq}6-PIz zA^6HKx8TMMkgqg3aJFC*(ai+oHsKhpt%_*i?C9=;b_iUxPpU~QWl(tYq%b!E4wnCE z8~*olxQ`WP8LCT(u=(~CkxnwBrowX4wxL2WMcX40)Qd*<(AUN^mHc<|28m7Dv}Fuj z10wMPqDsPpD~;TdznJ+QuisICgAA%^HW0!uI#-3W=3>yhmRcUW%t<@me9qS;m}zb| z@3Nq&uXlhjr_T+H)GQ;H@Hr-GPvAy%1s*F0Iu!U zlP>6pu=$2rB?_BRnCb#D#RS!ohsp8yimrj>yAkM&17i1{Noqeut>9oXLaBN+2Bw*w z1(bM>gIv&aKgFZwhCZR->vlt*5c51pcJpPq-bHlE?UIiBt6bxuSytcBrq8E4Fg1@9|?RlVNVMI015%j~gY%NCg-Nas2g{^fhFPK!J0&B}IDC zU;4I*RM6cFgQa){<@POE=*yeO4$Yl+>RR+Sy`ZICERG}aXI+IzZ*-WI%>>bP;>pkf<{_Bu@@@L_Jj~9el$_AHeoUo&i5X2aB%sjihXUkMs`CA>7;vftlgum%ct4iIB4 zKpq}B4I<@Vbmt{Y2Hk^1l0jO_Yi2>~=U)EfQVxH*NBo&%&74D{uRv0o*q%x8UfG7* z7|j%Ip&c6j;}*C}{JKe}!QqF-XCFJlnl)}^4i+S}c0v3qL^`A>*s4UT6n9&~B7|p3 zYe6=*=x5o zus_E?3kbHxS{H<;l5M)|K5hI?l9=4@85Hv&2$4Mxl=z`Cj@XZ==Rbe!3amyIU{W_Y zcUq$kgIO&`9K|its0hBA^@0I)U}xpWHX3wJZfc2~?AU7@82ui;dk@+L@vw+{VX;=Dr~^Yy?Z->%u8*kHQBz& z3E?a)-@P%cJB79cF)m7FvPWt#Prt~=7b?S!I0u@Jp6)=`HU}`2VU-)b(i7Jmg3atc zKOVX*rx4wnEB!xZ$TZB-jI-{yjc$HNVsLphLCcqhgCqm=!>I517R|=VEtWhj zYX{qNYAQVAyz;|wGx|`!Ngj}Sxu$Y64NrFKi43@tdKcnG+$g21I4*_zX7G9s1mt7p zOf(&X=JFX<*mT46(oub1v{)FpU4jVlrmaSL?oSGBOFH5AN0Iz8E+1ZTc>&~sFr`c4v+E%_*@YHOR{CXt3FdYNLV zq@ChJX8sef#PnoXS|SQywr2HB)5G^`h^*EpEZaZ``V>e#xp4u$QfUpWNvffEk2@fX zwu*Z?ih=kOH7f&#L2#YYlyeICipupRQ9***0V4!sHCv4)O(^SZl-=vxcjN=7rPv0H= zOwGq6vc&?Y4v*{)9`pLTE_Z7RQ~sqXK6jB)0X$|v*S0S;*A8(X74HihAwwVp#WqVx z+ivpV<a~WZi|U8Cbhm~5`zPy&?(c2yfi_+$i9;{yDt{v(%`kaF_>JwvUP%Y4 zI2`^(o7q&F(3={ej8xBdUY;FSp`FHDoF8|S?A}u_qFwd(n8!*@4LEE>veH6K|LxUj zdGgi{#Q6N#M6nsfWjta3EFeQVs-B`Z#wTOcWj6(Wmyoz2h#fGuXW>wjE$Iy1X?p*a za}BO3f!5?jL-lpx5G?5?Jb^Z}{E1X%DJU}HJn;;Ox+r+aJ}&e!)Nf<2#n(8Oc)*7X z9oZ-04k%H;$)uTxuTT%`3aiwV&`=Srf3}{GHAuF)I&fYNbYT?n3Bf+-BOjK8QgC0M z1J&FvZ&xs$1d5p}v)a#uh1iY0lQX;gEPd{wKL=@5~+aSX96moAu3{ z$7$;wruMo}jz9XwfVh9(A#GMYjq$Kr0wobXhVzOKRG^OM6L-z50q#EuB=y*7ev4Td zg{6CK3FvsVIbzcUnv^ey8=_v|%#k>8!we>J{e9;7HJ%Nu1p|e-KVYfyDnod}6#Z0h zV*|K;ftPp~24dd$$Qk%Mq#5((V#)IF{SKl8U zrti#opTnQI$o#THI}y}!ov@xm@L3A#^CFi<+FZHtFc6+2F;;-^vTVO0QPh}<-x)sm z^u)OiczMzT@5o)U?e1`GUAOBeGbMMvAo$!$-1Z^}LGo!A51vmZ3|<;_<9hLyxpXbZ@lN+p>a64(?d~#F9${$!Ie}_`^cs zSdInP^f0$T z?=JzQ;m;FG5-=Z?4JN*JtnWI{*9!K*S}!Hrw9JrL3Ee?h@;B};;;gv(To^_yc30id z5BM>`MpZc$Igv+!6d~@-yetz+za7W*LDn9Y{zP&sQtkPVt@sOT<%>*5ho$L(ojbs@ z=Ek>`XWwk;M1*&AxKe|it~-wu4$pTEZ^)!W2T76lgAzx+W}(k;RwLY{lA2tRIa#X) zJL3hO%xZicWC^bhE7%BOb2ME2T9q+9jG;}WgE!-$e+9TX-rB+x$wzs#?PBtj&7wx1Djm&#oM__ zlgpYYL^t`Z`|qy#%L?hC1{yXu8mZhArJkL&1Gw0`Cmar^ReC7gcU-EiZ2|-@-axjdlIOA2 z2a-Uu5vu@=d};U;ejRimrn+KMDyr%69(`h2e?*_Hz{HAYyu@~L>xVl&Umo+`kA~HE z(K9c|gEcdPfgWdR9~57xoi+JKOWbRWQYEv*W9P)X-^(c{fhHQbJ{L>|8EB)Yx9^|i zN@6d~YzH67@^=(Q$vgmUjT+XU;|Kojos*cYFHqXEMR+iv@?@*faSMi80kJ>9^Nl`D za0Tt4G0HfcE|y<|+H>?rypT$29fTC>v|D{*_Vh^2^heG~;H84R;zj<0o=rjh zf`0Zm2@R6zqnhNZ+5MQ;7?QaZw-wV4JwUR-_YN#X(tdY!@h{rVeKw_o$uV$ zy}PI9P@|nJO6AAIo4d_iEG3&08^DbqZ45X&oZ5F}hZzHk#0X4u$ELIMmwbwd{2dEa z3eg>wIv%IMUlBYk4pa;!hh>g>@{7|BTuuwQQW42vS#p0IlRi3YQFY}Y(RL7ATU=gN zuXP4|*kZVF^-gsLWPZNMLe*8-*Ajs+JXr$yK0Id9&6mTHt}9-K&fvfO{#l9#X8pf< zyYhc1yZ?=`m5@h^od`w9+Cn^KZ9#U?ATqWvDoYq<5M@ZnuAz(~SwhHIMhmIYWH-!Y zl9FvuGQ%vsXL??rf8p!b`#$%5&biNdzpry$*Lx@yM8A2l{D>T|0!fr$@Vb*RoZOP` z_a<@aUlWgPwmo=I-yR^z=0g2_)N8&hUEMEfai0j1Q;I<=-bOECV%#$#4zBt(x8<H1lL^&M24su8=-glMm&@w7SiTj2sNVCd@EhW#|Z2|7uQ;Sr{Vgf zhyq<_nB8J@!=Lm^ow3(bcXwI*c5yXYeFT78-PuSx}?+~-Fp@2BECLHrz824OS-Bt)cKyK`nN6hRpX0^ zmuf~6+tsYa2ic{A&HUxye36U5{M^o4sa31FW49>q#({}&h5qb+wk4-_L zHwT|7?{=HQ1_8Csi0KjC-6(Z@VZ&#IEOowe&CaMvA3W|9yanf7=1)q-Yxp=~<~&PC z7#e3%>Kn?r;L|I=jJ5m&9L_=NbnJS2;`xZolPzz5#1)Y)-NH=oWWA;65F3{y965|; z-@GXZQsrzntKiQC;jdb=8Y zLIv??Hj-^*Qii4@zL@#HRd{O(V%_-<;wh*P0rHi>Z7(Fvb zxhcB*uDDu~;b$r6ZS8K1<~S)pwt5!ZDkoQd44;ks>}};C@v^8iDt+)a4i$ou?ZNn7 z4wb2~3;G@qtm0Dk-bMxc?QGCdPZUuwPJm(JV|?;r`+2Kn0hXk0uixQTrE#=x#tOs( z^E?>F^^+w~YoL>c-8%c8p9z)ZrJl$4ETrnLDMck><`kc>f+yefQn+p`%{L=7PheOm zc9y|uQ7+;-#{uFi6g$Gx!rv{rq&75L%b8heJveGHEje-9+4hOUXBzf$;~a7dwYM-7 zt=maB;l@8JiB<{;8Pd3FTtP{tbZq! z1*ccwo_i{YAL#f*IQR5L=64XhKu@fJs(iTnO#RL5-LDJC>_Gbv;!Siw(~-E&qVI1Q z(jPU2$z|X+IRTpdJ@0g6wAxY83BGtCN4u?Hg1+O4cgtv=gkX`C5bWTZe7bvrS;xri z%N~TB^|OEUbJugX_EiOEG)MDppUGI0pXY7x&-KkH6a3=%tLJN`W$hOP4r>h9zeE^} z?!0=@05+v|YV*D#g{|n9Q7~MTBs31eRlM?ak++YgkK>r(HowOa>pebZ5Fi|XV>!ao$<@IM-Awbu_z z5n(LEb|&N$A)01AAQecNoqDN6fwWEcof9H!C2Yes|TGAv5`GUoQ(mi{2P{Smk9p6X>* zfaXD%1RadKzDC^fPST@@)1SWlbWh@we1?A8@>R!n0>fy-dUjJiF#q9B^2H6~VY^#4 z`koSJVv2CyqdnRTK#D5q-Ha{fv+IAyAM5#tCi3T4V&5=&VpIJ`k z!c5WeGcta!LWfF#=EPej`zT~s0MPLOQrE;LOl&dk?SB1{u=H4h^Al$-T>oq|*i7nc z8u5mW$d&vE54QyMNE!4x2AqF@!^kc4GRtg{COJ9L1t4K-8`GOd)2h7xSg%yU)k_=s zzLq^-J9N48X)hRy@h1sU*qM0vLvOKCU)cG9Yj{GG6H$Co7kULIf)eMgN!$E(of>i= zWfKH&VPnbKwd3f(D8Ob{=&oG~fR?b6NzOMOj^4J-h;RTDdYB#N!#C{6bN9|^}cl!AjkeWGqHnl2p&)peoJKa#qQU%11Z3iBHLb`siX6P z^sDX^EU)AIcB3XTd42DF?UsLz-#*)ycmX=dCL>}ob7{q-^XdLWbR`$0OliZZf4A<^ z9rSV2l<*t$5MazA6T)1lEUacPi{Vkay>5jhjwQbHRCU|y<3mX)L_Yf>5*RMx#m`Ry z{;pT@C5-EIfDz-Uen~hiu8paUO}~|E^G8nTW*k~>rcLMHhUVJcu7dFQeom{Un0HY5knDXWx z-N*AAc?o;Fz~GWQcoh~=&(jhTQL=KAnX(-wMt0+KOL{2&HCC-FU};31W_Bw$LT_2b zsH~XrW>$O~JQsL2`0|sq z1b^(`w&#wAV-N_!bhz}7tXH21b#7Fz83s>e!&6jWm3@5re0Y}MEV*RYlE@K$W4Vc3 zXO1nm&B=hxz={4aQSx|Ba7vxLpfWy!cGAXe{AEX5XW-YAm@hR+S(O){eYadK z-C5v5YuI5~-X(nP@KHd_g09}VSz5$?O;B*4eo;`A3^3pB*SAqwMyF?Qkgz-TxE}1G zD-@uNsVmxlv6!)N+EGbdCTvz-s>Q1ws-6I? z^V#<7yh-=$H!rN-eQtvxsGWY3gUc>UR9xg~riD+qPlWDJ*RgY1e+PN4Ld(|b@0E4H z5xv8*Hu@K&z?JNc!b=Yay+SXd;@tR`P@wN|$>j)BnV|i63KOYl6hnf*Hi&Q9#1++T z?c)`gptPPp-x*Bu3;Y-w>5mk0hdF#^iQh){p1~dB~oAbIiP-hq9B>w&1Q{M7pynjU)fmw2(f^YH| z--!l7r)++FDdd7n-}}HTFtiob?}3KO-)nxnxNNJ@IiB38N?@9JP zXOCSig$4_CrBTw6WOmz4h47&!Sk$#qz*3Cc)U?oqmb~JhZXxH8Oq48Ags@b7CCpos zLnio<EQ$HR6;SAV<;bXz~rb6W$z%S);I)>-_ipH9zrlp7(@k>o@s_F0C+;ZU!-= z?qbrPttaVV?!%$rcvdYuvOigi?*~{rda+tOUixpR%^Z3Ho|BZ^r(}-v#yCm57gLR< zmq9?nnz<6}t;zTKC_I{;j7sF^bo7Uq(`a+N+oGkRu*LTBTJ>XVUPA56!>}K!Nl}n{ zLM;k2{`P#W3z{0rLz9{3#!8&|7p(V4I?%ZbGV^&9ol5J2MDwnMDF+I@M^>QFWHvA} zJ}!}+r!`U7|4Q$3_ElFr5%1SYD(_ap1l51P}-2?C7oXN5;R(JDw!g3)4kgFAxS z!V4NMt<8XGNqbOM0|xQQc#Psb_7%bC#(Gbu4jbW(PfqmeqXJ|)o{ZisvO+O$!=k$F zBL0>!RAz5*_gS0r!eyUSJE81zCg;xS+)}M>d=JBVH~!!WhiC`QoZ7{>Ai(^UVpwn5 zmW{I)&S{$>nLH2$1HHQON4@m*Egopnr!|s z(;6>(|J_~##TWS(0A)P)C?`wVWpiIcQxRf>pl#S>O#tu(W7y<5uv7xu(4gv|ID#vG zc1BNEnlB$OZ1x$ssLd;OWb$T7QLSE6AdHZu8Jg5MQLl}5v6lf;YF;<|b5|lGCF@B~-t^TE9vn@TbfzHW z8n6RI5K%GWY#X|&ay=}>JLwc>oXFgETb(4y%gXlk6(J;6G~nH5>B_M62; zuevn2f%BNZFGw|i6AGBOXFu=*s;vVhF$1h@F|sWGPiD4SJ@is&@{CU<~xWuL0Gc`VZ@g`bMCkFNxGxOhmUES zY~zzT%QQ676J?+Ewfv#)z1QNhWSx8Dx6_8t)G7v}xQkm>bn zdWNgK2v8nH@kHdqSZuwl3*tmOa8uvw9Zd%CWQU)+i`rk|@3>Sm(Hacf3fE;9UxicT zi^ugTZ0QKl_@XFprxj^5gzQ*-H2on8ks3oRD zwk&9W5EhD6NyT{#JE@SQ03#|)PP^_T(P6rpq{Ke0@41;oFEK3Ui`K{WQFH{wq?O@` z;e##Gta)KpY8UQ`2Ph(2zfQ%RGyQZpX~PmE{=+AqE2}&sQUE)=_su$|H3J?e#t$=$ z830l2gW7cXoI}h7dwFH}G=)Mx+B9|61(w>LRaKmE$L6+G00*|+kK*L2??r9>)1ZoF zMU4g(JPI7`{dyy?e;H=9Ry>^r_w*VixK!Py8(-a{Kpd8Bj%a8nT-;m+$I{WQV9=Xb zD#mJ*4iVE?XeO#v_7#d%+gJm>X<006l`dXHQc)r2%WK3rUeHYEumgpu z6w4osIo8m3=+qN)m*iU~Ry~Z^ngIv%hW3E1DoP%<7(t*^((hK?KyRz-JrI7brp2%F zW^R#|a6#lWlUOXAW54*Xu`3uE$+mfoh$7yb`F2YJzM{sd6K72Bp2CE~#OE~+C_B~; z>Yp$K+X7f1rwU3q{vnrsE3sdP?x9-gk+{{-T$sm`w zM}#l4Sp+G5EM{N>Z%N|_!!@g;m@ zzqJLnl`mRI8Kh z<&M2orn;kU7?K$?A(Gi@KR!!t__l0>cJVyR`VGx5S zPR7Tu9u%=<8-5=$?VS$(6?u+3loxn;#{?$7<2~ksnQlvuQSk&(xM7NVAsmi2yUQdE)bi@NnNVT#Z186Bqb%HUE zzHG8ZEp$M`%; zs%M|wc@H1DgUc{n1O(tXj8U=Ga z-Mzo83*jAnJF>GM{g?18Wjw59f&k__PxVzZy>1rOXf$f$iy3IJ0*@FICPCMiQiu&@fXCt~{Lu>RZPYWw&v3P5W5BthhdhzxIxX-Y;hys00RYEL&9$Oe}mb zoS?uExYj~D@T>Uxq~)X!tc=&R0<)VtfsVJ|Z{=hKK)QQl9&|}ov|E9b7MP2hX@*?E zN3kvGY~OTk7yxh}rz$_3d+sgq$BUpX^hsdb@NM4+_&qRgAF;-}^5Z%nZ88i|xTvJ7 z*`0^jQjmqY&(}*5v>x?aduk_h#andaC|rfMAL%VhHWwyxzaaOi%O6Mb9F^hTxqOkB z1DOqG!ej_}N0d5TT-WsV2)*7pn#()z(St9$v7G)iSCYyR@(nwG3SkZvI2356@XkJBzwAK1u%v*?!kg diff --git a/libs/src/reentrancy/.docs/reentrancy-logo-light-theme.png b/libs/src/reentrancy/.docs/reentrancy-logo-light-theme.png deleted file mode 100644 index 96706717fbadc8e9dfa58b95bacd134b0a1a41bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26100 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 diff --git a/libs/src/reentrancy/README.md b/libs/src/reentrancy/README.md deleted file mode 100644 index b5e4b065..00000000 --- a/libs/src/reentrancy/README.md +++ /dev/null @@ -1,57 +0,0 @@ -

    - - - SwayApps logo - -

    - -# Overview - -The Reentrancy library provides an API to check for and disallow reentrancy on a contract. - -More information can be found in the [specification](./SPECIFICATION.md). - -## Known Issues - -While this can protect against both single-function reentrancy and cross-function reentrancy -attacks, it WILL NOT PREVENT a cross-contract reentrancy attack. - -## Using the Library - -## Getting Started - -In order to use the Reentrancy library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [README.md](../../README.md). - -You may then import the Reentrancy library's functionalities like so: - -```sway -use sway_libs::reentrancy::*; -``` - -### Using the Reentrancy Guard - -Once imported, using the Reentrancy Library can be done by calling one of the two functions. For -more information, see the [specification](./SPECIFICATION.md). - -- `is_reentrant() -> bool` -- `reentrancy_guard()` - -The `reentrancy_guard` function asserts `is_reentrant()` returns false. - -## Example - -```sway -use sway_libs::reentrancy::reentrancy_guard; - -abi MyContract { - fn my_non_reentrant_function(); -} - -impl MyContract for Contract { - fn my_non_reentrant_function() { - reentrancy_guard(); - - // my code here - } -} -``` diff --git a/libs/src/reentrancy/SPECIFICATION.md b/libs/src/reentrancy/SPECIFICATION.md deleted file mode 100644 index 90805032..00000000 --- a/libs/src/reentrancy/SPECIFICATION.md +++ /dev/null @@ -1,25 +0,0 @@ -# Overview - -This document provides an overview of the Reentrancy library. - -It outlines the use cases and specification. - -## Use Cases - -The reentrancy check is used to check if a contract ID has been called more than -once in the current call stack. - -A reentrancy, or "recursive call" attack -([example here](https://swcregistry.io/docs/SWC-107) can cause some functions to -behave in unexpected ways. This can be prevented by asserting a contract has not -yet been called in the current transaction. - -## Public Functions - -### `reentrancy_guard()` - -Reverts if the current call is reentrant. - -### `is_reentrant()` - -Returns true if the current contract ID is found in any prior contract calls. diff --git a/libs/src/signed_integers/.docs/signedints-logo-dark-theme.png b/libs/src/signed_integers/.docs/signedints-logo-dark-theme.png deleted file mode 100644 index 0fba3c37bc10660c93b4070f62f98aeea9968da4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27957 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 Cpr6?Q diff --git a/libs/src/signed_integers/.docs/signedints-logo-light-theme.png b/libs/src/signed_integers/.docs/signedints-logo-light-theme.png deleted file mode 100644 index efc690f87b84d034378530a1a71f07b547c7bde6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28043 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

    fx&1oc`7v>SH8R&-AWX`YR0U4^3@dUE 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 - - - SwayApps logo - -

    - -# Overview - -The Signed Integers library provides a library to use signed numbers in Sway. It has 6 distinct types: `I8`, `I16`, `I32`, `I64`, `I128`, `I256`. These types are stack allocated. - -These types are stored as unsigned integers, therefore either `u64` or a number of them. Therefore the size can be known at compile time and the length is static. - -For more information please see the [specification](./SPECIFICATION.md). - -# Using the Library - -## Getting Started - -In order to use the Signed Integers library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [README.md](../../README.md). - -You may then import the Signed Integers library's functionalities like so: - -```rust -use sway_libs::signed_integers::i8::I8; -``` - -Once imported, a `Signed Integer` type can be instantiated defining a new variable and calling the `new` function. - -```rust -let mut i8_value = I8::new(); -``` - -## Basic Functionality - -Basic arithmetic operations are working as usual - -```rust -// Add 2 signed values -let i8_value_3 = i8_value_1 + i8_value_2; - -// Subtract one signed value from another -let i8_value_3 = i8_value_1 - i8_value_2; -``` - -Helper functions - -```rust -// To get a negative value from an unsigned value -let neg_value = I8::neg_from(); - -// Maximum value -let max_i8_value = I8::max(); -``` - -## Known Issues -The current implementation of `U128` and `U256` will compile large bytecode sizes when performing mathematical computations. As a result, `I128` and `I256` inherit the same issue and could cause high transaction costs. This should be resolved with future optimizations of the Sway compiler. \ No newline at end of file diff --git a/libs/src/signed_integers/SPECIFICATION.md b/libs/src/signed_integers/SPECIFICATION.md deleted file mode 100644 index 145ba38f..00000000 --- a/libs/src/signed_integers/SPECIFICATION.md +++ /dev/null @@ -1,31 +0,0 @@ -# Overview - -This document provides an overview of the Signed Integers library. - -It outlines the use cases, i.e. specification, and describes how to implement the library. - -## Use Cases - -The Signed Integers library can be used anytime a one needs negative numbers. - -## Public Functions - -### `bits()` - -The size of this type in bits. - -### `max()` - -The largest value that can be represented by this integer type. - -### `min()` - -The smallest value that can be represented by this integer type. - -### `neg_from` - -Helper function to get a negative value of an unsigned number - -### Basic arithmetic operations - -`+`, `-`, `*`, `/` From f94e96ee90f39a4885db8c152202d38c5b31e848 Mon Sep 17 00:00:00 2001 From: bitzoic Date: Fri, 29 Mar 2024 12:09:49 +0900 Subject: [PATCH 04/18] Update source README --- README.md | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 00a549f1..ecb788a8 100644 --- a/README.md +++ b/README.md @@ -29,32 +29,40 @@ These libraries contain helper functions and other tools valuable to blockchain > **NOTE:** > Sway is a language under heavy development therefore the libraries may not be the most ergonomic. Over time they should receive updates / improvements in order to demonstrate how Sway can be used in real use cases. -### Libraries +## Sway Libs Book + +Please refer to the [Sway Libs Book](https://fuellabs.github.io/sway-libs/book/index.html) for documentation for a general overview on Sway Libs and how to implement libraries. + +## Sway Docs + +For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). + +## Libraries #### Assets -- [Native Asset](./libs/src/asset/) provides helper functions for the [SRC-20](https://github.com/FuelLabs/sway-standards/tree/master/standards/src20-native-asset), [SRC-3](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_3), and [SRC-7](https://github.com/FuelLabs/sway-standards/tree/master/standards/src_7) standards. +- [Native Asset](https://fuellabs.github.io/sway-libs/book/documentation/libraries/asset/asset/index.html) provides helper functions for the [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md), [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md), and [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) standards. #### Access Control and Security -- [Ownership](./libs/src/ownership/) is used to apply restrictions on functions such that only a **single** user may call them. -- [Admin](./libs/src/admin/) is used to apply restrictions on functions such that only a select few users may call them like a whitelist. -- [Pausable](./libs/src/pausable/) allows contracts to implement an emergency stop mechanism. -- [Reentrancy](./libs/src/reentrancy) is used to detect and prevent reentrancy attacks. +- [Ownership](https://fuellabs.github.io/sway-libs/book/documentation/libraries/access_security/ownership/index.html) is used to apply restrictions on functions such that only a **single** user may call them. +- [Admin](https://fuellabs.github.io/sway-libs/book/documentation/libraries/access_security/admin/index.html) is used to apply restrictions on functions such that only a select few users may call them like a whitelist. +- [Pausable](https://fuellabs.github.io/sway-libs/book/documentation/libraries/access_security/pausable/index.html) allows contracts to implement an emergency stop mechanism. +- [Reentrancy](https://fuellabs.github.io/sway-libs/book/documentation/libraries/access_security/reentrancy/index.html) is used to detect and prevent reentrancy attacks. #### Cryptography -- [Bytecode](./libs/src/bytecode/) is used for on-chain verification and computation of bytecode roots for contracts and predicates. -- [Merkle Proof](./libs/src/merkle/) is used to verify Binary Merkle Trees computed off-chain. +- [Bytecode](https://fuellabs.github.io/sway-libs/book/documentation/libraries/cryptography/bytecode/index.html) is used for on-chain verification and computation of bytecode roots for contracts and predicates. +- [Merkle Proof](https://fuellabs.github.io/sway-libs/book/documentation/libraries/cryptography/merkle/index.html) is used to verify Binary Merkle Trees computed off-chain. #### Math -- [Fixed Point Number](./libs/src/fixed_point/) is an interface to implement fixed-point numbers. -- [Signed Integers](./libs/src/signed_integers/) is an interface to implement signed integers. +- [Fixed Point Number](https://fuellabs.github.io/sway-libs/book/documentation/libraries/math/fixed_point/index.html) is an interface to implement fixed-point numbers. +- [Signed Integers](https://fuellabs.github.io/sway-libs/book/documentation/libraries/math/signed_integers/index.html) is an interface to implement signed integers. #### Data Structures -- [Queue](./libs/src/queue/) is a linear data structure that provides First-In-First-Out (FIFO) operations. +- [Queue](https://fuellabs.github.io/sway-libs/book/documentation/libraries/data_structures/queue/index.html) is a linear data structure that provides First-In-First-Out (FIFO) operations. ## Using a library @@ -79,6 +87,8 @@ For example, to import the `only_owner()` function use the following statement: use sway_libs::ownership::only_owner; ``` +For more information about implementation please refer to the [Sway Libs Book](https://fuellabs.github.io/sway-libs/book/index.html) + ## Running Tests There are two sets of tests that should be run: inline tests and sdk-harness tests. @@ -109,4 +119,4 @@ Any instructions related to using a specific library should be found within the ## Contributing -Check out the [book](https://fuellabs.github.io/sway-libs/book/index.html) for more info! +Check out the [book](https://fuellabs.github.io/sway-libs/contributing-book/index.html) for more info! From f691052be24cbfe7255c3b95fd1f03d3011cffc9 Mon Sep 17 00:00:00 2001 From: bitzoic Date: Fri, 29 Mar 2024 12:09:58 +0900 Subject: [PATCH 05/18] Add book to CI --- .github/workflows/gh-pages.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index cb3e08d5..35f3669e 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -30,6 +30,26 @@ jobs: with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./.docs/contributing-book/book + destination_dir: contributing-book + if: github.ref == 'refs/heads/master' + + deploy-book: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Setup mdBook + uses: peaceiris/actions-mdbook@v1 + with: + mdbook-version: "0.4.15" + + - run: mdbook build ./.docs/book + + - name: Deploy master + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./.docs/book/book destination_dir: book if: github.ref == 'refs/heads/master' From 1970e6cf046d6983f1587a44dee4807ba963306b Mon Sep 17 00:00:00 2001 From: bitzoic Date: Fri, 29 Mar 2024 12:15:00 +0900 Subject: [PATCH 06/18] Remove local files --- .docs/book/.DS_Store | Bin 6148 -> 0 bytes .docs/book/src/.DS_Store | Bin 6148 -> 0 bytes .docs/book/src/documentation/.DS_Store | Bin 6148 -> 0 bytes .docs/book/src/documentation/libraries/.DS_Store | Bin 6148 -> 0 bytes .../src/documentation/libraries/asset/.DS_Store | Bin 6148 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .docs/book/.DS_Store delete mode 100644 .docs/book/src/.DS_Store delete mode 100644 .docs/book/src/documentation/.DS_Store delete mode 100644 .docs/book/src/documentation/libraries/.DS_Store delete mode 100644 .docs/book/src/documentation/libraries/asset/.DS_Store diff --git a/.docs/book/.DS_Store b/.docs/book/.DS_Store deleted file mode 100644 index c19ea15685da1b93815474188f424f34d4c83f82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5Z<-brW7Fug&r5Y7Ob@vikA@U3mDOZN=;1BV9b^zHHT8jSzpK}@p+ut z-GIfMMeGdhe)GGV{UH0p7~}3DJYvjdj9JhSIVv@R?%L3nNk-&2Mm7&(8G!W>%uVdC z1AcphWh`Y6LGk_j<0#Af{ZGEtXm0Pctd`ZW?z|^ic)6c1GS^RU(7Kc|4l3ObuA*5n zwfD|slKW9IOI1M>&LHLXI!Z!WxN?z%nX2`4z-n9Vsoh;J2jfvs3{Hlto>-0t{hk;e zk5;R;wSRDUdNF;DUlRGI>Eyt+l3jxpyn|v^^XjEZER#p@RM}M)Au&J<5Cg=(W;0;U z1*@~!G|=ja0b-zr0o)%1G(^W>sZnhm(BbtN<4r^q(D5ySC=5CVON|f#;kp!1mvZyO z;JO_A!sIyyOO3jmaWylHV`i=%FI>$IexcGCcQjH@3=jkB3^cT9#GAOVD08;{SRS6W0@^(^6wE780ResO5&#D7BV85Lae+GIIR;COI12hz QIUrpG6d}|R1HZt)7l%_xi2wiq diff --git a/.docs/book/src/.DS_Store b/.docs/book/src/.DS_Store deleted file mode 100644 index 438ff1c5a25017abda18d974ce7c19fead9129d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}N6?5T3MEw@9G}g&qT53)Wf%@v>BX0ax^(Qg_`&7uQ7Etv!^&p7n)%5}(JJ zBr6tw4ju%{3{1YsWF{fsE|~-XM1LG_0W<-?LnW-#vH3!1ob;1aoQF`DIqo3=1v!MM zEdPN4`gRS7LBlnS;p6v9(Wj!x=po8r5`^)7>3JqhwK zACLOs@SJ)lT4zydhtX-8Oa{%h1FiBfRmspKq;Y~F7iX!8^`x)IDju2Kzz%qIuRdtD zrqk};Zd-PDdb75i?sYqD+1uWo&FbFz#^(O<;4ZsY`pMEP@DDW7a9F}K8b9ptF&L^$ zs~e0eXDBlnnE_^i8CX;X+e2}PwzQe+zIXbYR>m!ZV2uaYU zw*;Yd=sPSd;s}bcsfadJxF?3N>FAd(&UaW?wCNzs$~cc(S-2O9Fsq|qns5-lMQ)h^ zW?-Iys_izZ{vUn+{-00c9y7oUEEEHxb{HJ?aZ9eYe%c(>T8VmvNmqi|9e&i-4hl8)o278F&M?6;Ocy diff --git a/.docs/book/src/documentation/.DS_Store b/.docs/book/src/documentation/.DS_Store deleted file mode 100644 index 81d4e66851e06ae600e9de1367774c2f94224a11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKPfNov6i>G4Qijlj!j1v21LvHB;ic611+3^nWwvZ+u{LAf++hrQ)-U8I@$>jz zl8R#!Jc+pX;N_RRKMnb%G9J$Q?(V5dCt;ip$2uV%3?by^DozJ#=BsHs$aHRC9KsP!->uK* zt!}3wTgUB1L(aRcW<$1*I*WxP_Vy1>&ijwaQ>tDJogDr=Ejtzqc!kcIl|2XJG*Rh2 zc#F&;gOC^?28e-8VZfe$qP8gurgahn#K4ak!1F{5p_?ir+(7$63g z87P~fi}nBP`}hBH5{-xfV&Gpfz$?9==fje0ZCzO$)>;XA2a1AmxxvpA=;%@mu~>@h bpjyB#u>S5Z<+|O({YS3Oz1(Em&(U6fYsx7cim+m70*C!I&*gY7eE5v%Zi|;`2DO zyMY#iM-e+ycE8#A+0A^={b7u8cOD)yW;4btXowt@3PE$FYsUm5ay3UDEV5~k$e?1H zziGm6Z!n)_@Qc{`_kRS_B+l|)@00J;>W$r|)wJ5yz4s&+Uhe1f%=KrtIJ%ND2}<1$ zuH$GivG>nqn)`7Y%~V1hMi6p$6Q`kExN@F`nacIF!)jTriQQQ)`=eo3^iKz?u2_!x zy{;IX3|Fg`b#Qoeb~$-YUQ+p{iR8ezl0AbZyo0h<(W^I06PZ4Owah3Z35fw>fEXYK zwvz#K9$4+|ET5_-28e+l7{L8OKtps478=#o0UchS(O*YI0Uh5Gh{B*_u+Rt|5Ux`J zbt*Sc46f6`E=-(bu+XT}8CNUAJZ9zc@xs;WU>7Q!aYrNd!~ij{$v{mHZ9M-k;4f48 z$lpw%5ivjv{4)l4ee8{0D9W6z-^# diff --git a/.docs/book/src/documentation/libraries/asset/.DS_Store b/.docs/book/src/documentation/libraries/asset/.DS_Store deleted file mode 100644 index 0b3749de8fad37ca5828683e64f0202dde7e8989..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5Z<+|O({YS3Oz1(Em&(U6fYsx7cim+m70*C!I&*gY7eE5v%Zi|;`2DO zyMY#iM-e+ycE8#A+0A^={b7u8cOD)yW;4btXowt@3PE$FYsUm5ay3UDEV5~k$e?1H zziGm6Z!n)_@Qc{`_kRS_B+l|)@00J;>W$r|)wJ5yz4s&+Uhe1f%=KrtIJ%ND2}<1$ zuH$GivG>nqn)`7Y%~V1hMi6p$6Q`kExN@F`nacIF!)jTriQQQ)`=eo3^iKz?u2_!x zy{;IX3|Fg`b#Qoeb~$-YUQ+p{iR8ezl0AbZyo0h<(W^I06PZ4Owah3Z35fw>fEXYK zwvz#K9$4+|ET5_-28e+l7{L8OKtps478=#o0UchS(O*YI0Uh5Gh{B*_u+Rt|5Ux`J zbt*Sc46f6`E=-(bu+XT}8CNUAJZ9zc@xs;WU>7Q!aYrNd!~ij{$v{mHZ9M-k;4f48 z$lpw%5ivjv{4)l4ee8{0D9W6z-^# From 9a6c5f8a3db30445a06a8fb56c6f0ee4dbec050b Mon Sep 17 00:00:00 2001 From: bitzoic Date: Fri, 29 Mar 2024 13:15:36 +0900 Subject: [PATCH 07/18] Change Rust annotations to Sway --- .../documentation/libraries/data_structures/queue/index.md | 6 +++--- .../documentation/libraries/math/signed_integers/index.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.docs/book/src/documentation/libraries/data_structures/queue/index.md b/.docs/book/src/documentation/libraries/data_structures/queue/index.md index 3802cb93..f1d088a4 100644 --- a/.docs/book/src/documentation/libraries/data_structures/queue/index.md +++ b/.docs/book/src/documentation/libraries/data_structures/queue/index.md @@ -39,7 +39,7 @@ queue.enqueue(10u8); To remove elements from the `Queue`, the `dequeue` function is used. This function follows the FIFO principle. -```rust +```sway // Dequeue the first element and unwrap the value let first_item = queue.dequeue().unwrap(); ``` @@ -48,7 +48,7 @@ let first_item = queue.dequeue().unwrap(); To retrieve the element at the head of the `Queue` without removing it, you can use the `peek` function. -```rust +```sway // Peek at the head of the queue let head_item = queue.peek(); ``` @@ -57,7 +57,7 @@ let head_item = queue.peek(); The `is_empty` and `len` functions can be used to check if the queue is empty and to get the number of elements in the queue respectively. -```rust +```sway // Checks if queue is empty (returns True or False) let is_queue_empty = queue.is_empty(); diff --git a/.docs/book/src/documentation/libraries/math/signed_integers/index.md b/.docs/book/src/documentation/libraries/math/signed_integers/index.md index d28752c3..b83c2882 100644 --- a/.docs/book/src/documentation/libraries/math/signed_integers/index.md +++ b/.docs/book/src/documentation/libraries/math/signed_integers/index.md @@ -30,7 +30,7 @@ use sway_libs::signed_integers::i8::I8; Once imported, a `Signed Integer` type can be instantiated defining a new variable and calling the `new` function. -```rust +```sway let mut i8_value = I8::new(); ``` From 31dc4816270fa8995777317978a31fbd6aca09e7 Mon Sep 17 00:00:00 2001 From: bitzoic Date: Tue, 2 Apr 2024 13:55:42 +0900 Subject: [PATCH 08/18] Add spellcheck --- .github/workflows/docs.yml | 14 ++ README.md | 4 +- {.docs => docs}/book/.gitignore | 0 docs/book/.spellcheck.yml | 29 +++ {.docs => docs}/book/README.md | 0 {.docs => docs}/book/book.toml | 0 docs/book/spell-check-custom-words.txt | 190 ++++++++++++++++++ {.docs => docs}/book/src/SUMMARY.md | 0 .../documentation/getting_started/index.md | 0 .../getting_started/running_tests.md | 0 .../libraries/access_security/admin/index.md | 0 .../libraries/access_security/index.md | 0 .../access_security/ownership/index.md | 0 .../access_security/pausable/index.md | 0 .../access_security/reentrancy/index.md | 0 .../libraries/asset/asset/base.md | 0 .../libraries/asset/asset/index.md | 0 .../libraries/asset/asset/metadata.md | 0 .../libraries/asset/asset/supply.md | 0 .../documentation/libraries/asset/index.md | 0 .../libraries/cryptography/bytecode/index.md | 0 .../libraries/cryptography/index.md | 0 .../libraries/cryptography/merkle/index.md | 0 .../libraries/data_structures/index.md | 0 .../libraries/data_structures/queue/index.md | 0 .../book/src/documentation/libraries/index.md | 0 .../libraries/math/fixed_point/index.md | 0 .../src/documentation/libraries/math/index.md | 0 .../libraries/math/signed_integers/index.md | 0 {.docs => docs}/book/theme/highlight.js | 0 {.docs => docs}/contributing-book/.gitignore | 0 {.docs => docs}/contributing-book/README.md | 0 {.docs => docs}/contributing-book/book.toml | 0 .../contributing-book/src/SUMMARY.md | 0 .../contributing-book/src/code/.gitignore | 0 .../contributing-book/src/code/Forc.toml | 0 .../src/code/bad_documentation/Forc.toml | 0 .../src/code/bad_documentation/src/lib.sw | 0 .../src/code/connect_four/Forc.toml | 0 .../code/connect_four/src/data_structures.sw | 0 .../src/code/connect_four/src/errors.sw | 0 .../src/code/connect_four/src/events.sw | 0 .../src/code/connect_four/src/interface.sw | 0 .../src/code/connect_four/src/main.sw | 0 .../src/code/connect_four/src/utils.sw | 0 .../src/code/style_guide/Forc.toml | 0 .../src/code/style_guide/src/lib.sw | 0 .../src/documentation/issues/create-issue.md | 0 .../src/documentation/issues/index.md | 0 .../documentation/issues/search/assignment.md | 0 .../documentation/issues/search/filtering.md | 0 .../src/documentation/issues/search/index.md | 0 .../documentation/issues/search/summary.md | 0 .../library-quality/code-structure.md | 0 .../library-quality/documentation/code/abi.md | 0 .../documentation/code/comments.md | 0 .../documentation/code/index.md | 0 .../documentation/code/naming-components.md | 0 .../documentation/code/style.md | 0 .../library-quality/documentation/index.md | 0 .../library-quality/documentation/read-me.md | 0 .../documentation/specification.md | 0 .../documentation/library-quality/index.md | 0 .../library-quality/library-structure.md | 0 .../documentation/library-quality/testing.md | 0 .../src/documentation/pull-requests/commit.md | 0 .../pull-requests/creating-pr.md | 0 .../src/documentation/pull-requests/index.md | 0 .../src/documentation/welcome.md | 0 .../src/images/app-documentation.png | Bin .../src/images/app-filter-assignee.png | Bin .../src/images/app-filter-comments.png | Bin .../src/images/app-filter.png | Bin .../src/images/filter-dropdown.png | Bin .../src/images/issue-templates.png | Bin .../contributing-book/theme/highlight.js | 0 {.docs => docs}/sway-libs-logo-dark-theme.png | Bin .../sway-libs-logo-light-theme.png | Bin 78 files changed, 235 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/docs.yml rename {.docs => docs}/book/.gitignore (100%) create mode 100644 docs/book/.spellcheck.yml rename {.docs => docs}/book/README.md (100%) rename {.docs => docs}/book/book.toml (100%) create mode 100644 docs/book/spell-check-custom-words.txt rename {.docs => docs}/book/src/SUMMARY.md (100%) rename {.docs => docs}/book/src/documentation/getting_started/index.md (100%) rename {.docs => docs}/book/src/documentation/getting_started/running_tests.md (100%) rename {.docs => docs}/book/src/documentation/libraries/access_security/admin/index.md (100%) rename {.docs => docs}/book/src/documentation/libraries/access_security/index.md (100%) rename {.docs => docs}/book/src/documentation/libraries/access_security/ownership/index.md (100%) rename {.docs => docs}/book/src/documentation/libraries/access_security/pausable/index.md (100%) rename {.docs => docs}/book/src/documentation/libraries/access_security/reentrancy/index.md (100%) rename {.docs => docs}/book/src/documentation/libraries/asset/asset/base.md (100%) rename {.docs => docs}/book/src/documentation/libraries/asset/asset/index.md (100%) rename {.docs => docs}/book/src/documentation/libraries/asset/asset/metadata.md (100%) rename {.docs => docs}/book/src/documentation/libraries/asset/asset/supply.md (100%) rename {.docs => docs}/book/src/documentation/libraries/asset/index.md (100%) rename {.docs => docs}/book/src/documentation/libraries/cryptography/bytecode/index.md (100%) rename {.docs => docs}/book/src/documentation/libraries/cryptography/index.md (100%) rename {.docs => docs}/book/src/documentation/libraries/cryptography/merkle/index.md (100%) rename {.docs => docs}/book/src/documentation/libraries/data_structures/index.md (100%) rename {.docs => docs}/book/src/documentation/libraries/data_structures/queue/index.md (100%) rename {.docs => docs}/book/src/documentation/libraries/index.md (100%) rename {.docs => docs}/book/src/documentation/libraries/math/fixed_point/index.md (100%) rename {.docs => docs}/book/src/documentation/libraries/math/index.md (100%) rename {.docs => docs}/book/src/documentation/libraries/math/signed_integers/index.md (100%) rename {.docs => docs}/book/theme/highlight.js (100%) rename {.docs => docs}/contributing-book/.gitignore (100%) rename {.docs => docs}/contributing-book/README.md (100%) rename {.docs => docs}/contributing-book/book.toml (100%) rename {.docs => docs}/contributing-book/src/SUMMARY.md (100%) rename {.docs => docs}/contributing-book/src/code/.gitignore (100%) rename {.docs => docs}/contributing-book/src/code/Forc.toml (100%) rename {.docs => docs}/contributing-book/src/code/bad_documentation/Forc.toml (100%) rename {.docs => docs}/contributing-book/src/code/bad_documentation/src/lib.sw (100%) rename {.docs => docs}/contributing-book/src/code/connect_four/Forc.toml (100%) rename {.docs => docs}/contributing-book/src/code/connect_four/src/data_structures.sw (100%) rename {.docs => docs}/contributing-book/src/code/connect_four/src/errors.sw (100%) rename {.docs => docs}/contributing-book/src/code/connect_four/src/events.sw (100%) rename {.docs => docs}/contributing-book/src/code/connect_four/src/interface.sw (100%) rename {.docs => docs}/contributing-book/src/code/connect_four/src/main.sw (100%) rename {.docs => docs}/contributing-book/src/code/connect_four/src/utils.sw (100%) rename {.docs => docs}/contributing-book/src/code/style_guide/Forc.toml (100%) rename {.docs => docs}/contributing-book/src/code/style_guide/src/lib.sw (100%) rename {.docs => docs}/contributing-book/src/documentation/issues/create-issue.md (100%) rename {.docs => docs}/contributing-book/src/documentation/issues/index.md (100%) rename {.docs => docs}/contributing-book/src/documentation/issues/search/assignment.md (100%) rename {.docs => docs}/contributing-book/src/documentation/issues/search/filtering.md (100%) rename {.docs => docs}/contributing-book/src/documentation/issues/search/index.md (100%) rename {.docs => docs}/contributing-book/src/documentation/issues/search/summary.md (100%) rename {.docs => docs}/contributing-book/src/documentation/library-quality/code-structure.md (100%) rename {.docs => docs}/contributing-book/src/documentation/library-quality/documentation/code/abi.md (100%) rename {.docs => docs}/contributing-book/src/documentation/library-quality/documentation/code/comments.md (100%) rename {.docs => docs}/contributing-book/src/documentation/library-quality/documentation/code/index.md (100%) rename {.docs => docs}/contributing-book/src/documentation/library-quality/documentation/code/naming-components.md (100%) rename {.docs => docs}/contributing-book/src/documentation/library-quality/documentation/code/style.md (100%) rename {.docs => docs}/contributing-book/src/documentation/library-quality/documentation/index.md (100%) rename {.docs => docs}/contributing-book/src/documentation/library-quality/documentation/read-me.md (100%) rename {.docs => docs}/contributing-book/src/documentation/library-quality/documentation/specification.md (100%) rename {.docs => docs}/contributing-book/src/documentation/library-quality/index.md (100%) rename {.docs => docs}/contributing-book/src/documentation/library-quality/library-structure.md (100%) rename {.docs => docs}/contributing-book/src/documentation/library-quality/testing.md (100%) rename {.docs => docs}/contributing-book/src/documentation/pull-requests/commit.md (100%) rename {.docs => docs}/contributing-book/src/documentation/pull-requests/creating-pr.md (100%) rename {.docs => docs}/contributing-book/src/documentation/pull-requests/index.md (100%) rename {.docs => docs}/contributing-book/src/documentation/welcome.md (100%) rename {.docs => docs}/contributing-book/src/images/app-documentation.png (100%) rename {.docs => docs}/contributing-book/src/images/app-filter-assignee.png (100%) rename {.docs => docs}/contributing-book/src/images/app-filter-comments.png (100%) rename {.docs => docs}/contributing-book/src/images/app-filter.png (100%) rename {.docs => docs}/contributing-book/src/images/filter-dropdown.png (100%) rename {.docs => docs}/contributing-book/src/images/issue-templates.png (100%) rename {.docs => docs}/contributing-book/theme/highlight.js (100%) rename {.docs => docs}/sway-libs-logo-dark-theme.png (100%) rename {.docs => docs}/sway-libs-logo-light-theme.png (100%) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..2b5fe245 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,14 @@ +name: Docs + +on: + pull_request: + paths: + - docs/** + +jobs: + test: + uses: FuelLabs/github-actions/.github/workflows/mdbook-docs.yml@master + with: + docs-src-path: 'docs/book/src' + spellcheck-config-path: 'docs/book/.spellcheck.yml' + \ No newline at end of file diff --git a/README.md b/README.md index ecb788a8..9859ee79 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

    - - SwayLibs logo + + SwayLibs logo

    diff --git a/.docs/book/.gitignore b/docs/book/.gitignore similarity index 100% rename from .docs/book/.gitignore rename to docs/book/.gitignore diff --git a/docs/book/.spellcheck.yml b/docs/book/.spellcheck.yml new file mode 100644 index 00000000..162b0996 --- /dev/null +++ b/docs/book/.spellcheck.yml @@ -0,0 +1,29 @@ +matrix: + - name: SPCheck + aspell: + lang: en + dictionary: + encoding: utf-8 + wordlists: + - docs/book/spell-check-custom-words.txt + pipeline: + - pyspelling.filters.context: + context_visible_first: true + escapes: \\[\\`~] + delimiters: + # Ignore all code blocks + - open: '(?s)^(?P *`{3,}\s*(\w+\s*,?\s*)+.*?)$' + close: '^( *`{3,})$' + - pyspelling.filters.markdown: + markdown_extensions: + - pymdownx.superfences: + - pyspelling.filters.html: + comments: false + ignores: + - code + - pre + sources: + - '**/book/src/*.md' + - '**/book/src/**/*.md' + default_encoding: utf-8 + \ No newline at end of file diff --git a/.docs/book/README.md b/docs/book/README.md similarity index 100% rename from .docs/book/README.md rename to docs/book/README.md diff --git a/.docs/book/book.toml b/docs/book/book.toml similarity index 100% rename from .docs/book/book.toml rename to docs/book/book.toml diff --git a/docs/book/spell-check-custom-words.txt b/docs/book/spell-check-custom-words.txt new file mode 100644 index 00000000..ce6fe649 --- /dev/null +++ b/docs/book/spell-check-custom-words.txt @@ -0,0 +1,190 @@ +ABI +ABIs +ASM +IDE +IDEs +LSP +namespace +ALU +APIs +JSON +BrowserStack +CLI +Deserialization +deserializing +DApp +intrinsics +Intrinsics +workspace +workspaces +Workspaces +neovim +EVM +EVM's +EOA +ERC +Ethereum +Ethereum's +FVM +FuelVM +Fuelup +Github +GraphQL +Infura +JSON +LSP +Merkle +PoA +PoS +PoW +RPC +SDK +SDK's +SDKs +SauceLabs +Sepolia +Structs +Sway +TAI +TODO +TypeScript +UTF +UTXO +UTXOs +Utils +VM +VSCode +OSS +Linux +abigen +args +async +backend +backtraces +blockchain +blockchain's +breakpoint +breakpoints +bytecode +codespace +codespaces +config +cryptographic +customizable +customizations +dapp +dev +dropdown +enum +enums +env +forc +frontend +fuelup +fullstack +graphQL +graphql +http +https +halfword +js +localhost +mainnet +mempool +merkle +monorepo +monorepos +natively +npm +nvm +onboarding +params +pnpm +prerelease +queryable +quickstart +relayer +relayers +repo +repos +runnable +stateful +struct +structs +struct's +testnet +testnets +toolchain +toolchains +urql +validator +validators +superABI +superABIs +SuperABIs +supertraits +compositional +typeclass +turbofish +DSL +TOML +IPFS +Bitwise +Bitwise +runtime +runtimes +formatter +deployable +Utils +ETH +initializer +initializers +destructuring +instantiation +VMs +superset +CEI +pre +entrancy +interoperable +blockchains +keccak +SHA +UI +backtrace +Collateralized +collateralized +submodule +DEX +TypeChain +inlines +inlining +MiB +FuelVM's +deterministically +CLI +VS +GraphViz +DOT +DCA +AST +GitHub +decrypt +subcommand +subcommands +Subcommands +supertrait +supertraits +Supertraits +incrementor +monomorphization +Booleans +boolean +Orchestrator +orchestrator +growable +arity +tuple's +unary +SRC +DEX \ No newline at end of file diff --git a/.docs/book/src/SUMMARY.md b/docs/book/src/SUMMARY.md similarity index 100% rename from .docs/book/src/SUMMARY.md rename to docs/book/src/SUMMARY.md diff --git a/.docs/book/src/documentation/getting_started/index.md b/docs/book/src/documentation/getting_started/index.md similarity index 100% rename from .docs/book/src/documentation/getting_started/index.md rename to docs/book/src/documentation/getting_started/index.md diff --git a/.docs/book/src/documentation/getting_started/running_tests.md b/docs/book/src/documentation/getting_started/running_tests.md similarity index 100% rename from .docs/book/src/documentation/getting_started/running_tests.md rename to docs/book/src/documentation/getting_started/running_tests.md diff --git a/.docs/book/src/documentation/libraries/access_security/admin/index.md b/docs/book/src/documentation/libraries/access_security/admin/index.md similarity index 100% rename from .docs/book/src/documentation/libraries/access_security/admin/index.md rename to docs/book/src/documentation/libraries/access_security/admin/index.md diff --git a/.docs/book/src/documentation/libraries/access_security/index.md b/docs/book/src/documentation/libraries/access_security/index.md similarity index 100% rename from .docs/book/src/documentation/libraries/access_security/index.md rename to docs/book/src/documentation/libraries/access_security/index.md diff --git a/.docs/book/src/documentation/libraries/access_security/ownership/index.md b/docs/book/src/documentation/libraries/access_security/ownership/index.md similarity index 100% rename from .docs/book/src/documentation/libraries/access_security/ownership/index.md rename to docs/book/src/documentation/libraries/access_security/ownership/index.md diff --git a/.docs/book/src/documentation/libraries/access_security/pausable/index.md b/docs/book/src/documentation/libraries/access_security/pausable/index.md similarity index 100% rename from .docs/book/src/documentation/libraries/access_security/pausable/index.md rename to docs/book/src/documentation/libraries/access_security/pausable/index.md diff --git a/.docs/book/src/documentation/libraries/access_security/reentrancy/index.md b/docs/book/src/documentation/libraries/access_security/reentrancy/index.md similarity index 100% rename from .docs/book/src/documentation/libraries/access_security/reentrancy/index.md rename to docs/book/src/documentation/libraries/access_security/reentrancy/index.md diff --git a/.docs/book/src/documentation/libraries/asset/asset/base.md b/docs/book/src/documentation/libraries/asset/asset/base.md similarity index 100% rename from .docs/book/src/documentation/libraries/asset/asset/base.md rename to docs/book/src/documentation/libraries/asset/asset/base.md diff --git a/.docs/book/src/documentation/libraries/asset/asset/index.md b/docs/book/src/documentation/libraries/asset/asset/index.md similarity index 100% rename from .docs/book/src/documentation/libraries/asset/asset/index.md rename to docs/book/src/documentation/libraries/asset/asset/index.md diff --git a/.docs/book/src/documentation/libraries/asset/asset/metadata.md b/docs/book/src/documentation/libraries/asset/asset/metadata.md similarity index 100% rename from .docs/book/src/documentation/libraries/asset/asset/metadata.md rename to docs/book/src/documentation/libraries/asset/asset/metadata.md diff --git a/.docs/book/src/documentation/libraries/asset/asset/supply.md b/docs/book/src/documentation/libraries/asset/asset/supply.md similarity index 100% rename from .docs/book/src/documentation/libraries/asset/asset/supply.md rename to docs/book/src/documentation/libraries/asset/asset/supply.md diff --git a/.docs/book/src/documentation/libraries/asset/index.md b/docs/book/src/documentation/libraries/asset/index.md similarity index 100% rename from .docs/book/src/documentation/libraries/asset/index.md rename to docs/book/src/documentation/libraries/asset/index.md diff --git a/.docs/book/src/documentation/libraries/cryptography/bytecode/index.md b/docs/book/src/documentation/libraries/cryptography/bytecode/index.md similarity index 100% rename from .docs/book/src/documentation/libraries/cryptography/bytecode/index.md rename to docs/book/src/documentation/libraries/cryptography/bytecode/index.md diff --git a/.docs/book/src/documentation/libraries/cryptography/index.md b/docs/book/src/documentation/libraries/cryptography/index.md similarity index 100% rename from .docs/book/src/documentation/libraries/cryptography/index.md rename to docs/book/src/documentation/libraries/cryptography/index.md diff --git a/.docs/book/src/documentation/libraries/cryptography/merkle/index.md b/docs/book/src/documentation/libraries/cryptography/merkle/index.md similarity index 100% rename from .docs/book/src/documentation/libraries/cryptography/merkle/index.md rename to docs/book/src/documentation/libraries/cryptography/merkle/index.md diff --git a/.docs/book/src/documentation/libraries/data_structures/index.md b/docs/book/src/documentation/libraries/data_structures/index.md similarity index 100% rename from .docs/book/src/documentation/libraries/data_structures/index.md rename to docs/book/src/documentation/libraries/data_structures/index.md diff --git a/.docs/book/src/documentation/libraries/data_structures/queue/index.md b/docs/book/src/documentation/libraries/data_structures/queue/index.md similarity index 100% rename from .docs/book/src/documentation/libraries/data_structures/queue/index.md rename to docs/book/src/documentation/libraries/data_structures/queue/index.md diff --git a/.docs/book/src/documentation/libraries/index.md b/docs/book/src/documentation/libraries/index.md similarity index 100% rename from .docs/book/src/documentation/libraries/index.md rename to docs/book/src/documentation/libraries/index.md diff --git a/.docs/book/src/documentation/libraries/math/fixed_point/index.md b/docs/book/src/documentation/libraries/math/fixed_point/index.md similarity index 100% rename from .docs/book/src/documentation/libraries/math/fixed_point/index.md rename to docs/book/src/documentation/libraries/math/fixed_point/index.md diff --git a/.docs/book/src/documentation/libraries/math/index.md b/docs/book/src/documentation/libraries/math/index.md similarity index 100% rename from .docs/book/src/documentation/libraries/math/index.md rename to docs/book/src/documentation/libraries/math/index.md diff --git a/.docs/book/src/documentation/libraries/math/signed_integers/index.md b/docs/book/src/documentation/libraries/math/signed_integers/index.md similarity index 100% rename from .docs/book/src/documentation/libraries/math/signed_integers/index.md rename to docs/book/src/documentation/libraries/math/signed_integers/index.md diff --git a/.docs/book/theme/highlight.js b/docs/book/theme/highlight.js similarity index 100% rename from .docs/book/theme/highlight.js rename to docs/book/theme/highlight.js diff --git a/.docs/contributing-book/.gitignore b/docs/contributing-book/.gitignore similarity index 100% rename from .docs/contributing-book/.gitignore rename to docs/contributing-book/.gitignore diff --git a/.docs/contributing-book/README.md b/docs/contributing-book/README.md similarity index 100% rename from .docs/contributing-book/README.md rename to docs/contributing-book/README.md diff --git a/.docs/contributing-book/book.toml b/docs/contributing-book/book.toml similarity index 100% rename from .docs/contributing-book/book.toml rename to docs/contributing-book/book.toml diff --git a/.docs/contributing-book/src/SUMMARY.md b/docs/contributing-book/src/SUMMARY.md similarity index 100% rename from .docs/contributing-book/src/SUMMARY.md rename to docs/contributing-book/src/SUMMARY.md diff --git a/.docs/contributing-book/src/code/.gitignore b/docs/contributing-book/src/code/.gitignore similarity index 100% rename from .docs/contributing-book/src/code/.gitignore rename to docs/contributing-book/src/code/.gitignore diff --git a/.docs/contributing-book/src/code/Forc.toml b/docs/contributing-book/src/code/Forc.toml similarity index 100% rename from .docs/contributing-book/src/code/Forc.toml rename to docs/contributing-book/src/code/Forc.toml diff --git a/.docs/contributing-book/src/code/bad_documentation/Forc.toml b/docs/contributing-book/src/code/bad_documentation/Forc.toml similarity index 100% rename from .docs/contributing-book/src/code/bad_documentation/Forc.toml rename to docs/contributing-book/src/code/bad_documentation/Forc.toml diff --git a/.docs/contributing-book/src/code/bad_documentation/src/lib.sw b/docs/contributing-book/src/code/bad_documentation/src/lib.sw similarity index 100% rename from .docs/contributing-book/src/code/bad_documentation/src/lib.sw rename to docs/contributing-book/src/code/bad_documentation/src/lib.sw diff --git a/.docs/contributing-book/src/code/connect_four/Forc.toml b/docs/contributing-book/src/code/connect_four/Forc.toml similarity index 100% rename from .docs/contributing-book/src/code/connect_four/Forc.toml rename to docs/contributing-book/src/code/connect_four/Forc.toml diff --git a/.docs/contributing-book/src/code/connect_four/src/data_structures.sw b/docs/contributing-book/src/code/connect_four/src/data_structures.sw similarity index 100% rename from .docs/contributing-book/src/code/connect_four/src/data_structures.sw rename to docs/contributing-book/src/code/connect_four/src/data_structures.sw diff --git a/.docs/contributing-book/src/code/connect_four/src/errors.sw b/docs/contributing-book/src/code/connect_four/src/errors.sw similarity index 100% rename from .docs/contributing-book/src/code/connect_four/src/errors.sw rename to docs/contributing-book/src/code/connect_four/src/errors.sw diff --git a/.docs/contributing-book/src/code/connect_four/src/events.sw b/docs/contributing-book/src/code/connect_four/src/events.sw similarity index 100% rename from .docs/contributing-book/src/code/connect_four/src/events.sw rename to docs/contributing-book/src/code/connect_four/src/events.sw diff --git a/.docs/contributing-book/src/code/connect_four/src/interface.sw b/docs/contributing-book/src/code/connect_four/src/interface.sw similarity index 100% rename from .docs/contributing-book/src/code/connect_four/src/interface.sw rename to docs/contributing-book/src/code/connect_four/src/interface.sw diff --git a/.docs/contributing-book/src/code/connect_four/src/main.sw b/docs/contributing-book/src/code/connect_four/src/main.sw similarity index 100% rename from .docs/contributing-book/src/code/connect_four/src/main.sw rename to docs/contributing-book/src/code/connect_four/src/main.sw diff --git a/.docs/contributing-book/src/code/connect_four/src/utils.sw b/docs/contributing-book/src/code/connect_four/src/utils.sw similarity index 100% rename from .docs/contributing-book/src/code/connect_four/src/utils.sw rename to docs/contributing-book/src/code/connect_four/src/utils.sw diff --git a/.docs/contributing-book/src/code/style_guide/Forc.toml b/docs/contributing-book/src/code/style_guide/Forc.toml similarity index 100% rename from .docs/contributing-book/src/code/style_guide/Forc.toml rename to docs/contributing-book/src/code/style_guide/Forc.toml diff --git a/.docs/contributing-book/src/code/style_guide/src/lib.sw b/docs/contributing-book/src/code/style_guide/src/lib.sw similarity index 100% rename from .docs/contributing-book/src/code/style_guide/src/lib.sw rename to docs/contributing-book/src/code/style_guide/src/lib.sw diff --git a/.docs/contributing-book/src/documentation/issues/create-issue.md b/docs/contributing-book/src/documentation/issues/create-issue.md similarity index 100% rename from .docs/contributing-book/src/documentation/issues/create-issue.md rename to docs/contributing-book/src/documentation/issues/create-issue.md diff --git a/.docs/contributing-book/src/documentation/issues/index.md b/docs/contributing-book/src/documentation/issues/index.md similarity index 100% rename from .docs/contributing-book/src/documentation/issues/index.md rename to docs/contributing-book/src/documentation/issues/index.md diff --git a/.docs/contributing-book/src/documentation/issues/search/assignment.md b/docs/contributing-book/src/documentation/issues/search/assignment.md similarity index 100% rename from .docs/contributing-book/src/documentation/issues/search/assignment.md rename to docs/contributing-book/src/documentation/issues/search/assignment.md diff --git a/.docs/contributing-book/src/documentation/issues/search/filtering.md b/docs/contributing-book/src/documentation/issues/search/filtering.md similarity index 100% rename from .docs/contributing-book/src/documentation/issues/search/filtering.md rename to docs/contributing-book/src/documentation/issues/search/filtering.md diff --git a/.docs/contributing-book/src/documentation/issues/search/index.md b/docs/contributing-book/src/documentation/issues/search/index.md similarity index 100% rename from .docs/contributing-book/src/documentation/issues/search/index.md rename to docs/contributing-book/src/documentation/issues/search/index.md diff --git a/.docs/contributing-book/src/documentation/issues/search/summary.md b/docs/contributing-book/src/documentation/issues/search/summary.md similarity index 100% rename from .docs/contributing-book/src/documentation/issues/search/summary.md rename to docs/contributing-book/src/documentation/issues/search/summary.md diff --git a/.docs/contributing-book/src/documentation/library-quality/code-structure.md b/docs/contributing-book/src/documentation/library-quality/code-structure.md similarity index 100% rename from .docs/contributing-book/src/documentation/library-quality/code-structure.md rename to docs/contributing-book/src/documentation/library-quality/code-structure.md diff --git a/.docs/contributing-book/src/documentation/library-quality/documentation/code/abi.md b/docs/contributing-book/src/documentation/library-quality/documentation/code/abi.md similarity index 100% rename from .docs/contributing-book/src/documentation/library-quality/documentation/code/abi.md rename to docs/contributing-book/src/documentation/library-quality/documentation/code/abi.md diff --git a/.docs/contributing-book/src/documentation/library-quality/documentation/code/comments.md b/docs/contributing-book/src/documentation/library-quality/documentation/code/comments.md similarity index 100% rename from .docs/contributing-book/src/documentation/library-quality/documentation/code/comments.md rename to docs/contributing-book/src/documentation/library-quality/documentation/code/comments.md diff --git a/.docs/contributing-book/src/documentation/library-quality/documentation/code/index.md b/docs/contributing-book/src/documentation/library-quality/documentation/code/index.md similarity index 100% rename from .docs/contributing-book/src/documentation/library-quality/documentation/code/index.md rename to docs/contributing-book/src/documentation/library-quality/documentation/code/index.md diff --git a/.docs/contributing-book/src/documentation/library-quality/documentation/code/naming-components.md b/docs/contributing-book/src/documentation/library-quality/documentation/code/naming-components.md similarity index 100% rename from .docs/contributing-book/src/documentation/library-quality/documentation/code/naming-components.md rename to docs/contributing-book/src/documentation/library-quality/documentation/code/naming-components.md diff --git a/.docs/contributing-book/src/documentation/library-quality/documentation/code/style.md b/docs/contributing-book/src/documentation/library-quality/documentation/code/style.md similarity index 100% rename from .docs/contributing-book/src/documentation/library-quality/documentation/code/style.md rename to docs/contributing-book/src/documentation/library-quality/documentation/code/style.md diff --git a/.docs/contributing-book/src/documentation/library-quality/documentation/index.md b/docs/contributing-book/src/documentation/library-quality/documentation/index.md similarity index 100% rename from .docs/contributing-book/src/documentation/library-quality/documentation/index.md rename to docs/contributing-book/src/documentation/library-quality/documentation/index.md diff --git a/.docs/contributing-book/src/documentation/library-quality/documentation/read-me.md b/docs/contributing-book/src/documentation/library-quality/documentation/read-me.md similarity index 100% rename from .docs/contributing-book/src/documentation/library-quality/documentation/read-me.md rename to docs/contributing-book/src/documentation/library-quality/documentation/read-me.md diff --git a/.docs/contributing-book/src/documentation/library-quality/documentation/specification.md b/docs/contributing-book/src/documentation/library-quality/documentation/specification.md similarity index 100% rename from .docs/contributing-book/src/documentation/library-quality/documentation/specification.md rename to docs/contributing-book/src/documentation/library-quality/documentation/specification.md diff --git a/.docs/contributing-book/src/documentation/library-quality/index.md b/docs/contributing-book/src/documentation/library-quality/index.md similarity index 100% rename from .docs/contributing-book/src/documentation/library-quality/index.md rename to docs/contributing-book/src/documentation/library-quality/index.md diff --git a/.docs/contributing-book/src/documentation/library-quality/library-structure.md b/docs/contributing-book/src/documentation/library-quality/library-structure.md similarity index 100% rename from .docs/contributing-book/src/documentation/library-quality/library-structure.md rename to docs/contributing-book/src/documentation/library-quality/library-structure.md diff --git a/.docs/contributing-book/src/documentation/library-quality/testing.md b/docs/contributing-book/src/documentation/library-quality/testing.md similarity index 100% rename from .docs/contributing-book/src/documentation/library-quality/testing.md rename to docs/contributing-book/src/documentation/library-quality/testing.md diff --git a/.docs/contributing-book/src/documentation/pull-requests/commit.md b/docs/contributing-book/src/documentation/pull-requests/commit.md similarity index 100% rename from .docs/contributing-book/src/documentation/pull-requests/commit.md rename to docs/contributing-book/src/documentation/pull-requests/commit.md diff --git a/.docs/contributing-book/src/documentation/pull-requests/creating-pr.md b/docs/contributing-book/src/documentation/pull-requests/creating-pr.md similarity index 100% rename from .docs/contributing-book/src/documentation/pull-requests/creating-pr.md rename to docs/contributing-book/src/documentation/pull-requests/creating-pr.md diff --git a/.docs/contributing-book/src/documentation/pull-requests/index.md b/docs/contributing-book/src/documentation/pull-requests/index.md similarity index 100% rename from .docs/contributing-book/src/documentation/pull-requests/index.md rename to docs/contributing-book/src/documentation/pull-requests/index.md diff --git a/.docs/contributing-book/src/documentation/welcome.md b/docs/contributing-book/src/documentation/welcome.md similarity index 100% rename from .docs/contributing-book/src/documentation/welcome.md rename to docs/contributing-book/src/documentation/welcome.md diff --git a/.docs/contributing-book/src/images/app-documentation.png b/docs/contributing-book/src/images/app-documentation.png similarity index 100% rename from .docs/contributing-book/src/images/app-documentation.png rename to docs/contributing-book/src/images/app-documentation.png diff --git a/.docs/contributing-book/src/images/app-filter-assignee.png b/docs/contributing-book/src/images/app-filter-assignee.png similarity index 100% rename from .docs/contributing-book/src/images/app-filter-assignee.png rename to docs/contributing-book/src/images/app-filter-assignee.png diff --git a/.docs/contributing-book/src/images/app-filter-comments.png b/docs/contributing-book/src/images/app-filter-comments.png similarity index 100% rename from .docs/contributing-book/src/images/app-filter-comments.png rename to docs/contributing-book/src/images/app-filter-comments.png diff --git a/.docs/contributing-book/src/images/app-filter.png b/docs/contributing-book/src/images/app-filter.png similarity index 100% rename from .docs/contributing-book/src/images/app-filter.png rename to docs/contributing-book/src/images/app-filter.png diff --git a/.docs/contributing-book/src/images/filter-dropdown.png b/docs/contributing-book/src/images/filter-dropdown.png similarity index 100% rename from .docs/contributing-book/src/images/filter-dropdown.png rename to docs/contributing-book/src/images/filter-dropdown.png diff --git a/.docs/contributing-book/src/images/issue-templates.png b/docs/contributing-book/src/images/issue-templates.png similarity index 100% rename from .docs/contributing-book/src/images/issue-templates.png rename to docs/contributing-book/src/images/issue-templates.png diff --git a/.docs/contributing-book/theme/highlight.js b/docs/contributing-book/theme/highlight.js similarity index 100% rename from .docs/contributing-book/theme/highlight.js rename to docs/contributing-book/theme/highlight.js diff --git a/.docs/sway-libs-logo-dark-theme.png b/docs/sway-libs-logo-dark-theme.png similarity index 100% rename from .docs/sway-libs-logo-dark-theme.png rename to docs/sway-libs-logo-dark-theme.png diff --git a/.docs/sway-libs-logo-light-theme.png b/docs/sway-libs-logo-light-theme.png similarity index 100% rename from .docs/sway-libs-logo-light-theme.png rename to docs/sway-libs-logo-light-theme.png From b99741eedf9ba5df0d166de5bf8837c383d0eca7 Mon Sep 17 00:00:00 2001 From: bitzoic Date: Tue, 2 Apr 2024 14:39:30 +0900 Subject: [PATCH 09/18] Resolve new CI issues --- README.md | 2 +- docs/book/spell-check-custom-words.txt | 21 ++++++++- docs/book/src/SUMMARY.md | 44 ++++++++++--------- .../getting_started/index.md | 4 +- .../getting_started/running_tests.md | 2 +- docs/book/src/index.md | 9 ++++ .../libraries/access_security/admin/index.md | 9 ++-- .../libraries/access_security/index.md | 2 +- .../access_security/ownership/index.md | 4 +- .../access_security/pausable/index.md | 4 +- .../access_security/reentrancy/index.md | 4 +- .../libraries/asset/asset/base.md | 2 +- .../libraries/asset/asset/index.md | 15 +++---- .../libraries/asset/asset/metadata.md | 8 +--- .../libraries/asset/asset/supply.md | 2 +- .../libraries/asset/index.md | 0 .../libraries/cryptography/bytecode/index.md | 8 ++-- .../libraries/cryptography/index.md | 2 +- .../libraries/cryptography/merkle/index.md | 12 +++-- .../libraries/data_structures/index.md | 6 +-- .../libraries/data_structures/queue/index.md | 2 - .../{documentation => }/libraries/index.md | 28 ++++++------ .../libraries/math/fixed_point/index.md | 12 +++-- .../libraries/math/index.md | 4 +- .../libraries/math/signed_integers/index.md | 7 ++- .../src/documentation/issues/create-issue.md | 2 +- .../src/documentation/issues/index.md | 2 +- .../documentation/issues/search/filtering.md | 2 +- .../src/documentation/issues/search/index.md | 3 +- .../documentation/issues/search/summary.md | 2 +- .../library-quality/documentation/code/abi.md | 2 +- .../documentation/code/comments.md | 2 +- .../documentation/code/index.md | 2 +- .../documentation/code/naming-components.md | 4 +- .../library-quality/documentation/read-me.md | 3 +- .../documentation/specification.md | 4 +- .../documentation/library-quality/index.md | 2 +- .../library-quality/library-structure.md | 4 +- .../documentation/library-quality/testing.md | 4 +- .../src/documentation/pull-requests/commit.md | 4 +- .../pull-requests/creating-pr.md | 4 +- libs/src/pausable.sw | 6 +-- libs/src/queue/SPECIFICATION.md | 41 ----------------- 43 files changed, 134 insertions(+), 172 deletions(-) rename docs/book/src/{documentation => }/getting_started/index.md (93%) rename docs/book/src/{documentation => }/getting_started/running_tests.md (88%) create mode 100644 docs/book/src/index.md rename docs/book/src/{documentation => }/libraries/access_security/admin/index.md (85%) rename docs/book/src/{documentation => }/libraries/access_security/index.md (92%) rename docs/book/src/{documentation => }/libraries/access_security/ownership/index.md (83%) rename docs/book/src/{documentation => }/libraries/access_security/pausable/index.md (98%) rename docs/book/src/{documentation => }/libraries/access_security/reentrancy/index.md (98%) rename docs/book/src/{documentation => }/libraries/asset/asset/base.md (93%) rename docs/book/src/{documentation => }/libraries/asset/asset/index.md (63%) rename docs/book/src/{documentation => }/libraries/asset/asset/metadata.md (95%) rename docs/book/src/{documentation => }/libraries/asset/asset/supply.md (94%) rename docs/book/src/{documentation => }/libraries/asset/index.md (100%) rename docs/book/src/{documentation => }/libraries/cryptography/bytecode/index.md (97%) rename docs/book/src/{documentation => }/libraries/cryptography/index.md (97%) rename docs/book/src/{documentation => }/libraries/cryptography/merkle/index.md (93%) rename docs/book/src/{documentation => }/libraries/data_structures/index.md (78%) rename docs/book/src/{documentation => }/libraries/data_structures/queue/index.md (98%) rename docs/book/src/{documentation => }/libraries/index.md (78%) rename docs/book/src/{documentation => }/libraries/math/fixed_point/index.md (95%) rename docs/book/src/{documentation => }/libraries/math/index.md (59%) rename docs/book/src/{documentation => }/libraries/math/signed_integers/index.md (95%) delete mode 100644 libs/src/queue/SPECIFICATION.md diff --git a/README.md b/README.md index 9859ee79..bb40bb02 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ forc test && cargo test ``` > **NOTE:** -> This may take a while depending on your hardware, future improvements to Sway will decrease build times. After this has been run once, indiviual test projects may be built on their own to save time. +> This may take a while depending on your hardware, future improvements to Sway will decrease build times. After this has been run once, individual test projects may be built on their own to save time. Any instructions related to using a specific library should be found within the README.md of that library. diff --git a/docs/book/spell-check-custom-words.txt b/docs/book/spell-check-custom-words.txt index ce6fe649..2d0e48d1 100644 --- a/docs/book/spell-check-custom-words.txt +++ b/docs/book/spell-check-custom-words.txt @@ -187,4 +187,23 @@ arity tuple's unary SRC -DEX \ No newline at end of file +DEX +Pausable +pausable +unpause +Reentrancy +reentrancy +reentrant +Libs +sdk +KiB +Configurables +configurables +predicates's +encompases +mathematic +abi +Enqueuing +Dequeuing +StorageMetadata +functionly \ No newline at end of file diff --git a/docs/book/src/SUMMARY.md b/docs/book/src/SUMMARY.md index 9b389281..ee66ea95 100644 --- a/docs/book/src/SUMMARY.md +++ b/docs/book/src/SUMMARY.md @@ -1,23 +1,25 @@ # Summary -- [Getting Started](./documentation/getting_started/index.md) - - [Running Tests](./documentation/getting_started/running_tests.md) -- [Libraries](./documentation/libraries/index.md) - - [Asset Libraries](./documentation/libraries/asset/index.md) - - [Asset Library](./documentation/libraries/asset/asset/index.md) - - [Base](./documentation/libraries/asset/asset/base.md) - - [Supply](./documentation/libraries/asset/asset/supply.md) - - [Metadata](./documentation/libraries/asset/asset/metadata.md) - - [Access Control and Secutiry Libraries](./documentation/libraries/access_security/index.md) - - [Admin Library](./documentation/libraries/access_security/admin/index.md) - - [Ownership Library](./documentation/libraries/access_security/ownership/index.md) - - [Pausable Library](./documentation/libraries/access_security/pausable/index.md) - - [Reentrancy Guard Library](./documentation/libraries/access_security/reentrancy/index.md) - - [Cryptography Libraries](./documentation/libraries/cryptography/index.md) - - [Bytecode Library](./documentation/libraries/cryptography/bytecode/index.md) - - [Merkle Library](./documentation/libraries/cryptography/merkle/index.md) - - [Math Libraries](./documentation/libraries/math/index.md) - - [Fixed Point Number Library](./documentation/libraries/math/fixed_point/index.md) - - [Signed Integers Library](./documentation/libraries/math/signed_integers/index.md) - - [Data Structure Libraries](./documentation/libraries/data_structures/index.md) - - [Queue Library](./documentation/libraries/data_structures/queue/index.md) +[Sway Libraries](./index.md) + +- [Getting Started](./getting_started/index.md) + - [Running Tests](./getting_started/running_tests.md) +- [Libraries](./libraries/index.md) + - [Asset Libraries](./libraries/asset/index.md) + - [Asset Library](./libraries/asset/asset/index.md) + - [Base](./libraries/asset/asset/base.md) + - [Supply](./libraries/asset/asset/supply.md) + - [Metadata](./libraries/asset/asset/metadata.md) + - [Access Control and Security Libraries](./libraries/access_security/index.md) + - [Admin Library](./libraries/access_security/admin/index.md) + - [Ownership Library](./libraries/access_security/ownership/index.md) + - [Pausable Library](./libraries/access_security/pausable/index.md) + - [Reentrancy Guard Library](./libraries/access_security/reentrancy/index.md) + - [Cryptography Libraries](./libraries/cryptography/index.md) + - [Bytecode Library](./libraries/cryptography/bytecode/index.md) + - [Merkle Library](./libraries/cryptography/merkle/index.md) + - [Math Libraries](./libraries/math/index.md) + - [Fixed Point Number Library](./libraries/math/fixed_point/index.md) + - [Signed Integers Library](./libraries/math/signed_integers/index.md) + - [Data Structure Libraries](./libraries/data_structures/index.md) + - [Queue Library](./libraries/data_structures/queue/index.md) diff --git a/docs/book/src/documentation/getting_started/index.md b/docs/book/src/getting_started/index.md similarity index 93% rename from docs/book/src/documentation/getting_started/index.md rename to docs/book/src/getting_started/index.md index d9b4dbf6..4912a9ba 100644 --- a/docs/book/src/documentation/getting_started/index.md +++ b/docs/book/src/getting_started/index.md @@ -44,7 +44,7 @@ use sway_libs::ownership::only_owner; Once the library you require has been imported to your project, you may call or use any functions and structures the library provides. -In the following example, we import the Pausable Library and implement the `Pausable` abi with it's associated functions. +In the following example, we import the Pausable Library and implement the `Pausable` ABI with it's associated functions. ```sway use sway_libs::pausable::{_is_paused, _pause, _unpause, Pausable}; @@ -68,6 +68,6 @@ impl Pausable for Contract { } ``` -Any instructions related to using a specific library should be found within the README.md of that library. +Any instructions related to using a specific library should be found within the [libraries](../libraries/index.md) section of the Sway Libs Book. For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). diff --git a/docs/book/src/documentation/getting_started/running_tests.md b/docs/book/src/getting_started/running_tests.md similarity index 88% rename from docs/book/src/documentation/getting_started/running_tests.md rename to docs/book/src/getting_started/running_tests.md index e4984ee4..dc61441f 100644 --- a/docs/book/src/documentation/getting_started/running_tests.md +++ b/docs/book/src/getting_started/running_tests.md @@ -19,4 +19,4 @@ forc test && cargo test ``` > **NOTE:** -> This may take a while depending on your hardware, future improvements to Sway will decrease build times. After this has been run once, indiviual test projects may be built on their own to save time. +> This may take a while depending on your hardware, future improvements to Sway will decrease build times. After this has been run once, individual test projects may be built on their own to save time. diff --git a/docs/book/src/index.md b/docs/book/src/index.md new file mode 100644 index 00000000..0216f52a --- /dev/null +++ b/docs/book/src/index.md @@ -0,0 +1,9 @@ +# Sway Libraries + +The purpose of Sway Libraries is to contain libraries which users can import and use that are not part of the standard library. + +These libraries contain helper functions and other tools valuable to blockchain development. + +> **NOTE:** +> Sway is a language under heavy development therefore the libraries may not be the most ergonomic. Over time they should receive updates / improvements in order to demonstrate how Sway can be used in real use cases. +> \ No newline at end of file diff --git a/docs/book/src/documentation/libraries/access_security/admin/index.md b/docs/book/src/libraries/access_security/admin/index.md similarity index 85% rename from docs/book/src/documentation/libraries/access_security/admin/index.md rename to docs/book/src/libraries/access_security/admin/index.md index 17a632ca..c6097415 100644 --- a/docs/book/src/documentation/libraries/access_security/admin/index.md +++ b/docs/book/src/libraries/access_security/admin/index.md @@ -1,13 +1,11 @@ # Admin Library -The Admin library provides a way to block users without an "adimistrative status" from calling functions within a contract. The Admin Library differs from the [Ownership Library](../ownership/index.md) as multiple users may have adimistrative status. The Admin Library is often used when needing administrative calls on a contract that involve multiple users or a whitelist. +The Admin library provides a way to block users without an "administrative status" from calling functions within a contract. The Admin Library differs from the [Ownership Library](../ownership/index.md) as multiple users may have administrative status. The Admin Library is often used when needing administrative calls on a contract that involve multiple users or a whitelist. -This library extends the [Ownership Library](../ownership/index.md). The Ownership library must be imported and used to enable the Admin library. Only the contract's owner may add and remove administrative users. +This library extends the [Ownership Library](../ownership/index.md). The Ownership library must be imported and used to enable the Admin library. Only the contract's owner may add and remove administrative users. For implementation details on the Admin Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/admin/index.html). -# Using the Library - ## Importing the Admin Library In order to use the Admin Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). @@ -50,6 +48,7 @@ fn add_a_admin(new_admin: Identity) { add_admin(new_admin); } ``` + > **NOTE** Only the contract's owner may call this function. Please see the example above to set a contract owner. ### Removing an Admin @@ -92,7 +91,7 @@ fn both_owner_or_admin_may_call() { ### Checking Admin Status -To check the administrative privledges of a user, call the `is_admin()` function. +To check the administrative privileges of a user, call the `is_admin()` function. ```sway #[storage(read)] diff --git a/docs/book/src/documentation/libraries/access_security/index.md b/docs/book/src/libraries/access_security/index.md similarity index 92% rename from docs/book/src/documentation/libraries/access_security/index.md rename to docs/book/src/libraries/access_security/index.md index d17b94df..05e72312 100644 --- a/docs/book/src/documentation/libraries/access_security/index.md +++ b/docs/book/src/libraries/access_security/index.md @@ -1,6 +1,6 @@ # Access Control and Security Libraries -Access Control and Security Libraries are any libraries that are built and intended to provide additional saftey when developing smart contracts. +Access Control and Security Libraries are any libraries that are built and intended to provide additional safety when developing smart contracts. For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). diff --git a/docs/book/src/documentation/libraries/access_security/ownership/index.md b/docs/book/src/libraries/access_security/ownership/index.md similarity index 83% rename from docs/book/src/documentation/libraries/access_security/ownership/index.md rename to docs/book/src/libraries/access_security/ownership/index.md index 75730d9c..393f3c12 100644 --- a/docs/book/src/documentation/libraries/access_security/ownership/index.md +++ b/docs/book/src/libraries/access_security/ownership/index.md @@ -4,11 +4,9 @@ The Ownership Library provides a way to block anyone other than a **single** "ow For implementation details on the Ownership Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/ownership/index.html). -# Using the Library - ## Importing the Ownership Library -In order to use the Ownership library, Sway Libs and [Sway Standards]() must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). To add Sway Standards as a dependency please see the [Sway Standards Book](). +In order to use the Ownership library, Sway Libs and [Sway Standards](https://github.com/FuelLabs/sway-standards) must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). To add Sway Standards as a dependency please see the [Sway Standards Book](https://fuellabs.github.io/sway-libs/master/sway_libs/ownership/index.html). To import the Ownership Library and [SRC-5](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-5.md) Standard to your Sway Smart Contract, add the following to your Sway file: diff --git a/docs/book/src/documentation/libraries/access_security/pausable/index.md b/docs/book/src/libraries/access_security/pausable/index.md similarity index 98% rename from docs/book/src/documentation/libraries/access_security/pausable/index.md rename to docs/book/src/libraries/access_security/pausable/index.md index 8a730be2..1f43263d 100644 --- a/docs/book/src/documentation/libraries/access_security/pausable/index.md +++ b/docs/book/src/libraries/access_security/pausable/index.md @@ -6,8 +6,6 @@ It is highly encouraged to use the [Ownership Library](../ownership/index.md) in For implementation details on the Pausable Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/pausable/index.html). -# Using the Library - ## Importing the Pausable Library In order to use the Pausable library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). @@ -76,7 +74,7 @@ fn require_not_paused_state() { ## Using the Ownership Library with the Pausable Library -It is highly recommended to integrate the [Ownership Library](../ownership/index.md) with the Pausable Library and apply restrictions the `pause()` and `unpause()` functions. This will ensure that only a single user may pause and unpause a contract in cause of emergency. Failure to apply this restriction will allow any user to obstruct a contract's functionalty. +It is highly recommended to integrate the [Ownership Library](../ownership/index.md) with the Pausable Library and apply restrictions the `pause()` and `unpause()` functions. This will ensure that only a single user may pause and unpause a contract in cause of emergency. Failure to apply this restriction will allow any user to obstruct a contract's functionality. The follow example implements the `Pausable` abi and applies restrictions to it's pause/unpause functions. The owner of the contract must be set in an constructor defined by `MyConstructor` in this example. diff --git a/docs/book/src/documentation/libraries/access_security/reentrancy/index.md b/docs/book/src/libraries/access_security/reentrancy/index.md similarity index 98% rename from docs/book/src/documentation/libraries/access_security/reentrancy/index.md rename to docs/book/src/libraries/access_security/reentrancy/index.md index 9a987ab9..9cc8831b 100644 --- a/docs/book/src/documentation/libraries/access_security/reentrancy/index.md +++ b/docs/book/src/libraries/access_security/reentrancy/index.md @@ -9,12 +9,10 @@ A reentrancy, or "recursive call" attack can cause some functions to behave in u For implementation details on the Reentrancy Guard Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/reentrancy/index.html). -# Known Issues +## Known Issues While this can protect against both single-function reentrancy and cross-function reentrancy attacks, it WILL NOT PREVENT a cross-contract reentrancy attack. -# Using the Library - ## Importing the Reentrancy Guard Library In order to use the Reentrancy Guard library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). diff --git a/docs/book/src/documentation/libraries/asset/asset/base.md b/docs/book/src/libraries/asset/asset/base.md similarity index 93% rename from docs/book/src/documentation/libraries/asset/asset/base.md rename to docs/book/src/libraries/asset/asset/base.md index 8e1f7abf..b969dc14 100644 --- a/docs/book/src/documentation/libraries/asset/asset/base.md +++ b/docs/book/src/libraries/asset/asset/base.md @@ -131,7 +131,7 @@ impl SRC20 for Contract { ## Setting an Asset's SRC-20 Attributes -To set some the asset attributes for an Asset, use the `SetAssetAttributes` ABI provided by the Asset Library. TThe example below shows the implementation of the `SetAssetAttributes` ABI with no user defined restrictions or custom functionality. It is recommended that the [Ownership Library](../../access_security/ownership/) is used in conjunction with the `SetAssetAttributes` ABI to ensure only a single user has permissions to set an Asset's attributes. +To set some the asset attributes for an Asset, use the `SetAssetAttributes` ABI provided by the Asset Library. The example below shows the implementation of the `SetAssetAttributes` ABI with no user defined restrictions or custom functionality. It is recommended that the [Ownership Library](../../access_security/ownership/) is used in conjunction with the `SetAssetAttributes` ABI to ensure only a single user has permissions to set an Asset's attributes. ```sway use sway_libs::asset::base::*; diff --git a/docs/book/src/documentation/libraries/asset/asset/index.md b/docs/book/src/libraries/asset/asset/index.md similarity index 63% rename from docs/book/src/documentation/libraries/asset/asset/index.md rename to docs/book/src/libraries/asset/asset/index.md index 225d885d..60bd31b4 100644 --- a/docs/book/src/documentation/libraries/asset/asset/index.md +++ b/docs/book/src/libraries/asset/asset/index.md @@ -1,22 +1,17 @@ # Asset Library -The Asset Library provides basic helper functions for the [SRC-20; Native Asset Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md), [SRC-3; Mint and Burn Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md), and the [SRC-7; Arbitrary Asset Metadata Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md). It is intended to make develpment of Native Assets using Sway quick and easy while following the standard's specifications. +The Asset Library provides basic helper functions for the [SRC-20; Native Asset Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md), [SRC-3; Mint and Burn Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md), and the [SRC-7; Arbitrary Asset Metadata Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md). It is intended to make development of Native Assets using Sway quick and easy while following the standard's specifications. For implementation details on the Asset Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/asset/index.html). -# Using the Library - ## [SRC-20 Functionality](./base.md) The Base or core of any Asset on the Fuel Network must follow the [SRC-20; Native Asset Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md). The Asset Library's [Base](./base.md) section supports the [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md)'s implementation. -## [SRC-3 Functionaltity](supply.md) - -The [SRC-3; Mint and Burn Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md) prescribes an ABI for how Native Assets on the Fuel Network are minted and burned. The Asset Library's [suppy](./supply.md) section supports the [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md)'s implementation. - -## [SRC-7 Functionaltity](./metadata.md) +## [SRC-3 Functionality](supply.md) -The [SRC-7; Arbitrary Asset Metadata Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) prescribes an ABI for metadat associated with Native Assets on the Fuel Network. The Asset Library's [metadata](./metadata.md) section supports the [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md)'s implementation. +The [SRC-3; Mint and Burn Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md) prescribes an ABI for how Native Assets on the Fuel Network are minted and burned. The Asset Library's [supply](./supply.md) section supports the [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md)'s implementation. +## [SRC-7 Functionality](./metadata.md) -For more information please see the [specification](../../../../../../../libs/native_asset/2/SPECIFICATION.md). +The [SRC-7; Arbitrary Asset Metadata Standard](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) prescribes an ABI for metadata associated with Native Assets on the Fuel Network. The Asset Library's [metadata](./metadata.md) section supports the [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md)'s implementation. diff --git a/docs/book/src/documentation/libraries/asset/asset/metadata.md b/docs/book/src/libraries/asset/asset/metadata.md similarity index 95% rename from docs/book/src/documentation/libraries/asset/asset/metadata.md rename to docs/book/src/libraries/asset/asset/metadata.md index 4e0a11df..176d8d2f 100644 --- a/docs/book/src/documentation/libraries/asset/asset/metadata.md +++ b/docs/book/src/libraries/asset/asset/metadata.md @@ -68,11 +68,11 @@ impl SetAssetMetadata for Contract { } ``` -> **NOTE** The `_set_metadata()` function will set the metdata of an asset *unconditionally*. External checks should be applied to restrict the setting of metadata. +> **NOTE** The `_set_metadata()` function will set the metadata of an asset *unconditionally*. External checks should be applied to restrict the setting of metadata. ### Implementing the SRC-7 Standard with StorageMetadata -To use the `StorageMetadata` type, simply get the stored metadata with the associated `key` and `AssetId`. The example below shows the implementation of the [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) standard in combination with the Asset Library's `StorageMetadata` type with no user defined restrictions or custom functionality. +To use the `StorageMetadata` type, simply get the stored metadata with the associated `key` and `AssetId`. The example below shows the implementation of the [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) standard in combination with the Asset Library's `StorageMetadata` type with no user defined restrictions or custom functionality. ```sway use sway_libs::asset::metadata::*; @@ -112,7 +112,6 @@ The Asset Library enables the following functionality for the `Metadata` type: The `is_b256()` check enables checking whether the `Metadata` type is a `b256`. The `as_b256()` returns the `b256` of the `Metadata` type. - ```sway fn b256_type(my_metadata: Metadata) { assert(my_metadata.is_b256()); @@ -126,7 +125,6 @@ fn b256_type(my_metadata: Metadata) { The `is_bytes()` check enables checking whether the `Metadata` type is a `Bytes`. The `as_bytes()` returns the `Bytes` of the `Metadata` type. - ```sway fn bytes_type(my_metadata: Metadata) { assert(my_metadata.is_bytes()); @@ -140,7 +138,6 @@ fn bytes_type(my_metadata: Metadata) { The `is_u64()` check enables checking whether the `Metadata` type is a `u64`. The `as_u64()` returns the `u64` of the `Metadata` type. - ```sway fn u64_type(my_metadata: Metadata) { assert(my_metadata.is_u64()); @@ -154,7 +151,6 @@ fn u64_type(my_metadata: Metadata) { The `is_string()` check enables checking whether the `Metadata` type is a `String`. The `as_string()` returns the `String` of the `Metadata` type. - ```sway fn string_type(my_metadata: Metadata) { assert(my_metadata.is_string()); diff --git a/docs/book/src/documentation/libraries/asset/asset/supply.md b/docs/book/src/libraries/asset/asset/supply.md similarity index 94% rename from docs/book/src/documentation/libraries/asset/asset/supply.md rename to docs/book/src/libraries/asset/asset/supply.md index 0304ecd1..127a0ab6 100644 --- a/docs/book/src/documentation/libraries/asset/asset/supply.md +++ b/docs/book/src/libraries/asset/asset/supply.md @@ -1,6 +1,6 @@ # Supply Functionality -Forimplementation details on the Asset Library supply functionality please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/asset/supply/index.html). +For implementation details on the Asset Library supply functionality please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/asset/mint/index.html). ## Importing the Asset Library Supply Functionality diff --git a/docs/book/src/documentation/libraries/asset/index.md b/docs/book/src/libraries/asset/index.md similarity index 100% rename from docs/book/src/documentation/libraries/asset/index.md rename to docs/book/src/libraries/asset/index.md diff --git a/docs/book/src/documentation/libraries/cryptography/bytecode/index.md b/docs/book/src/libraries/cryptography/bytecode/index.md similarity index 97% rename from docs/book/src/documentation/libraries/cryptography/bytecode/index.md rename to docs/book/src/libraries/cryptography/bytecode/index.md index e1d3fb15..ef9008bb 100644 --- a/docs/book/src/documentation/libraries/cryptography/bytecode/index.md +++ b/docs/book/src/libraries/cryptography/bytecode/index.md @@ -1,13 +1,11 @@ # Bytecode Library -The Bytecode Library allows for on-chain verification and computation of bytecode roots for contracts and predicates. +The Bytecode Library allows for on-chain verification and computation of bytecode roots for contracts and predicates. -A bytecode root for a contract and predicate is the Merkle root of the [binary Merkle tree](https://github.com/FuelLabs/fuel-specs/blob/master/src/protocol/cryptographic-primitives.md#binary-merkle-tree) with each leaf being 16KiB of instructions. This library will compute any contract's or predicate's bytecode root/address allowing for the verification of deployed contracts and generation of predicate addresses on-chain. +A bytecode root for a contract and predicate is the Merkle root of the [binary Merkle tree](https://github.com/FuelLabs/fuel-specs/blob/master/src/protocol/cryptographic-primitives.md#binary-merkle-tree) with each leaf being 16KiB of instructions. This library will compute any contract's or predicate's bytecode root/address allowing for the verification of deployed contracts and generation of predicate addresses on-chain. For implementation details on the Bytecode Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/bytecode/index.html). -# Using the Library - ## Importing the Bytecode Library In order to use the Bytecode Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). @@ -20,7 +18,7 @@ use sway_libs::bytecode::*; ## Using the Bytecode Library In Sway -Once imported, using the Bytecode Library is as simple as calling the desired function. Here is a list of function definitions that you may use. +Once imported, using the Bytecode Library is as simple as calling the desired function. Here is a list of function definitions that you may use. - `compute_bytecode_root()` - `compute_bytecode_root_with_configurables()` diff --git a/docs/book/src/documentation/libraries/cryptography/index.md b/docs/book/src/libraries/cryptography/index.md similarity index 97% rename from docs/book/src/documentation/libraries/cryptography/index.md rename to docs/book/src/libraries/cryptography/index.md index b261fb28..7800f500 100644 --- a/docs/book/src/documentation/libraries/cryptography/index.md +++ b/docs/book/src/libraries/cryptography/index.md @@ -6,7 +6,7 @@ For implementation details on the libraries please see the [Sway Libs Docs](http ## Bytecode Library -The [Bytecode](./bytecode/index.md) Library is used for on-chain verification and computation of bytecode roots for contracts and predicates. +The [Bytecode](./bytecode/index.md) Library is used for on-chain verification and computation of bytecode roots for contracts and predicates. ## Merkle Library diff --git a/docs/book/src/documentation/libraries/cryptography/merkle/index.md b/docs/book/src/libraries/cryptography/merkle/index.md similarity index 93% rename from docs/book/src/documentation/libraries/cryptography/merkle/index.md rename to docs/book/src/libraries/cryptography/merkle/index.md index 42792e56..c9054414 100644 --- a/docs/book/src/documentation/libraries/cryptography/merkle/index.md +++ b/docs/book/src/libraries/cryptography/merkle/index.md @@ -1,11 +1,9 @@ # Merkle Library -Merkle trees allow for on-chain verification of off-chain data. With the merkle root posted on-chain, the generation of proofs off-chain can provide verifibly true data. +Merkle trees allow for on-chain verification of off-chain data. With the merkle root posted on-chain, the generation of proofs off-chain can provide verifiably true data. For implementation details on the Merkle Library please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/merkle/index.html). -# Using the Library - ## Importing the Merkle Library In order to use the Merkle Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). @@ -18,7 +16,7 @@ use sway_libs::merkle::binary_proof::*; ## Using the Merkle Proof Library In Sway -Once imported, using the Merkle Proof library is as simple as calling the desired function. Here is a list of function definitions that you may use. For more information please see the [specification](./SPECIFICATION.md). +Once imported, using the Merkle Proof library is as simple as calling the desired function. Here is a list of function definitions that you may use. - `leaf_digest()` - `node_digest()` @@ -71,13 +69,13 @@ fn foo(merkle_roof: b256, key: u64, leaf: b256, num_leaves: u64, proof: Vec -After clicking on the `Lib: Cryptography` label the issues have been filtered to show only the issues that have `Lib: Cryptography` added to them. +After clicking on the `Lib: Cryptography` label the issues have been filtered to show only the issues that have `Lib: Cryptography` added to them. Notice that `Lib: Cryptography` is not the only label in the image below. If you wish to further reduce the number of presented issues then additional labels can be added in the same way. diff --git a/docs/contributing-book/src/documentation/issues/search/index.md b/docs/contributing-book/src/documentation/issues/search/index.md index bc14c574..7fd41e0f 100644 --- a/docs/contributing-book/src/documentation/issues/search/index.md +++ b/docs/contributing-book/src/documentation/issues/search/index.md @@ -17,5 +17,4 @@ Once the issues are filtered a task can be selected if another user is not curre ## [Issue summary](./summary.md) -Each issue should have a description which provides context into the problem and what may be done to resolve it. - +Each issue should have a description which provides context into the problem and what may be done to resolve it. diff --git a/docs/contributing-book/src/documentation/issues/search/summary.md b/docs/contributing-book/src/documentation/issues/search/summary.md index 05dd1820..868a1cfb 100644 --- a/docs/contributing-book/src/documentation/issues/search/summary.md +++ b/docs/contributing-book/src/documentation/issues/search/summary.md @@ -6,4 +6,4 @@ You can see the activity of an issue by looking at the number of comments. This Clicking on the issue near the bottom `Sum Merkle Proof Verification` we can see some information about the library with some information on what the library intends to implement and why it is needed. -![Filtering issues by an app label image](../../../images/app-documentation.png) \ No newline at end of file +![Filtering issues by an app label image](../../../images/app-documentation.png) diff --git a/docs/contributing-book/src/documentation/library-quality/documentation/code/abi.md b/docs/contributing-book/src/documentation/library-quality/documentation/code/abi.md index 87a28e76..b4174f0d 100644 --- a/docs/contributing-book/src/documentation/library-quality/documentation/code/abi.md +++ b/docs/contributing-book/src/documentation/library-quality/documentation/code/abi.md @@ -1,6 +1,6 @@ # ABI Documentation -ABI documentation refers to documenting the interface that another developer may be interested in using. +ABI documentation refers to documenting the interface that another developer may be interested in using. The form of documentation we focus on uses the `///` syntax as we are interested in documenting the `ABI` functions. diff --git a/docs/contributing-book/src/documentation/library-quality/documentation/code/comments.md b/docs/contributing-book/src/documentation/library-quality/documentation/code/comments.md index d7f97c5d..bcd5aa6f 100644 --- a/docs/contributing-book/src/documentation/library-quality/documentation/code/comments.md +++ b/docs/contributing-book/src/documentation/library-quality/documentation/code/comments.md @@ -2,7 +2,7 @@ Comments are used by developers for themselves or other developers to provide insight into some functionality. -There are many ways to achieve the same outcome for a line of code however there are implementation tradeoffs to consider and a developer might be interested in knowing why the current approach has been chosen. +There are many ways to achieve the same outcome for a line of code however there are implementation tradeoffs to consider and a developer might be interested in knowing why the current approach has been chosen. Moreover, it may not be immediately clear why, or what, some line of code is doing so it may be a good idea to add a comment summarizing the intent behind the implementation. diff --git a/docs/contributing-book/src/documentation/library-quality/documentation/code/index.md b/docs/contributing-book/src/documentation/library-quality/documentation/code/index.md index fb1cd647..8d802328 100644 --- a/docs/contributing-book/src/documentation/library-quality/documentation/code/index.md +++ b/docs/contributing-book/src/documentation/library-quality/documentation/code/index.md @@ -4,7 +4,7 @@ Documenting code is an important skill to have because it conveys information to In the following sections we'll take a look at three ways of documenting code and a code style guide. - + - [ABI Documentation](abi.md) - [Comments](comments.md) - [Naming Components](naming-components.md) diff --git a/docs/contributing-book/src/documentation/library-quality/documentation/code/naming-components.md b/docs/contributing-book/src/documentation/library-quality/documentation/code/naming-components.md index 5e5faee7..7b5a058c 100644 --- a/docs/contributing-book/src/documentation/library-quality/documentation/code/naming-components.md +++ b/docs/contributing-book/src/documentation/library-quality/documentation/code/naming-components.md @@ -1,6 +1,6 @@ # Naming Components -Documenting the interface and adding comments is important however the holy grail is writing code that is self-documenting. +Documenting the interface and adding comments is important however the holy grail is writing code that is self-documenting. Self-documenting code refers to code that written in such a way that a regular user who has never seen a line of code before could interpret what it is doing. @@ -47,7 +47,7 @@ When choosing a name, the name should be a statement from the developer and not For example: - `can_change` -> `authorized` - - The "can" can be read as a question or a statement. + - The "can" can be read as a question or a statement. - Is the developer asking the reader whether something can change or are they asserting that something either is or is not authorized to change? - `is_on` -> `enabled` - "is" can also be read as a question posed to the reader rather than a simple declaration. diff --git a/docs/contributing-book/src/documentation/library-quality/documentation/read-me.md b/docs/contributing-book/src/documentation/library-quality/documentation/read-me.md index 32a94e12..71fad83f 100644 --- a/docs/contributing-book/src/documentation/library-quality/documentation/read-me.md +++ b/docs/contributing-book/src/documentation/library-quality/documentation/read-me.md @@ -14,8 +14,7 @@ The quickstart should inform the user where the library is supported (e.g. the o A user should be able to easily install, use, and potentially remove your library to create a good experience. - -## Miscellaneous +## Miscellaneous This "section" can be a number of sections which the authors of the library think the user may be interested in. diff --git a/docs/contributing-book/src/documentation/library-quality/documentation/specification.md b/docs/contributing-book/src/documentation/library-quality/documentation/specification.md index dcb2c5fa..b7e9d968 100644 --- a/docs/contributing-book/src/documentation/library-quality/documentation/specification.md +++ b/docs/contributing-book/src/documentation/library-quality/documentation/specification.md @@ -16,6 +16,6 @@ This type of specification is simple so that any layperson can follow the basic A technical specification is aimed at users that may be regarded as experts / knowledgeable in the area. This type of specification typically assumes the reader understands the basic concepts and dives into the technical aspects of how something works, step-by-step. -
    +
    -> **Note:** Diagrams are a fantastic visual aid no matter the level of detail \ No newline at end of file +> **Note:** Diagrams are a fantastic visual aid no matter the level of detail diff --git a/docs/contributing-book/src/documentation/library-quality/index.md b/docs/contributing-book/src/documentation/library-quality/index.md index 5c62a030..79c3cf7b 100644 --- a/docs/contributing-book/src/documentation/library-quality/index.md +++ b/docs/contributing-book/src/documentation/library-quality/index.md @@ -4,7 +4,7 @@ The quality of a library can be determined by a variety of measures such as inte In the following sections we will take a look at: -- [Library Structure](library-structure/index.md) +- [Library Structure](library-structure.md) - The file structure and how easily a library may be navigated - [Code Structure](code-structure.md) - How to structure the code inside a file diff --git a/docs/contributing-book/src/documentation/library-quality/library-structure.md b/docs/contributing-book/src/documentation/library-quality/library-structure.md index adb37fb1..b77942a9 100644 --- a/docs/contributing-book/src/documentation/library-quality/library-structure.md +++ b/docs/contributing-book/src/documentation/library-quality/library-structure.md @@ -1,10 +1,10 @@ # Library Structure -In order to navigate through a library easily, there needs to be a structure that compartmentalizes concepts. This means that code is grouped together based on some concept. +In order to navigate through a library easily, there needs to be a structure that compartmentalizes concepts. This means that code is grouped together based on some concept. Here is an example structure that we follow for `Sway` files in the `src` directory. -``` +```sway src/ ├── lib.sw └── my_library/ diff --git a/docs/contributing-book/src/documentation/library-quality/testing.md b/docs/contributing-book/src/documentation/library-quality/testing.md index 89032ea3..d0fd43fb 100644 --- a/docs/contributing-book/src/documentation/library-quality/testing.md +++ b/docs/contributing-book/src/documentation/library-quality/testing.md @@ -6,7 +6,7 @@ Testing is a large topic to cover therefore this section will only cover some po There are three components to the tests and they have the following structure. -``` +```sway tests/ └── src/ └── my_library/ @@ -19,7 +19,7 @@ tests/ ### `functions` -The `functions` directory contains 1 file per function declared in the `ABI` and all **test cases** (not utility / helper functions) for that function are contained within that module. +The `functions` directory contains 1 file per function declared in the `ABI` and all **test cases** (not utility / helper functions) for that function are contained within that module. There are two possibilities with any function call and either the call succeeds or it reverts. For this reason each file is split into two sections: diff --git a/docs/contributing-book/src/documentation/pull-requests/commit.md b/docs/contributing-book/src/documentation/pull-requests/commit.md index 613c9406..715f9f70 100644 --- a/docs/contributing-book/src/documentation/pull-requests/commit.md +++ b/docs/contributing-book/src/documentation/pull-requests/commit.md @@ -25,7 +25,7 @@ Similarly, small commits should be avoided because: Categorizing commits into issues being resolved allows us to easily scope the amount of work per commit. With appropriate categories the likelihood of too much, or not enough, work being committed is reduced. -An example could be a failing test suite which includes multiple functions that were re-written. In this instance it may be a good idea to fix a test, or a test suite, for one specific function and committing that work before moving onto the next. +An example could be a failing test suite which includes multiple functions that were re-written. In this instance it may be a good idea to fix a test, or a test suite, for one specific function and committing that work before moving onto the next. This creates a clear separation within the task of fixing the test suites by fixing one suite in one commit and another in another commit. @@ -35,7 +35,7 @@ Once the issue has been resolved it's time to write a message that will distingu The commit message should be a concise and accurate summary of the work done: -- `Good commit message:` +- `Good commit message:` - Fixed precondition in `withdraw()` which allowed draining to occur - `Bad commit message:` - Fix diff --git a/docs/contributing-book/src/documentation/pull-requests/creating-pr.md b/docs/contributing-book/src/documentation/pull-requests/creating-pr.md index 42178406..351de8ae 100644 --- a/docs/contributing-book/src/documentation/pull-requests/creating-pr.md +++ b/docs/contributing-book/src/documentation/pull-requests/creating-pr.md @@ -21,7 +21,7 @@ Depending on the account permissions and where the pull request is being made, t There are at least five sections to consider when creating a pull request: - + - [The Title](#the-title) - [The Description](#the-description) - [The Reviewers](#the-reviewers) @@ -41,7 +41,7 @@ Some ideas for sections are: - The changes that have been made and the motivation behind them - Limitations -- Assumptions +- Assumptions - Future work if the pull request is part of an epic (set of tasks / issues) ### The Reviewers diff --git a/libs/src/pausable.sw b/libs/src/pausable.sw index 9597486d..10509e8a 100644 --- a/libs/src/pausable.sw +++ b/libs/src/pausable.sw @@ -25,7 +25,7 @@ abi Pausable { /// use sway_libs::pausable::Pausable; /// /// fn foo(contract_id: ContractId) { - /// let pausable_abi = abi(Pauseable, contract_id); + /// let pausable_abi = abi(Pausable, contract_id); /// pausable_abi.pause(); /// assert(pausable_abi.is_paused()); /// } @@ -49,7 +49,7 @@ abi Pausable { /// use sway_libs::pausable::Pausable; /// /// fn foo(contract_id: ContractId) { - /// let pausable_abi = abi(Pauseable, contract_id); + /// let pausable_abi = abi(Pausable, contract_id); /// assert(!pausable_abi.is_paused()); /// } /// ``` @@ -73,7 +73,7 @@ abi Pausable { /// use sway_libs::pausable::Pausable; /// /// fn foo(contract_id: ContractId) { - /// let pausable_abi = abi(Pauseable, contract_id); + /// let pausable_abi = abi(Pausable, contract_id); /// pausable_abi.unpause(); /// assert(!pausable_abi.is_paused()); /// } diff --git a/libs/src/queue/SPECIFICATION.md b/libs/src/queue/SPECIFICATION.md deleted file mode 100644 index b88ba849..00000000 --- a/libs/src/queue/SPECIFICATION.md +++ /dev/null @@ -1,41 +0,0 @@ -# Overview - -This document provides an overview of the Queue library. - -It outlines the use cases, i.e. specification, and describes how to implement the library. - -### Traits of the `Queue` - -- The `Queue` is a linear structure with a generic type parameter `T`. -- The elements in the queue are stored as a `Vec`. -- Queues are growable, operate in a First-In-First-Out (FIFO) manner, and are created empty. - -## Use Cases - -The Queue library can be used as a data structure to retrieve items in the order that they were introduced. Examples where this is useful include, preserving the chronological order of events such as server requests, scheduling tasks, or traversing Binary Search Trees (BST). - -## Public Functions - -### `new()` - -- Creates a new instance of a `Queue`. - -### `is_empty()` - -- Returns a boolean indicating whether the length of the `Queue` is zero. - -### `len()` - -- Returns the number of elements in the `Queue` - -### `enqueue()` - -- Adds an item into the `Queue` - -### `dequeue()` - -- Removes an item from the `Queue` - -### `peek()` - -- Returns the next item in the `Queue` From 57667118ca0efa6cdf63b25b34341671363b06cd Mon Sep 17 00:00:00 2001 From: bitzoic Date: Tue, 2 Apr 2024 14:53:17 +0900 Subject: [PATCH 10/18] Remove nested folders --- docs/book/spell-check-custom-words.txt | 3 +- docs/book/src/SUMMARY.md | 38 +++++------ .../index.md => access_security_libraries.md} | 0 .../access_security => }/admin/index.md | 0 .../src/{libraries/asset => }/asset/base.md | 0 .../src/{libraries/asset => }/asset/index.md | 0 .../{libraries/asset => }/asset/metadata.md | 0 .../src/{libraries/asset => }/asset/supply.md | 1 - .../asset/index.md => asset_libraries.md} | 0 .../cryptography => }/bytecode/index.md | 0 .../index.md => cryptography_libraries.md} | 0 .../index.md => data_structures_libraries.md} | 0 .../{libraries/math => }/fixed_point/index.md | 0 docs/book/src/index.md | 1 - docs/book/src/libraries.md | 65 +++++++++++++++++++ docs/book/src/libraries/index.md | 65 ------------------- .../math/index.md => math_libraries.md} | 0 .../cryptography => }/merkle/index.md | 0 .../access_security => }/ownership/index.md | 0 .../access_security => }/pausable/index.md | 0 .../data_structures => }/queue/index.md | 0 .../access_security => }/reentrancy/index.md | 0 .../math => }/signed_integers/index.md | 0 23 files changed, 86 insertions(+), 87 deletions(-) rename docs/book/src/{libraries/access_security/index.md => access_security_libraries.md} (100%) rename docs/book/src/{libraries/access_security => }/admin/index.md (100%) rename docs/book/src/{libraries/asset => }/asset/base.md (100%) rename docs/book/src/{libraries/asset => }/asset/index.md (100%) rename docs/book/src/{libraries/asset => }/asset/metadata.md (100%) rename docs/book/src/{libraries/asset => }/asset/supply.md (99%) rename docs/book/src/{libraries/asset/index.md => asset_libraries.md} (100%) rename docs/book/src/{libraries/cryptography => }/bytecode/index.md (100%) rename docs/book/src/{libraries/cryptography/index.md => cryptography_libraries.md} (100%) rename docs/book/src/{libraries/data_structures/index.md => data_structures_libraries.md} (100%) rename docs/book/src/{libraries/math => }/fixed_point/index.md (100%) create mode 100644 docs/book/src/libraries.md delete mode 100644 docs/book/src/libraries/index.md rename docs/book/src/{libraries/math/index.md => math_libraries.md} (100%) rename docs/book/src/{libraries/cryptography => }/merkle/index.md (100%) rename docs/book/src/{libraries/access_security => }/ownership/index.md (100%) rename docs/book/src/{libraries/access_security => }/pausable/index.md (100%) rename docs/book/src/{libraries/data_structures => }/queue/index.md (100%) rename docs/book/src/{libraries/access_security => }/reentrancy/index.md (100%) rename docs/book/src/{libraries/math => }/signed_integers/index.md (100%) diff --git a/docs/book/spell-check-custom-words.txt b/docs/book/spell-check-custom-words.txt index 2d0e48d1..192a3cee 100644 --- a/docs/book/spell-check-custom-words.txt +++ b/docs/book/spell-check-custom-words.txt @@ -206,4 +206,5 @@ abi Enqueuing Dequeuing StorageMetadata -functionly \ No newline at end of file +functionly +verifiably \ No newline at end of file diff --git a/docs/book/src/SUMMARY.md b/docs/book/src/SUMMARY.md index ee66ea95..549c6b21 100644 --- a/docs/book/src/SUMMARY.md +++ b/docs/book/src/SUMMARY.md @@ -4,22 +4,22 @@ - [Getting Started](./getting_started/index.md) - [Running Tests](./getting_started/running_tests.md) -- [Libraries](./libraries/index.md) - - [Asset Libraries](./libraries/asset/index.md) - - [Asset Library](./libraries/asset/asset/index.md) - - [Base](./libraries/asset/asset/base.md) - - [Supply](./libraries/asset/asset/supply.md) - - [Metadata](./libraries/asset/asset/metadata.md) - - [Access Control and Security Libraries](./libraries/access_security/index.md) - - [Admin Library](./libraries/access_security/admin/index.md) - - [Ownership Library](./libraries/access_security/ownership/index.md) - - [Pausable Library](./libraries/access_security/pausable/index.md) - - [Reentrancy Guard Library](./libraries/access_security/reentrancy/index.md) - - [Cryptography Libraries](./libraries/cryptography/index.md) - - [Bytecode Library](./libraries/cryptography/bytecode/index.md) - - [Merkle Library](./libraries/cryptography/merkle/index.md) - - [Math Libraries](./libraries/math/index.md) - - [Fixed Point Number Library](./libraries/math/fixed_point/index.md) - - [Signed Integers Library](./libraries/math/signed_integers/index.md) - - [Data Structure Libraries](./libraries/data_structures/index.md) - - [Queue Library](./libraries/data_structures/queue/index.md) +- [Libraries](./libraries.md) + - [Asset Libraries](./asset_libraries.md) + - [Asset Library](./asset/index.md) + - [Base](./asset/base.md) + - [Supply](./asset/supply.md) + - [Metadata](./asset/metadata.md) + - [Access Control and Security Libraries](./access_security_libraries.md) + - [Admin Library](./admin/index.md) + - [Ownership Library](./ownership/index.md) + - [Pausable Library](./pausable/index.md) + - [Reentrancy Guard Library](./reentrancy/index.md) + - [Cryptography Libraries](./cryptography_libraries.md) + - [Bytecode Library](./bytecode/index.md) + - [Merkle Library](./merkle/index.md) + - [Math Libraries](./math_libraries.md) + - [Fixed Point Number Library](./fixed_point/index.md) + - [Signed Integers Library](./signed_integers/index.md) + - [Data Structure Libraries](./data_structures_libraries.md) + - [Queue Library](./queue/index.md) diff --git a/docs/book/src/libraries/access_security/index.md b/docs/book/src/access_security_libraries.md similarity index 100% rename from docs/book/src/libraries/access_security/index.md rename to docs/book/src/access_security_libraries.md diff --git a/docs/book/src/libraries/access_security/admin/index.md b/docs/book/src/admin/index.md similarity index 100% rename from docs/book/src/libraries/access_security/admin/index.md rename to docs/book/src/admin/index.md diff --git a/docs/book/src/libraries/asset/asset/base.md b/docs/book/src/asset/base.md similarity index 100% rename from docs/book/src/libraries/asset/asset/base.md rename to docs/book/src/asset/base.md diff --git a/docs/book/src/libraries/asset/asset/index.md b/docs/book/src/asset/index.md similarity index 100% rename from docs/book/src/libraries/asset/asset/index.md rename to docs/book/src/asset/index.md diff --git a/docs/book/src/libraries/asset/asset/metadata.md b/docs/book/src/asset/metadata.md similarity index 100% rename from docs/book/src/libraries/asset/asset/metadata.md rename to docs/book/src/asset/metadata.md diff --git a/docs/book/src/libraries/asset/asset/supply.md b/docs/book/src/asset/supply.md similarity index 99% rename from docs/book/src/libraries/asset/asset/supply.md rename to docs/book/src/asset/supply.md index 127a0ab6..68afe5f3 100644 --- a/docs/book/src/libraries/asset/asset/supply.md +++ b/docs/book/src/asset/supply.md @@ -46,7 +46,6 @@ storage { To use a base function, simply pass the `StorageKey` from the prescribed storage block. The example below shows the implementation of the [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md) standard in combination with the Asset Library with no user defined restrictions or custom functionality. It is recommended that the [Ownership Library](../../access_security/ownership/) is used in conjunction with the Asset Library;s supply functionality to ensure only a single user has permissions to mint an Asset. - ```sway use sway_libs::asset::supply::{_mint, _burn}; use standards::src3::SRC3; diff --git a/docs/book/src/libraries/asset/index.md b/docs/book/src/asset_libraries.md similarity index 100% rename from docs/book/src/libraries/asset/index.md rename to docs/book/src/asset_libraries.md diff --git a/docs/book/src/libraries/cryptography/bytecode/index.md b/docs/book/src/bytecode/index.md similarity index 100% rename from docs/book/src/libraries/cryptography/bytecode/index.md rename to docs/book/src/bytecode/index.md diff --git a/docs/book/src/libraries/cryptography/index.md b/docs/book/src/cryptography_libraries.md similarity index 100% rename from docs/book/src/libraries/cryptography/index.md rename to docs/book/src/cryptography_libraries.md diff --git a/docs/book/src/libraries/data_structures/index.md b/docs/book/src/data_structures_libraries.md similarity index 100% rename from docs/book/src/libraries/data_structures/index.md rename to docs/book/src/data_structures_libraries.md diff --git a/docs/book/src/libraries/math/fixed_point/index.md b/docs/book/src/fixed_point/index.md similarity index 100% rename from docs/book/src/libraries/math/fixed_point/index.md rename to docs/book/src/fixed_point/index.md diff --git a/docs/book/src/index.md b/docs/book/src/index.md index 0216f52a..77466337 100644 --- a/docs/book/src/index.md +++ b/docs/book/src/index.md @@ -6,4 +6,3 @@ These libraries contain helper functions and other tools valuable to blockchain > **NOTE:** > Sway is a language under heavy development therefore the libraries may not be the most ergonomic. Over time they should receive updates / improvements in order to demonstrate how Sway can be used in real use cases. -> \ No newline at end of file diff --git a/docs/book/src/libraries.md b/docs/book/src/libraries.md new file mode 100644 index 00000000..0df8616b --- /dev/null +++ b/docs/book/src/libraries.md @@ -0,0 +1,65 @@ +# Libraries + +There are several types of libraries that Sway Libs encompases. These include libraries that provide convenience functions, standards supporting libraries, data type libraries, security functionality libraries. + +For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). + +## [Assets Libraries](./asset_libraries.md) + +Asset Libraries are any libraries that use [Native Assets](https://docs.fuel.network/docs/sway/blockchain-development/native_assets) on the Fuel Network. + +### [Asset Library](./asset/index.md) + +The [Asset](./asset/asset/index.md) Library provides helper functions for the [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md), [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md), and [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) standards. + +## [Access Control and Security Libraries](./access_security_libraries.md) + +Access Control and Security Libraries are any libraries that are built and intended to provide additional safety when developing smart contracts. + +### [Ownership Library](./ownership/index.md) + +The [Ownership](./ownership/index.md) Library is used to apply restrictions on functions such that only a **single** user may call them. + +### [Admin Library](./admin/index.md) + +The [Admin](./admin/index.md) Library is used to apply restrictions on functions such that only a select few users may call them like a whitelist. + +### [Pausable Library](./pausable/index.md) + +The [Pausable](./pausable/index.md) Library allows contracts to implement an emergency stop mechanism. + +### [Reentrancy Guard Library](./reentrancy/index.md) + +The [Reentrancy Guard](./reentrancy/index.md) Library is used to detect and prevent reentrancy attacks. + +## [Cryptography Libraries](./cryptography_libraries.md) + +Cryptography Libraries are any libraries that provided cryptographic functionality beyond what the std-lib provides. + +### [Bytecode Library](./bytecode/index.md) + +The [Bytecode](./bytecode/index.md) Library is used for on-chain verification and computation of bytecode roots for contracts and predicates. + +### [Merkle Library](./merkle/index.md) + +The [Merkle Proof](./merkle/index.md) Library is used to verify Binary Merkle Trees computed off-chain. + +## [Math Libraries](./math_libraries.md) + +Math Libraries are libraries which provide mathematic functions or number types that are outside of the std-lib's scope. + +### [Fixed Point Number Library](./fixed_point/index.md) + +The [Fixed Point Number](./fixed_point/index.md) Library is an interface to implement fixed-point numbers. + +### [Signed Integers](./signed_integers/index.md) + +The [Signed Integers](./signed_integers/index.md) Library is an interface to implement signed integers. + +## [Data Structures Libraries](./data_structures_libraries.md) + +Data Structure Libraries are libraries which provide complex data structures which unlock additional functionality for Smart Contracts. + +### [Queue](./queue/index.md) + +The [Queue](./queue/index.md) Library is a linear data structure that provides First-In-First-Out (FIFO) operations. diff --git a/docs/book/src/libraries/index.md b/docs/book/src/libraries/index.md deleted file mode 100644 index b7730a67..00000000 --- a/docs/book/src/libraries/index.md +++ /dev/null @@ -1,65 +0,0 @@ -# Libraries - -There are several types of libraries that Sway Libs encompases. These include libraries that provide convenience functions, standards supporting libraries, data type libraries, security functionality libraries. - -For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). - -## [Assets Libraries](./asset/index.md) - -Asset Libraries are any libraries that use [Native Assets](https://docs.fuel.network/docs/sway/blockchain-development/native_assets) on the Fuel Network. - -### [Asset Library](./asset/asset/index.md) - -The [Asset](./asset/asset/index.md) Library provides helper functions for the [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md), [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md), and [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) standards. - -## [Access Control and Security Libraries](./access_security/index.md) - -Access Control and Security Libraries are any libraries that are built and intended to provide additional safety when developing smart contracts. - -### [Ownership Library](./access_security/ownership/index.md) - -The [Ownership](./access_security/ownership/index.md) Library is used to apply restrictions on functions such that only a **single** user may call them. - -### [Admin Library](./access_security/admin/index.md) - -The [Admin](./access_security/admin/index.md) Library is used to apply restrictions on functions such that only a select few users may call them like a whitelist. - -### [Pausable Library](./access_security/pausable/index.md) - -The [Pausable](./access_security/pausable/index.md) Library allows contracts to implement an emergency stop mechanism. - -### [Reentrancy Guard Library](./access_security/reentrancy/index.md) - -The [Reentrancy Guard](./access_security/reentrancy/index.md) Library is used to detect and prevent reentrancy attacks. - -## [Cryptography Libraries](./cryptography/index.md) - -Cryptography Libraries are any libraries that provided cryptographic functionality beyond what the std-lib provides. - -### [Bytecode Library](./cryptography/bytecode/index.md) - -The [Bytecode](./cryptography/bytecode/index.md) Library is used for on-chain verification and computation of bytecode roots for contracts and predicates. - -### [Merkle Library](./cryptography/merkle/index.md) - -The [Merkle Proof](./cryptography/merkle/index.md) Library is used to verify Binary Merkle Trees computed off-chain. - -## [Math Libraries](./math/index.md) - -Math Libraries are libraries which provide mathematic functions or number types that are outside of the std-lib's scope. - -### [Fixed Point Number Library](./math/fixed_point/index.md) - -The [Fixed Point Number](./math/fixed_point/index.md) Library is an interface to implement fixed-point numbers. - -### [Signed Integers](./math/signed_integers/index.md) - -The [Signed Integers](./math/signed_integers/index.md) Library is an interface to implement signed integers. - -## [Data Structures Libraries](./data_structures/index.md) - -Data Structure Libraries are libraries which provide complex data structures which unlock additional functionality for Smart Contracts. - -### [Queue](./data_structures/queue/index.md) - -The [Queue](./data_structures/queue/index.md) Library is a linear data structure that provides First-In-First-Out (FIFO) operations. diff --git a/docs/book/src/libraries/math/index.md b/docs/book/src/math_libraries.md similarity index 100% rename from docs/book/src/libraries/math/index.md rename to docs/book/src/math_libraries.md diff --git a/docs/book/src/libraries/cryptography/merkle/index.md b/docs/book/src/merkle/index.md similarity index 100% rename from docs/book/src/libraries/cryptography/merkle/index.md rename to docs/book/src/merkle/index.md diff --git a/docs/book/src/libraries/access_security/ownership/index.md b/docs/book/src/ownership/index.md similarity index 100% rename from docs/book/src/libraries/access_security/ownership/index.md rename to docs/book/src/ownership/index.md diff --git a/docs/book/src/libraries/access_security/pausable/index.md b/docs/book/src/pausable/index.md similarity index 100% rename from docs/book/src/libraries/access_security/pausable/index.md rename to docs/book/src/pausable/index.md diff --git a/docs/book/src/libraries/data_structures/queue/index.md b/docs/book/src/queue/index.md similarity index 100% rename from docs/book/src/libraries/data_structures/queue/index.md rename to docs/book/src/queue/index.md diff --git a/docs/book/src/libraries/access_security/reentrancy/index.md b/docs/book/src/reentrancy/index.md similarity index 100% rename from docs/book/src/libraries/access_security/reentrancy/index.md rename to docs/book/src/reentrancy/index.md diff --git a/docs/book/src/libraries/math/signed_integers/index.md b/docs/book/src/signed_integers/index.md similarity index 100% rename from docs/book/src/libraries/math/signed_integers/index.md rename to docs/book/src/signed_integers/index.md From 3c997567ea722bd4fe1a2cc5ac2ec5719efa5796 Mon Sep 17 00:00:00 2001 From: bitzoic Date: Tue, 2 Apr 2024 14:58:49 +0900 Subject: [PATCH 11/18] Fix README links --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index bb40bb02..32cc4b8c 100644 --- a/README.md +++ b/README.md @@ -41,28 +41,28 @@ For implementation details on the libraries please see the [Sway Libs Docs](http #### Assets -- [Native Asset](https://fuellabs.github.io/sway-libs/book/documentation/libraries/asset/asset/index.html) provides helper functions for the [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md), [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md), and [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) standards. +- [Native Asset](https://fuellabs.github.io/sway-libs/book/documentation/libraries/asset/index.html) provides helper functions for the [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md), [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md), and [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) standards. #### Access Control and Security -- [Ownership](https://fuellabs.github.io/sway-libs/book/documentation/libraries/access_security/ownership/index.html) is used to apply restrictions on functions such that only a **single** user may call them. -- [Admin](https://fuellabs.github.io/sway-libs/book/documentation/libraries/access_security/admin/index.html) is used to apply restrictions on functions such that only a select few users may call them like a whitelist. -- [Pausable](https://fuellabs.github.io/sway-libs/book/documentation/libraries/access_security/pausable/index.html) allows contracts to implement an emergency stop mechanism. -- [Reentrancy](https://fuellabs.github.io/sway-libs/book/documentation/libraries/access_security/reentrancy/index.html) is used to detect and prevent reentrancy attacks. +- [Ownership](https://fuellabs.github.io/sway-libs/book/documentation/libraries/ownership/index.html) is used to apply restrictions on functions such that only a **single** user may call them. +- [Admin](https://fuellabs.github.io/sway-libs/book/documentation/libraries/admin/index.html) is used to apply restrictions on functions such that only a select few users may call them like a whitelist. +- [Pausable](https://fuellabs.github.io/sway-libs/book/documentation/libraries/pausable/index.html) allows contracts to implement an emergency stop mechanism. +- [Reentrancy](https://fuellabs.github.io/sway-libs/book/documentation/libraries/reentrancy/index.html) is used to detect and prevent reentrancy attacks. #### Cryptography -- [Bytecode](https://fuellabs.github.io/sway-libs/book/documentation/libraries/cryptography/bytecode/index.html) is used for on-chain verification and computation of bytecode roots for contracts and predicates. -- [Merkle Proof](https://fuellabs.github.io/sway-libs/book/documentation/libraries/cryptography/merkle/index.html) is used to verify Binary Merkle Trees computed off-chain. +- [Bytecode](https://fuellabs.github.io/sway-libs/book/documentation/libraries/bytecode/index.html) is used for on-chain verification and computation of bytecode roots for contracts and predicates. +- [Merkle Proof](https://fuellabs.github.io/sway-libs/book/documentation/libraries/merkle/index.html) is used to verify Binary Merkle Trees computed off-chain. #### Math -- [Fixed Point Number](https://fuellabs.github.io/sway-libs/book/documentation/libraries/math/fixed_point/index.html) is an interface to implement fixed-point numbers. -- [Signed Integers](https://fuellabs.github.io/sway-libs/book/documentation/libraries/math/signed_integers/index.html) is an interface to implement signed integers. +- [Fixed Point Number](https://fuellabs.github.io/sway-libs/book/documentation/libraries/fixed_point/index.html) is an interface to implement fixed-point numbers. +- [Signed Integers](https://fuellabs.github.io/sway-libs/book/documentation/libraries/signed_integers/index.html) is an interface to implement signed integers. #### Data Structures -- [Queue](https://fuellabs.github.io/sway-libs/book/documentation/libraries/data_structures/queue/index.html) is a linear data structure that provides First-In-First-Out (FIFO) operations. +- [Queue](https://fuellabs.github.io/sway-libs/book/documentation/libraries/queue/index.html) is a linear data structure that provides First-In-First-Out (FIFO) operations. ## Using a library From 351fb2bed7a00467e07acf8bebe515ccae61d4ca Mon Sep 17 00:00:00 2001 From: bitzoic Date: Tue, 2 Apr 2024 15:01:20 +0900 Subject: [PATCH 12/18] Update CI docs path --- .github/workflows/ci.yml | 2 +- .github/workflows/gh-pages.yml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 68c1f328..bdf1c740 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -87,7 +87,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - project: [".docs/contributing-book/src/code"] + project: ["docs/contributing-book/src/code"] steps: - name: Checkout repository uses: actions/checkout@v3 diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 35f3669e..496a9c39 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -23,13 +23,13 @@ jobs: with: mdbook-version: "0.4.15" - - run: mdbook build ./.docs/contributing-book + - run: mdbook build ./docs/contributing-book - name: Deploy master uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./.docs/contributing-book/book + publish_dir: ./docs/contributing-book/book destination_dir: contributing-book if: github.ref == 'refs/heads/master' @@ -43,13 +43,13 @@ jobs: with: mdbook-version: "0.4.15" - - run: mdbook build ./.docs/book + - run: mdbook build ./docs/book - name: Deploy master uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./.docs/book/book + publish_dir: ./docs/book/book destination_dir: book if: github.ref == 'refs/heads/master' From 91f01331575e5e8bc2b13af9e70ad07b254cc527 Mon Sep 17 00:00:00 2001 From: bitzoic Date: Wed, 3 Apr 2024 14:16:45 +0900 Subject: [PATCH 13/18] Flatten contributing book --- docs/contributing-book/src/SUMMARY.md | 44 +++++++++---------- .../{documentation/welcome.md => index.md} | 0 .../issues/search => issues}/assignment.md | 2 +- .../issues/create-issue.md | 2 +- .../issues/search => issues}/filtering.md | 4 +- .../src/{documentation => }/issues/index.md | 0 .../search/index.md => issues/search.md} | 0 .../issues/search => issues}/summary.md | 4 +- .../code => library-quality}/abi.md | 0 .../library-quality/code-structure.md | 0 .../code/index.md => library-quality/code.md} | 0 .../code => library-quality}/comments.md | 0 .../documentation.md} | 2 +- .../library-quality/index.md | 0 .../library-quality/library-structure.md | 0 .../naming-components.md | 0 .../read-me.md | 0 .../specification.md | 0 .../code => library-quality}/style.md | 0 .../library-quality/testing.md | 0 .../pull-requests/commit.md | 0 .../pull-requests/creating-pr.md | 0 .../pull-requests/index.md | 0 23 files changed, 29 insertions(+), 29 deletions(-) rename docs/contributing-book/src/{documentation/welcome.md => index.md} (100%) rename docs/contributing-book/src/{documentation/issues/search => issues}/assignment.md (87%) rename docs/contributing-book/src/{documentation => }/issues/create-issue.md (91%) rename docs/contributing-book/src/{documentation/issues/search => issues}/filtering.md (86%) rename docs/contributing-book/src/{documentation => }/issues/index.md (100%) rename docs/contributing-book/src/{documentation/issues/search/index.md => issues/search.md} (100%) rename docs/contributing-book/src/{documentation/issues/search => issues}/summary.md (70%) rename docs/contributing-book/src/{documentation/library-quality/documentation/code => library-quality}/abi.md (100%) rename docs/contributing-book/src/{documentation => }/library-quality/code-structure.md (100%) rename docs/contributing-book/src/{documentation/library-quality/documentation/code/index.md => library-quality/code.md} (100%) rename docs/contributing-book/src/{documentation/library-quality/documentation/code => library-quality}/comments.md (100%) rename docs/contributing-book/src/{documentation/library-quality/documentation/index.md => library-quality/documentation.md} (96%) rename docs/contributing-book/src/{documentation => }/library-quality/index.md (100%) rename docs/contributing-book/src/{documentation => }/library-quality/library-structure.md (100%) rename docs/contributing-book/src/{documentation/library-quality/documentation/code => library-quality}/naming-components.md (100%) rename docs/contributing-book/src/{documentation/library-quality/documentation => library-quality}/read-me.md (100%) rename docs/contributing-book/src/{documentation/library-quality/documentation => library-quality}/specification.md (100%) rename docs/contributing-book/src/{documentation/library-quality/documentation/code => library-quality}/style.md (100%) rename docs/contributing-book/src/{documentation => }/library-quality/testing.md (100%) rename docs/contributing-book/src/{documentation => }/pull-requests/commit.md (100%) rename docs/contributing-book/src/{documentation => }/pull-requests/creating-pr.md (100%) rename docs/contributing-book/src/{documentation => }/pull-requests/index.md (100%) diff --git a/docs/contributing-book/src/SUMMARY.md b/docs/contributing-book/src/SUMMARY.md index 3fa80a98..ff5601ef 100644 --- a/docs/contributing-book/src/SUMMARY.md +++ b/docs/contributing-book/src/SUMMARY.md @@ -1,24 +1,24 @@ # Summary -- [Welcome](./documentation/welcome.md) -- [GitHub Issues](./documentation/issues/index.md) - - [Searching for Issues](./documentation/issues/search/index.md) - - [Filtering by label](./documentation/issues/search/filtering.md) - - [Checking for available issues](./documentation/issues/search/assignment.md) - - [Issue summary](./documentation/issues/search/summary.md) - - [Creating an Issue](./documentation/issues/create-issue.md) -- [Library Quality](./documentation/library-quality/index.md) - - [Library Structure](./documentation/library-quality/library-structure.md) - - [Code Structure](./documentation/library-quality/code-structure.md) - - [Documentation](./documentation/library-quality/documentation/index.md) - - [Read me](./documentation/library-quality/documentation/read-me.md) - - [Code](./documentation/library-quality/documentation/code/index.md) - - [ABI Documentation](./documentation/library-quality/documentation/code/abi.md) - - [Comments](./documentation/library-quality/documentation/code/comments.md) - - [Naming Components](./documentation/library-quality/documentation/code/naming-components.md) - - [Style Guide](./documentation/library-quality/documentation/code/style.md) - - [Specification](./documentation/library-quality/documentation/specification.md) - - [Testing](./documentation/library-quality/testing.md) -- [Pull Requests](./documentation/pull-requests/index.md) - - [Committing your work](./documentation/pull-requests/commit.md) - - [Creating a Pull Request](./documentation/pull-requests/creating-pr.md) +- [Welcome](./welcome.md) +- [GitHub Issues](./issues/index.md) + - [Searching for Issues](./issues/search.md.md) + - [Filtering by label](./issues/filtering.md) + - [Checking for available issues](./issues/assignment.md) + - [Issue summary](./issues/summary.md) + - [Creating an Issue](./issues/create-issue.md) +- [Library Quality](./library-quality/index.md) + - [Library Structure](./library-quality/library-structure.md) + - [Code Structure](./library-quality/code-structure.md) + - [Documentation](./library-quality/documentation.md) + - [Read me](./library-quality/read-me.md) + - [Code](./library-quality/code.md) + - [ABI Documentation](./library-quality/abi.md) + - [Comments](./library-quality/comments.md) + - [Naming Components](./library-quality/naming-components.md) + - [Style Guide](./library-quality/style.md) + - [Specification](./library-quality/specification.md) + - [Testing](./library-quality/testing.md) +- [Pull Requests](./pull-requests/index.md) + - [Committing your work](./pull-requests/commit.md) + - [Creating a Pull Request](./pull-requests/creating-pr.md) diff --git a/docs/contributing-book/src/documentation/welcome.md b/docs/contributing-book/src/index.md similarity index 100% rename from docs/contributing-book/src/documentation/welcome.md rename to docs/contributing-book/src/index.md diff --git a/docs/contributing-book/src/documentation/issues/search/assignment.md b/docs/contributing-book/src/issues/assignment.md similarity index 87% rename from docs/contributing-book/src/documentation/issues/search/assignment.md rename to docs/contributing-book/src/issues/assignment.md index 06c3ffd7..b4ddc764 100644 --- a/docs/contributing-book/src/documentation/issues/search/assignment.md +++ b/docs/contributing-book/src/issues/assignment.md @@ -4,4 +4,4 @@ It's important to check if anyone else is currently working on an particular iss You can check whether someone is assigned to an issue by looking under the `Assignee` tab. If there is an icon, then someone is tasked with that issue. If there is no icon, then it's likely that no one is currently working on that issue and you're free to assign it to yourself or post a comment so that the author can assign you. -![Filtering issues by an app label image](../../../images/app-filter-assignee.png) +![Filtering issues by an app label image](../images/app-filter-assignee.png) diff --git a/docs/contributing-book/src/documentation/issues/create-issue.md b/docs/contributing-book/src/issues/create-issue.md similarity index 91% rename from docs/contributing-book/src/documentation/issues/create-issue.md rename to docs/contributing-book/src/issues/create-issue.md index bcc1a6a5..249b90ab 100644 --- a/docs/contributing-book/src/documentation/issues/create-issue.md +++ b/docs/contributing-book/src/issues/create-issue.md @@ -10,7 +10,7 @@ We encourage the use of the provided templates because they guide a user into an
    -![Using issue templates image](../../images/issue-templates.png) +![Using issue templates image](../images/issue-templates.png)
    diff --git a/docs/contributing-book/src/documentation/issues/search/filtering.md b/docs/contributing-book/src/issues/filtering.md similarity index 86% rename from docs/contributing-book/src/documentation/issues/search/filtering.md rename to docs/contributing-book/src/issues/filtering.md index 85649321..bf9d3aa8 100644 --- a/docs/contributing-book/src/documentation/issues/search/filtering.md +++ b/docs/contributing-book/src/issues/filtering.md @@ -4,7 +4,7 @@ The default issues tab shows all of the issues that are currently open. GitHub a Under the `Label` tab you can select any number of labels and any issue that matches those labels will be shown while the other issues will be hidden. -![Filter by label image](../../../images/filter-dropdown.png) +![Filter by label image](../images/filter-dropdown.png)
    @@ -12,4 +12,4 @@ After clicking on the `Lib: Cryptography` label the issues have been filtered to Notice that `Lib: Cryptography` is not the only label in the image below. If you wish to further reduce the number of presented issues then additional labels can be added in the same way. -![Filtering issues by an app label image](../../../images/app-filter.png) +![Filtering issues by an app label image](../images/app-filter.png) diff --git a/docs/contributing-book/src/documentation/issues/index.md b/docs/contributing-book/src/issues/index.md similarity index 100% rename from docs/contributing-book/src/documentation/issues/index.md rename to docs/contributing-book/src/issues/index.md diff --git a/docs/contributing-book/src/documentation/issues/search/index.md b/docs/contributing-book/src/issues/search.md similarity index 100% rename from docs/contributing-book/src/documentation/issues/search/index.md rename to docs/contributing-book/src/issues/search.md diff --git a/docs/contributing-book/src/documentation/issues/search/summary.md b/docs/contributing-book/src/issues/summary.md similarity index 70% rename from docs/contributing-book/src/documentation/issues/search/summary.md rename to docs/contributing-book/src/issues/summary.md index 868a1cfb..29d60a83 100644 --- a/docs/contributing-book/src/documentation/issues/search/summary.md +++ b/docs/contributing-book/src/issues/summary.md @@ -2,8 +2,8 @@ You can see the activity of an issue by looking at the number of comments. This doesn't really tell you much aside from that there is a discussion about what should be done. -![Filtering issues by an app label image](../../../images/app-filter-comments.png) +![Filtering issues by an app label image](../images/app-filter-comments.pngs) Clicking on the issue near the bottom `Sum Merkle Proof Verification` we can see some information about the library with some information on what the library intends to implement and why it is needed. -![Filtering issues by an app label image](../../../images/app-documentation.png) +![Filtering issues by an app label image](../images/app-documentation.png) diff --git a/docs/contributing-book/src/documentation/library-quality/documentation/code/abi.md b/docs/contributing-book/src/library-quality/abi.md similarity index 100% rename from docs/contributing-book/src/documentation/library-quality/documentation/code/abi.md rename to docs/contributing-book/src/library-quality/abi.md diff --git a/docs/contributing-book/src/documentation/library-quality/code-structure.md b/docs/contributing-book/src/library-quality/code-structure.md similarity index 100% rename from docs/contributing-book/src/documentation/library-quality/code-structure.md rename to docs/contributing-book/src/library-quality/code-structure.md diff --git a/docs/contributing-book/src/documentation/library-quality/documentation/code/index.md b/docs/contributing-book/src/library-quality/code.md similarity index 100% rename from docs/contributing-book/src/documentation/library-quality/documentation/code/index.md rename to docs/contributing-book/src/library-quality/code.md diff --git a/docs/contributing-book/src/documentation/library-quality/documentation/code/comments.md b/docs/contributing-book/src/library-quality/comments.md similarity index 100% rename from docs/contributing-book/src/documentation/library-quality/documentation/code/comments.md rename to docs/contributing-book/src/library-quality/comments.md diff --git a/docs/contributing-book/src/documentation/library-quality/documentation/index.md b/docs/contributing-book/src/library-quality/documentation.md similarity index 96% rename from docs/contributing-book/src/documentation/library-quality/documentation/index.md rename to docs/contributing-book/src/library-quality/documentation.md index ad01925e..7c15fed0 100644 --- a/docs/contributing-book/src/documentation/library-quality/documentation/index.md +++ b/docs/contributing-book/src/library-quality/documentation.md @@ -8,7 +8,7 @@ In the following sections we will take a look at how to document the: - [Read me](read-me.md) - The first document a user will see which includes content such as installation instructions -- [Code](./code/index.md) +- [Code](./code.md) - Documenting the code itself such that contributors know how to interact with it - [Specification](specification.md) - Presenting technical (or non-technical) information about your project diff --git a/docs/contributing-book/src/documentation/library-quality/index.md b/docs/contributing-book/src/library-quality/index.md similarity index 100% rename from docs/contributing-book/src/documentation/library-quality/index.md rename to docs/contributing-book/src/library-quality/index.md diff --git a/docs/contributing-book/src/documentation/library-quality/library-structure.md b/docs/contributing-book/src/library-quality/library-structure.md similarity index 100% rename from docs/contributing-book/src/documentation/library-quality/library-structure.md rename to docs/contributing-book/src/library-quality/library-structure.md diff --git a/docs/contributing-book/src/documentation/library-quality/documentation/code/naming-components.md b/docs/contributing-book/src/library-quality/naming-components.md similarity index 100% rename from docs/contributing-book/src/documentation/library-quality/documentation/code/naming-components.md rename to docs/contributing-book/src/library-quality/naming-components.md diff --git a/docs/contributing-book/src/documentation/library-quality/documentation/read-me.md b/docs/contributing-book/src/library-quality/read-me.md similarity index 100% rename from docs/contributing-book/src/documentation/library-quality/documentation/read-me.md rename to docs/contributing-book/src/library-quality/read-me.md diff --git a/docs/contributing-book/src/documentation/library-quality/documentation/specification.md b/docs/contributing-book/src/library-quality/specification.md similarity index 100% rename from docs/contributing-book/src/documentation/library-quality/documentation/specification.md rename to docs/contributing-book/src/library-quality/specification.md diff --git a/docs/contributing-book/src/documentation/library-quality/documentation/code/style.md b/docs/contributing-book/src/library-quality/style.md similarity index 100% rename from docs/contributing-book/src/documentation/library-quality/documentation/code/style.md rename to docs/contributing-book/src/library-quality/style.md diff --git a/docs/contributing-book/src/documentation/library-quality/testing.md b/docs/contributing-book/src/library-quality/testing.md similarity index 100% rename from docs/contributing-book/src/documentation/library-quality/testing.md rename to docs/contributing-book/src/library-quality/testing.md diff --git a/docs/contributing-book/src/documentation/pull-requests/commit.md b/docs/contributing-book/src/pull-requests/commit.md similarity index 100% rename from docs/contributing-book/src/documentation/pull-requests/commit.md rename to docs/contributing-book/src/pull-requests/commit.md diff --git a/docs/contributing-book/src/documentation/pull-requests/creating-pr.md b/docs/contributing-book/src/pull-requests/creating-pr.md similarity index 100% rename from docs/contributing-book/src/documentation/pull-requests/creating-pr.md rename to docs/contributing-book/src/pull-requests/creating-pr.md diff --git a/docs/contributing-book/src/documentation/pull-requests/index.md b/docs/contributing-book/src/pull-requests/index.md similarity index 100% rename from docs/contributing-book/src/documentation/pull-requests/index.md rename to docs/contributing-book/src/pull-requests/index.md From e9ae32e1dd24538d72ba24e17f980966f82331d2 Mon Sep 17 00:00:00 2001 From: bitzoic Date: Wed, 3 Apr 2024 14:18:50 +0900 Subject: [PATCH 14/18] Fix code links --- .../src/library-quality/comments.md | 2 +- .../src/library-quality/library-structure.md | 4 ++-- .../src/library-quality/style.md | 18 +++++++++--------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/contributing-book/src/library-quality/comments.md b/docs/contributing-book/src/library-quality/comments.md index bcd5aa6f..e6506539 100644 --- a/docs/contributing-book/src/library-quality/comments.md +++ b/docs/contributing-book/src/library-quality/comments.md @@ -12,5 +12,5 @@ The following snippet looks at two items being documented using the comment synt - `Item2` has taken the approach of describing the context in order to provide meaning behind each field ```sway -{{#include ../../../../code/bad_documentation/src/lib.sw:data_structures}} +{{#include ../code/bad_documentation/src/lib.sw:data_structures}} ``` diff --git a/docs/contributing-book/src/library-quality/library-structure.md b/docs/contributing-book/src/library-quality/library-structure.md index b77942a9..0916344a 100644 --- a/docs/contributing-book/src/library-quality/library-structure.md +++ b/docs/contributing-book/src/library-quality/library-structure.md @@ -31,7 +31,7 @@ Contains enums that are used in `require(..., MyError::SomeError)` statements. The enums are split into individual errors e.g. `DepositError`, `OwnerError` etc. ```sway -{{#include ../../code/connect_four/src/errors.sw:error}} +{{#include ../code/connect_four/src/errors.sw:error}} ``` ## events.sw @@ -39,7 +39,7 @@ The enums are split into individual errors e.g. `DepositError`, `OwnerError` etc Contains structs definitions which are used inside `log()` statements. ```sway -{{#include ../../code/connect_four/src/events.sw:event}} +{{#include ../code/connect_four/src/events.sw:event}} ``` ## my_library.sw diff --git a/docs/contributing-book/src/library-quality/style.md b/docs/contributing-book/src/library-quality/style.md index 2eb93a82..478b869e 100644 --- a/docs/contributing-book/src/library-quality/style.md +++ b/docs/contributing-book/src/library-quality/style.md @@ -9,7 +9,7 @@ The following snippets present the style for writing `Sway`. Structs, traits, and enums are `CapitalCase` which means each word has a capitalized first letter. The fields inside a struct should be [snake_case](#snake_case) and `CapitalCase` inside an enum. ```sway -{{#include ../../../../code/style_guide/src/lib.sw:structures}} +{{#include ../code/style_guide/src/lib.sw:structures}} ``` ## snake_case @@ -19,13 +19,13 @@ Modules, variables, and functions are `snake_case` which means that each word is Module name: ```sway -{{#include ../../../../code/style_guide/src/lib.sw:module}} +{{#include ../code/style_guide/src/lib.sw:module}} ``` Function and variable: ```sway -{{#include ../../../../code/style_guide/src/lib.sw:function_case}} +{{#include ../code/style_guide/src/lib.sw:function_case}} ``` ## SCREAMING_SNAKE_CASE @@ -33,7 +33,7 @@ Function and variable: Constants are `SCREAMING_SNAKE_CASE` which means that each word in capitalized and separated by an underscore. ```sway -{{#include ../../../../code/style_guide/src/lib.sw:const}} +{{#include ../code/style_guide/src/lib.sw:const}} ``` ## Type Annotations @@ -43,7 +43,7 @@ When declaring a variable it is possible to annotate it with a type however the The general approach is to omit a type if the compiler does not throw an error however if it is deemed clearer by the developer to indicate the type then that is also encouraged. ```sway -{{#include ../../../../code/style_guide/src/lib.sw:type_annotation}} +{{#include ../code/style_guide/src/lib.sw:type_annotation}} ``` ## Field Initialization Shorthand @@ -53,19 +53,19 @@ A struct has a shorthand notation for initializing its fields. The shorthand wor The following struct has a field `amount` with type `u64`. ```sway -{{#include ../../../../code/style_guide/src/lib.sw:struct_shorthand_definition}} +{{#include ../code/style_guide/src/lib.sw:struct_shorthand_definition}} ``` Using the shorthand notation we can initialize the struct in the following way. ```sway -{{#include ../../../../code/style_guide/src/lib.sw:struct_shorthand_use}} +{{#include ../code/style_guide/src/lib.sw:struct_shorthand_use}} ``` The shorthand is encouraged because it is a cleaner alternative to the following. ```sway -{{#include ../../../../code/style_guide/src/lib.sw:struct_shorthand_avoid}} +{{#include ../code/style_guide/src/lib.sw:struct_shorthand_avoid}} ``` ## Getters @@ -73,5 +73,5 @@ The shorthand is encouraged because it is a cleaner alternative to the following Getters should not follow the pattern of `get_XYZ()` and instead should follow `XYZ()`. ```sway -{{#include ../../../../code/style_guide/src/lib.sw:getters}} +{{#include ../code/style_guide/src/lib.sw:getters}} ``` From c8681ec5693b8f5ed639b7d798a472f4ddd66706 Mon Sep 17 00:00:00 2001 From: bitzoic Date: Wed, 3 Apr 2024 14:34:26 +0900 Subject: [PATCH 15/18] No nested docs --- docs/book/src/SUMMARY.md | 33 ++++++++----------- docs/book/src/access_security_libraries.md | 21 ------------ docs/book/src/asset_libraries.md | 9 ----- docs/book/src/cryptography_libraries.md | 13 -------- docs/book/src/data_structures_libraries.md | 9 ----- docs/book/src/math_libraries.md | 13 -------- docs/contributing-book/src/SUMMARY.md | 26 +++++++-------- .../src/{library-quality => code_docs}/abi.md | 0 .../comments.md | 0 .../code.md => code_docs/index.md} | 0 .../naming-components.md | 0 .../specification.md | 0 .../{library-quality => code_docs}/style.md | 0 .../index.md} | 0 .../read-me.md | 0 .../testing.md => testing/index.md} | 0 16 files changed, 27 insertions(+), 97 deletions(-) delete mode 100644 docs/book/src/access_security_libraries.md delete mode 100644 docs/book/src/asset_libraries.md delete mode 100644 docs/book/src/cryptography_libraries.md delete mode 100644 docs/book/src/data_structures_libraries.md delete mode 100644 docs/book/src/math_libraries.md rename docs/contributing-book/src/{library-quality => code_docs}/abi.md (100%) rename docs/contributing-book/src/{library-quality => code_docs}/comments.md (100%) rename docs/contributing-book/src/{library-quality/code.md => code_docs/index.md} (100%) rename docs/contributing-book/src/{library-quality => code_docs}/naming-components.md (100%) rename docs/contributing-book/src/{library-quality => code_docs}/specification.md (100%) rename docs/contributing-book/src/{library-quality => code_docs}/style.md (100%) rename docs/contributing-book/src/{library-quality/documentation.md => documentation/index.md} (100%) rename docs/contributing-book/src/{library-quality => documentation}/read-me.md (100%) rename docs/contributing-book/src/{library-quality/testing.md => testing/index.md} (100%) diff --git a/docs/book/src/SUMMARY.md b/docs/book/src/SUMMARY.md index 549c6b21..1ea7dda8 100644 --- a/docs/book/src/SUMMARY.md +++ b/docs/book/src/SUMMARY.md @@ -4,22 +4,17 @@ - [Getting Started](./getting_started/index.md) - [Running Tests](./getting_started/running_tests.md) -- [Libraries](./libraries.md) - - [Asset Libraries](./asset_libraries.md) - - [Asset Library](./asset/index.md) - - [Base](./asset/base.md) - - [Supply](./asset/supply.md) - - [Metadata](./asset/metadata.md) - - [Access Control and Security Libraries](./access_security_libraries.md) - - [Admin Library](./admin/index.md) - - [Ownership Library](./ownership/index.md) - - [Pausable Library](./pausable/index.md) - - [Reentrancy Guard Library](./reentrancy/index.md) - - [Cryptography Libraries](./cryptography_libraries.md) - - [Bytecode Library](./bytecode/index.md) - - [Merkle Library](./merkle/index.md) - - [Math Libraries](./math_libraries.md) - - [Fixed Point Number Library](./fixed_point/index.md) - - [Signed Integers Library](./signed_integers/index.md) - - [Data Structure Libraries](./data_structures_libraries.md) - - [Queue Library](./queue/index.md) +- [Libraries Overview](./libraries.md) +- [Asset Library](./asset/index.md) + - [Base](./asset/base.md) + - [Supply](./asset/supply.md) + - [Metadata](./asset/metadata.md) +- [Admin Library](./admin/index.md) +- [Ownership Library](./ownership/index.md) +- [Pausable Library](./pausable/index.md) +- [Reentrancy Guard Library](./reentrancy/index.md) +- [Bytecode Library](./bytecode/index.md) +- [Merkle Library](./merkle/index.md) +- [Fixed Point Number Library](./fixed_point/index.md) +- [Signed Integers Library](./signed_integers/index.md) +- [Queue Library](./queue/index.md) diff --git a/docs/book/src/access_security_libraries.md b/docs/book/src/access_security_libraries.md deleted file mode 100644 index 05e72312..00000000 --- a/docs/book/src/access_security_libraries.md +++ /dev/null @@ -1,21 +0,0 @@ -# Access Control and Security Libraries - -Access Control and Security Libraries are any libraries that are built and intended to provide additional safety when developing smart contracts. - -For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). - -## Ownership Library - -The [Ownership](./ownership/index.md) Library is used to apply restrictions on functions such that only a **single** user may call them. - -## Admin Library - -The [Admin](./admin/index.md) Library is used to apply restrictions on functions such that only a select few users may call them like a whitelist. - -## Pausable Library - -The [Pausable](./pausable/index.md) Library allows contracts to implement an emergency stop mechanism. - -## Reentrancy Guard Library - -The [Reentrancy Guard](./reentrancy/index.md) Library is used to detect and prevent reentrancy attacks. diff --git a/docs/book/src/asset_libraries.md b/docs/book/src/asset_libraries.md deleted file mode 100644 index d58f5ab9..00000000 --- a/docs/book/src/asset_libraries.md +++ /dev/null @@ -1,9 +0,0 @@ -# Assets Libraries - -Asset Libraries are any libraries that use [Native Assets](https://docs.fuel.network/docs/sway/blockchain-development/native_assets) on the Fuel Network. - -For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). - -## Asset Library - -The [Asset](./asset/index.md) Library provides helper functions for the [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md), [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md), and [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) standards. diff --git a/docs/book/src/cryptography_libraries.md b/docs/book/src/cryptography_libraries.md deleted file mode 100644 index 7800f500..00000000 --- a/docs/book/src/cryptography_libraries.md +++ /dev/null @@ -1,13 +0,0 @@ -# Cryptography Libraries - -Cryptography Libraries are any libraries that provided cryptographic functionality beyond what the std-lib provides. - -For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). - -## Bytecode Library - -The [Bytecode](./bytecode/index.md) Library is used for on-chain verification and computation of bytecode roots for contracts and predicates. - -## Merkle Library - -The [Merkle Proof](./merkle/index.md) Library is used to verify Binary Merkle Trees computed off-chain. diff --git a/docs/book/src/data_structures_libraries.md b/docs/book/src/data_structures_libraries.md deleted file mode 100644 index fe5d265a..00000000 --- a/docs/book/src/data_structures_libraries.md +++ /dev/null @@ -1,9 +0,0 @@ -# Data Structures Libraries - -Data Structure Libraries are libraries which provide complex data structures which unlock additional functionality for Smart Contracts. - -For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). - -## Queue - -The [Queue](./queue/index.md) Library is a linear data structure that provides First-In-First-Out (FIFO) operations. diff --git a/docs/book/src/math_libraries.md b/docs/book/src/math_libraries.md deleted file mode 100644 index e8f96659..00000000 --- a/docs/book/src/math_libraries.md +++ /dev/null @@ -1,13 +0,0 @@ -# Math Libraries - -Math Libraries are libraries which provide mathematic functions or number types that are outside of the std-lib's scope. - -For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). - -## Fixed Point Number Library - -The [Fixed Point Number](./fixed_point/index.md) Library is an interface to implement fixed-point numbers. - -## Signed Integers - -The [Signed Integers](./signed_integers/index.md) Library is an interface to implement signed integers. diff --git a/docs/contributing-book/src/SUMMARY.md b/docs/contributing-book/src/SUMMARY.md index ff5601ef..c17e70f4 100644 --- a/docs/contributing-book/src/SUMMARY.md +++ b/docs/contributing-book/src/SUMMARY.md @@ -3,22 +3,22 @@ - [Welcome](./welcome.md) - [GitHub Issues](./issues/index.md) - [Searching for Issues](./issues/search.md.md) - - [Filtering by label](./issues/filtering.md) - - [Checking for available issues](./issues/assignment.md) - - [Issue summary](./issues/summary.md) + - [Filtering by label](./issues/filtering.md) + - [Checking for available issues](./issues/assignment.md) + - [Issue summary](./issues/summary.md) - [Creating an Issue](./issues/create-issue.md) -- [Library Quality](./library-quality/index.md) +- [Structure](./library-quality/index.md) - [Library Structure](./library-quality/library-structure.md) - [Code Structure](./library-quality/code-structure.md) - - [Documentation](./library-quality/documentation.md) - - [Read me](./library-quality/read-me.md) - - [Code](./library-quality/code.md) - - [ABI Documentation](./library-quality/abi.md) - - [Comments](./library-quality/comments.md) - - [Naming Components](./library-quality/naming-components.md) - - [Style Guide](./library-quality/style.md) - - [Specification](./library-quality/specification.md) - - [Testing](./library-quality/testing.md) +- [Documentation](./documentation/index.md) + - [Read me](./documentation/read-me.md) +- [Code](./code_docs/index.md) + - [ABI Documentation](./code_docs/abi.md) + - [Comments](./code_docs/comments.md) + - [Naming Components](./code_docs/naming-components.md) + - [Style Guide](./code_docs/style.md) + - [Specification](./code_docs/specification.md) +- [Testing](./testing/index.md) - [Pull Requests](./pull-requests/index.md) - [Committing your work](./pull-requests/commit.md) - [Creating a Pull Request](./pull-requests/creating-pr.md) diff --git a/docs/contributing-book/src/library-quality/abi.md b/docs/contributing-book/src/code_docs/abi.md similarity index 100% rename from docs/contributing-book/src/library-quality/abi.md rename to docs/contributing-book/src/code_docs/abi.md diff --git a/docs/contributing-book/src/library-quality/comments.md b/docs/contributing-book/src/code_docs/comments.md similarity index 100% rename from docs/contributing-book/src/library-quality/comments.md rename to docs/contributing-book/src/code_docs/comments.md diff --git a/docs/contributing-book/src/library-quality/code.md b/docs/contributing-book/src/code_docs/index.md similarity index 100% rename from docs/contributing-book/src/library-quality/code.md rename to docs/contributing-book/src/code_docs/index.md diff --git a/docs/contributing-book/src/library-quality/naming-components.md b/docs/contributing-book/src/code_docs/naming-components.md similarity index 100% rename from docs/contributing-book/src/library-quality/naming-components.md rename to docs/contributing-book/src/code_docs/naming-components.md diff --git a/docs/contributing-book/src/library-quality/specification.md b/docs/contributing-book/src/code_docs/specification.md similarity index 100% rename from docs/contributing-book/src/library-quality/specification.md rename to docs/contributing-book/src/code_docs/specification.md diff --git a/docs/contributing-book/src/library-quality/style.md b/docs/contributing-book/src/code_docs/style.md similarity index 100% rename from docs/contributing-book/src/library-quality/style.md rename to docs/contributing-book/src/code_docs/style.md diff --git a/docs/contributing-book/src/library-quality/documentation.md b/docs/contributing-book/src/documentation/index.md similarity index 100% rename from docs/contributing-book/src/library-quality/documentation.md rename to docs/contributing-book/src/documentation/index.md diff --git a/docs/contributing-book/src/library-quality/read-me.md b/docs/contributing-book/src/documentation/read-me.md similarity index 100% rename from docs/contributing-book/src/library-quality/read-me.md rename to docs/contributing-book/src/documentation/read-me.md diff --git a/docs/contributing-book/src/library-quality/testing.md b/docs/contributing-book/src/testing/index.md similarity index 100% rename from docs/contributing-book/src/library-quality/testing.md rename to docs/contributing-book/src/testing/index.md From 0bc640ff524e87edd3e17a82577dcb868f029166 Mon Sep 17 00:00:00 2001 From: bitzoic Date: Wed, 3 Apr 2024 14:36:44 +0900 Subject: [PATCH 16/18] Update book.toml --- docs/book/book.toml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/book/book.toml b/docs/book/book.toml index e69de29b..89c463d2 100644 --- a/docs/book/book.toml +++ b/docs/book/book.toml @@ -0,0 +1,14 @@ +[book] +authors = ["Fuel Labs "] +language = "en" +multilingual = false +src = "src" +title = "Sway Libraries" + +[output.html] +git-repository-url = "https://github.com/FuelLabs/sway-libs" + +[preprocessor.forc-documenter] + +[rust] +edition = "2021" \ No newline at end of file From 544fd8550621e9205c4c6231b14fe4d90611be1e Mon Sep 17 00:00:00 2001 From: bitzoic Date: Thu, 4 Apr 2024 14:07:49 +0900 Subject: [PATCH 17/18] Fix links --- docs/book/src/admin/index.md | 2 +- docs/book/src/asset/base.md | 4 +++- docs/book/src/asset/metadata.md | 4 +++- docs/book/src/asset/supply.md | 4 +++- docs/book/src/bytecode/index.md | 2 +- docs/book/src/fixed_point/index.md | 2 +- docs/book/src/getting_started/index.md | 2 +- docs/book/src/libraries.md | 12 ++++++------ docs/book/src/merkle/index.md | 2 +- docs/book/src/ownership/index.md | 2 +- docs/book/src/pausable/index.md | 2 +- docs/book/src/queue/index.md | 2 +- docs/book/src/reentrancy/index.md | 2 +- docs/book/src/signed_integers/index.md | 2 +- docs/contributing-book/src/SUMMARY.md | 4 ++-- docs/contributing-book/src/documentation/index.md | 4 ++-- docs/contributing-book/src/issues/summary.md | 2 +- docs/contributing-book/src/library-quality/index.md | 4 ++-- docs/contributing-book/src/testing/index.md | 2 +- 19 files changed, 33 insertions(+), 27 deletions(-) diff --git a/docs/book/src/admin/index.md b/docs/book/src/admin/index.md index c6097415..9a6eddcb 100644 --- a/docs/book/src/admin/index.md +++ b/docs/book/src/admin/index.md @@ -8,7 +8,7 @@ For implementation details on the Admin Library please see the [Sway Libs Docs]( ## Importing the Admin Library -In order to use the Admin Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). +In order to use the Admin Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../getting_started/index.md). To import the Admin Library, be sure to include both the Admin and Ownership Libraries in your import statements. diff --git a/docs/book/src/asset/base.md b/docs/book/src/asset/base.md index b969dc14..de3dc9a6 100644 --- a/docs/book/src/asset/base.md +++ b/docs/book/src/asset/base.md @@ -4,6 +4,8 @@ For implementation details on the Asset Library base functionality please see th ## Importing the Asset Library Base Functionality +In order to use the Asset Library, Sway Libs and [Sway Standards](https://github.com/FuelLabs/sway-standards) must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../getting_started/index.md). To add Sway Standards as a dependency please see the [Sway Standards Book](https://github.com/FuelLabs/sway-standards). + To import the Asset Library Base Functionality and [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md) Standard to your Sway Smart Contract, add the following to your Sway file: ```sway @@ -131,7 +133,7 @@ impl SRC20 for Contract { ## Setting an Asset's SRC-20 Attributes -To set some the asset attributes for an Asset, use the `SetAssetAttributes` ABI provided by the Asset Library. The example below shows the implementation of the `SetAssetAttributes` ABI with no user defined restrictions or custom functionality. It is recommended that the [Ownership Library](../../access_security/ownership/) is used in conjunction with the `SetAssetAttributes` ABI to ensure only a single user has permissions to set an Asset's attributes. +To set some the asset attributes for an Asset, use the `SetAssetAttributes` ABI provided by the Asset Library. The example below shows the implementation of the `SetAssetAttributes` ABI with no user defined restrictions or custom functionality. It is recommended that the [Ownership Library](../ownership/index.md) is used in conjunction with the `SetAssetAttributes` ABI to ensure only a single user has permissions to set an Asset's attributes. ```sway use sway_libs::asset::base::*; diff --git a/docs/book/src/asset/metadata.md b/docs/book/src/asset/metadata.md index 176d8d2f..81055b61 100644 --- a/docs/book/src/asset/metadata.md +++ b/docs/book/src/asset/metadata.md @@ -4,6 +4,8 @@ For implementation details on the Asset Library metadata functionality please se ## Importing the Asset Library Metadata Functionality +In order to use the Asset Library, Sway Libs and [Sway Standards](https://github.com/FuelLabs/sway-standards) must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../getting_started/index.md). To add Sway Standards as a dependency please see the [Sway Standards Book](https://github.com/FuelLabs/sway-standards). + To import the Asset Library Base Functionality and [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) Standard to your Sway Smart Contract, add the following to your Sway file: ```sway @@ -51,7 +53,7 @@ storage { ### Setting Metadata -To set some metadata for an Asset, use the `SetAssetMetadata` ABI provided by the Asset Library. Be sure to follow the [SRC-9](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-9.md) standard for your `key`. It is recommended that the [Ownership Library](../../access_security/ownership/) is used in conjunction with the `SetAssetMetadata` ABI to ensure only a single user has permissions to set an Asset's metadata. +To set some metadata for an Asset, use the `SetAssetMetadata` ABI provided by the Asset Library. Be sure to follow the [SRC-9](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-9.md) standard for your `key`. It is recommended that the [Ownership Library](../ownership/index.md) is used in conjunction with the `SetAssetMetadata` ABI to ensure only a single user has permissions to set an Asset's metadata. ```sway use sway_libs::asset::metadata::*; diff --git a/docs/book/src/asset/supply.md b/docs/book/src/asset/supply.md index 68afe5f3..93e5d7c8 100644 --- a/docs/book/src/asset/supply.md +++ b/docs/book/src/asset/supply.md @@ -4,6 +4,8 @@ For implementation details on the Asset Library supply functionality please see ## Importing the Asset Library Supply Functionality +In order to use the Asset Library, Sway Libs and [Sway Standards](https://github.com/FuelLabs/sway-standards) must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../getting_started/index.md). To add Sway Standards as a dependency please see the [Sway Standards Book](https://github.com/FuelLabs/sway-standards). + To import the Asset Library Supply Functionality and [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md) Standard to your Sway Smart Contract, add the following to your Sway file: ```sway @@ -44,7 +46,7 @@ storage { ## Implementing the SRC-3 Standard with the Asset Library -To use a base function, simply pass the `StorageKey` from the prescribed storage block. The example below shows the implementation of the [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md) standard in combination with the Asset Library with no user defined restrictions or custom functionality. It is recommended that the [Ownership Library](../../access_security/ownership/) is used in conjunction with the Asset Library;s supply functionality to ensure only a single user has permissions to mint an Asset. +To use a base function, simply pass the `StorageKey` from the prescribed storage block. The example below shows the implementation of the [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md) standard in combination with the Asset Library with no user defined restrictions or custom functionality. It is recommended that the [Ownership Library](../ownership/index.md) is used in conjunction with the Asset Library;s supply functionality to ensure only a single user has permissions to mint an Asset. ```sway use sway_libs::asset::supply::{_mint, _burn}; diff --git a/docs/book/src/bytecode/index.md b/docs/book/src/bytecode/index.md index ef9008bb..71ba7b99 100644 --- a/docs/book/src/bytecode/index.md +++ b/docs/book/src/bytecode/index.md @@ -8,7 +8,7 @@ For implementation details on the Bytecode Library please see the [Sway Libs Doc ## Importing the Bytecode Library -In order to use the Bytecode Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). +In order to use the Bytecode Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../getting_started/index.md). To import the Bytecode Library to your Sway Smart Contract, add the following to your Sway file: diff --git a/docs/book/src/fixed_point/index.md b/docs/book/src/fixed_point/index.md index c37f30cb..391d639b 100644 --- a/docs/book/src/fixed_point/index.md +++ b/docs/book/src/fixed_point/index.md @@ -8,7 +8,7 @@ For implementation details on the Fixed Point Number Library please see the [Swa ## Importing the Fixed Point Number Library -In order to use the Fixed Point Number Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). +In order to use the Fixed Point Number Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../getting_started/index.md). To import the Fixed Point Number Library to your Sway Smart Contract, add the following to your Sway file: diff --git a/docs/book/src/getting_started/index.md b/docs/book/src/getting_started/index.md index 4912a9ba..70bd200e 100644 --- a/docs/book/src/getting_started/index.md +++ b/docs/book/src/getting_started/index.md @@ -68,6 +68,6 @@ impl Pausable for Contract { } ``` -Any instructions related to using a specific library should be found within the [libraries](../libraries/index.md) section of the Sway Libs Book. +Any instructions related to using a specific library should be found within the [libraries](../libraries.md) section of the Sway Libs Book. For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). diff --git a/docs/book/src/libraries.md b/docs/book/src/libraries.md index 0df8616b..6e130d79 100644 --- a/docs/book/src/libraries.md +++ b/docs/book/src/libraries.md @@ -4,15 +4,15 @@ There are several types of libraries that Sway Libs encompases. These include li For implementation details on the libraries please see the [Sway Libs Docs](https://fuellabs.github.io/sway-libs/master/sway_libs/). -## [Assets Libraries](./asset_libraries.md) +## Assets Libraries Asset Libraries are any libraries that use [Native Assets](https://docs.fuel.network/docs/sway/blockchain-development/native_assets) on the Fuel Network. ### [Asset Library](./asset/index.md) -The [Asset](./asset/asset/index.md) Library provides helper functions for the [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md), [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md), and [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) standards. +The [Asset](./asset/index.md) Library provides helper functions for the [SRC-20](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-20.md), [SRC-3](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-3.md), and [SRC-7](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-7.md) standards. -## [Access Control and Security Libraries](./access_security_libraries.md) +## Access Control and Security Libraries Access Control and Security Libraries are any libraries that are built and intended to provide additional safety when developing smart contracts. @@ -32,7 +32,7 @@ The [Pausable](./pausable/index.md) Library allows contracts to implement an eme The [Reentrancy Guard](./reentrancy/index.md) Library is used to detect and prevent reentrancy attacks. -## [Cryptography Libraries](./cryptography_libraries.md) +## Cryptography Libraries Cryptography Libraries are any libraries that provided cryptographic functionality beyond what the std-lib provides. @@ -44,7 +44,7 @@ The [Bytecode](./bytecode/index.md) Library is used for on-chain verification an The [Merkle Proof](./merkle/index.md) Library is used to verify Binary Merkle Trees computed off-chain. -## [Math Libraries](./math_libraries.md) +## Math Libraries Math Libraries are libraries which provide mathematic functions or number types that are outside of the std-lib's scope. @@ -56,7 +56,7 @@ The [Fixed Point Number](./fixed_point/index.md) Library is an interface to impl The [Signed Integers](./signed_integers/index.md) Library is an interface to implement signed integers. -## [Data Structures Libraries](./data_structures_libraries.md) +## Data Structures Libraries Data Structure Libraries are libraries which provide complex data structures which unlock additional functionality for Smart Contracts. diff --git a/docs/book/src/merkle/index.md b/docs/book/src/merkle/index.md index c9054414..2a0a3722 100644 --- a/docs/book/src/merkle/index.md +++ b/docs/book/src/merkle/index.md @@ -6,7 +6,7 @@ For implementation details on the Merkle Library please see the [Sway Libs Docs] ## Importing the Merkle Library -In order to use the Merkle Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). +In order to use the Merkle Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../getting_started/index.md). To import the Merkle Library to your Sway Smart Contract, add the following to your Sway file: diff --git a/docs/book/src/ownership/index.md b/docs/book/src/ownership/index.md index 393f3c12..41019dac 100644 --- a/docs/book/src/ownership/index.md +++ b/docs/book/src/ownership/index.md @@ -6,7 +6,7 @@ For implementation details on the Ownership Library please see the [Sway Libs Do ## Importing the Ownership Library -In order to use the Ownership library, Sway Libs and [Sway Standards](https://github.com/FuelLabs/sway-standards) must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). To add Sway Standards as a dependency please see the [Sway Standards Book](https://fuellabs.github.io/sway-libs/master/sway_libs/ownership/index.html). +In order to use the Ownership library, Sway Libs and [Sway Standards](https://github.com/FuelLabs/sway-standards) must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../getting_started/index.md). To add Sway Standards as a dependency please see the [Sway Standards Book](https://github.com/FuelLabs/sway-standards). To import the Ownership Library and [SRC-5](https://github.com/FuelLabs/sway-standards/blob/master/SRCs/src-5.md) Standard to your Sway Smart Contract, add the following to your Sway file: diff --git a/docs/book/src/pausable/index.md b/docs/book/src/pausable/index.md index 1f43263d..beca49d6 100644 --- a/docs/book/src/pausable/index.md +++ b/docs/book/src/pausable/index.md @@ -8,7 +8,7 @@ For implementation details on the Pausable Library please see the [Sway Libs Doc ## Importing the Pausable Library -In order to use the Pausable library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). +In order to use the Pausable library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../getting_started/index.md). To import the Pausable Library to your Sway Smart Contract, add the following to your Sway file: diff --git a/docs/book/src/queue/index.md b/docs/book/src/queue/index.md index 961cf63e..76e43fb4 100644 --- a/docs/book/src/queue/index.md +++ b/docs/book/src/queue/index.md @@ -6,7 +6,7 @@ For implementation details on the Queue Library please see the [Sway Libs Docs]( ## Importing the Queue Library -In order to use the Queue Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). +In order to use the Queue Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../getting_started/index.md). To import the Queue Library to your Sway Smart Contract, add the following to your Sway file: diff --git a/docs/book/src/reentrancy/index.md b/docs/book/src/reentrancy/index.md index 9cc8831b..fa6a55e4 100644 --- a/docs/book/src/reentrancy/index.md +++ b/docs/book/src/reentrancy/index.md @@ -15,7 +15,7 @@ While this can protect against both single-function reentrancy and cross-functio ## Importing the Reentrancy Guard Library -In order to use the Reentrancy Guard library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). +In order to use the Reentrancy Guard library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../getting_started/index.md). To import the Reentrancy Guard Library to your Sway Smart Contract, add the following to your Sway file: diff --git a/docs/book/src/signed_integers/index.md b/docs/book/src/signed_integers/index.md index bf4d8256..a650f963 100644 --- a/docs/book/src/signed_integers/index.md +++ b/docs/book/src/signed_integers/index.md @@ -8,7 +8,7 @@ For implementation details on the Signed Integers Library please see the [Sway L ## Importing the Signed Integer Library -In order to use the Signed Integer Number Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../../../getting_started/index.md). +In order to use the Signed Integer Number Library, Sway Libs must be added to the `Forc.toml` file and then imported into your Sway project. To add Sway Libs as a dependency to the `Forc.toml` file in your project please see the [Getting Started](../getting_started/index.md). To import the Signed Integer Number Library to your Sway Smart Contract, add the following to your Sway file: diff --git a/docs/contributing-book/src/SUMMARY.md b/docs/contributing-book/src/SUMMARY.md index c17e70f4..06f88446 100644 --- a/docs/contributing-book/src/SUMMARY.md +++ b/docs/contributing-book/src/SUMMARY.md @@ -1,8 +1,8 @@ # Summary -- [Welcome](./welcome.md) +- [Welcome](./index.md) - [GitHub Issues](./issues/index.md) - - [Searching for Issues](./issues/search.md.md) + - [Searching for Issues](./issues/search.md) - [Filtering by label](./issues/filtering.md) - [Checking for available issues](./issues/assignment.md) - [Issue summary](./issues/summary.md) diff --git a/docs/contributing-book/src/documentation/index.md b/docs/contributing-book/src/documentation/index.md index 7c15fed0..d849c07c 100644 --- a/docs/contributing-book/src/documentation/index.md +++ b/docs/contributing-book/src/documentation/index.md @@ -8,7 +8,7 @@ In the following sections we will take a look at how to document the: - [Read me](read-me.md) - The first document a user will see which includes content such as installation instructions -- [Code](./code.md) +- [Code](../code_docs/index.md) - Documenting the code itself such that contributors know how to interact with it -- [Specification](specification.md) +- [Specification](../code_docs/specification.md) - Presenting technical (or non-technical) information about your project diff --git a/docs/contributing-book/src/issues/summary.md b/docs/contributing-book/src/issues/summary.md index 29d60a83..e80d1c06 100644 --- a/docs/contributing-book/src/issues/summary.md +++ b/docs/contributing-book/src/issues/summary.md @@ -2,7 +2,7 @@ You can see the activity of an issue by looking at the number of comments. This doesn't really tell you much aside from that there is a discussion about what should be done. -![Filtering issues by an app label image](../images/app-filter-comments.pngs) +![Filtering issues by an app label image](../images/app-filter-comments.png) Clicking on the issue near the bottom `Sum Merkle Proof Verification` we can see some information about the library with some information on what the library intends to implement and why it is needed. diff --git a/docs/contributing-book/src/library-quality/index.md b/docs/contributing-book/src/library-quality/index.md index 79c3cf7b..73cd8bdd 100644 --- a/docs/contributing-book/src/library-quality/index.md +++ b/docs/contributing-book/src/library-quality/index.md @@ -8,9 +8,9 @@ In the following sections we will take a look at: - The file structure and how easily a library may be navigated - [Code Structure](code-structure.md) - How to structure the code inside a file -- [Documentation](documentation/index.md) +- [Documentation](../documentation/index.md) - How to present information about your library -- [Testing](testing.md) +- [Testing](../testing/index.md) - The file structure and tips for testing If the library is well structured, tested and documented then the developer experience will be good. diff --git a/docs/contributing-book/src/testing/index.md b/docs/contributing-book/src/testing/index.md index d0fd43fb..5c535f5d 100644 --- a/docs/contributing-book/src/testing/index.md +++ b/docs/contributing-book/src/testing/index.md @@ -46,7 +46,7 @@ The `harness` file is the entry point for the tests, and thus it contains the `f Here are some tips on how to approach testing: -- Similar to [code structure](code-structure.md) content, each file should be ordered alphabetically, with one exception, so that it's easy to navigate +- Similar to [code structure](../library-quality/code-structure.md) content, each file should be ordered alphabetically, with one exception, so that it's easy to navigate - Test conditions in the order in which they may occur - If a test has multiple assertions then the first assertion should be tested first, second assertion second etc. - Check the code coverage From 4019dc236f71c46a845b5f58661b672f26ea9c8a Mon Sep 17 00:00:00 2001 From: bitzoic Date: Fri, 5 Apr 2024 11:06:53 +0900 Subject: [PATCH 18/18] Update typo --- docs/book/src/bytecode/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/book/src/bytecode/index.md b/docs/book/src/bytecode/index.md index 71ba7b99..c2444cb0 100644 --- a/docs/book/src/bytecode/index.md +++ b/docs/book/src/bytecode/index.md @@ -43,7 +43,7 @@ fn foo(not_mutable_bytecode: Vec) { .ptr() .copy_bytes_to(bytecode_slice.ptr(), not_mutable_bytecode.len()); let mut bytecode_vec = Vec::from(bytecode_slice); - // You may not used `bytecode_vec` in your computation and verification function calls + // You may now use `bytecode_vec` in your computation and verification function calls } ```