Skip to content

Commit f0e44d3

Browse files
authored
chore: add beginner template issue (#1330)
Signed-off-by: exploreriii <[email protected]>
1 parent ab1c569 commit f0e44d3

File tree

4 files changed

+284
-6
lines changed

4 files changed

+284
-6
lines changed
Lines changed: 272 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,272 @@
1+
name: Beginner Issue Template
2+
description: Create a Beginner Issue for fairly new contributors
3+
title: "[Beginner]: "
4+
labels: ["beginner"]
5+
assignees: []
6+
body:
7+
- type: markdown
8+
attributes:
9+
value: |
10+
---
11+
## **Thanks for contributing!** 😊
12+
13+
We truly appreciate your time and effort. If this is your first open-source contribution, welcome!
14+
This template is designed to help you create a Beginner-friendly issue: an easy, well-scoped task that helps new contributors learn the codebase and build their skills.
15+
---
16+
- type: textarea
17+
id: intro
18+
attributes:
19+
label: 🐥 Beginner Friendly
20+
description: Who is this issue for?
21+
value: |
22+
This issue is intended for contributors who have previously completed a Good First Issue in [Hiero](https://hiero.org) and are at a beginner level.
23+
We recognize that gaining confidence and building skills are equally important steps in the open-source contributor journey.
24+
The purpose of this issue—and others listed under [**Find a beginner issue**](https://github.com/hiero-ledger/hiero-sdk-python/issues?q=is%3Aissue%20state%3Aopen%20label%3Abeginner%20no%3Aassignee)—is to provide a supportive, low-pressure environment where you can learn, practice, and grow your contribution skills with confidence.
25+
validations:
26+
required: false
27+
28+
- type: markdown
29+
attributes:
30+
value: |
31+
> [!IMPORTANT]
32+
> ### 🐥 Beginner Issue Guidelines
33+
>
34+
> Beginner Issues are intended for contributors who are familiar with the project workflow and have **some programming experience** and are wanting opportunities to build skills.
35+
> These issues may require **light investigation, interpretation of existing code, and some self-initiative**, but should remain **well-scoped with a clear intent**.
36+
>
37+
> **What we generally consider beginner issues:**
38+
>
39+
> - **Small, well-scoped updates to existing tests**:
40+
> - Adjusting or extending an existing test to cover a simple case
41+
> - **Narrow changes or additions to `src` functionality** using common Python skills, such as:
42+
> - Implementing or refining `__str__` methods
43+
> - Implementing or refining `__repr__` methods
44+
> - Typing improvements, such as return type hints or basic type conflicts
45+
> - **Documentation improvements** in examples such as creating new examples or docstrings for existing functions
46+
> - **Functional improvements to existing examples**:
47+
> - Adding steps or variations to better demonstrate functionality
48+
>
49+
> **What we generally do NOT consider beginner issues:**
50+
> - Tasks better suited for Good First Issues (purely mechanical or fully guided changes)
51+
> - Creating entirely new examples or test suites
52+
> - Changes to core DLT functionality (for example, `to_proto` or `from_proto`)
53+
> - Work that requires deep knowledge across multiple areas of the codebase
54+
55+
> 📖 *For a more detailed explanation, refer to:
56+
> [`docs/maintainers/beginner_issue_guidelines.md`](docs/maintainers/beginner_issue_guidelines.md).*
57+
58+
- type: textarea
59+
id: issue
60+
attributes:
61+
label: 👾 Description of the issue
62+
description: |
63+
DESCRIBE THE ISSUE IN A WAY THAT IS UNDERSTANDABLE TO NEW CONTRIBUTORS.
64+
YOU MUST NOT ASSUME THAT SUCH CONTRIBUTORS HAVE ANY KNOWLEDGE ABOUT THE CODEBASE OR HIERO.
65+
IT IS HELPFUL TO ADD LINKS TO THE RELEVANT DOCUMENTATION AND/OR CODE SECTIONS.
66+
BELOW IS AN EXAMPLE.
67+
value: |
68+
Edit here. Example provided below.
69+
70+
validations:
71+
required: true
72+
73+
- type: markdown
74+
attributes:
75+
value: |
76+
<!-- Example for problem (hidden in submission) -->
77+
## 👾 Description of the issue - Example
78+
79+
The example for Token Associate Transaction located at examples/tokens/token_associate_transaction.py can be improved. It correctly illustrates how to associate a token, however, it does so all from one function main()
80+
81+
As everything is grouped together in main(), it is difficult for a user to understand all the individual steps required to associate a token.
82+
83+
For example:
84+
```python
85+
86+
def run_demo():
87+
"""Monolithic token association demo."""
88+
print(f"🚀 Connecting to Hedera {network_name} network!")
89+
client = Client(Network(network_name))
90+
operator_id = AccountId.from_string(os.getenv("OPERATOR_ID", ""))
91+
operator_key = PrivateKey.from_string(os.getenv("OPERATOR_KEY", ""))
92+
client.set_operator(operator_id, operator_key)
93+
print(f"✅ Client ready (operator {operator_id})")
94+
95+
test_key = PrivateKey.generate_ed25519()
96+
receipt = (
97+
AccountCreateTransaction()
98+
.set_key(test_key.public_key())
99+
.set_initial_balance(Hbar(1))
100+
.set_account_memo("Test account for token association demo")
101+
.freeze_with(client)
102+
.sign(operator_key)
103+
.execute(client)
104+
)
105+
if receipt.status != ResponseCode.SUCCESS:
106+
raise Exception(receipt.status)
107+
account_id = receipt.account_id
108+
print(f"✅ Created test account {account_id}")
109+
110+
# Create tokens
111+
tokens = []
112+
for i in range(3):
113+
try:
114+
receipt = (
115+
TokenCreateTransaction()
116+
.set_token_name(f"DemoToken{i}")
117+
.set_token_symbol(f"DTK{i}")
118+
.set_decimals(2)
119+
.set_initial_supply(100_000)
120+
.set_treasury_account_id(operator_id)
121+
.freeze_with(client)
122+
.sign(operator_key)
123+
.execute(client)
124+
)
125+
if receipt.status != ResponseCode.SUCCESS:
126+
raise Exception(receipt.status)
127+
token_id = receipt.token_id
128+
tokens.append(token_id)
129+
print(f"✅ Created token {token_id}")
130+
except Exception as e:
131+
print(f"❌ Token creation failed: {e}")
132+
sys.exit(1)
133+
134+
# Associate first token
135+
try:
136+
TokenAssociateTransaction().set_account_id(account_id).add_token_id(tokens[0]).freeze_with(client).sign(test_key).execute(client)
137+
print(f"✅ Token {tokens[0]} associated with account {account_id}")
138+
except Exception as e:
139+
print(f"❌ Token association failed: {e}")
140+
sys.exit(1)
141+
```
142+
143+
- type: textarea
144+
id: solution
145+
attributes:
146+
label: 💡 Proposed Solution
147+
description: |
148+
AT THIS SECTION YOU NEED TO DESCRIBE THE STEPS NEEDED TO SOLVE THE ISSUE.
149+
PLEASE BREAK DOWN THE STEPS AS MUCH AS POSSIBLE AND MAKE SURE THAT THEY
150+
ARE EASY TO FOLLOW. IF POSSIBLE, ADD LINKS TO THE RELEVANT
151+
DOCUMENTATION AND/OR CODE SECTIONS.
152+
value: |
153+
Edit here. Example provided below.
154+
155+
validations:
156+
required: true
157+
158+
- type: markdown
159+
attributes:
160+
value: |
161+
<!-- Example for the solution (hidden in submission) -->
162+
## 💡 Solution - Example
163+
164+
For the TokenAssociateTransaction example, the solution is to split the monolithic main() function for illustrating TokenAssociateTransaction into separate smaller functions which are called from main().
165+
Such as:
166+
- Setting up the client
167+
- Creating an account
168+
- Creating a token
169+
- Associating the account to the token
170+
171+
- type: textarea
172+
id: implementation
173+
attributes:
174+
label: 👩‍💻 Implementation Steps
175+
description: |
176+
AT THIS SECTION YOU NEED TO DESCRIBE THE TECHNICAL STEPS NEEDED TO SOLVE THE ISSUE.
177+
PLEASE BREAK DOWN THE STEPS AS MUCH AS POSSIBLE AND MAKE SURE THAT THEY ARE EASY TO FOLLOW.
178+
IF POSSIBLE, ADD LINKS TO THE RELEVANT DOCUMENTATION AND/OR CODE.
179+
value: |
180+
Edit here. Example provided below.
181+
182+
validations:
183+
required: true
184+
185+
- type: markdown
186+
attributes:
187+
value: |
188+
<!-- Example implementation (hidden in submission) -->
189+
### 👩‍💻 Implementation - Example
190+
191+
To break down the monolithic main function, you need to:
192+
- [ ] Extract the Key Steps (set up a client, create a test account, create a token, associate the token)
193+
- [ ] Copy and paste the functionality for each key step into its own function
194+
- [ ] Pass to each function the variables you need to run it
195+
- [ ] Call each function in main()
196+
- [ ] Ensure you return the values you'll need to pass on to the next step in main
197+
- [ ] Ensure the example still runs and has the same output!
198+
199+
For example:
200+
```python
201+
202+
def setup_client():
203+
"""Initialize and set up the client with operator account."""
204+
205+
def create_test_account(client, operator_key):
206+
"""Create a new test account for demonstration."""
207+
208+
def create_fungible_token(client, operator_id, operator_key):
209+
"""Create a fungible token for association with test account."""
210+
211+
def associate_token_with_account(client, token_id, account_id, account_key):
212+
"""Associate the token with the test account."""
213+
214+
def main():
215+
client, operator_id, operator_key = setup_client()
216+
account_id, account_private_key = create_test_account(client, operator_key)
217+
token_id = create_fungible_token(client, operator_id, operator_key)
218+
associate_token_with_account(client, token_id, account_id, account_private_key)
219+
```
220+
221+
- type: textarea
222+
id: acceptance-criteria
223+
attributes:
224+
label: ✅ Acceptance Criteria
225+
description: |
226+
EDIT OR EXPAND THE CHECKLIST ON WHAT IS REQUIRED TO BE ABLE TO MERGE A PULL REQUEST FOR THIS ISSUE
227+
value: |
228+
To be able to merge a pull request for this issue, we need:
229+
- [ ] **Assignment:** You must be assigned to the issue, comment: `/assign` in the issue to get assigned [see guide](https://github.com/hiero-ledger/hiero-sdk-python/blob/main/docs/sdk_developers/training/workflow/04_assigning_issues.md)
230+
- [ ] **Changelog Entry:** Correct changelog entry [see guide](https://github.com/hiero-ledger/hiero-sdk-python/blob/main/docs/sdk_developers/changelog_entry.md)
231+
- [ ] **Signed commits:** commits must be DCO and GPG key signed [see guide](https://github.com/hiero-ledger/hiero-sdk-python/blob/main/docs/sdk_developers/signing.md)
232+
- [ ] **All Tests Pass:** our workflow checks like unit and integration tests must pass
233+
- [ ] **Issue is Solved:** The implementation fully addresses the issue requirements as described above
234+
- [ ] **No Further Changes are Made:** Code review feedback has been addressed and no further changes are requested
235+
validations:
236+
required: true
237+
238+
- type: textarea
239+
id: contribution_steps
240+
attributes:
241+
label: 📋 Step-by-Step Contribution Guide
242+
description: Provide a contribution workflow suitable for new contributors
243+
value: |
244+
If you have never contributed to an open source project at GitHub, the following step-by-step guide will introduce you to the workflow.
245+
246+
- [ ] **Assignment:** You must be assigned to the issue, comment: `/assign` in the issue to get assigned [see guide](https://github.com/hiero-ledger/hiero-sdk-python/blob/main/docs/sdk_developers/training/workflow/04_assigning_issues.md)
247+
- [ ] **Fork, Branch and Work on the issue:** Create a copy of the repository, create a branch for the issue and solve the problem. For instructions, please read our [Contributing guide](https://github.com/hiero-ledger/hiero-sdk-python/blob/main/CONTRIBUTING.md) file. Further help can be found at [Set-up Training](https://github.com/hiero-ledger/hiero-sdk-python/tree/main/docs/sdk_developers/training/setup) and [Workflow Training](https://github.com/hiero-ledger/hiero-sdk-python/tree/main/docs/sdk_developers/training/workflow).
248+
- [ ] **DCO and GPG key sign each commit :** each commit must be -s and -S signed. An explanation on how to do this is at [Signing Guide](https://github.com/hiero-ledger/hiero-sdk-python/blob/main/docs/sdk_developers/signing.md)
249+
- [ ] **Add a Changelog Entry :** your pull request will require a changelog. Read [Changelog Entry Guide](https://github.com/hiero-ledger/hiero-sdk-python/blob/main/docs/sdk_developers/changelog_entry.md) to learn how.
250+
- [ ] **Push and Create a Pull Request :** Once your issue is resolved, and your commits are signed, and you have a changelog entry, push your changes and create a pull request. Detailed instructions can be found at [Submit PR Training](https://github.com/hiero-ledger/hiero-sdk-python/blob/main/docs/sdk_developers/training/workflow/11_submit_pull_request.md), part of [Workflow Training](https://github.com/hiero-ledger/hiero-sdk-python/tree/main/docs/sdk_developers/training/workflow).
251+
- [ ] **You did it 🎉:** A maintainer or committer will review your pull request and provide feedback. If approved, we will merge the fix in the main branch. Thanks for being part of the Hiero community as an open-source contributor ❤️
252+
253+
***IMPORTANT*** You will ONLY be assigned to the issue if you comment: `/assign`
254+
***IMPORTANT*** Your pull request CANNOT BE MERGED until you add a changelog entry AND sign your commits each with `git commit -S -s -m "chore: your commit message"` with a GPG key setup.
255+
validations:
256+
required: true
257+
258+
- type: textarea
259+
id: information
260+
attributes:
261+
label: 🤔 Additional Information
262+
description: Provide any extra resources or context for contributors to solve this beginner issue
263+
value: |
264+
For more help, we have extensive documentation:
265+
- [SDK Developer Docs](https://github.com/hiero-ledger/hiero-sdk-python/tree/main/docs/sdk_developers)
266+
- [SDK Developer Training](https://github.com/hiero-ledger/hiero-sdk-python/tree/main/docs/sdk_developers/training)
267+
268+
Additionally, we invite you to join our community on our [Discord](https://github.com/hiero-ledger/hiero-sdk-python/blob/main/docs/discord.md) server.
269+
270+
We also invite you to attend each Wednesday, 2pm UTC our [Python SDK Office Hour and Community Calls](https://zoom-lfx.platform.linuxfoundation.org/meetings/hiero?view=week). The Python SDK Office hour is for hands-on-help and the Community Call for general community discussion.
271+
272+
You can also ask for help in a comment below!

.github/ISSUE_TEMPLATE/05_intermediate_issue.yml renamed to .github/ISSUE_TEMPLATE/06_intermediate_issue.yml

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,31 @@ body:
1414
We truly appreciate your time and effort.
1515
This template is designed to help you create an Intermediate issue.
1616
17+
⚠️ **Important:**
18+
Intermediate contributors are still building **conceptual awareness and responsibility skills**.
19+
Issues created using this template **must be selected and framed carefully** to avoid breaking
20+
changes or unintended behavior.
21+
1722
The goal is to create an issue for users that have:
18-
- basic familiarity with the Hiero Python SDK codebase
23+
- familiarity with the Hiero Python SDK codebase
1924
- experience following our contribution workflow
2025
- confidence navigating existing source code and examples
2126
---
2227
2328
- type: textarea
2429
id: intro
2530
attributes:
26-
label: 🧩 Intermediate Contributors
31+
label: 🛠️ Intermediate Contributors
2732
description: Who is this issue for?
2833
value: |
2934
This issue is intended for contributors who already have some familiarity with the
3035
[Hiero Python SDK](https://hiero.org) codebase and contribution workflow.
31-
36+
3237
You should feel comfortable:
3338
- navigating existing source code and examples
3439
- understanding SDK concepts without step-by-step guidance
3540
- following the standard PR workflow without additional onboarding
36-
41+
3742
If this is your very first contribution to the project, we recommend starting with a few
3843
**Good First Issues** before working on this one.
3944
validations:
@@ -53,6 +58,7 @@ body:
5358
> - May involve **refactors or small feature additions**
5459
> - Provides **enough documentation or examples** to reason about a solution
5560
> - Often has **similar patterns elsewhere in the codebase**
61+
> - Involves unit and integration testing
5662
>
5763
> **What this issue is NOT:**
5864
> - A beginner-friendly onboarding task
@@ -85,7 +91,7 @@ body:
8591
attributes:
8692
value: |
8793
<!-- Example for Problem (hidden in submission) -->
88-
## 🐞 Problem – Example
94+
## 📌 Problem – Example
8995
9096
The `TransactionGetReceiptQuery` currently exposes the `get_children()` method,
9197
but the behavior is inconsistent with how child receipts are returned by the Mirror Node.
File renamed without changes.

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ This changelog is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.
3333
- Added unit tests for `SubscriptionHandle` class covering cancellation state, thread management, and join operations.
3434
- Refactored `account_create_transaction_create_with_alias.py` example by splitting monolithic function into modular functions: `generate_main_and_alias_keys()`, `create_account_with_ecdsa_alias()`, `fetch_account_info()`, `print_account_summary()` (#1016)
3535
- Added `.github/workflows/bot-pr-auto-draft-on-changes.yml` to automatically convert PRs to draft and notify authors when reviewers request changes.
36-
-
36+
- Add beginner issue template
3737
- Modularized `transfer_transaction_fungible` example by introducing `account_balance_query()` & `transfer_transaction()`.Renamed `transfer_tokens()``main()`
3838
- Phase 2 of the inactivity-unassign bot: Automatically detects stale open pull requests (no commit activity for 21+ days), comments with a helpful InactivityBot message, closes the stale PR, and unassigns the contributor from the linked issue.
3939
- Added `__str__()` to CustomFixedFee and updated examples and tests accordingly.

0 commit comments

Comments
 (0)