Compare commits
12 Commits
49b7110a6c
...
7a32129f7e
| Author | SHA1 | Date | |
|---|---|---|---|
| 7a32129f7e | |||
| a5f1bc7a57 | |||
| ab43dc31a4 | |||
| 3fdfb2d822 | |||
| 886d86ad07 | |||
| 52cf3b40e3 | |||
| 118b05b41a | |||
| 19932be0a9 | |||
| 8a251a6dd2 | |||
| cefb360792 | |||
| cb12c772ae | |||
| a8cd6a1b5c |
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,3 +1,6 @@
|
|||||||
|
# Address
|
||||||
|
/app/contract_address.ts
|
||||||
|
|
||||||
# Compiler files
|
# Compiler files
|
||||||
cache/
|
cache/
|
||||||
out/
|
out/
|
||||||
|
|||||||
@ -20,6 +20,8 @@ This is so time gets set on the local chain, otherwise you will start at 0 time
|
|||||||
|
|
||||||
#### 3. 2. Point Metamask to Anvil network for local dev
|
#### 3. 2. Point Metamask to Anvil network for local dev
|
||||||
|
|
||||||
|
#### 3. 3. Change `app/contract_address.ts` to match your program address if needed
|
||||||
|
|
||||||
### 4. Local development requires mining blocks by hand
|
### 4. Local development requires mining blocks by hand
|
||||||
|
|
||||||
Call `cast rpc anvil_mine` to mine next block, otherwise it wont ever progress and time "stands still" as far as the game is concerned
|
Call `cast rpc anvil_mine` to mine next block, otherwise it wont ever progress and time "stands still" as far as the game is concerned
|
||||||
|
|||||||
5
app/.gitignore
vendored
5
app/.gitignore
vendored
@ -1,4 +1,7 @@
|
|||||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files
|
||||||
|
|
||||||
|
# address
|
||||||
|
contract_address.ts
|
||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
/node_modules
|
/node_modules
|
||||||
|
|||||||
4
app/contract_address.ts
Normal file
4
app/contract_address.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
const contractAddress = "0xbd06B0878888bf4c6895704fa603a5ADf7e65c66";
|
||||||
|
|
||||||
|
|
||||||
|
export default contractAddress
|
||||||
@ -8,14 +8,12 @@ const calculateBalance = (balance: bigint, perSecond: bigint, lastRaidedAt: bigi
|
|||||||
(new Date()).getTime() - parseInt(lastRaidedAt.toString()) * 1000;
|
(new Date()).getTime() - parseInt(lastRaidedAt.toString()) * 1000;
|
||||||
return (
|
return (
|
||||||
balance +
|
balance +
|
||||||
(BigInt(millisecondsSinceLastRaid) * (perSecond * BigInt(10000) /* decimals */)
|
(BigInt(millisecondsSinceLastRaid) * perSecond
|
||||||
/ BigInt(1000) /* deduct milliseconds*/))
|
/ BigInt(1000) /* deduct milliseconds*/))
|
||||||
}
|
}
|
||||||
|
|
||||||
export const toReadable = (value: bigint, applyTokenDivision?: boolean) => {
|
export const toReadable = (value: bigint) => {
|
||||||
if (applyTokenDivision) {
|
|
||||||
value = value / BigInt(10000);
|
value = value / BigInt(10000);
|
||||||
}
|
|
||||||
const suffixes = [
|
const suffixes = [
|
||||||
{ value: BigInt('1000'), suffix: 'thousand' },
|
{ value: BigInt('1000'), suffix: 'thousand' },
|
||||||
{ value: BigInt('1000000'), suffix: 'million' },
|
{ value: BigInt('1000000'), suffix: 'million' },
|
||||||
@ -37,8 +35,6 @@ export const toReadable = (value: bigint, applyTokenDivision?: boolean) => {
|
|||||||
{ value: BigInt('1000000000000000000000000000000000000000000000000000000'), suffix: 'septendecillion' },
|
{ value: BigInt('1000000000000000000000000000000000000000000000000000000'), suffix: 'septendecillion' },
|
||||||
];
|
];
|
||||||
|
|
||||||
console.log(value)
|
|
||||||
|
|
||||||
for (let i = 0; i < suffixes.length; i++) {
|
for (let i = 0; i < suffixes.length; i++) {
|
||||||
if (value < suffixes[i].value) {
|
if (value < suffixes[i].value) {
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
@ -66,8 +62,8 @@ const Counter = () => {
|
|||||||
balance,
|
balance,
|
||||||
army?.profit_per_second ?? BigInt(0),
|
army?.profit_per_second ?? BigInt(0),
|
||||||
player?.last_raided_at ?? BigInt(0)
|
player?.last_raided_at ?? BigInt(0)
|
||||||
), true);
|
));
|
||||||
availableBalance.current = toReadable(balance, true);
|
availableBalance.current = toReadable(balance);
|
||||||
render();
|
render();
|
||||||
}, 100);
|
}, 100);
|
||||||
return () => clearInterval(tickInterval)
|
return () => clearInterval(tickInterval)
|
||||||
|
|||||||
@ -25,7 +25,6 @@ const Header = () => {
|
|||||||
|
|
||||||
const perSecondParagraph = useMemo(() => {
|
const perSecondParagraph = useMemo(() => {
|
||||||
const perSecond = toReadable(army?.profit_per_second ?? BigInt(0))
|
const perSecond = toReadable(army?.profit_per_second ?? BigInt(0))
|
||||||
console.log(perSecond, army?.profit_per_second)
|
|
||||||
return (isRegistered) ?
|
return (isRegistered) ?
|
||||||
<p className={styles.counter_per_seconds}>per second: {perSecond}</p>
|
<p className={styles.counter_per_seconds}>per second: {perSecond}</p>
|
||||||
: null
|
: null
|
||||||
|
|||||||
@ -26,7 +26,7 @@ const Home: NextPage = () => {
|
|||||||
</main>
|
</main>
|
||||||
|
|
||||||
<footer className={styles.footer}>
|
<footer className={styles.footer}>
|
||||||
Made with ❤️ by your fren mic0
|
Made with ❤️ by your frens at 😈 Slay the Moloch team for Cohort VII of <a href="https://www.raidguild.org/" target="blank">RaidGuild</a>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -2,8 +2,8 @@ import React, { createContext, ReactNode, useCallback, useContext, useEffect } f
|
|||||||
import { useAccount, useReadContract, useWriteContract } from 'wagmi'
|
import { useAccount, useReadContract, useWriteContract } from 'wagmi'
|
||||||
import contractAbi from "../../../out/RaidGeld.sol/RaidGeld.json"
|
import contractAbi from "../../../out/RaidGeld.sol/RaidGeld.json"
|
||||||
import { parseEther } from 'viem'
|
import { parseEther } from 'viem'
|
||||||
|
import contractAddress from '../../contract_address'
|
||||||
|
|
||||||
const contractAddress = "0xbd06B0878888bf4c6895704fa603a5ADf7e65c66"
|
|
||||||
const abi = contractAbi.abi
|
const abi = contractAbi.abi
|
||||||
|
|
||||||
export interface Player {
|
export interface Player {
|
||||||
@ -91,7 +91,7 @@ const PlayerProvider = ({ children }: { children: ReactNode }) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log(player)
|
console.log(player, army)
|
||||||
|
|
||||||
const register = useCallback(() => {
|
const register = useCallback(() => {
|
||||||
writeContract({
|
writeContract({
|
||||||
|
|||||||
@ -21,19 +21,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.footer {
|
.footer {
|
||||||
display: flex;
|
margin-top: 2rem;
|
||||||
flex: 1;
|
|
||||||
padding: 2rem 0;
|
padding: 2rem 0;
|
||||||
border-top: 1px solid #eaeaea;
|
border-top: 1px solid #eaeaea;
|
||||||
justify-content: center;
|
text-align: center;
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer a {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
flex-grow: 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.title a {
|
.title a {
|
||||||
|
|||||||
68
broadcast/RaidGeld.s.sol/84532/run-1729773387.json
Normal file
68
broadcast/RaidGeld.s.sol/84532/run-1729773387.json
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,8 +1,6 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
pragma solidity ^0.8.13;
|
pragma solidity ^0.8.13;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct Raider {
|
struct Raider {
|
||||||
uint16 level;
|
uint16 level;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,16 +4,13 @@ pragma solidity ^0.8.13;
|
|||||||
import {Army} from "../src/RaidGeldStructs.sol";
|
import {Army} from "../src/RaidGeldStructs.sol";
|
||||||
|
|
||||||
library RaidGeldUtils {
|
library RaidGeldUtils {
|
||||||
|
|
||||||
uint256 public constant PRECISION = 10000;
|
uint256 public constant PRECISION = 10000;
|
||||||
|
|
||||||
uint256 constant BASE_PRICE = 380000;
|
uint256 constant BASE_PRICE = 380000;
|
||||||
uint256 constant PRICE_FACTOR = 11500;
|
uint256 constant PRICE_FACTOR = 11500;
|
||||||
uint256 constant APPRENTICE_PROFIT = 61000;
|
uint256 constant APPRENTICE_PROFIT = 61000;
|
||||||
uint256 constant ANOINTED_PROFIT = 6 * 64000;
|
uint256 constant ANOINTED_PROFIT = 6 * 64000;
|
||||||
uint256 constant CHAMPION_PROFIT = 67000 * 61000 * 64000 / PRECISION / PRECISION;
|
uint256 constant CHAMPION_PROFIT = 67000 * 61000 * 64000 / PRECISION / PRECISION;
|
||||||
|
|
||||||
|
|
||||||
function calculateUnitPrice(uint8 unit, uint16 currentLevel, uint16 units) internal pure returns (uint256) {
|
function calculateUnitPrice(uint8 unit, uint16 currentLevel, uint16 units) internal pure returns (uint256) {
|
||||||
require(unit <= 3, "No matching unit found");
|
require(unit <= 3, "No matching unit found");
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import {Army, Raider} from "../src/RaidGeld.sol";
|
|||||||
import "../src/RaidGeldUtils.sol";
|
import "../src/RaidGeldUtils.sol";
|
||||||
|
|
||||||
contract raid_geldTest is Test {
|
contract raid_geldTest is Test {
|
||||||
function test_0_unit_price() public {
|
function test_0_unit_price() public pure {
|
||||||
// buying 1 unit of moloch_denier
|
// buying 1 unit of moloch_denier
|
||||||
uint256 basePriceMolochDenier = RaidGeldUtils.calculateUnitPrice(0, 0, 1);
|
uint256 basePriceMolochDenier = RaidGeldUtils.calculateUnitPrice(0, 0, 1);
|
||||||
assertEq(basePriceMolochDenier, RaidGeldUtils.BASE_PRICE);
|
assertEq(basePriceMolochDenier, RaidGeldUtils.BASE_PRICE);
|
||||||
@ -47,11 +47,8 @@ contract raid_geldTest is Test {
|
|||||||
profit_per_second: 0 // irrelevant for this test
|
profit_per_second: 0 // irrelevant for this test
|
||||||
});
|
});
|
||||||
profits_per_second = RaidGeldUtils.calculateProfitsPerSecond(army);
|
profits_per_second = RaidGeldUtils.calculateProfitsPerSecond(army);
|
||||||
uint256 expected =
|
uint256 expected = _dLvl * RaidGeldUtils.PRECISION + _apLvl * RaidGeldUtils.APPRENTICE_PROFIT
|
||||||
_dLvl * RaidGeldUtils.PRECISION +
|
+ _anLvl * RaidGeldUtils.ANOINTED_PROFIT + _cLvl * RaidGeldUtils.CHAMPION_PROFIT;
|
||||||
_apLvl * RaidGeldUtils.APPRENTICE_PROFIT +
|
|
||||||
_anLvl * RaidGeldUtils.ANOINTED_PROFIT +
|
|
||||||
_cLvl * RaidGeldUtils.CHAMPION_PROFIT;
|
|
||||||
assertEq(profits_per_second, expected);
|
assertEq(profits_per_second, expected);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user