arnaucube
arnaucube/miksi-corePublic Self-hosted repository
miksi-core/contracts/Miksi.sol
contracts/Miksi.solRaw
 1pragma solidity ^0.6.0;
 2
 3import './verifier.sol';
 4
 5contract Miksi {
 6  Verifier    verifier;
 7
 8  constructor( address _verifierContractAddr) public {
 9    verifier = Verifier(_verifierContractAddr);
10  }
11
12  mapping(uint256 => Deposit) deposits;
13
14  struct Deposit {
15    uint256 coinCode;
16    uint256 amount;
17    bool used;
18  }
19
20  function deposit(
21            uint256 coinCode,
22            // uint256 amount,
23            uint256 commitment
24  ) public payable {
25    deposits[commitment] = Deposit(coinCode, msg.value, false);
26  }
27
28  function getDeposit(
29            uint256 commitment
30  ) public view returns (uint256, uint256) {
31    return (
32      deposits[commitment].coinCode,
33      deposits[commitment].amount
34    );
35  }
36
37  function withdraw(
38            uint256 commitment,
39            address payable _address,
40            uint[2] memory a,
41            uint[2][2] memory b,
42            uint[2] memory c
43  ) public {
44
45    uint256[4] memory input = [
46      deposits[commitment].coinCode,
47      deposits[commitment].amount,
48      commitment,
49      uint256(_address)
50    ];
51    require(verifier.verifyProof(a, b, c, input), "zkProof withdraw could not be verified");
52    // zk verification passed, proceed with the withdraw
53    require(!deposits[commitment].used, "deposit already withdrawed");
54    deposits[commitment].used = true;
55    _address.send(deposits[commitment].amount);
56    // _address.call.value(deposits[commitment].amount).gas(20317)();
57
58  }
59}