|
|
pragma solidity ^0.6.0;
import './verifier.sol';
contract Miksi { Verifier verifier;
constructor( address _verifierContractAddr) public { verifier = Verifier(_verifierContractAddr); }
mapping(uint256 => Deposit) deposits;
struct Deposit { uint256 coinCode; uint256 amount; bool used; }
function deposit( uint256 coinCode, // uint256 amount,
uint256 commitment ) public payable { deposits[commitment] = Deposit(coinCode, msg.value, false); }
function getDeposit( uint256 commitment ) public view returns (uint256, uint256) { return ( deposits[commitment].coinCode, deposits[commitment].amount ); }
function withdraw( uint256 commitment, address payable _address, uint[2] memory a, uint[2][2] memory b, uint[2] memory c ) public {
uint256[4] memory input = [ deposits[commitment].coinCode, deposits[commitment].amount, commitment, uint256(_address) ]; require(verifier.verifyProof(a, b, c, input), "zkProof withdraw could not be verified"); // zk verification passed, proceed with the withdraw
require(!deposits[commitment].used, "deposit already withdrawed"); deposits[commitment].used = true; _address.send(deposits[commitment].amount); // _address.call.value(deposits[commitment].amount).gas(20317)();
} }
|