diff --git a/packages/foundry/contracts/HumanOracleWithVault.sol b/packages/foundry/contracts/HumanOracleWithVault.sol index 63976d1..ff0cba8 100644 --- a/packages/foundry/contracts/HumanOracleWithVault.sol +++ b/packages/foundry/contracts/HumanOracleWithVault.sol @@ -53,6 +53,7 @@ contract HumanOracleWithVault is Permit2Vault { mapping (uint256 => bool) private registeredNullifierHashes; uint256 internal immutable groupId = 1; uint256 internal immutable externalNullifierHash; + IERC20 public worldToken; // ==================== @@ -118,8 +119,9 @@ contract HumanOracleWithVault is Permit2Vault { // === Constructor ==== // ==================== - constructor(address _worldIdAddr, uint256 _groupId, string memory _appId, string memory _action, address _permit, address _owner) Permit2Vault(_permit, _owner) { + constructor(address _worldIdAddr, address _worldTokenAddr, uint256 _groupId, string memory _appId, string memory _action, address _permit, address _owner) Permit2Vault(_permit, _owner) { worldId = IWorldID(_worldIdAddr); + worldToken = IERC20(_worldTokenAddr); groupId = _groupId; externalNullifierHash = abi.encodePacked(abi.encodePacked(_appId).hashToField(), _action).hashToField(); } @@ -154,10 +156,18 @@ contract HumanOracleWithVault is Permit2Vault { emit UserRegistered(userAddr, users[userAddr].nullifierHash, users[userAddr].createdAtBlock); } - function submitVotingDecisionWithStake(uint256 voteId, uint256 answerIndex, uint256 amount) userExists() hasNotVoted(voteId) voteActive(voteId) external { + function submitVotingDecisionWithStake( + uint256 voteId, + uint256 answerIndex, + uint256 amount, + uint256 nonce, + uint256 deadline, + bytes calldata signature + ) userExists() hasNotVoted(voteId) voteActive(voteId) external { require(amount <= 5, "max staking amount is 5"); address userAddr = address(msg.sender); stakeForAnswer(userAddr, voteId, answerIndex, amount); + this.depositERC20(worldToken, amount, nonce, deadline, signature); emit VoteSubmitted(userAddr, voteId, answerIndex, amount); } @@ -166,6 +176,7 @@ contract HumanOracleWithVault is Permit2Vault { require(!hasUserClaimedForVote(userAddr, voteId), "user already claimed"); setUserHasClaimedToTrueForVote(userAddr, voteId); uint256 payout = getStakeResolvedUserAmount(userAddr, voteId); + this.withdrawERC20(worldToken, payout); emit RewardClaimed(userAddr, voteId, payout); return payout; } @@ -256,16 +267,6 @@ contract HumanOracleWithVault is Permit2Vault { return getStakeResolvedUserAmount(userAddr, voteId); } - // function depositERC20( - // IERC20 token, - // uint256 amount, - // uint256 nonce, - // uint256 deadline, - // bytes calldata signature - // ) public { - // Permit2Vault.depositERC20(token, amount, nonce, deadline, signature); - // } - // internal // stake related diff --git a/packages/foundry/test/HumanOracleWithVault.t.sol b/packages/foundry/test/HumanOracleWithVault.t.sol index 3a5cbed..44e6448 100644 --- a/packages/foundry/test/HumanOracleWithVault.t.sol +++ b/packages/foundry/test/HumanOracleWithVault.t.sol @@ -28,7 +28,7 @@ contract HumanOracleWithVaultTest is TestUtils { vm.chainId(1); ownerKey = _randomUint256(); owner = vm.addr(ownerKey); - vault = new HumanOracleWithVault(address(0), 0, string(""), string(""), address(permit2), owner); + vault = new HumanOracleWithVault(address(0), address(token1), 0, string(""), string(""), address(permit2), owner); // Set up unlimited token approvals from the user onto the permit2 contract. vm.prank(owner); token1.approve(address(permit2), type(uint256).max);