Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improvement: typos check in CI/CD #248

Merged
merged 4 commits into from
Oct 3, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
**Issue(s):** <!-- Close #issue-number -->
**Issue(s): Close #issue-number

### Description

@@ -8,5 +8,4 @@ Please provide a brief description of the changes made in this pull request and

- [ ] **CI Verifier:** Run `./scripts/cairo_programs_verifier.sh` successfully
- [ ] **Contract Tests:** Added tests to cover the changes
<!-- - [ ] **Remix Link:** Added a link to open the contract in Remix
- [ ] **Deployed Contract (Optional):** If possible, include a Voyager link to a deployed contract on Goerli -->
<!-- - [ ] **Deployed Contract (Optional):** If possible, include a Voyager link to a deployed contract on Goerli --> -->
5 changes: 1 addition & 4 deletions .github/workflows/mdbook.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
# Sample workflow for building and deploying a mdBook site to GitHub Pages
#
# To get started with mdBook see: https://rust-lang.github.io/mdBook/index.html
#
# https://rust-lang.github.io/mdBook/index.html
name: Deploy mdBook site to Pages

on:
6 changes: 6 additions & 0 deletions .github/workflows/verify_cairo_programs.yml
Original file line number Diff line number Diff line change
@@ -31,3 +31,9 @@ jobs:
run: |
chmod +x scripts/cairo_programs_verifier.sh
./scripts/cairo_programs_verifier.sh

typos:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: crate-ci/typos@master
7 changes: 7 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -55,6 +55,13 @@ To add a new chapter, create a new markdown file in the `src` directory. All the

Do not write directly Cairo program inside the markdown files. Instead, use code blocks that import the Cairo programs from the `listing` directory. These programs are bundled into scarb projects, which makes it easier to test and build all programs. See the next section for more details.

Be sure to check for typos with `typos`:

```shell
cargo install typos-cli
typos src/
```

## Adding a new Cairo program

You can add or modify examples in the `listings` directory. Each listing is a scarb project.
9 changes: 9 additions & 0 deletions _typos.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[default]
extend-ignore-identifiers-re = ["requestor", "REQUESTOR", "Requestor"]

[type.po]
extend-glob = ["*.po", "*.css", "*.js"]
check-file = false

[files]
extend-exclude = ["po/*.po", "listings/**/*.json"]
4 changes: 2 additions & 2 deletions listings/applications/advanced_factory/src/contract.cairo
Original file line number Diff line number Diff line change
@@ -42,7 +42,7 @@ pub mod CampaignFactory {
struct Storage {
#[substorage(v0)]
ownable: ownable_component::Storage,
/// Store all of the created campaign instances' addresses and thei class hashes
/// Store all of the created campaign instances' addresses and their class hashes
campaigns: Map<(ContractAddress, ContractAddress), ClassHash>,
/// Store the class hash of the contract to deploy
campaign_class_hash: ClassHash,
@@ -102,7 +102,7 @@ pub mod CampaignFactory {
) -> ContractAddress {
let creator = get_caller_address();

// Create contructor arguments
// Create constructor arguments
let mut constructor_calldata: Array::<felt252> = array![];
((creator, title, description, goal), start_time, end_time, token_address)
.serialize(ref constructor_calldata);
2 changes: 1 addition & 1 deletion listings/applications/advanced_factory/src/tests.cairo
Original file line number Diff line number Diff line change
@@ -97,7 +97,7 @@ fn test_create_campaign() {
}

#[test]
fn test_uprade_campaign_class_hash() {
fn test_upgrade_campaign_class_hash() {
let factory = deploy_factory();
let old_class_hash = factory.get_campaign_class_hash();
let new_class_hash = *declare("MockContract").unwrap().contract_class().class_hash;
2 changes: 1 addition & 1 deletion listings/applications/crowdfunding/src/campaign.cairo
Original file line number Diff line number Diff line change
@@ -149,7 +149,7 @@ pub mod Campaign {
pub const TRANSFER_FAILED: felt252 = 'Transfer failed';
pub const ZERO_ADDRESS_CALLER: felt252 = 'Caller address zero';
pub const ZERO_ADDRESS_PLEDGER: felt252 = 'Pledger address zero';
pub const ZERO_ADDRESS_TOKEN: felt252 = 'Token address zerp';
pub const ZERO_ADDRESS_TOKEN: felt252 = 'Token address zero';
pub const ZERO_DONATION: felt252 = 'Donation must be > 0';
pub const ZERO_GOAL: felt252 = 'Goal must be > 0';
pub const ZERO_PLEDGES: felt252 = 'No pledges to claim';
48 changes: 24 additions & 24 deletions listings/applications/erc20/src/token.cairo
Original file line number Diff line number Diff line change
@@ -233,7 +233,7 @@ mod tests {
const symbols: felt252 = 'mtk';

fn deploy() -> (IERC20Dispatcher, ContractAddress) {
let recipient: ContractAddress = contract_address_const::<'initialzed_recipient'>();
let recipient: ContractAddress = contract_address_const::<'initialized_recipient'>();

let (contract_address, _) = deploy_syscall(
erc20::TEST_CLASS_HASH.try_into().unwrap(),
@@ -262,7 +262,7 @@ mod tests {
}
#[test]
fn test_deploy_success() {
let recipient = contract_address_const::<'initialzed_recipient'>();
let recipient = contract_address_const::<'initialized_recipient'>();
let (_, contract_address) = deploy();
assert_eq!(
starknet::testing::pop_log(contract_address),
@@ -302,7 +302,7 @@ mod tests {

#[test]
fn test_balance_of_recipient_deployed() {
let recipient = contract_address_const::<'initialzed_recipient'>();
let recipient = contract_address_const::<'initialized_recipient'>();
let (dispatcher, _) = deploy();
assert(
dispatcher.balance_of(recipient) == initial_supply, 'incorrect balance of recipient'
@@ -340,7 +340,7 @@ mod tests {

#[test]
fn test_approval_success() {
let recipient = contract_address_const::<'initialzed_recipient'>();
let recipient = contract_address_const::<'initialized_recipient'>();
let spender = contract_address_const::<'spender'>();
let value = 100;
let (dispatcher, contract_address) = deploy();
@@ -376,7 +376,7 @@ mod tests {
#[test]
fn test_should_increase_allowance() {
let caller = contract_address_const::<'caller'>();
let recipient = contract_address_const::<'initialzed_recipient'>();
let recipient = contract_address_const::<'initialized_recipient'>();
let spender = contract_address_const::<'spender'>();
let amount = 100;
let (dispatcher, contract_address) = deploy();
@@ -423,7 +423,7 @@ mod tests {
#[test]
fn test_should_decrease_allowance() {
let caller = contract_address_const::<'caller'>();
let recipient = contract_address_const::<'initialzed_recipient'>();
let recipient = contract_address_const::<'initialized_recipient'>();
let spender = contract_address_const::<'spender'>();
let amount = 100;
let (dispatcher, contract_address) = deploy();
@@ -462,33 +462,33 @@ mod tests {
#[test]
#[should_panic(expected: ('ERC20: transfer from 0', 'ENTRYPOINT_FAILED'))]
fn test_transfer_when_sender_is_address_zero() {
let reciever = contract_address_const::<'spender'>();
let receiver = contract_address_const::<'spender'>();
let amount = 100;
let (dispatcher, _) = deploy();
dispatcher.transfer(reciever, amount);
dispatcher.transfer(receiver, amount);
}

#[test]
#[should_panic(expected: ('ERC20: transfer to 0', 'ENTRYPOINT_FAILED'))]
#[should_panic]
fn test_transfer_when_recipient_is_address_zero() {
let caller = contract_address_const::<'caller'>();
let reciever = Zero::zero();
let receiver = Zero::zero();
let amount = 100;
let (dispatcher, _) = deploy();
set_contract_address(caller);
dispatcher.transfer(reciever, amount);
dispatcher.transfer(receiver, amount);
}

#[test]
fn test_transfer_success() {
let caller = contract_address_const::<'initialzed_recipient'>();
let reciever = contract_address_const::<'receiver'>();
let caller = contract_address_const::<'initialized_recipient'>();
let receiver = contract_address_const::<'receiver'>();
let amount = 100;
let (dispatcher, contract_address) = deploy();
set_contract_address(caller);
dispatcher.transfer(reciever, amount);
assert_eq!(dispatcher.balance_of(reciever), amount);
dispatcher.transfer(receiver, amount);
assert_eq!(dispatcher.balance_of(receiver), amount);

// emits two transfer events
assert_eq!(
@@ -500,7 +500,7 @@ mod tests {

assert_eq!(
starknet::testing::pop_log(contract_address),
Option::Some(Event::Transfer(Transfer { from: caller, to: reciever, value: amount }))
Option::Some(Event::Transfer(Transfer { from: caller, to: receiver, value: amount }))
);
}

@@ -511,32 +511,32 @@ mod tests {
fn test_transferFrom_when_sender_is_address_zero() {
let sender = Zero::zero();
let amount = 100;
let reciever = contract_address_const::<'spender'>();
let receiver = contract_address_const::<'spender'>();
let (dispatcher, _) = deploy();
dispatcher.transfer_from(sender, reciever, amount);
dispatcher.transfer_from(sender, receiver, amount);
}

#[test]
#[should_panic(expected: ('ERC20: transfer to 0', 'ENTRYPOINT_FAILED'))]
#[should_panic]
fn test_transferFrom_when_recipient_is_address_zero() {
let caller = contract_address_const::<'caller'>();
let reciever = Zero::zero();
let receiver = Zero::zero();
let amount = 100;
let (dispatcher, _) = deploy();
set_contract_address(caller);
dispatcher.transfer_from(caller, reciever, amount);
dispatcher.transfer_from(caller, receiver, amount);
}

#[test]
fn test_transferFrom_success() {
let caller = contract_address_const::<'initialzed_recipient'>();
let reciever = contract_address_const::<'receiver'>();
let caller = contract_address_const::<'initialized_recipient'>();
let receiver = contract_address_const::<'receiver'>();
let amount = 100;
let (dispatcher, contract_address) = deploy();
set_contract_address(caller);
dispatcher.transfer_from(caller, reciever, amount);
assert_eq!(dispatcher.balance_of(reciever), amount);
dispatcher.transfer_from(caller, receiver, amount);
assert_eq!(dispatcher.balance_of(receiver), amount);

// emits two transfer events

@@ -549,7 +549,7 @@ mod tests {

assert_eq!(
starknet::testing::pop_log(contract_address),
Option::Some(Event::Transfer(Transfer { from: caller, to: reciever, value: amount }))
Option::Some(Event::Transfer(Transfer { from: caller, to: receiver, value: amount }))
);
}
}
2 changes: 1 addition & 1 deletion listings/applications/upgradeable_contract/src/tests.cairo
Original file line number Diff line number Diff line change
@@ -71,7 +71,7 @@ mod tests {
}

#[test]
fn test_succesful_upgrade_from_v0_to_v1() {
fn test_successful_upgrade_from_v0_to_v1() {
let (dispatcher_v0, contract_address, _) = deploy_v0();
let (_, _, class_hash) = deploy_v1();
dispatcher_v0.upgrade(class_hash);
2 changes: 1 addition & 1 deletion listings/getting-started/factory/src/simple_factory.cairo
Original file line number Diff line number Diff line change
@@ -39,7 +39,7 @@ pub mod CounterFactory {
impl Factory of super::ICounterFactory<ContractState> {
// ANCHOR: deploy
fn create_counter_at(ref self: ContractState, init_value: u128) -> ContractAddress {
// Contructor arguments
// Constructor arguments
let mut constructor_calldata: Array::<felt252> = array![init_value.into()];

// Contract deployment
2 changes: 1 addition & 1 deletion listings/getting-started/visibility/src/visibility.cairo
Original file line number Diff line number Diff line change
@@ -96,7 +96,7 @@ mod test {
assert_eq!(24, state.value.read());
assert_eq!(24, contract.get());

// We can also acces internal functions from the state
// We can also access internal functions from the state
assert_eq!(state._read_value(), state.value.read());
assert_eq!(state._read_value(), contract.get());
}
File renamed without changes.
2 changes: 1 addition & 1 deletion src/applications/crowdfunding.md
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@ Crowdfunding is a method of raising capital through the collective effort of man
6. After the campaign ends, the campaign creator can claim the funds if the campaign goal is reached.
7. Otherwise, campaign did not reach it's goal, pledgers can retrieve their funds.
8. The creator can at any point cancel the campaign for whatever reason and refund all of the pledgers.
9. The contract admin can upgrade the contract implementation, refunding all of the users and reseting the campaign state (we will use this in the [Advanced Factory chapter](./advanced_factory.md)).
9. The contract admin can upgrade the contract implementation, refunding all of the users and resetting the campaign state (we will use this in the [Advanced Factory chapter](./advanced_factory.md)).

Because contract upgrades need to be able to refund all of the pledges, we need to be able to iterate over all of the pledgers and their amounts. Since iteration is not supported by `Map`, we need to create a custom storage type that will encompass pledge management. We use a component for this purpose.

2 changes: 1 addition & 1 deletion src/getting-started/basics/syscalls.md
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@ At the protocol level, the Starknet Operating System (OS) is the program that ma

Some of the OS functionalities are exposed to smart contracts through the use of syscalls (system calls). Syscalls can be used to get information about the state of the Starknet network, to interact with/deploy contracts, emit events, send messages, and perform other low-level operations.

Syscalls return a `SyscallResult` which is either `Sucess` of `Failure`, allowing the contract to handle errors.
Syscalls return a `SyscallResult` which is either `Success` of `Failure`, allowing the contract to handle errors.

Here's the available syscalls:

2 changes: 1 addition & 1 deletion src/getting-started/cairo_cheatsheet/enums.md
Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@ Enums can be declared both inside and outside a contract. If declared outside, t

2. Enums as parameters and return values to entrypoints

- It is possible to pass `enums` to contract entrypoints as parameters, as well as return them from entrypoints. For that purpose, the enum needs to be serializable and dropable, hence the derivation of traits `Serde` and `Drop` in the above code snippet.
- It is possible to pass `enums` to contract entrypoints as parameters, as well as return them from entrypoints. For that purpose, the enum needs to be serializable and droppable, hence the derivation of traits `Serde` and `Drop` in the above code snippet.

Here is an example of a contract illustrating the above statements :

2 changes: 1 addition & 1 deletion src/getting-started/interacting/factory.md
Original file line number Diff line number Diff line change
@@ -6,7 +6,7 @@ In the case of smart contracts, we can use this pattern by defining a factory co

## Class hash and contract instance

In Starknet, there's a separation between contract's classes and instances. A contract class serves as a blueprint, defined by the underling Cairo bytecode, contract's entrypoints, ABI and Sierra program hash. The contract class is identified by a class hash. When you want to add a new class to the network, you first need to declare it.
In Starknet, there's a separation between contract's classes and instances. A contract class serves as a blueprint, defined by the underlying Cairo bytecode, contract's entrypoints, ABI and Sierra program hash. The contract class is identified by a class hash. When you want to add a new class to the network, you first need to declare it.

When deploying a contract, you need to specify the class hash of the contract you want to deploy. Each instance of a contract has their own storage regardless of the class hash.

2 changes: 1 addition & 1 deletion src/getting-started/interacting/how_to_deploy.md
Original file line number Diff line number Diff line change
@@ -65,7 +65,7 @@ Class hash declared:
```

Check the [Voyager Class Page](https://sepolia.voyager.online/class/0x05c8c21062a74e3c8f2015311d7431e820a08a6b0a9571422b607429112d2eb4).
Now, it's time to deploy the contract. Add the clash hash given above after `--watch`:
Now, it's time to deploy the contract. Add the class hash given above after `--watch`:

```console
$ starkli deploy \