Repository: DA0-DA0/dao-contracts
Pull request #476 (2022-09-02 01:56:06)

Stop using a git dependency for cw-multitest
I saw that the cargo audit build [was breaking](https://github.com/DA0-DA0/dao-contracts/runs/8147390503?check_suite_focus=true), and that we also couldn't `cargo update` on main:
```
Updating crates.io index
    Updating git repository `[https://github.com/CosmWasm/cw-plus`](https://github.com/CosmWasm/cw-plus%60)
error: failed to select a version for `cosmwasm-std`.
    ... required by package `cw-multi-test v0.14.0 (https://github.com/CosmWasm/cw-plus?branch=main#24af1b9b)`
    ... which satisfies git dependency `cw-multi-test` of package `cw-core v0.2.0 (/home/runner/work/dao-contracts/dao-contracts/contracts/cw-core)`
    ... which satisfies path dependency `cw-core` of package `cw-admin-factory v0.2.0 (/home/runner/work/dao-contracts/dao-contracts/contracts/cw-admin-factory)`
versions that meet the requirements `^1.1.0-rc.1` are: 1.1.0-rc.2, 1.1.0-rc.1

all possible versions conflict with previously selected packages.

  previously selected package `cosmwasm-std v1.0.0`
    ... which satisfies dependency `cosmwasm-std = "^1.0.0"` of package `cosmwasm-storage v1.0.0`
    ... which satisfies dependency `cosmwasm-storage = "^1.0.0"` of package `cw-admin-factory v0.2.0 (/home/runner/work/dao-contracts/dao-contracts/contracts/cw-admin-factory)`

failed to select a version for `cosmwasm-std` which could resolve this conflict
```

This is because we were using a git dependency for this dev dependency and a breaking change was merged.


After fixing this, I also did a `cargo update` and pushed the most recent lock file.

I also ensured there were no other cargo git dependencies in the project to avoid more surprises. 


codecov-commenter: # [Codecov](https://codecov.io/gh/DA0-DA0/dao-contracts/pull/476?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DA0-DA0) Report
> Merging [#476](https://codecov.io/gh/DA0-DA0/dao-contracts/pull/476?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DA0-DA0) (2038dad) into [main](https://codecov.io/gh/DA0-DA0/dao-contracts/commit/17f0488347056fb1f03daca53f45371bd7d2ef09?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DA0-DA0) (17f0488) will **not change** coverage.
> The diff coverage is `n/a`.

```diff
@@           Coverage Diff           @@
##             main     #476   +/-   ##
=======================================
  Coverage   95.92%   95.92%           
=======================================
  Files          34       34           
  Lines        5477     5477           
=======================================
  Hits         5254     5254           
  Misses        223      223           
```



Help us with your feedback. Take ten seconds to tell us [how you rate us](https://about.codecov.io/nps?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DA0-DA0). Have a feature suggestion? [Share it here.](https://app.codecov.io/gh/feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DA0-DA0)

github-actions[bot]: ![gas](https://liquipedia.net/commons/images/thumb/7/7e/Scr-gas-t.png/20px-Scr-gas-t.png)     Cosm-Orc Gas Usage Report     ![gas](https://liquipedia.net/commons/images/thumb/7/7e/Scr-gas-t.png/20px-Scr-gas-t.png)
  
No gas diff larger than 0.5% 


<details><summary>Raw Report for 6d749ae382d72465128f592472cd7990c921a1ef</summary>

| Contract | Op Name | Gas Used | Gas Wanted | File | 
| --- | --- | --- | --- | --- |
| cw20_base | Execute__exc_stake_stake_tokens | 234580 | 319226 | ci/integration_tests/src/tests/cw20_stake_test.rs:73 |
| cw20_base | Store__Store | 34725990 | 52064345 | ci/integration_tests/src/helpers/chain.rs:82 |
| cw_core | Instantiate__exc_stake_create_dao | 978917 | 1443771 | ci/integration_tests/src/helpers/helper.rs:86 |
| cw_core | Execute__exc_items_rm | 192600 | 264389 | ci/integration_tests/src/tests/cw_core_test.rs:169 |
| cw_core | Execute__exc_items_set | 194267 | 266889 | ci/integration_tests/src/tests/cw_core_test.rs:134 |
| cw_core | Instantiate__exc_items_create_dao | 979991 | 1445382 | ci/integration_tests/src/helpers/helper.rs:86 |
| cw_core | Store__Store | 45078310 | 67592825 | ci/integration_tests/src/helpers/chain.rs:82 |
| cw_core | Instantiate__inst_dao_no_admin | 978941 | 1443807 | ci/integration_tests/src/helpers/helper.rs:86 |
| cw_core | Execute__exc_admin_msgs_pause_dao | 194393 | 267078 | ci/integration_tests/src/tests/cw_core_test.rs:74 |
| cw_core | Instantiate__exc_admin_msgs_create_dao | 978941 | 1443807 | ci/integration_tests/src/helpers/helper.rs:86 |
| cw_core | Instantiate__exc_admin_msgs_create_dao_with_admin | 979991 | 1445382 | ci/integration_tests/src/helpers/helper.rs:86 |
| cw_core | Instantiate__inst_admin_create_dao | 979991 | 1445382 | ci/integration_tests/src/helpers/helper.rs:86 |
| cw20_stake | Store__Store | 29024865 | 43512986 | ci/integration_tests/src/helpers/chain.rs:82 |
| cw20_staked_balance_voting | Store__Store | 29469420 | 44179490 | ci/integration_tests/src/helpers/chain.rs:82 |
| cw4_group | Store__Store | 21882500 | 32799110 | ci/integration_tests/src/helpers/chain.rs:82 |
| cw4_voting | Store__Store | 21842460 | 32739050 | ci/integration_tests/src/helpers/chain.rs:82 |
| cw721_stake | Store__Store | 31174530 | 46737155 | ci/integration_tests/src/helpers/chain.rs:82 |
| cw_admin_factory | Store__Store | 16212880 | 24294680 | ci/integration_tests/src/helpers/chain.rs:82 |
| cw_named_groups | Store__Store | 19605940 | 29384270 | ci/integration_tests/src/helpers/chain.rs:82 |
| cw_names_registry | Store__Store | 21283000 | 31899860 | ci/integration_tests/src/helpers/chain.rs:82 |
| cw_native_staked_balance_voting | Store__Store | 24396550 | 36570185 | ci/integration_tests/src/helpers/chain.rs:82 |
| cw_proposal_multiple | Store__Store | 51285390 | 76903445 | ci/integration_tests/src/helpers/chain.rs:82 |
| cw_proposal_single | Store__Store | 51816580 | 77700230 | ci/integration_tests/src/helpers/chain.rs:82 |
| cw_token_swap | Store__Store | 19325330 | 28963355 | ci/integration_tests/src/helpers/chain.rs:82 |
| stake_cw20_external_rewards | Store__Store | 25509310 | 38239325 | ci/integration_tests/src/helpers/chain.rs:82 |
| stake_cw20_reward_distributor | Store__Store | 19374500 | 29037110 | ci/integration_tests/src/helpers/chain.rs:82 |
</details>

Patch:
diff --git a/.github/workflows/ts_types.yml b/.github/workflows/ts_types.yml
index a203344c..e852ed00 100644
--- a/.github/workflows/ts_types.yml
+++ b/.github/workflows/ts_types.yml
@@ -10,11 +10,11 @@ jobs:
       - name: Checkout sources
         uses: actions/checkout@v2
       - name: Yarn install
-        run: yarn --cwd ./types install --frozen-lockfile
+        run: yarn --cwd ./typescript install --frozen-lockfile
       - name: Yarn build
-        run: yarn --cwd ./types build
+        run: yarn --cwd ./typescript build
       - name: Yarn codegen
-        run: yarn --cwd ./types codegen
+        run: yarn --cwd ./typescript codegen
       - name: Show ts changes
         run: git status --porcelain
       - name: Check for ts changes
diff --git a/Cargo.lock b/Cargo.lock
index fbf02189..fc24268b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -39,9 +39,9 @@ dependencies = [
 
 [[package]]
 name = "anyhow"
-version = "1.0.59"
+version = "1.0.63"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c91f1f46651137be86f3a2b9a8359f9ab421d04d941c62b5982e1ca21113adf9"
+checksum = "a26fa4d7e3f2eebadf743988fc8aec9fa9a9e82611acafd77c1462ed6262440a"
 
 [[package]]
 name = "assert_matches"
@@ -100,9 +100,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
 
 [[package]]
 name = "axum"
-version = "0.5.13"
+version = "0.5.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b9496f0c1d1afb7a2af4338bbe1d969cddfead41d87a9fb3aaa6d0bbc7af648"
+checksum = "9de18bc5f2e9df8f52da03856bf40e29b747de5a84e43aefff90e3dc4a21529b"
 dependencies = [
  "async-trait",
  "axum-core",
@@ -170,9 +170,9 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
 
 [[package]]
 name = "base64ct"
-version = "1.5.1"
+version = "1.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3bdca834647821e0b13d9539a8634eb62d3501b6b6c2cec1722786ee6671b851"
+checksum = "ea2b2456fd614d856680dcd9fcc660a51a820fa09daef2e49772b56a193c8474"
 
 [[package]]
 name = "bip32"
@@ -234,9 +234,9 @@ dependencies = [
 
 [[package]]
 name = "bumpalo"
-version = "3.10.0"
+version = "3.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3"
+checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d"
 
 [[package]]
 name = "byteorder"
@@ -421,9 +421,9 @@ dependencies = [
 
 [[package]]
 name = "cpufeatures"
-version = "0.2.2"
+version = "0.2.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b"
+checksum = "dc948ebb96241bb40ab73effeb80d9f93afaad49359d159a5e61be51619fe813"
 dependencies = [
  "libc",
 ]
@@ -591,7 +591,8 @@ dependencies = [
 [[package]]
 name = "cw-multi-test"
 version = "0.14.0"
-source = "git+https://github.com/CosmWasm/cw-plus?branch=main#0a3f52dc2c8b5bdc79be7077a8a877a6c495604e"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca153120cf5b91af88be106b0c6c0263423d959bc813b1592982c02c4691a4ae"
 dependencies = [
  "anyhow",
  "cosmwasm-std",
@@ -781,7 +782,8 @@ dependencies = [
 [[package]]
 name = "cw-storage-plus"
 version = "0.14.0"
-source = "git+https://github.com/CosmWasm/cw-plus?branch=main#0a3f52dc2c8b5bdc79be7077a8a877a6c495604e"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c8b264257c4f44c49b7ce09377af63aa040768ecd3fd7bdd2d48a09323a1e90"
 dependencies = [
  "cosmwasm-std",
  "schemars",
@@ -833,7 +835,8 @@ dependencies = [
 [[package]]
 name = "cw-utils"
 version = "0.14.0"
-source = "git+https://github.com/CosmWasm/cw-plus?branch=main#0a3f52dc2c8b5bdc79be7077a8a877a6c495604e"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "414b91f3d7a619bb26c835119d7095804596a1382ddc1d184c33c1d2c17f6c5e"
 dependencies = [
  "cosmwasm-std",
  "cw2 0.14.0",
@@ -858,7 +861,8 @@ dependencies = [
 [[package]]
 name = "cw2"
 version = "0.14.0"
-source = "git+https://github.com/CosmWasm/cw-plus?branch=main#0a3f52dc2c8b5bdc79be7077a8a877a6c495604e"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa74c324af8e3506fd8d50759a265bead3f87402e413c840042af5d2808463d6"
 dependencies = [
  "cosmwasm-std",
  "cw-storage-plus 0.14.0",
@@ -1206,9 +1210,9 @@ dependencies = [
 
 [[package]]
 name = "either"
-version = "1.7.0"
+version = "1.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be"
+checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
 
 [[package]]
 name = "elliptic-curve"
@@ -1310,9 +1314,9 @@ checksum = "85dcb89d2b10c5f6133de2efd8c11959ce9dbb46a2f7a4cab208c4eeda6ce1ab"
 
 [[package]]
 name = "futures"
-version = "0.3.21"
+version = "0.3.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e"
+checksum = "7f21eda599937fba36daeb58a22e8f5cee2d14c4a17b5b7739c7c8e5e3b8230c"
 dependencies = [
  "futures-channel",
  "futures-core",
@@ -1325,9 +1329,9 @@ dependencies = [
 
 [[package]]
 name = "futures-channel"
-version = "0.3.21"
+version = "0.3.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010"
+checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050"
 dependencies = [
  "futures-core",
  "futures-sink",
@@ -1335,15 +1339,15 @@ dependencies = [
 
 [[package]]
 name = "futures-core"
-version = "0.3.21"
+version = "0.3.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3"
+checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf"
 
 [[package]]
 name = "futures-executor"
-version = "0.3.21"
+version = "0.3.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6"
+checksum = "9ff63c23854bee61b6e9cd331d523909f238fc7636290b96826e9cfa5faa00ab"
 dependencies = [
  "futures-core",
  "futures-task",
@@ -1352,15 +1356,15 @@ dependencies = [
 
 [[package]]
 name = "futures-io"
-version = "0.3.21"
+version = "0.3.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b"
+checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68"
 
 [[package]]
 name = "futures-macro"
-version = "0.3.21"
+version = "0.3.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512"
+checksum = "42cd15d1c7456c04dbdf7e88bcd69760d74f3a798d6444e16974b505b0e62f17"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1369,21 +1373,21 @@ dependencies = [
 
 [[package]]
 name = "futures-sink"
-version = "0.3.21"
+version = "0.3.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868"
+checksum = "21b20ba5a92e727ba30e72834706623d94ac93a725410b6a6b6fbc1b07f7ba56"
 
 [[package]]
 name = "futures-task"
-version = "0.3.21"
+version = "0.3.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a"
+checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1"
 
 [[package]]
 name = "futures-util"
-version = "0.3.21"
+version = "0.3.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a"
+checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90"
 dependencies = [
  "futures-channel",
  "futures-core",
@@ -1450,9 +1454,9 @@ dependencies = [
 
 [[package]]
 name = "h2"
-version = "0.3.13"
+version = "0.3.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57"
+checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be"
 dependencies = [
  "bytes",
  "fnv",
@@ -1556,9 +1560,9 @@ checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29"
 
 [[package]]
 name = "httparse"
-version = "1.7.1"
+version = "1.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
 
 [[package]]
 name = "httpdate"
@@ -1772,9 +1776,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 
 [[package]]
 name = "libc"
-version = "0.2.127"
+version = "0.2.132"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "505e71a4706fa491e9b1b55f51b95d4037d0821ee40131190475f692b35b009b"
+checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5"
 
 [[package]]
 name = "linked-hash-map"
@@ -1784,9 +1788,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
 
 [[package]]
 name = "lock_api"
-version = "0.4.7"
+version = "0.4.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53"
+checksum = "9f80bf5aacaf25cbfc8210d1cfb718f2bf3b11c4c54e5afe36c236853a8ec390"
 dependencies = [
  "autocfg",
  "scopeguard",
@@ -1957,9 +1961,9 @@ dependencies = [
 
 [[package]]
 name = "once_cell"
-version = "1.13.0"
+version = "1.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1"
+checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e"
 
 [[package]]
 name = "opaque-debug"
@@ -2008,9 +2012,9 @@ dependencies = [
 
 [[package]]
 name = "paste"
-version = "1.0.8"
+version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9423e2b32f7a043629287a536f21951e8c6a82482d0acb1eeebfc90bc2225b22"
+checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1"
 
 [[package]]
 name = "pathdiff"
@@ -2062,9 +2066,9 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
 
 [[package]]
 name = "pest"
-version = "2.2.1"
+version = "2.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69486e2b8c2d2aeb9762db7b4e00b0331156393555cff467f4163ff06821eef8"
+checksum = "4b0560d531d1febc25a3c9398a62a71256c0178f2e3443baedd9ad4bb8c9deb4"
 dependencies = [
  "thiserror",
  "ucd-trie",
@@ -2072,9 +2076,9 @@ dependencies = [
 
 [[package]]
 name = "pest_derive"
-version = "2.2.1"
+version = "2.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b13570633aff33c6d22ce47dd566b10a3b9122c2fe9d8e7501895905be532b91"
+checksum = "905708f7f674518498c1f8d644481440f476d39ca6ecae83319bba7c6c12da91"
 dependencies = [
  "pest",
  "pest_generator",
@@ -2082,9 +2086,9 @@ dependencies = [
 
 [[package]]
 name = "pest_generator"
-version = "2.2.1"
+version = "2.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3c567e5702efdc79fb18859ea74c3eb36e14c43da7b8c1f098a4ed6514ec7a0"
+checksum = "5803d8284a629cc999094ecd630f55e91b561a1d1ba75e233b00ae13b91a69ad"
 dependencies = [
  "pest",
  "pest_meta",
@@ -2095,9 +2099,9 @@ dependencies = [
 
 [[package]]
 name = "pest_meta"
-version = "2.2.1"
+version = "2.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5eb32be5ee3bbdafa8c7a18b0a8a8d962b66cfa2ceee4037f49267a50ee821fe"
+checksum = "1538eb784f07615c6d9a8ab061089c6c54a344c5b4301db51990ca1c241e8c04"
 dependencies = [
  "once_cell",
  "pest",
@@ -2106,18 +2110,18 @@ dependencies = [
 
 [[package]]
 name = "pin-project"
-version = "1.0.11"
+version = "1.0.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78203e83c48cffbe01e4a2d35d566ca4de445d79a85372fc64e378bfc812a260"
+checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc"
 dependencies = [
  "pin-project-internal",
 ]
 
 [[package]]
 name = "pin-project-internal"
-version = "1.0.11"
+version = "1.0.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "710faf75e1b33345361201d36d04e98ac1ed8909151a017ed384700836104c74"
+checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2527,9 +2531,9 @@ dependencies = [
 
 [[package]]
 name = "security-framework"
-version = "2.6.1"
+version = "2.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc"
+checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c"
 dependencies = [
  "bitflags",
  "core-foundation",
@@ -2556,9 +2560,9 @@ checksum = "93f6841e709003d68bb2deee8c343572bf446003ec20a583e76f7b15cebf3711"
 
 [[package]]
 name = "serde"
-version = "1.0.142"
+version = "1.0.144"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e590c437916fb6b221e1d00df6e3294f3fccd70ca7e92541c475d6ed6ef5fee2"
+checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860"
 dependencies = [
  "serde_derive",
 ]
@@ -2583,9 +2587,9 @@ dependencies = [
 
 [[package]]
 name = "serde_derive"
-version = "1.0.142"
+version = "1.0.144"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34b5b8d809babe02f538c2cfec6f2c1ed10804c0e5a6a041a049a4f5588ccc2e"
+checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2605,9 +2609,9 @@ dependencies = [
 
 [[package]]
 name = "serde_json"
-version = "1.0.83"
+version = "1.0.85"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38dd04e3c8279e75b31ef29dbdceebfe5ad89f4d0937213c53f7d49d01b3d5a7"
+checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44"
 dependencies = [
  "itoa",
  "ryu",
@@ -2697,9 +2701,9 @@ checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1"
 
 [[package]]
 name = "socket2"
-version = "0.4.4"
+version = "0.4.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0"
+checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd"
 dependencies = [
  "libc",
  "winapi",
@@ -2969,18 +2973,18 @@ dependencies = [
 
 [[package]]
 name = "thiserror"
-version = "1.0.32"
+version = "1.0.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f5f6586b7f764adc0231f4c79be7b920e766bb2f3e51b3661cdb263828f19994"
+checksum = "3d0a539a918745651435ac7db7a18761589a94cd7e94cd56999f828bf73c8a57"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.32"
+version = "1.0.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12bafc5b54507e0149cdf1b145a5d80ab80a90bcd9275df43d4fff68460f6c21"
+checksum = "c251e90f708e16c49a16f4917dc2131e75222b72edfa9cb7f7c58ae56aae0c09"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2989,11 +2993,10 @@ dependencies = [
 
 [[package]]
 name = "time"
-version = "0.3.12"
+version = "0.3.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74b7cc93fc23ba97fde84f7eea56c55d1ba183f495c6715defdfc7b9cb8c870f"
+checksum = "3c3f9a28b618c3a6b9251b6908e9c99e04b9e5c02e6581ccbb67d59c34ef7f9b"
 dependencies = [
- "js-sys",
  "libc",
  "num_threads",
  "time-macros",
diff --git a/contracts/cw-core/Cargo.toml b/contracts/cw-core/Cargo.toml
index 6e188499..522dac2b 100644
--- a/contracts/cw-core/Cargo.toml
+++ b/contracts/cw-core/Cargo.toml
@@ -45,8 +45,7 @@ cw-paginate = { version = "0.2.0", path = "../../packages/cw-paginate" }
 
 [dev-dependencies]
 cosmwasm-schema = { version = "1.0.0" }
-# TODO: We are using the main branch of cw-multi-test until the next release, because we need recent stargate parsing fixes
-cw-multi-test = { git = "https://github.com/CosmWasm/cw-plus", branch = "main",  features = ["stargate"] }
+cw-multi-test = { version = "0.14", features = ["stargate"] }
 cw20-base = "0.13"
 cw721-base = "0.13"
 cw-proposal-sudo = { version = "0.2.0", path = "../../debug/cw-proposal-sudo"}
diff --git a/contracts/cw-core/examples/schema.rs b/contracts/cw-core/examples/schema.rs
index 582b4867..293e68f4 100644
--- a/contracts/cw-core/examples/schema.rs
+++ b/contracts/cw-core/examples/schema.rs
@@ -38,6 +38,7 @@ fn main() {
     // Auto TS code generation expects the query return type as QueryNameResponse
     // Here we map query responses to the correct name
     export_schema_with_title(&schema_for!(Option<Addr>), &out_dir, "AdminResponse");
+    export_schema_with_title(&schema_for!(Option<String>), &out_dir, "DaoURIResponse");
     export_schema_with_title(&schema_for!(Config), &out_dir, "ConfigResponse");
     export_schema_with_title(
         &schema_for!(Cw20BalanceResponse),
diff --git a/contracts/cw-core/schema/config_response.json b/contracts/cw-core/schema/config_response.json
index f609c4d9..8a458f87 100644
--- a/contracts/cw-core/schema/config_response.json
+++ b/contracts/cw-core/schema/config_response.json
@@ -18,6 +18,13 @@
       "description": "If true the contract will automatically add received cw721 tokens to its treasury.",
       "type": "boolean"
     },
+    "dao_uri": {
+      "description": "The URI for the DAO as defined by the DAOstar standard https://daostar.one/EIP",
+      "type": [
+        "string",
+        "null"
+      ]
+    },
     "description": {
       "description": "A description of the contract.",
       "type": "string"
diff --git a/contracts/cw-core/schema/dao_u_r_i_response.json b/contracts/cw-core/schema/dao_u_r_i_response.json
new file mode 100644
index 00000000..2b9566ad
--- /dev/null
+++ b/contracts/cw-core/schema/dao_u_r_i_response.json
@@ -0,0 +1,8 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "title": "DaoURIResponse",
+  "type": [
+    "string",
+    "null"
+  ]
+}
diff --git a/contracts/cw-core/schema/dump_state_response.json b/contracts/cw-core/schema/dump_state_response.json
index 36e718d6..0fc6f328 100644
--- a/contracts/cw-core/schema/dump_state_response.json
+++ b/contracts/cw-core/schema/dump_state_response.json
@@ -103,6 +103,13 @@
           "description": "If true the contract will automatically add received cw721 tokens to its treasury.",
           "type": "boolean"
         },
+        "dao_uri": {
+          "description": "The URI for the DAO as defined by the DAOstar standard https://daostar.one/EIP",
+          "type": [
+            "string",
+            "null"
+          ]
+        },
         "description": {
           "description": "A description of the contract.",
           "type": "string"
diff --git a/contracts/cw-core/schema/execute_msg.json b/contracts/cw-core/schema/execute_msg.json
index f388e666..acbe1119 100644
--- a/contracts/cw-core/schema/execute_msg.json
+++ b/contracts/cw-core/schema/execute_msg.json
@@ -504,6 +504,13 @@
           "description": "If true the contract will automatically add received cw721 tokens to its treasury.",
           "type": "boolean"
         },
+        "dao_uri": {
+          "description": "The URI for the DAO as defined by the DAOstar standard https://daostar.one/EIP",
+          "type": [
+            "string",
+            "null"
+          ]
+        },
         "description": {
           "description": "A description of the contract.",
           "type": "string"
diff --git a/contracts/cw-core/schema/instantiate_msg.json b/contracts/cw-core/schema/instantiate_msg.json
index 10b76ac2..6e16cc29 100644
--- a/contracts/cw-core/schema/instantiate_msg.json
+++ b/contracts/cw-core/schema/instantiate_msg.json
@@ -26,6 +26,13 @@
       "description": "If true the contract will automatically add received cw721 tokens to its treasury.",
       "type": "boolean"
     },
+    "dao_uri": {
+      "description": "Implements the DAO Star standard: https://daostar.one/EIP",
+      "type": [
+        "string",
+        "null"
+      ]
+    },
     "description": {
       "description": "A description of the core contract.",
       "type": "string"
diff --git a/contracts/cw-core/schema/migrate_msg.json b/contracts/cw-core/schema/migrate_msg.json
index 81f306ae..6b9264c8 100644
--- a/contracts/cw-core/schema/migrate_msg.json
+++ b/contracts/cw-core/schema/migrate_msg.json
@@ -9,7 +9,15 @@
       ],
       "properties": {
         "from_v1": {
-          "type": "object"
+          "type": "object",
+          "properties": {
+            "dao_uri": {
+              "type": [
+                "string",
+                "null"
+              ]
+            }
+          }
         }
       },
       "additionalProperties": false
diff --git a/contracts/cw-core/schema/query_msg.json b/contracts/cw-core/schema/query_msg.json
index cf9325eb..f3fe0a75 100644
--- a/contracts/cw-core/schema/query_msg.json
+++ b/contracts/cw-core/schema/query_msg.json
@@ -304,6 +304,19 @@
       },
       "additionalProperties": false
     },
+    {
+      "description": "Implements the DAO Star standard: https://daostar.one/EIP",
+      "type": "object",
+      "required": [
+        "dao_u_r_i"
+      ],
+      "properties": {
+        "dao_u_r_i": {
+          "type": "object"
+        }
+      },
+      "additionalProperties": false
+    },
     {
       "type": "object",
       "required": [
diff --git a/contracts/cw-core/src/contract.rs b/contracts/cw-core/src/contract.rs
index dc110962..5799de6e 100644
--- a/contracts/cw-core/src/contract.rs
+++ b/contracts/cw-core/src/contract.rs
@@ -5,11 +5,13 @@ use cosmwasm_std::{
     Response, StdError, StdResult, SubMsg,
 };
 use cw2::{get_contract_version, set_contract_version};
-use cw_storage_plus::Map;
+use cw_storage_plus::{Item, Map};
 use cw_utils::{parse_reply_instantiate_data, Duration};
 
 use cw_core_interface::voting;
 use cw_paginate::{paginate_map, paginate_map_keys, paginate_map_values};
+use schemars::JsonSchema;
+use serde::{Deserialize, Serialize};
 
 use crate::error::ContractError;
 use crate::msg::{
@@ -48,6 +50,7 @@ pub fn instantiate(
         image_url: msg.image_url,
         automatically_add_cw20s: msg.automatically_add_cw20s,
         automatically_add_cw721s: msg.automatically_add_cw721s,
+        dao_uri: msg.dao_uri,
     };
     CONFIG.save(deps.storage, &config)?;
 
@@ -566,6 +569,7 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult<Binary> {
         QueryMsg::ListSubDaos { start_after, limit } => {
             query_list_sub_daos(deps, start_after, limit)
         }
+        QueryMsg::DaoURI {} => query_dao_uri(deps),
     }
 }
 
@@ -827,16 +831,34 @@ pub fn query_list_sub_daos(
     to_binary(&subdaos)
 }
 
+pub fn query_dao_uri(deps: Deps) -> StdResult<Binary> {
+    let config = CONFIG.load(deps.storage)?;
+    to_binary(&config.dao_uri)
+}
+
 #[cfg_attr(not(feature = "library"), entry_point)]
 pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result<Response, ContractError> {
     set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?;
     match msg {
-        MigrateMsg::FromV1 {} => {
+        MigrateMsg::FromV1 { dao_uri } => {
+            // This config version is from commit
+            // e531c760a5d057329afd98d62567aaa4dca2c96f (v1.0.0) and code ID
+            // 432.
+            #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
+            struct V1Config {
+                pub name: String,
+                pub description: String,
+                pub image_url: Option<String>,
+                pub automatically_add_cw20s: bool,
+                pub automatically_add_cw721s: bool,
+            }
+
             let current_map: Map<Addr, Empty> = Map::new("proposal_modules");
             let current_keys = current_map
                 .keys(deps.storage, None, None, Order::Ascending)
                 .collect::<StdResult<Vec<Addr>>>()?;
 
+            // Update proposal modules to v2.
             current_keys
                 .into_iter()
                 .enumerate()
@@ -850,6 +872,22 @@ pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result<Response, Co
                     PROPOSAL_MODULES.save(deps.storage, address, proposal_module)?;
                     Ok(())
                 })?;
+
+            // Update config to have the V2 "dao_uri" field.
+            let config_item: Item<V1Config> = Item::new("config");
+            let v1_config: V1Config = config_item.load(deps.storage)?;
+            CONFIG.save(
+                deps.storage,
+                &Config {
+                    name: v1_config.name,
+                    description: v1_config.description,
+                    image_url: v1_config.image_url,
+                    automatically_add_cw20s: v1_config.automatically_add_cw20s,
+                    automatically_add_cw721s: v1_config.automatically_add_cw721s,
+                    dao_uri,
+                },
+            )?;
+
             Ok(Response::default())
         }
         MigrateMsg::FromCompatible {} => Ok(Response::default()),
diff --git a/contracts/cw-core/src/msg.rs b/contracts/cw-core/src/msg.rs
index e52e3c56..ac361b2a 100644
--- a/contracts/cw-core/src/msg.rs
+++ b/contracts/cw-core/src/msg.rs
@@ -76,6 +76,8 @@ pub struct InstantiateMsg {
     /// items map. The value is an enum that either uses an existing
     /// address or instantiates a new contract.
     pub initial_items: Option<Vec<InitialItem>>,
+    /// Implements the DAO Star standard: https://daostar.one/EIP
+    pub dao_uri: Option<String>,
 }
 
 #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
@@ -222,11 +224,13 @@ pub enum QueryMsg {
         start_after: Option<String>,
         limit: Option<u32>,
     },
+    /// Implements the DAO Star standard: https://daostar.one/EIP
+    DaoURI {},
 }
 
 #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
 #[serde(rename_all = "snake_case")]
 pub enum MigrateMsg {
-    FromV1 {},
+    FromV1 { dao_uri: Option<String> },
     FromCompatible {},
 }
diff --git a/contracts/cw-core/src/state.rs b/contracts/cw-core/src/state.rs
index 2ec25d0a..32e612c1 100644
--- a/contracts/cw-core/src/state.rs
+++ b/contracts/cw-core/src/state.rs
@@ -20,6 +20,9 @@ pub struct Config {
     /// If true the contract will automatically add received cw721
     /// tokens to its treasury.
     pub automatically_add_cw721s: bool,
+    /// The URI for the DAO as defined by the DAOstar standard
+    /// https://daostar.one/EIP
+    pub dao_uri: Option<String>,
 }
 
 #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
@@ -59,7 +62,7 @@ pub const ADMIN: Item<Addr> = Item::new("admin");
 pub const NOMINATED_ADMIN: Item<Addr> = Item::new("nominated_admin");
 
 /// The current configuration of the module.
-pub const CONFIG: Item<Config> = Item::new("config");
+pub const CONFIG: Item<Config> = Item::new("config_v2");
 
 /// The time the DAO will unpause. Here be dragons: this is not set if
 /// the DAO has never been paused.
diff --git a/types/.gitignore b/typescript/.gitignore
similarity index 100%
rename from types/.gitignore
rename to typescript/.gitignore
diff --git a/types/contracts/cw-admin-factory/CwAdminFactoryContract.ts b/typescript/contracts/cw-admin-factory/CwAdminFactoryContract.ts
similarity index 100%
rename from types/contracts/cw-admin-factory/CwAdminFactoryContract.ts
rename to typescript/contracts/cw-admin-factory/CwAdminFactoryContract.ts
diff --git a/types/contracts/cw-core/CwCoreContract.ts b/typescript/contracts/cw-core/CwCoreContract.ts
similarity index 98%
rename from types/contracts/cw-core/CwCoreContract.ts
rename to typescript/contracts/cw-core/CwCoreContract.ts
index d9697d8a..ac420a53 100644
--- a/types/contracts/cw-core/CwCoreContract.ts
+++ b/typescript/contracts/cw-core/CwCoreContract.ts
@@ -23,6 +23,7 @@ export type AdminResponse = Addr | null;
 export interface ConfigResponse {
   automatically_add_cw20s: boolean;
   automatically_add_cw721s: boolean;
+  dao_uri?: string | null;
   description: string;
   image_url?: string | null;
   name: string;
@@ -36,6 +37,7 @@ export interface Cw20BalancesResponse {
 }
 export type Cw20TokenListResponse = Addr[];
 export type Cw721TokenListResponse = Addr[];
+export type DaoURIResponse = string | null;
 export type Timestamp = Uint64;
 export type Uint64 = string;
 export type PauseInfoResponse = {
@@ -72,6 +74,7 @@ export interface DumpStateResponse {
 export interface Config {
   automatically_add_cw20s: boolean;
   automatically_add_cw721s: boolean;
+  dao_uri?: string | null;
   description: string;
   image_url?: string | null;
   name: string;
@@ -362,6 +365,7 @@ export interface InstantiateMsg {
   admin?: string | null;
   automatically_add_cw20s: boolean;
   automatically_add_cw721s: boolean;
+  dao_uri?: string | null;
   description: string;
   image_url?: string | null;
   initial_items?: InitialItem[] | null;
@@ -379,6 +383,7 @@ export type ListItemsResponse = string[];
 export type ListSubDaosResponse = SubDao[];
 export type MigrateMsg = {
   from_v1: {
+    dao_uri?: string | null;
     [k: string]: unknown;
   };
 } | {
@@ -458,6 +463,10 @@ export type QueryMsg = {
     start_after?: string | null;
     [k: string]: unknown;
   };
+} | {
+  dao_u_r_i: {
+    [k: string]: unknown;
+  };
 } | {
   voting_power_at_height: {
     address: string;
@@ -547,6 +556,7 @@ export interface CwCoreReadOnlyInterface {
     limit?: number;
     startAfter?: string;
   }) => Promise<ListSubDaosResponse>;
+  daoURI: () => Promise<DaoURIResponse>;
   votingPowerAtHeight: ({
     address,
     height
@@ -582,6 +592,7 @@ export class CwCoreQueryClient implements CwCoreReadOnlyInterface {
     this.pauseInfo = this.pauseInfo.bind(this);
     this.votingModule = this.votingModule.bind(this);
     this.listSubDaos = this.listSubDaos.bind(this);
+    this.daoURI = this.daoURI.bind(this);
     this.votingPowerAtHeight = this.votingPowerAtHeight.bind(this);
     this.totalPowerAtHeight = this.totalPowerAtHeight.bind(this);
     this.info = this.info.bind(this);
@@ -726,6 +737,11 @@ export class CwCoreQueryClient implements CwCoreReadOnlyInterface {
       }
     });
   };
+  daoURI = async (): Promise<DaoURIResponse> => {
+    return this.client.queryContractSmart(this.contractAddress, {
+      dao_u_r_i: {}
+    });
+  };
   votingPowerAtHeight = async ({
     address,
     height
diff --git a/types/contracts/cw-named-groups/CwNamedGroupsContract.ts b/typescript/contracts/cw-named-groups/CwNamedGroupsContract.ts
similarity index 100%
rename from types/contracts/cw-named-groups/CwNamedGroupsContract.ts
rename to typescript/contracts/cw-named-groups/CwNamedGroupsContract.ts
diff --git a/types/contracts/cw-names-registry/CwNamesRegistryContract.ts b/typescript/contracts/cw-names-registry/CwNamesRegistryContract.ts
similarity index 100%
rename from types/contracts/cw-names-registry/CwNamesRegistryContract.ts
rename to typescript/contracts/cw-names-registry/CwNamesRegistryContract.ts
diff --git a/types/contracts/cw-native-staked-balance-voting/CwNativeStakedBalanceVotingContract.ts b/typescript/contracts/cw-native-staked-balance-voting/CwNativeStakedBalanceVotingContract.ts
similarity index 100%
rename from types/contracts/cw-native-staked-balance-voting/CwNativeStakedBalanceVotingContract.ts
rename to typescript/contracts/cw-native-staked-balance-voting/CwNativeStakedBalanceVotingContract.ts
diff --git a/types/contracts/cw-proposal-multiple/CwProposalMultipleContract.ts b/typescript/contracts/cw-proposal-multiple/CwProposalMultipleContract.ts
similarity index 100%
rename from types/contracts/cw-proposal-multiple/CwProposalMultipleContract.ts
rename to typescript/contracts/cw-proposal-multiple/CwProposalMultipleContract.ts
diff --git a/types/contracts/cw-proposal-single/CwProposalSingleContract.ts b/typescript/contracts/cw-proposal-single/CwProposalSingleContract.ts
similarity index 100%
rename from types/contracts/cw-proposal-single/CwProposalSingleContract.ts
rename to typescript/contracts/cw-proposal-single/CwProposalSingleContract.ts
diff --git a/types/contracts/cw-token-swap/CwTokenSwapContract.ts b/typescript/contracts/cw-token-swap/CwTokenSwapContract.ts
similarity index 100%
rename from types/contracts/cw-token-swap/CwTokenSwapContract.ts
rename to typescript/contracts/cw-token-swap/CwTokenSwapContract.ts
diff --git a/types/contracts/cw20-stake-external-rewards/Cw20StakeExternalRewardsContract.ts b/typescript/contracts/cw20-stake-external-rewards/Cw20StakeExternalRewardsContract.ts
similarity index 100%
rename from types/contracts/cw20-stake-external-rewards/Cw20StakeExternalRewardsContract.ts
rename to typescript/contracts/cw20-stake-external-rewards/Cw20StakeExternalRewardsContract.ts
diff --git a/types/contracts/cw20-stake-reward-distributor/Cw20StakeRewardDistributorContract.ts b/typescript/contracts/cw20-stake-reward-distributor/Cw20StakeRewardDistributorContract.ts
similarity index 100%
rename from types/contracts/cw20-stake-reward-distributor/Cw20StakeRewardDistributorContract.ts
rename to typescript/contracts/cw20-stake-reward-distributor/Cw20StakeRewardDistributorContract.ts
diff --git a/types/contracts/cw20-stake/Cw20StakeContract.ts b/typescript/contracts/cw20-stake/Cw20StakeContract.ts
similarity index 100%
rename from types/contracts/cw20-stake/Cw20StakeContract.ts
rename to typescript/contracts/cw20-stake/Cw20StakeContract.ts
diff --git a/types/contracts/cw20-staked-balance-voting/Cw20StakedBalanceVotingContract.ts b/typescript/contracts/cw20-staked-balance-voting/Cw20StakedBalanceVotingContract.ts
similarity index 100%
rename from types/contracts/cw20-staked-balance-voting/Cw20StakedBalanceVotingContract.ts
rename to typescript/contracts/cw20-staked-balance-voting/Cw20StakedBalanceVotingContract.ts
diff --git a/types/contracts/cw4-voting/Cw4VotingContract.ts b/typescript/contracts/cw4-voting/Cw4VotingContract.ts
similarity index 100%
rename from types/contracts/cw4-voting/Cw4VotingContract.ts
rename to typescript/contracts/cw4-voting/Cw4VotingContract.ts
diff --git a/types/contracts/cw721-stake/Cw721StakeContract.ts b/typescript/contracts/cw721-stake/Cw721StakeContract.ts
similarity index 100%
rename from types/contracts/cw721-stake/Cw721StakeContract.ts
rename to typescript/contracts/cw721-stake/Cw721StakeContract.ts
diff --git a/types/package.json b/typescript/package.json
similarity index 93%
rename from types/package.json
rename to typescript/package.json
index b0172f9e..7d25090f 100644
--- a/types/package.json
+++ b/typescript/package.json
@@ -1,6 +1,6 @@
 {
-  "name": "@dao-dao/types",
-  "version": "1.0.0",
+  "name": "@dao-dao/contracts",
+  "version": "2.0.0-beta",
   "description": "",
   "main": "build/codegen.js",
   "scripts": {
@@ -35,4 +35,4 @@
     "@cosmjs/tendermint-rpc": "^0.28.4",
     "dotenv": "^10.0.0"
   }
-}
\ No newline at end of file
+}


Test patch:
diff --git a/ci/integration_tests/src/helpers/helper.rs b/ci/integration_tests/src/helpers/helper.rs
index ece3a0a6..0b09a6b2 100644
--- a/ci/integration_tests/src/helpers/helper.rs
+++ b/ci/integration_tests/src/helpers/helper.rs
@@ -25,6 +25,7 @@ pub fn create_dao(
     user_addr: String,
 ) -> Result<DaoState> {
     let msg = cw_core::msg::InstantiateMsg {
+        dao_uri: None,
         admin,
         name: "DAO DAO".to_string(),
         description: "A DAO that makes DAO tooling".to_string(),
diff --git a/ci/integration_tests/src/tests/cw_core_test.rs b/ci/integration_tests/src/tests/cw_core_test.rs
index 0aed4e33..c217c743 100644
--- a/ci/integration_tests/src/tests/cw_core_test.rs
+++ b/ci/integration_tests/src/tests/cw_core_test.rs
@@ -213,6 +213,7 @@ fn instantiate_with_no_admin(chain: &mut Chain) {
     assert_eq!(
         dao.state.config,
         cw_core::state::Config {
+            dao_uri: None,
             name: "DAO DAO".to_string(),
             description: "A DAO that makes DAO tooling".to_string(),
             image_url: None,
@@ -243,6 +244,7 @@ fn instantiate_with_admin(chain: &mut Chain) {
     assert_eq!(
         dao.state.config,
         cw_core::state::Config {
+            dao_uri: None,
             name: "DAO DAO".to_string(),
             description: "A DAO that makes DAO tooling".to_string(),
             image_url: None,
diff --git a/contracts/cw-admin-factory/src/tests.rs b/contracts/cw-admin-factory/src/tests.rs
index ca0e505e..429975a0 100644
--- a/contracts/cw-admin-factory/src/tests.rs
+++ b/contracts/cw-admin-factory/src/tests.rs
@@ -73,6 +73,7 @@ pub fn test_set_admin() {
     // Instantiate core contract using factory.
     let cw_core_code_id = app.store_code(cw_core_contract());
     let instantiate_core = cw_core::msg::InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs.".to_string(),
diff --git a/contracts/cw-core/src/tests.rs b/contracts/cw-core/src/tests.rs
index 09fab970..6c07d5af 100644
--- a/contracts/cw-core/src/tests.rs
+++ b/contracts/cw-core/src/tests.rs
@@ -6,8 +6,10 @@ use cosmwasm_std::{
 use cw2::ContractVersion;
 use cw_core_interface::voting::VotingPowerAtHeightResponse;
 use cw_multi_test::{App, Contract, ContractWrapper, Executor};
-use cw_storage_plus::Map;
+use cw_storage_plus::{Item, Map};
 use cw_utils::{Duration, Expiration};
+use schemars::JsonSchema;
+use serde::{Deserialize, Serialize};
 
 use crate::{
     contract::{derive_proposal_module_prefix, migrate, CONTRACT_NAME, CONTRACT_VERSION},
@@ -98,6 +100,7 @@ fn test_instantiate_with_n_gov_modules(n: usize) {
         marketing: None,
     };
     let instantiate = InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs.".to_string(),
@@ -130,6 +133,7 @@ fn test_instantiate_with_n_gov_modules(n: usize) {
     assert_eq!(
         state.config,
         Config {
+            dao_uri: None,
             name: "DAO DAO".to_string(),
             description: "A DAO that builds DAOs.".to_string(),
             image_url: None,
@@ -207,6 +211,7 @@ makes wickedness."
     });
 
     let instantiate = InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs.".to_string(),
@@ -236,6 +241,7 @@ fn test_update_config() {
     };
 
     let gov_instantiate = InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs.".to_string(),
@@ -287,6 +293,7 @@ fn test_update_config() {
         image_url: Some("https://moonphase.is/image.svg".to_string()),
         automatically_add_cw20s: false,
         automatically_add_cw721s: true,
+        dao_uri: Some("https://daostar.one/EIP".to_string()),
     };
 
     app.execute_contract(
@@ -309,10 +316,16 @@ fn test_update_config() {
 
     let config: Config = app
         .wrap()
-        .query_wasm_smart(gov_addr, &QueryMsg::Config {})
+        .query_wasm_smart(gov_addr.clone(), &QueryMsg::Config {})
         .unwrap();
 
-    assert_eq!(expected_config, config)
+    assert_eq!(expected_config, config);
+
+    let dao_uri: Option<String> = app
+        .wrap()
+        .query_wasm_smart(gov_addr, &QueryMsg::DaoURI {})
+        .unwrap();
+    assert_eq!(dao_uri, expected_config.dao_uri);
 }
 
 fn test_swap_governance(swaps: Vec<(u32, u32)>) {
@@ -325,6 +338,7 @@ fn test_swap_governance(swaps: Vec<(u32, u32)>) {
     };
 
     let gov_instantiate = InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs.".to_string(),
@@ -476,6 +490,7 @@ fn test_removed_modules_can_not_execute() {
     };
 
     let gov_instantiate = InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs.".to_string(),
@@ -618,6 +633,7 @@ fn test_module_already_disabled() {
     };
 
     let gov_instantiate = InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs.".to_string(),
@@ -716,6 +732,7 @@ fn test_swap_voting_module() {
     };
 
     let gov_instantiate = InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs.".to_string(),
@@ -818,6 +835,7 @@ fn test_permissions() {
     };
 
     let gov_instantiate = InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs.".to_string(),
@@ -877,6 +895,7 @@ fn test_permissions() {
         gov_addr,
         ExecuteMsg::UpdateConfig {
             config: Config {
+                dao_uri: None,
                 name: "Evil config.".to_string(),
                 description: "👿".to_string(),
                 image_url: None,
@@ -913,6 +932,7 @@ fn do_standard_instantiate(auto_add: bool, admin: Option<String>) -> (Addr, App)
     };
 
     let gov_instantiate = InstantiateMsg {
+        dao_uri: None,
         admin,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs.".to_string(),
@@ -1510,6 +1530,7 @@ fn test_list_items() {
     };
 
     let gov_instantiate = InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs.".to_string(),
@@ -1626,6 +1647,7 @@ fn test_instantiate_with_items() {
     };
 
     let gov_instantiate = InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs.".to_string(),
@@ -2163,6 +2185,7 @@ fn test_pause() {
         core_addr.clone(),
         &ExecuteMsg::UpdateConfig {
             config: Config {
+                dao_uri: None,
                 name: "The Empire Strikes Back".to_string(),
                 description: "haha lol we have pwned your DAO".to_string(),
                 image_url: None,
@@ -2238,6 +2261,7 @@ fn test_pause() {
             core_addr.clone(),
             &ExecuteMsg::UpdateConfig {
                 config: Config {
+                    dao_uri: None,
                     name: "The Empire Strikes Back Again".to_string(),
                     description: "haha lol we have pwned your DAO again".to_string(),
                     image_url: None,
@@ -2382,6 +2406,9 @@ fn test_dump_state_proposal_modules() {
     assert_eq!(all_state.proposal_modules[0], proposal_module);
 }
 
+// Note that this isn't actually testing that we are migrating from the previous version since
+// with multitest contract instantiation we can't manipulate storage to the previous version of state before invoking migrate. So if anything,
+// this just tests the idempotency of migrate.
 #[test]
 fn test_migrate_from_compatible() {
     let mut app = App::default();
@@ -2410,6 +2437,7 @@ fn test_migrate_from_compatible() {
 
     // Instantiate the core module with an admin to do migrations.
     let gov_instantiate = InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs.".to_string(),
@@ -2465,119 +2493,66 @@ fn test_migrate_from_compatible() {
     assert_eq!(new_state, state);
 }
 
-#[test]
-fn test_migrate_from_beta() {
-    let mut app = App::default();
-    let govmod_id = app.store_code(sudo_proposal_contract());
-    let voting_id = app.store_code(cw20_balances_voting());
-    let gov_id = app.store_code(cw_core_contract());
-    let cw20_id = app.store_code(cw20_contract());
-
-    let govmod_instantiate = cw_proposal_sudo::msg::InstantiateMsg {
-        root: CREATOR_ADDR.to_string(),
-    };
-    let voting_instantiate = cw20_balance_voting::msg::InstantiateMsg {
-        token_info: cw20_balance_voting::msg::TokenInfo::New {
-            code_id: cw20_id,
-            label: "DAO DAO voting".to_string(),
-            name: "DAO DAO".to_string(),
-            symbol: "DAO".to_string(),
-            decimals: 6,
-            initial_balances: vec![cw20::Cw20Coin {
-                address: CREATOR_ADDR.to_string(),
-                amount: Uint128::from(2u64),
-            }],
-            marketing: None,
-        },
-    };
-
-    // Instantiate the core module with an admin to do migrations.
-    let gov_instantiate = InstantiateMsg {
-        admin: None,
-        name: "DAO DAO".to_string(),
-        description: "A DAO that builds DAOs.".to_string(),
-        image_url: None,
-        automatically_add_cw20s: false,
-        automatically_add_cw721s: false,
-        voting_module_instantiate_info: ModuleInstantiateInfo {
-            code_id: voting_id,
-            msg: to_binary(&voting_instantiate).unwrap(),
-            admin: Admin::CoreContract {},
-            label: "voting module".to_string(),
-        },
-        proposal_modules_instantiate_info: vec![
-            ModuleInstantiateInfo {
-                code_id: govmod_id,
-                msg: to_binary(&govmod_instantiate).unwrap(),
-                admin: Admin::CoreContract {},
-                label: "governance module 1".to_string(),
-            },
-            ModuleInstantiateInfo {
-                code_id: govmod_id,
-                msg: to_binary(&govmod_instantiate).unwrap(),
-                admin: Admin::CoreContract {},
-                label: "governance module 2".to_string(),
-            },
-        ],
-        initial_items: None,
-    };
-
-    let core_addr = app
-        .instantiate_contract(
-            gov_id,
-            Addr::unchecked(CREATOR_ADDR),
-            &gov_instantiate,
-            &[],
-            "cw-governance",
-            Some(CREATOR_ADDR.to_string()),
-        )
-        .unwrap();
-
-    app.execute(
-        Addr::unchecked(CREATOR_ADDR),
-        CosmosMsg::Wasm(WasmMsg::Migrate {
-            contract_addr: core_addr.to_string(),
-            new_code_id: gov_id,
-            msg: to_binary(&MigrateMsg::FromV1 {}).unwrap(),
-        }),
-    )
-    .unwrap();
-
-    let new_state: DumpStateResponse = app
-        .wrap()
-        .query_wasm_smart(core_addr, &QueryMsg::DumpState {})
-        .unwrap();
-
-    let proposal_modules = new_state.proposal_modules;
-    assert_eq!(2, proposal_modules.len());
-    for (idx, module) in proposal_modules.iter().enumerate() {
-        let prefix = derive_proposal_module_prefix(idx).unwrap();
-        assert_eq!(prefix, module.prefix);
-        assert_eq!(ProposalModuleStatus::Enabled, module.status);
-    }
-}
-
 #[test]
 fn test_migrate_mock() {
     let mut deps = mock_dependencies();
-    let msg = MigrateMsg::FromV1 {};
+    let dao_uri: String = "/dao/uri".to_string();
+    let msg = MigrateMsg::FromV1 {
+        dao_uri: Some(dao_uri.clone()),
+    };
     let env = mock_env();
 
     // Write to storage in old proposal module format
-    let key = Addr::unchecked("addr");
+    let proposal_modules_key = Addr::unchecked("addr");
     let old_map: Map<Addr, Empty> = Map::new("proposal_modules");
-    let path = old_map.key(key.clone());
+    let path = old_map.key(proposal_modules_key.clone());
     deps.storage.set(&path, &to_binary(&Empty {}).unwrap());
 
-    // Migrate to new data format
+    // Write to storage in old config format
+    #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
+    struct V1Config {
+        pub name: String,
+        pub description: String,
+        pub image_url: Option<String>,
+        pub automatically_add_cw20s: bool,
+        pub automatically_add_cw721s: bool,
+    }
+
+    let v1_config = V1Config {
+        name: "core dao".to_string(),
+        description: "a dao".to_string(),
+        image_url: None,
+        automatically_add_cw20s: false,
+        automatically_add_cw721s: false,
+    };
+
+    let config_item: Item<V1Config> = Item::new("config");
+    config_item.save(&mut deps.storage, &v1_config).unwrap();
+
+    // Migrate to v2
     migrate(deps.as_mut(), env, msg).unwrap();
 
-    let new_path = PROPOSAL_MODULES.key(key);
+    let new_path = PROPOSAL_MODULES.key(proposal_modules_key);
     let prop_module_bytes = deps.storage.get(&new_path).unwrap();
     let module: ProposalModule = from_slice(&prop_module_bytes).unwrap();
     assert_eq!(module.address, Addr::unchecked("addr"));
     assert_eq!(module.prefix, derive_proposal_module_prefix(0).unwrap());
     assert_eq!(module.status, ProposalModuleStatus::Enabled {});
+
+    let v2_config_item: Item<Config> = Item::new("config_v2");
+    let v2_config = v2_config_item.load(&deps.storage).unwrap();
+    assert_eq!(v2_config.dao_uri, Some(dao_uri));
+    assert_eq!(v2_config.name, v1_config.name);
+    assert_eq!(v2_config.description, v1_config.description);
+    assert_eq!(v2_config.image_url, v1_config.image_url);
+    assert_eq!(
+        v2_config.automatically_add_cw20s,
+        v1_config.automatically_add_cw20s
+    );
+    assert_eq!(
+        v2_config.automatically_add_cw721s,
+        v1_config.automatically_add_cw721s
+    )
 }
 
 #[test]
@@ -2623,6 +2598,7 @@ fn test_module_prefixes() {
     };
 
     let gov_instantiate = InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs.".to_string(),
@@ -2849,6 +2825,7 @@ fn test_created_timestamp_set() {
     let timestamp = Timestamp::from_seconds(300_000_000);
     app.update_block(|mut block| block.time = timestamp);
     let instantiate = InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs.".to_string(),
diff --git a/contracts/cw-proposal-multiple/src/tests.rs b/contracts/cw-proposal-multiple/src/tests.rs
index d5b20020..cd2d3be7 100644
--- a/contracts/cw-proposal-multiple/src/tests.rs
+++ b/contracts/cw-proposal-multiple/src/tests.rs
@@ -696,9 +696,9 @@ where
     let mut rng = rand::thread_rng();
     let dist = rand::distributions::Uniform::<u64>::new(1, 200);
     for _ in 0..10 {
-        let zero: Vec<u64> = (0..50).map(|_| rng.sample(&dist)).collect();
-        let one: Vec<u64> = (0..50).map(|_| rng.sample(&dist)).collect();
-        let none: Vec<u64> = (0..50).map(|_| rng.sample(&dist)).collect();
+        let zero: Vec<u64> = (0..50).map(|_| rng.sample(dist)).collect();
+        let one: Vec<u64> = (0..50).map(|_| rng.sample(dist)).collect();
+        let none: Vec<u64> = (0..50).map(|_| rng.sample(dist)).collect();
 
         let zero_sum: u64 = zero.iter().sum();
         let one_sum: u64 = one.iter().sum();
diff --git a/contracts/cw-proposal-single/src/staking_tests.rs b/contracts/cw-proposal-single/src/staking_tests.rs
index 420becdf..08a4ba6a 100644
--- a/contracts/cw-proposal-single/src/staking_tests.rs
+++ b/contracts/cw-proposal-single/src/staking_tests.rs
@@ -69,6 +69,7 @@ fn instantiate_with_staked_balances_voting() {
     let staked_balances_voting_id = app.store_code(staked_balances_voting());
 
     let instantiate_core = cw_core::msg::InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs".to_string(),
@@ -140,6 +141,7 @@ fn instantiate_with_staked_balances_voting() {
     assert_eq!(
         state.config,
         cw_core::state::Config {
+            dao_uri: None,
             name: "DAO DAO".to_string(),
             description: "A DAO that builds DAOs".to_string(),
             image_url: None,
diff --git a/contracts/cw-proposal-single/src/tests.rs b/contracts/cw-proposal-single/src/tests.rs
index 0791e74c..1fd179de 100644
--- a/contracts/cw-proposal-single/src/tests.rs
+++ b/contracts/cw-proposal-single/src/tests.rs
@@ -236,6 +236,7 @@ fn instantiate_with_staked_cw721_governance(
         .unwrap();
 
     let instantiate_core = cw_core::msg::InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs".to_string(),
@@ -347,6 +348,7 @@ fn instantiate_with_native_staked_balances_governance(
     let core_contract_id = app.store_code(cw_gov_contract());
 
     let instantiate_core = cw_core::msg::InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs".to_string(),
@@ -452,6 +454,7 @@ fn instantiate_with_staked_balances_governance(
     let core_contract_id = app.store_code(cw_gov_contract());
 
     let instantiate_core = cw_core::msg::InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs".to_string(),
@@ -561,6 +564,7 @@ fn instantiate_with_staking_active_threshold(
     });
 
     let governance_instantiate = cw_core::msg::InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs".to_string(),
@@ -641,6 +645,7 @@ fn instantiate_with_cw4_groups_governance(
     };
 
     let governance_instantiate = cw_core::msg::InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs".to_string(),
@@ -717,6 +722,7 @@ fn instantiate_with_cw20_balances_governance(
     };
 
     let governance_instantiate = cw_core::msg::InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs".to_string(),
@@ -3800,6 +3806,9 @@ fn test_large_absolute_count_threshold() {
     );
 }
 
+// Note that this isn't actually testing that we are migrating from the previous version since
+// with multitest contract instantiation we can't manipulate storage to the previous version of state before invoking migrate. So if anything,
+// this just tests the idempotency of migrate.
 #[test]
 fn test_migrate_from_compatible() {
     let mut app = App::default();
diff --git a/debug/proposal-hooks-counter/src/tests.rs b/debug/proposal-hooks-counter/src/tests.rs
index f316b059..8d43e13a 100644
--- a/debug/proposal-hooks-counter/src/tests.rs
+++ b/debug/proposal-hooks-counter/src/tests.rs
@@ -92,6 +92,7 @@ fn instantiate_with_default_governance(
     });
 
     let governance_instantiate = cw_core::msg::InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs".to_string(),
diff --git a/packages/testing/src/helpers.rs b/packages/testing/src/helpers.rs
index 1a639441..1af875bc 100644
--- a/packages/testing/src/helpers.rs
+++ b/packages/testing/src/helpers.rs
@@ -41,6 +41,7 @@ pub fn instantiate_with_cw20_balances_governance(
     };
 
     let governance_instantiate = cw_core::msg::InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs".to_string(),
@@ -119,6 +120,7 @@ pub fn instantiate_with_staked_balances_governance(
     let core_contract_id = app.store_code(cw_gov_contract());
 
     let instantiate_core = cw_core::msg::InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs".to_string(),
@@ -228,6 +230,7 @@ pub fn instantiate_with_staking_active_threshold(
     });
 
     let governance_instantiate = cw_core::msg::InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs".to_string(),
@@ -308,6 +311,7 @@ pub fn instantiate_with_cw4_groups_governance(
     };
 
     let governance_instantiate = cw_core::msg::InstantiateMsg {
+        dao_uri: None,
         admin: None,
         name: "DAO DAO".to_string(),
         description: "A DAO that builds DAOs".to_string(),
diff --git a/packages/testing/src/tests.rs b/packages/testing/src/tests.rs
index f2d6d96c..bd6c58f9 100644
--- a/packages/testing/src/tests.rs
+++ b/packages/testing/src/tests.rs
@@ -550,8 +550,8 @@ where
     let mut rng = rand::thread_rng();
     let dist = rand::distributions::Uniform::<u64>::new(1, 200);
     for _ in 0..10 {
-        let yes: Vec<u64> = (0..50).map(|_| rng.sample(&dist)).collect();
-        let no: Vec<u64> = (0..50).map(|_| rng.sample(&dist)).collect();
+        let yes: Vec<u64> = (0..50).map(|_| rng.sample(dist)).collect();
+        let no: Vec<u64> = (0..50).map(|_| rng.sample(dist)).collect();
 
         let yes_sum: u64 = yes.iter().sum();
         let no_sum: u64 = no.iter().sum();