Skip to content

Commit

Permalink
Merge pull request #296 from InjectiveLabs/fix/update_creation_msg_li…
Browse files Browse the repository at this point in the history
…quidate_position

fix/update_creation_msg_liquidate_position
  • Loading branch information
aarmoa authored Jan 18, 2024
2 parents 1ef9948 + 1606c4e commit 6c47732
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 3 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

All notable changes to this project will be documented in this file.

## [1.1.1] - 2024-01-18
### Changed
- Updated the logic to create a `MsgLiquidatePosition` message

## [1.1.0] - 2024-01-15
### Added
- Added new functions in all Market classes to convert values from extended chain format (the ones provided by chain streams) into human-readable format
Expand Down
101 changes: 101 additions & 0 deletions examples/chain_client/77_MsgLiquidatePosition.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import asyncio
import uuid

from grpc import RpcError

from pyinjective.async_client import AsyncClient
from pyinjective.constant import GAS_FEE_BUFFER_AMOUNT, GAS_PRICE
from pyinjective.core.network import Network
from pyinjective.transaction import Transaction
from pyinjective.wallet import PrivateKey


async def main() -> None:
# select network: local, testnet, mainnet
network = Network.testnet()

# initialize grpc client
client = AsyncClient(network)
composer = await client.composer()
await client.sync_timeout_height()

# load account
priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3")
pub_key = priv_key.to_public_key()
address = pub_key.to_address()
await client.fetch_account(address.to_acc_bech32())
subaccount_id = address.get_subaccount_id(index=0)

# prepare trade info
market_id = "0x17ef48032cb24375ba7c2e39f384e56433bcab20cbee9a7357e4cba2eb00abe6"
fee_recipient = "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r"
cid = str(uuid.uuid4())

order = composer.DerivativeOrder(
market_id=market_id,
subaccount_id=subaccount_id,
fee_recipient=fee_recipient,
price=39.01, # This should be the liquidation price
quantity=0.147,
leverage=1,
cid=cid,
is_buy=False,
)

# prepare tx msg
msg = composer.MsgLiquidatePosition(
sender=address.to_acc_bech32(),
subaccount_id="0x156df4d5bc8e7dd9191433e54bd6a11eeb390921000000000000000000000000",
market_id=market_id,
order=order,
)

# build sim tx
tx = (
Transaction()
.with_messages(msg)
.with_sequence(client.get_sequence())
.with_account_num(client.get_number())
.with_chain_id(network.chain_id)
)
sim_sign_doc = tx.get_sign_doc(pub_key)
sim_sig = priv_key.sign(sim_sign_doc.SerializeToString())
sim_tx_raw_bytes = tx.get_tx_data(sim_sig, pub_key)

# simulate tx
try:
sim_res = await client.simulate(sim_tx_raw_bytes)
except RpcError as ex:
print(ex)
return

sim_res_msg = sim_res["result"]["msgResponses"]
print("---Simulation Response---")
print(sim_res_msg)

# build tx
gas_price = GAS_PRICE
gas_limit = int(sim_res["gasInfo"]["gasUsed"]) + GAS_FEE_BUFFER_AMOUNT # add buffer for gas fee computation
gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0")
fee = [
composer.Coin(
amount=gas_price * gas_limit,
denom=network.fee_denom,
)
]
tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height)
sign_doc = tx.get_sign_doc(pub_key)
sig = priv_key.sign(sign_doc.SerializeToString())
tx_raw_bytes = tx.get_tx_data(sig, pub_key)

# broadcast tx: send_tx_async_mode, send_tx_sync_mode, send_tx_block_mode
res = await client.broadcast_tx_sync_mode(tx_raw_bytes)
print("---Transaction Response---")
print(res)
print("gas wanted: {}".format(gas_limit))
print("gas fee: {} INJ".format(gas_fee))
print(f"\n\ncid: {cid}")


if __name__ == "__main__":
asyncio.get_event_loop().run_until_complete(main())
10 changes: 8 additions & 2 deletions pyinjective/composer.py
Original file line number Diff line number Diff line change
Expand Up @@ -671,9 +671,15 @@ def MsgBatchUpdateOrders(self, sender: str, **kwargs):
binary_options_orders_to_create=kwargs.get("binary_options_orders_to_create"),
)

def MsgLiquidatePosition(self, sender: str, subaccount_id: str, market_id: str):
def MsgLiquidatePosition(
self,
sender: str,
subaccount_id: str,
market_id: str,
order: Optional[injective_dot_exchange_dot_v1beta1_dot_exchange__pb2.DerivativeOrder] = None,
):
return injective_exchange_tx_pb.MsgLiquidatePosition(
sender=sender, subaccount_id=subaccount_id, market_id=market_id
sender=sender, subaccount_id=subaccount_id, market_id=market_id, order=order
)

def MsgIncreasePositionMargin(
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "injective-py"
version = "1.1.0"
version = "1.1.1"
description = "Injective Python SDK, with Exchange API Client"
authors = ["Injective Labs <[email protected]>"]
license = "Apache-2.0"
Expand Down

0 comments on commit 6c47732

Please sign in to comment.