Skip to content

Commit 4b4c564

Browse files
authored
feat: add ContractInfoQuery (#242)
* feat: add ContractInfo class Signed-off-by: dosi <[email protected]> * test: add unit tests for ContractInfo Signed-off-by: dosi <[email protected]> * feat: implement ContractInfoQuery class Signed-off-by: dosi <[email protected]> * test: add integration tests for contract info query Signed-off-by: dosi <[email protected]> * test: add unit tests for ContractInfoQuery Signed-off-by: dosi <[email protected]> * docs: add contract info example Signed-off-by: dosi <[email protected]> * docs: add contract info query in examples README Signed-off-by: dosi <[email protected]> * chore: add ContractInfo and ContractInfoQuery to __init__.py Signed-off-by: dosi <[email protected]> * chore: address codacy issue Signed-off-by: dosi <[email protected]> * chore: remove info.admin_key.to_string() because it can cause error Signed-off-by: dosi <[email protected]> * feat: make Simple and Stateful Contracts constructor payable Signed-off-by: dosi <[email protected]> * feat: add contractID ByteSize check in PublicKey._from_proto Signed-off-by: dosi <[email protected]> * test: enhance contract info query integration tests Signed-off-by: dosi <[email protected]> * docs: enhance contract creation with additional fields in example Signed-off-by: dosi <[email protected]> * chore: add auto renew period check in example/integration test Signed-off-by: dosi <[email protected]> * docs: update CHANGELOG Signed-off-by: dosi <[email protected]> --------- Signed-off-by: dosi <[email protected]>
1 parent ce870f6 commit 4b4c564

File tree

14 files changed

+1222
-5
lines changed

14 files changed

+1222
-5
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,16 @@ This changelog is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.
1111
### Added
1212
- Legacy ECDSA DER parse support
1313
- documented private key from_string method behavior
14+
- ContractInfo class
15+
- ContractInfoQuery class
16+
- ContractID check in PublicKey._from_proto() method
1417

1518
### Fixed
1619
- missing ECDSA support in query.py and contract_create_transaction.py (was only creating ED25519 keys)
1720

21+
### Changed
22+
- SimpleContract and StatefulContract constructors to be payable
23+
1824
### Breaking API changes
1925
**We have several camelCase uses that will be deprecated → snake_case** Original aliases will continue to function, with a warning, until the following release.
2026

examples/README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ You can choose either syntax or even mix both styles in your projects.
5555
- [Contract Transactions](#contract-transactions)
5656
- [Creating a Contract](#creating-a-contract)
5757
- [Querying a Contract Call](#querying-a-contract-call)
58+
- [Querying Contract Info](#querying-contract-info)
5859
- [Miscellaneous Queries](#miscellaneous-queries)
5960
- [Querying Transaction Record](#querying-transaction-record)
6061

@@ -1227,6 +1228,25 @@ print(f"Owner: {result_values[1]}")
12271228
# - result.get_bool(3) // fourth return value
12281229
```
12291230

1231+
### Querying Contract Info
1232+
1233+
#### Pythonic Syntax:
1234+
```
1235+
contract_info_query = ContractInfoQuery(contract_id=contract_id)
1236+
contract_info = contract_info_query.execute(client)
1237+
print(contract_info)
1238+
```
1239+
1240+
#### Method Chaining:
1241+
```
1242+
contract_info = (
1243+
ContractInfoQuery()
1244+
.set_contract_id(contract_id)
1245+
.execute(client)
1246+
)
1247+
print(contract_info)
1248+
```
1249+
12301250
## Miscellaneous Queries
12311251

12321252
### Querying Transaction Record
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6080604052348015600e575f5ffd5b50335f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103b28061005b5f395ff3fe608060405260043610610037575f3560e01c806324600fc3146100425780638da5cb5b14610058578063cfae3217146100825761003e565b3661003e57005b5f5ffd5b34801561004d575f5ffd5b506100566100ac565b005b348015610063575f5ffd5b5061006c6101a5565b6040516100799190610245565b60405180910390f35b34801561008d575f5ffd5b506100966101c9565b6040516100a391906102ce565b60405180910390f35b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101319061035e565b60405180910390fd5b5f4790505f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156101a1573d5f5f3e3d5ffd5b5050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606040518060400160405280600d81526020017f48656c6c6f2c20776f726c642100000000000000000000000000000000000000815250905090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61022f82610206565b9050919050565b61023f81610225565b82525050565b5f6020820190506102585f830184610236565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6102a08261025e565b6102aa8185610268565b93506102ba818560208601610278565b6102c381610286565b840191505092915050565b5f6020820190508181035f8301526102e68184610296565b905092915050565b7f4f6e6c7920746865206f776e65722063616e2077697468647261772066756e645f8201527f732e000000000000000000000000000000000000000000000000000000000000602082015250565b5f610348602283610268565b9150610353826102ee565b604082019050919050565b5f6020820190508181035f8301526103758161033c565b905091905056fea264697066735822122041981dd3378eed8013f2c13357fceef3e3526f0a6666969bea32969aae5da24764736f6c634300081e0033
1+
6080604052335f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103b2806100505f395ff3fe608060405260043610610037575f3560e01c806324600fc3146100425780638da5cb5b14610058578063cfae3217146100825761003e565b3661003e57005b5f5ffd5b34801561004d575f5ffd5b506100566100ac565b005b348015610063575f5ffd5b5061006c6101a5565b6040516100799190610245565b60405180910390f35b34801561008d575f5ffd5b506100966101c9565b6040516100a391906102ce565b60405180910390f35b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101319061035e565b60405180910390fd5b5f4790505f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156101a1573d5f5f3e3d5ffd5b5050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606040518060400160405280600d81526020017f48656c6c6f2c20776f726c642100000000000000000000000000000000000000815250905090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61022f82610206565b9050919050565b61023f81610225565b82525050565b5f6020820190506102585f830184610236565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6102a08261025e565b6102aa8185610268565b93506102ba818560208601610278565b6102c381610286565b840191505092915050565b5f6020820190508181035f8301526102e68184610296565b905092915050565b7f4f6e6c7920746865206f776e65722063616e2077697468647261772066756e645f8201527f732e000000000000000000000000000000000000000000000000000000000000602082015250565b5f610348602283610268565b9150610353826102ee565b604082019050919050565b5f6020820190508181035f8301526103758161033c565b905091905056fea2646970667358221220447b4ca6263e05fc8a3c04c000141022b65950a601fddb3057a0673d53426c4764736f6c634300081e0033

examples/contracts/SimpleContract/SimpleContract.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ pragma solidity ^0.8.2;
33
contract SimpleContract {
44
address public owner;
55

6-
constructor() {
6+
constructor() payable {
77
owner = msg.sender;
88
}
99

@@ -18,4 +18,4 @@ contract SimpleContract {
1818
}
1919

2020
receive() external payable {}
21-
}
21+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6080604052348015600e575f5ffd5b5060405161064c38038061064c8339818101604052810190602e919060ab565b805f819055503360015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060d1565b5f5ffd5b5f819050919050565b608d81607d565b81146096575f5ffd5b50565b5f8151905060a5816086565b92915050565b5f6020828403121560bd5760bc6079565b5b5f60c8848285016099565b91505092915050565b61056e806100de5f395ff3fe60806040526004361061004d575f3560e01c806324600fc3146100585780638da5cb5b1461006e5780639a8ac05f14610098578063b32fead5146100c3578063ce6d41de146100eb57610054565b3661005457005b5f5ffd5b348015610063575f5ffd5b5061006c610115565b005b348015610079575f5ffd5b50610082610210565b60405161008f9190610342565b60405180910390f35b3480156100a3575f5ffd5b506100ac610235565b6040516100ba929190610373565b60405180910390f35b3480156100ce575f5ffd5b506100e960048036038101906100e491906103c8565b610263565b005b3480156100f6575f5ffd5b506100ff6102fb565b60405161010c91906103f3565b60405180910390f35b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019b9061048c565b60405180910390fd5b5f47905060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f1935050505015801561020c573d5f5f3e3d5ffd5b5050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f5f5460015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915091509091565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e99061051a565b60405180910390fd5b805f8190555050565b5f5f54905090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61032c82610303565b9050919050565b61033c81610322565b82525050565b5f6020820190506103555f830184610333565b92915050565b5f819050919050565b61036d8161035b565b82525050565b5f6040820190506103865f830185610364565b6103936020830184610333565b9392505050565b5f5ffd5b6103a78161035b565b81146103b1575f5ffd5b50565b5f813590506103c28161039e565b92915050565b5f602082840312156103dd576103dc61039a565b5b5f6103ea848285016103b4565b91505092915050565b5f6020820190506104065f830184610364565b92915050565b5f82825260208201905092915050565b7f4f6e6c7920746865206f776e65722063616e2077697468647261772066756e645f8201527f732e000000000000000000000000000000000000000000000000000000000000602082015250565b5f61047660228361040c565b91506104818261041c565b604082019050919050565b5f6020820190508181035f8301526104a38161046a565b9050919050565b7f4f6e6c7920746865206f776e65722063616e2075706461746520746865206d655f8201527f73736167652e0000000000000000000000000000000000000000000000000000602082015250565b5f61050460268361040c565b915061050f826104aa565b604082019050919050565b5f6020820190508181035f830152610531816104f8565b905091905056fea264697066735822122003072982f4d8c196e9bbefe20ec867d490c540fc791fb106349fa1685cdba0a264736f6c634300081e0033
1+
608060405260405161064138038061064183398181016040528101906023919060a0565b805f819055503360015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060c6565b5f5ffd5b5f819050919050565b6082816072565b8114608b575f5ffd5b50565b5f81519050609a81607b565b92915050565b5f6020828403121560b25760b1606e565b5b5f60bd84828501608e565b91505092915050565b61056e806100d35f395ff3fe60806040526004361061004d575f3560e01c806324600fc3146100585780638da5cb5b1461006e5780639a8ac05f14610098578063b32fead5146100c3578063ce6d41de146100eb57610054565b3661005457005b5f5ffd5b348015610063575f5ffd5b5061006c610115565b005b348015610079575f5ffd5b50610082610210565b60405161008f9190610342565b60405180910390f35b3480156100a3575f5ffd5b506100ac610235565b6040516100ba929190610373565b60405180910390f35b3480156100ce575f5ffd5b506100e960048036038101906100e491906103c8565b610263565b005b3480156100f6575f5ffd5b506100ff6102fb565b60405161010c91906103f3565b60405180910390f35b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019b9061048c565b60405180910390fd5b5f47905060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f1935050505015801561020c573d5f5f3e3d5ffd5b5050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f5f5460015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915091509091565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e99061051a565b60405180910390fd5b805f8190555050565b5f5f54905090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61032c82610303565b9050919050565b61033c81610322565b82525050565b5f6020820190506103555f830184610333565b92915050565b5f819050919050565b61036d8161035b565b82525050565b5f6040820190506103865f830185610364565b6103936020830184610333565b9392505050565b5f5ffd5b6103a78161035b565b81146103b1575f5ffd5b50565b5f813590506103c28161039e565b92915050565b5f602082840312156103dd576103dc61039a565b5b5f6103ea848285016103b4565b91505092915050565b5f6020820190506104065f830184610364565b92915050565b5f82825260208201905092915050565b7f4f6e6c7920746865206f776e65722063616e2077697468647261772066756e645f8201527f732e000000000000000000000000000000000000000000000000000000000000602082015250565b5f61047660228361040c565b91506104818261041c565b604082019050919050565b5f6020820190508181035f8301526104a38161046a565b9050919050565b7f4f6e6c7920746865206f776e65722063616e2075706461746520746865206d655f8201527f73736167652e0000000000000000000000000000000000000000000000000000602082015250565b5f61050460268361040c565b915061050f826104aa565b604082019050919050565b5f6020820190508181035f830152610531816104f8565b905091905056fea264697066735822122088052cc0c583ae9f66f3312d292e53067dd154e5db9d3a78e337e363e2b2b01364736f6c634300081e0033

examples/contracts/StatefulContract/StatefulContract.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ contract StatefulContract {
55

66
address public owner;
77

8-
constructor(bytes32 _msg) {
8+
constructor(bytes32 _msg) payable {
99
message = _msg;
1010
owner = msg.sender;
1111
}

examples/query_contract_info.py

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
"""
2+
Example demonstrating contract info query on the network.
3+
4+
This module shows how to query a contract info on the network by:
5+
1. Setting up a client with operator credentials
6+
2. Creating a file containing contract bytecode
7+
3. Creating a contract using the file
8+
4. Querying the contract info
9+
10+
Usage:
11+
# Due to the way the script is structured, it must be run as a module
12+
# from the project root directory
13+
14+
# Run from the project root directory
15+
python -m examples.query_contract_info
16+
17+
"""
18+
19+
import os
20+
import sys
21+
22+
from dotenv import load_dotenv
23+
24+
from hiero_sdk_python import AccountId, Client, Duration, Network, PrivateKey
25+
from hiero_sdk_python.contract.contract_create_transaction import (
26+
ContractCreateTransaction,
27+
)
28+
from hiero_sdk_python.contract.contract_info_query import ContractInfoQuery
29+
from hiero_sdk_python.file.file_create_transaction import FileCreateTransaction
30+
from hiero_sdk_python.response_code import ResponseCode
31+
32+
# Import the bytecode for a simple smart contract (SimpleContract.sol) that can be deployed
33+
# The contract bytecode is pre-compiled from Solidity source code
34+
from .contracts import SIMPLE_CONTRACT_BYTECODE
35+
36+
load_dotenv()
37+
38+
39+
def setup_client():
40+
"""Initialize and set up the client with operator account"""
41+
network = Network(network="testnet")
42+
client = Client(network)
43+
44+
operator_id = AccountId.from_string(os.getenv("OPERATOR_ID"))
45+
operator_key = PrivateKey.from_string(os.getenv("OPERATOR_KEY"))
46+
client.set_operator(operator_id, operator_key)
47+
48+
return client
49+
50+
51+
def create_contract_file(client):
52+
"""Create a file containing the simple contract bytecode"""
53+
file_receipt = (
54+
FileCreateTransaction()
55+
.set_keys(client.operator_private_key.public_key())
56+
.set_contents(SIMPLE_CONTRACT_BYTECODE)
57+
.set_file_memo("Simple contract bytecode file")
58+
.execute(client)
59+
)
60+
61+
# Check if file creation was successful
62+
if file_receipt.status != ResponseCode.SUCCESS:
63+
print(
64+
f"File creation failed with status: {ResponseCode(file_receipt.status).name}"
65+
)
66+
sys.exit(1)
67+
68+
return file_receipt.file_id
69+
70+
71+
def create_contract(client, file_id):
72+
"""Create a contract using the file"""
73+
receipt = (
74+
ContractCreateTransaction()
75+
.set_admin_key(client.operator_private_key.public_key())
76+
.set_initial_balance(1000) # 1000 tinybars
77+
.set_max_automatic_token_associations(10)
78+
.set_auto_renew_account_id(client.operator_account_id)
79+
.set_auto_renew_period(Duration(seconds=5184000)) # 60 days in seconds
80+
.set_gas(1000000) # 1M gas
81+
.set_bytecode_file_id(file_id)
82+
.set_contract_memo("Simple smart contract")
83+
.execute(client)
84+
)
85+
86+
# Check if contract creation was successful
87+
if receipt.status != ResponseCode.SUCCESS:
88+
print(
89+
f"Contract creation failed with status: {ResponseCode(receipt.status).name}"
90+
)
91+
sys.exit(1)
92+
93+
print(f"Contract created with ID: {receipt.contract_id}")
94+
95+
return receipt.contract_id
96+
97+
98+
def query_contract_info():
99+
"""
100+
Demonstrates querying a contract info by:
101+
1. Setting up client with operator account
102+
2. Creating a file containing contract bytecode
103+
3. Creating a contract using the file
104+
4. Querying the contract info
105+
"""
106+
client = setup_client()
107+
108+
file_id = create_contract_file(client)
109+
110+
contract_id = create_contract(client, file_id)
111+
112+
# Query the contract info
113+
info = ContractInfoQuery().set_contract_id(contract_id).execute(client)
114+
115+
print("\nContract Info:")
116+
print(f"Contract ID: {info.contract_id}")
117+
print(f"Account ID: {info.account_id}")
118+
print(f"Contract Account ID: {info.contract_account_id}")
119+
print(f"Admin Key: {info.admin_key}")
120+
print(f"Auto Renew Account ID: {info.auto_renew_account_id}")
121+
print(f"Contract Memo: {info.contract_memo}")
122+
print(f"Balance: {info.balance}")
123+
print(f"Expiration Time: {info.expiration_time}")
124+
print(f"Is Deleted: {info.is_deleted}")
125+
print(f"Ledger ID: {info.ledger_id}")
126+
print(f"Max Automatic Token Associations: {info.max_automatic_token_associations}")
127+
print(f"Token Relationships: {info.token_relationships}")
128+
129+
130+
if __name__ == "__main__":
131+
query_contract_info()

src/hiero_sdk_python/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,10 @@
9191
# Contract
9292
from .contract.contract_create_transaction import ContractCreateTransaction
9393
from .contract.contract_call_query import ContractCallQuery
94+
from .contract.contract_info_query import ContractInfoQuery
9495
from .contract.contract_function_parameters import ContractFunctionParameters
9596
from .contract.contract_function_result import ContractFunctionResult
97+
from .contract.contract_info import ContractInfo
9698

9799
__all__ = [
98100
# Client
@@ -184,6 +186,8 @@
184186
# Contract
185187
"ContractCreateTransaction",
186188
"ContractCallQuery",
189+
"ContractInfoQuery",
187190
"ContractFunctionParameters",
188191
"ContractFunctionResult",
192+
"ContractInfo"
189193
]

0 commit comments

Comments
 (0)