Skip to content

Commit

Permalink
v2 world implementation (#263)
Browse files Browse the repository at this point in the history
  • Loading branch information
0xxlegolas authored Dec 10, 2024
1 parent 0c28a04 commit 7c94012
Show file tree
Hide file tree
Showing 136 changed files with 14,308 additions and 1,221 deletions.
2 changes: 1 addition & 1 deletion end-to-end-tests-v2/.env.local
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
RPC_URL=http://127.0.0.1:8545


WORLD_ADDRESS=
WORLD_ADDRESS=0xcc8f30531edb13fab2392333e54e3b2c072445b3

33 changes: 33 additions & 0 deletions end-to-end-tests-v2/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,39 @@
"createSmartCharacter:ci": "RPC_URL=$RPC_URL WORLD_ADDRESS=$WORLD_ADDRESS PRIVATE_KEY=$PRIVATE_KEY forge script script/CreateSmartCharacter.s.sol:CreateSmartCharacter --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"createSmartCharacter:local": "source ./.env.local && RPC_URL=$RPC_URL WORLD_ADDRESS=$WORLD_ADDRESS PRIVATE_KEY=$PRIVATE_KEY forge script script/CreateSmartCharacter.s.sol:CreateSmartCharacter --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"createSmartCharacter:devnet": "source ./.env.devnet && PRIVATE_KEY=$PRIVATE_KEY forge script script/CreateSmartCharacter.s.sol:CreateSmartCharacter --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"mintERC20:local": "source ./.env.local && PRIVATE_KEY=$PRIVATE_KEY forge script script/MintERC20.s.sol:MintERC20 --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"mintERC20:devnet": "source ./.env.devnet && PRIVATE_KEY=$PRIVATE_KEY forge script script/MintERC20.s.sol:MintERC20 --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"createMintERC20:ci": "RPC_URL=$RPC_URL WORLD_ADDRESS=$WORLD_ADDRESS PRIVATE_KEY=$PRIVATE_KEY forge script script/CreateMintERC20.s.sol:CreateMintERC20 --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"createMintERC20:local": "source ./.env.local && RPC_URL=$RPC_URL WORLD_ADDRESS=$WORLD_ADDRESS PRIVATE_KEY=$PRIVATE_KEY forge script script/CreateMintERC20.s.sol:CreateMintERC20 --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"createMintERC20:devnet": "source ./.env.devnet && PRIVATE_KEY=$PRIVATE_KEY forge script script/CreateMintERC20.s.sol:CreateMintERC20 --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"anchorSSU:ci": "WORLD_ADDRESS=$WORLD_ADDRESS RPC_URL=$RPC_URL PRIVATE_KEY=$PRIVATE_KEY forge script script/AnchorSSU.s.sol:AnchorSSU --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"anchorSSU:local": "source ./.env.local && WORLD_ADDRESS=$WORLD_ADDRESS RPC_URL=$RPC_URL PRIVATE_KEY=$PRIVATE_KEY forge script script/AnchorSSU.s.sol:AnchorSSU --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"anchorSSU:devnet": "source ./.env.devnet && PRIVATE_KEY=$PRIVATE_KEY forge script script/AnchorSSU.s.sol:AnchorSSU --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"depositFuel:local": "source ./.env.local && PRIVATE_KEY=$PRIVATE_KEY forge script script/DepositFuel.s.sol:DepositFuel --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"depositFuel:devnet": "source ./.env.devnet && PRIVATE_KEY=$PRIVATE_KEY forge script script/DepositFuel.s.sol:DepositFuel --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"bringOnline:local": "source ./.env.local && PRIVATE_KEY=$PRIVATE_KEY forge script script/BringOnline.s.sol:BringOnline --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"bringOnline:devnet": "source ./.env.devnet && PRIVATE_KEY=$PRIVATE_KEY forge script script/BringOnline.s.sol:BringOnline --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"bringOffline:local": "source ./.env.local && PRIVATE_KEY=$PRIVATE_KEY forge script script/BringOffline.s.sol:BringOffline --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"bringOffline:devnet": "source ./.env.devnet && PRIVATE_KEY=$PRIVATE_KEY forge script script/BringOffline.s.sol:BringOffline --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"depositToInventory:local": "source ./.env.local && PRIVATE_KEY=$PRIVATE_KEY forge script script/DepositToInventory.s.sol:DepositToInventory --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"depositToInventory:devnet": "source ./.env.devnet && PRIVATE_KEY=$PRIVATE_KEY forge script script/DepositToInventory.s.sol:DepositToInventory --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"depositToEphemeral:local": "source ./.env.local && PRIVATE_KEY=$PRIVATE_KEY forge script script/DepositToEphemeral.s.sol:DepositToEphemeral --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvvv",
"depositToEphemeral:devnet": "source ./.env.devnet && PRIVATE_KEY=$PRIVATE_KEY forge script script/DepositToEphemeral.s.sol:DepositToEphemeral --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvvv",
"withdrawFromInv:local": "source ./.env.local && PRIVATE_KEY=$PRIVATE_KEY forge script script/WithdrawFromInventory.s.sol:WithdrawFromInventory --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvvv",
"withdrawFromInv:devnet": "source ./.env.devnet && PRIVATE_KEY=$PRIVATE_KEY forge script script/WithdrawFromInventory.s.sol:WithdrawFromInventory --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvvv",
"withdrawFromEphemeral:local": "source ./.env.local && PRIVATE_KEY=$PRIVATE_KEY forge script script/WithdrawFromEphemeral.s.sol:WithdrawFromEphemeral --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvvv",
"withdrawFromEphemeral:devnet": "source ./.env.devnet && PRIVATE_KEY=$PRIVATE_KEY forge script script/WithdrawFromEphemeral.s.sol:WithdrawFromEphemeral --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvvv",
"transferItems:local": "source ./.env.local && PRIVATE_KEY=$PRIVATE_KEY forge script script/TransferItems.s.sol:TransferItems --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"transferItems:devnet": "source ./.env.devnet && PRIVATE_KEY=$PRIVATE_KEY forge script script/TransferItems.s.sol:TransferItems --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"anchorSmartTurret:local": "source ./.env.local && WORLD_ADDRESS=$WORLD_ADDRESS RPC_URL=$RPC_URL PRIVATE_KEY=$PRIVATE_KEY forge script script/AnchorSmartTurret.s.sol:AnchorSmartTurret --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"anchorSmartTurret:devnet": "source ./.env.devnet && PRIVATE_KEY=$PRIVATE_KEY forge script script/AnchorSmartTurret.s.sol:AnchorSmartTurret --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"configureSmartTurret:local": "source ./.env.local && WORLD_ADDRESS=$WORLD_ADDRESS RPC_URL=$RPC_URL PRIVATE_KEY=$PRIVATE_KEY forge script script/ConfigureSmartTurret.s.sol:ConfigureSmartTurret --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"configureSmartTurret:devnet": "source ./.env.devnet && WORLD_ADDRESS=$WORLD_ADDRESS RPC_URL=$RPC_URL PRIVATE_KEY=$PRIVATE_KEY forge script script/ConfigureSmartTurret.s.sol:ConfigureSmartTurret --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"anchorSmartGate:local": "source ./.env.local && WORLD_ADDRESS=$WORLD_ADDRESS RPC_URL=$RPC_URL PRIVATE_KEY=$PRIVATE_KEY forge script script/AnchorSmartGate.s.sol:AnchorSmartGate --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"anchorSmartGate:devnet": "source ./.env.devnet && PRIVATE_KEY=$PRIVATE_KEY forge script script/AnchorSmartGate.s.sol:AnchorSmartGate --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"configureSmartGate:local": "source ./.env.local && WORLD_ADDRESS=$WORLD_ADDRESS RPC_URL=$RPC_URL PRIVATE_KEY=$PRIVATE_KEY forge script script/ConfigureSmartGate.s.sol:ConfigureSmartGate --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"configureSmartGate:devnet": "source ./.env.devnet && PRIVATE_KEY=$PRIVATE_KEY forge script script/ConfigureSmartGate.s.sol:ConfigureSmartGate --fork-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig \"run(address)\" $WORLD_ADDRESS -vvv",
"runAll:local": "pnpm run createSmartCharacter:local && pnpm run createMintERC20:local && pnpm run anchorSSU:local && pnpm run depositFuel:local && pnpm run bringOnline:local && pnpm run depositToInventory:local && pnpm run depositToEphemeral:local && pnpm run withdrawFromInv:local && pnpm run withdrawFromEphemeral:local && pnpm run transferItems:local && pnpm run anchorSmartTurret:local && pnpm run configureSmartTurret:local && pnpm run anchorSmartGate:local && pnpm run configureSmartGate:local",
"lint": "pnpm run prettier && pnpm run solhint",
"prettier": "prettier '**/*.sol' --plugin=prettier-plugin-solidity --check",
"fixFormat": "prettier '**/*.sol' --plugin=prettier-plugin-solidity --write",
Expand Down
80 changes: 80 additions & 0 deletions end-to-end-tests-v2/script/AnchorSSU.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
pragma solidity >=0.8.24;

import { Script } from "forge-std/Script.sol";
import { StoreSwitch } from "@latticexyz/store/src/StoreSwitch.sol";
import { ResourceId, WorldResourceIdLib } from "@latticexyz/world/src/WorldResourceId.sol";
import { IBaseWorld } from "@latticexyz/world/src/codegen/interfaces/IBaseWorld.sol";

import { GlobalDeployableState } from "@eveworld/world-v2/src/namespaces/evefrontier/codegen/tables/GlobalDeployableState.sol";
import { Characters } from "@eveworld/world-v2/src/namespaces/evefrontier/codegen/tables/Characters.sol";
import { CharactersByAddress } from "@eveworld/world-v2/src/namespaces/evefrontier/codegen/tables/CharactersByAddress.sol";
import { EntityRecordData, EntityMetadata } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/entity-record/types.sol";
import { SmartCharacterUtils } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/smart-character/SmartCharacterUtils.sol";
import { SmartStorageUnitUtils } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/smart-storage-unit/SmartStorageUnitUtils.sol";
import { DeployableUtils } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/deployable/DeployableUtils.sol";
import { DeployableSystem } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/deployable/DeployableSystem.sol";
import { SmartCharacterSystem } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/smart-character/SmartCharacterSystem.sol";
import { State, SmartObjectData } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/deployable/types.sol";
import { SmartStorageUnitSystem } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/smart-storage-unit/SmartStorageUnitSystem.sol";
import { Coord, WorldPosition } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/location/types.sol";

contract AnchorSSU is Script {
function run(address worldAddress) public {
StoreSwitch.setStoreAddress(worldAddress);
// Load the private key from the `PRIVATE_KEY` environment variable (in .env)
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
address player = vm.addr(deployerPrivateKey);

ResourceId smartCharacterSystemId = SmartCharacterUtils.smartCharacterSystemId();
ResourceId smartStorageSystemId = SmartStorageUnitUtils.smartStorageUnitSystemId();
ResourceId deployableSystemId = DeployableUtils.deployableSystemId();

// Start broadcasting transactions from the deployer account
vm.startBroadcast(deployerPrivateKey);
IBaseWorld world = IBaseWorld(worldAddress);

uint256 characterId = uint256(keccak256(abi.encode("item:<tenant_id>-<db_id>-2345")));
address characterAddress = player;
uint256 tribeId = 100;
EntityRecordData memory entityRecord = EntityRecordData({ typeId: 123, itemId: 234, volume: 100 });

EntityMetadata memory entityRecordMetadata = EntityMetadata({
name: "name",
dappURL: "dappURL",
description: "description"
});

if (
Characters.getCharacterAddress(characterId) == address(0) &&
CharactersByAddress.getCharacterId(characterAddress) == 0
) {
world.call(
smartCharacterSystemId,
abi.encodeCall(
SmartCharacterSystem.createCharacter,
(characterId, characterAddress, tribeId, entityRecord, entityRecordMetadata)
)
);
}

// check global state and resume if needed
if (GlobalDeployableState.getIsPaused() == false) {
world.call(deployableSystemId, abi.encodeCall(DeployableSystem.globalResume, ()));
}

uint256 smartObjectId = uint256(keccak256(abi.encode("item:<tenant_id>-<db_id>-00001")));
SmartObjectData memory smartObjectData = SmartObjectData({ owner: player, tokenURI: "test" });
Coord memory position = Coord({ x: 1, y: 1, z: 1 });
WorldPosition memory worldPosition = WorldPosition({ solarSystemId: 1, position: position });

world.call(
smartStorageSystemId,
abi.encodeCall(
SmartStorageUnitSystem.createAndAnchorSmartStorageUnit,
(smartObjectId, entityRecord, smartObjectData, worldPosition, 10, 3600, 1000000000, 1000000000, 1000000000)
)
);

vm.stopBroadcast();
}
}
52 changes: 52 additions & 0 deletions end-to-end-tests-v2/script/AnchorSmartGate.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
pragma solidity >=0.8.24;

import { Script } from "forge-std/Script.sol";
import { StoreSwitch } from "@latticexyz/store/src/StoreSwitch.sol";
import { ResourceId, WorldResourceIdLib } from "@latticexyz/world/src/WorldResourceId.sol";
import { IBaseWorld } from "@latticexyz/world/src/codegen/interfaces/IBaseWorld.sol";

import { GlobalDeployableState } from "@eveworld/world-v2/src/namespaces/evefrontier/codegen/tables/GlobalDeployableState.sol";
import { DeployableUtils } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/deployable/DeployableUtils.sol";
import { DeployableSystem } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/deployable/DeployableSystem.sol";
import { State, SmartObjectData } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/deployable/types.sol";
import { Coord, WorldPosition } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/location/types.sol";
import { SmartGateSystem } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/smart-gate/SmartGateSystem.sol";
import { SmartGateUtils } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/smart-gate/SmartGateUtils.sol";
import { EntityRecordData, EntityMetadata } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/entity-record/types.sol";

contract AnchorSmartGate is Script {
function run(address worldAddress) public {
StoreSwitch.setStoreAddress(worldAddress);
// Load the private key from the `PRIVATE_KEY` environment variable (in .env)
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
address player = vm.addr(deployerPrivateKey);

ResourceId smartGateSystemId = SmartGateUtils.smartGateSystemId();
ResourceId deployableSystemId = DeployableUtils.deployableSystemId();

// Start broadcasting transactions from the deployer account
vm.startBroadcast(deployerPrivateKey);
IBaseWorld world = IBaseWorld(worldAddress);

// check global state and resume if needed
if (GlobalDeployableState.getIsPaused() == false) {
world.call(deployableSystemId, abi.encodeCall(DeployableSystem.globalResume, ()));
}

uint256 smartObjectId = uint256(keccak256(abi.encode("item:<tenant_id>-<db_id>-00003")));
EntityRecordData memory entityRecord = EntityRecordData({ typeId: 123, itemId: 234, volume: 100 });
SmartObjectData memory smartObjectData = SmartObjectData({ owner: player, tokenURI: "test" });
Coord memory position = Coord({ x: 1, y: 1, z: 1 });
WorldPosition memory worldPosition = WorldPosition({ solarSystemId: 1, position: position });

world.call(
smartGateSystemId,
abi.encodeCall(
SmartGateSystem.createAndAnchorSmartGate,
(smartObjectId, entityRecord, smartObjectData, worldPosition, 10, 3600, 1000000000, 100010000 * 1e18)
)
);

vm.stopBroadcast();
}
}
52 changes: 52 additions & 0 deletions end-to-end-tests-v2/script/AnchorSmartTurret.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
pragma solidity >=0.8.24;

import { Script } from "forge-std/Script.sol";
import { StoreSwitch } from "@latticexyz/store/src/StoreSwitch.sol";
import { ResourceId, WorldResourceIdLib } from "@latticexyz/world/src/WorldResourceId.sol";
import { IBaseWorld } from "@latticexyz/world/src/codegen/interfaces/IBaseWorld.sol";

import { GlobalDeployableState } from "@eveworld/world-v2/src/namespaces/evefrontier/codegen/tables/GlobalDeployableState.sol";
import { DeployableUtils } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/deployable/DeployableUtils.sol";
import { DeployableSystem } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/deployable/DeployableSystem.sol";
import { State, SmartObjectData } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/deployable/types.sol";
import { Coord, WorldPosition } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/location/types.sol";
import { SmartTurretSystem } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/smart-turret/SmartTurretSystem.sol";
import { SmartTurretUtils } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/smart-turret/SmartTurretUtils.sol";
import { EntityRecordData, EntityMetadata } from "@eveworld/world-v2/src/namespaces/evefrontier/systems/entity-record/types.sol";

contract AnchorSmartTurret is Script {
function run(address worldAddress) public {
StoreSwitch.setStoreAddress(worldAddress);
// Load the private key from the `PRIVATE_KEY` environment variable (in .env)
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
address player = vm.addr(deployerPrivateKey);

ResourceId smartTurretSystemId = SmartTurretUtils.smartTurretSystemId();
ResourceId deployableSystemId = DeployableUtils.deployableSystemId();

// Start broadcasting transactions from the deployer account
vm.startBroadcast(deployerPrivateKey);
IBaseWorld world = IBaseWorld(worldAddress);

// check global state and resume if needed
if (GlobalDeployableState.getIsPaused() == false) {
world.call(deployableSystemId, abi.encodeCall(DeployableSystem.globalResume, ()));
}

uint256 smartObjectId = uint256(keccak256(abi.encode("item:<tenant_id>-<db_id>-00002")));
EntityRecordData memory entityRecord = EntityRecordData({ typeId: 123, itemId: 234, volume: 100 });
SmartObjectData memory smartObjectData = SmartObjectData({ owner: player, tokenURI: "test" });
Coord memory position = Coord({ x: 1, y: 1, z: 1 });
WorldPosition memory worldPosition = WorldPosition({ solarSystemId: 1, position: position });

world.call(
smartTurretSystemId,
abi.encodeCall(
SmartTurretSystem.createAndAnchorSmartTurret,
(smartObjectId, entityRecord, smartObjectData, worldPosition, 10, 3600, 1000000000)
)
);

vm.stopBroadcast();
}
}
Loading

0 comments on commit 7c94012

Please sign in to comment.