-
Notifications
You must be signed in to change notification settings - Fork 527
AVM: Add support for Boxes #4149
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
227 commits
Select commit
Hold shift + click to select a range
37dbc22
README.md as committed to in the last retro + just for temporary fun:…
d583864
wrong box name
269cdfb
Update cmd/goal/README.md
tzaffi 82bf313
add the TEAL code for app as well
a167359
Merge branch 'readme-examples-for-goal' of github.com:tzaffi/go-algor…
fe0f0c9
per CR suggestion - explain the expectations around go-algorand insta…
7824071
Update cmd/goal/examples/boxes.teal
tzaffi 3472e15
clear program as well
28abc2b
Merge branch 'readme-examples-for-goal' of github.com:tzaffi/go-algor…
d61627b
Update cmd/goal/examples/justfile
tzaffi 02a82ec
Update cmd/goal/examples/justfile
tzaffi 40e29af
Update cmd/goal/examples/justfile
tzaffi 48994e3
AVM: Add an unlimited global storage mechanism - Boxes. (#4001)
jannotti 6635ffb
remove justfile
7866008
Merge remote-tracking branch 'algorand/feature/avm-box' into readme-e…
270d495
flesh out the readme with more examples and clearer instructions
f84af7e
Merge master to f/avm-box (#4138)
jannotti 5d43a4a
Merge remote-tracking branch 'algorand/feature/avm-box' into readme-e…
b4e7edb
remove not my stuffs
ahangsu 10e29e1
Merge pull request #4095 from tzaffi/readme-examples-for-goal
tzaffi d841a9a
per pr review, start e2e test in restClient test
ahangsu 4077642
update e2e testcase
ahangsu 073a71b
update handler to follow convension
ahangsu d2c7c46
Readme fix (#4141)
tzaffi bdae462
rewrite boxes param description per pr comment
ahangsu 91a14fc
update e2e test
ahangsu 1b451c9
per review comment
ahangsu 4bedff5
use sql string
ahangsu 4c377d8
better set of e2e test
ahangsu 62f83e7
Choose a better key format, cache app account hashes (#4140)
jannotti 715151c
Merge pull request #4122 from ahangsu/box-names-by-appid
ahangsu 2ac8955
update testing frame
ahangsu 8b5b70a
wild card percentage sign in sql, how can we escape that?
ahangsu bce44ca
new sql query checks start of a key matches exactly prefix passin in
ahangsu b9e87bc
code change to add to kvstore
ahangsu 1451cbf
update unit test for lookupKeysByPrefix
ahangsu 666318d
update benchmark on db
ahangsu 15bfa1c
moar code cov
ahangsu 02a3978
Change box search API query and move parsing functions from cmd/ to l…
algochoi 8250c4e
linter
algochoi c81f9bc
minor
ahangsu 1504f23
Change encoding order
algochoi 220270e
Merge remote-tracking branch 'upstream/ahangsu/box-names-by-app-id' i…
algochoi bfe1061
Finish merging test changes
algochoi ae6606c
WIP Testing API for boxes
algochoi 017a9b0
Add an integration test for box name searching
algochoi b0ecff9
Add more tests on box reads
algochoi 66962a2
Revert back test parameters
algochoi 1b37afb
per pr comments
ahangsu 9cf837c
Move tests, regenerate APIs, and remove path parsing
algochoi 3b498f8
Merge branch 'ahangsu/box-names-by-app-id' into algochoi/box-search-api
algochoi 3ce52f3
Add parsing tests
algochoi d27c28a
Fix routes
algochoi 6adda8e
Change API description and revise tests to add spaces
algochoi 1b35697
testcase keep adding
ahangsu edd0509
Merge branch 'master' into feature/avm-box
jannotti e125be3
refactoring acctupdate test
ahangsu 3f09fda
rm 404 response
ahangsu 4975318
Merge pull request #4202 from jannotti/feature/avm-box
jannotti 93e7ad6
Merge branch 'ahangsu/box-names-by-app-id' into algochoi/box-search-api
algochoi a957b50
minor, explaining test
ahangsu 43435b7
per comments
ahangsu 2e82799
Merge branch 'ahangsu/box-names-by-app-id' into algochoi/box-search-api
algochoi a155358
Regenerate routes
algochoi f59d3ac
Merge pull request #4183 from algochoi/algochoi/box-search-api
ahangsu 176d3ea
minor, per pr comment
ahangsu f394799
Merge pull request #4154 from algorand/ahangsu/box-names-by-app-id
jannotti dd82278
basic box read db perf test
algoidurovic 55c114a
improve test and add sub benchmark to gauge sqlite caching performanc…
algoidurovic 6707b91
test
algoidurovic 57c7058
box_len, box_put, and box_get to streamline simple uses (#4212)
jannotti 34312c8
BoxesResponse: Fold names into top-level object (#4249)
michaeldiamant 3d4e105
benchmark across different dimensions: boxSize, boxCount, and lookback
algoidurovic d601bb1
Merge remote-tracking branch 'upstream/master' into feature/avm-box
jannotti c67a28e
Merge pull request #4255 from jannotti/feature/avm-box
jannotti 68c66cb
improve cache performance
algoidurovic e64f659
comments
algoidurovic 4da767e
Allow algod client to pass in max box-names number (#4268)
ahangsu 1b7d7ea
Goal box search (#4165)
jdtzmn ffe1585
implement box cache and corresponding unit tests
algoidurovic bcbdb1a
resolve merge conflicts
algoidurovic fcfd075
resolve todos
algoidurovic abaf6ca
remove todo
algoidurovic 4a3faa6
kvstore table migration during consensus upgrade (#4229)
ahangsu e15b6da
fill in missing pieces of cache implementation
algoidurovic 3bbee10
exercise box cache and enforce invariants through acctupdates test
algoidurovic f9f50b0
typo
algoidurovic 6d7aca5
update old test
algoidurovic f40283e
rename threshold variable and reduce cache size
algoidurovic 4fb59f5
unsaved changes
algoidurovic 4ccc653
More details on spec (and unifiy the box opcodes a bit) (#4323)
jannotti 0bd505d
Companion PR for for indexer's `tzaffi/box-ingest` (#4182)
tzaffi 2473026
Merge branch 'master' into feature/avm-box
jannotti 602cc66
Version fixes
jannotti a382f46
config value fixup
jannotti 969e800
Fix test to consider AcctLookback instead of BalLookback
jannotti 4618948
Merge pull request #4345 from jannotti/feature/avm-box
jannotti 25946b4
rename boxes to KV
algoidurovic 3bc5cac
Remove “contact us” from box name mismatch error (#4372)
jdtzmn 856b59c
rename updatedBoxes
algoidurovic abb668d
Adding a goal boxes test case: txn group
c37ee44
Update test/scripts/e2e_subs/box-search.sh
tzaffi d726005
Update test/scripts/e2e_subs/box-search.sh
tzaffi 18142ad
Update test/scripts/e2e_subs/box-search.sh
tzaffi 491fc35
Explanatory headings
ce8f8d9
update py-algorand-sdk dependency in E2E tests to latest 1.16.0
f274100
Merge branch 'test-box-group-txn' of https://github.com/algorand/go-a…
88c93c6
per CR suggestion to drop 2nd --box in group txn + KISS with box value
313b870
Merge pull request #4409 from algorand/test-box-group-txn
tzaffi 4688f93
Merge branch 'master' into feature/avm-box
jannotti cb9d8e2
reduce BytesPerBoxReference to limit memory consumption (#4413)
algoidurovic 66f8e1c
Merge pull request #4417 from jannotti/feature/avm-box
jannotti fda8d5f
Merge branch 'feature/avm-box' of https://github.com/algorand/go-algo…
algoidurovic fb0cb6c
fix compile error
algoidurovic 6458d41
rename and minor refactor for error handling
algoidurovic 2b3a0ae
fix compile error
algoidurovic 24ff56e
explicit nil error
algoidurovic 31037ed
Merge pull request #4275 from algoidurovic/box_cache
algoidurovic f32a943
Merge branch 'master' into feature/avm-box
jannotti 2301ec9
Adjust for consensus version change
jannotti d04e00f
Merge pull request #4505 from jannotti/feature/avm-box
jannotti fb9d5f6
add pingpong cli arg for number of boxes per app
algoidurovic 797d852
improve min balance calculation
algoidurovic 35accdc
improve mbr calculation
algoidurovic 2f360f6
Exposes more of AccountData to AVM (#4491)
jannotti 329a60e
Refactor MaxBoxSize configuration definition (#4542)
michaeldiamant 2226ddb
Bump MaxAPIBoxPerApplication to 100,000 (#4541)
michaeldiamant bab6d99
Add kvstore to catchpoints (#4455)
jannotti a72316f
Merge branch 'master' into feature/avm-box
michaeldiamant 7f7d2f2
rate control for funding txs
algoidurovic d8cc213
Fix regeneration of daemon/algod/api/server/v2/generated/routes.go
michaeldiamant 4e95f8e
Merge branch 'master' into feature/avm-box (#4544)
michaeldiamant 20367f9
Merge branch 'feature/avm-box' of github.com:algorand/go-algorand int…
michaeldiamant 64c313f
Refactor to linearize ledger lookup in GetApplicationBoxes (#4543)
michaeldiamant b40ca47
Panic instead of implementing untouched mock
c462a41
Merge pull request #4560 from tzaffi/un-implement-mock-LookupKeysByPr…
ahangsu c3e9dea
Various improvements from my review
jasonpaulos 3da61a7
Remove base64 statement
jasonpaulos 5724864
msgp generate
jasonpaulos 50b10b2
Add back box info long desc
jasonpaulos f3e4aeb
Revert goal box info changes
jasonpaulos 5dd578b
Respond to feedback
jasonpaulos f26f915
Merge pull request #4562 from jasonpaulos/box-review-changes
jasonpaulos f5844c8
reduce cache size (#4311)
algoidurovic ce949d7
Miscellaney (#4576)
tzaffi 1c60563
Box codereview (#4586)
jannotti 8b7b3e9
use b.N
ahangsu 053f6ff
Merge pull request #4591 from algorand/ahangsu/better-benchmark-display
ahangsu 8f0a194
use kvstore.key comparison to trigger SEARCH rather than SCAN
ahangsu 61c7a03
Rework TestCatchpointAfterTxns to assert balance (#4596)
michaeldiamant 18b6984
take care of the corner case, and a new query statement
ahangsu fc103e1
Revert code change by go 1.19 fmt
ahangsu 082de0c
Merge branch 'master' into feature/avm-box
michaeldiamant 4f72e7c
Merge pull request #4598 from michaeldiamant/feature/avm-box
michaeldiamant c1c4858
minor test case for prefix interval preprocessing
ahangsu 1df8841
annoying fmting change
ahangsu 23217df
good find by Zeph on lexicographical order interval
ahangsu e939fcd
Small addition to `box_create` docs & implement `TestBoxReadBudget` (…
jasonpaulos 2cc0a01
minor improved testcase
ahangsu 2b30646
new test case
ahangsu a0905d3
Merge pull request #4597 from algorand/ahangsu/db-query-speed-flattening
ahangsu 6691ecc
resolve merge conflicts
algoidurovic 1f5b969
change error message to include more information
algoidurovic bcf66d9
undo error message change because test depends on specific output
algoidurovic e5742a3
Partition tests to spread load in CI (#4604)
michaeldiamant 0cc5def
Update ledger/accountdb_test.go
michaeldiamant 22d110a
tmp
algoidurovic 9da87db
tmp
algoidurovic 12cee71
tmp
algoidurovic 36017ea
add new box workload
algoidurovic 772e129
Merge remote-tracking branch 'upstream/master' into feature/avm-box
jannotti 3981d20
Merge pull request #4624 from jannotti/feature/avm-box
jannotti 3bc947e
Merge branch 'feature/avm-box' of https://github.com/algorand/go-algo…
algoidurovic 77a19ad
bug fix
algoidurovic 5a97c4f
add comments and README
algoidurovic c47bcf7
Update cmd/pingpong/README.md
algoidurovic e80585f
Update cmd/pingpong/README.md
algoidurovic a4f2146
move box ref array construction
algoidurovic 75072ee
Merge branch 'box_pingpong' of github.com:algoidurovic/go-algorand in…
algoidurovic 49b4ff8
update doc
algoidurovic 129c021
keep readme content in scope
algoidurovic f4afb4a
Merge pull request #4511 from algoidurovic/box_pingpong
algoidurovic 7c3dda4
Update data/transactions/json_test.go
michaeldiamant b780773
Fix source code reference in inline comment (#4647)
michaeldiamant 85528b8
Persistent box account data
jasonpaulos 1cdf8c0
Merge pull request #4654 from jasonpaulos/persistent-box-account-data
jannotti 50cd6d7
New rule: write budget enforced continually
jannotti df6e6d6
Add tests for ClearStateOC
michaeldiamant ec51370
Add acct field tests, and improve field tests to check type
jannotti 3d6c6bf
Track write budget in a simpler way - no more size tracking
jannotti 727967f
Update available text for CSPs, per @algoidurovic
jannotti a835098
And some inner tests for boxes on the real ledger
jannotti 4ede8b3
Simplify NewBox interface method
jannotti 8e15fc7
Add some del/get/put in ledger tests
jannotti b348f4e
Track write budget in box_put more clearly
jannotti db3b244
Separate argchecking and dirty checking
jannotti 8c16cd3
test equal to budget
jannotti 461f340
Removed the DelBoxes that were there b/c of a previous testing flaw
jannotti a67dd03
Extend box tests
michaeldiamant 9af97db
Fix reviewdog errors
michaeldiamant e691a98
More tests
jannotti 2b7c3b8
Merge pull request #4622 from jannotti/box-write-bounds
jannotti 0157afe
Refactor TestApplicationBoxesMaxKeys to reduce test length
michaeldiamant 0f8b3e0
Merge pull request #4657 from michaeldiamant/TestApplicationBoxesMaxK…
jannotti 452e220
extra test cases
cce 5efe942
Pavel comments
jannotti f7dfc9d
Merge pull request #4660 from jannotti/box-codereview
jannotti 9c1ed98
Off by one.
jannotti 164e92f
Unify comments about walking the deltas
jannotti ef4c678
Merge pull request #4665 from jannotti/boxes-obo
jannotti b519b92
Fabrice's feedback
jannotti 0dd2c0c
Merge pull request #4675 from jannotti/box-foundation-feedback
jannotti 45b7d60
Three code review suggestions (#4681)
jannotti f26f38a
Merge branch 'master' into feature/avm-box
michaeldiamant 6468e4b
Fix merge from master
michaeldiamant 060b22b
Merge pull request #4687 from michaeldiamant/feature/avm-box
algorandskiy 35765a6
Box bytes (#4686)
jannotti d56af81
Rename isFull to supportsAppEval (#4692)
michaeldiamant 15890d4
Add test coverage for app local/global put errors (#4693)
michaeldiamant 74e85e8
Add sanity check tests for AppCallBytes (#4691)
michaeldiamant 6eee507
Require GetApplicationBoxes to return all Box names (#4689)
michaeldiamant 354cfcd
Merge remote-tracking branch 'upstream/master' into feature/avm-box
jannotti 5774356
Linters
jannotti 260e226
Merge pull request #4701 from jannotti/feature/avm-box
jannotti f9fbae2
telemetry: add CatchpointRootUpdateEvent (#4704)
cce b396eeb
code review
jannotti 238906c
Merge pull request #4709 from jannotti/box-specs-review
jannotti 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
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
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,147 @@ | ||
| # Example `goal` Snippets | ||
|
|
||
| Unless otherwise noted, it is assumed that the working directory | ||
| begins at the top level of the `go-algorand` repo. | ||
|
|
||
| It is also assumed that the main README's installation instructions have been followed and `make install` run so that the `goal` executable has been rebuilt from the same source as this example and is available in the shell environment. | ||
| You can run `ls -l $(which goal)` after your `make install` and look at the installation time as a sanity check. | ||
|
|
||
| Finally, all the `goal` commands assume that `${ALGORAND_DATA}` has been set. See the first Q/A for how this is done. | ||
|
|
||
| ## Starting a Single Node Dev Network | ||
|
|
||
| ### Q: Having just completed a new build in go-algorand, how do I get a single node dev network up, with algos in an easily accessible wallet from goal? | ||
|
|
||
| ### A: | ||
|
|
||
| ```sh | ||
| # set this to where you want to keep the network files (and data dirs will go beneath) | ||
| NETWORKS=~/networks | ||
|
|
||
| # create a networks directory if you don't already have it | ||
| mkdir -p ${NETWORKS} | ||
|
|
||
| # set this to "name" your network | ||
| NAME=niftynetwork | ||
|
|
||
| # assuming here that are currently working out of the root directory of the go-algorand repo | ||
| goal network create -n ${NAME} -r ${NETWORKS}/${NAME} -t ./test/testdata/nettemplates/OneNodeFuture.json | ||
|
|
||
| # after the next command and for the rest of the README, we assume that `${ALGORAND_DATA}` is set | ||
| export ALGORAND_DATA=${NETWORKS}/${NAME}/Primary | ||
| echo $ALGORAND_DATA | ||
|
|
||
| # start the network | ||
| goal node start | ||
|
|
||
| # see if it worked (run a few times, note block increasing) | ||
| goal node status | ||
| sleep 4 # assuming you're copy/pasting this entire block | ||
| goal node status | ||
| sleep 4 | ||
| goal node status | ||
|
|
||
| # find the account with all the money | ||
| goal account list | ||
|
|
||
| # put it in a variable | ||
| ACCOUNT=`goal account list | awk '{print $2}'` | ||
| echo $ACCOUNT | ||
|
|
||
| # send some money from the account to itself | ||
| goal clerk send --to ${ACCOUNT} --from ${ACCOUNT} --amount 10 | ||
| ``` | ||
|
|
||
| ## Creating Applications | ||
|
|
||
| ### Q: How do I use goal to create an app? | ||
|
|
||
| ### A: | ||
| Here's an example with the following assumptions: | ||
| * all the setup is as in the first question | ||
| * the approval program (which tests box functionality) has relative path `cmd/goal/examples/boxes.teal` | ||
| * the clear program has relative path `cmd/goal/examples/clear.teal` | ||
| * there are no local or global storage requirements | ||
|
|
||
| ```sh | ||
| TEALDIR=cmd/goal/examples | ||
| echo $TEALDIR | ||
|
|
||
| # create the app and TAKE NOTE of its "app index" | ||
| goal app create --creator ${ACCOUNT} --approval-prog ${TEALDIR}/boxes.teal --clear-prog ${TEALDIR}/clear.teal --global-byteslices 0 --global-ints 0 --local-byteslices 0 --local-ints 0 | ||
| ``` | ||
|
|
||
| For the following questions, you'll need to use the app index. That will be shown in the last line printed. EG: | ||
|
|
||
| ```sh | ||
| Attempting to create app (approval size 125, hash RKWO3VXBKQXF77PC6EHRLFXD4YTJYTJTGPTPWQ46YH5ESGPZ5JIA; clear size 3, hash IS4FW6ZCRMQRTDIINAVAQHD2GK6DXUNQHQ52IQGZEVPP4OEU56QA) | ||
| Issued transaction from account ECRQFXZ7P3PLNK6QLIEVX7AXU6NTVQZHFUSEXTXMBKKOA2NTIV4PCX7XNY, txid SZK3U7AARMPQSZUICZIGYRLC7UDXJCVPV34JCBN5LIBXMF635UKA (fee 1000) | ||
| Transaction SZK3U7AARMPQSZUICZIGYRLC7UDXJCVPV34JCBN5LIBXMF635UKA still pending as of round 12 | ||
| Transaction SZK3U7AARMPQSZUICZIGYRLC7UDXJCVPV34JCBN5LIBXMF635UKA still pending as of round 13 | ||
| Transaction SZK3U7AARMPQSZUICZIGYRLC7UDXJCVPV34JCBN5LIBXMF635UKA committed in round 14 | ||
| Created app with app index 2 | ||
| ``` | ||
|
|
||
| ## Funding App-Accounts | ||
|
|
||
| ### Q: How do I fund the app account so that it can satisfy its boxes min-balance requirement and allow for box creation? | ||
|
|
||
| ### A: | ||
| Assuming you followed the previous step, and that the _app index_ is 2: | ||
|
|
||
| ```sh | ||
| # store the app index for later usage | ||
| APPID=2 | ||
| echo $APPID | ||
|
|
||
| # store the app's account address into a variable | ||
| APP_ACCOUNT=`goal app info --app-id ${APPID} | grep "Application account" | awk '{print $3}'` | ||
| echo $APP_ACCOUNT | ||
|
|
||
| # fund the app's account (here we're being very conservative and sending 10 algos) | ||
| goal clerk send --to ${APP_ACCOUNT} --from ${ACCOUNT} --amount 10000000 | ||
|
|
||
| # verify the balance of the app's account | ||
| goal account balance --address ${APP_ACCOUNT} | ||
| ``` | ||
|
|
||
| ## Application Boxes in `goal` | ||
|
|
||
| ### Q: How do I use boxes in goal? In particular, I'd like to make a goal app call which: | ||
| * accesses a particular box for a particular app | ||
| * stores an ABI type as its contents | ||
|
|
||
| ### A: | ||
| Here's an example with the following assumptions: | ||
|
|
||
| * the caller's account is given by `${ACCOUNT}` (see first answer) | ||
| * the program used is `boxes.teal` referenced above. In particular: | ||
| * it routes to box subroutines using the app argument at index 0 as the method signifier | ||
| * the app id has been stored in `${APPID}` (see the previous answer) | ||
| * the box referenced in the first non-create app-call has name `greatBox` | ||
| * another referenced box is named `an_ABI_box` | ||
| * this second box is provided contents `[2,3,5]` of ABI-type `(uint8,uint8,uint8)` | ||
|
|
||
| ```sh | ||
| # create a box with a simple non-ABI name. Note how the `--box` flag needs to be set so as to refer to the box being touched | ||
| goal app call --from $ACCOUNT --app-id ${APPID} --box "str:greatBox" --app-arg "str:create" --app-arg "str:greatBox" | ||
|
|
||
| # create another box | ||
| goal app call --from ${ACCOUNT} --app-id ${APPID} --box "str:an_ABI_box" --app-arg "str:create" --app-arg "str:an_ABI_box" | ||
|
|
||
| # set the contents to ABI type `(uint8,uint8,uint8)` with value `[2,3,5]` | ||
| goal app call --from ${ACCOUNT} --app-id ${APPID} --box "str:an_ABI_box" --app-arg "str:set" --app-arg "str:an_ABI_box" --app-arg "abi:(uint8,uint8,uint8):[2,3,5]" | ||
| ``` | ||
|
|
||
| ### Q: How do I search for boxes in goal? | ||
|
|
||
| ### A: | ||
| Assuming you followed the previous step to create `greatBox` and `an_ABI_box`: | ||
|
|
||
| ```sh | ||
| # get all boxes for a given app | ||
| goal app box list --app-id ${APPID} | ||
|
|
||
| # get the box details for a given box | ||
| goal app box info --app-id ${APPID} --name "str:an_ABI_box" | ||
| ``` |
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.