Compare commits

..

No commits in common. "0e691e46af5d3516f64006561f23e6118ee05b4b" and "ef1c242471759eff34f38d60f79b70b725880ee2" have entirely different histories.

View File

@ -20,15 +20,12 @@ contract RaidGeld is ERC20, Ownable, Constants {
uint256 public BUY_IN_DAO_TOKEN_AMOUNT;
uint256 public constant INITIAL_GELD = 50 * MANTISSA;
uint256 public constant SACRIFICE_SHARE = 1e3; // 10%
uint256 public constant SESSION_WALLET_FUNDING_CAP = 0.001 ether;
mapping(address => Player) private players;
mapping(address => Army) private armies;
mapping(address => Boss) private bosses;
mapping(address => LastBossResult) private lastBossResults;
mapping(address => address) private playerToSessionWallet;
mapping(address => address) private sessionWalletToPlayer;
mapping(address => address) private proposedSessionWallets;
mapping(address => address) private sessionWallets;
// WETH
IWETH public immutable weth = IWETH(WETH);
@ -97,10 +94,10 @@ contract RaidGeld is ERC20, Ownable, Constants {
}
modifier onlyActiveSession() {
address delegatedWallet = playerToSessionWallet[msg.sender];
address delegatedPlayer = sessionWallets[msg.sender];
require(
players[msg.sender].has_active_session ||
players[delegatedWallet].has_active_session, "Session is not active, you need to buy into the game first");
players[delegatedPlayer].has_active_session, "Session is not active, you need to buy into the game first");
_;
}
@ -208,7 +205,9 @@ contract RaidGeld is ERC20, Ownable, Constants {
// Manual minting for itchy fingers
function raid() external onlyActiveSession {
performRaid(_player());
address delegatedPlayer = sessionWallets[msg.sender];
address player = delegatedPlayer == address(0) ? msg.sender : delegatedPlayer;
performRaid(player);
}
// Helper so we can use it when buying units too
@ -248,7 +247,8 @@ contract RaidGeld is ERC20, Ownable, Constants {
// Add a unit to your army
function addUnit(uint8 unit, uint16 n_units) external onlyActiveSession {
address player = _player();
address delegatedPlayer = sessionWallets[msg.sender];
address player = delegatedPlayer == address(0) ? msg.sender : delegatedPlayer;
require(unit <= 3, "Unknown unit");
Army storage army = armies[player];
@ -312,16 +312,15 @@ contract RaidGeld is ERC20, Ownable, Constants {
function battle_with_boss() external onlyActiveSession returns (bool[2] memory hasWonOrAscended) {
// first perform raid
address player = _player();
performRaid(player);
Boss memory boss_to_attack = bosses[player];
performRaid(msg.sender);
Boss memory boss_to_attack = bosses[msg.sender];
// calculate how much the player will put into battle
uint256 geld_to_burn = balanceOf(player) >= RaidGeldUtils.getBossPower(boss_to_attack.level)
uint256 geld_to_burn = balanceOf(msg.sender) >= RaidGeldUtils.getBossPower(boss_to_attack.level)
? RaidGeldUtils.getBossPower(boss_to_attack.level)
: balanceOf(player);
: balanceOf(msg.sender);
bool hasWonBattle = RaidGeldUtils.calculateBossFight(boss_to_attack.level, geld_to_burn, block.prevrandao);
emit BossBattle(player, boss_to_attack.level, hasWonBattle);
lastBossResults[player] = LastBossResult({
emit BossBattle(msg.sender, boss_to_attack.level, hasWonBattle);
lastBossResults[msg.sender] = LastBossResult({
battled_at: block.timestamp,
level: boss_to_attack.level,
variant: boss_to_attack.variants[boss_to_attack.level],
@ -330,7 +329,7 @@ contract RaidGeld is ERC20, Ownable, Constants {
});
if (hasWonBattle) {
// Burn geld, send some sweet DAO Token and continue
_burn(player, geld_to_burn);
_burn(msg.sender, geld_to_burn);
uint256 baseReward = (BUY_IN_DAO_TOKEN_AMOUNT - BUY_IN_DAO_TOKEN_AMOUNT * SACRIFICE_SHARE / MANTISSA);
uint256 wholeReward = RaidGeldUtils.calculateBossReward(boss_to_attack.level, baseReward);
uint256 treasuryShare = wholeReward * SACRIFICE_SHARE / MANTISSA;
@ -338,29 +337,29 @@ contract RaidGeld is ERC20, Ownable, Constants {
// send a share to dao treasury
daoToken.transfer(DAO_TREASURY, treasuryShare);
players[player].total_rewards += reward;
players[msg.sender].total_rewards += reward;
// send user its reward
daoToken.transfer(player, reward);
emit BossDefeated(player, boss_to_attack.level, reward);
daoToken.transfer(msg.sender, reward);
emit BossDefeated(msg.sender, boss_to_attack.level, reward);
lastBossResults[player].reward = reward;
lastBossResults[msg.sender].reward = reward;
if (boss_to_attack.level == 6) {
// User ascends! Moloch is defeated, user can start a new run
players[player].prestige_level += 1;
emit PrestigeGained(player, players[player].prestige_level);
player_dies(player);
lastBossResults[player].prestigeGained = true;
players[msg.sender].prestige_level += 1;
emit PrestigeGained(msg.sender, players[msg.sender].prestige_level);
player_dies(msg.sender);
lastBossResults[msg.sender].prestigeGained = true;
return [hasWonBattle, true /* New prestige level! */ ];
} else {
// else go to next boss
bosses[player].level += 1;
bosses[msg.sender].level += 1;
}
} else {
// Whoops u died, boss defeated you
lastBossResults[player].reward = 0;
player_dies(player);
lastBossResults[msg.sender].reward = 0;
player_dies(msg.sender);
}
return [hasWonBattle, false /* hasnt gotten prestige level */ ];
}
@ -438,30 +437,11 @@ contract RaidGeld is ERC20, Ownable, Constants {
DAO = _dao;
}
function proposeSessionWallet(address _wallet) payable external onlyPlayer {
function approveSessionWallet(address _wallet) payable external onlyPlayer {
require(!isRegistered(_wallet), "Wallet belongs to other player");
require(msg.value <= SESSION_WALLET_FUNDING_CAP, "Too high funding amoount");
require(sessionWalletToPlayer[_wallet] == address(0), "Wallet already in use");
playerToSessionWallet[msg.sender] = _wallet;
sessionWalletToPlayer[_wallet] = msg.sender;
sessionWallets[msg.sender] = _wallet;
payable(_wallet).call{value: msg.value}("");
}
function acceptSessionWallet(address _player) external {
require(proposedSessionWallets[_player] == msg.sender, "Not the proposed session wallet");
sessionWalletToPlayer[msg.sender] = _player;
playerToSessionWallet[_player] = msg.sender;
proposedSessionWallets[msg.sender] = address(0);
}
function fundSessionWallet() payable external {
require(sessionWalletToPlayer[msg.sender] != address(0), "No session wallet found");
require(msg.value <= SESSION_WALLET_FUNDING_CAP, "Too high funding amoount");
payable(sessionWalletToPlayer[msg.sender]).call{value: msg.value}("");
}
function _player() internal view returns (address) {
address delegatedWallet = sessionWalletToPlayer[msg.sender];
return delegatedWallet == address(0) ? msg.sender : delegatedWallet;
}
receive() external payable {
revert("No plain Ether accepted, use register() function to check in :)");