This repository was archived by the owner on Aug 7, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 56
New guide: Use Hyperlane TIA as gas token #390
Closed
Closed
Changes from 64 commits
Commits
Show all changes
65 commits
Select commit
Hold shift + click to select a range
cdcfbe3
gm-world-tia-gas.md: small stuff
assafmo 24466e1
Add IBC warning
assafmo be20109
Merge branch 'main' into hyperlane
assafmo 74fa448
cp {cosmwasm,hyperlane}.md
assafmo 83263e9
Edit IBC warning
assafmo 156eca3
Refactor git clone CosmWasm
assafmo c9e9d5e
cosmwasm.md: Foramt with Prettier
assafmo 858c18e
Init hyperlane.md
assafmo 1926617
cp hyperlane{-use-tia-for-gas,}.md
assafmo 618d8b1
docs: Update guides/hyperlane-use-tia-for-gas.md
assafmo bd9d324
fix(tutorials/cosmwasm.md): update line numbers to comment out in app…
assafmo 21f1849
docs(guides): update hyperlane use tia for gas guide with new instruc…
assafmo 490e23c
docs(guides): update hyperlane usage guide with new grpc endpoint and…
assafmo c83407c
docs(hyperlane-use-tia-for-gas.md): add tip on generating and using o…
assafmo a7d62d2
docs: add information note about `localwasm-key` in hyperlane tia gas…
assafmo 2081b77
docs(guides/hyperlane-use-tia-for-gas.md): update hyperlane relayer c…
assafmo 7d4bea0
Update guide for using TIA for gas on Hyperlane
assafmo 6bea20e
Update Hyperlane guide with more deployment resources
assafmo 57bbca5
Update Hyperlane guide with relayer run command
assafmo 4409030
Update Hyperlane deployment for Stride testnet
assafmo 6cd1b0a
Update Hyperlane gas usage config
assafmo 0b64a70
Update cw-hyperlane repo clone URL and fix typo in git command
assafmo 5281aa7
Add CosmWasm rollup deployment instructions (in short)
assafmo 2304fac
docs(hyperlane-use-tia-for-gas.md): update cosmwasm init script to us…
assafmo 6eb4d4e
docs(guides/hyperlane-use-tia-for-gas.md): update grpc url, config fi…
assafmo 6abd3da
docs(hyperlane-use-tia-for-gas.md): remove unnecessary note about tem…
assafmo 37dae50
docs(hyperlane-use-tia-for-gas.md): Update `wasmd tx bank send` and a…
assafmo d1dba44
small stuff
assafmo 361f0d2
🥲🔫always has been
assafmo d10b656
use latest hyperlane-agent
assafmo e02cc63
s/localwasm/localwasmd/
assafmo 19e6314
make sure to configure the docker host ip in agent-config.docker.json
assafmo 2595b31
docs(hyperlane-use-tia-for-gas): update gas adjustment value from 1.2…
assafmo 433895e
stuff
assafmo f11f5a8
added instructions for adding tokenfactory
sampocs 703c5bd
deployment working on mac
sampocs 378cac1
updated to run everything in docker
sampocs ba59eb1
transfers working!
sampocs 9a24e04
formatter
sampocs ae005cb
nit changes while testing
sampocs 1475c63
added transfer from celestia
sampocs f16675c
refactor hyperlane-use-tia-for-gas.md to use external files rather th…
assafmo 8b56608
fix(guides/hyperlane-use-tia-for-gas.md): update URL for fetching uti…
assafmo a32d907
fix guides/assets/hyperlane-use-tia-for-gas/add-tokenfactory.diff
assafmo 7fe15dc
fix guides/assets/hyperlane-use-tia-for-gas/add-tokenfactory.diff
assafmo f147201
fix guides/assets/hyperlane-use-tia-for-gas/docker-compose.yml
assafmo fc838fa
Revert "fix guides/assets/hyperlane-use-tia-for-gas/docker-compose.yml"
assafmo 5563886
fix quotes in sed command to avoid syntax error
assafmo c949a26
chore(docker-compose): replace perl single quotes with double quotes …
assafmo 409d6b8
fix(wasmd.Dockerfile): update golang base image from 1.22.5 to 1.23
assafmo 0faa152
nit
assafmo 17225e4
fix quoting
assafmo ed43b1e
feat(wasmd.Dockerfile): downgrade base image golang version to 1.22.5
assafmo f30f71e
build(Dockerfile): fix apt-get install command by adding -y flag to a…
assafmo 028592e
fix(hyperlane-use-tia-for-gas): automatically confirm apt-get install…
assafmo d5b5109
chore(wasmd.Dockerfile): remove unnecessary echo command that is alwa…
assafmo 193b455
refactor(wasmd.Dockerfile): simplify wasmd build and installation steps
assafmo d1aee89
feat(hyperlane): add new docker-compose configuration for restarting …
assafmo cc83b42
docs: remove docker-compose-2 file for hyperlane guide
assafmo b84123e
feat(docker-compose.yml): add condition to restart wasm from existing…
assafmo 066c60e
final pass
assafmo d36eef3
docs(stride-installation): correct git clone and cd commands to ensur…
assafmo 9d18118
final pass
assafmo 3a3e45a
Merge branch 'main' into hyperlane
assafmo 3c8cf75
Update guides/hyperlane-use-tia-for-gas.md
assafmo 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
113 changes: 113 additions & 0 deletions
113
guides/assets/hyperlane-use-tia-for-gas/add-tokenfactory.diff
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,113 @@ | ||
diff --git a/app/app.go b/app/app.go | ||
index 44934ea..8e8c829 100644 | ||
--- a/app/app.go | ||
+++ b/app/app.go | ||
@@ -10,6 +10,9 @@ import ( | ||
"strings" | ||
"sync" | ||
|
||
+ "github.com/Stride-Labs/tokenfactory/tokenfactory" | ||
+ tokenfactorykeeper "github.com/Stride-Labs/tokenfactory/tokenfactory/keeper" | ||
+ tokenfactorytypes "github.com/Stride-Labs/tokenfactory/tokenfactory/types" | ||
abci "github.com/cometbft/cometbft/abci/types" | ||
tmproto "github.com/cometbft/cometbft/proto/tendermint/types" | ||
dbm "github.com/cosmos/cosmos-db" | ||
@@ -176,10 +179,11 @@ var maccPerms = map[string][]string{ | ||
govtypes.ModuleName: {authtypes.Burner}, | ||
nft.ModuleName: nil, | ||
// non sdk modules | ||
- ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, | ||
- ibcfeetypes.ModuleName: nil, | ||
- icatypes.ModuleName: nil, | ||
- wasmtypes.ModuleName: {authtypes.Burner}, | ||
+ ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, | ||
+ ibcfeetypes.ModuleName: nil, | ||
+ icatypes.ModuleName: nil, | ||
+ wasmtypes.ModuleName: {authtypes.Burner}, | ||
+ tokenfactorytypes.ModuleName: {authtypes.Minter, authtypes.Burner}, | ||
} | ||
|
||
var ( | ||
@@ -226,6 +230,7 @@ type WasmApp struct { | ||
ICAHostKeeper icahostkeeper.Keeper | ||
TransferKeeper ibctransferkeeper.Keeper | ||
WasmKeeper wasmkeeper.Keeper | ||
+ TokenFactoryKeeper tokenfactorykeeper.Keeper | ||
|
||
ScopedIBCKeeper capabilitykeeper.ScopedKeeper | ||
ScopedICAHostKeeper capabilitykeeper.ScopedKeeper | ||
@@ -326,6 +331,7 @@ func NewWasmApp( | ||
capabilitytypes.StoreKey, ibcexported.StoreKey, ibctransfertypes.StoreKey, ibcfeetypes.StoreKey, | ||
wasmtypes.StoreKey, icahosttypes.StoreKey, | ||
icacontrollertypes.StoreKey, | ||
+ tokenfactorytypes.StoreKey, | ||
) | ||
|
||
tkeys := storetypes.NewTransientStoreKeys(paramstypes.TStoreKey) | ||
@@ -563,6 +569,16 @@ func NewWasmApp( | ||
app.BankKeeper, | ||
) | ||
|
||
+ // Token factory keeper | ||
+ app.TokenFactoryKeeper = tokenfactorykeeper.NewKeeper( | ||
+ keys[tokenfactorytypes.StoreKey], | ||
+ app.GetSubspace(tokenfactorytypes.ModuleName), | ||
+ maccPerms, | ||
+ app.AccountKeeper, | ||
+ app.BankKeeper, | ||
+ app.DistrKeeper, | ||
+ ) | ||
+ | ||
// create evidence keeper with router | ||
evidenceKeeper := evidencekeeper.NewKeeper( | ||
appCodec, | ||
@@ -725,6 +741,7 @@ func NewWasmApp( | ||
ibcfee.NewAppModule(app.IBCFeeKeeper), | ||
ica.NewAppModule(&app.ICAControllerKeeper, &app.ICAHostKeeper), | ||
ibctm.AppModule{}, | ||
+ tokenfactory.NewAppModule(app.TokenFactoryKeeper, app.AccountKeeper, app.BankKeeper), | ||
// sdk | ||
crisis.NewAppModule(app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisistypes.ModuleName)), // always be last to make sure that it checks for all invariants and not only part of them | ||
) | ||
@@ -770,6 +787,7 @@ func NewWasmApp( | ||
icatypes.ModuleName, | ||
ibcfeetypes.ModuleName, | ||
wasmtypes.ModuleName, | ||
+ tokenfactorytypes.ModuleName, | ||
) | ||
|
||
app.ModuleManager.SetOrderEndBlockers( | ||
@@ -786,6 +804,7 @@ func NewWasmApp( | ||
icatypes.ModuleName, | ||
ibcfeetypes.ModuleName, | ||
wasmtypes.ModuleName, | ||
+ tokenfactorytypes.ModuleName, | ||
) | ||
|
||
// NOTE: The genutils module must occur after staking so that pools are | ||
@@ -811,6 +830,7 @@ func NewWasmApp( | ||
ibcfeetypes.ModuleName, | ||
// wasm after ibc transfer | ||
wasmtypes.ModuleName, | ||
+ tokenfactorytypes.ModuleName, | ||
} | ||
app.ModuleManager.SetOrderInitGenesis(genesisModuleOrder...) | ||
app.ModuleManager.SetOrderExportGenesis(genesisModuleOrder...) | ||
@@ -899,9 +919,6 @@ func NewWasmApp( | ||
// At startup, after all modules have been registered, check that all proto | ||
// annotations are correct. | ||
protoFiles, err := proto.MergedRegistry() | ||
- if err != nil { | ||
- panic(err) | ||
- } | ||
err = msgservice.ValidateProtoAnnotations(protoFiles) | ||
if err != nil { | ||
// Once we switch to using protoreflect-based antehandlers, we might | ||
@@ -1209,5 +1226,6 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino | ||
paramsKeeper.Subspace(icahosttypes.SubModuleName).WithKeyTable(icahosttypes.ParamKeyTable()) | ||
|
||
paramsKeeper.Subspace(wasmtypes.ModuleName) | ||
+ paramsKeeper.Subspace(tokenfactorytypes.ModuleName) | ||
return paramsKeeper | ||
} | ||
|
99 changes: 99 additions & 0 deletions
99
guides/assets/hyperlane-use-tia-for-gas/docker-compose.yml
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,99 @@ | ||
services: | ||
da: | ||
image: golang:1.22-alpine | ||
container_name: da | ||
entrypoint: ["sh", "-c"] | ||
command: | ||
- | | ||
apk add curl perl jq bash git make | ||
curl -sSL https://rollkit.dev/install-local-da.sh -o start.sh | ||
perl -i -pe 's;./build/local-da;./build/local-da -listen-all;' start.sh | ||
sh start.sh | ||
ports: | ||
- 7980:7980 | ||
localwasm: | ||
image: localwasm | ||
container_name: localwasm | ||
build: | ||
context: ../../wasmd | ||
dockerfile: Dockerfile | ||
entrypoint: ["sh", "-c"] | ||
command: | ||
- | | ||
if [ -f /opt/restart-wasm.sh ]; then | ||
bash /opt/restart-wasm.sh | ||
else | ||
apt-get update && apt-get install -y curl perl jq netcat | ||
until nc -z -v da 7980; do | ||
echo "Waiting for the DA layer to start..." | ||
sleep 2 | ||
done | ||
curl -sSL https://rollkit.dev/cosmwasm/init.sh | | ||
perl -pe 's;127.0.0.1;0.0.0.0;g' | | ||
perl -pe 's;http://localhost:7980;http://da:7980;g' | | ||
perl -pe 's;--rollkit.aggregator;--rollkit.aggregator --api.address tcp://0.0.0.0:1317;g' | | ||
bash | ||
fi | ||
ports: | ||
- 36657:36657 | ||
- 1317:1317 | ||
- 9290:9290 | ||
relayer: | ||
container_name: hpl-relayer | ||
image: gcr.io/abacus-labs-dev/hyperlane-agent:8a66544-20240530-111322 | ||
platform: linux/amd64 | ||
user: root | ||
# restart: always | ||
entrypoint: ["sh", "-c"] | ||
command: | ||
- | | ||
rm -rf /app/config/* && \ | ||
cp "/etc/hyperlane/agent-config.docker.json" "/app/config/agent-config.json" && \ | ||
CONFIG_FILES="/etc/hyperlane/relayer.json" \ | ||
./relayer | ||
ports: | ||
- 9110:9090 | ||
volumes: | ||
- ./hyperlane:/etc/hyperlane | ||
- ./relayer:/etc/data | ||
- ./validator:/etc/validator | ||
|
||
validator-localwasm: | ||
container_name: hpl-validator-localwasm | ||
image: gcr.io/abacus-labs-dev/hyperlane-agent:8a66544-20240530-111322 | ||
platform: linux/amd64 | ||
user: root | ||
# restart: always | ||
entrypoint: ["sh", "-c"] | ||
command: | ||
- | | ||
rm -rf /app/config/* && \ | ||
cp "/etc/hyperlane/agent-config.docker.json" "/app/config/agent-config.json" && \ | ||
CONFIG_FILES="/etc/hyperlane/validator.localwasm.json" \ | ||
./validator | ||
ports: | ||
- 9120:9090 | ||
volumes: | ||
- ./hyperlane:/etc/hyperlane | ||
- ./validator:/etc/validator | ||
- ./validator/localwasm:/etc/data | ||
|
||
validator-strideinternal1: | ||
container_name: hpl-validator-strideinternal1 | ||
image: gcr.io/abacus-labs-dev/hyperlane-agent:8a66544-20240530-111322 | ||
platform: linux/amd64 | ||
user: root | ||
# restart: always | ||
entrypoint: ["sh", "-c"] | ||
command: | ||
- | | ||
rm -rf /app/config/* && \ | ||
cp "/etc/hyperlane/agent-config.docker.json" "/app/config/agent-config.json" && \ | ||
CONFIG_FILES="/etc/hyperlane/validator.strideinternal1.json" \ | ||
./validator | ||
ports: | ||
- 9121:9090 | ||
volumes: | ||
- ./hyperlane:/etc/hyperlane | ||
- ./validator:/etc/validator | ||
- ./validator/strideinternal1:/etc/data |
66 changes: 66 additions & 0 deletions
66
guides/assets/hyperlane-use-tia-for-gas/hyperlane-config-2.yaml
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,66 @@ | ||
networks: | ||
- id: "localwasm" | ||
hrp: "wasm" | ||
endpoint: | ||
rpc: "http://127.0.0.1:36657" | ||
rest: "http://127.0.0.1:1317" | ||
grpc: "http://127.0.0.1:9290" | ||
gas: | ||
price: "0.025" | ||
denom: "uwasm" | ||
domain: 963 | ||
signer: "join always addict position jungle jeans bus govern crack huge photo purse famous live velvet virtual weekend hire cricket media dignity wait load mercy" # wasm133xh839fjn9wxzg6vhc0370lcem8939zr8uu45 | ||
- id: "stride-internal-1" | ||
hrp: "stride" | ||
endpoint: | ||
rpc: "https://stride-testnet-rpc.polkachu.com" | ||
rest: "https://stride-testnet-api.polkachu.com" | ||
grpc: "http://stride-testnet-grpc.polkachu.com:12290" | ||
gas: | ||
price: "0.01" | ||
denom: "ustrd" | ||
domain: 1651 | ||
signer: "join always addict position jungle jeans bus govern crack huge photo purse famous live velvet virtual weekend hire cricket media dignity wait load mercy" # stride133xh839fjn9wxzg6vhc0370lcem8939z2sd4gn | ||
assafmo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
# wasm133xh839fjn9wxzg6vhc0370lcem8939zr8uu45 | ||
# stride133xh839fjn9wxzg6vhc0370lcem8939z2sd4gn | ||
signer: "join always addict position jungle jeans bus govern crack huge photo purse famous live velvet virtual weekend hire cricket media dignity wait load mercy" | ||
Comment on lines
+25
to
+27
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove exposed mnemonic and consider using environment variables. Exposing the full mnemonic in the configuration file is a severe security risk. Additionally, repeating the mnemonic from the network configurations is redundant and could lead to maintenance issues. Consider the following improvements:
Example: signer: ${HYPERLANE_SIGNER_MNEMONIC} |
||
|
||
deploy: | ||
ism: | ||
type: multisig | ||
owner: <signer> | ||
validators: | ||
963: | ||
addrs: | ||
- <signer> | ||
threshold: 1 | ||
assafmo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
hooks: | ||
default: | ||
type: aggregate | ||
owner: <signer> | ||
hooks: | ||
- type: merkle | ||
|
||
- type: igp | ||
owner: <signer> | ||
token: "ibc/1A7653323C1A9E267FF7BEBF40B3EEA8065E8F069F47F2493ABC3E0B621BF793" | ||
configs: | ||
963: | ||
exchange_rate: 1000 | ||
gas_price: 10000 | ||
default_gas_usage: 100000 | ||
|
||
required: | ||
type: aggregate | ||
owner: <signer> | ||
hooks: | ||
- type: pausable | ||
owner: <signer> | ||
paused: false | ||
|
||
- type: fee | ||
owner: <signer> | ||
fee: | ||
denom: "ibc/1A7653323C1A9E267FF7BEBF40B3EEA8065E8F069F47F2493ABC3E0B621BF793" | ||
amount: 1 |
65 changes: 65 additions & 0 deletions
65
guides/assets/hyperlane-use-tia-for-gas/hyperlane-config.yaml
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,65 @@ | ||
networks: | ||
- id: "localwasm" | ||
hrp: "wasm" | ||
endpoint: | ||
rpc: "http://127.0.0.1:36657" | ||
rest: "http://127.0.0.1:1317" | ||
grpc: "http://127.0.0.1:9290" | ||
gas: | ||
price: "0.025" | ||
denom: "uwasm" | ||
domain: 963 | ||
signer: "join always addict position jungle jeans bus govern crack huge photo purse famous live velvet virtual weekend hire cricket media dignity wait load mercy" # wasm133xh839fjn9wxzg6vhc0370lcem8939zr8uu45 | ||
- id: "stride-internal-1" | ||
hrp: "stride" | ||
endpoint: | ||
rpc: "https://stride-testnet-rpc.polkachu.com" | ||
rest: "https://stride-testnet-api.polkachu.com" | ||
grpc: "http://stride-testnet-grpc.polkachu.com:12290" | ||
gas: | ||
price: "0.01" | ||
denom: "ustrd" | ||
domain: 1651 | ||
signer: "join always addict position jungle jeans bus govern crack huge photo purse famous live velvet virtual weekend hire cricket media dignity wait load mercy" # stride133xh839fjn9wxzg6vhc0370lcem8939z2sd4gn | ||
assafmo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
# wasm133xh839fjn9wxzg6vhc0370lcem8939zr8uu45 | ||
# stride133xh839fjn9wxzg6vhc0370lcem8939z2sd4gn | ||
signer: "join always addict position jungle jeans bus govern crack huge photo purse famous live velvet virtual weekend hire cricket media dignity wait load mercy" | ||
assafmo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
deploy: | ||
ism: | ||
type: multisig | ||
owner: <signer> | ||
validators: | ||
1651: | ||
addrs: | ||
- <signer> | ||
threshold: 1 | ||
assafmo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
hooks: | ||
default: | ||
type: aggregate | ||
owner: <signer> | ||
hooks: | ||
- type: merkle | ||
|
||
- type: igp | ||
owner: <signer> | ||
configs: | ||
1651: | ||
exchange_rate: 1000 | ||
gas_price: 10000 | ||
default_gas_usage: 100000 | ||
|
||
required: | ||
type: aggregate | ||
owner: <signer> | ||
hooks: | ||
- type: pausable | ||
owner: <signer> | ||
paused: false | ||
|
||
- type: fee | ||
owner: <signer> | ||
fee: | ||
denom: uwasm | ||
amount: 1 |
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,32 @@ | ||
{ | ||
"db": "/etc/data/db", | ||
"relayChains": "localwasm,strideinternal1", | ||
"allowLocalCheckpointSyncers": "true", | ||
"gasPaymentEnforcement": [{ "type": "none" }], | ||
assafmo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
"whitelist": [ | ||
{ | ||
"origindomain": [963], | ||
"destinationDomain": [1651] | ||
}, | ||
{ | ||
"origindomain": [1651], | ||
"destinationDomain": [963] | ||
} | ||
], | ||
"chains": { | ||
"localwasm": { | ||
"signer": { | ||
"type": "cosmosKey", | ||
"key": "0xf0517040b5669e2d93ffac3a3616187b14a19ad7a0657657e0f655d5eced9e31", | ||
"prefix": "wasm" | ||
} | ||
}, | ||
"strideinternal1": { | ||
"signer": { | ||
"type": "cosmosKey", | ||
"key": "0xf0517040b5669e2d93ffac3a3616187b14a19ad7a0657657e0f655d5eced9e31", | ||
"prefix": "stride" | ||
} | ||
} | ||
} | ||
} |
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.