非 ERC20 代币流动性证明集成
介绍
方案描述
先决条件
Forge设置
forge init pol-smart-stake --no-commit --no-git;
cd pol-smart-stake;
forge install OpenZeppelin/openzeppelin-contracts --no-commit --no-git;合约执行
测试集成
运行测试
最后更新于
forge init pol-smart-stake --no-commit --no-git;
cd pol-smart-stake;
forge install OpenZeppelin/openzeppelin-contracts --no-commit --no-git;最后更新于
# FROM: ./pol-smart-stake
echo "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/" > remappings.txt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract StakingToken is ERC20, Ownable {
constructor() ERC20("StakingToken", "STK") Ownable(msg.sender) {}
function mint(address to, uint256 amount) external onlyOwner {
_mint(to, amount);
}
function burn(address from, uint256 amount) external onlyOwner {
_burn(from, amount);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "./StakingToken.sol";
import {IBerachainRewardsVault, IBerachainRewardsVaultFactory} from "./interfaces/IRewardVaults.sol";
contract ProtocolContract {
StakingToken public stakingToken;
IBerachainRewardsVault public rewardVault;
mapping(address => uint256) public userActivity;
constructor(address _vaultFactory) {
// Create new staking token
stakingToken = new StakingToken();
// Create vault for newly created token
address vaultAddress = IBerachainRewardsVaultFactory(_vaultFactory)
.createRewardsVault(address(stakingToken));
rewardVault = IBerachainRewardsVault(vaultAddress);
}
function addActivity(address user, uint256 amount) external {
// Protocol actions/logic here
userActivity[user] += amount;
// Mint StakingTokens
stakingToken.mint(address(this), amount);
// Stake tokens in RewardVault on behalf of user
stakingToken.approve(address(rewardVault), amount);
rewardVault.delegateStake(user, amount);
}
function removeActivity(address user, uint256 amount) external {
// Protocol actions/logic here
require(userActivity[user] >= amount, "Insufficient user activity");
userActivity[user] -= amount;
// Withdraw tokens from the RewardVault
rewardVault.delegateWithdraw(user, amount);
// Burn the withdrawn StakingTokens
stakingToken.burn(address(this), amount);
}
}pragma solidity ^0.8.19;
interface IBerachainRewardsVault {
function delegateStake(address account, uint256 amount) external;
function delegateWithdraw(address account, uint256 amount) external;
function getTotalDelegateStaked(
address account
) external view returns (uint256);
function balanceOf(address account) external returns (uint256);
}
interface IBerachainRewardsVaultFactory {
function createRewardsVault(
address stakingToken
) external returns (address);
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "forge-std/Test.sol";
import "../src/ProtocolContract.sol";
import {IBerachainRewardsVault, IBerachainRewardsVaultFactory} from "../src/interfaces/IRewardVaults.sol";
contract ProtocolContractTest is Test {
ProtocolContract public protocol;
IBerachainRewardsVault public rewardVault;
address public user1 = address(0x1);
address public user2 = address(0x2);
function setUp() public {
IBerachainRewardsVaultFactory vaultFactory = IBerachainRewardsVaultFactory(
0x2B6e40f65D82A0cB98795bC7587a71bfa49fBB2B
);
protocol = new ProtocolContract(address(vaultFactory));
rewardVault = protocol.rewardVault();
}
function testAddActivity() public {
protocol.addActivity(user1, 1);
assertEq(protocol.userActivity(user1), 1);
assertEq(rewardVault.balanceOf(user1), 1);
}
function testRemoveActivity() public {
protocol.addActivity(user1, 2);
protocol.removeActivity(user1, 1);
assertEq(protocol.userActivity(user1), 1);
assertEq(rewardVault.balanceOf(user1), 1);
}
function testMultipleUsers() public {
protocol.addActivity(user1, 1);
protocol.addActivity(user2, 2);
assertEq(rewardVault.balanceOf(user1), 1);
assertEq(rewardVault.balanceOf(user2), 2);
}
}# FROM: ./pol-smart-stake
forge test --rpc-url https://bartio.rpc.berachain.com/;
# [Expected Output]:
# [⠊] Compiling...x
# No files changed, compilation skipped
# Ran 3 tests for test/StakingToken.t.sol:ProtocolContractTest
# [PASS] testAddActivity() (gas: 252067)
# [PASS] testMultipleUsers() (gas: 371503)
# [PASS] testRemoveActivity() (gas: 272693)
# Suite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.73s (1.22ms CPU time)