diff --git a/.yarn/cache/corejs-npm-1.0.0-f75cc9a9f7-3eab2f194a.zip b/.yarn/cache/corejs-npm-1.0.0-f75cc9a9f7-3eab2f194a.zip new file mode 100644 index 000000000..03506fb58 Binary files /dev/null and b/.yarn/cache/corejs-npm-1.0.0-f75cc9a9f7-3eab2f194a.zip differ diff --git a/api/dbschema/bootstrap.md b/api/dbschema/bootstrap.md index 2019bfd93..11723a9f8 100644 --- a/api/dbschema/bootstrap.md +++ b/api/dbschema/bootstrap.md @@ -12,4 +12,4 @@ configure instance set query_work_mem := "8MiB"; configure instance set shared_buffers := "2GiB"; # Total memory available to the database for caching - 75% -configure instance set effective_cache_size := "3GiB"; \ No newline at end of file +configure instance set effective_cache_size := "6GiB"; \ No newline at end of file diff --git a/api/dbschema/edgeql-js/__spec__.ts b/api/dbschema/edgeql-js/__spec__.ts index e99918286..ab3111080 100644 --- a/api/dbschema/edgeql-js/__spec__.ts +++ b/api/dbschema/edgeql-js/__spec__.ts @@ -12,10 +12,10 @@ spec.set("80d4b62c-e31c-51c6-b994-afaae5b6eff6", {"id":"80d4b62c-e31c-51c6-b994- spec.set("3a39c464-a115-5b5e-8968-fb30b2c6a7a1", {"id":"3a39c464-a115-5b5e-8968-fb30b2c6a7a1","name":"array","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"00000000-0000-0000-0000-00000000010b","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); spec.set("d9d5e4a4-d545-5a03-a9da-571d8807619f", {"id":"d9d5e4a4-d545-5a03-a9da-571d8807619f","name":"array","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"00000000-0000-0000-0000-00000000010d","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); spec.set("2417884d-4995-5a45-8c61-614adab347a7", {"id":"2417884d-4995-5a45-8c61-614adab347a7","name":"array","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"00000000-0000-0000-0000-000000000111","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); -spec.set("20e80b4a-4764-11ef-82b3-c77e2176cf06", {"id":"20e80b4a-4764-11ef-82b3-c77e2176cf06","name":"array","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"203acad3-4764-11ef-a5d5-3b96a2529377","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); -spec.set("20f62cbb-4764-11ef-864e-29610b8339fd", {"id":"20f62cbb-4764-11ef-864e-29610b8339fd","name":"array","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"2077c1db-4764-11ef-a02d-ab1a6cf116fb","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); -spec.set("2119b648-4764-11ef-b298-81a8a7d973e7", {"id":"2119b648-4764-11ef-b298-81a8a7d973e7","name":"array","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"21145467-4764-11ef-9190-0d05ce614fa0","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); -spec.set("2084d84a-4764-11ef-9aa9-e35c88efc569", {"id":"2084d84a-4764-11ef-9aa9-e35c88efc569","name":"array","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"204dbc00-4764-11ef-9f00-ddb36bef771b","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); +spec.set("5e86691a-4ca5-11ef-867e-af4948fd97e5", {"id":"5e86691a-4ca5-11ef-867e-af4948fd97e5","name":"array","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"5dd32b18-4ca5-11ef-8908-0152ca6f9c93","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); +spec.set("5e930c4d-4ca5-11ef-8c7a-21d9fba63b42", {"id":"5e930c4d-4ca5-11ef-8c7a-21d9fba63b42","name":"array","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"5e201426-4ca5-11ef-ad4b-473805dcae4c","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); +spec.set("5eaffa5c-4ca5-11ef-917e-11e708e32a7b", {"id":"5eaffa5c-4ca5-11ef-917e-11e708e32a7b","name":"array","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"5eac7755-4ca5-11ef-8c59-b1ff14e546b9","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); +spec.set("5e2f69df-4ca5-11ef-9c77-0752475c490a", {"id":"5e2f69df-4ca5-11ef-9c77-0752475c490a","name":"array","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"5de76b99-4ca5-11ef-a8fd-ffc4d6d66524","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); spec.set("3ed001c4-98e8-53a8-b2d1-0cad168d926c", {"id":"3ed001c4-98e8-53a8-b2d1-0cad168d926c","name":"array>","is_abstract":true,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"49748e47-8d91-5269-9a34-2e8ca194e0f2","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); spec.set("48aa45ef-4d93-5fbd-bfb5-81bf67b49eab", {"id":"48aa45ef-4d93-5fbd-bfb5-81bf67b49eab","name":"array","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"00000000-0000-0000-0000-000000000102","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); spec.set("2b65df4c-4942-59b1-8819-061ca68b2f4e", {"id":"2b65df4c-4942-59b1-8819-061ca68b2f4e","name":"array","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"00000000-0000-0000-0000-000000000107","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); @@ -25,8 +25,8 @@ spec.set("bb221d39-09f1-507e-8851-62075bb61823", {"id":"bb221d39-09f1-507e-8851- spec.set("1378c9c3-b11a-5a95-bdac-066a4143094d", {"id":"1378c9c3-b11a-5a95-bdac-066a4143094d","name":"array","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"00000000-0000-0000-0000-000000000100","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); spec.set("212f4161-55eb-569e-945d-ae24bdab437a", {"id":"212f4161-55eb-569e-945d-ae24bdab437a","name":"array>","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"f5e31516-7567-519d-847f-397a0762ce23","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); spec.set("cc3f58f4-ffd4-5f38-97d9-6b5844e89037", {"id":"cc3f58f4-ffd4-5f38-97d9-6b5844e89037","name":"array>>>","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"27d815f4-6518-598a-a3c5-9364342d6e06","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); -spec.set("2085a2cd-4764-11ef-aded-353f452a3b73", {"id":"2085a2cd-4764-11ef-aded-353f452a3b73","name":"array>","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"2085989d-4764-11ef-8e33-715fa5fe8d8f","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); -spec.set("218aaaa0-4764-11ef-8ba0-6b957aa3603b", {"id":"218aaaa0-4764-11ef-8ba0-6b957aa3603b","name":"array>","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"218a9dd4-4764-11ef-87ee-2f2b2d456ca7","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); +spec.set("5e304f47-4ca5-11ef-917b-e927ec5c1d6e", {"id":"5e304f47-4ca5-11ef-917b-e927ec5c1d6e","name":"array>","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"5e30443a-4ca5-11ef-be36-6ff8e1ead1f5","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); +spec.set("5f1f2d85-4ca5-11ef-894f-bb72a5071292", {"id":"5f1f2d85-4ca5-11ef-894f-bb72a5071292","name":"array>","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"5f1f2067-4ca5-11ef-a3b9-4340f6c9a103","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); spec.set("db5fcf76-8269-568c-ba2b-b36b0796b880", {"id":"db5fcf76-8269-568c-ba2b-b36b0796b880","name":"array>>","is_abstract":false,"kind":"array","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":"67996f7a-c82f-5b58-bb0a-f29764ee45c2","tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); spec.set("a64cb492-91a2-5ee0-890a-6caeb3e32aa5", {"id":"a64cb492-91a2-5ee0-890a-6caeb3e32aa5","name":"std::anyscalar","is_abstract":true,"kind":"scalar","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); spec.set("00000000-0000-0000-0000-000000000112", {"id":"00000000-0000-0000-0000-000000000112","name":"cal::date_duration","is_abstract":false,"kind":"scalar","enum_values":null,"is_seq":false,"material_id":null,"bases":[{"id":"a64cb492-91a2-5ee0-890a-6caeb3e32aa5"}],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); @@ -39,7 +39,7 @@ spec.set("00000000-0000-0000-0000-00000000010d", {"id":"00000000-0000-0000-0000- spec.set("00000000-0000-0000-0000-000000000111", {"id":"00000000-0000-0000-0000-000000000111","name":"cal::relative_duration","is_abstract":false,"kind":"scalar","enum_values":null,"is_seq":false,"material_id":null,"bases":[{"id":"a64cb492-91a2-5ee0-890a-6caeb3e32aa5"}],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); spec.set("0d14e49f-d9f9-51f0-b8f4-c432982cbac2", {"id":"0d14e49f-d9f9-51f0-b8f4-c432982cbac2","name":"std::BaseObject","is_abstract":true,"kind":"object","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[{"card":"One","name":"id","target_id":"00000000-0000-0000-0000-000000000100","kind":"property","is_exclusive":true,"is_computed":false,"is_readonly":true,"has_default":true,"pointers":[]},{"card":"One","name":"__type__","target_id":"2662a1b4-4f3f-5875-b6eb-ce52101a90a3","kind":"link","is_exclusive":false,"is_computed":false,"is_readonly":true,"has_default":false,"pointers":[]}],"exclusives":[{"id":{"card":"One","name":"id","target_id":"00000000-0000-0000-0000-000000000100","kind":"property","is_exclusive":true,"is_computed":false,"is_readonly":true,"has_default":true,"pointers":[]}}],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); spec.set("d408002f-3891-5b9a-b19c-23589a88998b", {"id":"d408002f-3891-5b9a-b19c-23589a88998b","name":"cfg::ConfigObject","is_abstract":true,"kind":"object","enum_values":null,"is_seq":false,"material_id":null,"bases":[{"id":"0d14e49f-d9f9-51f0-b8f4-c432982cbac2"}],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[],"range_element_id":null,"multirange_element_id":null} as any); -spec.set("8b66e734-a01e-5638-a812-359e0d005a37", {"id":"8b66e734-a01e-5638-a812-359e0d005a37","name":"cfg::AbstractConfig","is_abstract":true,"kind":"object","enum_values":null,"is_seq":false,"material_id":null,"bases":[{"id":"d408002f-3891-5b9a-b19c-23589a88998b"}],"union_of":[],"intersection_of":[],"pointers":[{"card":"Many","name":"extensions","target_id":"89fb9b8b-d3b2-5075-9d1a-f5b116a0f188","kind":"link","is_exclusive":false,"is_computed":true,"is_readonly":false,"has_default":false,"pointers":[]},{"card":"One","name":"session_idle_timeout","target_id":"00000000-0000-0000-0000-00000000010e","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":true,"pointers":[]},{"card":"One","name":"session_idle_transaction_timeout","target_id":"00000000-0000-0000-0000-00000000010e","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":true,"pointers":[]},{"card":"One","name":"query_execution_timeout","target_id":"00000000-0000-0000-0000-00000000010e","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":false,"pointers":[]},{"card":"One","name":"listen_port","target_id":"00000000-0000-0000-0000-000000000104","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":true,"pointers":[]},{"card":"Many","name":"listen_addresses","target_id":"00000000-0000-0000-0000-000000000101","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":false,"pointers":[]},{"card":"Many","name":"auth","target_id":"a2ba7516-d398-5ec2-b25e-221b2f7b9e87","kind":"link","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":false,"pointers":[]},{"card":"AtMostOne","name":"allow_dml_in_functions","target_id":"00000000-0000-0000-0000-000000000109","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":true,"pointers":[]},{"card":"AtMostOne","name":"allow_bare_ddl","target_id":"50264e27-859e-5d2b-a589-ebb3d8ba4d8c","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":true,"pointers":[]},{"card":"AtMostOne","name":"apply_access_policies","target_id":"00000000-0000-0000-0000-000000000109","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":true,"pointers":[]},{"card":"AtMostOne","name":"allow_user_specified_id","target_id":"00000000-0000-0000-0000-000000000109","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":true,"pointers":[]},{"card":"Many","name":"cors_allow_origins","target_id":"00000000-0000-0000-0000-000000000101","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":false,"pointers":[]},{"card":"AtMostOne","name":"auto_rebuild_query_cache","target_id":"00000000-0000-0000-0000-000000000109","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":true,"pointers":[]},{"card":"AtMostOne","name":"query_cache_mode","target_id":"7cb23cda-17b8-575c-9561-05e2e9351897","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":true,"pointers":[]},{"card":"AtMostOne","name":"shared_buffers","target_id":"00000000-0000-0000-0000-000000000130","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":false,"pointers":[]},{"card":"AtMostOne","name":"query_work_mem","target_id":"00000000-0000-0000-0000-000000000130","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":false,"pointers":[]},{"card":"AtMostOne","name":"maintenance_work_mem","target_id":"00000000-0000-0000-0000-000000000130","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":false,"pointers":[]},{"card":"AtMostOne","name":"effective_cache_size","target_id":"00000000-0000-0000-0000-000000000130","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":false,"pointers":[]},{"card":"AtMostOne","name":"effective_io_concurrency","target_id":"00000000-0000-0000-0000-000000000105","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":false,"pointers":[]},{"card":"AtMostOne","name":"default_statistics_target","target_id":"00000000-0000-0000-0000-000000000105","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":false,"pointers":[]},{"card":"AtMostOne","name":"force_database_error","target_id":"00000000-0000-0000-0000-000000000101","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":true,"pointers":[]},{"card":"One","name":"_pg_prepared_statement_cache_size","target_id":"00000000-0000-0000-0000-000000000103","kind":"property","is_exclusive":false,"is_computed":false,"is_readonly":false,"has_default":true,"pointers":[]}],"exclusives":[],"backlinks":[{"card":"AtMostOne","name":">","is_abstract":false,"kind":"tuple","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[{"target_id":"00000000-0000-0000-0000-000000000105","name":"major"},{"target_id":"00000000-0000-0000-0000-000000000105","name":"minor"},{"target_id":"16a08f13-b1b1-57f4-8e82-062f67fb2a4c","name":"stage"},{"target_id":"00000000-0000-0000-0000-000000000105","name":"stage_no"},{"target_id":"bb221d39-09f1-507e-8851-62075bb61823","name":"local"}],"range_element_id":null,"multirange_element_id":null} as any); spec.set("f5e31516-7567-519d-847f-397a0762ce23", {"id":"f5e31516-7567-519d-847f-397a0762ce23","name":"tuple","is_abstract":false,"kind":"tuple","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[{"target_id":"00000000-0000-0000-0000-000000000101","name":"name"},{"target_id":"00000000-0000-0000-0000-000000000101","name":"expr"}],"range_element_id":null,"multirange_element_id":null} as any); spec.set("27d815f4-6518-598a-a3c5-9364342d6e06", {"id":"27d815f4-6518-598a-a3c5-9364342d6e06","name":"tuple>>","is_abstract":false,"kind":"tuple","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[{"target_id":"00000000-0000-0000-0000-000000000101","name":"name"},{"target_id":"67996f7a-c82f-5b58-bb0a-f29764ee45c2","name":"expr"}],"range_element_id":null,"multirange_element_id":null} as any); -spec.set("2084e377-4764-11ef-8a45-bd27cb787e72", {"id":"2084e377-4764-11ef-8a45-bd27cb787e72","name":"tuple>","is_abstract":false,"kind":"tuple","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[{"target_id":"00000000-0000-0000-0000-000000000101","name":"name"},{"target_id":"204dbc00-4764-11ef-9f00-ddb36bef771b","name":"url"},{"target_id":"2084d84a-4764-11ef-9aa9-e35c88efc569","name":"icons"}],"range_element_id":null,"multirange_element_id":null} as any); +spec.set("5e2f7660-4ca5-11ef-af8a-db7031536774", {"id":"5e2f7660-4ca5-11ef-af8a-db7031536774","name":"tuple>","is_abstract":false,"kind":"tuple","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[{"target_id":"00000000-0000-0000-0000-000000000101","name":"name"},{"target_id":"5de76b99-4ca5-11ef-a8fd-ffc4d6d66524","name":"url"},{"target_id":"5e2f69df-4ca5-11ef-9c77-0752475c490a","name":"icons"}],"range_element_id":null,"multirange_element_id":null} as any); spec.set("c13eb6f1-a05c-533f-bfe8-a50b1a077fd0", {"id":"c13eb6f1-a05c-533f-bfe8-a50b1a077fd0","name":"tuple","is_abstract":true,"kind":"tuple","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[{"target_id":"00000000-0000-0000-0000-000000000003","name":"object"},{"target_id":"00000000-0000-0000-0000-000000000106","name":"score"}],"range_element_id":null,"multirange_element_id":null} as any); -spec.set("211a36aa-4764-11ef-beea-5769d3b036e4", {"id":"211a36aa-4764-11ef-beea-5769d3b036e4","name":"tuple","is_abstract":false,"kind":"tuple","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[{"target_id":"2115e346-4764-11ef-ad0c-6f0d13d3c457","name":"provider"},{"target_id":"00000000-0000-0000-0000-000000000101","name":"subject"}],"range_element_id":null,"multirange_element_id":null} as any); -spec.set("2085989d-4764-11ef-8e33-715fa5fe8d8f", {"id":"2085989d-4764-11ef-8e33-715fa5fe8d8f","name":"tuple","is_abstract":false,"kind":"tuple","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[{"target_id":"00000000-0000-0000-0000-000000000101","name":"reason"},{"target_id":"00000000-0000-0000-0000-000000000104","name":"operation"}],"range_element_id":null,"multirange_element_id":null} as any); +spec.set("5eb05fbd-4ca5-11ef-80f9-4b113dc73361", {"id":"5eb05fbd-4ca5-11ef-80f9-4b113dc73361","name":"tuple","is_abstract":false,"kind":"tuple","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[{"target_id":"5ead5b32-4ca5-11ef-9f86-39a3186e8917","name":"provider"},{"target_id":"00000000-0000-0000-0000-000000000101","name":"subject"}],"range_element_id":null,"multirange_element_id":null} as any); +spec.set("5e30443a-4ca5-11ef-be36-6ff8e1ead1f5", {"id":"5e30443a-4ca5-11ef-be36-6ff8e1ead1f5","name":"tuple","is_abstract":false,"kind":"tuple","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[{"target_id":"00000000-0000-0000-0000-000000000101","name":"reason"},{"target_id":"00000000-0000-0000-0000-000000000104","name":"operation"}],"range_element_id":null,"multirange_element_id":null} as any); spec.set("e34cf562-ee0c-58d3-a1ee-ff9fbb35bfc3", {"id":"e34cf562-ee0c-58d3-a1ee-ff9fbb35bfc3","name":"tuple","is_abstract":true,"kind":"tuple","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[{"target_id":"00000000-0000-0000-0000-000000000105","name":"0"},{"target_id":"00000000-0000-0000-0000-000000000001","name":"1"}],"range_element_id":null,"multirange_element_id":null} as any); spec.set("b20a2c38-2942-5085-88a3-1bbb1eea755f", {"id":"b20a2c38-2942-5085-88a3-1bbb1eea755f","name":"tuple","is_abstract":false,"kind":"tuple","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[{"target_id":"00000000-0000-0000-0000-000000000105","name":"0"},{"target_id":"00000000-0000-0000-0000-000000000105","name":"1"}],"range_element_id":null,"multirange_element_id":null} as any); spec.set("416fe1a6-d62c-5481-80cd-2102a37b3415", {"id":"416fe1a6-d62c-5481-80cd-2102a37b3415","name":"tuple","is_abstract":false,"kind":"tuple","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[{"target_id":"00000000-0000-0000-0000-000000000101","name":"0"},{"target_id":"00000000-0000-0000-0000-00000000010f","name":"1"}],"range_element_id":null,"multirange_element_id":null} as any); -spec.set("218a9dd4-4764-11ef-87ee-2f2b2d456ca7", {"id":"218a9dd4-4764-11ef-87ee-2f2b2d456ca7","name":"tuple","is_abstract":false,"kind":"tuple","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[{"target_id":"2155d33d-4764-11ef-b70c-2fe14084d136","name":"symbol"},{"target_id":"20454d34-4764-11ef-90e6-a1cbef4a169e","name":"decimals"}],"range_element_id":null,"multirange_element_id":null} as any); +spec.set("5f1f2067-4ca5-11ef-a3b9-4340f6c9a103", {"id":"5f1f2067-4ca5-11ef-a3b9-4340f6c9a103","name":"tuple","is_abstract":false,"kind":"tuple","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[{"target_id":"5ede9377-4ca5-11ef-9b2c-d10ba38b9cc3","name":"symbol"},{"target_id":"5ddeceee-4ca5-11ef-af1c-d716780f2bd4","name":"decimals"}],"range_element_id":null,"multirange_element_id":null} as any); spec.set("67996f7a-c82f-5b58-bb0a-f29764ee45c2", {"id":"67996f7a-c82f-5b58-bb0a-f29764ee45c2","name":"tuple>","is_abstract":false,"kind":"tuple","enum_values":null,"is_seq":false,"material_id":null,"bases":[],"union_of":[],"intersection_of":[],"pointers":[],"exclusives":[],"backlinks":[],"backlink_stubs":[],"array_element_id":null,"tuple_elements":[{"target_id":"00000000-0000-0000-0000-000000000101","name":"text"},{"target_id":"1378c9c3-b11a-5a95-bdac-066a4143094d","name":"refs"}],"range_element_id":null,"multirange_element_id":null} as any); spec.set("00000000-0000-0000-0000-0000000001ff", {"id":"00000000-0000-0000-0000-0000000001ff","name":"std::number","is_abstract":false,"is_seq":false,"kind":"scalar","enum_values":null,"material_id":null,"bases":[]} as any); diff --git a/api/dbschema/edgeql-js/modules/cfg.ts b/api/dbschema/edgeql-js/modules/cfg.ts index e3788ebe6..ed32812a0 100644 --- a/api/dbschema/edgeql-js/modules/cfg.ts +++ b/api/dbschema/edgeql-js/modules/cfg.ts @@ -62,6 +62,7 @@ export type $AbstractConfigλShape = $.typeutil.flatten<$ConfigObjectλShape & { "default_statistics_target": $.PropertyDesc<_std.$int64, $.Cardinality.AtMostOne, false, false, false, false>; "force_database_error": $.PropertyDesc<_std.$str, $.Cardinality.AtMostOne, false, false, false, true>; "_pg_prepared_statement_cache_size": $.PropertyDesc<_std.$int16, $.Cardinality.One, false, false, false, true>; + "auto_rebuild_query_cache_timeout": $.PropertyDesc<_std.$duration, $.Cardinality.AtMostOne, false, false, false, true>; "; "; }>; diff --git a/api/dbschema/edgeql-js/modules/default.ts b/api/dbschema/edgeql-js/modules/default.ts index 246432d99..bad0f2b22 100644 --- a/api/dbschema/edgeql-js/modules/default.ts +++ b/api/dbschema/edgeql-js/modules/default.ts @@ -6,43 +6,43 @@ import type * as _std from "./std"; export type $AbiSource = { "Verified": $.$expr_Literal<$AbiSource>; } & $.EnumType<"default::AbiSource", ["Verified"]>; -const AbiSource: $AbiSource = $.makeType<$AbiSource>(_.spec, "2e109a66-4764-11ef-a235-d943bf655ed8", _.syntax.literal); +const AbiSource: $AbiSource = $.makeType<$AbiSource>(_.spec, "6a961afe-4ca5-11ef-87a6-bd878921b9fc", _.syntax.literal); export type $Address = $.ScalarType<"std::str", string>; -const Address: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "204357f7-4764-11ef-b8e2-513f0814be4c", _.syntax.literal); +const Address: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "5ddcd0de-4ca5-11ef-8df4-3ffb14dc9232", _.syntax.literal); export type $Amount = $.ScalarType<"std::decimal", string>; -const Amount: $.scalarTypeWithConstructor<_std.$decimal, never> = $.makeType<$.scalarTypeWithConstructor<_std.$decimal, never>>(_.spec, "2e1dee5f-4764-11ef-be01-a3fa37e77764", _.syntax.literal); +const Amount: $.scalarTypeWithConstructor<_std.$decimal, never> = $.makeType<$.scalarTypeWithConstructor<_std.$decimal, never>>(_.spec, "6aa0cc82-4ca5-11ef-87f5-c7f7265088f3", _.syntax.literal); export type $ApprovalIssue = { "HashMismatch": $.$expr_Literal<$ApprovalIssue>; "Expired": $.$expr_Literal<$ApprovalIssue>; } & $.EnumType<"default::ApprovalIssue", ["HashMismatch", "Expired"]>; -const ApprovalIssue: $ApprovalIssue = $.makeType<$ApprovalIssue>(_.spec, "203acad3-4764-11ef-a5d5-3b96a2529377", _.syntax.literal); +const ApprovalIssue: $ApprovalIssue = $.makeType<$ApprovalIssue>(_.spec, "5dd32b18-4ca5-11ef-8908-0152ca6f9c93", _.syntax.literal); export type $BoundedStr = $.ScalarType<"std::str", string>; -const BoundedStr: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "207f49e6-4764-11ef-97bc-ed354fb14da6", _.syntax.literal); +const BoundedStr: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "5e292db3-4ca5-11ef-9c55-8599349dbf7e", _.syntax.literal); export type $Bytes = $.ScalarType<"std::str", string>; -const Bytes: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "2077c1db-4764-11ef-a02d-ab1a6cf116fb", _.syntax.literal); +const Bytes: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "5e201426-4ca5-11ef-ad4b-473805dcae4c", _.syntax.literal); export type $Bytes32 = $.ScalarType<"std::str", string>; -const Bytes32: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "204caa29-4764-11ef-bc25-edc335fe540c", _.syntax.literal); +const Bytes32: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "5de6699f-4ca5-11ef-acc5-d7d265bcd6bd", _.syntax.literal); export type $Bytes4 = $.ScalarType<"std::str", string>; -const Bytes4: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "2412843e-4764-11ef-ac1d-931c3eb02c60", _.syntax.literal); +const Bytes4: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "616eae9b-4ca5-11ef-b511-292a009dc950", _.syntax.literal); export type $CloudProvider = { "Apple": $.$expr_Literal<$CloudProvider>; "Google": $.$expr_Literal<$CloudProvider>; } & $.EnumType<"default::CloudProvider", ["Apple", "Google"]>; -const CloudProvider: $CloudProvider = $.makeType<$CloudProvider>(_.spec, "2115e346-4764-11ef-ad0c-6f0d13d3c457", _.syntax.literal); +const CloudProvider: $CloudProvider = $.makeType<$CloudProvider>(_.spec, "5ead5b32-4ca5-11ef-9f86-39a3186e8917", _.syntax.literal); export type $MAC = $.ScalarType<"std::str", string>; -const MAC: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "21145467-4764-11ef-9190-0d05ce614fa0", _.syntax.literal); +const MAC: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "5eac7755-4ca5-11ef-8c59-b1ff14e546b9", _.syntax.literal); export type $NonEmptyStr = $.ScalarType<"std::str", string>; -const NonEmptyStr: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "2155d33d-4764-11ef-b70c-2fe14084d136", _.syntax.literal); +const NonEmptyStr: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "5ede9377-4ca5-11ef-9b2c-d10ba38b9cc3", _.syntax.literal); export type $TransactionStatus = { "Pending": $.$expr_Literal<$TransactionStatus>; @@ -52,28 +52,28 @@ export type $TransactionStatus = { "Failed": $.$expr_Literal<$TransactionStatus>; "Cancelled": $.$expr_Literal<$TransactionStatus>; } & $.EnumType<"default::TransactionStatus", ["Pending", "Scheduled", "Executing", "Successful", "Failed", "Cancelled"]>; -const TransactionStatus: $TransactionStatus = $.makeType<$TransactionStatus>(_.spec, "2156b55e-4764-11ef-ac80-9f4699c4088f", _.syntax.literal); +const TransactionStatus: $TransactionStatus = $.makeType<$TransactionStatus>(_.spec, "5edf70a4-4ca5-11ef-b1ed-cf5638223ae2", _.syntax.literal); export type $UAddress = $.ScalarType<"std::str", string>; -const UAddress: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "20417536-4764-11ef-ac62-b38ee9f02d8b", _.syntax.literal); +const UAddress: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "5dda9836-4ca5-11ef-acf5-437102eb4894", _.syntax.literal); export type $Url = $.ScalarType<"std::str", string>; -const Url: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "204dbc00-4764-11ef-9f00-ddb36bef771b", _.syntax.literal); +const Url: $.scalarTypeWithConstructor<_std.$str, never> = $.makeType<$.scalarTypeWithConstructor<_std.$str, never>>(_.spec, "5de76b99-4ca5-11ef-a8fd-ffc4d6d66524", _.syntax.literal); export type $uint16 = $.ScalarType<"std::number", number>; -const uint16: $.scalarTypeWithConstructor<_std.$number, string> = $.makeType<$.scalarTypeWithConstructor<_std.$number, string>>(_.spec, "20454d34-4764-11ef-90e6-a1cbef4a169e", _.syntax.literal); +const uint16: $.scalarTypeWithConstructor<_std.$number, string> = $.makeType<$.scalarTypeWithConstructor<_std.$number, string>>(_.spec, "5ddeceee-4ca5-11ef-af1c-d716780f2bd4", _.syntax.literal); export type $uint224 = $.ScalarType<"std::bigint", bigint>; -const uint224: $.scalarTypeWithConstructor<_std.$bigint, never> = $.makeType<$.scalarTypeWithConstructor<_std.$bigint, never>>(_.spec, "2419d2c8-4764-11ef-98ea-910bedb0c61c", _.syntax.literal); +const uint224: $.scalarTypeWithConstructor<_std.$bigint, never> = $.makeType<$.scalarTypeWithConstructor<_std.$bigint, never>>(_.spec, "61766170-4ca5-11ef-afd5-d3ebf99a5ad9", _.syntax.literal); export type $uint256 = $.ScalarType<"std::bigint", bigint>; -const uint256: $.scalarTypeWithConstructor<_std.$bigint, never> = $.makeType<$.scalarTypeWithConstructor<_std.$bigint, never>>(_.spec, "214dbbf8-4764-11ef-8072-b51657da3de9", _.syntax.literal); +const uint256: $.scalarTypeWithConstructor<_std.$bigint, never> = $.makeType<$.scalarTypeWithConstructor<_std.$bigint, never>>(_.spec, "5ed70515-4ca5-11ef-ba40-4f0f6a12fb9a", _.syntax.literal); export type $uint32 = $.ScalarType<"std::number", number>; -const uint32: $.scalarTypeWithConstructor<_std.$number, string> = $.makeType<$.scalarTypeWithConstructor<_std.$number, string>>(_.spec, "22ae5c72-4764-11ef-9065-cdbf6e621566", _.syntax.literal); +const uint32: $.scalarTypeWithConstructor<_std.$number, string> = $.makeType<$.scalarTypeWithConstructor<_std.$number, string>>(_.spec, "5fecb02f-4ca5-11ef-8048-175cec1b6f0c", _.syntax.literal); export type $uint64 = $.ScalarType<"std::bigint", bigint>; -const uint64: $.scalarTypeWithConstructor<_std.$bigint, never> = $.makeType<$.scalarTypeWithConstructor<_std.$bigint, never>>(_.spec, "2e1fa0aa-4764-11ef-a51f-d7f1babaa1eb", _.syntax.literal); +const uint64: $.scalarTypeWithConstructor<_std.$bigint, never> = $.makeType<$.scalarTypeWithConstructor<_std.$bigint, never>>(_.spec, "6aa26ab8-4ca5-11ef-ac13-570aaf7b32d4", _.syntax.literal); export type $LabelledλShape = $.typeutil.flatten<_std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588λShape & { "address": $.PropertyDesc<$UAddress, $.Cardinality.One, false, false, false, false>; @@ -86,7 +86,7 @@ export type $LabelledλShape = $.typeutil.flatten<_std.$Object_8ce8c71ee4fa5f738 type $Labelled = $.ObjectType<"default::Labelled", $LabelledλShape, null, [ ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], ]>; -const $Labelled = $.makeType<$Labelled>(_.spec, "204eb9bf-4764-11ef-8f65-7705e6148589", _.syntax.literal); +const $Labelled = $.makeType<$Labelled>(_.spec, "5de85cc7-4ca5-11ef-9493-39ac5fad6fde", _.syntax.literal); const Labelled: $.$expr_PathNode<$.TypeSet<$Labelled, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Labelled, $.Cardinality.Many), null); @@ -129,7 +129,7 @@ type $Account = $.ObjectType<"default::Account", $AccountλShape, null, [ ...$Labelled['__exclusives__'], {address: {__element__: $UAddress, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },}, ]>; -const $Account = $.makeType<$Account>(_.spec, "20548536-4764-11ef-b481-87379c66408e", _.syntax.literal); +const $Account = $.makeType<$Account>(_.spec, "5dee2ff0-4ca5-11ef-b17a-3db83afa9cff", _.syntax.literal); const Account: $.$expr_PathNode<$.TypeSet<$Account, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Account, $.Cardinality.Many), null); @@ -144,7 +144,7 @@ export type $ActionλShape = $.typeutil.flatten<_std.$Object_8ce8c71ee4fa5f73840 type $Action = $.ObjectType<"default::Action", $ActionλShape, null, [ ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], ]>; -const $Action = $.makeType<$Action>(_.spec, "241640fd-4764-11ef-88e5-f3ef2a2bae2b", _.syntax.literal); +const $Action = $.makeType<$Action>(_.spec, "6172f3ff-4ca5-11ef-b3bc-0f766e4cdc3f", _.syntax.literal); const Action: $.$expr_PathNode<$.TypeSet<$Action, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Action, $.Cardinality.Many), null); @@ -158,7 +158,7 @@ export type $ActionFunctionλShape = $.typeutil.flatten<_std.$Object_8ce8c71ee4f type $ActionFunction = $.ObjectType<"default::ActionFunction", $ActionFunctionλShape, null, [ ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], ]>; -const $ActionFunction = $.makeType<$ActionFunction>(_.spec, "24137011-4764-11ef-825b-2b8c876581c7", _.syntax.literal); +const $ActionFunction = $.makeType<$ActionFunction>(_.spec, "616ffca6-4ca5-11ef-8539-4b7a8e90b437", _.syntax.literal); const ActionFunction: $.$expr_PathNode<$.TypeSet<$ActionFunction, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($ActionFunction, $.Cardinality.Many), null); @@ -171,7 +171,7 @@ type $ProposalResponse = $.ObjectType<"default::ProposalResponse", $ProposalResp ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], {proposal: {__element__: $Proposal, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },approver: {__element__: $Approver, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },}, ]>; -const $ProposalResponse = $.makeType<$ProposalResponse>(_.spec, "2078b03e-4764-11ef-a50e-a339064e456a", _.syntax.literal); +const $ProposalResponse = $.makeType<$ProposalResponse>(_.spec, "5e2190df-4ca5-11ef-b210-2dc960a5a551", _.syntax.literal); const ProposalResponse: $.$expr_PathNode<$.TypeSet<$ProposalResponse, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($ProposalResponse, $.Cardinality.Many), null); @@ -188,7 +188,7 @@ export type $ApprovalλShape = $.typeutil.flatten<$ProposalResponseλShape & { type $Approval = $.ObjectType<"default::Approval", $ApprovalλShape, null, [ ...$ProposalResponse['__exclusives__'], ]>; -const $Approval = $.makeType<$Approval>(_.spec, "207bea90-4764-11ef-993e-f1206e27e313", _.syntax.literal); +const $Approval = $.makeType<$Approval>(_.spec, "5e257f08-4ca5-11ef-9fba-a3d5d247989e", _.syntax.literal); const Approval: $.$expr_PathNode<$.TypeSet<$Approval, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Approval, $.Cardinality.Many), null); @@ -208,8 +208,8 @@ export type $ApproverλShape = $.typeutil.flatten<_std.$Object_8ce8c71ee4fa5f738 "; "; "; - "; "; + "; "; "; "; @@ -219,7 +219,7 @@ type $Approver = $.ObjectType<"default::Approver", $ApproverλShape, null, [ {user: {__element__: $User, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },address: {__element__: $Address, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },}, {address: {__element__: $Address, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },}, ]>; -const $Approver = $.makeType<$Approver>(_.spec, "218dea55-4764-11ef-9cef-c34d1b837083", _.syntax.literal); +const $Approver = $.makeType<$Approver>(_.spec, "5f2237e8-4ca5-11ef-afc9-975fa86b969c", _.syntax.literal); const Approver: $.$expr_PathNode<$.TypeSet<$Approver, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Approver, $.Cardinality.Many), null); @@ -237,7 +237,7 @@ type $ApproverDetails = $.ObjectType<"default::ApproverDetails", $ApproverDetail ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], {approver: {__element__: $Approver, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },}, ]>; -const $ApproverDetails = $.makeType<$ApproverDetails>(_.spec, "211618ce-4764-11ef-b270-67a1389aebba", _.syntax.literal); +const $ApproverDetails = $.makeType<$ApproverDetails>(_.spec, "5ead7865-4ca5-11ef-a3bd-e7eac02cd5ee", _.syntax.literal); const ApproverDetails: $.$expr_PathNode<$.TypeSet<$ApproverDetails, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($ApproverDetails, $.Cardinality.Many), null); @@ -246,7 +246,7 @@ export type $UserLabelledλShape = $.typeutil.flatten<$LabelledλShape & { type $UserLabelled = $.ObjectType<"default::UserLabelled", $UserLabelledλShape, null, [ ...$Labelled['__exclusives__'], ]>; -const $UserLabelled = $.makeType<$UserLabelled>(_.spec, "217d4691-4764-11ef-afba-af4ae6fda799", _.syntax.literal); +const $UserLabelled = $.makeType<$UserLabelled>(_.spec, "5f03604c-4ca5-11ef-802c-ed51330482be", _.syntax.literal); const UserLabelled: $.$expr_PathNode<$.TypeSet<$UserLabelled, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($UserLabelled, $.Cardinality.Many), null); @@ -261,7 +261,7 @@ type $Contact = $.ObjectType<"default::Contact", $ContactλShape, null, [ ...$UserLabelled['__exclusives__'], {user: {__element__: $User, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },name: {__element__: $BoundedStr, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },}, ]>; -const $Contact = $.makeType<$Contact>(_.spec, "21d73524-4764-11ef-a877-3bb82bf4d759", _.syntax.literal); +const $Contact = $.makeType<$Contact>(_.spec, "5f5e8397-4ca5-11ef-abfb-2f8539a20d77", _.syntax.literal); const Contact: $.$expr_PathNode<$.TypeSet<$Contact, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Contact, $.Cardinality.Many), null); @@ -273,7 +273,7 @@ type $Contract = $.ObjectType<"default::Contract", $ContractλShape, null, [ ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], {address: {__element__: $Address, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },}, ]>; -const $Contract = $.makeType<$Contract>(_.spec, "2e15db81-4764-11ef-97fb-ad814a274212", _.syntax.literal); +const $Contract = $.makeType<$Contract>(_.spec, "6a9aed65-4ca5-11ef-9bc2-d55d381da0fd", _.syntax.literal); const Contract: $.$expr_PathNode<$.TypeSet<$Contract, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Contract, $.Cardinality.Many), null); @@ -296,7 +296,7 @@ export type $EventλShape = $.typeutil.flatten<_std.$Object_8ce8c71ee4fa5f73840c type $Event = $.ObjectType<"default::Event", $EventλShape, null, [ ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], ]>; -const $Event = $.makeType<$Event>(_.spec, "22b23e67-4764-11ef-98a8-2dcb442362f8", _.syntax.literal); +const $Event = $.makeType<$Event>(_.spec, "5ff093bc-4ca5-11ef-9c43-6f19ada07e90", _.syntax.literal); const Event: $.$expr_PathNode<$.TypeSet<$Event, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Event, $.Cardinality.Many), null); @@ -317,7 +317,7 @@ type $Result = $.ObjectType<"default::Result", $ResultλShape, null, [ ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], {systx: {__element__: $SystemTx, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },}, ]>; -const $Result = $.makeType<$Result>(_.spec, "20f7714b-4764-11ef-af88-0732f2b9ec03", _.syntax.literal); +const $Result = $.makeType<$Result>(_.spec, "5e94264b-4ca5-11ef-81c2-851fd2b5c5ec", _.syntax.literal); const Result: $.$expr_PathNode<$.TypeSet<$Result, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Result, $.Cardinality.Many), null); @@ -330,7 +330,7 @@ export type $ReceiptResultλShape = $.typeutil.flatten<$ResultλShape & { type $ReceiptResult = $.ObjectType<"default::ReceiptResult", $ReceiptResultλShape, null, [ ...$Result['__exclusives__'], ]>; -const $ReceiptResult = $.makeType<$ReceiptResult>(_.spec, "20fb54ff-4764-11ef-b427-039be1398bb2", _.syntax.literal); +const $ReceiptResult = $.makeType<$ReceiptResult>(_.spec, "5e975625-4ca5-11ef-a9a7-0f9650e94845", _.syntax.literal); const ReceiptResult: $.$expr_PathNode<$.TypeSet<$ReceiptResult, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($ReceiptResult, $.Cardinality.Many), null); @@ -340,7 +340,7 @@ export type $FailedλShape = $.typeutil.flatten<$ReceiptResultλShape & { type $Failed = $.ObjectType<"default::Failed", $FailedλShape, null, [ ...$ReceiptResult['__exclusives__'], ]>; -const $Failed = $.makeType<$Failed>(_.spec, "28d91269-4764-11ef-ac52-dfc7229707fe", _.syntax.literal); +const $Failed = $.makeType<$Failed>(_.spec, "65b798d7-4ca5-11ef-a444-390b5f498c9a", _.syntax.literal); const Failed: $.$expr_PathNode<$.TypeSet<$Failed, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Failed, $.Cardinality.Many), null); @@ -356,7 +356,7 @@ type $Function = $.ObjectType<"default::Function", $FunctionλShape, null, [ ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], {abiMd5: {__element__: _std.$str, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },}, ]>; -const $Function = $.makeType<$Function>(_.spec, "2e10b8e8-4764-11ef-8e13-6f15fdb346b5", _.syntax.literal); +const $Function = $.makeType<$Function>(_.spec, "6a9639ba-4ca5-11ef-b273-9d776e1189b3", _.syntax.literal); const Function: $.$expr_PathNode<$.TypeSet<$Function, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Function, $.Cardinality.Many), null); @@ -365,7 +365,7 @@ export type $GlobalLabelλShape = $.typeutil.flatten<$LabelledλShape & { type $GlobalLabel = $.ObjectType<"default::GlobalLabel", $GlobalLabelλShape, null, [ ...$Labelled['__exclusives__'], ]>; -const $GlobalLabel = $.makeType<$GlobalLabel>(_.spec, "229a01aa-4764-11ef-8e41-c7c2de587375", _.syntax.literal); +const $GlobalLabel = $.makeType<$GlobalLabel>(_.spec, "5fd91d02-4ca5-11ef-9583-cb65e38f1de8", _.syntax.literal); const GlobalLabel: $.$expr_PathNode<$.TypeSet<$GlobalLabel, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($GlobalLabel, $.Cardinality.Many), null); @@ -393,7 +393,7 @@ type $Proposal = $.ObjectType<"default::Proposal", $ProposalλShape, null, [ ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], {hash: {__element__: $Bytes32, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },}, ]>; -const $Proposal = $.makeType<$Proposal>(_.spec, "20802ffa-4764-11ef-8303-e7c7bcd01fe8", _.syntax.literal); +const $Proposal = $.makeType<$Proposal>(_.spec, "5e2a2680-4ca5-11ef-8f61-79e494cad542", _.syntax.literal); const Proposal: $.$expr_PathNode<$.TypeSet<$Proposal, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Proposal, $.Cardinality.Many), null); @@ -408,7 +408,7 @@ export type $MessageλShape = $.typeutil.flatten<$ProposalλShape & { type $Message = $.ObjectType<"default::Message", $MessageλShape, null, [ ...$Proposal['__exclusives__'], ]>; -const $Message = $.makeType<$Message>(_.spec, "2129fe24-4764-11ef-ad97-2d8b213c3153", _.syntax.literal); +const $Message = $.makeType<$Message>(_.spec, "5ebaef20-4ca5-11ef-a2e8-01685d5aa6c8", _.syntax.literal); const Message: $.$expr_PathNode<$.TypeSet<$Message, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Message, $.Cardinality.Many), null); @@ -425,7 +425,7 @@ export type $OperationλShape = $.typeutil.flatten<_std.$Object_8ce8c71ee4fa5f73 type $Operation = $.ObjectType<"default::Operation", $OperationλShape, null, [ ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], ]>; -const $Operation = $.makeType<$Operation>(_.spec, "21523ccb-4764-11ef-b875-fb4fb2f56a7f", _.syntax.literal); +const $Operation = $.makeType<$Operation>(_.spec, "5edb2383-4ca5-11ef-bf9a-f900748efb6d", _.syntax.literal); const Operation: $.$expr_PathNode<$.TypeSet<$Operation, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Operation, $.Cardinality.Many), null); @@ -438,7 +438,7 @@ export type $PaymasterFeesλShape = $.typeutil.flatten<_std.$Object_8ce8c71ee4fa type $PaymasterFees = $.ObjectType<"default::PaymasterFees", $PaymasterFeesλShape, null, [ ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], ]>; -const $PaymasterFees = $.makeType<$PaymasterFees>(_.spec, "29cd103b-4764-11ef-a72a-718dd2012863", _.syntax.literal); +const $PaymasterFees = $.makeType<$PaymasterFees>(_.spec, "669db769-4ca5-11ef-837c-454737a7fbed", _.syntax.literal); const PaymasterFees: $.$expr_PathNode<$.TypeSet<$PaymasterFees, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($PaymasterFees, $.Cardinality.Many), null); @@ -452,9 +452,9 @@ export type $PolicyStateλShape = $.typeutil.flatten<_std.$Object_8ce8c71ee4fa5f "proposal": $.LinkDesc<$Transaction, $.Cardinality.AtMostOne, {}, false, false, false, false>; "initState": $.PropertyDesc<_std.$bool, $.Cardinality.One, false, true, false, false>; "isActive": $.PropertyDesc<_std.$bool, $.Cardinality.One, false, true, false, false>; - "isDraft": $.PropertyDesc<_std.$bool, $.Cardinality.One, false, true, false, false>; "latest": $.LinkDesc<$PolicyState, $.Cardinality.AtMostOne, {}, false, true, false, false>; "isLatest": $.PropertyDesc<_std.$bool, $.Cardinality.One, false, false, false, true>; + "isDraft": $.PropertyDesc<_std.$bool, $.Cardinality.One, false, true, false, false>; "; "; "; @@ -467,7 +467,7 @@ export type $PolicyStateλShape = $.typeutil.flatten<_std.$Object_8ce8c71ee4fa5f type $PolicyState = $.ObjectType<"default::PolicyState", $PolicyStateλShape, null, [ ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], ]>; -const $PolicyState = $.makeType<$PolicyState>(_.spec, "242886f1-4764-11ef-929c-0bab02d6daa7", _.syntax.literal); +const $PolicyState = $.makeType<$PolicyState>(_.spec, "61817794-4ca5-11ef-9dbf-594bbdf4d9c1", _.syntax.literal); const PolicyState: $.$expr_PathNode<$.TypeSet<$PolicyState, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($PolicyState, $.Cardinality.Many), null); @@ -481,8 +481,8 @@ export type $PolicyλShape = $.typeutil.flatten<$PolicyStateλShape & { "threshold": $.PropertyDesc<$uint16, $.Cardinality.One, false, false, false, false>; "; "; - "; "; + "; "; "; "; @@ -493,20 +493,20 @@ export type $PolicyλShape = $.typeutil.flatten<$PolicyStateλShape & { type $Policy = $.ObjectType<"default::Policy", $PolicyλShape, null, [ ...$PolicyState['__exclusives__'], ]>; -const $Policy = $.makeType<$Policy>(_.spec, "247193b4-4764-11ef-b98b-43412ab6007c", _.syntax.literal); +const $Policy = $.makeType<$Policy>(_.spec, "61c6e63c-4ca5-11ef-ba19-d7f9c89de017", _.syntax.literal); const Policy: $.$expr_PathNode<$.TypeSet<$Policy, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Policy, $.Cardinality.Many), null); export type $RejectionλShape = $.typeutil.flatten<$ProposalResponseλShape & { "; - "; "; + "; "; }>; type $Rejection = $.ObjectType<"default::Rejection", $RejectionλShape, null, [ ...$ProposalResponse['__exclusives__'], ]>; -const $Rejection = $.makeType<$Rejection>(_.spec, "23e29200-4764-11ef-a8bd-8372128d54b8", _.syntax.literal); +const $Rejection = $.makeType<$Rejection>(_.spec, "6124ba1d-4ca5-11ef-b5d8-ef5656bcdf46", _.syntax.literal); const Rejection: $.$expr_PathNode<$.TypeSet<$Rejection, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Rejection, $.Cardinality.Many), null); @@ -515,7 +515,7 @@ export type $RemovedPolicyλShape = $.typeutil.flatten<$PolicyStateλShape & { type $RemovedPolicy = $.ObjectType<"default::RemovedPolicy", $RemovedPolicyλShape, null, [ ...$PolicyState['__exclusives__'], ]>; -const $RemovedPolicy = $.makeType<$RemovedPolicy>(_.spec, "257e1086-4764-11ef-9455-13be6f1a5220", _.syntax.literal); +const $RemovedPolicy = $.makeType<$RemovedPolicy>(_.spec, "626fe938-4ca5-11ef-9756-25b9d52b20d6", _.syntax.literal); const RemovedPolicy: $.$expr_PathNode<$.TypeSet<$RemovedPolicy, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($RemovedPolicy, $.Cardinality.Many), null); @@ -526,7 +526,7 @@ export type $ScheduledλShape = $.typeutil.flatten<$ResultλShape & { type $Scheduled = $.ObjectType<"default::Scheduled", $ScheduledλShape, null, [ ...$Result['__exclusives__'], ]>; -const $Scheduled = $.makeType<$Scheduled>(_.spec, "29568096-4764-11ef-a597-3d8994d55525", _.syntax.literal); +const $Scheduled = $.makeType<$Scheduled>(_.spec, "662c4c25-4ca5-11ef-a518-5d099ea9ef3a", _.syntax.literal); const Scheduled: $.$expr_PathNode<$.TypeSet<$Scheduled, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Scheduled, $.Cardinality.Many), null); @@ -542,7 +542,7 @@ type $Simulation = $.ObjectType<"default::Simulation", $SimulationλShape, null, ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], {transfers: {__element__: $TransferDetails, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },}, ]>; -const $Simulation = $.makeType<$Simulation>(_.spec, "20f36d75-4764-11ef-85f2-4b3b05329944", _.syntax.literal); +const $Simulation = $.makeType<$Simulation>(_.spec, "5e9060fc-4ca5-11ef-9b3d-51fb30cd6781", _.syntax.literal); const Simulation: $.$expr_PathNode<$.TypeSet<$Simulation, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Simulation, $.Cardinality.Many), null); @@ -552,7 +552,7 @@ export type $SuccessfulλShape = $.typeutil.flatten<$ReceiptResultλShape & { type $Successful = $.ObjectType<"default::Successful", $SuccessfulλShape, null, [ ...$ReceiptResult['__exclusives__'], ]>; -const $Successful = $.makeType<$Successful>(_.spec, "2105b3e2-4764-11ef-960b-49a670620ba4", _.syntax.literal); +const $Successful = $.makeType<$Successful>(_.spec, "5ea170f6-4ca5-11ef-bf31-afea94cfc7c3", _.syntax.literal); const Successful: $.$expr_PathNode<$.TypeSet<$Successful, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Successful, $.Cardinality.Many), null); @@ -585,7 +585,7 @@ type $SystemTx = $.ObjectType<"default::SystemTx", $SystemTxλShape, null, [ ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], {hash: {__element__: $Bytes32, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },}, ]>; -const $SystemTx = $.makeType<$SystemTx>(_.spec, "26f00c3c-4764-11ef-80d6-377e30ed5751", _.syntax.literal); +const $SystemTx = $.makeType<$SystemTx>(_.spec, "6407576a-4ca5-11ef-ae65-21d610945520", _.syntax.literal); const SystemTx: $.$expr_PathNode<$.TypeSet<$SystemTx, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($SystemTx, $.Cardinality.Many), null); @@ -612,7 +612,7 @@ type $Token = $.ObjectType<"default::Token", $TokenλShape, null, [ ...$UserLabelled['__exclusives__'], {user: {__element__: $User, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },address: {__element__: $UAddress, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },}, ]>; -const $Token = $.makeType<$Token>(_.spec, "2183ec31-4764-11ef-96a2-0b6a49a9f0d7", _.syntax.literal); +const $Token = $.makeType<$Token>(_.spec, "5f08a947-4ca5-11ef-8b38-29c221c39440", _.syntax.literal); const Token: $.$expr_PathNode<$.TypeSet<$Token, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Token, $.Cardinality.Many), null); @@ -654,7 +654,7 @@ type $Transaction = $.ObjectType<"default::Transaction", $TransactionλShape, nu {paymasterEthFees: {__element__: $PaymasterFees, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },}, {systx: {__element__: $SystemTx, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },}, ]>; -const $Transaction = $.makeType<$Transaction>(_.spec, "2156dd1f-4764-11ef-bab5-e3be1074fbf8", _.syntax.literal); +const $Transaction = $.makeType<$Transaction>(_.spec, "5edf8ed4-4ca5-11ef-8ce7-c5b943565f34", _.syntax.literal); const Transaction: $.$expr_PathNode<$.TypeSet<$Transaction, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Transaction, $.Cardinality.Many), null); @@ -674,7 +674,7 @@ export type $TransferDetailsλShape = $.typeutil.flatten<_std.$Object_8ce8c71ee4 type $TransferDetails = $.ObjectType<"default::TransferDetails", $TransferDetailsλShape, null, [ ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], ]>; -const $TransferDetails = $.makeType<$TransferDetails>(_.spec, "22cf2598-4764-11ef-a9e9-ab0d458149fc", _.syntax.literal); +const $TransferDetails = $.makeType<$TransferDetails>(_.spec, "60223aa5-4ca5-11ef-8489-b1524c592d8a", _.syntax.literal); const TransferDetails: $.$expr_PathNode<$.TypeSet<$TransferDetails, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($TransferDetails, $.Cardinality.Many), null); @@ -685,7 +685,7 @@ type $Transferlike = $.ObjectType<"default::Transferlike", $TransferlikeλShape, ...$Event['__exclusives__'], ...$TransferDetails['__exclusives__'], ]>; -const $Transferlike = $.makeType<$Transferlike>(_.spec, "22f81ab6-4764-11ef-80f8-31c6c07b3080", _.syntax.literal); +const $Transferlike = $.makeType<$Transferlike>(_.spec, "604bc01a-4ca5-11ef-8c8e-956cb484045b", _.syntax.literal); const Transferlike: $.$expr_PathNode<$.TypeSet<$Transferlike, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Transferlike, $.Cardinality.Many), null); @@ -701,7 +701,7 @@ export type $TransferλShape = $.typeutil.flatten<$TransferlikeλShape & { type $Transfer = $.ObjectType<"default::Transfer", $TransferλShape, null, [ ...$Transferlike['__exclusives__'], ]>; -const $Transfer = $.makeType<$Transfer>(_.spec, "2327cacc-4764-11ef-a3af-3f703db9ad0c", _.syntax.literal); +const $Transfer = $.makeType<$Transfer>(_.spec, "60775221-4ca5-11ef-87bd-a5b051854896", _.syntax.literal); const Transfer: $.$expr_PathNode<$.TypeSet<$Transfer, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($Transfer, $.Cardinality.Many), null); @@ -720,7 +720,7 @@ export type $TransferApprovalλShape = $.typeutil.flatten<$TransferlikeλShape & type $TransferApproval = $.ObjectType<"default::TransferApproval", $TransferApprovalλShape, null, [ ...$Transferlike['__exclusives__'], ]>; -const $TransferApproval = $.makeType<$TransferApproval>(_.spec, "235e340b-4764-11ef-ba83-e5435ee15d0e", _.syntax.literal); +const $TransferApproval = $.makeType<$TransferApproval>(_.spec, "60a7c17a-4ca5-11ef-8ffd-7d96b96c14db", _.syntax.literal); const TransferApproval: $.$expr_PathNode<$.TypeSet<$TransferApproval, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($TransferApproval, $.Cardinality.Many), null); @@ -734,7 +734,7 @@ export type $TransferLimitλShape = $.typeutil.flatten<_std.$Object_8ce8c71ee4fa type $TransferLimit = $.ObjectType<"default::TransferLimit", $TransferLimitλShape, null, [ ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], ]>; -const $TransferLimit = $.makeType<$TransferLimit>(_.spec, "241dd3b9-4764-11ef-a7a3-a102ba3aaee4", _.syntax.literal); +const $TransferLimit = $.makeType<$TransferLimit>(_.spec, "617a241e-4ca5-11ef-a223-13f0879448cb", _.syntax.literal); const TransferLimit: $.$expr_PathNode<$.TypeSet<$TransferLimit, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($TransferLimit, $.Cardinality.Many), null); @@ -749,7 +749,7 @@ type $TransfersConfig = $.ObjectType<"default::TransfersConfig", $TransfersConfi ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], {limits: {__element__: $TransferLimit, __cardinality__: $.Cardinality.One | $.Cardinality.AtMostOne },}, ]>; -const $TransfersConfig = $.makeType<$TransfersConfig>(_.spec, "2420a295-4764-11ef-9db9-8d8c05e1a64b", _.syntax.literal); +const $TransfersConfig = $.makeType<$TransfersConfig>(_.spec, "617d203b-4ca5-11ef-8359-a50089664c38", _.syntax.literal); const TransfersConfig: $.$expr_PathNode<$.TypeSet<$TransfersConfig, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($TransfersConfig, $.Cardinality.Many), null); @@ -767,7 +767,7 @@ export type $UserλShape = $.typeutil.flatten<_std.$Object_8ce8c71ee4fa5f73840c2 type $User = $.ObjectType<"default::User", $UserλShape, null, [ ..._std.$Object_8ce8c71ee4fa5f73840c22d7eaa58588['__exclusives__'], ]>; -const $User = $.makeType<$User>(_.spec, "21bbd897-4764-11ef-88b9-e1a063ec0782", _.syntax.literal); +const $User = $.makeType<$User>(_.spec, "5f4a7663-4ca5-11ef-b418-515b28451a86", _.syntax.literal); const User: $.$expr_PathNode<$.TypeSet<$User, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($User, $.Cardinality.Many), null); @@ -776,7 +776,7 @@ export type $current_approverλShape = $.typeutil.flatten<$ApproverλShape & { type $current_approver = $.ObjectType<"default::current_approver", $current_approverλShape, null, [ ...$Approver['__exclusives__'], ]>; -const $current_approver = $.makeType<$current_approver>(_.spec, "21ba7b19-4764-11ef-be41-9dd95d13258e", _.syntax.literal); +const $current_approver = $.makeType<$current_approver>(_.spec, "5f498803-4ca5-11ef-91ed-e3c9ff5a9035", _.syntax.literal); const current_approver: $.$expr_PathNode<$.TypeSet<$current_approver, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($current_approver, $.Cardinality.Many), null); @@ -785,7 +785,7 @@ export type $current_userλShape = $.typeutil.flatten<$UserλShape & { type $current_user = $.ObjectType<"default::current_user", $current_userλShape, null, [ ...$User['__exclusives__'], ]>; -const $current_user = $.makeType<$current_user>(_.spec, "21d6609c-4764-11ef-8b1d-dbee89226901", _.syntax.literal); +const $current_user = $.makeType<$current_user>(_.spec, "5f5d8621-4ca5-11ef-9b10-61d3b29d427c", _.syntax.literal); const current_user: $.$expr_PathNode<$.TypeSet<$current_user, $.Cardinality.Many>, null> = _.syntax.$PathNode($.$toSet($current_user, $.Cardinality.Many), null); @@ -801,7 +801,7 @@ function as_chain< ): as_chainλFuncExpr; function as_chain(...args: any[]) { const {returnType, cardinality, args: positionalArgs, namedArgs} = _.syntax.$resolveOverload('default::as_chain', args, _.spec, [ - {args: [{typeId: "20417536-4764-11ef-ac62-b38ee9f02d8b", optional: false, setoftype: false, variadic: false}], returnTypeId: "00000000-0000-0000-0000-000000000101"}, + {args: [{typeId: "5dda9836-4ca5-11ef-acf5-437102eb4894", optional: false, setoftype: false, variadic: false}], returnTypeId: "00000000-0000-0000-0000-000000000101"}, ]); return _.syntax.$expressionify({ __kind__: $.ExpressionKind.Function, @@ -825,7 +825,7 @@ function as_address< ): as_addressλFuncExpr; function as_address(...args: any[]) { const {returnType, cardinality, args: positionalArgs, namedArgs} = _.syntax.$resolveOverload('default::as_address', args, _.spec, [ - {args: [{typeId: "20417536-4764-11ef-ac62-b38ee9f02d8b", optional: false, setoftype: false, variadic: false}], returnTypeId: "204357f7-4764-11ef-b8e2-513f0814be4c"}, + {args: [{typeId: "5dda9836-4ca5-11ef-acf5-437102eb4894", optional: false, setoftype: false, variadic: false}], returnTypeId: "5ddcd0de-4ca5-11ef-8df4-3ffb14dc9232"}, ]); return _.syntax.$expressionify({ __kind__: $.ExpressionKind.Function, @@ -876,7 +876,7 @@ function as_fixed< ): as_fixedλFuncExpr; function as_fixed(...args: any[]) { const {returnType, cardinality, args: positionalArgs, namedArgs} = _.syntax.$resolveOverload('default::as_fixed', args, _.spec, [ - {args: [{typeId: "00000000-0000-0000-0000-000000000108", optional: false, setoftype: false, variadic: false}, {typeId: "20454d34-4764-11ef-90e6-a1cbef4a169e", optional: false, setoftype: false, variadic: false}], returnTypeId: "00000000-0000-0000-0000-000000000110"}, + {args: [{typeId: "00000000-0000-0000-0000-000000000108", optional: false, setoftype: false, variadic: false}, {typeId: "5ddeceee-4ca5-11ef-af1c-d716780f2bd4", optional: false, setoftype: false, variadic: false}], returnTypeId: "00000000-0000-0000-0000-000000000110"}, ]); return _.syntax.$expressionify({ __kind__: $.ExpressionKind.Function, @@ -900,7 +900,7 @@ function is_member< ): is_memberλFuncExpr; function is_member(...args: any[]) { const {returnType, cardinality, args: positionalArgs, namedArgs} = _.syntax.$resolveOverload('default::is_member', args, _.spec, [ - {args: [{typeId: "20548536-4764-11ef-b481-87379c66408e", optional: false, setoftype: false, variadic: false}], returnTypeId: "00000000-0000-0000-0000-000000000109"}, + {args: [{typeId: "5dee2ff0-4ca5-11ef-b17a-3db83afa9cff", optional: false, setoftype: false, variadic: false}], returnTypeId: "00000000-0000-0000-0000-000000000109"}, ]); return _.syntax.$expressionify({ __kind__: $.ExpressionKind.Function, @@ -927,7 +927,7 @@ function as_decimal< ): as_decimalλFuncExpr; function as_decimal(...args: any[]) { const {returnType, cardinality, args: positionalArgs, namedArgs} = _.syntax.$resolveOverload('default::as_decimal', args, _.spec, [ - {args: [{typeId: "00000000-0000-0000-0000-000000000110", optional: false, setoftype: false, variadic: false}, {typeId: "20454d34-4764-11ef-90e6-a1cbef4a169e", optional: false, setoftype: false, variadic: false}], returnTypeId: "00000000-0000-0000-0000-000000000108"}, + {args: [{typeId: "00000000-0000-0000-0000-000000000110", optional: false, setoftype: false, variadic: false}, {typeId: "5ddeceee-4ca5-11ef-af1c-d716780f2bd4", optional: false, setoftype: false, variadic: false}], returnTypeId: "00000000-0000-0000-0000-000000000108"}, ]); return _.syntax.$expressionify({ __kind__: $.ExpressionKind.Function, @@ -954,7 +954,7 @@ function latestPolicy< ): latestPolicyλFuncExpr; function latestPolicy(...args: any[]) { const {returnType, cardinality, args: positionalArgs, namedArgs} = _.syntax.$resolveOverload('default::latestPolicy', args, _.spec, [ - {args: [{typeId: "20548536-4764-11ef-b481-87379c66408e", optional: false, setoftype: false, variadic: false}, {typeId: "00000000-0000-0000-0000-0000000001ff", optional: false, setoftype: false, variadic: false}], returnTypeId: "247193b4-4764-11ef-b98b-43412ab6007c", returnTypemod: "OptionalType"}, + {args: [{typeId: "5dee2ff0-4ca5-11ef-b17a-3db83afa9cff", optional: false, setoftype: false, variadic: false}, {typeId: "00000000-0000-0000-0000-0000000001ff", optional: false, setoftype: false, variadic: false}], returnTypeId: "61c6e63c-4ca5-11ef-ba19-d7f9c89de017", returnTypemod: "OptionalType"}, ]); return _.syntax.$expressionify({ __kind__: $.ExpressionKind.Function, @@ -981,7 +981,7 @@ function tokenForUser< ): tokenForUserλFuncExpr; function tokenForUser(...args: any[]) { const {returnType, cardinality, args: positionalArgs, namedArgs} = _.syntax.$resolveOverload('default::tokenForUser', args, _.spec, [ - {args: [{typeId: "00000000-0000-0000-0000-000000000101", optional: false, setoftype: false, variadic: false}, {typeId: "21bbd897-4764-11ef-88b9-e1a063ec0782", optional: false, setoftype: false, variadic: false}], returnTypeId: "2183ec31-4764-11ef-96a2-0b6a49a9f0d7", returnTypemod: "OptionalType"}, + {args: [{typeId: "00000000-0000-0000-0000-000000000101", optional: false, setoftype: false, variadic: false}, {typeId: "5f4a7663-4ca5-11ef-b418-515b28451a86", optional: false, setoftype: false, variadic: false}], returnTypeId: "5f08a947-4ca5-11ef-8b38-29c221c39440", returnTypemod: "OptionalType"}, ]); return _.syntax.$expressionify({ __kind__: $.ExpressionKind.Function, @@ -1005,7 +1005,7 @@ function token< ): tokenλFuncExpr; function token(...args: any[]) { const {returnType, cardinality, args: positionalArgs, namedArgs} = _.syntax.$resolveOverload('default::token', args, _.spec, [ - {args: [{typeId: "00000000-0000-0000-0000-000000000101", optional: false, setoftype: false, variadic: false}], returnTypeId: "2183ec31-4764-11ef-96a2-0b6a49a9f0d7", returnTypemod: "OptionalType"}, + {args: [{typeId: "00000000-0000-0000-0000-000000000101", optional: false, setoftype: false, variadic: false}], returnTypeId: "5f08a947-4ca5-11ef-8b38-29c221c39440", returnTypemod: "OptionalType"}, ]); return _.syntax.$expressionify({ __kind__: $.ExpressionKind.Function, @@ -1056,7 +1056,7 @@ function labelForUser< ): labelForUserλFuncExpr; function labelForUser(...args: any[]) { const {returnType, cardinality, args: positionalArgs, namedArgs} = _.syntax.$resolveOverload('default::labelForUser', args, _.spec, [ - {args: [{typeId: "00000000-0000-0000-0000-000000000101", optional: false, setoftype: false, variadic: false}, {typeId: "21bbd897-4764-11ef-88b9-e1a063ec0782", optional: false, setoftype: false, variadic: false}], returnTypeId: "00000000-0000-0000-0000-000000000101", returnTypemod: "OptionalType"}, + {args: [{typeId: "00000000-0000-0000-0000-000000000101", optional: false, setoftype: false, variadic: false}, {typeId: "5f4a7663-4ca5-11ef-b418-515b28451a86", optional: false, setoftype: false, variadic: false}], returnTypeId: "00000000-0000-0000-0000-000000000101", returnTypemod: "OptionalType"}, ]); return _.syntax.$expressionify({ __kind__: $.ExpressionKind.Function, @@ -1089,13 +1089,13 @@ const $default__globals: { current_accounts: _.syntax.$expr_Global< $.makeType(_.spec, "1378c9c3-b11a-5a95-bdac-066a4143094d", _.syntax.literal), $.Cardinality.AtMostOne) as any, current_approver: _.syntax.makeGlobal( "default::current_approver", - $.makeType(_.spec, "21ba7b19-4764-11ef-be41-9dd95d13258e", _.syntax.literal), + $.makeType(_.spec, "5f498803-4ca5-11ef-91ed-e3c9ff5a9035", _.syntax.literal), $.Cardinality.AtMostOne) as any, current_approver_address: _.syntax.makeGlobal( "default::current_approver_address", - $.makeType(_.spec, "204357f7-4764-11ef-b8e2-513f0814be4c", _.syntax.literal), + $.makeType(_.spec, "5ddcd0de-4ca5-11ef-8df4-3ffb14dc9232", _.syntax.literal), $.Cardinality.AtMostOne) as any, current_user: _.syntax.makeGlobal( "default::current_user", - $.makeType(_.spec, "21d6609c-4764-11ef-8b1d-dbee89226901", _.syntax.literal), + $.makeType(_.spec, "5f5d8621-4ca5-11ef-9b10-61d3b29d427c", _.syntax.literal), $.Cardinality.AtMostOne) as any}; diff --git a/api/dbschema/interfaces.ts b/api/dbschema/interfaces.ts index 6ebbb2f03..c90d5f9ae 100644 --- a/api/dbschema/interfaces.ts +++ b/api/dbschema/interfaces.ts @@ -38,6 +38,7 @@ export namespace cfg { "default_statistics_target"?: number | null; "force_database_error"?: string | null; "_pg_prepared_statement_cache_size": number; + "auto_rebuild_query_cache_timeout"?: edgedb.Duration | null; } export type AllowBareDDL = "AlwaysAllow" | "NeverAllow"; export interface Auth extends ConfigObject { @@ -215,9 +216,9 @@ export namespace $default { "proposal"?: Transaction | null; "initState": boolean; "isActive": boolean; - "isDraft": boolean; "latest"?: PolicyState | null; "isLatest": boolean; + "isDraft": boolean; } export interface Policy extends PolicyState { "approvers": Approver[]; diff --git a/api/dbschema/migrations/00002-m1ob6ar.edgeql b/api/dbschema/migrations/00002-m1ob6ar.edgeql new file mode 100644 index 000000000..7dce2ec05 --- /dev/null +++ b/api/dbschema/migrations/00002-m1ob6ar.edgeql @@ -0,0 +1,9 @@ +CREATE MIGRATION m1ob6arfwyamzcpgk2hgzhby3iwv3moewthqacorsw2mtyjkopdoaq + ONTO m13qxppnkqofigih7dxkipm2lh6k3ahrqerachqhdzihw76nb6i3aa +{ + ALTER TYPE default::PolicyState { + ALTER PROPERTY isDraft { + USING ((__source__ ?= .draft)); + }; + }; +}; diff --git a/api/dbschema/policy.esdl b/api/dbschema/policy.esdl index 139505ffe..10e044a44 100644 --- a/api/dbschema/policy.esdl +++ b/api/dbschema/policy.esdl @@ -19,7 +19,7 @@ module default { required initState := .activationBlock ?= 0; required hasBeenActive := exists .activationBlock; required isActive := .isLatest and .hasBeenActive; - required isDraft := exists .draft; + required isDraft := (__source__ ?= .draft); latest := (__source__ if .isLatest else latestPolicy(.account, .key)); draft := assert_single(( with account := __source__.account, key := __source__.key @@ -94,9 +94,9 @@ module default { } type TransfersConfig { - multi limits: TransferLimit { constraint exclusive; } required defaultAllow: bool { default := true; }; required budget: uint32; + multi limits: TransferLimit { constraint exclusive; } } type TransferLimit { diff --git a/api/edgedb.toml b/api/edgedb.toml index 53fc287c2..a4586fff3 100644 --- a/api/edgedb.toml +++ b/api/edgedb.toml @@ -1,2 +1,2 @@ [edgedb] -server-version = "5.4" +server-version = "5.6" diff --git a/api/schema.graphql b/api/schema.graphql index 8ec588d71..82c0b2019 100644 --- a/api/schema.graphql +++ b/api/schema.graphql @@ -207,22 +207,6 @@ input CreateAccountInput { salt: Bytes32 } -input CreatePolicyInput { - account: UAddress! - actions: [ActionInput!] - allowMessages: Boolean - approvers: [Address!] - - """seconds""" - delay: Float - key: PolicyKey - name: String - threshold: Float - transfers: TransfersConfigInput -} - -union CreatePolicyResponse = NameTaken | Policy - interface CustomNode { id: ID! } @@ -342,12 +326,12 @@ type Mutation { approveMessage(input: ApproveInput!): Message! approveTransaction(input: ApproveInput!): Transaction! createAccount(input: CreateAccountInput!): Account! - createPolicy(input: CreatePolicyInput!): CreatePolicyResponse! deleteContact(address: UAddress!): ID execute(input: ExecuteTransactionInput!): Transaction link(input: LinkInput!): User! proposeCancelScheduledTransaction(input: ProposeCancelScheduledTransactionInput!): Transaction! proposeMessage(input: ProposeMessageInput!): Message! + proposePolicies(input: ProposePoliciesInput!): [Policy!]! proposeTransaction(input: ProposeTransactionInput!): Transaction! rejectProposal(input: UniqueProposalInput!): Proposal! removeMessage(input: UniqueProposalInput!): ID! @@ -357,8 +341,7 @@ type Mutation { requestTokens(input: RequestTokensInput!): [Address!]! updateAccount(input: UpdateAccountInput!): Account! updateApprover(input: UpdateApproverInput!): Approver! - updatePolicies(input: UpdatePoliciesInput!): [Policy!]! - updatePolicy(input: UpdatePolicyInput!): UpdatePolicyResponse! + updatePolicyDetails(input: UpdatePolicyDetailsInput!): UpdatePolicyDetailsResponse updateProposal(input: UpdateProposalInput!): Proposal! updateTransaction(input: UpdateTransactionInput!): Transaction! updateUser(input: UpdateUserInput!): User! @@ -575,6 +558,11 @@ input ProposeMessageInput { typedData: TypedData } +input ProposePoliciesInput { + account: UAddress! + policies: [PolicyInput!]! +} + input ProposeTransactionInput { account: UAddress! dapp: DappMetadataInput @@ -1053,24 +1041,13 @@ input UpdateApproverInput { pushToken: String } -input UpdatePoliciesInput { +input UpdatePolicyDetailsInput { account: UAddress! - policies: [UpdatePolicyInput!]! + key: PolicyKey! + name: String! } -input UpdatePolicyInput { - account: UAddress! - actions: [ActionInput!] - allowMessages: Boolean - approvers: [Address!] - - """seconds""" - delay: Float - key: PolicyKey - name: String - threshold: Float - transfers: TransfersConfigInput -} +union UpdatePolicyDetailsResponse = NameTaken | Policy type UpdatePolicyOp { _args: [JSON!]! @@ -1081,8 +1058,6 @@ type UpdatePolicyOp { threshold: Float! } -union UpdatePolicyResponse = NameTaken | Policy - input UpdateProposalInput { id: ID! policy: PolicyKey diff --git a/api/src/core/database/database.service.ts b/api/src/core/database/database.service.ts index b749ae6c6..8ca42d97e 100644 --- a/api/src/core/database/database.service.ts +++ b/api/src/core/database/database.service.ts @@ -51,10 +51,10 @@ export class DatabaseService implements OnModuleInit { return reqCtx.db; } - private async run(p: Promise, name = 'inline'): Promise { + private async run(f: () => Promise, name = 'inline'): Promise { return Sentry.startSpan({ op: 'db.query', name }, async () => { try { - return await p; + return await f(); } catch (e) { if (e instanceof EdgeDBError && e['_query']) Sentry.setExtra('EdgeQL', e['_query']); throw e; @@ -63,7 +63,7 @@ export class DatabaseService implements OnModuleInit { } async query(expression: Expr): Promise<$infer> { - return this.run(expression.run(this.client)); + return this.run(() => expression.run(this.client)); } async queryWith< @@ -75,7 +75,7 @@ export class DatabaseService implements OnModuleInit { params: paramsToParamArgs, ) { const expression = e.params(paramsDef, getExpr as any); - return this.run(expression.run(this.client, params as any)) as Promise<$infer>; + return this.run(() => expression.run(this.client, params as any)) as Promise<$infer>; } async queryWith2< @@ -87,14 +87,14 @@ export class DatabaseService implements OnModuleInit { getExpr: (params: paramsToParamExprs) => Expr, ) { const expression = e.params(paramsDef, getExpr as any); - return this.run(expression.run(this.client, params as any)) as Promise<$infer>; + return this.run(() => expression.run(this.client, params as any)) as Promise<$infer>; } async exec Promise>( f: F, args: Parameters[1], ): Promise>> { - return this.run(f(this.client, args), f.name); + return this.run(() => f(this.client, args), f.name); } async transaction(action: (transaction: Transaction) => Promise): Promise { diff --git a/api/src/core/networks/networks.worker.ts b/api/src/core/networks/networks.worker.ts index 4b22032e6..4f823db88 100644 --- a/api/src/core/networks/networks.worker.ts +++ b/api/src/core/networks/networks.worker.ts @@ -39,7 +39,7 @@ export class NetworkWorker extends Worker { if (runningJobs.find((j) => j.data.chain === network.chain.key)) continue; const chain = network.chain.key; - this.queue.add(chain, { chain }, { repeat: { every: 30_000 /* ms */ }, ...NON_RETRYING_JOB }); + this.queue.add(chain, { chain }, { repeat: { every: 2_000 /* ms */ }, ...NON_RETRYING_JOB }); } } } diff --git a/api/src/feat/accounts/accounts.service.ts b/api/src/feat/accounts/accounts.service.ts index d07f656bd..d8ba7ed9f 100644 --- a/api/src/feat/accounts/accounts.service.ts +++ b/api/src/feat/accounts/accounts.service.ts @@ -11,6 +11,7 @@ import { ACCOUNT_IMPLEMENTATION, DEPLOYER, asUAddress, + PLACEHOLDER_ACCOUNT_ADDRESS, } from 'lib'; import { ShapeFunc } from '~/core/database'; import { @@ -30,6 +31,7 @@ import { AccountsCacheService } from '../auth/accounts.cache.service'; import { v4 as uuid } from 'uuid'; import { selectAccount2 } from './accounts.util'; import { AccountEvent } from './accounts.model'; +import { PolicyInput } from '../policies/policies.input'; const accountTrigger = (account: UAddress) => `account.updated:${account}`; const accountApproverTrigger = (approver: Address) => `account.updated:approver:${approver}`; @@ -105,7 +107,7 @@ export class AccountsService { throw new UserInputError('Duplicate policy keys'); const implementation = ACCOUNT_IMPLEMENTATION.address[chain]; - const account = asUAddress( + const address = asUAddress( getProxyAddress({ deployer: DEPLOYER.address[chain], implementation, @@ -119,35 +121,51 @@ export class AccountsService { const id = uuid(); await this.accountsCache.addCachedAccount({ approver: getApprover(), - account: { id, address: account }, + account: { id, address }, }); + // Replace self address with account address + const selfRefPolicies = policies.map( + (p) => + ({ + ...p, + actions: p.actions?.map((a) => ({ + ...a, + functions: a.functions.map((f) => ({ + ...f, + contract: + f.contract === PLACEHOLDER_ACCOUNT_ADDRESS ? asAddress(address) : f.contract, + })), + })), + }) satisfies PolicyInput, + ); + await this.db.transaction(async () => { await this.db.query( e.insert(e.Account, { id, - address: account, + address, name, implementation, salt, }), ); - for (const policy of policyInputs) { - await this.policies.create({ - account, - initState: true, - ...policy, - }); - } + await this.policies.propose( + { + account: address, + isInitialization: true, + }, + ...selfRefPolicies, + ); }); - this.contracts.addAccountAsVerified(asAddress(account)); - this.faucet.requestTokens(account); - this.event({ account, event: AccountEvent.created }); + this.contracts.addAccountAsVerified(asAddress(address)); + this.faucet.requestTokens(address); + this.event({ account: address, event: AccountEvent.created }); this.setAsPrimaryAccountIfNotConfigured(id); - return { id, address: account }; + return { id, address: address }; } async updateAccount({ account, name, photo }: UpdateAccountInput) { diff --git a/api/src/feat/policies/existing-policies.edgeql b/api/src/feat/policies/existing-policies.edgeql new file mode 100644 index 000000000..c5153922e --- /dev/null +++ b/api/src/feat/policies/existing-policies.edgeql @@ -0,0 +1,29 @@ +with account := (select Account filter .address = $account), + keys := array_unpack(>$policyKeys) +select Policy { + key, + approvers: { address }, + threshold, + actions: { + label, + functions: { + contract, + selector, + abi, + }, + allow, + description, + }, + transfers: { + limits: { + token, + amount, + duration + }, + defaultAllow, + budget + }, + allowMessages, + delay, +} filter .account = account and .key in keys and + (.isDraft if exists .draft else .isLatest) \ No newline at end of file diff --git a/api/src/feat/policies/existing-policies.query.ts b/api/src/feat/policies/existing-policies.query.ts new file mode 100644 index 000000000..b09d41545 --- /dev/null +++ b/api/src/feat/policies/existing-policies.query.ts @@ -0,0 +1,75 @@ +// GENERATED by @edgedb/generate v0.5.3 + +import type {Executor} from "edgedb"; + +export type ExistingPoliciesArgs = { + readonly "account": string; + readonly "policyKeys": ReadonlyArray; +}; + +export type ExistingPoliciesReturns = Array<{ + "key": number; + "approvers": Array<{ + "address": string; + }>; + "threshold": number; + "actions": Array<{ + "label": string; + "functions": [({ + "contract": string | null; + "selector": string | null; + "abi": unknown | null; + }), ...({ + "contract": string | null; + "selector": string | null; + "abi": unknown | null; + })[]]; + "allow": boolean; + "description": string | null; + }>; + "transfers": { + "limits": Array<{ + "token": string; + "amount": bigint; + "duration": number; + }>; + "defaultAllow": boolean; + "budget": number; + }; + "allowMessages": boolean; + "delay": number; +}>; + +export function existingPolicies(client: Executor, args: ExistingPoliciesArgs): Promise { + return client.query(`\ +with account := (select Account filter .address = $account), + keys := array_unpack(>$policyKeys) +select Policy { + key, + approvers: { address }, + threshold, + actions: { + label, + functions: { + contract, + selector, + abi, + }, + allow, + description, + }, + transfers: { + limits: { + token, + amount, + duration + }, + defaultAllow, + budget + }, + allowMessages, + delay, +} filter .account = account and .key in keys and + (.isDraft if exists .draft else .isLatest)`, args); + +} diff --git a/api/src/feat/policies/insert-policies.edgeql b/api/src/feat/policies/insert-policies.edgeql new file mode 100644 index 000000000..2e8bdbf46 --- /dev/null +++ b/api/src/feat/policies/insert-policies.edgeql @@ -0,0 +1,59 @@ +with account := (select Account filter .address = $account), + txId := $transaction, + tx := ((select Transaction filter .id = txId) if exists txId else {}) +for p in array_unpack(>$policies) union ( + with policy := (insert Policy { + account := account, + key := p['key'], + proposal := tx, + activationBlock := json_get(p, 'activationBlock'), + name := p['name'], + threshold := p['threshold'], + approvers := ( + for approver in array_unpack(>p['approvers']) union ( + insert Approver { + address :=
approver['address'], + } unless conflict on .address else (select Approver) + ) + ), + actions := ( + for action in array_unpack(>p['actions']) union ( + insert Action { + label := action['label'], + functions := ( + for func in array_unpack(>action['functions']) union ( + insert ActionFunction { + contract :=
json_get(func, 'contract'), + selector := json_get(func, 'selector'), + abi := json_get(func, 'abi'), + } + ) + ), + allow := action['allow'], + description := json_get(action, 'description'), + } + ) + ), + transfers := ( + insert TransfersConfig { + defaultAllow := p['transfers']['defaultAllow'], + budget := p['transfers']['budget'], + limits := ( + for l in array_unpack(>json_get(p, 'transfers', 'limits')) union ( + insert TransferLimit { + token :=
l['token'], + amount := l['amount'], + duration := l['duration'], + } + ) + ), + } + ), + allowMessages := json_get(p, 'allowMessages'), + delay := json_get(p, 'delay'), + }) + select policy { + id, + key + } +) \ No newline at end of file diff --git a/api/src/feat/policies/insert-policies.query.ts b/api/src/feat/policies/insert-policies.query.ts new file mode 100644 index 000000000..3269c4849 --- /dev/null +++ b/api/src/feat/policies/insert-policies.query.ts @@ -0,0 +1,78 @@ +// GENERATED by @edgedb/generate v0.5.3 + +import type {Executor} from "edgedb"; + +export type InsertPoliciesArgs = { + readonly "account": string; + readonly "transaction"?: string | null; + readonly "policies": ReadonlyArray; +}; + +export type InsertPoliciesReturns = Array<{ + "id": string; + "key": number; +}>; + +export function insertPolicies(client: Executor, args: InsertPoliciesArgs): Promise { + return client.query(`\ +with account := (select Account filter .address = $account), + txId := $transaction, + tx := ((select Transaction filter .id = txId) if exists txId else {}) +for p in array_unpack(>$policies) union ( + with policy := (insert Policy { + account := account, + key := p['key'], + proposal := tx, + activationBlock := json_get(p, 'activationBlock'), + name := p['name'], + threshold := p['threshold'], + approvers := ( + for approver in array_unpack(>p['approvers']) union ( + insert Approver { + address :=
approver['address'], + } unless conflict on .address else (select Approver) + ) + ), + actions := ( + for action in array_unpack(>p['actions']) union ( + insert Action { + label := action['label'], + functions := ( + for func in array_unpack(>action['functions']) union ( + insert ActionFunction { + contract :=
json_get(func, 'contract'), + selector := json_get(func, 'selector'), + abi := json_get(func, 'abi'), + } + ) + ), + allow := action['allow'], + description := json_get(action, 'description'), + } + ) + ), + transfers := ( + insert TransfersConfig { + defaultAllow := p['transfers']['defaultAllow'], + budget := p['transfers']['budget'], + limits := ( + for l in array_unpack(>json_get(p, 'transfers', 'limits')) union ( + insert TransferLimit { + token :=
l['token'], + amount := l['amount'], + duration := l['duration'], + } + ) + ), + } + ), + allowMessages := json_get(p, 'allowMessages'), + delay := json_get(p, 'delay'), + }) + select policy { + id, + key + } +)`, args); + +} diff --git a/api/src/feat/policies/policies.input.ts b/api/src/feat/policies/policies.input.ts index 67c7d2cfa..60514ac50 100644 --- a/api/src/feat/policies/policies.input.ts +++ b/api/src/feat/policies/policies.input.ts @@ -108,24 +108,24 @@ export class PolicyInput { } @InputType() -export class CreatePolicyInput extends PolicyInput { +export class ProposePoliciesInput { @UAddressField() account: UAddress; -} -@InputType() -export class UpdatePolicyInput extends IntersectionType( - UniquePolicyInput, - PartialType(PolicyInput), -) {} + @Field(() => [PolicyInput]) + policies: PolicyInput[]; +} @InputType() -export class UpdatePoliciesInput { +export class UpdatePolicyDetailsInput { @UAddressField() account: UAddress; - @Field(() => [UpdatePolicyInput]) - policies: UpdatePolicyInput[]; + @PolicyKeyField() + key: PolicyKey; + + @Field(() => String) + name: string; } @ArgsType() diff --git a/api/src/feat/policies/policies.model.ts b/api/src/feat/policies/policies.model.ts index e713cd26c..8ddcc63fe 100644 --- a/api/src/feat/policies/policies.model.ts +++ b/api/src/feat/policies/policies.model.ts @@ -150,17 +150,12 @@ export class ValidationError { @ErrorType() export class NameTaken extends Err {} -export const CreatePolicyResponse = createUnionType({ - name: 'CreatePolicyResponse', - types: () => [Policy, NameTaken], - resolveType: makeUnionTypeResolver([[e.Policy, Policy]]), -}); - -export const UpdatePolicyResponse = createUnionType({ - name: 'UpdatePolicyResponse', +export const UpdatePolicyDetailsResponse = createUnionType({ + name: 'UpdatePolicyDetailsResponse', types: () => [Policy, NameTaken], resolveType: makeUnionTypeResolver([[e.Policy, Policy]]), }); +export type UpdatePolicyDetailsResponse = typeof UpdatePolicyDetailsResponse; export enum PolicyEvent { created, diff --git a/api/src/feat/policies/policies.resolver.ts b/api/src/feat/policies/policies.resolver.ts index 9955d91a8..f50b1dd44 100644 --- a/api/src/feat/policies/policies.resolver.ts +++ b/api/src/feat/policies/policies.resolver.ts @@ -10,19 +10,18 @@ import { } from '@nestjs/graphql'; import { GraphQLResolveInfo } from 'graphql'; import { - CreatePolicyInput, ValidationErrorsArgs, UniquePolicyInput, - UpdatePolicyInput, - UpdatePoliciesInput, + UpdatePolicyDetailsInput, PolicyUpdatedInput, + ProposePoliciesInput, } from './policies.input'; import { PoliciesService, PolicyUpdatedPayload } from './policies.service'; import { - CreatePolicyResponse, + NameTaken, Policy, PolicyUpdated, - UpdatePolicyResponse, + UpdatePolicyDetailsResponse, ValidationError, } from './policies.model'; import { getShape } from '~/core/database'; @@ -50,25 +49,24 @@ export class PoliciesResolver { return this.service.validateProposal(proposal, policy); } - @Mutation(() => CreatePolicyResponse) - async createPolicy( - @Input() input: CreatePolicyInput, - @Info() info: GraphQLResolveInfo, - ): Promise { - const r = await this.service.create(input); - return r.isOk() ? (await this.service.latest(r.value, getShape(info)))! : r.error; + @Mutation(() => [Policy]) + async proposePolicies(@Input() input: ProposePoliciesInput, @Info() info: GraphQLResolveInfo) { + const policies = await this.service.propose(input); + return this.service.policies( + policies.map((p) => p.id), + getShape(info), + ); } - @Mutation(() => UpdatePolicyResponse) - async updatePolicy(@Input() input: UpdatePolicyInput, @Info() info: GraphQLResolveInfo) { - await this.service.update(input); - return (await this.service.latest({ account: input.account, key: input.key }, getShape(info)))!; - } + @Mutation(() => UpdatePolicyDetailsResponse, { nullable: true }) + async updatePolicyDetails( + @Input() input: UpdatePolicyDetailsInput, + @Info() info: GraphQLResolveInfo, + ): Promise { + const r = await this.service.updateDetails(input); + if (!r || r instanceof NameTaken) return r || null; - @Mutation(() => [Policy]) - async updatePolicies(@Input() input: UpdatePoliciesInput, @Info() info: GraphQLResolveInfo) { - const policies = await this.service.updatePolicies(input); - return policies ? this.service.policies(policies, getShape(info)) : []; + return this.service.latest({ account: input.account, key: input.key }, getShape(info)); } @Mutation(() => Policy) diff --git a/api/src/feat/policies/policies.service.spec.ts b/api/src/feat/policies/policies.service.spec.ts index 131628f6f..b728deb16 100644 --- a/api/src/feat/policies/policies.service.spec.ts +++ b/api/src/feat/policies/policies.service.spec.ts @@ -1,6 +1,6 @@ import { Test } from '@nestjs/testing'; import { createMock, DeepMocked } from '@golevelup/ts-jest'; -import { CreatePolicyParams, PoliciesService } from './policies.service'; +import { PoliciesService, ProposePoliciesParams } from './policies.service'; import { asPolicyKey, asSelector, @@ -20,12 +20,11 @@ import { inputAsPolicy, policyStateAsPolicy, PolicyShape, selectPolicy } from '. import { PolicyInput } from './policies.input'; import { v1 as uuidv1 } from 'uuid'; import { selectAccount } from '../accounts/accounts.util'; -import { and } from '~/core/database'; describe(PoliciesService.name, () => { let service: PoliciesService; let db: DatabaseService; - let proposals: DeepMocked; + let transactions: DeepMocked; beforeEach(async () => { const module = await Test.createTestingModule({ @@ -36,7 +35,7 @@ describe(PoliciesService.name, () => { service = module.get(PoliciesService); db = module.get(DatabaseService); - proposals = module.get(TransactionsService); + transactions = module.get(TransactionsService); }); let user1Account: UAddress; @@ -44,14 +43,15 @@ describe(PoliciesService.name, () => { const create = async ({ activate, - ...params - }: Partial & { activate?: boolean } = {}) => { - const userCtx = getUserCtx(); - const account = user1Account; - + policies, + account = user1Account, + isInitialization, + }: Partial & { activate?: boolean } = {}) => { const accountId = uuidv1(); + const userCtx = getUserCtx(); userCtx.accounts.push({ id: accountId, address: account }); await e.insert(e.Approver, { address: userCtx.approver }).unlessConflict().run(db.client); + policies ??= [{ approvers: [] }]; await db.query( e.insert(e.Account, { @@ -63,15 +63,15 @@ describe(PoliciesService.name, () => { }), ); - const initPolicy = ( - await service.create({ + const [initPolicy] = await service.propose( + { account, - approvers: [userCtx.approver], - initState: true, - }) - )._unsafeUnwrap(); + isInitialization: true, + }, + { approvers: [userCtx.approver] }, + ); - proposals.propose.mockImplementation(async () => { + transactions.propose.mockImplementation(async () => { const hash = randomHex(32); const { id } = await db.query( @@ -96,13 +96,13 @@ describe(PoliciesService.name, () => { return asUUID(id); }); - const { id, key } = ( - await service.create({ + const [{ id, key }] = await service.propose( + { account, - approvers: [userCtx.approver], - ...params, - }) - )._unsafeUnwrap(); + isInitialization, + }, + ...policies, + ); if (activate) { await db.query( @@ -134,13 +134,13 @@ describe(PoliciesService.name, () => { it('proposes an upsert', () => asUser(user1, async () => { await create(); - expect(proposals.propose).toHaveBeenCalled(); + expect(transactions.propose).toHaveBeenCalled(); })); it('inserts correct policy', () => asUser(user1, async () => { - const key = asPolicyKey(125); - const policyInput: PolicyInput = { + const policyInput = { + key: asPolicyKey(125), approvers: [getUserCtx().approver, randomAddress()], threshold: 1, actions: [ @@ -164,10 +164,10 @@ describe(PoliciesService.name, () => { budget: 10, defaultAllow: false, }, - }; - const expectedPolicy = inputAsPolicy(key, policyInput); + } satisfies PolicyInput; + const expectedPolicy = inputAsPolicy(policyInput.key, policyInput); - const { id } = await create({ ...policyInput, key }); + const { id } = await create({ policies: [policyInput] }); const p = await db.query(e.select(selectPolicy(id), () => PolicyShape)); const actualPolicy = policyStateAsPolicy(p); @@ -175,61 +175,61 @@ describe(PoliciesService.name, () => { })); }); - describe('update', () => { - it('creates draft state', () => - asUser(user1, async () => { - const { account, key } = await create(); - await service.update({ account, key, approvers: [] }); - - const states = await db.query( - e.select(e.Policy, (p) => ({ - filter: and(e.op(p.account, '=', selectAccount(account)), e.op(p.key, '=', key)), - })), - ); - - expect(states).toHaveLength(2); - })); - - it('proposes transaction', () => - asUser(user1, async () => { - const policy = await create(); - - expect(proposals.propose).toHaveBeenCalled(); - await service.update({ ...policy, approvers: [] }); - })); - - it('updates names', () => - asUser(user1, async () => { - const { account, key } = await create(); - const newName = 'new name'; - await service.update({ account, key, name: newName }); - - const names = e.select(e.Policy, (p) => ({ - filter: and(e.op(p.account, '=', selectAccount(account)), e.op(p.key, '=', key)), - })).name; - - expect(await db.query(names)).toEqual([newName]); - })); - - it("throws if the user isn't a member of the account", async () => { - const policy = await asUser(user1, create); - - await asUser(randomUser(), () => - expect(service.update({ ...policy, name: '' })).rejects.toThrow(), - ); - }); - - it("throws if the policy doesn't exist", () => - asUser(user1, async () => { - await expect( - service.update({ - account: user1Account, - key: asPolicyKey(10), - approvers: [], - }), - ).rejects.toThrow(); - })); - }); + // describe('update', () => { + // it('creates draft state', () => + // asUser(user1, async () => { + // const { account, key } = await create(); + // await service.create({ account }, { key, approvers: [] }); + + // const states = await db.query( + // e.select(e.Policy, (p) => ({ + // filter: and(e.op(p.account, '=', selectAccount(account)), e.op(p.key, '=', key)), + // })), + // ); + + // expect(states).toHaveLength(2); + // })); + + // it('proposes transaction', () => + // asUser(user1, async () => { + // const policy = await create(); + + // expect(proposals.propose).toHaveBeenCalled(); + // await service.create({ account: policy.account }, { ...policy, approvers: [] }); + // })); + + // it('updates names', () => + // asUser(user1, async () => { + // const { account, key } = await create(); + // const newName = 'new name'; + // await service.update({ account, key, name: newName }); + + // const names = e.select(e.Policy, (p) => ({ + // filter: and(e.op(p.account, '=', selectAccount(account)), e.op(p.key, '=', key)), + // })).name; + + // expect(await db.query(names)).toEqual([newName]); + // })); + + // it("throws if the user isn't a member of the account", async () => { + // const policy = await asUser(user1, create); + + // await asUser(randomUser(), () => + // expect(service.update({ ...policy, name: '' })).rejects.toThrow(), + // ); + // }); + + // it("throws if the policy doesn't exist", () => + // asUser(user1, async () => { + // await expect( + // service.update({ + // account: user1Account, + // key: asPolicyKey(10), + // approvers: [], + // }), + // ).rejects.toThrow(); + // })); + // }); describe('remove', () => { it('becomes draft of active policy', () => @@ -249,18 +249,18 @@ describe(PoliciesService.name, () => { asUser(user1, async () => { const policy = await create({ activate: true }); - proposals.propose.mockClear(); + transactions.propose.mockClear(); await service.remove(policy); - expect(proposals.propose).toHaveBeenCalled(); + expect(transactions.propose).toHaveBeenCalled(); })); it('removes without a proposal if the policy is inactive', () => asUser(user1, async () => { const policy = await create(); - proposals.propose.mockClear(); + transactions.propose.mockClear(); await service.remove(policy); - expect(proposals.propose).not.toHaveBeenCalled(); + expect(transactions.propose).not.toHaveBeenCalled(); })); it("returns undefined if the user isn't a member of the account", async () => { diff --git a/api/src/feat/policies/policies.service.ts b/api/src/feat/policies/policies.service.ts index 3e097bf15..978d6e12a 100644 --- a/api/src/feat/policies/policies.service.ts +++ b/api/src/feat/policies/policies.service.ts @@ -14,13 +14,14 @@ import { Tx, UUID, asUUID, + PolicyKey, } from 'lib'; import { TransactionsService } from '../transactions/transactions.service'; import { - CreatePolicyInput, + PolicyInput, + ProposePoliciesInput, UniquePolicyInput, - UpdatePoliciesInput, - UpdatePolicyInput, + UpdatePolicyDetailsInput, } from './policies.input'; import { UserInputError } from '@nestjs/apollo'; import { AccountsCacheService } from '../auth/accounts.cache.service'; @@ -33,21 +34,19 @@ import { policyInputAsStateShape, selectPolicy, latestPolicy2, + inputAsPolicy, } from './policies.util'; import { NameTaken, PolicyEvent, Policy as PolicyModel, ValidationError } from './policies.model'; -import { - TX_SHAPE, - transactionAsTx, - ProposalTxShape, - selectTransaction, -} from '../transactions/transactions.util'; -import { and, isExclusivityConstraintViolation } from '~/core/database'; +import { TX_SHAPE, transactionAsTx, ProposalTxShape } from '../transactions/transactions.util'; import { selectAccount, selectAccount2 } from '../accounts/accounts.util'; -import { err, ok } from 'neverthrow'; import { encodeFunctionData } from 'viem'; import { $Transaction } from '~/edgeql-js/modules/default'; import { getUserCtx } from '~/core/context'; import { PubsubService } from '~/core/pubsub/pubsub.service'; +import { existingPolicies } from './existing-policies.query'; +import { insertPolicies } from './insert-policies.query'; +import { updatePolicyDetails } from './update-policy-details.query'; +import { ConstraintViolationError } from 'edgedb'; export const MIN_AUTO_POLICY_KEY = 32; // 2^5; keys [0, 31] are reserved for manual keys @@ -58,9 +57,9 @@ export interface PolicyUpdatedPayload { } const policyUpdatedTrigger = (account: UAddress) => `account.policy:${account}`; -export interface CreatePolicyParams extends CreatePolicyInput { - initState?: boolean; -} +export type ProposePoliciesParams = ProposePoliciesInput & { + isInitialization?: boolean; +}; @Injectable() export class PoliciesService { @@ -103,191 +102,81 @@ export class PoliciesService { ); } - async create({ account, name, key, initState, ...policyInput }: CreatePolicyParams) { - key ??= await this.getNextKey(account); - - const state = policyInputAsStateShape(key, policyInput); - const proposal = - !initState && (await this.getStateProposal(account, policyStateAsPolicy(state))); - - try { - const { id } = await this.db.query( - e.insert(e.Policy, { - account: selectAccount(account), - key, - name: name || `Policy ${key}`, - ...(proposal && { proposal: selectTransaction(proposal) }), - ...this.insertStateShape(state, initState ? { account: asAddress(account) } : undefined), - }), - ); - - this.userAccounts.invalidateApproversCache(...policyInput.approvers); - - this.event({ event: PolicyEvent.created, account, policyId: asUUID(id) }); - - return ok({ id, account, key }); - } catch (e) { - // May occur due to key or name uniqueness; key however is only accepted internally so it must be by name - if (isExclusivityConstraintViolation(e)) - return err(new NameTaken('A policy with this name already exists')); - - throw e; - } - } - - async update({ account, key, name, ...policyInput }: UpdatePolicyInput) { - // Metadata - if (name !== undefined) { - const updatedPolicies = await this.db.queryWith( - { account: e.UAddress, key: e.int64 }, - ({ account, key }) => - e.update(e.Policy, (p) => ({ - filter: and(e.op(p.account, '=', selectAccount2(account)), e.op(p.key, '=', key)), - set: { name }, - })), - { account, key }, - ); - - if (!updatedPolicies.length) throw new UserInputError("Policy doesn't exist"); - } - - // State - if (Object.values(policyInput).some((v) => v !== undefined)) { - // Get existing policy state - // If approvers, threshold, or permissions are undefined then modify the policy accordingly - // Propose new state - const existing = await this.db.queryWith( - { account: e.UAddress, key: e.int64 }, - ({ account, key }) => - e.select(latestPolicy2(account, key), (p) => ({ - draft: e.select(p.draft.is(e.Policy), () => PolicyShape), - ...PolicyShape, - })), - { account, key }, - ); - if (!existing) throw new UserInputError("Policy doesn't exist"); - - const currentState = existing.draft ?? existing; - const currentPolicy = policyStateAsPolicy(currentState); - - const newState = policyInputAsStateShape(key, policyInput, currentState); - const newPolicy = policyStateAsPolicy(newState); - // TODO: update existing Policy object directly if equivalent - if (encodePolicy(currentPolicy) === encodePolicy(newPolicy)) return ok(undefined); // Only update if policy would actually change - - const id = await this.db.query( - e.insert(e.Policy, { - account: selectAccount(account), - key, - name: name || selectPolicy({ account, key }).name, - proposal: selectTransaction(await this.getStateProposal(account, newPolicy)), - ...this.insertStateShape(newState), - }).id, - ); - - this.userAccounts.invalidateApproversCache( - ...newState.approvers.map((a) => asAddress(a.address)), - ); - - this.event({ event: PolicyEvent.created, account, policyId: asUUID(id) }); - } - } - - async updatePolicies({ account, policies }: UpdatePoliciesInput) { - const metadataUpdates = policies.filter((p) => p.name); - if (metadataUpdates.length) { - await this.db.queryWith( - { policies: e.array(e.tuple({ account: e.UAddress, key: e.uint16, name: e.str })) }, - ({ policies }) => - e.for(e.cast(e.json, e.array_unpack(policies)), (p) => - e.update(latestPolicy2(e.cast(e.UAddress, p.account), e.cast(e.int64, p.key)), () => ({ - set: { name: e.cast(e.str, p.name) }, - })), - ), - { - policies: metadataUpdates.map((p) => ({ account: p.account, key: p.key, name: p.name! })), - }, - ); - } - - const existingPolicies = await this.db.queryWith( - { policies: e.array(e.tuple({ account: e.UAddress, key: e.uint16 })) }, - ({ policies }) => - e.for(e.cast(e.json, e.array_unpack(policies)), (p) => - e.select(latestPolicy2(e.cast(e.UAddress, p.account), e.cast(e.int64, p.key)), (p) => ({ - draft: e.select(p.draft.is(e.Policy), () => PolicyShape), - name: true, - ...PolicyShape, - })), - ), - { policies: policies.map((p) => ({ account: p.account, key: p.key })) }, - ); - - const toUpdate = policies - .map((p, i) => { - const existing = existingPolicies[i]; - if (!existing) - throw new UserInputError(`Policy doesn't exist: account=${p.account} key=${p.key}`); - - const currentState = existing.draft ?? existing; - const currentPolicy = policyStateAsPolicy(currentState); - - const newState = policyInputAsStateShape(p.key, p, currentState); - const newPolicy = policyStateAsPolicy(newState); - // TODO: update existing Policy object directly if equivalent - if (encodePolicy(currentPolicy) === encodePolicy(newPolicy)) return undefined; // Only update if policy would actually change - - return { - account: p.account, - state: newState, - policy: newPolicy, - name: p.name || existing.name, - }; + async propose( + { account, isInitialization }: Omit, + ...policies: PolicyInput[] + ) { + let autoKey = policies.some((p) => p.key === undefined) + ? await this.getNextKey(account) + : asPolicyKey(0); + const policiesWithKeys = policies.map((p) => ({ + ...p, + key: (p.key ?? autoKey++) as PolicyKey, + })); + + // Only draft if it differs from existing + const policyKeys = policiesWithKeys.map((p) => p.key); + const currentPolicies = await this.db.exec(existingPolicies, { account, policyKeys }); + const changedPolicies = policiesWithKeys + .map((input) => { + const policy = inputAsPolicy(input.key, input); + const existing = currentPolicies.find((p) => p.key === policy.key); + return ( + (!existing || encodePolicy(policy) !== encodePolicy(policyStateAsPolicy(existing))) && { + input, + policy, + } + ); }) .filter(Boolean); - if (!toUpdate.length) return; - - const transaction = await this.transactions.propose({ - label: 'Update ' + (toUpdate.length === 1 ? 'policy' : 'policies'), - account, - operations: toUpdate.map((p) => ({ - to: asAddress(p.account), - data: encodeFunctionData({ - abi: ACCOUNT_ABI, - functionName: 'addPolicy', - args: [encodePolicyStruct(p.policy)], - }), - })), - }); - - const insertedPolicies = await this.db.query( - e.select( - e.set( - ...toUpdate.map((p) => - e.insert(e.Policy, { - account: selectAccount(account), - key: p.policy.key, - name: p.name, - proposal: selectTransaction(transaction), - ...this.insertStateShape(p.state), + // Propose transaction with policy inserts + const transaction = !isInitialization + ? await this.transactions.propose({ + label: 'Update ' + (changedPolicies.length === 1 ? 'policy' : 'policies'), + account, + operations: changedPolicies.map(({ policy }) => ({ + to: asAddress(account), + data: encodeFunctionData({ + abi: ACCOUNT_ABI, + functionName: 'addPolicy', + args: [encodePolicyStruct(policy)], }), - ), - ).id, - ), - ); + })), + }) + : undefined; - this.userAccounts.invalidateApproversCache( - ...toUpdate.flatMap((p) => p.state.approvers).map((a) => asAddress(a.address)), - ); + // Insert changed policies + const newPolicies = ( + await this.db.exec(insertPolicies, { + account, + transaction, + policies: changedPolicies.map(({ input }) => ({ + ...(isInitialization && { activationBlock: 0n }), + ...policyInputAsStateShape(input.key, input), + name: input.name || 'Policy ' + input.key, + })), + }) + ).map((p) => ({ ...p, id: asUUID(p.id), key: asPolicyKey(p.key) })); - const ids = (Array.isArray(insertedPolicies) ? insertedPolicies : [insertedPolicies]).map( - asUUID, + const approvers = new Set(changedPolicies.flatMap(({ input }) => input.approvers)); + this.userAccounts.invalidateApproversCache(...approvers); + + newPolicies.forEach(({ id }) => + this.event({ event: PolicyEvent.created, account, policyId: id }), ); - ids.map((policyId) => this.event({ event: PolicyEvent.updated, account, policyId })); + return newPolicies; + } - return ids; + async updateDetails({ account, key, name }: UpdatePolicyDetailsInput) { + try { + const r = await this.db.exec(updatePolicyDetails, { account, key, name }); + return r; + } catch (e) { + if (e instanceof ConstraintViolationError && e.message.includes('name')) + return new NameTaken(e.message); // TODO: message indicating which key and name is invalid + } } async remove({ account, key }: UniquePolicyInput) { @@ -406,73 +295,6 @@ export class PoliciesService { this.pubsub.event(policyUpdatedTrigger(payload.account), payload); } - private insertStateShape(p: NonNullable, initState?: { account: Address }) { - if (initState) { - p.actions = p.actions.map((a) => { - const functions = a.functions.map((f) => ({ - ...f, - contract: f.contract === PLACEHOLDER_ACCOUNT_ADDRESS ? initState.account : f.contract, - })); - - return { ...a, functions: functions as [(typeof functions)[0], ...typeof functions] }; - }); - } - - return { - ...(initState && { activationBlock: 0n }), - approvers: e.for(e.cast(e.str, e.set(...p.approvers.map((a) => a.address))), (approver) => - e.insert(e.Approver, { address: e.cast(e.str, approver) }).unlessConflict((approver) => ({ - on: approver.address, - else: approver, - })), - ), - threshold: p.threshold || p.approvers.length, - actions: e.for(e.cast(e.json, e.set(...p.actions.map((a) => e.json(a)))), (a) => - e.insert(e.Action, { - label: e.cast(e.BoundedStr, a.label), - functions: e.for(e.json_array_unpack(a.functions), (f) => - e.insert(e.ActionFunction, { - contract: e.cast(e.Address, e.json_get(f, 'contract')), - selector: e.cast(e.Bytes4, e.json_get(f, 'selector')), - abi: e.cast(e.json, e.json_get(f, 'abi')), - }), - ), - allow: e.cast(e.bool, a.allow), - description: e.cast(e.str, e.json_get(a, 'description')), - }), - ), - transfers: e.insert(e.TransfersConfig, { - defaultAllow: p.transfers.defaultAllow, - budget: p.transfers.budget, - limits: e.for(e.cast(e.json, e.set(...p.transfers.limits.map((l) => e.json(l)))), (limit) => - e.insert(e.TransferLimit, { - token: e.cast(e.Address, limit.token), - amount: e.cast(e.uint224, e.cast(e.str, limit.amount)), - duration: e.cast(e.uint32, limit.duration), - }), - ), - }), - allowMessages: p.allowMessages, - delay: p.delay, - } satisfies Partial>[1]>; - } - - private async getStateProposal(account: UAddress, policy: Policy) { - return await this.transactions.propose({ - account, - operations: [ - { - to: asAddress(account), - data: encodeFunctionData({ - abi: ACCOUNT_ABI, - functionName: 'addPolicy', - args: [encodePolicyStruct(policy)], - }), - }, - ], - }); - } - private async getNextKey(account: UAddress) { const maxKey = (await this.db.query(e.select(e.max(selectAccount(account).policies.key)))) as | number diff --git a/api/src/feat/policies/update-policy-details.edgeql b/api/src/feat/policies/update-policy-details.edgeql new file mode 100644 index 000000000..f186b0752 --- /dev/null +++ b/api/src/feat/policies/update-policy-details.edgeql @@ -0,0 +1,5 @@ +with account := (select Account filter .address = $account), + latest := (select Policy filter .account = account and .key = $key and .isLatest) +update (latest union latest.draft[is Policy]) set { + name := $name +} diff --git a/api/src/feat/policies/update-policy-details.query.ts b/api/src/feat/policies/update-policy-details.query.ts new file mode 100644 index 000000000..15070c0bc --- /dev/null +++ b/api/src/feat/policies/update-policy-details.query.ts @@ -0,0 +1,23 @@ +// GENERATED by @edgedb/generate v0.5.3 + +import type {Executor} from "edgedb"; + +export type UpdatePolicyDetailsArgs = { + readonly "account": string; + readonly "key": number; + readonly "name": string; +}; + +export type UpdatePolicyDetailsReturns = Array<{ + "id": string; +}>; + +export function updatePolicyDetails(client: Executor, args: UpdatePolicyDetailsArgs): Promise { + return client.query(`\ +with account := (select Account filter .address = $account), + latest := (select Policy filter .account = account and .key = $key and .isLatest) +update (latest union latest.draft[is Policy]) set { + name := $name +}`, args); + +} diff --git a/api/src/feat/transactions/delete-transaction.query.ts b/api/src/feat/transactions/delete-transaction.query.ts index 4dbdac9b0..693328d98 100644 --- a/api/src/feat/transactions/delete-transaction.query.ts +++ b/api/src/feat/transactions/delete-transaction.query.ts @@ -31,6 +31,7 @@ select { account: { address } } ), + # Delete policies the proposal was going to activate deletedPolicies := (delete t. { networks.get.mockReturnValue({ chain: CHAINS['zksync-local'], estimatedMaxFeePerGas: async () => new Decimal('.00000001'), + getCode: async () => '0x00', // Non-zero - activated } satisfies DeepPartial as unknown as Network); paymasters.paymasterFees.mockImplementation(async () => ({ diff --git a/api/src/feat/transactions/transactions.service.ts b/api/src/feat/transactions/transactions.service.ts index 4d4c126d0..92996bb98 100644 --- a/api/src/feat/transactions/transactions.service.ts +++ b/api/src/feat/transactions/transactions.service.ts @@ -169,19 +169,29 @@ export class TransactionsService { const network = this.networks.get(chain); const paymaster = this.paymasters.for(chain); + const isActive = !!(await network.getCode({ address: asAddress(account) }))?.length; + const getGas = async () => gasInput ?? ( await network.estimateFee({ type: 'eip712', account: asAddress(account), - paymaster, - paymasterInput: encodePaymasterInput({ - token: feeToken, - amount: 0n, - maxAmount: 0n, - }), ...encodeOperations(operations), + // Only active accounts can estimate paymaster fees. Inactive accounts use EOA account code and throw 'Unsupported paymaster flow' + ...(isActive + ? { + paymaster, + paymasterInput: encodePaymasterInput({ + token: feeToken, + amount: 0n, + maxAmount: 0n, + }), + } + : { + paymaster: undefined, + paymasterInput: undefined, + }), }) ).gasLimit; diff --git a/app/package.json b/app/package.json index d5739d439..e338d875a 100644 --- a/app/package.json +++ b/app/package.json @@ -54,6 +54,7 @@ "babel-preset-expo": "~11.0.8", "chardet": "^2.0.0", "color": "^4.2.3", + "corejs": "^1.0.0", "crypto-browserify": "^3.12.0", "decimal.js": "^10.4.3", "dotenv": "^16.4.5", diff --git a/app/src/app/(sheet)/accounts.tsx b/app/src/app/(sheet)/accounts.tsx index 44ffe402e..50118c099 100644 --- a/app/src/app/(sheet)/accounts.tsx +++ b/app/src/app/(sheet)/accounts.tsx @@ -49,7 +49,7 @@ export default function AccountsSheet() { style={styles.action} onPress={() => { goBackOnClose.current = false; - router.push(`/accounts/create`); + router.replace(`/accounts/create`); }} > @@ -62,7 +62,7 @@ export default function AccountsSheet() { style={styles.action} onPress={() => { goBackOnClose.current = false; - router.push(`/accounts/join`); + router.replace(`/accounts/join`); }} > @@ -85,12 +85,13 @@ export default function AccountsSheet() { status={selectedAddress === a.address ? 'checked' : 'unchecked'} /> } - onPress={() => - router.push({ + onPress={() => { + goBackOnClose.current = false; + router.replace({ pathname: `/(nav)/[account]/(home)/`, params: { account: a.address }, - }) - } + }); + }} /> )} keyExtractor={(a) => a.id} diff --git a/app/src/app/onboard/user.tsx b/app/src/app/onboard/user.tsx index 92317d022..a52d70c77 100644 --- a/app/src/app/onboard/user.tsx +++ b/app/src/app/onboard/user.tsx @@ -106,7 +106,7 @@ function UserOnboarding() { containerStyle={styles.input} /> - +