From e3b2744bef273494b12ef05ef011290360d7a9ec Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Wed, 11 Dec 2024 19:35:50 +1100 Subject: [PATCH] clean --- .../__tests__/BattleManager.test.ts | 16 +- client/src/hooks/helpers/useQuests.tsx | 12 +- client/src/hooks/helpers/useResources.tsx | 48 +---- .../hyperstructures/HyperstructurePanel.tsx | 31 ++-- .../components/trading/ResourceArrivals.tsx | 8 - .../components/worldmap/armies/ActionInfo.tsx | 173 +++++++++--------- client/src/ui/layouts/World.tsx | 2 +- .../src/ui/modules/navigation/QuestMenu.tsx | 116 ++++++------ .../src/ui/modules/social/EndSeasonButton.tsx | 1 - client/src/ui/modules/social/PlayerId.tsx | 27 +-- client/src/ui/modules/social/Social.tsx | 12 +- docs/pages/overview/bridging.mdx | 7 +- docs/pages/overview/resource-addresses.mdx | 83 ++++++--- 13 files changed, 244 insertions(+), 292 deletions(-) diff --git a/client/src/dojo/modelManager/__tests__/BattleManager.test.ts b/client/src/dojo/modelManager/__tests__/BattleManager.test.ts index 56aed10c3..8dbe37957 100644 --- a/client/src/dojo/modelManager/__tests__/BattleManager.test.ts +++ b/client/src/dojo/modelManager/__tests__/BattleManager.test.ts @@ -66,14 +66,14 @@ import { describe, it } from "vitest"; // }); describe("getBattle", () => { - it("should return a valid battle for a valid mock", () => { - // const mockBattle = generateMockBatle(true); - // vi.mocked(getComponentValue).mockReturnValueOnce(mockBattle); - // const battleManager = new BattleManager(BATTLE_ENTITY_ID, mockDojoResult); - // const battle = battleManager.getBattle(); - // expect(battle).toBeDefined(); - // expect(battle).toBe(mockBattle); - }); + it("should return a valid battle for a valid mock", () => { + // const mockBattle = generateMockBatle(true); + // vi.mocked(getComponentValue).mockReturnValueOnce(mockBattle); + // const battleManager = new BattleManager(BATTLE_ENTITY_ID, mockDojoResult); + // const battle = battleManager.getBattle(); + // expect(battle).toBeDefined(); + // expect(battle).toBe(mockBattle); + }); }); // describe("isBattle", () => { diff --git a/client/src/hooks/helpers/useQuests.tsx b/client/src/hooks/helpers/useQuests.tsx index 607b5f14e..083e418e0 100644 --- a/client/src/hooks/helpers/useQuests.tsx +++ b/client/src/hooks/helpers/useQuests.tsx @@ -63,9 +63,7 @@ export const useQuests = () => { }; const useQuestDependencies = () => { - const { - setup, - } = useDojo(); + const { setup } = useDojo(); const structureEntityId = useUIStore((state) => state.structureEntityId); @@ -203,10 +201,10 @@ export const useQuestClaimStatus = () => { const questClaimStatus = useMemo(() => { const entityBigInt = BigInt(structureEntityId || 0); - - const checkPrizesClaimed = (prizes: Prize[]) => - prizes.every((prize) => - getComponentValue(Quest, getEntityIdFromKeys([entityBigInt, BigInt(prize.id)]))?.completed + + const checkPrizesClaimed = (prizes: Prize[]) => + prizes.every( + (prize) => getComponentValue(Quest, getEntityIdFromKeys([entityBigInt, BigInt(prize.id)]))?.completed, ); return Array.from(questDetails.keys()).reduce( diff --git a/client/src/hooks/helpers/useResources.tsx b/client/src/hooks/helpers/useResources.tsx index 7400d78b3..a2b70a229 100644 --- a/client/src/hooks/helpers/useResources.tsx +++ b/client/src/hooks/helpers/useResources.tsx @@ -1,15 +1,13 @@ import { configManager } from "@/dojo/setup"; import { CapacityConfigCategory, - ContractAddress, ID, - Position, ResourcesIds, resources, - type Resource, + type Resource } from "@bibliothecadao/eternum"; import { useComponentValue } from "@dojoengine/react"; -import { Has, HasValue, Not, getComponentValue, runQuery, type Entity } from "@dojoengine/recs"; +import { Has, HasValue, getComponentValue, runQuery, type Entity } from "@dojoengine/recs"; import { useEffect, useMemo, useState } from "react"; import { ResourceManager } from "../../dojo/modelManager/ResourceManager"; import { getEntityIdFromKeys } from "../../ui/utils/utils"; @@ -182,45 +180,3 @@ export const useResourceManager = (entityId: ID, resourceId: ResourcesIds) => { return resourceManager; }; - -export function useOwnedEntitiesOnPosition() { - const { - account: { account }, - setup: { - components: { Owner, Position, Movable, Bank, Army }, - }, - } = useDojo(); - - const getOwnedEntitiesOnPosition = (address: ContractAddress, position: Position) => { - const { x, y } = position; - - const entities = runQuery([ - HasValue(Owner, { address }), - Not(Movable), - Not(Army), - // @note: safer to do like this rather than deconstruct because there's a chance entity_id is also there - HasValue(Position, { x, y }), - ]); - - return Array.from(entities) - .map((entityId) => { - const position = getComponentValue(Position, entityId); - if (!position) return; - return position?.entity_id; - }) - .filter(Boolean) as ID[]; - }; - - const getOwnedEntityOnPosition = (entityId: ID) => { - const position = getComponentValue(Position, getEntityIdFromKeys([BigInt(entityId)])); - const depositEntityIds = position - ? getOwnedEntitiesOnPosition(ContractAddress(account.address), { x: Number(position.x), y: Number(position.y) }) - : []; - return depositEntityIds[0]; - }; - - return { - getOwnedEntitiesOnPosition, - getOwnedEntityOnPosition, - }; -} diff --git a/client/src/ui/components/hyperstructures/HyperstructurePanel.tsx b/client/src/ui/components/hyperstructures/HyperstructurePanel.tsx index 31c6dc490..5543b14be 100644 --- a/client/src/ui/components/hyperstructures/HyperstructurePanel.tsx +++ b/client/src/ui/components/hyperstructures/HyperstructurePanel.tsx @@ -156,11 +156,12 @@ export const HyperstructurePanel = ({ entity }: any) => { setNewContributions({}); setResetContributions(false); } - }; const [selectedAccess, setSelectedAccess] = useState<"Public" | "Private" | "GuildOnly">( - hyperstructure ? (DisplayedAccess[hyperstructure.access as keyof typeof DisplayedAccess] as "Public" | "Private" | "GuildOnly") : "Private" + hyperstructure + ? (DisplayedAccess[hyperstructure.access as keyof typeof DisplayedAccess] as "Public" | "Private" | "GuildOnly") + : "Private", ); return ( @@ -207,21 +208,19 @@ export const HyperstructurePanel = ({ entity }: any) => {
-

{entity.name}

- +
- -
{account.address === entity.owner && (
- {hyperstructure && entity.isOwner && isLoading !== Loading.SetPrivate ? ( - ) :
Loading...
} - -{account.address === entity.owner && ( - - )} + ) : ( +
Loading...
+ )} + + {account.address === entity.owner && ( + + )}
)}
diff --git a/client/src/ui/components/trading/ResourceArrivals.tsx b/client/src/ui/components/trading/ResourceArrivals.tsx index 91bf20de1..eadbd8944 100644 --- a/client/src/ui/components/trading/ResourceArrivals.tsx +++ b/client/src/ui/components/trading/ResourceArrivals.tsx @@ -1,17 +1,9 @@ import { ArrivalInfo } from "@/hooks/helpers/use-resource-arrivals"; import { Headline } from "@/ui/elements/Headline"; import { HintModalButton } from "@/ui/elements/HintModalButton"; -import { ID, Resource } from "@bibliothecadao/eternum"; import { EntityArrival } from "../entities/Entity"; import { HintSection } from "../hints/HintModal"; -export type EntityReadyForDeposit = { - carrierId: ID; - senderEntityId: ID; - recipientEntityId: ID; - resources: Resource[]; -}; - export const AllResourceArrivals = ({ arrivals, className }: { arrivals: ArrivalInfo[]; className?: string }) => { return (
diff --git a/client/src/ui/components/worldmap/armies/ActionInfo.tsx b/client/src/ui/components/worldmap/armies/ActionInfo.tsx index 119c2dada..6c879247d 100644 --- a/client/src/ui/components/worldmap/armies/ActionInfo.tsx +++ b/client/src/ui/components/worldmap/armies/ActionInfo.tsx @@ -13,82 +13,76 @@ import { getComponentValue } from "@dojoengine/recs"; import { getEntityIdFromKeys } from "@dojoengine/utils"; import { memo, useCallback, useMemo } from "react"; -const TooltipContent = memo(({ - isExplored, - travelPath, - costs, - selectedEntityId, - structureEntityId, - getBalance -}: { - isExplored: boolean; - travelPath: any; - costs: { travelFoodCosts: any; exploreFoodCosts: any }; - selectedEntityId: string; - structureEntityId: string; - getBalance: any; -}) => ( - <> - {isExplored ? "Travel" : "Explore"} - {isExplored ? ( -
- - -
- ) : ( -
- - -
- )} - - {!isExplored && ( -
- -
-
+{configManager.getExploreReward()} Random resource
+const TooltipContent = memo( + ({ + isExplored, + travelPath, + costs, + selectedEntityId, + structureEntityId, + getBalance, + }: { + isExplored: boolean; + travelPath: any; + costs: { travelFoodCosts: any; exploreFoodCosts: any }; + selectedEntityId: string; + structureEntityId: string; + getBalance: any; + }) => ( + <> + {isExplored ? "Travel" : "Explore"} + {isExplored ? ( +
+ +
-
- )} -
- Right-click to confirm -
- -)); + ) : ( +
+ + +
+ )} + + {!isExplored && ( +
+ +
+
+{configManager.getExploreReward()} Random resource
+
+
+ )} +
Right-click to confirm
+ + ), +); -TooltipContent.displayName = 'TooltipContent'; +TooltipContent.displayName = "TooltipContent"; export const ActionInfo = memo(() => { - const hoveredHex = useUIStore( - useCallback((state) => state.armyActions.hoveredHex, []) - ); - const selectedEntityId = useUIStore( - useCallback((state) => state.armyActions.selectedEntityId, []) - ); - const structureEntityId = useUIStore( - useCallback((state) => state.structureEntityId, []) - ); - + const hoveredHex = useUIStore(useCallback((state) => state.armyActions.hoveredHex, [])); + const selectedEntityId = useUIStore(useCallback((state) => state.armyActions.selectedEntityId, [])); + const structureEntityId = useUIStore(useCallback((state) => state.structureEntityId, [])); + const { getBalance } = useResourceBalance(); const { setup: { @@ -105,11 +99,13 @@ export const ActionInfo = memo(() => { }; } const army = getComponentValue(Army, getEntityIdFromKeys([BigInt(selectedEntityId)])); - return army?.troops || { - knight_count: 0n, - paladin_count: 0n, - crossbowman_count: 0n, - }; + return ( + army?.troops || { + knight_count: 0n, + paladin_count: 0n, + crossbowman_count: 0n, + } + ); }, [selectedEntityId, Army]); const travelPath = useMemo(() => { @@ -120,26 +116,23 @@ export const ActionInfo = memo(() => { }, [hoveredHex]); const showTooltip = useMemo(() => { - return travelPath !== undefined && - travelPath.path.length >= 2 && - selectedEntityId !== null; + return travelPath !== undefined && travelPath.path.length >= 2 && selectedEntityId !== null; }, [travelPath, selectedEntityId]); const isExplored = travelPath?.isExplored || false; - const costs = useMemo(() => ({ - travelFoodCosts: computeTravelFoodCosts(selectedEntityTroops), - exploreFoodCosts: computeExploreFoodCosts(selectedEntityTroops) - }), [selectedEntityTroops]); + const costs = useMemo( + () => ({ + travelFoodCosts: computeTravelFoodCosts(selectedEntityTroops), + exploreFoodCosts: computeExploreFoodCosts(selectedEntityTroops), + }), + [selectedEntityTroops], + ); if (!showTooltip) return null; return ( - + { ); }); -ActionInfo.displayName = 'ActionInfo'; \ No newline at end of file +ActionInfo.displayName = "ActionInfo"; diff --git a/client/src/ui/layouts/World.tsx b/client/src/ui/layouts/World.tsx index 8a8be432c..5b5bc256c 100644 --- a/client/src/ui/layouts/World.tsx +++ b/client/src/ui/layouts/World.tsx @@ -90,7 +90,7 @@ export const World = ({ backgroundImage }: { backgroundImage: string }) => { // Setup hooks useFetchBlockchainData(); useStructureEntityId(); - + return (
{ diff --git a/client/src/ui/modules/navigation/QuestMenu.tsx b/client/src/ui/modules/navigation/QuestMenu.tsx index d3bee364c..a44707ecd 100644 --- a/client/src/ui/modules/navigation/QuestMenu.tsx +++ b/client/src/ui/modules/navigation/QuestMenu.tsx @@ -21,7 +21,6 @@ export const QuestsMenu = ({ unclaimedQuestsCount }: { unclaimedQuestsCount: num useStartingTutorial(); const { quests } = useQuests(); - const structureEntityId = useUIStore((state) => state.structureEntityId); const setTooltip = useUIStore((state) => state.setTooltip); @@ -98,69 +97,68 @@ export const QuestsMenu = ({ unclaimedQuestsCount }: { unclaimedQuestsCount: num }; return ( - -
- - -
-
-
+
+ + +
+
+
- - -
-
+ {unclaimedQuestsCount}
+ - {skipQuest ? ( -
- - - -
- ) : ( - - )} +
+
- ) + + {skipQuest ? ( +
+ + + +
+ ) : ( + + )} +
+ ); }; const QuestRewards = ({ prizes }: { prizes: Prize[] | undefined }) => { diff --git a/client/src/ui/modules/social/EndSeasonButton.tsx b/client/src/ui/modules/social/EndSeasonButton.tsx index 43e58da29..ba754c01b 100644 --- a/client/src/ui/modules/social/EndSeasonButton.tsx +++ b/client/src/ui/modules/social/EndSeasonButton.tsx @@ -83,7 +83,6 @@ export const EndSeasonButton = () => { return ( -
- +
+ {gameEnded.length === 0 && } + +
{tabs.map((tab) => ( diff --git a/docs/pages/overview/bridging.mdx b/docs/pages/overview/bridging.mdx index 8d568215a..2da69e0ae 100644 --- a/docs/pages/overview/bridging.mdx +++ b/docs/pages/overview/bridging.mdx @@ -20,14 +20,19 @@ developers cannot modify the system after deployment. ## Bridging in -This is the only way to bridge in Lords to the game. This converts ERC20 Lords into in-game Lords. Only in-game Lords can be used to build and trade with. +This is the only way to bridge in Lords to the game. This converts ERC20 Lords into in-game Lords. Only in-game Lords +can be used to build and trade with. ### Initial Bridge + You need to first initialize the transfer. + Bridge ### Final Bridge (Within Game Client) + Once you finish the first step, the Lords/resources will appear in your inventory to be used in the game. + Bridge ## Bridging out diff --git a/docs/pages/overview/resource-addresses.mdx b/docs/pages/overview/resource-addresses.mdx index 74bced82f..fb48bc5d4 100644 --- a/docs/pages/overview/resource-addresses.mdx +++ b/docs/pages/overview/resource-addresses.mdx @@ -1,11 +1,13 @@ # Resource Addresses +LORDS: +[0x0124aeb495b947201f5fac96fd1138e326ad86195b98df6dec9009158a533b49](https://voyager.online/contract/0x0124aeb495b947201f5fac96fd1138e326ad86195b98df6dec9009158a533b49) -LORDS: [0x0124aeb495b947201f5fac96fd1138e326ad86195b98df6dec9009158a533b49](https://voyager.online/contract/0x0124aeb495b947201f5fac96fd1138e326ad86195b98df6dec9009158a533b49) +WOOD: +[0x40d8907cec0f7ae9c364dfb12485a1314d84c129bf1898d2f3d4b7fcc7d44f4](https://voyager.online/contract/0x40d8907cec0f7ae9c364dfb12485a1314d84c129bf1898d2f3d4b7fcc7d44f4) -WOOD: [0x40d8907cec0f7ae9c364dfb12485a1314d84c129bf1898d2f3d4b7fcc7d44f4](https://voyager.online/contract/0x40d8907cec0f7ae9c364dfb12485a1314d84c129bf1898d2f3d4b7fcc7d44f4) - -STONE: [0x439a1c010e3e1bb2d43d43411000893c0042bd88f6c701611a0ea914d426da4](https://voyager.online/contract/0x0439a1c010e3e1bb2d43d43411000893c0042bd88f6c701611a0ea914d426da4) +STONE: +[0x439a1c010e3e1bb2d43d43411000893c0042bd88f6c701611a0ea914d426da4](https://voyager.online/contract/0x0439a1c010e3e1bb2d43d43411000893c0042bd88f6c701611a0ea914d426da4) COAL:[ 0xce635e3f241b0ae78c46a929d84a9101910188f9c4024eaa7559556503c31a](https://voyager.online/contract/0xce635e3f241b0ae78c46a929d84a9101910188f9c4024eaa7559556503c31a) @@ -13,51 +15,74 @@ COPPER:[ 0x66ed5c928ee027a9419ace1cbea8389885161db5572a7c5c4fef2310e9bf494](http IRONWOOD:[ 0x1720cf6318bff45e62acc588680ae3cd4d5f8465b1d52cb710533c9299b031a](https://voyager.online/contract/0x1720cf6318bff45e62acc588680ae3cd4d5f8465b1d52cb710533c9299b031a) -OBSIDIAN: [0x3b6448d09dcd023507376402686261f5d6739455fa02f804907b066e488da66](https://voyager.online/contract/0x3b6448d09dcd023507376402686261f5d6739455fa02f804907b066e488da66) - -GOLD: [0xdff9dca192609c4e86ab3be22c7ec1e968876c992d21986f3c542be97fa2f](https://voyager.online/contract/0xdff9dca192609c4e86ab3be22c7ec1e968876c992d21986f3c542be97fa2f) +OBSIDIAN: +[0x3b6448d09dcd023507376402686261f5d6739455fa02f804907b066e488da66](https://voyager.online/contract/0x3b6448d09dcd023507376402686261f5d6739455fa02f804907b066e488da66) -SILVER: [0x6fe21d2d4a8a05bdb70f09c9250af9870020d5dcc35f410b4a39d6605c3e353](https://voyager.online/contract/0x6fe21d2d4a8a05bdb70f09c9250af9870020d5dcc35f410b4a39d6605c3e353) +GOLD: +[0xdff9dca192609c4e86ab3be22c7ec1e968876c992d21986f3c542be97fa2f](https://voyager.online/contract/0xdff9dca192609c4e86ab3be22c7ec1e968876c992d21986f3c542be97fa2f) -MITHRAL: [ 0x67ba235c569c23877064b2ac6ebd4d79f32d3c00f5fab8e28a3b5700b957f6](https://voyager.online/contract/0x67ba235c569c23877064b2ac6ebd4d79f32d3c00f5fab8e28a3b5700b957f6) +SILVER: +[0x6fe21d2d4a8a05bdb70f09c9250af9870020d5dcc35f410b4a39d6605c3e353](https://voyager.online/contract/0x6fe21d2d4a8a05bdb70f09c9250af9870020d5dcc35f410b4a39d6605c3e353) -ALCHEMICAL SILVER:[ 0x3956a5301e99522038a2e7dcb9c2a89bf087ffa79310ee0a508b5538efd8ddd](https://voyager.online/contract/0x3956a5301e99522038a2e7dcb9c2a89bf087ffa79310ee0a508b5538efd8ddd) +MITHRAL: +[ 0x67ba235c569c23877064b2ac6ebd4d79f32d3c00f5fab8e28a3b5700b957f6](https://voyager.online/contract/0x67ba235c569c23877064b2ac6ebd4d79f32d3c00f5fab8e28a3b5700b957f6) -COLD IRON: [ 0x555d713e59d4ff96b7960447e9bc9e79bfdeab5b0eea74e3df81bce61cfbc77](https://voyager.online/contract/0x555d713e59d4ff96b7960447e9bc9e79bfdeab5b0eea74e3df81bce61cfbc77) +ALCHEMICAL +SILVER:[ 0x3956a5301e99522038a2e7dcb9c2a89bf087ffa79310ee0a508b5538efd8ddd](https://voyager.online/contract/0x3956a5301e99522038a2e7dcb9c2a89bf087ffa79310ee0a508b5538efd8ddd) -DEEP CRYSTAL: [ 0x1d655ac834d38df7921074fc1588411e202b1af83307cbd996983aff52db3a8](https://voyager.online/contract/0x1d655ac834d38df7921074fc1588411e202b1af83307cbd996983aff52db3a8) +COLD IRON: +[ 0x555d713e59d4ff96b7960447e9bc9e79bfdeab5b0eea74e3df81bce61cfbc77](https://voyager.online/contract/0x555d713e59d4ff96b7960447e9bc9e79bfdeab5b0eea74e3df81bce61cfbc77) -RUBY: [0x3d9b66720959d0e7687b898292c10e62e78626f2dba5e1909961a2ce3f86612](https://voyager.online/contract/0x3d9b66720959d0e7687b898292c10e62e78626f2dba5e1909961a2ce3f86612) +DEEP CRYSTAL: +[ 0x1d655ac834d38df7921074fc1588411e202b1af83307cbd996983aff52db3a8](https://voyager.online/contract/0x1d655ac834d38df7921074fc1588411e202b1af83307cbd996983aff52db3a8) -DIAMONDS: [ 0xe03ea8ae385f64754820af5c01c36abf1b8130dd6797d3fd9d430e4114e876](https://voyager.online/contract/0xe03ea8ae385f64754820af5c01c36abf1b8130dd6797d3fd9d430e4114e876) +RUBY: +[0x3d9b66720959d0e7687b898292c10e62e78626f2dba5e1909961a2ce3f86612](https://voyager.online/contract/0x3d9b66720959d0e7687b898292c10e62e78626f2dba5e1909961a2ce3f86612) -HARTWOOD: [0x5620aa7170cd66dbcbc37d03087bfe4633ffef91d3e4d97b501de906004f79b](https://voyager.online/contract/0x5620aa7170cd66dbcbc37d03087bfe4633ffef91d3e4d97b501de906004f79b) +DIAMONDS: +[ 0xe03ea8ae385f64754820af5c01c36abf1b8130dd6797d3fd9d430e4114e876](https://voyager.online/contract/0xe03ea8ae385f64754820af5c01c36abf1b8130dd6797d3fd9d430e4114e876) -IGNIUM: [0x625c1f789b03ebebc7a9322366f38ebad1f693b84b2abd8cb8f5b2748b0cdd5](https://voyager.online/contract/0x625c1f789b03ebebc7a9322366f38ebad1f693b84b2abd8cb8f5b2748b0cdd5) +HARTWOOD: +[0x5620aa7170cd66dbcbc37d03087bfe4633ffef91d3e4d97b501de906004f79b](https://voyager.online/contract/0x5620aa7170cd66dbcbc37d03087bfe4633ffef91d3e4d97b501de906004f79b) -TWILIGHT QUARTZ: [0x35e24c02409c3cfe8d5646399a62c4d102bb782938d5f5180e92c9c62d3faf7](https://voyager.online/contract/0x35e24c02409c3cfe8d5646399a62c4d102bb782938d5f5180e92c9c62d3faf7) +IGNIUM: +[0x625c1f789b03ebebc7a9322366f38ebad1f693b84b2abd8cb8f5b2748b0cdd5](https://voyager.online/contract/0x625c1f789b03ebebc7a9322366f38ebad1f693b84b2abd8cb8f5b2748b0cdd5) -TRUE ICE: [0x4485f5a6e16562e1c761cd348e63256d00389e3ddf4f5d98afe7ab44c57c481](https://voyager.online/contract/0x4485f5a6e16562e1c761cd348e63256d00389e3ddf4f5d98afe7ab44c57c481) +TWILIGHT QUARTZ: +[0x35e24c02409c3cfe8d5646399a62c4d102bb782938d5f5180e92c9c62d3faf7](https://voyager.online/contract/0x35e24c02409c3cfe8d5646399a62c4d102bb782938d5f5180e92c9c62d3faf7) -ADAMANTINE: [0x367f838f85a2f5e1580d6f011e4476f581083314cff8721ba3dda9706076eed](https://voyager.online/contract/0x367f838f85a2f5e1580d6f011e4476f581083314cff8721ba3dda9706076eed) +TRUE ICE: +[0x4485f5a6e16562e1c761cd348e63256d00389e3ddf4f5d98afe7ab44c57c481](https://voyager.online/contract/0x4485f5a6e16562e1c761cd348e63256d00389e3ddf4f5d98afe7ab44c57c481) -SAPPHIRE: [0x2f8dd022568af8f9f718aa37707a9b858529db56910633a160456838b6cbcbc](https://voyager.online/contract/0x2f8dd022568af8f9f718aa37707a9b858529db56910633a160456838b6cbcbc) +ADAMANTINE: +[0x367f838f85a2f5e1580d6f011e4476f581083314cff8721ba3dda9706076eed](https://voyager.online/contract/0x367f838f85a2f5e1580d6f011e4476f581083314cff8721ba3dda9706076eed) -ETHEREAL SILICA:[ 0x68b6e23cbbd58a644700f55e96c83580921e9f521b6e5175396b53ba7910e7d](https://voyager.online/contract/0x68b6e23cbbd58a644700f55e96c83580921e9f521b6e5175396b53ba7910e7d) +SAPPHIRE: +[0x2f8dd022568af8f9f718aa37707a9b858529db56910633a160456838b6cbcbc](https://voyager.online/contract/0x2f8dd022568af8f9f718aa37707a9b858529db56910633a160456838b6cbcbc) -DRAGONHIDE: [0x3bf856515bece3c93f5061b7941b8645f817a0acab93c758b8c7b4bc0afa3c6](https://voyager.online/contract/0x3bf856515bece3c93f5061b7941b8645f817a0acab93c758b8c7b4bc0afa3c6) +ETHEREAL +SILICA:[ 0x68b6e23cbbd58a644700f55e96c83580921e9f521b6e5175396b53ba7910e7d](https://voyager.online/contract/0x68b6e23cbbd58a644700f55e96c83580921e9f521b6e5175396b53ba7910e7d) -EARTHEN SHARD: [0x0695b08ecdfdd828c2e6267da62f59e6d7543e690ef56a484df25c8566b332a5](https://voyager.online/contract/0x0695b08ecdfdd828c2e6267da62f59e6d7543e690ef56a484df25c8566b332a5) +DRAGONHIDE: +[0x3bf856515bece3c93f5061b7941b8645f817a0acab93c758b8c7b4bc0afa3c6](https://voyager.online/contract/0x3bf856515bece3c93f5061b7941b8645f817a0acab93c758b8c7b4bc0afa3c6) -DONKEY: [0x264be95a4a2ace20add68cb321acdccd2f9f8440ee1c7abd85da44ddab01085](https://voyager.online/contract/0x264be95a4a2ace20add68cb321acdccd2f9f8440ee1c7abd85da44ddab01085) +EARTHEN SHARD: +[0x0695b08ecdfdd828c2e6267da62f59e6d7543e690ef56a484df25c8566b332a5](https://voyager.online/contract/0x0695b08ecdfdd828c2e6267da62f59e6d7543e690ef56a484df25c8566b332a5) -KNIGHT: [0xac965f9e67164723c16735a9da8dbc9eb8e43b1bd0323591e87c056badf606](https://voyager.online/contract/0xac965f9e67164723c16735a9da8dbc9eb8e43b1bd0323591e87c056badf606) +DONKEY: +[0x264be95a4a2ace20add68cb321acdccd2f9f8440ee1c7abd85da44ddab01085](https://voyager.online/contract/0x264be95a4a2ace20add68cb321acdccd2f9f8440ee1c7abd85da44ddab01085) -CROSSBOWMAN: [0x67e4ac00a241be06ba6afc11fa2715ec7da0c42c05a67ef6ecfcfeda725aaa8](https://voyager.online/contract/0x67e4ac00a241be06ba6afc11fa2715ec7da0c42c05a67ef6ecfcfeda725aaa8) +KNIGHT: +[0xac965f9e67164723c16735a9da8dbc9eb8e43b1bd0323591e87c056badf606](https://voyager.online/contract/0xac965f9e67164723c16735a9da8dbc9eb8e43b1bd0323591e87c056badf606) -PALADIN: [0x3bc86299bee061c7c8d7546ccb62b9daf9bffc653b1508facb722c6593874bc](https://voyager.online/contract/0x3bc86299bee061c7c8d7546ccb62b9daf9bffc653b1508facb722c6593874bc) +CROSSBOWMAN: +[0x67e4ac00a241be06ba6afc11fa2715ec7da0c42c05a67ef6ecfcfeda725aaa8](https://voyager.online/contract/0x67e4ac00a241be06ba6afc11fa2715ec7da0c42c05a67ef6ecfcfeda725aaa8) -WHEAT: [0x57a3f1ee475e072ce3be41785c0e889b7295d7a0dcc22b992c5b9408dbeb280](https://voyager.online/contract/0x57a3f1ee475e072ce3be41785c0e889b7295d7a0dcc22b992c5b9408dbeb280) +PALADIN: +[0x3bc86299bee061c7c8d7546ccb62b9daf9bffc653b1508facb722c6593874bc](https://voyager.online/contract/0x3bc86299bee061c7c8d7546ccb62b9daf9bffc653b1508facb722c6593874bc) -FISH: [0x27719173cfe10f1aa38d2aaed0a075b6077290f1e817aa3485d2b828394f4d9](https://voyager.online/contract/0x27719173cfe10f1aa38d2aaed0a075b6077290f1e817aa3485d2b828394f4d9) +WHEAT: +[0x57a3f1ee475e072ce3be41785c0e889b7295d7a0dcc22b992c5b9408dbeb280](https://voyager.online/contract/0x57a3f1ee475e072ce3be41785c0e889b7295d7a0dcc22b992c5b9408dbeb280) +FISH: +[0x27719173cfe10f1aa38d2aaed0a075b6077290f1e817aa3485d2b828394f4d9](https://voyager.online/contract/0x27719173cfe10f1aa38d2aaed0a075b6077290f1e817aa3485d2b828394f4d9)