Examples
Here you'll find some useful code snippets to get started with MosPy
Account
Examples showing the use of the account class
Account creation
from mospy import Account
# Generate a new Account with a new seed phrase
account1 = Account()
# Create an account object through a seed phrase and
# get a sub-account of that seed by passing the address index (optional)
account2 = Account(
seed_phrase="law grab theory better athlete submit awkward hawk state wedding wave monkey audit blame fury wood tag rent furnace exotic jeans drift destroy style",
address_index=12
)
# Instantiate the Account by using a private key and
# set a different address prefix to use another cosmos based chain as well as
# the nex account sequence and account number (example values)
account3 = Account(
private_key="8c2ae3f9c216f714c0a877e7a4952ec03462496e01452bd5ee79ef79d707ff6c",
hrp="osmo",
next_sequence=1,
account_number=187486
)
Transaction
Showcase how to create use the Transaction class
from mospy import Transaction
from cosmospy_protobuf.cosmos.base.v1beta1.coin_pb2 import Coin # Optional
# Create the fee object from the protobufs and pass it when instantiating the Transaction
# or add it later through the set_fee function
fee = Coin(
denom="uatom",
amount="1000"
)
# Create the transaction object by passing the account object from the step above
tx = Transaction(
account=account3,
fee=fee,
gas=1000,
)
# Add a transfer message to the transaction (multiple messages can be added)
tx.add_msg(
tx_type='transfer',
sender=account3,
receipient="cosmos1tkv9rquxr88r7snrg42kxdj9gsnfxxg028kuh9",
amount=1000,
denom="uatom"
)
# Sign and encode transaction to submit it to the network manually
# REST endpoint (RPC or API)
tx_bytes = tx.get_tx_bytes_as_string()
# GRPC
tx_bytes = tx.get_tx_bytes()
Custom Transaction Message
You can easily use every other tx type too. The type_url
usually matches the import path.
# References the tx class from above before signing
from cosmospy_protobuf.cosmos.distribution.v1beta1.tx_pb2 import MsgSetWithdrawAddress
wmsg = MsgSetWithdrawAddress(
delegator_address=account.address,
withdraw_address="newaddresshere"
)
tx.add_raw_msg(wmsg, type_url="/cosmos.distribution.v1beta1.MsgSetWithdrawAddress")
Client
Examples howing the usage of the included clients
from mospy.clients import HTTPClient
# Instantiate a HTTPClient object by passing a custom API endpoint.
# https://api.cosmos.network is chosen if no api provider is provided
client = HTTPClient(
api="https://api.cosmos.interbloc.org"
)
# Update the account object to set the current on chain sequence and account_number
client.load_account_data(account=account)
# Broadcast a transaction
# Note: Do not call 'get_tx_bytes' on the transaction object before
# as it will be signed twice then
hash, code, log = client.broadcast_transaction(transaction=tx)
Ethereum/Ethermint Transaction
Make a transaction on chains using Ethermint like Evmos
from mospy import Transaction
from mospy.clients import HTTPClient
from src.mospy import Account
# As the account query returns a different json than the standard cosmos one evmos won't be compatible with the
# client.load_account() function
account = Account(
seed_phrase="law grab theory better athlete submit awkward hawk state wedding wave monkey audit blame fury wood tag rent furnace exotic jeans drift destroy style",
hrp="evmos",
slip44=60,
eth=True,
next_sequence=1,
account_number=2154050,
)
tx = Transaction(
account=account,
gas=2000000,
memo="The first mospy evmos transaction!",
chain_id="evmos_9001-2",
)
tx.set_fee(
denom="aevmos",
amount=40000000000000000
)
tx.add_msg(
tx_type="transfer",
sender=account,
receipient=account.address,
amount=3500000000000000,
denom="aevmos",
)
client = HTTPClient(api="https://api.evmos.interbloc.org")
tx_response = client.broadcast_transaction(transaction=tx)
Custom Message From Dict
You can add your own messages for unsupported chains by using a dictionary.
account = Account(
seed_phrase="",
hrp='elys'
)
tx = Transaction(
account=account,
chain_id='elystestnet-1',
gas=800000,
)
msg = {
"creator": account.address,
"amount": "1000"
}
tx.add_dict_msg(msg, type_url="/elys.stablestake.MsgBond")
client = HTTPClient(
api="https://api.testnet.elys.network"
)
tx.set_fee(
amount=100,
denom="uelys"
)
client.load_account_data(account=account)
response = client.broadcast_transaction(transaction=tx)