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;
|
|
}
|
|
|
|
function deposit(
|
|
uint256 coinCode,
|
|
uint256 amount,
|
|
uint256 commitment
|
|
) public {
|
|
deposits[commitment] = Deposit(coinCode, amount);
|
|
}
|
|
|
|
function getDeposit(
|
|
uint256 commitment
|
|
) public view returns (uint256, uint256) {
|
|
return (
|
|
deposits[commitment].coinCode,
|
|
deposits[commitment].amount
|
|
);
|
|
}
|
|
|
|
function withdraw(
|
|
uint256 commitment,
|
|
uint[2] memory a,
|
|
uint[2][2] memory b,
|
|
uint[2] memory c
|
|
) public {
|
|
|
|
uint256[3] memory input = [
|
|
deposits[commitment].coinCode,
|
|
deposits[commitment].amount,
|
|
commitment
|
|
];
|
|
require(verifier.verifyProof(a, b, c, input), "zkProof withdraw could not be verified");
|
|
|
|
// zk verification passed, proceed with the withdraw
|
|
}
|
|
}
|