Skip to content

Commit

Permalink
add permit2 token transfer functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
lorbke committed Nov 16, 2024
1 parent c3c3924 commit 22573b2
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 13 deletions.
25 changes: 13 additions & 12 deletions packages/foundry/contracts/HumanOracleWithVault.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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;


// ====================
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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);
}

Expand All @@ -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;
}
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion packages/foundry/test/HumanOracleWithVault.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 22573b2

Please sign in to comment.