Ended
August 6, 2022

Stride

Multichain Liquid Staking

Table of Content

    1. Preparation
    2. STRIDE
      1. Stride Node
      2. Stride Wallet
      3. Stride Configurations
      4. Stride validator
    3. Gaia
      1. Gaia Full Node
      2. Gaia Wallet
      3. Gaia Validator
    4. Fund your Wallets
    5. Relayer_Setup
    6. Connect to Hermes
    7. Perform Transaction

Congratulations


Project Information


Back to content

Official Information:

DESCRIPTION


Back to content

Why build Stride?

The current state of DeFi in the Cosmos ecosystem is underutilized and inefficient. Users are forced to make a tradeoff between staking their tokens for passive yield or participating in DeFi, exposing themselves to greater risk for greater yields.

Many other proof-of-stake ecosystems, including Ethereum and Solana, have staking derivatives to solve this problem. Now, Cosmos does too.


What is Stride?

Stride is a blockchain ("zone") that provides liquidity for staked assets. Using Stride, you can earn both staking and DeFi yields across the Cosmos IBC ecosystem. Stride aim to provide liquid staking for all chains in the Cosmos ecosystem.

Stride is built using Cosmos SDK and Tendermint and created with Ignite. Stride allows users to liquid stake any IBC-compatible cosmos SDK native appchain token. Under the hood, Stride leverages the Inter-Blockchain Communication protocol, Interchain Accounts and Interchain Queries.

Stride is on a mission to deliver the best and safest liquid staking experience to users in Cosmos, allowing you to stake and participate in DeFi.

Stride is the state-of-the-art multichain liquid staking experience! Stride will allow users to liquid stake their assets on any Cosmos chain.


How does Stride Multichain Liquid Staking work?


Stake

Stake your tokens on Stride from any Cosmos chain. See your rewards accumulate in real time. No minimum. It's that simple.

Mint

Receive stTokens when you stake. These can be freely traded, and can be redeemed with Stride at any time to receive your original tokens. (+ staking rewards!)

DeFi

Stride lets you use your staked assets to compound your yield. Continue to earn staking yield, and earn additional yield by lending, LPing, and more. Set your own risk tolerance in Cosmos DeFi.


The PoolPart Testnet

Back to content

The PoolPart testnet is the Stride Incentivized testnet. To earn rewards on the PoolParty testnet, submit evidences of having completed the following tasks. The goal is stress test the Stride core appchain and module logic.

Note : You do not need to submit your validators (task 10) and relayers (task 7) task, the team will detect that using onchain data.


How To Submit Tasks


Back to content

Please submit evidence you've completed a task using this SUBMISSION FORM

Use your best judgement to determine what constitutes proof you've completed the task (links to transactions/accounts and writeups are best; screenshots are acceptable but not ideal, other forms of evidence are unlikely to earn you rewards).

Disclaimers

  1. We will NOT verify your submission is valid until the incentivized testnet has finished.
  2. The points listed in the task are the max you can earn for completing the task with high quality. Most submissions will earn fewer points for low quality, or no points if they violate the rules.
  3. You will be asked to prove you own the address associated with the account that completed the task
  4. You will be asked for several other verifications to prevent sybil attacks.
  5. Most tasks can only be completed once. Use your judgement (e.g. we will NOT reward you for delegating twice)

Server Requirements


Back to content

Minimum Hardware Requirements

4x CPUs, 8GB RAM,100GB of storage (SSD or NVME), Permanent Internet connection

Recommended Hardware Requirements

4x CPUs, 32GB RAM, 200GB of storage (SSD or NVME), Permanent Internet connection

Recommendations from the team (VPS/VDS/DS):
4 CPUs, 8 GB RAM, 100 GB SSD, Ubuntu 20.04

We've only tested this build on OSX and Linux machines, but we hope to support Windows soon.

Suitable servers:


What is Being Installed


Back to content

The project consists of several applications

  • Stride Node
  • Stride wallet
  • Stride Validator
  • Gaia Full node
  • Gaia Validator
  • IBC Relayer (Hermes)

launch


Back to content

1. Preparation

Back to content

Update packages

sudo  apt update &&  sudo  apt upgrade -y sudo apt install curl -y

Open your ports

sudo ufw allow 22 && ufw allow 26656 && ufw allow 26657 && ufw allow 9090 && ufw allow 6060 && ufw allow 1317

Enable your firewalls

sudo ufw enable -y && sudo ufw status

Install dependencies

sudo apt install make clang pkg-config libssl-dev build-essential git jq ncdu bsdmainutils htop -y

Set your parameters

read -p "Enter node name: " STRIDE_NODENAME

A prompt appears requesting to Enter node name:

Type in your preferred node name

Replace ${STRIDE_NODENAME}with the name chosen above

echo 'export STRIDE_NODENAME='\"${STRIDE_NODENAME}\" >> $HOME/.bash_profile

Then,

echo 'source $HOME/.bashrc' >> $HOME/.bash_profile

Install GO

Install go1.18.4

wget -O go1.18.4.linux-amd64.tar.gz https://golang.org/dl/go1.18.4.linux-amd64.tar.gz

Remove the debris

rm -rf /usr/local/go && tar -C /usr/local -xzf go1.18.4.linux-amd64.tar.gz && rm go1.18.4.linux-amd64.tar.gz

Replace ${STRIDE_NODENAME} with your name as above.

echo 'export GOROOT=/usr/local/go' >> $HOME/.bash_profile
echo 'export STRIDE_NODENAME='\"${STRIDE_NODENAME}\" >> $HOME/.bash_profile
echo 'export GOPATH=$HOME/go' >> $HOME/.bash_profile
echo 'export GO111MODULE=on' >> $HOME/.bash_profile
echo 'export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin' >> $HOME/.bash_profile && . $HOME/.bash_profile
go version

2. STRIDE

Stride-Node

Back to content

Before you begin, it's important to see this link

Install Stride Node

Remove any prior instance of Stride node

rm -rf $HOME/stride && git clone https://github.com/Stride-Labs/stride.git

Install and Build your Stride node

cd stride && git checkout 3cb77a79f74e0b797df5611674c3fbd000dfeaa1 && make build

Then,

mv $HOME/stride/build/strided /usr/local/bin/

Initialization

strided init "$STRIDE_NODENAME" --chain-id=STRIDE-TESTNET-2 --overwrite

Stride-wallet

Back to content

Create Stride Wallet

replace <Stride_walletName> with your preferred wallet name

strided keys add <Stride_walletName>

Then input your passphrase twice (ensure to always remember this)

Ensure to save your wallet details, including your Mnemonics (covered in blue here). Never disclose this to anyone

Stride Configurations

Back to content

Add Peers

Set Max inbound and outbound peers, and filter peers

peers="b61ea4c2c549e24c1a4d2d539b4d569d2ff7dd7b@stride-node1.poolparty.stridenet.co:26656"
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.stride/config/config.toml
sed -i 's/max_num_inbound_peers =.*/max_num_inbound_peers = 100/g' $HOME/.stride/config/config.toml
sed -i 's/max_num_outbound_peers =.*/max_num_outbound_peers = 100/g' $HOME/.stride/config/config.toml
sed -i -e "s/^filter_peers *=.*/filter_peers = \"true\"/" $HOME/.stride/config/config.toml

Set Minimum gas Price and External address

external_address=$(wget -qO- eth0.me) 
sed -i.bak -e "s/^external_address *=.*/external_address = \"$external_address:26656\"/" $HOME/.stride/config/config.toml
sed -i.bak -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.0025ustrd\"/;" ~/.stride/config/app.toml

Add the seed

SEED="c0b278cbfb15674e1949e7e5ae51627cb2a2d0a9@seedv2.poolparty.stridenet.co:26656"

Then;

sed -i "s/^seeds *=.*/seeds = \"$SEED\"/;" $HOME/.stride/config/config.toml

Pruning Configuration

pruning="custom" && \
pruning_keep_recent="100" && \
pruning_keep_every="0" && \
pruning_interval="10" && \
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.stride/config/app.toml && \
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.stride/config/app.toml && \
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.stride/config/app.toml && \
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.stride/config/app.toml

Set the Indexer

sed -i.bak -e "s/indexer *=.*/indexer = \"null\"/g" $HOME/.stride/config/config.toml

Get the Genesis file and rest the blockchain

wget -O $HOME/.stride/config/genesis.json https://raw.githubusercontent.com/Stride-Labs/testnet/main/poolparty/genesis.json && strided tendermint unsafe-reset-all

Download the Address book

wget -O $HOME/.stride/config/addrbook.json https://api.nodes.guru/stride_addrbook.json

Create a Service file

echo "[Unit]
Description=Strided Node
After=network.target

[Service]
User=$USER
Type=simple
ExecStart=$(which strided) start
Restart=on-failure
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target" > $HOME/strided.service
sudo mv $HOME/strided.service /etc/systemd/system
sudo tee <<EOF >/dev/null /etc/systemd/journald.conf
Storage=persistent
EOF

Run the Stride Service

sudo systemctl restart systemd-journald
sudo systemctl daemon-reload
sudo systemctl enable strided
sudo systemctl restart strided

To check your node status

service strided status

status: should show active(running) else, your stride node was not installed properly.

press Q to exit

Check your balance

strided q bank balances <wallet addr>

Stride Validator

Back to content

Create a Stride validator

Replace <Stride_walletName> with your wallet name and Stride_valName with your preferred validator name.

strided tx staking create-validator --moniker="Stride_valName" --amount=1000000ustrd --fees 300ustrd --pubkey=$(strided tendermint show-validator) --chain-id=STRIDE-TESTNET-2 --commission-max-change-rate=0.01 --commission-max-rate=0.20 --commission-rate=0.10 --min-self-delegation=1 --from=<Stride_walletName> --yes

View your validator address

strided keys show Stride2 --bech val -a

Ensure to Copy and save your validator address

By the end of the Stride Section, you must have saved the following
a. STRIDE_NODENAME
b. Stride_walletName
c. Stride wallet Mnemonics
d. Stride_wallet_address
e. Stride_valName
f. Stride_val address
hint: The name parameters (STRIDE_NODENAME, Stride_walletName, Stride_valName), will be determined by you while the rest, will be auto-generated.
So you can choose the same name for all the name parameters e.g uyourname_stride before starting the section

Go back to the section to continue


3. Gaia

1. Gaia full node

Back to content

Before you begin, it's important to see this link

a. Install Gaia full node

cd $HOME && wget -O gaia.sh https://raw.githubusercontent.com/kj89/testnet_manuals/main/stride/GAIA/gaia.sh && chmod +x gaia.sh && ./gaia.sh

Enter your preferred node name

b. Check your Gaia node status

curl -s localhost:23657/status | jq .result.sync_info

c. Check your logs

journalctl -u gaiad -f -o cat

press ctrl c to exit

d. Load variables into system

source $HOME/.bash_profile

e. State sync your Node

SNAP_RPC1="https://gaia.poolparty.stridenet.co:445" \
&& SNAP_RPC2="https://gaia.poolparty.stridenet.co:445"
LATEST_HEIGHT=$(curl -s $SNAP_RPC2/block | jq -r .result.block.header.height) \
&& BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000)) \
&& TRUST_HASH=$(curl -s "$SNAP_RPC2/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash)
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC1,$SNAP_RPC2\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.gaia/config/config.toml
gaiad tendermint unsafe-reset-all --home $HOME/.gaia
sudo systemctl restart gaiad && journalctl -fu gaiad -o cat

press ctrl c to exit

f. To get your node information run

gaiad status 2>&1 | jq .NodeInfo

2. Gaia Wallet

Back to content

Create Gaia Wallet

gaiad keys add $WALLET

Ensure to save your wallet information.

Add wallet and valoper address into variables

GAIA_WALLET_ADDRESS=$(gaiad keys show $WALLET -a)
GAIA_VALOPER_ADDRESS=$(gaiad keys show $WALLET --bech val -a)
echo 'export GAIA_WALLET_ADDRESS='${GAIA_WALLET_ADDRESS} >> $HOME/.bash_profile
echo 'export GAIA_VALOPER_ADDRESS='${GAIA_VALOPER_ADDRESS} >> $HOME/.bash_profile
source $HOME/.bash_profile


3. Gaia Validator

Back to content

Create a Validator

Replace $GAIA_NODENAME with your GAIA_NODENAME

gaiad tx staking create-validator \
  --amount 1000000uatom \
  --from $WALLET \
  --commission-max-change-rate "0.01" \
  --commission-max-rate "0.2" \
  --commission-rate "0.07" \
  --min-self-delegation "1" \
  --pubkey  $(gaiad tendermint show-validator) \
  --moniker $GAIA_NODENAME \
  --chain-id GAIA

To check you validation key

[[ $(gaiad q staking validator $GAIA_VALOPER_ADDRESS -oj | jq -r .consensus_pubkey.key) = $(gaiad status | jq -r .ValidatorInfo.PubKey.value) ]] && echo -e "\n\e[1m\e[32mTrue\e[0m\n" || echo -e "\n\e[1m\e[31mFalse\e[0m\n"
Save your validator address

Get your validator address and save.

By the end of the Gaia Section, you must have saved the following
a. GAIA_NODENAME
b. GAIA_val address
c. GAIA wallet address
c. Gaia Mnemonic phrase
hint: The name parameter (GAIA_NODENAME), will be determined by you while the rest, will be auto-generated.
So you can choose a name for the parameter e.g yourname_Gaia before starting the section

Go back to the section to continue


4. Fund your wallets

Back to content

Fund wallets:

You will need to fund both your Stride and Gaia wallets

Head to the Stride Discord channel, navigate to #token_faucet channel and request for test token. Send the following command to the bot;

Replace <GAIA_WALLET_ADDRESS> with your save Gaia wallet address

$faucet-atom:<GAIA_WALLET_ADDRESS>

Replace <STRIDE_WALLET_ADDRESS> with your save Stride wallet address

$faucet-stride:<STRIDE_WALLET_ADDRESS>

Note: Also, the bot is on a slow mode of about 15 minutes. So you will need to wait for 15 minutes after running the first command before you can run the second.


5. Relayer_Setup


1. IBC Relayer (Hermes) Stride & Gaia


Back to content

Before you begin, it's important to see this link

Create folder

cd $HOME && mkdir -p $HOME/.hermes/bin

Install Dependencies

sudo apt update && sudo apt upgrade -y && sudo apt install unzip -y

Install Hermes Software

wget "https://github.com/informalsystems/ibc-rs/releases/download/v0.15.0/hermes-v0.15.0-x86_64-unknown-linux-gnu.tar.gz"
tar -C $HOME/.hermes/bin/ -vxzf hermes-v0.15.0-x86_64-unknown-linux-gnu.tar.gz
rm hermes-v0.15.0-x86_64-unknown-linux-gnu.tar.gz

echo "export PATH=$PATH:$HOME/.hermes/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile

2. Installation Configuration


Stride chain

Choose a relayer name and "{RELAYER_NAME} with it, also replace {STRIDE_WALLET_NAME} with your stride wallet name.

STRIDE_RPC="stride.stake-take.com"
STRIDE_RPC_PORT="26657"
STRIDE_GRPC_PORT="9090"
STRIDE_CHAIN_ID="STRIDE-TESTNET-2"
STRIDE_ACC_PREFIX="stride"
STRIDE_DENOM="ustrd"
STRIDE_WALLET="{STRIDE_WALLET_NAME}"
MEMO_PREFIX="{RELAYER_NAME}"

Gaia Chain

GAIA_RPC="stride.stake-take.com"
GAIA_RPC_PORT="46657"
GAIA_GRPC_PORT="9490"
GAIA_CHAIN_ID="GAIA"
GAIA_ACC_PREFIX="cosmos"
GAIA_DENOM="uatom"
GAIA_WALLET="wallet"

Save Variable

echo "
export STRIDE_CHAIN_ID=${STRIDE_CHAIN_ID}
export STRIDE_DENOM=${STRIDE_DENOM}
export STRIDE_WALLET=${STRIDE_WALLET}
export GAIA_CHAIN_ID=${GAIA_CHAIN_ID}
export GAIA_DENOM=${GAIA_DENOM}
export GAIA_WALLET=${GAIA_WALLET}
export MEMO_PREFIX=${MEMO_PREFIX}
" >> $HOME/.bash_profile 

source $HOME/.bash_profile

Create Configuration

echo "[global]
log_level = 'info'
[mode]
[mode.clients]
enabled = true
refresh = true
misbehaviour = true
[mode.connections]
enabled = false
[mode.channels]
enabled = false
[mode.packets]
enabled = true
clear_interval = 100
clear_on_start = true
tx_confirmation = true
[rest]
enabled = true
host = '0.0.0.0'
port = 3000
[telemetry]
enabled = true
host = '0.0.0.0'
port = 3001
[[chains]]
id = '$STRIDE_CHAIN_ID'
rpc_addr = 'http://$STRIDE_RPC:$STRIDE_RPC_PORT'
grpc_addr = 'http://$STRIDE_RPC:$STRIDE_GRPC_PORT'
websocket_addr = 'ws://$STRIDE_RPC:$STRIDE_RPC_PORT/websocket'
rpc_timeout = '10s'
account_prefix = '$STRIDE_ACC_PREFIX'
key_name = '$STRIDE_WALLET'
store_prefix = 'ibc'
max_tx_size = 100000
max_gas = 20000000
gas_price = { price = 0.001, denom = '$STRIDE_DENOM' }
gas_adjustment = 0.1
max_msg_num = 15
clock_drift = '5s'
trusting_period = '1days'
memo_prefix='$MEMO_PREFIX'
trust_threshold = { numerator = '1', denominator = '3' }
[[chains]]
id = '$GAIA_CHAIN_ID'
rpc_addr = 'http://$GAIA_RPC:$GAIA_RPC_PORT'
grpc_addr = 'http://$GAIA_RPC:$GAIA_GRPC_PORT'
websocket_addr = 'ws://$GAIA_RPC:$GAIA_RPC_PORT/websocket'
rpc_timeout = '10s'
account_prefix = '$GAIA_ACC_PREFIX'
key_name = '$GAIA_WALLET'
store_prefix = 'ibc'
max_tx_size = 100000
max_gas = 30000000
gas_price = { price = 0.001, denom = '$GAIA_DENOM' }
gas_adjustment = 0.1
max_msg_num = 15
clock_drift = '5s'
trusting_period = '1days'
memo_prefix= '$MEMO_PREFIX'
trust_threshold = { numerator = '1', denominator = '3' }" > $HOME/.hermes/config.toml

Output Result

hermes config validate

By the end of the Relay_setup Section, you must have saved the following

a. RELAYER_NAME

hint: The name parameter (RELAYER_NAME), will be determined by you.
So you can choose a name for the parameter e.g yourname_relayer before starting the section

Go back to the section to continue


6. Connect to Hermes

Restore Wallets to Hermes

Back to content

Add wallet stride

Replace your mnemonic phrase with your stride wallet mnemonic phrase

hermes keys restore $STRIDE_CHAIN_ID -n $STRIDE_WALLET -m "your mnemonic phrase"

Add wallet Gaia

Replace your mnemonic phrase with your Gaia wallet mnemonic phrase

hermes keys restore $GAIA_CHAIN_ID -n $GAIA_WALLET -m "your mnemonic phrase"

Connecting to the Channel

Enter vars channel from output

HERMES_STRIDE_GAIA_CHANNEL_ID="channel-0"
HERMES_GAIA_STRIDE_CHANNEL_ID="channel-0"
echo "
export HERMES_STRIDE_GAIA_CHANNEL_ID=${HERMES_STRIDE_GAIA_CHANNEL_ID}
export HERMES_GAIA_STRIDE_CHANNEL_ID=${HERMES_GAIA_STRIDE_CHANNEL_ID}
" >> $HOME/.bash_profile
source $HOME/.bash_profile

Run the service file

sudo tee /etc/systemd/system/hermesd.service > /dev/null <<EOF
[Unit]
Description=HERMES
After=network.target
[Service]
Type=simple
User=$USER
ExecStart=$(which hermes) start
Restart=on-failure
RestartSec=5
LimitNOFILE=6000
[Install]
WantedBy=multi-user.target
EOF

Restart Hermes and run logs

sudo systemctl daemon-reload
sudo systemctl enable hermesd
sudo systemctl restart hermesd && journalctl -u hermesd -f

Log should look like this:

Launch was successful.

7. Perform a Transaction


Back to content

A. Send tokens to Stride wallet

strided tx ibc-transfer transfer transfer channel-0  YOUR_WALLET_ADDRESS_STRIDE 777ustrd --from=$STRIDE_WALLET --fees 3000ustrd --chain-id $STRIDE_CHAIN_ID

Replace YOUR_WALLET_ADDRESS_STRIDE with your stride wallet Address; it starts with stride....

press y

B. Send tokens to Gaia wallet

gaiad  tx ibc-transfer transfer transfer channel-0 YOUR_WALLET_ADDRESS_GAIA 777uatom --from=wallet --fees 3000uatom --chain-id $STRIDE_CHAIN_ID

Replace YOUR_WALLET_ADDRESS_GAIA with your Gaia wallet Address; it starts with cosmos......

press y

Copy and save this txhash; save as txhash 6B

COMPLETING THE TESTNET TASK

Back to content

Task 6

complete the stake, redeem, and claim flow (including 6hr unbonding)

Before you begin, it's important to see this link

A. Liquid Staking via server teams

Add liquid stake Liquid stake your ATOM on Stride for stATOM.

Replace <Stride_wallet_address> with your Stride wallet address from section 2.

strided tx stakeibc liquid-stake 1000 uatom --from <Stride_wallet_address> --chain-id STRIDE-TESTNET-2

put in your wallet passphrase.

Save the txhash of your transaction

B. Redeem stake

After accruing some staking rewards, you can unstake your tokens. Currently, the unbonding period on our Gaia (Cosmos Hub) testnet is around 30 minutes.

Replace <GAIA wallet address> with your GAIA wallet address from section 3 and <Stride_wallet_address>with your stride wallet address.

strided tx stakeibc redeem-stake 1 GAIA <GAIA wallet address> --chain-id $STRIDE_CHAIN_ID --from <Stride_wallet_address>

put in your wallet passphrase.

Save the txhash of your transaction

C. Check if Token

Replace <Stride_wallet_address> with your stride wallet address

strided q records list-user-redemption-record --limit 10000 --output json | jq '.UserRedemptionRecord | map(select(.sender == "<Stride_wallet_address>"))' 

put in your wallet passphrase.

D. isClaimable

If your record has the attribute isClaimable=true, they're ready to be claimed! Claim tokens After your tokens have unbonded, they can be claimed by triggering the claim process.

strided tx stakeibc claim-undelegated-tokens GAIA "epochNumber" "<Stride_wallet_address>" --chain-id STRIDE-TESTNET-2 --from <GAIA wallet address> -y 

put in your wallet passphrase.

Save the txhash of your transaction


On completing Task 6, you should have saved the following

a. txhash stake
b. txhash redeem
c. txhash undelegate

append your txhash after the https://poolparty.stride.zone/STRIDE/tx/ for all the txhash

example: for a txhash stake = BA20085BA299ED6B9C74F5A66A0E82A9DF8557EFA9FF202E8EE74F9F29B7D3CD

https://poolparty.stride.zone/STRIDE/tx/BA20085BA299ED6B9C74F5A66A0E82A9DF8557EFA9FF202E8EE74F9F29B7D3CD

Please submit evidence you've completed a task using this FORM