From edcdc2f1c1a19ee0700bc9c995dbf2011ef61617 Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Sun, 24 Dec 2023 07:12:28 +1100 Subject: [PATCH 1/6] allow ref names in dojoprovider --- .github/workflows/ci.yaml | 3 + packages/core/src/utils/index.ts | 6 +- packages/core/src/utils/manifest.json | 1501 +++++++++++++++++++++++++ packages/core/src/utils/utils.test.ts | 13 + 4 files changed, 1522 insertions(+), 1 deletion(-) create mode 100644 packages/core/src/utils/manifest.json create mode 100644 packages/core/src/utils/utils.test.ts diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1132e6a8..82d0de57 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -19,6 +19,9 @@ jobs: - name: Install dependencies run: bun install + - name: Build dependencies + run: bun run build + - name: Run Prettier run: bun x prettier --check . diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts index 3932efe9..8a48929f 100644 --- a/packages/core/src/utils/index.ts +++ b/packages/core/src/utils/index.ts @@ -10,7 +10,11 @@ export const getContractByName = (manifest: any, name: string) => { return ( manifest.contracts.find((contract: any) => { const nameParts = contract.name.split("::"); - return nameParts[nameParts.length - 1] === name; + // Check if the last part matches or if the full name matches + return ( + nameParts[nameParts.length - 1] === name || + contract.name === name + ); })?.address || "" ); }; diff --git a/packages/core/src/utils/manifest.json b/packages/core/src/utils/manifest.json new file mode 100644 index 00000000..42aecb20 --- /dev/null +++ b/packages/core/src/utils/manifest.json @@ -0,0 +1,1501 @@ +{ + "world": { + "name": "world", + "address": "0x33ac2f528bb97cc7b79148fd1756dc368be0e95d391d8c6d6473ecb60b4560e", + "class_hash": "0x5ac623f0c96059936bd2d0904bdd31799e430fe08a0caff7a5f497260b16497", + "abi": [ + { + "type": "impl", + "name": "World", + "interface_name": "dojo::world::IWorld" + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "enum", + "name": "core::option::Option::", + "variants": [ + { + "name": "Some", + "type": "core::felt252" + }, + { + "name": "None", + "type": "()" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::>", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::>" + } + ] + }, + { + "type": "enum", + "name": "core::bool", + "variants": [ + { + "name": "False", + "type": "()" + }, + { + "name": "True", + "type": "()" + } + ] + }, + { + "type": "interface", + "name": "dojo::world::IWorld", + "items": [ + { + "type": "function", + "name": "metadata_uri", + "inputs": [ + { + "name": "resource", + "type": "core::felt252" + } + ], + "outputs": [ + { + "type": "core::array::Span::" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "set_metadata_uri", + "inputs": [ + { + "name": "resource", + "type": "core::felt252" + }, + { + "name": "uri", + "type": "core::array::Span::" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "model", + "inputs": [ + { + "name": "name", + "type": "core::felt252" + } + ], + "outputs": [ + { + "type": "core::starknet::class_hash::ClassHash" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "register_model", + "inputs": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "deploy_contract", + "inputs": [ + { + "name": "salt", + "type": "core::felt252" + }, + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [ + { + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "state_mutability": "external" + }, + { + "type": "function", + "name": "upgrade_contract", + "inputs": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [ + { + "type": "core::starknet::class_hash::ClassHash" + } + ], + "state_mutability": "external" + }, + { + "type": "function", + "name": "uuid", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "external" + }, + { + "type": "function", + "name": "emit", + "inputs": [ + { + "name": "keys", + "type": "core::array::Array::" + }, + { + "name": "values", + "type": "core::array::Span::" + } + ], + "outputs": [], + "state_mutability": "view" + }, + { + "type": "function", + "name": "entity", + "inputs": [ + { + "name": "model", + "type": "core::felt252" + }, + { + "name": "keys", + "type": "core::array::Span::" + }, + { + "name": "offset", + "type": "core::integer::u8" + }, + { + "name": "length", + "type": "core::integer::u32" + }, + { + "name": "layout", + "type": "core::array::Span::" + } + ], + "outputs": [ + { + "type": "core::array::Span::" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "set_entity", + "inputs": [ + { + "name": "model", + "type": "core::felt252" + }, + { + "name": "keys", + "type": "core::array::Span::" + }, + { + "name": "offset", + "type": "core::integer::u8" + }, + { + "name": "values", + "type": "core::array::Span::" + }, + { + "name": "layout", + "type": "core::array::Span::" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "entities", + "inputs": [ + { + "name": "model", + "type": "core::felt252" + }, + { + "name": "index", + "type": "core::option::Option::" + }, + { + "name": "values", + "type": "core::array::Span::" + }, + { + "name": "values_length", + "type": "core::integer::u32" + }, + { + "name": "values_layout", + "type": "core::array::Span::" + } + ], + "outputs": [ + { + "type": "(core::array::Span::, core::array::Span::>)" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "entity_ids", + "inputs": [ + { + "name": "model", + "type": "core::felt252" + } + ], + "outputs": [ + { + "type": "core::array::Span::" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "set_executor", + "inputs": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "executor", + "inputs": [], + "outputs": [ + { + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "base", + "inputs": [], + "outputs": [ + { + "type": "core::starknet::class_hash::ClassHash" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "delete_entity", + "inputs": [ + { + "name": "model", + "type": "core::felt252" + }, + { + "name": "keys", + "type": "core::array::Span::" + }, + { + "name": "layout", + "type": "core::array::Span::" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "is_owner", + "inputs": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "resource", + "type": "core::felt252" + } + ], + "outputs": [ + { + "type": "core::bool" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "grant_owner", + "inputs": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "resource", + "type": "core::felt252" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "revoke_owner", + "inputs": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "resource", + "type": "core::felt252" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "is_writer", + "inputs": [ + { + "name": "model", + "type": "core::felt252" + }, + { + "name": "system", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [ + { + "type": "core::bool" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "grant_writer", + "inputs": [ + { + "name": "model", + "type": "core::felt252" + }, + { + "name": "system", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "revoke_writer", + "inputs": [ + { + "name": "model", + "type": "core::felt252" + }, + { + "name": "system", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "type": "impl", + "name": "UpgradeableWorld", + "interface_name": "dojo::world::IUpgradeableWorld" + }, + { + "type": "interface", + "name": "dojo::world::IUpgradeableWorld", + "items": [ + { + "type": "function", + "name": "upgrade", + "inputs": [ + { + "name": "new_class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "type": "constructor", + "name": "constructor", + "inputs": [ + { + "name": "executor", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "contract_base", + "type": "core::starknet::class_hash::ClassHash" + } + ] + }, + { + "type": "event", + "name": "dojo::world::world::WorldSpawned", + "kind": "struct", + "members": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "creator", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::world::world::ContractDeployed", + "kind": "struct", + "members": [ + { + "name": "salt", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + }, + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::world::world::ContractUpgraded", + "kind": "struct", + "members": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + }, + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::world::world::WorldUpgraded", + "kind": "struct", + "members": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::world::world::MetadataUpdate", + "kind": "struct", + "members": [ + { + "name": "resource", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "uri", + "type": "core::array::Span::", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::world::world::ModelRegistered", + "kind": "struct", + "members": [ + { + "name": "name", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + }, + { + "name": "prev_class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::world::world::StoreSetRecord", + "kind": "struct", + "members": [ + { + "name": "table", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "keys", + "type": "core::array::Span::", + "kind": "data" + }, + { + "name": "offset", + "type": "core::integer::u8", + "kind": "data" + }, + { + "name": "values", + "type": "core::array::Span::", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::world::world::StoreDelRecord", + "kind": "struct", + "members": [ + { + "name": "table", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "keys", + "type": "core::array::Span::", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::world::world::WriterUpdated", + "kind": "struct", + "members": [ + { + "name": "model", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "system", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "value", + "type": "core::bool", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::world::world::OwnerUpdated", + "kind": "struct", + "members": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "resource", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "value", + "type": "core::bool", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::world::world::ExecutorUpdated", + "kind": "struct", + "members": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "prev_address", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::world::world::Event", + "kind": "enum", + "variants": [ + { + "name": "WorldSpawned", + "type": "dojo::world::world::WorldSpawned", + "kind": "nested" + }, + { + "name": "ContractDeployed", + "type": "dojo::world::world::ContractDeployed", + "kind": "nested" + }, + { + "name": "ContractUpgraded", + "type": "dojo::world::world::ContractUpgraded", + "kind": "nested" + }, + { + "name": "WorldUpgraded", + "type": "dojo::world::world::WorldUpgraded", + "kind": "nested" + }, + { + "name": "MetadataUpdate", + "type": "dojo::world::world::MetadataUpdate", + "kind": "nested" + }, + { + "name": "ModelRegistered", + "type": "dojo::world::world::ModelRegistered", + "kind": "nested" + }, + { + "name": "StoreSetRecord", + "type": "dojo::world::world::StoreSetRecord", + "kind": "nested" + }, + { + "name": "StoreDelRecord", + "type": "dojo::world::world::StoreDelRecord", + "kind": "nested" + }, + { + "name": "WriterUpdated", + "type": "dojo::world::world::WriterUpdated", + "kind": "nested" + }, + { + "name": "OwnerUpdated", + "type": "dojo::world::world::OwnerUpdated", + "kind": "nested" + }, + { + "name": "ExecutorUpdated", + "type": "dojo::world::world::ExecutorUpdated", + "kind": "nested" + } + ] + } + ], + "reads": [], + "writes": [], + "computed": [] + }, + "executor": { + "name": "executor", + "address": null, + "class_hash": "0x585507fa2818fe78e66da6ea4c5915376739f4abf509d41153f60a16cb1f68d", + "abi": [ + { + "type": "impl", + "name": "Executor", + "interface_name": "dojo::executor::IExecutor" + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "interface", + "name": "dojo::executor::IExecutor", + "items": [ + { + "type": "function", + "name": "call", + "inputs": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash" + }, + { + "name": "entrypoint", + "type": "core::felt252" + }, + { + "name": "calldata", + "type": "core::array::Span::" + } + ], + "outputs": [ + { + "type": "core::array::Span::" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "event", + "name": "dojo::executor::executor::Event", + "kind": "enum", + "variants": [] + } + ], + "reads": [], + "writes": [], + "computed": [] + }, + "base": { + "name": "base", + "class_hash": "0x6c458453d35753703ad25632deec20a29faf8531942ec109e6eb0650316a2bc", + "abi": [ + { + "type": "impl", + "name": "WorldProviderImpl", + "interface_name": "dojo::world::IWorldProvider" + }, + { + "type": "struct", + "name": "dojo::world::IWorldDispatcher", + "members": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "type": "interface", + "name": "dojo::world::IWorldProvider", + "items": [ + { + "type": "function", + "name": "world", + "inputs": [], + "outputs": [ + { + "type": "dojo::world::IWorldDispatcher" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "impl", + "name": "UpgradableImpl", + "interface_name": "dojo::components::upgradeable::IUpgradeable" + }, + { + "type": "interface", + "name": "dojo::components::upgradeable::IUpgradeable", + "items": [ + { + "type": "function", + "name": "upgrade", + "inputs": [ + { + "name": "new_class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "type": "constructor", + "name": "constructor", + "inputs": [] + }, + { + "type": "event", + "name": "dojo::components::upgradeable::upgradeable::Upgraded", + "kind": "struct", + "members": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::components::upgradeable::upgradeable::Event", + "kind": "enum", + "variants": [ + { + "name": "Upgraded", + "type": "dojo::components::upgradeable::upgradeable::Upgraded", + "kind": "nested" + } + ] + }, + { + "type": "event", + "name": "dojo::base::base::Event", + "kind": "enum", + "variants": [ + { + "name": "UpgradeableEvent", + "type": "dojo::components::upgradeable::upgradeable::Event", + "kind": "nested" + } + ] + } + ] + }, + "contracts": [ + { + "name": "dojo_examples::actions::actions", + "address": "0x152dcff993befafe5001975149d2c50bd9621da7cbaed74f68e7d5e54e65abc", + "class_hash": "0x77e3b43ecd6211ba5af1eba19eca0940df73ca77c4c14ba0da75c1bd9297ca2", + "abi": [ + { + "type": "impl", + "name": "WorldProviderImpl", + "interface_name": "dojo::world::IWorldProvider" + }, + { + "type": "struct", + "name": "dojo::world::IWorldDispatcher", + "members": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "type": "interface", + "name": "dojo::world::IWorldProvider", + "items": [ + { + "type": "function", + "name": "world", + "inputs": [], + "outputs": [ + { + "type": "dojo::world::IWorldDispatcher" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "impl", + "name": "ActionsImpl", + "interface_name": "dojo_examples::actions::IActions" + }, + { + "type": "enum", + "name": "dojo_examples::models::Direction", + "variants": [ + { + "name": "None", + "type": "()" + }, + { + "name": "Left", + "type": "()" + }, + { + "name": "Right", + "type": "()" + }, + { + "name": "Up", + "type": "()" + }, + { + "name": "Down", + "type": "()" + } + ] + }, + { + "type": "interface", + "name": "dojo_examples::actions::IActions", + "items": [ + { + "type": "function", + "name": "spawn", + "inputs": [], + "outputs": [], + "state_mutability": "view" + }, + { + "type": "function", + "name": "move", + "inputs": [ + { + "name": "direction", + "type": "dojo_examples::models::Direction" + } + ], + "outputs": [], + "state_mutability": "view" + } + ] + }, + { + "type": "impl", + "name": "UpgradableImpl", + "interface_name": "dojo::components::upgradeable::IUpgradeable" + }, + { + "type": "interface", + "name": "dojo::components::upgradeable::IUpgradeable", + "items": [ + { + "type": "function", + "name": "upgrade", + "inputs": [ + { + "name": "new_class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "type": "function", + "name": "dojo_resource", + "inputs": [], + "outputs": [ + { + "type": "core::felt252" + } + ], + "state_mutability": "view" + }, + { + "type": "event", + "name": "dojo::components::upgradeable::upgradeable::Upgraded", + "kind": "struct", + "members": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::components::upgradeable::upgradeable::Event", + "kind": "enum", + "variants": [ + { + "name": "Upgraded", + "type": "dojo::components::upgradeable::upgradeable::Upgraded", + "kind": "nested" + } + ] + }, + { + "type": "event", + "name": "dojo_examples::actions::actions::Moved", + "kind": "struct", + "members": [ + { + "name": "player", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "direction", + "type": "dojo_examples::models::Direction", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo_examples::actions::actions::Event", + "kind": "enum", + "variants": [ + { + "name": "UpgradeableEvent", + "type": "dojo::components::upgradeable::upgradeable::Event", + "kind": "nested" + }, + { + "name": "Moved", + "type": "dojo_examples::actions::actions::Moved", + "kind": "nested" + } + ] + } + ], + "reads": [], + "writes": [], + "computed": [] + } + ], + "models": [ + { + "name": "dojo_examples::models::moves", + "members": [ + { + "name": "player", + "type": "ContractAddress", + "key": true + }, + { + "name": "remaining", + "type": "u8", + "key": false + }, + { + "name": "last_direction", + "type": "Direction", + "key": false + } + ], + "class_hash": "0x64495ca6dc1dc328972697b30468cea364bcb7452bbb6e4aaad3e4b3f190147", + "abi": [ + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "type": "core::felt252" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "unpacked_size", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "packed_size", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "function", + "name": "layout", + "inputs": [], + "outputs": [ + { + "type": "core::array::Span::" + } + ], + "state_mutability": "view" + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::>", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::>" + } + ] + }, + { + "type": "struct", + "name": "dojo::database::introspect::Struct", + "members": [ + { + "name": "name", + "type": "core::felt252" + }, + { + "name": "attrs", + "type": "core::array::Span::" + }, + { + "name": "children", + "type": "core::array::Span::>" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::<(core::felt252, core::array::Span::)>", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::<(core::felt252, core::array::Span::)>" + } + ] + }, + { + "type": "struct", + "name": "dojo::database::introspect::Enum", + "members": [ + { + "name": "name", + "type": "core::felt252" + }, + { + "name": "attrs", + "type": "core::array::Span::" + }, + { + "name": "children", + "type": "core::array::Span::<(core::felt252, core::array::Span::)>" + } + ] + }, + { + "type": "enum", + "name": "dojo::database::introspect::Ty", + "variants": [ + { + "name": "Primitive", + "type": "core::felt252" + }, + { + "name": "Struct", + "type": "dojo::database::introspect::Struct" + }, + { + "name": "Enum", + "type": "dojo::database::introspect::Enum" + }, + { + "name": "Tuple", + "type": "core::array::Span::>" + } + ] + }, + { + "type": "function", + "name": "schema", + "inputs": [], + "outputs": [ + { + "type": "dojo::database::introspect::Ty" + } + ], + "state_mutability": "view" + }, + { + "type": "event", + "name": "dojo_examples::models::moves::Event", + "kind": "enum", + "variants": [] + } + ] + }, + { + "name": "dojo_examples::models::position", + "members": [ + { + "name": "player", + "type": "ContractAddress", + "key": true + }, + { + "name": "vec", + "type": "Vec2", + "key": false + } + ], + "class_hash": "0x2b233bba9a232a5e891c85eca9f67beedca7a12f9768729ff017bcb62d25c9d", + "abi": [ + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "type": "core::felt252" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "unpacked_size", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "packed_size", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "function", + "name": "layout", + "inputs": [], + "outputs": [ + { + "type": "core::array::Span::" + } + ], + "state_mutability": "view" + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::>", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::>" + } + ] + }, + { + "type": "struct", + "name": "dojo::database::introspect::Struct", + "members": [ + { + "name": "name", + "type": "core::felt252" + }, + { + "name": "attrs", + "type": "core::array::Span::" + }, + { + "name": "children", + "type": "core::array::Span::>" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::<(core::felt252, core::array::Span::)>", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::<(core::felt252, core::array::Span::)>" + } + ] + }, + { + "type": "struct", + "name": "dojo::database::introspect::Enum", + "members": [ + { + "name": "name", + "type": "core::felt252" + }, + { + "name": "attrs", + "type": "core::array::Span::" + }, + { + "name": "children", + "type": "core::array::Span::<(core::felt252, core::array::Span::)>" + } + ] + }, + { + "type": "enum", + "name": "dojo::database::introspect::Ty", + "variants": [ + { + "name": "Primitive", + "type": "core::felt252" + }, + { + "name": "Struct", + "type": "dojo::database::introspect::Struct" + }, + { + "name": "Enum", + "type": "dojo::database::introspect::Enum" + }, + { + "name": "Tuple", + "type": "core::array::Span::>" + } + ] + }, + { + "type": "function", + "name": "schema", + "inputs": [], + "outputs": [ + { + "type": "dojo::database::introspect::Ty" + } + ], + "state_mutability": "view" + }, + { + "type": "event", + "name": "dojo_examples::models::position::Event", + "kind": "enum", + "variants": [] + } + ] + } + ] +} \ No newline at end of file diff --git a/packages/core/src/utils/utils.test.ts b/packages/core/src/utils/utils.test.ts new file mode 100644 index 00000000..24052135 --- /dev/null +++ b/packages/core/src/utils/utils.test.ts @@ -0,0 +1,13 @@ +import { expect, test } from "vitest"; +import { getContractByName } from "../utils"; +import manifest from "./manifest.json"; + +test("get address by contract name", () => { + expect(getContractByName(manifest, "actions")).toBe( + "0x152dcff993befafe5001975149d2c50bd9621da7cbaed74f68e7d5e54e65abc" + ); + + expect(getContractByName(manifest, "dojo_examples::actions::actions")).toBe( + "0x152dcff993befafe5001975149d2c50bd9621da7cbaed74f68e7d5e54e65abc" + ); +}); From ff1cb69c812e6d42496746017ea9b45d6ebb1c3a Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Sun, 24 Dec 2023 07:45:51 +1100 Subject: [PATCH 2/6] model name parsing --- bun.lockb | Bin 614768 -> 613832 bytes packages/core/bin/generateComponents.cjs | 21 +- packages/core/src/utils/index.ts | 27 + packages/core/src/utils/manifest.json | 3234 ++++++++++++---------- packages/core/src/utils/utils.test.ts | 22 +- 5 files changed, 1860 insertions(+), 1444 deletions(-) diff --git a/bun.lockb b/bun.lockb index deb4ec3b722530cea152d0e4cc8211f2fc6c1690..475aaed9715d5846bced073cb57cc0884770c9b5 100755 GIT binary patch delta 129193 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�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 diff --git a/packages/core/bin/generateComponents.cjs b/packages/core/bin/generateComponents.cjs index 563810e4..dcf7c205 100755 --- a/packages/core/bin/generateComponents.cjs +++ b/packages/core/bin/generateComponents.cjs @@ -3,6 +3,7 @@ const fs = require("fs"); const path = require("path"); const { execSync } = require("child_process"); +const { parseModelName } = require("../dist/index.js"); // Check for the required arguments if (process.argv.length !== 6) { @@ -52,14 +53,18 @@ manifest.models.forEach((model) => { const types = []; const customTypes = []; - let result = model.name.split("::").pop().split("_"); - let modelName = result - .map((part) => { - return part === part.toLowerCase() && part.length > 2 - ? part.charAt(0).toUpperCase() + part.slice(1) - : part.toUpperCase(); - }) - .join(""); + let modelName = parseModelName(model.name); + + console.log(modelName); + + // let result = model.name.split("::").pop().split("_"); + // let modelName = result + // .map((part) => { + // return part === part.toLowerCase() && part.length > 2 + // ? part.charAt(0).toUpperCase() + part.slice(1) + // : part.toUpperCase(); + // }) + // .join(""); try { const output = execSync( diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts index 8a48929f..1decc1c7 100644 --- a/packages/core/src/utils/index.ts +++ b/packages/core/src/utils/index.ts @@ -18,3 +18,30 @@ export const getContractByName = (manifest: any, name: string) => { })?.address || "" ); }; + +/** + * Parses a model name into a class name. + * + * @param {any} model - The model object. + * @returns {string} The class name. + * + */ +export const parseModelName = (model: any) => { + return model.name + .split("::") + .pop() + .split("_") + .map((part: string) => { + // Check if the part is a number + if (!isNaN(parseInt(part))) { + return part; // Keep numbers as is + } + // Convert part to uppercase if it's a known acronym or before a number + if (part.length <= 3 || !isNaN(parseInt(part.charAt(0)))) { + return part.toUpperCase(); + } + // Otherwise, capitalize the first letter and make the rest lowercase + return part.charAt(0).toUpperCase() + part.slice(1).toLowerCase(); + }) + .join(""); +}; diff --git a/packages/core/src/utils/manifest.json b/packages/core/src/utils/manifest.json index 42aecb20..5afc378a 100644 --- a/packages/core/src/utils/manifest.json +++ b/packages/core/src/utils/manifest.json @@ -1,1501 +1,1865 @@ { - "world": { - "name": "world", - "address": "0x33ac2f528bb97cc7b79148fd1756dc368be0e95d391d8c6d6473ecb60b4560e", - "class_hash": "0x5ac623f0c96059936bd2d0904bdd31799e430fe08a0caff7a5f497260b16497", - "abi": [ - { - "type": "impl", - "name": "World", - "interface_name": "dojo::world::IWorld" - }, - { - "type": "struct", - "name": "core::array::Span::", - "members": [ - { - "name": "snapshot", - "type": "@core::array::Array::" - } - ] - }, - { - "type": "struct", - "name": "core::array::Span::", - "members": [ - { - "name": "snapshot", - "type": "@core::array::Array::" - } - ] - }, - { - "type": "enum", - "name": "core::option::Option::", - "variants": [ - { - "name": "Some", - "type": "core::felt252" - }, - { - "name": "None", - "type": "()" - } - ] - }, - { - "type": "struct", - "name": "core::array::Span::>", - "members": [ - { - "name": "snapshot", - "type": "@core::array::Array::>" - } - ] - }, - { - "type": "enum", - "name": "core::bool", - "variants": [ - { - "name": "False", - "type": "()" - }, - { - "name": "True", - "type": "()" - } - ] - }, - { - "type": "interface", - "name": "dojo::world::IWorld", - "items": [ - { - "type": "function", - "name": "metadata_uri", - "inputs": [ - { - "name": "resource", - "type": "core::felt252" - } - ], - "outputs": [ - { - "type": "core::array::Span::" - } - ], - "state_mutability": "view" - }, - { - "type": "function", - "name": "set_metadata_uri", - "inputs": [ - { - "name": "resource", - "type": "core::felt252" - }, - { - "name": "uri", - "type": "core::array::Span::" - } - ], - "outputs": [], - "state_mutability": "external" - }, - { - "type": "function", - "name": "model", - "inputs": [ - { - "name": "name", - "type": "core::felt252" - } - ], - "outputs": [ - { - "type": "core::starknet::class_hash::ClassHash" - } - ], - "state_mutability": "view" - }, - { - "type": "function", - "name": "register_model", - "inputs": [ - { - "name": "class_hash", - "type": "core::starknet::class_hash::ClassHash" - } - ], - "outputs": [], - "state_mutability": "external" - }, - { - "type": "function", - "name": "deploy_contract", - "inputs": [ - { - "name": "salt", - "type": "core::felt252" - }, - { - "name": "class_hash", - "type": "core::starknet::class_hash::ClassHash" - } - ], - "outputs": [ - { - "type": "core::starknet::contract_address::ContractAddress" - } - ], - "state_mutability": "external" - }, - { - "type": "function", - "name": "upgrade_contract", - "inputs": [ - { - "name": "address", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "class_hash", - "type": "core::starknet::class_hash::ClassHash" - } - ], - "outputs": [ - { - "type": "core::starknet::class_hash::ClassHash" - } - ], - "state_mutability": "external" - }, - { - "type": "function", - "name": "uuid", - "inputs": [], - "outputs": [ - { - "type": "core::integer::u32" - } - ], - "state_mutability": "external" - }, - { - "type": "function", - "name": "emit", - "inputs": [ - { - "name": "keys", - "type": "core::array::Array::" - }, - { - "name": "values", - "type": "core::array::Span::" - } - ], - "outputs": [], - "state_mutability": "view" - }, - { - "type": "function", - "name": "entity", - "inputs": [ - { - "name": "model", - "type": "core::felt252" - }, - { - "name": "keys", - "type": "core::array::Span::" - }, - { - "name": "offset", - "type": "core::integer::u8" - }, - { - "name": "length", - "type": "core::integer::u32" - }, - { - "name": "layout", - "type": "core::array::Span::" - } - ], - "outputs": [ - { - "type": "core::array::Span::" - } - ], - "state_mutability": "view" - }, - { - "type": "function", - "name": "set_entity", - "inputs": [ - { - "name": "model", - "type": "core::felt252" - }, - { - "name": "keys", - "type": "core::array::Span::" - }, - { - "name": "offset", - "type": "core::integer::u8" - }, - { - "name": "values", - "type": "core::array::Span::" - }, - { - "name": "layout", - "type": "core::array::Span::" - } - ], - "outputs": [], - "state_mutability": "external" - }, - { - "type": "function", - "name": "entities", - "inputs": [ - { - "name": "model", - "type": "core::felt252" - }, - { - "name": "index", - "type": "core::option::Option::" - }, - { - "name": "values", - "type": "core::array::Span::" - }, - { - "name": "values_length", - "type": "core::integer::u32" - }, - { - "name": "values_layout", - "type": "core::array::Span::" - } - ], - "outputs": [ - { - "type": "(core::array::Span::, core::array::Span::>)" - } - ], - "state_mutability": "view" - }, - { - "type": "function", - "name": "entity_ids", - "inputs": [ - { - "name": "model", - "type": "core::felt252" - } - ], - "outputs": [ - { - "type": "core::array::Span::" - } - ], - "state_mutability": "view" - }, - { - "type": "function", - "name": "set_executor", - "inputs": [ - { - "name": "contract_address", - "type": "core::starknet::contract_address::ContractAddress" - } - ], - "outputs": [], - "state_mutability": "external" - }, - { - "type": "function", - "name": "executor", - "inputs": [], - "outputs": [ - { - "type": "core::starknet::contract_address::ContractAddress" - } - ], - "state_mutability": "view" - }, - { - "type": "function", - "name": "base", - "inputs": [], - "outputs": [ - { - "type": "core::starknet::class_hash::ClassHash" - } - ], - "state_mutability": "view" - }, - { - "type": "function", - "name": "delete_entity", - "inputs": [ - { - "name": "model", - "type": "core::felt252" - }, - { - "name": "keys", - "type": "core::array::Span::" - }, - { - "name": "layout", - "type": "core::array::Span::" - } - ], - "outputs": [], - "state_mutability": "external" - }, - { - "type": "function", - "name": "is_owner", - "inputs": [ - { - "name": "address", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "resource", - "type": "core::felt252" - } - ], - "outputs": [ - { - "type": "core::bool" - } - ], - "state_mutability": "view" - }, - { - "type": "function", - "name": "grant_owner", - "inputs": [ - { - "name": "address", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "resource", - "type": "core::felt252" - } - ], - "outputs": [], - "state_mutability": "external" - }, - { - "type": "function", - "name": "revoke_owner", - "inputs": [ - { - "name": "address", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "resource", - "type": "core::felt252" - } - ], - "outputs": [], - "state_mutability": "external" - }, - { - "type": "function", - "name": "is_writer", - "inputs": [ - { - "name": "model", - "type": "core::felt252" - }, - { - "name": "system", - "type": "core::starknet::contract_address::ContractAddress" - } - ], - "outputs": [ - { - "type": "core::bool" - } - ], - "state_mutability": "view" - }, - { - "type": "function", - "name": "grant_writer", - "inputs": [ - { - "name": "model", - "type": "core::felt252" - }, - { - "name": "system", - "type": "core::starknet::contract_address::ContractAddress" - } - ], - "outputs": [], - "state_mutability": "external" - }, - { - "type": "function", - "name": "revoke_writer", - "inputs": [ - { - "name": "model", - "type": "core::felt252" - }, - { - "name": "system", - "type": "core::starknet::contract_address::ContractAddress" - } - ], - "outputs": [], - "state_mutability": "external" - } - ] - }, - { - "type": "impl", - "name": "UpgradeableWorld", - "interface_name": "dojo::world::IUpgradeableWorld" - }, - { - "type": "interface", - "name": "dojo::world::IUpgradeableWorld", - "items": [ - { - "type": "function", - "name": "upgrade", - "inputs": [ - { - "name": "new_class_hash", - "type": "core::starknet::class_hash::ClassHash" - } - ], - "outputs": [], - "state_mutability": "external" - } - ] - }, - { - "type": "constructor", - "name": "constructor", - "inputs": [ - { - "name": "executor", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "contract_base", - "type": "core::starknet::class_hash::ClassHash" - } - ] - }, - { - "type": "event", - "name": "dojo::world::world::WorldSpawned", - "kind": "struct", - "members": [ - { - "name": "address", - "type": "core::starknet::contract_address::ContractAddress", - "kind": "data" - }, - { - "name": "creator", - "type": "core::starknet::contract_address::ContractAddress", - "kind": "data" - } - ] - }, - { - "type": "event", - "name": "dojo::world::world::ContractDeployed", - "kind": "struct", - "members": [ - { - "name": "salt", - "type": "core::felt252", - "kind": "data" - }, - { - "name": "class_hash", - "type": "core::starknet::class_hash::ClassHash", - "kind": "data" - }, - { - "name": "address", - "type": "core::starknet::contract_address::ContractAddress", - "kind": "data" - } - ] - }, - { - "type": "event", - "name": "dojo::world::world::ContractUpgraded", - "kind": "struct", - "members": [ - { - "name": "class_hash", - "type": "core::starknet::class_hash::ClassHash", - "kind": "data" - }, - { - "name": "address", - "type": "core::starknet::contract_address::ContractAddress", - "kind": "data" - } - ] - }, - { - "type": "event", - "name": "dojo::world::world::WorldUpgraded", - "kind": "struct", - "members": [ - { - "name": "class_hash", - "type": "core::starknet::class_hash::ClassHash", - "kind": "data" - } - ] - }, - { - "type": "event", - "name": "dojo::world::world::MetadataUpdate", - "kind": "struct", - "members": [ - { - "name": "resource", - "type": "core::felt252", - "kind": "data" - }, - { - "name": "uri", - "type": "core::array::Span::", - "kind": "data" - } - ] - }, - { - "type": "event", - "name": "dojo::world::world::ModelRegistered", - "kind": "struct", - "members": [ - { - "name": "name", - "type": "core::felt252", - "kind": "data" - }, - { - "name": "class_hash", - "type": "core::starknet::class_hash::ClassHash", - "kind": "data" - }, - { - "name": "prev_class_hash", - "type": "core::starknet::class_hash::ClassHash", - "kind": "data" - } - ] - }, - { - "type": "event", - "name": "dojo::world::world::StoreSetRecord", - "kind": "struct", - "members": [ - { - "name": "table", - "type": "core::felt252", - "kind": "data" - }, - { - "name": "keys", - "type": "core::array::Span::", - "kind": "data" - }, - { - "name": "offset", - "type": "core::integer::u8", - "kind": "data" - }, - { - "name": "values", - "type": "core::array::Span::", - "kind": "data" - } - ] - }, - { - "type": "event", - "name": "dojo::world::world::StoreDelRecord", - "kind": "struct", - "members": [ - { - "name": "table", - "type": "core::felt252", - "kind": "data" - }, - { - "name": "keys", - "type": "core::array::Span::", - "kind": "data" - } - ] - }, - { - "type": "event", - "name": "dojo::world::world::WriterUpdated", - "kind": "struct", - "members": [ - { - "name": "model", - "type": "core::felt252", - "kind": "data" - }, - { - "name": "system", - "type": "core::starknet::contract_address::ContractAddress", - "kind": "data" - }, - { - "name": "value", - "type": "core::bool", - "kind": "data" - } - ] - }, - { - "type": "event", - "name": "dojo::world::world::OwnerUpdated", - "kind": "struct", - "members": [ - { - "name": "address", - "type": "core::starknet::contract_address::ContractAddress", - "kind": "data" - }, - { - "name": "resource", - "type": "core::felt252", - "kind": "data" - }, - { - "name": "value", - "type": "core::bool", - "kind": "data" - } - ] - }, - { - "type": "event", - "name": "dojo::world::world::ExecutorUpdated", - "kind": "struct", - "members": [ - { - "name": "address", - "type": "core::starknet::contract_address::ContractAddress", - "kind": "data" - }, - { - "name": "prev_address", - "type": "core::starknet::contract_address::ContractAddress", - "kind": "data" - } - ] - }, - { - "type": "event", - "name": "dojo::world::world::Event", - "kind": "enum", - "variants": [ - { - "name": "WorldSpawned", - "type": "dojo::world::world::WorldSpawned", - "kind": "nested" - }, - { - "name": "ContractDeployed", - "type": "dojo::world::world::ContractDeployed", - "kind": "nested" - }, - { - "name": "ContractUpgraded", - "type": "dojo::world::world::ContractUpgraded", - "kind": "nested" - }, - { - "name": "WorldUpgraded", - "type": "dojo::world::world::WorldUpgraded", - "kind": "nested" - }, - { - "name": "MetadataUpdate", - "type": "dojo::world::world::MetadataUpdate", - "kind": "nested" - }, - { - "name": "ModelRegistered", - "type": "dojo::world::world::ModelRegistered", - "kind": "nested" - }, - { - "name": "StoreSetRecord", - "type": "dojo::world::world::StoreSetRecord", - "kind": "nested" - }, - { - "name": "StoreDelRecord", - "type": "dojo::world::world::StoreDelRecord", - "kind": "nested" - }, - { - "name": "WriterUpdated", - "type": "dojo::world::world::WriterUpdated", - "kind": "nested" - }, - { - "name": "OwnerUpdated", - "type": "dojo::world::world::OwnerUpdated", - "kind": "nested" - }, - { - "name": "ExecutorUpdated", - "type": "dojo::world::world::ExecutorUpdated", - "kind": "nested" - } - ] - } - ], - "reads": [], - "writes": [], - "computed": [] - }, - "executor": { - "name": "executor", - "address": null, - "class_hash": "0x585507fa2818fe78e66da6ea4c5915376739f4abf509d41153f60a16cb1f68d", - "abi": [ - { - "type": "impl", - "name": "Executor", - "interface_name": "dojo::executor::IExecutor" - }, - { - "type": "struct", - "name": "core::array::Span::", - "members": [ - { - "name": "snapshot", - "type": "@core::array::Array::" - } - ] - }, - { - "type": "interface", - "name": "dojo::executor::IExecutor", - "items": [ - { - "type": "function", - "name": "call", - "inputs": [ - { - "name": "class_hash", - "type": "core::starknet::class_hash::ClassHash" - }, - { - "name": "entrypoint", - "type": "core::felt252" - }, - { - "name": "calldata", - "type": "core::array::Span::" - } - ], - "outputs": [ - { - "type": "core::array::Span::" - } - ], - "state_mutability": "view" - } - ] - }, - { - "type": "event", - "name": "dojo::executor::executor::Event", - "kind": "enum", - "variants": [] - } - ], - "reads": [], - "writes": [], - "computed": [] - }, - "base": { - "name": "base", - "class_hash": "0x6c458453d35753703ad25632deec20a29faf8531942ec109e6eb0650316a2bc", - "abi": [ - { - "type": "impl", - "name": "WorldProviderImpl", - "interface_name": "dojo::world::IWorldProvider" - }, - { - "type": "struct", - "name": "dojo::world::IWorldDispatcher", - "members": [ - { - "name": "contract_address", - "type": "core::starknet::contract_address::ContractAddress" - } - ] - }, - { - "type": "interface", - "name": "dojo::world::IWorldProvider", - "items": [ - { - "type": "function", - "name": "world", - "inputs": [], - "outputs": [ - { - "type": "dojo::world::IWorldDispatcher" - } - ], - "state_mutability": "view" - } - ] - }, - { - "type": "impl", - "name": "UpgradableImpl", - "interface_name": "dojo::components::upgradeable::IUpgradeable" - }, - { - "type": "interface", - "name": "dojo::components::upgradeable::IUpgradeable", - "items": [ - { - "type": "function", - "name": "upgrade", - "inputs": [ - { - "name": "new_class_hash", - "type": "core::starknet::class_hash::ClassHash" - } - ], - "outputs": [], - "state_mutability": "external" - } - ] - }, - { - "type": "constructor", - "name": "constructor", - "inputs": [] - }, - { - "type": "event", - "name": "dojo::components::upgradeable::upgradeable::Upgraded", - "kind": "struct", - "members": [ - { - "name": "class_hash", - "type": "core::starknet::class_hash::ClassHash", - "kind": "data" - } - ] - }, - { - "type": "event", - "name": "dojo::components::upgradeable::upgradeable::Event", - "kind": "enum", - "variants": [ - { - "name": "Upgraded", - "type": "dojo::components::upgradeable::upgradeable::Upgraded", - "kind": "nested" - } - ] - }, - { - "type": "event", - "name": "dojo::base::base::Event", - "kind": "enum", - "variants": [ - { - "name": "UpgradeableEvent", - "type": "dojo::components::upgradeable::upgradeable::Event", - "kind": "nested" - } - ] - } - ] - }, - "contracts": [ - { - "name": "dojo_examples::actions::actions", - "address": "0x152dcff993befafe5001975149d2c50bd9621da7cbaed74f68e7d5e54e65abc", - "class_hash": "0x77e3b43ecd6211ba5af1eba19eca0940df73ca77c4c14ba0da75c1bd9297ca2", - "abi": [ - { - "type": "impl", - "name": "WorldProviderImpl", - "interface_name": "dojo::world::IWorldProvider" - }, - { - "type": "struct", - "name": "dojo::world::IWorldDispatcher", - "members": [ + "world": { + "name": "world", + "address": "0x33ac2f528bb97cc7b79148fd1756dc368be0e95d391d8c6d6473ecb60b4560e", + "class_hash": "0x5ac623f0c96059936bd2d0904bdd31799e430fe08a0caff7a5f497260b16497", + "abi": [ { - "name": "contract_address", - "type": "core::starknet::contract_address::ContractAddress" - } - ] - }, - { - "type": "interface", - "name": "dojo::world::IWorldProvider", - "items": [ - { - "type": "function", - "name": "world", - "inputs": [], - "outputs": [ - { - "type": "dojo::world::IWorldDispatcher" - } - ], - "state_mutability": "view" - } - ] - }, - { - "type": "impl", - "name": "ActionsImpl", - "interface_name": "dojo_examples::actions::IActions" - }, - { - "type": "enum", - "name": "dojo_examples::models::Direction", - "variants": [ - { - "name": "None", - "type": "()" + "type": "impl", + "name": "World", + "interface_name": "dojo::world::IWorld" }, { - "name": "Left", - "type": "()" + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] }, { - "name": "Right", - "type": "()" + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] }, { - "name": "Up", - "type": "()" + "type": "enum", + "name": "core::option::Option::", + "variants": [ + { + "name": "Some", + "type": "core::felt252" + }, + { + "name": "None", + "type": "()" + } + ] }, { - "name": "Down", - "type": "()" - } - ] - }, - { - "type": "interface", - "name": "dojo_examples::actions::IActions", - "items": [ - { - "type": "function", - "name": "spawn", - "inputs": [], - "outputs": [], - "state_mutability": "view" + "type": "struct", + "name": "core::array::Span::>", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::>" + } + ] }, { - "type": "function", - "name": "move", - "inputs": [ - { - "name": "direction", - "type": "dojo_examples::models::Direction" - } - ], - "outputs": [], - "state_mutability": "view" - } - ] - }, - { - "type": "impl", - "name": "UpgradableImpl", - "interface_name": "dojo::components::upgradeable::IUpgradeable" - }, - { - "type": "interface", - "name": "dojo::components::upgradeable::IUpgradeable", - "items": [ - { - "type": "function", - "name": "upgrade", - "inputs": [ - { - "name": "new_class_hash", - "type": "core::starknet::class_hash::ClassHash" - } - ], - "outputs": [], - "state_mutability": "external" - } - ] - }, - { - "type": "function", - "name": "dojo_resource", - "inputs": [], - "outputs": [ - { - "type": "core::felt252" - } - ], - "state_mutability": "view" - }, - { - "type": "event", - "name": "dojo::components::upgradeable::upgradeable::Upgraded", - "kind": "struct", - "members": [ - { - "name": "class_hash", - "type": "core::starknet::class_hash::ClassHash", - "kind": "data" - } - ] - }, - { - "type": "event", - "name": "dojo::components::upgradeable::upgradeable::Event", - "kind": "enum", - "variants": [ - { - "name": "Upgraded", - "type": "dojo::components::upgradeable::upgradeable::Upgraded", - "kind": "nested" - } - ] - }, - { - "type": "event", - "name": "dojo_examples::actions::actions::Moved", - "kind": "struct", - "members": [ - { - "name": "player", - "type": "core::starknet::contract_address::ContractAddress", - "kind": "data" + "type": "enum", + "name": "core::bool", + "variants": [ + { + "name": "False", + "type": "()" + }, + { + "name": "True", + "type": "()" + } + ] }, { - "name": "direction", - "type": "dojo_examples::models::Direction", - "kind": "data" - } - ] - }, - { - "type": "event", - "name": "dojo_examples::actions::actions::Event", - "kind": "enum", - "variants": [ - { - "name": "UpgradeableEvent", - "type": "dojo::components::upgradeable::upgradeable::Event", - "kind": "nested" + "type": "interface", + "name": "dojo::world::IWorld", + "items": [ + { + "type": "function", + "name": "metadata_uri", + "inputs": [ + { + "name": "resource", + "type": "core::felt252" + } + ], + "outputs": [ + { + "type": "core::array::Span::" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "set_metadata_uri", + "inputs": [ + { + "name": "resource", + "type": "core::felt252" + }, + { + "name": "uri", + "type": "core::array::Span::" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "model", + "inputs": [ + { + "name": "name", + "type": "core::felt252" + } + ], + "outputs": [ + { + "type": "core::starknet::class_hash::ClassHash" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "register_model", + "inputs": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "deploy_contract", + "inputs": [ + { + "name": "salt", + "type": "core::felt252" + }, + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [ + { + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "state_mutability": "external" + }, + { + "type": "function", + "name": "upgrade_contract", + "inputs": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [ + { + "type": "core::starknet::class_hash::ClassHash" + } + ], + "state_mutability": "external" + }, + { + "type": "function", + "name": "uuid", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "external" + }, + { + "type": "function", + "name": "emit", + "inputs": [ + { + "name": "keys", + "type": "core::array::Array::" + }, + { + "name": "values", + "type": "core::array::Span::" + } + ], + "outputs": [], + "state_mutability": "view" + }, + { + "type": "function", + "name": "entity", + "inputs": [ + { + "name": "model", + "type": "core::felt252" + }, + { + "name": "keys", + "type": "core::array::Span::" + }, + { + "name": "offset", + "type": "core::integer::u8" + }, + { + "name": "length", + "type": "core::integer::u32" + }, + { + "name": "layout", + "type": "core::array::Span::" + } + ], + "outputs": [ + { + "type": "core::array::Span::" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "set_entity", + "inputs": [ + { + "name": "model", + "type": "core::felt252" + }, + { + "name": "keys", + "type": "core::array::Span::" + }, + { + "name": "offset", + "type": "core::integer::u8" + }, + { + "name": "values", + "type": "core::array::Span::" + }, + { + "name": "layout", + "type": "core::array::Span::" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "entities", + "inputs": [ + { + "name": "model", + "type": "core::felt252" + }, + { + "name": "index", + "type": "core::option::Option::" + }, + { + "name": "values", + "type": "core::array::Span::" + }, + { + "name": "values_length", + "type": "core::integer::u32" + }, + { + "name": "values_layout", + "type": "core::array::Span::" + } + ], + "outputs": [ + { + "type": "(core::array::Span::, core::array::Span::>)" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "entity_ids", + "inputs": [ + { + "name": "model", + "type": "core::felt252" + } + ], + "outputs": [ + { + "type": "core::array::Span::" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "set_executor", + "inputs": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "executor", + "inputs": [], + "outputs": [ + { + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "base", + "inputs": [], + "outputs": [ + { + "type": "core::starknet::class_hash::ClassHash" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "delete_entity", + "inputs": [ + { + "name": "model", + "type": "core::felt252" + }, + { + "name": "keys", + "type": "core::array::Span::" + }, + { + "name": "layout", + "type": "core::array::Span::" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "is_owner", + "inputs": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "resource", + "type": "core::felt252" + } + ], + "outputs": [ + { + "type": "core::bool" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "grant_owner", + "inputs": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "resource", + "type": "core::felt252" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "revoke_owner", + "inputs": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "resource", + "type": "core::felt252" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "is_writer", + "inputs": [ + { + "name": "model", + "type": "core::felt252" + }, + { + "name": "system", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [ + { + "type": "core::bool" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "grant_writer", + "inputs": [ + { + "name": "model", + "type": "core::felt252" + }, + { + "name": "system", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "revoke_writer", + "inputs": [ + { + "name": "model", + "type": "core::felt252" + }, + { + "name": "system", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] }, { - "name": "Moved", - "type": "dojo_examples::actions::actions::Moved", - "kind": "nested" - } - ] - } - ], - "reads": [], - "writes": [], - "computed": [] - } - ], - "models": [ - { - "name": "dojo_examples::models::moves", - "members": [ - { - "name": "player", - "type": "ContractAddress", - "key": true - }, - { - "name": "remaining", - "type": "u8", - "key": false - }, - { - "name": "last_direction", - "type": "Direction", - "key": false - } - ], - "class_hash": "0x64495ca6dc1dc328972697b30468cea364bcb7452bbb6e4aaad3e4b3f190147", - "abi": [ - { - "type": "function", - "name": "name", - "inputs": [], - "outputs": [ - { - "type": "core::felt252" - } - ], - "state_mutability": "view" - }, - { - "type": "function", - "name": "unpacked_size", - "inputs": [], - "outputs": [ - { - "type": "core::integer::u32" - } - ], - "state_mutability": "view" - }, - { - "type": "function", - "name": "packed_size", - "inputs": [], - "outputs": [ - { - "type": "core::integer::u32" - } - ], - "state_mutability": "view" - }, - { - "type": "struct", - "name": "core::array::Span::", - "members": [ - { - "name": "snapshot", - "type": "@core::array::Array::" - } - ] - }, - { - "type": "function", - "name": "layout", - "inputs": [], - "outputs": [ - { - "type": "core::array::Span::" - } - ], - "state_mutability": "view" - }, - { - "type": "struct", - "name": "core::array::Span::", - "members": [ + "type": "impl", + "name": "UpgradeableWorld", + "interface_name": "dojo::world::IUpgradeableWorld" + }, { - "name": "snapshot", - "type": "@core::array::Array::" - } - ] - }, - { - "type": "struct", - "name": "core::array::Span::>", - "members": [ + "type": "interface", + "name": "dojo::world::IUpgradeableWorld", + "items": [ + { + "type": "function", + "name": "upgrade", + "inputs": [ + { + "name": "new_class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, { - "name": "snapshot", - "type": "@core::array::Array::>" - } - ] - }, - { - "type": "struct", - "name": "dojo::database::introspect::Struct", - "members": [ + "type": "constructor", + "name": "constructor", + "inputs": [ + { + "name": "executor", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "contract_base", + "type": "core::starknet::class_hash::ClassHash" + } + ] + }, { - "name": "name", - "type": "core::felt252" + "type": "event", + "name": "dojo::world::world::WorldSpawned", + "kind": "struct", + "members": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "creator", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + } + ] }, { - "name": "attrs", - "type": "core::array::Span::" + "type": "event", + "name": "dojo::world::world::ContractDeployed", + "kind": "struct", + "members": [ + { + "name": "salt", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + }, + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + } + ] }, { - "name": "children", - "type": "core::array::Span::>" - } - ] - }, - { - "type": "struct", - "name": "core::array::Span::<(core::felt252, core::array::Span::)>", - "members": [ + "type": "event", + "name": "dojo::world::world::ContractUpgraded", + "kind": "struct", + "members": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + }, + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + } + ] + }, { - "name": "snapshot", - "type": "@core::array::Array::<(core::felt252, core::array::Span::)>" - } - ] - }, - { - "type": "struct", - "name": "dojo::database::introspect::Enum", - "members": [ + "type": "event", + "name": "dojo::world::world::WorldUpgraded", + "kind": "struct", + "members": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + } + ] + }, { - "name": "name", - "type": "core::felt252" + "type": "event", + "name": "dojo::world::world::MetadataUpdate", + "kind": "struct", + "members": [ + { + "name": "resource", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "uri", + "type": "core::array::Span::", + "kind": "data" + } + ] }, { - "name": "attrs", - "type": "core::array::Span::" + "type": "event", + "name": "dojo::world::world::ModelRegistered", + "kind": "struct", + "members": [ + { + "name": "name", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + }, + { + "name": "prev_class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + } + ] }, { - "name": "children", - "type": "core::array::Span::<(core::felt252, core::array::Span::)>" - } - ] - }, - { - "type": "enum", - "name": "dojo::database::introspect::Ty", - "variants": [ + "type": "event", + "name": "dojo::world::world::StoreSetRecord", + "kind": "struct", + "members": [ + { + "name": "table", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "keys", + "type": "core::array::Span::", + "kind": "data" + }, + { + "name": "offset", + "type": "core::integer::u8", + "kind": "data" + }, + { + "name": "values", + "type": "core::array::Span::", + "kind": "data" + } + ] + }, { - "name": "Primitive", - "type": "core::felt252" + "type": "event", + "name": "dojo::world::world::StoreDelRecord", + "kind": "struct", + "members": [ + { + "name": "table", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "keys", + "type": "core::array::Span::", + "kind": "data" + } + ] }, { - "name": "Struct", - "type": "dojo::database::introspect::Struct" + "type": "event", + "name": "dojo::world::world::WriterUpdated", + "kind": "struct", + "members": [ + { + "name": "model", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "system", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "value", + "type": "core::bool", + "kind": "data" + } + ] }, { - "name": "Enum", - "type": "dojo::database::introspect::Enum" + "type": "event", + "name": "dojo::world::world::OwnerUpdated", + "kind": "struct", + "members": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "resource", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "value", + "type": "core::bool", + "kind": "data" + } + ] }, { - "name": "Tuple", - "type": "core::array::Span::>" - } - ] - }, - { - "type": "function", - "name": "schema", - "inputs": [], - "outputs": [ + "type": "event", + "name": "dojo::world::world::ExecutorUpdated", + "kind": "struct", + "members": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "prev_address", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + } + ] + }, { - "type": "dojo::database::introspect::Ty" + "type": "event", + "name": "dojo::world::world::Event", + "kind": "enum", + "variants": [ + { + "name": "WorldSpawned", + "type": "dojo::world::world::WorldSpawned", + "kind": "nested" + }, + { + "name": "ContractDeployed", + "type": "dojo::world::world::ContractDeployed", + "kind": "nested" + }, + { + "name": "ContractUpgraded", + "type": "dojo::world::world::ContractUpgraded", + "kind": "nested" + }, + { + "name": "WorldUpgraded", + "type": "dojo::world::world::WorldUpgraded", + "kind": "nested" + }, + { + "name": "MetadataUpdate", + "type": "dojo::world::world::MetadataUpdate", + "kind": "nested" + }, + { + "name": "ModelRegistered", + "type": "dojo::world::world::ModelRegistered", + "kind": "nested" + }, + { + "name": "StoreSetRecord", + "type": "dojo::world::world::StoreSetRecord", + "kind": "nested" + }, + { + "name": "StoreDelRecord", + "type": "dojo::world::world::StoreDelRecord", + "kind": "nested" + }, + { + "name": "WriterUpdated", + "type": "dojo::world::world::WriterUpdated", + "kind": "nested" + }, + { + "name": "OwnerUpdated", + "type": "dojo::world::world::OwnerUpdated", + "kind": "nested" + }, + { + "name": "ExecutorUpdated", + "type": "dojo::world::world::ExecutorUpdated", + "kind": "nested" + } + ] } - ], - "state_mutability": "view" - }, - { - "type": "event", - "name": "dojo_examples::models::moves::Event", - "kind": "enum", - "variants": [] - } - ] + ], + "reads": [], + "writes": [], + "computed": [] }, - { - "name": "dojo_examples::models::position", - "members": [ - { - "name": "player", - "type": "ContractAddress", - "key": true - }, - { - "name": "vec", - "type": "Vec2", - "key": false - } - ], - "class_hash": "0x2b233bba9a232a5e891c85eca9f67beedca7a12f9768729ff017bcb62d25c9d", - "abi": [ - { - "type": "function", - "name": "name", - "inputs": [], - "outputs": [ - { - "type": "core::felt252" - } - ], - "state_mutability": "view" - }, - { - "type": "function", - "name": "unpacked_size", - "inputs": [], - "outputs": [ - { - "type": "core::integer::u32" - } - ], - "state_mutability": "view" - }, - { - "type": "function", - "name": "packed_size", - "inputs": [], - "outputs": [ - { - "type": "core::integer::u32" - } - ], - "state_mutability": "view" - }, - { - "type": "struct", - "name": "core::array::Span::", - "members": [ + "executor": { + "name": "executor", + "address": null, + "class_hash": "0x585507fa2818fe78e66da6ea4c5915376739f4abf509d41153f60a16cb1f68d", + "abi": [ { - "name": "snapshot", - "type": "@core::array::Array::" - } - ] - }, - { - "type": "function", - "name": "layout", - "inputs": [], - "outputs": [ + "type": "impl", + "name": "Executor", + "interface_name": "dojo::executor::IExecutor" + }, { - "type": "core::array::Span::" - } - ], - "state_mutability": "view" - }, - { - "type": "struct", - "name": "core::array::Span::", - "members": [ + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, { - "name": "snapshot", - "type": "@core::array::Array::" - } - ] - }, - { - "type": "struct", - "name": "core::array::Span::>", - "members": [ + "type": "interface", + "name": "dojo::executor::IExecutor", + "items": [ + { + "type": "function", + "name": "call", + "inputs": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash" + }, + { + "name": "entrypoint", + "type": "core::felt252" + }, + { + "name": "calldata", + "type": "core::array::Span::" + } + ], + "outputs": [ + { + "type": "core::array::Span::" + } + ], + "state_mutability": "view" + } + ] + }, { - "name": "snapshot", - "type": "@core::array::Array::>" + "type": "event", + "name": "dojo::executor::executor::Event", + "kind": "enum", + "variants": [] } - ] - }, - { - "type": "struct", - "name": "dojo::database::introspect::Struct", - "members": [ + ], + "reads": [], + "writes": [], + "computed": [] + }, + "base": { + "name": "base", + "class_hash": "0x6c458453d35753703ad25632deec20a29faf8531942ec109e6eb0650316a2bc", + "abi": [ { - "name": "name", - "type": "core::felt252" + "type": "impl", + "name": "WorldProviderImpl", + "interface_name": "dojo::world::IWorldProvider" }, { - "name": "attrs", - "type": "core::array::Span::" + "type": "struct", + "name": "dojo::world::IWorldDispatcher", + "members": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ] }, { - "name": "children", - "type": "core::array::Span::>" - } - ] - }, - { - "type": "struct", - "name": "core::array::Span::<(core::felt252, core::array::Span::)>", - "members": [ - { - "name": "snapshot", - "type": "@core::array::Array::<(core::felt252, core::array::Span::)>" - } - ] - }, - { - "type": "struct", - "name": "dojo::database::introspect::Enum", - "members": [ - { - "name": "name", - "type": "core::felt252" + "type": "interface", + "name": "dojo::world::IWorldProvider", + "items": [ + { + "type": "function", + "name": "world", + "inputs": [], + "outputs": [ + { + "type": "dojo::world::IWorldDispatcher" + } + ], + "state_mutability": "view" + } + ] }, { - "name": "attrs", - "type": "core::array::Span::" + "type": "impl", + "name": "UpgradableImpl", + "interface_name": "dojo::components::upgradeable::IUpgradeable" }, { - "name": "children", - "type": "core::array::Span::<(core::felt252, core::array::Span::)>" - } - ] - }, - { - "type": "enum", - "name": "dojo::database::introspect::Ty", - "variants": [ + "type": "interface", + "name": "dojo::components::upgradeable::IUpgradeable", + "items": [ + { + "type": "function", + "name": "upgrade", + "inputs": [ + { + "name": "new_class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, { - "name": "Primitive", - "type": "core::felt252" + "type": "constructor", + "name": "constructor", + "inputs": [] }, { - "name": "Struct", - "type": "dojo::database::introspect::Struct" + "type": "event", + "name": "dojo::components::upgradeable::upgradeable::Upgraded", + "kind": "struct", + "members": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + } + ] }, { - "name": "Enum", - "type": "dojo::database::introspect::Enum" + "type": "event", + "name": "dojo::components::upgradeable::upgradeable::Event", + "kind": "enum", + "variants": [ + { + "name": "Upgraded", + "type": "dojo::components::upgradeable::upgradeable::Upgraded", + "kind": "nested" + } + ] }, { - "name": "Tuple", - "type": "core::array::Span::>" + "type": "event", + "name": "dojo::base::base::Event", + "kind": "enum", + "variants": [ + { + "name": "UpgradeableEvent", + "type": "dojo::components::upgradeable::upgradeable::Event", + "kind": "nested" + } + ] } - ] + ] + }, + "contracts": [ + { + "name": "dojo_examples::actions::actions", + "address": "0x152dcff993befafe5001975149d2c50bd9621da7cbaed74f68e7d5e54e65abc", + "class_hash": "0x77e3b43ecd6211ba5af1eba19eca0940df73ca77c4c14ba0da75c1bd9297ca2", + "abi": [ + { + "type": "impl", + "name": "WorldProviderImpl", + "interface_name": "dojo::world::IWorldProvider" + }, + { + "type": "struct", + "name": "dojo::world::IWorldDispatcher", + "members": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "type": "interface", + "name": "dojo::world::IWorldProvider", + "items": [ + { + "type": "function", + "name": "world", + "inputs": [], + "outputs": [ + { + "type": "dojo::world::IWorldDispatcher" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "impl", + "name": "ActionsImpl", + "interface_name": "dojo_examples::actions::IActions" + }, + { + "type": "enum", + "name": "dojo_examples::models::Direction", + "variants": [ + { + "name": "None", + "type": "()" + }, + { + "name": "Left", + "type": "()" + }, + { + "name": "Right", + "type": "()" + }, + { + "name": "Up", + "type": "()" + }, + { + "name": "Down", + "type": "()" + } + ] + }, + { + "type": "interface", + "name": "dojo_examples::actions::IActions", + "items": [ + { + "type": "function", + "name": "spawn", + "inputs": [], + "outputs": [], + "state_mutability": "view" + }, + { + "type": "function", + "name": "move", + "inputs": [ + { + "name": "direction", + "type": "dojo_examples::models::Direction" + } + ], + "outputs": [], + "state_mutability": "view" + } + ] + }, + { + "type": "impl", + "name": "UpgradableImpl", + "interface_name": "dojo::components::upgradeable::IUpgradeable" + }, + { + "type": "interface", + "name": "dojo::components::upgradeable::IUpgradeable", + "items": [ + { + "type": "function", + "name": "upgrade", + "inputs": [ + { + "name": "new_class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "type": "function", + "name": "dojo_resource", + "inputs": [], + "outputs": [ + { + "type": "core::felt252" + } + ], + "state_mutability": "view" + }, + { + "type": "event", + "name": "dojo::components::upgradeable::upgradeable::Upgraded", + "kind": "struct", + "members": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::components::upgradeable::upgradeable::Event", + "kind": "enum", + "variants": [ + { + "name": "Upgraded", + "type": "dojo::components::upgradeable::upgradeable::Upgraded", + "kind": "nested" + } + ] + }, + { + "type": "event", + "name": "dojo_examples::actions::actions::Moved", + "kind": "struct", + "members": [ + { + "name": "player", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "direction", + "type": "dojo_examples::models::Direction", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo_examples::actions::actions::Event", + "kind": "enum", + "variants": [ + { + "name": "UpgradeableEvent", + "type": "dojo::components::upgradeable::upgradeable::Event", + "kind": "nested" + }, + { + "name": "Moved", + "type": "dojo_examples::actions::actions::Moved", + "kind": "nested" + } + ] + } + ], + "reads": [], + "writes": [], + "computed": [] + } + ], + "models": [ + { + "name": "dojo_examples::models::moves_remaining", + "members": [ + { + "name": "player", + "type": "ContractAddress", + "key": true + }, + { + "name": "remaining", + "type": "u8", + "key": false + }, + { + "name": "last_direction", + "type": "Direction", + "key": false + } + ], + "class_hash": "0x64495ca6dc1dc328972697b30468cea364bcb7452bbb6e4aaad3e4b3f190147", + "abi": [ + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "type": "core::felt252" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "unpacked_size", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "packed_size", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "function", + "name": "layout", + "inputs": [], + "outputs": [ + { + "type": "core::array::Span::" + } + ], + "state_mutability": "view" + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::>", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::>" + } + ] + }, + { + "type": "struct", + "name": "dojo::database::introspect::Struct", + "members": [ + { + "name": "name", + "type": "core::felt252" + }, + { + "name": "attrs", + "type": "core::array::Span::" + }, + { + "name": "children", + "type": "core::array::Span::>" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::<(core::felt252, core::array::Span::)>", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::<(core::felt252, core::array::Span::)>" + } + ] + }, + { + "type": "struct", + "name": "dojo::database::introspect::Enum", + "members": [ + { + "name": "name", + "type": "core::felt252" + }, + { + "name": "attrs", + "type": "core::array::Span::" + }, + { + "name": "children", + "type": "core::array::Span::<(core::felt252, core::array::Span::)>" + } + ] + }, + { + "type": "enum", + "name": "dojo::database::introspect::Ty", + "variants": [ + { + "name": "Primitive", + "type": "core::felt252" + }, + { + "name": "Struct", + "type": "dojo::database::introspect::Struct" + }, + { + "name": "Enum", + "type": "dojo::database::introspect::Enum" + }, + { + "name": "Tuple", + "type": "core::array::Span::>" + } + ] + }, + { + "type": "function", + "name": "schema", + "inputs": [], + "outputs": [ + { + "type": "dojo::database::introspect::Ty" + } + ], + "state_mutability": "view" + }, + { + "type": "event", + "name": "dojo_examples::models::moves::Event", + "kind": "enum", + "variants": [] + } + ] }, { - "type": "function", - "name": "schema", - "inputs": [], - "outputs": [ - { - "type": "dojo::database::introspect::Ty" - } - ], - "state_mutability": "view" + "name": "dojo_examples::models::erc_20_allowance", + "members": [ + { + "name": "player", + "type": "ContractAddress", + "key": true + }, + { + "name": "remaining", + "type": "u8", + "key": false + }, + { + "name": "last_direction", + "type": "Direction", + "key": false + } + ], + "class_hash": "0x64495ca6dc1dc328972697b30468cea364bcb7452bbb6e4aaad3e4b3f190147", + "abi": [ + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "type": "core::felt252" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "unpacked_size", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "packed_size", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "function", + "name": "layout", + "inputs": [], + "outputs": [ + { + "type": "core::array::Span::" + } + ], + "state_mutability": "view" + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::>", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::>" + } + ] + }, + { + "type": "struct", + "name": "dojo::database::introspect::Struct", + "members": [ + { + "name": "name", + "type": "core::felt252" + }, + { + "name": "attrs", + "type": "core::array::Span::" + }, + { + "name": "children", + "type": "core::array::Span::>" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::<(core::felt252, core::array::Span::)>", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::<(core::felt252, core::array::Span::)>" + } + ] + }, + { + "type": "struct", + "name": "dojo::database::introspect::Enum", + "members": [ + { + "name": "name", + "type": "core::felt252" + }, + { + "name": "attrs", + "type": "core::array::Span::" + }, + { + "name": "children", + "type": "core::array::Span::<(core::felt252, core::array::Span::)>" + } + ] + }, + { + "type": "enum", + "name": "dojo::database::introspect::Ty", + "variants": [ + { + "name": "Primitive", + "type": "core::felt252" + }, + { + "name": "Struct", + "type": "dojo::database::introspect::Struct" + }, + { + "name": "Enum", + "type": "dojo::database::introspect::Enum" + }, + { + "name": "Tuple", + "type": "core::array::Span::>" + } + ] + }, + { + "type": "function", + "name": "schema", + "inputs": [], + "outputs": [ + { + "type": "dojo::database::introspect::Ty" + } + ], + "state_mutability": "view" + }, + { + "type": "event", + "name": "dojo_examples::models::moves::Event", + "kind": "enum", + "variants": [] + } + ] }, { - "type": "event", - "name": "dojo_examples::models::position::Event", - "kind": "enum", - "variants": [] + "name": "dojo_examples::models::moves", + "members": [ + { + "name": "player", + "type": "ContractAddress", + "key": true + }, + { + "name": "remaining", + "type": "u8", + "key": false + }, + { + "name": "last_direction", + "type": "Direction", + "key": false + } + ], + "class_hash": "0x64495ca6dc1dc328972697b30468cea364bcb7452bbb6e4aaad3e4b3f190147", + "abi": [ + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "type": "core::felt252" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "unpacked_size", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "packed_size", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "function", + "name": "layout", + "inputs": [], + "outputs": [ + { + "type": "core::array::Span::" + } + ], + "state_mutability": "view" + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::>", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::>" + } + ] + }, + { + "type": "struct", + "name": "dojo::database::introspect::Struct", + "members": [ + { + "name": "name", + "type": "core::felt252" + }, + { + "name": "attrs", + "type": "core::array::Span::" + }, + { + "name": "children", + "type": "core::array::Span::>" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::<(core::felt252, core::array::Span::)>", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::<(core::felt252, core::array::Span::)>" + } + ] + }, + { + "type": "struct", + "name": "dojo::database::introspect::Enum", + "members": [ + { + "name": "name", + "type": "core::felt252" + }, + { + "name": "attrs", + "type": "core::array::Span::" + }, + { + "name": "children", + "type": "core::array::Span::<(core::felt252, core::array::Span::)>" + } + ] + }, + { + "type": "enum", + "name": "dojo::database::introspect::Ty", + "variants": [ + { + "name": "Primitive", + "type": "core::felt252" + }, + { + "name": "Struct", + "type": "dojo::database::introspect::Struct" + }, + { + "name": "Enum", + "type": "dojo::database::introspect::Enum" + }, + { + "name": "Tuple", + "type": "core::array::Span::>" + } + ] + }, + { + "type": "function", + "name": "schema", + "inputs": [], + "outputs": [ + { + "type": "dojo::database::introspect::Ty" + } + ], + "state_mutability": "view" + }, + { + "type": "event", + "name": "dojo_examples::models::moves::Event", + "kind": "enum", + "variants": [] + } + ] + }, + { + "name": "dojo_examples::models::position", + "members": [ + { + "name": "player", + "type": "ContractAddress", + "key": true + }, + { + "name": "vec", + "type": "Vec2", + "key": false + } + ], + "class_hash": "0x2b233bba9a232a5e891c85eca9f67beedca7a12f9768729ff017bcb62d25c9d", + "abi": [ + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "type": "core::felt252" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "unpacked_size", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "packed_size", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "function", + "name": "layout", + "inputs": [], + "outputs": [ + { + "type": "core::array::Span::" + } + ], + "state_mutability": "view" + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::>", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::>" + } + ] + }, + { + "type": "struct", + "name": "dojo::database::introspect::Struct", + "members": [ + { + "name": "name", + "type": "core::felt252" + }, + { + "name": "attrs", + "type": "core::array::Span::" + }, + { + "name": "children", + "type": "core::array::Span::>" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::<(core::felt252, core::array::Span::)>", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::<(core::felt252, core::array::Span::)>" + } + ] + }, + { + "type": "struct", + "name": "dojo::database::introspect::Enum", + "members": [ + { + "name": "name", + "type": "core::felt252" + }, + { + "name": "attrs", + "type": "core::array::Span::" + }, + { + "name": "children", + "type": "core::array::Span::<(core::felt252, core::array::Span::)>" + } + ] + }, + { + "type": "enum", + "name": "dojo::database::introspect::Ty", + "variants": [ + { + "name": "Primitive", + "type": "core::felt252" + }, + { + "name": "Struct", + "type": "dojo::database::introspect::Struct" + }, + { + "name": "Enum", + "type": "dojo::database::introspect::Enum" + }, + { + "name": "Tuple", + "type": "core::array::Span::>" + } + ] + }, + { + "type": "function", + "name": "schema", + "inputs": [], + "outputs": [ + { + "type": "dojo::database::introspect::Ty" + } + ], + "state_mutability": "view" + }, + { + "type": "event", + "name": "dojo_examples::models::position::Event", + "kind": "enum", + "variants": [] + } + ] } - ] - } - ] -} \ No newline at end of file + ] +} diff --git a/packages/core/src/utils/utils.test.ts b/packages/core/src/utils/utils.test.ts index 24052135..cd5045ed 100644 --- a/packages/core/src/utils/utils.test.ts +++ b/packages/core/src/utils/utils.test.ts @@ -1,5 +1,5 @@ import { expect, test } from "vitest"; -import { getContractByName } from "../utils"; +import { getContractByName, parseModelName } from "../utils"; import manifest from "./manifest.json"; test("get address by contract name", () => { @@ -11,3 +11,23 @@ test("get address by contract name", () => { "0x152dcff993befafe5001975149d2c50bd9621da7cbaed74f68e7d5e54e65abc" ); }); + +test("model name parse", () => { + const model = manifest.models.find( + (model) => model.name === "dojo_examples::models::erc_20_allowance" + ); + + const modelTwoWords = manifest.models.find( + (model) => model.name === "dojo_examples::models::moves_remaining" + ); + + const modelSingleWord = manifest.models.find( + (model) => model.name === "dojo_examples::models::moves" + ); + + expect(parseModelName(model)).toBe("ERC20Allowance"); + + expect(parseModelName(modelTwoWords)).toBe("MovesRemaining"); + + expect(parseModelName(modelSingleWord)).toBe("Moves"); +}); From d306786bf6ea17843358e30eadfd0b6e089532dc Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Sun, 24 Dec 2023 07:55:27 +1100 Subject: [PATCH 3/6] fix parsing import --- packages/core/bin/generateComponents.cjs | 34 +++++++++++++++--------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/packages/core/bin/generateComponents.cjs b/packages/core/bin/generateComponents.cjs index dcf7c205..330ae29a 100755 --- a/packages/core/bin/generateComponents.cjs +++ b/packages/core/bin/generateComponents.cjs @@ -3,7 +3,26 @@ const fs = require("fs"); const path = require("path"); const { execSync } = require("child_process"); -const { parseModelName } = require("../dist/index.js"); + +const parseModelName = (model) => { + return model.name + .split("::") + .pop() + .split("_") + .map((part) => { + // Check if the part is a number + if (!isNaN(parseInt(part))) { + return part; // Keep numbers as is + } + // Convert part to uppercase if it's a known acronym or before a number + if (part.length <= 3 || !isNaN(parseInt(part.charAt(0)))) { + return part.toUpperCase(); + } + // Otherwise, capitalize the first letter and make the rest lowercase + return part.charAt(0).toUpperCase() + part.slice(1).toLowerCase(); + }) + .join(""); +}; // Check for the required arguments if (process.argv.length !== 6) { @@ -53,18 +72,7 @@ manifest.models.forEach((model) => { const types = []; const customTypes = []; - let modelName = parseModelName(model.name); - - console.log(modelName); - - // let result = model.name.split("::").pop().split("_"); - // let modelName = result - // .map((part) => { - // return part === part.toLowerCase() && part.length > 2 - // ? part.charAt(0).toUpperCase() + part.slice(1) - // : part.toUpperCase(); - // }) - // .join(""); + let modelName = parseModelName(model); try { const output = execSync( From 18c1a63db8b1b27c819289fdd590e4c88fcab67f Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Sun, 24 Dec 2023 08:02:09 +1100 Subject: [PATCH 4/6] add another edge case --- packages/core/bin/generateComponents.cjs | 17 ++- packages/core/src/utils/index.ts | 17 ++- packages/core/src/utils/manifest.json | 182 +++++++++++++++++++++++ packages/core/src/utils/utils.test.ts | 6 + 4 files changed, 208 insertions(+), 14 deletions(-) diff --git a/packages/core/bin/generateComponents.cjs b/packages/core/bin/generateComponents.cjs index 330ae29a..ae0b6820 100755 --- a/packages/core/bin/generateComponents.cjs +++ b/packages/core/bin/generateComponents.cjs @@ -5,20 +5,23 @@ const path = require("path"); const { execSync } = require("child_process"); const parseModelName = (model) => { + // Define a set of known acronyms + const acronyms = new Set(["ERC"]); + return model.name .split("::") .pop() .split("_") .map((part) => { - // Check if the part is a number - if (!isNaN(parseInt(part))) { - return part; // Keep numbers as is - } - // Convert part to uppercase if it's a known acronym or before a number - if (part.length <= 3 || !isNaN(parseInt(part.charAt(0)))) { + // If the part is a known acronym, keep it in uppercase + if (acronyms.has(part.toUpperCase())) { return part.toUpperCase(); } - // Otherwise, capitalize the first letter and make the rest lowercase + // If the part is fully numeric, keep it as is + if (!isNaN(parseInt(part))) { + return part; + } + // Capitalize the first letter and make the rest lowercase return part.charAt(0).toUpperCase() + part.slice(1).toLowerCase(); }) .join(""); diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts index 1decc1c7..db9fb1b3 100644 --- a/packages/core/src/utils/index.ts +++ b/packages/core/src/utils/index.ts @@ -27,20 +27,23 @@ export const getContractByName = (manifest: any, name: string) => { * */ export const parseModelName = (model: any) => { + // Define a set of known acronyms + const acronyms = new Set(["ERC"]); + return model.name .split("::") .pop() .split("_") .map((part: string) => { - // Check if the part is a number - if (!isNaN(parseInt(part))) { - return part; // Keep numbers as is - } - // Convert part to uppercase if it's a known acronym or before a number - if (part.length <= 3 || !isNaN(parseInt(part.charAt(0)))) { + // If the part is a known acronym, keep it in uppercase + if (acronyms.has(part.toUpperCase())) { return part.toUpperCase(); } - // Otherwise, capitalize the first letter and make the rest lowercase + // If the part is fully numeric, keep it as is + if (!isNaN(parseInt(part))) { + return part; + } + // Capitalize the first letter and make the rest lowercase return part.charAt(0).toUpperCase() + part.slice(1).toLowerCase(); }) .join(""); diff --git a/packages/core/src/utils/manifest.json b/packages/core/src/utils/manifest.json index 5afc378a..3bf0d8e4 100644 --- a/packages/core/src/utils/manifest.json +++ b/packages/core/src/utils/manifest.json @@ -1138,6 +1138,188 @@ } ], "models": [ + { + "name": "dojo_examples::models::moves_at_remaining", + "members": [ + { + "name": "player", + "type": "ContractAddress", + "key": true + }, + { + "name": "remaining", + "type": "u8", + "key": false + }, + { + "name": "last_direction", + "type": "Direction", + "key": false + } + ], + "class_hash": "0x64495ca6dc1dc328972697b30468cea364bcb7452bbb6e4aaad3e4b3f190147", + "abi": [ + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "type": "core::felt252" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "unpacked_size", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "packed_size", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "function", + "name": "layout", + "inputs": [], + "outputs": [ + { + "type": "core::array::Span::" + } + ], + "state_mutability": "view" + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::>", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::>" + } + ] + }, + { + "type": "struct", + "name": "dojo::database::introspect::Struct", + "members": [ + { + "name": "name", + "type": "core::felt252" + }, + { + "name": "attrs", + "type": "core::array::Span::" + }, + { + "name": "children", + "type": "core::array::Span::>" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::<(core::felt252, core::array::Span::)>", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::<(core::felt252, core::array::Span::)>" + } + ] + }, + { + "type": "struct", + "name": "dojo::database::introspect::Enum", + "members": [ + { + "name": "name", + "type": "core::felt252" + }, + { + "name": "attrs", + "type": "core::array::Span::" + }, + { + "name": "children", + "type": "core::array::Span::<(core::felt252, core::array::Span::)>" + } + ] + }, + { + "type": "enum", + "name": "dojo::database::introspect::Ty", + "variants": [ + { + "name": "Primitive", + "type": "core::felt252" + }, + { + "name": "Struct", + "type": "dojo::database::introspect::Struct" + }, + { + "name": "Enum", + "type": "dojo::database::introspect::Enum" + }, + { + "name": "Tuple", + "type": "core::array::Span::>" + } + ] + }, + { + "type": "function", + "name": "schema", + "inputs": [], + "outputs": [ + { + "type": "dojo::database::introspect::Ty" + } + ], + "state_mutability": "view" + }, + { + "type": "event", + "name": "dojo_examples::models::moves::Event", + "kind": "enum", + "variants": [] + } + ] + }, { "name": "dojo_examples::models::moves_remaining", "members": [ diff --git a/packages/core/src/utils/utils.test.ts b/packages/core/src/utils/utils.test.ts index cd5045ed..6db4e0f9 100644 --- a/packages/core/src/utils/utils.test.ts +++ b/packages/core/src/utils/utils.test.ts @@ -13,6 +13,10 @@ test("get address by contract name", () => { }); test("model name parse", () => { + const modelThreeWords = manifest.models.find( + (model) => model.name === "dojo_examples::models::moves_at_remaining" + ); + const model = manifest.models.find( (model) => model.name === "dojo_examples::models::erc_20_allowance" ); @@ -30,4 +34,6 @@ test("model name parse", () => { expect(parseModelName(modelTwoWords)).toBe("MovesRemaining"); expect(parseModelName(modelSingleWord)).toBe("Moves"); + + expect(parseModelName(modelThreeWords)).toBe("MovesAtRemaining"); }); From 3b3f2a1ff00ea1397803e981a632371f29681ae9 Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Sun, 24 Dec 2023 08:05:16 +1100 Subject: [PATCH 5/6] fix ci --- .github/workflows/ci.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 82d0de57..0c9248df 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -13,6 +13,9 @@ jobs: - uses: actions/checkout@v2 - uses: oven-sh/setup-bun@v1 + - name: Install Protobuf Compiler + run: sudo apt-get install -y protobuf-compiler + - name: Install dependencies run: bun link From 4790c97c20c6832c897049b8351ab97c71dbbce8 Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Sun, 24 Dec 2023 08:12:11 +1100 Subject: [PATCH 6/6] ci order fix --- .github/workflows/ci.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0c9248df..ca684d92 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,18 +16,18 @@ jobs: - name: Install Protobuf Compiler run: sudo apt-get install -y protobuf-compiler - - name: Install dependencies + - name: Link dependencies run: bun link - name: Install dependencies run: bun install - - name: Build dependencies - run: bun run build - - name: Run Prettier run: bun x prettier --check . + - name: Build dependencies + run: bun run build + - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v3 env: