Important
4-Hour Resolution Rule: Once an issue is assigned to you, it must be resolved and a Pull Request submitted within 4 hours. If the deadline passes without a PR, the issue will be unassigned and given to another contributor to keep the project moving at speed.
Description
Configure the root Cargo.toml to manage the contracts/rent-escrow contract as a workspace member.
Requirements
- Must include
[workspace]section. - Must list
contracts/rent-escrowinmembers.
Acceptance Criteria
cargo checkat the root recognizes the contract member.
Files to Create/Modify
Cargo.toml(Modify)
Test Requirements
- N/A (Build check only)
Description
Add build profiles to contracts/rent-escrow/Cargo.toml to optimize the contract for size and production safety.
Requirements
- Add
[profile.release]withopt-level = "z". - Add
panic = "abort"andlto = true.
Acceptance Criteria
- Contract compiles to a smaller
.wasmfile after release build.
Files to Create/Modify
contracts/rent-escrow/Cargo.toml(Modify)
Test Requirements
- N/A
Description
Implement the RentEscrow struct with the #[contract] attribute.
Requirements
- Use
soroban_sdk::contract. - Struct must be empty for now.
Acceptance Criteria
- Struct
RentEscrowis defined inlib.rs.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A
Description
Ensure the contract environment is properly set to #![no_std].
Requirements
- Use
#![no_std]at the top of the crate.
Acceptance Criteria
- Contract builds for the
wasm32-unknown-unknowntarget.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A
Description
Create a basic test.rs file that can register the contract in a test environment.
Requirements
- Use
#[cfg(test)]. - Use
env.register_contract(None, RentEscrow).
Acceptance Criteria
cargo testruns without errors.
Files to Create/Modify
contracts/rent-escrow/src/test.rs(Create)contracts/rent-escrow/src/lib.rs(Modify to includemod test;)
Test Requirements
- At least one passing dummy test.
Description
Add AlreadyInitialized and NotInitialized variants to a #[contracterror] enum.
Requirements
- Define
pub enum Error. - Assign unique integer codes to variants.
Acceptance Criteria
- Enum compiles in
lib.rs.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A
Description
Add InvalidAmount and InsufficientFunding to the Error enum.
Requirements
- Unique naming and codes.
Acceptance Criteria
- Errors can be used in
Resultreturns.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A
Description
Add Unauthorized and Expired variants to the Error enum.
Requirements
- Unique codes.
Acceptance Criteria
- Errors are defined and mapped.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A
Description
Define const DAY_IN_LEDGERS: u32 = 17280 for time-based logic.
Requirements
- Use accurate approximation for 5-second ledger times.
Acceptance Criteria
- Constant is available for contract use.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A
Description
Define const MIN_RENT: i128 = 100 to prevent micro-escrow spam.
Requirements
- Amount should be in stroops/token-units.
Acceptance Criteria
- Constant is enforced in future logic.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A
Description
Add Landlord and RentAmount keys to the DataKey enum.
Requirements
- Use
#[contracttype].
Acceptance Criteria
- Enum works with storage accessors.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A
Description
Add Shares and Contributions keys to the DataKey enum.
Requirements
- Used for mapping roommate addresses.
Acceptance Criteria
- Keys are ready for
Mapstorage.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A
Description
Add Deadline and RentToken keys to the DataKey enum.
Requirements
- Consistent naming.
Acceptance Criteria
- Keys are ready for persistence.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A
Description
Create a RoommateState struct with expected and paid fields.
Requirements
- Use
i128for amounts. - Derive
CloneandDebug.
Acceptance Criteria
- Struct is marked with
#[contracttype].
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A
Description
Create a Status enum (Open, Funded, Released, Refunded).
Requirements
- Map to simple integers for storage efficiency.
Acceptance Criteria
- Enum is marked with
#[contracttype].
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A
Description
Define the public initialize function signature with correct arguments.
Requirements
- Function within
#[contractimpl]block.
Acceptance Criteria
- Accepts
landlord,total,deadline, andtoken_address.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A
Description
Add logic to verify the landlord address is not the contract itself.
Requirements
- Compare
landlordwithenv.current_contract_address().
Acceptance Criteria
- Reverts if check fails.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Test passing an invalid address reverts.
Description
Logic to ensure the total_rent is greater than MIN_RENT.
Requirements
- Check against constant from Issue #10.
Acceptance Criteria
- Fails for small or negative amounts.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Test initializing with 0 rent fails.
Description
Implement the code to save landlord and amount into persistent storage.
Requirements
- Use
env.storage().persistent().
Acceptance Criteria
- State is saved successfully.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A
Description
Write a unit test verifying that initialize sets the state correctly.
Requirements
- Use
env.storage().persistent().get.
Acceptance Criteria
- Test passes
cargo test.
Files to Create/Modify
contracts/rent-escrow/src/test.rs(Modify)
Test Requirements
- Verify
landlordequal to inputlandlord.
Description
Implement function for the landlord to add roommate addresses and shares.
Requirements
- Callable by landlord.
- Input:
user: Address, share: i128.
Acceptance Criteria
- Only callable by the landlord address.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Test non-landlord call fails.
Description
Ensure the sum of roommate shares does not exceed total_rent.
Requirements
- Keep running total or check sum.
Acceptance Criteria
- Reverts if math is incorrect.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Test adding shares above total fails.
Description
Implement fn get_landlord(e: Env) -> Address.
Requirements
- Read from persistent storage.
Acceptance Criteria
- Returns correct address.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Verify output matches initial landlord.
Description
Implement fn get_total(e: Env) -> i128.
Requirements
- Read from persistent storage.
Acceptance Criteria
- Returns correct amount.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Verify output matches initial amount.
Description
Implement fn get_deadline(e: Env) -> u64.
Requirements
- Read from persistent storage.
Acceptance Criteria
- Returns correct timestamp.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Verify output matches initial deadline.
Description
Define the public contribute(from: Address, amount: i128) function.
Requirements
- Use
require_auth().
Acceptance Criteria
- Properly marked with
require_auth().
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A
Description
Logic to verify the caller is actually a registered roommate.
Requirements
- Check if key exists in roommate map.
Acceptance Criteria
- Reverts for unauthorized accounts.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Test stranger call fails.
Description
Implement the token::Client transfer from user to contract.
Requirements
- Use
token::Client::new(&e, &token_addr).
Acceptance Criteria
- Tokens move successfully on-chain.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Verify contract balance increment.
Description
Increment the paid field in the roommate's contribution map.
Requirements
- Update
RoommateState.
Acceptance Criteria
- State reflects the new deposit.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Verify
get_balanceoutput.
Description
Emit an event including the roommate and amount deposited.
Requirements
- Use
env.events().publish.
Acceptance Criteria
- Event appears in transaction logs.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Verify event in test logs.
Description
Helper to sum all current roommate contributions.
Requirements
- Iterative loop or cached total.
Acceptance Criteria
- Correctly identifies if the goal is met.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Logic check for different states.
Description
Ensure release() only works if is_fully_funded is true.
Requirements
- Guard check at start of function.
Acceptance Criteria
- prevents premature payout.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Test calling
releasewhile underfunded fails.
Description
Logic to move the full contract balance to the landlord.
Requirements
- Use
token_client.transfer.
Acceptance Criteria
- Landlord receives funds.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Verify landlord balance increment.
Description
Publish event when the total rent is paid out.
Requirements
- Include amount.
Acceptance Criteria
- Event shows full funding was achieved.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Verify event metadata.
Description
End-to-end test: init -> contribute x3 -> release.
Requirements
- Full multi-user simulation.
Acceptance Criteria
- Full cycle completes successfully.
Files to Create/Modify
contracts/rent-escrow/src/test.rs(Modify)
Test Requirements
- All steps pass.
Description
Implement function for individual roommates to reclaim deposits.
Requirements
- Check caller auth.
Acceptance Criteria
- Enforces
require_auth().
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A
Description
Ensure refunds are only available after the deadline.
Requirements
- Use
env.ledger().timestamp().
Acceptance Criteria
- Reverts if called too early.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Test calling refund before deadline fails.
Description
Transfer the roommate's paid amount back to them.
Requirements
token_client.transfer.
Acceptance Criteria
- User receives their money back.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Verify roommate balance reset.
Description
Set the roommate's paid balance to 0 after refund.
Requirements
- Prevents re-entrancy / double refund.
Acceptance Criteria
- map updated correctly.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- Verify second call fails with 0 balance error.
Description
implement persistent storage TTL extension so the agreement doesn't expire.
Requirements
- Use
env.storage().persistent().extend_ttl.
Acceptance Criteria
- Storage state is preserved.
Files to Create/Modify
contracts/rent-escrow/src/lib.rs(Modify)
Test Requirements
- N/A