-
Notifications
You must be signed in to change notification settings - Fork 3
Pull upstream changes #28
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
Merged
Merged
Changes from all commits
Commits
Show all changes
107 commits
Select commit
Hold shift + click to select a range
c3ff5aa
type_tag: include source string in parse error
bmwill 1368bca
sui-graphql-client: introduce initial implementation a sui GraphQL cl…
stefan-mysten 56f9983
graphql: update to latest graphql schema (#7)
stefan-mysten 91f2aa7
graphql: add a few tests (#8)
stefan-mysten e7c624a
coin: use Cow for coin_type
bmwill 24937c8
signature: add bytes and base64 to/from methods for UserSignature
bmwill 19defd5
types: introduce Intent types
bmwill e7277fe
types: introduce PersonalMessage
bmwill cf6a0d2
hash: add methods for getting the signing digest
bmwill 2314407
crypto: remove unused private key types
bmwill 8919b3c
sui-sdk-crypto: introduce crate to handle signing and verifying
bmwill 143e425
crypto: introduce secp256r1 support
bmwill 593229c
crypto: tweak dependencies and default features
bmwill bc23a3c
crypto: introduce secp256k1 support
bmwill 5fe9286
crypto: use wasm compatible k256 library for secp256k1 support
bmwill 70f6b86
crypto: introduce zklogin verifier support
bmwill e91e374
chore: rename sui-sdk to sui-sdk-types
bmwill c6679d1
chore: rename sui-sdk-crypto to sui-crypto
bmwill 59cd22d
sui-graphql-client: ignore test_object_query test
bmwill c77df1d
fix doc link in readme
bmwill 08e4901
prepare sui-sdk-types-0.0.1 and sui-crypto-0.0.1
bmwill 5b616d6
chore: update crates to latest versions (#19)
stefan-mysten 99abfff
sui-graphql-rpc: add balance function (#13)
stefan-mysten 536efc0
sui-graphql-client: add coins function (#12)
stefan-mysten 94d94fc
sui-graphql-client: introduce a faucet client (#11)
stefan-mysten f13e286
sui-graphql-client: use 0x0 as sender for event if none (#20)
stefan-mysten 3918631
sui-graphql-client: add method for querying total supply of a coin (#17)
stefan-mysten 0466c33
sui-graphql-client: add execute transaction query (#22)
stefan-mysten 622eb29
sui-graphql-client: ignore events test due to graphql server failures…
stefan-mysten 8c21ee2
sui-graphql-client: add active validators query function (#21)
stefan-mysten 29d771b
chore: format with imports_granularity=Item (#27)
bmwill d1ddd4a
sui-graphql-client: use Address as scalar for SuiAddress (#28)
stefan-mysten acab9c3
sui-crypto: introduce multisig verifier and aggregator (#25)
bmwill c2fc061
sui-graphql-client: impl_scalar for u64 and Uint53 (#29)
stefan-mysten 3cfa333
sui-graphql-client: add dry run query (#23)
stefan-mysten d3e28df
sui-graphql-client: avoid an extra RPC call by checking if first and …
stefan-mysten 58f537d
sui-graphql-client: fix transaction(s) query (#32)
stefan-mysten 6fbaa8a
type_tag: add StructTag parsing test case
bmwill 884e66f
types: improve format of UnresolvedTransaction
bmwill 011f48c
sui-graphql-client: update GraphQL schema and fix events to use the n…
stefan-mysten 02f0088
sui-graphql-client: add checkpoints query (#34)
stefan-mysten ddd70f9
sui-graphql-client: rework the Page type to support empty pages (#36)
stefan-mysten 9660c00
sui-graphql-client: add a pagination filter (#37)
stefan-mysten 3add028
passkey: update passkey challenge format
bmwill 3d70541
sui-graphql-client: simplify pagination filter usage (#39)
stefan-mysten 0ca4534
ci: separate tests that require network and run localnet in ci (#38)
stefan-mysten c642db8
sui-graphql-client: fix coin stream test (#42)
stefan-mysten fbaa407
sui-graphql-client: add dynamic fields query (#18)
stefan-mysten ec1101d
sui-graphql-client: fix return of bcs and typetag in DynamicFieldOutp…
stefan-mysten ab5583d
sui-graphql-client: return Result<Page> instead of Result<Option<Page…
stefan-mysten 7b7ff53
crypto: add blanket implementation for SuiSigner and SuiVerifier
bmwill 5dadea8
crypto: support der and pem format for pub/priv keys
bmwill 16cf4c3
crypto: introduce SimpleKeypair type
bmwill 4ebdf60
crypto: rexpect UserSignatureVerifier from top-level
bmwill 37b7ca3
crypto: collapse 'der' feature into 'pem'
bmwill bc763fc
sui-graphql-client: add some more doc comments (#50)
stefan-mysten 30b19e2
sui-graphql-client: add total transaction blocks query (#47)
stefan-mysten 08b7196
sui-graphql-client: change PaginationFilter to use a String vs &str (…
stefan-mysten 5d4129c
sui-graphql-client: add normalized move function and module queries (…
stefan-mysten 910cf62
sui-graphql-client: add suins queries (#48)
stefan-mysten 96a6762
sui-graphql-client: add generic stream impl (#51)
stefan-mysten bd57a3b
sui-graphql-client: add package queries (#33)
stefan-mysten 08d0569
sui-graphql-client: properly await pagination_filter query (#52)
stefan-mysten aa191e9
sui-graphql-client: make dynamic field queries using owner (#54)
stefan-mysten c1cadd8
sui-graphql-client: cleanup of Option<Page> and add tests back (#56)
stefan-mysten b2014de
ci: set toolchain to 1.81.0 for wasm builds
bmwill aa68191
sui-graphql-client: add a build crate to allow registering schema in …
stefan-mysten f54460d
sui-graphql-client: initialize service config and max page size lazil…
stefan-mysten 43693e5
sui-graphql-client: add transaction effects query (#55)
stefan-mysten 7c95d7e
sui-graphql-client: rework errors (#58)
stefan-mysten bc937e0
sui-sdk-types: rename types and add constructors for unresolved::Valu…
stefan-mysten f3eafe1
types: improve construction and accessing of inner fields
bmwill 0e8c4ad
types: fix schema names for unresolved types
bmwill cfec53d
Fix issue with serde renaming (#63)
stefan-mysten 9f88b5a
types: enable proptest::Arbitrary impls via the 'proptest' feature
bmwill 4a1aed0
types: fix Arbitrary impl for Identifier
bmwill 1a6b0ae
sui-sdk-types: address rust 1.82 clippy lints (#65)
stefan-mysten c6cbb51
sui-transaction-builder: introduce a crate for building transaction (…
stefan-mysten 4d1c2e3
types: add accessors and constructor for PasskeyAuthenticator
bmwill 61b4dd5
sui-graphql-client: make pagination consistent across queries (#66)
stefan-mysten e1e7ad8
roaring: pin to 0.10.6 to work around no-std breakage
bmwill dd6d262
sui-graphql-client: return a tuple of Event, TxDigest when querying e…
stefan-mysten 87492b3
Update GraphQL schema to v1.39.0
stefan-mysten 96823e9
Use Sui CLI from version 1.39.1 that matches the GraphQL schema
stefan-mysten f40dc53
sui-graphql-client: use `bcs` from `Checkpoint` instead of manual con…
stefan-mysten 7bb8d1f
sui-graphql-client: use typed digests for queries (#59)
stefan-mysten a12f7b1
ci: update to sui v1.39.3 and use --ignore-chain in sui move build (#75)
stefan-mysten 9279183
sui-graphql-client: update docs for using custom queries (#76)
stefan-mysten 52d18aa
feat(sui-sdk-types): add From<StructTag> for TypeTag (#77)
unmaykr-aftermath c83ab6f
roaring: update to v0.10.9 (#79)
bmwill 6381c5e
sui-graphql-client: use rustls instead of openssl for reqwest (#80)
stefan-mysten f2a4f42
sui-graphql-client: add retry to getting coins from faucet to fix fla…
stefan-mysten f5a37b1
sui-crypto: add support for verifying passkey authenticators (#81)
bmwill bdc31ca
types: move unresolved types to sui-transaction-builder
bmwill da97d3c
types: fold EffectsObjectChange into ChangedObject struct
bmwill 638a85a
sui-sdk-types: flatten the types module
bmwill ca68846
chore: update proptest to 1.6.0 (#85)
bmwill 6cff065
sui-transaction-builder: enable base64ct feature 'std'
bmwill ed0f4ef
chore: add help target to Makefile to display the usage of all target…
caseylove 640a408
release sui-sdk-types-0.0.2 and sui-crypto-0.0.2
bmwill 95918e9
chore: Apply renames and clean upstream changes
DaughterOfMars f3f0adc
chore: Fix build issues
DaughterOfMars 8507c95
chore: Rename branches and URLs
DaughterOfMars 8231368
chore: Update CI rust version
DaughterOfMars 9a64813
chore: Fix errors and add fixtures
DaughterOfMars b73bfbc
chore: Fix typos
DaughterOfMars 94f7402
chore: Add missing license header
DaughterOfMars File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2,7 +2,7 @@ name: rustdoc | |
|
|
||
| on: | ||
| push: | ||
| branches: [main] | ||
| branches: [develop] | ||
| workflow_dispatch: | ||
|
|
||
| env: | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,46 +1,64 @@ | ||
| # Set the default target of this Makefile | ||
| .PHONY: all | ||
| all:: ci | ||
| all:: ci ## Default target, runs the CI process | ||
|
|
||
| .PHONY: check-features | ||
| check-features: | ||
| $(MAKE) -C crates/iota-rust-sdk check-features | ||
| check-features: ## Check feature flags for crates | ||
| $(MAKE) -C crates/iota-sdk-types check-features | ||
| $(MAKE) -C crates/iota-crypto check-features | ||
|
|
||
| .PHONY: check-fmt | ||
| check-fmt: | ||
| cargo fmt -- --check | ||
| check-fmt: ## Check code formatting | ||
| cargo +nightly fmt -- --check | ||
|
|
||
| .PHONY: fmt | ||
| fmt: ## Format code | ||
| cargo +nightly fmt | ||
|
|
||
| .PHONY: clippy | ||
| clippy: | ||
| clippy: ## Run Clippy linter | ||
| cargo clippy --all-features --all-targets | ||
|
|
||
| .PHONY: test | ||
| test: | ||
| cargo nextest run --all-features | ||
| test: ## Run unit tests | ||
| cargo nextest run --all-features -p iota-sdk-types -p iota-crypto | ||
| cargo test --doc | ||
|
|
||
| package_%.json: crates/iota-transaction-builder/tests/%/Move.toml crates/iota-transaction-builder/tests/%/sources/*.move ## Generate JSON files for tests | ||
| cd crates/iota-transaction-builder/tests/$(*F) && iota move build --ignore-chain --dump-bytecode-as-base64 > ../../$@ | ||
|
|
||
| .PHONY: test-with-localnet | ||
| test-with-localnet: package_test_example_v1.json package_test_example_v2.json ## Run tests with localnet | ||
| cargo nextest run -p iota-graphql-client -p iota-transaction-builder | ||
|
|
||
| .PHONY: wasm | ||
| wasm: | ||
| $(MAKE) -C crates/iota-rust-sdk wasm | ||
| wasm: ## Build WASM modules | ||
| $(MAKE) -C crates/iota-sdk-types wasm | ||
| $(MAKE) -C crates/iota-crypto wasm | ||
|
|
||
| .PHONY: doc | ||
| doc: | ||
| doc: ## Generate documentation | ||
| RUSTDOCFLAGS="--cfg=doc_cfg -Zunstable-options --generate-link-to-definition" RUSTC_BOOTSTRAP=1 cargo doc --all-features --no-deps | ||
|
|
||
| .PHONY: doc-open | ||
| doc-open: | ||
| doc-open: ## Generate and open documentation | ||
| RUSTDOCFLAGS="--cfg=doc_cfg -Zunstable-options --generate-link-to-definition" RUSTC_BOOTSTRAP=1 cargo doc --all-features --no-deps --open | ||
|
|
||
| .PHONY: ci | ||
| ci: check-features check-fmt test wasm | ||
| ci: check-features check-fmt test wasm ## Run the full CI process | ||
|
|
||
| .PHONY: ci-full | ||
| ci-full: ci doc | ||
| ci-full: ci doc ## Run the full CI process and generate documentation | ||
|
|
||
| .PHONY: clean | ||
| clean: | ||
| clean: ## Clean build artifacts | ||
| cargo clean | ||
|
|
||
| .PHONY: clean-all | ||
| clean-all: clean | ||
| git clean -dX | ||
| clean-all: clean ## Clean all generated files, including those ignored by Git. Force removal. | ||
| git clean -dXf | ||
|
|
||
| .PHONY: help | ||
| help: ## Show this help | ||
| @echo "Available targets:" | ||
| @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,39 @@ | ||
| # IOTA Sdk | ||
|
|
||
| [](https://github.com/iotaledger/iota-rust-sdk/iota_sdk/) | ||
| A Rust SDK for integrating with the [IOTA blockchain](https://docs.iota.org/). | ||
|
|
||
| A WIP from-scratch rust sdk for the IOTA blockchain | ||
| > [!NOTE] | ||
| > This is project is under development and many features may still be under | ||
| > development or missing. | ||
|
|
||
| ## Overview | ||
|
|
||
| This repository contains a collection of libraries for integrating with the IOTA blockchain. | ||
|
|
||
| A few of the project's high-level goals are as follows: | ||
|
|
||
| - **Be modular** - user's should only need to pay the cost (in terms of dependencies/compilation time) for the features that they use. | ||
| - **Be light** - strive to have a minimal dependency footprint. | ||
| - **Support developers** - provide all needed types, abstractions and APIs to enable developers to build robust applications on IOTA. | ||
| - **Support wasm** - where possible, libraries should be usable in wasm environments. | ||
|
|
||
| ## Crates | ||
|
|
||
| In an effort to be modular, functionality is split between a number of crates. | ||
|
|
||
| - [`iota-sdk-types`](crates/iota-sdk-types) | ||
| [](https://crates.io/crates/iota-sdk-types) | ||
| [](https://docs.rs/iota-sdk-types) | ||
| [](https://github.com/iotaledger/iota-rust-sdk/iota_sdk_types/) | ||
| - [`iota-crypto`](crates/iota-crypto) | ||
| [](https://crates.io/crates/iota-crypto) | ||
| [](https://docs.rs/iota-crypto) | ||
| [](https://github.com/iotaledger/iota-rust-sdk/iota_crypto/) | ||
| - [`iota-graphql-client`](crates/iota-crypto) | ||
| [](https://crates.io/crates/iota-graphql-client) | ||
| [](https://docs.rs/iota-graphql-client) | ||
| [](https://github.com/iotaledger/iota-rust-sdk/iota-graphql-client/) | ||
|
|
||
| ## License | ||
|
|
||
| This project is available under the terms of the [Apache 2.0 license](LICENSE). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,106 @@ | ||
| [package] | ||
| name = "iota-crypto" | ||
| version = "0.0.0" | ||
| authors = ["IOTA Foundation <[email protected]>"] | ||
| edition = "2021" | ||
| license = "Apache-2.0" | ||
| readme = "README.md" | ||
| repository = "https://github.com/iotaledger/iota-rust-sdk/" | ||
| description = "Defines the interface for signing and verifying messages in the IOTA ecosystem" | ||
|
|
||
| [package.metadata.docs.rs] | ||
| # To build locally: | ||
| # RUSTDOCFLAGS="--cfg=doc_cfg -Zunstable-options --generate-link-to-definition" RUSTC_BOOTSTRAP=1 cargo doc --all-features --no-deps --open | ||
| all-features = true | ||
| rustdoc-args = [ | ||
| # Enable doc_cfg showing the required features. | ||
| "--cfg=doc_cfg", | ||
|
|
||
| # Generate links to definition in rustdoc source code pages | ||
| # https://github.com/rust-lang/rust/pull/84176 | ||
| "-Zunstable-options", | ||
| "--generate-link-to-definition", | ||
| ] | ||
|
|
||
| [features] | ||
| default = [] | ||
| ed25519 = ["dep:ed25519-dalek", "dep:rand_core"] | ||
| secp256r1 = ["dep:p256", "dep:rand_core"] | ||
| passkey = ["secp256r1", "dep:sha2"] | ||
| secp256k1 = ["dep:k256", "dep:rand_core", "signature/std"] | ||
| zklogin = [ | ||
| "dep:ark-bn254", | ||
| "dep:ark-ff", | ||
| "dep:ark-groth16", | ||
| "dep:ark-snark", | ||
| "dep:ark-std", | ||
| "dep:base64ct", | ||
| "dep:bnum", | ||
| "dep:itertools", | ||
| "dep:serde", | ||
| "dep:serde_derive", | ||
| "dep:serde_json", | ||
| "signature/std", | ||
| ] | ||
| pem = [ | ||
| "dep:pkcs8", | ||
| "dep:pem-rfc7468", | ||
| "ed25519-dalek?/pkcs8", | ||
| "p256?/pkcs8", | ||
| "k256?/pkcs8", | ||
| "ed25519-dalek?/pem", | ||
| "p256?/pem", | ||
| "k256?/pem", | ||
| ] | ||
|
|
||
| [dependencies] | ||
| iota-sdk-types = { version = "0.0.0", path = "../iota-sdk-types", default-features = false, features = ["hash", "serde"] } | ||
| signature = "2.2" | ||
|
|
||
| # RNG support | ||
| rand_core = { version = "0.6.4", optional = true } | ||
|
|
||
| # ed25519 support | ||
| ed25519-dalek = { version = "2.1.1", optional = true } | ||
|
|
||
| # secp256r1 support | ||
| p256 = { version = "0.13.2", default-features = false, features = ["ecdsa", "std"], optional = true } | ||
|
|
||
| # passkey verification support | ||
| sha2 = { version = "0.10.8", optional = true } | ||
|
|
||
| # secp256k1 support | ||
| k256 = { version = "0.13.4", default-features = false, features = ["ecdsa"], optional = true } | ||
|
|
||
| # zklogin verification support | ||
| ark-bn254 = { version = "0.4.0", optional = true } | ||
| ark-ff = { version = "0.4.2", features = ["asm"], optional = true } | ||
| ark-groth16 = { version = "0.4.0", default-features = false, optional = true } | ||
| ark-snark = { version = "0.4.0", optional = true } | ||
| ark-std = { version = "0.4.0", optional = true } | ||
| base64ct = { version = "1.6.0", features = ["alloc"], optional = true } | ||
| bnum = { version = "0.12.0", optional = true } | ||
| itertools = { version = "0.13.0", optional = true } | ||
| serde = { version = "1.0.210", optional = true } | ||
| serde_derive = { version = "1.0.210", optional = true } | ||
| serde_json = { version = "1.0.128", optional = true } | ||
|
|
||
| # pkcs8 der and pem support | ||
| pem-rfc7468 = { version = "0.7", optional = true, features = ["std"] } | ||
| pkcs8 = { version = "0.10", optional = true, features = ["std"] } | ||
|
|
||
| [dev-dependencies] | ||
| bcs = { version = "0.1.6" } | ||
| hex = "0.4.3" | ||
| serde_json = { version = "1.0.128" } | ||
|
|
||
| # proptest support in tests | ||
| proptest = { version = "1.6.0", default-features = false, features = ["std"] } | ||
| test-strategy = "0.4.0" | ||
|
|
||
| [target.wasm32-unknown-unknown.dev-dependencies] | ||
| wasm-bindgen-test = "0.3" | ||
| getrandom = { version = "0.2", features = ["js"] } | ||
|
|
||
| [lints.rust] | ||
| unexpected_cfgs = { level = "warn", check-cfg = ['cfg(doc_cfg)'] } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| # Set the default target of this Makefile | ||
| .PHONY: all | ||
| all:: check-features clippy test wasm | ||
|
|
||
| .PHONY: check-features | ||
| check-features: | ||
| cargo hack check --feature-powerset --no-dev-deps | ||
|
|
||
| .PHONY: clippy | ||
| clippy: | ||
| cargo clippy --all-features --all-targets | ||
|
|
||
| .PHONY: test | ||
| test: | ||
| cargo nextest run --all-features | ||
| cargo test --doc | ||
|
|
||
| .PHONY: wasm | ||
| wasm: | ||
| CC=clang wasm-pack test -r --node --all-features | ||
|
|
||
| %: | ||
| $(MAKE) -C ../.. $@ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| # iota-crypto | ||
|
|
||
| [](https://crates.io/crates/iota-crypto) | ||
| [](https://docs.rs/iota-crypto) | ||
| [](https://github.com/iotaledger/iota-rust-sdk/iota_crypto/) | ||
|
|
||
| The `iota-crypto` crate provides the interface for signing and verifying | ||
| transactions and messages in the IOTA ecosystem. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| // Copyright (c) Mysten Labs, Inc. | ||
| // Modifications Copyright (c) 2025 IOTA Stiftung | ||
| // SPDX-License-Identifier: Apache-2.0 | ||
|
|
||
| #[derive(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)] | ||
| pub struct Bls12381PrivateKey([u8; Self::LENGTH]); | ||
|
|
||
| impl Bls12381PrivateKey { | ||
| /// The length of an bls12381 private key in bytes. | ||
| pub const LENGTH: usize = 32; | ||
| } |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.