ZKredit.xyz
Documentation
Back to home

ZKredit Demo

Explore how ZKredit enables cross-chain operations with various verification methods.

ZKredit Core Contract

The foundation of ZKredit is a smart contract that handles deposits, withdrawals, and validates operations through a registry of validators.

Deployed at: 0x4d967ae3e0ccb462582b46891d92f0d7efe5e522

Contract Architecture

ZKreditCore implements a robust system for asset handling with validator-based approval flow, ERC-4337 compatibility, and upgradability.

Key Features

  • Deposits for ETH and ERC20 tokens
  • Validator-based approval system
  • ERC-4337 account abstraction integration
  • UUPS upgradable contract architecture

Contract Flow

  1. User deposits assets (ETH or ERC20 tokens)
  2. Assets are locked in the contract
  3. Withdrawal requires validation (user or validator)
  4. Validator evaluates withdrawal requests
  5. Contract completes transfer to recipient

Contract Code

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.29;

contract ZKreditCore is
    IZKreditCore,
    Initializable,
    UUPSUpgradeable,
    OwnableUpgradeable
{
    // Balances mapping (depositor => token => amount)
    mapping(address => mapping(address => uint256)) private _balances;

    // Deposit ETH
    function depositNative(
        address depositor
    ) external payable override whenNotPaused {
        require(
            msg.value > 0,
            "ZKreditCore: deposit amount must be greater than zero"
        );

        // Update balance
        _balances[depositor][address(0)] += msg.value;

        emit Deposited(msg.sender, depositor, address(0), msg.value);
    }

    // Withdraw ETH
    function withdrawNative(
        address depositor,
        uint256 amount,
        address payable recipient,
        bytes calldata validationData
    ) external override nonReentrant whenNotPaused {
        require(
            amount > 0,
            "ZKreditCore: withdraw amount must be greater than zero"
        );
        require(
            _balances[depositor][address(0)] >= amount,
            "ZKreditCore: insufficient balance"
        );

        // Validate withdrawal
        require(
            _validateWithdrawal(
                msg.sender,
                depositor,
                address(0),
                amount,
                validationData
            ),
            "ZKreditCore: withdrawal validation failed"
        );

        // Update balance
        _balances[depositor][address(0)] -= amount;

        // Transfer ETH to recipient
        (bool success, ) = recipient.call{value: amount}("");
        require(success, "ZKreditCore: native transfer failed");

        emit Withdrawn(msg.sender, depositor, address(0), recipient, amount);
    }