diff --git a/.pnp.js b/.pnp.js index c013dda2..0f252b41 100755 --- a/.pnp.js +++ b/.pnp.js @@ -30,14 +30,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "name": "@cosmjs/cli", "reference": "workspace:packages/cli" }, - { - "name": "@cosmjs/cosmwasm", - "reference": "workspace:packages/cosmwasm" - }, - { - "name": "@cosmjs/cosmwasm-launchpad", - "reference": "workspace:packages/cosmwasm-launchpad" - }, { "name": "@cosmjs/cosmwasm-stargate", "reference": "workspace:packages/cosmwasm-stargate" @@ -104,8 +96,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "fallbackExclusionList": [ ["@cosmjs/amino", ["workspace:packages/amino"]], ["@cosmjs/cli", ["workspace:packages/cli"]], - ["@cosmjs/cosmwasm", ["workspace:packages/cosmwasm"]], - ["@cosmjs/cosmwasm-launchpad", ["workspace:packages/cosmwasm-launchpad"]], ["@cosmjs/cosmwasm-stargate", ["workspace:packages/cosmwasm-stargate"]], ["@cosmjs/crypto", ["workspace:packages/crypto"]], ["@cosmjs/encoding", ["workspace:packages/encoding"]], @@ -236,14 +226,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "@cosmjs/cli", "workspace:packages/cli" ], - [ - "@cosmjs/cosmwasm", - "workspace:packages/cosmwasm" - ], - [ - "@cosmjs/cosmwasm-launchpad", - "workspace:packages/cosmwasm-launchpad" - ], [ "@cosmjs/cosmwasm-stargate", "workspace:packages/cosmwasm-stargate" @@ -2873,7 +2855,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./", "packageDependencies": [ ["@cosmjs/amino", "workspace:packages/amino"], - ["@cosmjs/cosmwasm-launchpad", "workspace:packages/cosmwasm-launchpad"], ["@cosmjs/cosmwasm-stargate", "workspace:packages/cosmwasm-stargate"], ["@cosmjs/crypto", "workspace:packages/crypto"], ["@cosmjs/encoding", "workspace:packages/encoding"], @@ -3273,7 +3254,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [ ["@cosmjs/cli", "workspace:packages/cli"], ["@cosmjs/amino", "workspace:packages/amino"], - ["@cosmjs/cosmwasm-launchpad", "workspace:packages/cosmwasm-launchpad"], ["@cosmjs/cosmwasm-stargate", "workspace:packages/cosmwasm-stargate"], ["@cosmjs/crypto", "workspace:packages/crypto"], ["@cosmjs/encoding", "workspace:packages/encoding"], @@ -3318,80 +3298,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "SOFT", }] ]], - ["@cosmjs/cosmwasm", [ - ["workspace:packages/cosmwasm", { - "packageLocation": "./packages/cosmwasm/", - "packageDependencies": [ - ["@cosmjs/cosmwasm", "workspace:packages/cosmwasm"], - ["@cosmjs/cosmwasm-launchpad", "workspace:packages/cosmwasm-launchpad"], - ["@types/eslint-plugin-prettier", "npm:3.1.0"], - ["@typescript-eslint/eslint-plugin", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:4.28.4"], - ["@typescript-eslint/parser", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:4.28.4"], - ["eslint", "npm:7.26.0"], - ["eslint-config-prettier", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:8.3.0"], - ["eslint-import-resolver-node", "npm:0.3.4"], - ["eslint-plugin-import", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:2.23.2"], - ["eslint-plugin-prettier", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:3.4.0"], - ["eslint-plugin-simple-import-sort", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:7.0.0"], - ["prettier", "npm:2.3.2"], - ["typedoc", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:0.21.4"], - ["typescript", "patch:typescript@npm%3A4.3.5#builtin::version=4.3.5&hash=ddfc1b"] - ], - "linkType": "SOFT", - }] - ]], - ["@cosmjs/cosmwasm-launchpad", [ - ["workspace:packages/cosmwasm-launchpad", { - "packageLocation": "./packages/cosmwasm-launchpad/", - "packageDependencies": [ - ["@cosmjs/cosmwasm-launchpad", "workspace:packages/cosmwasm-launchpad"], - ["@cosmjs/crypto", "workspace:packages/crypto"], - ["@cosmjs/encoding", "workspace:packages/encoding"], - ["@cosmjs/launchpad", "workspace:packages/launchpad"], - ["@cosmjs/math", "workspace:packages/math"], - ["@cosmjs/utils", "workspace:packages/utils"], - ["@istanbuljs/nyc-config-typescript", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:1.0.1"], - ["@types/eslint-plugin-prettier", "npm:3.1.0"], - ["@types/jasmine", "npm:3.7.4"], - ["@types/karma-firefox-launcher", "npm:2.1.0"], - ["@types/karma-jasmine", "npm:4.0.0"], - ["@types/karma-jasmine-html-reporter", "npm:1.5.1"], - ["@types/node", "npm:15.3.1"], - ["@types/pako", "npm:1.0.1"], - ["@typescript-eslint/eslint-plugin", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:4.28.4"], - ["@typescript-eslint/parser", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:4.28.4"], - ["eslint", "npm:7.26.0"], - ["eslint-config-prettier", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:8.3.0"], - ["eslint-import-resolver-node", "npm:0.3.4"], - ["eslint-plugin-import", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:2.23.2"], - ["eslint-plugin-prettier", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:3.4.0"], - ["eslint-plugin-simple-import-sort", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:7.0.0"], - ["esm", "npm:3.2.25"], - ["glob", "npm:7.1.7"], - ["jasmine", "npm:3.7.0"], - ["jasmine-core", "npm:3.7.1"], - ["jasmine-spec-reporter", "npm:6.0.0"], - ["karma", "npm:6.3.2"], - ["karma-chrome-launcher", "npm:3.1.0"], - ["karma-firefox-launcher", "npm:2.1.0"], - ["karma-jasmine", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:4.0.1"], - ["karma-jasmine-html-reporter", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:1.6.0"], - ["nyc", "npm:15.1.0"], - ["pako", "npm:2.0.3"], - ["prettier", "npm:2.3.2"], - ["readonly-date", "npm:1.0.0"], - ["ses", "npm:0.11.1"], - ["source-map-support", "npm:0.5.19"], - ["stream-browserify", "npm:3.0.0"], - ["ts-node", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:8.10.2"], - ["typedoc", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:0.21.4"], - ["typescript", "patch:typescript@npm%3A4.3.5#builtin::version=4.3.5&hash=ddfc1b"], - ["webpack", "virtual:395f1354ea29de80eb111225ff7f72912127acf779ae2110ad0ceee26819d65678b5f21be5a4c99566f19c05b63bb8c464db1c3c0ca922c2f45f91ad734637ee#npm:5.37.1"], - ["webpack-cli", "virtual:395f1354ea29de80eb111225ff7f72912127acf779ae2110ad0ceee26819d65678b5f21be5a4c99566f19c05b63bb8c464db1c3c0ca922c2f45f91ad734637ee#npm:4.7.0"] - ], - "linkType": "SOFT", - }] - ]], ["@cosmjs/cosmwasm-stargate", [ ["workspace:packages/cosmwasm-stargate", { "packageLocation": "./packages/cosmwasm-stargate/", @@ -5477,23 +5383,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ], "linkType": "HARD", }], - ["virtual:84adca422dcfddfebe74232825b4d9a5ef615fdab14f3f17f1a545c4531bd06dc6868a9c1d1e3abce6a67873f8d3e04c605bfaaf12cc7fa1a0495f9f023c0ec3#npm:1.0.3", { - "packageLocation": "./.yarn/$$virtual/@webpack-cli-configtest-virtual-d4999b5de1/0/cache/@webpack-cli-configtest-npm-1.0.3-b6e357f778-df71875431.zip/node_modules/@webpack-cli/configtest/", - "packageDependencies": [ - ["@webpack-cli/configtest", "virtual:84adca422dcfddfebe74232825b4d9a5ef615fdab14f3f17f1a545c4531bd06dc6868a9c1d1e3abce6a67873f8d3e04c605bfaaf12cc7fa1a0495f9f023c0ec3#npm:1.0.3"], - ["@types/webpack", null], - ["@types/webpack-cli", null], - ["webpack", "virtual:395f1354ea29de80eb111225ff7f72912127acf779ae2110ad0ceee26819d65678b5f21be5a4c99566f19c05b63bb8c464db1c3c0ca922c2f45f91ad734637ee#npm:5.37.1"], - ["webpack-cli", "virtual:395f1354ea29de80eb111225ff7f72912127acf779ae2110ad0ceee26819d65678b5f21be5a4c99566f19c05b63bb8c464db1c3c0ca922c2f45f91ad734637ee#npm:4.7.0"] - ], - "packagePeers": [ - "@types/webpack-cli", - "@types/webpack", - "webpack-cli", - "webpack" - ], - "linkType": "HARD", - }], ["virtual:87e4e29d0a073486e83efd3fb6ccb7905fedbae979a2f77544c4e7ebf5a6bf9cb2ec8ed5b3be875e151cdf6e30b7c3d3d2c148a069709cbac3edecc2314b098d#npm:1.0.3", { "packageLocation": "./.yarn/$$virtual/@webpack-cli-configtest-virtual-c83273e6dc/0/cache/@webpack-cli-configtest-npm-1.0.3-b6e357f778-df71875431.zip/node_modules/@webpack-cli/configtest/", "packageDependencies": [ @@ -5737,20 +5626,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ], "linkType": "HARD", }], - ["virtual:84adca422dcfddfebe74232825b4d9a5ef615fdab14f3f17f1a545c4531bd06dc6868a9c1d1e3abce6a67873f8d3e04c605bfaaf12cc7fa1a0495f9f023c0ec3#npm:1.2.4", { - "packageLocation": "./.yarn/$$virtual/@webpack-cli-info-virtual-b4f729ae1e/0/cache/@webpack-cli-info-npm-1.2.4-e4a2135f37-7a1b167669.zip/node_modules/@webpack-cli/info/", - "packageDependencies": [ - ["@webpack-cli/info", "virtual:84adca422dcfddfebe74232825b4d9a5ef615fdab14f3f17f1a545c4531bd06dc6868a9c1d1e3abce6a67873f8d3e04c605bfaaf12cc7fa1a0495f9f023c0ec3#npm:1.2.4"], - ["@types/webpack-cli", null], - ["envinfo", "npm:7.8.1"], - ["webpack-cli", "virtual:395f1354ea29de80eb111225ff7f72912127acf779ae2110ad0ceee26819d65678b5f21be5a4c99566f19c05b63bb8c464db1c3c0ca922c2f45f91ad734637ee#npm:4.7.0"] - ], - "packagePeers": [ - "@types/webpack-cli", - "webpack-cli" - ], - "linkType": "HARD", - }], ["virtual:87e4e29d0a073486e83efd3fb6ccb7905fedbae979a2f77544c4e7ebf5a6bf9cb2ec8ed5b3be875e151cdf6e30b7c3d3d2c148a069709cbac3edecc2314b098d#npm:1.2.4", { "packageLocation": "./.yarn/$$virtual/@webpack-cli-info-virtual-fe46807215/0/cache/@webpack-cli-info-npm-1.2.4-e4a2135f37-7a1b167669.zip/node_modules/@webpack-cli/info/", "packageDependencies": [ @@ -5977,21 +5852,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ], "linkType": "HARD", }], - ["virtual:84adca422dcfddfebe74232825b4d9a5ef615fdab14f3f17f1a545c4531bd06dc6868a9c1d1e3abce6a67873f8d3e04c605bfaaf12cc7fa1a0495f9f023c0ec3#npm:1.4.0", { - "packageLocation": "./.yarn/$$virtual/@webpack-cli-serve-virtual-de2ba025af/0/cache/@webpack-cli-serve-npm-1.4.0-1f566be693-0a2495e2f1.zip/node_modules/@webpack-cli/serve/", - "packageDependencies": [ - ["@webpack-cli/serve", "virtual:84adca422dcfddfebe74232825b4d9a5ef615fdab14f3f17f1a545c4531bd06dc6868a9c1d1e3abce6a67873f8d3e04c605bfaaf12cc7fa1a0495f9f023c0ec3#npm:1.4.0"], - ["@types/webpack-cli", null], - ["webpack-cli", "virtual:395f1354ea29de80eb111225ff7f72912127acf779ae2110ad0ceee26819d65678b5f21be5a4c99566f19c05b63bb8c464db1c3c0ca922c2f45f91ad734637ee#npm:4.7.0"], - ["webpack-dev-server", null] - ], - "packagePeers": [ - "@types/webpack-cli", - "webpack-cli", - "webpack-dev-server" - ], - "linkType": "HARD", - }], ["virtual:87e4e29d0a073486e83efd3fb6ccb7905fedbae979a2f77544c4e7ebf5a6bf9cb2ec8ed5b3be875e151cdf6e30b7c3d3d2c148a069709cbac3edecc2314b098d#npm:1.4.0", { "packageLocation": "./.yarn/$$virtual/@webpack-cli-serve-virtual-960c087e04/0/cache/@webpack-cli-serve-npm-1.4.0-1f566be693-0a2495e2f1.zip/node_modules/@webpack-cli/serve/", "packageDependencies": [ @@ -7116,7 +6976,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [ ["cosmjs-monorepo-root", "workspace:."], ["@cosmjs/amino", "workspace:packages/amino"], - ["@cosmjs/cosmwasm-launchpad", "workspace:packages/cosmwasm-launchpad"], ["@cosmjs/cosmwasm-stargate", "workspace:packages/cosmwasm-stargate"], ["@cosmjs/crypto", "workspace:packages/crypto"], ["@cosmjs/encoding", "workspace:packages/encoding"], @@ -12014,25 +11873,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ], "linkType": "HARD", }], - ["virtual:139b584ca8199b231f3129ecc7e443fe9bbe8e7998f9ebec0596357d086f652fd437a0a38af20036f53bd7e9193cf4614624133c9c35ef007cf2ce7c818c0ad6#npm:5.1.2", { - "packageLocation": "./.yarn/$$virtual/terser-webpack-plugin-virtual-c7f41a226c/0/cache/terser-webpack-plugin-npm-5.1.2-59f409825a-f65229fc60.zip/node_modules/terser-webpack-plugin/", - "packageDependencies": [ - ["terser-webpack-plugin", "virtual:139b584ca8199b231f3129ecc7e443fe9bbe8e7998f9ebec0596357d086f652fd437a0a38af20036f53bd7e9193cf4614624133c9c35ef007cf2ce7c818c0ad6#npm:5.1.2"], - ["@types/webpack", null], - ["jest-worker", "npm:26.6.2"], - ["p-limit", "npm:3.1.0"], - ["schema-utils", "npm:3.0.0"], - ["serialize-javascript", "npm:5.0.1"], - ["source-map", "npm:0.6.1"], - ["terser", "npm:5.7.0"], - ["webpack", "virtual:395f1354ea29de80eb111225ff7f72912127acf779ae2110ad0ceee26819d65678b5f21be5a4c99566f19c05b63bb8c464db1c3c0ca922c2f45f91ad734637ee#npm:5.37.1"] - ], - "packagePeers": [ - "@types/webpack", - "webpack" - ], - "linkType": "HARD", - }], ["virtual:2c148355187bb60dc28d99d6e8c71135442f7f75eee654fdcef714a856c04749d4bcd6c6f9a8235fa3df92a4b10c63458ab01bcf229754141703842a78ec781f#npm:5.1.2", { "packageLocation": "./.yarn/$$virtual/terser-webpack-plugin-virtual-bcb1a7a129/0/cache/terser-webpack-plugin-npm-5.1.2-59f409825a-f65229fc60.zip/node_modules/terser-webpack-plugin/", "packageDependencies": [ @@ -12834,40 +12674,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ], "linkType": "HARD", }], - ["virtual:395f1354ea29de80eb111225ff7f72912127acf779ae2110ad0ceee26819d65678b5f21be5a4c99566f19c05b63bb8c464db1c3c0ca922c2f45f91ad734637ee#npm:5.37.1", { - "packageLocation": "./.yarn/$$virtual/webpack-virtual-139b584ca8/0/cache/webpack-npm-5.37.1-1e75a59f6f-5fe030ea3f.zip/node_modules/webpack/", - "packageDependencies": [ - ["webpack", "virtual:395f1354ea29de80eb111225ff7f72912127acf779ae2110ad0ceee26819d65678b5f21be5a4c99566f19c05b63bb8c464db1c3c0ca922c2f45f91ad734637ee#npm:5.37.1"], - ["@types/eslint-scope", "npm:3.7.0"], - ["@types/estree", "npm:0.0.47"], - ["@webassemblyjs/ast", "npm:1.11.0"], - ["@webassemblyjs/wasm-edit", "npm:1.11.0"], - ["@webassemblyjs/wasm-parser", "npm:1.11.0"], - ["acorn", "npm:8.2.4"], - ["browserslist", "npm:4.16.6"], - ["chrome-trace-event", "npm:1.0.3"], - ["enhanced-resolve", "npm:5.8.2"], - ["es-module-lexer", "npm:0.4.1"], - ["eslint-scope", "npm:5.1.1"], - ["events", "npm:3.3.0"], - ["glob-to-regexp", "npm:0.4.1"], - ["graceful-fs", "npm:4.2.6"], - ["json-parse-better-errors", "npm:1.0.2"], - ["loader-runner", "npm:4.2.0"], - ["mime-types", "npm:2.1.30"], - ["neo-async", "npm:2.6.2"], - ["schema-utils", "npm:3.0.0"], - ["tapable", "npm:2.2.0"], - ["terser-webpack-plugin", "virtual:139b584ca8199b231f3129ecc7e443fe9bbe8e7998f9ebec0596357d086f652fd437a0a38af20036f53bd7e9193cf4614624133c9c35ef007cf2ce7c818c0ad6#npm:5.1.2"], - ["watchpack", "npm:2.2.0"], - ["webpack-cli", "virtual:395f1354ea29de80eb111225ff7f72912127acf779ae2110ad0ceee26819d65678b5f21be5a4c99566f19c05b63bb8c464db1c3c0ca922c2f45f91ad734637ee#npm:4.7.0"], - ["webpack-sources", "npm:2.2.0"] - ], - "packagePeers": [ - "webpack-cli" - ], - "linkType": "HARD", - }], ["virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:5.37.1", { "packageLocation": "./.yarn/$$virtual/webpack-virtual-830f2cc1c2/0/cache/webpack-npm-5.37.1-1e75a59f6f-5fe030ea3f.zip/node_modules/webpack/", "packageDependencies": [ @@ -13387,40 +13193,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ], "linkType": "HARD", }], - ["virtual:395f1354ea29de80eb111225ff7f72912127acf779ae2110ad0ceee26819d65678b5f21be5a4c99566f19c05b63bb8c464db1c3c0ca922c2f45f91ad734637ee#npm:4.7.0", { - "packageLocation": "./.yarn/$$virtual/webpack-cli-virtual-84adca422d/0/cache/webpack-cli-npm-4.7.0-cb3d7c34ff-6b935cda02.zip/node_modules/webpack-cli/", - "packageDependencies": [ - ["webpack-cli", "virtual:395f1354ea29de80eb111225ff7f72912127acf779ae2110ad0ceee26819d65678b5f21be5a4c99566f19c05b63bb8c464db1c3c0ca922c2f45f91ad734637ee#npm:4.7.0"], - ["@discoveryjs/json-ext", "npm:0.5.3"], - ["@types/webpack", null], - ["@webpack-cli/configtest", "virtual:84adca422dcfddfebe74232825b4d9a5ef615fdab14f3f17f1a545c4531bd06dc6868a9c1d1e3abce6a67873f8d3e04c605bfaaf12cc7fa1a0495f9f023c0ec3#npm:1.0.3"], - ["@webpack-cli/generators", null], - ["@webpack-cli/info", "virtual:84adca422dcfddfebe74232825b4d9a5ef615fdab14f3f17f1a545c4531bd06dc6868a9c1d1e3abce6a67873f8d3e04c605bfaaf12cc7fa1a0495f9f023c0ec3#npm:1.2.4"], - ["@webpack-cli/migrate", null], - ["@webpack-cli/serve", "virtual:84adca422dcfddfebe74232825b4d9a5ef615fdab14f3f17f1a545c4531bd06dc6868a9c1d1e3abce6a67873f8d3e04c605bfaaf12cc7fa1a0495f9f023c0ec3#npm:1.4.0"], - ["colorette", "npm:1.2.2"], - ["commander", "npm:7.2.0"], - ["execa", "npm:5.0.0"], - ["fastest-levenshtein", "npm:1.0.12"], - ["import-local", "npm:3.0.2"], - ["interpret", "npm:2.2.0"], - ["rechoir", "npm:0.7.0"], - ["v8-compile-cache", "npm:2.3.0"], - ["webpack", "virtual:395f1354ea29de80eb111225ff7f72912127acf779ae2110ad0ceee26819d65678b5f21be5a4c99566f19c05b63bb8c464db1c3c0ca922c2f45f91ad734637ee#npm:5.37.1"], - ["webpack-bundle-analyzer", null], - ["webpack-dev-server", null], - ["webpack-merge", "npm:5.7.3"] - ], - "packagePeers": [ - "@types/webpack", - "@webpack-cli/generators", - "@webpack-cli/migrate", - "webpack-bundle-analyzer", - "webpack-dev-server", - "webpack" - ], - "linkType": "HARD", - }], ["virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:4.7.0", { "packageLocation": "./.yarn/$$virtual/webpack-cli-virtual-0dffb89908/0/cache/webpack-cli-npm-4.7.0-cb3d7c34ff-6b935cda02.zip/node_modules/webpack-cli/", "packageDependencies": [ diff --git a/CHANGELOG.md b/CHANGELOG.md index bfcad33c..edcf7716 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,10 @@ and this project adheres to `defaultGasPrice` and `buildFeeTable`. - @cosmjs/tendermint-rpc: `Client` has been removed. Please use `Tendermint33Client` or `Tendermint34Client`, depending on your needs. +- @cosmjs/cosmwasm: Package removed ([#786]). +- @cosmjs/cosmwasm-launchpad: Package removed ([#786]). + +[#786]: https://github.com/cosmos/cosmjs/issues/786 ### Fixed diff --git a/HACKING.md b/HACKING.md index 053d8ee2..ff819a8b 100644 --- a/HACKING.md +++ b/HACKING.md @@ -91,14 +91,14 @@ In the `scripts/` folder, a bunch of blockchains and other backend systems are started for testing purposes. Some ports need to be changed from the default in order to avoid conflicts. Here is an overview of the ports used: -| Port | Application | Usage | -| ----- | --------------------- | ------------------------------------------------------ | -| 1317 | wasmd LCD API | @cosmjs/launchpad and @cosmjs/cosmwasm-launchpad tests | -| 1318 | simapp LCD API | Manual Stargate debugging | -| 1319 | wasmd LCD API | Manual Stargate debugging | -| 4444 | socketserver | @cosmjs/sockets tests | -| 4445 | socketserver slow | @cosmjs/sockets tests | -| 11133 | Tendermint 0.33 RPC | @cosmjs/tendermint-rpc tests | -| 11134 | Tendermint 0.34 RPC | @cosmjs/tendermint-rpc tests | -| 26658 | simapp Tendermint RPC | Stargate client tests | -| 26659 | wasmd Tendermint RPC | @cosmjs/cosmwasm-stargate tests | +| Port | Application | Usage | +| ----- | --------------------- | ------------------------------- | +| 1317 | wasmd LCD API | @cosmjs/launchpad tests | +| 1318 | simapp LCD API | Manual Stargate debugging | +| 1319 | wasmd LCD API | Manual Stargate debugging | +| 4444 | socketserver | @cosmjs/sockets tests | +| 4445 | socketserver slow | @cosmjs/sockets tests | +| 11133 | Tendermint 0.33 RPC | @cosmjs/tendermint-rpc tests | +| 11134 | Tendermint 0.34 RPC | @cosmjs/tendermint-rpc tests | +| 26658 | simapp Tendermint RPC | Stargate client tests | +| 26659 | wasmd Tendermint RPC | @cosmjs/cosmwasm-stargate tests | diff --git a/README.md b/README.md index 51356e3e..350ca6b9 100644 --- a/README.md +++ b/README.md @@ -44,14 +44,14 @@ CosmJS is a library that consists of many smaller npm packages within the [@cosmjs namespace](https://www.npmjs.com/org/cosmjs), a so called monorepo. Here are some of them to get an idea: -| Package | Description | Latest | -| ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | -| [@cosmjs/launchpad](packages/launchpad) | A client library for the Cosmos SDK 0.37 (cosmoshub-3), 0.38 and 0.39 (Launchpad) | [![npm version](https://img.shields.io/npm/v/@cosmjs/launchpad.svg)](https://www.npmjs.com/package/@cosmjs/launchpad) | -| [@cosmjs/faucet](packages/faucet) | A faucet application for node.js | [![npm version](https://img.shields.io/npm/v/@cosmjs/faucet.svg)](https://www.npmjs.com/package/@cosmjs/faucet) | -| [@cosmjs/cosmwasm-launchpad](packages/cosmwasm) | Client for chains with the CosmWasm module enabled | [![npm version](https://img.shields.io/npm/v/@cosmjs/cosmwasm-launchpad.svg)](https://www.npmjs.com/package/@cosmjs/cosmwasm-launchpad) | -| [@cosmjs/crypto](packages/crypto) | Cryptography for blockchain projects, e.g. hashing (SHA-2, Keccak256, Ripemd160), signing (secp256k1, ed25519), HD key derivation (BIPO39, SLIP-0010), KDFs and symmetric encryption for key storage (PBKDF2, Argon2, XChaCha20Poly1305) | [![npm version](https://img.shields.io/npm/v/@cosmjs/crypto.svg)](https://www.npmjs.com/package/@cosmjs/crypto) | -| [@cosmjs/encoding](packages/encoding) | Encoding helpers for blockchain projects | [![npm version](https://img.shields.io/npm/v/@cosmjs/encoding.svg)](https://www.npmjs.com/package/@cosmjs/encoding) | -| [@cosmjs/math](packages/math) | Safe integers; decimals for handling financial amounts | [![npm version](https://img.shields.io/npm/v/@cosmjs/math.svg)](https://www.npmjs.com/package/@cosmjs/math) | +| Package | Description | Latest | +| ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| [@cosmjs/launchpad](packages/launchpad) | A client library for the Cosmos SDK 0.37 (cosmoshub-3), 0.38 and 0.39 (Launchpad) | [![npm version](https://img.shields.io/npm/v/@cosmjs/launchpad.svg)](https://www.npmjs.com/package/@cosmjs/launchpad) | +| [@cosmjs/faucet](packages/faucet) | A faucet application for node.js | [![npm version](https://img.shields.io/npm/v/@cosmjs/faucet.svg)](https://www.npmjs.com/package/@cosmjs/faucet) | +| [@cosmjs/cosmwasm-stargate](packages/cosmwasm-stargate) | Client for Stargate chains with the CosmWasm module enabled | [![npm version](https://img.shields.io/npm/v/@cosmjs/cosmwasm-stargate.svg)](https://www.npmjs.com/package/@cosmjs/cosmwasm-stargate) | +| [@cosmjs/crypto](packages/crypto) | Cryptography for blockchain projects, e.g. hashing (SHA-2, Keccak256, Ripemd160), signing (secp256k1, ed25519), HD key derivation (BIPO39, SLIP-0010), KDFs and symmetric encryption for key storage (PBKDF2, Argon2, XChaCha20Poly1305) | [![npm version](https://img.shields.io/npm/v/@cosmjs/crypto.svg)](https://www.npmjs.com/package/@cosmjs/crypto) | +| [@cosmjs/encoding](packages/encoding) | Encoding helpers for blockchain projects | [![npm version](https://img.shields.io/npm/v/@cosmjs/encoding.svg)](https://www.npmjs.com/package/@cosmjs/encoding) | +| [@cosmjs/math](packages/math) | Safe integers; decimals for handling financial amounts | [![npm version](https://img.shields.io/npm/v/@cosmjs/math.svg)](https://www.npmjs.com/package/@cosmjs/math) | ### Modularity diff --git a/package.json b/package.json index 25f129a9..896eaab7 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,6 @@ }, "devDependencies": { "@cosmjs/amino": "workspace:packages/amino", - "@cosmjs/cosmwasm-launchpad": "workspace:packages/cosmwasm-launchpad", "@cosmjs/cosmwasm-stargate": "workspace:packages/cosmwasm-stargate", "@cosmjs/crypto": "workspace:packages/crypto", "@cosmjs/encoding": "workspace:packages/encoding", diff --git a/packages/cli/package.json b/packages/cli/package.json index 31a1e6b9..70cbf436 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -40,7 +40,6 @@ ], "dependencies": { "@cosmjs/amino": "workspace:packages/amino", - "@cosmjs/cosmwasm-launchpad": "workspace:packages/cosmwasm-launchpad", "@cosmjs/cosmwasm-stargate": "workspace:packages/cosmwasm-stargate", "@cosmjs/crypto": "workspace:packages/crypto", "@cosmjs/encoding": "workspace:packages/encoding", diff --git a/packages/cosmwasm-launchpad/.eslintignore b/packages/cosmwasm-launchpad/.eslintignore deleted file mode 120000 index 86039baf..00000000 --- a/packages/cosmwasm-launchpad/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -../../.eslintignore \ No newline at end of file diff --git a/packages/cosmwasm-launchpad/.eslintrc.js b/packages/cosmwasm-launchpad/.eslintrc.js deleted file mode 100644 index d00c0967..00000000 --- a/packages/cosmwasm-launchpad/.eslintrc.js +++ /dev/null @@ -1,92 +0,0 @@ -module.exports = { - env: { - es6: true, - jasmine: true, - node: true, - worker: true, - }, - parser: "@typescript-eslint/parser", - parserOptions: { - ecmaVersion: 2018, - project: "./tsconfig.eslint.json", - tsconfigRootDir: __dirname, - }, - plugins: ["@typescript-eslint", "prettier", "simple-import-sort", "import"], - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier", - "plugin:prettier/recommended", - "plugin:import/typescript", - ], - rules: { - curly: ["warn", "multi-line", "consistent"], - "no-bitwise": "warn", - "no-console": ["warn", { allow: ["error", "info", "table", "warn"] }], - "no-param-reassign": "warn", - "no-shadow": "off", // disabled in favour of @typescript-eslint/no-shadow, see https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-shadow.md - "no-unused-vars": "off", // disabled in favour of @typescript-eslint/no-unused-vars, see https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-unused-vars.md - "prefer-const": "warn", - radix: ["warn", "always"], - "spaced-comment": ["warn", "always", { line: { markers: ["/ src/testdata/contract.json -``` - -## License - -This package is part of the cosmjs repository, licensed under the Apache License -2.0 (see [NOTICE](https://github.com/cosmos/cosmjs/blob/main/NOTICE) and -[LICENSE](https://github.com/cosmos/cosmjs/blob/main/LICENSE)). diff --git a/packages/cosmwasm-launchpad/jasmine-testrunner.js b/packages/cosmwasm-launchpad/jasmine-testrunner.js deleted file mode 100644 index afefb63a..00000000 --- a/packages/cosmwasm-launchpad/jasmine-testrunner.js +++ /dev/null @@ -1,38 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ - -if (process.env.SES_ENABLED) { - require("ses/lockdown"); - // eslint-disable-next-line no-undef - lockdown(); -} - -require("source-map-support").install(); -const defaultSpecReporterConfig = require("../../jasmine-spec-reporter.config.json"); - -// setup Jasmine -const Jasmine = require("jasmine"); -const jasmine = new Jasmine(); -jasmine.loadConfig({ - spec_dir: "build", - spec_files: ["**/*.spec.js"], - helpers: [], - random: false, - seed: null, - stopSpecOnExpectationFailure: false, -}); -jasmine.jasmine.DEFAULT_TIMEOUT_INTERVAL = 15 * 1000; - -// setup reporter -const { SpecReporter } = require("jasmine-spec-reporter"); -const reporter = new SpecReporter({ - ...defaultSpecReporterConfig, - spec: { - ...defaultSpecReporterConfig.spec, - displaySuccessful: !process.argv.includes("--quiet"), - }, -}); - -// initialize and execute -jasmine.env.clearReporters(); -jasmine.addReporter(reporter); -void jasmine.execute(); diff --git a/packages/cosmwasm-launchpad/karma.conf.js b/packages/cosmwasm-launchpad/karma.conf.js deleted file mode 100644 index 31c44e8e..00000000 --- a/packages/cosmwasm-launchpad/karma.conf.js +++ /dev/null @@ -1,54 +0,0 @@ -const chrome = require("karma-chrome-launcher"); -const firefox = require("karma-firefox-launcher"); -const jasmine = require("karma-jasmine"); -const kjhtml = require("karma-jasmine-html-reporter"); - -module.exports = function (config) { - config.set({ - // base path that will be used to resolve all patterns (eg. files, exclude) - basePath: ".", - // registers plugins but does not activate them - plugins: [jasmine, kjhtml, chrome, firefox], - - // frameworks to use - // available frameworks: https://npmjs.org/browse/keyword/karma-adapter - frameworks: ["jasmine"], - - // list of files / patterns to load in the browser - files: ["dist/web/tests.js"], - - client: { - jasmine: { - random: false, - timeoutInterval: 15000, - }, - }, - - // test results reporter to use - // possible values: 'dots', 'progress' - // available reporters: https://npmjs.org/browse/keyword/karma-reporter - reporters: ["progress", "kjhtml"], - - // web server port - port: 9876, - - // enable / disable colors in the output (reporters and logs) - colors: true, - - // level of logging - // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG - logLevel: config.LOG_INFO, - - // enable / disable watching file and executing tests whenever any file changes - autoWatch: false, - - // start these browsers - // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher - browsers: ["Firefox"], - - browserNoActivityTimeout: 90000, - - // Keep brower open for debugging. This is overridden by yarn scripts - singleRun: false, - }); -}; diff --git a/packages/cosmwasm-launchpad/nonces/1608116992 b/packages/cosmwasm-launchpad/nonces/1608116992 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1608655016 b/packages/cosmwasm-launchpad/nonces/1608655016 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1608658230 b/packages/cosmwasm-launchpad/nonces/1608658230 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1610382985 b/packages/cosmwasm-launchpad/nonces/1610382985 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1610535316 b/packages/cosmwasm-launchpad/nonces/1610535316 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1610631754 b/packages/cosmwasm-launchpad/nonces/1610631754 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1611149057 b/packages/cosmwasm-launchpad/nonces/1611149057 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1611678989 b/packages/cosmwasm-launchpad/nonces/1611678989 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1611750141 b/packages/cosmwasm-launchpad/nonces/1611750141 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1611786381 b/packages/cosmwasm-launchpad/nonces/1611786381 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1611844556 b/packages/cosmwasm-launchpad/nonces/1611844556 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1612890815 b/packages/cosmwasm-launchpad/nonces/1612890815 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1613038896 b/packages/cosmwasm-launchpad/nonces/1613038896 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1613138005 b/packages/cosmwasm-launchpad/nonces/1613138005 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1614180617 b/packages/cosmwasm-launchpad/nonces/1614180617 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1615454760 b/packages/cosmwasm-launchpad/nonces/1615454760 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1615474491 b/packages/cosmwasm-launchpad/nonces/1615474491 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1616606821 b/packages/cosmwasm-launchpad/nonces/1616606821 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1617305704 b/packages/cosmwasm-launchpad/nonces/1617305704 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1619093391 b/packages/cosmwasm-launchpad/nonces/1619093391 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1620201303 b/packages/cosmwasm-launchpad/nonces/1620201303 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1620311409 b/packages/cosmwasm-launchpad/nonces/1620311409 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1620739592 b/packages/cosmwasm-launchpad/nonces/1620739592 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1621348747 b/packages/cosmwasm-launchpad/nonces/1621348747 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1622465640 b/packages/cosmwasm-launchpad/nonces/1622465640 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/1624462460 b/packages/cosmwasm-launchpad/nonces/1624462460 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/cosmwasm-launchpad/nonces/README.txt b/packages/cosmwasm-launchpad/nonces/README.txt deleted file mode 100644 index 092fe732..00000000 --- a/packages/cosmwasm-launchpad/nonces/README.txt +++ /dev/null @@ -1 +0,0 @@ -Directory used to trigger lerna package updates for all packages diff --git a/packages/cosmwasm-launchpad/package.json b/packages/cosmwasm-launchpad/package.json deleted file mode 100644 index bbe88013..00000000 --- a/packages/cosmwasm-launchpad/package.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "name": "@cosmjs/cosmwasm-launchpad", - "version": "0.25.5", - "description": "CosmWasm SDK for Launchpad", - "contributors": [ - "Ethan Frey ", - "Will Clark " - ], - "license": "Apache-2.0", - "main": "build/index.js", - "types": "build/index.d.ts", - "files": [ - "build/", - "*.md", - "!*.spec.*", - "!**/testdata/" - ], - "repository": { - "type": "git", - "url": "https://github.com/cosmos/cosmjs/tree/main/packages/cosmwasm-launchpad" - }, - "publishConfig": { - "access": "public" - }, - "scripts": { - "docs": "typedoc --options typedoc.js", - "lint": "eslint --max-warnings 0 \"./**/*.ts\" \"./*.js\"", - "lint-fix": "eslint --fix --max-warnings 0 \"./**/*.ts\" \"./*.js\"", - "format": "prettier --write --loglevel warn \"./src/**/*.ts\"", - "format-text": "prettier --write \"./*.md\"", - "build": "rm -rf ./build && tsc", - "build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build", - "test-node": "node --require esm jasmine-testrunner.js", - "test-firefox": "yarn pack-web && karma start --single-run --browsers Firefox", - "test-chrome": "yarn pack-web && karma start --single-run --browsers ChromeHeadless", - "test": "yarn build-or-skip && yarn test-node", - "coverage": "nyc --reporter=text --reporter=lcov yarn test --quiet", - "pack-web": "yarn build-or-skip && webpack --mode development --config webpack.web.config.js" - }, - "dependencies": { - "@cosmjs/crypto": "workspace:packages/crypto", - "@cosmjs/encoding": "workspace:packages/encoding", - "@cosmjs/launchpad": "workspace:packages/launchpad", - "@cosmjs/math": "workspace:packages/math", - "@cosmjs/utils": "workspace:packages/utils", - "pako": "^2.0.2" - }, - "devDependencies": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@types/eslint-plugin-prettier": "^3", - "@types/jasmine": "^3.6.10", - "@types/karma-firefox-launcher": "^2", - "@types/karma-jasmine": "^4", - "@types/karma-jasmine-html-reporter": "^1", - "@types/node": "^15.0.1", - "@types/pako": "^1.0.1", - "@typescript-eslint/eslint-plugin": "^4.28", - "@typescript-eslint/parser": "^4.28", - "eslint": "^7.5", - "eslint-config-prettier": "^8.3.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-prettier": "^3.4.0", - "eslint-plugin-simple-import-sort": "^7.0.0", - "esm": "^3.2.25", - "glob": "^7.1.6", - "jasmine": "^3.5", - "jasmine-core": "^3.7.1", - "jasmine-spec-reporter": "^6", - "karma": "^6.1.1", - "karma-chrome-launcher": "^3.1.0", - "karma-firefox-launcher": "^2.1.0", - "karma-jasmine": "^4.0.1", - "karma-jasmine-html-reporter": "^1.5.4", - "nyc": "^15.1.0", - "prettier": "^2.3.2", - "readonly-date": "^1.0.0", - "ses": "^0.11.0", - "source-map-support": "^0.5.19", - "stream-browserify": "^3.0.0", - "ts-node": "^8", - "typedoc": "^0.21", - "typescript": "~4.3", - "webpack": "^5.32.0", - "webpack-cli": "^4.6.0" - } -} diff --git a/packages/cosmwasm-launchpad/src/builder.spec.ts b/packages/cosmwasm-launchpad/src/builder.spec.ts deleted file mode 100644 index 20926f4c..00000000 --- a/packages/cosmwasm-launchpad/src/builder.spec.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { isValidBuilder } from "./builder"; - -describe("builder", () => { - describe("isValidBuilder", () => { - // Valid cases - - it("returns true for simple examples", () => { - expect(isValidBuilder("myorg/super-optimizer:0.1.2")).toEqual(true); - expect(isValidBuilder("myorg/super-optimizer:42")).toEqual(true); - }); - - it("supports images with multi level names", () => { - expect(isValidBuilder("myorg/department-x/office-y/technology-z/super-optimizer:0.1.2")).toEqual(true); - }); - - it("returns true for tags with lower and upper chars", () => { - expect(isValidBuilder("myorg/super-optimizer:0.1.2-alpha")).toEqual(true); - expect(isValidBuilder("myorg/super-optimizer:0.1.2-Alpha")).toEqual(true); - }); - - // Invalid cases - - it("returns false for missing or empty tag", () => { - expect(isValidBuilder("myorg/super-optimizer")).toEqual(false); - expect(isValidBuilder("myorg/super-optimizer:")).toEqual(false); - }); - - it("returns false for name components starting or ending with a separator", () => { - expect(isValidBuilder(".myorg/super-optimizer:42")).toEqual(false); - expect(isValidBuilder("-myorg/super-optimizer:42")).toEqual(false); - expect(isValidBuilder("_myorg/super-optimizer:42")).toEqual(false); - expect(isValidBuilder("myorg./super-optimizer:42")).toEqual(false); - expect(isValidBuilder("myorg-/super-optimizer:42")).toEqual(false); - expect(isValidBuilder("myorg_/super-optimizer:42")).toEqual(false); - expect(isValidBuilder("myorg/.super-optimizer:42")).toEqual(false); - expect(isValidBuilder("myorg/-super-optimizer:42")).toEqual(false); - expect(isValidBuilder("myorg/_super-optimizer:42")).toEqual(false); - expect(isValidBuilder("myorg/super-optimizer.:42")).toEqual(false); - expect(isValidBuilder("myorg/super-optimizer-:42")).toEqual(false); - expect(isValidBuilder("myorg/super-optimizer_:42")).toEqual(false); - }); - - it("returns false for upper case character in name component", () => { - expect(isValidBuilder("mYorg/super-optimizer:42")).toEqual(false); - expect(isValidBuilder("myorg/super-Optimizer:42")).toEqual(false); - }); - - it("returns false for long images", () => { - expect( - isValidBuilder( - "myorgisnicenicenicenicenicenicenicenicenicenicenicenicenicenicenicenicenicenicenicenicenicenicenicenicenicenice/super-optimizer:42", - ), - ).toEqual(false); - }); - - it("returns false for images with no organization", () => { - // Those are valid dockerhub images from https://hub.docker.com/_/ubuntu and https://hub.docker.com/_/rust - // but not valid in the context of CosmWasm Verify - expect(isValidBuilder("ubuntu:xenial-20200212")).toEqual(false); - expect(isValidBuilder("rust:1.40.0")).toEqual(false); - }); - }); -}); diff --git a/packages/cosmwasm-launchpad/src/builder.ts b/packages/cosmwasm-launchpad/src/builder.ts deleted file mode 100644 index 31a790c7..00000000 --- a/packages/cosmwasm-launchpad/src/builder.ts +++ /dev/null @@ -1,20 +0,0 @@ -// A docker image regexp. We remove support for non-standard registries for simplicity. -// https://docs.docker.com/engine/reference/commandline/tag/#extended-description -// -// An image name is made up of slash-separated name components (optionally prefixed by a registry hostname). -// Name components may contain lowercase characters, digits and separators. -// A separator is defined as a period, one or two underscores, or one or more dashes. A name component may not start or end with a separator. -// -// A tag name must be valid ASCII and may contain lowercase and uppercase letters, digits, underscores, periods and dashes. -// A tag name may not start with a period or a dash and may contain a maximum of 128 characters. -const dockerImagePattern = new RegExp( - "^[a-z0-9][a-z0-9._-]*[a-z0-9](/[a-z0-9][a-z0-9._-]*[a-z0-9])+:[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,127}$", -); - -/** Max length in bytes/characters (regexp enforces all ASCII, even if that is not required by the standard) */ -const builderMaxLength = 128; - -export function isValidBuilder(builder: string): boolean { - if (builder.length > builderMaxLength) return false; - return !!builder.match(dockerImagePattern); -} diff --git a/packages/cosmwasm-launchpad/src/cosmosmsg.ts b/packages/cosmwasm-launchpad/src/cosmosmsg.ts deleted file mode 100644 index 7cfc74c3..00000000 --- a/packages/cosmwasm-launchpad/src/cosmosmsg.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { Coin } from "@cosmjs/launchpad"; - -interface BankSendMsg { - readonly send: { - readonly from_address: string; - readonly to_address: string; - readonly amount: readonly Coin[]; - }; -} - -export interface BankMsg { - readonly bank: BankSendMsg; -} - -export interface CustomMsg { - readonly custom: Record; -} - -interface StakingDelegateMsg { - readonly delegate: { - readonly validator: string; - readonly amount: Coin; - }; -} - -interface StakingRedelegateMsg { - readonly redelgate: { - readonly src_validator: string; - readonly dst_validator: string; - readonly amount: Coin; - }; -} - -interface StakingUndelegateMsg { - readonly undelegate: { - readonly validator: string; - readonly amount: Coin; - }; -} - -interface StakingWithdrawMsg { - readonly withdraw: { - readonly validator: string; - readonly recipient?: string; - }; -} - -export interface StakingMsg { - readonly staking: StakingDelegateMsg | StakingRedelegateMsg | StakingUndelegateMsg | StakingWithdrawMsg; -} - -interface WasmExecuteMsg { - readonly execute: { - readonly contract_address: string; - readonly msg: any; - readonly send: readonly Coin[]; - }; -} - -interface WasmInstantiateMsg { - readonly instantiate: { - readonly code_id: string; - readonly msg: any; - readonly send: readonly Coin[]; - readonly label?: string; - }; -} - -export interface WasmMsg { - readonly wasm: WasmExecuteMsg | WasmInstantiateMsg; -} - -/** These definitions are derived from CosmWasm: - * https://github.com/CosmWasm/cosmwasm/blob/v0.12.0/packages/std/src/results/cosmos_msg.rs#L10-L23 - */ -export type CosmosMsg = BankMsg | CustomMsg | StakingMsg | WasmMsg; diff --git a/packages/cosmwasm-launchpad/src/cosmwasmclient.searchtx.spec.ts b/packages/cosmwasm-launchpad/src/cosmwasmclient.searchtx.spec.ts deleted file mode 100644 index 99cfac6d..00000000 --- a/packages/cosmwasm-launchpad/src/cosmwasmclient.searchtx.spec.ts +++ /dev/null @@ -1,453 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { - coins, - isBroadcastTxFailure, - isMsgSend, - LcdClient, - makeSignDoc, - makeStdTx, - MsgSend, - Secp256k1HdWallet, - WrappedStdTx, -} from "@cosmjs/launchpad"; -import { assert, sleep } from "@cosmjs/utils"; - -import { CosmWasmClient } from "./cosmwasmclient"; -import { isMsgExecuteContract, isMsgInstantiateContract } from "./msgs"; -import { SigningCosmWasmClient } from "./signingcosmwasmclient"; -import { - alice, - deployedErc20, - erc20Enabled, - fromOneElementArray, - launchpad, - launchpadEnabled, - makeRandomAddress, - pendingWithoutErc20, - pendingWithoutLaunchpad, -} from "./testutils.spec"; - -interface TestTxSend { - readonly sender: string; - readonly recipient: string; - readonly hash: string; - readonly height: number; - readonly tx: WrappedStdTx; -} - -interface TestTxExecute { - readonly sender: string; - readonly contract: string; - readonly hash: string; - readonly height: number; - readonly tx: WrappedStdTx; -} - -describe("CosmWasmClient.getTx and .searchTx", () => { - let sendSuccessful: TestTxSend | undefined; - let sendSelfSuccessful: TestTxSend | undefined; - let sendUnsuccessful: TestTxSend | undefined; - let execute: TestTxExecute | undefined; - - beforeAll(async () => { - if (launchpadEnabled() && erc20Enabled()) { - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet); - - { - const recipient = makeRandomAddress(); - const amount = coins(1234567, "ucosm"); - const result = await client.sendTokens(recipient, amount); - await sleep(75); // wait until tx is indexed - const txDetails = await new LcdClient(launchpad.endpoint).txById(result.transactionHash); - sendSuccessful = { - sender: alice.address0, - recipient: recipient, - hash: result.transactionHash, - height: Number.parseInt(txDetails.height, 10), - tx: txDetails.tx, - }; - } - - { - const recipient = alice.address0; - const amount = coins(2345678, "ucosm"); - const result = await client.sendTokens(recipient, amount); - await sleep(75); // wait until tx is indexed - const txDetails = await new LcdClient(launchpad.endpoint).txById(result.transactionHash); - sendSelfSuccessful = { - sender: alice.address0, - recipient: recipient, - hash: result.transactionHash, - height: Number.parseInt(txDetails.height, 10), - tx: txDetails.tx, - }; - } - - { - const memo = "Sending more than I can afford"; - const recipient = makeRandomAddress(); - const amount = coins(123456700000000, "ucosm"); - const sendMsg: MsgSend = { - type: "cosmos-sdk/MsgSend", - value: { - from_address: alice.address0, - to_address: recipient, - amount: amount, - }, - }; - const fee = { - amount: coins(2000, "ucosm"), - gas: "80000", // 80k - }; - const { accountNumber, sequence } = await client.getSequence(); - const chainId = await client.getChainId(); - const signDoc = makeSignDoc([sendMsg], fee, chainId, memo, accountNumber, sequence); - const { signed, signature } = await wallet.signAmino(alice.address0, signDoc); - const tx: WrappedStdTx = { - type: "cosmos-sdk/StdTx", - value: makeStdTx(signed, signature), - }; - const transactionId = await client.getIdentifier(tx); - const result = await client.broadcastTx(tx.value); - if (isBroadcastTxFailure(result)) { - sendUnsuccessful = { - sender: alice.address0, - recipient: recipient, - hash: transactionId, - height: result.height, - tx: tx, - }; - } - } - - { - const hashInstance = deployedErc20.instances[0]; - const msg = { - approve: { - spender: makeRandomAddress(), - amount: "12", - }, - }; - const result = await client.execute(hashInstance, msg); - await sleep(75); // wait until tx is indexed - const txDetails = await new LcdClient(launchpad.endpoint).txById(result.transactionHash); - execute = { - sender: alice.address0, - contract: hashInstance, - hash: result.transactionHash, - height: Number.parseInt(txDetails.height, 10), - tx: txDetails.tx, - }; - } - } - }); - - describe("getTx", () => { - it("can get successful tx by ID", async () => { - pendingWithoutLaunchpad(); - pendingWithoutErc20(); - assert(sendSuccessful, "value must be set in beforeAll()"); - const client = new CosmWasmClient(launchpad.endpoint); - const result = await client.getTx(sendSuccessful.hash); - expect(result).toEqual( - jasmine.objectContaining({ - height: sendSuccessful.height, - hash: sendSuccessful.hash, - code: 0, - tx: sendSuccessful.tx, - }), - ); - }); - - it("can get unsuccessful tx by ID", async () => { - pendingWithoutLaunchpad(); - pendingWithoutErc20(); - assert(sendUnsuccessful, "value must be set in beforeAll()"); - const client = new CosmWasmClient(launchpad.endpoint); - const result = await client.getTx(sendUnsuccessful.hash); - expect(result).toEqual( - jasmine.objectContaining({ - height: sendUnsuccessful.height, - hash: sendUnsuccessful.hash, - code: 5, - tx: sendUnsuccessful.tx, - }), - ); - }); - - it("can get by ID (non existent)", async () => { - pendingWithoutLaunchpad(); - pendingWithoutErc20(); - const client = new CosmWasmClient(launchpad.endpoint); - const nonExistentId = "0000000000000000000000000000000000000000000000000000000000000000"; - const result = await client.getTx(nonExistentId); - expect(result).toBeNull(); - }); - }); - - describe("with SearchByHeightQuery", () => { - it("can search successful tx by height", async () => { - pendingWithoutLaunchpad(); - pendingWithoutErc20(); - assert(sendSuccessful, "value must be set in beforeAll()"); - const client = new CosmWasmClient(launchpad.endpoint); - const result = await client.searchTx({ height: sendSuccessful.height }); - expect(result.length).toBeGreaterThanOrEqual(1); - expect(result).toContain( - jasmine.objectContaining({ - height: sendSuccessful.height, - hash: sendSuccessful.hash, - code: 0, - tx: sendSuccessful.tx, - }), - ); - }); - - it("can search unsuccessful tx by height", async () => { - pendingWithoutLaunchpad(); - pendingWithoutErc20(); - assert(sendUnsuccessful, "value must be set in beforeAll()"); - const client = new CosmWasmClient(launchpad.endpoint); - const result = await client.searchTx({ height: sendUnsuccessful.height }); - expect(result.length).toBeGreaterThanOrEqual(1); - expect(result).toContain( - jasmine.objectContaining({ - height: sendUnsuccessful.height, - hash: sendUnsuccessful.hash, - code: 5, - tx: sendUnsuccessful.tx, - }), - ); - }); - }); - - describe("with SearchBySentFromOrToQuery", () => { - it("can search by sender", async () => { - pendingWithoutLaunchpad(); - pendingWithoutErc20(); - assert(sendSuccessful, "value must be set in beforeAll()"); - const client = new CosmWasmClient(launchpad.endpoint); - const results = await client.searchTx({ sentFromOrTo: sendSuccessful.sender }); - expect(results.length).toBeGreaterThanOrEqual(1); - - // Check basic structure of all results - for (const result of results) { - const containsMsgWithSender = !!result.tx.value.msg.find( - (msg) => isMsgSend(msg) && msg.value.from_address == sendSuccessful!.sender, - ); - const containsMsgWithRecipient = !!result.tx.value.msg.find( - (msg) => isMsgSend(msg) && msg.value.to_address === sendSuccessful!.sender, - ); - expect(containsMsgWithSender || containsMsgWithRecipient).toEqual(true); - } - - // Check details of most recent result (not sent to self) - expect(results[results.length - 2]).toEqual( - jasmine.objectContaining({ - height: sendSuccessful.height, - hash: sendSuccessful.hash, - tx: sendSuccessful.tx, - }), - ); - }); - - it("can search by recipient", async () => { - pendingWithoutLaunchpad(); - pendingWithoutErc20(); - assert(sendSuccessful, "value must be set in beforeAll()"); - const client = new CosmWasmClient(launchpad.endpoint); - const results = await client.searchTx({ sentFromOrTo: sendSuccessful.recipient }); - expect(results.length).toBeGreaterThanOrEqual(1); - - // Check basic structure of all results - for (const result of results) { - const msg = fromOneElementArray(result.tx.value.msg); - assert(isMsgSend(msg), `${result.hash} (height ${result.height}) is not a bank send transaction`); - expect( - msg.value.to_address === sendSuccessful.recipient || - msg.value.from_address == sendSuccessful.recipient, - ).toEqual(true); - } - - // Check details of most recent result - expect(results[results.length - 1]).toEqual( - jasmine.objectContaining({ - height: sendSuccessful.height, - hash: sendSuccessful.hash, - tx: sendSuccessful.tx, - }), - ); - }); - - it("can search by sender or recipient (sorted and deduplicated)", async () => { - pendingWithoutLaunchpad(); - pendingWithoutErc20(); - assert(sendSelfSuccessful, "value must be set in beforeAll()"); - const txhash = sendSelfSuccessful.hash; - const client = new CosmWasmClient(launchpad.endpoint); - const results = await client.searchTx({ sentFromOrTo: sendSelfSuccessful.recipient }); - - expect(Array.from(results).sort((tx1, tx2) => tx1.height - tx2.height)).toEqual(results); - expect(results.filter((result) => result.hash === txhash).length).toEqual(1); - }); - - it("can search by recipient and filter by minHeight", async () => { - pendingWithoutLaunchpad(); - pendingWithoutErc20(); - assert(sendSuccessful); - const client = new CosmWasmClient(launchpad.endpoint); - const query = { sentFromOrTo: sendSuccessful.recipient }; - - { - const result = await client.searchTx(query, { minHeight: 0 }); - expect(result.length).toEqual(1); - } - - { - const result = await client.searchTx(query, { minHeight: sendSuccessful.height - 1 }); - expect(result.length).toEqual(1); - } - - { - const result = await client.searchTx(query, { minHeight: sendSuccessful.height }); - expect(result.length).toEqual(1); - } - - { - const result = await client.searchTx(query, { minHeight: sendSuccessful.height + 1 }); - expect(result.length).toEqual(0); - } - }); - - it("can search by recipient and filter by maxHeight", async () => { - pendingWithoutLaunchpad(); - pendingWithoutErc20(); - assert(sendSuccessful); - const client = new CosmWasmClient(launchpad.endpoint); - const query = { sentFromOrTo: sendSuccessful.recipient }; - - { - const result = await client.searchTx(query, { maxHeight: 9999999999999 }); - expect(result.length).toEqual(1); - } - - { - const result = await client.searchTx(query, { maxHeight: sendSuccessful.height + 1 }); - expect(result.length).toEqual(1); - } - - { - const result = await client.searchTx(query, { maxHeight: sendSuccessful.height }); - expect(result.length).toEqual(1); - } - - { - const result = await client.searchTx(query, { maxHeight: sendSuccessful.height - 1 }); - expect(result.length).toEqual(0); - } - }); - }); - - describe("with SearchByTagsQuery", () => { - it("can search by transfer.recipient", async () => { - pendingWithoutLaunchpad(); - pendingWithoutErc20(); - assert(sendSuccessful, "value must be set in beforeAll()"); - const client = new CosmWasmClient(launchpad.endpoint); - const results = await client.searchTx({ - tags: [{ key: "transfer.recipient", value: sendSuccessful.recipient }], - }); - expect(results.length).toBeGreaterThanOrEqual(1); - - // Check basic structure of all results - for (const result of results) { - const msg = fromOneElementArray(result.tx.value.msg); - assert(isMsgSend(msg), `${result.hash} (height ${result.height}) is not a bank send transaction`); - expect(msg.value.to_address).toEqual(sendSuccessful.recipient); - } - - // Check details of most recent result - expect(results[results.length - 1]).toEqual( - jasmine.objectContaining({ - height: sendSuccessful.height, - hash: sendSuccessful.hash, - tx: sendSuccessful.tx, - }), - ); - }); - - it("can search by message.contract_address", async () => { - pendingWithoutLaunchpad(); - pendingWithoutErc20(); - assert(execute, "value must be set in beforeAll()"); - const client = new CosmWasmClient(launchpad.endpoint); - const results = await client.searchTx({ - tags: [{ key: "message.contract_address", value: execute.contract }], - }); - expect(results.length).toBeGreaterThanOrEqual(1); - - // Check basic structure of all results - for (const result of results) { - const msg = fromOneElementArray(result.tx.value.msg); - assert( - isMsgExecuteContract(msg) || isMsgInstantiateContract(msg), - `${result.hash} (at ${result.height}) not an execute or instantiate msg`, - ); - } - - // Check that the first result is the instantiation - const first = fromOneElementArray(results[0].tx.value.msg); - assert(isMsgInstantiateContract(first), "First contract search result must be an instantiation"); - expect(first).toEqual({ - type: "wasm/MsgInstantiateContract", - value: { - sender: alice.address0, - code_id: deployedErc20.codeId.toString(), - label: "HASH", - init_msg: jasmine.objectContaining({ symbol: "HASH" }), - init_funds: [], - }, - }); - - // Check details of most recent result - expect(results[results.length - 1]).toEqual( - jasmine.objectContaining({ - height: execute.height, - hash: execute.hash, - tx: execute.tx, - }), - ); - }); - - it("can search by message.contract_address + message.action", async () => { - pendingWithoutLaunchpad(); - pendingWithoutErc20(); - assert(execute, "value must be set in beforeAll()"); - const client = new CosmWasmClient(launchpad.endpoint); - const results = await client.searchTx({ - tags: [ - { key: "message.contract_address", value: execute.contract }, - { key: "message.action", value: "execute" }, - ], - }); - expect(results.length).toBeGreaterThanOrEqual(1); - - // Check basic structure of all results - for (const result of results) { - const msg = fromOneElementArray(result.tx.value.msg); - assert(isMsgExecuteContract(msg), `${result.hash} (at ${result.height}) not an execute msg`); - expect(msg.value.contract).toEqual(execute.contract); - } - - // Check details of most recent result - expect(results[results.length - 1]).toEqual( - jasmine.objectContaining({ - height: execute.height, - hash: execute.hash, - tx: execute.tx, - }), - ); - }); - }); -}); diff --git a/packages/cosmwasm-launchpad/src/cosmwasmclient.spec.ts b/packages/cosmwasm-launchpad/src/cosmwasmclient.spec.ts deleted file mode 100644 index 860f4cc1..00000000 --- a/packages/cosmwasm-launchpad/src/cosmwasmclient.spec.ts +++ /dev/null @@ -1,467 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { sha256 } from "@cosmjs/crypto"; -import { Bech32, fromHex, fromUtf8, toAscii, toBase64 } from "@cosmjs/encoding"; -import { - assertIsBroadcastTxSuccess, - isWrappedStdTx, - logs, - makeSignDoc, - makeStdTx, - MsgSend, - Secp256k1HdWallet, - StdFee, -} from "@cosmjs/launchpad"; -import { assert, sleep } from "@cosmjs/utils"; -import { ReadonlyDate } from "readonly-date"; - -import { Code, CosmWasmClient, PrivateCosmWasmClient } from "./cosmwasmclient"; -import { SigningCosmWasmClient } from "./signingcosmwasmclient"; -import cosmoshub from "./testdata/cosmoshub.json"; -import { - alice, - deployedHackatom, - getHackatom, - launchpad, - launchpadEnabled, - makeRandomAddress, - pendingWithoutLaunchpad, - tendermintIdMatcher, - unused, -} from "./testutils.spec"; - -const blockTime = 1_000; // ms - -interface HackatomInstance { - readonly initMsg: { - readonly verifier: string; - readonly beneficiary: string; - }; - readonly address: string; -} - -describe("CosmWasmClient", () => { - describe("makeReadOnly", () => { - it("can be constructed", () => { - const client = new CosmWasmClient(launchpad.endpoint); - expect(client).toBeTruthy(); - }); - }); - - describe("getChainId", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - expect(await client.getChainId()).toEqual(launchpad.chainId); - }); - - it("caches chain ID", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - const openedClient = client as unknown as PrivateCosmWasmClient; - const getCodeSpy = spyOn(openedClient.lcdClient, "nodeInfo").and.callThrough(); - - expect(await client.getChainId()).toEqual(launchpad.chainId); // from network - expect(await client.getChainId()).toEqual(launchpad.chainId); // from cache - - expect(getCodeSpy).toHaveBeenCalledTimes(1); - }); - }); - - describe("getHeight", () => { - it("gets height via last block", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - const openedClient = client as unknown as PrivateCosmWasmClient; - const blockLatestSpy = spyOn(openedClient.lcdClient, "blocksLatest").and.callThrough(); - - const height1 = await client.getHeight(); - expect(height1).toBeGreaterThan(0); - await sleep(blockTime * 1.4); // tolerate chain being 40% slower than expected - const height2 = await client.getHeight(); - expect(height2).toBeGreaterThanOrEqual(height1 + 1); - expect(height2).toBeLessThanOrEqual(height1 + 2); - - expect(blockLatestSpy).toHaveBeenCalledTimes(2); - }); - - it("gets height via authAccount once an address is known", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - - const openedClient = client as unknown as PrivateCosmWasmClient; - const blockLatestSpy = spyOn(openedClient.lcdClient, "blocksLatest").and.callThrough(); - const authAccountsSpy = spyOn(openedClient.lcdClient.auth, "account").and.callThrough(); - - const height1 = await client.getHeight(); - expect(height1).toBeGreaterThan(0); - - await client.getCodes(); // warm up the client - - const height2 = await client.getHeight(); - expect(height2).toBeGreaterThan(0); - await sleep(blockTime * 1.3); // tolerate chain being 30% slower than expected - const height3 = await client.getHeight(); - expect(height3).toBeGreaterThanOrEqual(height2 + 1); - expect(height3).toBeLessThanOrEqual(height2 + 2); - - expect(blockLatestSpy).toHaveBeenCalledTimes(1); - expect(authAccountsSpy).toHaveBeenCalledTimes(2); - }); - }); - - describe("getSequence", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - expect(await client.getSequence(unused.address)).toEqual({ - accountNumber: unused.accountNumber, - sequence: unused.sequence, - }); - }); - - it("throws for missing accounts", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - const missing = makeRandomAddress(); - await client.getSequence(missing).then( - () => fail("this must not succeed"), - (error) => expect(error).toMatch(/account does not exist on chain/i), - ); - }); - }); - - describe("getAccount", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - expect(await client.getAccount(unused.address)).toEqual({ - address: unused.address, - accountNumber: unused.accountNumber, - sequence: unused.sequence, - pubkey: undefined, - balance: [ - { denom: "ucosm", amount: "1000000000" }, - { denom: "ustake", amount: "1000000000" }, - ], - }); - }); - - it("returns undefined for missing accounts", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - const missing = makeRandomAddress(); - expect(await client.getAccount(missing)).toBeUndefined(); - }); - }); - - describe("getBlock", () => { - it("works for latest block", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - const response = await client.getBlock(); - - // id - expect(response.id).toMatch(tendermintIdMatcher); - - // header - expect(response.header.height).toBeGreaterThanOrEqual(1); - expect(response.header.chainId).toEqual(await client.getChainId()); - expect(new ReadonlyDate(response.header.time).getTime()).toBeLessThan(ReadonlyDate.now()); - expect(new ReadonlyDate(response.header.time).getTime()).toBeGreaterThanOrEqual( - ReadonlyDate.now() - 5_000, - ); - - // txs - expect(Array.isArray(response.txs)).toEqual(true); - }); - - it("works for block by height", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - const height = (await client.getBlock()).header.height; - const response = await client.getBlock(height - 1); - - // id - expect(response.id).toMatch(tendermintIdMatcher); - - // header - expect(response.header.height).toEqual(height - 1); - expect(response.header.chainId).toEqual(await client.getChainId()); - expect(new ReadonlyDate(response.header.time).getTime()).toBeLessThan(ReadonlyDate.now()); - expect(new ReadonlyDate(response.header.time).getTime()).toBeGreaterThanOrEqual( - ReadonlyDate.now() - 5_000, - ); - - // txs - expect(Array.isArray(response.txs)).toEqual(true); - }); - }); - - describe("getIdentifier", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - assert(isWrappedStdTx(cosmoshub.tx)); - expect(await client.getIdentifier(cosmoshub.tx)).toEqual(cosmoshub.id); - }); - }); - - describe("broadcastTx", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new CosmWasmClient(launchpad.endpoint); - - const memo = "My first contract on chain"; - const sendMsg: MsgSend = { - type: "cosmos-sdk/MsgSend", - value: { - from_address: alice.address0, - to_address: makeRandomAddress(), - amount: [ - { - denom: "ucosm", - amount: "1234567", - }, - ], - }, - }; - - const fee: StdFee = { - amount: [ - { - amount: "5000", - denom: "ucosm", - }, - ], - gas: "890000", - }; - - const chainId = await client.getChainId(); - const { accountNumber, sequence } = await client.getSequence(alice.address0); - const signDoc = makeSignDoc([sendMsg], fee, chainId, memo, accountNumber, sequence); - const { signed, signature } = await wallet.signAmino(alice.address0, signDoc); - const signedTx = makeStdTx(signed, signature); - const result = await client.broadcastTx(signedTx); - assertIsBroadcastTxSuccess(result); - const amountAttr = logs.findAttribute(result.logs, "transfer", "amount"); - expect(amountAttr.value).toEqual("1234567ucosm"); - expect(result.transactionHash).toMatch(/^[0-9A-F]{64}$/); - }); - }); - - describe("getCodes", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - const result = await client.getCodes(); - expect(result.length).toBeGreaterThanOrEqual(1); - const [first] = result; - expect(first).toEqual({ - id: deployedHackatom.codeId, - source: deployedHackatom.source, - builder: deployedHackatom.builder, - checksum: deployedHackatom.checksum, - creator: alice.address0, - }); - }); - }); - - describe("getCodeDetails", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - const result = await client.getCodeDetails(1); - - const expectedInfo: Code = { - id: deployedHackatom.codeId, - source: deployedHackatom.source, - builder: deployedHackatom.builder, - checksum: deployedHackatom.checksum, - creator: alice.address0, - }; - - // check info - expect(result).toEqual(jasmine.objectContaining(expectedInfo)); - // check data - expect(sha256(result.data)).toEqual(fromHex(expectedInfo.checksum)); - }); - - it("caches downloads", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - const openedClient = client as unknown as PrivateCosmWasmClient; - const getCodeSpy = spyOn(openedClient.lcdClient.wasm, "getCode").and.callThrough(); - - const result1 = await client.getCodeDetails(deployedHackatom.codeId); // from network - const result2 = await client.getCodeDetails(deployedHackatom.codeId); // from cache - expect(result2).toEqual(result1); - - expect(getCodeSpy).toHaveBeenCalledTimes(1); - }); - }); - - describe("getContracts", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - const result = await client.getContracts(1); - expect(result.length).toBeGreaterThanOrEqual(3); - const [zero, one, two] = result; - expect(zero).toEqual({ - address: deployedHackatom.instances[0].address, - codeId: deployedHackatom.codeId, - creator: alice.address0, - admin: undefined, - label: deployedHackatom.instances[0].label, - }); - expect(one).toEqual({ - address: deployedHackatom.instances[1].address, - codeId: deployedHackatom.codeId, - creator: alice.address0, - admin: undefined, - label: deployedHackatom.instances[1].label, - }); - expect(two).toEqual({ - address: deployedHackatom.instances[2].address, - codeId: deployedHackatom.codeId, - creator: alice.address0, - admin: alice.address1, - label: deployedHackatom.instances[2].label, - }); - }); - }); - - describe("getContract", () => { - it("works for instance without admin", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - const zero = await client.getContract(deployedHackatom.instances[0].address); - expect(zero).toEqual({ - address: deployedHackatom.instances[0].address, - codeId: deployedHackatom.codeId, - creator: alice.address0, - label: deployedHackatom.instances[0].label, - admin: undefined, - }); - }); - - it("works for instance with admin", async () => { - pendingWithoutLaunchpad(); - const client = new CosmWasmClient(launchpad.endpoint); - const two = await client.getContract(deployedHackatom.instances[2].address); - expect(two).toEqual( - jasmine.objectContaining({ - address: deployedHackatom.instances[2].address, - codeId: deployedHackatom.codeId, - creator: alice.address0, - label: deployedHackatom.instances[2].label, - admin: alice.address1, - }), - ); - }); - }); - - describe("queryContractRaw", () => { - const configKey = toAscii("config"); - const otherKey = toAscii("this_does_not_exist"); - let contract: HackatomInstance | undefined; - - beforeAll(async () => { - if (launchpadEnabled()) { - pendingWithoutLaunchpad(); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet); - const { codeId } = await client.upload(getHackatom().data); - const initMsg = { verifier: makeRandomAddress(), beneficiary: makeRandomAddress() }; - const { contractAddress } = await client.instantiate(codeId, initMsg, "random hackatom"); - contract = { initMsg: initMsg, address: contractAddress }; - } - }); - - it("can query existing key", async () => { - pendingWithoutLaunchpad(); - assert(contract); - - const client = new CosmWasmClient(launchpad.endpoint); - const raw = await client.queryContractRaw(contract.address, configKey); - assert(raw, "must get result"); - expect(JSON.parse(fromUtf8(raw))).toEqual({ - verifier: toBase64(Bech32.decode(contract.initMsg.verifier).data), - beneficiary: toBase64(Bech32.decode(contract.initMsg.beneficiary).data), - funder: toBase64(Bech32.decode(alice.address0).data), - }); - }); - - it("can query non-existent key", async () => { - pendingWithoutLaunchpad(); - assert(contract); - - const client = new CosmWasmClient(launchpad.endpoint); - const raw = await client.queryContractRaw(contract.address, otherKey); - expect(raw).toBeNull(); - }); - - it("errors for non-existent contract", async () => { - pendingWithoutLaunchpad(); - assert(contract); - - const nonExistentAddress = makeRandomAddress(); - const client = new CosmWasmClient(launchpad.endpoint); - await client.queryContractRaw(nonExistentAddress, configKey).then( - () => fail("must not succeed"), - (error) => expect(error).toMatch(`No contract found at address "${nonExistentAddress}"`), - ); - }); - }); - - describe("queryContractSmart", () => { - let contract: HackatomInstance | undefined; - - beforeAll(async () => { - if (launchpadEnabled()) { - pendingWithoutLaunchpad(); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet); - const { codeId } = await client.upload(getHackatom().data); - const initMsg = { verifier: makeRandomAddress(), beneficiary: makeRandomAddress() }; - const { contractAddress } = await client.instantiate(codeId, initMsg, "a different hackatom"); - contract = { initMsg: initMsg, address: contractAddress }; - } - }); - - it("works", async () => { - pendingWithoutLaunchpad(); - assert(contract); - - const client = new CosmWasmClient(launchpad.endpoint); - const resultDocument = await client.queryContractSmart(contract.address, { verifier: {} }); - expect(resultDocument).toEqual({ verifier: contract.initMsg.verifier }); - }); - - it("errors for malformed query message", async () => { - pendingWithoutLaunchpad(); - assert(contract); - - const client = new CosmWasmClient(launchpad.endpoint); - await client.queryContractSmart(contract.address, { broken: {} }).then( - () => fail("must not succeed"), - (error) => - expect(error).toMatch( - /query wasm contract failed: Error parsing into type hackatom::contract::QueryMsg: unknown variant/i, - ), - ); - }); - - it("errors for non-existent contract", async () => { - pendingWithoutLaunchpad(); - - const nonExistentAddress = makeRandomAddress(); - const client = new CosmWasmClient(launchpad.endpoint); - await client.queryContractSmart(nonExistentAddress, { verifier: {} }).then( - () => fail("must not succeed"), - (error) => expect(error).toMatch(`No contract found at address "${nonExistentAddress}"`), - ); - }); - }); -}); diff --git a/packages/cosmwasm-launchpad/src/cosmwasmclient.ts b/packages/cosmwasm-launchpad/src/cosmwasmclient.ts deleted file mode 100644 index 3915971b..00000000 --- a/packages/cosmwasm-launchpad/src/cosmwasmclient.ts +++ /dev/null @@ -1,472 +0,0 @@ -import { sha256 } from "@cosmjs/crypto"; -import { fromBase64, fromHex, toHex } from "@cosmjs/encoding"; -import { - AuthExtension, - BroadcastMode, - BroadcastTxResult, - Coin, - IndexedTx, - LcdClient, - logs, - normalizePubkey, - PubKey, - setupAuthExtension, - StdTx, - uint64ToNumber, - WrappedStdTx, -} from "@cosmjs/launchpad"; -import { Uint53 } from "@cosmjs/math"; - -import { setupWasmExtension, WasmExtension } from "./lcdapi/wasm"; -import { JsonObject } from "./types"; - -export interface GetSequenceResult { - readonly accountNumber: number; - readonly sequence: number; -} - -export interface Account { - /** Bech32 account address */ - readonly address: string; - readonly balance: readonly Coin[]; - readonly pubkey: PubKey | undefined; - readonly accountNumber: number; - readonly sequence: number; -} - -export interface SearchByIdQuery { - readonly id: string; -} - -export interface SearchByHeightQuery { - readonly height: number; -} - -export interface SearchBySentFromOrToQuery { - readonly sentFromOrTo: string; -} - -/** - * This query type allows you to pass arbitrary key/value pairs to the backend. It is - * more powerful and slightly lower level than the other search options. - */ -export interface SearchByTagsQuery { - readonly tags: ReadonlyArray<{ readonly key: string; readonly value: string }>; -} - -export type SearchTxQuery = SearchByHeightQuery | SearchBySentFromOrToQuery | SearchByTagsQuery; - -function isSearchByHeightQuery(query: SearchTxQuery): query is SearchByHeightQuery { - return (query as SearchByHeightQuery).height !== undefined; -} - -function isSearchBySentFromOrToQuery(query: SearchTxQuery): query is SearchBySentFromOrToQuery { - return (query as SearchBySentFromOrToQuery).sentFromOrTo !== undefined; -} - -function isSearchByTagsQuery(query: SearchTxQuery): query is SearchByTagsQuery { - return (query as SearchByTagsQuery).tags !== undefined; -} - -export interface SearchTxFilter { - readonly minHeight?: number; - readonly maxHeight?: number; -} - -export interface Code { - readonly id: number; - /** Bech32 account address */ - readonly creator: string; - /** Hex-encoded sha256 hash of the code stored here */ - readonly checksum: string; - /** - * An URL to a .tar.gz archive of the source code of the contract, which can be used to reproducibly build the Wasm bytecode. - * - * @see https://github.com/CosmWasm/cosmwasm-verify - */ - readonly source?: string; - /** - * A docker image (including version) to reproducibly build the Wasm bytecode from the source code. - * - * @example ```cosmwasm/rust-optimizer:0.8.0``` - * @see https://github.com/CosmWasm/cosmwasm-verify - */ - readonly builder?: string; -} - -export interface CodeDetails extends Code { - /** The original Wasm bytes */ - readonly data: Uint8Array; -} - -export interface Contract { - readonly address: string; - readonly codeId: number; - /** Bech32 account address */ - readonly creator: string; - /** Bech32-encoded admin address */ - readonly admin: string | undefined; - readonly label: string; -} - -export interface ContractCodeHistoryEntry { - /** The source of this history entry */ - readonly operation: "Genesis" | "Init" | "Migrate"; - readonly codeId: number; - readonly msg: Record; -} - -export interface BlockHeader { - readonly version: { - readonly block: string; - readonly app: string; - }; - readonly height: number; - readonly chainId: string; - /** An RFC 3339 time string like e.g. '2020-02-15T10:39:10.4696305Z' */ - readonly time: string; -} - -export interface Block { - /** The ID is a hash of the block header (uppercase hex) */ - readonly id: string; - readonly header: BlockHeader; - /** Array of raw transactions */ - readonly txs: readonly Uint8Array[]; -} - -/** Use for testing only */ -export interface PrivateCosmWasmClient { - readonly lcdClient: LcdClient & AuthExtension & WasmExtension; -} - -export class CosmWasmClient { - protected readonly lcdClient: LcdClient & AuthExtension & WasmExtension; - /** Any address the chain considers valid (valid bech32 with proper prefix) */ - protected anyValidAddress: string | undefined; - - private readonly codesCache = new Map(); - private chainId: string | undefined; - - /** - * Creates a new client to interact with a CosmWasm blockchain. - * - * This instance does a lot of caching. In order to benefit from that you should try to use one instance - * for the lifetime of your application. When switching backends, a new instance must be created. - * - * @param apiUrl The URL of a Cosmos SDK light client daemon API (sometimes called REST server or REST API) - * @param broadcastMode Defines at which point of the transaction processing the broadcastTx method returns - */ - public constructor(apiUrl: string, broadcastMode = BroadcastMode.Block) { - this.lcdClient = LcdClient.withExtensions( - { apiUrl: apiUrl, broadcastMode: broadcastMode }, - setupAuthExtension, - setupWasmExtension, - ); - } - - public async getChainId(): Promise { - if (!this.chainId) { - const response = await this.lcdClient.nodeInfo(); - const chainId = response.node_info.network; - if (!chainId) throw new Error("Chain ID must not be empty"); - this.chainId = chainId; - } - - return this.chainId; - } - - public async getHeight(): Promise { - if (this.anyValidAddress) { - const { height } = await this.lcdClient.auth.account(this.anyValidAddress); - return parseInt(height, 10); - } else { - // Note: this gets inefficient when blocks contain a lot of transactions since it - // requires downloading and deserializing all transactions in the block. - const latest = await this.lcdClient.blocksLatest(); - return parseInt(latest.block.header.height, 10); - } - } - - /** - * Returns a 32 byte upper-case hex transaction hash (typically used as the transaction ID) - */ - public async getIdentifier(tx: WrappedStdTx): Promise { - // We consult the REST API because we don't have a local amino encoder - const response = await this.lcdClient.encodeTx(tx); - const hash = sha256(fromBase64(response.tx)); - return toHex(hash).toUpperCase(); - } - - /** - * Returns account number and sequence. - * - * Throws if the account does not exist on chain. - * - * @param address returns data for this address. When unset, the client's sender adddress is used. - */ - public async getSequence(address: string): Promise { - const account = await this.getAccount(address); - if (!account) { - throw new Error( - "Account does not exist on chain. Send some tokens there before trying to query sequence.", - ); - } - return { - accountNumber: account.accountNumber, - sequence: account.sequence, - }; - } - - public async getAccount(address: string): Promise { - const account = await this.lcdClient.auth.account(address); - const value = account.result.value; - if (value.address === "") { - return undefined; - } else { - this.anyValidAddress = value.address; - return { - address: value.address, - balance: value.coins, - pubkey: normalizePubkey(value.public_key) || undefined, - accountNumber: uint64ToNumber(value.account_number), - sequence: uint64ToNumber(value.sequence), - }; - } - } - - /** - * Gets block header and meta - * - * @param height The height of the block. If undefined, the latest height is used. - */ - public async getBlock(height?: number): Promise { - const response = - height !== undefined ? await this.lcdClient.blocks(height) : await this.lcdClient.blocksLatest(); - - return { - id: response.block_id.hash, - header: { - version: response.block.header.version, - time: response.block.header.time, - height: parseInt(response.block.header.height, 10), - chainId: response.block.header.chain_id, - }, - txs: (response.block.data.txs || []).map(fromBase64), - }; - } - - public async getTx(id: string): Promise { - const results = await this.txsQuery(`tx.hash=${id}`); - return results[0] ?? null; - } - - public async searchTx(query: SearchTxQuery, filter: SearchTxFilter = {}): Promise { - const minHeight = filter.minHeight || 0; - const maxHeight = filter.maxHeight || Number.MAX_SAFE_INTEGER; - - if (maxHeight < minHeight) return []; // optional optimization - - function withFilters(originalQuery: string): string { - return `${originalQuery}&tx.minheight=${minHeight}&tx.maxheight=${maxHeight}`; - } - - let txs: readonly IndexedTx[]; - if (isSearchByHeightQuery(query)) { - // optional optimization to avoid network request - if (query.height < minHeight || query.height > maxHeight) { - txs = []; - } else { - txs = await this.txsQuery(`tx.height=${query.height}`); - } - } else if (isSearchBySentFromOrToQuery(query)) { - // We cannot get both in one request (see https://github.com/cosmos/gaia/issues/75) - const sentQuery = withFilters(`message.module=bank&message.sender=${query.sentFromOrTo}`); - const receivedQuery = withFilters(`message.module=bank&transfer.recipient=${query.sentFromOrTo}`); - const [sent, received] = (await Promise.all([ - this.txsQuery(sentQuery), - this.txsQuery(receivedQuery), - ])) as [IndexedTx[], IndexedTx[]]; - - let mergedTxs: readonly IndexedTx[] = []; - /* eslint-disable @typescript-eslint/no-non-null-assertion */ - // sent/received are presorted - while (sent.length && received.length) { - const next = - sent[0].hash === received[0].hash - ? sent.shift()! && received.shift()! - : sent[0].height <= received[0].height - ? sent.shift()! - : received.shift()!; - mergedTxs = [...mergedTxs, next]; - } - /* eslint-enable @typescript-eslint/no-non-null-assertion */ - // At least one of sent/received is empty by now - txs = [...mergedTxs, ...sent, ...received]; - } else if (isSearchByTagsQuery(query)) { - const rawQuery = withFilters(query.tags.map((t) => `${t.key}=${t.value}`).join("&")); - txs = await this.txsQuery(rawQuery); - } else { - throw new Error("Unknown query type"); - } - - // backend sometimes messes up with min/max height filtering - const filtered = txs.filter((tx) => tx.height >= minHeight && tx.height <= maxHeight); - - return filtered; - } - - public async broadcastTx(tx: StdTx): Promise { - const result = await this.lcdClient.broadcastTx(tx); - if (!result.txhash.match(/^([0-9A-F][0-9A-F])+$/)) { - throw new Error("Received ill-formatted txhash. Must be non-empty upper-case hex"); - } - - return result.code !== undefined - ? { - height: Uint53.fromString(result.height).toNumber(), - transactionHash: result.txhash, - code: result.code, - rawLog: result.raw_log || "", - } - : { - logs: result.logs ? logs.parseLogs(result.logs) : [], - rawLog: result.raw_log || "", - transactionHash: result.txhash, - data: result.data ? fromHex(result.data) : undefined, - }; - } - - public async getCodes(): Promise { - const result = await this.lcdClient.wasm.listCodeInfo(); - return result.map((entry): Code => { - this.anyValidAddress = entry.creator; - return { - id: entry.id, - creator: entry.creator, - checksum: toHex(fromHex(entry.data_hash)), - source: entry.source || undefined, - builder: entry.builder || undefined, - }; - }); - } - - public async getCodeDetails(codeId: number): Promise { - const cached = this.codesCache.get(codeId); - if (cached) return cached; - - const getCodeResult = await this.lcdClient.wasm.getCode(codeId); - const codeDetails: CodeDetails = { - id: getCodeResult.id, - creator: getCodeResult.creator, - checksum: toHex(fromHex(getCodeResult.data_hash)), - source: getCodeResult.source || undefined, - builder: getCodeResult.builder || undefined, - data: fromBase64(getCodeResult.data), - }; - this.codesCache.set(codeId, codeDetails); - return codeDetails; - } - - public async getContracts(codeId: number): Promise { - const result = await this.lcdClient.wasm.listContractsByCodeId(codeId); - return result.map( - (entry): Contract => ({ - address: entry.address, - codeId: entry.code_id, - creator: entry.creator, - admin: entry.admin, - label: entry.label, - }), - ); - } - - /** - * Throws an error if no contract was found at the address - */ - public async getContract(address: string): Promise { - const result = await this.lcdClient.wasm.getContractInfo(address); - if (!result) throw new Error(`No contract found at address "${address}"`); - return { - address: result.address, - codeId: result.code_id, - creator: result.creator, - admin: result.admin, - label: result.label, - }; - } - - /** - * Throws an error if no contract was found at the address - */ - public async getContractCodeHistory(address: string): Promise { - const result = await this.lcdClient.wasm.getContractCodeHistory(address); - if (!result) throw new Error(`No contract history found for address "${address}"`); - return result.map( - (entry): ContractCodeHistoryEntry => ({ - operation: entry.operation, - codeId: entry.code_id, - msg: entry.msg, - }), - ); - } - - /** - * Returns the data at the key if present (raw contract dependent storage data) - * or null if no data at this key. - * - * Promise is rejected when contract does not exist. - */ - public async queryContractRaw(address: string, key: Uint8Array): Promise { - // just test contract existence - const _info = await this.getContract(address); - - return this.lcdClient.wasm.queryContractRaw(address, key); - } - - /** - * Makes a smart query on the contract, returns the parsed JSON document. - * - * Promise is rejected when contract does not exist. - * Promise is rejected for invalid query format. - * Promise is rejected for invalid response format. - */ - public async queryContractSmart(address: string, queryMsg: Record): Promise { - try { - return await this.lcdClient.wasm.queryContractSmart(address, queryMsg); - } catch (error) { - if (error instanceof Error) { - if (error.message.startsWith("not found: contract")) { - throw new Error(`No contract found at address "${address}"`); - } else { - throw error; - } - } else { - throw error; - } - } - } - - private async txsQuery(query: string): Promise { - // TODO: we need proper pagination support - const limit = 100; - const result = await this.lcdClient.txsQuery(`${query}&limit=${limit}`); - const pages = parseInt(result.page_total, 10); - if (pages > 1) { - throw new Error( - `Found more results on the backend than we can process currently. Results: ${result.total_count}, supported: ${limit}`, - ); - } - return result.txs.map( - (restItem): IndexedTx => ({ - height: parseInt(restItem.height, 10), - hash: restItem.txhash, - code: restItem.code || 0, - rawLog: restItem.raw_log, - logs: logs.parseLogs(restItem.logs || []), - tx: restItem.tx, - timestamp: restItem.timestamp, - }), - ); - } -} diff --git a/packages/cosmwasm-launchpad/src/cw1cosmwasmclient.spec.ts b/packages/cosmwasm-launchpad/src/cw1cosmwasmclient.spec.ts deleted file mode 100644 index a8997fd1..00000000 --- a/packages/cosmwasm-launchpad/src/cw1cosmwasmclient.spec.ts +++ /dev/null @@ -1,118 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { coins, Secp256k1HdWallet } from "@cosmjs/launchpad"; - -import { Cw1CosmWasmClient } from "./cw1cosmwasmclient"; -import { - alice, - deployedCw1, - launchpad, - makeRandomAddress, - pendingWithoutCw1, - pendingWithoutLaunchpad, -} from "./testutils.spec"; - -describe("Cw1CosmWasmClient", () => { - const contractAddress = deployedCw1.instances[0]; - const defaultToAddress = makeRandomAddress(); - const defaultMsg = { - bank: { - send: { - from_address: contractAddress, - to_address: defaultToAddress, - amount: coins(1, "ucosm"), - }, - }, - }; - - describe("constructor", () => { - it("can be constructed", async () => { - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1CosmWasmClient(launchpad.endpoint, alice.address0, wallet, contractAddress); - expect(client).toBeTruthy(); - }); - }); - - describe("canSend", () => { - it("returns true if client signer can send", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1CosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw1.instances[0], - ); - const result = await client.canSend(defaultMsg); - - expect(result).toEqual(true); - }); - - it("returns false if client signer cannot send", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1CosmWasmClient( - launchpad.endpoint, - alice.address1, - wallet, - deployedCw1.instances[0], - ); - const result = await client.canSend(defaultMsg); - - expect(result).toEqual(false); - }); - - it("returns true if supplied signer can send", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1CosmWasmClient( - launchpad.endpoint, - alice.address1, - wallet, - deployedCw1.instances[0], - ); - const result = await client.canSend(defaultMsg, alice.address0); - - expect(result).toEqual(true); - }); - - it("returns false if supplied signer cannot send", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1CosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw1.instances[0], - ); - const result = await client.canSend(defaultMsg, alice.address1); - - expect(result).toEqual(false); - }); - }); - - describe("executeCw1", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1CosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw1.instances[0], - ); - const result = await client.executeCw1([defaultMsg]); - - expect(result.transactionHash).toBeTruthy(); - }); - }); -}); diff --git a/packages/cosmwasm-launchpad/src/cw1cosmwasmclient.ts b/packages/cosmwasm-launchpad/src/cw1cosmwasmclient.ts deleted file mode 100644 index 2fd85988..00000000 --- a/packages/cosmwasm-launchpad/src/cw1cosmwasmclient.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { Account, BroadcastMode, GasLimits, GasPrice, OfflineSigner } from "@cosmjs/launchpad"; - -import { CosmosMsg } from "./cosmosmsg"; -import { CosmWasmFeeTable, ExecuteResult, SigningCosmWasmClient } from "./signingcosmwasmclient"; - -export class Cw1CosmWasmClient extends SigningCosmWasmClient { - public readonly cw1ContractAddress: string; - - public constructor( - apiUrl: string, - signerAddress: string, - signer: OfflineSigner, - cw1ContractAddress: string, - gasPrice?: GasPrice, - gasLimits?: Partial>, - broadcastMode?: BroadcastMode, - ) { - super(apiUrl, signerAddress, signer, gasPrice, gasLimits, broadcastMode); - this.cw1ContractAddress = cw1ContractAddress; - } - - public override async getAccount(address?: string): Promise { - return super.getAccount(address || this.cw1ContractAddress); - } - - public async canSend(msg: CosmosMsg, address = this.signerAddress): Promise { - const result = await this.queryContractSmart(this.cw1ContractAddress, { - can_send: { - sender: address, - msg: msg, - }, - }); - return result.can_send; - } - - public async executeCw1(msgs: readonly CosmosMsg[], memo = ""): Promise { - const handleMsg = { - execute: { - msgs: msgs, - }, - }; - return this.execute(this.cw1ContractAddress, handleMsg, memo); - } -} diff --git a/packages/cosmwasm-launchpad/src/cw1subkeycosmwasmclient.spec.ts b/packages/cosmwasm-launchpad/src/cw1subkeycosmwasmclient.spec.ts deleted file mode 100644 index 2054fbf6..00000000 --- a/packages/cosmwasm-launchpad/src/cw1subkeycosmwasmclient.spec.ts +++ /dev/null @@ -1,323 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { coin, coins, Secp256k1HdWallet } from "@cosmjs/launchpad"; - -import { Cw1SubkeyCosmWasmClient } from "./cw1subkeycosmwasmclient"; -import { - alice, - deployedCw1, - launchpad, - makeRandomAddress, - pendingWithoutCw1, - pendingWithoutLaunchpad, -} from "./testutils.spec"; - -describe("Cw1SubkeyCosmWasmClient", () => { - describe("getAdmins", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1SubkeyCosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw1.instances[0], - ); - const result = await client.getAdmins(); - - expect(result).toEqual([alice.address0]); - }); - }); - - describe("isAdmin", () => { - it("returns true if client signer is admin", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1SubkeyCosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw1.instances[0], - ); - const result = await client.isAdmin(); - - expect(result).toEqual(true); - }); - - it("returns false if client signer is not admin", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1SubkeyCosmWasmClient( - launchpad.endpoint, - alice.address1, - wallet, - deployedCw1.instances[0], - ); - const result = await client.isAdmin(); - - expect(result).toEqual(false); - }); - - it("returns true if supplied signer is admin", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1SubkeyCosmWasmClient( - launchpad.endpoint, - alice.address1, - wallet, - deployedCw1.instances[0], - ); - const result = await client.isAdmin(alice.address0); - - expect(result).toEqual(true); - }); - - it("returns false if supplied signer is not admin", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1SubkeyCosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw1.instances[0], - ); - const result = await client.isAdmin(alice.address1); - - expect(result).toEqual(false); - }); - }); - - describe("getAllAllowances", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1SubkeyCosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw1.instances[0], - ); - const result = await client.getAllAllowances(); - expect(result).toBeTruthy(); - }); - }); - - describe("getAllowance", () => { - it("works for client signer", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1SubkeyCosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw1.instances[0], - ); - const result = await client.getAllowance(); - - expect(result).toEqual({ balance: [], expires: { never: {} } }); - }); - }); - - describe("getAllPermissions", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1SubkeyCosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw1.instances[0], - ); - const result = await client.getAllPermissions(); - expect(result.length).toEqual(1); - // TODO: test content of permissions - }); - }); - - describe("getPermissions", () => { - it("works for client signer", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1SubkeyCosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw1.instances[0], - ); - const result = await client.getPermissions(); - - expect(result).toEqual({ - delegate: false, - redelegate: false, - undelegate: false, - withdraw: false, - }); - }); - - it("works for supplied signer", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1SubkeyCosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw1.instances[0], - ); - const result = await client.getPermissions(alice.address1); - - expect(result).toEqual({ - delegate: false, - redelegate: false, - undelegate: false, - withdraw: false, - }); - }); - }); - - describe("addAdmin and removeAdmin", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1SubkeyCosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw1.instances[0], - ); - const newAdmin = makeRandomAddress(); - expect(await client.isAdmin(newAdmin)).toBeFalse(); - - const addResult = await client.addAdmin(newAdmin); - expect(addResult.transactionHash).toBeTruthy(); - expect(await client.isAdmin(newAdmin)).toBeTrue(); - - const removeResult = await client.removeAdmin(newAdmin); - expect(removeResult.transactionHash).toBeTruthy(); - expect(await client.isAdmin(newAdmin)).toBeFalse(); - }); - }); - - describe("increaseAllowance and decreaseAllowance", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1SubkeyCosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw1.instances[0], - ); - const spender = makeRandomAddress(); - expect(await client.getAllowance(spender)).toEqual({ balance: [], expires: { never: {} } }); - - const increaseAmount = coin(100, "ucosm"); - const increaseResult = await client.increaseAllowance(spender, increaseAmount); - expect(increaseResult.transactionHash).toBeTruthy(); - expect(await client.getAllowance(spender)).toEqual({ - balance: [increaseAmount], - expires: { never: {} }, - }); - - const decreaseAmount = coin(20, "ucosm"); - const decreaseResult = await client.decreaseAllowance(spender, decreaseAmount); - expect(decreaseResult.transactionHash).toBeTruthy(); - expect(await client.getAllowance(spender)).toEqual({ - balance: coins(80, "ucosm"), - expires: { never: {} }, - }); - }); - - it("works with expiration", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1SubkeyCosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw1.instances[0], - ); - const spender = makeRandomAddress(); - expect(await client.getAllowance(spender)).toEqual({ balance: [], expires: { never: {} } }); - - const increaseAmount = coin(100, "ucosm"); - const increaseExpiration = { at_height: 88888888888 }; - const increaseResult = await client.increaseAllowance(spender, increaseAmount, increaseExpiration); - expect(increaseResult.transactionHash).toBeTruthy(); - expect(await client.getAllowance(spender)).toEqual({ - balance: [increaseAmount], - expires: increaseExpiration, - }); - - const decreaseAmount = coin(20, "ucosm"); - const decreaseExpiration = { at_height: 99999999999 }; - const decreaseResult = await client.decreaseAllowance(spender, decreaseAmount, decreaseExpiration); - expect(decreaseResult.transactionHash).toBeTruthy(); - expect(await client.getAllowance(spender)).toEqual({ - balance: coins(80, "ucosm"), - expires: decreaseExpiration, - }); - }); - }); - - describe("setPermissions", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw1(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw1SubkeyCosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw1.instances[0], - ); - const spender = makeRandomAddress(); - const defaultPermissions = { - delegate: false, - redelegate: false, - undelegate: false, - withdraw: false, - }; - expect(await client.getPermissions(spender)).toEqual(defaultPermissions); - - const newPermissions = { - delegate: true, - redelegate: true, - undelegate: true, - withdraw: false, - }; - const setPermissionsResult = await client.setPermissions(spender, newPermissions); - expect(setPermissionsResult.transactionHash).toBeTruthy(); - expect(await client.getPermissions(spender)).toEqual(newPermissions); - - const resetPermissionsResult = await client.setPermissions(spender, defaultPermissions); - expect(resetPermissionsResult.transactionHash).toBeTruthy(); - expect(await client.getPermissions(spender)).toEqual(defaultPermissions); - }); - }); -}); diff --git a/packages/cosmwasm-launchpad/src/cw1subkeycosmwasmclient.ts b/packages/cosmwasm-launchpad/src/cw1subkeycosmwasmclient.ts deleted file mode 100644 index 8719e08b..00000000 --- a/packages/cosmwasm-launchpad/src/cw1subkeycosmwasmclient.ts +++ /dev/null @@ -1,152 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { Coin } from "@cosmjs/launchpad"; - -import { Cw1CosmWasmClient } from "./cw1cosmwasmclient"; -import { Expiration } from "./interfaces"; -import { ExecuteResult } from "./signingcosmwasmclient"; - -/** - * @see https://github.com/CosmWasm/cosmwasm-plus/blob/v0.3.2/contracts/cw1-subkeys/src/msg.rs#L88 - */ -export interface Cw1SubkeyAllowanceInfo { - readonly balance: readonly Coin[]; - readonly expires: Expiration; -} - -/** - * @see https://github.com/CosmWasm/cosmwasm-plus/blob/v0.3.2/contracts/cw1-subkeys/src/msg.rs#L83 - */ -interface AllAllowancesResponse { - readonly allowances: readonly Cw1SubkeyAllowanceInfo[]; -} - -/** - * @see https://github.com/CosmWasm/cosmwasm-plus/blob/v0.3.2/contracts/cw1-subkeys/src/state.rs#L15 - */ -export interface Cw1SubkeyPermissions { - readonly delegate: boolean; - readonly redelegate: boolean; - readonly undelegate: boolean; - readonly withdraw: boolean; -} - -/** - * @see https://github.com/CosmWasm/cosmwasm-plus/blob/v0.3.2/contracts/cw1-subkeys/src/msg.rs#L95 - */ -export interface Cw1SubkeyPermissionsInfo { - /** Spender address */ - readonly spender: string; - readonly permissions: readonly Cw1SubkeyPermissions[]; -} - -/** - * @see https://github.com/CosmWasm/cosmwasm-plus/blob/v0.3.2/contracts/cw1-subkeys/src/msg.rs#L101 - */ -interface AllPermissionsResponse { - readonly permissions: readonly Cw1SubkeyPermissionsInfo[]; -} - -export class Cw1SubkeyCosmWasmClient extends Cw1CosmWasmClient { - private async setAdmins(admins: readonly string[], memo = ""): Promise { - const handleMsg = { - update_admins: { - admins: admins, - }, - }; - return this.execute(this.cw1ContractAddress, handleMsg, memo); - } - - public async getAdmins(): Promise { - const { admins } = await this.queryContractSmart(this.cw1ContractAddress, { admin_list: {} }); - return admins; - } - - public async isAdmin(address = this.signerAddress): Promise { - const admins = await this.getAdmins(); - return admins.includes(address); - } - - public async getAllAllowances(): Promise { - const response: AllAllowancesResponse = await this.queryContractSmart(this.cw1ContractAddress, { - all_allowances: {}, - }); - return response.allowances; - } - - public async getAllowance(address = this.signerAddress): Promise { - return this.queryContractSmart(this.cw1ContractAddress, { - allowance: { spender: address }, - }); - } - - public async getAllPermissions(): Promise { - const response: AllPermissionsResponse = await this.queryContractSmart(this.cw1ContractAddress, { - all_permissions: {}, - }); - return response.permissions; - } - - public async getPermissions(address = this.signerAddress): Promise { - return this.queryContractSmart(this.cw1ContractAddress, { - permissions: { spender: address }, - }); - } - - public async addAdmin(address: string, memo = ""): Promise { - const admins = await this.getAdmins(); - const newAdmins = admins.includes(address) ? admins : [...admins, address]; - return this.setAdmins(newAdmins, memo); - } - - public async removeAdmin(address: string, memo = ""): Promise { - const admins = await this.getAdmins(); - const newAdmins = admins.filter((admin) => admin !== address); - return this.setAdmins(newAdmins, memo); - } - - public async increaseAllowance( - address: string, - amount: Coin, - expires?: Expiration, - memo = "", - ): Promise { - const handleMsg = { - increase_allowance: { - spender: address, - amount: amount, - expires: expires, - }, - }; - return this.execute(this.cw1ContractAddress, handleMsg, memo); - } - - public async decreaseAllowance( - address: string, - amount: Coin, - expires?: Expiration, - memo = "", - ): Promise { - const handleMsg = { - decrease_allowance: { - spender: address, - amount: amount, - expires: expires, - }, - }; - return this.execute(this.cw1ContractAddress, handleMsg, memo); - } - - public async setPermissions( - address: string, - permissions: Cw1SubkeyPermissions, - memo = "", - ): Promise { - const handleMsg = { - set_permissions: { - spender: address, - permissions: permissions, - }, - }; - return this.execute(this.cw1ContractAddress, handleMsg, memo); - } -} diff --git a/packages/cosmwasm-launchpad/src/cw3cosmwasmclient.spec.ts b/packages/cosmwasm-launchpad/src/cw3cosmwasmclient.spec.ts deleted file mode 100644 index e5cbecce..00000000 --- a/packages/cosmwasm-launchpad/src/cw3cosmwasmclient.spec.ts +++ /dev/null @@ -1,348 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { makeCosmoshubPath, Secp256k1HdWallet } from "@cosmjs/launchpad"; -import { assert } from "@cosmjs/utils"; - -import { Cw3CosmWasmClient, Vote } from "./cw3cosmwasmclient"; -import { - alice, - cw3Enabled, - deployedCw3, - launchpad, - launchpadEnabled, - makeRandomAddress, - pendingWithoutCw3, - pendingWithoutLaunchpad, -} from "./testutils.spec"; - -describe("Cw3CosmWasmClient", () => { - describe("constructor", () => { - it("can be constructed", async () => { - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw3CosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw3.instances[0], - ); - expect(client).toBeTruthy(); - }); - }); - - describe("queries", () => { - const contractAddress = deployedCw3.instances[0]; - const toAddress = makeRandomAddress(); - const msg = { - bank: { - send: { - from_address: contractAddress, - to_address: toAddress, - amount: [ - { - amount: "1", - denom: "ucosm", - }, - ], - }, - }, - }; - let proposalId: number | undefined; - let expirationHeight: number | undefined; - - beforeAll(async () => { - if (launchpadEnabled() && cw3Enabled()) { - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw3CosmWasmClient(launchpad.endpoint, alice.address0, wallet, contractAddress); - const currentHeight = await client.getHeight(); - expirationHeight = currentHeight + 1; - const { logs } = await client.createMultisigProposal( - "My proposal", - "A proposal to propose proposing proposals", - [msg], - undefined, - { at_height: expirationHeight }, - ); - const wasmEvents = logs[0].events.find((event) => event.type === "wasm"); - assert(wasmEvents, "Wasm events not found in logs"); - const proposalIdAttribute = wasmEvents.attributes.find((log) => log.key === "proposal_id"); - assert(proposalIdAttribute, "Proposal ID not found in logs"); - proposalId = parseInt(proposalIdAttribute.value, 10); - } - }); - - it("getThreshold", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw3(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw3CosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - deployedCw3.instances[0], - ); - const result = await client.getThreshold(); - - expect(result).toEqual({ absolute_count: { weight_needed: 1, total_weight: 3 } }); - }); - - it("getProposal", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw3(); - assert(proposalId, "value must be set in beforeAll()"); - assert(expirationHeight, "value must be set in beforeAll()"); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw3CosmWasmClient(launchpad.endpoint, alice.address0, wallet, contractAddress); - const result = await client.getProposal(proposalId); - - expect(result).toEqual({ - id: proposalId, - title: "My proposal", - description: "A proposal to propose proposing proposals", - msgs: [msg], - expires: { at_height: expirationHeight }, - status: "passed", - }); - }); - - it("listProposals", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw3(); - assert(proposalId, "value must be set in beforeAll()"); - assert(expirationHeight, "value must be set in beforeAll()"); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw3CosmWasmClient(launchpad.endpoint, alice.address0, wallet, contractAddress); - const result = await client.listProposals({ startAfter: proposalId - 1, limit: 1 }); - - expect(result).toEqual({ - proposals: [ - { - id: proposalId, - title: "My proposal", - description: "A proposal to propose proposing proposals", - msgs: [msg], - expires: { at_height: expirationHeight }, - status: "passed", - }, - ], - }); - }); - - it("reverseProposals", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw3(); - assert(proposalId, "value must be set in beforeAll()"); - assert(expirationHeight, "value must be set in beforeAll()"); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw3CosmWasmClient(launchpad.endpoint, alice.address0, wallet, contractAddress); - const result = await client.reverseProposals({ limit: 1 }); - - expect(result).toEqual({ - proposals: [ - { - id: proposalId, - title: "My proposal", - description: "A proposal to propose proposing proposals", - msgs: [msg], - expires: { at_height: expirationHeight }, - status: "passed", - }, - ], - }); - }); - - it("getVote", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw3(); - assert(proposalId, "value must be set in beforeAll()"); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw3CosmWasmClient(launchpad.endpoint, alice.address0, wallet, contractAddress); - const result = await client.getVote(proposalId, alice.address0); - - expect(result).toEqual({ vote: Vote.Yes }); - }); - - it("listVotes", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw3(); - assert(proposalId, "value must be set in beforeAll()"); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw3CosmWasmClient(launchpad.endpoint, alice.address0, wallet, contractAddress); - const result = await client.listVotes(proposalId); - - expect(result).toEqual({ votes: [{ voter: alice.address0, vote: Vote.Yes, weight: 1 }] }); - }); - - it("getVoter", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw3(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw3CosmWasmClient(launchpad.endpoint, alice.address0, wallet, contractAddress); - const result = await client.getVoter(alice.address0); - - expect(result).toEqual({ addr: alice.address0, weight: 1 }); - }); - - it("listVoters", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw3(); - - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw3CosmWasmClient(launchpad.endpoint, alice.address0, wallet, contractAddress); - const result = await client.listVoters(); - - expect(result.voters.length).toEqual(3); - expect(result.voters).toEqual( - jasmine.arrayContaining([ - { addr: alice.address0, weight: 1 }, - { addr: alice.address1, weight: 1 }, - { addr: alice.address2, weight: 1 }, - ]), - ); - }); - }); - - describe("Proposal lifecycle", () => { - it("proposal is accepted (proposer has enough weight alone)", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw3(); - const contractAddress = deployedCw3.instances[0]; - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new Cw3CosmWasmClient(launchpad.endpoint, alice.address0, wallet, contractAddress); - const toAddress = makeRandomAddress(); - const msg = { - bank: { - send: { - from_address: contractAddress, - to_address: toAddress, - amount: [ - { - amount: "1", - denom: "ucosm", - }, - ], - }, - }, - }; - await client.createMultisigProposal("My proposal", "A proposal to propose proposing proposals", [msg]); - const { proposals } = await client.reverseProposals({ limit: 1 }); - const proposalId = proposals[0].id; - const executeResult = await client.executeMultisigProposal(proposalId); - expect(executeResult).toBeTruthy(); - }); - - it("proposal is accepted (proposer does not have enough weight alone)", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw3(); - const contractAddress = deployedCw3.instances[1]; - const proposerWallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const proposer = new Cw3CosmWasmClient( - launchpad.endpoint, - alice.address0, - proposerWallet, - contractAddress, - ); - const voterWallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { - hdPaths: [makeCosmoshubPath(1)], - }); - const voter = new Cw3CosmWasmClient(launchpad.endpoint, alice.address1, voterWallet, contractAddress); - const toAddress = makeRandomAddress(); - const msg = { - bank: { - send: { - from_address: contractAddress, - to_address: toAddress, - amount: [ - { - amount: "1", - denom: "ucosm", - }, - ], - }, - }, - }; - await proposer.createMultisigProposal("My proposal", "A proposal to propose proposing proposals", [ - msg, - ]); - const { proposals } = await voter.reverseProposals({ limit: 1 }); - const proposalId = proposals[0].id; - - await expectAsync(proposer.executeMultisigProposal(proposalId)).toBeRejectedWithError( - /proposal must have passed and not yet been executed/i, - ); - - const voteResult = await voter.voteMultisigProposal(proposalId, Vote.Yes); - expect(voteResult).toBeTruthy(); - - const executeResult = await proposer.executeMultisigProposal(proposalId); - expect(executeResult).toBeTruthy(); - }); - - it("proposal is rejected", async () => { - pendingWithoutLaunchpad(); - pendingWithoutCw3(); - const contractAddress = deployedCw3.instances[1]; - const proposerWallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const proposer = new Cw3CosmWasmClient( - launchpad.endpoint, - alice.address0, - proposerWallet, - contractAddress, - ); - const voter1Wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { - hdPaths: [makeCosmoshubPath(1)], - }); - const voter1 = new Cw3CosmWasmClient(launchpad.endpoint, alice.address1, voter1Wallet, contractAddress); - const voter2Wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { - hdPaths: [makeCosmoshubPath(2)], - }); - const voter2 = new Cw3CosmWasmClient(launchpad.endpoint, alice.address2, voter2Wallet, contractAddress); - const toAddress = makeRandomAddress(); - const msg = { - bank: { - send: { - from_address: contractAddress, - to_address: toAddress, - amount: [ - { - amount: "1", - denom: "ucosm", - }, - ], - }, - }, - }; - const currentHeight = await proposer.getHeight(); - await proposer.createMultisigProposal( - "My proposal", - "A proposal to propose proposing proposals", - [msg], - { - at_height: currentHeight, - }, - { - at_height: currentHeight + 5, - }, - ); - const { proposals } = await voter1.reverseProposals({ limit: 1 }); - const proposalId = proposals[0].id; - - const vote1Result = await voter1.voteMultisigProposal(proposalId, Vote.Abstain); - expect(vote1Result).toBeTruthy(); - const vote2Result = await voter2.voteMultisigProposal(proposalId, Vote.No); - expect(vote2Result).toBeTruthy(); - - await expectAsync(proposer.executeMultisigProposal(proposalId)).toBeRejectedWithError( - /proposal must have passed and not yet been executed/i, - ); - - const closeResult = await proposer.closeMultisigProposal(proposalId); - expect(closeResult).toBeTruthy(); - }); - }); -}); diff --git a/packages/cosmwasm-launchpad/src/cw3cosmwasmclient.ts b/packages/cosmwasm-launchpad/src/cw3cosmwasmclient.ts deleted file mode 100644 index 8799eb18..00000000 --- a/packages/cosmwasm-launchpad/src/cw3cosmwasmclient.ts +++ /dev/null @@ -1,201 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { BroadcastMode, GasLimits, GasPrice, OfflineSigner } from "@cosmjs/launchpad"; - -import { CosmosMsg } from "./cosmosmsg"; -import { Account } from "./cosmwasmclient"; -import { Expiration } from "./interfaces"; -import { CosmWasmFeeTable, ExecuteResult, SigningCosmWasmClient } from "./signingcosmwasmclient"; - -/** - * @see https://github.com/CosmWasm/cosmwasm-plus/blob/v0.3.2/packages/cw3/src/msg.rs#L35 - */ -export enum Vote { - Yes = "yes", - No = "no", - Abstain = "abstain", - Veto = "veto", -} - -export interface ThresholdResult { - readonly absolute_count: { - readonly weight_needed: number; - readonly total_weight: number; - }; -} - -export interface ProposalResult { - readonly id: number; - readonly title: string; - readonly description: string; - readonly msgs: readonly CosmosMsg[]; - readonly expires: Expiration; - readonly status: string; -} - -export interface ProposalsResult { - readonly proposals: readonly ProposalResult[]; -} - -export interface VoteResult { - readonly vote: Vote; -} - -export interface VotesResult { - readonly votes: ReadonlyArray<{ readonly vote: Vote; readonly voter: string; readonly weight: number }>; -} - -export interface VoterResult { - readonly addr: string; - readonly weight: number; -} - -export interface VotersResult { - readonly voters: readonly VoterResult[]; -} - -interface StartBeforeNumberPaginationOptions { - readonly startBefore?: number; - readonly limit?: number; -} - -interface StartAfterNumberPaginationOptions { - readonly startAfter?: number; - readonly limit?: number; -} - -interface StartAfterStringPaginationOptions { - readonly startAfter?: string; - readonly limit?: number; -} - -export class Cw3CosmWasmClient extends SigningCosmWasmClient { - public readonly cw3ContractAddress: string; - - public constructor( - apiUrl: string, - signerAddress: string, - signer: OfflineSigner, - cw3ContractAddress: string, - gasPrice?: GasPrice, - gasLimits?: Partial>, - broadcastMode?: BroadcastMode, - ) { - super(apiUrl, signerAddress, signer, gasPrice, gasLimits, broadcastMode); - this.cw3ContractAddress = cw3ContractAddress; - } - - public override getAccount(address?: string): Promise { - return super.getAccount(address || this.cw3ContractAddress); - } - - public getThreshold(): Promise { - return this.queryContractSmart(this.cw3ContractAddress, { threshold: {} }); - } - - public getProposal(proposalId: number): Promise { - return this.queryContractSmart(this.cw3ContractAddress, { proposal: { proposal_id: proposalId } }); - } - - public listProposals({ - startAfter, - limit, - }: StartAfterNumberPaginationOptions = {}): Promise { - return this.queryContractSmart(this.cw3ContractAddress, { - list_proposals: { - start_after: startAfter, - limit: limit, - }, - }); - } - - public reverseProposals({ - startBefore, - limit, - }: StartBeforeNumberPaginationOptions = {}): Promise { - return this.queryContractSmart(this.cw3ContractAddress, { - reverse_proposals: { - start_before: startBefore, - limit: limit, - }, - }); - } - - public getVote(proposalId: number, voter: string): Promise { - return this.queryContractSmart(this.cw3ContractAddress, { - vote: { - proposal_id: proposalId, - voter: voter, - }, - }); - } - - public listVotes( - proposalId: number, - { startAfter, limit }: StartAfterStringPaginationOptions = {}, - ): Promise { - return this.queryContractSmart(this.cw3ContractAddress, { - list_votes: { - proposal_id: proposalId, - start_after: startAfter, - limit: limit, - }, - }); - } - - public getVoter(address: string): Promise { - return this.queryContractSmart(this.cw3ContractAddress, { - voter: { - address: address, - }, - }); - } - - public listVoters({ startAfter, limit }: StartAfterStringPaginationOptions = {}): Promise { - return this.queryContractSmart(this.cw3ContractAddress, { - list_voters: { - start_after: startAfter, - limit: limit, - }, - }); - } - - public createMultisigProposal( - title: string, - description: string, - msgs: readonly CosmosMsg[], - earliest?: Expiration, - latest?: Expiration, - memo = "", - ): Promise { - const handleMsg = { - propose: { - title: title, - description: description, - msgs: msgs, - earliest: earliest, - latest: latest, - }, - }; - return this.execute(this.cw3ContractAddress, handleMsg, memo); - } - - public voteMultisigProposal(proposalId: number, vote: Vote, memo = ""): Promise { - const handleMsg = { - vote: { - proposal_id: proposalId, - vote: vote, - }, - }; - return this.execute(this.cw3ContractAddress, handleMsg, memo); - } - - public executeMultisigProposal(proposalId: number, memo = ""): Promise { - const handleMsg = { execute: { proposal_id: proposalId } }; - return this.execute(this.cw3ContractAddress, handleMsg, memo); - } - - public closeMultisigProposal(proposalId: number, memo = ""): Promise { - const handleMsg = { close: { proposal_id: proposalId } }; - return this.execute(this.cw3ContractAddress, handleMsg, memo); - } -} diff --git a/packages/cosmwasm-launchpad/src/index.ts b/packages/cosmwasm-launchpad/src/index.ts deleted file mode 100644 index 051d36bc..00000000 --- a/packages/cosmwasm-launchpad/src/index.ts +++ /dev/null @@ -1,59 +0,0 @@ -export { isValidBuilder } from "./builder"; -export { Expiration } from "./interfaces"; -export { setupWasmExtension, WasmExtension } from "./lcdapi/wasm"; - -export { BankMsg, CosmosMsg, CustomMsg, StakingMsg, WasmMsg } from "./cosmosmsg"; -export { - Account, - Block, - BlockHeader, - Code, - CodeDetails, - Contract, - ContractCodeHistoryEntry, - CosmWasmClient, - GetSequenceResult, - SearchByHeightQuery, - SearchBySentFromOrToQuery, - SearchByTagsQuery, - SearchTxQuery, - SearchTxFilter, -} from "./cosmwasmclient"; -export { Cw1CosmWasmClient } from "./cw1cosmwasmclient"; -export { - Cw3CosmWasmClient, - ProposalResult, - ProposalsResult, - ThresholdResult, - Vote, - VoteResult, - VotesResult, - VoterResult, - VotersResult, -} from "./cw3cosmwasmclient"; -export { - ChangeAdminResult, - ExecuteResult, - CosmWasmFeeTable, - InstantiateOptions, - InstantiateResult, - MigrateResult, - SigningCosmWasmClient, - UploadMeta, - UploadResult, -} from "./signingcosmwasmclient"; -export { - isMsgClearAdmin, - isMsgExecuteContract, - isMsgInstantiateContract, - isMsgMigrateContract, - isMsgUpdateAdmin, - isMsgStoreCode, - MsgClearAdmin, - MsgExecuteContract, - MsgInstantiateContract, - MsgMigrateContract, - MsgUpdateAdmin, - MsgStoreCode, -} from "./msgs"; -export { JsonObject, parseWasmData, WasmData } from "./types"; diff --git a/packages/cosmwasm-launchpad/src/interfaces/cw0.ts b/packages/cosmwasm-launchpad/src/interfaces/cw0.ts deleted file mode 100644 index 17d098dd..00000000 --- a/packages/cosmwasm-launchpad/src/interfaces/cw0.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ - -/** - * @see https://github.com/CosmWasm/cosmwasm-plus/blob/v0.3.2/packages/cw0/src/expiration.rs#L14 - */ -export type Expiration = - | { - readonly at_height: number; - } - | { - readonly at_time: number; - } - | { - readonly never: Record; - }; diff --git a/packages/cosmwasm-launchpad/src/interfaces/index.ts b/packages/cosmwasm-launchpad/src/interfaces/index.ts deleted file mode 100644 index b91ff756..00000000 --- a/packages/cosmwasm-launchpad/src/interfaces/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { Expiration } from "./cw0"; diff --git a/packages/cosmwasm-launchpad/src/lcdapi/wasm.spec.ts b/packages/cosmwasm-launchpad/src/lcdapi/wasm.spec.ts deleted file mode 100644 index cc1810d8..00000000 --- a/packages/cosmwasm-launchpad/src/lcdapi/wasm.spec.ts +++ /dev/null @@ -1,547 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { sha256 } from "@cosmjs/crypto"; -import { Bech32, fromAscii, fromHex, fromUtf8, toAscii, toBase64, toHex } from "@cosmjs/encoding"; -import { - assertIsBroadcastTxSuccess, - AuthExtension, - BroadcastTxResult, - BroadcastTxsResponse, - Coin, - coin, - coins, - LcdClient, - logs, - makeSignDoc, - makeStdTx, - OfflineSigner, - Secp256k1HdWallet, - setupAuthExtension, - SigningCosmosClient, - StdFee, -} from "@cosmjs/launchpad"; -import { assert } from "@cosmjs/utils"; - -import { - isMsgInstantiateContract, - isMsgStoreCode, - MsgExecuteContract, - MsgInstantiateContract, - MsgStoreCode, -} from "../msgs"; -import { - alice, - base64Matcher, - bech32AddressMatcher, - ContractUploadInstructions, - deployedHackatom, - fromOneElementArray, - getHackatom, - launchpad, - launchpadEnabled, - makeRandomAddress, - pendingWithoutLaunchpad, -} from "../testutils.spec"; -import { setupWasmExtension, WasmExtension } from "./wasm"; - -type WasmClient = LcdClient & AuthExtension & WasmExtension; - -function makeWasmClient(apiUrl: string): WasmClient { - return LcdClient.withExtensions({ apiUrl }, setupAuthExtension, setupWasmExtension); -} - -async function uploadContract( - signer: OfflineSigner, - contract: ContractUploadInstructions, -): Promise { - const memo = "My first contract on chain"; - const theMsg: MsgStoreCode = { - type: "wasm/MsgStoreCode", - value: { - sender: alice.address0, - wasm_byte_code: toBase64(contract.data), - source: contract.source || "", - builder: contract.builder || "", - }, - }; - const fee: StdFee = { - amount: coins(5000000, "ucosm"), - gas: "89000000", - }; - - const firstAddress = (await signer.getAccounts())[0].address; - const client = new SigningCosmosClient(launchpad.endpoint, firstAddress, signer); - return client.signAndBroadcast([theMsg], fee, memo); -} - -async function instantiateContract( - signer: OfflineSigner, - codeId: number, - beneficiaryAddress: string, - funds?: readonly Coin[], -): Promise { - const memo = "Create an escrow instance"; - const theMsg: MsgInstantiateContract = { - type: "wasm/MsgInstantiateContract", - value: { - sender: alice.address0, - code_id: codeId.toString(), - label: "my escrow", - init_msg: { - verifier: alice.address0, - beneficiary: beneficiaryAddress, - }, - init_funds: funds || [], - }, - }; - const fee: StdFee = { - amount: coins(5000000, "ucosm"), - gas: "89000000", - }; - - const firstAddress = (await signer.getAccounts())[0].address; - const client = new SigningCosmosClient(launchpad.endpoint, firstAddress, signer); - return client.signAndBroadcast([theMsg], fee, memo); -} - -async function executeContract( - client: WasmClient, - signer: OfflineSigner, - contractAddress: string, - msg: Record, -): Promise { - const memo = "Time for action"; - const theMsg: MsgExecuteContract = { - type: "wasm/MsgExecuteContract", - value: { - sender: alice.address0, - contract: contractAddress, - msg: msg, - sent_funds: [], - }, - }; - const fee: StdFee = { - amount: coins(5000000, "ucosm"), - gas: "89000000", - }; - - const { account_number, sequence } = (await client.auth.account(alice.address0)).result.value; - const signDoc = makeSignDoc([theMsg], fee, launchpad.chainId, memo, account_number, sequence); - const { signed, signature } = await signer.signAmino(alice.address0, signDoc); - const signedTx = makeStdTx(signed, signature); - return client.broadcastTx(signedTx); -} - -describe("WasmExtension", () => { - const hackatom = getHackatom(); - const hackatomConfigKey = toAscii("config"); - let hackatomCodeId: number | undefined; - let hackatomContractAddress: string | undefined; - - beforeAll(async () => { - if (launchpadEnabled()) { - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const result = await uploadContract(wallet, hackatom); - assertIsBroadcastTxSuccess(result); - const parsedLogs = logs.parseLogs(result.logs); - const codeIdAttr = logs.findAttribute(parsedLogs, "message", "code_id"); - hackatomCodeId = Number.parseInt(codeIdAttr.value, 10); - - const instantiateResult = await instantiateContract(wallet, hackatomCodeId, makeRandomAddress()); - assertIsBroadcastTxSuccess(instantiateResult); - const instantiateLogs = logs.parseLogs(instantiateResult.logs); - const contractAddressAttr = logs.findAttribute(instantiateLogs, "message", "contract_address"); - hackatomContractAddress = contractAddressAttr.value; - } - }); - - describe("listCodeInfo", () => { - it("has recently uploaded contract as last entry", async () => { - pendingWithoutLaunchpad(); - assert(hackatomCodeId); - const client = makeWasmClient(launchpad.endpoint); - const codesList = await client.wasm.listCodeInfo(); - const lastCode = codesList[codesList.length - 1]; - expect(lastCode.id).toEqual(hackatomCodeId); - expect(lastCode.creator).toEqual(alice.address0); - expect(lastCode.source).toEqual(hackatom.source); - expect(lastCode.builder).toEqual(hackatom.builder); - expect(lastCode.data_hash.toLowerCase()).toEqual(toHex(sha256(hackatom.data))); - }); - }); - - describe("getCode", () => { - it("contains fill code information", async () => { - pendingWithoutLaunchpad(); - assert(hackatomCodeId); - const client = makeWasmClient(launchpad.endpoint); - const code = await client.wasm.getCode(hackatomCodeId); - expect(code.id).toEqual(hackatomCodeId); - expect(code.creator).toEqual(alice.address0); - expect(code.source).toEqual(hackatom.source); - expect(code.builder).toEqual(hackatom.builder); - expect(code.data_hash.toLowerCase()).toEqual(toHex(sha256(hackatom.data))); - expect(code.data).toEqual(toBase64(hackatom.data)); - }); - }); - - // TODO: move listContractsByCodeId tests out of here - describe("getContractInfo", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - assert(hackatomCodeId); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = makeWasmClient(launchpad.endpoint); - - // create new instance and compare before and after - const existingContractsByCode = await client.wasm.listContractsByCodeId(hackatomCodeId); - for (const contract of existingContractsByCode) { - expect(contract.address).toMatch(bech32AddressMatcher); - expect(contract.code_id).toEqual(hackatomCodeId); - expect(contract.creator).toMatch(bech32AddressMatcher); - expect(contract.label).toMatch(/^.+$/); - } - - const beneficiaryAddress = makeRandomAddress(); - const funds = coins(707707, "ucosm"); - const result = await instantiateContract(wallet, hackatomCodeId, beneficiaryAddress, funds); - assertIsBroadcastTxSuccess(result); - const parsedLogs = logs.parseLogs(result.logs); - const contractAddressAttr = logs.findAttribute(parsedLogs, "message", "contract_address"); - const myAddress = contractAddressAttr.value; - - const newContractsByCode = await client.wasm.listContractsByCodeId(hackatomCodeId); - expect(newContractsByCode.length).toEqual(existingContractsByCode.length + 1); - const newContract = newContractsByCode[newContractsByCode.length - 1]; - expect(newContract).toEqual( - jasmine.objectContaining({ - code_id: hackatomCodeId, - creator: alice.address0, - label: "my escrow", - }), - ); - - const info = await client.wasm.getContractInfo(myAddress); - assert(info); - expect(info).toEqual( - jasmine.objectContaining({ - code_id: hackatomCodeId, - creator: alice.address0, - label: "my escrow", - }), - ); - expect(info.admin).toBeUndefined(); - }); - - it("returns null for non-existent address", async () => { - pendingWithoutLaunchpad(); - assert(hackatomCodeId); - const client = makeWasmClient(launchpad.endpoint); - const nonExistentAddress = makeRandomAddress(); - const info = await client.wasm.getContractInfo(nonExistentAddress); - expect(info).toBeNull(); - }); - }); - - describe("getContractCodeHistory", () => { - it("can list contract history", async () => { - pendingWithoutLaunchpad(); - assert(hackatomCodeId); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = makeWasmClient(launchpad.endpoint); - - // create new instance and compare before and after - const beneficiaryAddress = makeRandomAddress(); - const funds = coins(707707, "ucosm"); - const result = await instantiateContract(wallet, hackatomCodeId, beneficiaryAddress, funds); - assertIsBroadcastTxSuccess(result); - const parsedLogs = logs.parseLogs(result.logs); - const contractAddressAttr = logs.findAttribute(parsedLogs, "message", "contract_address"); - const myAddress = contractAddressAttr.value; - - const history = await client.wasm.getContractCodeHistory(myAddress); - assert(history); - expect(history).toContain({ - code_id: hackatomCodeId, - operation: "Init", - msg: { - verifier: alice.address0, - beneficiary: beneficiaryAddress, - }, - }); - }); - - it("returns null for non-existent address", async () => { - pendingWithoutLaunchpad(); - assert(hackatomCodeId); - const client = makeWasmClient(launchpad.endpoint); - const nonExistentAddress = makeRandomAddress(); - const history = await client.wasm.getContractCodeHistory(nonExistentAddress); - expect(history).toBeNull(); - }); - }); - - describe("getAllContractState", () => { - it("can get all state", async () => { - pendingWithoutLaunchpad(); - assert(hackatomContractAddress); - const client = makeWasmClient(launchpad.endpoint); - const state = await client.wasm.getAllContractState(hackatomContractAddress); - expect(state.length).toEqual(1); - const data = state[0]; - expect(data.key).toEqual(hackatomConfigKey); - const value = JSON.parse(fromUtf8(data.val)); - expect(value.verifier).toMatch(base64Matcher); - expect(value.beneficiary).toMatch(base64Matcher); - }); - - it("is empty for non-existent address", async () => { - pendingWithoutLaunchpad(); - const client = makeWasmClient(launchpad.endpoint); - const nonExistentAddress = makeRandomAddress(); - const state = await client.wasm.getAllContractState(nonExistentAddress); - expect(state).toEqual([]); - }); - }); - - describe("queryContractRaw", () => { - it("can query by key", async () => { - pendingWithoutLaunchpad(); - assert(hackatomContractAddress); - const client = makeWasmClient(launchpad.endpoint); - const raw = await client.wasm.queryContractRaw(hackatomContractAddress, hackatomConfigKey); - assert(raw, "must get result"); - const model = JSON.parse(fromAscii(raw)); - expect(model.verifier).toMatch(base64Matcher); - expect(model.beneficiary).toMatch(base64Matcher); - }); - - it("returns null for missing key", async () => { - pendingWithoutLaunchpad(); - assert(hackatomContractAddress); - const client = makeWasmClient(launchpad.endpoint); - const info = await client.wasm.queryContractRaw(hackatomContractAddress, fromHex("cafe0dad")); - expect(info).toBeNull(); - }); - - it("returns null for non-existent address", async () => { - pendingWithoutLaunchpad(); - const client = makeWasmClient(launchpad.endpoint); - const nonExistentAddress = makeRandomAddress(); - const info = await client.wasm.queryContractRaw(nonExistentAddress, hackatomConfigKey); - expect(info).toBeNull(); - }); - }); - - describe("queryContractSmart", () => { - it("can make smart queries", async () => { - pendingWithoutLaunchpad(); - assert(hackatomContractAddress); - const client = makeWasmClient(launchpad.endpoint); - const request = { verifier: {} }; - const response = await client.wasm.queryContractSmart(hackatomContractAddress, request); - expect(response).toEqual({ verifier: alice.address0 }); - }); - - it("throws for invalid query requests", async () => { - pendingWithoutLaunchpad(); - assert(hackatomContractAddress); - const client = makeWasmClient(launchpad.endpoint); - const request = { nosuchkey: {} }; - await client.wasm.queryContractSmart(hackatomContractAddress, request).then( - () => fail("shouldn't succeed"), - (error) => - expect(error).toMatch( - /query wasm contract failed: Error parsing into type hackatom::contract::QueryMsg: unknown variant/, - ), - ); - }); - - it("throws for non-existent address", async () => { - pendingWithoutLaunchpad(); - const client = makeWasmClient(launchpad.endpoint); - const nonExistentAddress = makeRandomAddress(); - const request = { verifier: {} }; - await client.wasm.queryContractSmart(nonExistentAddress, request).then( - () => fail("shouldn't succeed"), - (error) => expect(error).toMatch("not found"), - ); - }); - }); - - describe("txsQuery", () => { - it("can query by tags (module + code_id)", async () => { - pendingWithoutLaunchpad(); - const client = makeWasmClient(launchpad.endpoint); - const result = await client.txsQuery(`message.module=wasm&message.code_id=${deployedHackatom.codeId}`); - expect(parseInt(result.count, 10)).toBeGreaterThanOrEqual(4); - - // Check first 4 results - const [store, zero, one, two] = result.txs.map((tx) => fromOneElementArray(tx.tx.value.msg)); - assert(isMsgStoreCode(store)); - assert(isMsgInstantiateContract(zero)); - assert(isMsgInstantiateContract(one)); - assert(isMsgInstantiateContract(two)); - expect(store.value).toEqual( - jasmine.objectContaining({ - sender: alice.address0, - source: deployedHackatom.source, - builder: deployedHackatom.builder, - }), - ); - expect(zero.value).toEqual({ - code_id: deployedHackatom.codeId.toString(), - init_funds: [], - init_msg: jasmine.objectContaining({ - beneficiary: deployedHackatom.instances[0].beneficiary, - }), - label: deployedHackatom.instances[0].label, - sender: alice.address0, - }); - expect(one.value).toEqual({ - code_id: deployedHackatom.codeId.toString(), - init_funds: [], - init_msg: jasmine.objectContaining({ - beneficiary: deployedHackatom.instances[1].beneficiary, - }), - label: deployedHackatom.instances[1].label, - sender: alice.address0, - }); - expect(two.value).toEqual({ - code_id: deployedHackatom.codeId.toString(), - init_funds: [], - init_msg: jasmine.objectContaining({ - beneficiary: deployedHackatom.instances[2].beneficiary, - }), - label: deployedHackatom.instances[2].label, - sender: alice.address0, - admin: alice.address1, - }); - }); - - // Like previous test but filtered by message.action=store-code and message.action=instantiate - it("can query by tags (module + code_id + action)", async () => { - pendingWithoutLaunchpad(); - const client = makeWasmClient(launchpad.endpoint); - - { - const uploads = await client.txsQuery( - `message.module=wasm&message.code_id=${deployedHackatom.codeId}&message.action=store-code`, - ); - expect(parseInt(uploads.count, 10)).toEqual(1); - const store = fromOneElementArray(uploads.txs[0].tx.value.msg); - assert(isMsgStoreCode(store)); - expect(store.value).toEqual( - jasmine.objectContaining({ - sender: alice.address0, - source: deployedHackatom.source, - builder: deployedHackatom.builder, - }), - ); - } - - { - const instantiations = await client.txsQuery( - `message.module=wasm&message.code_id=${deployedHackatom.codeId}&message.action=instantiate`, - ); - expect(parseInt(instantiations.count, 10)).toBeGreaterThanOrEqual(3); - const [zero, one, two] = instantiations.txs.map((tx) => fromOneElementArray(tx.tx.value.msg)); - assert(isMsgInstantiateContract(zero)); - assert(isMsgInstantiateContract(one)); - assert(isMsgInstantiateContract(two)); - expect(zero.value).toEqual({ - code_id: deployedHackatom.codeId.toString(), - init_funds: [], - init_msg: jasmine.objectContaining({ - beneficiary: deployedHackatom.instances[0].beneficiary, - }), - label: deployedHackatom.instances[0].label, - sender: alice.address0, - }); - expect(one.value).toEqual({ - code_id: deployedHackatom.codeId.toString(), - init_funds: [], - init_msg: jasmine.objectContaining({ - beneficiary: deployedHackatom.instances[1].beneficiary, - }), - label: deployedHackatom.instances[1].label, - sender: alice.address0, - }); - expect(two.value).toEqual({ - code_id: deployedHackatom.codeId.toString(), - init_funds: [], - init_msg: jasmine.objectContaining({ - beneficiary: deployedHackatom.instances[2].beneficiary, - }), - label: deployedHackatom.instances[2].label, - sender: alice.address0, - admin: alice.address1, - }); - } - }); - }); - - describe("broadcastTx", () => { - it("can upload, instantiate and execute wasm", async () => { - pendingWithoutLaunchpad(); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = makeWasmClient(launchpad.endpoint); - - let codeId: number; - - // upload - { - // console.log("Raw log:", result.raw_log); - const result = await uploadContract(wallet, getHackatom()); - assertIsBroadcastTxSuccess(result); - const parsedLogs = logs.parseLogs(result.logs); - const codeIdAttr = logs.findAttribute(parsedLogs, "message", "code_id"); - codeId = Number.parseInt(codeIdAttr.value, 10); - expect(codeId).toBeGreaterThanOrEqual(1); - expect(codeId).toBeLessThanOrEqual(200); - expect(result.data).toEqual(toAscii(`${codeId}`)); - } - - const funds = [coin(1234, "ucosm"), coin(321, "ustake")]; - const beneficiaryAddress = makeRandomAddress(); - let contractAddress: string; - - // instantiate - { - const result = await instantiateContract(wallet, codeId, beneficiaryAddress, funds); - assertIsBroadcastTxSuccess(result); - // console.log("Raw log:", result.raw_log); - const parsedLogs = logs.parseLogs(result.logs); - const contractAddressAttr = logs.findAttribute(parsedLogs, "message", "contract_address"); - contractAddress = contractAddressAttr.value; - const amountAttr = logs.findAttribute(parsedLogs, "transfer", "amount"); - expect(amountAttr.value).toEqual("1234ucosm,321ustake"); - expect(result.data).toEqual(Bech32.decode(contractAddress).data); - - const balance = (await client.auth.account(contractAddress)).result.value.coins; - expect(balance).toEqual(funds); - } - - // execute - { - const result = await executeContract(client, wallet, contractAddress, { release: {} }); - assert(!result.code); - expect(result.data).toEqual("F00BAA"); - // console.log("Raw log:", result.logs); - const parsedLogs = logs.parseLogs(result.logs); - const wasmEvent = parsedLogs.find(() => true)?.events.find((e) => e.type === "wasm"); - assert(wasmEvent, "Event of type wasm expected"); - expect(wasmEvent.attributes).toContain({ key: "action", value: "release" }); - expect(wasmEvent.attributes).toContain({ - key: "destination", - value: beneficiaryAddress, - }); - - // Verify token transfer from contract to beneficiary - const beneficiaryBalance = (await client.auth.account(beneficiaryAddress)).result.value.coins; - expect(beneficiaryBalance).toEqual(funds); - const contractBalance = (await client.auth.account(contractAddress)).result.value.coins; - expect(contractBalance).toEqual([]); - } - }); - }); -}); diff --git a/packages/cosmwasm-launchpad/src/lcdapi/wasm.ts b/packages/cosmwasm-launchpad/src/lcdapi/wasm.ts deleted file mode 100644 index 173249f0..00000000 --- a/packages/cosmwasm-launchpad/src/lcdapi/wasm.ts +++ /dev/null @@ -1,181 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { fromBase64, fromUtf8, toHex, toUtf8 } from "@cosmjs/encoding"; -import { LcdApiArray, LcdClient, normalizeLcdApiArray } from "@cosmjs/launchpad"; - -import { JsonObject, Model, parseWasmData, WasmData } from "../types"; - -type WasmResponse = WasmSuccess | WasmError; - -interface WasmSuccess { - readonly height: string; - readonly result: T; -} - -interface WasmError { - readonly error: string; -} - -export interface CodeInfo { - readonly id: number; - /** Bech32 account address */ - readonly creator: string; - /** Hex-encoded sha256 hash of the code stored here */ - readonly data_hash: string; - /** - * An URL to a .tar.gz archive of the source code of the contract, which can be used to reproducibly build the Wasm bytecode. - * - * @see https://github.com/CosmWasm/cosmwasm-verify - */ - readonly source?: string; - /** - * A docker image (including version) to reproducibly build the Wasm bytecode from the source code. - * - * @example ```cosmwasm/rust-optimizer:0.8.0``` - * @see https://github.com/CosmWasm/cosmwasm-verify - */ - readonly builder?: string; -} - -export interface CodeDetails extends CodeInfo { - /** Base64 encoded raw wasm data */ - readonly data: string; -} - -// This is list view, without contract info -export interface ContractInfo { - readonly address: string; - readonly code_id: number; - /** Bech32 account address */ - readonly creator: string; - /** Bech32-encoded admin address */ - readonly admin?: string; - readonly label: string; -} - -// An entry in the contracts code/ migration history -export interface ContractCodeHistoryEntry { - /** The source of this history entry */ - readonly operation: "Genesis" | "Init" | "Migrate"; - readonly code_id: number; - readonly msg: Record; -} - -interface SmartQueryResponse { - // base64 encoded response - readonly smart: string; -} - -function isWasmError(resp: WasmResponse): resp is WasmError { - return (resp as WasmError).error !== undefined; -} - -function unwrapWasmResponse(response: WasmResponse): T { - if (isWasmError(response)) { - throw new Error(response.error); - } - return response.result; -} - -/** - * @see https://github.com/cosmwasm/wasmd/blob/master/x/wasm/client/rest/query.go#L19-L27 - */ -export interface WasmExtension { - readonly wasm: { - readonly listCodeInfo: () => Promise; - - /** - * Downloads the original wasm bytecode by code ID. - * - * Throws an error if no code with this id - */ - readonly getCode: (id: number) => Promise; - - readonly listContractsByCodeId: (id: number) => Promise; - - /** - * Returns null when contract was not found at this address. - */ - readonly getContractInfo: (address: string) => Promise; - - /** - * Returns null when contract history was not found for this address. - */ - readonly getContractCodeHistory: (address: string) => Promise; - - /** - * Returns all contract state. - * This is an empty array if no such contract, or contract has no data. - */ - readonly getAllContractState: (address: string) => Promise; - - /** - * Returns the data at the key if present (unknown decoded json), - * or null if no data at this (contract address, key) pair - */ - readonly queryContractRaw: (address: string, key: Uint8Array) => Promise; - - /** - * Makes a smart query on the contract and parses the response as JSON. - * Throws error if no such contract exists, the query format is invalid or the response is invalid. - */ - readonly queryContractSmart: (address: string, query: Record) => Promise; - }; -} - -export function setupWasmExtension(base: LcdClient): WasmExtension { - return { - wasm: { - listCodeInfo: async () => { - const path = `/wasm/code`; - const responseData = (await base.get(path)) as WasmResponse>; - return normalizeLcdApiArray(unwrapWasmResponse(responseData)); - }, - getCode: async (id: number) => { - const path = `/wasm/code/${id}`; - const responseData = (await base.get(path)) as WasmResponse; - return unwrapWasmResponse(responseData); - }, - listContractsByCodeId: async (id: number) => { - const path = `/wasm/code/${id}/contracts`; - const responseData = (await base.get(path)) as WasmResponse>; - return normalizeLcdApiArray(unwrapWasmResponse(responseData)); - }, - getContractInfo: async (address: string) => { - const path = `/wasm/contract/${address}`; - const response = (await base.get(path)) as WasmResponse; - return unwrapWasmResponse(response); - }, - getContractCodeHistory: async (address: string) => { - const path = `/wasm/contract/${address}/history`; - const response = (await base.get(path)) as WasmResponse; - return unwrapWasmResponse(response); - }, - getAllContractState: async (address: string) => { - const path = `/wasm/contract/${address}/state`; - const responseData = (await base.get(path)) as WasmResponse>; - return normalizeLcdApiArray(unwrapWasmResponse(responseData)).map(parseWasmData); - }, - queryContractRaw: async (address: string, key: Uint8Array) => { - const hexKey = toHex(key); - const path = `/wasm/contract/${address}/raw/${hexKey}?encoding=hex`; - const responseData = (await base.get(path)) as WasmResponse; - const data = unwrapWasmResponse(responseData); - if (Array.isArray(data)) { - // The CosmWasm 0.10 interface - return data.length === 0 ? null : fromBase64(data[0].val); - } else { - // The CosmWasm 0.11 interface - return !data ? null : fromBase64(data); // Yes, we cannot differentiate empty fields from non-existent fields :( - } - }, - queryContractSmart: async (address: string, query: Record) => { - const encoded = toHex(toUtf8(JSON.stringify(query))); - const path = `/wasm/contract/${address}/smart/${encoded}?encoding=hex`; - const responseData = (await base.get(path)) as WasmResponse; - const result = unwrapWasmResponse(responseData); - // By convention, smart queries must return a valid JSON document (see https://github.com/CosmWasm/cosmwasm/issues/144) - return JSON.parse(fromUtf8(fromBase64(result.smart))); - }, - }, - }; -} diff --git a/packages/cosmwasm-launchpad/src/msgs.ts b/packages/cosmwasm-launchpad/src/msgs.ts deleted file mode 100644 index 02d70e4a..00000000 --- a/packages/cosmwasm-launchpad/src/msgs.ts +++ /dev/null @@ -1,146 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { Coin, Msg } from "@cosmjs/launchpad"; - -// TODO: implement -/** - * @see https://github.com/CosmWasm/wasmd/blob/v0.10.0-alpha/x/wasm/internal/types/params.go#L68-L71 - */ -export type AccessConfig = never; - -/** - * Uploads Wasm code to the chain. - * A numeric, auto-incrementing code ID will be generated as a result of the execution of this message. - * - * @see https://github.com/CosmWasm/wasmd/blob/v0.10.0-alpha/x/wasm/internal/types/msg.go#L10-L20 - */ -export interface MsgStoreCode extends Msg { - readonly type: "wasm/MsgStoreCode"; - readonly value: { - /** Bech32 account address */ - readonly sender: string; - /** Base64 encoded Wasm */ - readonly wasm_byte_code: string; - /** A valid URI reference to the contract's source code. Can be empty. */ - readonly source: string; - /** A docker tag. Can be empty. */ - readonly builder: string; - readonly instantiate_permission?: AccessConfig; - }; -} - -export function isMsgStoreCode(msg: Msg): msg is MsgStoreCode { - return (msg as MsgStoreCode).type === "wasm/MsgStoreCode"; -} - -/** - * Creates an instance of contract that was uploaded before. - * This will trigger a call to the "init" export. - * - * @see https://github.com/CosmWasm/wasmd/blob/v0.9.0-alpha4/x/wasm/internal/types/msg.go#L104 - */ -export interface MsgInstantiateContract extends Msg { - readonly type: "wasm/MsgInstantiateContract"; - readonly value: { - /** Bech32 account address */ - readonly sender: string; - /** ID of the Wasm code that was uploaded before */ - readonly code_id: string; - /** Human-readable label for this contract */ - readonly label: string; - /** Init message as JavaScript object */ - readonly init_msg: any; - readonly init_funds: readonly Coin[]; - /** Bech32-encoded admin address */ - readonly admin?: string; - }; -} - -export function isMsgInstantiateContract(msg: Msg): msg is MsgInstantiateContract { - return (msg as MsgInstantiateContract).type === "wasm/MsgInstantiateContract"; -} - -/** - * Update the admin of a contract - * - * @see https://github.com/CosmWasm/wasmd/blob/v0.9.0-beta/x/wasm/internal/types/msg.go#L231 - */ -export interface MsgUpdateAdmin extends Msg { - readonly type: "wasm/MsgUpdateAdmin"; - readonly value: { - /** Bech32-encoded sender address. This must be the old admin. */ - readonly sender: string; - /** Bech32-encoded contract address to be updated */ - readonly contract: string; - /** Bech32-encoded address of the new admin */ - readonly new_admin: string; - }; -} - -export function isMsgUpdateAdmin(msg: Msg): msg is MsgUpdateAdmin { - return (msg as MsgUpdateAdmin).type === "wasm/MsgUpdateAdmin"; -} - -/** - * Clears the admin of a contract, making it immutable. - * - * @see https://github.com/CosmWasm/wasmd/blob/v0.9.0-beta/x/wasm/internal/types/msg.go#L269 - */ -export interface MsgClearAdmin extends Msg { - readonly type: "wasm/MsgClearAdmin"; - readonly value: { - /** Bech32-encoded sender address. This must be the old admin. */ - readonly sender: string; - /** Bech32-encoded contract address to be updated */ - readonly contract: string; - }; -} - -export function isMsgClearAdmin(msg: Msg): msg is MsgClearAdmin { - return (msg as MsgClearAdmin).type === "wasm/MsgClearAdmin"; -} - -/** - * Execute a smart contract. - * This will trigger a call to the "handle" export. - * - * @see https://github.com/CosmWasm/wasmd/blob/v0.9.0-alpha4/x/wasm/internal/types/msg.go#L158 - */ -export interface MsgExecuteContract extends Msg { - readonly type: "wasm/MsgExecuteContract"; - readonly value: { - /** Bech32 account address */ - readonly sender: string; - /** Bech32 account address */ - readonly contract: string; - /** Handle message as JavaScript object */ - readonly msg: any; - readonly sent_funds: readonly Coin[]; - }; -} - -export function isMsgExecuteContract(msg: Msg): msg is MsgExecuteContract { - return (msg as MsgExecuteContract).type === "wasm/MsgExecuteContract"; -} - -/** - * Migrates a contract to a new Wasm code. - * - * @see https://github.com/CosmWasm/wasmd/blob/v0.9.0-alpha4/x/wasm/internal/types/msg.go#L195 - */ -export interface MsgMigrateContract extends Msg { - readonly type: "wasm/MsgMigrateContract"; - readonly value: { - /** Bech32 account address */ - readonly sender: string; - /** Bech32 account address */ - readonly contract: string; - /** The new code */ - readonly code_id: string; - /** Migrate message as JavaScript object */ - readonly msg: any; - }; -} - -export function isMsgMigrateContract(msg: Msg): msg is MsgMigrateContract { - return (msg as MsgMigrateContract).type === "wasm/MsgMigrateContract"; -} diff --git a/packages/cosmwasm-launchpad/src/signingcosmwasmclient.spec.ts b/packages/cosmwasm-launchpad/src/signingcosmwasmclient.spec.ts deleted file mode 100644 index 3636b204..00000000 --- a/packages/cosmwasm-launchpad/src/signingcosmwasmclient.spec.ts +++ /dev/null @@ -1,565 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { sha256 } from "@cosmjs/crypto"; -import { toHex } from "@cosmjs/encoding"; -import { - assertIsBroadcastTxSuccess, - AuthExtension, - coin, - coins, - GasPrice, - LcdClient, - MsgDelegate, - Secp256k1HdWallet, - setupAuthExtension, -} from "@cosmjs/launchpad"; -import { assert } from "@cosmjs/utils"; - -import { PrivateCosmWasmClient } from "./cosmwasmclient"; -import { setupWasmExtension, WasmExtension } from "./lcdapi/wasm"; -import { SigningCosmWasmClient, UploadMeta } from "./signingcosmwasmclient"; -import { - alice, - getHackatom, - launchpad, - makeRandomAddress, - pendingWithoutLaunchpad, - unused, -} from "./testutils.spec"; - -function makeWasmClient(apiUrl: string): LcdClient & AuthExtension & WasmExtension { - return LcdClient.withExtensions({ apiUrl }, setupAuthExtension, setupWasmExtension); -} - -describe("SigningCosmWasmClient", () => { - describe("makeReadOnly", () => { - it("can be constructed", async () => { - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet); - expect(client).toBeTruthy(); - }); - - it("can be constructed with custom gas price", async () => { - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const gasPrice = GasPrice.fromString("3.14utest"); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet, gasPrice); - expect(client.fees).toEqual({ - upload: { - amount: [ - { - amount: "4710000", - denom: "utest", - }, - ], - gas: "1500000", - }, - init: { - amount: [ - { - amount: "1570000", - denom: "utest", - }, - ], - gas: "500000", - }, - migrate: { - amount: [ - { - amount: "628000", - denom: "utest", - }, - ], - gas: "200000", - }, - exec: { - amount: [ - { - amount: "628000", - denom: "utest", - }, - ], - gas: "200000", - }, - send: { - amount: [ - { - amount: "251200", - denom: "utest", - }, - ], - gas: "80000", - }, - changeAdmin: { - amount: [ - { - amount: "251200", - denom: "utest", - }, - ], - gas: "80000", - }, - }); - }); - - it("can be constructed with custom gas limits", async () => { - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const gasLimits = { - send: 160000, - }; - const client = new SigningCosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - undefined, - gasLimits, - ); - expect(client.fees).toEqual({ - upload: { - amount: [ - { - amount: "37500", - denom: "ucosm", - }, - ], - gas: "1500000", - }, - init: { - amount: [ - { - amount: "12500", - denom: "ucosm", - }, - ], - gas: "500000", - }, - migrate: { - amount: [ - { - amount: "5000", - denom: "ucosm", - }, - ], - gas: "200000", - }, - exec: { - amount: [ - { - amount: "5000", - denom: "ucosm", - }, - ], - gas: "200000", - }, - send: { - amount: [ - { - amount: "4000", - denom: "ucosm", - }, - ], - gas: "160000", - }, - changeAdmin: { - amount: [ - { - amount: "2000", - denom: "ucosm", - }, - ], - gas: "80000", - }, - }); - }); - - it("can be constructed with custom gas price and gas limits", async () => { - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const gasPrice = GasPrice.fromString("3.14utest"); - const gasLimits = { - send: 160000, - }; - const client = new SigningCosmWasmClient( - launchpad.endpoint, - alice.address0, - wallet, - gasPrice, - gasLimits, - ); - expect(client.fees).toEqual({ - upload: { - amount: [ - { - amount: "4710000", - denom: "utest", - }, - ], - gas: "1500000", - }, - init: { - amount: [ - { - amount: "1570000", - denom: "utest", - }, - ], - gas: "500000", - }, - migrate: { - amount: [ - { - amount: "628000", - denom: "utest", - }, - ], - gas: "200000", - }, - exec: { - amount: [ - { - amount: "628000", - denom: "utest", - }, - ], - gas: "200000", - }, - send: { - amount: [ - { - amount: "502400", - denom: "utest", - }, - ], - gas: "160000", - }, - changeAdmin: { - amount: [ - { - amount: "251200", - denom: "utest", - }, - ], - gas: "80000", - }, - }); - }); - }); - - describe("getHeight", () => { - it("always uses authAccount implementation", async () => { - pendingWithoutLaunchpad(); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet); - - const openedClient = client as unknown as PrivateCosmWasmClient; - const blockLatestSpy = spyOn(openedClient.lcdClient, "blocksLatest").and.callThrough(); - const authAccountsSpy = spyOn(openedClient.lcdClient.auth, "account").and.callThrough(); - - const height = await client.getHeight(); - expect(height).toBeGreaterThan(0); - - expect(blockLatestSpy).toHaveBeenCalledTimes(0); - expect(authAccountsSpy).toHaveBeenCalledTimes(1); - }); - }); - - describe("upload", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet); - const wasm = getHackatom().data; - const { codeId, originalChecksum, originalSize, compressedChecksum, compressedSize } = - await client.upload(wasm); - expect(originalChecksum).toEqual(toHex(sha256(wasm))); - expect(originalSize).toEqual(wasm.length); - expect(compressedChecksum).toMatch(/^[0-9a-f]{64}$/); - expect(compressedSize).toBeLessThan(wasm.length * 0.5); - expect(codeId).toBeGreaterThanOrEqual(1); - }); - - it("can set builder and source", async () => { - pendingWithoutLaunchpad(); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet); - const hackatom = getHackatom(); - - const meta: UploadMeta = { - source: "https://crates.io/api/v1/crates/cw-nameservice/0.1.0/download", - builder: "confio/cosmwasm-opt:0.6.2", - }; - const { codeId } = await client.upload(hackatom.data, meta); - - const codeDetails = await client.getCodeDetails(codeId); - expect(codeDetails.source).toEqual(meta.source); - expect(codeDetails.builder).toEqual(meta.builder); - }); - }); - - describe("instantiate", () => { - it("works with transfer amount", async () => { - pendingWithoutLaunchpad(); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet); - const { codeId } = await client.upload(getHackatom().data); - - const funds = [coin(1234, "ucosm"), coin(321, "ustake")]; - const beneficiaryAddress = makeRandomAddress(); - const { contractAddress } = await client.instantiate( - codeId, - { - verifier: alice.address0, - beneficiary: beneficiaryAddress, - }, - "My cool label", - { - memo: "Let's see if the memo is used", - funds: funds, - }, - ); - - const lcdClient = makeWasmClient(launchpad.endpoint); - const balance = (await lcdClient.auth.account(contractAddress)).result.value.coins; - expect(balance).toEqual(funds); - }); - - it("works with admin", async () => { - pendingWithoutLaunchpad(); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet); - const { codeId } = await client.upload(getHackatom().data); - - const beneficiaryAddress = makeRandomAddress(); - const { contractAddress } = await client.instantiate( - codeId, - { - verifier: alice.address0, - beneficiary: beneficiaryAddress, - }, - "My cool label", - { admin: unused.address }, - ); - - const lcdClient = makeWasmClient(launchpad.endpoint); - const contract = await lcdClient.wasm.getContractInfo(contractAddress); - assert(contract); - expect(contract.admin).toEqual(unused.address); - }); - - it("can instantiate one code multiple times", async () => { - pendingWithoutLaunchpad(); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet); - const { codeId } = await client.upload(getHackatom().data); - - const contractAddress1 = await client.instantiate( - codeId, - { - verifier: alice.address0, - beneficiary: makeRandomAddress(), - }, - "contract 1", - ); - const contractAddress2 = await client.instantiate( - codeId, - { - verifier: alice.address0, - beneficiary: makeRandomAddress(), - }, - "contract 2", - ); - expect(contractAddress1).not.toEqual(contractAddress2); - }); - }); - - describe("updateAdmin", () => { - it("can update an admin", async () => { - pendingWithoutLaunchpad(); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet); - const { codeId } = await client.upload(getHackatom().data); - - const beneficiaryAddress = makeRandomAddress(); - const { contractAddress } = await client.instantiate( - codeId, - { - verifier: alice.address0, - beneficiary: beneficiaryAddress, - }, - "My cool label", - { - admin: alice.address0, - }, - ); - - const lcdClient = makeWasmClient(launchpad.endpoint); - const state1 = await lcdClient.wasm.getContractInfo(contractAddress); - assert(state1); - expect(state1.admin).toEqual(alice.address0); - - await client.updateAdmin(contractAddress, unused.address); - - const state2 = await lcdClient.wasm.getContractInfo(contractAddress); - assert(state2); - expect(state2.admin).toEqual(unused.address); - }); - }); - - describe("clearAdmin", () => { - it("can clear an admin", async () => { - pendingWithoutLaunchpad(); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet); - const { codeId } = await client.upload(getHackatom().data); - - const beneficiaryAddress = makeRandomAddress(); - const { contractAddress } = await client.instantiate( - codeId, - { - verifier: alice.address0, - beneficiary: beneficiaryAddress, - }, - "My cool label", - { - admin: alice.address0, - }, - ); - - const lcdClient = makeWasmClient(launchpad.endpoint); - const state1 = await lcdClient.wasm.getContractInfo(contractAddress); - assert(state1); - expect(state1.admin).toEqual(alice.address0); - - await client.clearAdmin(contractAddress); - - const state2 = await lcdClient.wasm.getContractInfo(contractAddress); - assert(state2); - expect(state2.admin).toBeUndefined(); - }); - }); - - describe("migrate", () => { - it("can can migrate from one code ID to another", async () => { - pendingWithoutLaunchpad(); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet); - const { codeId: codeId1 } = await client.upload(getHackatom().data); - const { codeId: codeId2 } = await client.upload(getHackatom().data); - - const beneficiaryAddress = makeRandomAddress(); - const { contractAddress } = await client.instantiate( - codeId1, - { - verifier: alice.address0, - beneficiary: beneficiaryAddress, - }, - "My cool label", - { - admin: alice.address0, - }, - ); - - const lcdClient = makeWasmClient(launchpad.endpoint); - const state1 = await lcdClient.wasm.getContractInfo(contractAddress); - assert(state1); - expect(state1.admin).toEqual(alice.address0); - - const newVerifier = makeRandomAddress(); - await client.migrate(contractAddress, codeId2, { verifier: newVerifier }); - - const state2 = await lcdClient.wasm.getContractInfo(contractAddress); - assert(state2); - expect(state2).toEqual({ - ...state1, - code_id: codeId2, - }); - }); - }); - - describe("execute", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet); - const { codeId } = await client.upload(getHackatom().data); - - // instantiate - const funds = [coin(233444, "ucosm"), coin(5454, "ustake")]; - const beneficiaryAddress = makeRandomAddress(); - const { contractAddress } = await client.instantiate( - codeId, - { - verifier: alice.address0, - beneficiary: beneficiaryAddress, - }, - "amazing random contract", - { - funds: funds, - }, - ); - - // execute - const result = await client.execute(contractAddress, { release: {} }, undefined); - const wasmEvent = result.logs.find(() => true)?.events.find((e) => e.type === "wasm"); - assert(wasmEvent, "Event of type wasm expected"); - expect(wasmEvent.attributes).toContain({ key: "action", value: "release" }); - expect(wasmEvent.attributes).toContain({ - key: "destination", - value: beneficiaryAddress, - }); - - // Verify token transfer from contract to beneficiary - const lcdClient = makeWasmClient(launchpad.endpoint); - const beneficiaryBalance = (await lcdClient.auth.account(beneficiaryAddress)).result.value.coins; - expect(beneficiaryBalance).toEqual(funds); - const contractBalance = (await lcdClient.auth.account(contractAddress)).result.value.coins; - expect(contractBalance).toEqual([]); - }); - }); - - describe("sendTokens", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet); - - const amount = coins(7890, "ucosm"); - const beneficiaryAddress = makeRandomAddress(); - - // no tokens here - const before = await client.getAccount(beneficiaryAddress); - expect(before).toBeUndefined(); - - // send - const result = await client.sendTokens(beneficiaryAddress, amount, "for dinner"); - assertIsBroadcastTxSuccess(result); - const [firstLog] = result.logs; - expect(firstLog).toBeTruthy(); - - // got tokens - const after = await client.getAccount(beneficiaryAddress); - assert(after); - expect(after.balance).toEqual(amount); - }); - }); - - describe("signAndBroadcast", () => { - it("works", async () => { - pendingWithoutLaunchpad(); - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(launchpad.endpoint, alice.address0, wallet); - - const msg: MsgDelegate = { - type: "cosmos-sdk/MsgDelegate", - value: { - delegator_address: alice.address0, - validator_address: launchpad.validator.address, - amount: coin(1234, "ustake"), - }, - }; - const fee = { - amount: coins(2000, "ucosm"), - gas: "180000", // 180k - }; - const result = await client.signAndBroadcast([msg], fee, "Use your power wisely"); - assertIsBroadcastTxSuccess(result); - }); - }); -}); diff --git a/packages/cosmwasm-launchpad/src/signingcosmwasmclient.ts b/packages/cosmwasm-launchpad/src/signingcosmwasmclient.ts deleted file mode 100644 index 971d5099..00000000 --- a/packages/cosmwasm-launchpad/src/signingcosmwasmclient.ts +++ /dev/null @@ -1,370 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { sha256 } from "@cosmjs/crypto"; -import { toBase64, toHex } from "@cosmjs/encoding"; -import { - BroadcastMode, - BroadcastTxFailure, - BroadcastTxResult, - buildFeeTable, - Coin, - CosmosFeeTable, - GasLimits, - GasPrice, - isBroadcastTxFailure, - logs, - makeSignDoc, - makeStdTx, - Msg, - MsgSend, - OfflineSigner, - StdFee, -} from "@cosmjs/launchpad"; -import { Uint53 } from "@cosmjs/math"; -import pako from "pako"; - -import { isValidBuilder } from "./builder"; -import { Account, CosmWasmClient, GetSequenceResult } from "./cosmwasmclient"; -import { - MsgClearAdmin, - MsgExecuteContract, - MsgInstantiateContract, - MsgMigrateContract, - MsgStoreCode, - MsgUpdateAdmin, -} from "./msgs"; - -/** - * These fees are used by the higher level methods of SigningCosmWasmClient - */ -export interface CosmWasmFeeTable extends CosmosFeeTable { - readonly upload: StdFee; - readonly init: StdFee; - readonly exec: StdFee; - readonly migrate: StdFee; - /** Paid when setting the contract admin to a new address or unsetting it */ - readonly changeAdmin: StdFee; -} - -function prepareBuilder(builder: string | undefined): string { - if (builder === undefined) { - return ""; // normalization needed by backend - } else { - if (!isValidBuilder(builder)) throw new Error("The builder (Docker Hub image with tag) is not valid"); - return builder; - } -} - -const defaultGasPrice = GasPrice.fromString("0.025ucosm"); -const defaultGasLimits: GasLimits = { - upload: 1_500_000, - init: 500_000, - migrate: 200_000, - exec: 200_000, - send: 80_000, - changeAdmin: 80_000, -}; - -export interface UploadMeta { - /** - * An URL to a .tar.gz archive of the source code of the contract, which can be used to reproducibly build the Wasm bytecode. - * - * @see https://github.com/CosmWasm/cosmwasm-verify - */ - readonly source?: string; - /** - * A docker image (including version) to reproducibly build the Wasm bytecode from the source code. - * - * @example ```cosmwasm/rust-optimizer:0.8.0``` - * @see https://github.com/CosmWasm/cosmwasm-verify - */ - readonly builder?: string; -} - -export interface UploadResult { - /** Size of the original wasm code in bytes */ - readonly originalSize: number; - /** A hex encoded sha256 checksum of the original wasm code (that is stored on chain) */ - readonly originalChecksum: string; - /** Size of the compressed wasm code in bytes */ - readonly compressedSize: number; - /** A hex encoded sha256 checksum of the compressed wasm code (that stored in the transaction) */ - readonly compressedChecksum: string; - /** The ID of the code asigned by the chain */ - readonly codeId: number; - readonly logs: readonly logs.Log[]; - /** Transaction hash (might be used as transaction ID). Guaranteed to be non-empty upper-case hex */ - readonly transactionHash: string; -} - -/** - * The options of an .instantiate() call. - * All properties are optional. - */ -export interface InstantiateOptions { - readonly memo?: string; - /** - * The funds that are transferred from the sender to the newly created contract. - * The funds are transferred as part of the message execution after the contract address is - * created and before the instantiation message is executed by the contract. - * - * Only native tokens are supported. - */ - readonly funds?: readonly Coin[]; - /** - * A bech32 encoded address of an admin account. - * Caution: an admin has the privilege to upgrade a contract. If this is not desired, do not set this value. - */ - readonly admin?: string; -} - -export interface InstantiateResult { - /** The address of the newly instantiated contract */ - readonly contractAddress: string; - readonly logs: readonly logs.Log[]; - /** Transaction hash (might be used as transaction ID). Guaranteed to be non-empty upper-case hex */ - readonly transactionHash: string; -} - -/** - * Result type of updateAdmin and clearAdmin - */ -export interface ChangeAdminResult { - readonly logs: readonly logs.Log[]; - /** Transaction hash (might be used as transaction ID). Guaranteed to be non-empty upper-case hex */ - readonly transactionHash: string; -} - -export interface MigrateResult { - readonly logs: readonly logs.Log[]; - /** Transaction hash (might be used as transaction ID). Guaranteed to be non-empty upper-case hex */ - readonly transactionHash: string; -} - -export interface ExecuteResult { - readonly logs: readonly logs.Log[]; - /** Transaction hash (might be used as transaction ID). Guaranteed to be non-empty upper-case hex */ - readonly transactionHash: string; -} - -function createBroadcastTxErrorMessage(result: BroadcastTxFailure): string { - return `Error when broadcasting tx ${result.transactionHash} at height ${result.height}. Code: ${result.code}; Raw log: ${result.rawLog}`; -} - -export class SigningCosmWasmClient extends CosmWasmClient { - public readonly fees: CosmWasmFeeTable; - public readonly signerAddress: string; - - private readonly signer: OfflineSigner; - - /** - * Creates a new client with signing capability to interact with a CosmWasm blockchain. This is the bigger brother of CosmWasmClient. - * - * This instance does a lot of caching. In order to benefit from that you should try to use one instance - * for the lifetime of your application. When switching backends, a new instance must be created. - * - * @param apiUrl The URL of a Cosmos SDK light client daemon API (sometimes called REST server or REST API) - * @param signerAddress The address that will sign transactions using this instance. The `signer` must be able to sign with this address. - * @param signer An implementation of OfflineSigner which can provide signatures for transactions, potentially requiring user input. - * @param gasPrice The price paid per unit of gas - * @param gasLimits Custom overrides for gas limits related to specific transaction types - * @param broadcastMode Defines at which point of the transaction processing the broadcastTx method returns - */ - public constructor( - apiUrl: string, - signerAddress: string, - signer: OfflineSigner, - gasPrice: GasPrice = defaultGasPrice, - gasLimits: Partial> = {}, - broadcastMode = BroadcastMode.Block, - ) { - super(apiUrl, broadcastMode); - this.anyValidAddress = signerAddress; - this.signerAddress = signerAddress; - this.signer = signer; - this.fees = buildFeeTable(gasPrice, defaultGasLimits, gasLimits); - } - - public override async getSequence(address?: string): Promise { - return super.getSequence(address || this.signerAddress); - } - - public override async getAccount(address?: string): Promise { - return super.getAccount(address || this.signerAddress); - } - - /** Uploads code and returns a receipt, including the code ID */ - public async upload(wasmCode: Uint8Array, meta: UploadMeta = {}, memo = ""): Promise { - const source = meta.source || ""; - const builder = prepareBuilder(meta.builder); - - const compressed = pako.gzip(wasmCode, { level: 9 }); - const storeCodeMsg: MsgStoreCode = { - type: "wasm/MsgStoreCode", - value: { - sender: this.signerAddress, - wasm_byte_code: toBase64(compressed), - source: source, - builder: builder, - }, - }; - const result = await this.signAndBroadcast([storeCodeMsg], this.fees.upload, memo); - if (isBroadcastTxFailure(result)) { - throw new Error(createBroadcastTxErrorMessage(result)); - } - const codeIdAttr = logs.findAttribute(result.logs, "message", "code_id"); - return { - originalSize: wasmCode.length, - originalChecksum: toHex(sha256(wasmCode)), - compressedSize: compressed.length, - compressedChecksum: toHex(sha256(compressed)), - codeId: Number.parseInt(codeIdAttr.value, 10), - logs: result.logs, - transactionHash: result.transactionHash, - }; - } - - public async instantiate( - codeId: number, - msg: Record, - label: string, - options: InstantiateOptions = {}, - ): Promise { - const instantiateMsg: MsgInstantiateContract = { - type: "wasm/MsgInstantiateContract", - value: { - sender: this.signerAddress, - code_id: new Uint53(codeId).toString(), - label: label, - init_msg: msg, - init_funds: options.funds || [], - admin: options.admin, - }, - }; - const result = await this.signAndBroadcast([instantiateMsg], this.fees.init, options.memo); - if (isBroadcastTxFailure(result)) { - throw new Error(createBroadcastTxErrorMessage(result)); - } - const contractAddressAttr = logs.findAttribute(result.logs, "message", "contract_address"); - return { - contractAddress: contractAddressAttr.value, - logs: result.logs, - transactionHash: result.transactionHash, - }; - } - - public async updateAdmin(contractAddress: string, newAdmin: string, memo = ""): Promise { - const updateAdminMsg: MsgUpdateAdmin = { - type: "wasm/MsgUpdateAdmin", - value: { - sender: this.signerAddress, - contract: contractAddress, - new_admin: newAdmin, - }, - }; - const result = await this.signAndBroadcast([updateAdminMsg], this.fees.changeAdmin, memo); - if (isBroadcastTxFailure(result)) { - throw new Error(createBroadcastTxErrorMessage(result)); - } - return { - logs: result.logs, - transactionHash: result.transactionHash, - }; - } - - public async clearAdmin(contractAddress: string, memo = ""): Promise { - const clearAdminMsg: MsgClearAdmin = { - type: "wasm/MsgClearAdmin", - value: { - sender: this.signerAddress, - contract: contractAddress, - }, - }; - const result = await this.signAndBroadcast([clearAdminMsg], this.fees.changeAdmin, memo); - if (isBroadcastTxFailure(result)) { - throw new Error(createBroadcastTxErrorMessage(result)); - } - return { - logs: result.logs, - transactionHash: result.transactionHash, - }; - } - - public async migrate( - contractAddress: string, - codeId: number, - migrateMsg: Record, - memo = "", - ): Promise { - const msg: MsgMigrateContract = { - type: "wasm/MsgMigrateContract", - value: { - sender: this.signerAddress, - contract: contractAddress, - code_id: new Uint53(codeId).toString(), - msg: migrateMsg, - }, - }; - const result = await this.signAndBroadcast([msg], this.fees.migrate, memo); - if (isBroadcastTxFailure(result)) { - throw new Error(createBroadcastTxErrorMessage(result)); - } - return { - logs: result.logs, - transactionHash: result.transactionHash, - }; - } - - public async execute( - contractAddress: string, - msg: Record, - memo = "", - funds?: readonly Coin[], - ): Promise { - const executeMsg: MsgExecuteContract = { - type: "wasm/MsgExecuteContract", - value: { - sender: this.signerAddress, - contract: contractAddress, - msg: msg, - sent_funds: funds || [], - }, - }; - const result = await this.signAndBroadcast([executeMsg], this.fees.exec, memo); - if (isBroadcastTxFailure(result)) { - throw new Error(createBroadcastTxErrorMessage(result)); - } - return { - logs: result.logs, - transactionHash: result.transactionHash, - }; - } - - public async sendTokens( - recipientAddress: string, - amount: readonly Coin[], - memo = "", - ): Promise { - const sendMsg: MsgSend = { - type: "cosmos-sdk/MsgSend", - value: { - from_address: this.signerAddress, - to_address: recipientAddress, - amount: amount, - }, - }; - return this.signAndBroadcast([sendMsg], this.fees.send, memo); - } - - /** - * Gets account number and sequence from the API, creates a sign doc, - * creates a single signature, assembles the signed transaction and broadcasts it. - */ - public async signAndBroadcast(msgs: readonly Msg[], fee: StdFee, memo = ""): Promise { - const { accountNumber, sequence } = await this.getSequence(); - const chainId = await this.getChainId(); - const signDoc = makeSignDoc(msgs, fee, chainId, memo, accountNumber, sequence); - const { signed, signature } = await this.signer.signAmino(this.signerAddress, signDoc); - const signedTx = makeStdTx(signed, signature); - return this.broadcastTx(signedTx); - } -} diff --git a/packages/cosmwasm-launchpad/src/testdata/contract.json b/packages/cosmwasm-launchpad/src/testdata/contract.json deleted file mode 100644 index 10b37006..00000000 --- a/packages/cosmwasm-launchpad/src/testdata/contract.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "// source": "https://github.com/CosmWasm/cosmwasm/releases/download/v0.11.0-alpha4/hackatom.wasm", - "data": "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wAA3AgAMAgsgACACKQIUNwIEIABBADYCACAAQQxqIAJBHGooAgA2AgALIARFDQAgARDVAQsgAkHgAGokAAthAQF/IwBBMGsiAyQAIAMgAjYCDCADIAE2AgggA0EkakEBNgIAIANCAjcCFCADQYCQwAA2AhAgA0ECNgIsIAMgA0EoajYCICADIANBCGo2AiggACADQRBqEDggA0EwaiQAC/MIAQR/IwBBgAFrIgIkACACQThqIAEQkQECQAJAAkACQAJAAkACQCACLQA4QQFxBEAgAi0AOSIDQaV/aiIEQSJNDQEgA0FeaiIDQQpLDQYCQCADQQFrDgoHBwcHBwcHBwcEAAsgAkEQaiABEJEBIAItABBBAXFFDQIgAi0AEUEiRwRAIABBDjYCAAwICyABEIsBIAJB6ABqIAEQkAEgAkHwAGooAgAhAyACKAJsIQEgAigCaEEBRwRAIABBFjYCACABRSADRXINCCABENUBDAgLIAJB+ABqKAIAIQQgAkH0AGooAgAhBSAAIAM2AgQgACABNgIAIABBDGogBDYCACAAQQhqIAU2AgAMBwsgAEEENgIADAYLIARBAWsOIgQBBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCBAEDCyAAQQQ2AgAMBAsgAEELNgIADAMLIAJBMGogARCRAQJAIAItADBBAXEEQCACLQAxQfsARwRAIABBDjYCAAwFCyABEIsBIAJBKGogARCJASACKAIoIQMgAiACLQAsQQFxOgBkIAIgAzYCYCACQfAAaiEDAn8DQCACQegAaiACQeAAahA7IAItAGhBAUYEQCACQdgAaiADQQhqKAIANgIAIAIgAykCADcDUCACKAJsDAILIAItAGkNAAtBFgshAyACQcgAaiIEIAJB2ABqKAIANgIAIAIgAikDUDcDQCADQRZHDQEgAkHoAGogARCOASACKAJoIgFBFkYEQCAAQRY2AgAMBQsgAkH0AGooAgAhAyACQfAAaigCACEEIAAgAigCbDYCBCAAIAE2AgAgAEEMaiADNgIAIABBCGogBDYCAAwECyAAQQQ2AgAMAwsgACADNgIAIAAgAikDQDcCBCAAQQxqIAQoAgA2AgAMAgsgAkEgaiABEJEBAkAgAi0AIEEBcQRAIAItACFB2wBHBEAgAEEONgIADAQLIAEQiwEgAkEYaiAB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RQ0OIAMtAFlBIkcEQEEOIQEMEAsgBhCLASADQcABaiAGEJABIAMoAswBIQQgAygCyAEhAiADKALEASEBAkACQAJAIAMoAsABQQFHBEBBASEKAkAgBEEHRw0AIAFBwIDAAEcEQCABQcCAwABBBxCqAg0BC0EAIQoLIAIEQCABENUBCyAKRQ0BIANBwAFqIAYQjwEgAygCwAEiAUEWRg0CIAMoAsgBIQQgAygCxAEhAiADQewBaiADKALMASIFNgIAIANB6AFqIAQ2AgAgAyACNgLkASADIAE2AuABDBELIAMoAtABIQUMEgsCQCAJRQRAIANBwAFqIAYQjwEgAygCwAEiAUEWRwRAIAMoAswBIQUgAygCyAEhBCADKALEASECDCULIANB0ABqIAYQkQECf0EEIAMtAFBBAXFFDQAaQQ4gAy0AUUEiRw0AGiAGEIsBIANBwAFqIAYQkAEgAykDyAEhEyADKALEASEJIAMoAsABQQFHDQIgAygC0AEhBSAJCyEBIBNCIIinIQQgE6chAgwkCyADQcABakHAgMAAQQcQECADKQLEASISQiCIpyEEIANBzAFqKAIAIQUgAygCwAEhASASpyECIAtFDSMMEwsgE0IgiKchECATpyELDAELIANB4AFqIAYQESADKALgASIBQRZHDQ0LIANByABqIAYQkQFBACECIAMtAEkhASADLQBIQQFxDQALQQIhAQwOCyAJRQRAIANBwAFqQcCAwABBBxASIANBzAFqKAIAIQUgA0HIAWooAgAhBCADKALEASECIAMoAsABIQEMHwsgA0HAAWogCBCOASADKALAASIBQRZGDQIgAygCzAEhBSADKALIASEEIAMoAsQBIQIgC0UNHiAJENUBDB4LIANBwAFqQeuBwABBCBAQIAMpAsQBIhJCIIinIQQgA0HMAWooAgAhBSADKALAASEBIBKnIQIgCw0cDB0LIANB4AFqIAgQESADKALgASIBQRZHDQYLIANBCGogCBCRAUEAIQIgAy0ACSEBIAMtAAhBAXENAAtBAiEBDBgLIAdFBEAgA0HAAWpB5oHAAEEFEBIgAykCxAEiEkIgiKchBCADQcwBaigCACEFIAMoAsABIQEgEqchAkEAIQcMGAsgCUUEQCADQcABakHrgcAAQQgQEiADQcwBaigCACEFIANByAFqKAIAIQQgAygCxAEhAiADKALAASEBIA1FDRsgBxDVAQwbCyADQcABaiADQagBahCOASADQcwBaiEEIANByAFqIQIgAygCwAEiAUEWRwRAIAQoAgAhBSACKAIAIQQgAygCxAEhAiANBEAgBxDVAQsgC0UNGyAJENUBDBsLIANBwAFqIANBqAFqEIwBIAMoAsABIgFBFkcEQCAEKAIAIQUgAigCACEEIAMoAsQBIQIgDQRAIAcQ1QELIAtFDRsgCRDVAQwbCyAAQThqIBCtNwMAIABBNGogCzYCACAAQTBqIAk2AgAgAEEoaiAUNwMAIABBJGogDTYCACAAQSBqIAc2AgAgAEEYaiASNwMAIABBEGogFzcDACAAQQhqIBY3AwBBACEPDBsLIANBwAFqQfiBwABBBhAQIAMpAsQBIhJCIIinIQQgAygCzAEhBSADKALAASEBIBKnIQIMEAsgA0HAAWpB/oHAAEEEEBAgAykCxAEiEkIgiKchBCADKALMASEFIAMoAsABIQEgEqchAgwPCyADQcABakGCgsAAQQoQECADKQLEASISQiCIpyEEIAMoAswBIQUgAygCwAEhASASpyECDA4LIAMoAuwBIQULIAMpAuQBIhJCIIinIQQgEqchAgwSCyADQewBaigCACEFCyADKQLkASISQiCIpyEEIBKnIQIMAQtBBCEBCyALRSAJRXINEAsgCRDVAQwPCyAKIQUgCyECIBAhBAwOCyADQcABakH4gcAAQQYQEgsgAygCzAEhBSADKALIASEEIAMoAsQBIQIgAygCwAEhAQwECyADKALsASEFCyADKQLkASISQiCIpyEEIBKnIQIMAgsgDCECIA4hBEEAIQcMBwtBBCEBCyAMRSAHRXINAQsgBxDVAUEAIQcMBAtBACEHDAMLIA4hAiARIQQMAgtBBCEBDAELQRAhAQsgC0UgCUVyDQELIAkQ1QELIA1FIAdFcg0AIAcQ1QELIANB7AFqIAU2AgAgAyABNgLgASADIAKtIAStQiCGhDcC5AEgA0HAAWpBt4vAAEEYIANB4AFqEBMgAEEcaiADQdgBaigCADYCACAAQRRqIANB0AFqKQMANwIAIABBDGogA0HIAWopAwA3AgAgACADKQPAATcCBAsgACAPNgIAIANB8AFqJAAL2gMCBH8CfiMAQUBqIgIkACACQTBqIAEoAgAQjwECQAJA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IAc2AgQgAEEANgIAIABBDGogDDYCACAAQQhqIAo2AgAMBQsgAkG0AWooAgAhBSACQbABaigCACEEIAIoAqwBIQMgACABNgIEIABBATYCACAAQRBqIAU2AgAgAEEMaiAENgIAIABBCGogAzYCACAMBEAgB0EUaiEAA0ACQCAAQXxqKAIAIgFFDQAgACgCAEUNACABENUBCyAAQSBqIQAgE0FgaiITDQALCyAKRSAKQQV0RXINBCAHENUBDAQLIABCgYCAgMAANwIADAMLIAJBtAFqKAIAIQEgAkGwAWooAgAhBSACKAKsASEDIAAgBDYCBCAAQQE2AgAgAEEQaiABNgIAIABBDGogBTYCACAAQQhqIAM2AgAMAgsgDARAIAxBBXQhDCAHQRRqIQEDQAJAIAFBfGooAgAiBUUNACABKAIARQ0AIAUQ1QELIAFBIGohASAMQWBqIgwNAAsLIApFIApBBXRFcg0AIAcQ1QELIAAgBDYCBCAAQQE2AgAgAEEQaiAXPgIAIABBCGogFjcCAAsgAkHQAWokAAubBAIFfwF+IwBB0ABrIgIkACACQQhqEJcBIAJBIGogAkEIahCdAQJAIAIoAiBBAUYEQCACQcgAaiACQSxqKQIANwMAIAIgAikCJDcDQAwBCyACIAIoAiQ2AhggAiACQShqIgMtAAA6ABwgAkEgaiACQRhqQeSUwABBCCABEBkgAigCIEEDRwRAIAJByABqIAMpAwA3AwAgAiACKQMgNwNADAELIAJBIGogAkEYakHslMAAQQsgAUEMahAZIAIoAiBBA0cEQCACQcgAaiACQShqKQMANwMAIAIgAikDIDcDQAwBCyACQSBqIAJBGGpB95TAAEEGIAFBGGoQGSACKAIgQQNHBEAgAkHIAGogAkEoaikDADcDACACIAIpAyA3A0AMAQsgAkFAayACKAIYIAItABwQlAELIAACfyACKAJAIgFBA0cEQCACQcwAaigCACEDIAJByABqKAIAIQQgAigCRCEFAkAgAigCCCIGRQ0AIAIoAgxFDQAgBhDVAQsgAkHMAGogAzYCACACQcgAaiAENgIAIAIgBTYCRCACIAE2AkAgAkEgakHLiMAAQRkgAkFAaxAaIABBHGogAkE4aigCADYCACAAQRRqIAJBMGopAwA3AgAgAEEMaiACQShqKQMANwIAIAAgAikD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CyACKAIIakH9ADoAAEEDIQMgAkEDNgIgIAIgAigCEEEBajYCEAwFCyACQcgAaigCACEBIAIoAkQhBCACQSxqIAJBzABqKAIANgIAIAJBKGogATYCACACIAQ2AiQMAwsgAkEoaiIBKAIAIQQgAigCJCEFIAJBLGoiBiAGKAIANgIAIAEgBDYCACACIAU2AiQMAgsgAkEoaiIBKAIAIQQgAigCJCEFIAJBLGoiBiAGKAIANgIAIAEgBDYCACACIAU2AiQMAQsgAkEoaiIBKAIAIQQgAigCJCEFIAJBLGoiBiAGKAIANgIAIAEgBDYCACACIAU2AiQLIAIgAzYCIAsgAAJ/IANBA0cEQCACQSxqKAIAIQEgAkEoaigCACEEIAIoAiQhBQJAIAIoAggiBkUNACACKAIMRQ0AIAYQ1QELIAJBzABqIAE2AgAgAkHIAGogBDYCACACIAU2AkQgAiADNgJAIAJBIGpB7InAAEE9IAJBQGsQGiAAQRxqIAJBOGooAgA2AgAgAEEUaiACQTBqKQMANwIAIABBDGogAkEoaikDADcCACAAIAIpAyA3AgRBAQwBCyACKQMIIQcgAEEMaiACKAIQNgIAIAAgBzcCBEEACzYCACACQdAAaiQAC78DAQN/IwBBMGsiAiQAIAEoAggiAyABQQRqKAIARgR/IAFBARAHIAEoAggFIAMLIAEoAgBqQfsAOgAAIAEgASgCCEEBajYCCCACQRhqIAFB/YDAAEEGEJoBAkACQCACKAIYIgNBA0YEQCABKAIIIgMgAUEEaigCAEYEfyABQQEQByABKAIIBSADCyABKAIAakE6OgAAIAEgASgCCEEBajYCCCACQRhqIAEQnQECQCACKAIYQQFGBEAgAkEQaiACQRhqQQRyIgNBCGopAgA3AwAgAiADKQIANwMIDAELIAJBCGogAigCHCACQSBqLQAAEJQBCyACKAIIIgNBA0cNASABKAIIIgMgAUEEaigCAEYEfyABQQEQByABKAIIBSADCyABKAIAakH9ADoAACAAQQM2AgAgASABKAIIQQFqNgIIDAILIAJBJGooAgAhASACQSBqKAIAIQQgACACKAIcNgIEIAAgAzYCACAAQQxqIAE2AgAgAEEIaiAENgIADAELIAJBFGooAgAhASACQRBqKAIAIQQgACACKAIMNgIEIAAgAzYCACAAQQxqIAE2AgAgAEEIaiAENgIACyACQTBqJAALDAAgACgCACABEJYBCwYAEN4BAAsKACAAQQEQ3AEACwwAIAAoAgAgARCIAQvcEwIMfwJ+IwBB0AFrIgIkACACQdAAaiABEBsCQAJAIAACfwJAAkACQAJAAkACQAJAIAIoAlBBAUcEQCACQdgAaigCACEMIAJB0ABqIAIoAlQiDSACQdwAaiIBKAIAEH0CQCACKAJQQQFHBEAgAigCVEEBRg0BIAJB+ABqIAJB4ABqKAIANgIAIAIgAkHYAGopAwA3A3AgAkE4aiACQfAAahByIAJBoAFqIAIoAjggAigCPBCKASACQTBqIAJBoAFqEJEBIAItADBBAXFFBEBBBCEDDAoLIAItADFB+wBHBEBBDiEDDAoLIAJBoAFqEIsBIAJBKGogAkGgAWoQiQEgAigCKCEEIAIgAi0ALEEBcSIBOgBEIAIgBDYCQCACQSBqIAQQkQEgAi0AIEEBcUUEQEECIQMMCgsgAi0AISEDIAEhBQJAA0ACQAJAAkAgA0H/AXEiBkEsRwRAIAZB/QBGDQUgAUH/AXENAUEJIQMMDQsgBUH/AXFFDQELQQAhASACQQA6AEQMAQsgBBCLASACQRhqIAQQkQEgAi0AGEEBcUUNCSACLQAZIQMLIANB/wFxIgZBIkcEQEETQRAgBkH9AEYbIQMMCgsgAkEQaiAEEJEBIAItABBBAXFFDQggAi0AEUEiRwRAQQ4hAwwKCyAEEIsBIAJBsAFqIAQQkAEgAigCvAEhBSACKAK4ASEGIAIoArQBIQMCQAJAAkAgAigCsAFBAUcEQEEBIQsCQCAFQQZHDQAgA0GlgMAARwRAIANBpYDAAEEGEKoCDQELQQAhCwsgBgRAIAMQ1QELIAtFDQEgAkGwAWogBBCPASACKAKwASIDQRZGDQIgAigCuAEhBSACKAK0ASEGIAIgAigCvAEiCTYCjAEgAiAFNgKIASACIAY2AoQBIAIgAzYCgAEMDQsgAigCwAEhCQwMCyAIDQcgAkGwAWogAkFAaxAXIAIoArABQQFGBEAgAkHAAWooAgAhCSACKAK8ASEFIAIoArgBIQYgAigCtAEhAwwOCyACKAK8ASEHIAIoArgBIQogAigCtAEhCAwBCyACQYABaiAEEBEgAigCgAEiA0EWRw0ICyACQQhqIAQQkQFBACEFIAItAAkhAyACLQAIQQFxDQALQQIhAwwICyAIRQRAIAJBsAFqQaWAwABBBhASIAJBvAFqKAIAIQkgAkG4AWooAgAhBSACKAK0ASEGIAIoArABIQMMCgsgAkGwAWogAkGgAWoQjgEgAkG8AWohASACQbgBaiEFIAIoArABIgNBFkcNBCACQbABaiACQaABahCMASACKAKwASIDQRZHBEAgASgCACEJIAUoAgAhBSACKAK0ASEGIAcEQCAHQQV0IQEgCEEUaiEEA0ACQCAEQXxqKAIAIgdFDQAgBCgCAEUNACAHENUBCyAEQSBqIQQgAUFgaiIBDQALCyAKRSAKQQV0RXINCiAIENUBDAoLIAAgCDYCBCAAQQxqIAc2AgAgAEEIaiAKNgIAQQAMCgsgAkHIAWogAkHsAGooAgA2AgAgAkHAAWogAkHkAGopAgA3AwAgAkG4AWogASkCADcDACACIAIpAlQ3A7ABIAJBlAFqQQE2AgAgAkIBNwKEASACQbyCwAA2AoABIAJBBjYCdCACIAJB8ABqNgKQASACIAJBsAFqNgJwIAJBoAFqIAJBgAFqEN0BEKcBIQEgAkGKAWogAkGoAWooAgA2AQAgAiACKQOgATcBggEgACABOgAFIABBADoABCAAIAIpAYABNwEGIABBDGogAkGGAWopAQA3AQAgAEEBNgIAIAIoArABIgBBA00EQAJAAkACQCAAQQFrDgMBAg4ACwJAIAIoArQBIgBFDQAgAkG4AWooAgBFDQAgABDVAQsgAkHAAWooAgAiAEUNDSACQcQBaigCAEUNDSAAENUBDA0LAkAgAigCtAEiAEUNACACQbgBaigCAEUNACAAENUBCyACQcABaigCACIARQ0MIAJBxAFqKAIARQ0MIAAQ1QEMDAsgAigCtAEiAEUNCyACQbgBaigCAEUNCyAAENUBDAsLIAIoArQBIgBFDQogAkG4AWooAgBFDQogABDVAQwKCyACQagBaiACQeAAaigCADYCACACIAJB2ABqKQMANwOgASACQcQBakEBNgIAIAJCATcCtAEgAkHcgsAANgKwASACQQc2AnQgAiACQfAAajYCwAEgAiACQaABajYCcCACQYABaiACQbABahDdARCnASEBIAJBugFqIAJBiAFqKAIANgEAIAIgAikDgAE3AbIBIAAgAToABSAAQQA6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ADoABAwBCyABKAIAEIsBIAJBCGogASgCABCRASACLQAIQQFxRQ0DIAItAAkhBAsgBEH/AXEiA0H9AEcEQCADQSJHBEBBECEDDAULIAIgASgCACIDEJEBIAItAABBAXFFDQMgAi0AAUEiRwRAQQ4hAwwFCyADEIsBIAJBKGogAxCQASACQTBqKAIAIQQgAigCLCEDIAIoAihBAUcEQCADRSAERXINAyADENUBDAMLIANBFkYNAiACQThqKAIAIQEgAkE0aigCACEFDAQLQRMhAwwDCyAAQQA7AQAMAwsgAkEoaiABKAIAEI8BAkACQCACKAIoIgNBFkcEQCACQTBqKAIAIQEgAigCLCEEIAJBJGogAkE0aigCADYCACACQSBqIAE2AgAgAiAENgIcIAIgAzYCGAwBCyACQRhqIAEoAgAQESACKAIYQRZGDQELIABBAToAACAAQQRqIAIpAxg3AgAgAEEMaiACQSBqKQMANwIADAMLIABBgAI7AQAMAgtBBCEDCyAAQQE6AAAgAEEQaiABNgIAIABBDGogBTYCACAAQQhqIAQ2AgAgAEEEaiADNgIACyACQUBrJAALzQIBA38jAEEwayICJAAgAkEIaiABKAIAEJEBAkACQAJAAkACQCACLQAIQQFxBEAgAi0ACSIDIgRBLEYNAiAEQd0ARg0BIAEtAAQNAyAAQQE6AAAgAEEEakEHNgIADAULIABBAToAACAAQQRqQQE2AgAMBAsgAEEAOwEADAMLIAEoAgAQiwEgAiABKAIAEJEBIAItAABBAXEEQCACLQABIQMMAgsgAEEBOgAAIABBBGpBBDYCAAwCCyABQQA6AAQLIANB3QBHBEAgAkEgaiABKAIAEBEgAkEYaiIBIAJBLGooAgA2AgAgAiACKQIkNwMQIAIoAiAiA0EWRgRAIABBgAI7AQAMAgsgAEEBOgAAIABBBGogAzYCACAAQQhqIAIpAxA3AgAgAEEQaiABKAIANgIADAELIABBAToAACAAQQRqQRM2AgALIAJBMGokAAujAwEEfyMAQSBrIgIkACACIAEQkQECQCACLQAAQQFxBEAgAi0AAUEiRwRAIABBAToAACAAQQRqQQ42AgAMAgsgARCLASACQQhqIAEQkAEgAkEUaigCACEDIAJBEGooAgAhBSACKAIMIQEgAigCCEEBRwRAAkACQAJA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CAUgAgsgASgCAGpBLDoAACABIAEoAghBAWo2AggLAkACQAJAAkACQCAJIAxqIgUoAgBBAWsOAwQCAAELIAEoAggiAiABQQRqIgooAgBGBH8gAUEBEAcgASgCCAUgAgsgASgCAGpB+wA6AAAgASABKAIIQQFqNgIIIANBKGogAUHygMAAQQQQmgEgAygCKCICQQNHDQUgASgCCCICIAooAgBGBH8gAUEBEAcgASgCCAUgAgsgASgCAGpBOjoAACABIAEoAghBAWo2AggCQAJAIAVBCGooAgBBAUYEQCADQShqIAFBlITAAEELEJ4BIAMoAihBAUcNASADQRhqIAhBCGopAgA3AwAgAyAIKQIANwMQDAILIANBKGogAUGrhMAAQQcQngEgAygCKEEBRgRAIANBGGogCEEIaikCADcDACADIAgpAgA3AxAMAgsgAyADLQAwOgAkIAMgAygCLDYCICADQShqIANBIGpB2oDAAEENIAVBDGoQDCADKAIoQQNHBEAgA0EYaiAGKQMANwMAIAMgAykDKDcDEAwCCyADQShqIANBIGpB74DAACAFQRhqEAYgAygCKEEDRwRAIANBGGogBikDADcDACADIAMpAyg3AxAMAgsgA0EoaiADQSBqQfODwABBBCAFQSRqEAggAygCKEEDRwRAIANBGGogBikDADcDACADIAMpAyg3AxAMAgsgA0EQaiADKAIgIAMtACQQlQEMAQsgAyADLQAwIgI6ACQgAyADKAIsIgQ2AiAgBUEwaikDACEOIAJFBEAgBCgCCCICIARBBGooAgBGBH8gBEEBEAcgBCgCCAUgAgsgBCgCAGpBLDoAACAEIAQoAghBAWo2AggLIANBADoAJCAEQQhqIgcoAgAiAiAEQQRqKAIARgR/IARBARAHIAcoAgAFIAILIAQoAgBqQSI6AAAgByAHKAIAQQFqNgIAIARBBxAHIAcoAgAiAiAEKAIAaiILQZ+EwAAoAAA2AAAgC0EDakGihMAAKAAANgAAIAcgAkEHajYCACAEQQIQByAHKAIAIgIgBCgCAGpBovQAOwAAIAcgAkECajYCACADQShqIAMoAiAgDhCZASADKAIoIgJBA0cEQCADKAIwIQUgAygCLCEEIAMgAygCNDYCHCADIAU2AhggAyAENgIUIAMgAjYCEAwBCyADQShqIANBIGpB74DAACAFQQxqEAYgAygCKEEDRwRAIANBGGogBikDADcDACADIAMpAyg3AxAMAQsgA0EoaiADQSBqQfODwABBBCAFQRhqEAggAygCKEEDRwRAIANBGGogBikDADcDACADIAMpAyg3AxAMAQsgAygCICIEQQhqIgcoAgAhAiADLQAkRQRAIARBBGooAgAgAkYEfyAEQQEQByAHKAIABSACCyAEKAIAakEsOgAAIAcgBygCAEEBaiICNgIACyADQQA6ACQgBEEEaigCACACRgR/IARBARAHIAcoAgAFIAILIAQoAgBqQSI6AAAgByAHKAIAQQFqNgIAIARBBRAHIAcoAgAiAiAEKAIAaiILQaaEwAAoAAA2AAAgC0EEakGqhMAALQAAOgAAIAcgAkEFajYCACAEQQIQByAHKAIAIgIgBCgCAGpBovQAOwAAIAcgAkECajYCAAJAIAVBJGooAgAiAkUEQCADQShqIAQQmwEMAQsgA0EoaiAEIAIgBUEsaigCABCaAQsgAygCKCICQQNHBEAgAygCMCEFIAMoAiwhBCADIAMoAjQ2AhwgAyAFNgIYIAMgBDYCFCADIAI2AhAMAQsgA0EQaiAEQQAQlQELIAMoAhAiAkEDRw0CIAEoAggiAiAKKAIARgR/IAFBARAHIAEoAggFIAILIAEoAgBqQf0AOgAADAcLIAEoAggiAiABQQRqIgQoAgBGBH8gAUEBEAcgASgCCAUgAgsgASgCAGpB+wA6AAAgASABKAIIQQFqNgIIIANBKGogAUGDgcAAQQQQmgEgAygCKCICQQNHDQQgASgCCCICIAQoAgBGBH8gAUEBEAcgASgCCAUgAgsgASgCAGpBOjoAACABIAEoAghBAWo2AgggA0EoaiABQfODwABBBBCeAQJAIAMoAihBAUYEQCADQRhqIAhBCGopAgA3AwAgAyAIKQIANwMQDAELIAMgAy0AMDoAJCADIAMoAiw2AiAgA0EoaiADQSBqQfeDwABBDCAFQQRqEAwgAygCKEEDRwRAIANBGGogBikDADcDACADIAMpAyg3AxAMAQsgA0EoaiADQSBqQYOEwABBCiAFQRBqEAwgAygCKEEDRwRAIANBGGogBikDADcDACADIAMpAyg3AxAMAQsgA0EoaiADQSBqQaWAwABBBiAFQRxqEAggAygCKEEDRwRAIANBGGogBikDADcDACADIAMpAyg3AxAMAQsgA0EQaiADKAIgIAMtACQQlQELIAMoAhAiAkEDRw0BIAEoAggiAiAEKAIARgR/IAFBARAHIAEoAggFIAILIAEoAgBqQf0AOgAADAYLIAEoAggiAiABQQRqIgooAgBGBH8gAUEBEAcgASgCCAUgAgsgASgCAGpB+wA6AAAgASABKAIIQQFqNgIIIANBKGogAUH2gMAAQQcQmgEgAygCKCICQQNHDQMgASgCCCICIAooAgBGBH8gAUEBEAcgASgCCAUgAgsgASgCAGpBOjoAACABIAEoAghBAWo2AggCQAJAAkACQAJAIAVBCGooAgBBAWsOAwECAwALIANBKGogAUH7hMAAQQgQngEgAygCKEEBRgRAIANBGGogCEEIaikCADcDACADIAgpAgA3AxAMBAsgAyADLQAwOgAkIAMgAygCLDYCICADQShqIANBIGpBsIHAAEEJIAVBDGoQDCADKAIoQQNHBEAgA0EYaiAGKQMANwMAIAMgAykDKDcDEAwECyADQShqIANBIGogBUEYahAKIAMoAihBA0cEQCADQRhqIAYpAwA3AwAgAyADKQMoNwMQDAQLIANBEGogAygCICADLQAkEJUBDAMLIANBKGogAUHxhMAAQQoQngEgAygCKEEBRgRAIANBGGogCEEIaikCADcDACADIAgpAgA3AxAMAwsgAyADLQAwOgAkIAMgAygCLDYCICADQShqIANBIGpBsIHAAEEJIAVBDGoQDCADKAIoQQNHBEAgA0EYaiAGKQMANwMAIAMgAykDKDcDEAwDCyADQShqIANBIGogBUEYahAKIAMoAihBA0cEQCADQRhqIAYpAwA3AwAgAyADKQMoNwMQDAMLIANBEGogAygCICADLQAkEJUBDAILIANBKGogAUHghMAAQQgQngEgAygCKEEBRgRAIANBGGogCEEIaikCADcDACADIAgpAgA3AxAMAgsgAyADLQAwOgAkIAMgAygCLDYCICADQShqIANBIGpBsIHAAEEJIAVBDGoQDCADKAIoQQNHBEAgA0EYaiAGKQMANwMAIAMgAykDKDcDEAwCCyADKAIgIgRBCGoiBygCACECIAMtACRFBEAgBEEEaigCACACRgR/IARBARAHIAcoAgAFIAILIAQoAgBqQSw6AAAgByAHKAIAQQFqIgI2AgALIANBADoAJCAEQQRqKAIAIAJGBH8gBEEBEAcgBygCAAUgAgsgBCgCAGpBIjoAACAHIAcoAgBBAWo2AgAgBEEJEAcgBygCACICIAQoAgBqIgtB6ITAACkAADcAACALQQhqQfCEwAAtAAA6AAAgByACQQlqNgIAIARBAhAHIAcoAgAiAiAEKAIAakGi9AA7AAAgByACQQJqNgIAAkAgBUEYaigCACICRQRAIANBKGogBBCbAQwBCyADQShqIAQgAiAFQSBqKAIAEJoBCyADKAIoIgJBA0cEQCADKAIwIQUgAygCLCEEIAMgAygCNDYCHCADIAU2AhggAyAENgIUIAMgAjYCEAwCCyADQRBqIARBABCVAQwBCyADQShqIAFBvITAAEEKEJ4BIAMoAihBAUYEQCADQRhqIAhBCGopAgA3AwAgAyAIKQIANwMQDAELIAMgAy0AMDoAJCADIAMoAiw2AiAgA0EoaiADQSBqQcaEwABBDSAFQQxqEAwgAygCKEEDRwRAIANBGGogBikDADcDACADIAMpAyg3AxAMAQsgA0EoaiADQSBqQdOEwABBDSAFQRhqEAwgAygCKEEDRwRAIANBGGogBikDADcDACADIAMpAyg3AxAMAQsgA0EoaiADQSBqIAVBKGoQCiADKAIoQQNHBEAgA0EYaiAGKQMANwMAIAMgAykDKDcDEAwBCyADQRBqIAMoAiAgAy0AJBCVAQsgAygCECICQQNHDQAgASgCCCICIAooAgBGBH8gAUEBEAcgASgCCAUgAgsgASgCAGpB/QA6AAAMBQsgAygCGCEJIAMoAhQhBSADKAIcDAMLIAMgARAcIAMoAgAMBAsgA0EQaiABEJMBDAYLIAMoAjAhCSADKAIsIQUgAygCNAshASADIAI2AgAMAwsgASABKAIIQQFqNgIIIANBAzYCAEEDCyECIAlByABqIQlBACEFIAJBA0YNAAsgAygCDCEBIAMoAgghCSADKAIEIQULIANBHGogATYCACADQRhqIAk2AgAgAyAFNgIUIAMgAjYCEAsCQCADKAIQIgFBA0YEQCAAQQM2AgAMAQsgA0EcaigCACECIANBGGooAgAhBSAAIAMoAhQ2AgQgACABNgIAIABBDGogAjYCACAAQQhqIAU2AgALIANBQGskAAuVAwEEfyMAQSBrIgQkACABLQAERQRAIAEo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QRBqQgQ3AgAgAEEIakIANwIAIABCgICAgIABNwIAAkAgBCgCYCIARQ0AIAQoAmRFDQAgABDVAQsCQCAEKALQASIARQ0AIAQoAtQBRQ0AIAAQ1QELAkAgBCgCQCIARQ0AIAQoAkRFDQAgABDVAQsCQCAEKALAASIARQ0AIAQoAsQBRQ0AIAAQ1QELIAQoArABIgBFDRUgBCgCtAFFDRUgABDVAQwVCyAEQThqIAFBMGopAwA3AwAgBEEwaiABQShqKQMANwMAIARBKGogAUEgaikDADcDACAEQSBqIAFBGGopAwA3AwAgBEEYaiABQRBqKQMANwMAIARBEGogAUEIaikDADcDACAEIAEpAwA3AwggBEHQAGogAkEQaikCADcDACAEQcgAaiACQQhqKQIANwMAIAQgAikCADcDQCAEQcACahB4IAQoAsACIgFFBEBBBUEBEFEiAUUNDSAEQgU3AowBIAQgATYCiAEgBEGIAWpBBRAHIAQoAogBIgEgBCgCkAEiAmoiA0HhkcAAKAAANgAAIANBBGpB5ZHAAC0AADoAACAEKAKMASEDEKcBIQUgBEGgAmogBEGQAWooAgAiBzYCACAEIAQpAogBIg83A5gCIABBEGogAkEFajYBACAAQQxqIAM2AQAgAEEIaiABNgEAIAAgBToABSAAQQM6AAQgAEEUaiAPNwIAIABBHGogBzYCACAAQQE2AgAMEAsgBCgCxAIhBSAEQYgBaiABQf8BcSAELQDBAkEIdHIgBC8BwgJBEHRyIgcgBEHIAmoiASgCABAOIAEgBEGUAWoiASkCADcDACAEQdACaiAEQZwBaikCADcDACAEQdgCaiAEQaQBaikCADcDACAEQeACaiAEQawBaigCADYCACAEIAQpAowBNwPAAiAEKAKIAUEBRgRAIAAgBCkDwAI3AgQgAEEBNgIAIABBHGogBEHYAmooAgA2AgAgAEEUaiAEQdACaikDADcCACAAQQxqIARByAJqKQMANwIAIAVFDRAgBxDVAQwQCyAEQYABaiAEQeACaigCADYCACAEQfgAaiAEQdgCaikDADcDACAEQfAAaiAEQdACaikDADcDACAEQegAaiAEQcgCaiIDKQMANwMAIAQgBCkDwAI3A2AgBEGIAWogBEFAaxB6IAMgBEGgAWopAwA3AwAgBCAEQZgBaikDADcDwAIg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QQFqIgEgA0kNACADQQF0IgIgASACIAFLGyIBQQQgAUEESxutQsgAfiIPQiCIpyIGDQAgD6ciAkEASA0AAkACQCAEKALwAUEAIAMbIgEEQCADQcgAbCIGIAJGDQEgBkUEQCACRQRAQQghAQwECyACQQgQUSEBDAILIAEgBkEIIAIQUiEBDAELIAZFQQN0IQEgAkUNACACIAEQUSEBCyABRQ0CCyAEIAE2AvABIAQgAkHIAG42AvQBDAcLEN4BAAsgAkEIENwBAAsgBEGIAmoiASAEQbACaigCADYCACAEQYACaiICIARBqAJqKQMANwMAIARB+AFqIgMgBEGgAmopAwA3AwAgBCAEKQOYAjcD8AEgBEHAAmoQMyAEQegBaiABKAIAIgE2AgAgBEHgAWogAikDACIPNwMAIARB2AFqIAMpAwAiEDcDACAEIAQpA/ABIhE3A9ABIABBHGogATYCACAAQRRqIA83AgAgAEEMaiAQNwIAIAAgETcCBCAAQQE2AgAgBCgCsAEiAEUNBSAEKAK0AUUNBSAAENUBDAULIAAgBCkDwAI3AgQgAEEBNgIAIABBHGogAygCADYCACAAQRRqIAIpAwA3AgAgAEEMaiABKQMANwIADAQLQZiGwABBNyAEQYgBakHMjsAAQZiHwAAQ9AEAC0Goj8AAQSRBmI/AABDkAQALIAFBARDcAQALIARBiAJqIQIgASADQcgAbGoiAUEANgIAIAFBHGogBEGgAWoiAykDADcCACABQRRqIARBmAFqIgopAwA3AgAgAUEMaiAEQZABaiIGKQMANwIAIAEgBCkDiAE3AgQgAUEkaiAEQagBaiIIKAIANgIAIAFBKGogBCkDmAI3AwAgAUEwaiAEQaACaiIJKQMANwMAIAFBOGogBEGoAmoiCykDADcDACABQUBrIARBsAJqKQMANwMAIAQgBCgC+AFBAWo2AvgBIARBiAFqEIIBAkAgBCgCiAIiAUUNACAEQYwCaigCAEUNACABENUBCyACIAQpA4gBNwIAIAJBCGogBigCADYCACAEQeACaiAEQZACaigCACIBNgIAIARB2AJqIARBiAJqIgIpAwA3AwAgBEHQAmogBEGAAmoiDCkDADcDACAEQcgCaiINIARB+AFqIg4pAwA3AwAgBCAEKQPwATcDwAIgCCABNgIAIAMgAikDADcDACAK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AEKAgICAgAE3AgAgAEEYakIANwIAIABBEGpCBDcCACAAQQhqQgA3AgAMAQtBIEEBEFEiAkUNASABQiA3AjQgASACNgIwIAFBMGpBIBAHIAEoAjgiAyABKAIwaiICQeySwAApAAA3AAAgAUHIAGoiBCADQSBqNgIAIAJBCGpB9JLAACkAADcAACACQRBqQfySwAApAAA3AAAgAkEYakGEk8AAKQAANwAAIAEgASkDMDcDQBCnASECIAFBOmogBCgCADYBACABQQhqIgMgAUEsaigCADYCACABIAEpA0A3ATIgASABKQIkNwMAIAEgASkBMDcDECABIAFBNmopAQA3ARYgACACOgAFIABBADoABCAAIAEpAxA3AQYgAEEMaiABKQEWNwEAIABBATYCACAAQRRqIAEpAwA3AgAgAEEcaiADKAIANgIACyABQdAAaiQADwtBIBAfAAuBPAIOfwJ+IwBB4ANrIgMkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAigCAEEBaw4CAgABCyACQQhqKAIAIQkgAigCBCEKIANBgAFqIAFBMGooAgA2AgAgAyABKQIoNwN4IANBQGsgA0H4AGoQciADKAJEIgJBf0wNAiADKAJAIQYCQCACRQRAQQEhBQwBCyACIgRBARBRIgVFDQQLIANBADYCkAEgAyAFNgKIASADIAQ2AowBIANBiAFqIAIQByADKAKIASIFIAMoApABIgRqIAYgAhCoAhogAyACIARqIgI2ApABAkAgCUUNACAJQX9qIQYgA0GwAWohBCADQagBaiEIIANBoAFqIQsDQCADQbgBahCtASADQbgBaiAFIAIQqgEgBEIANwMAIAhCADcDACALQgA3AwAgA0IANwOYASADQagCaiADQbgBakHwABCoAhogA0GoAmogA0GYAWoQrgFBIEEBEFEiAkUNBiADQiA3AqwCIAMgAjYCqAIgA0GoAmpBIBAHIAMoArACIgcgAygCqAJqIgIgAykDmAE3AAAgAkEIaiALKQMANwAAIAJBEGogCCkDADcAACACQRhqIAQpAwA3AAAgAyAHQSBqNgKwAgJAIAVFDQAgAygCjAFFDQAgBRDVAQsgA0GQAWogA0GwAmooAgA2AgAgAyADKQOoAjcDiAEgBkUNASAGQX9qIQYgAygCiAEhBSADKAKQASECDAALAAsgCg0NIANBsAJqIANBkAFqKAIANgIAIAMgAykDiAE3A6gCIANBuAFqIANBqAJqEG8gAygCuAEiAkEQdiEIIAJBCHYhCSADKAK8ASEGIAMoAsABIQRBACEFAkAgAygCeCIHRQ0AIAMoAnxFDQAgBxDVAQsMDgsgA0G4AWoQeAJAIAMoArgBIgJFBEBBBUEBEFEiAg0BQQUQHwALIAMoArwBIQcgA0GoAmogAkH/AXEgAy0AuQFBCHRyIAMvAboBQRB0ciIKIANBwAFqKAIAEA4gA0GgAWoiCyADQcQCaiIMKAIANgIAIAMgA0G8AmoiDSkCADcDmAEgA0G4AmoiDigCACEJIANBtAJqIg8oAgAhCCADQbACaiIQKAIAIQIgAy8BrgIhBSADLQCtAiEGIAMtAKwCIQQgAygCqAJBAUYEQCADQcADaiALKAIANgIAIAMgAykDmAE3A7gDDAsLIANByAJqKQMAIREgA0HIAWogAykDmAE3AwAgA0HUAWogETcCACADQdABaiALKAIANgIAIAMgCTYCxAEgAyAINgLAASADIAI2ArwBIAMgBTsBugEgAyAGOgC5ASADIAQ6ALgBIANBqAJqIANBuAFqEHsgA0HYA2ogDCgCADYCACADIA0pAgA3A9ADIA8oAgAhCCAQKAIAIQIgAy8BrgIhBSADLQCtAiEGIAMtAKwCIQQgAygCqAJBAUcNCCAOKAIAIQkgA0HAA2ogA0HYA2ooAgA2AgAgAyADKQPQAzcDuAMCQCADKAK4ASILRQ0AIAMoArwBRQ0AIAsQ1QELAkAgAygCxAEiC0UNACADKALIAUUNACALENUBCyADKALQASILRQ0KIAMoAtQBRQ0KIAsQ1QEMCgsgA0IFNwKsAiADIAI2AqgCIANBqAJqQQUQByADKAKoAiICIAMoArACIgVqIgRB4ZHAACgAADYAACAEQQRqQeWRwAAtAAA6AAAgAygCrAIhCBCnASEGIANBsANqIANBsAJqKAIAIgQ2AgAgA0HAA2ogBDYCACADIAMpAqgCIhE3A6gDIAMgETcDmAMgAyARNwO4AyAFQQVqIQlBAyEEDAoLIANBwAFqIAIpAgQ3AwAgA0HIAWogAkEMaigCADYCACADQoCAgIAQNwO4ASADQagCaiADQbgBahAhIANB2ANqIgIgA0HEAmooAgA2AgAgAyADQbwCaikCADcD0AMgA0G0AmooAgAhCSADQbACaigCACEKIAMoAqwCIQggAygCqAJBAUcEQCADQbgBahAzIANBoANqIANBsANqKAIANgIAIAMgAykCqAM3A5gDIANBmAFqEJcBIANBqAJqIANBmAFqEJ0BIAMoAqgCQQFGBEAgA0HAAWogA0G0AmopAgA3AwAgAyADKQKsAjcDuAEMBwsgAygCrAIiB0EIaigCACECIANBsAJqLQAARQRAIAdBBGooAgAgAkYEfyAHQQEQByAHQQhqKAIABSACCyAHKAIAakEsOgAAIAdBCGoiAiACKAIAQQFqIgI2AgALIAdBBGooAgAgAkYEfyAHQQEQByAHQQhqKAIABSACCyAHKAIAakEiOgAAIAdBCGoiAiACKAIAQQFqNgIAIAdBBhAHIAIoAgAiBCAHKAIAaiIGQaWAwAAoAAA2AAAgBkEEakGpgMAALwAAOwAAIAIgBEEGajYCACAHQQIQByACKAIAIgQgBygCAGpBovQAOwAAIAIgBEECajYCACADQagCaiAHIAkQnAEgAygCqAJBAUYEQCADQcABaiADQbQCaikCADcDACADIAMpAqwCNwO4AQwGCyAJQQV0IQUgA0GwAmotAAAhBCADKAKsAiICQQRqIQsgCCEGA0AgBUUNBSAEQf8BcUUEQCACKAIIIgQgCygCAEYEfyACQQEQByACKAIIBSAECyACKAIAakEsOgAAIAIgAigCCEEBajYCCAsgA0GoAmogBiACEAkgBUFgaiEFQQAhBCAGQSBqIQYgAygCqAIiDEEDRg0ACyADKAKwAiECIAMoAqwCIQQgA0HEAWogAygCtAI2AgAgA0HAAWogAjYCACADIAQ2ArwBIAMgDDYCuAEMBQsgA0G4AmooAgAhBCADQaABaiIGIAIoAgA2AgAgAyADKQPQAzcDmAEgA0G4AWoQMyADQaADaiICIAYoAgA2AgAgAyADKQOYASIRNwO4AyADIBE3A6gDIAMgETcDmAMgAEEQaiAENgIAIABBDGogCTYCACAAQQhqIAo2AgAgACAINgIEIABBATYCACAAQRRqIAMpA5gDNwIAIABBHGogAigCADYCAAwKCxAeAAsgAhAfAAtBIBAfAAsgA0G4AWogAhCTAQsgAygCuAEiAkEDRwRAIANBwAFqIgQoAgAhBiADKAK8ASEFIANBxAFqIgcgBygCADYCACAEIAY2AgAgAyAFNgK8ASADIAI2ArgBDAELIANBuAFqIAdBABCUAQsgAAJ/IAMoArgBIgJBA0cEQCADQcQBaigCACEEIANBwAFqKAIAIQYgAygCvAEhBQJAIAMoApgBIgdFDQAgAygCnAFFDQAgBxDVAQsgA0HEAWogBDYCACADQcABaiAGNgIAIAMgBTYCvAEgAyACNgK4ASADQagCakHyjMAAQScgA0G4AWoQGiADQdgDaiADQcACaigCACICNgIAIAMgA0G4AmopAwAiETcD0AMgAykDqAIhEiAAQQxqIANBsAJqKQMANwIAIAAgEjcCBCAAQRRqIBE3AgAgAEEcaiACNgIAQQEMAQsgAykDmAEhESAAQQxqIAMoAqABNgIAIAAgETcCBEEACzYCACAJBEAgCUEFdCEFIAhBFGohAgNAAkAgAkF8aigCACIARQ0AIAIoAgBFDQAgABDVAQsgAkEgaiECIAVBYGoiBQ0ACwsgCkUgCkEFdEUgCEVycg0BIAgQ1QEMAQsCQCADKAK4ASIJRQ0AIAMoArwBRQ0AIAkQ1QELAkAgAygCxAEiCUUNACADKALIAUUNACAJENUBCwJAIAMoAtABIglFDQAgAygC1AFFDQAgCRDVAQsgBwRAIAoQ1QELIANBkAFqIANBwANqKAIANgIAIAMgAykCuAM3A4gBIANBmAFqEJcBIANBqAJqIANBmAFqEJ0BIAZBCHQgBHIgBUEQdHIhBQJAIAMoAqgCQQFGBEAgA0HAAWogA0G0AmopAgA3AwAgAyADKQKsAjcDuAEMAQsgAygCrAIiBEEIaigCACEGIANBsAJqLQAARQRAIARBBGooAgAgBkYEfyAEQQEQByAEQQhqKAIABSAGCyAEKAIAakEsOgAAIARBCGoiBiAGKAIAQQFqIgY2AgALIARBBGooAgAgBkYEfyAEQQEQByAEQQhqKAIABSAGCyAEKAIAakEiOgAAIARBCGoiBiAGKAIAQQFqNgIAIARBCBAHIAYoAgAiByAEKAIAakL2ysnL5qzasvIANwAAIAYgB0EIajYCACAEQQIQByAGKAIAIgcgBCgCAGpBovQAOwAAIAYgB0ECajYCACADQagCaiAEIAUgCBCaASADKAKoAiIGQQNHBEAgA0GwAmooAgAhBCADKAKsAiEIIANBxAFqIANBtAJqKAIANgIAIANBwAFqIAQ2AgAgAyAINgK8ASADIAY2ArgBDAELIANBuAFqIARBABCUAQsgAAJ/IAMoArgBIgRBA0cEQCADQcQBaigCACEGIANBwAFqKAIAIQggAygCvAEhBwJAIAMoApgBIglFDQAgAygCnAFFDQAgCRDVAQsgA0HEAWogBjYCACADQcABaiAINgIAIAMgBzYCvAEgAyAENgK4ASADQagCakGniMAAQSQgA0G4AWoQGiADQdgDaiADQcACaigCACIENgIAIAMgA0G4AmopAwAiETcD0AMgAykDqAIhEiAAQQxqIANBsAJqKQMANwIAIAAgEjcCBCAAQRRqIBE3AgAgAEEcaiAENgIAQQEMAQsgAykDmAEhESAAQQxqIAMoAqABNgIAIAAgETcCBEEACzYCACACRSAFRXINACAFENUBCwJAIAEoAhgiAEUNACABQRxqKAIARQ0AIAAQ1QELIAEoAigiAEUNBSABQSxqKAIARQ0FIAAQ1QEMBQsgB0UNACAKENUBCyADQZABaiADQcADaigCACIHNgIAIAMgAykDuAMiETcDiAEgAEEQaiAJNgIAIABBDGogCDYCACAAQQhqIAI2AgAgACAFOwEGIAAgBjoABSAAIAQ6AAQgAEEUaiARNwIAIABBHGogBzYCACAAQQE2AgALAkAgASgCGCIARQ0AIAFBHGooAgBFDQAgABDVAQsgASgCKCIARQ0CIAFBLGooAgBFDQIgABDVAQwCCyADKAJ4IQUgAygCfCEIIAMoAoABIQIgA0G4A2oQlwEgA0GoAmogA0G4A2pBnZbAAEEHEJ4BAkAgAygCqAJBAUYEQCADQaABaiADQbQCaikCADcDACADIAMpAqwCNwOYAQwBCyADIAMoAqwCNgKoAyADIANBsAJqLQAAOgCsAyADQagCaiADQagDakGklsAAQQUgCkF/ahALIAMoAqgCQQNHBEAgA0GgAWogA0GwAmopAwA3AwAgAyADKQOoAjcDmAEMAQsgA0GoAmogA0GoA2pBqZbAAEEEIAkQCyADKAKoAkEDRwRAIANBoAFqIANBsAJqKQMANwMAIAMgAykDqAI3A5gBDAELIANBmAFqIAMoAqgDIAMtAKwDEJUBCyADKAKYASIGQQNHBEAgA0GkAWooAgAhAiADQaABaigCACEEIAMoApwBIQcCQCADKAK4AyIJRQ0AIAMoArwDRQ0AIAkQ1QELIANBpAFqIAI2AgAgA0GgAWogBDYCACADIAc2ApwBIAMgBjYCmAEgA0GoAmpBz4vAAEEcIANBmAFqEBogA0HYA2ogA0HAAmooAgAiAjYCACADQfAAaiACNgIAIAMgA0G4AmopAwA3A2ggAygCqAIhAiADQbACaigCACEEIANBtAJqKAIAIQcgAygCrAIhBiAFRSAIRXJFBEAgBRDVAQsCQCADKAKIASIIRQ0AIAMoAowBRQ0AIAgQ1QELIAJBEHYhCCACQQh2IQlBASEFDAELIANB1AFqIAMoAsADNgIAIANBzAFqIAMpA7gDNwIAIANByAFqIAI2AgAgA0HEAWogCDYCACADQcABaiAFNgIAIANCAzcDuAEgA0GoAmogA0G4AWoQG0EBIQUCQAJ/An8CQAJAAkACQAJAIAMoAqgCQQFHBEAgA0GwAmooAgAhCyADQagCaiADKAKsAiIMIANBtAJqIgIoAgAQfQJAAkAgAygCqAJBAUcEQCADKAKsAkEBRg0BIANBsANqIANBuAJqKAIANgIAIAMgA0GwAmopAwA3A6gDIANBOGogA0GoA2oQciADQdADaiADKAI4IAMoAjwQigEgA0EwaiADQdADahCRASADLQAwQQFxRQRAQQQhBQwJCyADLQAxQfsARwRAQQ4hBQwJCyADQdADahCLASADQShqIANB0ANqEIkBIAMtACwgA0EgaiADKAIoIgkQkQEgAy0AIEEBcUUEQEECIQUMCQsgAy0AISEFQQFxIQhBACECAkADQAJAIAVB/wFxIgdBLEcEQCAHQf0ARg0DIAhB/wFxDQFBCSEFDAoLIAhB/wFxBEBBECEFDAoLIAkQiwEgA0EYaiAJEJEBIAMtABhBAXFFDQggAy0AGSEFCyAFQf8BcSIIQSJHBEBBE0EQIAhB/QBGGyEFDAkLIANBEGogCRCRASADLQAQQQFxRQ0HIAMtABFBIkcEQEEOIQUMCQsgCRCLASADQZgBaiAJEJABIAMoAqQBIQcgAygCoAEhCCADKAKcASEFAkACQAJAIAMoApgBQQFHBEBBASEKAkAgB0EGRw0AIAVB55bAAEcEQCAFQeeWwABBBhCqAg0BC0EAIQoLIAgEQCAFENUBCyAKRQ0BIANBmAFqIAkQjwEgAygCmAEiBUEWRg0CIAMoAqABIQcgAygCnAEhCCADIAMoAqQBIgQ2AsQDIAMgBzYCwAMgAyAINgK8AyADIAU2ArgDDAwLIAMoAqgBIQQMCwsCQCACRQRAIANBuANqIAkQjwEgAygCuAMiBUEWRg0BIAMoAsADIQcgAygCvAMhCCADIAMoAsQDIgQ2AqgBIAMgBzYCpAEgAyAINgKgASADIAU2ApwBIANBATYCmAEMDgsgA0GYAWpB55bAAEEGEBAgA0GkAWooAgAhBCADQaABaigCACEHIAMoApwBIQggAygCmAEhBSAGDQwMDQsgA0GYAWogCRAPIAMoApgBQQFGBEAgAygCqAEhBCADKAKkASEHIAMoAqABIQggAygCnAEhBQwNCyADKAKkASEEIAMoAqABIQYgAygCnAEhAgwBCyADQbgDaiAJEBEgAygCuAMiBUEWRw0HCyADQQhqIAkQkQFBACEIIAMtAAkhBSADLQAIQQFxDQALQQIhBQwHCyACRQRAIANBmAFqQeeWwABBBhASIANBpAFqKAIAIQQgA0GgAWooAgAhByADKAKcASEIIAMoApgBIQUMCQsgA0GYAWogA0HQA2oQjgEgA0GkAWohCCADQaABaiEJIAMoApgBIgVBFkcEQCAIKAIAIQQgCSgCACEHIAMoApwBIQggBkUNCSACENUBDAkLIANBmAFqIANB0ANqEIwBIAMoApgBIgVBFkcEQCAIKAIAIQQgCSgCACEHIAMoApwBIQggBkUNCSACENUBDAkLQQAMCQsgA0GwAWogA0HEAmooAgA2AgAgA0GoAWogA0G8AmopAgA3AwAgA0GgAWogAikCADcDACADIAMpAqwCNwOYASADQcwDakEBNgIAIANCATcCvAMgA0G8gsAANgK4AyADQQY2AqwDIAMgA0GoA2o2AsgDIAMgA0GYAWo2AqgDIANB0ANqIANBuANqEN0BEKcBIQkgAygC2AMhByADKALUAyEEIAMoAtADIQYgAygCmAEiAkEDTQRAAkACQAJAIAJBAWsOAwECBQALAkAgAygCnAEiAkUNACADQaABaigCAEUNACACENUBCyADQagBaigCACICRQ0EIANBrAFqKAIARQ0EIAIQ1QEMBAsCQCADKAKcASICRQ0AIANBoAFqKAIARQ0AIAIQ1QELIANBqAFqKAIAIgJFDQMgA0GsAWooAgBFDQMgAhDVAQwDCyADKAKcASICRQ0CIANBoAFqKAIARQ0CIAIQ1QEMAgsgAygCnAEiAkUNASADQaABaigCAEUNASACENUBDAELIANB2ANqIANBuAJqKAIANgIAIAMgA0GwAmopAwA3A9ADIANBrAFqQQE2AgAgA0IBNwKcASADQdyCwAA2ApgBIANBBzYCrAMgAyADQagDajYCqAEgAyADQdADajYCqAMgA0G4A2ogA0GYAWoQ3QEQpwEhCSADKALAAyEHIAMoArwDIQQgAygCuAMhBiADKALQAyICRQ0AIAMoAtQDRQ0AIAIQ1QELQQAhAkEADAcLIANBsAFqIANBqAJqQQRyIgJBGGooAgA2AgAgA0GoAWogAkEQaikCADcDACADQaABaiACQQhqKQIANwMAIAMgAikCADcDmAEgA0HMA2pBATYCACADQgE3ArwDIANBgIPAADYCuAMgA0EINgJsIAMgA0HoAGo2AsgDIAMgA0GYAWo2AmggA0HQA2ogA0G4A2oQ3QEQpwEhCSADKALYAyEHIAMoAtQDIQQgAygC0AMhBiADQZgBahAjIANB8ABqIANBsANqKAIANgIAIAMgAykCqAMiETcDmAMgAyARNwNoQQAhAkEAIQgMBwsgAygCxAMhBCADKALAAyEHIAMoArwDIQgMAQtBBCEFCyAGRSACRXINAQsgAhDVAQsgA0HEA2ogBDYCACADQcADaiAHNgIAIAMgCDYCvAMgAyAFNgK4AyADQZgBakHkiMAAQSMgA0G4A2oQEyADQfAAaiADQbABaigCADYCACADIANBqAFqKQMANwNoIANBoAFqKAIAIQQgA0GkAWooAgAhByADKAKYASECIAMoApwBIQZBAQshBQJAIAMoAqgDIghFDQAgAygCrANFDQAgCBDVAQsgAkEIdiEJIAJBEHYLIQggC0UNACAMENUBCyADQbgBahAzIAMoAogBIgpFDQAgAygCjAFFDQAgChDVAQsgA0HgAGoiCiADQfAAaigCADYCACADIAMpA2g3A1ggCUEIdEGA/gNxIAJB/wFxciAIQRB0ciECIAUEQCAAIAI2AgQgAEEBNgIAIABBEGogBzYCACAAQQxqIAQ2AgAgAEEIaiAGNgIAIABBFGogAykDWDcCACAAQRxqIAooAgA2AgAgASgCGCIARQ0BIAFBHGooAgBFDQEgABDVAQwBCyADIAQ2AlAgAyAGNgJMIAMgAjYCSCADQZgBahCXASADQagCaiADQZgBahCdAQJAIAMoAqgCQQFGBEAgA0HAAWogA0G0AmopAgA3AwAgAyADKQKsAjcDuAEMAQsgAygCrAIiAkEIaigCACEFIANBsAJqLQAARQRAIAJBBGooAgAgBUYEfyACQQEQByACQQhqKAIABSAFCyACKAIAakEsOgAAIAJBCGoiBCAEKAIAQQFqIgU2AgALIAJBBGooAgAgBUYEfyACQQEQByACQQhqKAIABSAFCyACKAIAakEiOgAAIAJBCGoiBCAEKAIAQQFqNgIAIAJBBhAHIAQoAgAiBiACKAIAaiIIQeeWwAAoAAA2AAAgCEEEakHrlsAALwAAOwAAIAQgBkEGajYCACACQQIQByAEKAIAIgYgAigCAGpBovQAOwAAIAQgBkECajYCACADQbgBaiADQcgAahBxIANBqAJqIAIgAygCuAEiBCADKALAARCaASADKAK8AQRAIAQQ1QELIAMoAqgCIgRBA0cEQCADQbACaigCACECIAMoAqwCIQYgA0HEAWogA0G0AmooAgA2AgAgA0HAAWogAjYCACADIAY2ArwBIAMgBDYCuAEMAQsgA0G4AWogAkEAEJQBCyAAAn8gAygCuAEiAkEDRwRAIANBxAFqKAIAIQQgA0HAAWooAgAhBiADKAK8ASEIAkAgAygCmAEiBUUNACADKAKcAUUNACAFENUBCyADQcQBaiAENgIAIANBwAFqIAY2AgAgAyAINgK8ASADIAI2ArgBIANBqAJqQeSIwABBIyADQbgBahAaIANB2ANqIANBwAJqKAIAIgI2AgAgAyADQbgCaikDACIRNwPQAyADKQOoAiESIABBDGogA0GwAmopAwA3AgAgACASNwIEIABBFGogETcCACAAQRxqIAI2AgBBAQwBCyADKQOYASERIABBDGogAygCoAE2AgAgACARNwIEQQALNgIAAkAgAygCSCIARQ0AIAMoAkxFDQAgABDVAQsgASgCGCIARQ0AIAFBHGooAgBFDQAgABDVAQsgA0HgA2okAAu1IAIYfwN+IwBB8AJrIgMkACADQeAAaiAAEH8gA0HwAGogARB/IANBgAFqIAIQfyADQcgBaiADKAJgIhEgAygCaBAUAkACQCADKALIAUEBRgRAIANBwAFqIANB5AFqKAIANgIAIANBuAFqIANB3AFqKQIANwMAIANBsAFqIANB1AFqKQIANwMAIAMgAykCzAE3A6gBIANBuAJqIANBqAFqEC4gA0HMAGogA0HAAmooAgA2AgAgA0EBNgJAIAMgAykDuAI3AkQgA0GoAWoQIwwBCyADQaABaiADQeABaiIAKQMANwMAIANBmAFqIANB2AFqIgEpAwA3AwAgAyADKQPQATcDkAEgA0HoAWooAgAhCyADQewBaigCACESIANB8AFqKQMAIRwgA0H4AWooAgAhDCADQfwBaigCACETIANBgAJqKQMAIR0gA0HIAWogAygCcCIXIAMoAngQFgJAIAMoAsgBQQFGBEAgA0HAAWogA0HkAWooAgA2AgAgA0G4AWogA0HcAWopAgA3AwAgA0GwAWogA0HUAWopAgA3AwAgAyADKQLMATcDqAEgA0G4AmogA0GoAWoQLiADQcwAaiADQcACaigCADYCACADQQE2AkAgAyADKQO4AjcCRCADQagBahAjDAELIAAoAgAhDSADQdwBaiIUKAIAIQ4gASgCACEPIANB1AFqIhUoAgAhGCADQdABaigCACEWIAMoAswBIRAgA0G4AmogAygCgAEiGSADKAKIARCKASADQThqIANBuAJqEJEBAkAgAy0AOEEBcUUEQEEEIQIMAQsgAy0AOUH7AEcEQEEOIQIMAQsgA0G4AmoQiwEgA0EwaiADQbgCahCJASADLQA0IQUgA0EoaiADKAIwIgQQkQEgAy0AKEEBcUUEQEECIQIMAQsgAy0AKSECIAVBAXEhBUEAIQBBACEBAkACQAJAAkACQAJAAkACQAJAA0ACQCACQf8BcSIHQSxHBEAgB0H9AEYNAyAFQf8BcQ0BIAAhBkEJIQIMCAsgBUH/AXEEQCAAIQZBECECDAgLIAQQiwEgA0EgaiAEEJEBIAMtACBBAXFFDQYgAy0AISECCyACQf8BcSIIQSJHBEBBEyECIAAhBiAIQf0ARg0HQRAhAgwHCyADQRhqIAQQkQEgAy0AGEEBcUUNBSADLQAZQSJHBEAgACEGQQ4hAgwHCyAEEIsBIANByAFqIAQQkAEgAygC1AEhByADKALQASEFIAMoAswBIQICQAJAAkACQAJAIAMoAsgBQQFHBEBBAiEIAkAgB0F4aiIHQQNLDQACQAJAIAdBAWsOAwICAQALIAJB5JTAAEcEQCACKQAAQvbKycvmrNqy8gBSDQILQQAhCAwBCyACQeyUwABHBEAgAkHslMAAQQsQqgINAQtBASEICyAFBEAgAhDVAQsgCEEBSw0BIAhBAWsNAgwDCyADKALYASEEDAkLIANByAFqIAQQjwEgAygCyAEiAkEWRg0CIAMoAtABIQYgAygCzAEhBSADIAMoAtQBIgQ2ArQBIAMgBjYCsAEgAyAFNgKsASADIAI2AqgBDAcLAkAgAEUEQCADQcgBaiAEEI8BQQAhBiADKALIASICQRZHBEAgAygC1AEhBCADKALQASEHIAMoAswBIQUMDAsgA0EIaiAEEJEBAn9BBCADLQAIQQFxRQ0AGkEOIAMtAAlBIkcNABogBBCLASADQcgBaiAEEJABIAMpA9ABIRsgAygCzAEhACADKALIAUEBRw0CIAMoAtgBIQQgAAshAiAbQiCIpyEHIBunIQUMCwsgA0HIAWpB5JTAAEEIEBAgAykCzAEiG0IgiKchByADQdQBaigCACEEIAMoAsgBIQIgG6chBQwICyAbQiCIpyEGIBunIQkMAgsCQCABRQRAIANByAFqIAQQjwEgAygCyAEiAkEWRwRAIAMoAtQBIQQgAygC0AEhByADKALMASEFDA4LIANBEGogBBCRAQJ/QQQgAy0AEEEBcUUNABpBDiADLQARQSJHDQAaIAQQiwEgA0HIAWogBBCQASADKQPQASEbIAMoAswBIQEgAygCyAFBAUcNAiADKALYASEEIAELIQIgG0IgiKchByAbpyEFDA0LIANByAFqQeyUwABBCxAQIAMpAswBIhtCIIinIQcgA0HUAWooAgAhBCADKALIASECIBunIQUgACEGIAoNCgwMCyAbQiCIpyEaIBunIQoMAQsgA0GoAWogBBARIAMoAqgBIgJBFkcNAwsgAyAEEJEBQQAhBSADLQABIQIgAy0AAEEBcQ0ACyAAIQZBAiECDAULIABFBEAgA0HIAWpB5JTAAEEIEBIgA0HUAWooAgAhBCADQdABaigCACEHIAMoAswBIQUgAygCyAEhAkEAIQYMBQsgAUUEQCADQcgBakHslMAAQQsQEiADQdQBaigCACEEIANB0AFqKAIAIQcgAygCzAEhBSADKALIASECIAlFDQkgABDVAQwJCyADQcgBaiADQbgCahCOASADQdQBaiEEIANB0AFqIQUgAygCyAEiAkEWRwRAIAQoAgAhBCAFKAIAIQcgAygCzAEhBSAJBEAgABDVAQsgCkUNCSABENUBDAkLIANByAFqIANBuAJqEIwBIAMoAsgBIgJBFkcEQCAEKAIAIQQgBSgCACEHIAMoAswBIQUgCQRAIAAQ1QELIApFDQkgARDVAQwJCyADQdABaiICIANBmAFqKQMANwMAIANB2AFqIgQgA0GgAWopAwA3AwAgA0GwAmogGjYCACADQawCaiAKNgIAIANBqAJqIAE2AgAgA0GgAmogCa0gBq1CIIaENwMAIANBmAJqIA02AgAgA0GUAmogDjYCACADQZACaiAPNgIAIANBjAJqIBg2AgAgA0GIAmogFjYCACADQfgBaiAdNwMAIANB9AFqIBM2AgAgA0HoAWogHDcDACADQeQBaiASNgIAIAMgAykDkAE3A8gBIAMgADYCnAIgAyAQNgKEAiADIAw2AvABIAMgCzYC4AEgAyADQegCajYCgAIgA0GoAWogA0HIAWogA0GEAmogA0GcAmoQRSADQcACaiIAIANBtAFqKQIANwMAIANByAJqIgEgA0G8AWopAgA3AwAgA0HQAmoiBiADQcQBaigCADYCACADIAMpAqwBNwO4AgJ/IAMoAqgBQQFGBEAgA0HgAWogBigCADYCACAEIAEpAwA3AwAgAiAAKQMANwMAIAMgAykDuAI3A8gBIANB2AJqIANByAFqEC8gA0HMAGogA0HgAmooAgA2AgAgA0EBNgJAIAMgAykD2AI3AkQgAy0AyAFBCEcEQCADQcgBahAjC0EBDAELIANB1ABqIAEpAwA3AgAgA0HMAGogACkDADcCACADIAMpA7gCNwJEIANBADYCQEEACyECIAMoAoQBBEAgGRDVAQsgAygCdARAIBcQ1QELIAMoAmRFDQsgERDVAQwLCyADKAK0ASEECyADKQKsASIbQiCIpyEHIBunIQULIAAhBgwBCyAAIQZBBCECCyAKRQ0BIAYhACABRQ0CCyABENUBCyAGIQALIAlFIABFcg0AIAAQ1QELIANBtAFqIAQ2AgAgAyACNgKoASADIAWtIAetQiCGhDcCrAEgA0HIAWpBnIvAAEEbIANBqAFqEBMgFSkCACEbIAMoAsgBIQAgAykCzAEhHCAUIBQpAgA3AgAgFSAbNwIAIAMgHDcCzAEgAyAANgLIASADQagBaiADQcgBahAuIANBzABqIANBsAFqKAIANgIAIANBATYCQCADIAMpA6gBNwJEIANByAFqECMgEEUgFkVyRQRAIBAQ1QELIA0EQCANQQV0IQEgD0EUaiECA0ACQCACQXxqKAIAIgBFDQAgAigCAEUNACAAENUBCyACQSBqIQIgAUFgaiIBDQALCyAORSAOQQV0RXINACAPENUBCyALRSASRXJFBEAgCxDVAQsgDEUgE0VyDQAgDBDVAQsCQCADKAKAASIARQ0AIAMoAoQBRQ0AIAAQ1QELAkAgAygCcCIARQ0AIAMoAnRFDQAgABDVAQsgAygCZARAIBEQ1QELQQEhAgsgA0GQAWoQlwEgA0FAa0EEciEBAkACQAJAAn8CQCACRQRAIAMoApgBIgAgAygClAFGBH8gA0GQAWpBARAHIAMoApgBBSAACyADKAKQAWpB+wA6AAAgAyADKAKYAUEBajYCmAEgA0HIAWogA0GQAWpBiIXAAEECEJoBIAMoAsgBIgBBA0cNASADKAKYASIAIAMoApQBRgR/IANBkAFqQQEQByADKAKYAQUgAAsgAygCkAFqQTo6AAAgAyADKAKYAUEBajYCmAEgA0HIAWogA0GQAWoQnQECQCADKALIAUEBRgRAIANBsAFqIANB1AFqKQIANwMAIAMgAykCzAE3A6gBDAELIAMgAygCzAE2AtgCIAMgA0HQAWoiAC0AADoA3AIgA0HIAWogA0HYAmogARBCIAMoAsgBQQNHBEAgA0GwAWogACkDADcDACADIAMpA8gBNwOoAQwBCyADQcgBaiADQdgCaiADQdAAahBEIAMoAsgBQQNHBEAgA0GwAWogA0HQAWopAwA3AwAgAyADKQPIATcDqAEMAQsgA0GoAWogAygC2AIgAy0A3AIQlAELIAMoAqgBIgBBA0YEQCADKAKYASIAIAMoApQBRgR/IANBkAFqQQEQByADKAKYAQUgAAsgAygCkAFqQf0AOgAAIAMgAygCmAFBAWoiADYCmAEMBgsgA0G0AWooAgAhAiADKAKsASEEIANBsAFqKAIADAILIANBuAJqIANBkAFqIAEQPyADKAK4AiIAQQNGDQMgA0HEAmooAgAhAiADQcACaigCACEBIAMoArwCIQQMAgsgA0HUAWooAgAhAiADKALMASEEIANB0AFqKAIACyEBIAMgADYCuAILAkAgAygCkAEiBkUNACADKAKUAUUNACAGENUBCyADQbQBaiACNgIAIANBsAFqIAE2AgAgAyAENgKsASADIAA2AqgBIANByAFqQaiHwABB4QAgA0GoAWoQGiADQcACaiADQdwBaiIAKQIAIhs3AwAgAyADQdQBaiIBKQIAIhw3A7gCIAMpA8gBIR0gA0HQAWoiAiACKAIANgIAIAEgHDcCACAAIBs3AgAgAyAdNwPIAUHcjsAAQSsgA0HIAWpBiI/AAEG8g8AAEPQBAAsgAygCmAEhAAsgAykDkAEhGyADIAA2AtABIAMgGzcDyAEgA0HIAWoQfgJAIAJFBEAgARAyIANB0ABqKAIAIQAgA0HYAGooAgAiAQRAIAAgAUEYbGohASAAIQIDQAJAIAIoAgAiBEUNACACQQRqKAIARQ0AIAQQ1QELAkAgAkEMaigCACIERQ0AIAJBEGooAgBFDQAgBBDVAQsgAkEYaiICIAFHDQALCyADQdQAaigCACIBRSABQRhsRXINASAAENUBDAELIAMoAkQiAEUNACADQcgAaigCAEUNACAAENUBCyADQfACaiQAC4k9AhF/A34jAEHABWsiAyQAIANBwANqIAAQfyADQdADaiABEH8gA0HgA2ogAhB/IANBsARqIAMoAsADIg8gAygCyAMQFAJAAkAgAygCsARBAUYEQCADQaAEaiADQcwEaigCADYCACADQZgEaiADQcQEaikCADcDACADQZAEaiADQbwEaikCADcDACADIAMpArQENwOIBCADQYgFaiADQYgEahAuIANBpANqIANBkAVqKAIANgIAIANBATYCmAMgAyADKQOIBTcCnAMgA0GIBGoQIwwBCyADQYAEaiADQcgEaiIAKQMANwMAIANB+ANqIANBwARqIgIpAwA3AwAgAyADKQO4BDcD8AMgA0HQBGooAgAhCSADQdQEaigCACEQIANB2ARqKQMAIRQgA0HgBGooAgAhCiADQeQEaigCACERIANB6ARqKQMAIRUgA0GwBGogAygC0AMiASADKALYAxAWAkAgAygCsARBAUYEQCADQaAEaiADQcwEaigCADYCACADQZgEaiADQcQEaikCADcDACADQZAEaiADQbwEaikCADcDACAD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IAMoAogEQQFGBEAgA0GgBWogBCgCADYCACADQZgFaiAAKQMANwMAIANBkAVqIANBuARqKQMANwMAIAMgAykDsAQ3A4gFIANBqAVqIANBiAVqEC8gA0GkA2ogA0GwBWooAgA2AgAgA0EBNgKYAyADIAMpA6gFNwKcAyADLQCIBUEIRg0BIANBiAVqECMMAQsgA0G8A2ogAigCADYCACADQbQDaiAEKQMANwIAIANBrANqIAApAwA3AgAgA0GkA2ogA0G4BGopAwA3AgAgAyADKQOwBDcCnAMgA0EANgKYAwsgAygC5AMEQCATENUBCyADKALUAwRAIAEQ1QELIAMoAsQDRQ0OIA8Q1QEMDgtBAiEEDAILQQ4hBAwBC0EEIQQLIARBCHYhACABrSACrUIghoQhFAwGC0ELIQQMBQtBAiEEDAILQQ4hBAwBC0EEIQQLIARBCHYhACABrSACrUIghoQhFAwBC0EEIQQLIARB/wFxIABBCHRyIQALIANBoANqIBQ3AwAgAyAFNgKcAyADIAA2ApgDIANBiARqQamKwABBHSADQZgDahATIANBygRqIANBoARqIgAoAgAiATYBACADQcIEaiADQZgEaiICKQMAIhQ3AQAgA0G6BGogA0GQBGoiBCkDACIVNwEAIAMgAykDiAQiFjcBsgQgACABNgIAIAIgFDcDACAEIBU3AwAgAyAWNwOIBCADQYgFaiADQYgEahAuIANBpANqIANBkAVqKAIANgIAIANBATYCmAMgAyADKQOIBTcCnAMgA0GIBGoQIyAORSASRXJFBEAgDhDVAQsgCwRAIAtBBXQhASANQRRqIQIDQAJAIAJBfGooAgAiAEUNACACKAIARQ0AIAAQ1QELIAJBIGohAiABQWBqIgENAAsLIAxFIAxBBXRFcg0AIA0Q1QELIAlFIBBFckUEQCAJENUBCyAKRSARRXINACAKENUBCwJAIAMoAuADIgBFDQAgAygC5ANFDQAgABDVAQsCQCADKALQAyIARQ0AIAMoAtQDRQ0AIAAQ1QELIAMoAsQDRQ0AIA8Q1QELIANB8ANqEJcBIANBmANqQQRyIQACQAJAAkACfwJAIAMoApgDQQFHBEAgAygC+AMiASADKAL0A0YEfyADQfADakEBEAcgAygC+AMFIAELIAMoAvADakH7ADoAACADIAMoAvgDQQFqNgL4AyADQbAEaiADQfADakGIhcAAQQIQmgEgAygCsAQiAUEDRw0BIAMoAvgDIgEgAygC9ANGBH8gA0HwA2pBARAHIAMoAvgDBSABCyADKALwA2pBOjoAACADIAMoAvgDQQFqNgL4AyADQbAEaiADQfADahCdAQJAIAMoArAEQQFGBEAgA0GQBGogA0G8BGopAgA3AwAgAyADKQK0BDcDiAQMAQsgAyADKAK0BDYCqAUgAyADQbgEaiIBLQAAOgCsBSADQbAEaiADQagFaiAAEEIgAygCsARBA0cEQCADQZAEaiABKQMANwMAIAMgAykDsAQ3A4gEDAELIANBsARqIANBqAVqIANBqANqEEQgAygCsARBA0cEQCADQZAEaiADQbgEaikDADcDACADIAMpA7AENwOIBAwBCyADQbAEaiADQagFaiADQbQDahBDIAMoArAEQQNHBEAgA0GQBGogA0G4BGopAwA3AwAgAyADKQOwBDcDiAQMAQsgA0GIBGogAygCqAUgAy0ArAUQlAELIAMoAogEIgFBA0YEQCADKAL4AyIBIAMoAvQDRgR/IANB8ANqQQEQByADKAL4AwUgAQsgAygC8ANqQf0AOgAAIAMgAygC+ANBAWoiATYC+AMMBgsgA0GUBGooAgAhAiADKAKMBCEEIANBkARqKAIADAILIANBiAVqIANB8ANqIAAQPyADKAKIBSIBQQNGDQMgA0GUBWooAgAhAiADQZAFaigCACEAIAMoAowFIQQMAgsgA0G8BGooAgAhAiADKAK0BCEEIANBuARqKAIACyEAIAMgATYCiAULAkAgAygC8AMiBUUNACADKAL0A0UNACAFENUBCyADQZQEaiACNgIAIANBkARqIAA2AgAgAyAENgKMBCADIAE2AogEIANBsARqQYeJwABB5QAgA0GIBGoQGiADQZAFaiADQcQEaiIAKQIAIhQ3AwAgAyADQbwEaiIBKQIAIhU3A4gFIAMpA7AEIRYgA0G4BGoiAiACKAIANgIAIAEgFTcCACAAIBQ3AgAgAyAWNwOwBEHcjsAAQSsgA0GwBGpBiI/AAEHcg8AAEPQBAAsgAygC+AMhAQsgAykD8AMhFCADIAE2ArgEIAMgFDcDsAQgA0GwBGoQfgJAIAMoApgDRQRAIAAQMiADQagDaigCACECIANBsANqKAIAIgAEQCACIABBGGxqIQADQAJAIAIoAgAiBEUNACACQQRqKAIARQ0AIAQQ1QELAkAgAkEMaigCACIERQ0AIAJBEGooAgBFDQAgBBDVAQsgAkEYaiICIABHDQALIAMoAqgDIQILIANBrANqKAIAIgBFIAJFciAAQRhsRXJFBEAgAhDVAQsgA0G0A2ooAgAiAEUNASADQbgDaigCAEUNASAAENUBDAELIAMoApwDIgBFDQAgA0GgA2ooAgBFDQAgABDVAQsgA0HABWokAAufKAIQfwN+IwBBsANrIgIkACACQdABaiAAEH8gAkHgAWogARB/IAJBqAJqIAIoAtABIg8gAigC2AEQFAJAAkAgAigCqAJBAUYEQCACQaACaiACQcQCaigCADYCACACQZgCaiACQbwCaikCADcDACACQZACaiACQbQCaikCADcDACACIAIpAqwCNwOIAiACQfgCaiACQYgCahAuIAJBzAFqIAJBgANqKAIANgIAIAJBATYCwAEgAiACKQP4AjcCxAEgAkGIAmoQIyACKALgASEBDAELIAJBgAJqIAJBwAJqKQMANwMAIAJB+AFqIAJBuAJqKQMANwMAIAIgAikDsAI3A/ABIAJByAJqKAIAIQ0gAkHMAmooAgAhECACQdACaikDACESIAJB2AJqKAIAIQ4gAkHcAmooAgAhESACQeACaikDACEUIAJB+AJqIAIoAuABIgEgAigC6AEQigEgAkG4AWogAkH4AmoQkQECQAJAAkAgAi0AuAFBAXFFDQACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAIAItALkBIgBB+wBHBEAgAEEiRg0BQQohAAwWCyACQfgCahCLASACQagCaiACQfgCaiIFED0gAkG0AmohBCACQbACaiEDAkACfyACLQCoAkEBRgRAIAJBuAJqKAIAIQUgBCgCACEJIAIoAqwCIQAgAygCAAwBCyACLQCpAiEJIAJBqAJqIAUQjwEgAigCqAIiAEEWRg0BIAQoAgAhBSADKAIAIQkgAigCrAILIQQgAEEIdiEKIAmtIAWtQiCGhCESDBYLAkACQAJAIAlBAWsOAgQAAQsgAkGwAWogBRCRASACLQCwAUEBcUUEQEEEIQAMFgsgAi0AsQFB+wBHBEBBDiEADBYLIAUQiwEgAkGoAWogBRCJASACKAKoASELIAIgAi0ArAFBAXEiBjoAxAEgAiALNgLAASACQaABaiALEJEBIAItAKABQQFxRQ0UIAItAKEBIQAgBiEDA0ACQAJAAkACQCAAQf8BcSIEQSxHBEAgBEH9AEYNBCAGQf8BcQ0BQQkhAAwbCyADQf8BcUUNAQtBACEGIAJBADoAxAEMAQsgCxCLASACQZgBaiALEJEBIAItAJgBQQFxRQ0WIAItAJkBIQALIABB/wFxIglBIkcEQEEQIQAgCUH9AEcNGEETIQAMGAsgAkGIAWogCxCRASACLQCIAUEBcUUNFSACLQCJAUEiRwRAQQ4hAAwYCyALEIsBIAJBqAJqIAsQkAEgAigCtAIhAyACKAKwAiEEIAIoAqwCIQACQAJAAkACQAJAIAIoAqgCQQFHBEBBAiEJAkAgA0F8aiIDQQFLDQAgA0EBa0UEQCAAQaSWwABHBEAgAEGklsAAQQUQqgINAgtBACEJDAELIABBqZbAAEcEQCAAKAAAQffeydsGRw0BC0EBIQkLIAQEQCAAENUBCyAJQQFLDQEgCUEBaw0CDAMLIAIoArgCIQUMHAsgAkGoAmogCxCPASACKAKoAiIAQRZGDQIgAigCsAIhAyACKAKsAiEEIAIgAigCtAIiBTYClAIgAiADNgKQAiACIAQ2AowCIAIgADYCiAIMGwsCQCAMQQFHBEAgAkGoAmogAkHAAWoQOiACKAKsAiEHIAIoAqgCQQFHDQEgAkG4AmooAgAhBSACQbQCaigCACEDIAJBsAJqKAIAIQQgByEADBwLIAJBqAJqQaSWwABBBRAQDBgLQQEhDAwCCyAKQQFGDQUgAkGoAmogAkHAAWoQOiACKAKsAiEIIAIoAqgCQQFGBEAgAkG4AmooAgAhBSACQbQCaigCACEDIAJBsAJqKAIAIQQgCCEADBoLQQEhCgwBCyACQYgCaiALEBEgAigCiAIiAEEWRw0UCyACQYABaiALEJEBQQAhAyACLQCBASEAIAItAIABQQFxDQEMFgsLIAxBAUcNECAKQQFHBEAgAkGoAmpBqZbAAEEEEBIMEwsgAkGoAmogBRCOASACKAKoAiIAQRZHBEAgAkG0AmooAgAhBSACQbACaigCACEDIAIoAqwCIQQMFgsgAkGQAWogBRCRAUEAIQogAi0AkAFBAXFFDRYgAi0AkQFB/QBHDQ8gBRCLASAIrSETQQIMBAsgAkE4aiAFEJEBIAItADhBAXFFDQwgAi0AOUH7AEcNCyAFEIsBIAJBMGogBRCJASACLQA0IQQgAkEoaiACKAIwIgMQkQEgAi0AKEEBcUUNCiACLQApIQAgBEEBcSEEA0ACQAJAAkAgAEH/AXEiBkEsRwRAIAZB/QBGDQIgBEH/AXENAUEJIQAMEgsgBEH/AXEEQEEQIQAMEgsgAxCLASACQSBqIAMQkQEgAi0AIEEBcUUNECACLQAhIQALIABB/wFxIgZBIkcEQEEQIQAgBkH9AEcNEUETIQAMEQsgAkEQaiADEJEBIAItABBBAXFFDQ8gAi0AEUEiRw0OIAMQiwEgAkGoAmogAxCQASACKAKwAiEEIAIoAqwCIQAgAigCqAJBAUcEQCAARSAERXINAiAAENUBDAILIABBFkYNASACKAK4AiEDIAIoArQCIQUMEAsgAkGoAmogBRCOASACKAKoAiIAQRZHBEAgAkG0AmooAgAhAyACQbACaigCACEFIAIoAqwCIQQMEAsgAkEYaiAFEJEBIAItABhBAXFFDRcgAi0AGUH9AEcNECAFEIsBQQAMBQsgAkGoAmogAxCPASACKAKoAiIAQRZHBEAgAigCsAIhBSACKAKsAiEEIAIgAigCtAIiAzYClAIgAiAFNgKQAiACIAQ2AowCIAIgADYCiAIMDwsgAkGIAmogAxARIAIoAogCIgBBFkcEQCACKAKUAiEDIAIoApACIQUgAigCjAIhBAwPCyACQQhqIAMQkQFBACEEIAItAAkhACACLQAIQQFxDQALDAoLIAJBqAJqQamWwABBBBAQDBALIAJBqAJqIAJB+AJqED0gAi8ArQIgAi0ArwJBEHRyQQAgAi0AqAJBAUYiABshCiACLQCsAkEOIAAbIQAgAkG0AmopAgAhEiACQbACaigCACEEDBQLIAJB+ABqIAUQkQEgAi0AeEEBcUUEQEEEIQAMBwsgAi0AeUH7AEcEQEEOIQAMBwsgBRCLASACQfAAaiAFEIkBIAItAHQhBCACQegAaiACKAJwIggQkQEgAi0AaEEBcUUEQEECIQAMBwsgAi0AaSEAIARBAXEhBAJAAkACQANAAkAgAEH/AXEiA0EsRwRAIANB/QBGDQMgBEH/AXENAUEJIQAMCgsgBEH/AXEEQEEQIQAMCgsgCBCLASACQeAAaiAIEJEBIAItAGBBAXFFDQggAi0AYSEACyAAQf8BcSIEQSJHBEBBE0EQIARB/QBGGyEADAkLIAJB0ABqIAgQkQEgAi0AUEEBcUUNByACLQBRQSJHBEBBDiEADAkLIAgQiwEgAkGoAmogCBCQASACKAK0AiEDIAIoArACIQQgAigCrAIhAAJAAkACQCACKAKoAkEBRwRAQQEhCQJAIANBB0cNACAAQcCAwABHBEAgAEHAgMAAQQcQqgINAQtBACEJCyAEBEAgABDVAQsgCUUNASACQagCaiAIEI8BIAIoAqgCIgBBFkYNAiACKAKwAiEDIAIoAqwCIQQgAiACKAK0AiIFNgKUAiACIAM2ApACIAIgBDYCjAIgAiAANgKIAgwMCyACKAK4AiEFDAsLIAcNBCACQagCaiAIEI8BIAIoAqgCIgBBFkcEQCACKAK0AiEFIAIoArACIQMgAigCrAIhBAwNCyACQcgAaiAIEJEBAkACf0EEIAItAEhBAXFFDQAaQQ4gAi0ASUEiRw0AGiAIEIsBIAJBqAJqIAgQkAEgAikDsAIhEyACKAKsAiEHIAIoAqgCQQFHDQEgAigCuAIhBSAHCyEAIBNCIIinIQMgE6chBAwNCyATQiCIpyEMIBOnIQYMAQsgAkGIAmogCBARIAIoAogCIgBBFkcNBwsgAkFAayAIEJEBQQAhBCACLQBBIQAgAi0AQEEBcQ0AC0ECIQAMBwsgB0UEQCACQagCakHAgMAAQQcQEiACQbQCaigCACEFIAJBsAJqKAIAIQMgAigCrAIhBCACKAKoAiEADAkLIAJBqAJqIAUQjgEgAigCqAIiAEEWRg0BIAJBtAJqKAIAIQUgAkGwAmooAgAhAyACKAKsAiEEIAZFDQggBxDVAQwICyACQagCakHAgMAAQQcQECACQbQCaigCACEFIAJBsAJqKAIAIQMgAigCrAIhBCACKAKoAiEAIAYNBgwHCyACQdgAaiAFEJEBIAItAFhBAXFFBEBBBCEAIAZFDRQgBxDVAQwUCyACLQBZQf0ARw0BIAUQiwEgBq0gDK1CIIaEIRNBAQshACACQagCaiACQfgCahCMASACQbACaiEDIAIoAqgCIgpBFkcEQCACKAKsAiEEIAM1AgAgAkG0Amo1AgBCIIaEIRIgE6dFIAdFIABBAUdycg0UIAcQ1QEMFAsgAyACQfgBaikDADcDACACQbgCaiIGIAJBgAJqKQMANwMAIAJB7AJqIBM3AgAgAkHoAmogBzYCACACQdgCaiAUNwMAIAJB1AJqIBE2AgAgAkHIAmogEjcDACACQcQCaiAQNgIAIAIgAikD8AE3A6gCIAIgADYC5AIgAiAONgLQAiACIA02AsACIAIgAkGoA2o2AuACIAJBiAJqIAJBqAJqIAJB5AJqEEwgAkGAA2ogAkGUAmopAgA3AwAgAkGIA2oiACACQZwCaikCADcDACACQZADaiIHIAJBpAJqKAIANgIAIAIgAikCjAI3A/gCQQEhAwJAIAIoAogCQQFGBEAgAkHAAmogBygCADYCACAGIAApAwA3AwAgAkGwAmogAkGAA2opAwA3AwAgAiACKQP4AjcDqAIgAkGYA2ogAkGoAmoQLiACQcwBaiACQaADaigCADYCACACIAIpA5gDNwLEASACQagCahAjDAELIAJBzAFqIAJBgANqKAIANgIAIAIgAikD+AI3AsQBQQAhAwsgAiADNgLAASACKALkAQRAIAEQ1QELIAIoAtQBRQ0VIA8Q1QEMFQtBCyEAIAZFDREgBxDVAQwRCyACKAKUAiEFIAIoApACIQMgAigCjAIhBAwBC0EEIQALIAZFIAdFcg0BCyAHENUBCyAAQQh2IQogA60gBa1CIIaEIRIMDAtBAiEADAILQQ4hAAwBC0EEIQALIABBCHYhCiAFrSADrUIghoQhEgwIC0ELIQAMBwsgAkGoAmpBpJbAAEEFEBIMAQsgAigClAIhBSACKAKQAiEDIAIoAowCIQQMAwsgAkG0AmooAgAhBSACQbACaigCACEDIAIoAqwCIQQgAigCqAIhAAwCC0EEIQAMAQtBAiEACyAAQQh2IQogA60gBa1CIIaEIRIMAQtBBCEACyAAQf8BcSAKQQh0ciEKCyACQZACaiIAIBI3AwAgAiAENgKMAiACIAo2AogCIAJBqAJqQc+LwABBHCACQYgCahATIAJBoANqIAJBwAJqIgMoAgAiBjYCACACIAJBuAJqIgcpAwAiEjcDmAMgAikDqAIhEyACQbACaiIIIAgpAwA3AwAgByASNwMAIAMgBjYCACACIBM3A6gCIAJBiAJqIAJBqAJqEC4gAkHMAWogACgCADYCACACQQE2AsABIAIgAikDiAI3AsQBIAJBqAJqECMgDUUgEEVyRQRAIA0Q1QELIA5FIBFFcg0AIA4Q1QELAkAgAUUNACACKALkAUUNACABENUBCyACKALUAUUNACAPENUBCyACQfABahCXASACQcABakEEciEBAkACQAJAIAIoAsABQQFHBEAgAigC+AEiACACKAL0AUYEfyACQfABakEBEAcgAigC+AEFIAALIAIoAvABakH7ADoAACACIAIoAvgBQQFqNgL4ASACQagCaiACQfABakGIhcAAQQIQmgECQCACKAKoAiIAQQNGBEAgAigC+AEiACACKAL0AUYEfyACQfABakEBEAcgAigC+AEFIAALIAIoAvABakE6OgAAIAIgAigC+AFBAWo2AvgBIAJB+AJqIAEQcSACQagCaiACQfABaiACKAL4AiIAIAIoAoADEJoBIAIoAvwCBEAgABDVAQsgAigCqAIiAEEDRw0BIAIoAvgBIgAgAigC9AFGBH8gAkHwAWpBARAHIAIoAvgBBSAACyACKALwAWpB/QA6AAAgAiACKAL4AUEBaiIBNgL4AQwDCyACQbQCaigCACEBIAJBsAJqKAIAIQMMAwsgAkGwAmooAgAhAyACQbQCaigCACEBDAILIAJBiAJqIAJB8AFqIAEQPyACKAKIAiIAQQNHBEAgAkGUAmooAgAhASACQZACaigCACEDIAIoAowCIQYMAwsgAigC+AEhAQsgAikD8AEhEiACIAE2ArACIAIgEjcDqAIgAkGoAmoQfiACKALEASIARSACQcgBaigCAEVyIQECQCACKALAAUUEQCABDQEgABDVAQwBCyABDQAgABDVAQsgAkGwA2okAA8LIAIoAqwCIQYgAiAANgKIAgsCQCACKALwASIHRQ0AIAIoAvQBRQ0AIAcQ1QELIAJBlAJqIAE2AgAgAkGQAmogAzYCACACIAY2AowCIAIgADYCiAIgAkGoAmpBxorAAEHWACACQYgCahAaIAJBgANqIAJBvAJqIgApAgAiEjcDACACIAJBtAJqIgEpAgAiEzcD+AIgAikDqAIhFCACQbACaiIDIAMoAgA2AgAgASATNwIAIAAgEjcCACACIBQ3A6gCQdyOwABBKyACQagCakGIj8AAQcyDwAAQ9AEAC9UdAhV/A34jAEHwAmsiAyQAIANB6ABqIAAQfyADQfgAaiABEH8gA0GIAWogAhB/IANB2AFqIAMoAmgiDSADKAJwEBQCQAJAIAMoAtgBQQFGBEAgA0HIAWogA0H0AWooAgA2AgAgA0HAAWogA0HsAWopAgA3AwAgA0G4AWogA0HkAWopAgA3AwAgAyADKQLcATcDsAEgA0G4AmogA0GwAWoQLiADQcwAaiADQcACaigCADYCACADQQE2AkAgAyADKQO4AjcCRCADQbABahAjDAELIANBqAFqIANB8AFqIgApAwA3AwAgA0GgAWogA0HoAWoiAikDADcDACADIAMpA+ABNwOYASADQfgBaigCACEIIANB/AFqKAIAIQ4gA0GAAmopAwAhGSADQYgCaigCACEJIANBjAJqKAIAIQ8gA0GQAmopAwAhGiADQdgBaiADKAJ4IhQgAygCgAEQFgJAIAMoAtgBQQFGBEAgA0HIAWogA0H0AWooAgA2AgAgA0HAAWogA0HsAWopAgA3AwAgA0G4AWogA0HkAWopAgA3AwAgAyADKQLcATcDsAEgA0G4AmogA0GwAWoQLiADQcwAaiADQcACaigCADYCACADQQE2AkAgAyADKQO4AjcCRCADQbABahAjDAELIAAoAgAhASADQewBaiIQKAIAIQogAigCACELIANB5AFqIhEoAgAhFSADQeABaigCACESIAMoAtwBIQwgA0FAayADKAKIASIWIAMoApABEIoBIANBOGogA0FAaxCRAQJAIAMtADhBAXFFBEBBBCECDAELIAMtADlB+wBHBEBBDiECDAELIANBQGsQiwEgA0EwaiADQUBrEIkBIAMtADQhBSADQShqIAMoAjAiBBCRASADLQAoQQFxRQRAQQIhAgwBCyADLQApIQIgBUEBcSEFQQAhAAJAAkACQAJAAkACQAJAAkADQAJAIAJB/wFxIgZBLEcEQCAGQf0ARg0DIAVB/wFxDQFBCSECDAkLIAVB/wFxBEBBECECDAkLIAQQiwEgA0EgaiAEEJEBIAMtACBBAXFFDQcgAy0AISECCyACQf8BcSIFQSJHBEBBE0EQIAVB/QBGGyECDAgLIANBGGogBBCRASADLQAYQQFxRQ0GIAMtABlBIkcEQEEOIQIMCAsgBBCLASADQdgBaiAEEJABIAMoAuQBIQYgAygC4AEhBSADKALcASECAkACQAJAIAMoAtgBQQFHBEBBASETAkAgBkEIRw0AIAJB5JTAAEcEQCACKQAAQvbKycvmrNqy8gBSDQELQQAhEwsgBQRAIAIQ1QELIBNFDQEgA0HYAWogBBCPASADKALYASICQRZGDQIgAygC4AEhBSADKALcASEGIAMgAygC5AEiBDYCvAEgAyAFNgK4ASADIAY2ArQBIAMgAjYCsAEMCQsgAygC6AEhBAwKCyAADQQgA0HYAWogBBCPASADKALYASICQRZHBEAgAygC5AEhBCADKALgASEGIAMoAtwBIQUMDAsgA0EQaiAEEJEBAkACf0EEIAMtABBBAXFFDQAaQQ4gAy0AEUEiRw0AGiAEEIsBIANB2AFqIAQQkAEgAykD4AEhGCADKALcASEAIAMoAtgBQQFHDQEgAygC6AEhBCAACyECIBhCIIinIQYgGKchBQwMCyAYQiCIpyEXIBinIQcMAQsgA0GwAWogBBARIAMoArABIgJBFkcNBQsgA0EIaiAEEJEBQQAhBSADLQAJIQIgAy0ACEEBcQ0AC0ECIQIMBgsgAEUEQCADQdgBakHklMAAQQgQEiADQeQBaigCACEEIANB4AFqKAIAIQYgAygC3AEhBSADKALYASECDAgLIANB2AFqIANBQGsQjgEgA0HkAWohBCADQeABaiEFIAMoAtgBIgJBFkcEQCAEKAIAIQQgBSgCACEGIAMoAtwBIQUgB0UNCCAAENUBDAgLIANB2AFqIANBQGsQjAEgAygC2AEiAkEWRg0BIAQoAgAhBCAFKAIAIQYgAygC3AEhBSAHRQ0HIAAQ1QEMBwsgA0HYAWpB5JTAAEEIEBAgAykC3AEiGEIgiKchBiADQeQBaigCACEEIAMoAtgBIQIgGKchBSAHDQUMBgsgA0HgAWoiAiADQaABaikDADcDACADQegBaiIEIANBqAFqKQMANwMAIANBsAJqIAetIBetQiCGhDcDACADQagCaiABNgIAIANBpAJqIAo2AgAgA0GgAmogCzYCACADQZwCaiAVNgIAIANBmAJqIBI2AgAgA0GIAmogGjcDACADQYQCaiAPNgIAIANB+AFqIgEgGTcDACADQfQBaiAONgIAIAMgAykDmAE3A9gBIAMgADYCrAIgAyAMNgKUAiADIAk2AoACIAMgCDYC8AEgAyADQegCajYCkAIgA0GwAWogA0HYAWogA0GUAmogA0GsAmoQRiACIANBvAFqKQIANwMAIAQgA0HEAWopAgA3AwAgA0HwAWoiACADQcwBaikCADcDACABIANB1AFqKAIANgIAIAMgAykCtAE3A9gBAkAgAygCsAFBAUYEQCADQdACaiAAKAIANgIAIANByAJqIAQpAwA3AwAgA0HAAmogAikDADcDACADIAMpA9gBNwO4AiADQdgCaiADQbgCahAvIANBzABqIANB4AJqKAIANgIAIANBATYCQCADIAMpA9gCNwJEIAMtALgCQQhGDQEgA0G4AmoQIwwBCyADQeQAaiABKAIANgIAIANB3ABqIAApAwA3AgAgA0HUAGogBCkDADcCACADQcwAaiACKQMANwIAIAMgAykD2AE3AkQgA0EANgJACyADKAKMAQRAIBYQ1QELIAMoAnwEQCAUENUBCyADKAJsRQ0IIA0Q1QEMCAsgAygCvAEhBAsgAykCtAEiGEIgiKchBiAYpyEFDAELQQQhAgsgB0UgAEVyDQELIAAQ1QELIANBvAFqIAQ2AgAgAyACNgKwASADIAWtIAatQiCGhDcCtAEgA0HYAWpBiYjAAEEeIANBsAFqEBMgA0HAAmogECkCACIYNwMAIAMgESkCACIZNwO4AiADKALYASEAIAMpAtwBIRogESAZNwIAIBAgGDcCACADIBo3AtwBIAMgADYC2AEgA0GwAWogA0HYAWoQLiADQcwAaiADQbgBaigCADYCACADQQE2AkAgAyADKQOwATcCRCADQdgBahAjIAxFIBJFckUEQCAMENUBCyABBEAgAUEFdCEBIAtBFGohAgNAAkAgAkF8aigCACIARQ0AIAIoAgBFDQAgABDVAQsgAkEgaiECIAFBYGoiAQ0ACwsgCkUgCkEFdEVyDQAgCxDVAQsgCEUgDkVyRQRAIAgQ1QELIAlFIA9Fcg0AIAkQ1QELAkAgAygCiAEiAEUNACADKAKMAUUNACAAENUBCwJAIAMoAngiAEUNACADKAJ8RQ0AIAAQ1QELIAMoAmxFDQAgDRDVAQsgA0GYAWoQlwEgA0FAa0EEciEAAkACQAJAAn8CQCADKAJAQQFHBEAgAygCoAEiASADKAKcAUYEfyADQZgBakEBEAcgAygCoAEFIAELIAMoApgBakH7ADoAACADIAMoAqABQQFqNgKgASADQdgBaiADQZgBakGIhcAAQQIQmgEgAygC2AEiAUEDRw0BIAMoAqABIgEgAygCnAFGBH8gA0GYAWpBARAHIAMoAqABBSABCyADKAKYAWpBOjoAACADIAMoAqABQQFqNgKgASADQdgBaiADQZgBahCdAQJAIAMoAtgBQQFGBEAgA0G4AWogA0HkAWopAgA3AwAgAyADKQLcATcDsAEMAQsgAyADKALcATYC2AIgAyADQeABaiIBLQAAOgDcAiADQdgBaiADQdgCaiAAEEIgAygC2AFBA0cEQCADQbgBaiABKQMANwMAIAMgAykD2AE3A7ABDAELIANB2AFqIANB2AJqIANB0ABqEEQgAygC2AFBA0cEQCADQbgBaiADQeABaikDADcDACADIAMpA9gBNwOwAQwBCyADQdgBaiADQdgCaiADQdwAahBDIAMoAtgBQQNHBEAgA0G4AWogA0HgAWopAwA3AwAgAyADKQPYATcDsAEMAQsgA0GwAWogAygC2AIgAy0A3AIQlAELIAMoArABIgFBA0YEQCADKAKgASIBIAMoApwBRgR/IANBmAFqQQEQByADKAKgAQUgAQsgAygCmAFqQf0AOgAAIAMgAygCoAFBAWoiATYCoAEMBgsgA0G8AWooAgAhAiADKAK0ASEEIANBuAFqKAIADAILIANBuAJqIANBmAFqIAAQPyADKAK4AiIBQQNGDQMgA0HEAmooAgAhAiADQcACaigCACEAIAMoArwCIQQMAgsgA0HkAWooAgAhAiADKALcASEEIANB4AFqKAIACyEAIAMgATYCuAILAkAgAygCmAEiBUUNACADKAKcAUUNACAFENUBCyADQbwBaiACNgIAIANBuAFqIAA2AgAgAyAENgK0ASADIAE2ArABIANB2AFqQeuLwABB5wAgA0GwAWoQGiADQcACaiADQewBaiIAKQIAIhg3AwAgAyADQeQBaiIBKQIAIhk3A7gCIAMpA9gBIRogA0HgAWoiAiACKAIANgIAIAEgGTcCACAAIBg3AgAgAyAaNwPYAUHcjsAAQSsgA0HYAWpBiI/AAEGsg8AAEPQBAAsgAygCoAEhAQsgAykDmAEhGCADIAE2AuABIAMgGDcD2AEgA0HYAWoQfgJAIAMoAkBFBEAgABAyIANB0ABqKAIAIQIgA0HYAGooAgAiAARAIAIgAEEYbGohAANAAkAgAigCACIERQ0AIAJBBGooAgBFDQAgBBDVAQsCQCACQQxq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ACACIAMpAgA3A1AgAigCbAwCCyACLQBpDQALQRYLIQMgAkHIAGoiBCACQdgAaigCADYCACACIAIpA1A3A0AgA0EWRw0BIAJB6ABqIAEQjgEgAigCaCIBQRZGBEAgAEEWNgIADAULIAJB9ABqKAIAIQMgAkHwAGooAgAhBCAAIAIoAmw2AgQgACABNgIAIABBDGogAzYCACAAQQhqIAQ2AgAMBAsgAEEENgIADAMLIAAgAzYCACAAIAIpA0A3AgQgAEEMaiAEKAIANgIADAILIAJBIGogARCRAQJAIAItACBBAXEEQCACLQAhQdsARwRAIABBDjYCAAwECyABEIsBIAJBGGogARCJASACKAIYIQMgAiACLQAcQQFxOgBkIAIgAzYCYCACQfAAaiEDAn8DQCACQegAaiACQeAAahBnIAItAGhBAUYEQCACQdgAaiADQQhqKAIANgIAIAIgAykCADcDUCACKAJsDAILIAItAGkNAAtBFgshAyACQcgAaiIEIAJB2ABqKAIANgIAIAIgAikDUDcDQCADQRZHDQEgAkHoAGogARCNASACKAJoIgFBFkYEQCAAQRY2AgAMBAsgAkH0AGooAgAhAyACQfAAaigCACEEIAAgAigCbDYCBCAAIAE2AgAgAEEMaiADNgIAIABBCGogBDYCAAwDCyAAQQQ2AgAMAgsgACADNgIAIAAgAikDQDcCBCAAQQxqIAQoAgA2AgAMAQsgAkEIaiABEJIBIAItAAhBAXEEQCACLQAJIQMDQCADQSxGIANB/QBGckVBACADQd0ARxtFBEAgAEEWNgIADAMLIAEQiwEgAiABEJIBIAItAAEhAyACLQAAQQFxDQALCyAAQQM2AgALIAJBgAFqJAALIgAgACgCBCAAQQxqIABBCGogACgCAEEBRhsoAgAgARCQAgvNAgEDfyMAQTBrIgIkACACQQhqIAEoAgAQkQECQAJAAkACQAJAIAItAAhBAXEEQCACLQAJIgMiBEEsRg0CIARB3QBGDQEgAS0ABA0DIABBAToAACAAQQRqQQc2AgAMBQsgAEEBOgAAIABBBGpBATYCAAwECyAAQQA7AQAMAwsgASgCABCLASACIAEoAgAQkQEgAi0AAEEBcQRAIAItAAEhAwwCCyAAQQE6AAAgAEEEakEENgIADAILIAFBADoABAsgA0HdAEcEQCAC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DAILQZCcwABBJEGAnMAAEOQBAAsCQCADRQRAQQEhDSACENUBDAELIAIgAUEBIAMQUiINRQ0CCyAFIAM2AjQgBSANNgIwIAUoAjghBAsgBSgCMCEBEKcBIQIgBUEIaiAFQdAAaigCACIMNgIAIAUgBSkCSCIVNwMAIABBEGogBDYCACAAQQxqIAM2AgAgAEEIaiABNgIAIABBBmogBkEQdjsBACAAIAI6AAUgAEEBOgAEIABBFGogFTcCACAAQRxqIAw2AgAgAEEBNgIADAMLIANBARDcAQALQaCXwABBNyAFQcgAakHAmsAAQaCYwAAQ9AEACyAAQQxqIAQ2AgAgAEEIaiADNgIAIABBBmogDUEQdjsBACAAIA1BCHY6AAUgACANOgAEIABBADYCAAsgBUHgAGokAAvwAwEEfyMAQSBrIgIkACACIAEQkQECQCACLQAAQQFxBEAgAi0AAUEiRwRAIABBAToAACAAQQRqQQ42AgAMAgsgARCLASACQQhqIAEQkAEgAkEUaigCACEDIAJBEGooAgAhBSACKAIMIQEgAigCCEEBRwRAAkACQAJAAkAgA0F5aiIEQQxLDQACQAJAAkACQCAEQQFrDgwEBAQEBAQEAAEEBAMCCyABQfWuwABHBEAgAUH1rsAAQQ8QqgINBAsgAEEAOwEADAYLIAFBkK/AAEYNAyABQZCvwABBEBCqAkUNAyABQaivwABHBEAgAUGor8AAQRAQqgINAwsgAEGABDsBAAwFCyABQbyvwABHBEAgAUG8r8AAQQcQqgINAgsgAEGABjsBAAwECyABQcOvwABGDQIgAUHDr8AAQRMQqgJFDQILIAJBCGogASADQdivwABBBRBjIABBAToAACAAQQxqIAJBEGopAwA3AgAgAEEEaiACKQMINwIADAILIABBgAI7AQAMAQsgAEGACDsBAAsgBUUNAiABENUBDAILIAJBGGooAgAhBCAAQQE6AAAgAEEQaiAENgIAIABBDGogAzYCACAAQQhqIAU2AgAgAEEEaiABNgIADAELIABBAToAACAAQQRqQQQ2AgALIAJBIGokAAvzAgEEfyMAQSBrIgIkACACIAEQkQECQCACLQAAQQFxBEAgAi0AAUEiRwRAIABBAToAACAAQQRqQQ42AgAMAgsgARCLASACQQhqIAEQkAEgAkEUaigCACEDIAJBEGooAgAhBSACKAIMIQEgAigCCEEBRwRAAkACQAJAIANBfmoiBEEDSw0AAkACQCAEQQFrDgMCAgEACyABQYCwwABHBEAgAS8AAEHv1gFHDQILIABBADsBAAwDCyABQYSvwABGDQEgAUGEr8AAQQUQqgJFDQELIAJBCGogASADQYSwwABBAhBjIABBAToAACAAQQxqIAJBEGopAwA3AgAgAEEEaiACKQMINwIADAELIABBgAI7AQALIAVFDQIgARDVAQwCCyACQRhqKAIAIQQgAEEBOgAAIABBEGogBDYCACAAQQxqIAM2AgAgAEEIaiAFNgIAIABBBGogATYCAAwBCyAAQQE6AAAgAEEEakEENgIACyACQSBqJAALHQAgASgCAEUEQAALIABBhKjAADYCBCAAIAE2AgALVQECfyABKAIAIQIgAUEANgIAAkAgAgRAIAEoAgQhA0EIQQQQUSIBRQ0BIAEgAzYCBCABIAI2AgAgAEGEqMAANgIEIAAgATYCAA8LAAtBCEEEENwBAAtbAQF/IwBBMGsiAiQAIAJBHGpBATYCACACQgE3AgwgAkGYl8AANgIIIAJBHTYCJCACIAA2AiwgAiACQSBqNgIYIAIgAkEsajYCICABIAJBCGoQhgIgAkEwaiQACxwAIAAgASkCADcCACAAQQhqIAFBCGooAgA2AgALpwECA38BfiMAQSBrIgMkAAJAIAJBf0oEQAJAIAJFBEBBASEFDAELIAIhBCACQQEQUSIFRQ0CCyADQQA2AhggAyAFNgIQIAMgBDYCFCADQRBqIAIQByADKAIYIgQgAygCEGogASACEKgCGiADQQhqIAIgBGoiATYCACADIAMpAxAiBjcDACAAQQhqIAE2AgAgACAGNwIAIANBIGokAA8LEB4ACyACEB8AC6wCAQZ/IwBBMGsiAiQAIAEoAgAhByACQRBqIAEoAggiBBChAQJAAkACQAJAAkAgAigCEARAIAIoAhQiAUF/TA0BAkAgAUUEQEEBIQMMAQsgASEFIAEQyQEiA0UNAwsgAkEIaiAEEKEBIAIoAghFDQMgAigCDCIGIAFLDQQgByAEIAMgBhCgASACQRhqIAMgARCVAiACKAIYQQFGDQUgACABNgIIIAAgBTYCBCAAIAM2AgAgAkEwaiQADwtB+KbAAEEtQainwAAQUwALEB4ACyABEB8A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ACAAQcgAajYCOCAAIABBxABqNgIwIAAgAEFAazYCKCAAQRBqQYDawAAQvwEACyAAKAIIIgEgASgCACIBQX9qNgIAIAFBAUYEQCAAQQhqELsBCyAAQeAAaiQACzAAIAAgACgCBCIAIAEgABs2AgQgAEUgACABRnJFBEBB5NvAAEE2QbTcwAAQtgEACws1AQF/IwBBEGsiAiQAIAIgATYCDCACIAA2AgggAkGM18AANgIEIAJBjNfAADYCACACEMoBAAu1AwIEfwF+IwBBMGsiASQAAkACQAJAAkACf0EAIAAoAgAiAkUNABogASAAKQIENwIkIAEgAjYCICABQRBqIAFBIGoQbyABQQhqQQAgASgCECIAIAEoAhgQ9wEgASgCCA0BIAFBKGogAUEYaigCADYCACABIAEpAxA3AyAgASABQSBqEMEBIAEoAgQhBCABKAIACyECQeiGwQAtAAANAUHohsEAQQE6AAACQEHwgsEAKQMAIgVCf1IEQEHwgsEAIAVCAXw3AwAgBUIAUg0BQbjXwABBK0HY2sAAEOQBAAtBkNrAAEE3QcjawAAQtgEAC0HohsEAQQA6AABBAUEBEFEiA0UNAiADQQA6AABBMEEIEFEiAEUNAyAAQgE3AiQgAEEANgIYIAAgBDYCFCAAIAI2AhAgACAFNwMIIABCgYCAgBA3AwAgACADrTcCHCABQTBqJAAgAA8LIAEoAgwhAiABQShqIAEpAhQ3AwAgASAANgIkIAEgAjYCIEHo2sAAQS8gAUEgakGE2MAAQZjbwAAQ9AEAC0H838AAQSBBuODAABC2AQALQQFBARDcAQALQTBBCBDcAQALugEBA38gARC6ASABKAIIIgIgAUEEaiIDKAIAIgRGBEAgAUEBEAcgAygCACEEIAEoAgghAgsgASACQQFqIgM2AgggASgCACIBIAJqQQA6AAACQCADIARGBEAgASECDAELAkAgBCADTwRAIAQNASABIQIMAgtB0NjAAEEkQZzVwAAQ5AEACyADRQRAQQEhAiABENUBDAELIAEgBEEBIAMQUiICDQAgA0EBENwBAAsgACADNgIEIAAgAjYCAAsJACAAQQA2AgALPAECfyAAKAIIIgFB8MvAACgCAEYEfyAAKAIAIgBB7MvAACgCACICRgRAQQEPCyAAIAIgARCqAkUFQQALC7oDAQV/IwBB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AiACEQIADAELIABBxubAAEEBIAIRAgALIgE6AAQLIAFB/wFxQQBHC8MCAgN/An4jAEFAaiIDJAAgAAJ/QQEgAC0ACA0AGiAAKAIEIQUgACgCACIELQAAQQRxRQRAQQEgBCgCGEHB5sAAQcvmwAAgBRtBAkEBIAUbIARBHGooAgAoAgwRAgANARogASAAKAIAIAIoAgwRAAAMAQsgBUUEQEEBIAQoAhhByebAAEECIARBHGooAgAoAgwRAgANARogACgCACEECyADQQE6ABcgA0E0akGg5sAANgIAIAMgBCkCGDcDCCADIANBF2o2AhAgBCkCCCEGIAQpAhAhByADIAQtACA6ADggAyAHNwMoIAMgBjcDICADIAQpAgA3AxggAyADQQhqNgIwQQEgASADQRhqIAIoAgwRAAANABogAygCMEG/5sAAQQIgAygCNCgCDBECAAs6AAggACAAKAIEQQFqNgIEIANBQGskAAuWAQECfyAALQAIIQEgACgCBCICBEAgAUH/AXEhASAAAn9BASABDQAaAkAgAkEBRw0AIAAtAAlFDQAgACgCACICLQAAQQRxDQBBASACKAIYQczmwABBASACQRxqKAIAKAIMEQIADQEaCyAAKAIAIgEoAhhBzebAAEEBIAFBHGooAgAoAgwRAgALIgE6AAgLIAFB/wFxQQBHC7wCAgN/An4jAEFAaiIDJAACf0EBIAAtAAQNABogAC0ABSEFIAAoAgAiBC0AAEEEcUUEQCABIAUEf0EBIAQoAhhBwebAAEECIARBHGooAgAoAgwRAgANAhogACgCAAUgBAsgAigCDBEAAAwBCyAFRQRAQQEgBCgCGEHO5sAAQQEgBEEcaigCACgCDBECAA0BGiAAKAIAIQQLIANBAToAFyADQTRqQaDmwAA2AgAgAyAEKQIYNwMIIAMgA0EXajYCECAEKQIIIQYgBCkCECEHIAMgBC0AIDoAOCADIAc3AyggAyAGNwMgIAMgBCkCADcDGCADIANBCGo2AjBBASABIANBGGogAigCDBEAAA0AGiADKAIwQb/mwABBAiADKAI0KAIMEQIACyEFIABBAToABSAAIAU6AAQgA0FAayQACwsAIAAgASACEPsBCzIBAX9BASEBIAAtAAQEfyABBSAAKAIAIgAoAhhB4ObAAEEBIABBHGooAgAoAgwRAgALC/oB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Ag0ACyAAQYABaiICQYEBTw0CIAFBiOfAAEECIAAgBGpBgAFqQQAgAGsQhAIMAQtBACEAA0AgACAEakH/AGogAkEPcSIDQTByIANBN2ogA0EKSRs6AAAgAEF/aiEAIAJBBHYiAg0ACyAAQYABaiICQYEBTw0CIAFBiOfAAEECIAAgBGpBgAFqQQAgAGsQhAILIARBgAFqJAAPCyACQYABQfjmwAAQ5gEACyACQYABQfjmwAAQ5gEACwwAIAAoAgAgARDuAQv2AQECfyMAQRBrIgIkACABKAIYQZH8wABBCSABQRxqKAIAKAIMEQIAIQMgAkEAOgAFIAIgAzoABCACIAE2AgAgAiAANgIMIAJBmvzAAEELIAJBDGpB9PvAABDxASACIABBBGo2AgwgAkGl/MAAQQkgAkEMakGw/MAAEPEBIAItAAQhASACLQAFBEAgAUH/AXEhACACAn9BASAADQAaIAIoAgAiAEEcaigCACgCDCEBIAAoAhghAyAALQAAQQRxRQRAIANBx+bAAEECIAERAgAMAQsgA0HG5sAAQQEgARECAAsiAToABAsgAkEQaiQAIAFB/wFxQQBHC1YBAX4CQCADQcAAcUUEQCADRQ0BIAJBACADa0E/ca2GIAEgA0E/ca0iBIiEIQEgAiAEiCECDAELIAIgA0E/ca2IIQFCACECCyAAIAE3AwAgACACNwMIC3IBAn4gACADQiCIIgQgAUIgiCIFfiACIAN+fEIAfCADQv////8PgyICIAFC/////w+DIgF+IgNCIIggAiAFfnwiAkIgiHwgASAEfiACQv////8Pg3wiAUIgiHw3AwggACADQv////8PgyABQiCGhDcDAAtWAQF+AkAgA0HAAHFFBEAgA0UNASACIANBP3GtIgSGIAFBACADa0E/ca2IhCECIAEgBIYhAQwBCyABIANBP3GthiECQgAhAQsgACABNwMAIAAgAjcDCAu5AgIDfwV+IwBBMGsiAyQAAkACQAJ+IAJQBEAgAUKQzgCADAELQb9/QTIgAnmnayIEayEFIARBwQBqIQQMAQshAUIAIQIMAQsgAyABIAIgBUH/AHEQpQIgA0EQaiABIAIgBEH/AHEQowIgA0EIaikDACECIANBGGopAwAhCCADKQMAIQEgAykDECEGIAQEQANAIAhCAYYgBkI/iIQiCCAGQgGGIAJCP4iEIgZCf4UiB0KQzgB8IAdUrSAIQn+FQgB8fEI/hyIHQgCDfSAGIAdCkM4AgyIJVK19IQggBiAJfSEGIAJCAYYgAUI/iIQhAiABQgGGIAqEIQEgB0IBgyIHIQogBEF/aiIEDQALCyACQgGGIAFCP4iEIQIgByABQgGGhCEBCyAAIAE3AwAgACACNwMIIANBMGokAAs4AQF/IwBBEGsiAyQAIAMgASACEKYCIAMpAwAhASAAIANBCGopAwA3AwggACABNwMAIANBEGokAAszAQF/IAIEQCAAIQMDQCADIAEtAAA6AAAgAUEBaiEBIANBAWohAyACQX9qIgINAAsLIAALIQAgAQRAA0AgAEEAOgAAIABBAWohACABQX9qIgENAAsLC0MBA38CQCACRQ0AA0AgAC0AACIEIAEtAAAiBUYEQCAAQQFqIQAgAUEBaiEBIAJBf2oiAg0BDAILCyAEIAVrIQMLIAMLC6uCAQkAQYCAwAALpRthdHRlbXB0IHRvIGFkZCB3aXRoIG92ZXJmbG93Q29pbmRlbm9tYW1vdW50QmFua1F1ZXJ5YWxsX2JhbGFuY2VzYWRkcmVzc2JhbGFuY2VXYXNtUXVlcnlyYXdjb250cmFjdF9hZGRya2V5c21hcnRtc2d3YXNtc3Rha2luZ2N1c3RvbWJhbmtTdGFraW5nUXVlcnl2YWxpZGF0b3JzZGVsZWdhdGlvbmRlbGVnYXRvcnZhbGlkYXRvcmFsbF9kZWxlZ2F0aW9uc2JvbmRlZF9kZW5vbUFsbEJhbGFuY2VSZXNwb25zZWJsb2NrY29udHJhY3RFbXB0eWhlaWdodHRpbWV0aW1lX25hbm9zY2hhaW5faWRzZW5kZXJzZW50X2Z1bmRzUXVlcmllciBzeXN0ZW0gZXJyb3I6IAAAJAEQABYAAABRdWVyaWVyIGNvbnRyYWN0IGVycm9yOiBEARAAGAAAAFNlcmlhbGl6aW5nIFF1ZXJ5UmVxdWVzdDogAABkARAAGgAAAC9jb2RlL3BhY2thZ2VzL3N0ZC9zcmMvZXhwb3J0cy5ycwAAAIgBEAAhAAAAmgAAAA0AAACIARAAIQAAAFwAAAANAAAAiAEQACEAAACwAAAADQAAAIgBEAAhAAAAewAAAA0AAABCYW5rTXNnc2VuZGZyb21fYWRkcmVzc3RvX2FkZHJlc3NXYXNtTXNnaW5zdGFudGlhdGVjb2RlX2lkbGFiZWxleGVjdXRlU3Rha2luZ01zZ3JlZGVsZWdhdGVzcmNfdmFsaWRhdG9yZHN0X3ZhbGlkYXRvcndpdGhkcmF3cmVjaXBpZW50dW5kZWxlZ2F0ZWRlbGVnYXRlZXJyb3Jva0luaXRSZXNwb25zZWF0dHJpYnV0ZXNIYW5kbGVSZXNwb25zZWNhbm5vdCBjb252ZXJ0IENvbnRleHQgd2l0aCBkYXRhIHRvIEluaXRSZXNwb25zZU1pZ3JhdGVSZXNwb25zZUF0dHJpYnV0ZXZhbHVlABEAAAAIAAAABAAAABIAAAATAAAAEAMQAAAAAABhIERpc3BsYXkgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3IgdW5leHBlY3RlZGx5L3J1c3RjL2QzZmIwMDVhMzllNjI1MDFiOGIwYjM1NjE2NmU1MTVhZTI0ZTJlNTQvc3JjL2xpYmFsbG9jL3N0cmluZy5ycwAAAE8DEABGAAAAsAgAAAkAAABjb3Ntd2FzbV9zdGQ6OnJlc3VsdHM6OmNvbnRyYWN0X3Jlc3VsdDo6Q29udHJhY3RSZXN1bHQ8Y29zbXdhc21fc3RkOjpyZXN1bHRzOjppbml0OjpJbml0UmVzcG9uc2U+aGFja2F0b206OmNvbnRyYWN0OjpNaWdyYXRlTXNnaGFja2F0b206OmNvbnRyYWN0OjpWZXJpZmllclJlc3BvbnNlaGFja2F0b206OmNvbnRyYWN0OjpTdGF0ZWhhY2thdG9tOjpjb250cmFjdDo6UmVjdXJzZVJlc3BvbnNlY29zbXdhc21fc3RkOjpyZXN1bHRzOjpjb250cmFjdF9yZXN1bHQ6OkNvbnRyYWN0UmVzdWx0PGNvc213YXNtX3N0ZDo6cmVzdWx0czo6aGFuZGxlOjpIYW5kbGVSZXNwb25zZT5jb3Ntd2FzbV9zdGQ6OnF1ZXJ5OjpRdWVyeVJlcXVlc3Q8Y29zbXdhc21fc3RkOjp0eXBlczo6RW1wdHk+aGFja2F0b206OmNvbnRyYWN0OjpIYW5kbGVNc2djb3Ntd2FzbV9zdGQ6OnJlc3VsdHM6OmNvbnRyYWN0X3Jlc3VsdDo6Q29udHJhY3RSZXN1bHQ8Y29zbXdhc21fc3RkOjplbmNvZGluZzo6QmluYXJ5PmhhY2thdG9tOjpjb250cmFjdDo6SW5pdE1zZ2Nvc213YXNtX3N0ZDo6dHlwZXM6OkVudmhhY2thdG9tOjpjb250cmFjdDo6UXVlcnlNc2djb3Ntd2FzbV9zdGQ6OnJlc3VsdHM6OmNvbnRyYWN0X3Jlc3VsdDo6Q29udHJhY3RSZXN1bHQ8Y29zbXdhc21fc3RkOjpyZXN1bHRzOjptaWdyYXRlOjpNaWdyYXRlUmVzcG9uc2U+Y29zbXdhc21fc3RkOjp0eXBlczo6TWVzc2FnZUluZm9jb3Ntd2FzbV9zdGQ6OnF1ZXJ5OjpBbGxCYWxhbmNlUmVzcG9uc2UAAAARAAAABAAAAAQAAAAUAAAAFQAAABYAAAAvcnVzdGMvZDNmYjAwNWEzOWU2MjUwMWI4YjBiMzU2MTY2ZTUxNWFlMjRlMmU1NC9zcmMvbGliY29yZS9tYWNyb3MvbW9kLnJzY2FsbGVkIGBSZXN1bHQ6OnVud3JhcF9lcnIoKWAgb24gYW4gYE9rYCB2YWx1ZQAXAAAADAAAAAQAAAAYAAAAFwAAAAwAAAAEAAAAGQAAABEAAAAAAAAAAQAAABoAAABjYWxsZWQgYFJlc3VsdDo6dW53cmFwKClgIG9uIGFuIGBFcnJgIHZhbHVlABsAAAAcAAAABAAAAA4AAAC0BhAASQAAAAoAAAAJAAAAVHJpZWQgdG8gc2hyaW5rIHRvIGEgbGFyZ2VyIGNhcGFjaXR5bWlzc2luZyBmaWVsZCBgYMwHEAAPAAAA2wcQAAEAAABkdXBsaWNhdGUgZmllbGQgYAAAAOwHEAARAAAA2wcQAAEAAAB1bmtub3duIHZhcmlhbnQgYGAsIHRoZXJlIGFyZSBubyB2YXJpYW50cwAAABAIEAARAAAAIQgQABgAAABgLCBleHBlY3RlZCAQCBAAEQAAAEwIEAAMAAAAaW52YWxpZCBVaW50MTI4ICcnIC0gAAAAaAgQABEAAAB5CBAABAAAAGludmFsaWQgYmFzZTY0OiCQCBAAEAAAABEAAAAIAAAABAAAABwAAABoZXJlIHdlIGdvIPCfmoBjb25maWdMZXQgdGhlaGFja2luZyBiZWdpblN0YXRlYWN0aW9ucmVsZWFzZWRlc3RpbmF0aW9u8Auqc3JjL2NvbnRyYWN0LnJzAQkQAA8AAACzAAAACQAAAHRlc3Qua2V5AQkQAA8AAADBAAAACQAAAG11c3Qgbm90IGJlIGVtcHR5AAAAAQkQAA8AAADJAAAAFQAAAAEJEAAPAAAAyQAAABMAAABFcnJvciBpbiBtZW1vcnkuZ3JvdyBpbnN0cnVjdGlvblRoaXMgcGFnZSBpbnRlbnRpb25hbGx5IGZhdWx0ZWQAAQkQAA8AAADiAAAABQAAAAEJEAAPAAAA6QAAAAsAAABVbmV4cGVjdGVkIGVycm9yIGluIGRvX3VzZXJfZXJyb3JzX2luX2FwaV9jYWxsczogAAAAzAkQADEAAABibjkzaGc5MzRoZzA4cTM0MGc4dTRqY2F1MwAAAQkQAA8AAAD1AAAACwAAAAEJEAAPAAAAAwEAAAsAAAABCRAADwAAAA8BAAALAAAAAQkQAA8AAAAbAQAACwAAAHZlcmlmaWVyYmVuZWZpY2lhcnlmdW5kZXJjcHVfbG9vcHN0b3JhZ2VfbG9vcG1lbW9yeV9sb29wYWxsb2NhdGVfbGFyZ2VfbWVtb3J5cGFuaWN1c2VyX2Vycm9yc19pbl9hcGlfY2FsbHMAAOwIEAAHAAAAfQoQAAgAAACFChAADAAAAJEKEAALAAAAnAoQABUAAACxChAABQAAALYKEAAYAAAAUXVlcnlNc2dvdGhlcl9iYWxhbmNlcmVjdXJzZWRlcHRod29yawAAAGQKEAAIAAAAEAsQAA0AAAAdCxAABwAAAFZlcmlmaWVyUmVzcG9uc2VSZWN1cnNlUmVzcG9uc2VoYXNoZWRVbmF1dGhvcml6ZWQAAABtCxAADAAAACcAAAAIAAAABAAAACgAAAApAAAAmAsQAAAAAABhIERpc3BsYXkgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3IgdW5leHBlY3RlZGx5L3J1c3RjL2QzZmIwMDVhMzllNjI1MDFiOGIwYjM1NjE2NmU1MTVhZTI0ZTJlNTQvc3JjL2xpYmFsbG9jL3N0cmluZy5ycwAAANcLEABGAAAAsAgAAAkAAABjb3Ntd2FzbV9zdGQ6OnJlc3VsdHM6OnN5c3RlbV9yZXN1bHQ6OlN5c3RlbVJlc3VsdDxjb3Ntd2FzbV9zdGQ6OnJlc3VsdHM6OmNvbnRyYWN0X3Jlc3VsdDo6Q29udHJhY3RSZXN1bHQ8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EABEAAAADQAAABcAAAB1c2l6ZSBvdmVyZmxvdyB3aGVuIGNhbGN1bGF0aW5nIGJ1ZmZlciBzaXplAAQTEABVAAAAfQAAABgAAAAEExAAVQAAAIAAAAAfAAAAJwAAAAgAAAAEAAAAMgAAAGludmFsaWQgYmFzZTY0OiAUFBAAEAAAAFVuc3VwcG9ydGVkIHF1ZXJ5IHR5cGU6ICwUEAAYAAAAVW5rbm93biBzeXN0ZW0gZXJyb3JMFBAAFAAAAE5vIHN1Y2ggY29udHJhY3Q6IAAAaBQQABIAAABDYW5ub3QgcGFyc2UgcmVzcG9uc2U6ICBpbjoghBQQABcAAACbFBAABQAAAENhbm5vdCBwYXJzZSByZXF1ZXN0OiAAALAUEAAWAAAAmxQQAAUAAABjYW5vbmljYWxpemVfYWRkcmVzcyBlcnJvcmVkOiAAANgUEAAeAAAAaHVtYW5pemVfYWRkcmVzcyBlcnJvcmVkOiAAAAAVEAAaAAAAL2NvZGUvcGFja2FnZXMvc3RkL3NyYy9tZW1vcnkucnNSZWdpb24gcG9pbnRlciBpcyBudWxsAAAkFRAAIAAAADkAAAAFAAAAUmVnaW9uIHN0YXJ0cyBhdCBudWxsIHBvaW50ZXIAAAAkFRAAIAAAAD8AAAAFAAAASHVtYW5BZGRyQ2Fub25pY2FsQWRkcgAAJwAAAAQAAAAEAAAAMwAAAEJpbmFyeQAAJwAAAAQAAAAEAAAANAAAAENhbm5vdCBzdWJ0cmFjdCAgZnJvbSAAANwVEAAQAAAA7BUQAAYAAABVbmF1dGhvcml6ZWQEFhAADAAAAEVycm9yIHNlcmlhbGl6aW5nIHR5cGUgOiAAAAAYFhAAFwAAAC8WEAACAAAARXJyb3IgcGFyc2luZyBpbnRvIHR5cGUgRBYQABgAAAAvFhAAAgAAACBub3QgZm91bmQAAJgLEAAAAAAAbBYQAAoAAABDYW5ub3QgZGVjb2RlIFVURjggYnl0ZXMgaW50byBzdHJpbmc6IAAAiBYQACYAAABJbnZhbGlkIEJhc2U2NCBzdHJpbmc6IAC4FhAAFwAAAEdlbmVyaWMgZXJyb3I6IADYFhAADwAAAFVuZGVyZmxvd21pbnVlbmRzdWJ0cmFoZW5kYmFja3RyYWNlACcAAAAEAAAABAAAADUAAABTZXJpYWxpemVFcnJzb3VyY2Vtc2dQYXJzZUVycnRhcmdldE5vdEZvdW5ka2luZEludmFsaWRVdGY4SW52YWxpZEJhc2U2NEdlbmVyaWNFcnJpbnZhbGlkX3JlcXVlc3RlcnJvcnJlcXVlc3RpbnZhbGlkX3Jlc3BvbnNlcmVzcG9uc2Vub19zdWNoX2NvbnRyYWN0YWRkcnVua25vd251bnN1cHBvcnRlZF9yZXF1ZXN0AAB1FxAADwAAAJAXEAAQAAAAqBcQABAAAAC8FxAABwAAAMMXEAATAAAAb2sAAAAYEAACAAAAhBcQAAUAAAA4AAAACAAAAAQAAAA5AAAAOgAAADgAAAAIAAAABAAAADsAAAAoGBAAAAAAAEludmFsaWQgSlNPTkpTT04gaGFzIGEgY29tbWEgYWZ0ZXIgdGhlIGxhc3QgdmFsdWUgaW4gYW4gYXJyYXkgb3IgbWFwLkpTT04gaGFzIG5vbi13aGl0ZXNwYWNlIHRyYWlsaW5nIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIHZhbHVlLkZvdW5kIGEgbG9uZSBzdXJyb2dhdGUsIHdoaWNoIGNhbiBleGlzdCBpbiBKU09OIGJ1dCBjYW5ub3QgYmUgZW5jb2RlZCB0byBVVEYtOC5PYmplY3Qga2V5IGlzIG5vdCBhIHN0cmluZy5JbnZhbGlkIHVuaWNvZGUgY29kZSBwb2ludC5JbnZhbGlkIHR5cGVJbnZhbGlkIG51bWJlci5JbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZS5FeHBlY3RlZCB0aGlzIGNoYXJhY3RlciB0byBzdGFydCBhIEpTT04gdmFsdWUuRXhwZWN0ZWQgdG8gcGFyc2UgZWl0aGVyIGEgYHRydWVgLCBgZmFsc2VgLCBvciBhIGBudWxsYC5FeHBlY3RlZCB0aGlzIGNoYXJhY3RlciB0byBiZSBlaXRoZXIgYSBgJywnYCBvciBhIGAnfSdgLkV4cGVjdGVkIGEgbG93IHN1cnJvZ2F0ZSAoREMwMOKAk0RGRkYpLkV4cGVjdGVkIHRoaXMgY2hhcmFjdGVyIHRvIGJlIGVpdGhlciBhIGAnLCdgIG9yYSBgJ10nYC5FeHBlY3RlZCBhIGhpZ2ggc3Vycm9nYXRlIChEODAw4oCTREJGRikuRXhwZWN0ZWQgdGhpcyBjaGFyYWN0ZXIgdG8gYmUgYSBgJzonYC5FT0Ygd2hpbGUgcGFyc2luZyBhIEpTT04gdmFsdWUuRU9GIHdoaWxlIHBhcnNpbmcgYSBzdHJpbmcuRU9GIHdoaWxlIHBhcnNpbmcgYW4gb2JqZWN0LkVPRiB3aGlsZSBwYXJzaW5nIGEgbGlzdC5Db250cm9sIGNoYXJhY3RlciBmb3VuZCBpbiBzdHJpbmcuL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL3NlcmRlLWpzb24td2FzbS0wLjIuMS9zcmMvZGUvdW5lc2NhcGUucnMAAFQbEABiAAAAJQAAABUAQdC3wAALkQRhdHRlbXB0IHRvIGFkZCB3aXRoIG92ZXJmbG93VBsQAGIAAAAzAAAAKQAAAAAAAABhdHRlbXB0IHRvIHN1YnRyYWN0IHdpdGggb3ZlcmZsb3dOb24taGV4IEFTQ0lJIGNoYXJhY3RlciBmb3VuZAAAVBsQAGIAAACZAAAADgAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9zZXJkZS1qc29uLXdhc20tMC4yLjEvc3JjL2RlL21vZC5ycwAAAFAcEABdAAAAHgAAAAkAAABQHBAAXQAAAIkAAAA0AAAAUBwQAF0AAAB7AAAAKwAAAFAcEABdAAAAewAAACAAAABQHBAAXQAAAHwAAAAhAAAAVW5rbm93biBzZXJpYWxpemF0aW9uIGVycm9yAAAdEAAbAAAAQnVmZmVyIGlzIGZ1bGwAACQdEAAOAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL3NlcmRlLWpzb24td2FzbS0wLjIuMS9zcmMvc2VyL21vZC5ycwAAPB0QAF4AAADMAAAACQAAADwdEABeAAAA0QAAAAkAAAAAAAAAYXR0ZW1wdCB0byBzdWJ0cmFjdCB3aXRoIG92ZXJmbG93AEHwu8AAC6ETYXR0ZW1wdCB0byBhZGQgd2l0aCBvdmVyZmxvdy91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9iYXNlNjQtMC4xMS4wL3NyYy9lbmNvZGUucnMAAAAMHhAAVQAAAJcAAAAnAAAAdXNpemUgb3ZlcmZsb3cgd2hlbiBjYWxjdWxhdGluZyBiNjQgbGVuZ3RoAAAMHhAAVQAAAJwAAAAZAAAADB4QAFUAAAC7AAAAMwAAAAweEABVAAAAuwAAACAAAAAMHhAAVQAAALwAAAA6AAAADB4QAFUAAAC8AAAAJQAAAAweEABVAAAA/AAAABgAAAAMHhAAVQAAAAEBAAAvAAAADB4QAFUAAAABAQAAHAAAAAweEABVAAAAAgEAADYAAAAMHhAAVQAAAAIBAAAhAAAADB4QAFUAAAAQAQAALgAAAAweEABVAAAAEAEAAAkAAAAMHhAAVQAAABIBAAAPAAAADB4QAFUAAAARAQAACQAAAAweEABVAAAAFAEAAAkAAAAMHhAAVQAAABYBAAAJAAAADB4QAFUAAAAYAQAALgAAAAweEABVAAAAGAEAAAkAAAAMHhAAVQAAABkBAAAJAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogAADQHxAAKgAAAEltcG9zc2libGUgcmVtYWluZGVyBCAQABQAAAAMHhAAVQAAAC8BAAAWAAAADB4QAFUAAABAAQAACQAAAEludmFsaWQgbGFzdCBzeW1ib2wgLCBvZmZzZXQgLgAAQCAQABQAAABUIBAACQAAAF0gEAABAAAARW5jb2RlZCB0ZXh0IGNhbm5vdCBoYXZlIGEgNi1iaXQgcmVtYWluZGVyLgB4IBAAKwAAAEludmFsaWQgYnl0ZSAAAACsIBAADQAAAFQgEAAJAAAAXSAQAAEAAABPdmVyZmxvdyB3aGVuIGNhbGN1bGF0aW5nIG51bWJlciBvZiBjaHVua3MgaW4gaW5wdXQvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvYmFzZTY0LTAuMTEuMC9zcmMvZGVjb2RlLnJzByEQAFUAAAC4AAAABQAAAC4vMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL/////////////////////////////////////////////////////////////8AAQIDBAUGBwgJCgv/////////DA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCX///////8mJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8+//80NTY3ODk6Ozw9/////////wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZ/////z//GhscHR4fICEiIyQlJicoKSorLC0uLzAxMjP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z7///8/NDU2Nzg5Ojs8Pf////////8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGf///////xobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIz/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+whEACsIRAAbCEQACwkEAAsIxAALCIQAD8AAAAEAAAABAAAAEAAAABBAAAAL3J1c3RjL2QzZmIwMDVhMzllNjI1MDFiOGIwYjM1NjE2NmU1MTVhZTI0ZTJlNTQvc3JjL2xpYnN0ZC9zeW5jL29uY2UucnMAWCUQAEcAAAAIAQAAKQAAACgpY2FsbGVkIGBPcHRpb246OnVud3JhcCgpYCBvbiBhIGBOb25lYCB2YWx1ZVJVU1RfQkFDS1RSQUNFMeslEAABAAAAUlVTVF9MSUJfQkFDS1RSQUNFQmFja3RyYWNlAD8AAAAEAAAABAAAAEIAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvZ2VuZXJpYy1hcnJheS0wLjE0LjMvc3JjL2xpYi5ycwAAACAmEABZAAAAfgEAABUAAAAAAAAAYXR0ZW1wdCB0byBhZGQgd2l0aCBvdmVyZmxvdy91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9ibG9jay1idWZmZXItMC45LjAvc3JjL2xpYi5ycwCsJhAAVwAAAIQAAAAJAAAArCYQAFcAAACFAAAACQAAAKwmEABXAAAAhwAAABcAAACsJhAAVwAAAIsAAAAbAAAArCYQAFcAAAA6AAAAIwAAAKwmEABXAAAAOgAAAA0AAACsJhAAVwAAADsAAAANAAAArCYQAFcAAABBAAAADQAAAKwmEABXAAAAVQAAAAkAQaDPwAAL5h1hdHRlbXB0IHRvIHN1YnRyYWN0IHdpdGggb3ZlcmZsb3cAAACsJhAAVwAAANYAAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogYChsZWZ0ID09IHJpZ2h0KWAKICBsZWZ0OiBgYCwKIHJpZ2h0OiBgL3J1c3RjL2QzZmIwMDVhMzllNjI1MDFiOGIwYjM1NjE2NmU1MTVhZTI0ZTJlNTQvc3JjL2xpYmNvcmUvbWFjcm9zL21vZC5ycwAADSgQAEkAAAAQAAAACQAAAGA6IADUJxAALQAAAAEoEAAMAAAAaCgQAAMAAABkZXN0aW5hdGlvbiBhbmQgc291cmNlIHNsaWNlcyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzhCgQADQAAABn5glqha5nu3Lzbjw69U+l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c3lzL3dhc20vY29uZHZhci5ycwDNLxAAHgAAABUAAAAJAAAAY2Fubm90IHJlY3Vyc2l2ZWx5IGFjcXVpcmUgbXV0ZXhzcmMvbGlic3RkL3N5cy93YXNtL211dGV4LnJzHDAQABwAAAAVAAAACQAAAGIAAAAEAAAABAAAAGMAAABkAAAAZQAAAGIAAAAEAAAABAAAAGYAAAAvcnVzdGMvZDNmYjAwNWEzOWU2MjUwMWI4YjBiMzU2MTY2ZTUxNWFlMjRlMmU1NC9zcmMvbGliY29yZS9mbXQvbW9kLnJzAABwMBAARgAAAGgBAAATAAAAYgAAAAAAAAABAAAAGgAAAGEgZm9ybWF0dGluZyB0cmFpdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvcnNyYy9saWJhbGxvYy9mbXQucnMAAAsxEAATAAAASgIAAAUAAABzcmMvbGliYWxsb2MvcmF3X3ZlYy5yc2NhcGFjaXR5IG92ZXJmbG93MDEQABcAAABEAgAABQAAAO+/vUZyb21VdGY4RXJyb3JieXRlcwAAAGIAAAAEAAAABAAAAGcAAABlcnJvcgAAAGIAAAAEAAAABAAAAGgAAABgAG51bWJlciB3b3VsZCBiZSB6ZXJvIGZvciBub24temVybyB0eXBlbnVtYmVyIHRvbyBzbWFsbCB0byBmaXQgaW4gdGFyZ2V0IHR5cGVudW1iZXIgdG9vIGxhcmdlIHRvIGZpdCBpbiB0YXJnZXQgdHlwZWludmFsaWQgZGlnaXQgZm91bmQgaW4gc3RyaW5nY2Fubm90IHBhcnNlIGludGVnZXIgZnJvbSBlbXB0eSBzdHJpbmcuLgAAAF8yEAACAAAAQm9ycm93RXJyb3JCb3Jyb3dNdXRFcnJvcmNhbGxlZCBgT3B0aW9uOjp1bndyYXAoKWAgb24gYSBgTm9uZWAgdmFsdWWoMRAAAAAAADogAACoMRAAAAAAALgyEAACAAAAbgAAAAAAAAABAAAAbwAAAGluZGV4IG91dCBvZiBib3VuZHM6IHRoZSBsZW4gaXMgIGJ1dCB0aGUgaW5kZXggaXMgAADcMhAAIAAAAPwyEAASAAAAbgAAAAwAAAAEAAAAcAAAAHEAAAByAAAAICAgICB7CiwKLCAgeyB9IH0oCigsKQpbbgAAAAQAAAAEAAAA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" -} diff --git a/packages/cosmwasm-launchpad/src/testdata/cosmoshub.json b/packages/cosmwasm-launchpad/src/testdata/cosmoshub.json deleted file mode 100644 index cb33539c..00000000 --- a/packages/cosmwasm-launchpad/src/testdata/cosmoshub.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "//source": "https://hubble.figment.network/cosmos/chains/cosmoshub-3/blocks/415777/transactions/2BD600EA6090FC75FD844CA73542CC90A828770F4C01C5B483C3C1C43CCB65F4?format=json", - "tx": { - "type": "cosmos-sdk/StdTx", - "value": { - "msg": [ - { - "type": "cosmos-sdk/MsgSend", - "value": { - "from_address": "cosmos1txqfn5jmcts0x0q7krdxj8tgf98tj0965vqlmq", - "to_address": "cosmos1nynns8ex9fq6sjjfj8k79ymkdz4sqth06xexae", - "amount": [ - { - "denom": "uatom", - "amount": "35997500" - } - ] - } - } - ], - "fee": { - "amount": [ - { - "denom": "uatom", - "amount": "2500" - } - ], - "gas": "100000" - }, - "signatures": [ - { - "pub_key": { - "type": "tendermint/PubKeySecp256k1", - "value": "A5qFcJBJvEK/fOmEAY0DHNWwSRZ9TEfNZyH8VoVvDtAq" - }, - "signature": "NK1Oy4EUGAsoC03c1wi9GG03JC/39LEdautC5Jk643oIbEPqeXHMwaqbdvO/Jws0X/NAXaN8SAy2KNY5Qml+5Q==" - } - ], - "memo": "" - } - }, - "tx_data": "ygEoKBapCkOoo2GaChRZgJnSW8Lg8zwesNppHWhJTrk8uhIUmSc4HyYqQahKSZHt4pN2aKsALu8aEQoFdWF0b20SCDM1OTk3NTAwEhMKDQoFdWF0b20SBDI1MDAQoI0GGmoKJuta6YchA5qFcJBJvEK/fOmEAY0DHNWwSRZ9TEfNZyH8VoVvDtAqEkA0rU7LgRQYCygLTdzXCL0YbTckL/f0sR1q60LkmTrjeghsQ+p5cczBqpt2878nCzRf80Bdo3xIDLYo1jlCaX7l", - "id": "2BD600EA6090FC75FD844CA73542CC90A828770F4C01C5B483C3C1C43CCB65F4" -} diff --git a/packages/cosmwasm-launchpad/src/testutils.spec.ts b/packages/cosmwasm-launchpad/src/testutils.spec.ts deleted file mode 100644 index 562b9ee0..00000000 --- a/packages/cosmwasm-launchpad/src/testutils.spec.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { Random } from "@cosmjs/crypto"; -import { Bech32, fromBase64 } from "@cosmjs/encoding"; - -import hackatom from "./testdata/contract.json"; - -/** An internal testing type. SigningCosmWasmClient has a similar but different interface */ -export interface ContractUploadInstructions { - /** The wasm bytecode */ - readonly data: Uint8Array; - readonly source?: string; - readonly builder?: string; -} - -export function getHackatom(): ContractUploadInstructions { - return { - data: fromBase64(hackatom.data), - source: "https://some.registry.nice/project/raw/0.7/lib/vm/testdata/contract_0.6.wasm.blub.tar.gz", - builder: "confio/cosmwasm-opt:12.34.56", - }; -} - -export function makeRandomAddress(): string { - return Bech32.encode("cosmos", Random.getBytes(20)); -} - -export const tendermintIdMatcher = /^[0-9A-F]{64}$/; -/** @see https://rgxdb.com/r/1NUN74O6 */ -export const base64Matcher = - /^(?:[a-zA-Z0-9+/]{4})*(?:|(?:[a-zA-Z0-9+/]{3}=)|(?:[a-zA-Z0-9+/]{2}==)|(?:[a-zA-Z0-9+/]{1}===))$/; -// https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#bech32 -export const bech32AddressMatcher = /^[\x21-\x7e]{1,83}1[02-9ac-hj-np-z]{38}$/; - -export const alice = { - mnemonic: "enlist hip relief stomach skate base shallow young switch frequent cry park", - pubkey0: { - type: "tendermint/PubKeySecp256k1", - value: "A9cXhWb8ZpqCzkA8dQCPV29KdeRLV3rUYxrkHudLbQtS", - }, - address0: "cosmos14qemq0vw6y3gc3u3e0aty2e764u4gs5le3hada", - address1: "cosmos1hhg2rlu9jscacku2wwckws7932qqqu8x3gfgw0", - address2: "cosmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", - address3: "cosmos17yg9mssjenmc3jkqth6ulcwj9cxujrxxzezwta", - address4: "cosmos1f7j7ryulwjfe9ljplvhtcaxa6wqgula3etktce", -}; - -/** Unused account */ -export const unused = { - pubkey: { - type: "tendermint/PubKeySecp256k1", - value: "ArkCaFUJ/IH+vKBmNRCdUVl3mCAhbopk9jjW4Ko4OfRQ", - }, - address: "cosmos1cjsxept9rkggzxztslae9ndgpdyt2408lk850u", - accountNumber: 19, - sequence: 0, -}; - -/** Deployed as part of scripts/launchpad/init.sh */ -export const deployedHackatom = { - codeId: 1, - source: "https://crates.io/api/v1/crates/hackatom/not-yet-released/download", - builder: "cosmwasm/rust-optimizer:0.9.1", - checksum: "3defc33a41f58c71d38b176d521c411d8e74d26403fde7660486930c7579a016", - instances: [ - { - beneficiary: alice.address0, - address: "cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5", - label: "From deploy_hackatom.js (0)", - }, - { - beneficiary: alice.address1, - address: "cosmos1hqrdl6wstt8qzshwc6mrumpjk9338k0lr4dqxd", - label: "From deploy_hackatom.js (1)", - }, - { - beneficiary: alice.address2, - address: "cosmos18r5szma8hm93pvx6lwpjwyxruw27e0k5uw835c", - label: "From deploy_hackatom.js (2)", - }, - ], -}; - -/** Deployed as part of scripts/launchpad/init.sh */ -export const deployedErc20 = { - codeId: 2, - source: "https://crates.io/api/v1/crates/cw-erc20/0.7.0/download", - builder: "cosmwasm/rust-optimizer:0.10.4", - checksum: "d04368320ad55089384adb171aaea39e43d710d7608829adba0300ed30aa2988", - instances: [ - "cosmos1vjecguu37pmd577339wrdp208ddzymkudc46zj", // HASH - "cosmos1ym5m5dw7pttft5w430nxx6uat8f84ck4algmhg", // ISA - "cosmos1gv07846a3867ezn3uqkk082c5ftke7hpllcu8q", // JADE - ], -}; - -/** Deployed as part of scripts/launchpad/init.sh */ -export const deployedCw3 = { - codeId: 3, - source: "https://crates.io/api/v1/crates/cw3-fixed-multisig/0.3.1/download", - builder: "cosmwasm/rust-optimizer:0.10.4", - instances: [ - "cosmos1xqeym28j9xgv0p93pwwt6qcxf9tdvf9zddufdw", // Multisig (1/3) - "cosmos1jka38ckju8cpjap00jf9xdvdyttz9caujtd6t5", // Multisig (2/3) - "cosmos12dnl585uxzddjw9hw4ca694f054shgpgr4zg80", // Multisig (uneven weights) - ], -}; - -/** Deployed as part of scripts/launchpad/init.sh */ -export const deployedCw1 = { - codeId: 4, - source: "https://crates.io/api/v1/crates/cw1-subkeys/0.3.1/download", - builder: "cosmwasm/rust-optimizer:0.10.4", - instances: ["cosmos1vs2vuks65rq7xj78mwtvn7vvnm2gn7ad5me0d2"], -}; - -export const launchpad = { - endpoint: "http://localhost:1317", - chainId: "testing", - validator: { - address: "cosmosvaloper1yfkkk04ve8a0sugj4fe6q6zxuvmvza8r3arurr", - }, -}; - -export function launchpadEnabled(): boolean { - return !!process.env.LAUNCHPAD_ENABLED; -} - -export function pendingWithoutLaunchpad(): void { - if (!launchpadEnabled()) { - return pending("Set LAUNCHPAD_ENABLED to enable Launchpad-based tests"); - } -} - -export function erc20Enabled(): boolean { - return !!process.env.ERC20_ENABLED; -} - -export function pendingWithoutErc20(): void { - if (!erc20Enabled()) { - return pending("Set ERC20_ENABLED to enable ERC20-based tests"); - } -} - -export function cw3Enabled(): boolean { - return !!process.env.CW3_ENABLED; -} - -export function pendingWithoutCw3(): void { - if (!cw3Enabled()) { - return pending("Set CW3_ENABLED to enable CW3-based tests"); - } -} - -export function cw1Enabled(): boolean { - return !!process.env.CW1_ENABLED; -} - -export function pendingWithoutCw1(): void { - if (!cw1Enabled()) { - return pending("Set CW1_ENABLED to enable CW1-based tests"); - } -} - -/** Returns first element. Throws if array has a different length than 1. */ -export function fromOneElementArray(elements: ArrayLike): T { - if (elements.length !== 1) throw new Error(`Expected exactly one element but got ${elements.length}`); - return elements[0]; -} diff --git a/packages/cosmwasm-launchpad/src/types.ts b/packages/cosmwasm-launchpad/src/types.ts deleted file mode 100644 index 22297605..00000000 --- a/packages/cosmwasm-launchpad/src/types.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { fromBase64, fromHex } from "@cosmjs/encoding"; - -export interface WasmData { - // key is hex-encoded - readonly key: string; - // value is base64 encoded - readonly val: string; -} - -// Model is a parsed WasmData object -export interface Model { - readonly key: Uint8Array; - readonly val: Uint8Array; -} - -export function parseWasmData({ key, val }: WasmData): Model { - return { - key: fromHex(key), - val: fromBase64(val), - }; -} - -/** - * An object containing a parsed JSON document. The result of JSON.parse(). - * This doesn't provide any type safety over `any` but expresses intent in the code. - */ -export type JsonObject = any; diff --git a/packages/cosmwasm-launchpad/tsconfig.eslint.json b/packages/cosmwasm-launchpad/tsconfig.eslint.json deleted file mode 100644 index 9a9f3b57..00000000 --- a/packages/cosmwasm-launchpad/tsconfig.eslint.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - // extend your base config so you don't have to redefine your compilerOptions - "extends": "./tsconfig.json", - "include": [ - "src/**/*", - "*.js", - ".eslintrc.js" - ] -} diff --git a/packages/cosmwasm-launchpad/tsconfig.json b/packages/cosmwasm-launchpad/tsconfig.json deleted file mode 100644 index df66add1..00000000 --- a/packages/cosmwasm-launchpad/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": ".", - "outDir": "build", - "rootDir": "src" - }, - "include": [ - "src/**/*" - ] -} diff --git a/packages/cosmwasm-launchpad/typedoc.js b/packages/cosmwasm-launchpad/typedoc.js deleted file mode 100644 index ffe4be64..00000000 --- a/packages/cosmwasm-launchpad/typedoc.js +++ /dev/null @@ -1,11 +0,0 @@ -const packageJson = require("./package.json"); - -module.exports = { - entryPoints: ["./src"], - out: "docs", - exclude: "**/*.spec.ts", - name: `${packageJson.name} Documentation`, - readme: "README.md", - excludeExternals: true, - excludePrivate: true, -}; diff --git a/packages/cosmwasm-launchpad/webpack.web.config.js b/packages/cosmwasm-launchpad/webpack.web.config.js deleted file mode 100644 index 5f7adbc2..00000000 --- a/packages/cosmwasm-launchpad/webpack.web.config.js +++ /dev/null @@ -1,40 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -const glob = require("glob"); -const path = require("path"); -const webpack = require("webpack"); - -const target = "web"; -const distdir = path.join(__dirname, "dist", "web"); - -module.exports = [ - { - // bundle used for Karma tests - target: target, - entry: glob.sync("./build/**/*.spec.js"), - output: { - path: distdir, - filename: "tests.js", - }, - plugins: [ - new webpack.EnvironmentPlugin({ - LAUNCHPAD_ENABLED: "", - ERC20_ENABLED: "", - CW3_ENABLED: "", - CW1_ENABLED: "", - }), - new webpack.ProvidePlugin({ - Buffer: ["buffer", "Buffer"], - }), - ], - resolve: { - fallback: { - buffer: false, - crypto: false, - events: false, - path: false, - stream: require.resolve("stream-browserify"), - string_decoder: false, - }, - }, - }, -]; diff --git a/packages/cosmwasm/.eslintignore b/packages/cosmwasm/.eslintignore deleted file mode 120000 index 86039baf..00000000 --- a/packages/cosmwasm/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -../../.eslintignore \ No newline at end of file diff --git a/packages/cosmwasm/.eslintrc.js b/packages/cosmwasm/.eslintrc.js deleted file mode 100644 index d00c0967..00000000 --- a/packages/cosmwasm/.eslintrc.js +++ /dev/null @@ -1,92 +0,0 @@ -module.exports = { - env: { - es6: true, - jasmine: true, - node: true, - worker: true, - }, - parser: "@typescript-eslint/parser", - parserOptions: { - ecmaVersion: 2018, - project: "./tsconfig.eslint.json", - tsconfigRootDir: __dirname, - }, - plugins: ["@typescript-eslint", "prettier", "simple-import-sort", "import"], - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier", - "plugin:prettier/recommended", - "plugin:import/typescript", - ], - rules: { - curly: ["warn", "multi-line", "consistent"], - "no-bitwise": "warn", - "no-console": ["warn", { allow: ["error", "info", "table", "warn"] }], - "no-param-reassign": "warn", - "no-shadow": "off", // disabled in favour of @typescript-eslint/no-shadow, see https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-shadow.md - "no-unused-vars": "off", // disabled in favour of @typescript-eslint/no-unused-vars, see https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-unused-vars.md - "prefer-const": "warn", - radix: ["warn", "always"], - "spaced-comment": ["warn", "always", { line: { markers: ["/ ", - "Will Clark " - ], - "license": "Apache-2.0", - "main": "build/index.js", - "types": "build/index.d.ts", - "files": [ - "build/", - "*.md", - "!*.spec.*", - "!**/testdata/" - ], - "repository": { - "type": "git", - "url": "https://github.com/cosmos/cosmjs/tree/main/packages/cosmwasm" - }, - "publishConfig": { - "access": "public" - }, - "scripts": { - "docs": "typedoc --options typedoc.js", - "format": "prettier --write --loglevel warn \"./src/**/*.ts\"", - "format-text": "prettier --write \"./*.md\"", - "lint": "eslint --max-warnings 0 \"./**/*.ts\" \"./*.js\"", - "lint-fix": "eslint --fix --max-warnings 0 \"./**/*.ts\" \"./*.js\"", - "build": "rm -rf ./build && tsc", - "build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build" - }, - "dependencies": { - "@cosmjs/cosmwasm-launchpad": "workspace:packages/cosmwasm-launchpad" - }, - "devDependencies": { - "@types/eslint-plugin-prettier": "^3", - "@typescript-eslint/eslint-plugin": "^4.28", - "@typescript-eslint/parser": "^4.28", - "eslint": "^7.5", - "eslint-config-prettier": "^8.3.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-prettier": "^3.4.0", - "eslint-plugin-simple-import-sort": "^7.0.0", - "prettier": "^2.3.2", - "typedoc": "^0.21", - "typescript": "~4.3" - } -} diff --git a/packages/cosmwasm/src/index.ts b/packages/cosmwasm/src/index.ts deleted file mode 100644 index bdad471c..00000000 --- a/packages/cosmwasm/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "@cosmjs/cosmwasm-launchpad"; diff --git a/packages/cosmwasm/tsconfig.eslint.json b/packages/cosmwasm/tsconfig.eslint.json deleted file mode 100644 index 9a9f3b57..00000000 --- a/packages/cosmwasm/tsconfig.eslint.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - // extend your base config so you don't have to redefine your compilerOptions - "extends": "./tsconfig.json", - "include": [ - "src/**/*", - "*.js", - ".eslintrc.js" - ] -} diff --git a/packages/cosmwasm/tsconfig.json b/packages/cosmwasm/tsconfig.json deleted file mode 100644 index df66add1..00000000 --- a/packages/cosmwasm/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": ".", - "outDir": "build", - "rootDir": "src" - }, - "include": [ - "src/**/*" - ] -} diff --git a/packages/cosmwasm/typedoc.js b/packages/cosmwasm/typedoc.js deleted file mode 100644 index ffe4be64..00000000 --- a/packages/cosmwasm/typedoc.js +++ /dev/null @@ -1,11 +0,0 @@ -const packageJson = require("./package.json"); - -module.exports = { - entryPoints: ["./src"], - out: "docs", - exclude: "**/*.spec.ts", - name: `${packageJson.name} Documentation`, - readme: "README.md", - excludeExternals: true, - excludePrivate: true, -}; diff --git a/scripts/launchpad/contracts/checksums.sha256 b/scripts/launchpad/contracts/checksums.sha256 deleted file mode 100644 index b441fcd8..00000000 --- a/scripts/launchpad/contracts/checksums.sha256 +++ /dev/null @@ -1,5 +0,0 @@ -c478a6d9d6303e67f28d7863ea6e07426e9f0082744557d503e723bc1c46ccf8 cw1_subkeys.wasm -1a4a376ef1099ad3edc33aa1d3105e4621bc49e44b1ac0a449d7b6912e40fb0a cw3_fixed_multisig.wasm -ebc2b11e2afa50d5dcd4234840cd581e948a59d888bb8d651598bba3732cd8ee cw-nameservice.wasm -d04368320ad55089384adb171aaea39e43d710d7608829adba0300ed30aa2988 cw_erc20.wasm -3defc33a41f58c71d38b176d521c411d8e74d26403fde7660486930c7579a016 hackatom.wasm diff --git a/scripts/launchpad/contracts/cw-nameservice.wasm b/scripts/launchpad/contracts/cw-nameservice.wasm deleted file mode 100644 index 21a6ddb8..00000000 --- a/scripts/launchpad/contracts/cw-nameservice.wasm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebc2b11e2afa50d5dcd4234840cd581e948a59d888bb8d651598bba3732cd8ee -size 117929 diff --git a/scripts/launchpad/contracts/cw1_subkeys.wasm b/scripts/launchpad/contracts/cw1_subkeys.wasm deleted file mode 100644 index beeddda4..00000000 --- a/scripts/launchpad/contracts/cw1_subkeys.wasm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c478a6d9d6303e67f28d7863ea6e07426e9f0082744557d503e723bc1c46ccf8 -size 267814 diff --git a/scripts/launchpad/contracts/cw3_fixed_multisig.wasm b/scripts/launchpad/contracts/cw3_fixed_multisig.wasm deleted file mode 100644 index 61772386..00000000 --- a/scripts/launchpad/contracts/cw3_fixed_multisig.wasm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a4a376ef1099ad3edc33aa1d3105e4621bc49e44b1ac0a449d7b6912e40fb0a -size 247712 diff --git a/scripts/launchpad/contracts/cw_erc20.wasm b/scripts/launchpad/contracts/cw_erc20.wasm deleted file mode 100644 index 03236721..00000000 --- a/scripts/launchpad/contracts/cw_erc20.wasm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d04368320ad55089384adb171aaea39e43d710d7608829adba0300ed30aa2988 -size 137244 diff --git a/scripts/launchpad/contracts/hackatom.wasm b/scripts/launchpad/contracts/hackatom.wasm deleted file mode 100644 index 45ba6a09..00000000 --- a/scripts/launchpad/contracts/hackatom.wasm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3defc33a41f58c71d38b176d521c411d8e74d26403fde7660486930c7579a016 -size 170947 diff --git a/scripts/launchpad/deploy_cw1.js b/scripts/launchpad/deploy_cw1.js deleted file mode 100755 index 18638a9e..00000000 --- a/scripts/launchpad/deploy_cw1.js +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env -S yarn node - -/* eslint-disable @typescript-eslint/naming-convention */ -const { Secp256k1HdWallet } = require("@cosmjs/amino"); -const { SigningCosmWasmClient } = require("@cosmjs/cosmwasm-launchpad"); -const fs = require("fs"); - -const httpUrl = "http://localhost:1317"; -const alice = { - mnemonic: "enlist hip relief stomach skate base shallow young switch frequent cry park", - address0: "cosmos14qemq0vw6y3gc3u3e0aty2e764u4gs5le3hada", - // address1: "cosmos1hhg2rlu9jscacku2wwckws7932qqqu8x3gfgw0", - // address2: "cosmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", - // address3: "cosmos17yg9mssjenmc3jkqth6ulcwj9cxujrxxzezwta", - // address4: "cosmos1f7j7ryulwjfe9ljplvhtcaxa6wqgula3etktce", -}; - -const codeMeta = { - source: "https://crates.io/api/v1/crates/cw1-subkeys/0.3.1/download", - builder: "cosmwasm/rust-optimizer:0.10.4", -}; - -async function main() { - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(httpUrl, alice.address0, wallet); - - const wasm = fs.readFileSync(__dirname + "/contracts/cw1_subkeys.wasm"); - const uploadReceipt = await client.upload(wasm, codeMeta, "Upload CW1 subkeys contract"); - console.info(`Upload succeeded. Receipt: ${JSON.stringify(uploadReceipt)}`); - - const initMsg = { - admins: [alice.address0], - mutable: true, - }; - const label = "Subkey test"; - const { contractAddress } = await client.instantiate(uploadReceipt.codeId, initMsg, label, { - memo: `Create a CW1 instance for ${alice.address0}`, - admin: alice.address0, - }); - await client.sendTokens(contractAddress, [ - { - amount: "1000", - denom: "ucosm", - }, - ]); - console.info(`Contract instantiated for ${alice.address0} subkey at ${contractAddress}`); -} - -main().then( - () => { - console.info("All done, let the coins flow."); - process.exit(0); - }, - (error) => { - console.error(error); - process.exit(1); - }, -); diff --git a/scripts/launchpad/deploy_cw3.js b/scripts/launchpad/deploy_cw3.js deleted file mode 100755 index 8ad0479e..00000000 --- a/scripts/launchpad/deploy_cw3.js +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/env -S yarn node - -/* eslint-disable @typescript-eslint/naming-convention */ -const { Secp256k1HdWallet } = require("@cosmjs/amino"); -const { SigningCosmWasmClient } = require("@cosmjs/cosmwasm-launchpad"); -const fs = require("fs"); - -const httpUrl = "http://localhost:1317"; -const alice = { - mnemonic: "enlist hip relief stomach skate base shallow young switch frequent cry park", - address0: "cosmos14qemq0vw6y3gc3u3e0aty2e764u4gs5le3hada", - address1: "cosmos1hhg2rlu9jscacku2wwckws7932qqqu8x3gfgw0", - address2: "cosmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", - address3: "cosmos17yg9mssjenmc3jkqth6ulcwj9cxujrxxzezwta", - address4: "cosmos1f7j7ryulwjfe9ljplvhtcaxa6wqgula3etktce", -}; - -const codeMeta = { - source: "https://crates.io/api/v1/crates/cw3-fixed-multisig/0.3.1/download", - builder: "cosmwasm/rust-optimizer:0.10.4", -}; - -const initData = [ - { - admin: alice.address0, - label: "Multisig (1/3)", - initMsg: { - voters: [ - { addr: alice.address0, weight: 1 }, - { addr: alice.address1, weight: 1 }, - { addr: alice.address2, weight: 1 }, - ], - required_weight: 1, - max_voting_period: { height: 12345 }, - }, - }, - { - admin: alice.address0, - label: "Multisig (2/3)", - initMsg: { - voters: [ - { addr: alice.address0, weight: 1 }, - { addr: alice.address1, weight: 1 }, - { addr: alice.address2, weight: 1 }, - ], - required_weight: 2, - max_voting_period: { height: 12345 }, - }, - }, - { - admin: alice.address0, - label: "Multisig (uneven weights)", - initMsg: { - voters: [ - { addr: alice.address0, weight: 1 }, - { addr: alice.address1, weight: 2 }, - { addr: alice.address2, weight: 3 }, - ], - required_weight: 3, - max_voting_period: { height: 12345 }, - }, - }, -]; - -async function main() { - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(httpUrl, alice.address0, wallet); - - const wasm = fs.readFileSync(__dirname + "/contracts/cw3_fixed_multisig.wasm"); - const uploadReceipt = await client.upload(wasm, codeMeta, "Upload CW3 fixed multisig contract"); - console.info(`Upload succeeded. Receipt: ${JSON.stringify(uploadReceipt)}`); - - for (const { admin, initMsg, label } of initData) { - const { contractAddress } = await client.instantiate(uploadReceipt.codeId, initMsg, label, { - memo: `Create a CW3 instance for ${initMsg.symbol}`, - admin: admin, - }); - await client.sendTokens(contractAddress, [ - { - amount: "1000", - denom: "ucosm", - }, - ]); - console.info(`Contract instantiated for ${label} at ${contractAddress}`); - } -} - -main().then( - () => { - console.info("All done, let the coins flow."); - process.exit(0); - }, - (error) => { - console.error(error); - process.exit(1); - }, -); diff --git a/scripts/launchpad/deploy_erc20.js b/scripts/launchpad/deploy_erc20.js deleted file mode 100755 index 3b54ab03..00000000 --- a/scripts/launchpad/deploy_erc20.js +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/env -S yarn node - -/* eslint-disable @typescript-eslint/naming-convention */ -const { Secp256k1HdWallet } = require("@cosmjs/amino"); -const { SigningCosmWasmClient } = require("@cosmjs/cosmwasm-launchpad"); -const fs = require("fs"); - -const httpUrl = "http://localhost:1317"; -const alice = { - mnemonic: "enlist hip relief stomach skate base shallow young switch frequent cry park", - address0: "cosmos14qemq0vw6y3gc3u3e0aty2e764u4gs5le3hada", - address1: "cosmos1hhg2rlu9jscacku2wwckws7932qqqu8x3gfgw0", - address2: "cosmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", - address3: "cosmos17yg9mssjenmc3jkqth6ulcwj9cxujrxxzezwta", - address4: "cosmos1f7j7ryulwjfe9ljplvhtcaxa6wqgula3etktce", -}; -const unused = { - address: "cosmos1cjsxept9rkggzxztslae9ndgpdyt2408lk850u", -}; -const guest = { - address: "cosmos17d0jcz59jf68g52vq38tuuncmwwjk42u6mcxej", -}; - -const codeMeta = { - source: "https://crates.io/api/v1/crates/cw-erc20/0.7.0/download", - builder: "cosmwasm/rust-optimizer:0.10.4", -}; - -const initDataHash = { - admin: undefined, - initMsg: { - decimals: 5, - name: "Hash token", - symbol: "HASH", - initial_balances: [ - { - address: alice.address0, - amount: "11", - }, - { - address: alice.address1, - amount: "11", - }, - { - address: alice.address2, - amount: "11", - }, - { - address: alice.address3, - amount: "11", - }, - { - address: alice.address4, - amount: "11", - }, - { - address: unused.address, - amount: "12812345", - }, - { - address: guest.address, - amount: "22004000000", - }, - ], - }, -}; -const initDataIsa = { - admin: undefined, - initMsg: { - decimals: 0, - name: "Isa Token", - symbol: "ISA", - initial_balances: [ - { - address: alice.address0, - amount: "999999999", - }, - { - address: alice.address1, - amount: "999999999", - }, - { - address: alice.address2, - amount: "999999999", - }, - { - address: alice.address3, - amount: "999999999", - }, - { - address: alice.address4, - amount: "999999999", - }, - { - address: unused.address, - amount: "42", - }, - ], - }, -}; -const initDataJade = { - admin: alice.address1, - initMsg: { - decimals: 18, - name: "Jade Token", - symbol: "JADE", - initial_balances: [ - { - address: alice.address0, - amount: "189189189000000000000000000", // 189189189 JADE - }, - { - address: alice.address1, - amount: "189189189000000000000000000", // 189189189 JADE - }, - { - address: alice.address2, - amount: "189189189000000000000000000", // 189189189 JADE - }, - { - address: alice.address3, - amount: "189189189000000000000000000", // 189189189 JADE - }, - { - address: alice.address4, - amount: "189189189000000000000000000", // 189189189 JADE - }, - { - address: guest.address, - amount: "189500000000000000000", // 189.5 JADE - }, - ], - }, -}; - -async function main() { - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(httpUrl, alice.address0, wallet); - - const wasm = fs.readFileSync(__dirname + "/contracts/cw_erc20.wasm"); - const uploadReceipt = await client.upload(wasm, codeMeta, "Upload ERC20 contract"); - console.info(`Upload succeeded. Receipt: ${JSON.stringify(uploadReceipt)}`); - - for (const { initMsg, admin } of [initDataHash, initDataIsa, initDataJade]) { - const { contractAddress } = await client.instantiate(uploadReceipt.codeId, initMsg, initMsg.symbol, { - memo: `Create an ERC20 instance for ${initMsg.symbol}`, - admin: admin, - }); - console.info(`Contract instantiated for ${initMsg.symbol} at ${contractAddress}`); - } -} - -main().then( - () => { - console.info("All done, let the coins flow."); - process.exit(0); - }, - (error) => { - console.error(error); - process.exit(1); - }, -); diff --git a/scripts/launchpad/deploy_hackatom.js b/scripts/launchpad/deploy_hackatom.js deleted file mode 100755 index c6b057f9..00000000 --- a/scripts/launchpad/deploy_hackatom.js +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env -S yarn node - -/* eslint-disable @typescript-eslint/naming-convention */ -const { Secp256k1HdWallet } = require("@cosmjs/amino"); -const { SigningCosmWasmClient } = require("@cosmjs/cosmwasm-launchpad"); -const fs = require("fs"); - -const httpUrl = "http://localhost:1317"; -const alice = { - mnemonic: "enlist hip relief stomach skate base shallow young switch frequent cry park", - address0: "cosmos14qemq0vw6y3gc3u3e0aty2e764u4gs5le3hada", - address1: "cosmos1hhg2rlu9jscacku2wwckws7932qqqu8x3gfgw0", - address2: "cosmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", - address3: "cosmos17yg9mssjenmc3jkqth6ulcwj9cxujrxxzezwta", - address4: "cosmos1f7j7ryulwjfe9ljplvhtcaxa6wqgula3etktce", -}; - -const codeMeta = { - source: "https://crates.io/api/v1/crates/hackatom/not-yet-released/download", - builder: "cosmwasm/rust-optimizer:0.9.1", -}; - -const inits = [ - { - label: "From deploy_hackatom.js (0)", - msg: { - beneficiary: alice.address0, - verifier: alice.address0, - }, - admin: undefined, - }, - { - label: "From deploy_hackatom.js (1)", - msg: { - beneficiary: alice.address1, - verifier: alice.address1, - }, - admin: undefined, - }, - { - label: "From deploy_hackatom.js (2)", - msg: { - beneficiary: alice.address2, - verifier: alice.address2, - }, - admin: alice.address1, - }, -]; - -async function main() { - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(httpUrl, alice.address0, wallet); - - const wasm = fs.readFileSync(__dirname + "/contracts/hackatom.wasm"); - const uploadReceipt = await client.upload(wasm, codeMeta, "Upload hackatom contract"); - console.info(`Upload succeeded. Receipt: ${JSON.stringify(uploadReceipt)}`); - - for (const { label, msg, admin } of inits) { - const { contractAddress } = await client.instantiate(uploadReceipt.codeId, msg, label, { - memo: `Create a hackatom instance in deploy_hackatom.js`, - admin: admin, - }); - console.info(`Contract instantiated at ${contractAddress}`); - } -} - -main().then( - () => { - console.info("All done, let the coins flow."); - process.exit(0); - }, - (error) => { - console.error(error); - process.exit(1); - }, -); diff --git a/scripts/launchpad/deploy_nameservice.js b/scripts/launchpad/deploy_nameservice.js deleted file mode 100755 index c8dd296d..00000000 --- a/scripts/launchpad/deploy_nameservice.js +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env -S yarn node - -/* eslint-disable @typescript-eslint/naming-convention */ -const { Secp256k1HdWallet } = require("@cosmjs/amino"); -const { SigningCosmWasmClient } = require("@cosmjs/cosmwasm-launchpad"); -const fs = require("fs"); - -const httpUrl = "http://localhost:1317"; -const alice = { - mnemonic: "enlist hip relief stomach skate base shallow young switch frequent cry park", - address0: "cosmos14qemq0vw6y3gc3u3e0aty2e764u4gs5le3hada", -}; - -const codeMeta = { - source: "https://crates.io/api/v1/crates/cw-nameservice/not-yet-released/download", - builder: "cosmwasm/rust-optimizer:0.8.0", -}; - -const free = { - label: "Free", - initMsg: {}, -}; - -const luxury = { - label: "Luxury", - initMsg: { - purchase_price: { - denom: "ucosm", - amount: "2000000", - }, - transfer_price: { - denom: "ucosm", - amount: "1000000", - }, - }, -}; - -async function main() { - const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); - const client = new SigningCosmWasmClient(httpUrl, alice.address0, wallet); - - const wasm = fs.readFileSync(__dirname + "/contracts/cw-nameservice.wasm"); - const uploadReceipt = await client.upload(wasm, codeMeta, "Upload Name Service code"); - console.info(`Upload succeeded. Receipt: ${JSON.stringify(uploadReceipt)}`); - - for (const { label, initMsg } of [free, luxury]) { - const { contractAddress } = await client.instantiate(uploadReceipt.codeId, initMsg, label, { - memo: `Create an nameservice instance "${label}"`, - }); - console.info(`Contract "${label}" instantiated at ${contractAddress}`); - } -} - -main().then( - () => { - console.info("Done deploying nameservice instances."); - process.exit(0); - }, - (error) => { - console.error(error); - process.exit(1); - }, -); diff --git a/scripts/launchpad/init.sh b/scripts/launchpad/init.sh index 484400d3..ecf47e00 100755 --- a/scripts/launchpad/init.sh +++ b/scripts/launchpad/init.sh @@ -14,17 +14,3 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # Cosmos SDK init # "$SCRIPT_DIR/send_first.js" - -# -# CosmWasm init -# -( - echo "Ensuring contracts' checksums are correct ..." - cd "$SCRIPT_DIR/contracts" - sha256sum --check checksums.sha256 -) -"$SCRIPT_DIR/deploy_hackatom.js" -"$SCRIPT_DIR/deploy_erc20.js" -"$SCRIPT_DIR/deploy_cw3.js" -"$SCRIPT_DIR/deploy_cw1.js" -# "$SCRIPT_DIR/deploy_nameservice.js" diff --git a/yarn.lock b/yarn.lock index 200e87d1..2f2343c9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -345,7 +345,6 @@ __metadata: resolution: "@cosmjs/cli@workspace:packages/cli" dependencies: "@cosmjs/amino": "workspace:packages/amino" - "@cosmjs/cosmwasm-launchpad": "workspace:packages/cosmwasm-launchpad" "@cosmjs/cosmwasm-stargate": "workspace:packages/cosmwasm-stargate" "@cosmjs/crypto": "workspace:packages/crypto" "@cosmjs/encoding": "workspace:packages/encoding" @@ -391,56 +390,6 @@ __metadata: languageName: unknown linkType: soft -"@cosmjs/cosmwasm-launchpad@workspace:packages/cosmwasm-launchpad": - version: 0.0.0-use.local - resolution: "@cosmjs/cosmwasm-launchpad@workspace:packages/cosmwasm-launchpad" - dependencies: - "@cosmjs/crypto": "workspace:packages/crypto" - "@cosmjs/encoding": "workspace:packages/encoding" - "@cosmjs/launchpad": "workspace:packages/launchpad" - "@cosmjs/math": "workspace:packages/math" - "@cosmjs/utils": "workspace:packages/utils" - "@istanbuljs/nyc-config-typescript": ^1.0.1 - "@types/eslint-plugin-prettier": ^3 - "@types/jasmine": ^3.6.10 - "@types/karma-firefox-launcher": ^2 - "@types/karma-jasmine": ^4 - "@types/karma-jasmine-html-reporter": ^1 - "@types/node": ^15.0.1 - "@types/pako": ^1.0.1 - "@typescript-eslint/eslint-plugin": ^4.28 - "@typescript-eslint/parser": ^4.28 - eslint: ^7.5 - eslint-config-prettier: ^8.3.0 - eslint-import-resolver-node: ^0.3.4 - eslint-plugin-import: ^2.22.1 - eslint-plugin-prettier: ^3.4.0 - eslint-plugin-simple-import-sort: ^7.0.0 - esm: ^3.2.25 - glob: ^7.1.6 - jasmine: ^3.5 - jasmine-core: ^3.7.1 - jasmine-spec-reporter: ^6 - karma: ^6.1.1 - karma-chrome-launcher: ^3.1.0 - karma-firefox-launcher: ^2.1.0 - karma-jasmine: ^4.0.1 - karma-jasmine-html-reporter: ^1.5.4 - nyc: ^15.1.0 - pako: ^2.0.2 - prettier: ^2.3.2 - readonly-date: ^1.0.0 - ses: ^0.11.0 - source-map-support: ^0.5.19 - stream-browserify: ^3.0.0 - ts-node: ^8 - typedoc: ^0.21 - typescript: ~4.3 - webpack: ^5.32.0 - webpack-cli: ^4.6.0 - languageName: unknown - linkType: soft - "@cosmjs/cosmwasm-stargate@workspace:packages/cosmwasm-stargate": version: 0.0.0-use.local resolution: "@cosmjs/cosmwasm-stargate@workspace:packages/cosmwasm-stargate" @@ -498,26 +447,6 @@ __metadata: languageName: unknown linkType: soft -"@cosmjs/cosmwasm@workspace:packages/cosmwasm": - version: 0.0.0-use.local - resolution: "@cosmjs/cosmwasm@workspace:packages/cosmwasm" - dependencies: - "@cosmjs/cosmwasm-launchpad": "workspace:packages/cosmwasm-launchpad" - "@types/eslint-plugin-prettier": ^3 - "@typescript-eslint/eslint-plugin": ^4.28 - "@typescript-eslint/parser": ^4.28 - eslint: ^7.5 - eslint-config-prettier: ^8.3.0 - eslint-import-resolver-node: ^0.3.4 - eslint-plugin-import: ^2.22.1 - eslint-plugin-prettier: ^3.4.0 - eslint-plugin-simple-import-sort: ^7.0.0 - prettier: ^2.3.2 - typedoc: ^0.21 - typescript: ~4.3 - languageName: unknown - linkType: soft - "@cosmjs/crypto@workspace:packages/crypto": version: 0.0.0-use.local resolution: "@cosmjs/crypto@workspace:packages/crypto" @@ -3070,7 +2999,6 @@ __metadata: resolution: "cosmjs-monorepo-root@workspace:." dependencies: "@cosmjs/amino": "workspace:packages/amino" - "@cosmjs/cosmwasm-launchpad": "workspace:packages/cosmwasm-launchpad" "@cosmjs/cosmwasm-stargate": "workspace:packages/cosmwasm-stargate" "@cosmjs/crypto": "workspace:packages/crypto" "@cosmjs/encoding": "workspace:packages/encoding"